https://ipfs.io/ipfs/QmdGBuVwK51EMG84C5nJMbDfnUkoNEVqqiY1zy39aXcqzG

files.html, optimize queries

sha256

0ada4ce6f27a123e024261abc13c9cde0e76524d56379203c1b1fba2b4d1c5fe images.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgd2lkdGg6IDEwMHZ3OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwogICAgICB9CiAgICAgIAogICAgICAjaGVhZGVyIGEsIAogICAgICBmb3JtLCAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNoZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KICAgICAgCiAgICAgICNyZWxheXMgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC52aWRlby1jb250YWluZXIgewogICAgICAgIC8qY3Vyc29yOiBwb2ludGVyOyovCiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuOGVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE1ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNWVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICB9CgogICAgICAjbWVudS1jb250ZW50Lm9wZW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIGEgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgc3ZnLCAKICAgICAgaW1nLCAKICAgICAgLnZpZGVvIHZpZGVvIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLCAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIGltZywKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5OjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGltaXQ6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxNSIgaHJlZj0iIyI+MTU8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIzMCIgaHJlZj0iIyI+MzA8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIxMDAiIGhyZWY9IiMiPjEwMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQoKICAgICAgY29uc3QgY29sb3B0cyA9IFsyLCA0LCA2LCAxMF0KCiAgICAgIGNvbHMgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJjb2xzIiwgY29sb3B0c1sxXSksIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IHNldHRpbmcoImF1dG9wbGF5IiwgIm9mZiIpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygibGltaXQiLCAxNSksIDEwKQogICAgICAKICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGNvbHMoKSkKICAgICAgCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgdXJscyA9IFtdCiAgICAgIGxldCByZWFjdGVkID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIHR5cGVzWyJhbGwiXSA9IFsuLi50eXBlcy5pbWFnZSwgLi4udHlwZXMudmlkZW9dCiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIHdhaXRtcyA9IDUwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnlzdHIgPSAiIgogICAgICBsYXN0cXVlcnl0eXBlID0gIiIKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKCiAgICAgIGZ1bmN0aW9uIGZyb21IZXhTdHJpbmcoc3RyKXsKICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCAvIDIpCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNikKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJ1ZmZlcgogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJyZWxheXMiKSkgfHwgWwogICAgICAgICAgIndzczovL25vcy5sb2wiLAogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KCl7CiAgICAgICAgbGV0IGVuYWJsZWR2aWRlb3MgPSAwCiAgICAgICAgbGV0IHRvdGFsdmlkZW9zID0gMAogICAgICAgIGxldCByZWFkeXZpZGVvcyA9IDAKICAgICAgICAKICAgICAgICBxc2EoIiNwaWNzIHZpZGVvIikuZm9yRWFjaChhc3luYyB2ID0+IHsKICAgICAgICAgIHRvdGFsdmlkZW9zKysKICAgICAgICAgIAogICAgICAgICAgaWYodi5yZWFkeVN0YXRlID09IDQpewogICAgICAgICAgICByZWFkeXZpZGVvcysrCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgICAgaWYoYXBsYXkgIT0gIm9uIil7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgICAKICAgICAgICAgIGlmKChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA8IHNjcm9sbFkgCiAgICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICAgIGlmKHYucmVhZHlTdGF0ZSA9PSA0KXsKICAgICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICBlbmFibGVkdmlkZW9zKysKICAgICAgICAgICAgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZigoYXBsYXkgPT0gIm9uIiB8fCBhcGxheSA9PSAiaG92ZXIiKSAmJiB2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgICAgdi5wbGF5KCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgbGV0IHRvdWNoID0gbnVsbAogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGUgPT4gewogICAgICAgIHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXQogICAgICB9KQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCBlID0+IHsKICAgICAgICBjb25zdCB4ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCAtIHRvdWNoLnNjcmVlblgKICAgICAgICBjb25zdCB5ZGlmZiA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWSAtIHRvdWNoLnNjcmVlblkKICAgICAgICAKICAgICAgICBpZih4ZGlmZiA8IC01MCl7CiAgICAgICAgICBuZXh0KCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPiA1MCl7CiAgICAgICAgICBwcmV2KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3F1ZXJ5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KHFzKCIjcXVlcnkiKS52YWx1ZSArICIvIiArIHF1ZXJ5dHlwZSgpKQogICAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgICBxdWVyeXdhaXQucmVzb2x2ZSgpCiAgICAgIH0pCgogICAgICBxcygiI3JlbGF5cy1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbGV0IHIgPSBKU09OLnN0cmluZ2lmeShxcygiI3JlbGF5cyIpLnZhbHVlLnNwbGl0KCJcbiIpKQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJyZWxheXMiLCByKQogICAgICAgIGRpc2Nvbm5lY3QoKQogICAgICAgIGNvbm5lY3QoKQogICAgICB9KQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2V0bGltaXQiKSl7CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibGltaXQiLCBlLnRhcmdldC5kYXRhc2V0LmxpbWl0KQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRsaW1pdCIsICJsaW1pdCIsIGxpbWl0KCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikpewogICAgICAgICAgbGlrZShlLnRhcmdldCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrZXkgPSBhd2FpdCBub3N0ci5nZXRQdWJsaWNLZXkoKQogICAgICAgIGNvbnN0IGxpa2UgPSBhd2FpdCBub3N0ci5zaWduRXZlbnQoewogICAgICAgICAgImtpbmQiOiA3LAogICAgICAgICAgImNvbnRlbnQiOiAiKyIsCiAgICAgICAgICAidGFncyI6IFsKICAgICAgICAgICAgWyJlIiwgZXZlbnQuaWRdLAogICAgICAgICAgICBbInAiLCBldmVudC5wdWJrZXldCiAgICAgICAgICBdLAogICAgICAgICAgInB1YmtleSI6IHB1YmtleSwKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChKU09OLnN0cmluZ2lmeShbIkVWRU5UIiwgbGlrZV0pKSkKCiAgICAgICAgbGluay5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKCiAgICAgICAgY29uc3QgcGljaWQgPSBsaW5rWyJkYXRhLWl0ZW0taWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICB9CiAgICAKICAgICAgZnVuY3Rpb24gcHJldigpewogICAgICAgIGlmKHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG5leHQoKXsKICAgICAgICBpZihwaWNvZmZzZXQoMSkpewogICAgICAgICAgcGljb2Zmc2V0KDEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVzaG93KCl7CiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZSA9PiB7CiAgICAgICAgaWYoWyJUYWIiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dVcCIsICJBcnJvd0Rvd24iXS5pbmNsdWRlcyhlLmtleSkpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiRXNjYXBlIil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiRW50ZXIiICYmIGUudGFyZ2V0LnRhZ05hbWUgPT0gIkJPRFkiKXsKICAgICAgICAgIGlmKHFzKCIjbWVkaWEtY29udGFpbmVyIikuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKXsKICAgICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNob3coYWN0aXZlKCkuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1VwIiAmJiBwaWNvZmZzZXQoLWNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgcGljb2Zmc2V0KGNvbHMoKSkpewogICAgICAgICAgcGljb2Zmc2V0KGNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiKXsKICAgICAgICAgIHByZXYoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93UmlnaHQiKXsKICAgICAgICAgIG5leHQoKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5KHNvY2tldCl7CiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAKICAgICAgICBsZXQgdCA9IERhdGUubm93KCkKICAgICAgICBsZXQgcSA9IHF1ZXJ5c3RyLnRyaW0oKQogICAgICAgIGxldCB0eXBlID0gcXVlcnl0eXBlKCkKICAgICAgICBsZXQgbCA9IGxpbWl0KCkKICAgICAgICBsZXQgaSA9ICsraWRjb3VudGVyCiAgICAgICAgbGV0IHFpZCA9ICJxdWVyeV8iICsgaQogICAgICAgIGxldCBmaWx0ZXJzID0gW10KICAgICAgICAKICAgICAgICBpZih0eXBlICE9ICJhbGwiKXsKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi50eXBlc1t0eXBlXS5tYXAoKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBraW5kczogWzFdLCAKICAgICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgICAgbGltaXQ6IGwKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3Qgc2VhcmNob2JqID0gWyJSRVEiLCBxaWQsIC4uLmZpbHRlcnNdCiAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKCiAgICAgICAgc29ja2V0LnNlbmQoc2VhcmNoanNvbikKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlKQogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gdCkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFs3XSwgZXZlbnRpZHMsIFtteXB1YmtleV0pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siI2UiXSA9IGV2ZW50aWRzCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGF1dGhvcnMpewogICAgICAgICAgZmlsdGVyc1siYXV0aG9ycyJdID0gYXV0aG9ycwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICBmaWx0ZXJzCiAgICAgICAgXSkKICAgICAgICAKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpIHx8IFtdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5cHVia2V5KHNvY2tldCwgcHVia2V5KXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHVia2V5KSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzYXZlcmVzdWx0cyhldmVudCwgcmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcyl7CiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2gocmVnZXgpIHx8IFtdKXsKICAgICAgICAgIGlmKCF1cmxzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKHVybCkKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkZXZlbnRpZHMuaW5jbHVkZXMoZXZlbnQuaWQpLCAKICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICBiZWNoMzJpZDogYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcoZXZlbnQuaWQpKSwKICAgICAgICAgICAgICBtZXRhOiBtZXRhCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiByZXN1bHRzCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudGRiLCBxLCBxdHlwZSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGlmKG8ua2luZCA9PSAxKXsKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKG8ucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChvLnB1YmtleSkKICAgICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgfSkKCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG1ldGFldmVudHMgPSBbXQogICAgICAgIGxldCByZWFjdGVkZXZlbnRpZHMgPSBbXQogICAgICAgIAogICAgICAgIG1ldGFldmVudHMucHVzaCguLi4oYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMF0sIG51bGwsIGV2ZW50cHVia2V5cykpKQogICAgICAgIHJlYWN0ZWRldmVudGlkcy5wdXNoKC4uLihhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpKSkKCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWRldmVudGlkcykpCiAgICAgICAgICB9CgogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgdmlkZW9yZWdleCwgbWV0YWV2ZW50cywgcmVhY3RlZGV2ZW50aWRzKSkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgInBpYyIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgdHlwZSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJ2aWRlby1jb250YWluZXIiKQogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgICAgdlsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgICAgICB2LnByZWxvYWQgPSAibm9uZSIKICAgICAgICAgICAgdi5sb29wID0gdHJ1ZQogICAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgICB2LnBsYXlzaW5saW5lID0gIiIKICAgICAgICAgICAgLy9yb290LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgICAgfQogICAgICAKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICByb290LmFwcGVuZCh2KQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikKICAgICAgICAgICAgcm9vdC5ocmVmID0gIiMiCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGlkICsgJ1wnKS5zdHlsZS5kaXNwbGF5PVwnYmxvY2tcJyIgc3JjPSInICsgaXRlbS51cmwgKyAnIi8+JwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICByb290LmlubmVySFRNTCArPSAnPHNwYW4gY2xhc3M9ImZpbGUiPicgKyBpdGVtLnVybCArICc8L3NwYW4+JwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHJvb3QuaWQgPSBpZAogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNwaWNzIikucHJlcGVuZChyb290KQogICAgICAgIH0pCgogICAgICAgIGlmKGFjdGl2ZSgpID09IG51bGwpewogICAgICAgICAgcXMoIiNwaWNzIC5pdGVtIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5KXsKICAgICAgICBsZXQgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLmhhbmRsZSA9IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICAgIGxldCBvID0gSlNPTi5wYXJzZShyZXMuZGF0YSkKICAgICAgICAgICAgaWYob1sxXSA9PSBrZXkpewogICAgICAgICAgICAgIGlmKG9bMF0gPT0gIkVPU0UiKXsKICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnRzKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChuZXcgcmVzaGFuZGxlcihyZXNvbHZlLCByZWplY3QpKQogICAgICAgIH0pCiAgICAgIH0KICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjaGVja3VwZGF0ZShzb2NrZXQpewogICAgICAgIGNvbnN0IHVwZGF0ZXNyZXMgPSBhd2FpdCBxdWVyeXB1YmtleShzb2NrZXQsIHVwZGF0ZXNwdWJrZXkpCiAgICAgICAgY29uc3QgdXBkYXRlbm90ZSA9IHVwZGF0ZXNyZXMuZmluZChuID0+IG4uY29udGVudC5tYXRjaCgvXmh0dHBzXDpcL1wvLykpCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIAogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGNvbnN0IHYgPSBnaWQoaWQpLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIHFzKCIjbWVkaWEtY29udGFpbmVyIikuYXBwZW5kQ2hpbGQodikKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGNvbnN0IHBpYyA9IGdpZCgicGljIikKICAgICAgICAgIHBpYy5zcmMgPSBpdGVtLnVybAogICAgICAgICAgcGljLm9ubG9hZCA9ICgpID0+IChwaWMuc3R5bGUuZGlzcGxheSA9ICJibG9jayIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGl0ZW0ubWV0YSl7CiAgICAgICAgICBjb25zdCBtZXRhY29udGVudCA9IEpTT04ucGFyc2UoaXRlbS5tZXRhLmNvbnRlbnQpCiAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5ocmVmID0gcHJvdG9jb2wgKyBiZWNoMzIuZW5jb2RlKCJucHViIiwgZnJvbUhleFN0cmluZyhpdGVtLm1ldGEucHVia2V5KSkKICAgICAgICAgIHFzKCIjcGljLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfQoKICAgICAgICBnaWQoInBpYy1saWtlIilbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgIGlmKGl0ZW0ucmVhY3RlZCB8fCByZWFjdGVkLmluY2x1ZGVzKGlkKSl7CiAgICAgICAgICBnaWQoInBpYy1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI3BpYy1xdWVyeSIpCiAgICAgICAgYS5ocmVmID0gcHJvdG9jb2wgKyBpdGVtLmJlY2gzMmlkCiAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmNvdW50KCl7CiAgICAgICAgcmV0dXJuIHNvY2tldHMuZmlsdGVyKHIgPT4gci5yZWFkeVN0YXRlID09IDEpLmxlbmd0aAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBkaXNjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCBzb2NrZXQgb2Ygc29ja2V0cyl7CiAgICAgICAgICBzb2NrZXQuY2xvc2UoKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXRzLnNwbGljZSgwKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KCl7CiAgICAgICAgZm9yKGxldCByZWxheSBvZiByZWxheXMoKSl7CiAgICAgICAgICBpZihyZWxheS5yZWFkeVN0YXRlID09IDEpewogICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldChyZWxheSkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gbWVzc2FnZSA9PiByZXNoYW5kbGVycy5mb3JFYWNoKHJoID0+IHJoLmhhbmRsZShtZXNzYWdlKSkKICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY29uc29sZS5sb2coImRpc2Nvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgIH0KICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSBhc3luYyBmdW5jdGlvbihlKXsKICAgICAgICAgICAgY29uc29sZS5sb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBjb25uZWN0KCkKICAgICAgICAKICAgICAgICBhd2FpdCBzbGVlcCgxMDApLnByb21pc2UKICAgICAgICAKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K

Reply to this note

Please Login to reply.

Discussion

No replies yet.