this is a backup of #nostrbot dev files created with bk.sh
echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z
shasum -a 256 bk.7z
b603c6e36c12e8033c1f507d631f81d73034a0de2a001023d5d4b7bd968ed5af
18.9 kB
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==
https://ipfs.io/ipfs/QmNmsn4yS8tFaspHFNbswKQf3tgiJA5XdZVtE2opb7fGy1
files.html, release notes: 1) fixed bug with video playback
sha256
52a59db8d938a76bf60fac68f14ad399d700fcbfb7c363cd7a4a8b46b172d41f images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1IiBocmVmPSIjIj4xNTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjMwIiBocmVmPSIjIj4zMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjEwMCIgaHJlZj0iIyI+MTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgLy8ic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAvLyJzZWFyY2hyZWxheSI6ICdbIlJFUSIsICI8ST4iLCA8U0E+XScsIC8vIFNBOiB7ICJraW5kcyI6IFsxLCAyXSwgInNlYXJjaCI6ICJzdHIiIH0sIHt9Li4uCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgY29uc3QgcmVsYXlzID0gWwogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwKICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iCiAgICAgIF0KICAgICAgCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBzZXR0aW5nKCJsaW1pdCIsIDE1KQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIHR5cGVzWyJhbGwiXSA9IFsuLi50eXBlcy5pbWFnZSwgLi4udHlwZXMudmlkZW9dCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIC8vbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDEwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSwgMTApCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIGxldCBlbmFibGVkdmlkZW9zID0gMAogICAgICAgIGxldCB0b3RhbHZpZGVvcyA9IDAKICAgICAgICBsZXQgcmVhZHl2aWRlb3MgPSAwCiAgICAgICAgCiAgICAgICAgcXNhKCIjcGljcyB2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB7CiAgICAgICAgICB0b3RhbHZpZGVvcysrCiAgICAgICAgICAKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgcmVhZHl2aWRlb3MrKwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZW5hYmxlZHZpZGVvcysrCiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoKGFwbGF5ID09ICJvbiIgfHwgYXBsYXkgPT0gImhvdmVyIikgJiYgdi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICAgIC8vYXdhaXQgc2xlZXAoMTAwMCkKICAgICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICAvL2NvbnNvbGUubG9nKCJ2aWRlb3MgZW5hYmxlZCIsIGVuYWJsZWR2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHJlYWR5IiwgcmVhZHl2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHRvdGFsIiwgdG90YWx2aWRlb3MpCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInJlYWN0aW9uIHNlbnQiKQogICAgICB9CgogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIgJiYgcGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0IiAmJiBwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KICAKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGwgPSBsaW1pdCgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IHR5cGVzW3R5cGVdLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFswLCAxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IGwKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMCwgMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBzYXZlKHJlcywgcSwgdHlwZSkKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBhd2FpdCBzbGVlcCh3YWl0KQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQsIGV2ZW50aWRzKXsKICAgICAgICBpZighd2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgCiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMucmVhY3Rpb25zLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxFPiIsIEpTT04uc3RyaW5naWZ5KGV2ZW50aWRzKSkpCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKQogICAgICAgIHJldHVybiByZXMgJiYgcmVzLmZpbHRlcihlID0+IGUucHVia2V5ID09IG15cHVia2V5KS5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkgfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrZXkpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrZXkpKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhdmVyZXN1bHRzKGV2ZW50LCByZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKXsKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChyZWdleCkgfHwgW10pewogICAgICAgICAgaWYoIXVybHMuaW5jbHVkZXModXJsKSl7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2godXJsKQogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxLCBxdHlwZSl7CiAgICAgICAgY29uc3QgbWV0YWV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDApCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMSkvLy5zbGljZSgwLCAxMDApCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCiAgICAgICAgZm9yKGxldCBzIG9mIHNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIChpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidiIgfHwgImkiKSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCgogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5pZCA9IGlkCiAgICAgICAgICAgIGRpdlsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGRpdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBkaXZbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgZGl2WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAvL2Rpdi5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9InByb2dyZXNzIj4wICU8L2Rpdj4nCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdi5vbnByb2dyZXNzID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIC8vICBsZXQgcHJvZ3Jlc3MgPSBwYXJzZUludCh0aGlzLmJ1ZmZlcmVkLmxlbmd0aCA9PSAwID8gMCA6IHRoaXMuYnVmZmVyZWQuZW5kKDApIC8gdGhpcy5kdXJhdGlvbiAqIDEwMDAwLCAxMCkgLyAxMDAKICAgICAgICAgICAgLy8gIHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3MiKS5pbm5lclRleHQgPSBwcm9ncmVzcyArICIgfCAiICsgdGhpcy5idWZmZXJlZC5sZW5ndGgKICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCJwcm9ncmVzcyIsIHByb2dyZXNzKQogICAgICAgICAgICAvL30KICAgICAgCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgLy9xcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXkKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgLy9jb25zdCB2ID0gY3JlYXRldmlkZW8ocXMoIiNtZWRpYS1jb250YWluZXIiKSwgaXRlbS51cmwpCiAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGlmKHJlbGF5LnJlYWR5U3RhdGUgPT0gMSl7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5KQogICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RpbmcgdG8iLCBzb2NrZXQudXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgICBjb25zb2xlLmxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgICAvL2F3YWl0IHNsZWVwKDEwMDApCiAgICAgICAgICAgIC8vY29ubmVjdCgpCiAgICAgICAgICB9CiAgICAgICAgICBzb2NrZXQub25vcGVuID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICAgIGNoZWNrdXBkYXRlKCkKICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBjb25uZWN0KCkKICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApCiAgICAgICAgCiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmR4TMivJgmA5tVbn5JDPxgFP7cun8wPq9qecgyKMec53G
files.html, release notes: 1) improved search, 2) no longer using primal caching service, instead two regular relays
sha256
326c679689633f392925710661ca34cb754040bae9081ea992975408a468496b images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1IiBocmVmPSIjIj4xNTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjMwIiBocmVmPSIjIj4zMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjEwMCIgaHJlZj0iIyI+MTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgLy8ic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAvLyJzZWFyY2hyZWxheSI6ICdbIlJFUSIsICI8ST4iLCA8U0E+XScsIC8vIFNBOiB7ICJraW5kcyI6IFsxLCAyXSwgInNlYXJjaCI6ICJzdHIiIH0sIHt9Li4uCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgY29uc3QgcmVsYXlzID0gWwogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwKICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iCiAgICAgIF0KICAgICAgCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBzZXR0aW5nKCJsaW1pdCIsIDE1KQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIHR5cGVzWyJhbGwiXSA9IFsuLi50eXBlcy5pbWFnZSwgLi4udHlwZXMudmlkZW9dCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIC8vbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDEwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSwgMTApCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIGxldCBlbmFibGVkdmlkZW9zID0gMAogICAgICAgIGxldCB0b3RhbHZpZGVvcyA9IDAKICAgICAgICBsZXQgcmVhZHl2aWRlb3MgPSAwCiAgICAgICAgCiAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB7CiAgICAgICAgICB0b3RhbHZpZGVvcysrCiAgICAgICAgICAKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgcmVhZHl2aWRlb3MrKwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZW5hYmxlZHZpZGVvcysrCiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoKGFwbGF5ID09ICJvbiIgfHwgYXBsYXkgPT0gImhvdmVyIikgJiYgdi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICAgIC8vYXdhaXQgc2xlZXAoMTAwMCkKICAgICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICAvL2NvbnNvbGUubG9nKCJ2aWRlb3MgZW5hYmxlZCIsIGVuYWJsZWR2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHJlYWR5IiwgcmVhZHl2aWRlb3MpCiAgICAgICAgLy9jb25zb2xlLmxvZygidmlkZW9zIHRvdGFsIiwgdG90YWx2aWRlb3MpCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInJlYWN0aW9uIHNlbnQiKQogICAgICB9CgogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIgJiYgcGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0IiAmJiBwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KICAKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGwgPSBsaW1pdCgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IHR5cGVzW3R5cGVdLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFswLCAxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IGwKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMCwgMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBzYXZlKHJlcywgcSwgdHlwZSkKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBhd2FpdCBzbGVlcCh3YWl0KQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQsIGV2ZW50aWRzKXsKICAgICAgICBpZighd2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgCiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMucmVhY3Rpb25zLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxFPiIsIEpTT04uc3RyaW5naWZ5KGV2ZW50aWRzKSkpCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKQogICAgICAgIHJldHVybiByZXMgJiYgcmVzLmZpbHRlcihlID0+IGUucHVia2V5ID09IG15cHVia2V5KS5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkgfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrZXkpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrZXkpKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhdmVyZXN1bHRzKGV2ZW50LCByZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKXsKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChyZWdleCkgfHwgW10pewogICAgICAgICAgaWYoIXVybHMuaW5jbHVkZXModXJsKSl7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2godXJsKQogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxLCBxdHlwZSl7CiAgICAgICAgY29uc3QgbWV0YWV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDApCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMSkvLy5zbGljZSgwLCAxMDApCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCiAgICAgICAgZm9yKGxldCBzIG9mIHNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIChpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidiIgfHwgImkiKSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCgogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5pZCA9IGlkCiAgICAgICAgICAgIGRpdlsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGRpdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBkaXZbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgZGl2WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAvL2Rpdi5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9InByb2dyZXNzIj4wICU8L2Rpdj4nCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdi5vbnByb2dyZXNzID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIC8vICBsZXQgcHJvZ3Jlc3MgPSBwYXJzZUludCh0aGlzLmJ1ZmZlcmVkLmxlbmd0aCA9PSAwID8gMCA6IHRoaXMuYnVmZmVyZWQuZW5kKDApIC8gdGhpcy5kdXJhdGlvbiAqIDEwMDAwLCAxMCkgLyAxMDAKICAgICAgICAgICAgLy8gIHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3MiKS5pbm5lclRleHQgPSBwcm9ncmVzcyArICIgfCAiICsgdGhpcy5idWZmZXJlZC5sZW5ndGgKICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCJwcm9ncmVzcyIsIHByb2dyZXNzKQogICAgICAgICAgICAvL30KICAgICAgCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgLy9xcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXkKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgLy9jb25zdCB2ID0gY3JlYXRldmlkZW8ocXMoIiNtZWRpYS1jb250YWluZXIiKSwgaXRlbS51cmwpCiAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGlmKHJlbGF5LnJlYWR5U3RhdGUgPT0gMSl7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5KQogICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RpbmcgdG8iLCBzb2NrZXQudXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgICBjb25zb2xlLmxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgICAvL2F3YWl0IHNsZWVwKDEwMDApCiAgICAgICAgICAgIC8vY29ubmVjdCgpCiAgICAgICAgICB9CiAgICAgICAgICBzb2NrZXQub25vcGVuID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICAgIGNoZWNrdXBkYXRlKCkKICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBjb25uZWN0KCkKICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApCiAgICAgICAgCiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmdLoi4XRMYkhcYGVKpiNtqGDg3XAcKPUAz5EVa5jpUYzN
release notes: 1) improved search, 2) no longer using primal caching service, instead two regular relays
sha256
ac98a383e521adfced6e94b68eb4760469a7d0407e126c2dd36589ca4cf81b0b images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1IiBocmVmPSIjIj4xNTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjMwIiBocmVmPSIjIj4zMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjEwMCIgaHJlZj0iIyI+MTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJwaWNzIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL3Nsb3dsaS5naXRodWIuaW8vYmVjaDMyLWJ1ZmZlci9hc3NldHMvanMvYmVjaDMyLWJ1ZmZlci5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgY29uc3QgdXBkYXRlc3B1YmtleSA9ICJhZTVjNmUwYjc0NjYwZDIxOTRjODI1NGI1YzJjODI1Njc2NTc2YmUwMjk3Mzc5ZmEyMDUyMzExNGE2YTg1ZTg3IgogICAgICBjb25zdCBxdWVyaWVzID0gewogICAgICAgICJnbG9iYWwiOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsiZXhwbG9yZSIseyJ0aW1lZnJhbWUiOiJsYXRlc3QiLCJzY29wZSI6Imdsb2JhbCIsImxpbWl0Ijo8TD59XX1dJywgCiAgICAgICAgLy8ic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAvLyJzZWFyY2hyZWxheSI6ICdbIlJFUSIsICI8ST4iLCA8U0E+XScsIC8vIFNBOiB7ICJraW5kcyI6IFsxLCAyXSwgInNlYXJjaCI6ICJzdHIiIH0sIHt9Li4uCiAgICAgICAgImF1dGhvciI6ICdbIlJFUSIsIjxJPiIseyJraW5kcyI6WzFdLCJhdXRob3JzIjpbIjxQPiJdfV0nLAogICAgICAgICJyZWFjdGlvbnMiOiAnWyJSRVEiLCI8ST4iLCB7ImtpbmRzIjpbN10sIiNlIjogPEU+fV0nCiAgICAgIH0KICAgICAgY29uc3QgcmVsYXlzID0gWwogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwKICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iCiAgICAgIF0KICAgICAgCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gc2V0dGluZygiY29scyIsIGNvbG9wdHNbMV0pCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBzZXR0aW5nKCJsaW1pdCIsIDE1KQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIHR5cGVzWyJhbGwiXSA9IFsuLi50eXBlcy5pbWFnZSwgLi4udHlwZXMudmlkZW9dCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIC8vbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDEwMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSwgMTApCiAgICAgICAgcmV0dXJuIHYgJiYgb3B0aW9uKCJzZXQiICsga2V5LCBrZXksIHYpICYmIHYgfHwgZGVmYXVsdHZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG9wdGlvbihjLCBrZXksIHZhbCl7CiAgICAgICAgcmV0dXJuIHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUgfHwgImFsbCIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIGxldCBlbmFibGVkdmlkZW9zID0gMAogICAgICAgIGxldCB0b3RhbHZpZGVvcyA9IDAKICAgICAgICBsZXQgcmVhZHl2aWRlb3MgPSAwCiAgICAgICAgCiAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB7CiAgICAgICAgICB0b3RhbHZpZGVvcysrCiAgICAgICAgICAKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgcmVhZHl2aWRlb3MrKwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAgIGlmKGFwbGF5ICE9ICJvbiIpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB9CiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZW5hYmxlZHZpZGVvcysrCiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYoKGFwbGF5ID09ICJvbiIgfHwgYXBsYXkgPT0gImhvdmVyIikgJiYgdi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICAgIC8vYXdhaXQgc2xlZXAoMTAwMCkKICAgICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZygidmlkZW9zIGVuYWJsZWQiLCBlbmFibGVkdmlkZW9zKQogICAgICAgIGNvbnNvbGUubG9nKCJ2aWRlb3MgcmVhZHkiLCByZWFkeXZpZGVvcykKICAgICAgICBjb25zb2xlLmxvZygidmlkZW9zIHRvdGFsIiwgdG90YWx2aWRlb3MpCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInJlYWN0aW9uIHNlbnQiKQogICAgICB9CgogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIgJiYgcGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0IiAmJiBwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KICAKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0ci50cmltKCkKICAgICAgICBsZXQgdHlwZSA9IHF1ZXJ5dHlwZSgpCiAgICAgICAgbGV0IGwgPSBsaW1pdCgpCiAgICAgICAgbGV0IGkgPSArK2lkY291bnRlcgogICAgICAgIGxldCBxaWQgPSAicXVlcnlfIiArIGkKICAgICAgICBsZXQgZmlsdGVycyA9IHR5cGVzW3R5cGVdLm1hcCgodCkgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAga2luZHM6IFswLCAxXSwgCiAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgbGltaXQ6IGwKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMCwgMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgIGNvbnN0IHNlYXJjaGpzb24gPSBKU09OLnN0cmluZ2lmeShzZWFyY2hvYmopCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBzYXZlKHJlcywgcSwgdHlwZSkKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBhd2FpdCBzbGVlcCh3YWl0KQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQsIGV2ZW50aWRzKXsKICAgICAgICBpZighd2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgCiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMucmVhY3Rpb25zLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxFPiIsIEpTT04uc3RyaW5naWZ5KGV2ZW50aWRzKSkpCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKQogICAgICAgIHJldHVybiByZXMgJiYgcmVzLmZpbHRlcihlID0+IGUucHVia2V5ID09IG15cHVia2V5KS5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkgfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrZXkpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrZXkpKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhdmVyZXN1bHRzKGV2ZW50LCByZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKXsKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChyZWdleCkgfHwgW10pewogICAgICAgICAgaWYoIXVybHMuaW5jbHVkZXModXJsKSl7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgIAogICAgICAgICAgICB1cmxzLnB1c2godXJsKQogICAgICAgICAgICByZXN1bHRzLnB1c2goewogICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxLCBxdHlwZSl7CiAgICAgICAgY29uc3QgbWV0YWV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDApCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMSkvLy5zbGljZSgwLCAxMDApCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCiAgICAgICAgZm9yKGxldCBzIG9mIHNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHJlc3VsdHMsIHEpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIChpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSAmJiAidiIgfHwgImkiKSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCgogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5pZCA9IGlkCiAgICAgICAgICAgIGRpdlsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGRpdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBkaXZbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgZGl2WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAvL2Rpdi5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9InByb2dyZXNzIj4wICU8L2Rpdj4nCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIC8vdi5wcmVsb2FkID0gImF1dG8iCiAgICAgICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdi5vbnByb2dyZXNzID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIC8vICBsZXQgcHJvZ3Jlc3MgPSBwYXJzZUludCh0aGlzLmJ1ZmZlcmVkLmxlbmd0aCA9PSAwID8gMCA6IHRoaXMuYnVmZmVyZWQuZW5kKDApIC8gdGhpcy5kdXJhdGlvbiAqIDEwMDAwLCAxMCkgLyAxMDAKICAgICAgICAgICAgLy8gIHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3MiKS5pbm5lclRleHQgPSBwcm9ncmVzcyArICIgfCAiICsgdGhpcy5idWZmZXJlZC5sZW5ndGgKICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCJwcm9ncmVzcyIsIHByb2dyZXNzKQogICAgICAgICAgICAvL30KICAgICAgCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjcGljLCAjbWVkaWEtZm9vdGVyIikuZm9yRWFjaChuID0+IG4uc3R5bGUuZGlzcGxheSA9ICJub25lIikKICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgLy9xcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIAogICAgICAgIGxldCByZXNoYW5kbGVyID0gZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXkKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkpCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgLy9jb25zdCB2ID0gY3JlYXRldmlkZW8ocXMoIiNtZWRpYS1jb250YWluZXIiKSwgaXRlbS51cmwpCiAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5jb3VudCgpewogICAgICAgIHJldHVybiBzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCgpewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGlmKHJlbGF5LnJlYWR5U3RhdGUgPT0gMSl7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5KQogICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RpbmcgdG8iLCBzb2NrZXQudXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgICBjb25zb2xlLmxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgICAvL2F3YWl0IHNsZWVwKDEwMDApCiAgICAgICAgICAgIC8vY29ubmVjdCgpCiAgICAgICAgICB9CiAgICAgICAgICBzb2NrZXQub25vcGVuID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICAgIGNoZWNrdXBkYXRlKCkKICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBjb25uZWN0KCkKICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApCiAgICAgICAgCiAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmbTYqf7WQwRm77s8W6Yga4qUKYpFZ1FUZLxw7GxpMCQZ5
sha256
ccc93dbf36898317d06f3329dfb59c0cadddf9ac1facc3fcc98ed8e591bca4a4 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAucHJvZ3Jlc3MgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1MCIgaHJlZj0iIyI+MTUwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxNTAwIiBocmVmPSIjIj4xNTAwPC9hPgogICAgICAgIDxwPkhpZ2ggbGltaXQgZmluZHMgbW9yZSByZXN1bHRzLCBidXQgbmVlZHMgbW9yZSBwcm9jZXNzaW5nIHBvd2VyPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBjb25zdCByZWxheXMgPSBbCiAgICAgICAgWyJwcmltYWwiLCAid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyJdLCAKICAgICAgICBbInJlbGF5IiwgIndzczovL25vcy5sb2wiXSwKICAgICAgICBbInJlbGF5IiwgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQvIl0KICAgICAgXQogICAgICAKICAgICAgY29uc3QgY29sb3B0cyA9IFsyLCA0LCA2LCAxMF0KICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb2xzIikgfHwgIjQiLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiYXV0b3BsYXkiKSB8fCAib2ZmIgogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICIxNTAiLCAxMCkKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgcmVsYXlzb2NrZXRzID0gW10KICAgICAgbGV0IHByaW1hbGhhbmRsZXJzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHBpY3R1cmVzID0gW10KICAgICAgbGV0IGZpbGVzID0gW10KICAgICAgbGV0IGV2ZW50ZGIgPSBbXQogICAgICBsZXQgcmVhY3RlZCA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIC8vbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDMwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnl0eXBlID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxdWVyeXR5cGUoKXsKICAgICAgICByZXR1cm4gcXMoIiNxdWVyeS10eXBlIikudmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlcXVlcnkoKXsKICAgICAgICBsZXQgcGFydHMgPSBkZWNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkpLnNwbGl0KCIvIikKICAgICAgICBxdWVyeXN0ciA9IHFzKCIjcXVlcnlkaXNwbGF5IC50ZXh0IikuaW5uZXJUZXh0ID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5IikudmFsdWUgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlID0gcGFydHNbMV0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKGFzeW5jIHYgPT4gewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KCiAgICAgICAgICBpZihhdXRvcGxheSgpICE9ICJvbiIpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAgIAogICAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgLy9hd2FpdCBzbGVlcCgxMDAwKQogICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LnBpY0lkCiAgICAgICAgCiAgICAgICAgaWYocGljaWQpewogICAgICAgICAgZ2lkKHBpY2lkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgcmVhY3RlZC5wdXNoKHBpY2lkKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZygicmVhY3Rpb24gc2VudCIpCiAgICAgIH0KCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0IiAmJiBwaWNvZmZzZXQoLTEpKXsKICAgICAgICAgIHBpY29mZnNldCgtMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiICYmIHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQogIAogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgZnVuY3Rpb24gcXVlcnkoc29ja2V0KXsKICAgICAgICBsZXQgdCA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBsID0gKGxhc3RxdWVyeXN0ciA9PSBxICYmIGxhc3RxdWVyeXR5cGUgPT0gdHlwZSkgJiYgMTAgfHwgbGltaXQoKQogICAgICAgIAogICAgICAgIC8vY29uc29sZS5sb2coInF1ZXJ5IGxpbWl0IiwgbCkKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxLCB0eXBlKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbCkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbCkucmVwbGFjZSgnPFE+JywgcSkpCiAgICAgICAgICAKICAgICAgICBsYXN0cXVlcnlzdHIgPSBxCiAgICAgICAgbGFzdHF1ZXJ5dHlwZSA9IHR5cGUgCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5bGlrZXMoc29ja2V0LCBldmVudGlkcyl7CiAgICAgICAgaWYoIXdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBub3N0ci5nZXRQdWJsaWNLZXkoKQogICAgICAgIAogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLnJlYWN0aW9ucy5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8RT4iLCBKU09OLnN0cmluZ2lmeShldmVudGlkcykpKQogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHdhaXRyZXMocXVlcnlpZCkKICAgICAgICByZXR1cm4gcmVzICYmIHJlcy5maWx0ZXIoZSA9PiBlLnB1YmtleSA9PSBteXB1YmtleSkubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pIHx8IFtdCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHVia2V5KXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHVia2V5KSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzYXZlcmVzdWx0cyh0eXBlLCBldmVudCwgcmVnZXgsIHVybHMsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcyl7CiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2gocmVnZXgpIHx8IFtdKXsKICAgICAgICAgIGlmKCF1cmxzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKHVybCkKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICB0eXBlOiB0eXBlLCAKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiByZXN1bHRzCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoZXZlbnRkYiwgcSwgcXR5cGUpewogICAgICAgIGNvbnN0IG1ldGFldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAwKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDEpCiAgICAgICAgbGV0IG5ld3BpY3MgPSBbXQogICAgICAgIGxldCBuZXd2aWRlb3MgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCgogICAgICAgIGZvcihsZXQgcyBvZiByZWxheXNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW9zIil7CiAgICAgICAgICAgIG5ld3BpY3MucHVzaCguLi5zYXZlcmVzdWx0cygicGljIiwgZXZlbnQsIGltZ3JlZ2V4LCBwaWN0dXJlcywgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KCiAgICAgICAgICBpZihxdHlwZSAhPSAiaW1hZ2VzIil7CiAgICAgICAgICAgIG5ld3ZpZGVvcy5wdXNoKC4uLnNhdmVyZXN1bHRzKCJmaWxlIiwgZXZlbnQsIHZpZGVvcmVnZXgsIGZpbGVzLCBtZXRhZXZlbnRzLCByZWFjdGVkZXZlbnRpZHMpKQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9jb25zb2xlLmxvZygicGljcyIsIG5ld3BpY3MubGVuZ3RoKQogICAgICAgIC8vY29uc29sZS5sb2coInZpZGVvcyIsIG5ld3ZpZGVvcy5sZW5ndGgpCiAgICAgICAgCiAgICAgICAgdXBkYXRlY29udGVudChuZXdwaWNzLCBuZXd2aWRlb3MsIHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocGljcywgZmlsZXMsIHEpewogICAgICAgIFsuLi5waWNzLCAuLi5maWxlc10ucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICAvL2NvbnNvbGUubG9nKCJ1cGRhdGVjb250ZW50IiwgaXRlbSkKICAgICAgICAgIAogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgaWQgPSAiaXRlbV8iICsgKCsraWRjb3VudGVyKQogICAgICAgICAgY29uc3QgY29udGVudGVsZW1lbnRzID0gJzxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1pdGVtLWlkPSInICsgaWQgKyAKICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIAogICAgICAgICAgICBkaXYuaWQgPSBpZAogICAgICAgICAgICBkaXZbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgICBkaXZbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgZGl2WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICAgIGRpdlsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgZGl2LmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz0icHJvZ3Jlc3MiPjAgJTwvZGl2PicKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICAKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm1ldGFkYXRhIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAvL3YucHJlbG9hZCA9ICJhdXRvIgoKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vdi5vbnByb2dyZXNzID0gYXN5bmMgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIC8vICBsZXQgcHJvZ3Jlc3MgPSBwYXJzZUludCh0aGlzLmJ1ZmZlcmVkLmxlbmd0aCA9PSAwID8gMCA6IHRoaXMuYnVmZmVyZWQuZW5kKDApIC8gdGhpcy5kdXJhdGlvbiAqIDEwMDAwLCAxMCkgLyAxMDAKICAgICAgICAgICAgLy8gIHRoaXMucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCIucHJvZ3Jlc3MiKS5pbm5lclRleHQgPSBwcm9ncmVzcyArICIgfCAiICsgdGhpcy5idWZmZXJlZC5sZW5ndGgKICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCJwcm9ncmVzcyIsIHByb2dyZXNzKQogICAgICAgICAgICAvL30KICAgICAgCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIC8vcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKT8ucGF1c2UoKQogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaCgocmVzKSA9PiB7CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pCiAgICAgICAgfSkKICAgICAgfQogICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNoZWNrdXBkYXRlKCl7CiAgICAgICAgY29uc3QgdXBkYXRlc3JlcyA9IGF3YWl0IHF1ZXJ5cHVia2V5KHJlbGF5c29ja2V0c1swXSwgdXBkYXRlc3B1YmtleSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzaG93KGlkKXsKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1pdGVtIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICAKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBjb25zdCB2ID0gZ2lkKGlkKS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpCiAgICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHYpCiAgICAgICAgICB2Lm11dGVkID0gZmFsc2UKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgICAvL2NvbnN0IHYgPSBjcmVhdGV2aWRlbyhxcygiI21lZGlhLWNvbnRhaW5lciIpLCBpdGVtLnVybCkKICAgICAgICAgIC8vdi5jb250cm9scyA9IHRydWUKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGNvbnN0IHBpYyA9IGdpZCgicGljIikKICAgICAgICAgIHBpYy5zcmMgPSBpdGVtLnVybAogICAgICAgICAgcGljLm9ubG9hZCA9ICgpID0+IChwaWMuc3R5bGUuZGlzcGxheSA9ICJibG9jayIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCB8fCByZWFjdGVkLmluY2x1ZGVzKGlkKSl7CiAgICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI3BpYy1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsICgpID0+IHsKICAgICAgICBmb3IobGV0IHJlbGF5IG9mIHJlbGF5cyl7CiAgICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldChyZWxheVsxXSkKCiAgICAgICAgICBpZihyZWxheVswXSA9PSAicHJpbWFsIil7CiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSBhc3luYyBlID0+IHsKICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgICAgICAgIGxldCByZWFkeSA9IHJlbGF5c29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgICAgICAgICAgICBpZihyZWFkeSA8IHJlbGF5c29ja2V0cy5sZW5ndGgpewogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGluZyB0byByZWxheXMiLCByZWFkeSwgcmVsYXlzb2NrZXRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoNTApCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgICAgICBicmVhayAgCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGVkIikKCiAgICAgICAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHByaW1hbGhhbmRsZXJzLmZvckVhY2goZiA9PiBmKG1lc3NhZ2UpKQogICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IGNvbnNvbGUubG9nKCJwcmltYWwgc29ja2V0IGNsb3NlZCIpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHJlbGF5c29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJlbGF5c29ja2V0c1swXS5vbm9wZW4gPSBlID0+IGNoZWNrdXBkYXRlKCkKICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmW8DdPczKZ3CtdYtBSXoEgkfckXocnq9LUpyinRBZyp5U
sha256
2025aabec123f669b6d32812fe644ed9c3bab03d954931089a70d9ef7dc07393 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgLypjdXJzb3I6IHBvaW50ZXI7Ki8KICAgICAgfQogICAgICAKICAgICAgLnZpZGVvLWNvbnRhaW5lciAucHJvZ3Jlc3MgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhLAogICAgICAjcGljcyAucXVlcnkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgICAKICAgICAgc3BhbiNjb250cm9saW5mbyB7CiAgICAgICAgcmlnaHQ6IDJlbTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQoKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDApOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgei1pbmRleDogNDsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI3BpYyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDB2dzsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDB2aDsKICAgICAgfQogICAgICAgIAogICAgICAjcGljcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiBhLCAKICAgICAgI3BpY3MgaW1nLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSwKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjV2dzsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJvcmRlcjogMC4zZW0gc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zZW07CiAgICAgICAgbWFyZ2luOiAtMC4zZW07CiAgICAgIH0KCiAgICAgICNwaWNzID4gLmZpbGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNmaWx0ZXItbGlrZXMsIAogICAgICAuZmlsdGVyLWxpa2VzICNwaWNzID4gYTpub3QoLnJlYWN0ZWQpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSwKICAgICAgI3BpYy11c2VyIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIAogICAgICBpbWcsIAogICAgICAudmlkZW8gdmlkZW8gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjdGVtcGxhdGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KICAgICAgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEgPiBhLCB7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMTR2dyAqICgxIC8gJHtjb2xzfSksIDZlbSAqICgxIC8gJHtjb2xzfSkpCiAgICAgIH0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1lZGlhLWZvb3RlciI+CiAgICAgIDxhIGlkPSJwaWMtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy1xdWVyeSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXVzZXIiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0icGljLWNvbnRhaW5lciI+CiAgICAgICAgPGltZyBpZD0icGljIi8+CiAgICAgIDwvZGl2PgogICAgPC9jZW50ZXI+CiAgICA8ZGl2IGlkPSJtZW51LW92ZXJsYXkiPjwvZGl2PgogICAgPGRpdiBpZD0ibWVudS1jb250ZW50IiBjbGFzcz0idGVzdCI+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+YXV0b3BsYXk6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvbiIgaHJlZj0iIyI+b248L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9ImhvdmVyIiBocmVmPSIjIj5tb3VzZW92ZXI8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjE1MCIgaHJlZj0iIyI+MTUwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxNTAwIiBocmVmPSIjIj4xNTAwPC9hPgogICAgICAgIDxwPkhpZ2ggbGltaXQgZmluZHMgbW9yZSByZXN1bHRzLCBidXQgbmVlZHMgbW9yZSBwcm9jZXNzaW5nIHBvd2VyPC9wPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbj5pbWFnZXM8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbj52aWRlb3M8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPGlucHV0IGlkPSJnbyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iZ28iLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPHNwYW4gaWQ9InF1ZXJ5ZGlzcGxheSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0idGV4dCI+PC9zcGFuPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAic2VhcmNoIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbInNlYXJjaCIseyJxdWVyeSI6IjxRPiIsImxpbWl0Ijo8TD59XX1dJywKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBjb25zdCByZWxheXMgPSBbCiAgICAgICAgWyJwcmltYWwiLCAid3NzOi8vY2FjaGUzLnByaW1hbC5uZXQvY2FjaGUxNyJdLCAKICAgICAgICBbInJlbGF5IiwgIndzczovL25vcy5sb2wiXSwKICAgICAgICBbInJlbGF5IiwgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQvIl0KICAgICAgXQogICAgICAKICAgICAgY29uc3QgY29sb3B0cyA9IFsyLCA0LCA2LCAxMF0KICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb2xzIikgfHwgIjQiLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiYXV0b3BsYXkiKSB8fCAib2ZmIgogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICIxNTAiLCAxMCkKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgcmVsYXlzb2NrZXRzID0gW10KICAgICAgbGV0IHByaW1hbGhhbmRsZXJzID0gW10KICAgICAgbGV0IHJlc2hhbmRsZXJzID0gW10KICAgICAgbGV0IHBpY3R1cmVzID0gW10KICAgICAgbGV0IGZpbGVzID0gW10KICAgICAgbGV0IGV2ZW50ZGIgPSBbXQogICAgICBsZXQgcmVhY3RlZCA9IFtdCiAgICAgIGxldCBpZGNvdW50ZXIgPSAwCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnB8Z2lmKS9naQogICAgICAvL2xldCBmaWxlcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wM3xtcDR8dHh0KS9naQogICAgICBsZXQgdmlkZW9yZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXA0fHdlYm0pL2dpCiAgICAgIGxldCB2aWRlb2V4dHJlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvaQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5c3RyID0gIiIKICAgICAgbGFzdHF1ZXJ5dHlwZSA9ICIiCiAgICAgIAogICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIHFzKCIjcGljLWxpa2UiKS5pbm5lckhUTUwgPSBxcygiI2ZpbHRlci1saWtlcyIpLmlubmVySFRNTCA9IHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MCiAgICAgIHNldGFjdGl2ZSgic2V0Y29scyIsICJjb2xzIiwgY29scygpKQogICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCgogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gYSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiB1cGRhdGV2aWRlb3BsYXkoKXsKICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHsKICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CgogICAgICAgICAgaWYoYXV0b3BsYXkoKSAhPSAib24iKXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgICAKICAgICAgICAgIGlmKChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA8IHNjcm9sbFkgCiAgICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIC8vYXdhaXQgc2xlZXAoMTAwMCkKICAgICAgICAgICAgdi5wbGF5KCkKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCAoKSA9PiB1cGRhdGV2aWRlb3BsYXkoKSkKICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgIH0pCgogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikucGxheSgpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSAhPSAiYmxvY2siICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikpewogICAgICAgICAgbGlrZShlLnRhcmdldCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrZXkgPSBhd2FpdCBub3N0ci5nZXRQdWJsaWNLZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBub3N0ci5zaWduRXZlbnQoewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmtleSwKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHJlbGF5c29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBsaWtlXSkpKQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coInJlYWN0aW9uIHNlbnQiKQogICAgICB9CgogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0Rvd24iICYmIHBpY29mZnNldChjb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIgJiYgcGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0IiAmJiBwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KICAKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHEgPSBxdWVyeXN0cgogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgbCA9IChsYXN0cXVlcnlzdHIgPT0gcSAmJiBsYXN0cXVlcnl0eXBlID09IHR5cGUpICYmIDEwIHx8IGxpbWl0KCkKICAgICAgICAKICAgICAgICAvL2NvbnNvbGUubG9nKCJxdWVyeSBsaW1pdCIsIGwpCiAgICAgICAgCiAgICAgICAgcHJpbWFsaGFuZGxlcnMucHVzaCgoZXZlbnQpID0+IHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpWzJdCiAgICAgICAgICBkYXRhICYmIGV2ZW50ZGIucHVzaChkYXRhKQogICAgICAgICAgIAogICAgICAgICAgaWYoZXZlbnQuZGF0YS5pbmRleE9mKCJFT1NFIikgPT0gMil7CiAgICAgICAgICAgIHNhdmUoZXZlbnRkYiwgcSwgdHlwZSkKICAgICAgICAgICAgZXZlbnRkYiA9IFtdCiAgICAgICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSB0KQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHF1ZXJ5KHNvY2tldCksIHdhaXQpCiAgICAgICAgCiAgICAgICAgICAgIHByaW1hbGhhbmRsZXJzLnNwbGljZShwcmltYWxoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHNvY2tldC5zZW5kKHEgPT0gIiIgJiYgcXVlcmllcy5nbG9iYWwucmVwbGFjZSgnPEk+JywgKytpZGNvdW50ZXIpLnJlcGxhY2UoJzxMPicsIGwpIAogICAgICAgICAgfHwgcXVlcmllcy5zZWFyY2gucmVwbGFjZSgnPEk+JywgKytpZGNvdW50ZXIpLnJlcGxhY2UoJzxMPicsIGwpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICAgICAgCiAgICAgICAgbGFzdHF1ZXJ5c3RyID0gcQogICAgICAgIGxhc3RxdWVyeXR5cGUgPSB0eXBlIAogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2F2ZXJlc3VsdHModHlwZSwgZXZlbnQsIHJlZ2V4LCB1cmxzLCBtZXRhZXZlbnRzLCByZWFjdGVkZXZlbnRpZHMpewogICAgICAgIGxldCByZXN1bHRzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKHJlZ2V4KSB8fCBbXSl7CiAgICAgICAgICBpZighdXJscy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgY29uc3QgbWV0YSA9IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGV2ZW50LnB1YmtleSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHVybHMucHVzaCh1cmwpCiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgdHlwZTogdHlwZSwgCiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZGV2ZW50aWRzLmluY2x1ZGVzKGV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKGV2ZW50ZGIsIHEsIHF0eXBlKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICBsZXQgbmV3dmlkZW9zID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvcyIpewogICAgICAgICAgICBuZXdwaWNzLnB1c2goLi4uc2F2ZXJlc3VsdHMoInBpYyIsIGV2ZW50LCBpbWdyZWdleCwgcGljdHVyZXMsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlcyIpewogICAgICAgICAgICBuZXd2aWRlb3MucHVzaCguLi5zYXZlcmVzdWx0cygiZmlsZSIsIGV2ZW50LCB2aWRlb3JlZ2V4LCBmaWxlcywgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vY29uc29sZS5sb2coInBpY3MiLCBuZXdwaWNzLmxlbmd0aCkKICAgICAgICAvL2NvbnNvbGUubG9nKCJ2aWRlb3MiLCBuZXd2aWRlb3MubGVuZ3RoKQogICAgICAgIAogICAgICAgIHVwZGF0ZWNvbnRlbnQobmV3cGljcywgbmV3dmlkZW9zLCBxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVjb250ZW50KHBpY3MsIGZpbGVzLCBxKXsKICAgICAgICBbLi4ucGljcywgLi4uZmlsZXNdLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgLy9jb25zb2xlLmxvZygidXBkYXRlY29udGVudCIsIGl0ZW0pCiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmlkID0gaWQKICAgICAgICAgICAgZGl2WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgICAgZGl2WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICAgIGRpdlsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBkaXZbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgKz0gJzxkaXYgY2xhc3M9InByb2dyZXNzIj4wICU8L2Rpdj4nCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJtZXRhZGF0YSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgLy92LnByZWxvYWQgPSAiYXV0byIKCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkoKQogICAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICB9CgogICAgICAgICAgICAvL3Yub25wcm9ncmVzcyA9IGFzeW5jIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAvLyAgbGV0IHByb2dyZXNzID0gcGFyc2VJbnQodGhpcy5idWZmZXJlZC5sZW5ndGggPT0gMCA/IDAgOiB0aGlzLmJ1ZmZlcmVkLmVuZCgwKSAvIHRoaXMuZHVyYXRpb24gKiAxMDAwMCwgMTApIC8gMTAwCiAgICAgICAgICAgIC8vICB0aGlzLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigiLnByb2dyZXNzIikuaW5uZXJUZXh0ID0gcHJvZ3Jlc3MgKyAiIHwgIiArIHRoaXMuYnVmZmVyZWQubGVuZ3RoCiAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygicHJvZ3Jlc3MiLCBwcm9ncmVzcykKICAgICAgICAgICAgLy99CiAgICAgIAogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8iKQogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5hcHBlbmQodikKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChkaXYpCiAgICAgICAgICB9ZWxzZXsgCiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgYS5pZCA9IGlkCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZChpdGVtLnR5cGUpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGFbImRhdGEtaXRlbSJdID0gaXRlbQogICAgICAgICAgICBhWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICAgIGFbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgYVsiZGF0YS10ZXh0Il0gPSB0ZXh0CiAgICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgICBhLmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBpdGVtLnVybCArICciLz4nCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNwaWMsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICAvL3FzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIik/LnBhdXNlKCkKICAgICAgICBjb25zdCB2ID0gcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKQogICAgICAgIAogICAgICAgIGlmKHYpewogICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgIGdpZCh2WyJkYXRhLWl0ZW0taWQiXSkuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgCiAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgLy9jb25zdCB2ID0gY3JlYXRldmlkZW8ocXMoIiNtZWRpYS1jb250YWluZXIiKSwgaXRlbS51cmwpCiAgICAgICAgICAvL3YuY29udHJvbHMgPSB0cnVlCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgICBwaWMuc3JjID0gaXRlbS51cmwKICAgICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihpdGVtLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgIH0KCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhID0gcXMoIiNwaWMtcXVlcnkiKQogICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgIGEuaW5uZXJUZXh0ID0gZ2lkKGlkKVsiZGF0YS10ZXh0Il0KICAgICAgICAgIAogICAgICAgIG1lZGlhLnN0eWxlLmRpc3BsYXkgPSBnaWQoIm1lZGlhLWZvb3RlciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCAoKSA9PiB7CiAgICAgICAgZm9yKGxldCByZWxheSBvZiByZWxheXMpewogICAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQocmVsYXlbMV0pCgogICAgICAgICAgaWYocmVsYXlbMF0gPT0gInByaW1hbCIpewogICAgICAgICAgICBzb2NrZXQub25vcGVuID0gYXN5bmMgZSA9PiB7CiAgICAgICAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICAgICAgICBsZXQgcmVhZHkgPSByZWxheXNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICAgICAgICAgICAgaWYocmVhZHkgPCByZWxheXNvY2tldHMubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RpbmcgdG8gcmVsYXlzIiwgcmVhZHksIHJlbGF5c29ja2V0cy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKDUwKQogICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICAgICAgYnJlYWsgIAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RlZCIpCgogICAgICAgICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoIm5vc3RyIikKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgICAgICAgfQogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiBwcmltYWxoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiBjb25zb2xlLmxvZygicHJpbWFsIHNvY2tldCBjbG9zZWQiKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2goZiA9PiBmKG1lc3NhZ2UpKQogICAgICAgICAgICByZWxheXNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZWxheXNvY2tldHNbMF0ub25vcGVuID0gZSA9PiBjaGVja3VwZGF0ZSgpCiAgICAgIH0pCiAgICAgIAogICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nICsgY29sc2Nzcy5pbm5lclRleHQucmVwbGFjZSgvXCRce2NvbHNcfS9nLCBjKSArICc8L3N0eWxlPicpCiAgICAgIH0KICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=
https://ipfs.io/ipfs/QmRTVkpU7W7QAhR5mr5jPTjsvoEkL1FDBZGnL1ZmMT8J3B
sha256
9253223f0c8a6c9def9f43fdd5e3dfb5da8a7acde8b492a09bfa4acdec9e33b7 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlby1jb250YWluZXIgewogICAgICAgIC8qY3Vyc29yOiBwb2ludGVyOyovCiAgICAgIH0KICAgICAgCiAgICAgIC8qI2hlYWRlciAuc2V0Y29scywgCiAgICAgICNoZWFkZXIgLnNldGxpbWl0IHsKICAgICAgICBwYWRkaW5nOiAuOGVtIDA7CiAgICAgIH0qLwogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuOGVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBmb250LXNpemU6IG1pbigzLjV2dywgMS41ZW0pOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC42KTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgcGFkZGluZzogLjZlbSAuNGVtIC4xZW0gLjRlbTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgYS5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE1ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNWVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICB9CgogICAgICAjbWVudS1jb250ZW50Lm9wZW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgc3ZnLCAKICAgICAgaW1nLCAKICAgICAgLnZpZGVvIHZpZGVvIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLCAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIGltZywKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhID4gYSwgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5OjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGltaXQ6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSI3NSIgaHJlZj0iIyI+NzU8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIyMDAiIGhyZWY9IiMiPjIwMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjUwMCIgaHJlZj0iIyI+NTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhdXRvcGxheSIpIHx8ICJvZmYiCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImxpbWl0IikgfHwgIjc1IiwgMTApCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHJlbGF5c29ja2V0cyA9IFtdCiAgICAgIGxldCBwcmltYWxoYW5kbGVycyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCBwaWN0dXJlcyA9IFtdCiAgICAgIGxldCBmaWxlcyA9IFtdCiAgICAgIGxldCBldmVudGRiID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwfGdpZikvZ2kKICAgICAgbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvCiAgICAgIHdhaXRtcyA9IDMwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQoKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcGljcyAuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyAuYWN0aXZlIikucG9wKCkgICAgICAKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbWVudSgpewogICAgICAgIHFzYSgiI21lbnUtY29udGVudCwgI21lbnUtb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgIT0gNCl7CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQoKICAgICAgICAgIGlmKGF1dG9wbGF5KCkgIT0gIm9uIil7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgY29uc3QgbiA9IHYucGFyZW50RWxlbWVudAogICAgICAgICAgCiAgICAgICAgICBpZigobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPCBzY3JvbGxZIAogICAgICAgICAgfHwgbi5vZmZzZXRUb3AgPiAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCkpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAvL2F3YWl0IHNsZWVwKDEwMDApCiAgICAgICAgICAgIHYucGxheSgpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwgKCkgPT4gdXBkYXRldmlkZW9wbGF5KCkpCiAgICAgIAogICAgICBxcygiZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKS5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ICE9ICJibG9jayIgJiYgYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgcXNhKCJ2aWRlbyIpLmZvckVhY2godiA9PiB2LnBhdXNlKCkpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LnBpY0lkCiAgICAgICAgCiAgICAgICAgaWYocGljaWQpewogICAgICAgICAgZ2lkKHBpY2lkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgcmVhY3RlZC5wdXNoKHBpY2lkKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZygicmVhY3Rpb24gc2VudCIpCiAgICAgIH0KCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0IiAmJiBwaWNvZmZzZXQoLTEpKXsKICAgICAgICAgIHBpY29mZnNldCgtMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiICYmIHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQogIAogICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgZnVuY3Rpb24gcXVlcnkoc29ja2V0KXsKICAgICAgICBsZXQgdCA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyCiAgICAgICAgCiAgICAgICAgcHJpbWFsaGFuZGxlcnMucHVzaCgoZXZlbnQpID0+IHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpWzJdCiAgICAgICAgICBkYXRhICYmIGV2ZW50ZGIucHVzaChkYXRhKQogICAgICAgICAgIAogICAgICAgICAgaWYoZXZlbnQuZGF0YS5pbmRleE9mKCJFT1NFIikgPT0gMil7CiAgICAgICAgICAgIHNhdmUoZXZlbnRkYiwgcSkKICAgICAgICAgICAgZXZlbnRkYiA9IFtdCiAgICAgICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSB0KQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHF1ZXJ5KHNvY2tldCksIHdhaXQpCiAgICAgICAgCiAgICAgICAgICAgIHByaW1hbGhhbmRsZXJzLnNwbGljZShwcmltYWxoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIHNvY2tldC5zZW5kKHEgPT0gIiIgJiYgcXVlcmllcy5nbG9iYWwucmVwbGFjZSgnPEk+JywgKytpZGNvdW50ZXIpLnJlcGxhY2UoJzxMPicsIGxpbWl0KCkpIAogICAgICAgICAgfHwgcXVlcmllcy5zZWFyY2gucmVwbGFjZSgnPEk+JywgKytpZGNvdW50ZXIpLnJlcGxhY2UoJzxMPicsIGxpbWl0KS5yZXBsYWNlKCc8UT4nLCBxKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQsIGV2ZW50aWRzKXsKICAgICAgICBpZighd2luZG93Lm5vc3RyKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgCiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJsaWtlc18iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMucmVhY3Rpb25zLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxFPiIsIEpTT04uc3RyaW5naWZ5KGV2ZW50aWRzKSkpCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxdWVyeWlkKQogICAgICAgIHJldHVybiByZXMgJiYgcmVzLmZpbHRlcihlID0+IGUucHVia2V5ID09IG15cHVia2V5KS5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkgfHwgW10KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrZXkpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAicXVlcnlfIiArICgrK2lkY291bnRlcikKICAgICAgICBzb2NrZXQuc2VuZChxdWVyaWVzLmF1dGhvci5yZXBsYWNlKCI8ST4iLCBxdWVyeWlkKS5yZXBsYWNlKCI8UD4iLCBwdWJrZXkpKQoKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoZXZlbnRkYiwgcSl7CiAgICAgICAgY29uc3QgbWV0YWV2ZW50cyA9IGV2ZW50ZGIuZmlsdGVyKG8gPT4gby5raW5kID09IDApCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMSkKICAgICAgICBsZXQgbmV3cGljcyA9IFtdCiAgICAgICAgbGV0IG5ld2ZpbGVzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAicGljIiwgCiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2goZmlsZXJlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFmaWxlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIGZpbGVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld2ZpbGVzLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImZpbGUiLCAKICAgICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHVwZGF0ZWNvbnRlbnQobmV3cGljcywgbmV3ZmlsZXMsIHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocGljcywgZmlsZXMsIHEpewogICAgICAgIFsuLi5waWNzLCAuLi5maWxlc10ucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGEgY2xhc3M9Imxpa2UnICsgKGl0ZW0ucmVhY3RlZCA/ICcgcmVhY3RlZCcgOiAnJykgKyAnIiBkYXRhLWl0ZW0taWQ9IicgKyBpZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9yZWdleCkpewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgCiAgICAgICAgICAgIGRpdi5pZCA9IGlkCiAgICAgICAgICAgIGRpdlsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGRpdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICBkaXZbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgICAgZGl2WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICAKICAgICAgICAgICAgLy92LnByZWxvYWQgPSAibWV0YWRhdGEiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgoKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJ2aWRlbyIpCiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpWzFdCiAgICAgICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgaXRlbS51cmwgKyAnIiB0eXBlPSJ2aWRlby8nICsgZXh0ICsgJyI+PC9zb3VyY2U+JwogICAgICAgICAgICAKICAgICAgICAgICAgZGl2LmFwcGVuZCh2KQogICAgICAgICAgICBxcygiI3BpY3MiKS5wcmVwZW5kKGRpdikKICAgICAgICAgIH1lbHNleyAKICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICBhLmlkID0gaWQKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKGl0ZW0udHlwZSkKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0ucmVhY3RlZCl7CiAgICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgYVsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKGl0ZW0udHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgYS5pZCArICdcJykuc3R5bGUuZGlzcGxheT1cJ2Jsb2NrXCciIHNyYz0iJyArIGl0ZW0udXJsICsgJyIvPicKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgYS5pbm5lckhUTUwgKz0gJzxzcGFuIGNsYXNzPSJmaWxlIj4nICsgaXRlbS51cmwgKyAnPC9zcGFuPicKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChhKQogICAgICAgICAgfQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIGEiKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIC8vcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKT8ucGF1c2UoKQogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICBnaWQodlsiZGF0YS1pdGVtLWlkIl0pLmFwcGVuZENoaWxkKHYpCiAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKChyZXMpID0+IHsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoKXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkocmVsYXlzb2NrZXRzWzBdLCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIAogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpKXsKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICAgIC8vY29uc3QgdiA9IGNyZWF0ZXZpZGVvKHFzKCIjbWVkaWEtY29udGFpbmVyIiksIGl0ZW0udXJsKQogICAgICAgICAgLy92LmNvbnRyb2xzID0gdHJ1ZQogICAgICAgIH1lbHNlewogICAgICAgICAgY29uc3QgcGljID0gZ2lkKCJwaWMiKQogICAgICAgICAgcGljLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBwaWMub25sb2FkID0gKCkgPT4gKHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9CgogICAgICAgIGdpZCgicGljLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkIHx8IHJlYWN0ZWQuaW5jbHVkZXMoaWQpKXsKICAgICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
this is a backup of #nostrbot dev files created with bk.sh
echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z
shasum -a 256 bk.7z
f2ba49b2accd0a115fb5bc463f4be01a049b9cc6792a4037f2fbdfd023526bb8
18.0 kB
https://ipfs.io/ipfs/QmUJeS3pViF7eGDnMEiFTjvN91qRf1664ExvsNMoG4Ewgv
sha256
3818084d32f330531db3d37f7aa4407113abc7f055bcda79d4f3c0571054b7b3 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICAvKmN1cnNvcjogcG9pbnRlcjsqLwogICAgICB9CiAgICAgIAogICAgICAvKiNoZWFkZXIgLnNldGNvbHMsIAogICAgICAjaGVhZGVyIC5zZXRsaW1pdCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAwOwogICAgICB9Ki8KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuOGVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CiAgICAgIAogICAgICBzcGFuI2NvbnRyb2xpbmZvIHsKICAgICAgICByaWdodDogMmVtOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCk7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICB9CiAgICAgIAogICAgICAjcGljLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIAogICAgICAjcGljIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNwaWNzIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAjcGljcyA+IGEsIAogICAgICAjcGljcyBpbWcsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMjV2dzsKICAgICAgfQoKICAgICAgI3BpY3MgPiBhLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuZmlsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIGltZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyBpbWcsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEsIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGltaXQ6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSI3NSIgaHJlZj0iIyI+NzU8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIyMDAiIGhyZWY9IiMiPjIwMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjUwMCIgaHJlZj0iIyI+NTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhdXRvcGxheSIpIHx8ICJvZmYiCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImxpbWl0IikgfHwgIjc1IiwgMTApCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHJlbGF5c29ja2V0cyA9IFtdCiAgICAgIGxldCBwcmltYWxoYW5kbGVycyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCBwaWN0dXJlcyA9IFtdCiAgICAgIGxldCBmaWxlcyA9IFtdCiAgICAgIGxldCBldmVudGRiID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwfGdpZikvZ2kKICAgICAgbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvCiAgICAgIHdhaXRtcyA9IDMwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQoKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gYSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKGFzeW5jIHYgPT4gewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoIWF1dG9wbGF5KCkpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAgIAogICAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgLy9hd2FpdCBzbGVlcCgxMDAwKQogICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgcXMoIiNxdWVyeSIpLnZhbHVlCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICB9KQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICBsZXQgbmV3ZmlsZXMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCgogICAgICAgIGZvcihsZXQgcyBvZiByZWxheXNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CgogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKXsKICAgICAgICAgICAgaWYoIXBpY3R1cmVzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgcGljdHVyZXMucHVzaCh1cmwpCiAgICAgICAgICAgICAgbmV3cGljcy5wdXNoKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJwaWMiLCAKICAgICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChmaWxlcmVnZXgpIHx8IFtdKXsKICAgICAgICAgICAgaWYoIWZpbGVzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgZmlsZXMucHVzaCh1cmwpCiAgICAgICAgICAgICAgbmV3ZmlsZXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZmlsZSIsIAogICAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZGV2ZW50aWRzLmluY2x1ZGVzKGV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGV2ZW50LmlkKSksCiAgICAgICAgICAgICAgICBtZXRhOiBtZXRhCiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdXBkYXRlY29udGVudChuZXdwaWNzLCBuZXdmaWxlcywgcSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY3JlYXRldmlkZW8oY29udGFpbmVyLCB1cmwpewogICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCgogICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB2LmF1dG9wbGF5ID0gdHJ1ZQogICAgICAgIAogICAgICAgIGNvbnN0IGV4dCA9IHVybC5tYXRjaCh2aWRlb3JlZ2V4KVsxXQogICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgdXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICBjb250YWluZXIucHJlcGVuZCh2KQogICAgICAgIHJldHVybiB2CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocGljcywgZmlsZXMsIHEpewogICAgICAgIFsuLi5waWNzLCAuLi5maWxlc10ucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpKXsKICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICAKICAgICAgICAgICAgdi5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgICAgdlsiZGF0YS1waWMiXSA9IGl0ZW0KICAgICAgICAgICAgdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICB2WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICAgIHZbImRhdGEtdGV4dCJdID0gdGV4dAoKICAgICAgICAgICAgLy92LnByZWxvYWQgPSAibWV0YWRhdGEiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygicGxheSIsIGl0ZW0udXJsKQogICAgICAgICAgICB9CgogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInZpZGVvIikKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9yZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICBkaXYuYXBwZW5kKHYpCiAgICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoZGl2KQogICAgICAgICAgfWVsc2V7IAogICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIGEuaWQgPSAicGljXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZChpdGVtLnR5cGUpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGFbImRhdGEtcGljIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJzxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1waWMtaWQ9IicgKyBhLmlkICsgCiAgICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBpdGVtLnVybCArICciLz4nCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNwaWMsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKT8ucmVtb3ZlKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKChyZXMpID0+IHsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoKXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkocmVsYXlzb2NrZXRzWzBdLCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpeyAKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1waWMiXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIAogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpKXsKICAgICAgICAgIAogICAgICAgICAgY29uc3QgdiA9IGNyZWF0ZXZpZGVvKHFzKCIjbWVkaWEtY29udGFpbmVyIiksIGl0ZW0udXJsKQogICAgICAgICAgLy92LmNvbnRyb2xzID0gdHJ1ZQogICAgICAgIH1lbHNlewogICAgICAgICAgY29uc3QgcGljID0gZ2lkKCJwaWMiKQogICAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgfQoKICAgICAgICAgIGdpZCgicGljLWxpa2UiKVsiZGF0YS1waWMtaWQiXSA9IGlkCiAgICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkIHx8IHJlYWN0ZWQuaW5jbHVkZXMoaWQpKXsKICAgICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQoKICAgICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgcGljLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBwaWMub25sb2FkID0gKCkgPT4gKHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsICgpID0+IHsKICAgICAgICBmb3IobGV0IHJlbGF5IG9mIHJlbGF5cyl7CiAgICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldChyZWxheVsxXSkKCiAgICAgICAgICBpZihyZWxheVswXSA9PSAicHJpbWFsIil7CiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSBhc3luYyBlID0+IHsKICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgICAgICAgIGxldCByZWFkeSA9IHJlbGF5c29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgICAgICAgICAgICBpZihyZWFkeSA8IHJlbGF5c29ja2V0cy5sZW5ndGgpewogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGluZyB0byByZWxheXMiLCByZWFkeSwgcmVsYXlzb2NrZXRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoNTApCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgICAgICBicmVhayAgCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGVkIikKCiAgICAgICAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHByaW1hbGhhbmRsZXJzLmZvckVhY2goZiA9PiBmKG1lc3NhZ2UpKQogICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IGNvbnNvbGUubG9nKCJjbG9zZSIpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHJlbGF5c29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJlbGF5c29ja2V0c1swXS5vbm9wZW4gPSBlID0+IGNoZWNrdXBkYXRlKCkKICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas
sha256
158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjaGVhZGVyIC5zZXRjb2xzLCAKICAgICAgI2hlYWRlciAuc2V0bGltaXQgewogICAgICAgIHBhZGRpbmc6IC44ZW0gMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZyB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYS5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTVlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhIHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iY29sczYiPgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9Ijc1IiBocmVmPSIjIj43NTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjIwMCIgaHJlZj0iIyI+MjAwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5pbWFnZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICI3NSIsIDEwKQogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCByZWxheXNvY2tldHMgPSBbXQogICAgICBsZXQgcHJpbWFsaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcGljdHVyZXMgPSBbXQogICAgICBsZXQgZXZlbnRkYiA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IGltZ3JlZ2V4PS9odHRwKHxzKVw6XC9cL1teIF0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIGEuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyBhLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIHFzKCIjcXVlcnkiKS52YWx1ZQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICBjb25zb2xlLmxvZygicmV0dXJuIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0KXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGNvbnNvbGUubG9nKCJsaWtlIiwgZS50YXJnZXQpCiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVwaWNzKG5ld3BpY3MsIHEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXBpY3MocGljcywgcSl7CiAgICAgICAgcGljcy5yZXZlcnNlKCkuZm9yRWFjaChwaWMgPT4gewogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBpYy5yZWFjdGVkKXsKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgYVsiZGF0YS1waWMiXSA9IHBpYwogICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gcGljLmV2ZW50CiAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgYS5pbm5lckhUTUwgPSAnPGEgY2xhc3M9Imxpa2UnICsgKHBpYy5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtcGljLWlkPSInICsgYS5pZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIHBpYy5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT48aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBwaWMudXJsICsgJyIvPicKICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgcCA9IGdpZChpZClbImRhdGEtcGljIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAKICAgICAgICBpZihwLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKHAubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcocC5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtcGljLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IHAuZXZlbnQKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgoKICAgICAgICBpZihwLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBwLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIHBpYy5zcmMgPSBwLnVybAogICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas\n
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjaGVhZGVyIC5zZXRjb2xzLCAKICAgICAgI2hlYWRlciAuc2V0bGltaXQgewogICAgICAgIHBhZGRpbmc6IC44ZW0gMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZyB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYS5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTVlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhIHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iY29sczYiPgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9Ijc1IiBocmVmPSIjIj43NTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjIwMCIgaHJlZj0iIyI+MjAwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5pbWFnZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICI3NSIsIDEwKQogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCByZWxheXNvY2tldHMgPSBbXQogICAgICBsZXQgcHJpbWFsaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcGljdHVyZXMgPSBbXQogICAgICBsZXQgZXZlbnRkYiA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IGltZ3JlZ2V4PS9odHRwKHxzKVw6XC9cL1teIF0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIGEuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyBhLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIHFzKCIjcXVlcnkiKS52YWx1ZQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICBjb25zb2xlLmxvZygicmV0dXJuIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0KXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGNvbnNvbGUubG9nKCJsaWtlIiwgZS50YXJnZXQpCiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVwaWNzKG5ld3BpY3MsIHEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXBpY3MocGljcywgcSl7CiAgICAgICAgcGljcy5yZXZlcnNlKCkuZm9yRWFjaChwaWMgPT4gewogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBpYy5yZWFjdGVkKXsKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgYVsiZGF0YS1waWMiXSA9IHBpYwogICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gcGljLmV2ZW50CiAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgYS5pbm5lckhUTUwgPSAnPGEgY2xhc3M9Imxpa2UnICsgKHBpYy5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtcGljLWlkPSInICsgYS5pZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIHBpYy5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT48aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBwaWMudXJsICsgJyIvPicKICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgcCA9IGdpZChpZClbImRhdGEtcGljIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAKICAgICAgICBpZihwLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKHAubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcocC5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtcGljLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IHAuZXZlbnQKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgoKICAgICAgICBpZihwLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBwLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIHBpYy5zcmMgPSBwLnVybAogICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K\n
sha256
158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjaGVhZGVyIC5zZXRjb2xzLCAKICAgICAgI2hlYWRlciAuc2V0bGltaXQgewogICAgICAgIHBhZGRpbmc6IC44ZW0gMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZyB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYS5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTVlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhIHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iY29sczYiPgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9Ijc1IiBocmVmPSIjIj43NTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjIwMCIgaHJlZj0iIyI+MjAwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5pbWFnZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICI3NSIsIDEwKQogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCByZWxheXNvY2tldHMgPSBbXQogICAgICBsZXQgcHJpbWFsaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcGljdHVyZXMgPSBbXQogICAgICBsZXQgZXZlbnRkYiA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IGltZ3JlZ2V4PS9odHRwKHxzKVw6XC9cL1teIF0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIGEuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyBhLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIHFzKCIjcXVlcnkiKS52YWx1ZQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICBjb25zb2xlLmxvZygicmV0dXJuIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0KXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGNvbnNvbGUubG9nKCJsaWtlIiwgZS50YXJnZXQpCiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVwaWNzKG5ld3BpY3MsIHEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXBpY3MocGljcywgcSl7CiAgICAgICAgcGljcy5yZXZlcnNlKCkuZm9yRWFjaChwaWMgPT4gewogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBpYy5yZWFjdGVkKXsKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgYVsiZGF0YS1waWMiXSA9IHBpYwogICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gcGljLmV2ZW50CiAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgYS5pbm5lckhUTUwgPSAnPGEgY2xhc3M9Imxpa2UnICsgKHBpYy5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtcGljLWlkPSInICsgYS5pZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIHBpYy5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT48aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBwaWMudXJsICsgJyIvPicKICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgcCA9IGdpZChpZClbImRhdGEtcGljIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAKICAgICAgICBpZihwLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKHAubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcocC5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtcGljLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IHAuZXZlbnQKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgoKICAgICAgICBpZihwLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBwLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIHBpYy5zcmMgPSBwLnVybAogICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K sha256 158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAjaGVhZGVyIC5zZXRjb2xzLCAKICAgICAgI2hlYWRlciAuc2V0bGltaXQgewogICAgICAgIHBhZGRpbmc6IC44ZW0gMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2NvbnRyb2xpbmZvLAogICAgICBhIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgIH0KCiAgICAgICNxdWVyeWRpc3BsYXkgLnRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtaW4td2lkdGg6IDNlbTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC44ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaXRlbXMsIAogICAgICAjY29udHJvbGluZm8gewogICAgICAgIG1hcmdpbi10b3A6IC4zZW07CiAgICAgIH0KCiAgICAgIC5sYWJlbCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAuOGVtIC44ZW0gMDsKICAgICAgfQoKICAgICAgc3BhbiNjb250cm9saW5mbywgCiAgICAgICNwaWNzIGEgPiBhIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZyB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgIH0KCiAgICAgICNwaWNzID4gYSB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYS5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYS5hY3RpdmUgewogICAgICAgIGJvcmRlci1jb2xvcjogZ3JlZW47CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgLmhlYXJ0c3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICBhI21lbnUsIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tdG9wOiAtLjNlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICBhI21lbnUgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHBhZGRpbmc6IDAgLjNlbSAwIC41ZW07CiAgICAgICAgaGVpZ2h0OiAyLjFlbTsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQogICAgICAKICAgICAgYSNmaWx0ZXItbGlrZXMgc3ZnIHsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgICAgCiAgICAgIC5tZW51c3ZnIHsKICAgICAgICB3aWR0aDogMmVtOwogICAgICAgIGhlaWdodDogMmVtOwogICAgICB9CgogICAgICAubWVudXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTVlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudC5vcGVuIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhIHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgei1pbmRleDogMzsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogLjU7CiAgICAgIH0KCiAgICAgICNtZW51LW92ZXJsYXkub3BlbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2ZywgaW1nIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iY29sczYiPgogICAgPGRpdiBpZD0idGVtcGxhdGUiPgogICAgICA8c3ZnIGNsYXNzPSJoZWFydHN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICAgICAgICA8cGF0aCBkPSJNOS43MTksMTcuMDczbC02LjU2Mi02LjUxYy0wLjI3LTAuMjY4LTAuNTA0LTAuNTY3LTAuNjk2LTAuODg4QzEuMzg1LDcuODksMS42Nyw1LjYxMywzLjE1NSw0LjE0YzAuODY0LTAuODU2LDIuMDEyLTEuMzI5LDMuMjMzLTEuMzI5YzEuOTI0LDAsMy4xMTUsMS4xMiwzLjYxMiwxLjc1MmMwLjQ5OS0wLjYzNCwxLjY4OS0xLjc1MiwzLjYxMi0xLjc1MmMxLjIyMSwwLDIuMzY5LDAuNDcyLDMuMjMzLDEuMzI5YzEuNDg0LDEuNDczLDEuNzcxLDMuNzUsMC42OTMsNS41MzdjLTAuMTksMC4zMi0wLjQyNSwwLjYxOC0wLjY5NSwwLjg4N2wtNi41NjIsNi41MUMxMC4xMjUsMTcuMjI5LDkuODc1LDE3LjIyOSw5LjcxOSwxNy4wNzMgTTYuMzg4LDMuNjFDNS4zNzksMy42MSw0LjQzMSw0LDMuNzE3LDQuNzA3QzIuNDk1LDUuOTIsMi4yNTksNy43OTQsMy4xNDUsOS4yNjVjMC4xNTgsMC4yNjUsMC4zNTEsMC41MSwwLjU3NCwwLjczMUwxMCwxNi4yMjhsNi4yODEtNi4yMzJjMC4yMjQtMC4yMjEsMC40MTYtMC40NjYsMC41NzMtMC43MjljMC44ODctMS40NzIsMC42NTEtMy4zNDYtMC41NzEtNC41NkMxNS41Nyw0LDE0LjYyMSwzLjYxLDEzLjYxMiwzLjYxYy0xLjQzLDAtMi42MzksMC43ODYtMy4yNjgsMS44NjNjLTAuMTU0LDAuMjY0LTAuNTM2LDAuMjY0LTAuNjksMEM5LjAyOSw0LjM5Nyw3LjgyLDMuNjEsNi4zODgsMy42MSI+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgICAgPGRpdiBpZD0iY29sc2NzcyI+CiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsIAogICAgICAuY29scyR7Y29sc30gI3BpY3MgaW1nIHsKICAgICAgICB3aWR0aDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmNvbHM6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMiIgaHJlZj0iIyI+MjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI0IiBocmVmPSIjIj40PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iMTAiIGhyZWY9IiMiPjEwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5saW1pdDo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9Ijc1IiBocmVmPSIjIj43NTwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjIwMCIgaHJlZj0iIyI+MjAwPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRsaW1pdCIgZGF0YS1saW1pdD0iNTAwIiBocmVmPSIjIj41MDA8L2E+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5pbWFnZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsaW1pdCIpIHx8ICI3NSIsIDEwKQogICAgICBsZXQgcHJvdG9jb2wgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvKSA/ICJub3N0cjoiIDogIndlYitub3N0cjoiCiAgICAgIGxldCByZWxheXNvY2tldHMgPSBbXQogICAgICBsZXQgcHJpbWFsaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgcGljdHVyZXMgPSBbXQogICAgICBsZXQgZXZlbnRkYiA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IGltZ3JlZ2V4PS9odHRwKHxzKVw6XC9cL1teIF0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwKS9naQogICAgICB3YWl0bXMgPSAzMDAwCiAgICAgIHF1ZXJ5c3RyID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQogICAgICAgICAgCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxcyhxKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBxc2EocSl7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2lkKGkpewogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIHF1ZXJ5c3RyID0gcXMoIiNxdWVyeWRpc3BsYXkgLnRleHQiKS5pbm5lclRleHQgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKQogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNwaWNzIGEuYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcGljb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgcGljcyA9IHFzYSgiI3BpY3MgPiBhIikuZmlsdGVyKGUgPT4gZS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpCiAgICAgICAgcmV0dXJuIHBpY3NbcGljcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjcGljcyBhLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIHFzKCJmb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIHFzKCIjcXVlcnkiKS52YWx1ZQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICAvL2NvbnNvbGUubG9nKCJjbGljayIsIGUsIGUudGFyZ2V0LmhyZWYpCiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICBjb25zb2xlLmxvZygicmV0dXJuIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICBnaWQoZS50YXJnZXQuaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGUudGFyZ2V0LmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0KXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygibGlrZSIpKXsKICAgICAgICAgIGNvbnNvbGUubG9nKCJsaWtlIiwgZS50YXJnZXQpCiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICAKICAgICAgICBjb25zdCBldmVudGlkcyA9IGV2ZW50cy5tYXAoZSA9PiBlLmlkKQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQoKICAgICAgICBmb3IobGV0IHMgb2YgcmVsYXlzb2NrZXRzKXsKICAgICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHMsIGV2ZW50aWRzKSkpCiAgICAgICAgfQoKICAgICAgICBmb3IobGV0IGV2ZW50IG9mIGV2ZW50cyl7CiAgICAgICAgICBmb3IobGV0IHVybCBvZiBldmVudC5jb250ZW50Lm1hdGNoKGltZ3JlZ2V4KSB8fCBbXSl7CiAgICAgICAgICAgIGlmKCFwaWN0dXJlcy5pbmNsdWRlcyh1cmwpKXsKICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHBpY3R1cmVzLnB1c2godXJsKQogICAgICAgICAgICAgIG5ld3BpY3MucHVzaCh7CiAgICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICAgIG1ldGE6IG1ldGEKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGVwaWNzKG5ld3BpY3MsIHEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXBpY3MocGljcywgcSl7CiAgICAgICAgcGljcy5yZXZlcnNlKCkuZm9yRWFjaChwaWMgPT4gewogICAgICAgICAgY29uc3QgdGV4dCA9IChxIHx8ICJ2aWV3IG5vdGUiKS5zdWJzdHJpbmcoLTMwKQogICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBpYy5yZWFjdGVkKXsKICAgICAgICAgICAgYS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgYVsiZGF0YS1waWMiXSA9IHBpYwogICAgICAgICAgYVsiZGF0YS1ldmVudCJdID0gcGljLmV2ZW50CiAgICAgICAgICBhWyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIGEuaHJlZiA9ICIjIgogICAgICAgICAgYS5pbm5lckhUTUwgPSAnPGEgY2xhc3M9Imxpa2UnICsgKHBpYy5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtcGljLWlkPSInICsgYS5pZCArIAogICAgICAgICAgICAnIiBocmVmPSIjIj4nICsgcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwgKyAnPC9hPjxhIGNsYXNzPSJxdWVyeSIgaHJlZj0iJyArIHByb3RvY29sICsgCiAgICAgICAgICAgIHBpYy5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT48aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBwaWMudXJsICsgJyIvPicKICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIikuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goKHJlcykgPT4gewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZSgpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShyZWxheXNvY2tldHNbMF0sIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIG1zKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgY29uc3QgcCA9IGdpZChpZClbImRhdGEtcGljIl0KICAgICAgICBjb25zdCBtZWRpYSA9IGdpZCgibWVkaWEtY29udGFpbmVyIikKICAgICAgICBjb25zdCBwaWMgPSBnaWQoInBpYyIpCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAKICAgICAgICBpZihwLm1ldGEpewogICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKHAubWV0YS5jb250ZW50KQogICAgICAgICAgY29uc3QgbmFtZSA9IG1ldGFjb250ZW50LmRpc3BsYXlfbmFtZSB8fCBtZXRhY29udGVudC5uYW1lCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaHJlZiA9IHByb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcocC5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtcGljLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IHAuZXZlbnQKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgoKICAgICAgICBpZihwLnJlYWN0ZWQgfHwgcmVhY3RlZC5pbmNsdWRlcyhpZCkpewogICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBwLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgIHBpYy5zcmMgPSBwLnVybAogICAgICAgIHBpYy5vbmxvYWQgPSAoKSA9PiAocGljLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siKQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgKCkgPT4gewogICAgICAgIGZvcihsZXQgcmVsYXkgb2YgcmVsYXlzKXsKICAgICAgICAgIGxldCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHJlbGF5WzFdKQoKICAgICAgICAgIGlmKHJlbGF5WzBdID09ICJwcmltYWwiKXsKICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGFzeW5jIGUgPT4gewogICAgICAgICAgICAgIHdoaWxlKHRydWUpewogICAgICAgICAgICAgICAgbGV0IHJlYWR5ID0gcmVsYXlzb2NrZXRzLmZpbHRlcihyID0+IHIucmVhZHlTdGF0ZSA9PSAxKS5sZW5ndGgKICAgICAgICAgICAgICAgIGlmKHJlYWR5IDwgcmVsYXlzb2NrZXRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0aW5nIHRvIHJlbGF5cyIsIHJlYWR5LCByZWxheXNvY2tldHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcCg1MCkKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgICAgIGJyZWFrICAKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb25uZWN0ZWQiKQoKICAgICAgICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBxdWVyeShzb2NrZXQpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcHJpbWFsaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKCkgPT4gY29uc29sZS5sb2coImNsb3NlIikKICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKGYgPT4gZihtZXNzYWdlKSkKICAgICAgICAgICAgcmVsYXlzb2NrZXRzLnB1c2goc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmVsYXlzb2NrZXRzWzBdLm9ub3BlbiA9IGUgPT4gY2hlY2t1cGRhdGUoKQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K sha256 158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas sha256 158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
https://ipfs.io/ipfs/QmaLEow51upmWcjsEnufTjuboL9NSGtmXJBeXrPkEEcNas 158791b9e9f328f092eff3f9b1d7c0f1e94d7498e6330b8bf7d22843df9ff289 images.html
this is a backup of #nostrbot dev files created with bk.sh
echo "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" | base64 --decode > bk.7z && 7z x -ofiles bk.7z
shasum -a 256 bk.7z
f1292bbb419520c2d4feb4426df7aaffa038ed125740462276a9726224a185ed
17.0 kB