https://ipfs.io/ipfs/QmZitKC41iqcRj2mqi9jYNFabpHzPi17aAAkuuMb9Yc7Kx
files.html, fixes
sha256
6ed213b913a757135320d86fda05189b4dcf239936349a6ce2ecdd2b61126981 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlby1jb250YWluZXIgewogICAgICAgIC8qY3Vyc29yOiBwb2ludGVyOyovCiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuOGVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgYS5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE1ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNWVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICB9CgogICAgICAjbWVudS1jb250ZW50Lm9wZW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgc3ZnLCAKICAgICAgaW1nLCAKICAgICAgLnZpZGVvIHZpZGVvIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLCAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIGltZywKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5OjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGltaXQ6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxNSIgaHJlZj0iIyI+MTU8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIzMCIgaHJlZj0iIyI+MzA8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxMDAiIGhyZWY9IiMiPjEwMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGF0ZXN0IHJlbGVhc2U6PC9kaXY+CiAgICAgICAgPGEgaWQ9InJlbGVhc2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImhlYWRlciI+CiAgICAgIDxzcGFuIGlkPSJjb250cm9saW5mbyI+Y29udHJvbHM6IGFycm93cywgZW50ZXIsIGVzYzwvc3Bhbj4KICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyI+PC9hPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGEgaWQ9Im1lbnUiIGhyZWY9IiMiPgogICAgICAgICAgPHN2ZyBjbGFzcz0ibWVudXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkgICAgICAgIDxwYXRoIGQ9Ik0xMCwxLjQ0NWMtNC43MjYsMC04LjU1NSwzLjgyOS04LjU1NSw4LjU1NWMwLDQuNzI1LDMuODI5LDguNTU1LDguNTU1LDguNTU1YzQuNzI1LDAsOC41NTUtMy44Myw4LjU1NS04LjU1NUMxOC41NTUsNS4yNzQsMTQuNzI1LDEuNDQ1LDEwLDEuNDQ1IE0xMCwxNy42NTRjLTQuMjIxLDAtNy42NTQtMy40MzQtNy42NTQtNy42NTRjMC00LjIyMSwzLjQzMy03LjY1NCw3LjY1NC03LjY1NGM0LjIyMiwwLDcuNjU0LDMuNDMzLDcuNjU0LDcuNjU0QzE3LjY1NCwxNC4yMjEsMTQuMjIyLDE3LjY1NCwxMCwxNy42NTQgTTE0LjM5LDEwYzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsOS41NSwxNC4zOSw5Ljc1MiwxNC4zOSwxMCBNMTQuMzksMTIuNzAyYzAsMC4yNDctMC4yMDMsMC40NDktMC40NSwwLjQ0OUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDItMC40NS0wLjQ0OWMwLTAuMjQ4LDAuMjAzLTAuNDUxLDAuNDUtMC40NTFoNy44NzlDMTQuMTg3LDEyLjI1MSwxNC4zOSwxMi40NTQsMTQuMzksMTIuNzAyIE0xNC4zOSw3LjI5OGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDYuODQ4LDE0LjM5LDcuMDUxLDE0LjM5LDcuMjk4Ij48L3BhdGg+CgkgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYT4KICAgICAgICA8YSBpZD0idGl0bGUiIGhyZWY9IiMiPmZpbGVzLmh0bWw8L2E+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icXVlcnkiIG5hbWU9InF1ZXJ5IiBpZD0iIiAvPgogICAgICAgICAgPHNlbGVjdCBpZD0icXVlcnktdHlwZSI+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFsbCI+YWxsPC9vcHRpb24+CiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImltYWdlIj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idmlkZW8iPnZpZGVvczwvb3B0aW9uPgogICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmciPnVwZGF0aW5nPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgLy8ic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAvLyJzZWFyY2hyZWxheSI6ICdbIlJFUSIsICI8ST4iLCA8U0E+XScsIC8vIFNBOiB7ICJraW5kcyI6IFsxLCAyXSwgInNlYXJjaCI6ICJzdHIiIH0sIHt9Li4uCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgY29uc3QgcmVsYXlzID0gWwogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwKICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iCiAgICAgIF0KICAgICAgCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIAogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCBzb2NrZXRzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHVybHMgPSBbXQogICAgICBsZXQgcmVhY3RlZCA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBxdWVyeXdhaXQgPSBudWxsCiAgICAgIGxldCB0eXBlcyA9IHsKICAgICAgICBpbWFnZTogWyJwbmciLCAianBnIiwgImpwZWciLCAid2VicCJdLAogICAgICAgIHZpZGVvOiBbIm1wNCIsICJ3ZWJtIl0KICAgICAgfQogICAgICB0eXBlc1siYWxsIl0gPSBbLi4udHlwZXMuaW1hZ2UsIC4uLnR5cGVzLnZpZGVvXQogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICAvL2xldCBmaWxlcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wM3xtcDR8dHh0KS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICB3YWl0bXMgPSAxMDAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxhc3RxdWVyeXN0ciA9ICIiCiAgICAgIGxhc3RxdWVyeXR5cGUgPSAiIgogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQoKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBwYXJ0cyA9IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkuc3BsaXQoIi8iKQogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIC5hY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwaWNvZmZzZXQob2Zmc2V0KXsKICAgICAgICBjb25zdCBwaWNzID0gcXNhKCIjcGljcyA+IGEiKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KCl7CiAgICAgICAgbGV0IGVuYWJsZWR2aWRlb3MgPSAwCiAgICAgICAgbGV0IHRvdGFsdmlkZW9zID0gMAogICAgICAgIGxldCByZWFkeXZpZGVvcyA9IDAKICAgICAgICAKICAgICAgICBxc2EoIiNwaWNzIHZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHsKICAgICAgICAgIHRvdGFsdmlkZW9zKysKICAgICAgICAgIAogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICByZWFkeXZpZGVvcysrCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgICAKICAgICAgICAgIGlmKChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA8IHNjcm9sbFkgCiAgICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBlbmFibGVkdmlkZW9zKysKICAgICAgICAgICAgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZigoYXBsYXkgPT0gIm9uIiB8fCBhcGxheSA9PSAiaG92ZXIiKSAmJiB2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgLy9hd2FpdCBzbGVlcCgxMDAwKQogICAgICAgICAgICAgIHYucGxheSgpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCAoKSA9PiB1cGRhdGV2aWRlb3BsYXkoKSkKICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgLy9jb25zb2xlLmxvZygiY2xpY2siLCBlLCBlLnRhcmdldC5ocmVmKQogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gInN1Ym1pdCIgfHwgKGUudGFyZ2V0LnRhZ05hbWUgPT0gIkEiICYmIGUudGFyZ2V0LmhyZWYubWF0Y2goL14ofHdlYlwrKW5vc3RyXDovKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gInRpdGxlIil7CiAgICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSAiIgogICAgICAgICAgcXMoIiNnbyIpLmNsaWNrKCkKICAgICAgICB9CgogICAgICAgIGUucHJldmVudERlZmF1bHQoKQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAiZmlsdGVyLWxpa2VzIil7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImZpbHRlci1saWtlcyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpewogICAgICAgICAgYWN0aXZlKCk/LmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI3BpYy1jb250YWluZXIiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIgfHwgZS50YXJnZXQuaWQgPT0gIm1lbnUtb3ZlcmxheSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0Y29scyIpKXsKICAgICAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJjb2xzIiArIGMpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY29scyIsIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGxpbWl0IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImxpbWl0IiwgZS50YXJnZXQuZGF0YXNldC5saW1pdCkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0YXV0b3BsYXkiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0b3BsYXkiLCBlLnRhcmdldC5kYXRhc2V0LmF1dG9wbGF5KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGxpa2UoZS50YXJnZXQpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgY29uc3QgcHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KHsKICAgICAgICAgICJraW5kIjogNywKICAgICAgICAgICJjb250ZW50IjogIisiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiZSIsIGV2ZW50LmlkXSwKICAgICAgICAgICAgWyJwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXSwKICAgICAgICAgICJwdWJrZXkiOiBwdWJrZXksCiAgICAgICAgICAiY3JlYXRlZF9hdCI6IHBhcnNlSW50KERhdGUubm93KCkgLyAxMDAwICwgMTApCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LnBpY0lkCiAgICAgICAgCiAgICAgICAgaWYocGljaWQpewogICAgICAgICAgZ2lkKHBpY2lkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgcmVhY3RlZC5wdXNoKHBpY2lkKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZygicmVhY3Rpb24gc2VudCIpCiAgICAgIH0KCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0IiAmJiBwaWNvZmZzZXQoLTEpKXsKICAgICAgICAgIHBpY29mZnNldCgtMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiICYmIHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQogIAogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0KXsKICAgICAgICBxcygiI2xvYWRpbmciKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgIAogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBsID0gbGltaXQoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSB0eXBlc1t0eXBlXS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMCwgMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiBsCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzAsIDFdLCBzZWFyY2g6IHF9KQogICAgICAgIH0KICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQoKICAgICAgICBzb2NrZXQuc2VuZChzZWFyY2hqc29uKQogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocWlkKQogICAgICAgIHNhdmUocmVzLCBxLCB0eXBlKQogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2F2ZXJlc3VsdHMoZXZlbnQsIHJlZ2V4LCBtZXRhZXZlbnRzLCByZWFjdGVkZXZlbnRpZHMpewogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKHJlZ2V4KSB8fCBbXSl7CiAgICAgICAgICBpZighdXJscy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgY29uc3QgbWV0YSA9IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGV2ZW50LnB1YmtleSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCh1cmwpCiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZGV2ZW50aWRzLmluY2x1ZGVzKGV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKGV2ZW50ZGIsIHEsIHF0eXBlKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IHsKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZvcihsZXQgd29yZCBvZiBxLnNwbGl0KCIgIikpewogICAgICAgICAgICAgIGlmKG8uY29udGVudC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yod29yZC50b0xvd2VyQ2FzZSgpKSA9PSAtMSl7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIChvLmtpbmQgPT0gMSkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQogICAgICAgIGZvcihsZXQgcyBvZiBzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGlmKHF0eXBlICE9ICJ2aWRlbyIpewogICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uc2F2ZXJlc3VsdHMoZXZlbnQsIGltZ3JlZ2V4LCBtZXRhZXZlbnRzLCByZWFjdGVkZXZlbnRpZHMpKQogICAgICAgICAgfQoKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uc2F2ZXJlc3VsdHMoZXZlbnQsIHZpZGVvcmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSl7CiAgICAgICAgcmVzdWx0cy5yZXZlcnNlKCkuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidmlkZW8iIHx8ICJwaWMiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHR5cGUgKyAnPC9kaXY+PGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwoKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIAogICAgICAgICAgICBkaXYuaWQgPSBpZAogICAgICAgICAgICBkaXZbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgICBkaXZbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgZGl2WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICAgIGRpdlsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgLy9kaXYuaW5uZXJIVE1MICs9ICc8ZGl2IGNsYXNzPSJwcm9ncmVzcyI+MCAlPC9kaXY+JwogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgLy92LmNvbnRyb2xzID0gdHJ1ZQogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAvL3YucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3Yub25wcm9ncmVzcyA9IGFzeW5jIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAvLyAgbGV0IHByb2dyZXNzID0gcGFyc2VJbnQodGhpcy5idWZmZXJlZC5sZW5ndGggPT0gMCA/IDAgOiB0aGlzLmJ1ZmZlcmVkLmVuZCgwKSAvIHRoaXMuZHVyYXRpb24gKiAxMDAwMCwgMTApIC8gMTAwCiAgICAgICAgICAgIC8vICB0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigiLnByb2dyZXNzIikuaW5uZXJUZXh0ID0gcHJvZ3Jlc3MgKyAiIHwgIiArIHRoaXMuYnVmZmVyZWQubGVuZ3RoCiAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygicHJvZ3Jlc3MiLCBwcm9ncmVzcykKICAgICAgICAgICAgLy99CiAgICAgIAogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8iKQogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5hcHBlbmQodikKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChkaXYpCiAgICAgICAgICB9ZWxzZXsgCiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgYS5pZCA9IGlkCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCh0eXBlKQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgICBhLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBhWyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICAgIGFbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgICBhLmhyZWYgPSAiIyIKICAgICAgICAgICAgYS5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgLy9xcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXkKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIAogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICAgIC8vY29uc3QgdiA9IGNyZWF0ZXZpZGVvKHFzKCIjbWVkaWEtY29udGFpbmVyIiksIGl0ZW0udXJsKQogICAgICAgICAgLy92LmNvbnRyb2xzID0gdHJ1ZQogICAgICAgIH1lbHNlewogICAgICAgICAgY29uc3QgcGljID0gZ2lkKCJwaWMiKQogICAgICAgICAgcGljLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBwaWMub25sb2FkID0gKCkgPT4gKHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9CgogICAgICAgIGdpZCgicGljLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkIHx8IHJlYWN0ZWQuaW5jbHVkZXMoaWQpKXsKICAgICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHJlbGF5IG9mIHJlbGF5cyl7CiAgICAgICAgICBpZihyZWxheS5yZWFkeVN0YXRlID09IDEpewogICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldChyZWxheSkKICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIiwgc29ja2V0LnVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY29uc29sZS5sb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgICAgLy9hd2FpdCBzbGVlcCgxMDAwKQogICAgICAgICAgICAvL2Nvbm5lY3QoKQogICAgICAgICAgfQogICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGZ1bmN0aW9uKGUpewogICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgICBjaGVja3VwZGF0ZSgpCiAgICAgICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29ubmVjdCgpCiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==