https://ipfs.io/ipfs/QmePrZ26tpriwdt9RnFjRa79LaewwLCpG3QZkMExky7ufc

files.html, fix add like

sha256

d489b50d426f3dd9f81ee7cb50daa45c73984de3425d3148a5ee99020f12e54d files.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgd2lkdGg6IDEwMHZ3OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5IHsKICAgICAgICB3aWR0aDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9hZGluZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgbGVmdDogMjdlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAudHlwZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXksIAogICAgICAjY29udHJvbGluZm8sCiAgICAgIGEsCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSwKICAgICAgI3BpY3MgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgCiAgICAgIHNwYW4jY29udHJvbGluZm8gewogICAgICAgIHJpZ2h0OiAyZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMgewogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI3BpY3MgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gYSwgCiAgICAgICNwaWNzIGltZywKICAgICAgI3BpY3MgLmZpbGUsCiAgICAgICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAyNXZ3OwogICAgICB9CgogICAgICAjcGljcyA+IGEsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDI1dnc7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBib3JkZXI6IDAuM2VtIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAuM2VtOwogICAgICAgIG1hcmdpbjogLTAuM2VtOwogICAgICB9CgogICAgICAjcGljcyA+IC5maWxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IC5pdGVtOm5vdCgucmVhY3RlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwIDF2dzsKICAgICAgfQogICAgICAKICAgICAgLnF1ZXJ5LCAKICAgICAgLmxpa2UsIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnkgewogICAgICAgIHBhZGRpbmc6IC42ZW0gLjRlbSAuMWVtIC40ZW07CiAgICAgICAgbWF4LXdpZHRoOiA1ZW07CiAgICAgIH0KICAgICAgCiAgICAgIC5saWtlLnJlYWN0ZWQsCiAgICAgIC5maWx0ZXItbGlrZXMgI2ZpbHRlci1saWtlcyB7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICB9CgogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGZvbnQtc2l6ZTogM2VtOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5LAogICAgICAjcGljLXVzZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAjcGljLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI3BpY3MgaW1nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIC5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWNzID4gLmFjdGl2ZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiBncmVlbjsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAuaGVhcnRzdmcgcGF0aCB7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICB9CiAgCiAgICAgIGEjbWVudSwgYSNmaWx0ZXItbGlrZXMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi10b3A6IC0uM2VtOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIGEjbWVudSB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgcGFkZGluZzogMCAuM2VtIDAgLjVlbTsKICAgICAgICBoZWlnaHQ6IDIuMWVtOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgcGFkZGluZzogLjJlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgICAgbWFyZ2luOiAuMWVtIC41ZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIAogICAgICBhI2ZpbHRlci1saWtlcyBzdmcgewogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICB9CiAgICAgICAKICAgICAgLm1lbnVzdmcgewogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgaGVpZ2h0OiAyZW07CiAgICAgIH0KCiAgICAgIC5tZW51c3ZnIHBhdGggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xOGVtOwogICAgICAgIGJhY2tncm91bmQ6ICMyMjI7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHotaW5kZXg6IDM7IAogICAgICAgIG92ZXJmbG93OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbSAxZW0gMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLAogICAgICBpbnB1dC5zdWJtaXQgewogICAgICAgIHBhZGRpbmc6IC41ZW0gLjdlbTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAzOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBvcGFjaXR5OiAuNTsKICAgICAgfQoKICAgICAgI21lbnUtb3ZlcmxheS5vcGVuIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAKICAgICAgc3ZnLCAKICAgICAgaW1nLCAKICAgICAgLnZpZGVvIHZpZGVvIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxkaXYgaWQ9ImNvbHNjc3MiPgogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiBhLCAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIGltZywKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQoKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gLmZpbGUsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC52aWRlby1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDB2dyAvICR7Y29sc30pOwogICAgICB9CiAgICAgIAogICAgICAuY29scyR7Y29sc30gLnF1ZXJ5LAogICAgICAuY29scyR7Y29sc30gLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogbWluKDE0dncgKiAoMSAvICR7Y29sc30pLCA2ZW0gKiAoMSAvICR7Y29sc30pKQogICAgICB9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0icGljLWxpa2UiIGNsYXNzPSJsaWtlIiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtcXVlcnkiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9InBpYy11c2VyIiBocmVmPSIjIj48L2E+CiAgICA8L2Rpdj4KICAgIDxjZW50ZXIgaWQ9Im1lZGlhLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InBpYy1jb250YWluZXIiPgogICAgICAgIDxpbWcgaWQ9InBpYyIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ibWVudS1vdmVybGF5Ij48L2Rpdj4KICAgIDxkaXYgaWQ9Im1lbnUtY29udGVudCIgY2xhc3M9InRlc3QiPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmF1dG9wbGF5OjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib24iIGhyZWY9IiMiPm9uPC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRhdXRvcGxheSIgZGF0YS1hdXRvcGxheT0ib2ZmIiBocmVmPSIjIj5vZmY8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM6PC9kaXY+CiAgICAgICAgPGRpdiBpZD0iY29ubmNvdW50Ij4wPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnJlbGF5czo8L2Rpdj4KICAgICAgICA8cD5QbGVhc2UgdXNlIHJlbGF5cyB3aXRoIE5JUC01MCAoc2VhcmNoKSBmdW5jdGlvbmFsaXR5PC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InJlbGF5cy1mb3JtIj4KICAgICAgICAgIDx0ZXh0YXJlYSBpZD0icmVsYXlzIj48L3RleHRhcmVhPgogICAgICAgICAgPGlucHV0IGNsYXNzPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9InNhdmUgcmVsYXlzIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5wcml2YXRlIGtleTo8L2Rpdj4KICAgICAgICA8cD5JZiB5b3UgY2FudCB1c2UgYnJvd3NlciBhZGRvbiAobW9iaWxlKTwvcD4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiIGlkPSJwcml2a2V5LWZvcm0iPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2a2V5Ii8+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSBrZXkiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxvZ3M6PC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibG9ncyI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPmxhdGVzdCByZWxlYXNlOjwvZGl2PgogICAgICAgIDxhIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0iY29udHJvbGluZm8iPmNvbnRyb2xzOiBhcnJvd3MsIGVudGVyLCBlc2M8L3NwYW4+CiAgICAgIDxhIGlkPSJmaWx0ZXItbGlrZXMiIGhyZWY9IiMiPjwvYT4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGlkPSJtZW51IiBocmVmPSIjIj4KICAgICAgICAgIDxzdmcgY2xhc3M9Im1lbnVzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJICAgICAgICA8cGF0aCBkPSJNMTAsMS40NDVjLTQuNzI2LDAtOC41NTUsMy44MjktOC41NTUsOC41NTVjMCw0LjcyNSwzLjgyOSw4LjU1NSw4LjU1NSw4LjU1NWM0LjcyNSwwLDguNTU1LTMuODMsOC41NTUtOC41NTVDMTguNTU1LDUuMjc0LDE0LjcyNSwxLjQ0NSwxMCwxLjQ0NSBNMTAsMTcuNjU0Yy00LjIyMSwwLTcuNjU0LTMuNDM0LTcuNjU0LTcuNjU0YzAtNC4yMjEsMy40MzMtNy42NTQsNy42NTQtNy42NTRjNC4yMjIsMCw3LjY1NCwzLjQzMyw3LjY1NCw3LjY1NEMxNy42NTQsMTQuMjIxLDE0LjIyMiwxNy42NTQsMTAsMTcuNjU0IE0xNC4zOSwxMGMwLDAuMjQ4LTAuMjAzLDAuNDUtMC40NSwwLjQ1SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMy0wLjQ1LTAuNDVzMC4yMDMtMC40NSwwLjQ1LTAuNDVoNy44NzlDMTQuMTg3LDkuNTUsMTQuMzksOS43NTIsMTQuMzksMTAgTTE0LjM5LDEyLjcwMmMwLDAuMjQ3LTAuMjAzLDAuNDQ5LTAuNDUsMC40NDlINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAyLTAuNDUtMC40NDljMC0wLjI0OCwwLjIwMy0wLjQ1MSwwLjQ1LTAuNDUxaDcuODc5QzE0LjE4NywxMi4yNTEsMTQuMzksMTIuNDU0LDE0LjM5LDEyLjcwMiBNMTQuMzksNy4yOThjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw2Ljg0OCwxNC4zOSw3LjA1MSwxNC4zOSw3LjI5OCI+PC9wYXRoPgoJICAgICAgICA8L3N2Zz4KICAgICAgICA8L2E+CiAgICAgICAgPGEgaWQ9InRpdGxlIiBocmVmPSIjIj5maWxlcy5odG1sPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9InBpY3MiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7CiAgICAgICAgImdsb2JhbCI6ICdbIlJFUSIsIjxJPiIseyJjYWNoZSI6WyJleHBsb3JlIix7InRpbWVmcmFtZSI6ImxhdGVzdCIsInNjb3BlIjoiZ2xvYmFsIiwibGltaXQiOjxMPn1dfV0nLCAKICAgICAgICAiYXV0aG9yIjogJ1siUkVRIiwiPEk+Iix7ImtpbmRzIjpbMV0sImF1dGhvcnMiOlsiPFA+Il19XScsCiAgICAgICAgInJlYWN0aW9ucyI6ICdbIlJFUSIsIjxJPiIsIHsia2luZHMiOls3XSwiI2UiOiA8RT59XScKICAgICAgfQogICAgICBxcygiI3JlbGF5cyIpLnZhbHVlID0gcmVsYXlzKCkuam9pbigiXG4iKQogICAgICBxcygiI3ByaXZrZXkiKS52YWx1ZSA9IHByaXZrZXkoKQogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQoKICAgICAgY29scyA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImNvbHMiLCBjb2xvcHRzWzFdKSwgMTApCiAgICAgIGF1dG9wbGF5ID0gKCkgPT4gc2V0dGluZygiYXV0b3BsYXkiLCAib2ZmIikKICAgICAgbGltaXQgPSAoKSA9PiBwYXJzZUludChzZXR0aW5nKCJsaW1pdCIsIDE1KSwgMTApCgogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQogICAgICAKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgcXVlcnl3YWl0ID0gbnVsbAogICAgICBsZXQgcHJpbWFsc29ja2V0ID0gbnVsbAogICAgICBsZXQgdHlwZXMgPSB7CiAgICAgICAgaW1hZ2U6IFsicG5nIiwgImpwZyIsICJqcGVnIiwgIndlYnAiXSwKICAgICAgICB2aWRlbzogWyJtcDQiLCAid2VibSJdCiAgICAgIH0KICAgICAgbGV0IGltZ3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihwbmd8anBnfGpwZWd8d2VicCkvZ2kKICAgICAgbGV0IHZpZGVvcmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKG1wNHx3ZWJtKS9naQogICAgICBsZXQgdmlkZW9leHRyZWdleCA9IC9cLihtcDR8d2VibSkkL2kKICAgICAgd2FpdG1zID0gNTAwMAogICAgICBxdWVyeXN0ciA9ICIiCiAgICAgIGxhc3RxdWVyeXN0ciA9ICIiCiAgICAgIGxhc3RxdWVyeXR5cGUgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNwaWMtbGlrZSIpLmlubmVySFRNTCA9IHFzKCIjZmlsdGVyLWxpa2VzIikuaW5uZXJIVE1MID0gcXMoIiN0ZW1wbGF0ZSAuaGVhcnRzdmciKS5vdXRlckhUTUwKICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQoKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gcmVsYXlzKCl7CiAgICAgICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicmVsYXlzIikpCiAgICAgICAgY29uc3QgciA9IG9iaiAmJiBvYmouZmlsdGVyKHIgPT4gci5tYXRjaCgvd3NzOlwvXC8uKy8pKSB8fCBbXQogICAgICAgIAogICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgJiYgciB8fCBbCiAgICAgICAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCiAgICAgICAgICAid3NzOi8vbmIucmVsYXkuY2VudGVyIiwgCiAgICAgICAgICAid3NzOi8vbm9zdHIuY29tcGlsZS1lcnJvci5uZXQiCiAgICAgICAgXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcml2a2V5KCl7CiAgICAgICAgbGV0IGtleSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJwcml2a2V5IikgfHwgIiIKICAgICAgICAKICAgICAgICBpZihrZXkubGVuZ3RoID09IDYzKXsKICAgICAgICAgIGtleSA9IE5vc3RyVG9vbHMubmlwMTkuZGVjb2RlKGtleSkuZGF0YQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4ga2V5Lmxlbmd0aCA9PSA2NCAmJiBrZXkgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzZXR0aW5nKGtleSwgZGVmYXVsdHZhbHVlKXsKICAgICAgICBjb25zdCB2ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KQogICAgICAgIHJldHVybiB2ICYmIG9wdGlvbigic2V0IiArIGtleSwga2V5LCB2KSAmJiB2IHx8IGRlZmF1bHR2YWx1ZQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBvcHRpb24oYywga2V5LCB2YWwpewogICAgICAgIHJldHVybiBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXMocSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXNhKHEpewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocSkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdpZChpKXsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcXVlcnl0eXBlKCl7CiAgICAgICAgcmV0dXJuIHFzKCIjcXVlcnktdHlwZSIpLnZhbHVlIHx8ICJhbGwiCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgbGV0IHBhcnRzID0gZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKS5zcGxpdCgiLyIpCiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gcGFydHNbMF0KICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9IHBhcnRzWzFdIHx8ICJhbGwiCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gLml0ZW0iKS5maWx0ZXIoZSA9PiBlLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIikKICAgICAgICByZXR1cm4gcGljc1twaWNzLmluZGV4T2YoYWN0aXZlKCkpK29mZnNldF0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGFzdGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxc2EoIiNwaWNzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjbWVudS1vdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpKQogICAgICB9CiAgCiAgICAgIGZ1bmN0aW9uIHNldGFjdGl2ZShjLCBrZXksIHZhbCl7CiAgICAgICAgcXNhKCIuIiArIGMpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpKQogICAgICAgIGNvbnN0IG9wdGlvbiA9IHFzKCIuIiArIGMgKyAiW2RhdGEtIiArIGtleSArICI9JyIgKyB2YWwgKyAiJ10iKQogICAgICAgIG9wdGlvbj8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjcGljcyB2aWRlbyIpLmZvckVhY2goYXN5bmMgdiA9PiB1cGRhdGV2aWRlb3BsYXkodikpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSh2KXsKICAgICAgICBjb25zdCBhcGxheSA9IGF1dG9wbGF5KCkKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBuID0gdi5wYXJlbnRFbGVtZW50CiAgICAgICAgCiAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICB8fCBuLm9mZnNldFRvcCA+IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0KSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCAoKSA9PiB1cGRhdGVhbGx2aWRlb3BsYXkoKSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHsKICAgICAgICB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCiAgICAgICAgY29uc3QgeWRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblkgLSB0b3VjaC5zY3JlZW5ZCiAgICAgICAgCiAgICAgICAgaWYoeGRpZmYgPCAtNTApewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgcHJldigpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgbG9jYXRpb24uaGFzaCA9ICIjIiArIGVuY29kZVVSSUNvbXBvbmVudChxcygiI3F1ZXJ5IikudmFsdWUgKyAiLyIgKyBxdWVyeXR5cGUoKSkKICAgICAgICB1cGRhdGVxdWVyeSgpCiAgICAgICAgcXVlcnl3YWl0LnJlc29sdmUoKQogICAgICB9KQoKICAgICAgcXMoIiNyZWxheXMtZm9ybSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsIGFzeW5jIGUgPT4gewogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGxldCByID0gSlNPTi5zdHJpbmdpZnkocXMoIiNyZWxheXMiKS52YWx1ZS5zcGxpdCgiXG4iKSkKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicmVsYXlzIiwgcikKICAgICAgICBkaXNjb25uZWN0KCkKICAgICAgfSkKCiAgICAgIHFzKCIjcHJpdmtleS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgYXN5bmMgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgY29uc3Qga2V5ID0gcXMoIiNwcml2a2V5IikudmFsdWUKCiAgICAgICAgaWYoa2V5Lmxlbmd0aCAhPSA2NCAmJiBrZXkubGVuZ3RoICE9IDYzKXsKICAgICAgICAgIGFsZXJ0KCJrZXkgc2hvdWxkIGJlIDYzIG9yIDY0IGNoYXJhY3RlcnMgbG9uZyIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInByaXZrZXkiLCBrZXkpCiAgICAgICAgYWxlcnQoImtleSBzYXZlZCIpCiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIGhvdmVyZWR2aWRlbyA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAgIGhvdmVyZWR2aWRlby5wbGF5KCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaG92ZXJlZHZpZGVvID0gZmFsc2UKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgIT0gImJsb2NrIiAmJiBhdXRvcGxheSgpID09ICJob3ZlciIgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ2aWRlby1jb250YWluZXIiKSl7CiAgICAgICAgICBxc2EoInZpZGVvIikuZm9yRWFjaCh2ID0+IHYucGF1c2UoKSkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoZS50YXJnZXQudHlwZSA9PSAic3VibWl0IiB8fCAoZS50YXJnZXQudGFnTmFtZSA9PSAiQSIgJiYgZS50YXJnZXQuaHJlZi5tYXRjaCgvXih8d2ViXCspbm9zdHJcOi8pKSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAidGl0bGUiKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGdpZChlLnRhcmdldC5pZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIHNob3coZS50YXJnZXQuaWQpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQudGFnTmFtZSAhPSAiQSIgJiYgKHFzKCIjcGljLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikgPT0gZS50YXJnZXQpKXsKICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJtZW51IiB8fCBlLnRhcmdldC5pZCA9PSAibWVudS1vdmVybGF5Iil7CiAgICAgICAgICBtZW51KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRjb2xzIikpewogICAgICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImNvbHMiICsgYykKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJjb2xzIiArIGUudGFyZ2V0LmRhdGFzZXQuY29scykKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjb2xzIiwgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgc2V0YWN0aXZlKCJzZXRjb2xzIiwgImNvbHMiLCBjb2xzKCkpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRhdXRvcGxheSIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJhdXRvcGxheSIsIGUudGFyZ2V0LmRhdGFzZXQuYXV0b3BsYXkpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGF1dG9wbGF5IiwgImF1dG9wbGF5IiwgYXV0b3BsYXkoKSkKICAgICAgICAgIHVwZGF0ZWFsbHZpZGVvcGxheSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJsaWtlIikpewogICAgICAgICAgbGlrZShlLnRhcmdldCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBoYXNrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyIHx8IHByaXZrZXkoKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJrZXkoKXsKICAgICAgICByZXR1cm4gd2luZG93Lm5vc3RyICYmIGF3YWl0IHdpbmRvdy5ub3N0ci5nZXRQdWJsaWNLZXkoKSB8fCBOb3N0clRvb2xzLmdldFB1YmxpY0tleShwcml2a2V5KCkpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBldmVudC5zaWcgPSBOb3N0clRvb2xzLmdldFNpZ25hdHVyZShldmVudCwgcHJpdmtleSgpKQogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBsaWtlKGxpbmspewogICAgICAgIGNvbnN0IGV2ZW50ID0gbGluay5wYXJlbnRFbGVtZW50WyJkYXRhLWV2ZW50Il0KICAgICAgICBjb25zdCBwdWJrID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBjb25zdCBsaWtlID0gYXdhaXQgc2lnbih7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHViaywKICAgICAgICAgICJjcmVhdGVkX2F0IjogcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAgLCAxMCkKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGNvbnN0IGxpa2Vqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKQogICAgICAgIHNvY2tldHMuZm9yRWFjaChzID0+IHMuc2VuZChsaWtlanNvbikpCiAgICAgICAgY29uc29sZS5sb2coInNlbnQgbGlrZSIsIGxpa2Vqc29uKSAKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBwaWNpZCA9IGxpbmtbImRhdGEtaXRlbS1pZCJdIHx8IGxpbmsuZGF0YXNldC5waWNJZAogICAgICAgIAogICAgICAgIGlmKHBpY2lkKXsKICAgICAgICAgIGdpZChwaWNpZCkucXVlcnlTZWxlY3RvcigiLmxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIHJlYWN0ZWQucHVzaChwaWNpZCkKICAgICAgICB9CiAgICAgIH0KICAgIAogICAgICBmdW5jdGlvbiBwcmV2KCl7CiAgICAgICAgaWYocGljb2Zmc2V0KC0xKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLTEpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gbmV4dCgpewogICAgICAgIGlmKHBpY29mZnNldCgxKSl7CiAgICAgICAgICBwaWNvZmZzZXQoMSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICBoaWRldmlkZW8oKQogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBlID0+IHsKICAgICAgICBpZihbIlRhYiIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCIsICJBcnJvd1VwIiwgIkFycm93RG93biJdLmluY2x1ZGVzKGUua2V5KSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJFc2NhcGUiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUua2V5ID09ICJFbnRlciIgJiYgZS50YXJnZXQudGFnTmFtZSA9PSAiQk9EWSIpewogICAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIHBpY29mZnNldCgtY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoLWNvbHMoKSkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICAgIGxhc3RhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93TGVmdCIpewogICAgICAgICAgcHJldigpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIpewogICAgICAgICAgbmV4dCgpCiAgICAgICAgfQogICAgICB9KQoKICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKXsKICAgICAgICBzYXZlKHNvY2tldCwgcmVzLCBxLCB0eXBlLCBmYWxzZSwgZmFsc2UpCiAgICAgICAgbG9nKCJxdWVyeSByZXMiLCByZXMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQtLQoKICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgd2FpdCA9IHdhaXRtcyAtIChEYXRlLm5vdygpIC0gc3RpbWUpCiAgICAgICAgcXVlcnl3YWl0ID0gc2xlZXAod2FpdCkKICAgICAgICBhd2FpdCBxdWVyeXdhaXQucHJvbWlzZQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwcmltYWxnbG9iYWwoc29ja2V0KXsKICAgICAgICBsb2coImdsb2JhbCIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IGF3YWl0IHdhaXRyZXMocWlkbGlrZXMpCiAgICAgICAgICBuZXdsaWtlcy5zcGxpY2UoMCkKICAgICAgICAgIAogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGxpa2VfZXZlbnRzLCAiIiwgImFsbCIsIHRydWUsIHRydWUpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogMjAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHFpZCkKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMuZmlsdGVyKGUgPT4gZS5raW5kID09IDEpLCBzb2NrZXQsICIiLCAiYWxsIiwgc3RpbWUpCiAgICAgICAgcHJpbWFsZ2xvYmFsKHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnkoc29ja2V0LCBwcmltYWwpewogICAgICAgIGxvZygicXVlcnkiLCBzb2NrZXQudXJsKQogICAgICAgIHF1ZXJ5Y291bnQrKwogICAgICAgIHFzKCIjbG9hZGluZyIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICBmaWx0ZXJzLnB1c2goLi4uKHR5cGVzW3R5cGVdIHx8IFtdKS5tYXAoKHQpID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICBzZWFyY2g6ICIuIiArIHQsCiAgICAgICAgICAgIGxpbWl0OiAyMAogICAgICAgICAgfQogICAgICAgIH0pKQogICAgICAgIAogICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICBmaWx0ZXJzLnB1c2goe2tpbmRzOiBbMV0sIHNlYXJjaDogcX0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGZpbHRlcnMubGVuZ3RoID09IDApewogICAgICAgICAgZmlsdGVycy5wdXNoKHtraW5kczogWzFdfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBjb25zdCBzZWFyY2hvYmogPSBbIlJFUSIsIHFpZCwgLi4uZmlsdGVyc10KICAgICAgICBjb25zdCBzZWFyY2hqc29uID0gSlNPTi5zdHJpbmdpZnkoc2VhcmNob2JqKQogICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgCiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd2FpdHJlcyhxaWQpCiAgICAgICAgYXdhaXQgaGFuZGxlcXVlcnlyZXMocmVzLCBzb2NrZXQsIHEsIHR5cGUsIHN0aW1lKQogICAgICAgIHF1ZXJ5KHNvY2tldCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlsaWtlcyhzb2NrZXQpewogICAgICAgIGlmKCFoYXNrZXkoKSl7CiAgICAgICAgICByZXR1cm4gW10KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgbXlwdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGNvbnN0IGV2ZW50cyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzddLCBudWxsLCBbbXlwdWJrZXldKQogICAgICAgIHJldHVybiBldmVudHMubWFwKGUgPT4gZS50YWdzLmZpbmQodCA9PiB0WzBdID09ICJlIilbMV0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gImV2ZW50c18iICsgKCsraWRjb3VudGVyKQogICAgICAgIGNvbnN0IGZpbHRlcnMgPSB7fQogICAgICAgIAogICAgICAgIGZpbHRlcnMua2luZHMgPSBraW5kcwogICAgICAgIAogICAgICAgIGlmKGV2ZW50aWRzKXsKICAgICAgICAgIGZpbHRlcnNbIiNlIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCgogICAgICAgIHNvY2tldC5zZW5kKGpzb24pCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRyZXMocXVlcnlpZCkgfHwgW10KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlwdWJrZXkoc29ja2V0LCBwdWJrKXsKICAgICAgICBjb25zdCBxdWVyeWlkID0gInF1ZXJ5XyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5hdXRob3IucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPFA+IiwgcHViaykpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2F2ZXJlc3VsdHMoZXZlbnQsIHJlZ2V4LCBtZXRhZXZlbnRzLCByZWFjdGVkKXsKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCgogICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2gocmVnZXgpIHx8IFtdKXsKICAgICAgICAgIGlmKCF1cmxzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICBjb25zdCBtZXRhID0gbWV0YWV2ZW50cy5maW5kKG8gPT4gby5wdWJrZXkgPT0gZXZlbnQucHVia2V5KQoKICAgICAgICAgICAgdXJscy5wdXNoKHVybCkKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICByZWFjdGVkOiByZWFjdGVkIHx8IGxpa2VzLmluY2x1ZGVzKGV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwgCiAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGV2ZW50LmlkKSksCiAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICB9KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gcmVzdWx0cwogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzYXZlKHNvY2tldCwgZXZlbnRkYiwgcSwgcXR5cGUsIHJlYWN0ZWQsIGFwcGVuZCl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiB7CiAgICAgICAgICBpZihxLmxlbmd0aCA+IDApewogICAgICAgICAgICBmb3IobGV0IHdvcmQgb2YgcS5zcGxpdCgiICIpKXsKICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKG8ucHVia2V5KSB8fCBldmVudHB1YmtleXMucHVzaChvLnB1YmtleSkKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgcmVzdWx0cyA9IFtdCiAgICAgICAgY29uc3QgZXZlbnRpZHMgPSBldmVudHMubWFwKGUgPT4gZS5pZCkKICAgICAgICBsZXQgbWV0YWV2ZW50cyA9IFtdCgogICAgICAgIGxvZygicXVlcnkgbWV0YSIsIHNvY2tldC51cmwpCiAgICAgICAgCiAgICAgICAgLy9tZXRhZXZlbnRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzBdLCBudWxsLCBldmVudHB1YmtleXMpKSkKCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgaWYocXR5cGUgIT0gInZpZGVvIil7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5zYXZlcmVzdWx0cyhldmVudCwgaW1ncmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWQpKQogICAgICAgICAgfQoKICAgICAgICAgIGlmKHF0eXBlICE9ICJpbWFnZSIpewogICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uc2F2ZXJlc3VsdHMoZXZlbnQsIHZpZGVvcmVnZXgsIG1ldGFldmVudHMsIHJlYWN0ZWQpKQogICAgICAgICAgfQogICAgICAgIH0KICAKICAgICAgICBsb2coInNhdmUgcmVzIiwgcmVzdWx0cy5sZW5ndGgsIHNvY2tldC51cmwpCiAgICAgICAgdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKXsKICAgICAgICByZXN1bHRzLnJldmVyc2UoKS5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgY29uc3QgdHlwZSA9IGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpICYmICJ2aWRlbyIgfHwgInBpYyIKICAgICAgICAgIGNvbnN0IHRleHQgPSAocSB8fCAidmlldyBub3RlIikuc3Vic3RyaW5nKC0zMCkKICAgICAgICAgIGNvbnN0IGlkID0gIml0ZW1fIiArICgrK2lkY291bnRlcikKICAgICAgICAgIGNvbnN0IGNvbnRlbnRlbGVtZW50cyA9ICc8ZGl2IGNsYXNzPSJ0eXBlIj4nICsgdHlwZSArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IiBocmVmPSInICsgcHJvdG9jb2wgKyAKICAgICAgICAgICAgaXRlbS5iZWNoMzJpZCArICciPicgKyB0ZXh0ICsgJzwvYT4nCiAgICAgICAgICBsZXQgcm9vdCA9IG51bGwKICAgICAgICAgIGxldCB2ID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICAgIHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MID0gY29udGVudGVsZW1lbnRzCiAgICAgICAgICAgIAogICAgICAgICAgICB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2WyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgICB2Lmxvb3AgPSB0cnVlCiAgICAgICAgICAgIHYucGxheXNpbmxpbmUgPSAiIgogICAgICAgICAgICAvL3Jvb3Quc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICAgICAgCiAgICAgICAgICAgIHYub25jYW5wbGF5ID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgYXNwZWN0ID0gdGhpcy52aWRlb1dpZHRoIC8gdGhpcy52aWRlb0hlaWdodAogICAgICAgICAgICAgIGlmKGFzcGVjdCA+IDEpewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IChhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmhlaWdodCA9ICgxIC8gYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5tYXJnaW5Ub3AgPSAtKCgxIC8gYXNwZWN0ICogMTAwIC0gMTAwKSAvIDIpICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSh0aGlzKQogICAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICAgICAgICB9CiAgICAgIAogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgICByb290LmhyZWYgPSAiIyIKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYodHlwZSA9PSAicGljIil7CiAgICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgKz0gJzxpbWcgb25sb2FkPSJnaWQoXCcnICsgaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBpdGVtLnVybCArICciLz4nCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290WyJkYXRhLWl0ZW0iXSA9IGl0ZW0KICAgICAgICAgIHJvb3RbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgIHJvb3RbImRhdGEtcXVlcnkiXSA9IHEKICAgICAgICAgIHJvb3RbImRhdGEtdGV4dCJdID0gdGV4dAogICAgICAgICAgCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQodHlwZSkKICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgiaXRlbSIpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgCiAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBxcygiI3BpY3MiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI3BpY3MgLml0ZW0iKT8uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVtZWRpYSgpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAic2Nyb2xsIgogICAgICAgIHFzYSgiI21lZGlhLWNvbnRhaW5lciwgI3BpYywgI21lZGlhLWZvb3RlciIpLmZvckVhY2gobiA9PiBuLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpCiAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5yZW1vdmUoInJlYWN0ZWQiKQogICAgICAgIGhpZGV2aWRlbygpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGV2aWRlbygpewogICAgICAgIGNvbnN0IHYgPSBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpCiAgICAgICAgCiAgICAgICAgaWYodil7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSl7CiAgICAgICAgbGV0IGV2ZW50cyA9IFtdCiAgICAgICAgCiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICB0aGlzLmtleSA9IGtleQogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09ICJFT1NFIil7CiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50cykKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2gobmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkoc29ja2V0LCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIAogICAgICAgIGlmKCF1cGRhdGVub3RlKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBhZ2UgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC8gMTAwMCAtIHVwZGF0ZW5vdGUuY3JlYXRlZF9hdCkgLyAzNjAwIC8gMjQpCiAgICAgICAgY29uc3Qgbm90ZWlkID0gYmVjaDMyLmVuY29kZSgibm90ZSIsIGZyb21IZXhTdHJpbmcodXBkYXRlbm90ZS5pZCkpCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaHJlZiA9IHByb3RvY29sICsgbm90ZWlkCiAgICAgICAgcXMoIiNyZWxlYXNlIikuaW5uZXJUZXh0ID0gKGFnZSA9PSAwICYmICJ0b2RheSIgfHwgYWdlICsgIiBkYXkocykgYWdvIikKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2xlZXAobXMpewogICAgICAgIHJldHVybiBuZXcgZnVuY3Rpb24oKXsKICAgICAgICAgIGxldCB0aW1lb3V0ID0gbnVsbAogICAgICAgICAgbGV0IHIgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb21pc2U6IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykKICAgICAgICAgICAgICByID0gcmVzb2x2ZQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCkKICAgICAgICAgICAgICByKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2hvdyhpZCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iCiAgICAgICAgY29uc3QgaXRlbSA9IGdpZChpZClbImRhdGEtaXRlbSJdCiAgICAgICAgY29uc3QgbWVkaWEgPSBnaWQoIm1lZGlhLWNvbnRhaW5lciIpCiAgICAgICAgY29uc3QgcGljID0gZ2lkKCJwaWMiKQoKICAgICAgICBpZihpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KSl7CiAgICAgICAgICBwaWMuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LnBsYXkoKQogICAgICAgIH1lbHNlewogICAgICAgICAgcGljLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBwaWMuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICB9CgogICAgICAgIGdpZCgicGljLWxpa2UiKVsiZGF0YS1pdGVtLWlkIl0gPSBpZAogICAgICAgIGdpZCgibWVkaWEtZm9vdGVyIilbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKCiAgICAgICAgaWYoaXRlbS5yZWFjdGVkIHx8IHJlYWN0ZWQuaW5jbHVkZXMoaWQpKXsKICAgICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgICAKICAgICAgICBtZWRpYS5zdHlsZS5kaXNwbGF5ID0gZ2lkKCJtZWRpYS1mb290ZXIiKS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgaWYoc2Nyb2xsKXsKICAgICAgICAgIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsb2coImNvbm5lY3RpbmciLCB1cmwpCiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIAogICAgICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgZnVuY3Rpb24oKXsKICAgICAgICAgIHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKQogICAgICAgICAgcXMoIiNjb25uY291bnQiKS5pbm5lclRleHQgPSBjb25uY291bnQoKSArIChwcmltYWxzb2NrZXQgJiYgMSkKICAgICAgICAgIGxvZygiZGlzY29ubmVjdGVkIiwgdGhpcy51cmwsIGNvbm5jb3VudCgpKQogICAgICAgICAgYXdhaXQgc2xlZXAoMTAwMCkucHJvbWlzZQogICAgICAgICAgY29ubmVjdCh0aGlzLnVybCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBwcmltYWxzb2NrZXQgPSBjb25uZWN0KCJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3IikKICAgICAgICBwcmltYWxzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxnbG9iYWwodGhpcykKICAgICAgICB9KQogICAgICAgIAogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQgPSBudWxsCiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBmb3IobGV0IHVybCBvZiByZWxheXMoKSl7CiAgICAgICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0KHVybCkKICAgICAgICAgIHNvY2tldHMucHVzaChzb2NrZXQpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgY2hlY2t1cGRhdGUodGhpcykKICAgICAgICAgICAgcXVlcnkodGhpcykKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGF3YWl0IHNsZWVwKDEwMCkucHJvbWlzZQogICAgICAgIAogICAgICAgIGlmKGhhc2tleSgpKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

Reply to this note

Please Login to reply.

Discussion

No replies yet.