Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:网页插件¥js_url¥global_全网1@base64://Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDlhajnvZF2dnbnoLTop6Pljrvlub/lkYrlhY3otLnnnIsr5YWo572R6Z+z5LmQ5LiL6L29K+efpeS5juWinuW8uivnn63op4bpopHml6DmsLTljbDkuIvovb0KLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vd3d3LnpobWR5LnRvcAovLyBAdmVyc2lvbiAgICAgIDYuNi4xCi8vIEBkZXNjcmlwdGlvbiAg5pys6ISa5pys57K+6YCJ6Kej5p6Q57q/6Lev5Li65aSn5a625o+Q5L6b5LyY6YW344CB54ix5aWH6Im644CB6IW+6K6v44CBQuermShiaWxpYmlsaSnjgIHkuZDop4bjgIHoipLmnpznrYnlkITlpKfop4bpopHnvZHnq5koUEMr56e75Yqo56uvKeinhumikeino+aekOacjeWKoe+8jOiuqeS9oOecgeWOu+i0reS5sOinhumikVZJUOi0ueeUqO+8jOWQjOaXtuaPkOS+m+efpeS5juWinuW8uijnn6XkuY7op4bpopHkuIvovb3jgIHljrvlub/lkYrjgIHljrvpmaTkvqfovrnmoI/jgIHlhbPplK7or43lsY/olL3nrYnkvJrlkZjlip/og70p77yM5YWo572R6Z+z5LmQ5ZKM5pyJ5aOw5Lmm5YWN5a6i5oi356uv5LiL6L29KOe9keaYk+S6kemfs+S5kOOAgVFR6Z+z5LmQ44CB6YW354uX44CB6YW35oiR44CB6Jm+57Gz44CB6Jy76JyTRk3jgIHojZTmnp1GTeOAgeWWnOmprOaLiembheetiSnvvIzop4bpopHml6DmsLTljbDkuIvovb0oYmlsaWJpbGnjgIHmipbpn7PjgIHlv6vmiYvjgIHopb/nk5zjgIF5b3V0dWJlKe+8jOiHquWKqOafpeWIuOWKn+iDve+8jOaJgOacieWKn+iDveS6kuS4jeW9seWTje+8jOWPr+eLrOeri+W8gOWFs+OAggovLyBAYXV0aG9yICAgICAgIHpobWFpCi8vIEBpY29uICAgICAgICAgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFHUUFBQUJrQ0FZQUFBQnc0cFZVQUFBUThFbEVRVlI0WHUxZENYUVVSUnIrYXBJUVQxd1F3NkVZQmNTRXJDZ0tDb1Fvd29vY0xpcktlb0FvTEQ1eDJZRHUraFRDUG5kZEplQzVDdDZnSUJ0ZGxVTVF4QVBFOTVnTUtrYmhvV0dDS01ncHNQalVvRXNJa05yM1RhZGhNdW1lcWU2dW5nUkk4U0JBVjlmeGYvV2Y5VmVYZ0ljaXBjenk4UHBSL2FvUW9zek5CSVdUbDZTVXZRQU1BSEFKZ0ZiWXNTc2RINWUwd2ljbHdNcFZ3SzdkVHBvN2V1cG1OQU82ZFFhNmRESit0c2pZQ0dBTGdHSUE3d29oK0ZPcEtBTWk5KzI3R1kwYURjU1c3ZDN4eXVzdEVDcEp3MmIyMlZCcVVTQ3pOWkIzeVQ2TXVHa3JtbWNzUjJYbElwR2VQaytGVWtxQXlHODIvQm1udDd3V3o4NjhBQys5MmxTbDRZWTZBTkliQWJmY3NBdDNEaXZCdHUvbmkzWnRwaVdpUzF4QTVBOC9kTWU4OXdhZzdWbDk4ZURqNTJMbnJoTVROZGp3M0lJQ3pVOHJ4LzMzck1XR0RZc3hzTzlpY2RwcG45dlJ5UllRdVh2M0lLU2tETUNrcVQyeDhJUFRJWkRlUUd3UEZKQ3lBZ092L0E3MzVTL0ZmckZRTlAvTkIxYXRXUUlpZjk0N0JQc3JCbVBVWDd1ajlPdW1FRWp4TUpTR1YwMEtTSGtBT2UxMzRzVW5Qa0pxeWx6UnVQSDhXT0xVQWtUdTIzY2pEc29oR0pHZml6WGhKZzNVOUlFQ0hUdnN4S3luUDBSYVdwRVE0dDNvSG1vQUlxVzhETUJJNUUvb2gyWExUL1ZoS0ExTm1oUzR1djkyRkk1L0M4QU1JY1FoblZJVGtNOCtmd2pyTjkyRUJ4OC9DMElFR3Fqbkl3VW92aVlXaEhGVzY1bml3bzVQbUQwZEFrVHUrcmt2VWcvZWhUNkRMOFgvOWgzdjQxQWFtallwY01MeDVYai96U1VROGtuUnRHbkVlVHdNeU1MMy80SFBWdy9GRzIrM2dSQksva2xTS2R2NUF1RDBGc0RwTFEyUG1NWDhkK3hBR0RWZ0tWc1BiUHNlS1BzR0tGbWQxT0VxZFNibFFkd3c4Q3RjZE5FMDhmdmZQWE1JRUxsangza1FxZU53NWZYOVVIbWdmaWp5VmkyQVhqMkFpenNCdlM5Vm1sL0NTZ1RxczFYQXNxQUJVbjBvamRLK3gvdHZ6RU5LWUpKbzFteGJoQk5rNFdPRElGUEdvbWhPVndqUnFNN0dlZkpKQmdqRC9nQmtuZVB2TU1nNXM5NEVsaFVEMjNmNDIxZTgxaVYrd1lpYlA0S1FqNGg3UmhjYmdIVHJQeHBWdUIzbFA1OVhKOHFjM0hCTlArQ1d3VURqazVOUG5MY1dBOC9PcUJ0Z0pBNmdWY3NTcE1pbnhRZHpYalVBNlpCWGdLcXFZUkE0RjhsVUgrU0lQdzAzT0tJK2xMb0FSbFpWQVNoRlZXQzZXRmM4eFFBa0ovZWZPSWdoRUtMTllUWHZNNFd1N2d1TUcrT2NJeWhldHUwd2RJRlpLSDRJcnNsZDVEZ3FmeXA5L3QxSktkOEQvSHUyd1RISktGSUNFdXNRQ013U2E0T0YxU0tyMzFUOHVHY1FoR3psTzRlUVFCTUxER1d0VXFoOFNYeFRJZS81UmVXdHczVUlGSzB5OXNlZldlM1UzcWVGTnFIUWYrVXZ5UkZ5QTFMd3FpZ04zVzhBMHUrbUltemEzQThRL29iV2UrVUJFOGNuNWdvU2ZmNjd3UHpGK2duQ0JURjZCTkE3eitDcVJPVzJNVFc1TVZGOXA4OEppTUJXbkhEY0hGR3k5RzREa0x3QjcyRDNqejBoQWljNGJVKzUvbjM1aVhVRnhkRXpMeHRnK0YwSUJrRWhPUEhFR2tWWXQvNytqa1ppTjVvMldTUkNDNGNiZ0hTOC9FTlVWdVlpSVB3SnNUODBIcmcyenFUSUVRU0NzcnN1Q3EwN0FtUEhNVGw1L281S3lqMUlUVmttdmx4K2pRRklkdmZsa1gxeUVkRHJnM0NDVXdyajZ3czZhUVdGZ0ZQZG9KdEU1Skx4WXdDSzFlaENycjFpc083ZWFyWW41VjVBQmtWNHhaWFZnUFQ0R0VCbkNLUnE3WG5HRkhzd0NNRGtLY2tSVDA0bVJVQUlEQUg2YkRWUU1ORi8vMFJpSDRCUFJMaTRwd0ZJVnZlVmdMZ1FBYUZ2SXlxZW1LTGxOR0dpZm9YdGhQRDFxYTZVK3dIeHFRZ1g1NWtpNjNNZ2NMNjJuVUg2RjVUTFZvVmczSlpmOXlMS0RTQTBtZThiWTNEOWg4dUJDWlAweklQZU9sQWl3c1hkVEVCV1FhSWpBZ0h2ZXlCaythbUZSeDhZbk5FSGJ4b09wMW5vcTF3M3dnMjBOZCtwa2djQitZVW9XM0Z4ZGVna2R6VWt2TWV4S0hmbnZtenRaeHpKbkVIeWtUdm1Xbmp2OU9ocElYb3BFZ1JrdFFpSE9wc2NzZ1pBRG9SSERyRlQ0a2M2R0NRMkY5c1NHN1A4dXVIZTlDSDNSU0RYaVBDS0M2c0J5ZjNTQU1SRFpKRTZnN29qdHRDYW9zNm9ML3NQWGxheW5XNWtXR2U0eGR4Vis2cVNWWkJZSTlhRk9sVmJXYmxmUWFDRGEwRG9iMUMrV29YT0dROUtodWV0T25rdjlUalBlVE9zUFhzdklSWXBHZkg5U29SRDV4OEdCT2lBZ0VzT1liQ1EreG14aFU1ZmZvRVhFdFMvZCsyTUZpOWNVaDJDRitFVkhVMmxYZ3FKYkZjY1lpZGJLYXJvNGRhMUIrNEhwRE9uQWwwdXFOMnlXeTZSVWtKaXJTZ0wvYllha0I1cndiTWViblNJSFhmUUM2K3IySlFmSUVTM3lURCt6Q242SkVJVk4wV2lBY25LRFZmdkZqckxOckhUSFRyaVAyeWJvWG9tT0hBRGlxYmxndmY4SnJWNisxWmN3bEFMRFJpbmhSd2lFQlpyUXptbURpbHp0WDFyWjFucFVPUldKalFkc2NsVC9kMmZVQ1dtbFYvaTFpZUpBQ0xLeE5yaUR0NEFvUk1ZbXgyaWd6dElsTktnUFdrWXRpQXdkWmt0d3RGUndUTnN6NjFpV3BJVTAyNktGa0RzbERuMWh0dUJSVThtSGlCbVBYTVA1VWczSEF5bHZrNlVoYkxkY3doWEJqTkdZb3RYcjlWc1R3VVExdVdPSGhkQWZkSXZUcm1rT3RGQmxJV3lxZ0hwc1E1Q3RuZVU0R0NsMU9pTkV4QWRSUlVRc3k4cWZrWmZvN05SZEl3akdXMW9BY1NLWUxyRVZTSWRFbzlJZE5Cb1ZDUmJ2ekN0NlpyK3dKNDlSZ3FSazFCUkxVQ3llM3dOSWMrSnlyMk92eTdzN0hCNjVmVE9kUlFyd0dsV3F1WmFNVTJVaEVtR2ZvbTFOaWxHR1paWFhSUVJRTVRYb3F6NFhITUwxeGtnZHVhdXptUUFLMEJNczVMNmkyTklsTVpEd2xEeEY4M1JzVVRzMjdBUzM0NU00QWdnNjBXNHVMMFo3VjBQb0oyeURyRlM2THJNM1hoS1BYcVNCSVBSVjZzWVdpenAvTll2Vm9EUURLYm9WQ3BlQWRIcHBkb05PQjZIUkw5REIyM2NXT3ZZVW16YjFDOFBUM0VtMzFVSXloM1MyR3dWSjE1N0pIS0NiMFE0ZEk2NVFmVU5JTm9xYzRobkZsV1lwU29nWmxQVWE0VUZhcm04VEtwK2VLbysvV0lsTWNpVmZSU1R5RDBERXJ1M1RLSTRrcGsrQUdJMm1TanB6YXluTTZuYXppZFQxYWtSUU9TM0lyeWluVHNPY2JwNkZlaGZxNHFYUHFoZlRNV2ZxRyt1WklaaHZGaUgxR09NZXNlV09nVkVkN2pkQ3lBbVlSamVLWnlncmwvR0ZMZ1RZM1p1UUFNZ051eWdxbC9jN3ZwcEJ5UXI5MXRIaDNWMHJONUVvc1NQUHV6OHAraXhxSzdxNkhlOCttWFZaMFJFV2FpdEdWdzgrZ0ZoYUNNU0tvOUtkSXRkRlBUcXUxcmtCaVJhUEo2VnVuRm94ejBnVm1hdnpqZ1dDYUNMUXloT0dKVldPYkhsZG1QTkNoQW5nVllMRHRrQWdiTTkrU0ZPSEtGRUs0N1BtU1VZZS96TVNSSUJGVHFCaUhjdXhSd0h4ejc1S2ZjT293N0hVR0tqS0F1MU1VV1dNMEM4T2tJcWdNU20yNml1T0pxOGxPa3FSNndaN3BrMHhadkpHMWs4Rmp1blRrSW5SclRYQXlCMlNvenlWMmQwbGF1Y0s1eStna3F5SFVFY2x4OWZUNUNBSENORkxDUENPc1pySlY0ZHVRSFZnSVJORHNuT05UaEU5VXkwWGVLeHp2QzdDaGVaZGFLUENTUjZqOEF5QXF3YUdrL1VucDNKNjBTOHdpc2dka3BYcDJLbjZPRkJVUjdNakJ3R25WRmJ0SmgxVlBVRWdkQzlvK2pWd2lJdGpkREpkeUs4NG13emRMSVJFUHhHVnFMMWNQaTVsU0p6RWxCTDFKTlZZak16SWMyVlRZV3RvaWY4UGpwbnBUOVU5WjFKQXkyQTJPa1JYVWtPVmdGTXltVit4VUZGVDNDeURIanEwaE5XQzhndTg4YVIvaUJ6Uk5oa2t3aUh6bkxQSVhXUkJzUUlyY3JIYVJnb3BQV2tTMC9ZY2JQZDhRU25pN0kySUxuZkFTSlRWYWNmR3ArVnIwQ2ljUi9BcS9YaU5PdUVnNktvNE9yVXJTZnNBTEhpWWpjN3A4Wit5R1lSRG1XYVc3anVBTEVMT3p0bFdhc0pPd0hFYnoxaE5UNmRjOWNHQ0swY0h2T0tUVGJRd1NXcWdOQ3lvL1hrbFNNVEdSbXh6NjI0dyswUkRBdEFOZ0U0MDVHVlpRN1F6dXp6dW9PWUNKQmtIZXEzQXNwdXprNjg4K2gydFFJU2owdWM1Q2JGVHR6dVVBeGxORC9Ga1N3OUVUdXVlQ2VObzgxeUp4eW5GUkIyYkxkaTNHNzRzTTNZV0ZaZGY2REdKUENVaWRZZjVmUWlFUXhBdG9odzZFeFRxYnNYV1d6S2prdjRUSWVDZDdMYS9Ld2I3NlN4bCtON0JpRGJSRGgwaGg1QXJGWjBOR0djMnVWK0V0VnQyM2J4TzIyTFR1NUFhZkhsK2dEaHdPemt2ZzZyeXkwaGRieEhDY0FRaWRWdW84NTlvTkpnOWRlQXNuTTNBMmp0eXNxS25uQTgwZVZGbitnZ3F0czJPQ2NlOExUNmpqRDEycURoK2lJQ3BjSHJUUTdSQXdnbmJSZU81ak8zVm9oYllucDlMeDRZYkZ2M2RrTnBjS1FKeUZaK1NkMHpoNWdFc0l2eEhFbUFKQUxEaTFWbHQxQktnM2VMeUYyRU9UMCtBb1RERDl6R1dYNjZZanhlVjdqYjk2bkFlUXJZTHBEcDFnRk1OSjdTNEwwRXBDOXk4dlI5QnRUT0dqbFN6TitoMXdQang5cVR6aTh3MkdOcDhPOEU1RHJrNU9rNzBYS2tpaXVWRHp6N0NZWUJ5R1FDY2l0eThtWW00aWJsNTFiaXltb0hMWG9mM014RVo2QXcyVUZDTTB1RjBZWjR4Vzh3REVDZUlDQ2prSlAzbkRMQjQxVlVFVmZ4Q0dBQ3c4bjd2Ym5rSkYwb1dlSzJOUGcwQWZrTGN2SWUxd0pJSW5HbG1xYkR3ZkJyRFFTRzkzdm9MTHlmaE9OUVNZd2d0OUswVFZZZ3N6VDRBZ0VaaDV5OFNWcm1iQ2V1OHNjYisrQnVic29oMTN6SUczSFd1N3U2aUxxQm4xS2lmOFFNRnBVdFlCS2pMajd3WEJxY1FVRHV4d1c5SHNEKy9kNHdzUk5YSkNTSm9rb0lsVkd3emZKZmpEUGhWdWZCU2Z6R0o3bTdwVWRYTnFQS1BLTHJwS1VCcTVjVkVaQ0hjT25BQ2ZqaFI2ZE4xS3h2OTkyc1JLMlNBSlRuaVk0NEoyckg2M016bTlIckYwYmRqdVBVSnNEeXQvOURRQjdHb052dXhicHYzVFpsdlBmeFl1ZGNZS2JwOEgyVm13cThqZEQ2YlM0STZpby8wNFZVeG4xdVcyRGV6RGtFNUVua2p4L3JTWG5HKzNpeTFXRGliYjlHRkc0L1ErYjd5VFhVRWRSTktqbkRLZ1QxV3FkdkwrRHhCK1lUa0tjeHJXZzBubnpCZlpPcTRzcHBkZ2pCSWVmd2JJZlRxNHRpWjBOT01HL3BJUkRKOW5jU1VkZTRYMlVSQVhrZUsxZmQ0ZW03c3lyaXl2ekFsMXRDa0ZzWUFxZnh3SDJKNkhDNHlVblJiVlB4ODk4RWdTbXVmdnMxaVFpZTZQbWNsNzVIZHZ0N2pPQmlaZVVpWERXMGJXVGdUa3U4Y0R2YlNuYnltdFB4MTRmNnpUTXFzT1RObFNJMTlUSWovQzdsWER3MXJUZGVuSFdLNC9IRisweXNtVFBsdU5GajZBVitUVzdVclp0eDhmbXZpMjZYakRNQTJidjNqeWpmTXhKWDN0QUpsZnVkWDNzVXEwT1NsVnQ3Tk9EV0tPMFhMSm05REFKUGlXYk5saDA2ZnlBWExaMklMMWJmaE5mZXlrU2c0ZXJ1cEdETks3eUhEaTVEcC9OZUVmMTdQOFkrRHdOU1hwNkhBM0pVNUlMaVgvZldqd3VLazBLVk91emtsTVk3OFU3UkFodzQ4THpJeUlqY2xGbmpoSTc4NHN0YjhOMldrU2lZMkFVQjBYQ251cDlZOFdhMlNYOWJqc3pNNmFKVGgvbG1WN1dPVE1sblhocUhyZHVIWXNGNzdRR1I1dWVZanRtMnErUmVETHBxRlZxM21DbnVIRDR0bWc2MUFmbjExMDRRYWJkaHhPaEJXQk0rNDVnbG1sOFRsN0lDSGJQWDR0UW1SZUxaUi84VjI0M2xvVUw1VTBVZnlNcWh1UDJ1UGxqN2RYTy94bmJNdFVzd2NyTEtJTVJyWXZiMFI2M21iM3ZLVTVhWFg0UFV0TUc0ZjNKUExGcmFYT3VWZXNjY0VoRm5ieS82WDFHR244cmZFQzg5OGJBZENlSWV1NVVWRlFPUW50NGZ5ei91aVg4OGNpWjIvUGRFVjFkYUhJc0FSTTg1bzlrZVBIRHZsMWkvY1k0WU9hU1dtSXFyUTJKcEo2WHNqQTBiZXFObHkxdzhOek1iMDRzeUFIR2ljZWVoZzJQVXh5SW92QTV2MUxBZmNNZXdFbXpidFVDMHkzd3hFUm1VS1NyMzcrK0ZKY0VleU1ucWlGbXZaMkxGeWliWXVPVmtDQndQaVVZSUlBREozMUpVWjBCR3QyMzhuWDlHTXUrampienEvekJyMTNwdTFxM3hJTkc4NnZaNVptc2d0MHNGYnIxeE0xcTNDcUt5Y3JGSVQ1K25NaWhsUUE2UlpldldycGcrdXdNeW1tUmlVTCtXQ0g2YWdjOVdOY2JLTDQ3RHp0MXBnRXdGQk1GSlFRQUNWZUJsbFFKRWliOGdxMzhUbk1pWENnNkRGZW1Fenc4QlZodFVsVms1citPWURqVzZhTkVjNk5vSjZISWgwUFVpb0dYekNnQ2JVRjRlUk9QR2k0VVFKYXBEOGpZUTFWNGE2aWxUNFArR0M1T2wreElLbndBQUFBQkpSVTVFcmtKZ2dnPT0KLy8gQG1hdGNoICAgICAgICAqOi8vKi55b3VrdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmlxaXlpLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouaXEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sZS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly92LnFxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL20udi5xcS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnR1ZG91LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubWd0di5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly90di5zb2h1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouMTkwNS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9maWxtLnNvaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5iaWxpYmlsaS5jb20vKgovLyBAZXhjbHVkZSAgICAgICo6Ly8qLmJpbGliaWxpLmNvbS9iYW5ndW1pLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5wcHR2LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2l0ZW0udGFvYmFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL3MudGFvYmFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL2RldGFpbC50bWFsbC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9kZXRhaWwudG1hbGwuaGsvKgovLyBAbWF0Y2ggICAgICAgICo6Ly9pdGVtLmpkLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoueWl5YW9qZC5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxpYW5neGlueWFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovL211c2ljLjE2My5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly95LnFxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoua3Vnb3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5rdXdvLmNuLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi54aW1hbGF5YS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnpoaWh1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouZG91eWluLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoua3VhaXNob3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5peGlndWEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi55b3V0dWJlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLzQ3Ljk5LjE1OC4xMTgvKgovLyBAZXhjbHVkZSAgICAgICo6Ly8qLnpobWR5LnRvcC8qCi8vIEBleGNsdWRlICAgICAgKjovLyouZWdndm9kLmNuLyoKLy8gQGFudGlmZWF0dXJlICByZWZlcnJhbC1saW5rIOatpOaPkOekuuS4ukdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLlkKvmnInmn6XliLjlip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDvvIzlrp7pmYXkvb/nlKjml6Dku7vkvZXlvLrliLbot7PovazvvIzku6PnoIHlj6/mn6XvvIzor7fnn6XmgonjgIIKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmMjYtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL2NyeXB0by1qcy80LjEuMS9jcnlwdG8tanMubWluLmpzCi8vIEBncmFudCAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgIEdNX3VucmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2Rvd25sb2FkCi8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGNvbm5lY3QgICAgICBpZXNkb3V5aW4uY29tCi8vIEBjb25uZWN0ICAgICAgNDcuOTkuMTU4LjExOAovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgZG9tSGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CgogICAgdmFyIGRvbVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKCiAgICBkb21TdHlsZS50eXBlID0gJ3RleHQvY3NzJzsKCiAgICBkb21TdHlsZS5yZWwgPSAnc3R5bGVzaGVldCc7CiAgICAvL+W5s+WPsOWIpOaWrQogICAgdmFyIGlzTW9iaWxlID0gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQb2R8QmxhY2tCZXJyeS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgogICAgaWYoaXNNb2JpbGUpewoKICAgICAgICBsZXQgcGxheUxpbmUgPSBbCiAgICAgICAgICAgIHsibmFtZSI6Iue6r+WHgDEiLCJ1cmwiOiJodHRwczovL3oxLm0xOTA3LnRvcC8/ang9In0sCiAgICAgICAgICAgIHsibmFtZSI6IkLnq5kxIiwidXJsIjoiaHR0cHM6Ly9qeC5ib3pyYy5jb206NDQzMy9wbGF5ZXIvP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoi54ix6LGGIiwidXJsIjoiaHR0cHM6Ly9qeC5haWRvdWVyLm5ldC8/dXJsPSJ9LAogICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiT0siLCJ1cmwiOiJodHRwczovL29ranguY2MvP3VybD0ifSwKICAgICAgICAgICAgeyJuYW1lIjoiUkRISyIsInVybCI6Imh0dHBzOi8vangucmRoay5uZXQvP3Y9In0sCiAgICAgICAgICAgIHsibmFtZSI6IuS6uuS6uui/tyIsInVybCI6Imh0dHBzOi8vanguYmxiby5jYzo0NDMzLz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IuaAneWPpDMiLCJ1cmwiOiJodHRwczovL2pzYXAuYXR0YWtpZHMuY29tLz91cmw9In0sCiAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0ifSwKICAgICAgICBdOwoKICAgICAgICBsZXQgdXNlV2ViID0gWydtLmJpbGliaWxpLmNvbScsJ3lvdWt1LmNvbScsJ3d3dy55b3VrdS5jb20nLCdtLnlvdWt1LmNvbScsJ20udi5xcS5jb20nLCdtLmlxaXlpLmNvbScsJ20ubWd0di5jb20nLCdtLnR2LnNvaHUuY29tJywnbS4xOTA1LmNvbScsJ20ucHB0di5jb20nLCdtLmxlLmNvbSddOwoKICAgICAgICBpZih1c2VXZWIuaW5kZXhPZihsb2NhdGlvbi5ob3N0KSA9PSAtMSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfkuI3mmK/lupTnlKjnvZHnq5knKTtyZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRDb29raWUoY25hbWUsY3ZhbHVlLGV4ZGF5cyl7CgogICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7CgogICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7CgogICAgICAgICAgICB2YXIgZXhwaXJlcyA9ICJleHBpcmVzPSIrZC50b0dNVFN0cmluZygpOwoKICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY25hbWUrIj0iK2N2YWx1ZSsiOyAiK2V4cGlyZXM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRDb29raWUoY25hbWUpewogICAgICAgICAgICB2YXIgbmFtZSA9IGNuYW1lICsgIj0iOwogICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8Y2EubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBjID0gY2FbaV0udHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb20sZG9tSWQpewoKICAgICAgICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuYm9keTsKCiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkb20pOwoKICAgICAgICAgICAgbmV3RWxlbWVudC5pZCA9IGRvbUlkOwoKICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnRIdG1sQ29udGVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKCiAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50SHRtbENvbnRlbnQpOwoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHRvYXN0KG1zZyxkdXJhdGlvbil7CgogICAgICAgICAgICBkdXJhdGlvbj1pc05hTihkdXJhdGlvbik/MzAwMDpkdXJhdGlvbjsKCiAgICAgICAgICAgIGxldCB0b2FzdERvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOwoKICAgICAgICAgICAgdG9hc3REb20uc3R5bGUuY3NzVGV4dD0ncGFkZGluZzoycHggMTVweDttaW4taGVpZ2h0OiAzNnB4O2xpbmUtaGVpZ2h0OiAzNnB4O3RleHQtYWxpZ246IGNlbnRlcjt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlKTtib3JkZXItcmFkaXVzOiA0cHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtwb3NpdGlvbjogZml4ZWQ7dG9wOiA1MCU7bGVmdDogNTAlO3otaW5kZXg6IDk5OTk5OTk7YmFja2dyb3VuZDogcmdiKDAsIDAsIDApO2ZvbnQtc2l6ZTogMTZweDsnCgogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0RG9tKTsKCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgdmFyIGQgPSAwLjU7CgogICAgICAgICAgICAgICAgdG9hc3REb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICctd2Via2l0LXRyYW5zZm9ybSAnICsgZCArICdzIGVhc2UtaW4sIG9wYWNpdHkgJyArIGQgKyAncyBlYXNlLWluJzsKCiAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodG9hc3REb20pIH0sIGQgKiAxMDAwKTsKCiAgICAgICAgICAgIH0sIGR1cmF0aW9uKTsKCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwbGF5VmlkZW9GdW5jKCl7CiAgICAgICAgICAgIC8vY3NzCiAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGAKICAgICAgICAgICAgLnpobV9wbGF5X3ZpZG9lX2ljb257CiAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDoycHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrOwogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGV0OjBweDt0b3A6MzYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZQogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb193cmFwewogICAgICAgICAgICAgICAgcG9zaXRpb246Zml4ZWQ7bGVmdDo0MHB4O3RvcDozNjBweDsKICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTsKICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZXsKICAgICAgICAgICAgICAgIHdpZHRoOjMyMHB4OwogICAgICAgICAgICAgICAgaGVpZ2h0OjMxNnB4OwogICAgICAgICAgICAgICAgb3ZlcmZsb3cteTpzY3JvbGw7CiAgICAgICAgICAgICAgICBvdmVyZmxvdy14OmhpZGRlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZV9saW5lX3VsewogICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgICAgICAgICAgZmxleC1mbG93OiByb3cgd3JhcDsKICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgICAgICAgICBwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpewogICAgICAgICAgICAgICAgcGFkZGluZzo0cHggMHB4OwogICAgICAgICAgICAgICAgbWFyZ2luOjJweDsKICAgICAgICAgICAgICAgIHdpZHRoOjMwJTsKICAgICAgICAgICAgICAgIGNvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MzsKICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6MHB4IDBweCAxMHB4ICNmZmY7CiAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saTpob3ZlcnsKICAgICAgICAgICAgICAgIGNvbG9yOiMyNjAwMzM7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgfQogICAgICAgICAgICAuemhtX2xpbmVfc2VsZWN0ZWR7CiAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19qeHsKICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7CiAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OwogICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO3RvcDowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYDsKCiAgICAgICAgICAgIGRvbVN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7CgogICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgIC8vdGVtcGxhdGU6aWNvbixwbGF5TGluZTsKICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPScnIGNsYXNzPSdwbGF5QnV0dG9uIHpobV9wbGF5X3ZpZG9lX2ljb24nIGlkPSd6aG1sb2dvJz48aW1nIGNsYXNzPSdpY29uTG9nbycgc3JjPSdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUNXQVBjQUFQSkVRL3Y3K2ZuTHlQakN3ZlJuWmZuVDBQSktTZmpHeFB2MjlQblkxL05iV3Z2MTgvYVVrL3JsNC9ydzd2bkt5UGFKaVBycjZmYWFtUFJ5Y2ZhTGl2djU5L0pKU1BydjdmTlZWUG5lM2ZydDYvTlFUL3Y2K1BlbHBQYWdudlIzZHZpNnVQdno4ZmV4ci9uT3pQZWdudnJrNHZSMWMvSkdSZnJxNlBuUXp2akN3UG5TMFBuWjEvdnc3dm5hMmZlb3AvZW1wZnJjMnZOVVUvaXhyL1I0ZHZXSmgvZXNxdkpIUnZ2eDcvcnk4Zk5TVWZOV1ZQakJ3UFY2ZWZhTWl2bmYzZmk4dXZXRGd2djQ5dnJwNlByeThQSlBUdmFZbC9uVDBmblcxUGVycWZSc2EvUnZidldBZi9WOWZQbms0dmkydGZSallmUmhYL3Z1N1BOWVYvSkZSUG5rNGZhSGhmYVhsdnYzOWZyaDMvaTd1dm5OeS9uT3kvcnM2dmVycXZSZ1h2bmQyL2FHaFBXUmtQVi9mZnJpNFByajRQaXdyZm5MeWZhVWt2UmZYZkpOVFBqRncvZXlzZlJsWS9SeGNQdnY3ZmV6c3ZpMHN2djI4L2FibXZlcXFQZXBxUEpNUy9leXNQV09qZk5kWFBSemN2djA4dlJ1YmZybzV2ZWlvZmVsby9OWldQbloyUE5wYVBuVTB2UmZYdm5IeGZpdXJQakF2L25RemZybjVmbmMyL2Uwc3ZhZG5QZTR0L2FTa2ZOWFZ2Um1aUGV0cXZuWTF2aTh1L2Vpb1BpdHEvaS92ZlJ3Yi9SMWRQbmUzUGFlbmZhY212ZTN0dm5Sei9yajRmYVhsZlYrZlBXRmhQSkxTdmFOaS9XTWpQUjBjL2FWay9XUGovYWRtL3JwNS9uSXh2Um9adlJpWWZqRHd2YVZsUEpPVGZlMnRmTnFhZkpSVVBla292YWFtZk5hV2ZWOGV2bmQzUG5OelBuVjFQZXNxL2pFdy9WNmVQUjNkL25nM3ZydzdmYVdsUGVucGZhZm5mV1Bqdml3cnZOV1Zmbk15dmk2dWZWL2Z2VjllL25iMnZydTYvUmtZdmpBdnZuSXhmUmlZUGk5dlBlZ24vVjdlZmVqb2ZlMXRQV0NnZnJtNVBKSVIvbmMydk5jVy9KUVQvakZ4UHZ5OFBXRGdmV0JmL1JzYlBWNWQvTnBhZk5jWFBuZjN2YUlodlJ2Yi9pdnJmblgxdk5SVWZhS2lmUnRiUGFabC9OZVhQZTV1UFdDZ1BScmF2YUloL05vWi9uSngvV0ZnL2k5dS9SMmRmakh4dmpJeHZOVFV2aS92dmUxcy9OZVhRQUFBQUFBQUFBQUFBQUFBQ0gvQzA1RlZGTkRRVkJGTWk0d0F3RUFBQUFoK1FRRWxnQUFBQ3dBQUFBQVpBQ1dBQUFJL2dBQkNCeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGlseElZRVNBQUNNSWpGeHBVSVdEQUE1VWVGakk0dVRKQkN4ekNzeGhrOGlRaFRadDZzeXB3YWFHREFzSEJPVXhsT1VMSkNXUXZLaXhjQU9EQVFNWWJHaTZVa0dQR2owVUdPQkt0cXpaczJqVHFsM0x0cU1DRTAxTWlLMUtZc1FJRWxzN2ZtRkNhOUVXRjRrUWhDaVRRb1VJVFV6U2ZPeVFna1dLRGtHU0x0V29BOWl1WlVFemF3NGdCWnFWSWh0UjJFU0JVNkZtakRRT0Nkbk1lak1DTFJNeUxyQzU0QUxOb0tVcGpuSFJ1bmZyVHZVdW5wbTk0TUVma2dNY1hCaWdjdUlsM3I2anN6NmpvS0lKQ1I0a21OZ3hFa01qM3lYby9ta0NKYWlXQlRWZjlGaVpNNmxFYndTb1RyUTl5RXNLNndxcVNPVnhLTU5Xa2plc3VkRGNmQUJjUXdkcmZWd2hBMFVXaElISVprTDBRcUFhSzJ6bWlRODNaQVRGRVpvVk1oOEd5bWlHQUNVV2NFVEZGUWdFOVVCRUJtQ2dBQVpqTVVRQUNTUU1xSkFNWldqbWdtSWZmWkhBU1F1VUVoRUVJandoQWdRMkhtUkRVRFlzcEFaMFFkMVJZa2duaU1GQUZCTEZZRk1NUUN6MGtrMjJKWFRDZzVtaFFaWWRWcEJqeDBKeTBCWm1RazRFVllWQ2RXVEdRVHBrRVZKVUFDNkFsdEFQTm1XaXdrSVFmSGtCQkFuMVlxY1ZaZmtScFVJK3hBRkVIRDRvMFJBQlNSYWtBNEJCaldKV0I1bkZocEFCVTBReFJZd1kzWkdaTG1mbHNacE4vbVZNdVZJYkhBU1ZoYXhsTVpMWktUbWxFQlFIc2FSMVFvZzI5U0hmU0tWa1pzWmE2bVJHZ1VZVGlHcFFBVUc5NGVkQ09wZ1VnaGV2Z0xSRlVDNGN0QVFESGpDd0JIY0tGWHFTQTRnU3hFZVpEdWtUMURLT0hNdVJIa0ZwY0pCTE1NbTBVSncyelVrUUhFRjFnZXBDZTJqbVN6SWVOV05UT3dmeGRKSlBYZ2IxSmdBV2hCQVVNQSsxbGdJekhKMVF4eGFickduUW5nRWN0ZENTTmlWQmtEZEJWWEF0UTdXeXhnRW5qK1QwVkZSVHljZ0FBMGtTYkZNckVGWGcyeDZVbUN5U1YyRE5SVkVXUVRINmtOSFJwVElLRlFRYWhFRm1HQlFkVkNHNXRBYUdHeGo5c1VBRmpIeUVURkJsUlBUcVNTOEFFRVlmclJWQ1NFVnVCTVdIL2tlYkJBV0MyMEhWSVpBb3dtaThXUVVpNEROUm5UYjU0ZEYzTnFVTkVSWkIwVUhRSTV6VXJCa09jK0RhVU44MkhVUFFXMHpRNEhSQ0JDZ1ZBSE1ERFJLVU94R2xhSlBsQmNYRElXc05oQUZSS0VFTlFoQmoyQndCMlcwMjVRYTFUWlpDSlB0SkxoOVVqVFd0U2ZLT1ErL2ExQUJCb3AxRUdsQ1pEUlJCVUt6RUhwUVhDVmt3aCtHYkhWTGRRbEVFSlFWQkVnZEFzVUtxbjhTVVFMUFpWRXRFK1o5RXZrSVlXSVRtTW9PRkRtQXRJWUNJR1VIdVFSeDd6RVFoVnNHS1ZnWkN0Wk1zQ0NJSnN3bXJHQUlKWDdFbUVqZjZGVUd1azUzdFVBUUhRY2xHUk5BWEFCQTZCQm51MFV3SUZKS0hvT0RBSTlrN1NSdFdHQlFYTnFRSi9tVFlUQVFVUW9DZ0pNSWppZ2hLT1hob2swbzBCQXBjYU0yekVvS0pvSURCSTJ1SVdrU1NhQk5hTEVRR2Q2aGdac2hBZzRXSUlTaXE4RWdsZ2tLQ2lEakNKaUVvUnZtTWdNTE40TUFJR1ZxSUlZTGl4SUcwNkVVSFE0aFY3REpCZ1p3aUtFU0xTQ2dzWVlpN0lXUU1NZFJNQmRpZ0E0ZDh5eVppSUFpUmpJUWt5ZGprZmdBUVJGQzRjVUNOZExBMVhJRENRMDZ3dkFCSUN3QmFPZ21YdUJlVWdkeUFjallSUkVTNllRbHpxSklnTW9EREFJTkNoakZFNUJKQlFRQ3UyZ1NraXgya0pzVWp5Q1ZQMHNhSDRNRW1DSkFqeGlUQVFodmlVU0tPc29rOENoTExBTXlTaUtwajNVQStnUnVJU0NJb3dnQUFFeUtabVVsV2NpSjAvclBKRlFxeXlTTmw2aUh0Q3dxV0hJS3lBQmpEZzV0SlpVVW04S3VjRWVTUE1Mb0lsQUt3TElkMFFUckZ2TWdoZ3NJRmtWd1RqdHF3cUcvdW1NZUtRQ0l6UGhDSktGajRQNFo4N3o2VXpFZ1diV0t3a1lES0poVUluMHRabzlDTTBDQXpSc2pJakdwMEVCMzBMd0FwYUVpT3htaE1qVmlnQVVGcFFTQUZNb0VyZU9BS0UwQlhRbGgya2lZWlpCYVorUVJEMk9ETmttWWtHSm5KNUVIV3dKTWNyT0dCQ2ZuU1Nad3BFQU1rSXBrN1ZJZ2FkaEdBQmNEaG5odFJ3Z0J2WWErQ3hHOStjSklUUXFvWWxCTE1iQ2l5OEVSbTlvYVFIRzR2WFlacTEwSElHcFJ0a0tVSWdjZ01NUlRTZ1NQOFFIaVJZVWkwRm1LQmNXU0dGMDBwL2tMWWdxSUl6eFZFQVRRSWd1bW1XaEZtWkFZUFE1SEJMVElUQWg1eEpSYVpZWWRPMG5BOG5PckJMQWV5eVRsMHdvUnVCa0IzWnNsaEFOYkJFblRBUWpNY21PSkhWcXNRWkFZRkVBTVJCeXlrRUFFR21OVWlKNkFBcDRLQ0JZWTVCTGU2UFIxQzFBVVR6UnJFREwwVHlBM20wRXBmTk9FaUZoZ0dWRFhUaFZjeTVBV21QVUxQRkFLd2t3ak1JQ2V3ajAxY0FRQWxnSUUxSzhDRExDVHlEVE5vV0RPSXVPQkRVS1l5aGNnMUFIUVZDR050OGdWaURGT1NBbUNBRzlRZ3BtZkFneE9wYUEwQ05GSEtoeHoySndyaGFnQ2FaNUJGUlBXbDBqa0pCN0xnakVuTW9BUEJvTVlhQW9ITDNsQ0hJdno2aGI5SVFxTi9BdUFHZGV4Ti9qTXlFT1UyODhrV0ZobVhCOUJ3TG94SXd6ZWVlQzRBYUdBTU4vY21CVDBnRUFpRVRLS0NFR0FXSC9ielNUU1FoQzlrelFBWjFNd0k5cE9RTkh4aUVtQVFvMllXNElKamlHRVZoWjBQS0RhREF1dzZ4QUxoQU1jOGhvRUtDWkNDQ1c1QWI5WU9nb1o2bXFGYnN5NElSSGxyNkhSbXFnMFZETVFxY24wUUh4UkpCSlVpM2swTzRnZ2hDTUVWUlNiMlFBQjFFa0hSVWlqU2pnZ3oreHBqZ3RRdkFLRE10a1BLZWM2RURISUVoUlMzUS9yWlNYVi9aTmZ1anJlODUwM3Zlay9rM09tMmQwRklxQjJ0SXVUYjRkYjNRSWJUVndFY3h6VGRNNGdBSHNEd0I0aFhJUlJvK0FNR0lKQm9hT0hpV2docVFXQWdjWW1yb0FNZ2wwai8vbXFqN0FEa2hpQlFYbDFEdm8wVUFGRExKZ2RRdUhRaTBJbUhLOFN5Sno5STZrNml6b0o4KzNvN3RjbmZYQjZVbUJkRUFHN3V4QWNZd2hqSERPOGlGTWpNMGhYeUFha0w1T1VuTVRwQmtPN21DRXc5SVcrSmkzNHIwZ0svTFdUUU5tazUwV0V1Y3o4UHNTa1ZpcVpDZmlUMGdXQTlBRm9mQ05kUElvQ0NVR0FHQ1dobEFJYXVFd2trY3lHdC9QcmQ4eTZRdlFlZzd3ZjVRQ3ZmUHBTeTJ3UUdDWUZCVUNpLzlxeTNuZThKTVh4UXZvNlJvWnBaSUhFL3lRb1NrbnFWMjczb24zKzhRbHFKZVlRd0xTeThIb2lTdlhvUXpkdWtCUW14L0VrZXZ2allReDRoQ3o1SjdRK3lNNmxReGNVV20zMVFiQzZRcU51RTg1M0h1L0VWL3BMOEFDei9aRVpSTzBJcUhJQUxINFR1UEQvSXR5bE9rT0lmUFNqSFB3anRFM0prUW1WV0lUTUlDdEFMd21hYlNLQWc3cmQxOEJkNnpwSVFZVFptQzBGZWlEZDZCVkYxdnpjdHNQZCtOaEYvQlpGeTJGY1Fja1puL29ZUjZEZDRCWkYvTnJGNkFCaUJBamlCQnpFRDlDUjdaQUdDeTBZUUhmaC9JOGgyRW5nU0pTQnhrbEFDd29kTnBEY1VEbmdTQ0ZBUXl3TjhFQ2lESmVobU1GZ1cvYWQ4QXlGNkxSaURuamVEMG9FQU16QmVEcFlRYUtkNkE5RjZVemlFVDFpRXZvRUFLN0NEbzFJcXA4SVEvTVV1RE5HREFVQjVVUGFEQnhHQWVoZFZEVENIZEpnQkF2QjlEQkVwazVKc0ZLWllESkdFQWZBczF0ZUVUcWg5VUVpQi9oUkJiUUZnYmRBSEpnMXhoU29IaVZ2SWhZYm9oWWc0RWR0R2Nra1dGRXdHY1VHQkZJQ1lFSERZZUFPSUVlVFdKV1JHVkE2UmNnQ3dQT0pYaUl3SEFJNTNpUkxCYnFkbkVkL1dlb1JIaWJFNGl4a0JieDh4aUpvaGhxOUhoSEZvZ3VxV2NtbW5FS01vaTZVb2JvNVhkNkpJZ3NjSWV1ckdoTlBIak5SSWlzZzRGS256RWozWEVEbTRoZ3ZSakw2SUVmeG1RZ29CVFlUSUVLM25ldE5vak54b2pjSkJIQVozYlNjQkVSSkFoM05JZlFYUkNBa1FrQWxnQ0FZQkF2eTRpeFV4Y3QwMkVBQW5jQWFCYzFYQkFJU1VGdzQ1RU5PQUN5eUFDMzZRV2hVNUVWTXdBVTB3QVdYWWtTUlpraVo1a2g0UlFWbEJrUjI1RDAzUU5Ma25QQkFOV1pKZXdBSTg4M3dKY1JvbHlXS3ZhQkRzYUhJbVdYL294SE8zU0cvNVVCUWFZQWx3aFpJTVlRcUE4Z09tVUpSTU9aVlVXWlZXYVpVQkFRQWgrUVFCbGdBQUFDd0dBQVlBV1FDTEFJY3l6VEx4MFVYeHBVVHlYMFB5U0VQeVZrUHllVVR5Z2tUd3lFVHpUVVB4eWtYeWlrVHd4MFR4dGtYeVVVUHh0MFR4cmtYeHhrWHd2MFR5bUVUeWkwUHh1VVR5YWtQeHlFWHh4RVh5YUVQeHUwVHh6RVh4elVYeWtVVHhsRVR5VWtQeWowVHhoa1R4cEVUeWJrVHh0RVh4dzBYeW5FVHhna1R5VkVQeWUwVHlaVVB4b0VUeHNFVHllVVB5YkVQeHNrVHh1MFh5ZEVUeHJFVHljRVB5WjBQeHYwWHhlVVR4elVUeW1rVHhqMFR4azBQeVkwUHhya1R5alVUeHAwVHlXa1B5YVVQeGhFVHhvMFR4ZFVQeW9VVHlXRVB5Y2tQeHFVVHhxMFR4cWtUeWswUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJL2dBSFFBZ1FBTUlBQUFnVEtseklzS0hEaHhBalJoUndJY0FGQVFzZUVDVFlRS0xIanlCRE5sU3dVVUdKalJ0RnFsekpNbUdFalJGZ0NFQXBvcVhObXhFN2tLaEJva09MQkFjRUNEaVFBS2ZSb3dnTGpMQXhvZ0FCcEZDalNwMUt0YXJWcTFpemF0MEtzWUNGR1JhY0pxQUFBUUtGb2x5eGdtRHhnQVdJR0RNMzFreDdGY05HREExUUVxUjdsY1BHRFJjMGJ1ekl0Nm9Ndnh1UTVCZ2dBQUVEQVFjTFU3VVFZa0VJSUI4a2E5N011YlBuejZBL0UzQlF3TUZUQUFNb1VJZ2MrcWFCQ1NZbUdCamdBYVdIMWpjcmJLeXdBZ0ZLQnJodDN2akxRQUpLQ2NGYmF0aW9RWUFCM3dFWUdFak9NZ1VPSWpoUzdFQTRnRFYxbFFSUS92eEFjZnE3K2ZQbzA0UE9rRUU5U0JVbkZweFE4ZUU1UVFUVDNVK3NlSEdCOFkzSTZRY1JTUVNaQkIxQndBbjQwRXNFeFZUYlJqb28rSkJPUFBtRTJnRUhlQ2ZoUWtveDVkU0dJSVlvNG9na0t1U1ZFUzQ0eFJoQmtKVUl3Rm9WdlBDV1lCeTVhQmRCZU9rVmdJc0VCbUJTWEFUTlJXSVNpQjJ4QUZCQ0VlVWlaWlpoNXVLVFVFWXBaV0dqbGZZVVVHVXBXZUpyc2MwR1pBQkNqcWdiUWJ6cDZPSndCRzNBQUkwQkVFYmltQUh3dG1JQUxXNEptMndhUGxtbGFWUDI2ZWVmT0tXMjJwTTBCTEZBRURSODhDQkJ0NVhvQTBrSytMREFnZEh4V0ZJSi94RVVJSWszQm9DWGZkSGxSeUlJTDJnZ1l3d0lzUWRsQVM0TWtXSjUvb0RHS3V1c0M2bjZKS3V1T2dVcWZpNTJVT29MUG1VYXdLWWpNaGhBVEpRbVNHS1BKaTBhUUlRbFVtUVJScWlwbG1lSThNbEhINjNjZHV1dGlIcytOV2VkSktad3AzWnN1am5pY2dRMVoyYUphQWFnNXBkaGlnZ25iMWhDb0NXSlhPTFpaN2pmQml4d2lQbnVPeUtUSVZqd0FiMHVIaFlBQnpMazhDNkpmcVVaR0VycWl0Z3BYdU5ldStGYWJiM1ZwMWRnZlRqd3lTaWpKNmpIRzNiWUZBSE9Oa29paFQyMWtLeUx4c1lrTExFaU1sc0NxTks1S0cxL3FiYjNaTGJ6WlpieTBreTNacXVMNFkzMzFLNmlqbWdkZHRydDdDSzdBVFIzTTd6RU9RdnRtN3V0VU8yZ0x2WTcyNytrOGRuMDIzQVh4cGh2NUI1Y1djSWZwTnV3VVY4UVM2eVhpeFhMZXhGTk50N1ZRTUZva2RnRER3L3cwQU9xVTZKQXd3dzBrQmYzNVpoZmhlUlFpWTlZeEF3ZUVzQndpVW84VUdFTEV4Y0xFd3g2bCtoenh5NEs4VklFUWl6UTV3SExhWkJoUUFBaC9oVk5ZV1JsSUhkcGRHZ2dVMk55WldWdVZHOUhhV1lBT3c9PScgdGl0bGU9J+eCueWHu+S4u+Wbvuagh+W8ueWHuuino+aekO+8jOeCueWHu+WPs+S+p+WIl+ihqOermeWGheino+aekCcgc3R5bGU9J3dpZHRoOjQwcHgnPiI7CgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXYgY2xhc3M9J3BsYXlMaW5lRGl2IHpobV9wbGF5X3ZpZGVvX3dyYXAnIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4iCgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2xpbmUnPiI7CgogICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPGRpdj48dWwgY2xhc3M9J3pobV9wbGF5X3ZpZGVfbGluZV91bCc+IjsKCiAgICAgICAgICAgIHBsYXlMaW5lLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gJyc7CgogICAgICAgICAgICAgICAgaWYoZ2V0Q29va2llKCdwbGF5TGluZUFjdGlvbicpID09IGl0ZW0udXJsKXsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9J3pobV9saW5lX3NlbGVjdGVkJzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9YDxsaSBjbGFzcz0ncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpICR7c2VsZWN0ZWR9JyB1cmw9JyR7aXRlbS51cmx9JyA+JHtpdGVtLm5hbWV9PC9saT5gOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8L2Rpdj48L2Rpdj48L2Rpdj4iOwoKICAgICAgICAgICAgLy90ZW1wbGF0ZTpub2RlO+aSreaUvuWMuuWfnwoKICAgICAgICAgICAgbGV0IHBsYXlKeEh0bWwgPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fangnPiI7CgogICAgICAgICAgICBwbGF5SnhIdG1sICs9ICI8aWZyYW1lIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nbm8nIGFsbG93ZnVsbHNjcmVlbj10cnVlIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgbmFtZT0nanhfcGxheScgc3R5bGU9J2hlaWdodDoxMDAlO3dpZHRoOjEwMCUnIGlkPSdwbGF5SWZyYW1lJz48L2lmcmFtZT48L2Rpdj4iOwoKICAgICAgICAgICAgLy/lvqrnjq/liKTmlq3mmK/lkKblnKjmkq3mlL7pobXvvIzmmK/liJnmiafooYzkuIvpnaIKICAgICAgICAgICAgbGV0IGp4VmlkZW9EYXRhID0gWwogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyX19jb250YWluZXIiICxtYXRjaDovaHR0cHM6XC9cL3YucXEuY29tXC94XC9jb3ZlclwvW2EtekEtWjAtOV0rLmh0bWwvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXItY29udGFpbmVyIiAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldK1wvW2EtekEtWjAtOV0rLmh0bWwvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJyxuYW1lOidxcVBDJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5jb250YWluZXItcGxheWVyIiAsbWF0Y2g6L3ZcLnFxXC5jb21cL3hcL3BhZ2UvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD9jaWQvfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3hcL3BsYXlcLmh0bWxcP2NpZD0vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3BsYXlcLmh0bWxcP2NpZFw9L30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC52XC5xcVwuY29tXC9jb3ZlclwvLipodG1sL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjZmxhc2hib3giLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm0tdmlkZW8tcGxheWVyLXdyYXAiLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmludGwtdmlkZW8td3JhcCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjYmlsaWJpbGktcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvLyxuYW1lOidiaWxpUGMnLGFyZWFDbGFzc05hbWU6J3ZpZGVvLWVwaXNvZGUtY2FyZCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyX21vZHVsZSIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXdyYXBwZXIgcmVwb3J0LXdyYXAtbW9kdWxlJ30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXItY29udGFpbmVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXByZS1jb250YWluZXIgbm8td3JhcCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvdmlkZW9cLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbWd0di1wbGF5ZXItd3JhcCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbWd0dlwuY29tXC9iLyxhcmVhQ2xhc3NOYW1lOidlcGlzb2RlLWl0ZW1zIGNsZWFyZml4J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LXBsYXllciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovdHZcLnNvaHVcLmNvbVwvdi99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIueC1jb3Zlci1wbGF5YnRuLXdyYXAiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLnR2XC5zb2h1XC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2xlX3BsYXlib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2xlXC5jb21cL3B0dlwvdnBsYXlcLy8sYXJlYUNsYXNzTmFtZTonanVqaV9ncmlkJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BwdHZfcGxheXBhZ2VfYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi92XC5wcHR2XC5jb21cL3Nob3dcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdmlwXC4xOTA1LmNvbVwvcGxheVwvL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjdm9kUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLjE5MDUuY29tXC92b2RcL3BsYXlcLy99LAogICAgICAgICAgICBdOwoKICAgICAgICAgICAgLy/liJvlu7psb2dvX2ljb24KICAgICAgICAgICAgY3JlYXRlRWxlbWVudCgnZGl2JywnemhtSWNvbicpOwoKICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOwoKICAgICAgICAgICAgemhtUGxheS5pbm5lckhUTUwgPSBwbGF5V3JhcEh0bWw7CgogICAgICAgICAgICBsZXQganhWaWRlb1dlYiA9IGp4VmlkZW9EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtbG9nbycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgIGxldCBqeFZpZGVvV2ViID0ganhWaWRlb0RhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIGlmKGp4VmlkZW9XZWIubGVuZ3RoID09IDApewoKICAgICAgICAgICAgICAgICAgICB0b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIHZhciB7ZnVuY05hbWUsbWF0Y2g6bm93TWF0Y2gsbm9kZTpub3dOb2RlLG5hbWU6bm93TmFtZX0gPSBqeFZpZGVvV2ViWzBdOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtX3BsYXlfdmlkZW9fd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVNob3cgPSBwbGF5TGluZURpdi5zdHlsZS5kaXNwbGF5OwoKICAgICAgICAgICAgICAgICAgICBwbGF5U2hvdyA9PSAnbm9uZSc/IHBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOnBsYXlMaW5lRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsKCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TGluZVRkLmZvckVhY2goZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgemhtX2xpbmVfc2VsZWN0ZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJyx0aGlzLmdldEF0dHJpYnV0ZSgndXJsJyksMzApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3dXZWJOb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihub3dOb2RlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub3dXZWJOb2RlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93V2ViTm9kZS5pbm5lckhUTUwgPSBwbGF5SnhIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5SWZyYW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZnJhbWUuc3JjPSBpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikee9keermee7k+eCueS4jeWtmOWcqCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICBsZXQgaT0wOwoKICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmNsYXNzTmFtZT09J2ljb25Mb2dvJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBpPTE7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICBpZihpPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGlzU2hvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy56aG1fcGxheV92aWRlb193cmFwJykuc3R5bGUuZGlzcGxheTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXNTaG93ID09ICdibG9jaycpewoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnpobV9wbGF5X3ZpZGVvX3dyYXAnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQoKICAgICAgICBwbGF5VmlkZW9GdW5jKCk7CgogICAgfWVsc2V7CiAgICAgICAgLyotLWNvbmZpZy0tKi8KICAgICAgICB2YXIgQ29uZmlnID17CgogICAgICAgIGNvdXBvblVybDp3aW5kb3cubG9jYXRpb24uaHJlZiwKCiAgICAgICAgY291cG9uSG9zdDp3aW5kb3cubG9jYXRpb24uaG9zdCwKCiAgICAgICAgemhtQXBpVXJsOidodHRwczovL3d3dy5lZ2d2b2QuY24vJywKCiAgICAgICAgaWNvblZpcFRvcDozNjAsCgogICAgICAgIGljb25WaXBQb3NpdGlvbiA6ICdsZWZ0JywKCiAgICAgICAgaWNvblZpcFdpZHRoIDogNDAsCgogICAgICAgIGp4Q29kZUluZm8gOiB7J2luJzo4MTUxNjY5OSwnY29kZSc6NH0sCgogICAgICAgIGNvdXBvblRpbWVyTnVtIDogMTAwLC8vMTAw5qyh562J5LqOMTDnp5IKCiAgICAgICAgY291cG9uV2FpdFRpbWUgOiAxMDAsCgogICAgICAgIGljb25XYWl0VGltZSA6IDEwMCwKCiAgICAgICAgc2VsZWN0ZWRMZWZ0OidzZWxlY3RlZCcsCgogICAgICAgIHNlbGVjdGVkUmlnaHQ6JycsCgogICAgICAgIHZpZGVvUGxheUxpbmVBZGQ6R01fZ2V0VmFsdWUoJ3ZpZGVvUGxheUxpbmVBZGQnLDApLAoKICAgICAgICBkeVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2R5VmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICBrc1ZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ2tzVmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ3hpZ3VhVmlkZW9Eb3dubG9hZCcsMjIpLAoKICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZDpHTV9nZXRWYWx1ZSgnYmlsaVZpZGVvRG93bmxvYWQnLDIyKSwKCiAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQ6R01fZ2V0VmFsdWUoJ3lvdXR1YmVWaWRlb0Rvd25sb2FkJywyMiksCgogICAgICAgIH0KCiAgICAgICAgdmFyIHtjb3Vwb25VcmwsCiAgICAgICAgICAgIGNvdXBvbkhvc3QsCiAgICAgICAgICAgIHpobUFwaVVybCwKICAgICAgICAgICAgaWNvblZpcFRvcCwKICAgICAgICAgICAgaWNvblZpcFBvc2l0aW9uLAogICAgICAgICAgICBpY29uVmlwV2lkdGgsCiAgICAgICAgICAgIGp4Q29kZUluZm8sCiAgICAgICAgICAgIGNvdXBvblRpbWVyTnVtLAogICAgICAgICAgICBjb3Vwb25XYWl0VGltZSwKICAgICAgICAgICAgaWNvbldhaXRUaW1lLAogICAgICAgICAgICBzZWxlY3RlZExlZnQsCiAgICAgICAgICAgIHNlbGVjdGVkUmlnaHQsCiAgICAgICAgICAgIHZpZGVvUGxheUxpbmVBZGQsCiAgICAgICAgICAgIGR5VmlkZW9Eb3dubG9hZCwKICAgICAgICAgICAga3NWaWRlb0Rvd25sb2FkLAogICAgICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQsCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkLAogICAgICAgICAgICB5b3V0dWJlVmlkZW9Eb3dubG9hZAogICAgICAgIH0gPSBDb25maWc7CiAgICAgICAgLyotLWxhbmctLSovCiAgICAgICAgdmFyIGxhbmcgPSB7CiAgICAgICAgICAgIHNldDon6K6+572uJywKICAgICAgICAgICAgaWNvblBvc2l0aW9uOiflm77moIfkvY3nva4nLAogICAgICAgICAgICBwbGF5VmlkZW86J+inhumikeino+aekCcsCiAgICAgICAgICAgIHBsYXlNdXNpYzon6Z+z5LmQ5LiL6L29JywKICAgICAgICAgICAgemhOaWNlOifnn6XkuY7lop7lvLonLAogICAgICAgICAgICB2aWRlb0Rvd25sb2FkOifop4bpopHkuIvovb0nLAogICAgICAgICAgICBpY29uSGVpZ2h0Oiflm77moIfpq5jluqYnLAogICAgICAgICAgICBpY29uV2lkdGg6J+Wbvuagh+Wkp+WwjycsCiAgICAgICAgICAgIGljb25MaW5lOifmsLTlubPkvY3nva4nLAogICAgICAgICAgICBpY29uV2FpdFRpbWU6J+etieW+heaXtumXtCcsCiAgICAgICAgICAgIGljb25MZWZ0OifpnaDlt6YnLAogICAgICAgICAgICBpY29uUmlnaHQ6J+mdoOWPsycsCiAgICAgICAgICAgIHRpcEljb25IZWlnaHQ6J+m7mOiupDM2MCzlu7rorq4xfjUwMCcsCiAgICAgICAgICAgIHRpcEljb25XaWR0aDon6buY6K6kNDAs5bu66K6uMjB+NTAnLAogICAgICAgICAgICB0aXBFcnJvckljb25IZWlnaHQ6Jzzlm77moIfkvY3nva4+5Lit55qEPOWbvuagh+mrmOW6pj7lupTkuLoxMDAw5Lul5YaF5q2j5pW05pWw77yM5bu66K6uMX41MDAnLAogICAgICAgICAgICB0aXBFcnJvckljb25XaWR0aDonPOWbvuagh+S9jee9rj7kuK3nmoQ85Zu+5qCH5aSn5bCPPuW6lOS4ujEwMOS7peWGheato+aVtOaVsO+8jOW7uuiurjIwfjUwJywKICAgICAgICAgICAgc2V0UGxheVZpZGVvOifop6PmnpDorr7nva4nLAogICAgICAgICAgICBwbGF5VmlkZW9MaW5lQWRkOifmt7vliqDnur/ot68nLAogICAgICAgICAgICB0aXBQbGF5VmlkZW9MaW5lQWRkOifor7fovpPlhaXnur/ot6/lkI3np7Dlkozop6PmnpDlnLDlnYDvvIzkvos6Iue6v+i3r+WFrWh0dHBzOi8vanguemR5LmNvbS8/dXJsPSLvvIzmr4/nur/ot6/kuIDooYzjgIInLAogICAgICAgICAgICB6aFNldDon55+l5LmO6K6+572uJywKICAgICAgICAgICAgemhWaWRlb0Nsb3NlOiflsY/olL3op4bpopEnLAogICAgICAgICAgICB6aFZpZGVvRG93bmxvYWQ6J+inhumikeS4i+i9vScsCiAgICAgICAgICAgIHpoQURDbG9zZTon5bGP6JS95bm/5ZGKJywKICAgICAgICAgICAgemhDbG9zZUxlZnQ6J+WFs+mXreS+p+i+ueagjycsCiAgICAgICAgICAgIHpoQ2hhbmdlTGluazon6ZO+5o6l55u05o6l6Lez6L2sJywKICAgICAgICAgICAgc3BlY2lhbENvbHVtbjon5qCH6K6w5paH56ugJywKICAgICAgICAgICAgdmlkZW9UaXRsZTon5qCH6K6w6KeG6aKRJywKICAgICAgICAgICAgemhLZXl3b3JkQ2xvc2U6J+Wxj+iUveWFs+mUruivjScsCiAgICAgICAgICAgIHRpcEtleXdvcmQ6J+ivt+i+k+WFpeWFs+mUruivjSznlKgiLCLlj7fpmpTlvIAnLAogICAgICAgICAgICBhdXRob3JOYW1lQ2xvc2U6J+Wxj+iUveeUqOaItycsCiAgICAgICAgICAgIHRpcEF1dGhvck5hbWU6J+ivt+i+k+WFpeeUqOaIt+WQjSznlKgiLCLlj7fpmpTlvIAnLAogICAgICAgICAgICB5YW54dWFuQ2xvc2U6J+Wxj+iUveebkOmAiScsCiAgICAgICAgICAgIGR5VmlkZW9Eb3dubG9hZDon5oqW6Z+z5LiL6L29JywKICAgICAgICAgICAga3NWaWRlb0Rvd25sb2FkOiflv6vmiYvkuIvovb0nLAogICAgICAgICAgICB4aWd1YVZpZGVvRG93bmxvYWQ6J+ilv+eTnOS4i+i9vScsCiAgICAgICAgICAgIGJpbGlWaWRlb0Rvd25sb2FkOidC56uZIChiaWxpYmlsaSkg5LiL6L29JywKICAgICAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQ6J3lvdXR1YmXkuIvovb0nLAogICAgICAgICAgICBxdWVzdGlvbjon5bi46KeB6Zeu6aKYJywKICAgICAgICAgICAgcXFHcm91cDon5Lqk5rWB576kJywKICAgICAgICAgICAgcmV3YXJkOifmiZPotY8nLAogICAgICAgICAgICByZWRSZXdhcmQ6J+e6ouWMhScsCiAgICAgICAgICAgIHRoYW5rOifmhJ/osKInLAoKICAgICAgICB9OwoKICAgICAgICAvKi0tZGF0YXMtLSovCiAgICAgICAgdmFyIGRhdGFzID0gewoKICAgICAgICAgICAgZ2V0Q291cG9uOlt7aXNPcGVuOjIyLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidGFvYmFvIixub2RlOiIuSl9MaW5rQWRkIixtYXRjaDovaXRlbVwudGFvYmFvXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbENhb3NoaSIsbm9kZToiI0pfTGlua0J1eSIsbWF0Y2g6L15odHRwcz86XC9cL2NoYW9zaGkuZGV0YWlsLnRtYWxsLmNvbVwvL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6Ii5CYXNpY0NvbnRlbnQtLWFjdGlvbnMtLTFjbzhzeDgiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToiY291cG9uIixuYW1lOiJ0bWFsbCIsbm9kZToiI0pfTGlua0J1eSIsbWF0Y2g6L15odHRwcz86XC9cL2RldGFpbFwudG1hbGxcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6InRtYWxsT3RoZXIiLG5vZGU6Ii50bS1tc2ctYm94IixtYXRjaDovXmh0dHBzPzpcL1wvZGV0YWlsXC50bWFsbFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToidG1hbGwiLG5vZGU6IiNKX0xpbmtCdXkiLG1hdGNoOi9eaHR0cHM/OlwvXC9kZXRhaWxcLnRtYWxsXC5oay99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJjb3Vwb24iLG5hbWU6ImpkIixub2RlOiIjY2hvb3NlLWJ0bnMiLG1hdGNoOi9pdGVtXC5qZFwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6ImNvdXBvbiIsbmFtZToiamQiLG5vZGU6IiNjaG9vc2UtYnRucyIsbWF0Y2g6L1wueWl5YW9qZFwuY29tL30sCiAgICAgICAgICAgIF19XSwKICAgICAgICAgICAganhWaWRlbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9odHRwcz86XC9cL3ZcLnFxXC5jb20vLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L2h0dHBzPzpcL1wvbVwudlwucXFcLmNvbS8sbmFtZToncXFNb2JpbGUnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmlxaXlpXC5jb20vLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXFcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwcz86XC9cL20uaXFpeWlcLmNvbS8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL2FsaXBheV92aWRlb1wvaWRfL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cLy4qeW91a3VcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuYmlsaWJpbGlcLmNvbS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovXmh0dHBzPzpcL1wvbVwuYmlsaWJpbGlcLmNvbS99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBtYXRjaDovbWd0dlwuY29tLyxhcmVhQ2xhc3NOYW1lOidlcGlzb2RlLWl0ZW1zIGNsZWFyZml4J30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovLnR2XC5zb2h1XC5jb20vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG1hdGNoOi90dWRvdVwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9sZVwuY29tL30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLG1hdGNoOi9wcHR2XC5jb20vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsbWF0Y2g6LzE5MDVcLmNvbS99LAoKICAgICAgICAgICAgXX1dLAogICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgYmFranhWaWRlbzpbe2lzT3BlbjpHTV9nZXRWYWx1ZSgnbW92aWVMaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAgICAgIC8ve2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjbW9kX3BsYXllciIgLG5vZGVUeXBlOidpZCcgLG1hdGNoOi92XC5xcVwuY29tXC94XC9jb3Zlci8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNtb2RfcGxheWVyIiAsbm9kZVR5cGU6J2lkJyAsbWF0Y2g6L2h0dHBzOlwvXC92LnFxLmNvbVwveFwvY292ZXJcL1thLXpBLVowLTldKy5odG1sLyxhcmVhQ2xhc3NOYW1lOidtb2RfZXBpc29kZScsbmFtZToncXFQQyd9LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21vZF9wbGF5ZXIiICxub2RlVHlwZTonaWQnICxtYXRjaDovaHR0cHM6XC9cL3YucXEuY29tXC94XC9jb3ZlclwvW2EtekEtWjAtOV0rXC9bYS16QS1aMC05XSsuaHRtbC8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5jb250YWluZXItcGxheWVyIiAsbm9kZVR5cGU6J2NsYXNzJywgbWF0Y2g6L3ZcLnFxXC5jb21cL3hcL3BhZ2UvLGFyZWFDbGFzc05hbWU6J21vZF9lcGlzb2RlJ30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC94XC9tXC9wbGF5XD9jaWQvfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3hcL3BsYXlcLmh0bWxcP2NpZD0vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3BsYXlcLmh0bWxcP2NpZFw9L30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9tXC52XC5xcVwuY29tXC9jb3ZlclwvLipodG1sL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2ZsYXNoYm94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9eaHR0cHM6XC9cL3d3d1wuaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZToncXktZXBpc29kZS1udW0nLG5hbWU6J2lxaXlpUGMnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tLXZpZGVvLXBsYXllci13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9eaHR0cHM6XC9cL20uaXFpeWlcLmNvbVwvW3Z3YV1cXy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5pbnRsLXZpZGVvLXdyYXAiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcVwuY29tXC9wbGF5XC8vLGFyZWFDbGFzc05hbWU6J20tc2xpZGluZy1saXN0J30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwueW91a3VcLmNvbVwvYWxpcGF5X3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21cLnlvdWt1XC5jb21cL3ZpZGVvXC9pZF8vfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZcLnlvdWt1XC5jb21cL3Zfc2hvd1wvaWRfL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2JpbGliaWxpUGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi93d3dcLmJpbGliaWxpXC5jb21cL3ZpZGVvL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyX21vZHVsZSIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC9iYW5ndW1pLyxhcmVhQ2xhc3NOYW1lOidlcC1saXN0LXdyYXBwZXIgcmVwb3J0LXdyYXAtbW9kdWxlJ30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtY29udGFpbmVyIG5vLXdyYXAnfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5tcGxheWVyIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5iaWxpYmlsaVwuY29tXC92aWRlb1wvL30sCgogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnZpZGVvLWFyZWEiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLm1ndHZcLmNvbVwvYi99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21ndHYtcGxheWVyLXdyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21ndHZcLmNvbVwvYi8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyBjbGVhcmZpeCd9LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii54LWNvdmVyLXBsYXlidG4td3JhcCIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwudHZcLnNvaHVcLmNvbS99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcldyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L2ZpbG1cLnNvaHVcLmNvbVwvYWxidW1cLy99LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LAogICAgICAgICAgICAgICAgICAgIC8v5peg5Y2V54us5pKt5pS+6aG1e2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiJqLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwubGVcLmNvbVwvdnBsYXlfXC8vfSwKCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi9wbGF5XC50dWRvdVwuY29tXC92X3Nob3dcL2lkXy99LAoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwcHR2X3BsYXlwYWdlX2JveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwucHB0dlwuY29tXC9zaG93XC8vfSwKICAgICAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToicHB0dl9wbGF5cGFnZV9ib3giLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwucHB0dlwuY29tXC9zaG93XC8vfSwKICAgICAgICAgICAgICAgICAgICAvL+Wbvuagh+acquaYvuekuntmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToicHBsaXZlLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovbVwucHB0dlwuY29tXC9zaG93XC8vfSwKCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixub2RlVHlwZTonaWQnLG1hdGNoOi92aXBcLjE5MDUuY29tXC9wbGF5XC8vfSwKICAgICAgICAgICAgICAgIF19XSwKICAgICAgICAqLwogICAgICAgICAgICBqeE11c2ljOlt7aXNPcGVuOkdNX2dldFZhbHVlKCdtdXNpY0xpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZTonbmV0ZWFzZScsbWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbS8sdGlwOifor7flnKjpn7PkuZDljZXmm7LpobXngrnlh7vlm77moIfkuIvovb0nfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZToncXEnLG1hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOWcqOaSreaUvumhteeCueWHu+Wbvuagh+S4i+i9vSd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheU11c2ljIixuYW1lOidrdWdvdScsbWF0Y2g6L2t1Z291XC5jb20vLHRpcDon6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlNdXNpYyIsbmFtZTona3V3bycsbWF0Y2g6L2t1d29cLmNuLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30sCgogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5TXVzaWMiLG5hbWU6J3hpbWFsYXlhJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC54aW1hbGF5YVwuY29tLyx0aXA6J+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJ30KICAgICAgICAgICAgXX1dLAoKICAgICAgICAgICAgcGxheUxpbmU6WwogICAgICAgICAgICAgICAgeyJuYW1lIjoi57qv5YeAMSIsInVybCI6Imh0dHBzOi8vejEubTE5MDcudG9wLz9qeD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiQuermTEiLCJ1cmwiOiJodHRwczovL2p4LmJvenJjLmNvbTo0NDMzL3BsYXllci8/dXJsPSIsIm1vYmlsZSI6MX0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLniLHosYYiLCJ1cmwiOiJodHRwczovL2p4LmFpZG91ZXIubmV0Lz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IkJMIiwidXJsIjoiaHR0cHM6Ly92aXAuYmxqaWV4LmNvbS8/dj0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Yaw6LGGIiwidXJsIjoiaHR0cHM6Ly9hcGkucWlhbnFpLm5ldC92aXAvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi55m+5Z+fIiwidXJsIjoiaHR0cHM6Ly9qeC42MThnLmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSyIsInVybCI6Imh0dHBzOi8vd3d3LmNrcGxheWVyLnZpcC9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJDSG9rIiwidXJsIjoiaHR0cHM6Ly93d3cuZ2FpNC5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiY2ttb3YiLCJ1cmwiOiJodHRwczovL3d3dy5ja21vdi52aXAvYXBpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6Ikg4IiwidXJsIjoiaHR0cHM6Ly93d3cuaDhqeC5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiSlkiLCJ1cmwiOiJodHRwczovL2p4LnBsYXllcmp5LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLop6PmnpAiLCJ1cmwiOiJodHRwczovL2NrbW92LmNjeWpqZC5jb20vY2ttb3YvP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi6Kej5p6QbGEiLCJ1cmwiOiJodHRwczovL2FwaS5qaWV4aS5sYS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLogIHmnb8iLCJ1cmwiOiJodHRwczovL3ZpcC5sYW9iYW5kcS5jb20vamlleGkucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiTUFPIiwidXJsIjoiaHR0cHM6Ly93d3cubXRvc3ouY29tL20zdTgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiTTNVOCIsInVybCI6Imh0dHBzOi8vangubTN1OC50di9qaWV4aS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLor7rorq8iLCJ1cmwiOiJodHRwczovL3d3dy5ueGZsdi5jb20vP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiT0siLCJ1cmwiOiJodHRwczovL29ranguY2MvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiUE0iLCJ1cmwiOiJodHRwczovL3d3dy5wbGF5bTN1OC5jbi9qaWV4aS5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLnm5jlj6QiLCJ1cmwiOiJodHRwczovL3d3dy5wYW5ndWppZXhpLmNjL2ppZXhpLnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuS4g+WTpSIsInVybCI6Imh0dHBzOi8vangubm54di5jbi90di5waHA/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiJSREhLIiwidXJsIjoiaHR0cHM6Ly9qeC5yZGhrLm5ldC8/dj0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5Lq65Lq66L+3IiwidXJsIjoiaHR0cHM6Ly9qeC5ibGJvLmNjOjQ0MzMvP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi5oCd5LqRIiwidXJsIjoiaHR0cHM6Ly9qeC5hcDJwLmNuLz91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuaAneWPpDMiLCJ1cmwiOiJodHRwczovL2pzYXAuYXR0YWtpZHMuY29tLz91cmw9IiwibW9iaWxlIjoxfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IuWQrOS5kCIsInVybCI6Imh0dHBzOi8vanguZGo2dS5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoi57u05aSaIiwidXJsIjoiaHR0cHM6Ly9qeC5pdml0by5jbi8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLomb7nsbMiLCJ1cmwiOiJodHRwczovL2p4LnhtZmx2LmNvbS8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHnq68iLCJ1cmwiOiJodHRwczovL3NiLjVnc2VvLm5ldC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiLkupHmnpAiLCJ1cmwiOiJodHRwczovL2p4LnlwYXJzZS5jb20vaW5kZXgucGhwP3VybD0iLCJtb2JpbGUiOjB9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiMDUyMyIsInVybCI6Imh0dHBzOi8vZ28ueWgwNTIzLmNuL3kuY3k/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiIxN+S6kSIsInVybCI6Imh0dHBzOi8vd3d3LjE3MTd5dW4uY29tL2p4L3R5LnBocD91cmw9IiwibW9iaWxlIjowfSwKICAgICAgICAgICAgICAgIHsibmFtZSI6IjE4MCIsInVybCI6Imh0dHBzOi8vanguMDAwMTgwLnRvcC9qeC8/dXJsPSIsIm1vYmlsZSI6MH0sCiAgICAgICAgICAgICAgICB7Im5hbWUiOiI0SyIsInVybCI6Imh0dHBzOi8vanguNGtkdi5jb20vP3VybD0iLCJtb2JpbGUiOjF9LAogICAgICAgICAgICAgICAgeyJuYW1lIjoiODA5MCIsInVybCI6Imh0dHBzOi8vd3d3LjgwOTBnLmNuLz91cmw9IiwibW9iaWxlIjowfQogICAgICAgICAgICBdLAoKICAgICAgICAgICAgemhOaWNlOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd6aGlodUxpc3QnLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3poTmljZScsbWF0Y2g6L15odHRwcz86XC9cL1thLXpdK1wuemhpaHVcLmNvbS99CiAgICAgICAgICAgIF19XSwKICAgICAgICAgICAgdGFvYmFvOlt7aXNPcGVuOkdNX2dldFZhbHVlKCd0YW9iYW8nLCcyMicpLHdlYjpbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3Rhb2Jhb1NlYXJjaCcsbWF0Y2g6L15odHRwcz86XC9cL3NcLnRhb2Jhb1wuY29tXC9zZWFyY2hcPy4rL30KICAgICAgICAgICAgXX1dLAogICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgZG91WWluOlt7aXNPcGVuOkdNX2dldFZhbHVlKCdkb3V5aW5MaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTonZG91eWluRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC8/W14uK10kL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOidkb3V5aW5Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cL1w/ZW50ZXJcPWd1aWRlJC99LAogICAgICAgICAgICAgICAgXX1dLAogICAgICAgICovCiAgICAgICAgICAgIHZpZGVvRG93bmxvYWQ6W3tpc09wZW46R01fZ2V0VmFsdWUoJ3ZpZGVvRG93bmxvYWRMaXN0JywnMjInKSx3ZWI6WwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cLz9bXi4rXSQvfSwKICAgICAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2R5VmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuZG91eWluXC5jb21cL1w/ZW50ZXJcPWd1aWRlJC99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvZm9sbG93JC99LAogICAgICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTonZHlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5kb3V5aW5cLmNvbVwvdnMkL30sCiAgICAgICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9kaXNjb3Zlclw/bW9kYWxfaWQ9LiskL30KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAge2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOidkeVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC8/LiskLyxpc1dlYk9wZW46ZHlWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZTondmlkZW9Eb3dubG9hZCcsbmFtZTona3NWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5rdWFpc2hvdVwuY29tXC8/LiskLyxpc1dlYk9wZW46a3NWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIC8ve2Z1bmNOYW1lOid2aWRlb0Rvd25sb2FkJyxuYW1lOid4aWd1YVZpZGVvRG93bmxvYWQnLG1hdGNoOi9eaHR0cHM/OlwvXC93d3dcLml4aWd1YVwuY29tXC9bMC05XStcPy4rJC8saXNXZWJPcGVuOnhpZ3VhVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsbWF0Y2g6L15odHRwcz86XC9cL3d3d1wuaXhpZ3VhXC5jb21cLy8saXNXZWJPcGVuOnhpZ3VhVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J2JpbGlWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC5iaWxpYmlsaVwuY29tXC8vLGlzV2ViT3BlbjpiaWxpVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6J3ZpZGVvRG93bmxvYWQnLG5hbWU6J3lvdXR1YmVWaWRlb0Rvd25sb2FkJyxtYXRjaDovXmh0dHBzPzpcL1wvd3d3XC55b3V0dWJlXC5jb20vLGlzV2ViT3Blbjp5b3V0dWJlVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgIF19XSwKCiAgICAgICAgICAgIGtleUNvZGU6WwogICAgICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMCd9LAogICAgICAgICAgICAgICAge2NvZGU6NDgsaXNTaGlmdDp0cnVlLHZhbHVlOicpJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OmZhbHNlLHZhbHVlOicxJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo0OSxpc1NoaWZ0OnRydWUsdmFsdWU6JyEnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzInfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUwLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonQCd9LAogICAgICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDpmYWxzZSx2YWx1ZTonMyd9LAogICAgICAgICAgICAgICAge2NvZGU6NTEsaXNTaGlmdDp0cnVlLHZhbHVlOicjJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OmZhbHNlLHZhbHVlOic0J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1Mixpc1NoaWZ0OnRydWUsdmFsdWU6JyQnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzUnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjUzLGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonJSd9LAogICAgICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDpmYWxzZSx2YWx1ZTonNid9LAogICAgICAgICAgICAgICAge2NvZGU6NTQsaXNTaGlmdDp0cnVlLHZhbHVlOideJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OmZhbHNlLHZhbHVlOic3J30sCiAgICAgICAgICAgICAgICB7Y29kZTo1NSxpc1NoaWZ0OnRydWUsdmFsdWU6JyYnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6JzgnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjU2LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonKid9LAogICAgICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDpmYWxzZSx2YWx1ZTonOSd9LAogICAgICAgICAgICAgICAge2NvZGU6NTcsaXNTaGlmdDp0cnVlLHZhbHVlOicoJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OmZhbHNlLHZhbHVlOidmJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3MCxpc1NoaWZ0OnRydWUsdmFsdWU6J0YnfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6ZmFsc2UsdmFsdWU6J2onfSwKICAgICAgICAgICAgICAgIHtjb2RlOjc0LGlzU2hpZnQ6dHJ1ZSx2YWx1ZTonSid9LAogICAgICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDpmYWxzZSx2YWx1ZTonayd9LAogICAgICAgICAgICAgICAge2NvZGU6NzUsaXNTaGlmdDp0cnVlLHZhbHVlOidLJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OmZhbHNlLHZhbHVlOidsJ30sCiAgICAgICAgICAgICAgICB7Y29kZTo3Nixpc1NoaWZ0OnRydWUsdmFsdWU6J0wnfSwKICAgICAgICAgICAgXSwKCiAgICAgICAgICAgIGRvd25sb2FkT3B0aW9uOlt7bmFtZTon55u05o6l5LiL6L29JyxpZDondG9Eb3dubG9hZCd9LHtuYW1lOiflpI3liLbpk77mjqUnLGlkOid0b0NvcHknfSx7bmFtZTon5omT5byA5paH5Lu2JyxpZDondG9MaW5rJ31dCgogICAgICAgIH0KCiAgICAgICAgdmFyIHtnZXRDb3Vwb24sanhWaWRlbyxqeE11c2ljLHBsYXlMaW5lLHpoTmljZSx0YW9iYW8sdmlkZW9Eb3dubG9hZCxrZXlDb2RlLGRvd25sb2FkT3B0aW9ufSA9IGRhdGFzOwoKICAgICAgICAvKi0tQ2xhc3MtLSovCiAgICAgICAgY2xhc3MgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uU2V0UGFnZScpICE9IDApewogICAgICAgICAgICAgICAgICAgIC8qY29va2ll5a2Y5YKoCiAgICAgICAgICAgICAgICAgICAgaWNvblZpcFRvcCA9IHRoaXMuZ2V0Q29va2llKCdpY29uVG9wJyk/dGhpcy5nZXRDb29raWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSB0aGlzLmdldENvb2tpZSgnaWNvblBvc2l0aW9uJyk/dGhpcy5nZXRDb29raWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSB0aGlzLmdldENvb2tpZSgnaWNvbldpZHRoJyk/dGhpcy5nZXRDb29raWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsKICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwVG9wID0gR01fZ2V0VmFsdWUoJ2ljb25Ub3AnKSB8fCBHTV9nZXRWYWx1ZSgnaWNvblRvcCcpID09IDA/R01fZ2V0VmFsdWUoJ2ljb25Ub3AnKTppY29uVmlwVG9wOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwUG9zaXRpb24gPSBHTV9nZXRWYWx1ZSgnaWNvblBvc2l0aW9uJyk/R01fZ2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicpOmljb25WaXBQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZWZ0ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSaWdodCA9IGljb25WaXBQb3NpdGlvbj09J3JpZ2h0Jz8nc2VsZWN0ZWQnOicnOwoKICAgICAgICAgICAgICAgICAgICBpY29uVmlwV2lkdGggPSBHTV9nZXRWYWx1ZSgnaWNvbldpZHRoJyk/R01fZ2V0VmFsdWUoJ2ljb25XaWR0aCcpOmljb25WaXBXaWR0aDsKCiAgICAgICAgICAgICAgICAgICAgaWNvbldhaXRUaW1lID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpP0dNX2dldFZhbHVlKCdpY29uV2FpdFRpbWUnKSoxMDAwOmljb25XYWl0VGltZTsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgi6K6+572uIiwgKCkgPT4gdGhpcy5tZW51U2V0KCkpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWVudVNldCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgbGV0IG1lbnVTZXRTdHlsZSA9IGAKICAgICAgICAgICAgICAgICAgICAgICAgLnpobU1hc2t7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk5OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDt0b3A6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuODsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAud3JhcC1ib3h7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDs7dG9wOiA1MCU7bGVmdDogNTAlO3RyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0yMDBweCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OjE2cHggbnVtRm9udCxQaW5nRmFuZ1NDLVJlZ3VsYXIsVGFob21hLE1pY3Jvc29mdCBZYWhlaSxzYW5zLXNlcmlmICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDo0MDAgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2V0V3JhcEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7aGVpZ2h0OjQwcHg7Y29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwTGkgbGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHggIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MTJweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdyYXBMaUNvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXcmFwU2F2ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDotMnB4O3JpZ2h0OjEwcHg7Zm9udC1zaXplOjI0cHg7Y3Vyc29yOnBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3R7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MHB4O3BhZGRpbmc6MTBweCAyMHB4O3dpZHRoOjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwOTtiYWNrZ3JvdW5kOiNmZWY5ZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldEZvb3RMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowcHggMnB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgbGkgYXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiM1NTU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRGb290TGkgYTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmU2ZDczOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6I2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLmljb25TZXRVbEhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUhlYWR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uU2V0UGFnZUxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjhweCAyMHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjEwMDAwMDAwMDI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjBweDtsZWZ0OjMwMHB4O2JhY2tncm91bmQ6I2ZmZjt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFBhZ2VJbnB1dHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlTGl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjI1OHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2VMaTo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrmu5rliqjmnaHmlbTkvZPmoLflvI8qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggOiAycHg7ICAvKumrmOWuveWIhuWIq+WvueW6lOaoquerlua7muWKqOadoeeahOWwuuWvuCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlTGk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h6YeM6Z2i5bCP5pa55Z2XKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXMgICA6IDJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZTZkNzM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpoaWh1U2V0UGFnZUxpOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKua7muWKqOadoemHjOmdoui9qOmBkyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93ICAgOiBpbnNldCAwIDAgNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgICA6ICNlZGVkZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aGlodVNldFBhZ2VMaSBsaXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7cGFkZGluZzoxMnB4IDIwcHg7ZGlzcGxheTpibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhpaHVTZXRQYWdlQ29udGVudHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLmNpcmN1bGFyewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQwcHg7aGVpZ2h0OiAyMHB4O2JvcmRlci1yYWRpdXM6IDE2cHg7dHJhbnNpdGlvbjogLjNzO2N1cnNvcjogcG9pbnRlcjtib3gtc2hhZG93OiAwIDAgM3B4ICM5OTkgaW5zZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnJvdW5kLWJ1dHRvbnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMHB4O2hlaWdodDogMjBweDs7Ym9yZGVyLXJhZGl1czogNTAlO2JveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsMCwwLC41KTt0cmFuc2l0aW9uOiAuM3M7cG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5iYWNrewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBzb2xpZCAjRkZGOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDNweDt0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpOyAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO21hcmdpbi1sZWZ0OjEwcHg7Y3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRvLXJpZ2h0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MjBweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAzcHg7dHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO2N1cnNvcjpwb2ludGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuaWNvblNldFNhdmV7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MjRweDtjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206NHB4O2NvbG9yOiNGRkY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTAwMDAwMDAwMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOjBweDtsZWZ0OjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDojZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3NldF9wYWdlX2hlYWRlcnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZlNmQ3MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9jb250ZW50ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O2p1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fc2V0X3BhZ2VfbGlzdHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7cGFkZGluZzowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9zZXRfcGFnZV9saXN0IGxpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjOyovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjEycHggMjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxpOmxhc3QtY2hpbGR7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOm5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyotZm9ybS0qLwogICAgICAgICAgICAgICAgICAgICAgICA6cm9vdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWJhc2UtY29sb3I6ICM0MzRhNTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXByaW1hcnk6ICNmN2Y4Zjg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXdoaXRlLWNvbG9yLXNlY29uZGFyeTogI2ZlZmVmZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci1wcmltYXJ5OiAjYzJjMmMyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1ncmF5LWNvbG9yLXNlY29uZGFyeTogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZ3JheS1jb2xvci10ZXJ0aWFyeTogIzY3NmY3OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYWN0aXZlLWNvbG9yOiAjMjI3YzlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS12YWxpZC1jb2xvcjogI2MyYzJjMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1jb2xvcjogI2Y3MmY0NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW52YWxpZC1pY29uOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsJTNDc3ZnJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlMjB3aWR0aCUzRCUyMjI0JTIyJTIwaGVpZ2h0JTNEJTIyMjQlMjIlMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAyNCUyMDI0JTIyJTNFJTIwJTNDcGF0aCUyMGQlM0QlMjJNMTMuNDElMjAxMmw0LjMtNC4yOWExJTIwMSUyMDAlMjAxJTIwMC0xLjQyLTEuNDJMMTIlMjAxMC41OWwtNC4yOS00LjNhMSUyMDElMjAwJTIwMCUyMDAtMS40MiUyMDEuNDJsNC4zJTIwNC4yOS00LjMlMjA0LjI5YTElMjAxJTIwMCUyMDAlMjAwJTIwMCUyMDEuNDIlMjAxJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwbDQuMjktNC4zJTIwNC4yOSUyMDQuM2ExJTIwMSUyMDAlMjAwJTIwMCUyMDEuNDIlMjAwJTIwMSUyMDElMjAwJTIwMCUyMDAlMjAwLTEuNDJ6JTIyJTIwZmlsbCUzRCUyMiUyM2Y3MmY0NyUyMiUyMCUyRiUzRSUzQyUyRnN2ZyUzRSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDJweCAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjU1JTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdmFyKC0tZ3JheS1jb2xvci1zZWNvbmRhcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6OnBsYWNlaG9sZGVyIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmF5LWNvbG9yLXNlY29uZGFyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKiwgOjphZnRlciwgOjpiZWZvcmUgewogICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbml0aWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZF0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHlbZGF0YS1pcy12YWxpZD1mYWxzZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB2YXIoLS1pbnZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dC1pbnB1dF9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX2JvZHk6LXdlYmtpdC1hdXRvZmlsbCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiA5OTk5czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAwLjVlbSBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxLjVlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0LWlucHV0X19ib2R5W2RhdGEtaXMtdmFsaWQ9ZmFsc2VdICsgLnRleHQtaW5wdXRfX3ZhbGlkYXRvciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1pbnZhbGlkLWljb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGluaGVyaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZS1vdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDo5MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94OjphZnRlciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWdyYXktY29sb3Itc2Vjb25kYXJ5KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItd2lkdGg6IDZweCA0cHggMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBhdXRvIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtNzJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZ3JheS1jb2xvci1wcmltYXJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMS43ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS43OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiBjYWxjKDFlbSArIDE2cHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE0MCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjJweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPXRydWVdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLXZhbGlkLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0LWJveF9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5LmZvY3VzLXZpc2libGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY3RpdmUtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QtYm94X19ib2R5Oi13ZWJraXQtYXV0b2ZpbGwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogOTk5OXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ncmF5LWNvbG9yLXByaW1hcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250OiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlLW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWFfX2JvZHk6b25seS1jaGlsZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keTpmb2N1cyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWFjdGl2ZS1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tYWN0aXZlLWNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnRleHRhcmVhX19ib2R5W2RhdGEtaXMtdmFsaWQ9dHJ1ZV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS12YWxpZC1jb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggdmFyKC0tdmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0YXJlYV9fYm9keVtkYXRhLWlzLXZhbGlkPWZhbHNlXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHZhcigtLWludmFsaWQtY29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAudGV4dGFyZWEgLl9kdW1teS1ib3ggewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjQwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAudG9MZWZ0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOm1vdmVUb0xlZnQgMC41cyBpbmZpbml0ZTsgLypTYWZhcmkgYW5kIENocm9tZSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9MZWZ0ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDowcHg7fQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbW92ZVRvTGVmdCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjIwMHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC50b1JpZ2h0TW92ZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbWF0aW9uOm1vdmVUb1JpZ2h0IDJzIGluZmluaXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb246bW92ZVRvUmlnaHQgMnMgaW5maW5pdGU7IC8qU2FmYXJpIGFuZCBDaHJvbWUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgQGtleWZyYW1lcyBtb3ZlVG9SaWdodHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20ge2xlZnQ6MHB4O30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHtsZWZ0OjIwMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBtb3ZlVG9SaWdodCAvKlNhZmFyaSBhbmQgQ2hyb21lKi97CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHtsZWZ0OjBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB7bGVmdDoyMDBweDt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBgOwoKICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtZW51U2V0U3R5bGUpKTsKCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgICAgICB2YXIgc2V0TGlzdEpzb249IFsKICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLmljb25Qb3NpdGlvbiwnc2V0TGlzdElEJzonaWNvblBvc2l0aW9uU2V0UGFnZScsJ3NldFBhZ2VJRCc6J21vdmllSWNvblNldFBhZ2UnLCd0YWtlUGxhY2UnOicwcHgnfSwKICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnBsYXlWaWRlbywnc2V0TGlzdElEJzonbW92aWVMaXN0Jywnc2V0UGFnZUlEJzonbW92aWVWaWRlb1NldFBhZ2UnLCd0YWtlUGxhY2UnOicwcHgnfSwKICAgICAgICAgICAgICAgICAgICB7J2xpc3ROYW1lJzpsYW5nLnBsYXlNdXNpYywnc2V0TGlzdElEJzonbXVzaWNMaXN0Jywnc2V0UGFnZUlEJzonJywndGFrZVBsYWNlJzonJ30sCiAgICAgICAgICAgICAgICAgICAgeydsaXN0TmFtZSc6bGFuZy56aE5pY2UsJ3NldExpc3RJRCc6J3poaWh1TGlzdCcsJ3NldFBhZ2VJRCc6J3poaWh1SWNvblNldFBhZ2UnLCd0YWtlUGxhY2UnOicyMjBweCd9LAogICAgICAgICAgICAgICAgICAgIHsnbGlzdE5hbWUnOmxhbmcudmlkZW9Eb3dubG9hZCwnc2V0TGlzdElEJzondmlkZW9Eb3dubG9hZExpc3QnLCdzZXRQYWdlSUQnOid2aWRlb0Rvd25sb2FkU2V0UGFnZScsJ3Rha2VQbGFjZSc6JzBweCd9LAogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB2YXIgemhpaHVPcHRpb25Kc29uID0gWwogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aFZpZGVvQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlVmlkZW8nLCdkZWZhdWx0JzonMCd9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aFZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzonZG93bmxvYWRWaWRlbycsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aEFEQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlQUQnLCdkZWZhdWx0JzonMjInfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhDbG9zZUxlZnQsJ29wdGlvbklEJzoncmVtb3ZlUmlnaHQnLCdkZWZhdWx0JzonMCd9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy56aENoYW5nZUxpbmssJ29wdGlvbklEJzonY2hhbmdlTGluaycsJ2RlZmF1bHQnOicyMid9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5zcGVjaWFsQ29sdW1uLCdvcHRpb25JRCc6J3NwZWNpYWxDb2x1bW4nLCdkZWZhdWx0JzoyMn0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLnZpZGVvVGl0bGUsJ29wdGlvbklEJzondmlkZW9UaXRsZScsJ2RlZmF1bHQnOjIyfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcuemhLZXl3b3JkQ2xvc2UsJ29wdGlvbklEJzoncmVtb3ZlS2V5d29yZCcsJ2RlZmF1bHQnOicwJ30sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmF1dGhvck5hbWVDbG9zZSwnb3B0aW9uSUQnOidyZW1vdmVBdXRob3JOYW1lJywnZGVmYXVsdCc6JzAnfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueWFueHVhbkNsb3NlLCdvcHRpb25JRCc6J3JlbW92ZVlhbnh1YW4nLCdkZWZhdWx0JzonMCd9CiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHZhciBwbGF5VmlkZW9PcHRpb25Kc29uID0gW3snb3B0aW9uTmFtZSc6J+a3u+WKoOe6v+i3rycsJ29wdGlvbklEJzondmlkZW9QbGF5TGluZUFkZCcsJ2RlZmF1bHQnOnZpZGVvUGxheUxpbmVBZGR9XTsKCiAgICAgICAgICAgICAgICB2YXIgdmlkZW9Eb3dubG9hZE9wdGlvbkpzb24gPSBbCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmR5VmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOidkeVZpZGVvRG93bmxvYWQnLCdkZWZhdWx0JzpkeVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy5rc1ZpZGVvRG93bmxvYWQsJ29wdGlvbklEJzona3NWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6a3NWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgICAgICB7J29wdGlvbk5hbWUnOmxhbmcueGlndWFWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J3hpZ3VhVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOnhpZ3VhVmlkZW9Eb3dubG9hZH0sCiAgICAgICAgICAgICAgICAgICAgeydvcHRpb25OYW1lJzpsYW5nLmJpbGlWaWRlb0Rvd25sb2FkLCdvcHRpb25JRCc6J2JpbGlWaWRlb0Rvd25sb2FkJywnZGVmYXVsdCc6YmlsaVZpZGVvRG93bmxvYWR9LAogICAgICAgICAgICAgICAgICAgIHsnb3B0aW9uTmFtZSc6bGFuZy55b3V0dWJlVmlkZW9Eb3dubG9hZCwnb3B0aW9uSUQnOid5b3V0dWJlVmlkZW9Eb3dubG9hZCcsJ2RlZmF1bHQnOnlvdXR1YmVWaWRlb0Rvd25sb2FkfSwKICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgdmFyIHNldEh0bWwgPSAiPGRpdiBpZD0nc2V0TWFzaycgY2xhc3M9J3pobU1hc2snPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd3cmFwLWJveCcgaWQ9J3NldFdyYXAnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdpY29uU2V0UGFnZScgaWQ9J21vdmllSWNvblNldFBhZ2UnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy5pY29uUG9zaXRpb24rIjwvc3Bhbj48c3BhbiBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9zcGFuPjwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0UGFnZUxpJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiIrbGFuZy5pY29uSGVpZ2h0KyLvvJo8c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IGNsYXNzPSd0ZXh0LWlucHV0X19ib2R5JyBpZD0naWNvblRvcCcgdmFsdWU9JyIraWNvblZpcFRvcCsiJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEljb25IZWlnaHQrIic+PHNwYW4gY2xhc3M9J3RleHQtaW5wdXRfX3ZhbGlkYXRvcic+PC9zcGFuPjwvc3Bhbj48L2xpPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPGxpICBzdHlsZT0nZGlzcGxheTogaW5saW5lLWZsZXg7Jz48c3BhbiBzdHlsZT0ncGFkZGluZy10b3A6NHB4Oyc+IitsYW5nLmljb25MaW5lKyLvvJo8L3NwYW4+PGRpdiBjbGFzcz0nc2VsZWN0LWJveCc+PHNlbGVjdCBjbGFzcz0nc2VsZWN0LWJveF9fYm9keScgaWQ9J2ljb25Qb3NpdGlvbic+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxvcHRpb24gdmFsdWU9J2xlZnQnICIrc2VsZWN0ZWRMZWZ0KyI+IitsYW5nLmljb25MZWZ0KyI8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdyaWdodCcgIitzZWxlY3RlZFJpZ2h0KyI+IitsYW5nLmljb25SaWdodCsiPC9vcHRpb24+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijwvc2VsZWN0PjwvZGl2PjwvbGk+IgoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiIrbGFuZy5pY29uV2lkdGgrIu+8mjxzcGFuIGNsYXNzPSd0ZXh0LWlucHV0Jz48aW5wdXQgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIGlkPSdpY29uV2lkdGgnIHZhbHVlPSciK2ljb25WaXBXaWR0aCsiJyBwbGFjZWhvbGRlcj0nIitsYW5nLnRpcEljb25XaWR0aCsiJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dF9fdmFsaWRhdG9yJz48L3NwYW4+PC9zcGFuPjwvbGk+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8bGkgIHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtZmxleDsnPjxzcGFuIHN0eWxlPSdwYWRkaW5nLXRvcDo0cHg7Jz4iK2xhbmcuaWNvbldhaXRUaW1lKyLvvJo8L3NwYW4+PGRpdiBjbGFzcz0nc2VsZWN0LWJveCc+PHNlbGVjdCBjbGFzcz0nc2VsZWN0LWJveF9fYm9keScgaWQ9J2ljb25XYWl0VGltZSc+IjsKCiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPTE7aTw9ODtpKyspewoKICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblNlbGVjdGVkID0gR01fZ2V0VmFsdWUoJ2ljb25XYWl0VGltZScpPT1pLzI/J3NlbGVjdGVkJzonJzsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8b3B0aW9uIHZhbHVlPSIraS8yKyIgIitpY29uU2VsZWN0ZWQrIj4iK2kvMisi56eSPC9vcHRpb24+IjsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3NlbGVjdD48L2Rpdj48L2xpPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3pobV9zZXRfcGFnZScgaWQ9J3ZpZGVvRG93bmxvYWRTZXRQYWdlJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0VWxIZWFkJz48bGkgY2xhc3M9J3pobV9zZXRfcGFnZV9oZWFkZXInPjxzcGFuIGNsYXNzPSdiYWNrJz48L3NwYW4+PHNwYW4+IitsYW5nLnZpZGVvRG93bmxvYWQrIjwvc3Bhbj48c3BhbiAgY2xhc3M9J2ljb25TZXRTYXZlJz7DlzwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fc2V0X3BhZ2VfbGlzdCc+IjsKCiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPHZpZGVvRG93bmxvYWRPcHRpb25Kc29uLmxlbmd0aDtpKyspewoKICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3IsZGlzcGxheTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvblZhbHVlID0gR01fZ2V0VmFsdWUodmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0ub3B0aW9uSUQsdmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0uZGVmYXVsdCk7CgogICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlICE9ICcyMicpewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAnYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlX2NvbnRlbnQnPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxzcGFuPiIrdmlkZW9Eb3dubG9hZE9wdGlvbkpzb25baV0ub3B0aW9uTmFtZSsiPC9zcGFuPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nY2lyY3VsYXInIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiIrc3dpdGNoQmFja0NvcmxvcisiJyBpZD0nIit2aWRlb0Rvd25sb2FkT3B0aW9uSnNvbltpXS5vcHRpb25JRCsiJz4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3JvdW5kLWJ1dHRvbicgc3R5bGU9J2JhY2tncm91bmQ6ICIrYmFja0NvbG9yKyI7IGxlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSAiPC9saT4iOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC91bD4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj4iCgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSd6aG1fc2V0X3BhZ2UnIGlkPSdtb3ZpZVZpZGVvU2V0UGFnZSc+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSd6aG1fc2V0X3BhZ2VfaGVhZGVyJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy5zZXRQbGF5VmlkZW8rIjwvc3Bhbj48c3BhbiAgY2xhc3M9J2ljb25TZXRTYXZlJz7DlzwvbGk+PC91bD4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fc2V0X3BhZ2VfbGlzdCc+IjsKCiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPHBsYXlWaWRlb09wdGlvbkpzb24ubGVuZ3RoO2krKyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3Isc3dpdGNoQmFja0NvcmxvcixkaXNwbGF5OwoKICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVmFsdWUgPSBHTV9nZXRWYWx1ZShwbGF5VmlkZW9PcHRpb25Kc29uW2ldLm9wdGlvbklELHBsYXlWaWRlb09wdGlvbkpzb25baV0uZGVmYXVsdCk7CgogICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlICE9ICcyMicpewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZTZkNzMnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgPSAnYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nemhtX3NldF9wYWdlX2NvbnRlbnQnPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjxzcGFuPiIrbGFuZy5wbGF5VmlkZW9MaW5lQWRkKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6Iitzd2l0Y2hCYWNrQ29ybG9yKyInIGlkPSciK3BsYXlWaWRlb09wdGlvbkpzb25baV0ub3B0aW9uSUQrIic+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiOyBsZWZ0OiAiK29wdGlvblZhbHVlKyJweDsnPjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0gIjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0nZm9ybV9fdGV4dGFyZWEnPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGRpdiBjbGFzcz0ndGV4dGFyZWEganMtZmxleGlibGUtdGV4dGFyZWEnIHN0eWxlPSdtYXJnaW4tdG9wOiAxMHB4OyBkaXNwbGF5OiAiK2Rpc3BsYXkrIjsgcGFkZGluZzogNXB4IDBweDsnIGlkPSd2aWRlb1BsYXlMaW5lQWRkVGV4dGFyZWEnPiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHRleHRhcmVhIHJvd3M9JzUnIGNsYXNzPSd0ZXh0YXJlYV9fYm9keScgcGxhY2Vob2xkZXI9JyIrbGFuZy50aXBQbGF5VmlkZW9MaW5lQWRkKyInIHN0eWxlPSd3aWR0aDoyNTBweDtmb250LXNpemU6MTRweDtwYWRkaW5nOjRweDtyZXNpemU6bm9uZTsnIGlkPSdwbGF5VmlkZW9MaW5lVGV4dGFyZWEnPiIrR01fZ2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JywnJykrIjwvdGV4dGFyZWE+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L2Rpdj48L2Rpdj48L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8L3VsPiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvZGl2PiIKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J3poaWh1U2V0UGFnZScgaWQ9J3poaWh1SWNvblNldFBhZ2UnPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J2ljb25TZXRVbEhlYWQnPjxsaSBjbGFzcz0naWNvblNldFBhZ2VIZWFkJz48c3BhbiBjbGFzcz0nYmFjayc+PC9zcGFuPjxzcGFuPiIrbGFuZy56aFNldCsiPC9zcGFuPjxzcGFuICBjbGFzcz0naWNvblNldFNhdmUnPsOXPC9saT48L3VsPiI7CgogICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8dWwgY2xhc3M9J3poaWh1U2V0UGFnZUxpJz4iOwoKICAgICAgICAgICAgICAgIGZvcih2YXIgb3B0aW9uTj0wO29wdGlvbk48emhpaHVPcHRpb25Kc29uLmxlbmd0aDtvcHRpb25OKyspewoKICAgICAgICAgICAgICAgICAgICBsZXQgYmFja0NvbG9yLHN3aXRjaEJhY2tDb3Jsb3I7CgogICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IEdNX2dldFZhbHVlKHpoaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25JRCx6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0uZGVmYXVsdCk7CgogICAgICAgICAgICAgICAgICAgIGlmKG9wdGlvblZhbHVlICE9ICcyMicpewoKICAgICAgICAgICAgICAgICAgICAgICAgYmFja0NvbG9yID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZlNmQ3Myc7CgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hCYWNrQ29ybG9yID0gJyNGRkU1RTUnOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpID48ZGl2IGNsYXNzPSd6aGlodVNldFBhZ2VDb250ZW50Jz48c3Bhbj4iK3poaWh1T3B0aW9uSnNvbltvcHRpb25OXS5vcHRpb25OYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdjaXJjdWxhcicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOycgaWQ9Iit6aGlodU9wdGlvbkpzb25bb3B0aW9uTl0ub3B0aW9uSUQrIj48ZGl2IGNsYXNzPSdyb3VuZC1idXR0b24nIHN0eWxlPSdiYWNrZ3JvdW5kOiAiK2JhY2tDb2xvcisiO2xlZnQ6ICIrb3B0aW9uVmFsdWUrInB4Oyc+PC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVLZXl3b3JkJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5d29yZFNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlS2V5d29yZCcsJzAnKSA9PSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkU2hvdyA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRTaG93ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J21hcmdpbi10b3A6MTBweDtkaXNwbGF5OiIra2V5d29yZFNob3crIjtwYWRkaW5nOjVweCAwcHg7JyBpZD0nemhpaHVLZXl3b3JkJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IHZhbHVlPSciK0dNX2dldFZhbHVlKCdpbnB1dFpoS2V5d29yZCcsJycpKyInIGlkPSdpbnB1dFpoS2V5d29yZCcgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwS2V5d29yZCsiJyBzdHlsZT0nd2lkdGg6ODglJz48c3Bhbj48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoemhpaHVPcHRpb25Kc29uW29wdGlvbk5dLm9wdGlvbklEID09ICdyZW1vdmVBdXRob3JOYW1lJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXV0aG9yTmFtZVNob3c7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzAnKSA9PSAnMjInKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JOYW1lU2hvdyA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvck5hbWVTaG93ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J21hcmdpbi10b3A6MTBweDtkaXNwbGF5OiIrYXV0aG9yTmFtZVNob3crIjtwYWRkaW5nOjVweCAwcHg7JyBpZD0nemhpaHVBdXRob3JOYW1lJz48c3BhbiBjbGFzcz0ndGV4dC1pbnB1dCc+PGlucHV0IHZhbHVlPSciK0dNX2dldFZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScsJycpKyInIGlkPSdpbnB1dFpoQXV0aG9yTmFtZScgY2xhc3M9J3RleHQtaW5wdXRfX2JvZHknIHBsYWNlaG9sZGVyPSciK2xhbmcudGlwQXV0aG9yTmFtZSsiJyBzdHlsZT0nd2lkdGg6ODglJz48c3Bhbj48L2Rpdj4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvbGk+IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IgoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0naWNvblNldFVsSGVhZCc+PGxpIGNsYXNzPSdpY29uU2V0UGFnZUhlYWQnPjxzcGFuPjwvc3Bhbj48c3Bhbj4iK2xhbmcuc2V0KyI8L3NwYW4+PHNwYW4gY2xhc3M9J2ljb25TZXRTYXZlJz7Dlzwvc3Bhbj48L2xpPjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9Ijx1bCBjbGFzcz0nc2V0V3JhcExpJz4iOwoKICAgICAgICAgICAgICAgIGZvcih2YXIgc2V0Tj0wO3NldE48c2V0TGlzdEpzb24ubGVuZ3RoO3NldE4rKyl7CgogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0VmFsdWUgPSBHTV9nZXRWYWx1ZShzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQsJzIyJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBiYWNrQ29sb3IsYXJyb3dDb2xvcixzd2l0Y2hCYWNrQ29ybG9yOwoKICAgICAgICAgICAgICAgICAgICBpZihsaXN0VmFsdWUgIT0gMjIpewogICAgICAgICAgICAgICAgICAgICAgICBiYWNrQ29sb3IgPSAnI2ZmZic7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3I9ICcjRUVFJzsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZGJzsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tDb2xvciA9ICcjZmU2ZDczJzsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dDb2xvciA9ICcjQ0NDJzsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoQmFja0NvcmxvciA9ICcjRkZFNUU1JzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCA9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93Q29sb3IgPSAnI0VFRSc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxsaT48c3Bhbj4iK3NldExpc3RKc29uW3NldE5dLmxpc3ROYW1lKyI8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgc2V0SHRtbCArPSI8ZGl2IGNsYXNzPSdzZXRXcmFwTGlDb250ZW50Jz4iOwoKICAgICAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2NpcmN1bGFyJyBpZD0nIitzZXRMaXN0SnNvbltzZXROXS5zZXRMaXN0SUQrIicgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrc3dpdGNoQmFja0NvcmxvcisiOyc+PGRpdiBjbGFzcz0ncm91bmQtYnV0dG9uJyBzdHlsZT0nYmFja2dyb3VuZDogIitiYWNrQ29sb3IrIjtsZWZ0OiAiK2xpc3RWYWx1ZSsicHgnPjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHNwYW4gY2xhc3M9J3RvLXJpZ2h0JyBkYXRhPSciK3NldExpc3RKc29uW3NldE5dLnNldFBhZ2VJRCsiJyB0YWtlUGxhY2U9JyIrc2V0TGlzdEpzb25bc2V0Tl0udGFrZVBsYWNlKyInIHN0eWxlPSdib3JkZXI6IHNvbGlkICIrYXJyb3dDb2xvcisiOyBib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOyc+PC9zcGFuPjwvZGl2PjwvbGk+IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjwvdWw+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgc3R5bGU9J2hlaWdodDo0MHB4OycgaWQ9J3pobVRha2VQbGFjZSc+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9IjxkaXYgY2xhc3M9J2ljb25TZXRGb290JyBzdHlsZT0nJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPHVsIGNsYXNzPSdpY29uU2V0Rm9vdExpJz4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0iPGxpPjxhIGhyZWY9J2h0dHBzOi8vODBub3RlLmNvbS8yMDE5LzA1Lzc4Mi5odG1sJyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnF1ZXN0aW9uKyI8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cuenVpaHVpbWFpLm5ldC90L3FxLmh0bWwnIHRhcmdldD0nX2JsYW5rJz7kuqTmtYHnvqQ8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly9jZG4uODBub3RlLmNvbS9kcy5qcGcnIHRhcmdldD0nX2JsYW5rJz4iK2xhbmcucmV3YXJkKyI8L2E+PC9saT7jg7s8bGk+PGEgaHJlZj0naHR0cHM6Ly9jZG4uODBub3RlLmNvbS9lcnd3bWEucG5nJyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnJlZFJld2FyZCsiPC9hPjwvbGk+44O7PGxpPjxhIGhyZWY9J2h0dHBzOi8vODBub3RlLmNvbS8yMDIyLzAzLzMyMy5odG1sJyB0YXJnZXQ9J19ibGFuayc+IitsYW5nLnRoYW5rKyI8L2E+PC9saT4iOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC91bD4nOwoKICAgICAgICAgICAgICAgIHNldEh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgICAgICBzZXRIdG1sICs9ICI8L2Rpdj4iOwoKICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZXRNYXNrJykpIHJldHVybjsKCiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobU1lbnUnKTsKCiAgICAgICAgICAgICAgICBsZXQgemhtTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6aG1NZW51Jyk7CgogICAgICAgICAgICAgICAgemhtTWVudS5pbm5lckhUTUwgPSBzZXRIdG1sOwoKICAgICAgICAgICAgICAgIGxldCB0aW1lclpobUljb24gPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobU1lbnUnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8vIOWPlua2iOWumuaXtuWZqAoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNpcmN1bGFyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihfZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBidXR0b25TdHlsZSA9IGl0ZW0uY2hpbGRyZW5bMF0uc3R5bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gYnV0dG9uU3R5bGUubGVmdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGxlZnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdExlZnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVmdD09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5sZWZ0ID0gJzIycHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uU3R5bGUuYmFja2dyb3VuZCA9ICcjZmU2ZDczJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZD0nI2ZmRTVFNSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLm5leHRTaWJsaW5nICYmIGl0ZW0ubmV4dFNpYmxpbmcuZ2V0QXR0cmlidXRlKCdkYXRhJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI2NjYztib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RMZWZ0VmFsdWUgPSAyMjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5sZWZ0ID0gJzBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25TdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmYnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kPScjZmZmJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubmV4dFNpYmxpbmcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubmV4dFNpYmxpbmcuc2V0QXR0cmlidXRlKCdzdHlsZScsJ2JvcmRlcjogc29saWQgI0VFRTtib3JkZXItd2lkdGg6IDAgM3B4IDNweCAwOycpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0TGVmdFZhbHVlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRMaXN0SUQgPSBpdGVtLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SUQgPT0gJ3JlbW92ZUtleXdvcmQnICYmIGxpc3RMZWZ0VmFsdWU9PTIyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUtleXdvcmQnKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1UYWtlUGxhY2UnKS5zdHlsZT0gJ2hlaWdodDoyMjBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRMaXN0SUQgPT0gJ3JlbW92ZUtleXdvcmQnICYmIGxpc3RMZWZ0VmFsdWU9PTApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3poaWh1S2V5d29yZCcpLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MTgwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVBdXRob3JOYW1lJyAmJiBsaXN0TGVmdFZhbHVlPT0yMil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhpaHVBdXRob3JOYW1lJykuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtVGFrZVBsYWNlJykuc3R5bGU9ICdoZWlnaHQ6MjYwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0TGlzdElEID09ICdyZW1vdmVBdXRob3JOYW1lJyAmJiBsaXN0TGVmdFZhbHVlPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aGlodUF1dGhvck5hbWUnKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSAnaGVpZ2h0OjEyMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAndmlkZW9QbGF5TGluZUFkZCcgJiYgbGlzdExlZnRWYWx1ZT09MjIpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvUGxheUxpbmVBZGRUZXh0YXJlYScpLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldExpc3RJRCA9PSAndmlkZW9QbGF5TGluZUFkZCcgJiYgbGlzdExlZnRWYWx1ZT09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZFRleHRhcmVhJykuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShzZXRMaXN0SUQsbGlzdExlZnRWYWx1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvUmlnaHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG8tcmlnaHQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRvUmlnaHQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gaXRlbS5wcmV2aW91c1NpYmxpbmcuY2hpbGRyZW5bMF0uc3R5bGUubGVmdDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBhcnNlSW50KGxlZnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZWZ0ICE9IDIyKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRQYWdlSUQgPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2V0UGFnZUlEKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUlkLmNsYXNzTmFtZT0naWNvblNldFBhZ2UgdG9MZWZ0TW92ZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v55+l5LmO6K6+572u5pqC5L2N6auY5bqmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0UGFnZUlEPT0nemhpaHVJY29uU2V0UGFnZScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSBgaGVpZ2h0OjY4cHhgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrp7ml7blm77moIfpq5jluqYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXRQYWdlSUQgPT0gJ21vdmllSWNvblNldFBhZ2UnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNpY29uVG9wJykudmFsdWU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pobWxvZ28iKS5vZmZzZXRUb3A7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9CYWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhY2snKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRvQmFjay5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudERvbSA9IGl0ZW0ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc05hbWU9J2ljb25TZXRQYWdlIHRvUmlnaHRNb3ZlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobVRha2VQbGFjZScpLnN0eWxlPSdoZWlnaHQ6NDBweDsnCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2V0U2F2ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pY29uU2V0U2F2ZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2F2ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCgpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uVG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25Ub3AnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25Qb3NpdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uUG9zaXRpb24nKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XaWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2lkdGgnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljb25XYWl0VGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpY29uV2FpdFRpbWUnKS52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlb0xpbmVUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlWaWRlb0xpbmVUZXh0YXJlYScpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVZpZGVvTGluZUxlZnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW9QbGF5TGluZUFkZCcpLmNoaWxkcmVuWzBdLnN0eWxlLmxlZnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFpoS2V5d29yZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnB1dFpoS2V5d29yZCcpLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRBdXRob3JOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lucHV0WmhBdXRob3JOYW1lJykudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Ub3AgIT0gJycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMC05XVswLTldezAsMn0kKS8udGVzdChpY29uVG9wKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uSGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vX3RoaXMuc2V0Q29va2llKCdpY29uVG9wJyxpY29uVG9wLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uVG9wJyxpY29uVG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25Qb3NpdGlvbiAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLnNldENvb2tpZSgnaWNvblBvc2l0aW9uJyxpY29uUG9zaXRpb24sMzApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ljb25Qb3NpdGlvbicsaWNvblBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGljb25XYWl0VGltZSAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvbldhaXRUaW1lJyxpY29uV2FpdFRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWNvbldpZHRoICE9JycpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF4oWzEtOV1bMC05XT8pJCkvLnRlc3QoaWNvbldpZHRoKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhbmcudGlwRXJyb3JJY29uV2lkdGgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fdGhpcy5zZXRDb29raWUoJ2ljb25XaWR0aCcsaWNvbldpZHRoLDMwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpY29uV2lkdGgnLGljb25XaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgndmlkZW9QbGF5TGluZUFkZCcpID09IDIyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYXlWaWRlb0xpbmVUZXh0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IF90aGlzLmdldExpbmUocGxheVZpZGVvTGluZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmVPYmoubGVuZ3RoPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnLHBsYXlWaWRlb0xpbmVUZXh0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgn57q/6Lev6L6T5YWl5LiN5q2j56GuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ3BsYXlWaWRlb0xpbmVUZXh0JywnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnLHBsYXlWaWRlb0xpbmVUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlucHV0WmhLZXl3b3JkICE9ICcnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdpbnB1dFpoS2V5d29yZCcsaW5wdXRaaEtleXdvcmQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEdNX2dldFZhbHVlKCdpbnB1dFpoS2V5d29yZCcpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgnaW5wdXRaaEtleXdvcmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlucHV0QXV0aG9yTmFtZSAhPSAnJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnLGlucHV0QXV0aG9yTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoR01fZ2V0VmFsdWUoJ2lucHV0WmhBdXRob3JOYW1lJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCdpbnB1dFpoQXV0aG9yTmFtZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5nbygwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaWNvblRvcCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblRvcCA9IHRoaXMudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISgvKF5bMS05XVxkKiQpLy50ZXN0KGljb25Ub3ApKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywnZmFsc2UnKQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtdmFsaWQnLCd0cnVlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ljb25XaWR0aCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbldpZHRoID0gdGhpcy52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKC8oXlsxLTldXGQqJCkvLnRlc3QoaWNvbldpZHRoKSkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS1pcy12YWxpZCcsJ2ZhbHNlJykKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLWlzLXZhbGlkJywndHJ1ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLy/ohb7orq/op4bpopHlv6vmjbfplK7lhrLnqoEKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLm1hdGNoKC92XC5xcVwuY29tXC94XC9jb3Zlci8pKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkTGluZVRleHQgPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5VmlkZW9MaW5lVGV4dGFyZWEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gYWRkTGluZVRleHQuc2VsZWN0aW9uU3RhcnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRQb3MgPSBhZGRMaW5lVGV4dC5zZWxlY3Rpb25FbmQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcyA9PT0gdW5kZWZpbmVkIHx8IGVuZFBvcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUNvZGUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUua2V5Q29kZSA9PSBpdGVtLmNvZGUgJiYgZS5zaGlmdEtleT09aXRlbS5pc1NoaWZ0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFZhbHVlID0gYWRkTGluZVRleHQudmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0VmFsdWUgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKDAsc3RhcnRQb3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRWYWx1ZSA9IHRleHRWYWx1ZS5zdWJzdHJpbmcoc3RhcnRQb3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxWYWx1ZSA9IHN0YXJ0VmFsdWUraXRlbS52YWx1ZStlbmRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC52YWx1ZT1hbGxWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5lVGV4dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0UG9zKzE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluZVRleHQuc2VsZWN0aW9uRW5kID0gZW5kUG9zKzE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlRWxlbWVudChkb20sZG9tSWQpewoKICAgICAgICAgICAgICAgIHZhciByb290RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7CgogICAgICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRvbSk7CgogICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pZCA9IGRvbUlkOwoKICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50SHRtbENvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CgogICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7CgogICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50SHRtbENvbnRlbnQpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVxdWVzdChtZXRob2QsdXJsLGRhdGEpewoKICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QucmVhZHlTdGF0ZT09NCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdC5zdGF0dXM9PTIwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxdWVzdC5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCx1cmwpOwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChkYXRhKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0Q29va2llKGNuYW1lLGN2YWx1ZSxleGRheXMpewoKICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKCiAgICAgICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkrKGV4ZGF5cyoyNCo2MCo2MCoxMDAwKSk7CgogICAgICAgICAgICAgICAgdmFyIGV4cGlyZXMgPSAiZXhwaXJlcz0iK2QudG9HTVRTdHJpbmcoKTsKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjbmFtZSsiPSIrY3ZhbHVlKyI7ICIrZXhwaXJlczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZ2V0Q29va2llKGNuYW1lKXsKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gY25hbWUgKyAiPSI7CiAgICAgICAgICAgICAgICB2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPGNhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjYVtpXS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMuaW5kZXhPZihuYW1lKT09MCkgeyByZXR1cm4gYy5zdWJzdHJpbmcobmFtZS5sZW5ndGgsYy5sZW5ndGgpOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldFF1ZXJ5U3RyaW5nKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IFJlZ0V4cCgiKF58JikiICsgZSArICI9KFteJl0qKSgmfCQpIik7CiAgICAgICAgICAgICAgICB2YXIgYSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLm1hdGNoKHQpOwogICAgICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgcmV0dXJuIGFbMl07CiAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdldFVybFBhcmFtcyh1cmwpewogICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW14/JisjXSspPShbXj8mKyNdKykvZzsKICAgICAgICAgICAgICAgIGxldCBvYmo9e307CiAgICAgICAgICAgICAgICB1cmwucmVwbGFjZShyZWcsKHJlcywkMSwkMik9PntvYmpbJDFdPSQyfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRMaW5lKHRleHQpewoKICAgICAgICAgICAgICAgIGxldCB0ZXh0QXJyID0gdGV4dC5zcGxpdCgnXG4nKTsKCiAgICAgICAgICAgICAgICBpZih0ZXh0QXJyLmxlbmd0aCA+IDApewoKICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU9iaiA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSAvXiguKykoaHR0cHM/OlwvXC8uKykkLzsKCiAgICAgICAgICAgICAgICAgICAgdGV4dEFyci5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXHMqLCovZywnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighaXRlbSkgcmV0dXJuIHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZU1hdGNoID0gaXRlbS5tYXRjaChtYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihsaW5lTWF0Y2gpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPYmoucHVzaCh7J25hbWUnOmxpbmVNYXRjaFsxXS5zdWJzdHJpbmcoMCw0KSwndXJsJzpsaW5lTWF0Y2hbMl19KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPYmo9W107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lT2JqOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdGljIGdldEVsZW1lbnQoY3NzKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+ewoKICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIG51bSsrCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjc3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRvbSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW09PTIwKXtjbGVhckludGVydmFsKHRpbWVyKTtyZXNvbHZlKGZhbHNlKTt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDApCgogICAgICAgICAgICAgICAgICAgIH0pCgoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3RhdGljIHRvYXN0KG1zZyxkdXJhdGlvbil7CgogICAgICAgICAgICAgICAgZHVyYXRpb249aXNOYU4oZHVyYXRpb24pPzMwMDA6ZHVyYXRpb247CgogICAgICAgICAgICAgICAgbGV0IHRvYXN0RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgdG9hc3REb20uaW5uZXJIVE1MID0gbXNnOwoKICAgICAgICAgICAgICAgIC8vdG9hc3REb20uc3R5bGUuY3NzVGV4dD0id2lkdGg6IDYwJTttaW4td2lkdGg6IDE1MHB4O29wYWNpdHk6IDAuNztoZWlnaHQ6IDMwcHg7Y29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtsaW5lLWhlaWdodDogMzBweDt0ZXh0LWFsaWduOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogNXB4O3Bvc2l0aW9uOiBmaXhlZDt0b3A6IDQwJTtsZWZ0OiAyMCU7ei1pbmRleDogOTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDEycHg7IjsKICAgICAgICAgICAgICAgIHRvYXN0RG9tLnN0eWxlLmNzc1RleHQ9J3BhZGRpbmc6MnB4IDE1cHg7bWluLWhlaWdodDogMzZweDtsaW5lLWhlaWdodDogMzZweDt0ZXh0LWFsaWduOiBjZW50ZXI7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSk7Ym9yZGVyLXJhZGl1czogNHB4O2NvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7cG9zaXRpb246IGZpeGVkO3RvcDogNTAlO2xlZnQ6IDUwJTt6LWluZGV4OiA5OTk5OTk5O2JhY2tncm91bmQ6IHJnYigwLCAwLCAwKTtmb250LXNpemU6IDE2cHg7JwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3REb20pOwoKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgogICAgICAgICAgICAgICAgICAgIHZhciBkID0gMC41OwoKICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJy13ZWJraXQtdHJhbnNmb3JtICcgKyBkICsgJ3MgZWFzZS1pbiwgb3BhY2l0eSAnICsgZCArICdzIGVhc2UtaW4nOwoKICAgICAgICAgICAgICAgICAgICB0b2FzdERvbS5zdHlsZS5vcGFjaXR5ID0gJzAnOwoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRvYXN0RG9tKSB9LCBkICogMTAwMCk7CgogICAgICAgICAgICAgICAgfSwgZHVyYXRpb24pOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsYXNzIENvdXBvbkNsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKCiAgICAgICAgICAgICAgICBzdXBlcigpOwoKICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKICAgICAgICAgICAgICAgIHRoaXMuZGl2RWxlbWVudC5pZD0nemhtX2Rpdl9zJzsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFvYmFvKCl7CgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9qdVZhbGlkJyk7CgogICAgICAgICAgICAgICAgbm9kZS5zdHlsZT0nb3ZlcmZsb3c6aW5oZXJpdDsnCgogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3Rhb2Jhbyc7CgogICAgICAgICAgICAgICAgdGhpcy5nZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0bWFsbCgpewoKICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFjdGlvbnMtLWxlZnRCdXR0b25zLS0xTTNLa0Y3Jyk6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI0pfTGlua0J1eScpLnBhcmVudE5vZGU7CgogICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9ICd6aG1fdGFiX3RtYWxsJzsKCiAgICAgICAgICAgICAgICB0aGlzLmdldENvdXBvbkluZm8obm9kZSxjbGFzc05hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtYWxsQ2Fvc2hpKCl7CgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjSl9MaW5rQnV5JykucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOwoKICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG1hbGxPdGhlcigpewoKICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRtLW1zZy1ib3gnKTsKCiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gJ3pobV90YWJfdG1hbGwnOwoKICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q291cG9uSW5mbyhub2RlLGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgamQoKXsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PnsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGpkR29vZHNJZCA9IGNvdXBvblVybC5tYXRjaCgvamRcLmNvbVwvKFxTKikuaHRtbC8pOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Nob29zZS1idG5zJyk7CgogICAgICAgICAgICAgICAgICAgIG5vZGUuYmVmb3JlKHRoaXMuZGl2RWxlbWVudCk7CgogICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdCgnZ2V0JyxgaHR0cHM6Ly96dWlodWltYWkubmV0L3ZyaHIvaW5kZXhfamRfbmV3LnBocD9nb29kc19pZD0ke2pkR29vZHNJZFsxXX1gKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcD0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWw9Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICByZXNwLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY291cG9uIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MTBweDsiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbGVmdCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1faW1nX2ljb24iPgogICAgICAgIDxpbWcgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhaQUJrQUhqL0FDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFKTEFIL0FDd0FBQUFBWkFCa0FLZjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QlRyNkJqcjZCanI2Qmp2NkJqdjZCanY2Qmp2NkJ6djZCenY2Q0R6NkNEejZDVDM2Q1QzNkNUMzZDajc2Q3o3NkN6LzZDei82REQvNkRFRDZEVUQ2RFVENkRrSDZEa0g2RGtINkQwTDZFRUw2RVVQNkVVVDZFa1Q3RTBYN0ZFWDdGRWI3RkViN0ZVYjdGVWY3RlVmN0ZrZjdGa2Y3RjBqN0YwajdGMGo3RjBqN0dFajdHRW43R1VyN0drdjdHMHY3SEV6N0hVMzdIMC83SVZEN0kxSDdKRkw3SmxUN0oxVDdLRmI3S1ZiN0tsZjdLMWo3TGxyN01GejdNbDM3TkYvOE5tRDhPR0w4T21UOFBHWDhQMmY4UVduOFEycjhSR3Y4Um0zOFJtMzhSMjc4U0cvOFNYRDhTbkQ4VEhMOFRuUDhUM1Q4VUhYOFVuZjhWSGo4VjN2OFczNzhZSUw4WklYOGFvbjhiNDM4Y1kvN2NJNzZiWXY0YTRuMWFZZnVaNFRqWkgvVVpIekhabnU4YVhxdGJIcWliM3FXYzNxSWQzdUFlSHA1ZVhsNmVucDdlM3Q4Zkh4OWZYMStmbjUvZjMrQWdJQ0JnWUdDZ29LRGc0T0VoSVNGaFlXR2hvYUhoNGVJaUlpSmlZbUtpb3FMaTR1TWpJeU5qWTJPam82UGo0K1FrSkNSa1pHU2twS1RrNU9VbEpTVmxaV1dscGFYbDVlWW1KaVptWm1hbXBxYm01dWNuSnlkbloyZW5wNmZuNStnb0tDaG9hR2lvcUtqbzZPa3BLU2xwYVdycHFlMnFLdkFxYTdKcXJIUXE3UFhyTFhkckxmaXJiam9yTG51cXJueXFMajFwN2ozcGJmNXBMYjZvcmI3b3JYOG9iWDhvTFQ5b0xUOW9MVDlvYlg5b3JiOW83ZjlwYmo5cHJuOXA3bjlxTHI5cUx2OXFidjlxYnY5cXJ6OXFyejlxcno5cTd6OXE3MzlxNzM5cmI3OXJyLzlzTUg4c3NMOHRNVDh0c1g4dU1mN3VzbjZ2Y3I2d016NXdzNzR3OC80eGREM3g5SDN5TkwyeXRUMXk5WDB6ZGJ6ME5meTB0bngxTnJ4MU52eDFkdngxdHp4MTkzdzJOM3gyZC93MjkvdjNPSHYzdUx2NE9QdjR1WHU1ZWZ1NStudTZ1dnQ3ZTN1N3U3djcrL3c4UER4OGZIeTh2THo4L1AwOVBUMTlmWDI5dmI0K1BqNStmbjcrL3Y4L1B6OS9mMysvdjcrL3Y3Ky92NHl6VElJL2dEL0NSeElzS0RCZ3dnVEtseklzS0hEaHhBWnFsdlNKS0xGaXhnei9pdEQ1TVFKSTJvMGloeEpNZ2tIQndvOFBDSEpzdVZEWWtJY3lKUlF4Si9MbXpnTDRvbzVrNGpObkVCZDRob2kwNEVFbjBHVEdqUUhSVW1TTHc2SEZqMzZrMkdYSlVtZ1ZGVUtzVWtLQ2hoNmpHa290ZWZXaEdKOGFLQ1F3Z25YaUdWNkZNVlFrMkZabzBnWCtqdWlRYWFDSHJqZVBxVGlvcWlERkZjWWJpTXFrd0tTaGxaV0tKQlpJRWRJd1EyM0VhRlFsSUlRWnd5anFLQkFRY1VVdTBJNE54NXlGblBDS2lzTWc0akNzQnNVSWtXa05JUlN3ckNLTGE0ZCtqT0N3WENQeXl6Ui9EQ000VWp3aDF3S0Z4MVJ4ZVdZRmdXS3dpanovS0dTa3c0Sy9zQXc0NUlNak93cEszWjNTQ2JJMmhUcVcvcGJVb0tDaHlISTF6TXNVMlNJVnB5L05ERkVFbW5vaHhNdVZFQ1JSUlpZWENFRUZyNFk2Sm9hVWhqaHd3d3NlQUJDQ1NXSW9JRUxMZ2lSeEJTOFNBaVVQMU1RTWNNSUdraGcySXNPVUtCQkNUd2tFWWFKQlpIVDJrTlNDSkZDY1RBR2FSZ0hMUmdoUmtiK3hKT2NFalBZd0VSZ0VIVXh4RmRDVnZraUJpNHNrVjlEYUN5Umd3MUxRS25SRWlESUJNSVBWT3hva0Q5UTJBQmtrQkp3QmxhTUxnckpnUStKTldUTkV6eDRJSk1JOFdHa25HRVVuRUNFRnd1cGNVUnZRYzdZUWc5R25GQ0NDakFnMFFNTUovUUZJd1V0UEtIbVFGVUVNY0tMT2NDajBhQlh1cUFiUW1jUTRlZUwvaFNNME1NUlUydzVrQnBVR0pIRENLb1pkc0lTbnpiQlFxOUY4ZkNwUTB5VUNlTnhCNTBoaEthR2xTQkVGTXBFQlVVUWpCb213aEhtSEZSR0RrR2VRSnRJYWlUUndwdG1qa3NRR3MrK3FFRU9VaHlMa0Q5UjhBQ3RUQjhBYTVBWEttUlhsQVl3T0tFTlMxb01jWUpxQ3JoQVJrSGdIQUZlVVNJVWNZWkdaaGlSclV6aUd2VHRaREdxWU1SWU4wa0J4QWtnc0xCU1FVMk02bXNUOGpia2oxY3Z1b0JvUVU2b0FNSUpRbFFIVkRCVVBNR0ZRVjNBOEdJS1VMajBSR3lkQWJIbE9sVTRrV1ozdHd5QnJnaHUzZFRFQ1VNeWdTTkJ2Qm1tZ1JFdEM2U0dyUWtwOGFwTUxjeU1veHBCdlBnRDJRYVJRVVFPT1J3QmQwRnFwRGFYL2hGYi94UEZ4U2Zvdk5BeVJHaFFRRXBKT0pSRkMwVXB3TUtSSnBLeldXZDVMVFNHQy81V2RuZEJmUDJydFlsZHVNQ3hBeXAwNGRBWUxHUytuVU5lU0NjVEQ1c0w1c1RaRXJCMk9uYVV5Y0NkeThSTkovaDYvZ3pScXdmcU1uUmQ1aktRNTFBVldNdUV3UklTZnR1NEM3czNkSHp1eWpkMEJnK0crWkNPZ1dHd01Eb1EzOStPZlBZTStUTjVlRE93WWVBVDJUb0cwZlhoSmQvVnd5Tm9nWk1aVGluaHYxTkpRSjlBblBBd0Ruek9mTmlEQ1B5bWt3V0RmQ0VKLy9OZkVwb1FPN0VSZ1FPa3lTQUZPSUNmZ2tBQldpWFEzMFBvVndEN1BRUU1xWk9KQVFzeUJ2ZG9rRFFnTUVJMkdKS0VFb3l1S0FXZ0RzcEFDSlVSNHE1Ky9nSmNDQmwrS0FFZ2VQQnNML0pBRHhoaWczdkpabFVEV2NLYlN0QkRCQUlSSWtQMFZ4RUw4b1NId1lvRERBa0R1QlJBeGpJcW9BVWdHOGdUUUtnMjYvMndoRUZVaUJkV29FVWpFb1FLTFRCakdSMlFneW9xUkFvL0FKRWdYWkNEazNFTldpQ0FvaHZQQjVGa0ZXV0ZCSGtaRHdZSkloOVE0U0ZxMkFJV05va0ZMWkROSkh1YjN4dkgweFZvalFBTEIxRURnempaQlRHNWhBb3A0QmdGaWlCS1JncG5mUTRRQVNyMUF3YlJGY1VHRlJ5SWVUSUh1NGVnUVM2NVE0T0IyT2Fybnpua0cwaDRsUWVnOTVBcXhMSW9Qd2hiVXBEd0pnMVEweUZtT0FJTVpvQUVWeklFQ2RCNm5vbWtjREhMUkdRYjVSdWhEYUlsUWdPZEFaa3kvbEVKVjVpQVJCK1ljejFMdUJjUDNPY3lLQmpCQ0lxMEhMZzh0N1hRZVMxeDZmTUtXRlJRdFBRWjRWN1U2MXZuaXBLQ1N5NEVET2Z4aXczaVdKQW9ORThtR2xCQzMvN3hoWGthaDZRRFFjSUhERE9DTmg0a0N6TjQwUXhncWhSL0VPTWdUbENXODRnZ0RZVkE0UVFjVTBBS3dLQVFOQVNCV0NDb2FFR0NvVTJNVkNNS1A3REJFQlpHRURWSXpUQWZDSlJCMkNBRURKQVJBME9vMXJ4QVNUbG1GTVFMUThnQkVPS1ZFeW9Jb1RjS3dJQVF6QmtHbHhZbGJRcnBnaEJVb0FJaFFBNGhVMUFCcWJoNnE3SXFnQUxTc29KTHZFQUVLdm1sQk1BcGlCUlNRQ2doSEVNaDZKREMweEppQmg4TTdUUUZDWisvT2xhRTZtbWtDamxBL2hkS1RwRFpTSnBOTmxMTnlCSzg2SUVERWtRTVAveFhEdzZMa1YwSUQwWWFLTUpQRFpLR3B4ckdCaFBMaUVNN3M5ZFVGZzVHR0NDQ1NPSnlRN1pJN0RWSVErazNMZUtQSXFETEJjUXRDQm1NTUpxWXpUQWp2TkNibWRERWtPOFl4Z1ZwakVoa1JnZEpoVmhCQ0NxTGtSQ3FpaEFwMkVBRUk4aUJFN3JSa0RKdzcxOHFKYTk1RGZPMmhrempDVGtRZ1FoNllGT01qRUVLVWdqbVFKb2dWQWZBUUprUjZVSWVJWmJRaFp3QnhLNTlUaHBNK3k4YnZQREdOdzdMdllEUWpKVSt4QWt6dFpLUVlTU0NGdnVZdEFzZHNwSWQ0TThqUHdTZFN4NHlCOFRxWklWVVFRVTNqUEtMenNqWUtpK0V1M1A1QUFqR1RPWXlsOWtEYnlwQS9nK0E0ZVdHbEhaOFRsaUNuT2RNWnpwREFaOEY0TUZ5MjZ5UU44K0VsZzdwQm1QQzA0TTk4eGtoZnNhTE51K2laa01mMmlDSnBrcFVCdDNvUjVQV0J4eVRORmtvWFdoTEk1ckdlSG1JTXpqdGFFOExwTFNHRVVJWXJvQ0ZCUzJJazV5OHdoWEUwRGJLNk5uVWtBYTFBemhnNWw2WDJVTTR2RFd1Q1lKcUxRc3B6NlUyOVJrd2Jld2dLY0FHYmgzMlFIYlM3Q0I1aHNCT2hrSUw2bFJ0QjJqQUJ2V1V0a0JROUlQaHpVQUNHRWkzdXRNdGdSelFEZ2d4RnZjQW9jV0IzQm9rb0VYeGdMM2xMWkMvR1NZSDBUWElHUHlxVkQveVd5RDNaTTRRQ2xTUU1wVFZNRUNJOXNFSndnUXZhb0FIVG5DZlA4N1FoTmlDZGQ4VGp3dU1TVURnQWc5NHdBVkJub3JTSm42UUtZUlh5UzZvTGN0UmRsSWhxOERJTS8vSHkxcEFnU3d6QndiRnk3bEJyREFsMlhwYkJVTmdxdEFWNGc4cUZLSG1MVGpDTHBkTzlhb25KQ0FBSWZrRUNUSUEvd0FzQmdBQkFGZ0FZUUNuQUFBQUFRRUJBZ0lDQXdNREJBUUVCUVVGQmdZR0J3Y0hDQWdJQ1FrSkNnb0tDd3NMREF3TURRME5EZzRPRHc4UEVCQVFFUkVSRWhJU0V4TVRGQlFVRlJVVkZoWVdGeGNYR0JnWUdSa1pHaG9hR3hzYkhCd2NIUjBkSGg0ZUh4OGZJQ0FnSVNFaElpSWlJeU1qSkNRa0pTVWxKaVltSnljbktDZ29LU2twS2lvcUt5c3JMQ3dzTFMwdExpNHVMeTh2TURBd01URXhNakl5TXpNek5EUTBOVFUxTmpZMk56YzNPRGc0T1RrNU9qbzZPenM3UER3OFBUMDlQajQrUHo4L1FFQkFRVUZCUWtKQ1EwTkRSRVJFUlVWRlJrWkdSMGRIU0VoSVNVbEpTa3BLUzB0TFRFeE1UVTFOVGs1T1QwOVBVRkJRVVZGUlVsSlNVMU5UVkZSVVZWVlZWbFpXVjFkWFdGaFlXVmxaV2xwYVcxdGJYRnhjWFYxZFhsNWVYMTlmWUdCZ1lXRmhZbUppWTJOalpHUmtaV1ZsWm1abVoyZG5hR2hvYVdscGFtcHFhMnRyYkd4c2JXMXRibTV1YjI5dmNIQndjWEZ4Y25KeWMzTnpkSFIwZFhWMWRuWjJkM2QzZUhoNGVYbDVlbnA2ZTN0N2ZIeDhmWDE5Zm41K2YzOS9nSUNBZ1lHQmdvS0NnNE9EaElTRWhZV0Zob2FHaDRlSGlJaUlpWW1KaW9xS2k0dUxqSXlNalkyTmpvNk9qNCtQa0pDUWtaR1JrcEtTazVPVGxKU1VsWldWbHBhV2w1ZVhtSmlZbjUyVHFxU0t1SzErekxwcjNzVlk2Y3hON3M5SDhOQkY4TkJGOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkZFOE5GRThORkU4TkZFOE5GRThORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZHOGRGRzhkRkc4ZEZHOGRGSDhkRkg4ZEZIOGRGSThkRkk4ZEZKOGRKSjhkSko4ZEpLOGRKSzhkSkw4ZEpMOGRKTThkSk04ZE5OOGROTzhkTlA4ZE5QOGROUThkTlE4ZE5SOHRSUzh0UlM4dFJUOHRSVjh0Vlc4dFZZOHRaWjh0WmI4dGRlODlkZzg5aGk4OWhqODloajg5aGs4OWxtODlsbzlOcHE5TnByOU5wczlOdHQ5TnR3OU54eTlOeHo5TjExOU4xMjlOMTM5TjE1OWQ1NzlkOSs5ZCtBOWVDRDllR0c5dUtLOXVPTjl1T1E5K1dYK09paytPdXUrZTI0K3UvQyt2SEordkhJTXMweUNQNEEvd2tjU0xDZ3dZTUlEZllMTnk2aHc0Y1FJMHFjV0kvYk1tZmQ4azNjeUxIalJtL0hjdVU2VnM2anlaTW4rVzBUS2JKYlA1UXdZejdjeDQxbExtNHZaZXJjK1krbVRaYzhneExzWis3YnQzZ1NmYkxFS1JIZU4yL2xjZ3AxT001WkwyRFo1a1ZVS3BJcFJIblpnUFZ5Vm5KcVFuclpXUFlDT3JQbVVxa0orM2tEeGpLYlByTUkxVVd6NmF3ZHhINXVjL1h5RnBIZE01YXhybW5FcTVCYkw3WGI0Q0kwWjNWc09vajZ0ajBXMmNzcjQ0THFEck5NaHU1dk9XN2RTa01zcDR3dnZNOEgrM1dqVzNleFRueHBXUUxyQmhzaFBHczJrNm5qT2U5WkxKYlc2UFZHK0Mxa3JsakplZEt6ZG54a3crVUg2V2tUTnZiNnpuN2ZsUDcxT3NiTk52YUM5THB4aXlxVTN6aHUzL0NkaDdsUEhUcDQ3dHExNCthTzMzeTgrS0RUVFRiV1BITk1Nc29vazR3dzBWaXp6VGZwK1BkZlRQMmswNDAxeXRCbTA0YmpMWlBOTi9MTTE0OWtHNkd6alZVYnBxamlNZEYwRTZKSkkwcDB6emZXV0RQT1hSdkJ3dzJLS3ZhWW9qRFdoR05lUlBqUWFNMDMrMEFVVGpJaUhaT05PaVRHVm80MUdxcjRXQzlYK2poU051eEkxRTg1MXppWGpIY0kzWk1iU3hpOTVsQSszclNtb2pES1JKTk5OODQ0ODR3MTNoQzRUSlZxUmNPZVErdHN3NlJOMTBRNWtKa3A5bUtOYWdmWnc0MXpOdldpVERiZW9DUGZRZm1vMDgwMXlXekdWemlHL2pQT001N1dGYXBBUzZxWXpaQUMyYk9OTVA0cEtyTU5PaEppWnM0Mnk2U1lqRGRSVHFlaU0rWkFsTTgzMFpTYWkzQUczY01OckRZQmN3MDZweUxVRHpyWE1NdlNNZCtRQ0k4ejFZa0VqRFYvUXFRamo3bEVOeFJJR3liVGpUMG8xZE9ObTJnR2l4NXduR0drRlVmb1pMUE1NYytVUmRBNDhJcmt6RGpSUnRSUFZSdGFvK2Evemh5enpEWmRtc1NQT3VRc1BOQnZHd0xMVXptaWNiYk5rUDJzTXc2VVUrbmpXSEJrNm9Ud3RlSE1aMDdBd3JBRkVUNnNTdHVjVGRFZ3RSdysybXlZemFVUHpjUE5OZGQ0VTdOQitHaW1GbS9Mb1JPd004TkI1TSt5VFg0amtUdDdzZlRNaTU4QjV1bGFCZjh6RDNVaUpRYjBRM1BwMWpKczhHUXRzTVVPeVdNY2NzcEZoREZMaXNGR0R2NmtONFg5anp6UmRHdnVYOTE0bWt6RWVIbDlMYU5mQlU3M1JPbzRvNXZWak5WRHIwalcxRE1SNElMWEhWRTkxOWlVamQ4bXlTMDY2WncvN3VYSnoxbHp0bENzcVVYWTVuTmo3bmxFNDBDYUROeWZHK1c3Nyt3V3RQZTFLVDhrZCtjYnhTNVNNbjRWRk0vdnZwT2pFVDZQWW1uOWVPVVZWQTZreXZBZXQrTzJieFJQeDhlSVU5QThyMTZQNVRHOGh0ZWpNdXNVTkk2MTNXODBEL2psM2c0UlBSM25zbzMyZkxQSk1iUmhEV3R0NkJpTSs4YzNOS1FNblVua2ZzaWJDQVJab2cwQTltZzg4YmpjaHFKeHI0R1VnMzdlUzhnRXd6Y1JlUFN2Z2dUUlM0K3NnWlI4MWVpRjFyaUd2enlvdTh0SUVIK0RpNGc0QmpVUzh3MWxIUDdYc0VhRG90R2dKdzBrSC9uUlR6dmM4VHFCM0l3enM1Tkk2a2dva2ZtTnhoMEh3VWNTOVFPUEpIVWtIWkxqRE5NZVdMdjhUVVJ4eXd1aFR1TGh0bkxoS0NKanEwNHNWalVSUkNHbmlUekp4MHJRcEVhRm9Hc2tsSlBJT3NJb2t0RjlKbTNlQ3VUbnZGRWpiN3d4SW9qTUJURFd4aGluRVFxUERvbVIvVFM0akQ3cXhCNW5Hc2tNelNJT3Z0bWxOOTh3NE0rOFpBNXZwRWFDR2hTR0Q5bldSbUVvTWk1VndaSXpFaWl0MmRna2g0ZXNFdFFna2tIQkJjOGg2Q0NrSkcvNW1RejZUSE1PK2FOSTZ1Y1FkMml3WE5BVVNqOXE5UzhlU2xKbUJ5bEhydERrd0lQY1EybWpHYVZBK0VHNjJKaURRTnpvb0VEeXdib21GWThnU2Y3YlRHZTRXUkR3OEswei9uQWVONnlSRFdoNVJCM2JjQk13dHZISXYxMHpadzZCeDRtY0VVK0hnREZoK2tzYVhYcnhNTVRaYlVlbDZxUkJraGtwYnZDem4ra2dXVUpBbVRFYkVtUjgzUnBMTi9TSGtIVlFLVVhPNEowL2c2UE9qanl4U2JOOEtmNUVJb3lzdE1WWXVZalpTZi9CczFKWjR4NG91WnZIdkZnUWVocFFqQTlCQzRjd2trMkRoTVltd3FCa1IyUlRKUmFlaFU3R3NzYXA5b0hPWXhueElUODFvMGNNSThDZzFsUlFhdkVNUXRCaGpXUWtRNFpoQXgxWW1XbXd3b251YVAwRWsxK3o0VW1CekFNZGx0cEk3bjZKeVlqMmp6UWJ1UWRrdXlvVTNJRDFHbGdDaG1oSFM5clNZcVZLMmdqb2hCNHlXUzI1VmxjdVhmNXRRZ1Q3MnRvV3NxR3lQVWdrYmV1alk5d3p0d1VaSkc5ZHkwSGdaalYwdWptR2NwZkwzT1lldzFOelhLcHhCOExTdXBEakcrSElybmEzbTkxdmxDT1UyWkR1ZFA5UjNhNmNNVEM1Q085NEVWTGV2aVVGdmVwZHIwSGFxMWVIY0NXOTRwMHVmZjEyMy9qS2x5RDBQYS9vOG12YzltNURIa3QwaDRJWHpPRDh5S05uZUNNd2NOdDdJTDlhK01JWVhoQ2hKSnpiZW9SeXVDbnk3MzliOVdFUS8xSzFJeFpJWmt4c3BjaWttQ0RsYUNPTHY0WEZGdytrUXRudzFER3VZVnJTaHNrbTJxQ3BqY2xocldQSWl6bEZQcktOQ2ZJeVFrSDFJR1BqU3ptWFRPSm1jYU9KOWRnR2FsRk01WUdVRXF6WktBYytSblFQY3ZCWWdEMmxzamxXMDJVTjViWTV4SWhkTWpyNjk5cG8xTGpMQnhHSE1yVzBTenpqc2xoYVVoUXYvVndRZG9BMFJjQ2c2SlFKSFJ0TktiTkZIdjFNUUFBQUlmNFZUV0ZrWlNCM2FYUm9JRk5qY21WbGJsUnZSMmxtQURzPSIgPiAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5IiBzdHlsZT0nbWFyZ2luLXRvcDo3cHg7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2Ftb3VudF9tb25leSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXlfc2lnbiIgc3R5bGU9J21hcmdpbi10b3A6LTEwcHg7Jz7CpTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5X251bSI+JHtpdGVtLmRpc2NvdW50fTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvbmRpdGlvbiI+5ruhJHtpdGVtLnF1b3RhfeWFg+WPr+eUqDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90aW1lIiBzdHlsZT0nbWFyZ2luLXRvcDoxMHB4Oyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV90ZXJtIj7mnInmlYjmnJ88L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2RhdGUiPiR7aXRlbS5lbmRUaW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY2lyY2xlIj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xpbmtfY291cG9uIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJ6aG1fbGlua190ZXh0IiBocmVmPSIke2l0ZW0uY291cG9uX2xpbmt9IiB0YXJnZXQ9J19ibGFuaycgcmVsPSdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93JyBzdHlsZT0ibWFyZ2luLWxlZnQ6MTZweDt3aWR0aDozNHB4OyI+6aKG5Y+WPC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICBgCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobV9kaXZfcycpLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgICAgICAgICAgICAgIH0pCgoKCiAgICAgICAgICAgICAgICB9LGNvdXBvbldhaXRUaW1lKQogICAgICAgICAgICB9CgogICAgICAgICAgICBnZXRDb3Vwb25JbmZvKG5vZGUsY2xhc3NOYW1lKXsKCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57CgogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc19pZCA9IHRoaXMuZ2V0UXVlcnlTdHJpbmcoJ2lkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFnb29kc19pZCl7Y29uc29sZS5sb2coJ2dvb2RzX2lkJyk7cmV0dXJufTsKCiAgICAgICAgICAgICAgICAgICAgaWYoY2xhc3NOYW1lID09ICd6aG1fdGFiX3Rhb2JhbycpewoKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMSknKS5iZWZvcmUodGhpcy5kaXZFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYmVmb3JlKHRoaXMuZGl2RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3QoJ2dldCcsYGh0dHBzOi8vd3d3Lnp1aWh1aW1haS5uZXQvdnJoci9pbmRleF9uZXcucGhwP2dvb2RzX2lkPSR7Z29vZHNfaWR9YCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcD0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgICAgPGRpdiBjbGFzcz0iemhtX2NvdXBvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9sZWZ0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9pbWdfaWNvbiI+CiAgICAgICAgPGltZyBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQmtBSGovQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpMQUgvQUN3QUFBQUFaQUJrQUtmNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRG42QkRuNkJEbjZCRHI2QlRyNkJUcjZCVHI2QlRyNkJUcjZCVHI2QmpyNkJqcjZCanY2Qmp2NkJqdjZCanY2Qnp2NkJ6djZDRHo2Q0R6NkNUMzZDVDM2Q1QzNkNqNzZDejc2Q3ovNkN6LzZERC82REVENkRVRDZEVUQ2RGtINkRrSDZEa0g2RDBMNkVFTDZFVVA2RVVUNkVrVDdFMFg3RkVYN0ZFYjdGRWI3RlViN0ZVZjdGVWY3RmtmN0ZrZjdGMGo3RjBqN0YwajdGMGo3R0VqN0dFbjdHVXI3R2t2N0cwdjdIRXo3SFUzN0gwLzdJVkQ3STFIN0pGTDdKbFQ3SjFUN0tGYjdLVmI3S2xmN0sxajdMbHI3TUZ6N01sMzdORi84Tm1EOE9HTDhPbVQ4UEdYOFAyZjhRV244UTJyOFJHdjhSbTM4Um0zOFIyNzhTRy84U1hEOFNuRDhUSEw4VG5QOFQzVDhVSFg4VW5mOFZIajhWM3Y4VzM3OFlJTDhaSVg4YW9uOGI0MzhjWS83Y0k3NmJZdjRhNG4xYVlmdVo0VGpaSC9VWkh6SFpudThhWHF0YkhxaWIzcVdjM3FJZDN1QWVIcDVlWGw2ZW5wN2UzdDhmSHg5ZlgxK2ZuNS9mMytBZ0lDQmdZR0Nnb0tEZzRPRWhJU0ZoWVdHaG9hSGg0ZUlpSWlKaVltS2lvcUxpNHVNakl5TmpZMk9qbzZQajQrUWtKQ1JrWkdTa3BLVGs1T1VsSlNWbFpXV2xwYVhsNWVZbUppWm1abWFtcHFibTV1Y25KeWRuWjJlbnA2Zm41K2dvS0Nob2FHaW9xS2pvNk9rcEtTbHBhV3JwcWUycUt2QXFhN0pxckhRcTdQWHJMWGRyTGZpcmJqb3JMbnVxcm55cUxqMXA3ajNwYmY1cExiNm9yYjdvclg4b2JYOG9MVDlvTFQ5b0xUOW9iWDlvcmI5bzdmOXBiajlwcm45cDduOXFMcjlxTHY5cWJ2OXFidjlxcno5cXJ6OXFyejlxN3o5cTczOXE3MzlyYjc5cnIvOXNNSDhzc0w4dE1UOHRzWDh1TWY3dXNuNnZjcjZ3TXo1d3M3NHc4LzR4ZEQzeDlIM3lOTDJ5dFQxeTlYMHpkYnowTmZ5MHRueDFOcngxTnZ4MWR2eDF0engxOTN3Mk4zeDJkL3cyOS92M09IdjN1THY0T1B2NHVYdTVlZnU1K251NnV2dDdlM3U3dTd2NysvdzhQRHg4Zkh5OHZMejgvUDA5UFQxOWZYMjl2YjQrUGo1K2ZuNysvdjgvUHo5L2YzKy92NysvdjcrL3Y0eXpUSUkvZ0QvQ1J4SXNLREJnd2dUS2x6SXNLSERoeEFacWx2U0pLTEZpeGd6L2l0RDVNUUpJMm8waWh4Sk1na0hCd284UENISnN1VkRZa0ljeUpSUXhKL0xtemdMNG9vNWs0ak5uRUJkNGhvaTA0RUVuMEdUR2pRSFJVbVNMdzZIRmozNmsyR1hKVW1nVkZVS3NVa0tDaGg2akdrb3RlZldoR0o4YUtDUXdnblhpR1Y2Rk1WUWsyRlpvMGdYK2p1aVFhYUNIcmplUHFUaW9xaURGRmNZYmlNcWt3S1NobFpXS0pCWklFZEl3UTIzRWFGUWxJSVFad3lqcUtCQVFjVVV1MEk0Tng1eUZuUENLaXNNZzRqQ3NCc1VJa1drTklSU3dyQ0tMYTRkK2pPQ3dYQ1B5eXpSL0RDTTRVandoMXdLRngxUnhlV1lGZ1dLd2lqei9LR1NrdzRLL3NBdzQ1SU1qT3dwSzNaM1NDYkkyaFRxVy9wYlVvS0NoeUhJMXpNc1UyU0lWcHkvTkRGRUVtbm9oeE11VkVDUlJSWllYQ0VFRnI0WTZKb2FVaGpod3d3c2VBQkNDU1dJb0lFTExnaVJ4QlM4U0FpVVAxTVFNY01JR2toZzJJc09VS0JCQ1R3a0VZYUpCWkhUMmtOU0NKRkNjVEFHYVJnSExSZ2hSa2IreEpPY0VqUFl3RVJnRUhVeHhGZENWdmtpQmk0c2tWOURhQ3lSZ3cxTFFLblJFaURJQk1JUFZPeG9rRDlRMkFCa2tCSndCbGFNTGdySmdRK0pOV1RORXp4NElKTUk4V0drbkdFVW5FQ0VGd3VwY1VSdlFjN1lRZzlHbkZDQ0NqQWcwUU1NSi9RRkl3VXRQS0htUUZVRU1jS0xPY0NqMGFCWHVxQWJRbWNRNGVlTC9oU00wTU1SVTJ3NWtCcFVHSkhEQ0tvWmRzSVNuemJCUXE5RjhmQ3BRMHlVQ2VOeEI1MGhoS2FHbFNCRUZNcEVCVVVRakJvbXdoSG1IRlJHRGtHZVFKdElhaVRSd3B0bWprc1FHcysrcUVFT1VoeUxrRDlSOEFDdFRCOEFhNUFYS21SWGxBWXdPS0VOUzFvTWNZSnFDcmhBUmtIZ0hBRmVVU0lVY1laR1poaVJyVXppR3ZUdFpER3FZTVJZTjBrQnhBa2dzTEJTUVUyTTZtc1Q4amJrajFjdnVvQm9RVTZvQU1JSlFsUUhWREJVUE1HRlFWM0E4R0lLVUxqMFJHeWRBYkhsT2xVNGtXWjN0d3lCcmdodTNkVEVDVU15Z1NOQnZCbW1nUkV0QzZTR3JRa3A4YXBNTGN5TW94cEJ2UGdEMlFhUlFVUU9PUndCZDBGcXBEYVgvaEZiL3hQRnhTZm92TkF5UkdoUVFFcEpPSlJGQzBVcHdNS1JKcEt6V1dkNUxUU0dDLzVXZG5kQmZQMnJ0WWxkdU1DeEF5cDA0ZEFZTEdTK25VTmVTQ2NURDVzTDVzVFpFckIyT25hVXljQ2R5OFJOSi9oNi9nelJxd2ZxTW5SZDVqS1E1MUFWV011RXdSSVNmdHU0QzdzM2RIenV5amQwQmcrRytaQ09nV0d3TURvUTM5K09mUFlNK1RONWVET3dZZUFUMlRvRzBmWGhKZC9Wd3lOb2daTVpUaW5odjFOSlFKOUFuUEF3RG56T2ZOaURDUHlta3dXRGZDRUovL05mRXBvUU83RVJnUU9reVNBRk9JQ2Zna0FCV2lYUTMwUG9Wd0Q3UFFRTXFaT0pBUXN5QnZkb2tEUWdNRUkyR0pLRUVveXVLQVdnRHNwQUNKVVI0cTUrL2dKY0NCbCtLQUVnZVBCc0wvSkFEeGhpZzN2SlpsVURXY0tiU3RCREJBSVJJa1AwVnhFTDhvU0h3WW9EREFrRHVCUkF4aklxb0FVZ0c4Z1RRS2cyNi8yd2hFRlVpQmRXb0VVakVvUUtMVEJqR1IyUWd5b3FSQW8vQUpFZ1haQ0RrM0VOV2lDQW9odlBCNUZrRldXRkJIa1pEd1lKSWg5UTRTRnEyQUlXTm9rRkxaRE5KSHViM3h2SDB4Vm9qUUFMQjFFRGd6alpCVEc1aEFvcDRCZ0ZpaUJLUmdwbmZRNFFBU3IxQXdiUkZjVUdGUnlJZVRJSHU0ZWdRUzY1UTRPQjJPYXJuem5rRzBoNGxRZWc5NUFxeExJb1B3aGJVcER3SmcxUTB5Rm1PQUlNWm9BRVZ6SUVDZEI2bm9ta2NESExSR1FiNVJ1aERhSWxRZ09kQVpreS9sRUpWNWlBUkIrWWN6MUx1QmNQM09jeUtCakJDSXEwSExnOHQ3WFFlUzF4NmZNS1dGUlF0UFFaNFY3VTYxdm5pcEtDU3k0RURPZnhpdzNpV0pBb05FOG1HbEJDMy83eGhYa2FoNlFEUWNJSERET0NOaDRrQ3pONDBReGdxaFIvRU9NZ1RsQ1c4NGdnRFlWQTRRUWNVMEFLd0tBUU5BU0JXQ0NvYUVHQ29VMk1WQ01LUDdEQkVCWkdFRFZJelRBZkNKUkIyQ0FFREpBUkEwT28xcnhBU1RsbUZNUUxROGdCRU9LVkV5b0lvVGNLd0lBUXpCa0dseFlsYlFycGdoQlVvQUloUUE0aFUxQUJxYmg2cTdJcWdBTFNzb0pMdkVBRUt2bWxCTUFwaUJSU1FDZ2hIRU1oNkpEQzB4SmlCaDhNN1RRRkNaKy9PbGFFNm1ta0NqbEEvaGRLVHBEWlNKcE5ObExOeUJLODZJRURFa1FNUC94WER3NkxrVjBJRDBZYUtNSlBEWktHcHhyR0JoUExpRU03czlkVUZnNUdHQ0NDU09KeVE3Wkk3RFZJUStrM0xlS1BJcURMQmNRdENCbU1NSnFZelRBanZOQ2JtZERFa084WXhnVnBqRWhrUmdkSmhWaEJDQ3FMa1JDcWloQXAyRUFFSThpQkU3clJrREp3NzE4cUphOTVEZk8yaGt6akNUa1FnUWg2WUZPTWpFRUtVZ2ptUUpvZ1ZBZkFRSmtSNlVJZUlaYlFoWndCeEs1OVRocE0reThidlBER053N0x2WURRakpVK3hBa3p0WktRWVNTQ0Z2dVl0QXNkc3BJZDRNOGpQd1NkU3g0eUI4VHFaSVZVUVFVM2pQS0x6c2pZS2krRXUzUDVBQWpHVE9ZeWw5a0RieXBBL2crQTRlV0dsSFo4VGxpQ25PZE1aenBEQVo4RjRNRnkyNnlRTjgrRWxnN3BCbVBDMDRNOTh4a2hmc2FMTnUraVprTWYyaUNKcGtwVUJ0M29SNVBXQnh5VE5Ga29YV2hMSTVyR2VIbUlNemp0YUU4THBMU0dFVUlZcm9DRkJTMklrNXk4d2hYRTBEYks2Tm5Va0FhMUF6aGc1bDZYMlVNNHZEV3VDWUpxTFFzcHo2VTI5Umt3YmV3Z0tjQUdiaDMyUUhiUzdDQjVoc0JPaGtJTDZsUnRCMmpBQnZXVXRrQlE5SVBoelVBQ0dFaTN1dE10Z1J6UURnZ3hGdmNBb2NXQjNCb2tvRVh4Z0wzbExaQy9HU1lIMFRYSUdQeXFWRC95V3lEM1pNNFFDbFNRTXBUVk1FQ0k5c0VKd2dRdmFvQUhUbkNmUDg3UWhOaUNkZDhUand1TVNVRGdBZzk0d0FWQm5vclNKbjZRS1lSWHlTNm9MY3RSZGxJaHE4RElNLy9IeTFwQWdTd3pCd2JGeTdsQnJEQWwyWHBiQlVOZ3F0QVY0ZzhxRktIbUxUakNMcGRPOWFvbkpDQUFJZmtFQ1RJQS93QXNCZ0FCQUZnQVlRQ25BQUFBQVFFQkFnSUNBd01EQkFRRUJRVUZCZ1lHQndjSENBZ0lDUWtKQ2dvS0N3c0xEQXdNRFEwTkRnNE9EdzhQRUJBUUVSRVJFaElTRXhNVEZCUVVGUlVWRmhZV0Z4Y1hHQmdZR1JrWkdob2FHeHNiSEJ3Y0hSMGRIaDRlSHg4ZklDQWdJU0VoSWlJaUl5TWpKQ1FrSlNVbEppWW1KeWNuS0Nnb0tTa3BLaW9xS3lzckxDd3NMUzB0TGk0dUx5OHZNREF3TVRFeE1qSXlNek16TkRRME5UVTFOalkyTnpjM09EZzRPVGs1T2pvNk96czdQRHc4UFQwOVBqNCtQejgvUUVCQVFVRkJRa0pDUTBORFJFUkVSVVZGUmtaR1IwZEhTRWhJU1VsSlNrcEtTMHRMVEV4TVRVMU5UazVPVDA5UFVGQlFVVkZSVWxKU1UxTlRWRlJVVlZWVlZsWldWMWRYV0ZoWVdWbFpXbHBhVzF0YlhGeGNYVjFkWGw1ZVgxOWZZR0JnWVdGaFltSmlZMk5qWkdSa1pXVmxabVptWjJkbmFHaG9hV2xwYW1wcWEydHJiR3hzYlcxdGJtNXViMjl2Y0hCd2NYRnhjbkp5YzNOemRIUjBkWFYxZG5aMmQzZDNlSGg0ZVhsNWVucDZlM3Q3Zkh4OGZYMTlmbjUrZjM5L2dJQ0FnWUdCZ29LQ2c0T0RoSVNFaFlXRmhvYUdoNGVIaUlpSWlZbUppb3FLaTR1TGpJeU1qWTJOam82T2o0K1BrSkNRa1pHUmtwS1NrNU9UbEpTVWxaV1ZscGFXbDVlWG1KaVluNTJUcXFTS3VLMSt6THByM3NWWTZjeE43czlIOE5CRjhOQkY4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThOQkU4TkJFOE5CRThORkU4TkZFOE5GRThORkU4TkZFOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkY4TkZGOE5GRjhORkc4ZEZHOGRGRzhkRkc4ZEZIOGRGSDhkRkg4ZEZJOGRGSThkRko4ZEpKOGRKSjhkSks4ZEpLOGRKTDhkSkw4ZEpNOGRKTThkTk44ZE5POGROUDhkTlA4ZE5ROGROUThkTlI4dFJTOHRSUzh0UlQ4dFJWOHRWVzh0Vlk4dFpaOHRaYjh0ZGU4OWRnODloaTg5aGo4OWhqODloazg5bG04OWxvOU5wcTlOcHI5TnBzOU50dDlOdHc5Tnh5OU54ejlOMTE5TjEyOU4xMzlOMTU5ZDU3OWQ5KzlkK0E5ZUNEOWVHRzl1S0s5dU9OOXVPUTkrV1grT2lrK091dStlMjQrdS9DK3ZISit2SElNczB5Q1A0QS93a2NTTENnd1lNSURmWUxOeTZodzRjUUkwcWNXSS9iTW1mZDhrM2N5TEhqUm0vSGN1VTZWczZqeVpNbitXMFRLYkpiUDVRd1l6N2N4NDFsTG00dlplcmMrWSttVFpjOGd4THNaKzdidDNnU2ZiTEVLUkhlTjIvbGNncDFPTTVaTDJEWjVrVlVLcElwUkhuWmdQVnlWbkpxUW5yWldQWUNPclBtVXFrSisza0R4aktiUHJNSTFVV3o2YXdkeEg1dWMvWHlGcEhkTTVheHJtbkVxNUJiTDdYYjRDSTBaM1ZzT29qNnRqMFcyY3NyNDRMcURyTk1odTV2T1c3ZFNrTXNwNHd2dk04SCszV2pXM2V4VG54cFdRTHJCaHNoUEdzMms2bmpPZTlaTEpiVzZQVkcrQzFrcmxqSmVkS3pkbnhrdytVSDZXa1ROdmI2em43ZmxQNzFPc2JOTnZhQzlMcHhpeXFVM3podTMvQ2RoN2xQSFRwNDd0cTE0K2FPMzN5OCtLRFRUVGJXUEhOTU1zb29rNHd3MFZpenpUZnArUGRmVFAyazA0MDF5dEJtMDRiakxaUE5OL0xNMTQ5a0c2R3pqVlVicHFqaU1kRjBFNkpKSTBwMHp6ZldXRFBPWFJ2Qnd3MktLdmFZb2pEV2hHTmVSUGpRYU0wMyswQVVUaklpSFpPTk9pVEdWbzQxR3FyNFdDOVgramhTTnV4STFFODUxemlYakhjSTNaTWJTeGk5NWxBKzNyU21vakRLUkpOTk44NDQ4NHcxM2hDNFRKVnFSY09lUSt0c3c2Uk4xMFE1a0prcDltS05hZ2ZadzQxek52V2lURGJlb0NQZlFmbW8wODAxeVd6R1Z6aUcvalBPTTU3V0ZhcEFTNnFZelpBQzJiT05NUDRwS3JNTk9oSmlaczQyeTZTWWpEZFJUcWVpTStaQWxNODMwWlNhaTNBRzNjTU5yRFlCY3cwNnB5TFVEenJYTU12U01kK1FDSTh6MVlrRWpEVi9RcVFqajdsRU54UklHeWJUalQwbzFkT05tMmdHaXg1d25HR2tGVWZvWkxQTU1jK1VSZEE0OElya3pEalJSdFJQVlJ0YW8rYS96aHl6ekRaZG1zU1BPdVFzUE5Cdkd3TExVem1pY2JiTmtQMnNNdzZVVStualdIQms2b1R3dGVITVowN0F3ckFGRVQ2c1N0dWNUZEVndFJ3KzJteVl6YVVQemNQTk5kZDRVN05CK0dpbUZtL0xvUk93TThOQjVNK3lUWDRqa1R0N3NmVE1pNThCNXVsYUJmOHpEM1VpSlFiMFEzUHAxakpzOEdRdHNNVU95V01jY3NwRmhERkxpc0ZHRHY2a040WDlqenpSZEd2dVg5MTRta3pFZUhsOUxhTmZCVTczUk9vNG81dlZqTlZEcjBqVzFETVI0SUxYSFZFOTE5aVVqZDhteVMwNjZady83dVhKejFsenRsQ3NxVVhZNW5OajdubEU0MENhRE55ZkcrVzc3K3dXdFBlMUtUOGtkK2NieFM1U01uNFZGTS92dnBPakVUNlBZbW45ZU9VVlZBNmt5dkFldCtPMmJ4UlB4OGVJVTlBOHIxNlA1VEc4aHRlak11c1VOSTYxM1c4MEQvamwzZzRSUFIzbnNvMzJmTFBKTWJSaERXdHQ2QmlNKzhjM05LUU1uVW5rZnNpYkNBUlpvZzBBOW1nODhiamNocUp4cjRHVWczN2VTOGdFd3pjUmVQU3ZnZ1RSUzQrc2daUjgxZWlGMXJpR3Z6eW91OHRJRUgrRGk0ZzRCalVTOHcxbEhQN1hzRWFEb3RHZ0p3MGtIL25SVHp2YzhUcUIzSXd6czVOSTZrZ29rZm1OeGgwSHdVY1M5UU9QSkhVa0haTGpETk1lV0x2OFRVUnh5d3VoVHVMaHRuTGhLQ0pqcTA0c1ZqVVJSQ0duaVR6SngwclFwRWFGb0dza2xKUElPc0lva3RGOUptM2VDdVRudkZFamI3d3hJb2pNQlREV3hoaW5FUXFQRG9tUi9UUzRqRDdxeEI1bkdza016U0lPdnRtbE45OHc0TSs4WkE1dnBFYUNHaFNHRDluV1JtRW9NaTVWd1pJekVpaXQyZGdraDRlc0V0UWdra0hCQmM4aDZDQ2tKRy81bVF6NlRITU8rYU5JNnVjUWQyaXdYTkFVU2o5cTlTOGVTbEptQnlsSHJ0RGt3SVBjUTJtakdhVkErRUc2MkppRFFOem9vRUR5d2JvbUZZOGdTZjdiVEdlNFdSRHc4SzB6L25BZU42eVJEV2g1UkIzYmNCTXd0dkhJdjEwelp3NkJ4NG1jRVUrSGdERmgra3NhWFhyeE1NVFpiVWVsNnFSQmtoa3BidkN6bitrZ1dVSkFtVEViRW1SODNScExOL1NIa0hWUUtVWE80SjAvZzZQT2pqeXhTYk44S2Y1RUlveXN0TVZZdVlqWlNmL0JzMUpaNHg0b3Vadkh2RmdRZWhwUWpBOUJDNGN3a2syRGhNWW13cUJrUjJSVEpSYWVoVTdHc3NhcDlvSE9ZeG54SVQ4MW8wY01JOENnMWxSUWF2RU1RdEJoaldRa1E0WmhBeDFZbVdtd3dvbnVhUDBFazErejRVbUJ6QU1kbHRwSTduNkp5WWoyanpRYnVRZGt1eW9VM0lEMUdsZ0NobWhIUzlyU1lxVksyZ2pvaEI0eVdTMjVWbGN1WGY1dFFnVDcydG9Xc3FHeVBVZ2tiZXVqWTl3enR3VVpKRzlkeTBIZ1pqVjB1am1HY3BmTDNPWWV3MU56WEtweEI4TFN1cERqRytISXJuYTNtOTF2bENPVTJaRHVkUDlSM2E2Y01UQzVDTzk0RVZMZXZpVUZ2ZXBkcjBIYXExZUhjQ1c5NHAwdWZmMTIzL2pLbHlEMFBhL284bXZjOW01REhrdDBoNElYek9EOHlLTm5lQ013Y050N0lMOWErTUlZWGhDaEpKemJlb1J5dUNueTczOWI5V0VRLzFLMUl4Wklaa3hzcGNpa21DRGxhQ09MdjRYRkZ3K2tRdG53MURHdVlWclNoc2ttMnFDcGpjbGhyV1BJaXpsRlByS05DZkl5UWtIMUlHUGpTem1YVE9KbWNhT0o5ZGdHYWxGTTVZR1VFcXpaS0FjK1JuUVBjdkJZZ0QybHNqbFcwMlVONWJZNXhJaGRNanI2OTlwbzFMakxCeEdITXJXMFN6empzbGhhVWhRdi9Wd1Fkb0EwUmNDZzZKUUpIUnROS2JORkh2MU1RQUFBSWY0VlRXRmtaU0IzYVhSb0lGTmpjbVZsYmxSdlIybG1BRHM9IiA+ICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fbW9uZXkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fYW1vdW50X21vbmV5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9tb25leV9zaWduIj7CpTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX21vbmV5X251bSI+JHtyZXNwLnlvdWh1aXF1YW59PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY29uZGl0aW9uIj4ke3Jlc3AuY291cG9uX2luZm99PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX3RpbWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fdGVybSI+5pyJ5pWI5pyfPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InpobV9kYXRlIj4ke3Jlc3AuY291cG9uX2VuZF90aW1lfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ6aG1fY2lyY2xlIj48L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iemhtX2xpbmtfY291cG9uIiBzdHlsZT0ibWFyZ2luLXJpZ2h0OiI+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iemhtX2xpbmtfdGV4dCIgb25jbGljaz0id2luZG93Lm9wZW4oJyR7cmVzcC5jb3Vwb25fbGlua30nKSI+6aKG5Y+WPC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobV9kaXZfcycpLmlubmVySFRNTD1odG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0sY291cG9uV2FpdFRpbWUpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheVZpZGVvQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xhc3MgUGxheU11c2ljQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCl7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB4bWx5Q3JlYXRlQ2hlY2tib3goKXsKCiAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0bGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc291bmQtbGlzdCB1bCBsaScpOwoKICAgICAgICAgICAgICAgIHNvdW5kTGlzdGxpLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjaGVja2JveGVkID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjaGVja2JveGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gaXRlbS5xdWVyeVNlbGVjdG9yKCcudGV4dCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdGl0bGUuc3R5bGUgPSAid2lkdGg6MzYwcHgiOwoKICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gdGl0bGUucXVlcnlTZWxlY3RvcignYScpLmdldEF0dHJpYnV0ZSgnaHJlZicpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3REb20gPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5pY29uLXdyYXBwZXInKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RG9tID0gZmlyc3REb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICBpbnB1dERvbS5zdHlsZT0gJ21pbi13aWR0aDogMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgIGlucHV0RG9tLmlubmVySFRNTCA9ICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3pobUNoZWNrYm94JyB2YWx1ZT0iK3NyYysiID4iOwoKICAgICAgICAgICAgICAgICAgICBmaXJzdERvbS5iZWZvcmUoaW5wdXREb20pOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjbGFzcyBaaENsYXNzIGV4dGVuZHMgQmFzZUNsYXNzewoKICAgICAgICAgICAgY29uc3RydWN0b3IoKXsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2hvd1NwZWNpYWxDb2x1bW4oKXsKCiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmID09ICdodHRwczovL3d3dy56aGlodS5jb20vJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBjYXJkUmVjb21tZW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkZlZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFJlY29tbWVuZC5sZW5ndGggPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFJlY29tbWVuZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignLnNwZWNpYWxDb2x1bW4nKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudHlwZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlID09ICdQb3N0Jyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmEnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRpdGxlKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAnc3BlY2lhbENvbHVtbiBCdXR0b24gVm90ZUJ1dHRvbiBWb3RlQnV0dG9uLS11cCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnbGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjBweCA1cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfmlofnq6AnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS5iZWZvcmUobmV3RWxlbWVudCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7CiAgICAgICAgICAgICAgICAgICAgbGV0IG49MDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRTZWFyY2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuU2VhcmNoUmVzdWx0LUNhcmQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKz42MDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhcmRTZWFyY2gubGVuZ3RoID4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkU2VhcmNoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ucXVlcnlTZWxlY3RvcignLnNwZWNpYWxDb2x1bW4nKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS16YS1leHRyYS1tb2R1bGUnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhWm9wKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBkYXRhWm9wLmNhcmQuY29udGVudC50eXBlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlYXJjaCcsdHlwZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1Bvc3QnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3NwZWNpYWxDb2x1bW4gQnV0dG9uIFZvdGVCdXR0b24gVm90ZUJ1dHRvbi0tdXAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdsaW5lLWhlaWdodDoyMHB4O3BhZGRpbmc6MHB4IDVweDttYXJnaW4tcmlnaHQ6NXB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVyVGV4dCA9ICfmlofnq6AnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzaG93VmlkZW9UaXRsZSgpewoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRSZWNvbW1lbmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihjYXJkUmVjb21tZW5kLmxlbmd0aCA+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkUmVjb21tZW5kLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVpvcClyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ZpZGVvID0gZGF0YVpvcC5jYXJkLmhhc192aWRlbzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihoYXNWaWRlbyA9PSB0cnVlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+ZGl2PmEnKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5kaXY+YScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2Rpdj5kaXY+aDI+c3Bhbj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSAndmlkZW9UaXRsZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGUgPSAnYmFja2dyb3VuZDogcmdiYSgyNTUsIDEzMSwgODYsIDAuMTIpO2NvbG9yOiByZ2IoMjU1LCA3MywgMTIpO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzoxcHggNnB4O21hcmdpbi1yaWdodDo1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn6KeG6aKRJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYmVmb3JlKG5ld0VsZW1lbnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvc2VhcmNoLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgbj0wOwoKICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXI9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZFNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5TZWFyY2hSZXN1bHQtQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjYwMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FyZFNlYXJjaC5sZW5ndGggPjApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRTZWFyY2guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5xdWVyeVNlbGVjdG9yKCcudmlkZW9UaXRsZScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFab3ApcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGRhdGFab3AuY2FyZC5jb250ZW50LnR5cGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ1p2aWRlbycgKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignZGl2PmRpdj5oMj5zcGFuPmRpdj5hJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGl0bGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gJ3ZpZGVvVGl0bGUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZSA9ICdiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTMxLCA4NiwgMC4xMik7Y29sb3I6IHJnYigyNTUsIDczLCAxMik7bGluZS1oZWlnaHQ6MjBweDtwYWRkaW5nOjFweCA2cHg7bWFyZ2luLXJpZ2h0OjVweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lclRleHQgPSAn6KeG6aKRJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmJlZm9yZShuZXdFbGVtZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVZpZGVvKCl7CgogICAgICAgICAgICAgICAgbGV0IGNhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuRmVlZCcpOwoKICAgICAgICAgICAgICAgIGNhcmQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKGl0ZW0uZ2V0QXR0cmlidXRlKCdkYXRhLXphLWV4dHJhLW1vZHVsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZGF0YVpvcC5jYXJkLmNvbnRlbnQudmlkZW9faWQ7CgogICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50Tm9kZS5zdHlsZT0nZGlzcGxheTpub25lOyc7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUFEKCl7CgogICAgICAgICAgICAgICAgbGV0IHpoSGlkZUFEID0gYC5QYy1jYXJkLC5QYy13b3Jke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O30uVG9wc3RvcnlJdGVtLS1hZHZlcnRDYXJke2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fWA7CgogICAgICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHpoSGlkZUFEKSk7CgogICAgICAgICAgICAgICAgZG9tSGVhZC5hcHBlbmRDaGlsZChkb21TdHlsZSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvd25sb2FkVmlkZW8oKXsKCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLChlKT0+ewoKICAgICAgICAgICAgICAgICAgICBpZihlLnRhcmdldC5pbm5lclRleHQgPT0gJ+S4i+i9vScpewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZGVvSWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuWlZpZGVvLXBsYXllcicpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgelZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLlpWaWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RhdGEgPSBKU09OLnBhcnNlKHpWaWRlby5nZXRBdHRyaWJ1dGUoJ2RhdGEtemEtZXh0cmEtbW9kdWxlJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSWQgPSB2aWRlb0RhdGEuY2FyZC5jb250ZW50LnZpZGVvX2lkOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvVXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvT2JqID0gdmlkZW9Vcmwuc3BsaXQoJz8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0lkID0gdmlkZW9PYmpbMF0uc3BsaXQoJy8nKS5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICdodHRwczovL2xlbnMuemhpaHUuY29tL2FwaS92NC92aWRlb3MvJyt2aWRlb0lkOwoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0KCdnZXQnLHVybCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucGxheWxpc3QgIT0gdW5kZWZpbmVkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlfdXJsID0gZGF0YS5wbGF5bGlzdC5MRC5wbGF5X3VybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvTmFtZSA9IHZpZGVvSWQrIi5tcDQiOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZChwbGF5X3VybCx2aWRlb05hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+S4i+i9veWksei0pe+8gScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLChlKSA9PiB7CgogICAgICAgICAgICAgICAgICAgIGlmKCFlLnJlbGF0ZWROb2RlLnF1ZXJ5U2VsZWN0b3IpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlCYXIgPSBlLnJlbGF0ZWROb2RlLnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IGRpdjpsYXN0LWNoaWxkID4gZGl2OmZpcnN0LWNoaWxkID4gZGl2Om50aC1vZi10eXBlKDIpJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5QmFyIHx8IHBsYXlCYXIucXVlcnlTZWxlY3RvcignLnpobURvd25sb2FkJykpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlCdXQgPSBwbGF5QmFyLnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IGRpdjpsYXN0LWNoaWxkJyk7CgogICAgICAgICAgICAgICAgICAgIGlmKCFwbGF5QnV0KSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIHZhciBwbGF5QnV0TGkgPSBwbGF5QnV0LnF1ZXJ5U2VsZWN0b3IoJ2RpdjpmaXJzdC1jaGlsZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZighcGxheUJ1dExpKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZEJ1dCA9IHBsYXlCdXRMaS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LmNsYXNzTmFtZSA9IHBsYXlCdXRMaS5jbGFzc05hbWUgKyAnIHpobURvd25sb2FkJzsKCiAgICAgICAgICAgICAgICAgICAgaWYoIWRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0LnF1ZXJ5U2VsZWN0b3IoJy5fMXRnOG9pcicpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgcGxheUJ1dExpLmJlZm9yZShkb3dubG9hZEJ1dCk7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlUmlnaHQoKXsKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYubWF0Y2goL15odHRwcz86XC9cL3d3d1wuemhpaHVcLmNvbVwvcGVvcGxlXC8uKi8pKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgemhGdWxsU2NyZWVuID0gYC5HbG9iYWxTaWRlQmFyIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5jc3MtMXF5eXRqN3tkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fQogICAgICAgICAgICAgICAgICAgIC5RdWVzdGlvbi1zaWRlQ29sdW1ue2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fQogICAgICAgICAgICAgICAgICAgIC5Ub3BzdG9yeS1tYWluQ29sdW1ue3dpZHRoOjEwMCUgIWltcG9ydGFudH0KICAgICAgICAgICAgICAgICAgICAuUXVlc3Rpb24tbWFpbkNvbHVtbnt3aWR0aDoxMDAwcHggIWltcG9ydGFudH0KICAgICAgICAgICAgICAgICAgICAuY3NzLWNhemc0OHttYXJnaW46IDBweCAxNnB4IDBweCAwcHggIWltcG9ydGFudDt9CiAgICAgICAgICAgICAgICAgICAgLlF1ZXN0aW9uV2FpdGluZy1tYWluQ29sdW1ue3dpZHRoOjEwMCUgIWltcG9ydGFudDt9CiAgICAgICAgICAgICAgICAgICAgLmNzcy0xajVkM2xse3BhZGRpbmctbGVmdDoxMHB4O30KICAgICAgICAgICAgICAgICAgICAuY3NzLXloandvZXtqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW4gIWltcG9ydGFudDt9CiAgICAgICAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAgIGRvbVN0eWxlIC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh6aEZ1bGxTY3JlZW4pKTsKCiAgICAgICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGFuZ2VMaW5rKCl7CgogICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLmluZGV4T2YoJ3RhcmdldCcpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHRoaXMuZ2V0VXJsUGFyYW1zKGNvdXBvblVybCk7CgogICAgICAgICAgICAgICAgICAgIGlmKG9iai50YXJnZXQgPT0gdW5kZWZpbmVkKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZGVjb2RlVVJJQ29tcG9uZW50KG9iai50YXJnZXQpOwoKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxpbms7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlS2V5d29yZCgpewoKICAgICAgICAgICAgICAgIHZhciBHTUtleXdvcmQgPSBHTV9nZXRWYWx1ZSgnaW5wdXRaaEtleXdvcmQnLCcwJyk7CgogICAgICAgICAgICAgICAgaWYoR01LZXl3b3JkID09ICcwJyB8fCBHTUtleXdvcmQgPT0gJycpIHJldHVybjsKCiAgICAgICAgICAgICAgICBsZXQga2V5d29yZCA9IEdNS2V5d29yZC5zcGxpdCgnLCcpOwoKICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkNvbnRlbnRJdGVtJyk7CgogICAgICAgICAgICAgICAga2V5d29yZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBjb250ZW50LmZvckVhY2goZnVuY3Rpb24odmFsdWUpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFab3AgPSBKU09OLnBhcnNlKHZhbHVlLmdldEF0dHJpYnV0ZSgnZGF0YS16b3AnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhWm9wICYmIGRhdGFab3AudGl0bGUuaW5kZXhPZihpdGVtKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1DYXJkID0gdmFsdWUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1DYXJkQ2xhc3M9IGl0ZW1DYXJkLmNsYXNzTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtQ2FyZENsYXNzLmluZGV4T2YoJ1RvcHN0b3J5SXRlbS1pc1JlY29tbWVuZCcpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNhcmQuc3R5bGU9J2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlQXV0aG9yTmFtZSgpewoKICAgICAgICAgICAgICAgIHZhciBHTUF1dGhvck5hbWUgPSBHTV9nZXRWYWx1ZSgnaW5wdXRaaEF1dGhvck5hbWUnLCcwJyk7CgogICAgICAgICAgICAgICAgaWYoR01BdXRob3JOYW1lID09ICcwJyB8fCBHTUF1dGhvck5hbWUgPT0gJycpIHJldHVybjsKCiAgICAgICAgICAgICAgICBsZXQgYXV0aG9yTmFtZSA9IEdNQXV0aG9yTmFtZS5zcGxpdCgnLCcpOwoKICAgICAgICAgICAgICAgIC8v5pCc57Si6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlckxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ2FyZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodXNlckxpbmsubGVuZ3RoID4gNSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbmsuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdiJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGF1dGhvci5pbm5lclRleHQpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG4+MzApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMTAwKQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v5Zue562U6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9xdWVzdGlvblwvLiovKSl7CgogICAgICAgICAgICAgICAgICAgIGxldCBpdGVtRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkxpc3QtaXRlbScpOwoKICAgICAgICAgICAgICAgICAgICBpZihpdGVtRG9tLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Eb20uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLkNvbnRlbnRJdGVtJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZShjb250ZW50LmdldEF0dHJpYnV0ZSgnZGF0YS16b3AnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvck5hbWUuaW5kZXhPZihkYXRhWm9wLmF1dGhvck5hbWUpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSAnZGlzcGxheTpub25lJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+etieS9oOWbnuetlOmhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZiA9PSAnaHR0cHM6Ly93d3cuemhpaHUuY29tL3F1ZXN0aW9uL3dhaXRpbmcnKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXN0aW9uTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qc05hdmlnYWJsZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYocXVlc3Rpb25MaXN0Lmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbkxpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvckRvbVRleHQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5jc3MtdG5zYXhoJykuaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JEb21UZXh0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRob3IgPSBhdXRob3JEb21UZXh0LnJlcGxhY2UoJyInLCcnKS5yZXBsYWNlKCfnmoTmj5Dpl64nLCcnKS5yZXBsYWNlKC8oXlxzKyl8KFxzKyQpL2csJycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRob3JOYW1lLmluZGV4T2YoYXV0aG9yKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGU9J2Rpc3BsYXk6bm9uZTsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/mjqjojZDpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudEl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhWm9wID0gSlNPTi5wYXJzZSh2YWx1ZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtem9wJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0aG9yTmFtZS5pbmRleE9mKGRhdGFab3AuYXV0aG9yTmFtZSkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQ2FyZCA9IHZhbHVlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1DYXJkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNhcmQuc3R5bGU9J2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZVlhbnh1YW4oKXsKCiAgICAgICAgICAgICAgICAvL+WbnuetlOmhtQogICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3LnpoaWh1LmNvbVwvcXVlc3Rpb25cLy4qLykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbURvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5MaXN0LWl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaXRlbURvbS5sZW5ndGg+MCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtRG9tLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRlbnQgJiYgY29udGVudC5pbm5lclRleHQuaW5kZXhPZign55uQ6YCJJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxldCBhbnN3ZXJDYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFuc3dlckNhcmQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoYW5zd2VyQ2FyZCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGFuc3dlckNhcmQucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tT3JkaW5hcnlMYWJlbC1jb250ZW50Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjb250ZW50ICYmIGNvbnRlbnQuaW5uZXJUZXh0LmluZGV4T2YoJ+ebkOmAiScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJDYXJkLnN0eWxlID0gJ2Rpc3BsYXk6bm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v5pCc57Si6aG1CiAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3cuemhpaHUuY29tXC9zZWFyY2gvKSl7CgogICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7CgogICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjYXJkTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5DYXJkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihjYXJkTGlzdC5sZW5ndGggPiA1KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLktmZUNvbGxlY3Rpb24tUGNDb2xsZWdlQ2FyZC10eXBlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGUgJiYgdHlwZS5pbm5lclRleHQuaW5kZXhPZign55uQ6YCJ5LiT5qCPJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhvciA9IGl0ZW0ucXVlcnlTZWxlY3RvcignYicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0aG9yWWFueHVhbiA9IFsn5pWF5LqL5qGj5qGI5bGAJywgJ+ebkOmAieaOqOiNkCcsICfnm5DpgInnp5Hmma4nLCAn55uQ6YCJ5oiQ6ZW/6K6h5YiSJywgJ+efpeS5juebkOmAieS8muWRmCcsICfnn6XkuY7nm5DpgInliJvkvZzogIUnLCAn55uQ6YCJ5b+D55CGJywgJ+ebkOmAieWBpeW6t+W/heS/ruivvicsICfnm5DpgInlpYflppnnianor60nLCAn55uQ6YCJ55Sf5rS76aaGJywgJ+ebkOmAieiBjOWcuicsICfnm5DpgInmloflrabnlITpgIknLCAn55uQ6YCJ5L2c6ICF5bCP566h5a62JywgJ+ebkOmAieWNmueJqemmhicsICfnm5DpgInngrnph5EnLCAn55uQ6YCJ5rWL6K+E5a6kJywgJ+ebkOmAieenkeaKgOWJjeayvycsICfnm5DpgInkvJrlkZjnsr7lk4EnLCAn5Y6G5Y+y546v5ri46K6wJ107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1dGhvciAmJiBhdXRob3JZYW54dWFuLmluZGV4T2YoYXV0aG9yLmlubmVyVGV4dCkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG51bT4zMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy/mjqjojZDpobUKICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vd3d3LnpoaWh1LmNvbS8nKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuQ29udGVudEl0ZW0nKTsKCiAgICAgICAgICAgICAgICAgICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5LZmVDb2xsZWN0aW9uLU9yZGluYXJ5TGFiZWwtY29udGVudCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudCAmJiBjb250ZW50LmlubmVyVGV4dC5pbmRleE9mKCfnm5DpgIknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICdkaXNwbGF5Om5vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjbGFzcyBWaWRlb0Rvd25sb2FkQ2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3N7CgogICAgICAgICAgICBjb25zdHJ1Y3RvcigpewoKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGR5VmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnhnLXZpZGVvLWNvbnRhaW5lcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdnNOYXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZnV5X3dtY3Q6bnRoLW9mLXR5cGUoNSknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh2c05hdiAmJiB2c05hdi5jbGFzc05hbWUuaW5kZXhPZignTFhYNzlsZTUnKSAhPSAtMSkgfHwgY291cG9uVXJsLmluZGV4T2YoJ3ZzZGV0YWlsJykgIT0gLTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+e7vOiJuuagj+ebruWFs+mXreS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRHlWaWRlb0Rvd25sb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0luZGV4ID0gdmlkZW9QbGF5RG9tQWxsLmxlbmd0aD4xP3ZpZGVvUGxheURvbUFsbC5sZW5ndGgtMjp2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTE7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9QbGF5RG9tID0gdmlkZW9QbGF5RG9tQWxsW3ZpZGVvSW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgdmlkZW9QbGF5RG9tID0gdmlkZW9QbGF5RG9tQWxsLmxlbmd0aD4xP3ZpZGVvUGxheURvbUFsbFt2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTJdOnZpZGVvUGxheURvbUFsbFt2aWRlb1BsYXlEb21BbGwubGVuZ3RoLTFdOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9QbGF5RG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7nu5PmnZ8iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXV0b1BsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctc3dpdGNoLWNoZWNrZWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRvUGxheSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLk51NjZQX2JhJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjY291bnQgPSBpbmZvW3ZpZGVvSW5kZXgqMl0uaW5uZXJUZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUFyciA9IGluZm9bdmlkZW9JbmRleCoyKzFdLmlubmVyVGV4dC5zcGxpdCgnIycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHRpdGxlQXJyWzBdP3RpdGxlQXJyWzBdOnRpdGxlQXJyWzFdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKHZpZGVvUGxheURvbS5jaGlsZHJlblswXS5zcmMsdGl0bGUrYWNjb3VudCsiLm1wNCIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0NvcHknKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W3suWkjeWItuWIsOWJqui0tOadvycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZCh2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih2aWRlb1BsYXlEb20uY2hpbGRyZW5bMF0uc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGdldENvbnRyb2xzKTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5jb2RlPT0nQXJyb3dEb3duJyB8fCBlLmNvZGU9PSdBcnJvd1VwJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBpbnNlcnRlZERvbSgpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJ3ZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9Eb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsKGUpID0+IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZERvbSgpOwoKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGdldENvbnRyb2xzKTsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3JlYXRlRHlWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xBbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcueGctcmlnaHQtZ3JpZCcpOwoKICAgICAgICAgICAgICAgIGxldCBjb250cm9scyA9IGNvbnRyb2xBbGwubGVuZ3RoPjE/Y29udHJvbEFsbFtjb250cm9sQWxsLmxlbmd0aC0yXTpjb250cm9sQWxsW2NvbnRyb2xBbGwubGVuZ3RoLTFdOwoKICAgICAgICAgICAgICAgIGxldCB2aWRlb0Rvd25sb2FkRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobURvdXlpbkRvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgaWYodmlkZW9Eb3dubG9hZERvbSl7CgogICAgICAgICAgICAgICAgICAgIHZpZGVvRG93bmxvYWREb20ucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHZpZGVvRG93bmxvYWREb20ucGFyZW50Tm9kZSk7CgogICAgICAgICAgICAgICAgICAgIC8vdmlkZW9Eb3dubG9hZERvbS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucGFyZW50Tm9kZSkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsZXQgcGxheVNldGluZyA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJyk7CgogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkRG9tID0gcGxheVNldGluZy5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi1yaWdodDoyMHB4Oyc7CgogICAgICAgICAgICAgICAgLy9sZXQgZG93bmxvYWRUZXh0ID0gZG93bmxvYWREb20ucXVlcnlTZWxlY3RvcignZGl2OmZpcnN0LWNoaWxkID4gc3BhbjpmaXJzdC1jaGlsZCcpOwoKICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFRleHQgPSBkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCdkaXY6Zmlyc3QtY2hpbGQnKTsKCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgIGRvd25sb2FkVGV4dC5zdHlsZSA9ICdmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7JzsKCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdpZCcsJ3pobURvdXlpbkRvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgbGV0IGRldGFpbCA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ3hnLWljb246bnRoLW9mLXR5cGUoMSknKS5jaGlsZHJlblswXTsKCiAgICAgICAgICAgICAgICBsZXQgbGlua1VybCA9IGRldGFpbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKT9kZXRhaWwuZ2V0QXR0cmlidXRlKCdocmVmJyk6bG9jYXRpb24uaHJlZjsKCiAgICAgICAgICAgICAgICBpZihsaW5rVXJsLmluZGV4T2YoJ3d3dy5kb3V5aW4uY29tJyk9PS0xKXsKCiAgICAgICAgICAgICAgICAgICAgbGlua1VybD0nLy93d3cuZG91eWluLmNvbScrbGlua1VybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkb3dubG9hZFRleHQuc2V0QXR0cmlidXRlKCdkYXRhLXVybCcsbGlua1VybCk7CgogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7CgogICAgICAgICAgICAgICAgZG93bmxvYWRUZXh0LnNldEF0dHJpYnV0ZSgnaHJlZicsJ2phdmFzY3JpcHQ6dm9pZCgwKTsnKTsKCiAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5jbGFzc05hbWU9J3hncGxheWVyLXBsYXliYWNrLXNldHRpbmcgc2xpZGUtc2hvdyc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLm9ubW91c2VvdXQ9ZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uY2xhc3NOYW1lPSd4Z3BsYXllci1wbGF5YmFjay1zZXR0aW5nJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRIdG1sID0gJyc7CgogICAgICAgICAgICAgICAgZG93bmxvYWRPcHRpb24uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRIdG1sICs9IGA8ZGl2IGNsYXNzPSJ4Z3BsYXllci1wbGF5cmF0aW8taXRlbSAke2l0ZW0uaWR9IiBpZD0iJHtpdGVtLmlkfSI+JHtpdGVtLm5hbWV9PC9kaXY+YDsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1wbGF5cmF0aW8td3JhcCcpLmlubmVySFRNTCA9IGRvd25sb2FkSHRtbDsKCiAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItc2xpZGVyJykuc3R5bGU9J3dpZHRoOjYwcHggaW1wb3J0YW50Oyc7CgogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWF1dG9wbGF5LXNldHRpbmcnKTsKCiAgICAgICAgICAgICAgICBhdXRvUGxheS5hZnRlcihkb3dubG9hZERvbSk7CgogICAgICAgICAgICAgICAgbGV0IGRpdkRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwoKICAgICAgICAgICAgICAgIGRpdkRvbS5zdHlsZT0icG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6LTk5OTtoZWlnaHQ6ODBweDt3aWR0aDo0MHB4O21hcmdpbi10b3A6LTgwcHg7IgoKICAgICAgICAgICAgICAgIGRvd25sb2FkRG9tLmFwcGVuZENoaWxkKGRpdkRvbSk7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlsRG9tID0gY29udHJvbHMucXVlcnlTZWxlY3RvcigneGctaWNvbjpudGgtb2YtdHlwZSgxKScpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgeGdJY29uID0gZGV0YWlsRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoeGdJY29uLmNoaWxkcmVuWzFdICYmIHhnSWNvbi5jaGlsZHJlblsxXS5jbGFzc05hbWU9PSd4Zy10aXBzJyl7CgogICAgICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMV0uaW5uZXJIVE1MPSfkuIvovb3op4bpopEnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgeGdJY29uLmNsYXNzTmFtZT0neGdwbGF5ZXItZGV0YWlsLWVudHJ5JzsKCiAgICAgICAgICAgICAgICAgICAgeGdJY29uLmNoaWxkcmVuWzBdLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MTZweDsnOwoKICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKCdpZCcsJ3pobURvdXlpbkRvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVXJsID0geGdJY29uLmNoaWxkcmVuWzBdLmdldEF0dHJpYnV0ZSgnaHJlZicpP3hnSWNvbi5jaGlsZHJlblswXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTpsb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKCdkYXRhLXVybCcsbGlua1VybCk7CgogICAgICAgICAgICAgICAgICAgIHhnSWNvbi5jaGlsZHJlblswXS5yZW1vdmVBdHRyaWJ1dGUoJ3RhcmdldCcpOwoKICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMF0uc2V0QXR0cmlidXRlKCdocmVmJywnamF2YXNjcmlwdDp2b2lkKDApOycpOwoKICAgICAgICAgICAgICAgICAgICB4Z0ljb24uY2hpbGRyZW5bMF0uaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdkZXNjJyBzdHlsZT0nZm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MjBweDsnPuS4i+i9vTwvZGl2PiI7CgogICAgICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Z3BsYXllci1hdXRvcGxheS1zZXR0aW5nJyk7CgogICAgICAgICAgICAgICAgICAgIGF1dG9QbGF5LmFmdGVyKHhnSWNvbik7CiAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGtzVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnBsYXllci12aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKS5tYXRjaCgvXmJsb2IvKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYmxvYuinhumikeaXoOazleS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlS3NWaWRlb0Rvd25sb2FkKHZpZGVvRG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLGZ1bmN0aW9uKCl7IC8v5pKt5pS+5LitCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+5LitIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Eb20uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLGZ1bmN0aW9uKCl7IC8v57uT5p2fCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuaSreaUvue7k+adnyIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXdhcnBwZXInKS5nZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXV0b1BsYXkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfmraPlnKjkuIvovb3or7fnqI3kvq8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVRpbWVUb3RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RhbCcpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vjb25kID0gcGxheVRpbWVUb3RhbC5tYXRjaCgvKC4rKTooLispLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlY29uZFRvdGFsID0gc2Vjb25kWzFdKjYwK3BhcnNlSW50KHNlY29uZFsyXSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NEb3dubG9hZCcpLmdldEF0dHJpYnV0ZSgnZGF0YS11cmwnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWNjb3VudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9maWxlLXVzZXItbmFtZS10aXRsZScpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW8taW5mby10aXRsZScpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9GaWxlTmFtZSA9IChhY2NvdW50ICYmIHRpdGxlKT9hY2NvdW50KyctJyt0aXRsZSsnLm1wNCc6bmV3IERhdGUoKS5nZXRUaW1lKCkrJy5tcDQnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKGRhdGFVcmwsdmlkZW9GaWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2Vjb25kVG90YWw8MzApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvRmlsZU5hbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSsnLm1wNCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZChkYXRhVXJsLHZpZGVvRmlsZU5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRhdGFVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvQ29weScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvTGluaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHZpZGVvRG9tLmdldEF0dHJpYnV0ZSgnc3JjJykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9KQoKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNyZWF0ZUtzVmlkZW9Eb3dubG9hZCh2aWRlb0RvbSl7CgogICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gL15odHRwcz86XC9cL3d3d1wua3VhaXNob3VcLmNvbVwvKC4rKVwvLisvOwoKICAgICAgICAgICAgICAgIGxldCByZXNwID0gbG9jYXRpb24uaHJlZi5tYXRjaChtYXRjaCk7CgogICAgICAgICAgICAgICAgaWYoIXJlc3AgfHwgKHJlc3BbMV0gIT0gJ3Nob3J0LXZpZGVvJyAmJiByZXNwWzFdICE9ICd2aWRlbycpKXsKCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjeS4jeaYr+inhumikeaSreaUvumhtScpO3JldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZihyZXNwWzFdID09ICdzaG9ydC12aWRlbycpewoKICAgICAgICAgICAgICAgICAgICBsZXQgcGxheWVyQXJlYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1jb250YWluZXItcGxheWVyJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJBcmVhV2lkdGggPSBwbGF5ZXJBcmVhLnN0eWxlLndpZHRoLm1hdGNoKC8oLispcHgvKTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXllckJhclByb2dyZXNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXllci1iYXItcHJvZ3Jlc3MnKTsKCiAgICAgICAgICAgICAgICAgICAgcGxheWVyQmFyUHJvZ3Jlc3Muc3R5bGUud2lkdGggPSBwbGF5ZXJBcmVhV2lkdGhbMV0tMjYwKydweCc7CgogICAgICAgICAgICAgICAgICAgIGxldCB0aW1lVG90YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG90YWwnKTsKCiAgICAgICAgICAgICAgICAgICAgdGltZVRvdGFsLnN0eWxlLnJpZ2h0PScxMjBweCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnJpZ2h0Jyk7CgogICAgICAgICAgICAgICAgbGV0IHZpZGVvRG93bmxvYWREb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjemhtS3NEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgIGlmKHZpZGVvRG93bmxvYWREb20pewoKICAgICAgICAgICAgICAgICAgICB2aWRlb0Rvd25sb2FkRG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlkZW9Eb3dubG9hZERvbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGRldGFpbERvbSA9IGNvbnRyb2xzLnF1ZXJ5U2VsZWN0b3IoJ2RpdjpudGgtb2YtdHlwZSgxKScpOwoKICAgICAgICAgICAgICAgIGxldCB4Z0ljb24gPSBkZXRhaWxEb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgIGxldCBsaW5rVXJsID0gdmlkZW9Eb20uZ2V0QXR0cmlidXRlKCdzcmMnKTsKCiAgICAgICAgICAgICAgICB4Z0ljb24ucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXZvbHVtZS1zb3VuZCcpLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nY3Vyc29yOnBvaW50ZXI7Jz7kuIvovb08L2Rpdj4iOwoKICAgICAgICAgICAgICAgIGxldCBzbGlkZXIgPSB4Z0ljb24ucXVlcnlTZWxlY3RvcignLnBsLXNsaWRlcicpOwoKICAgICAgICAgICAgICAgIHNsaWRlci5zdHlsZSA9ICd3aWR0aDo0OXB4O3BhZGRpbmc6MTBweCA1cHggMjBweDsnOwoKICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZExpc3QgPSAnJzsKCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZExpc3QgKz0gYDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTBweDtjb2xvcjojRkZGO2N1cnNvcjpwb2ludGVyOyIgaWQ9IiR7aXRlbS5pZH0iPiR7aXRlbS5uYW1lfTwvZGl2PmA7CgogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICBzbGlkZXIuaW5uZXJIVE1MID0gZG93bmxvYWRMaXN0OwoKICAgICAgICAgICAgICAgIHhnSWNvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdXJsJyxsaW5rVXJsKTsKCiAgICAgICAgICAgICAgICB4Z0ljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHhnSWNvbik7CgogICAgICAgICAgICAgICAgLy94Z0ljb24uaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSdjdXJzb3I6cG9pbnRlcjsnPuS4i+i9vTwvZGl2PiI7CgogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmJlZm9yZSh4Z0ljb24pOwoKICAgICAgICAgICAgICAgIC8v6YeN5p6E5pKt5pS+5pON5L2c5oyJ6ZKuCgogICAgICAgICAgICAgICAgbGV0IHpobUtzQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUtzQnV0dG9uJyk7CgogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh6aG1Lc0J1dHRvbik7CgogICAgICAgICAgICAgICAgaWYoemhtS3NCdXR0b24pewoKICAgICAgICAgICAgICAgICAgICAvL3pobUtzQnV0dG9uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtS3NCdXR0b24pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkljb24gPSBkZXRhaWxEb20uY2xvbmVOb2RlKHRydWUpOwogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhidXR0b25JY29uKTsKICAgICAgICAgICAgICAgIGJ1dHRvbkljb24uc2V0QXR0cmlidXRlKCdpZCcsJ3pobUtzQnV0dG9uJyk7CgogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbkljb25JbWcgPSBidXR0b25JY29uLnF1ZXJ5U2VsZWN0b3IoJy51bm11dGVkLWljb24nKTsKCiAgICAgICAgICAgICAgICBidXR0b25JY29uSW1nLnN0eWxlID0gJ2JhY2tncm91bmQ6IHVybChodHRwczovL3MyLTEwNjIzLmt3aW1ncy5jb20vdWRhdGEvcGtnL2Nsb3VkY2RuL2ltZy9wbGF5ZXItc2V0dGluZy5hZDFmNWNlOC5zdmcpIG5vLXJlcGVhdCc7CgogICAgICAgICAgICAgICAgZGV0YWlsRG9tLmFmdGVyKGJ1dHRvbkljb24pOwoKICAgICAgICAgICAgICAgIGxldCBwbFNsaWRlciA9IGJ1dHRvbkljb24ucXVlcnlTZWxlY3RvcignLnBsLXNsaWRlcicpOwoKICAgICAgICAgICAgICAgIHBsU2xpZGVyLnN0eWxlPSd3aWR0aDphdXRvO3BhZGRpbmc6MTBweCAxMHB4IDI1cHggMTBweDsnOwoKICAgICAgICAgICAgICAgIHBsU2xpZGVyLmlubmVySFRNTCA9ICIiOwoKICAgICAgICAgICAgICAgIGxldCBidXR0b25Gb3VyID0gY29udHJvbHMucXVlcnlTZWxlY3RvcignZGl2Om50aC1vZi10eXBlKDQpJyk7CgogICAgICAgICAgICAgICAgYnV0dG9uRm91ci5zdHlsZS5tYXJnaW49JzBweCc7CgogICAgICAgICAgICAgICAgbGV0IGF1dG9QbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXktc2V0dGluZy1jb250YWluZXInKTsKCiAgICAgICAgICAgICAgICBhdXRvUGxheS5zdHlsZS5tYXJnaW49JzBweCA0MHB4IDBweCAwcHgnOwoKICAgICAgICAgICAgICAgIGxldCBidXR0b25GaXZlID0gY29udHJvbHMucXVlcnlTZWxlY3RvcignZGl2Om50aC1vZi10eXBlKDUpJyk7CgogICAgICAgICAgICAgICAgYnV0dG9uRml2ZS5zdHlsZS5tYXJnaW49JzE1cHggMHB4JzsKCiAgICAgICAgICAgICAgICBidXR0b25GaXZlLm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLXJvdGF0ZS10b29sdGlwJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih0b29sVGlwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9vbFRpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgIH0sMzApCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCBidXR0b25TaXggPSBjb250cm9scy5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoNiknKTsKCiAgICAgICAgICAgICAgICBidXR0b25TaXguc3R5bGUubWFyZ2luPScxNXB4IDBweCc7CgogICAgICAgICAgICAgICAgbGV0IHRvb2xUaXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3dhaS1wbGF5ZXItZnVsbHNjcmVlbi10b29sdGlwJyk7CgogICAgICAgICAgICAgICAgYnV0dG9uU2l4Lm9ubW91c2VvdmVyPWZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b29sVGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt3YWktcGxheWVyLWZ1bGxzY3JlZW4tdG9vbHRpcCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodG9vbFRpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvb2xUaXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDMwKQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25Gb3VyKTsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25GaXZlKTsKCiAgICAgICAgICAgICAgICBwbFNsaWRlci5hcHBlbmRDaGlsZChidXR0b25TaXgpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgeGlndWFWaWRlb0Rvd25sb2FkKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb0RvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCd2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlWGlndWFWaWRlb0Rvd25sb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiZ2V0IiwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwOi8vNDcuOTkuMTU4LjExOC92aWRlby1jcmFjay92Mi9wYXJzZT9jb250ZW50PScrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6ICcnLAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnQWNjZXB0JzogJ3RleHQvcGxhaW4sIHRleHQvaHRtbCxhcHBsaWNhdGlvbi9qc29uJ30sCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXMpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXM9PTIwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcy5yZXNwb25zZVRleHQpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvU3JjID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPT0gMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9TcmMgPSByZXNwLmRhdGEudXJsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2aWRlb1NyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvU3JjKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aWRlb1RpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvVGl0bGUgaDEnKS5pbm5lclRleHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvQXV0aG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmF1dGhvcl9fdXNlck5hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ato+WcqOS4i+i9veivt+eojeS+rycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKHZpZGVvU3JjLHZpZGVvVGl0bGUrJ0AnK3ZpZGVvQXV0aG9yKycubXA0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9Db3B5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXZpZGVvU3JjKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHkuI3og73lpI3liLblnLDlnYAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHZpZGVvU3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b0xpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdmlkZW9TcmMpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivpeinhumikeS4jeiDveebtOaOpeaJk+W8gCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4odmlkZW9TcmMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBhdGguZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jbGFzc05hbWUgPT0gJ3hncGxheWVyLWNvbnRyb2wtaXRlbSBjb250cm9sX3BsYXluZXh0IGNvbW1vbi1jb250cm9sLWl0ZW0nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqTGluayA9IHt9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmhyZWYpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTGluay5ocmVmID0gaXRlbS5ocmVmP2l0ZW0uaHJlZjonJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsudGFyZ2V0ID0gaXRlbS50YXJnZXQ/aXRlbS50YXJnZXQ6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob2JqTGluay5ocmVmICYmIG9iakxpbmsudGFyZ2V0ICE9ICdfYmxhbmsnKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IG9iakxpbmsuaHJlZjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvciA6IGZ1bmN0aW9uKGVycil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmlkZW8nKS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsZnVuY3Rpb24oKXsgLy/nu5PmnZ8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5pKt5pS+57uT5p2fIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvUGxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54Zy1zd2l0Y2gtY2hlY2tlZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdXRvUGxheSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTUwMCk7CgogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbHMoKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNyZWF0ZVhpZ3VhVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIGxldCByaWdodEdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueGctcmlnaHQtZ3JpZCcpOwoKICAgICAgICAgICAgICAgIGxldCBwbGF5Q29udHJvbCA9IHJpZ2h0R3JpZC5xdWVyeVNlbGVjdG9yKCdkaXY6bnRoLW9mLXR5cGUoMiknKTsKCiAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHBsYXlDb250cm9sLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICBsZXQgZW50cnk9IGNvbnRyb2wucXVlcnlTZWxlY3RvcignLnhncGxheWVyLWNvbnRyb2wtaXRlbV9fZW50cnknKTsKCiAgICAgICAgICAgICAgICBlbnRyeS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0ieGdwY1BsYXllcl90ZXh0RW50cnkiPjxzcGFuPuS4i+i9vTwvc3Bhbj48L2Rpdj4nOwoKICAgICAgICAgICAgICAgIGxldCBwb3BvdmVyID0gY29udHJvbC5xdWVyeVNlbGVjdG9yKCcueGdwbGF5ZXItY29udHJvbC1pdGVtX19wb3BvdmVyJyk7CgogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkTGlzdCA9ICc8dWw+JzsKCiAgICAgICAgICAgICAgICBkb3dubG9hZE9wdGlvbi5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZExpc3QgKz0gYDxsaSB0YWJpbmRleD0iMCIgcm9sZT0ibWVudWl0ZW1yYWRpbyIgYXJpYS1jaGVja2VkPSJmYWxzZSIgaWQ9IiR7aXRlbS5pZH0iPiR7aXRlbS5uYW1lfTwvbGk+YDsKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIGRvd25sb2FkTGlzdCArPSAnPC91bD4nOwoKICAgICAgICAgICAgICAgIHBvcG92ZXIuaW5uZXJIVE1MID0gZG93bmxvYWRMaXN0OwoKICAgICAgICAgICAgICAgIHBsYXlDb250cm9sLmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICBsZXQgZGl2RG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgogICAgICAgICAgICAgICAgZGl2RG9tLnN0eWxlPSJ3aWR0aDogODBweDsgaGVpZ2h0OiAxNDBweDtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206NDBweDtsZWZ0OjIwcHg7ei1pbmRleDotMSI7CgogICAgICAgICAgICAgICAgY29udHJvbC5hcHBlbmRDaGlsZChkaXZEb20pOwoKICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW92ZXI9ZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgcG9wb3Zlci5zdHlsZS5kaXNwbGF5PSdibG9jayc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnRyb2wub25tb3VzZW91dD1mdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBwb3BvdmVyLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICB9CgogICAgICAgICAgICBiaWxpVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyb2xzKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2Jhbmd1bWknKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJpZ2h0Q29udHJvbCA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuc3F1aXJ0bGUtY29udHJvbGxlci13cmFwLXJpZ2h0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJpZ2h0Q29udHJvbCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5iaWxpYmlsaS1wbGF5ZXItdmlkZW8tYnRuLXF1YWxpdHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvbU90aGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJweC1wbGF5ZXItY3RybC1xdWFsaXR5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvbU90aGVyKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlQmlsaVZpZGVvRG93bmxvYWRPdGhlcigpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrPjMwKWNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL190aGlzLmNyZWF0ZUJpbGlWaWRlb0Rvd25sb2FkKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9Eb20gPSBbe25hbWU6J3ZpZGVvJyx0eXBlOidkb20nfSx7bmFtZTonYndwX3ZpZGVvJyx0eXBlOidkb20nfSx7bmFtZTonLmJpbGliaWxpLXBsYXllci12aWRlbycsdHlwZTonY2xhc3MnfV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDtpPHZpZGVvRG9tLmxlbmd0aDtpKyspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW8gPSB2aWRlb0RvbVtpXS50eXBlID09ICdkb20nP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodmlkZW9Eb21baV0ubmFtZSk6ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih2aWRlb0RvbVtpXS5uYW1lKS5maXJzdENoaWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlbyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyWmhtSWNvbik7IC8v5Y+W5raI5a6a5pe25ZmoCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5JyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkq3mlL7lvIDlp4siKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJyxmdW5jdGlvbigpeyAvL+e7k+adnwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJpbGlEb3dubG9hZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmlsaURvd25sb2FkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlsaURvd25sb2FkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYmlsaURvd25sb2FkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZCgpewoKICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gZ2V0Q29udHJvbHMoKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoZG93bmxvYWRJY29uKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4i+i9veaMiemSruW3suWtmOWcqCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignYmFuZ3VtaScpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWFsaXR5ID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5zcXVpcnRsZS1xdWFsaXR5LXdyYXAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFxdWFsaXR5KXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IHF1YWxpdHkuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuc3F1aXJ0bGUtdmlkZW8tcXVhbGl0eS10ZXh0JykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2lkJywnYmlsaURvd25sb2FkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LmJlZm9yZShjb250cm9sKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCd2aWRlbycpICE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdXRvSWNvbkRvbSA9IGF3YWl0IEJhc2VDbGFzcy5nZXRFbGVtZW50KCcuYmlsaWJpbGktcGxheWVyLXZpZGVvLWJ0bi1xdWFsaXR5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYXV0b0ljb25Eb20pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbCA9IGF1dG9JY29uRG9tLmNsb25lTm9kZSh0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc3R5bGU9J21hcmdpbi1yaWdodDoyMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5idWktc2VsZWN0LXJlc3VsdCcpLmlubmVyVGV4dD0n5LiL6L29JzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucXVlcnlTZWxlY3RvcignLmJ1aS1zZWxlY3QtcmVzdWx0Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ljb25Eb20uYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pobXpnaLkuI3mmK/op4bpopHmiJbnlarliacnKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ2aWQgPSAnJyxhdmlkPScnOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL2h0dHBzOlwvXC93d3cuYmlsaWJpbGkuY29tXC92aWRlb1wvKC4rKVw/Lyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFyYW1zWzFdLmluZGV4T2YoJ2F2JykgIT0tMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aWQgPSBwYXJhbXNbMV0ucmVwbGFjZSgnYXYnLCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnZpZCA9IHBhcmFtc1sxXS5zdWJzdHJpbmcocGFyYW1zWzFdLmxlbmd0aC0xKT09Jy8nP3BhcmFtc1sxXS5zdWJzdHJpbmcoMCxwYXJhbXNbMV0ubGVuZ3RoLTEpOnBhcmFtc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn5b2T5YmN6aG16Z2i5peg5rOV5LiL6L29Jyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZighYnZpZCAmJiAhYXZpZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+acquiOt+WPlmJ2aWTmiJZhdmlkJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlldz9idmlkPSIrYnZpZCsiJmFpZD0iK2F2aWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJpID0gX3RoaXMucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwLmNvZGUgPCAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeS/oeaBr+aOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+mAiembhmNpZAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWdlSWQgPSBfdGhpcy5nZXRRdWVyeVN0cmluZygncCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaWQgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYWdlSWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQgPSByZXNwLmRhdGEucGFnZXNbcGFnZUlkLTFdLmNpZDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLmNpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gJ2h0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci9wbGF5dXJsP2F2aWQ9JytyZXNwLmRhdGEuYWlkKycmY2lkPScrY2lkKycmcW49MTEyJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gX3RoaXMucmVxdWVzdCgnZ2V0JyxsaW5rKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXN1bHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmNvZGUgPCAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor6Xop4bpopHml6Dms5XkuIvovb0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+inhumikeWcsOWdgOaOpeWPo+i/lOWbnuaVsOaNrumUmeivrycpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFVybCA9IGRhdGEuZGF0YS5kdXJsWzBdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HTV9kb3dubG9hZChkb3dubG9hZFVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGRvd25sb2FkVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGdldENvbnRyb2xzKCk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVCaWxpVmlkZW9Eb3dubG9hZE90aGVyKCl7CgogICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBnZXRDb250cm9scygpewoKICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICBpZihkb3dubG9hZEljb24pewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5LiL6L295oyJ6ZKu5bey5a2Y5ZyoJyk7cmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSBhd2FpdCBCYXNlQ2xhc3MuZ2V0RWxlbWVudCgnLnNxdWlydGxlLXF1YWxpdHktd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXF1YWxpdHkpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInmib7liLBET00nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gcXVhbGl0eS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnF1ZXJ5U2VsZWN0b3IoJy5zcXVpcnRsZS12aWRlby1xdWFsaXR5LXRleHQnKS5pbm5lclRleHQ9J+S4i+i9vSc7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLCdiaWxpRG93bmxvYWQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkuYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3ZpZGVvJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9JY29uRG9tID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoJy5icHgtcGxheWVyLWN0cmwtcXVhbGl0eScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWF1dG9JY29uRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ5om+5YiwRE9NJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBhdXRvSWNvbkRvbS5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnN0eWxlPSdtYXJnaW4tcmlnaHQ6MjBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktcmVzdWx0JykuaW5uZXJUZXh0PSfkuIvovb0nOwoKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jdHJsLXF1YWxpdHktcmVzdWx0Jykuc2V0QXR0cmlidXRlKCdpZCcsJ2JpbGlEb3dubG9hZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ljb25Eb20uYmVmb3JlKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCflvZPliY3pobXpnaLkuI3mmK/op4bpopHmiJbnlarliacnKTtyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGlEb3dubG9hZCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJ2aWQgPSAnJyxhdmlkPScnOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9jYXRpb24uaHJlZi5pbmRleE9mKCdiYW5ndW1pJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXYtbGluaycpLmlubmVyVGV4dDsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigndmlkZW8nKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vd1VybCA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub3dVcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBub3dVcmxbMF0ubWF0Y2goL2h0dHBzOlwvXC93d3cuYmlsaWJpbGkuY29tXC92aWRlb1wvKC4rKS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmFtc1sxXS5pbmRleE9mKCdhdicpICE9LTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlkID0gcGFyYW1zWzFdLnJlcGxhY2UoJ2F2JywnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ2aWQgPSBwYXJhbXNbMV0uc3Vic3RyaW5nKHBhcmFtc1sxXS5sZW5ndGgtMSk9PScvJz9wYXJhbXNbMV0uc3Vic3RyaW5nKDAscGFyYW1zWzFdLmxlbmd0aC0xKTpwYXJhbXNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+W9k+WJjemhtemdouaXoOazleS4i+i9vScpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJ2aWQgJiYgIWF2aWQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmnKrojrflj5Zidmlk5oiWYXZpZCcpO3JldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICJodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL3ZpZXc/YnZpZD0iK2J2aWQrIiZhaWQ9IithdmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVyaSA9IF90aGlzLnJlcXVlc3QoJ2dldCcsdXJsKS50aGVuKChyZXN1bHQpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcC5jb2RlIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHkv6Hmga/mjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/pgInpm4ZjaWQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUlkID0gX3RoaXMuZ2V0UXVlcnlTdHJpbmcoJ3AnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGFnZUlkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gcmVzcC5kYXRhLnBhZ2VzW3BhZ2VJZC0xXS5jaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IHJlc3AuZGF0YS5jaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2lkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9ICdodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC9wbGF5ZXIvcGxheXVybD9hdmlkPScrcmVzcC5kYXRhLmFpZCsnJmNpZD0nK2NpZCsnJnFuPTExMic7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IF90aGlzLnJlcXVlc3QoJ2dldCcsbGluaykudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5jb2RlIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+l6KeG6aKR5peg5rOV5LiL6L29Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfop4bpopHlnLDlnYDmjqXlj6Pov5Tlm57mlbDmja7plJnor68nKTtyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBkYXRhLmRhdGEuZHVybFswXS51cmw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vR01fZG93bmxvYWQoZG93bmxvYWRVcmwpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbihkb3dubG9hZFVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBnZXRDb250cm9scygpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgeW91dHViZVZpZGVvRG93bmxvYWQoKXsKCiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gbG9jYXRpb24uaHJlZi5tYXRjaCgvXmh0dHBzPzpcL1wvd3d3XC55b3V0dWJlXC5jb21cLyh3YXRjaFw/dj0uK3xzaG9ydHNcLy4rKS8pOwoKICAgICAgICAgICAgICAgICAgICBpZih1cmwpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdXR1YmVJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3lvdXR1YmVJY29uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih5b3V0dWJlSWNvbilyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3NzID0KICAgICAgICAgICAgICAgICAgICAgICAgYDpyb290ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aWR0aExlZnQtLTo0MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS10b3AtLToyMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjJweDtjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgOiBmbGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDowcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6dmFyKC0tdG9wLS0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzp2aXNpYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb193cmFwewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OnNjcm9sbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlX2xpbmVfdWx7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC1zdHlsZTogbm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZV91bF9saXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6NHB4IDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDozMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojRkZGOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmMjQ0NDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjBweCAwcHggMTBweCAjZmZmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGk6aG92ZXJ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZmNjMGMwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IzI2MDAzMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2ZjYzBjMAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC5pY29uTG9nb3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOnZhcigtLXdpZHRoTGVmdC0tKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fanh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6MHB4O3BhZGRpbmc6MHB4OwogICAgICAgICAgICAgICAgICAgICAgICB9YDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJykuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlXcmFwSHRtbCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz0ncGxheUJ1dHRvbiB6aG1fcGxheV92aWRvZV9pY29uJyBpZD0nemhtbG9nbyciPjxpbWcgY2xhc3M9J2ljb25Mb2dvJyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09Jz5gOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9ICI8ZGl2IGNsYXNzPSdwbGF5TGluZURpdiB6aG1fcGxheV92aWRlb193cmFwJz4iCgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0gIjxkaXYgY2xhc3M9J3pobV9wbGF5X3ZpZGVvX2xpbmUnPiI7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz0iPHVsIGNsYXNzPSd6aG1fcGxheV92aWRlX2xpbmVfdWwnPiI7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheUxpbmUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMScsdXJsOidodHRwczovL3poLnNhdmVmcm9tLm5ldC8xNzYvI3VybD0nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot68yJyx1cmw6J2h0dHBzOi8vbXlkb3duZG93bi5jb20veTIjJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bmFtZTon5LiL6L2957q/6LevMycsdXJsOidodHRwczovL3d3dy55dGRvd25may5jb20vc2VhcmNoP3VybD0nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtuYW1lOifkuIvovb3nur/ot680Jyx1cmw6J2h0dHBzOi8veW91dC5jb20vdmlkZW8vP3VybD0nfQogICAgICAgICAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGknIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjwvdWw+PC9kaXY+PC9kaXY+PC9kaXY+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXZEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRpdkRvbS5pZD0ieW91dHViZUljb24iOwoKICAgICAgICAgICAgICAgICAgICAgICAgZGl2RG9tLmlubmVySFRNTD1wbGF5V3JhcEh0bWw7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuYXBwZW5kQ2hpbGQoZGl2RG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5TGluZVRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBsYXlMaW5lVGQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlMaW5lVGQuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihpdGVtLmdldEF0dHJpYnV0ZSgndXJsJykrbG9jYXRpb24uaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtX3BsYXlfdmlkb2VfaWNvbicpLm9ubW91c2VvdmVyPSgpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nYmxvY2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnpobV9wbGF5X3ZpZG9lX2ljb24nKS5vbm1vdXNlb3V0PSgpPT57CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnBsYXlMaW5lRGl2Iikuc3R5bGUuZGlzcGxheT0nbm9uZSc7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdXR1YmVJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3lvdXR1YmVJY29uJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih5b3V0dWJlSWNvbil7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91dHViZUljb24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5b3V0dWJlSWNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0sNTAwKQoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIHZhciBhbGxXZWIgPSBbLi4uZ2V0Q291cG9uLC4uLmp4VmlkZW8sLi4uanhNdXNpYywuLi56aE5pY2UsLi4udGFvYmFvLC4uLnZpZGVvRG93bmxvYWRdOwoKICAgICAgICB2YXIgbm93V2ViPVtdOwoKICAgICAgICBhbGxXZWIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuID09IDApIHJldHVybiB0cnVlOwoKICAgICAgICAgICAgaXRlbS53ZWIuZm9yRWFjaChmdW5jdGlvbih2YWwpewoKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBsb2NhdGlvbi5ocmVmLm1hdGNoKHZhbC5tYXRjaCk7CgogICAgICAgICAgICAgICAgaWYocmVzdWx0KXsKCiAgICAgICAgICAgICAgICAgICAgbm93V2ViLnB1c2godmFsKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgIH0pCgogICAgICAgIGlmKG5vd1dlYi5sZW5ndGg9PTApewoKICAgICAgICAgICAgbGV0IGJhc2VDbGFzcyA9IG5ldyBCYXNlQ2xhc3MoKTsKCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmsqHmnInljLnphY3or6XnvZHnq5nmiJbor6XmqKHlnZflt7LlhbPpl60nKTtyZXR1cm47CiAgICAgICAgfQoKICAgICAgICBub3dXZWIuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgIHN3aXRjaChpdGVtLmZ1bmNOYW1lKXsKICAgICAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6CgogICAgICAgICAgICAgICAgICAgIGNvdXBvbkZ1bmMoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwbGF5VmlkZW8nOgogICAgICAgICAgICAgICAgICAgIHBsYXlWaWRlb0Z1bmMoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXlNdXNpYyc6CiAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljRnVuYyhpdGVtKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3poTmljZSc6CiAgICAgICAgICAgICAgICAgICAgemhOaWNlRnVuYygpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndmlkZW9Eb3dubG9hZCc6CgogICAgICAgICAgICAgICAgICAgIHZhciB2aWRlb0Rvd25sb2FkQ2xhc3MgPSBuZXcgVmlkZW9Eb3dubG9hZENsYXNzKCk7CgogICAgICAgICAgICAgICAgICAgIHZhciB7ZnVuY05hbWUsbWF0Y2g6bm93TWF0Y2gsbm9kZTpub3dOb2RlLG5hbWU6bm93TmFtZX0gPSBpdGVtOwoKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzV2ViT3BlbiA9PSAwKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0ubmFtZSsn5bey5YWz6ZetJyk7cmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRG93bmxvYWRDbGFzc1tub3dOYW1lXSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd0YW9iYW9TZWFyY2gnOgogICAgICAgICAgICAgICAgICAgIHRhb2Jhb1NlYXJjaEZ1bmMoaXRlbSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfSkKCiAgICAgICAgZnVuY3Rpb24gY291cG9uRnVuYyhpdGVtKXsKCiAgICAgICAgICAgIHZhciBjb3Vwb25DbGFzcyA9IG5ldyBDb3Vwb25DbGFzcygpOwoKICAgICAgICAgICAgdmFyIHtmdW5jTmFtZSxtYXRjaDpub3dNYXRjaCxub2RlOm5vd05vZGUsbmFtZTpub3dOYW1lfSA9IGl0ZW07CgogICAgICAgICAgICB2YXIgY291cG9uU3R5bGUgPWAKICAgICAgICAgICAgICAgICAgICBodG1sewogICAgICAgICAgICAgICAgICAgIC0tcmlnaHQ6MTAwJTsKICAgICAgICAgICAgICAgICAgICAtLWxlZnQ6MTAwJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fY291cG9uewogICAgICAgICAgICAgICAgICAgIHdpZHRoOmZpdC1jb250ZW50OwogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczpmbGV4LXN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNHB4OwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOjE1cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2xlZnR7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpyb3c7CiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTRweDsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHJpZ2h0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCNmZmYgMCkgdG9wIGxlZnQgL3ZhcigtLXJpZ2h0KSA1MSUgbm8tcmVwZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgcmlnaHQgYm90dG9tLCB0cmFuc3BhcmVudCA4cHgsICNmZmYgMCkgYm90dG9tIGxlZnQgL3ZhcigtLXJpZ2h0KSA1MSUgbm8tcmVwZWF0OwogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMnB4IDJweCAzcHggIzg4OCk7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0Ojg0cHg7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1faW1nX2ljb257CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzo0cHggMHB4IDBweCA1cHg7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OjVweDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1faW1nX2ljb24gaW1newogICAgICAgICAgICAgICAgICAgIHdpZHRoOjQ3cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2NvbnRlbnR7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9tb25leXsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOnJvdzsKICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fYW1vdW50X21vbmV5ewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX21vbmV5X3NpZ257CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9tb25leV9udW17CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2YyMzAzMDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MzZweDsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9jb25kaXRpb257CiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2ZiMGYzYTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmNGVjOwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNXB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV90aW1lewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IC01cHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoycHggNHB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV90ZXJtewogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmYjBmM2E7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZiMGYzYTsKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjJweDsKICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MHB4IDRweDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2RhdGV7CiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjhweDsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2NpcmNsZXsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmIwZjNhIHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQXpVbEVRVlFZbFMzTk1Vb0RRUmlHNFhjbXU5bEFYQlFicSsxQ0NxdWN3c2JPTzNnQVMyOWg0UW04Z1JkSU1LVmdsUVZCRmlTRmpZS0JxV1oyZC83UEl2WVBQRTZTTUNIdmNEOEh1THpCVXNJS0R5WThBTjRSVStKOS84bkg4b0xZSjN3V2NoeEJqSkh0WmtOMWZzYnA5b212aHp2NmNjRGpRSkxhdGxYWGRaSWs1YXdrS1Z6ZEtrOVc4Z0JGVVZEWE5RQTJqSlRBN0dTT21SMkxwbWtJSVdBNTQ2c3B2TzV3TDI5UXozR1NCQkNIbm53SXpPNGYwZk1hWW9LeS9BY204QTYrZnhrWDE1QU5xaW1ZOFFlbUNtOTIwcjFhVUFBQUFBQkpSVTVFcmtKZ2dnPT0pIHJlcGVhdC15OwogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6MTBweDsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NjZweDsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6NDRweDsKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjI7CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOm5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuemhtX2xpbmtfY291cG9uewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246cm93OwogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGRyb3Atc2hhZG93KDJweCAycHggM3B4ICM4ODgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgbGVmdCB0b3AsIHRyYW5zcGFyZW50IDhweCwgI2ZiMDUzYSAwKSB0b3AgcmlnaHQgL3ZhcigtLWxlZnQpIDUwJSBuby1yZXBlYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IGJvdHRvbSwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIGJvdHRvbSByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdDsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDg0cHg7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnpobV9saW5rX3RleHR7CiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgICAgICAgICAgICAgICAgICB3cml0aW5nLW1vZGU6dmVydGljYWwtbHI7CiAgICAgICAgICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6MTBweDsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxNnB4OwogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiOwogICAgICAgICAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjpub25lOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOjM4cHg7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBsZWZ0IHRvcCwgdHJhbnNwYXJlbnQgOHB4LCAjZmIwNTNhIDApIHRvcCByaWdodCAvdmFyKC0tbGVmdCkgNTAlIG5vLXJlcGVhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGxlZnQgYm90dG9tLCB0cmFuc3BhcmVudCA4cHgsICNmYjA1M2EgMCkgYm90dG9tIHJpZ2h0IC92YXIoLS1sZWZ0KSA1MCUgbm8tcmVwZWF0OwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC56aG1fbGlua190ZXh0OmhvdmVyewogICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CiAgICAgICAgICAgICAgICBmb250LXdlaWdodDo4MDA7CiAgICAgICAgICAgICAgICBmb250LWZhbWlseToiTWljcm9zb2Z0IFlhSGVpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGA7CgogICAgICAgICAgICBkb21TdHlsZSAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY291cG9uU3R5bGUpKTsKCiAgICAgICAgICAgIGRvbUhlYWQuYXBwZW5kQ2hpbGQoZG9tU3R5bGUpOwoKICAgICAgICAgICAgbGV0IG49MDsKCiAgICAgICAgICAgIGxldCBjb3Vwb25UaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbisrOwoKICAgICAgICAgICAgICAgIGxldCBwYWdlTm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobm93Tm9kZSkKCiAgICAgICAgICAgICAgICBpZihwYWdlTm9kZSl7CgogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY291cG9uVGltZXIpOwoKICAgICAgICAgICAgICAgICAgICBjb3Vwb25DbGFzc1tub3dOYW1lXSgpOwoKICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICBpZihuPT1jb3Vwb25UaW1lck51bSkgY2xlYXJJbnRlcnZhbChjb3Vwb25UaW1lcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9LDEwMCkKICAgICAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwbGF5VmlkZW9GdW5jKCl7CgogICAgICAgICAgICB2YXIgcGxheVZpZGVvQ2xhc3MgPSBuZXcgUGxheVZpZGVvQ2xhc3MoKTsKCiAgICAgICAgICAgIGxldCBzb3J0RGl2ID0gaWNvblZpcFBvc2l0aW9uPT0nbGVmdCc/J3Jvdyc6J3Jvdy1yZXZlcnNlJzsKCiAgICAgICAgICAgIC8vY3NzCiAgICAgICAgICAgIGxldCBwbGF5VmlkZW9TdHlsZSA9IGAKICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkb2VfaWNvbnsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4OwogICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OwogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDske2ljb25WaXBQb3NpdGlvbn06NXB4O3RvcDoke2ljb25WaXBUb3B9cHg7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOwogICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzp2aXNpYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmZsZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiR7c29ydERpdn07CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOmF1dG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb193cmFwewogICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk7CiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwMHB4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZW9fbGluZXsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzIwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDozMTZweDsKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteTpzY3JvbGw7CiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXg6aGlkZGVuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAuemhtX3BsYXlfdmlkZV9saW5lX3VsewogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDozMDBweDsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICBmbGV4LWZsb3c6IHJvdyB3cmFwOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lOwogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjBweDsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpewogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjRweCAwcHg7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOjMwJTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6I0ZGRjsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2YyNDQ0MzsKICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzowcHggMHB4IDEwcHggI2ZmZjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjE0cHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19saW5lX3VsX2xpOmhvdmVyewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLnpobV9saW5lX3NlbGVjdGVkewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojMjYwMDMzOwogICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmY2MwYzAKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC56aG1fcGxheV92aWRlb19qeHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7CiAgICAgICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OwogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7dG9wOjBweDtwYWRkaW5nOjBweDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgOwoKICAgICAgICAgICAgZG9tU3R5bGUgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBsYXlWaWRlb1N0eWxlKSk7CgogICAgICAgICAgICBkb21IZWFkLmFwcGVuZENoaWxkKGRvbVN0eWxlKTsKCiAgICAgICAgICAgIC8vY3VzdG9tIGFkZCBsaW5lCgogICAgICAgICAgICBpZihHTV9nZXRWYWx1ZSgndmlkZW9QbGF5TGluZUFkZCcpPT0yMiAmJiBHTV9nZXRWYWx1ZSgncGxheVZpZGVvTGluZVRleHQnKSl7CgogICAgICAgICAgICAgICAgbGV0IGxpbmVPYmogPSBwbGF5VmlkZW9DbGFzcy5nZXRMaW5lKEdNX2dldFZhbHVlKCdwbGF5VmlkZW9MaW5lVGV4dCcpKTsKCiAgICAgICAgICAgICAgICBpZihsaW5lT2JqKXsKCiAgICAgICAgICAgICAgICAgICAgcGxheUxpbmUgPSBbLi4ubGluZU9iaiwuLi5wbGF5TGluZV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3RlbXBsYXRlOmljb24scGxheUxpbmU7CiAgICAgICAgICAgIGxldCBwbGF5V3JhcEh0bWwgPSAiPGRpdiBocmVmPSdqYXZhc2NyaXB0OnZvaWQoMCknIHRhcmdldD0nX2JsYW5rJyBzdHlsZT0nJyBjbGFzcz0ncGxheUJ1dHRvbiB6aG1fcGxheV92aWRvZV9pY29uJyBpZD0nemhtbG9nbyc+PGltZyBjbGFzcz0naWNvbkxvZ28nIHNyYz0nZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoWkFDV0FQY0FBUEpFUS92Nytmbkx5UGpDd2ZSblpmblQwUEpLU2ZqR3hQdjI5UG5ZMS9OYld2djE4L2FVay9ybDQvcnc3dm5LeVBhSmlQcnI2ZmFhbVBSeWNmYUxpdnY1OS9KSlNQcnY3Zk5WVlBuZTNmcnQ2L05RVC92NitQZWxwUGFnbnZSM2R2aTZ1UHZ6OGZleHIvbk96UGVnbnZyazR2UjFjL0pHUmZycTZQblF6dmpDd1BuUzBQbloxL3Z3N3ZuYTJmZW9wL2VtcGZyYzJ2TlVVL2l4ci9SNGR2V0poL2VzcXZKSFJ2dng3L3J5OGZOU1VmTldWUGpCd1BWNmVmYU1pdm5mM2ZpOHV2V0RndnY0OXZycDZQcnk4UEpQVHZhWWwvblQwZm5XMVBlcnFmUnNhL1J2YnZXQWYvVjlmUG5rNHZpMnRmUmpZZlJoWC92dTdQTllWL0pGUlBuazRmYUhoZmFYbHZ2MzlmcmgzL2k3dXZuTnkvbk95L3JzNnZlcnF2UmdYdm5kMi9hR2hQV1JrUFYvZmZyaTRQcmo0UGl3cmZuTHlmYVVrdlJmWGZKTlRQakZ3L2V5c2ZSbFkvUnhjUHZ2N2ZlenN2aTBzdnYyOC9hYm12ZXFxUGVwcVBKTVMvZXlzUFdPamZOZFhQUnpjdnYwOHZSdWJmcm81dmVpb2ZlbG8vTlpXUG5aMlBOcGFQblUwdlJmWHZuSHhmaXVyUGpBdi9uUXpmcm41Zm5jMi9lMHN2YWRuUGU0dC9hU2tmTlhWdlJtWlBldHF2blkxdmk4dS9laW9QaXRxL2kvdmZSd2IvUjFkUG5lM1BhZW5mYWNtdmUzdHZuUnovcmo0ZmFYbGZWK2ZQV0ZoUEpMU3ZhTmkvV01qUFIwYy9hVmsvV1BqL2FkbS9ycDUvbkl4dlJvWnZSaVlmakR3dmFWbFBKT1RmZTJ0Zk5xYWZKUlVQZWtvdmFhbWZOYVdmVjhldm5kM1BuTnpQblYxUGVzcS9qRXcvVjZlUFIzZC9uZzN2cnc3ZmFXbFBlbnBmYWZuZldQanZpd3J2TldWZm5NeXZpNnVmVi9mdlY5ZS9uYjJ2cnU2L1JrWXZqQXZ2bkl4ZlJpWVBpOXZQZWduL1Y3ZWZlam9mZTF0UFdDZ2ZybTVQSklSL25jMnZOY1cvSlFUL2pGeFB2eThQV0RnZldCZi9Sc2JQVjVkL05wYWZOY1hQbmYzdmFJaHZSdmIvaXZyZm5YMXZOUlVmYUtpZlJ0YlBhWmwvTmVYUGU1dVBXQ2dQUnJhdmFJaC9Ob1ovbkp4L1dGZy9pOXUvUjJkZmpIeHZqSXh2TlRVdmkvdnZlMXMvTmVYUUFBQUFBQUFBQUFBQUFBQUNIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUVsZ0FBQUN3QUFBQUFaQUNXQUFBSS9nQUJDQnhJc0tEQmd3Z1RLbHpJc0tIRGh4QWpTcHhJc2FMRml4Z3phdHpJc2FQSGp5QkRpbHhJWUVTQUFDTUlqRnhwVUlXREFBNVVlRmpJNHVUSkJDeHpDc3hoazhpUWhUWnQ2c3lwd2FhR0RBc0hCT1V4bE9VTEpDV1F2S2l4Y0FPREFRTVliR2k2VWtHUEdqMFVHT0JLdHF6WnMyalRxbDNMdHFNQ0UwMU1pSzFLWXNRSUVsczdmbUZDYTlFV0Y0a1FoQ2lUUW9VSVRVelNmT3lRZ2tXS0RrR1NMdFdvQTlpdVpVRXphdzRnQlpxVklodFIyRVNCVTZGbWpEUU9DZG5NZWpNQ0xSTXlMckM1NEFMTm9LVXBqbkhSdW5mclR2VXVucG05NE1FZmtnTWNYQmlnY3VJbDNyNmpzejZqb0tJSkNSNGttTmd4RWtNajN5WG8vbWtDSmFpV0JUVmY5RmlaTTZsRWJ3U29UclE5eUVzSzZ3cXFTT1Z4S01OV2tqZXN1ZERjZkFCY1F3ZHJmVndoQTBVV2hJSElaa0wwUXFBYUsyem1pUTgzWkFURkVab1ZNaDhHeW1pR0FDVVdjRVRGRlFnRTlVQkVCbUNnQUFaak1VUUFDU1FNcUpBTVpXam1nbUlmZlpIQVNRdVVFaEVFSWp3aEFnUTJIbVJEVURZc3BBWjBRZDFSWWtnbmlNRkFGQkxGWUZNTVFDejBrazIySlhUQ2c1bWhRWllkVnBCangwSnkwQlptUWs0RVZZVkNkV1RHUVRwa0VWSlVBQzZBbHRBUE5tV2l3a0lRZkhrQkJBbjFZcWNWWmZrUnBVSSt4QUZFSEQ0bzBSQUJTUmFrQTRCQmpXSldCNW5GaHBBQlUwUXhSWXdZM1pHWkxtZmxzWnBOL21WTXVWSWJIQVNWaGF4bE1aTFpLVG1sRUJRSHNhUjFRb2cyOVNIZlNLVmtac1phNm1SR2dVWVRpR3BRQVVHOTRlZENPcGdVZ2hldmdMUkZVQzRjdEFRREhqQ3dCSGNLRlhxU0E0Z1N4RWVaRHVrVDFES09ITXVSSGtGcGNKQkxNTW0wVUp3MnpVa1FIRUYxZ2VwQ2Uyam1TekllTldOVE93ZnhkSkpQWGdiMUpnQVdoQkFVTUErMWxnSXpISjFReHhhYnJHblFuZ0VjdGRDU05pVkJrRGRCVlhBdFE3V3l4Z0VuaitUMFZGUlR5Y2dBQTBrU2JGTXJFRlhnMng2VW1DeVNWMkROUlZFV1FUSDZrTkhScFRJS0ZRUWFoRUZtR0JRZFZDRzV0QWFHR3hqOXNVQUZqSHlFVEZCbFJQVHFTUzhBRUVZZnJSVkNTRVZ1Qk1XSC9rZWJCQVdDMjBIVklaQW93bWk4V1FVaTRETlJuVGI1NGRGM05xVU5FUlpCMFVIUUk1elVyQmtPYytEYVVOODJIVVBRVzB6UTRIUkNCQ2dWQUhNRERSS1VPeEdsYUpQbEJjWERJV3NOaEFGUktFRU5RaEJqMkJ3QjJXMDI1UWExVFpaQ0pQdEpMaDlValRXdFNmS09RKy9hMUFCQm9wMUVHbENaRFJSQlVLekVIcFFYQ1Zrd2grR2JIVkxkUWxFRUpRVkJFZ2RBc1VLcW44U1VRTFBaVkV0RStaOUV2a0lZV0lUbU1vT0ZEbUF0SVlDSUdVSHVRUng3ekVRaFZzR0tWZ1pDdFpNc0NDSUpzd21yR0FJSlg3RW1FamY2RlVHdWs1M3RVQVFIUWNsR1JOQVhBQkE2QkJudTBVd0lGSktIb09EQUk5azdTUnRXR0JRWE5xUUovbVRZVEFRVVFvQ2dKTUlqaWdoS09YaG9rMG8wQkFwY2FNMnpFb0tKb0lEQkkydUlXa1NTYUJOYUxFUUdkNmhnWnNoQWc0V0lJU2lxOEVnbGdrS0NpRGpDSmlFb1J2bU1nTUxONE1BSUdWcUlJWUxpeElHMDZFVUhRNGhWN0RKQmdad2lLRVNMU0Nnc1lZaTdJV1FNTWRSTUJkaWdBNGQ4eXlaaUlBaVJqSVFreWRqa2ZnQVFSRkM0Y1VDTmRMQTFYSURDUTA2d3ZBQklDd0JhT2dtWHVCZVVnZHlBY2pZUlJFUzZZUWx6cUpJZ01vRERBSU5DaGpGRTVCSkJRUUN1MmdTa2l4MmtKc1VqeUNWUDBzYUg0TUVtQ0pBanhpVEFRaHZpVVNLT3NvazhDaExMQU15U2lLcGozVUErZ1J1SVNDSW93Z0FBRXlLWm1VbFdjaUowL3JQSkZRcXl5U05sNmlIdEN3cVdISUt5QUJqRGc1dEpaVVVtOEt1Y0VlU1BNTG9JbEFLd0xJZDBRVHJGdk1naGdzSUZrVndUanRxd3FHL3VtTWVLUUNJelBoQ0pLRmo0UDRaODd6NlV6RWdXYldLd2tZREtKaFVJbjB0Wm85Q00wQ0F6UnNqSWpHcDBFQjMwTHdBcGFFaU94bWhNalZpZ0FVRnBRU0FGTW9FcmVPQUtFMEJYUWxoMmtpWVpaQmFaK1FSRDJPRE5rbVlrR0puSjVFSFd3Sk1jck9HQkNmblNTWndwRUFNa0lwazdWSWdhZGhHQUJjRGhuaHRSd2dCdllhK0N4RzkrY0pJVFFxb1lsQkxNYkNpeThFUm05b2FRSEc0dlhZWnExMEhJR3BSdGtLVUlnY2dNTVJUU2dTUDhRSGlSWVVpMEZtS0JjV1NHRjAwcC9rTFlncUlJenhWRUFUUUlndW1tV2hGbVpBWVBRNUhCTFRJVEFoNXhKUmFaWVlkTzBuQThuT3JCTEFleXlUbDB3b1J1QmtCM1pzbGhBTmJCRW5UQVFqTWNtT0pIVnFzUVpBWUZFQU1SQnl5a0VBRUdtTlVpSjZBQXA0S0NCWVk1QkxlNlBSMUMxQVVUelJyRURMMFR5QTNtMEVwZk5PRWlGaGdHVkRYVGhWY3k1QVdtUFVMUEZBS3drd2pNSUNld2owMWNBUUFsZ0lFMUs4Q0RMQ1R5RFROb1dET0l1T0JEVUtZeWhjZzFBSFFWQ0dOdDhnVmlERk9TQW1DQUc5UWdwbWZBZ3hPcGFBMENORkhLaHh6Mkp3cmhhZ0NhWjVCRlJQV2wwamtKQjdMZ2pFbk1vQVBCb01ZYUFvSEwzbENISXZ6NmhiOUlRcU4vQXVBR2RleE4vak15RU9VMjg4a1dGaG1YQjlCd0xveEl3emVlZUM0QWFHQU1OL2NtQlQwZ0VBaUVUS0tDRUdBV0gvYnpTVFNRaEM5a3pRQVoxTXdJOXBPUU5IeGlFbUFRbzJZVzRJSmppR0VWaFowUEtEYURBdXc2eEFMaEFNYzhob0VLQ1pDQ0NXNUFiOVlPZ29aNm1xRmJzeTRJUkhscjZIUm1xZzBWRE1RcWNuMFFIeFJKQkpVaTNrME80Z2doQ01FVlJTYjJRQUIxRWtIUlVpalNqZ2d6K3hwamd0UXZBS0RNdGtQS2VjNkVESElFaFJTM1EvclpTWFYvWk5mdWpyZTg1MDN2ZWsvazNPbTJkMEZJcUIydEl1VGI0ZGIzUUliVFZ3RWN4elRkTTRnQUhzRHdCNGhYSVJSbytBTUdJSkJvYU9IaVdnaHFRV0FnY1ltcm9BTWdsMGovL21xajdBRGtoaUJRWGwxRHZvMFVBRkRMSmdkUXVIUWkwSW1ISzhTeUp6OUk2azZpem9KOCszbzd0Y25mWEI2VW1CZEVBRzd1eEFjWXdoakhETzhpRk1qTTBoWHlBYWtMNU9Vbk1UcEJrTzdtQ0V3OUlXK0ppMzRyMGdLL0xXVFFObWs1MFdFdWN6OFBzU2tWaXFaQ2ZpVDBnV0E5QUZvZkNOZFBJb0NDVUdBR0NXaGxBSWF1RXdra2N5R3QvUHJkOHk2UXZRZWc3d2Y1UUN2ZlBwU3kyd1FHQ1lGQlVDaS85cXkzbmU4Sk1YeFF2bzZSb1pwWklIRS95UW9Ta25xVjI3M29uMys4UWxxSmVZUXdMU3k4SG9pU3ZYb1F6ZHVrQlFteC9Fa2V2dmpZUXg0aEN6NUo3USt5TTZsUXhjVVdtMzFRYkM2UXFOdUU4NTNIdS9FVi9wTDhBQ3ovWkVaUk8wSXFISUFMSDRUdVBEL0l0eWxPa09JZlBTakhQd2p0RTNKa1FtVldJVE1JQ3RBTHdtYWJTS0FnN3JkMThCZDZ6cElRWVRabUMwRmVpRGQ2QlZGMXZ6Y3RzUGQrTmhGL0JaRnkyRmNRY2tabi9vWVI2RGQ0QlpGL05yRjZBQmlCQWppQkJ6RUQ5Q1I3WkFHQ3kwWVFIZmgvSThoMkVuZ1NKU0J4a2xBQ3dvZE5wRGNVRG5nU0NGQVF5d044RUNpREplaG1NRmdXL2FkOEF5RjZMUmlEbmplRDBvRUFNekJlRHBZUWFLZDZBOUY2VXppRVQxaUV2b0VBSzdDRG8xSXFwOElRL01VdUROR0RBVUI1VVBhREJ4R0FlaGRWRFRDSGRKZ0JBdkI5REJFcGs1SnNGS1pZREpHRUFmQXMxdGVFVHFoOVVFaUIvaFJCYlFGZ2JkQUhKZzF4aFNvSGlWdkloWWJvaFlnNEVkdEdja2tXRkV3R2NVR0JGSUNZRUhEWWVBT0lFZVRXSldSR1ZBNlJjZ0N3UE9KWGlJd0hBSTUzaVJMQmJxZG5FZC9XZW9SSGliRTRpeGtCYng4eGlKb2hocTlIaEhGb2d1cVdjbW1uRUtNb2k2VW9ibzVYZDZKSWdzY0lldXJHaE5QSGpOUklpc2c0RktuekVqM1hFRG00aGd2UmpMNklFZnhtUWdvQlRZVElFSzNuZXROb2pOeG9qY0pCSEFaM2JTY0JFUkpBaDNOSWZRWFJDQWtRa0FsZ0NBWUJBdnk0aXhVeGN0MDJFQUFuY0FhQmMxWEJBSVNVRnc0NUVOT0FDeXlBQzM2UVdoVTVFVk13QVUwd0FXWFlrU1Jaa2laNWtoNFJRVmxCa1IyNUQwM1FOTGtuUEJBTldaSmV3QUk4ODN3SmNSb2x5V0t2YUJEc2FISW1XWC9veEhPM1NHLzVVQlFhWUFsd2haSU1ZUXFBOGdPbVVKUk1PWlZVV1pWV2FaVUJBUUFoK1FRQmxnQUFBQ3dHQUFZQVdRQ0xBSWN5elRMeDBVWHhwVVR5WDBQeVNFUHlWa1B5ZVVUeWdrVHd5RVR6VFVQeHlrWHlpa1R3eDBUeHRrWHlVVVB4dDBUeHJrWHh4a1h3djBUeW1FVHlpMFB4dVVUeWFrUHh5RVh4eEVYeWFFUHh1MFR4ekVYeHpVWHlrVVR4bEVUeVVrUHlqMFR4aGtUeHBFVHlia1R4dEVYeHcwWHluRVR4Z2tUeVZFUHllMFR5WlVQeG9FVHhzRVR5ZVVQeWJFUHhza1R4dTBYeWRFVHhyRVR5Y0VQeVowUHh2MFh4ZVVUeHpVVHlta1R4ajBUeGswUHlZMFB4cmtUeWpVVHhwMFR5V2tQeWFVUHhoRVR4bzBUeGRVUHlvVVR5V0VQeWNrUHhxVVR4cTBUeHFrVHlrMFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSS9nQUhRQWdRQU1JQUFBZ1RLbHpJc0tIRGh4QWpSaFJ3SWNBRkFRc2VFQ1RZUUtMSGp5QkRObFN3VVVHSmpSdEZxbHpKTW1HRWpSRmdDRUFwb3FYTm14RTdrS2hCb2tPTEJBY0VDRGlRQUtmUm93Z0xqTEF4b2dBQnBGQ2pTcDFLdGFyVnExaXphdDBLc1lDRkdSYWNKcUFBQVFLRm9seXhnbUR4Z0FXSUdETTMxa3g3RmNOR0RBMVFFcVI3bGNQR0RSYzBidXpJdDZvTXZ4dVE1QmdnQUFFREFRY0xVN1VRWWtFSUlCOGthOTdNdWJQbno2QS9FM0JRd01GVEFBTW9VSWdjK3FhQkNTWW1HQmpnQWFXSDFqY3JiS3l3QWdGS0JyaHQzdmpMUUFKS0NjRmJhdGlvUVlBQjN3RVlHRWpPTWdVT0lqaFM3RUE0Z0RWMWxRUlEvdnhBY2ZxNytmUG8wNFBPa0VFOVNCVW5GcHhROGVFNVFRVFQzVStzZUhHQjhZM0k2UWNSU1FTWkJCMUJ3QW40MEVzRXhWVGJSam9vK0pCT1BQbUUyZ0VIZUNmaFFrb3g1ZFNHSUlZbzRvZ2tLdVNWRVM0NHhSaEJrSlVJd0ZvVnZQQ1dZQnk1YUJkQmVPa1ZnSXNFQm1CU1hBVE5SV0lTaUIyeEFGQkNFZVVpWlpaaDV1S1RVRVlwWldHamxmWVVVR1VwV2VKcnNjMEdaQUJDanFnYlFienA2T0p3QkczQUFJMEJFRWJpbUFId3RtSUFMVzRKbTJ3YVBsbWxhVlAyNmVlZk9LVzIycE0wQkxGQUVEUjg4Q0JCdDVYb0Ewa0srTERBZ2RIeFdGSUoveEVVSUlrM0JvQ1hmZEhsUnlJSUwyZ2dZd3dJc1FkbEFTNE1rV0o1L29ER0t1dXNDNm42Skt1dU9nVXFmaTUyVU9vTFBtVWF3S1lqTWhoQVRKUW1TR0tQSmkwYVFJUWxVbVFSUnFpcGxtZUk4TWxISDYzY2R1dXRpSHMrTldlZEpLWndwM1pzdWpuaWNnUTFaMmFKYUFhZzVwZGhpZ2duYjFoQ29DV0pYT0xaWjdqZkJpeHdpUG51T3lLVElWandBYjB1SGhZQUJ6TGs4QzZKZnFVWkdFcnFpdGdwWHVOZXUrRmFiYjNWcDFkZ2ZUand5U2lqSjZqSEczYllGQUhPTmtvaWhUMjFrS3lMeHNZa0xMRWlNbHNDcU5LNUtHMS9xYmIzWkxielpaYnkwa3kzWnF1TDRZMzMxSzZpam1nZGR0cnQ3Q0s3QVRSM003ekVPUXZ0bTd1dFVPMmdMdlk3MjcrazhkbjAyM0FYeHBodjVCNWNXY0lmcE51d1VWOFFTNnlYaXhYTGV4Rk5OdDdWUU1Gb2tkZ0REdy93MEFPcVU2SkF3d3cwa0JmMzVaaGZoZVJRaVk5WXhBd2VFc0J3aVVvOFVHRUxFeGNMRXd4NmwraHp4eTRLOFZJRVFpelE1d0hMYVpCaFFBQWgvaFZOWVdSbElIZHBkR2dnVTJOeVpXVnVWRzlIYVdZQU93PT0nIHRpdGxlPSfngrnlh7vkuLvlm77moIflvLnlh7rop6PmnpDvvIzngrnlh7vlj7PkvqfliJfooajnq5nlhoXop6PmnpAnIHN0eWxlPSd3aWR0aDoiK2ljb25WaXBXaWR0aCsicHg7aGVpZ2h0OiIraWNvblZpcFdpZHRoKjEuNSsicHgnPiIKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0ncGxheUxpbmVEaXYgemhtX3BsYXlfdmlkZW9fd3JhcCcgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPiIKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSAiPGRpdiBjbGFzcz0nemhtX3BsYXlfdmlkZW9fbGluZSc+IjsKCiAgICAgICAgICAgIHBsYXlXcmFwSHRtbCArPSI8ZGl2Pjx1bCBjbGFzcz0nemhtX3BsYXlfdmlkZV9saW5lX3VsJz4iOwoKICAgICAgICAgICAgcGxheUxpbmUuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZihwbGF5VmlkZW9DbGFzcy5nZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJykgPT0gaXRlbS51cmwpewoKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZD0nemhtX2xpbmVfc2VsZWN0ZWQnOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwbGF5V3JhcEh0bWwgKz1gPGxpIGNsYXNzPSdwbGF5TGluZVRkIHpobV9wbGF5X3ZpZGVvX2xpbmVfdWxfbGkgJHtzZWxlY3RlZH0nIHVybD0nJHtpdGVtLnVybH0nID4ke2l0ZW0ubmFtZX08L2xpPmA7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgcGxheVdyYXBIdG1sICs9IjwvZGl2PjwvZGl2PjwvZGl2PiI7CgogICAgICAgICAgICAvL3RlbXBsYXRlOm5vZGU75pKt5pS+5Yy65Z+fCgogICAgICAgICAgICBsZXQgcGxheUp4SHRtbCA9ICI8ZGl2IGNsYXNzPSd6aG1fcGxheV92aWRlb19qeCc+IjsKCiAgICAgICAgICAgIHBsYXlKeEh0bWwgKz0gIjxpZnJhbWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBmcmFtZWJvcmRlcj0nMCcgc2Nyb2xsaW5nPSdubycgYWxsb3dmdWxsc2NyZWVuPXRydWUgYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBuYW1lPSdqeF9wbGF5JyBzdHlsZT0naGVpZ2h0OjEwMCU7d2lkdGg6MTAwJScgaWQ9J3BsYXlJZnJhbWUnPjwvaWZyYW1lPjwvZGl2PiI7CgogICAgICAgICAgICAvL+W+queOr+WIpOaWreaYr+WQpuWcqOaSreaUvumhte+8jOaYr+WImeaJp+ihjOS4i+mdogogICAgICAgICAgICBsZXQganhWaWRlb0RhdGEgPSBbCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii5wbGF5ZXJfX2NvbnRhaW5lciIgLG1hdGNoOi9odHRwczpcL1wvdi5xcS5jb21cL3hcL2NvdmVyXC9bYS16QS1aMC05XSsuaHRtbC8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllci1jb250YWluZXIiICxtYXRjaDovaHR0cHM6XC9cL3YucXEuY29tXC94XC9jb3ZlclwvW2EtekEtWjAtOV0rXC9bYS16QS1aMC05XSsuaHRtbC8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnLG5hbWU6J3FxUEMnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLmNvbnRhaW5lci1wbGF5ZXIiICxtYXRjaDovdlwucXFcLmNvbVwveFwvcGFnZS8sYXJlYUNsYXNzTmFtZTonbW9kX2VwaXNvZGUnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL3hcL21cL3BsYXlcP2NpZC99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwveFwvcGxheVwuaHRtbFw/Y2lkPS99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwudlwucXFcLmNvbVwvcGxheVwuaHRtbFw/Y2lkXD0vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbWF0Y2g6L21cLnZcLnFxXC5jb21cL2NvdmVyXC8uKmh0bWwvfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNmbGFzaGJveCIsbWF0Y2g6L15odHRwczpcL1wvd3d3XC5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidxeS1lcGlzb2RlLW51bScsbmFtZTonaXFpeWlQYyd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIubS12aWRlby1wbGF5ZXItd3JhcCIsbWF0Y2g6L15odHRwczpcL1wvbS5pcWl5aVwuY29tXC9bdndhXVxfLyxhcmVhQ2xhc3NOYW1lOidtLXNsaWRpbmctbGlzdCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIuaW50bC12aWRlby13cmFwIixtYXRjaDovXmh0dHBzOlwvXC93d3dcLmlxXC5jb21cL3BsYXlcLy8sYXJlYUNsYXNzTmFtZTonbS1zbGlkaW5nLWxpc3QnfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG1hdGNoOi9tXC55b3VrdVwuY29tXC9hbGlwYXlfdmlkZW9cL2lkXy99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovbVwueW91a3VcLmNvbVwvdmlkZW9cL2lkXy99LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIjcGxheWVyIixtYXRjaDovdlwueW91a3VcLmNvbVwvdl9zaG93XC9pZF8vfSwKCiAgICAgICAgICAgICAgICAvL3tmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLnBsYXllci1jb250YWluZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvdmlkZW8vfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI2JpbGliaWxpLXBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC5iaWxpYmlsaVwuY29tXC92aWRlby8sbmFtZTonYmlsaVBjJyxhcmVhQ2xhc3NOYW1lOid2aWRlby1lcGlzb2RlLWNhcmQnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllcl9tb2R1bGUiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3d3d1wuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC13cmFwcGVyIHJlcG9ydC13cmFwLW1vZHVsZSd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIucGxheWVyLWNvbnRhaW5lciIsbm9kZVR5cGU6J2NsYXNzJyxtYXRjaDovbVwuYmlsaWJpbGlcLmNvbVwvYmFuZ3VtaS8sYXJlYUNsYXNzTmFtZTonZXAtbGlzdC1wcmUtY29udGFpbmVyIG5vLXdyYXAnfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLm1wbGF5ZXIiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L21cLmJpbGliaWxpXC5jb21cL3ZpZGVvXC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6Ii52aWRlby1hcmVhIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC5tZ3R2XC5jb21cL2IvfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI21ndHYtcGxheWVyLXdyYXAiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L21ndHZcLmNvbVwvYi8sYXJlYUNsYXNzTmFtZTonZXBpc29kZS1pdGVtcyBjbGVhcmZpeCd9LAogICAgICAgICAgICAgICAge2Z1bmNOYW1lOiJwbGF5VmlkZW8iLCBub2RlOiIueC1wbGF5ZXIiLG5vZGVUeXBlOidjbGFzcycsbWF0Y2g6L3R2XC5zb2h1XC5jb21cL3YvfSwKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiLngtY292ZXItcGxheWJ0bi13cmFwIixub2RlVHlwZTonY2xhc3MnLG1hdGNoOi9tXC50dlwuc29odVwuY29tL30sCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXJXcmFwIixub2RlVHlwZTonaWQnLG1hdGNoOi9maWxtXC5zb2h1XC5jb21cL2FsYnVtXC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNsZV9wbGF5Ym94Iixub2RlVHlwZTonaWQnLG1hdGNoOi9sZVwuY29tXC9wdHZcL3ZwbGF5XC8vLGFyZWFDbGFzc05hbWU6J2p1amlfZ3JpZCd9LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3BsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovcGxheVwudHVkb3VcLmNvbVwvdl9zaG93XC9pZF8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwcHR2X3BsYXlwYWdlX2JveCIsbm9kZVR5cGU6J2lkJyxtYXRjaDovdlwucHB0dlwuY29tXC9zaG93XC8vfSwKCiAgICAgICAgICAgICAgICB7ZnVuY05hbWU6InBsYXlWaWRlbyIsIG5vZGU6IiNwbGF5ZXIiLG5vZGVUeXBlOidpZCcsbWF0Y2g6L3ZpcFwuMTkwNS5jb21cL3BsYXlcLy99LAoKICAgICAgICAgICAgICAgIHtmdW5jTmFtZToicGxheVZpZGVvIiwgbm9kZToiI3ZvZFBsYXllciIsbm9kZVR5cGU6J2lkJyxtYXRjaDovd3d3XC4xOTA1LmNvbVwvdm9kXC9wbGF5XC8vfSwKICAgICAgICAgICAgXTsKCiAgICAgICAgICAgIC8v5Yib5bu6bG9nb19pY29uCiAgICAgICAgICAgIHBsYXlWaWRlb0NsYXNzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsJ3pobUljb24nKTsKCiAgICAgICAgICAgIGxldCB6aG1QbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3pobUljb24nKTsKCiAgICAgICAgICAgIHpobVBsYXkuaW5uZXJIVE1MID0gcGxheVdyYXBIdG1sOwoKICAgICAgICAgICAgbGV0IGp4VmlkZW9XZWIgPSBqeFZpZGVvRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2goaXRlbS5tYXRjaCk7CgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgLy/mi5bmi73lm77moIcKICAgICAgICAgICAgdmFywqB6aG1Mb2dvRHJhZz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjemhtbG9nbyIpOwoKICAgICAgICAgICAgdmFyIHpobUxvZ29JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmljb25Mb2dvIik7CgogICAgICAgICAgICBpZighemhtTG9nb0RyYWcgfHwgIXpobUxvZ29JY29uKXJldHVybjsKCgogICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNlZG93biA9IGZ1bmN0aW9uKGV2ZW50KXsKCiAgICAgICAgICAgICAgICBpZihldmVudC53aGljaD09MylyZXR1cm4gZmFsc2U7Ly/lsY/olL3lj7PplK4KCiAgICAgICAgICAgICAgICBsZXQgc2Vkb3duVG9wID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wOwoKICAgICAgICAgICAgICAgIGxldCB6aG1Mb2dvSWNvbkhlaWdodCA9IHpobUxvZ29JY29uLm9mZnNldEhlaWdodDsKCiAgICAgICAgICAgICAgICBsZXQgYm90dG9tU3BhY2UgPSAxMDsKCiAgICAgICAgICAgICAgICBpZihldmVudC50YXJnZXQuY2xhc3NOYW1lICE9ICdpY29uTG9nbycpcmV0dXJuOwoKICAgICAgICAgICAgICAgIC8vbGV0wqBzaGlmdFjCoD3CoGV2ZW50LmNsaWVudFjCoC3CoHpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CiAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsKCiAgICAgICAgICAgICAgICBsZXTCoHNoaWZ0WSA9IGV2ZW50LmNsaWVudFktemhtTG9nb0RyYWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwoKICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnBvc2l0aW9uwqA9wqAnZml4ZWQnOwoKICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh6aG1Mb2dvRHJhZyk7CgogICAgICAgICAgICAgICAgZnVuY3Rpb27CoG9uTW91c2VNb3ZlKGV2ZW50KXsKCiAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOwogICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLmxlZnTCoD3CoCc1cHgnOwoKICAgICAgICAgICAgICAgICAgICAvL2xldCBoZWlnaHQgPSB6aG1Mb2dvRHJhZy5vZmZzZXRUb3AremhtTG9nb0ljb25IZWlnaHQrYm90dG9tU3BhY2U7CgogICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB6aG1Mb2dvSWNvbkhlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBldmVudC5wYWdlWS1zaGlmdFk7CgogICAgICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCgwLCB5KSwgaGVpZ2h0KTsKCiAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0geSsncHgnOwoKLyoKICAgICAgICAgICAgICAgICAgICBpZih6aG1Mb2dvRHJhZy5vZmZzZXRUb3AgPCAwIHx8IHdpbmRvdy5pbm5lckhlaWdodCA8IGhlaWdodCl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ+i2heWHuue7iOatoicpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wIDwgMD8nMHB4Jzp3aW5kb3cuaW5uZXJIZWlnaHQgPCBoZWlnaHQ/d2luZG93LmlubmVySGVpZ2h0LXpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlKydweCc6ZXZlbnQucGFnZVktc2hpZnRZKydweCc7CiAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy/lnKhtb3VzZW1vdmXkuovku7bkuIrnp7vliqjlm77moIcKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsb25Nb3VzZU1vdmUpOwogICAgICAgICAgICAgICAgLy/mjInkuIvlm77moIfvvIzlubbnp7vpmaTkuI3pnIDopoHnmoTlpITnkIbnqIvluo8KICAgICAgICAgICAgICAgIGRvY3VtZW50Lm9ubW91c2V1cMKgPcKgZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHpobUxvZ29EcmFnLm9mZnNldFRvcCt6aG1Mb2dvSWNvbkhlaWdodCtib3R0b21TcGFjZTsKCiAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wIDwgMCl7CgogICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS50b3AgPScwcHgnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYod2luZG93LmlubmVySGVpZ2h0IDwgaGVpZ2h0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9d2luZG93LmlubmVySGVpZ2h0LXpobUxvZ29JY29uSGVpZ2h0LWJvdHRvbVNwYWNlKydweCc7CgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoemhtTG9nb0RyYWcub2Zmc2V0VG9wPT1zZWRvd25Ub3AgJiYganhWaWRlb1dlYi5sZW5ndGggPiAwICYmIHpobUxvZ29EcmFnLm9mZnNldFRvcD4wICYmIHdpbmRvdy5pbm5lckhlaWdodCA+IGhlaWdodCl7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW9DbGFzcy5yZXF1ZXN0KCdnZXQnLGAke3pobUFwaVVybH0vanhjb2RlLnBocD9pbj0ke2p4Q29kZUluZm8uaW59JmNvZGU9JHtqeENvZGVJbmZvLmNvZGV9YCkudGhlbigocmVzdWx0KT0+ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9YCR7emhtQXBpVXJsfS9qeGp4LnBocD9scnNwbT0ke3Jlc3VsdH0memhtX2p4PSR7bG9jYXRpb24uaHJlZn1gOwoKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0aChlcnI9Pnt9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wICYmIGp4VmlkZW9XZWIubGVuZ3RoID09IDAgJiYgemhtTG9nb0RyYWcub2Zmc2V0VG9wPjAgJiYgd2luZG93LmlubmVySGVpZ2h0ID4gaGVpZ2h0KXsKCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+35Zyo6KeG6aKR5pKt5pS+6aG154K55Ye75Zu+5qCHJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsemhtTG9nb0RyYWcub2Zmc2V0VG9wKTsKCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyzCoG9uTW91c2VNb3ZlKTsKCiAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZXVwwqA9wqBudWxsOwoKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgemhtTG9nb0RyYWcub25kcmFnc3RhcnTCoD3CoGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICByZXR1cm7CoGZhbHNlOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy/mmK/lkKblnKjmkq3mlL7pobUKICAgICAgICAgICAgaWYoanhWaWRlb1dlYi5sZW5ndGggPiAwKXsKCiAgICAgICAgICAgICAgICB2YXIge2Z1bmNOYW1lLG1hdGNoOm5vd01hdGNoLG5vZGU6bm93Tm9kZSxuYW1lOm5vd05hbWV9ID0ganhWaWRlb1dlYlswXTsKCiAgICAgICAgICAgICAgICAvL+m8oOagh+e7j+i/h+aYvuekuue6v+i3rwogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlCdXR0b24nKS5vbm1vdXNlb3Zlcj0oKT0+ewoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdibG9jayc7CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5QnV0dG9uJykub25tb3VzZW91dD0oKT0+ewoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheUxpbmVEaXYiKS5zdHlsZS5kaXNwbGF5PSdub25lJzsKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy/pgInmi6nnur/ot6/op6PmnpDmkq3mlL4KCiAgICAgICAgICAgICAgICB2YXIgcGxheUxpbmVUZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wbGF5TGluZVRkJyk7CgogICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheUxpbmVUZC5mb3JFYWNoKGZ1bmN0aW9uKGUpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdjbGFzcycsJ3BsYXlMaW5lVGQgemhtX3BsYXlfdmlkZW9fbGluZV91bF9saScpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywncGxheUxpbmVUZCB6aG1fcGxheV92aWRlb19saW5lX3VsX2xpIHpobV9saW5lX3NlbGVjdGVkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5VmlkZW9DbGFzcy5zZXRDb29raWUoJ3BsYXlMaW5lQWN0aW9uJyx0aGlzLmdldEF0dHJpYnV0ZSgndXJsJyksMzApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vd1dlYk5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5vd05vZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobm93V2ViTm9kZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93V2ViTm9kZS5pbm5lckhUTUwgPSBwbGF5SnhIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5SWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlJZnJhbWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWZyYW1lLnNyYz0gaXRlbS5nZXRBdHRyaWJ1dGUoJ3VybCcpK2xvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6KeG6aKR572R56uZ57uT54K55LiN5a2Y5ZyoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIC8qLS3nibnmrorlpITnkIYtLSovCiAgICAgICAgICAgICAgICAvL+S8mOmFt+WOu+W5v+WRigogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXIiKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdWt1QWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWR2ZXJ0aXNlLWxheWVyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeWtBZCA9IHlvdWt1QWQubGFzdENoaWxkOwoKICAgICAgICAgICAgICAgICAgICAgICAgeWtBZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHlrQWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmt1aS1kYXNoYm9hcmQtMCcpLnN0eWxlPSdkaXNwbGF5OmZsZXgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsYXlWaWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlby1sYXllciB2aWRlbycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvLnBsYXkoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuPTA7CgogICAgICAgICAgICAgICAgICAgICAgICAvL+aaguWBnAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLXBsYXktaWNvbi0wJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWxheWVyIHZpZGVvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobisrJTIgPT0gMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGxheVZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLGZ1bmN0aW9uKCl7IC8v5pKt5pS+5pe26Ze05pS55Y+YCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlvdWt1QWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWR2ZXJ0aXNlLWxheWVyJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHlrQWQgPSB5b3VrdUFkLmxhc3RDaGlsZDsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeWtBZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlrQWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5a0FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcua3VpLWRhc2hib2FyZC0wJykuc3R5bGU9J2Rpc3BsYXk6ZmxleCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+eIseWlh+iJuuWOu+W5v+WRigogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNmbGFzaGJveCIpewoKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNraXBwYWJsZS1hZnRlcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9tKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20uY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSwzMDAwKQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+iFvuiur+WOu3ZpcOW8ueeqlwogICAgICAgICAgICAgICAgaWYobm93Tm9kZT09IiNwbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIGxldCBuID0gMDsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4rKyA8IDEwMCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhbmVsVGlwVmlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVsLW92ZXJsYXknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYW5lbFRpcFZpcCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsVGlwVmlwLnN0eWxlLmRpc3BsYXk9J25vbmUnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9LDEwMCkKCgoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+S5kOinhumAiembhuWkhOeQhgogICAgICAgICAgICAgICAgaWYobm93Tm9kZSA9PSAiI2xlX3BsYXlib3giKXsKCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpCbG9jayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qX2Jsb2NrJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZighakJsb2NrKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGpCbG9jay5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlkZW9JZCA9IGpCbG9ja1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBgaHR0cHM6Ly93d3cubGUuY29tL3B0di92cGxheS8ke3ZpZGVvSWR9Lmh0bWxgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpCbG9ja1tpXS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgnaHJlZicsbGluayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LDMwMDApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9C56uZ5aSn5Lya5ZGYdXJs5aSE55CG77yM6aG16Z2iY2xhc3PkuI3kuIDoh7QKICAgICAgICAgICAgICAgIGlmKG5vd05vZGUgPT0gIi5wbGF5ZXItY29udGFpbmVyIil7CgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheWVyLWNvbnRhaW5lcicpICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnB4LXBsYXllci1jb250YWluZXInKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcucGxheWVyLW1hc2snOwoKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93Tm9kZSA9ICcuYnB4LXBsYXllci1jb250YWluZXInOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0sMzAwMCkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+WFqOWxgGNsaWNr55uR5ZCsCiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgIC8q54ix5aWH6Im66YCJ6ZuG5Y675bm/5ZGKKi8KICAgICAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0naXFpeWlQYycpewoKICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jbGFzc05hbWUuaW5kZXhPZignc2VsZWN0LWl0ZW0nKSE9IC0xKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNraXBwYWJsZS1hZnRlcicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbS5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9LDUwMDApCgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbGV0IGFyZWFDbGFzc05hbWUgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uY2xhc3NOYW1lID09IG5vd1dlYlswXS5hcmVhQ2xhc3NOYW1lKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhQ2xhc3NOYW1lPWl0ZW07CgogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICBpZihhcmVhQ2xhc3NOYW1lLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+S4jeWcqOmAiembhuiMg+WbtCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZihub3dOYW1lPT0ncXFQQycpewoKICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jbGFzc05hbWU9PSdlcGlzb2RlLWxpc3QtcmVjdF9faXRlbScgfHwgaXRlbS5jbGFzc05hbWUuaW5kZXhPZignZXBpc29kZS1pdGVtJykgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmPWxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYobm93TmFtZSA9PSAnYmlsaVBjJyl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Zyo5YWD57Sg6IyD5Zu05YaF77yM5LiN55So6Lez6L2s77yMCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSBbJ2JweC1wbGF5ZXItdmlkZW8tYXJlYSddOy8v54K55Ye75YWD57Sg6IyD5Zu077yM6IyD5Zu05Y+W6KeG6aKR5pKt5Y+R5Yy65Z+f44CC5ZCO57ut5pyJ6Lez6L2s6ZSZ6K+v77yM5paw5aKe5Yy65Z+f5Y2z5Y+v44CCCgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2hOdW0gPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXRoLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjbGFzc05hbWUuaW5kZXhPZihpdGVtLmNsYXNzTmFtZSkgIT0gLTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTnVtKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2hOdW0gPiAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvL+inhumikemhtemdoumAiembhui3s+i9rAogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpZGVvQ2xhc3NOYW1lID0gWyd2aWRlby1lcGlzb2RlLWNhcmQnXTsvL+inhumikemhtemdoue7rembhmRvbQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvQ2xhc3NOYW1lLmluZGV4T2YoaXRlbS5jbGFzc05hbWUpICE9IC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHZhciBvYmpMaW5rID0ge307CgogICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5ocmVmKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLmhyZWYgPSBpdGVtLmhyZWY/aXRlbS5ocmVmOicnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsudGFyZ2V0ID0gaXRlbS50YXJnZXQ/aXRlbS50YXJnZXQ6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgIGlmKG9iakxpbmsuaHJlZiAmJiBvYmpMaW5rLnRhcmdldCAhPSAnX2JsYW5rJyl7CgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gb2JqTGluay5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgIC8q6IW+6K6v6KeG6aKR54K55Ye75YW25a6D6KeG6aKR6Lez6L2sKi8KICAgICAgICAgICAgICAgIGlmKG5vd05hbWU9PSdxcVBDJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlJyk7CgogICAgICAgICAgICAgICAgICAgIGxldCBmaWd1cmVEZXRhaWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlndXJlX2RldGFpbCcpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdEl0ZW0gPSBbLi4uZmlndXJlLC4uLmZpZ3VyZURldGFpbF07CgogICAgICAgICAgICAgICAgICAgIGlmKGxpc3RJdGVtLmxlbmd0aCA+IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxpbmspewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxpbms7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBsYXlNdXNpY0Z1bmMoKXsKCiAgICAgICAgICAgIGlmKHNlbGYuZnJhbWVFbGVtZW50ICYmIHNlbGYuZnJhbWVFbGVtZW50LnRhZ05hbWUgPT0gIklGUkFNRSIpewoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHBsYXlNdXNpY0NsYXNzID0gbmV3IFBsYXlNdXNpY0NsYXNzKCk7CgogICAgICAgICAgICBjb25zdCB3ZWJVcmwgPSAnaHR0cDovL211c2ljLmVnZ3ZvZC5jbi8nOwoKICAgICAgICAgICAgdmFyIG11c2ljSWQgPSBNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSoxMDAwMDAwMDApOwoKICAgICAgICAgICAgdmFyIG11c2ljSHRtbCA9ICI8ZGl2IGhyZWY9J2phdmFzY3JpcHQ6dm9pZCgwKScgaWQ9bXVzaWMiK211c2ljSWQrIiBjbGFzcz0nemhtX2ljb24nIHN0eWxlPSdjdXJzb3I6cG9pbnRlcjt6LWluZGV4Ojk5OTk5OTk7ZGlzcGxheTpibG9jazt3aWR0aDoiK2ljb25WaXBXaWR0aCsicHg7cG9zaXRpb246Zml4ZWQ7IitpY29uVmlwUG9zaXRpb24rIjowO3RvcDoiK2ljb25WaXBUb3ArInB4O3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBzcmM9J2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaFpBQ1dBUGNBQVBKRVEvdjcrZm5MeVBqQ3dmUm5aZm5UMFBKS1Nmakd4UHYyOVBuWTEvTmJXdnYxOC9hVWsvcmw0L3J3N3ZuS3lQYUppUHJyNmZhYW1QUnljZmFMaXZ2NTkvSkpTUHJ2N2ZOVlZQbmUzZnJ0Ni9OUVQvdjYrUGVscFBhZ252UjNkdmk2dVB2ejhmZXhyL25PelBlZ252cms0dlIxYy9KR1JmcnE2UG5RenZqQ3dQblMwUG5aMS92dzd2bmEyZmVvcC9lbXBmcmMydk5VVS9peHIvUjRkdldKaC9lc3F2SkhSdnZ4Ny9yeThmTlNVZk5XVlBqQndQVjZlZmFNaXZuZjNmaTh1dldEZ3Z2NDl2cnA2UHJ5OFBKUFR2YVlsL25UMGZuVzFQZXJxZlJzYS9SdmJ2V0FmL1Y5ZlBuazR2aTJ0ZlJqWWZSaFgvdnU3UE5ZVi9KRlJQbms0ZmFIaGZhWGx2djM5ZnJoMy9pN3V2bk55L25PeS9yczZ2ZXJxdlJnWHZuZDIvYUdoUFdSa1BWL2Zmcmk0UHJqNFBpd3Jmbkx5ZmFVa3ZSZlhmSk5UUGpGdy9leXNmUmxZL1J4Y1B2djdmZXpzdmkwc3Z2MjgvYWJtdmVxcVBlcHFQSk1TL2V5c1BXT2pmTmRYUFJ6Y3Z2MDh2UnViZnJvNXZlaW9mZWxvL05aV1BuWjJQTnBhUG5VMHZSZlh2bkh4Zml1clBqQXYvblF6ZnJuNWZuYzIvZTBzdmFkblBlNHQvYVNrZk5YVnZSbVpQZXRxdm5ZMXZpOHUvZWlvUGl0cS9pL3ZmUndiL1IxZFBuZTNQYWVuZmFjbXZlM3R2blJ6L3JqNGZhWGxmVitmUFdGaFBKTFN2YU5pL1dNalBSMGMvYVZrL1dQai9hZG0vcnA1L25JeHZSb1p2UmlZZmpEd3ZhVmxQSk9UZmUydGZOcWFmSlJVUGVrb3ZhYW1mTmFXZlY4ZXZuZDNQbk56UG5WMVBlc3EvakV3L1Y2ZVBSM2QvbmczdnJ3N2ZhV2xQZW5wZmFmbmZXUGp2aXdydk5XVmZuTXl2aTZ1ZlYvZnZWOWUvbmIydnJ1Ni9Sa1l2akF2dm5JeGZSaVlQaTl2UGVnbi9WN2VmZWpvZmUxdFBXQ2dmcm01UEpJUi9uYzJ2TmNXL0pRVC9qRnhQdnk4UFdEZ2ZXQmYvUnNiUFY1ZC9OcGFmTmNYUG5mM3ZhSWh2UnZiL2l2cmZuWDF2TlJVZmFLaWZSdGJQYVpsL05lWFBlNXVQV0NnUFJyYXZhSWgvTm9aL25KeC9XRmcvaTl1L1IyZGZqSHh2akl4dk5UVXZpL3Z2ZTFzL05lWFFBQUFBQUFBQUFBQUFBQUFDSC9DMDVGVkZORFFWQkZNaTR3QXdFQUFBQWgrUVFFbGdBQUFDd0FBQUFBWkFDV0FBQUkvZ0FCQ0J4SXNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWx4SVlFU0FBQ01JakZ4cFVJV0RBQTVVZUZqSTR1VEpCQ3h6Q3N4aGs4aVFoVFp0NnN5cHdhYUdEQXNIQk9VeGxPVUxKQ1dRdktpeGNBT0RBUU1ZYkdpNlVrR1BHajBVR09CS3RxelpzMmpUcWwzTHRxTUNFMDFNaUsxS1lzUUlFbHM3Zm1GQ2E5RVdGNGtRaENpVFFvVUlUVXpTZk95UWdrV0tEa0dTTHRXb0E5aXVaVUV6YXc0Z0JacVZJaHRSMkVTQlU2Rm1qRFFPQ2RuTWVqTUNMUk15THJDNTRBTE5vS1Vwam5IUnVuZnJUdlV1bnBtOTRNRWZrZ01jWEJpZ2N1SWwzcjZqc3o2am9LSUpDUjRrbU5neEVrTWozeVhvL21rQ0phaVdCVFZmOUZpWk02bEVid1NvVHJROXlFc0s2d3FxU09WeEtNTldramVzdWREY2ZBQmNRd2RyZlZ3aEEwVVdoSUhJWmtMMFFxQWFLMnptaVE4M1pBVEZFWm9WTWg4R3ltaUdBQ1VXY0VURkZRZ0U5VUJFQm1DZ0FBWmpNVVFBQ1NRTXFKQU1aV2ptZ21JZmZaSEFTUXVVRWhFRUlqd2hBZ1EySG1SRFVEWXNwQVowUWQxUllrZ25pTUZBRkJMRllGTU1RQ3owa2syMkpYVENnNW1oUVpZZFZwQmp4MEp5MEJabVFrNEVWWVZDZFdUR1FUcGtFVkpVQUM2QWx0QVBObVdpd2tJUWZIa0JCQW4xWXFjVlpma1JwVUkreEFGRUhENG8wUkFCU1Jha0E0QkJqV0pXQjVuRmhwQUJVMFF4Ull3WTNaR1pMbWZsc1pwTi9tVk11VkliSEFTVmhheGxNWkxaS1RtbEVCUUhzYVIxUW9nMjlTSGZTS1ZrWnNaYTZtUkdnVVlUaUdwUUFVRzk0ZWRDT3BnVWdoZXZnTFJGVUM0Y3RBUURIakN3QkhjS0ZYcVNBNGdTeEVlWkR1a1QxREtPSE11UkhrRnBjSkJMTU1tMFVKdzJ6VWtRSEVGMWdlcENlMmptU3pJZU5XTlRPd2Z4ZEpKUFhnYjFKZ0FXaEJBVU1BKzFsZ0l6SEoxUXh4YWJyR25RbmdFY3RkQ1NOaVZCa0RkQlZYQXRRN1d5eGdFbmorVDBWRlJUeWNnQUEwa1NiRk1yRUZYZzJ4NlVtQ3lTVjJETlJWRVdRVEg2a05IUnBUSUtGUVFhaEVGbUdCUWRWQ0c1dEFhR0d4ajlzVUFGakh5RVRGQmxSUFRxU1M4QUVFWWZyUlZDU0VWdUJNV0gva2ViQkFXQzIwSFZJWkFvd21pOFdRVWk0RE5SblRiNTRkRjNOcVVORVJaQjBVSFFJNXpVckJrT2MrRGFVTjgySFVQUVcwelE0SFJDQkNnVkFITUREUktVT3hHbGFKUGxCY1hESVdzTmhBRlJLRUVOUWhCajJCd0IyVzAyNVFhMVRaWkNKUHRKTGg5VWpUV3RTZktPUSsvYTFBQkJvcDFFR2xDWkRSUkJVS3pFSHBRWENWa3doK0diSFZMZFFsRUVKUVZCRWdkQXNVS3FuOFNVUUxQWlZFdEUrWjlFdmtJWVdJVG1Nb09GRG1BdElZQ0lHVUh1UVJ4N3pFUWhWc0dLVmdaQ3RaTXNDQ0lKc3dtckdBSUpYN0VtRWpmNkZVR3VrNTN0VUFRSFFjbEdSTkFYQUJBNkJCbnUwVXdJRkpLSG9PREFJOWs3U1J0V0dCUVhOcVFKL21UWVRBUVVRb0NnSk1JamlnaEtPWGhvazBvMEJBcGNhTTJ6RW9LSm9JREJJMnVJV2tTU2FCTmFMRVFHZDZoZ1pzaEFnNFdJSVNpcThFZ2xna0tDaURqQ0ppRW9Sdm1NZ01MTjRNQUlHVnFJSVlMaXhJRzA2RVVIUTRoVjdESkJnWndpS0VTTFNDZ3NZWWk3SVdRTU1kUk1CZGlnQTRkOHl5WmlJQWlSaklRa3lkamtmZ0FRUkZDNGNVQ05kTEExWElEQ1EwNnd2QUJJQ3dCYU9nbVh1QmVVZ2R5QWNqWVJSRVM2WVFsenFKSWdNb0REQUlOQ2hqRkU1QkpCUVFDdTJnU2tpeDJrSnNVanlDVlAwc2FINE1FbUNKQWp4aVRBUWh2aVVTS09zb2s4Q2hMTEFNeVNpS3BqM1VBK2dSdUlTQ0lvd2dBQUV5S1ptVWxXY2lKMC9yUEpGUXF5eVNObDZpSHRDd3FXSElLeUFCakRnNXRKWlVVbThLdWNFZVNQTUxvSWxBS3dMSWQwUVRyRnZNZ2hnc0lGa1Z3VGp0cXdxRy91bU1lS1FDSXpQaENKS0ZqNFA0Wjg3ejZVekVnV2JXS3drWURLSmhVSW4wdFpvOUNNMENBelJzaklqR3AwRUIzMEx3QXBhRWlPeG1oTWpWaWdBVUZwUVNBRk1vRXJlT0FLRTBCWFFsaDJraVlaWkJhWitRUkQyT0ROa21Za0dKbko1RUhXd0pNY3JPR0JDZm5TU1p3cEVBTWtJcGs3VklnYWRoR0FCY0Robmh0UndnQnZZYStDeEc5K2NKSVRRcW9ZbEJMTWJDaXk4RVJtOW9hUUhHNHZYWVpxMTBISUdwUnRrS1VJZ2NnTU1SVFNnU1A4UUhpUllVaTBGbUtCY1dTR0YwMHAva0xZZ3FJSXp4VkVBVFFJZ3VtbVdoRm1aQVlQUTVIQkxUSVRBaDV4SlJhWllZZE8wbkE4bk9yQkxBZXl5VGwwd29SdUJrQjNac2xoQU5iQkVuVEFRak1jbU9KSFZxc1FaQVlGRUFNUkJ5eWtFQUVHbU5VaUo2QUFwNEtDQllZNUJMZTZQUjFDMUFVVHpSckVETDBUeUEzbTBFcGZOT0VpRmhnR1ZEWFRoVmN5NUFXbVBVTFBGQUt3a3dqTUlDZXdqMDFjQVFBbGdJRTFLOENETENUeURUTm9XRE9JdU9CRFVLWXloY2cxQUhRVkNHTnQ4Z1ZpREZPU0FtQ0FHOVFncG1mQWd4T3BhQTBDTkZIS2h4ejJKd3JoYWdDYVo1QkZSUFdsMGprSkI3TGdqRW5Nb0FQQm9NWWFBb0hMM2xDSEl2ejZoYjlJUXFOL0F1QUdkZXhOL2pNeUVPVTI4OGtXRmhtWEI5QndMb3hJd3plZWVDNEFhR0FNTi9jbUJUMGdFQWlFVEtLQ0VHQVdIL2J6U1RTUWhDOWt6UUFaMU13STlwT1FOSHhpRW1BUW8yWVc0SUpqaUdFVmhaMFBLRGFEQXV3NnhBTGhBTWM4aG9FS0NaQ0NDVzVBYjlZT2dvWjZtcUZic3k0SVJIbHI2SFJtcWcwVkRNUXFjbjBRSHhSSkJKVWkzazBPNGdnaENNRVZSU2IyUUFCMUVrSFJVaWpTamdneit4cGpndFF2QUtETXRrUEtlYzZFREhJRWhSUzNRL3JaU1hWL1pOZnVqcmU4NTAzdmVrL2szT20yZDBGSXFCMnRJdVRiNGRiM1FJYlRWd0VjeHpUZE00Z0FIc0R3QjRoWElSUm8rQU1HSUpCb2FPSGlXZ2hxUVdBZ2NZbXJvQU1nbDBqLy9tcWo3QURraGlCUVhsMUR2bzBVQUZETEpnZFF1SFFpMEltSEs4U3lKejlJNms2aXpvSjgrM283dGNuZlhCNlVtQmRFQUc3dXhBY1l3aGpIRE84aUZNak0waFh5QWFrTDVPVW5NVHBCa083bUNFdzlJVytKaTM0cjBnSy9MV1RRTm1rNTBXRXVjejhQc1NrVmlxWkNmaVQwZ1dBOUFGb2ZDTmRQSW9DQ1VHQUdDV2hsQUlhdUV3a2tjeUd0L1ByZDh5NlF2UWVnN3dmNVFDdmZQcFN5MndRR0NZRkJVQ2kvOXF5M25lOEpNWHhRdm82Um9acFpJSEUveVFvU2tucVYyNzNvbjMrOFFscUplWVF3TFN5OEhvaVN2WG9RemR1a0JRbXgvRWtldnZqWVF4NGhDejVKN1EreU02bFF4Y1VXbTMxUWJDNlFxTnVFODUzSHUvRVYvcEw4QUN6L1pFWlJPMElxSElBTEg0VHVQRC9JdHlsT2tPSWZQU2pIUHdqdEUzSmtRbVZXSVRNSUN0QUx3bWFiU0tBZzdyZDE4QmQ2enBJUVlUWm1DMEZlaURkNkJWRjF2emN0c1BkK05oRi9CWkZ5MkZjUWNrWm4vb1lSNkRkNEJaRi9OckY2QUJpQkFqaUJCekVEOUNSN1pBR0N5MFlRSGZoL0k4aDJFbmdTSlNCeGtsQUN3b2ROcERjVURuZ1NDRkFReXdOOEVDaURKZWhtTUZnVy9hZDhBeUY2TFJpRG5qZUQwb0VBTXpCZURwWVFhS2Q2QTlGNlV6aUVUMWlFdm9FQUs3Q0RvMUlxcDhJUS9NVXVETkdEQVVCNVVQYURCeEdBZWhkVkRUQ0hkSmdCQXZCOURCRXBrNUpzRktaWURKR0VBZkFzMXRlRVRxaDlVRWlCL2hSQmJRRmdiZEFISmcxeGhTb0hpVnZJaFlib2hZZzRFZHRHY2trV0ZFd0djVUdCRklDWUVIRFllQU9JRWVUV0pXUkdWQTZSY2dDd1BPSlhpSXdIQUk1M2lSTEJicWRuRWQvV2VvUkhpYkU0aXhrQmJ4OHhpSm9oaHE5SGhIRm9ndXFXY21tbkVLTW9pNlVvYm81WGQ2Sklnc2NJZXVyR2hOUEhqTlJJaXNnNEZLbnpFajNYRURtNGhndlJqTDZJRWZ4bVFnb0JUWVRJRUszbmV0Tm9qTnhvamNKQkhBWjNiU2NCRVJKQWgzTklmUVhSQ0FrUWtBbGdDQVlCQXZ5NGl4VXhjdDAyRUFBbmNBYUJjMVhCQUlTVUZ3NDVFTk9BQ3l5QUMzNlFXaFU1RVZNd0FVMHdBV1hZa1NSWmtpWjVraDRSUVZsQmtSMjVEMDNRTkxrblBCQU5XWkpld0FJODgzd0pjUm9seVdLdmFCRHNhSEltV1gvb3hITzNTRy81VUJRYVlBbHdoWklNWVFxQThnT21VSlJNT1pWVVdaVldhWlVCQVFBaCtRUUJsZ0FBQUN3R0FBWUFXUUNMQUljeXpUTHgwVVh4cFVUeVgwUHlTRVB5VmtQeWVVVHlna1R3eUVUelRVUHh5a1h5aWtUd3gwVHh0a1h5VVVQeHQwVHhya1h4eGtYd3YwVHltRVR5aTBQeHVVVHlha1B4eUVYeHhFWHlhRVB4dTBUeHpFWHh6VVh5a1VUeGxFVHlVa1B5ajBUeGhrVHhwRVR5YmtUeHRFWHh3MFh5bkVUeGdrVHlWRVB5ZTBUeVpVUHhvRVR4c0VUeWVVUHliRVB4c2tUeHUwWHlkRVR4ckVUeWNFUHlaMFB4djBYeGVVVHh6VVR5bWtUeGowVHhrMFB5WTBQeHJrVHlqVVR4cDBUeVdrUHlhVVB4aEVUeG8wVHhkVVB5b1VUeVdFUHlja1B4cVVUeHEwVHhxa1R5azBRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUkvZ0FIUUFnUUFNSUFBQWdUS2x6SXNLSERoeEFqUmhSd0ljQUZBUXNlRUNUWVFLTEhqeUJETmxTd1VVR0pqUnRGcWx6Sk1tR0VqUkZnQ0VBcG9xWE5teEU3a0toQm9rT0xCQWNFQ0RpUUFLZlJvd2dMakxBeG9nQUJwRkNqU3AxS3RhclZxMWl6YXQwS3NZQ0ZHUmFjSnFBQUFRS0ZvbHl4Z21EeGdBV0lHRE0zMWt4N0ZjTkdEQTFRRXFSN2xjUEdEUmMwYnV6SXQ2b012eHVRNUJnZ0FBRURBUWNMVTdVUVlrRUlJQjhrYTk3TXViUG56NkEvRTNCUXdNRlRBQU1vVUlnYytxYUJDU1ltR0JqZ0FhV0gxamNyYkt5d0FnRktCcmh0M3ZqTFFBSktDY0ZiYXRpb1FZQUIzd0VZR0VqT01nVU9JamhTN0VBNGdEVjFsUVJRL3Z4QWNmcTcrZlBvMDRQT2tFRTlTQlVuRnB4UThlRTVRUVRUM1Urc2VIR0I4WTNJNlFjUlNRU1pCQjFCd0FuNDBFc0V4VlRiUmpvbytKQk9QUG1FMmdFSGVDZmhRa294NWRTR0lJWW80b2drS3VTVkVTNDR4UmhCa0pVSXdGb1Z2UENXWUJ5NWFCZEJlT2tWZ0lzRUJtQlNYQVROUldJU2lCMnhBRkJDRWVVaVpaWmg1dUtUVUVZcFpXR2psZllVVUdVcFdlSnJzYzBHWkFCQ2pxZ2JRYnpwNk9Kd0JHM0FBSTBCRUViaW1BSHd0bUlBTFc0Sm0yd2FQbG1sYVZQMjZlZWZPS1cyMnBNMEJMRkFFRFI4OENCQnQ1WG9BMGtLK0xEQWdkSHhXRklKL3hFVUlJazNCb0NYZmRIbFJ5SUlMMmdnWXd3SXNRZGxBUzRNa1dKNS9vREdLdXVzQzZuNkpLdXVPZ1VxZmk1MlVPb0xQbVVhd0tZak1oaEFUSlFtU0dLUEppMGFRSVFsVW1RUlJxaXBsbWVJOE1sSEg2M2NkdXV0aUhzK05XZWRKS1p3cDNac3VqbmljZ1ExWjJhSmFBYWc1cGRoaWdnbmIxaENvQ1dKWE9MWlo3amZCaXh3aVBudU95S1RJVmp3QWIwdUhoWUFCekxrOEM2SmZxVVpHRXJxaXRncFh1TmV1K0ZhYmIzVnAxZGdmVGp3eVNpako2akhHM2JZRkFIT05rb2loVDIxa0t5THhzWWtMTEVpTWxzQ3FOSzVLRzEvcWJiM1pMYnpaWmJ5MGt5M1pxdUw0WTMzMUs2aWptZ2RkdHJ0N0NLN0FUUjNNN3pFT1F2dG03dXRVTzJnTHZZNzI3K2s4ZG4wMjNBWHhwaHY1QjVjV2NJZnBOdXdVVjhRUzZ5WGl4WExleEZOTnQ3VlFNRm9rZGdERHcvdzBBT3FVNkpBd3d3MGtCZjM1WmhmaGVSUWlZOVl4QXdlRXNCd2lVbzhVR0VMRXhjTEV3eDZsK2h6eHk0SzhWSUVRaXpRNXdITGFaQmhRQUFoL2hWTllXUmxJSGRwZEdnZ1UyTnlaV1Z1Vkc5SGFXWUFPdz09JyB0aXRsZT0n5Zyo6Z+z5LmQ5Y2V5puy5pKt5pS+6aG16Z2i54K55Ye75Zu+5qCH5LiL6L29JyBzdHlsZT0nd2lkdGg6IitpY29uVmlwV2lkdGgrInB4JyBjbGFzcz0naWNvbkxvZ28nPjwvZGl2PiI7CiAgICAgICAgICAgIC8vbmV0ZWFzZSDot6/nlLHkuKTmrKHvvIzpnIDph43lrprkuYkKICAgICAgICAgICAgdmFyIG5ld1VybCA9IGxvY2F0aW9uLmhyZWY7CgogICAgICAgICAgICBsZXQganhNdXNpY1dlYiA9IGp4TXVzaWNbMF0ud2ViLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3VXJsLm1hdGNoKGl0ZW0ubWF0Y2gpOwoKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGlmKGp4TXVzaWNXZWIubGVuZ3RoKXsKCiAgICAgICAgICAgICAgICBsZXQgdGltZXJaaG1JY29uID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN6aG1JY29uJykpewoKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lclpobUljb24pOyAvLyDlj5bmtojlrprml7blmagKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J2t1d28nKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmljb24tYmFyX2ljb25fZG93bmxvYWRfJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uY2xhc3NOYW1lID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uc3R5bGU9J21hcmdpbi1sZWZ0OjEwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5pbm5lckhUTUwgPSAiPGEgc3R5bGU9J2ZvbnQtc2l6ZToxMHB4O3doaXRlLXNwYWNlOiBub3dyYXA7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzU1NTsnIGlkPSdrdXdvRG93bmxvYWQnPuS4i+i9vTwvYT4iOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sX3InKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMuYmVmb3JlKGljb24pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcja3V3b0Rvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb25nTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250cm9sIC5zb25nX25hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnRpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udHJvbCAuYXJ0aXN0JykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9kb3dubG9hZChhdWRpb1NyYyxzb25nTmFtZSsnLScrYXJ0aXN0KycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihqeE11c2ljV2ViWzBdLm5hbWU9PSd4aW1hbGF5YScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aSreaUvuWZqOWIm+W7uuS4i+i9vWljb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeG1Db250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItb3ByYXRpb25zJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250cm9sID0geG1Db250cm9scy5xdWVyeVNlbGVjdG9yKCdhOm50aC1vZi10eXBlKDIpJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gY29udHJvbC5jbG9uZU5vZGUodHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gIjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTBweDt3aGl0ZS1zcGFjZTogbm93cmFwO2N1cnNvcjpwb2ludGVyO2NvbG9yOiNGRkY7JyBpZD0neGltYURvd25sb2FkJz7kuIvovb08L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1Db250cm9scy5zdHlsZT0ncG9zaXRpb246IHJlbGF0aXZlO21hcmdpbi1sZWZ0Oi0yMHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXItcHJvZ3Jlc3MnKS5zdHlsZS53aWR0aD0nNDUwcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcueG0tcGxheWVyLXBsYXl0aW1lJykuc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDo0MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtQ29udHJvbHMucHJlcGVuZChpY29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aSreaUvuWZqOS4i+i9veS6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN4aW1hRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbVRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZtLXRpdGxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm1UaXRsZU1hdGNoID0gZm1UaXRsZS5ocmVmLm1hdGNoKC9eaHR0cHM/OlwvXC93d3dcLnhpbWFsYXlhXC5jb21cL3NvdW5kXC8oXFMqKSQvKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly9tb2JpbGUueGltYWxheWEuY29tL21vYmlsZS1wbGF5cGFnZS90cmFjay92My9iYXNlSW5mby8nK25ldyBEYXRlKCkuZ2V0VGltZSgpKyc/ZGV2aWNlPXdlYiZ0cmFja0lkPScrZm1UaXRsZU1hdGNoWzFdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzdWx0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGRhdGEudHJhY2tJbmZvLnBsYXlVcmxMaXN0WzFdLnVybDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMiA9IHN0cjEucmVwbGFjZUFsbCgnXycsJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gc3RyMi5sZW5ndGglNDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIyICs9ICc9PT09Jy5zdWJzdHIobnVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBDcnlwdG9KUy5lbmMuQmFzZTY0LnBhcnNlKHN0cjIpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQ3J5cHRvSlMuZW5jLkhleC5wYXJzZSgiYWFhZDNlNGZkNTQwYjBmNzlkY2E5NTYwNmU3MmJmOTMiKSwgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQiwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlY3J5cHRlZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjcnlwdGVkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQoZGVjcnlwdGVkLGRhdGEudHJhY2tJbmZvLnRpdGxlKycubXAzJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/pobXpnaLliJfooajliJvlu7rmibnph4/kuIvovb0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsTWF0Y2ggPSBuZXdVcmwubWF0Y2goL15odHRwczpcL1wvd3d3LnhpbWFsYXlhLmNvbVwvYWxidW1cL1swLTldKy8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxNYXRjaCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291bmRMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FuY2hvcl9zb3VuZF9saXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzb3VuZExpc3QpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VuZExpc3RIZWFkID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdW5kTGlzdEhlYWRUaXRsZSA9IHNvdW5kTGlzdEhlYWQucXVlcnlTZWxlY3RvcignLnNvcnQnKS5sYXN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBbe25hbWU6J+aJuemHj+S4i+i9vScsaWQ6J2JhdGNoRG93bmxvYWQnfSx7bmFtZTon6YeN572uJyxpZDoncmVzZXQnfSx7bmFtZTon5YWo6YCJJyxpZDonc2VsZWN0QWxsJ31dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBzb3VuZExpc3RIZWFkVGl0bGUuY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgnaWQnLGl0ZW0uaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmlubmVyVGV4dCA9IGl0ZW0ubmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRMaXN0SGVhZFRpdGxlLmFmdGVyKGNvbnRyb2wpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmJlZm9yZSgiIHwgIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbGVjdEFsbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1DaGVja2JveC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0uY2hlY2tlZCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGVja2VkPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVzZXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobUNoZWNrYm94ID0gc291bmRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9J3pobUNoZWNrYm94J10iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtQ2hlY2tib3guZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JhdGNoRG93bmxvYWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9CYXNlQ2xhc3MudG9hc3QoJ+W3suS4i+i9ve+8jOivt+eojeWAmScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtQ2hlY2tib3ggPSBzb3VuZExpc3QucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0nemhtQ2hlY2tib3gnXSIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1DaGVja2JveC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5jaGVja2VkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2NyTWF0Y2ggPSBpdGVtLnZhbHVlLm1hdGNoKC9cL3NvdW5kXC8oWzAtOV0rKS8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly9tb2JpbGUueGltYWxheWEuY29tL21vYmlsZS1wbGF5cGFnZS90cmFjay92My9iYXNlSW5mby8nK25ldyBEYXRlKCkuZ2V0VGltZSgpKyc/ZGV2aWNlPXdlYiZ0cmFja0lkPScrc2NyTWF0Y2hbMV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MucmVxdWVzdCgnZ2V0Jyx1cmwpLnRoZW4oKHJlc3VsdCk9PnsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZGF0YS50cmFja0luZm8ucGxheVVybExpc3RbMV0udXJsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyMSA9IHBsYXlVcmwucmVwbGFjZUFsbCgnLScsJysnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0cjIgPSBzdHIxLnJlcGxhY2VBbGwoJ18nLCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSBzdHIyLmxlbmd0aCU0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihudW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMiArPSAnPT09PScuc3Vic3RyKG51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShzdHIyKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKCJhYWFkM2U0ZmQ1NDBiMGY3OWRjYTk1NjA2ZTcyYmY5MyIpLCB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQiwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzNwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGVjcnlwdGVkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVjcnlwdGVkKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX2Rvd25sb2FkKGRlY3J5cHRlZCxkYXRhLnRyYWNrSW5mby50aXRsZSsnLm1wMycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ino+WvhuWcsOWdgOWksei0pScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mraPluo/lgJLluo/kuovku7YKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkLnF1ZXJ5U2VsZWN0b3IoJy5zb3J0JykuZmlyc3RDaGlsZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheU11c2ljQ2xhc3MueG1seUNyZWF0ZUNoZWNrYm94KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZExpc3RIZWFkVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlNdXNpY0NsYXNzLnhtbHlDcmVhdGVDaGVja2JveCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nv7vpobXkuovku7YKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYWdpbmF0aW9uLXBhZ2UnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i3s+mhteS6i+S7tgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uW3R5cGU9c3VibWl0XScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy54bWx5Q3JlYXRlQ2hlY2tib3goKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VybOWcsOWdgOmUmeivrycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDEwMDApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5YWo5bGA54K55Ye75LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmpMaW5rID0ge307CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGF0aC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5ocmVmKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpMaW5rLmhyZWYgPSBpdGVtLmhyZWY/aXRlbS5ocmVmOicnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakxpbmsudGFyZ2V0ID0gaXRlbS50YXJnZXQ/aXRlbS50YXJnZXQ6Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakxpbmsuaHJlZiAmJiBvYmpMaW5rLnRhcmdldCAhPSAnX2JsYW5rJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gb2JqTGluay5ocmVmOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihqeE11c2ljV2ViWzBdLm5hbWU9PSdrdWdvdScpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFEb20uZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFPYmogPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YW9iaicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhT2JqKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhb2JqJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywnX2JsYW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YU9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291cG9uVXJsLmluZGV4T2YoJ21peHNvbmcnKSE9LTEgfHwgY291cG9uVXJsLmluZGV4T2YoJ3NvbmcnKSAhPSAtMSB8fCBjb3Vwb25VcmwuaW5kZXhPZignc2hhcmUnKSAhPSAtMSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2b2x1bWVEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdm9sdW1lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWREb20gPSB2b2x1bWVEb20uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20ucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWREb20uc3R5bGU9J21hcmdpbi10b3A6MzBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZERvbS5pbm5lckhUTUwgPSAiPGEgc3R5bGU9J2NvbG9yOiNmZmY7Zm9udC1zaXplOjEwcHg7d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpwb2ludGVyOycgaWQ9J2t1Z291RG93bmxvYWQnIGphdmFzY3JpcHQ6dm9pZCgwKTs+5LiL6L29PC9hPiI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVEb20uYmVmb3JlKGRvd25sb2FkRG9tKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURvbS5zdHlsZT0nbGVmdDo1MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbW9kZScpLnN0eWxlPSdtYXJnaW4tbGVmdDo5MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGJfZG93bmxvYWQnKS5zdHlsZT0nbWFyZ2luLWxlZnQ6MTMwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYl9zaGFyZScpLnN0eWxlPSdtYXJnaW4tbGVmdDoxNzBweDsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpc3QnKS5zdHlsZT0ncmlnaHQ6LTIwcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNrdWdvdURvd25sb2FkJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI215QXVkaW8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBhdWRpby5nZXRBdHRyaWJ1dGUoJ3NyYycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaW5nZXJOYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpbmdlck5hbWUnKS50aXRsZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ05hbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc29uZ05hbWVUZW1wJykudGl0bGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fZG93bmxvYWQoYXVkaW9TcmMsc29uZ05hbWUrJy0nK3Npbmdlck5hbWUuc3Vic3RyKDAsc2luZ2VyTmFtZS5sZW5ndGgtMSkrJy5tcDMnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvdXBvblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGp4TXVzaWNXZWJbMF0ubmFtZT09J25ldGVhc2UnICYmIGxvY2F0aW9uLmhyZWYgPT0gJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zdC9kb3dubG9hZCcpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHpobVBsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemhtSWNvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobVBsYXkuaW5uZXJIVE1MID0gbXVzaWNIdG1sOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5ouW5ou95Zu+5qCHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXLCoHpobUxvZ29EcmFnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNtdXNpYyIrbXVzaWNJZCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHpobUxvZ29JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnpobV9pY29uIik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXpobUxvZ29EcmFnIHx8ICF6aG1Mb2dvSWNvbilyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcub25tb3VzZWRvd24gPSBmdW5jdGlvbihldmVudCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV2ZW50LndoaWNoPT0zKXJldHVybiBmYWxzZTsvL+Wxj+iUveWPs+mUrgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vkb3duVG9wID0gemhtTG9nb0RyYWcub2Zmc2V0VG9wOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemhtTG9nb0ljb25IZWlnaHQgPSB6aG1Mb2dvSWNvbi5vZmZzZXRIZWlnaHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBib3R0b21TcGFjZSA9IDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoZXZlbnQudGFyZ2V0LmNsYXNzTmFtZSAhPSAnaWNvbkxvZ28nKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXTCoHNoaWZ0WMKgPcKgZXZlbnQuY2xpZW50WMKgLcKgemhtTG9nb0RyYWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnR4ID0gNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0wqBzaGlmdFkgPSBldmVudC5jbGllbnRZLXpobUxvZ29EcmFnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUucG9zaXRpb27CoD3CoCdmaXhlZCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnpJbmRleMKgPcKgOTk5OTk5OTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoemhtTG9nb0RyYWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbsKgb25Nb3VzZU1vdmUoZXZlbnQpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy96aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqBwYWdlWMKgLcKgc2hpZnRYwqArwqAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5zdHlsZS5sZWZ0wqA9wqAnNXB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB6aG1Mb2dvSWNvbkhlaWdodDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB5ID0gZXZlbnQucGFnZVktc2hpZnRZOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHkpLCBoZWlnaHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID0geSsncHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lnKhtb3VzZW1vdmXkuovku7bkuIrnp7vliqjlm77moIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5oyJ5LiL5Zu+5qCH77yM5bm256e76Zmk5LiN6ZyA6KaB55qE5aSE55CG56iL5bqPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQub25tb3VzZXVwwqA9wqBmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHpobUxvZ29EcmFnLm9mZnNldFRvcCt6aG1Mb2dvSWNvbkhlaWdodCtib3R0b21TcGFjZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcCA8IDApewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLnN0eWxlLnRvcCA9JzBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5pbm5lckhlaWdodCA8IGhlaWdodCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemhtTG9nb0RyYWcuc3R5bGUudG9wID13aW5kb3cuaW5uZXJIZWlnaHQtemhtTG9nb0ljb25IZWlnaHQtYm90dG9tU3BhY2UrJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHpobUxvZ29EcmFnLm9mZnNldFRvcD09c2Vkb3duVG9wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLMKgb25Nb3VzZU1vdmUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpobUxvZ29EcmFnLm9ubW91c2V1cMKgPcKgbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmxEYXRhID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL211c2ljXC4xNjNcLmNvbVwvI1wvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wveVwubXVzaWNcLjE2M1wuY29tXC9tXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLnFxXC5jb21cL25cL3J5cXFcL3BsYXllci99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L2t1Z291XC5jb20vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdXdvXC5jbi99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3d3d1wueGltYWxheWFcLmNvbS99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXVzaWNVcmwgPSBtdXNpY1VybERhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG11c2ljVXJsLmxlbmd0aD09MCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdChqeE11c2ljV2ViWzBdLnRpcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goanhNdXNpY1dlYlswXS5uYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXRlYXNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0ZWFzZUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdxcSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1Z291JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Vnb3VGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAna3V3byc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1d29GdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneGltYWxheWEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aW1hbGF5YUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXRlYXNlRnVuKCl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBwbGF5TXVzaWNDbGFzcy5nZXRVcmxQYXJhbXMobG9jYXRpb24uaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybFBhcmFtcy5pZCA9PSB1bmRlZmluZWQpIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ldGVhc2VVcmxFbmNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQoJ2h0dHBzOi8vbXVzaWMuMTYzLmNvbS9zb25nP2lkPScrdXJsUGFyYW1zLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz91cmw9JytuZXRlYXNlVXJsRW5jb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHFxU29uZ01hdGNoOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheWVyX211c2ljX19pbmZvIikpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheWVyX211c2ljX19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nRGV0YWlsXC8oXFMqKVw/Lyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2ltX3NvbmdfaW5mbyIpLmNoaWxkTm9kZXNbMF0uaHJlZi5tYXRjaCgvc29uZ1wvKFxTKikuaHRtbC8pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFxU29uZ01hdGNoID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcXFTb25nTWF0Y2hbMV0pe2NvbnNvbGUubG9nKCfmsqHmnInojrflj5bliLDmrYzmm7JJRCcpOyByZXR1cm59OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9MaW5rID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3FxU29uZ01hdGNoWzFdKycmdHlwZT1xcSZwbGF5VXJsPScrYXVkaW9MaW5rOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3Vnb3VGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTW9kdWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF1ZGlvTW9kdWxlKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhdWRpb01vZHVsZScpLnN0eWxlPSdib3R0b206MHB4Oyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2hvd0hpZGVfcGxheWJhcicpLmNsYXNzTmFtZSA9ICdpY29uIHNob3ctcGxheWJhci1idG4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ0t1Z291TWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvU3JjID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrc29uZ0t1Z291TWF0Y2hbMV0rJyZ0eXBlPWt1Z291JnBsYXlVcmw9JythdWRpb1NyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3V3b0Z1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2wnKS5zdHlsZT0nYm90dG9tOjBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSInLDIwMDApCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0i44CCJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29uZ0t1d29NYXRjaCA9IG5ld1VybC5tYXRjaChqeE11c2ljV2ViWzBdLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXVkaW9TcmMgPSBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYXVkaW8iKS5zcmMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVXJsID0gd2ViVXJsKyc/aWQ9Jytzb25nS3V3b01hdGNoWzFdKycmdHlwZT1rdXdvJnBsYXlVcmw9JythdWRpb1NyYzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geGltYWxheWFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnhtLXBsYXllcicpLnN0eWxlPSdib3R0b206MHB4JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxJbmZvID0gbmV3VXJsLm1hdGNoKGp4TXVzaWNXZWJbMF0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHdlYlVybCsnP2lkPScrdXJsSW5mb1sxXSsnJnR5cGU9eGltYWxheWEmcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChuZXdVcmwpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxJbmZvWzFdKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4od2ViVXJsKyc/aWQ9Jyt1cmxJbmZvWzFdKycmdHlwZT14aW1hbGF5YSZwbGF5VXJsPScrZW5jb2RlVVJJQ29tcG9uZW50KG5ld1VybCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5rKh5pyJ6I635Y+WdXJs5Y+C5pWwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnaWNvblRvcCcsemhtTG9nb0RyYWcub2Zmc2V0VG9wKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScswqBvbk1vdXNlTW92ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbm1vdXNldXDCoD3CoG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aG1Mb2dvRHJhZy5vbmRyYWdzdGFydMKgPcKgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm7CoGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuemhtX2ljb24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11c2ljVXJsRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC9tdXNpY1wuMTYzXC5jb21cLyNcLyg/OnNvbmd8ZGopXD9pZC99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bWF0Y2g6L15odHRwcz86XC9cL3lcLm11c2ljXC4xNjNcLmNvbVwvbVwvKD86c29uZ3xkailcP2lkL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDovXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8oPzpzb25nfGRqKVw/aWQvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC95XC5xcVwuY29tXC9uXC9yeXFxXC9wbGF5ZXIvfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9rdWdvdVwuY29tL30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHttYXRjaDova3V3b1wuY24vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21hdGNoOi9eaHR0cHM/OlwvXC93d3dcLnhpbWFsYXlhXC5jb20vfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtdXNpY1VybCA9IG11c2ljVXJsRGF0YS5maWx0ZXIoZnVuY3Rpb24oaXRlbSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24uaHJlZi5tYXRjaChpdGVtLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobXVzaWNVcmwubGVuZ3RoPT0wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VDbGFzcy50b2FzdChqeE11c2ljV2ViWzBdLnRpcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goanhNdXNpY1dlYlswXS5uYW1lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmV0ZWFzZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRlYXNlRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncXEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFGdW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrdWdvdSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdWdvdUZ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2t1d28nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3V3b0Z1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hpbWFsYXlhJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpbWFsYXlhRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5ldGVhc2VGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBwbGF5TXVzaWNDbGFzcy5nZXRVcmxQYXJhbXMobG9jYXRpb24uaHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmxQYXJhbXMuaWQgPT0gdW5kZWZpbmVkKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV0ZWFzZVVybEVuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudCgnaHR0cHM6Ly9tdXNpYy4xNjMuY29tL3Nvbmc/aWQ9Jyt1cmxQYXJhbXMuaWQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz91cmw9JytuZXRlYXNlVXJsRW5jb2RlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxcVNvbmdNYXRjaDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5wbGF5ZXJfbXVzaWNfX2luZm8iKSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXFTb25nTWF0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGxheWVyX211c2ljX19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nRGV0YWlsXC8oXFMqKVw/Lyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2ltX3NvbmdfaW5mbyIpKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzaW1fc29uZ19pbmZvIikuY2hpbGROb2Rlc1swXS5ocmVmLm1hdGNoKC9zb25nXC8oXFMqKS5odG1sLyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcVNvbmdNYXRjaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcXFTb25nTWF0Y2hbMV0pe2NvbnNvbGUubG9nKCfmsqHmnInojrflj5bliLDmrYzmm7JJRCcpOyByZXR1cm59OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTGluayA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrcXFTb25nTWF0Y2hbMV0rJyZ0eXBlPXFxJnBsYXlVcmw9JythdWRpb0xpbms7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihvcGVuVXJsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdWdvdUZ1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvTW9kdWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdWRpb01vZHVsZSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2F1ZGlvTW9kdWxlJykuc3R5bGU9J2JvdHRvbTowcHg7JzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2hvd0hpZGVfcGxheWJhcicpLmNsYXNzTmFtZSA9ICdpY29uIHNob3ctcGxheWJhci1idG4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdLdWdvdU1hdGNoID0gbmV3VXJsLm1hdGNoKGp4TXVzaWNXZWJbMF0ubWF0Y2gpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdWRpb1NyYyA9IGVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJhdWRpbyIpLnNyYyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5VcmwgPSB3ZWJVcmwrJz9pZD0nK3NvbmdLdWdvdU1hdGNoWzFdKycmdHlwZT1rdWdvdSZwbGF5VXJsPScrYXVkaW9TcmM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3V3b0Z1bigpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBsYXlDb250cm9sJykuc3R5bGU9J2JvdHRvbTowcHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNsYXNzLnRvYXN0KCfor7fngrnlh7vmkq3mlL7pnIDopoHkuIvovb3nmoTmrYzmm7LvvIznhLblkI7lnKjnvZHpobXkuIvmlrnmkq3mlL7lmajlhoXngrnlh7si5LiL6L29IicsMjAwMCkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0i44CCJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvbmdLdXdvTWF0Y2ggPSBuZXdVcmwubWF0Y2goanhNdXNpY1dlYlswXS5tYXRjaCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvU3JjID0gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImF1ZGlvIikuc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BlblVybCA9IHdlYlVybCsnP2lkPScrc29uZ0t1d29NYXRjaFsxXSsnJnR5cGU9a3V3byZwbGF5VXJsPScrYXVkaW9TcmM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ob3BlblVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geGltYWxheWFGdW4oKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy54bS1wbGF5ZXInKS5zdHlsZT0nYm90dG9tOjBweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ2xhc3MudG9hc3QoJ+ivt+eCueWHu+aSreaUvumcgOimgeS4i+i9veeahOatjOabsu+8jOeEtuWQjuWcqOe9kemhteS4i+aWueaSreaUvuWZqOWGheeCueWHuyLkuIvovb0iJywyMDAwKQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgn6K+354K55Ye75pKt5pS+6ZyA6KaB5LiL6L2955qE5q2M5puy77yM54S25ZCO5Zyo572R6aG15LiL5pa55pKt5pS+5Zmo5YaF54K55Ye7IuS4i+i9vSLjgIInKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsSW5mbyA9IG5ld1VybC5tYXRjaChqeE11c2ljV2ViWzBdLm1hdGNoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh3ZWJVcmwrJz9pZD0nK3VybEluZm9bMV0rJyZ0eXBlPXhpbWFsYXlhJnBsYXlVcmw9JytlbmNvZGVVUklDb21wb25lbnQobmV3VXJsKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsSW5mb1sxXSl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHdlYlVybCsnP2lkPScrdXJsSW5mb1sxXSsnJnR5cGU9eGltYWxheWEmcGxheVVybD0nK2VuY29kZVVSSUNvbXBvbmVudChuZXdVcmwpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+ayoeacieiOt+WPlnVybOWPguaVsCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICAgICAgICAgIH0saWNvbldhaXRUaW1lKTsKCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5TXVzaWNDbGFzcy5jcmVhdGVFbGVtZW50KCdkaXYnLCd6aG1JY29uJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgIGxldCB6aG1QbGF5RG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3pobUljb24nKTsKCiAgICAgICAgICAgICAgICAgaWYoemhtUGxheURvbSl7CgogICAgICAgICAgICAgICAgICAgICB6aG1QbGF5RG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoemhtUGxheURvbSk7CgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+W9k+WJjemfs+mikee9keWdgOayoeaciea3u+WKoOWMuemFjeaIluWMuemFjemUmeivrycpOwoKICAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB6aE5pY2VGdW5jKCl7CgogICAgICAgICAgICB2YXIgemhDbGFzcyA9IG5ldyBaaENsYXNzKCk7CgogICAgICAgICAgICAvL+WFs+mXreeZu+W9leW8ueahhgogICAgICAgICAgIChhc3luYyBmdW5jdGlvbigpewoKICAgICAgICAgICAgICAgbGV0IGxvZ2luTW9kYWxXcmFwcGVyID0gYXdhaXQgQmFzZUNsYXNzLmdldEVsZW1lbnQoIi5Nb2RhbC13cmFwcGVyIik7CgogICAgICAgICAgICAgICBpZihsb2dpbk1vZGFsV3JhcHBlcil7CgogICAgICAgICAgICAgICAgICAgbGV0IGNsb3NlQnV0dG9uID0gbG9naW5Nb2RhbFdyYXBwZXIucXVlcnlTZWxlY3RvcignLk1vZGFsLWNsb3NlQnV0dG9uJyk7CgogICAgICAgICAgICAgICAgICAgaWYoY2xvc2VCdXR0b24pewoKICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbi5jbGljaygpOwoKICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pKCkKCiAgICAgICAgICAgIHZhciB6aERhdGEgPSBbCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlVmlkZW8nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlVmlkZW8nLCcwJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwKICAgICAgICAgICAgICAgIHtmdW5jOidyZW1vdmVBRCcsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVBRCcsJzIyJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwKICAgICAgICAgICAgICAgIHtmdW5jOidkb3dubG9hZFZpZGVvJyxpc09wZW46R01fZ2V0VmFsdWUoJ2Rvd25sb2FkVmlkZW8nLCcyMicpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlUmlnaHQnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlUmlnaHQnLCcwJyksaXNPbnNjcm9sbDowLG9ubG9hZDowfSwKICAgICAgICAgICAgICAgIHtmdW5jOidjaGFuZ2VMaW5rJyxpc09wZW46R01fZ2V0VmFsdWUoJ2NoYW5nZUxpbmsnLCcyMicpLGlzT25zY3JvbGw6MCxvbmxvYWQ6MH0sCiAgICAgICAgICAgICAgICB7ZnVuYzoncmVtb3ZlS2V5d29yZCcsaXNPcGVuOkdNX2dldFZhbHVlKCdyZW1vdmVLZXl3b3JkJywnMCcpLGlzT25zY3JvbGw6MSxvbmxvYWQ6MX0sCiAgICAgICAgICAgICAgICB7ZnVuYzonc2hvd1NwZWNpYWxDb2x1bW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgnc3BlY2lhbENvbHVtbicsJzIyJyksaXNPbnNjcm9sbDoxLG9ubG9hZDoxfSwKICAgICAgICAgICAgICAgIHtmdW5jOidzaG93VmlkZW9UaXRsZScsaXNPcGVuOkdNX2dldFZhbHVlKCd2aWRlb1RpdGxlJywnMjInKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZUF1dGhvck5hbWUnLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlQXV0aG9yTmFtZScsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICAgICAge2Z1bmM6J3JlbW92ZVlhbnh1YW4nLGlzT3BlbjpHTV9nZXRWYWx1ZSgncmVtb3ZlWWFueHVhbicsJzAnKSxpc09uc2Nyb2xsOjEsb25sb2FkOjF9LAogICAgICAgICAgICBdCgogICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLm9ubG9hZD09MCl7CiAgICAgICAgICAgICAgICAgICAgemhDbGFzc1tpdGVtLmZ1bmNdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICB3aW5kb3cub25sb2FkPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB6aERhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT3Blbj09MjIgJiYgaXRlbS5vbmxvYWQ9PTEpewogICAgICAgICAgICAgICAgICAgICAgICB6aENsYXNzW2l0ZW0uZnVuY10oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CgogICAgICAgICAgICAgICAgaWYoc2Nyb2xsVG9wID4gMjAwKXsKCiAgICAgICAgICAgICAgICAgICAgemhEYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPcGVuPT0yMiAmJiBpdGVtLmlzT25zY3JvbGw9PTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpoQ2xhc3NbaXRlbS5mdW5jXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdGFvYmFvU2VhcmNoRnVuYyhpdGVtKXsKCiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgbGV0IHRhb2Jhb0ljb25Eb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGFvYmFvSWNvblNlbGVjdCcpOwoKICAgICAgICAgICAgICAgIGxldCBiYXNlQ2xhc3MgPSBuZXcgQmFzZUNsYXNzKCk7CgogICAgICAgICAgICAgICAgbGV0IGZpbHRlclRtYWxsID0gYmFzZUNsYXNzLmdldFF1ZXJ5U3RyaW5nKCdmaWx0ZXJfdGlhbm1hbycpOwoKICAgICAgICAgICAgICAgIGlmKCF0YW9iYW9JY29uRG9tKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmlsdGVycyA+YScpOwoKICAgICAgICAgICAgICAgICAgICBpZihmaWx0ZXJzLmxlbmd0aD4wKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8ZmlsdGVycy5sZW5ndGg7aSsrKXsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVZhbHVlID0gZmlsdGVyc1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhVmFsdWUgPT0gJ3RtYWxsJyl7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZGF0YVZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhb2Jhb0RvbSA9IGZpbHRlcnNbaV0uY2xvbmVOb2RlKHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YW9iYW9Eb20ucXVlcnlTZWxlY3RvcignLnRleHQnKS5pbm5lclRleHQ9J+a3mOWunSc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0RvbS5zZXRBdHRyaWJ1dGUoJ2lkJywndGFvYmFvSWNvblNlbGVjdCcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YW9iYW9Eb20uc2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJywndGFvYmFvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbHRlclRtYWxsPT0ndGFvYmFvJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0RvbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aW9uJywncmVtb3ZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0RvbS5jbGFzc05hbWU9J2ZpbHRlciBpY29uLXRhZyBKX0FqYXggaWNvbi1ob3Zlcic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0RvbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0RvbS5jbGFzc05hbWU9J2ZpbHRlciBpY29uLXRhZyBKX0FqYXgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpXS5iZWZvcmUodGFvYmFvRG9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfWVsc2V7CgogICAgICAgICAgICAgICAgICAgIGlmKGZpbHRlclRtYWxsPT0ndGFvYmFvJyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0ljb25Eb20uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGlvbicsJ3JlbW92ZScpOwogICAgICAgICAgICAgICAgICAgICAgICB0YW9iYW9JY29uRG9tLmNsYXNzTmFtZT0nZmlsdGVyIGljb24tdGFnIEpfQWpheCBpY29uLWhvdmVyJzsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgdGFvYmFvSWNvbkRvbS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtYWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhb2Jhb0ljb25Eb20uY2xhc3NOYW1lPSdmaWx0ZXIgaWNvbi10YWcgSl9BamF4JzsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgIH0KCgoKICAgICAgICAgICAgICAgIGlmKGZpbHRlclRtYWxsPT0ndGFvYmFvJyl7CgogICAgICAgICAgICAgICAgICAgIGxldCBnb29kc0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaXRlbXMgPiAuaXRlbScpOwoKICAgICAgICAgICAgICAgICAgICBnb29kc0xpc3QuZm9yRWFjaChmdW5jdGlvbihpdGVtKXsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uTGlDbGFzcyA9IGl0ZW0ucXVlcnlTZWxlY3RvcignLmljb25zPmxpPmE+c3BhbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZVRtPVsnaWNvbi1zZXJ2aWNlLXRpYW5tYW8nLCdpY29uLXNlcnZpY2UtdGlhbm1hb2d1b2ppJ107CgogICAgICAgICAgICAgICAgICAgICAgICBpZihpY29uTGlDbGFzcyAmJiBjbGFzc05hbWVUbS5pbmRleE9mKGljb25MaUNsYXNzLmNsYXNzTmFtZSkgIT0gLTEpewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGU9J2Rpc3BsYXk6bm9uZTsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICAgICAvL2NsZWFySW50ZXJ2YWwodGltZXIpOwoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0sNTAwKQoKICAgICAgICB9CgogICAgfQp9KSgpOw==
Add Comment
Please, Sign In to add comment