https://ipfs.io/ipfs/QmUJeS3pViF7eGDnMEiFTjvN91qRf1664ExvsNMoG4Ewgv

sha256

3818084d32f330531db3d37f7aa4407113abc7f055bcda79d4f3c0571054b7b3 images.html

base64

PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIi8+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vc3ZnaWNvbnMuc3BhcmtrLmZyL3N2Z2ljb25zLmNzcyIvPgogICAgPHN0eWxlPgogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgICAjY29udHJvbGluZm8gewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcm0gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICAvKmN1cnNvcjogcG9pbnRlcjsqLwogICAgICB9CiAgICAgIAogICAgICAvKiNoZWFkZXIgLnNldGNvbHMsIAogICAgICAjaGVhZGVyIC5zZXRsaW1pdCB7CiAgICAgICAgcGFkZGluZzogLjhlbSAwOwogICAgICB9Ki8KICAgICAgCiAgICAgICNxdWVyeSB7CiAgICAgICAgd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwgCiAgICAgICNjb250cm9saW5mbywKICAgICAgYSB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNxdWVyeWRpc3BsYXkgewogICAgICAgIHBhZGRpbmc6IDAgMWVtOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgI2hlYWRlciBhLAogICAgICAjaGVhZGVyIHNwYW4gewogICAgICAgIHBhZGRpbmc6IDAuOGVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICB9CgogICAgICAjaGVhZGVyIHsKICAgICAgICBwYWRkaW5nOiAwLjQ1ZW0gMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjaGVhZGVyIC5pdGVtcyB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgLml0ZW1zLCAKICAgICAgI2NvbnRyb2xpbmZvIHsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgIHNwYW4jY29udHJvbGluZm8sIAogICAgICAjcGljcyBhID4gYSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CiAgICAgIAogICAgICBzcGFuI2NvbnRyb2xpbmZvIHsKICAgICAgICByaWdodDogMmVtOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWVkaWEtY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCk7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB6LWluZGV4OiA0OwogICAgICB9CiAgICAgIAogICAgICAjcGljLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIAogICAgICAjcGljIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMHZ3OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMHZoOwogICAgICB9CiAgICAgICAgCiAgICAgICNwaWNzIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAjcGljcyA+IGEsIAogICAgICAjcGljcyBpbWcsCiAgICAgICNwaWNzIC5maWxlLAogICAgICAjcGljcyAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMjV2dzsKICAgICAgfQoKICAgICAgI3BpY3MgPiBhLAogICAgICAjcGljcyAuZmlsZSwKICAgICAgI3BpY3MgLnZpZGVvLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgYm9yZGVyOiAwLjNlbSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwLjNlbTsKICAgICAgICBtYXJnaW46IC0wLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuZmlsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgCiAgICAgICNtZWRpYS1jb250YWluZXIgdmlkZW8gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgYm9keTpub3QoLm5vc3RyKSAjZmlsdGVyLWxpa2VzLCAKICAgICAgLmZpbHRlci1saWtlcyAjcGljcyA+IGE6bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgei1pbmRleDogMjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3Z3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcGFkZGluZzogMCAxdnc7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI3BpYy1xdWVyeSB7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGZvbnQtc2l6ZTogbWluKDMuNXZ3LCAxLjVlbSk7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjYpOwogICAgICB9CiAgICAgIAogICAgICAjcGljLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhLmxpa2UucmVhY3RlZCwKICAgICAgLmZpbHRlci1saWtlcyAjZmlsdGVyLWxpa2VzIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgIH0KCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciwKICAgICAgI21lZGlhLWZvb3RlciAubGlrZSB7CiAgICAgICAgei1pbmRleDogNTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KICAgICAgCiAgICAgICNwaWMtcXVlcnksCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgICNwaWMtdXNlciB7CiAgICAgICAgYm90dG9tOiAxLjllbTsKICAgICAgICBmb250LXNpemU6IDEuOGVtOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IC42NWVtOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIAogICAgICAubGlrZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgd2lkdGg6IDFlbTsKICAgICAgICBoZWlnaHQ6IDFlbTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAubm9zdHIgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOyAgCiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIGZvbnQtc2l6ZTogMi40ZW07CiAgICAgIH0KCiAgICAgICNtZWRpYS1mb290ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7ICAKICAgICAgfQogIAogICAgICAjcGljcyBpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmFjdGl2ZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzQ0NDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3BpY3MgPiAuYWN0aXZlIHsKICAgICAgICBib3JkZXItY29sb3I6IGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoIHsKICAgICAgICBzdHJva2U6ICNmZmY7CiAgICAgIH0KICAKICAgICAgYSNtZW51LCBhI2ZpbHRlci1saWtlcyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC4zZW0gMCAuNWVtOwogICAgICAgIGhlaWdodDogMi4xZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICB3aWR0aDogMS41ZW07CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBtYXJnaW46IC4xZW0gLjVlbTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgIGEjZmlsdGVyLWxpa2VzIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgICB3aWR0aDogMTVlbTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE1ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzIyMjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgei1pbmRleDogMzsgCiAgICAgIH0KCiAgICAgICNtZW51LWNvbnRlbnQub3BlbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgCiAgICAgICNtZW51LWNvbnRlbnQgLml0ZW1zIHsKICAgICAgICBwYWRkaW5nOiAwIDFlbTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgYSB7CiAgICAgICAgcGFkZGluZzogLjVlbSAuN2VtOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAjbWVudS1vdmVybGF5Lm9wZW4gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBzdmcsIGltZyB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICN0ZW1wbGF0ZSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJ0ZW1wbGF0ZSI+CiAgICAgIDxzdmcgY2xhc3M9ImhlYXJ0c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgogICAgICAgIDxwYXRoIGQ9Ik05LjcxOSwxNy4wNzNsLTYuNTYyLTYuNTFjLTAuMjctMC4yNjgtMC41MDQtMC41NjctMC42OTYtMC44ODhDMS4zODUsNy44OSwxLjY3LDUuNjEzLDMuMTU1LDQuMTRjMC44NjQtMC44NTYsMi4wMTItMS4zMjksMy4yMzMtMS4zMjljMS45MjQsMCwzLjExNSwxLjEyLDMuNjEyLDEuNzUyYzAuNDk5LTAuNjM0LDEuNjg5LTEuNzUyLDMuNjEyLTEuNzUyYzEuMjIxLDAsMi4zNjksMC40NzIsMy4yMzMsMS4zMjljMS40ODQsMS40NzMsMS43NzEsMy43NSwwLjY5Myw1LjUzN2MtMC4xOSwwLjMyLTAuNDI1LDAuNjE4LTAuNjk1LDAuODg3bC02LjU2Miw2LjUxQzEwLjEyNSwxNy4yMjksOS44NzUsMTcuMjI5LDkuNzE5LDE3LjA3MyBNNi4zODgsMy42MUM1LjM3OSwzLjYxLDQuNDMxLDQsMy43MTcsNC43MDdDMi40OTUsNS45MiwyLjI1OSw3Ljc5NCwzLjE0NSw5LjI2NWMwLjE1OCwwLjI2NSwwLjM1MSwwLjUxLDAuNTc0LDAuNzMxTDEwLDE2LjIyOGw2LjI4MS02LjIzMmMwLjIyNC0wLjIyMSwwLjQxNi0wLjQ2NiwwLjU3My0wLjcyOWMwLjg4Ny0xLjQ3MiwwLjY1MS0zLjM0Ni0wLjU3MS00LjU2QzE1LjU3LDQsMTQuNjIxLDMuNjEsMTMuNjEyLDMuNjFjLTEuNDMsMC0yLjYzOSwwLjc4Ni0zLjI2OCwxLjg2M2MtMC4xNTQsMC4yNjQtMC41MzYsMC4yNjQtMC42OSwwQzkuMDI5LDQuMzk3LDcuODIsMy42MSw2LjM4OCwzLjYxIj48L3BhdGg+CiAgICAgIDwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSwgCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyBpbWcsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyAuZmlsZSwKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzIC52aWRlby1jb250YWluZXIgewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IGEsCiAgICAgIC5jb2xzJHtjb2xzfSAjcGljcyA+IC5maWxlLAogICAgICAuY29scyR7Y29sc30gI3BpY3MgPiAudmlkZW8tY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9ICNwaWNzID4gYSA+IGEsIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWVkaWEtZm9vdGVyIj4KICAgICAgPGEgaWQ9InBpYy1saWtlIiBjbGFzcz0ibGlrZSIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0icGljLXF1ZXJ5IiBocmVmPSIjIj48L2E+CiAgICAgIDxhIGlkPSJwaWMtdXNlciIgaHJlZj0iIyI+PC9hPgogICAgPC9kaXY+CiAgICA8Y2VudGVyIGlkPSJtZWRpYS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJwaWMtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJwaWMiLz4KICAgICAgPC9kaXY+CiAgICA8L2NlbnRlcj4KICAgIDxkaXYgaWQ9Im1lbnUtb3ZlcmxheSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJ0ZXN0Ij4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9mZiIgaHJlZj0iIyI+b2ZmPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2xzOjwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGNvbHMiIGRhdGEtY29scz0iNCIgaHJlZj0iIyI+NDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0Y29scyIgZGF0YS1jb2xzPSI2IiBocmVmPSIjIj42PC9hPgogICAgICAgIDxhIGNsYXNzPSJzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bGltaXQ6PC9kaXY+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSI3NSIgaHJlZj0iIyI+NzU8L2E+CiAgICAgICAgPGEgY2xhc3M9InNldGxpbWl0IiBkYXRhLWxpbWl0PSIyMDAiIGhyZWY9IiMiPjIwMDwvYT4KICAgICAgICA8YSBjbGFzcz0ic2V0bGltaXQiIGRhdGEtbGltaXQ9IjUwMCIgaHJlZj0iIyI+NTAwPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBpZD0icmVsZWFzZSIgaHJlZj0iIyI+PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iaGVhZGVyIj4KICAgICAgPHNwYW4gaWQ9ImNvbnRyb2xpbmZvIj5jb250cm9sczogYXJyb3dzLCBlbnRlciwgZXNjPC9zcGFuPgogICAgICA8YSBpZD0iZmlsdGVyLWxpa2VzIiBocmVmPSIjIj48L2E+CiAgICAgIDxkaXYgY2xhc3M9Iml0ZW1zIj4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxhIGlkPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8Zm9ybSBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8aW5wdXQgaWQ9ImdvIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJnbyIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8c3BhbiBpZD0icXVlcnlkaXNwbGF5Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0Ij48L3NwYW4+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0icGljcyI+PC9kaXY+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9zbG93bGkuZ2l0aHViLmlvL2JlY2gzMi1idWZmZXIvYXNzZXRzL2pzL2JlY2gzMi1idWZmZXIubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgIGNvbnN0IHVwZGF0ZXNwdWJrZXkgPSAiYWU1YzZlMGI3NDY2MGQyMTk0YzgyNTRiNWMyYzgyNTY3NjU3NmJlMDI5NzM3OWZhMjA1MjMxMTRhNmE4NWU4NyIKICAgICAgY29uc3QgcXVlcmllcyA9IHsKICAgICAgICAiZ2xvYmFsIjogJ1siUkVRIiwiPEk+Iix7ImNhY2hlIjpbImV4cGxvcmUiLHsidGltZWZyYW1lIjoibGF0ZXN0Iiwic2NvcGUiOiJnbG9iYWwiLCJsaW1pdCI6PEw+fV19XScsIAogICAgICAgICJzZWFyY2giOiAnWyJSRVEiLCI8ST4iLHsiY2FjaGUiOlsic2VhcmNoIix7InF1ZXJ5IjoiPFE+IiwibGltaXQiOjxMPn1dfV0nLAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJywKICAgICAgICAicmVhY3Rpb25zIjogJ1siUkVRIiwiPEk+IiwgeyJraW5kcyI6WzddLCIjZSI6IDxFPn1dJwogICAgICB9CiAgICAgIGNvbnN0IHJlbGF5cyA9IFsKICAgICAgICBbInByaW1hbCIsICJ3c3M6Ly9jYWNoZTMucHJpbWFsLm5ldC9jYWNoZTE3Il0sIAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vbm9zLmxvbCJdLAogICAgICAgIFsicmVsYXkiLCAid3NzOi8vcmVsYXkubm9zdHIuYmFuZC8iXQogICAgICBdCiAgICAgIAogICAgICBjb25zdCBjb2xvcHRzID0gWzIsIDQsIDYsIDEwXQogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvbHMiKSB8fCAiNCIsIDEwKQogICAgICBhdXRvcGxheSA9ICgpID0+IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhdXRvcGxheSIpIHx8ICJvZmYiCiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiY29scyIgKyBjb2xzKCkpCiAgICAgIGxpbWl0ID0gKCkgPT4gcGFyc2VJbnQobG9jYWxTdG9yYWdlLmdldEl0ZW0oImxpbWl0IikgfHwgIjc1IiwgMTApCiAgICAgIGxldCBwcm90b2NvbCA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS8pID8gIm5vc3RyOiIgOiAid2ViK25vc3RyOiIKICAgICAgbGV0IHJlbGF5c29ja2V0cyA9IFtdCiAgICAgIGxldCBwcmltYWxoYW5kbGVycyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCBwaWN0dXJlcyA9IFtdCiAgICAgIGxldCBmaWxlcyA9IFtdCiAgICAgIGxldCBldmVudGRiID0gW10KICAgICAgbGV0IHJlYWN0ZWQgPSBbXQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgaW1ncmVnZXggPSAvaHR0cCh8cylcOlwvXC9bXiBcbl0qP1wuKHBuZ3xqcGd8anBlZ3x3ZWJwfGdpZikvZ2kKICAgICAgbGV0IGZpbGVyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4obXAzfG1wNHx0eHQpL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL1wuKG1wNHx3ZWJtKSQvCiAgICAgIHdhaXRtcyA9IDMwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICAKICAgICAgdXBkYXRlcXVlcnkoKQogICAgICBxcygiI3BpYy1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIHNldGFjdGl2ZSgic2V0bGltaXQiLCAibGltaXQiLCBsaW1pdCgpKQoKICAgICAgZnVuY3Rpb24gZnJvbUhleFN0cmluZyhzdHIpewogICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoIC8gMikKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgYnVmZmVyW2ldID0gcGFyc2VJbnQoc3RyLnN1YnN0cigyICogaSwgMiksIDE2KQogICAgICAgIH0KICAgICAgICByZXR1cm4gYnVmZmVyCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXF1ZXJ5KCl7CiAgICAgICAgcXVlcnlzdHIgPSBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjdGl2ZSgpewogICAgICAgIHJldHVybiBxcygiI3BpY3MgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHBpY29mZnNldChvZmZzZXQpewogICAgICAgIGNvbnN0IHBpY3MgPSBxc2EoIiNwaWNzID4gYSIpLmZpbHRlcihlID0+IGUuc3R5bGUuZGlzcGxheSA9PSAiYmxvY2siKQogICAgICAgIHJldHVybiBwaWNzW3BpY3MuaW5kZXhPZihhY3RpdmUoKSkrb2Zmc2V0XQogICAgICB9CgogICAgICBmdW5jdGlvbiBsYXN0YWN0aXZlKCl7CiAgICAgICAgcmV0dXJuIHFzYSgiI3BpY3MgLmFjdGl2ZSIpLnBvcCgpICAgICAgCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1lbnUoKXsKICAgICAgICBxc2EoIiNtZW51LWNvbnRlbnQsICNtZW51LW92ZXJsYXkiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIikpCiAgICAgIH0KICAKICAgICAgZnVuY3Rpb24gc2V0YWN0aXZlKGMsIGtleSwgdmFsKXsKICAgICAgICBxc2EoIi4iICsgYykuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikpCiAgICAgICAgcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZXZpZGVvcGxheSgpewogICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKGFzeW5jIHYgPT4gewogICAgICAgICAgaWYodi5yZWFkeVN0YXRlICE9IDQpewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoIWF1dG9wbGF5KCkpewogICAgICAgICAgICB2LnBhdXNlKCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IG4gPSB2LnBhcmVudEVsZW1lbnQKICAgICAgICAgIAogICAgICAgICAgaWYoKG4ub2Zmc2V0VG9wICsgbi5vZmZzZXRIZWlnaHQpIDwgc2Nyb2xsWSAKICAgICAgICAgIHx8IG4ub2Zmc2V0VG9wID4gKHNjcm9sbFkgKyB2aXN1YWxWaWV3cG9ydC5oZWlnaHQpKXsKICAgICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgLy9hd2FpdCBzbGVlcCgxMDAwKQogICAgICAgICAgICB2LnBsYXkoKQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsICgpID0+IHVwZGF0ZXZpZGVvcGxheSgpKQogICAgICAKICAgICAgcXMoImZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsb2NhdGlvbi5oYXNoID0gIiMiICsgcXMoIiNxdWVyeSIpLnZhbHVlCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICB9KQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBhc3luYyAoZSkgPT4gewogICAgICAgIC8vY29uc29sZS5sb2coImNsaWNrIiwgZSwgZS50YXJnZXQuaHJlZikKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5ocmVmLm1hdGNoKC9eKHx3ZWJcKylub3N0clw6LykpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJ0aXRsZSIpewogICAgICAgICAgcXMoIiNxdWVyeSIpLnZhbHVlID0gIiIKICAgICAgICAgIHFzKCIjZ28iKS5jbGljaygpCiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gImZpbHRlci1saWtlcyIpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJmaWx0ZXItbGlrZXMiKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpKXsKICAgICAgICAgIGFjdGl2ZSgpPy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgZ2lkKGUudGFyZ2V0LmlkKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgc2hvdyhlLnRhcmdldC5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC50YWdOYW1lICE9ICJBIiAmJiAocXMoIiNwaWMtY29udGFpbmVyIikgPT0gZS50YXJnZXQgfHwgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKSA9PSBlLnRhcmdldCkpewogICAgICAgICAgaGlkZW1lZGlhKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuaWQgPT0gIm1lbnUiIHx8IGUudGFyZ2V0LmlkID09ICJtZW51LW92ZXJsYXkiKXsKICAgICAgICAgIG1lbnUoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzZXRsaW1pdCIpKXsKICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJsaW1pdCIsIGUudGFyZ2V0LmRhdGFzZXQubGltaXQpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGxpbWl0IiwgImxpbWl0IiwgbGltaXQoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSl7CiAgICAgICAgICBsaWtlKGUudGFyZ2V0KQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxpa2UobGluayl7CiAgICAgICAgY29uc3QgZXZlbnQgPSBsaW5rLnBhcmVudEVsZW1lbnRbImRhdGEtZXZlbnQiXQogICAgICAgIGNvbnN0IHB1YmtleSA9IGF3YWl0IG5vc3RyLmdldFB1YmxpY0tleSgpCiAgICAgICAgY29uc3QgbGlrZSA9IGF3YWl0IG5vc3RyLnNpZ25FdmVudCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0sCiAgICAgICAgICAicHVia2V5IjogcHVia2V5LAogICAgICAgICAgImNyZWF0ZWRfYXQiOiBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCAsIDEwKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcmVsYXlzb2NrZXRzLmZvckVhY2gocyA9PiBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIGxpa2VdKSkpCgogICAgICAgIGxpbmsuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCgogICAgICAgIGNvbnN0IHBpY2lkID0gbGlua1siZGF0YS1waWMtaWQiXSB8fCBsaW5rLmRhdGFzZXQucGljSWQKICAgICAgICAKICAgICAgICBpZihwaWNpZCl7CiAgICAgICAgICBnaWQocGljaWQpLnF1ZXJ5U2VsZWN0b3IoIi5saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICByZWFjdGVkLnB1c2gocGljaWQpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnNvbGUubG9nKCJyZWFjdGlvbiBzZW50IikKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLnN0eWxlLmRpc3BsYXkgPT0gImJsb2NrIil7CiAgICAgICAgICAgIGhpZGVtZWRpYSgpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIgJiYgcGljb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIHBpY29mZnNldCgtY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIiAmJiBwaWNvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBwaWNvZmZzZXQoY29scygpKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd0xlZnQiICYmIHBpY29mZnNldCgtMSkpewogICAgICAgICAgcGljb2Zmc2V0KC0xKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgbGFzdGFjdGl2ZSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dSaWdodCIgJiYgcGljb2Zmc2V0KDEpKXsKICAgICAgICAgIHBpY29mZnNldCgxKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgYWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICB9CiAgCiAgICAgICAgaWYocXMoIiNtZWRpYS1jb250YWluZXIiKS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIpewogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBxdWVyeShzb2NrZXQpewogICAgICAgIGxldCB0ID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIKICAgICAgICAKICAgICAgICBwcmltYWxoYW5kbGVycy5wdXNoKChldmVudCkgPT4gewogICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlbMl0KICAgICAgICAgIGRhdGEgJiYgZXZlbnRkYi5wdXNoKGRhdGEpCiAgICAgICAgICAgCiAgICAgICAgICBpZihldmVudC5kYXRhLmluZGV4T2YoIkVPU0UiKSA9PSAyKXsKICAgICAgICAgICAgc2F2ZShldmVudGRiLCBxKQogICAgICAgICAgICBldmVudGRiID0gW10KICAgICAgICAgICAgbGV0IHdhaXQgPSB3YWl0bXMgLSAoRGF0ZS5ub3coKSAtIHQpCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcXVlcnkoc29ja2V0KSwgd2FpdCkKICAgICAgICAKICAgICAgICAgICAgcHJpbWFsaGFuZGxlcnMuc3BsaWNlKHByaW1hbGhhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgc29ja2V0LnNlbmQocSA9PSAiIiAmJiBxdWVyaWVzLmdsb2JhbC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQoKSkgCiAgICAgICAgICB8fCBxdWVyaWVzLnNlYXJjaC5yZXBsYWNlKCc8ST4nLCArK2lkY291bnRlcikucmVwbGFjZSgnPEw+JywgbGltaXQpLnJlcGxhY2UoJzxRPicsIHEpKQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCwgZXZlbnRpZHMpewogICAgICAgIGlmKCF3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IG15cHVia2V5ID0gYXdhaXQgbm9zdHIuZ2V0UHVibGljS2V5KCkKICAgICAgICAKICAgICAgICBjb25zdCBxdWVyeWlkID0gImxpa2VzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgc29ja2V0LnNlbmQocXVlcmllcy5yZWFjdGlvbnMucmVwbGFjZSgiPEk+IiwgcXVlcnlpZCkucmVwbGFjZSgiPEU+IiwgSlNPTi5zdHJpbmdpZnkoZXZlbnRpZHMpKSkKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB3YWl0cmVzKHF1ZXJ5aWQpCiAgICAgICAgcmV0dXJuIHJlcyAmJiByZXMuZmlsdGVyKGUgPT4gZS5wdWJrZXkgPT0gbXlwdWJrZXkpLm1hcChlID0+IGUudGFncy5maW5kKHQgPT4gdFswXSA9PSAiZSIpWzFdKSB8fCBbXQogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeXB1YmtleShzb2NrZXQsIHB1YmtleSl7CiAgICAgICAgY29uc3QgcXVlcnlpZCA9ICJxdWVyeV8iICsgKCsraWRjb3VudGVyKQogICAgICAgIHNvY2tldC5zZW5kKHF1ZXJpZXMuYXV0aG9yLnJlcGxhY2UoIjxJPiIsIHF1ZXJ5aWQpLnJlcGxhY2UoIjxQPiIsIHB1YmtleSkpCgogICAgICAgIHJldHVybiAoYXdhaXQgd2FpdHJlcyhxdWVyeWlkKSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShldmVudGRiLCBxKXsKICAgICAgICBjb25zdCBtZXRhZXZlbnRzID0gZXZlbnRkYi5maWx0ZXIobyA9PiBvLmtpbmQgPT0gMCkKICAgICAgICBjb25zdCBldmVudHMgPSBldmVudGRiLmZpbHRlcihvID0+IG8ua2luZCA9PSAxKQogICAgICAgIGxldCBuZXdwaWNzID0gW10KICAgICAgICBsZXQgbmV3ZmlsZXMgPSBbXQogICAgICAgIAogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IHJlYWN0ZWRldmVudGlkcyA9IFtdCgogICAgICAgIGZvcihsZXQgcyBvZiByZWxheXNvY2tldHMpewogICAgICAgICAgcmVhY3RlZGV2ZW50aWRzLnB1c2goLi4uKGF3YWl0IHF1ZXJ5bGlrZXMocywgZXZlbnRpZHMpKSkKICAgICAgICB9CgogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGZvcihsZXQgdXJsIG9mIGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKXsKICAgICAgICAgICAgaWYoIXBpY3R1cmVzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgcGljdHVyZXMucHVzaCh1cmwpCiAgICAgICAgICAgICAgbmV3cGljcy5wdXNoKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJwaWMiLCAKICAgICAgICAgICAgICAgIHJlYWN0ZWQ6IHJlYWN0ZWRldmVudGlkcy5pbmNsdWRlcyhldmVudC5pZCksIAogICAgICAgICAgICAgICAgdXJsOiB1cmwsIAogICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LCAKICAgICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhldmVudC5pZCkpLAogICAgICAgICAgICAgICAgbWV0YTogbWV0YQogICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZXZlbnQuY29udGVudC5tYXRjaChmaWxlcmVnZXgpIHx8IFtdKXsKICAgICAgICAgICAgaWYoIWZpbGVzLmluY2x1ZGVzKHVybCkpewogICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhZXZlbnRzLmZpbmQobyA9PiBvLnB1YmtleSA9PSBldmVudC5wdWJrZXkpCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgZmlsZXMucHVzaCh1cmwpCiAgICAgICAgICAgICAgbmV3ZmlsZXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZmlsZSIsIAogICAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZGV2ZW50aWRzLmluY2x1ZGVzKGV2ZW50LmlkKSwgCiAgICAgICAgICAgICAgICB1cmw6IHVybCwgCiAgICAgICAgICAgICAgICBldmVudDogZXZlbnQsIAogICAgICAgICAgICAgICAgYmVjaDMyaWQ6IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKGV2ZW50LmlkKSksCiAgICAgICAgICAgICAgICBtZXRhOiBtZXRhCiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdXBkYXRlY29udGVudChuZXdwaWNzLCBuZXdmaWxlcywgcSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY3JlYXRldmlkZW8oY29udGFpbmVyLCB1cmwpewogICAgICAgIGNvbnN0IHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCgogICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICB2LnByZWxvYWQgPSAiYXV0byIKICAgICAgICB2LmF1dG9wbGF5ID0gdHJ1ZQogICAgICAgIAogICAgICAgIGNvbnN0IGV4dCA9IHVybC5tYXRjaCh2aWRlb3JlZ2V4KVsxXQogICAgICAgIHYuaW5uZXJIVE1MID0gJzxzb3VyY2Ugc3JjPSInICsgdXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICBjb250YWluZXIucHJlcGVuZCh2KQogICAgICAgIHJldHVybiB2CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQocGljcywgZmlsZXMsIHEpewogICAgICAgIFsuLi5waWNzLCAuLi5maWxlc10ucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpKXsKICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoInZpZGVvLWNvbnRhaW5lciIpCiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zdCB2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKQogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgICAKICAgICAgICAgICAgdi5pZCA9ICJwaWNfIiArICgrK2lkY291bnRlcikKICAgICAgICAgICAgdlsiZGF0YS1waWMiXSA9IGl0ZW0KICAgICAgICAgICAgdlsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAogICAgICAgICAgICB2WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICAgIHZbImRhdGEtdGV4dCJdID0gdGV4dAoKICAgICAgICAgICAgLy92LnByZWxvYWQgPSAibWV0YWRhdGEiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5tdXRlZCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICAKICAgICAgICAgICAgdi5vbmNhbnBsYXkgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0CiAgICAgICAgICAgICAgaWYoYXNwZWN0ID4gMSl7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLndpZHRoID0gKGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuaGVpZ2h0ID0gKDEgLyBhc3BlY3QgKiAxMDApICsgIiUiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIHVwZGF0ZXZpZGVvcGxheSgpCiAgICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygicGxheSIsIGl0ZW0udXJsKQogICAgICAgICAgICB9CgogICAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInZpZGVvIikKICAgICAgICAgICAgY29uc3QgZXh0ID0gaXRlbS51cmwubWF0Y2godmlkZW9yZWdleClbMV0KICAgICAgICAgICAgdi5pbm5lckhUTUwgPSAnPHNvdXJjZSBzcmM9IicgKyBpdGVtLnVybCArICciIHR5cGU9InZpZGVvLycgKyBleHQgKyAnIj48L3NvdXJjZT4nCiAgICAgICAgICAgIAogICAgICAgICAgICBkaXYuYXBwZW5kKHYpCiAgICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoZGl2KQogICAgICAgICAgfWVsc2V7IAogICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIGEuaWQgPSAicGljXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZChpdGVtLnR5cGUpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgICAgIGEuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGFbImRhdGEtcGljIl0gPSBpdGVtCiAgICAgICAgICAgIGFbImRhdGEtZXZlbnQiXSA9IGl0ZW0uZXZlbnQKICAgICAgICAgICAgYVsiZGF0YS1xdWVyeSJdID0gcQogICAgICAgICAgICBhWyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJzxhIGNsYXNzPSJsaWtlJyArIChpdGVtLnJlYWN0ZWQgPyAnIHJlYWN0ZWQnIDogJycpICsgJyIgZGF0YS1waWMtaWQ9IicgKyBhLmlkICsgCiAgICAgICAgICAgICAgJyIgaHJlZj0iIyI+JyArIHFzKCIjdGVtcGxhdGUgLmhlYXJ0c3ZnIikub3V0ZXJIVE1MICsgJzwvYT48YSBjbGFzcz0icXVlcnkiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICAgIGl0ZW0uYmVjaDMyaWQgKyAnIj4nICsgdGV4dCArICc8L2E+JwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZihpdGVtLnR5cGUgPT0gInBpYyIpewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8aW1nIG9ubG9hZD0iZ2lkKFwnJyArIGEuaWQgKyAnXCcpLnN0eWxlLmRpc3BsYXk9XCdibG9ja1wnIiBzcmM9IicgKyBpdGVtLnVybCArICciLz4nCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIGEuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHFzKCIjcGljcyIpLnByZXBlbmQoYSkKICAgICAgICAgIH0KICAgICAgICB9KQoKICAgICAgICBpZihhY3RpdmUoKSA9PSBudWxsKXsKICAgICAgICAgIHFzKCIjcGljcyBhIik/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBoaWRlbWVkaWEoKXsKICAgICAgICBxc2EoIiNtZWRpYS1jb250YWluZXIsICNwaWMsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiKQogICAgICAgIGdpZCgicGljLWxpa2UiKS5jbGFzc0xpc3QucmVtb3ZlKCJyZWFjdGVkIikKICAgICAgICBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpPy5wYXVzZSgpCiAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIgdmlkZW8iKT8ucmVtb3ZlKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gd2FpdHJlcyhrZXkpewogICAgICAgIGxldCBldmVudHMgPSBbXQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKChyZXMpID0+IHsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiRU9TRSIpewogICAgICAgICAgICAgICAgcmVzb2x2ZShldmVudHMpCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgICAgfQogICAgICAgICAgfSkKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoKXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlwdWJrZXkocmVsYXlzb2NrZXRzWzBdLCB1cGRhdGVzcHVia2V5KQogICAgICAgIGNvbnN0IHVwZGF0ZW5vdGUgPSB1cGRhdGVzcmVzLmZpbmQobiA9PiBuLmNvbnRlbnQubWF0Y2goL15odHRwc1w6XC9cLy8pKQogICAgICAgIGNvbnN0IGFnZSA9IE1hdGgucm91bmQoKERhdGUubm93KCkgLyAxMDAwIC0gdXBkYXRlbm90ZS5jcmVhdGVkX2F0KSAvIDM2MDAgLyAyNCkKICAgICAgICBjb25zdCBub3RlaWQgPSBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyh1cGRhdGVub3RlLmlkKSkKICAgICAgICBxcygiI3JlbGVhc2UiKS5ocmVmID0gcHJvdG9jb2wgKyBub3RlaWQKICAgICAgICBxcygiI3JlbGVhc2UiKS5pbm5lclRleHQgPSAoYWdlID09IDAgJiYgInRvZGF5IiB8fCBhZ2UgKyAiIGRheShzKSBhZ28iKQogICAgICB9CgogICAgICBmdW5jdGlvbiBzbGVlcChtcyl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpeyAKICAgICAgICBjb25zdCBpdGVtID0gZ2lkKGlkKVsiZGF0YS1waWMiXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIAogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvcmVnZXgpKXsKICAgICAgICAgIAogICAgICAgICAgY29uc3QgdiA9IGNyZWF0ZXZpZGVvKHFzKCIjbWVkaWEtY29udGFpbmVyIiksIGl0ZW0udXJsKQogICAgICAgICAgLy92LmNvbnRyb2xzID0gdHJ1ZQogICAgICAgIH1lbHNlewogICAgICAgICAgY29uc3QgcGljID0gZ2lkKCJwaWMiKQogICAgICAgICAgY29uc3QgYSA9IHFzKCIjcGljLXF1ZXJ5IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgICAgY29uc3QgbWV0YWNvbnRlbnQgPSBKU09OLnBhcnNlKGl0ZW0ubWV0YS5jb250ZW50KQogICAgICAgICAgICBjb25zdCBuYW1lID0gbWV0YWNvbnRlbnQuZGlzcGxheV9uYW1lIHx8IG1ldGFjb250ZW50Lm5hbWUKICAgICAgICAgICAgcXMoIiNwaWMtdXNlciIpLmhyZWYgPSBwcm90b2NvbCArIGJlY2gzMi5lbmNvZGUoIm5wdWIiLCBmcm9tSGV4U3RyaW5nKGl0ZW0ubWV0YS5wdWJrZXkpKQogICAgICAgICAgICBxcygiI3BpYy11c2VyIikuaW5uZXJUZXh0ID0gbmFtZQogICAgICAgICAgfQoKICAgICAgICAgIGdpZCgicGljLWxpa2UiKVsiZGF0YS1waWMtaWQiXSA9IGlkCiAgICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpWyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CgogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkIHx8IHJlYWN0ZWQuaW5jbHVkZXMoaWQpKXsKICAgICAgICAgICAgZ2lkKCJwaWMtbGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgICAgfQoKICAgICAgICAgIGEuaHJlZiA9IHByb3RvY29sICsgaXRlbS5iZWNoMzJpZAogICAgICAgICAgYS5pbm5lclRleHQgPSBnaWQoaWQpWyJkYXRhLXRleHQiXQogICAgICAgICAgcGljLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBwaWMub25sb2FkID0gKCkgPT4gKHBpYy5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbWVkaWEuc3R5bGUuZGlzcGxheSA9IGdpZCgibWVkaWEtZm9vdGVyIikuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsICgpID0+IHsKICAgICAgICBmb3IobGV0IHJlbGF5IG9mIHJlbGF5cyl7CiAgICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldChyZWxheVsxXSkKCiAgICAgICAgICBpZihyZWxheVswXSA9PSAicHJpbWFsIil7CiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSBhc3luYyBlID0+IHsKICAgICAgICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgICAgICAgIGxldCByZWFkeSA9IHJlbGF5c29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgICAgICAgICAgICBpZihyZWFkeSA8IHJlbGF5c29ja2V0cy5sZW5ndGgpewogICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGluZyB0byByZWxheXMiLCByZWFkeSwgcmVsYXlzb2NrZXRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoNTApCiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgICAgICBicmVhayAgCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjb25zb2xlLmxvZygiY29ubmVjdGVkIikKCiAgICAgICAgICAgICAgaWYod2luZG93Lm5vc3RyKXsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgibm9zdHIiKQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHByaW1hbGhhbmRsZXJzLmZvckVhY2goZiA9PiBmKG1lc3NhZ2UpKQogICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9ICgpID0+IGNvbnNvbGUubG9nKCJjbG9zZSIpCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChmID0+IGYobWVzc2FnZSkpCiAgICAgICAgICAgIHJlbGF5c29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJlbGF5c29ja2V0c1swXS5vbm9wZW4gPSBlID0+IGNoZWNrdXBkYXRlKCkKICAgICAgfSkKICAgICAgCiAgICAgIGZvcihsZXQgYyBvZiBjb2xvcHRzKXsKICAgICAgICBkb2N1bWVudC53cml0ZSgnPHN0eWxlPicgKyBjb2xzY3NzLmlubmVyVGV4dC5yZXBsYWNlKC9cJFx7Y29sc1x9L2csIGMpICsgJzwvc3R5bGU+JykKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==

Reply to this note

Please Login to reply.

Discussion

No replies yet.