ZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL3VucGFyc2UucHkgYi9EZW1vL3BhcnNlci91bnBhcnNlLnB5CmluZGV4IGRkNzVjMjIuLjUxMGNkYjAgMTAwNjQ0Ci0tLSBhL0RlbW8vcGFyc2VyL3VucGFyc2UucHkKKysrIGIvRGVtby9wYXJzZXIvdW5wYXJzZS5weQpAQCAtMSw1ICsxLDggQEAKICJVc2FnZTogdW5wYXJzZS5weSA8cGF0aCB0byBzb3VyY2UgZmlsZT4iCiBpbXBvcnQgc3lzCitpbXBvcnQgX2FzdAoraW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IG9zCiAKIGNsYXNzIFVucGFyc2VyOgogICAgICIiIk1ldGhvZHMgaW4gdGhpcyBjbGFzcyByZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBBU1QgYW5kCkBAIC03MCw2ICs3MywxOCBAQAogICAgICAgICAgICAgaWYgYS5hc25hbWU6CiAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiIGFzICIrYS5hc25hbWUpCiAKKyAgICBkZWYgX0ltcG9ydEZyb20oc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZnJvbSAiKQorICAgICAgICBzZWxmLndyaXRlKHQubW9kdWxlKQorICAgICAgICBzZWxmLndyaXRlKCIgaW1wb3J0ICIpCisgICAgICAgIGZvciBpLCBhIGluIGVudW1lcmF0ZSh0Lm5hbWVzKToKKyAgICAgICAgICAgIGlmIGkgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLndyaXRlKGEubmFtZSkKKyAgICAgICAgICAgIGlmIGEuYXNuYW1lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiBhcyAiK2EuYXNuYW1lKQorICAgICAgICAjIFhYWChqcGUpIHdoYXQgaXMgbGV2ZWwgZm9yPworCiAgICAgZGVmIF9Bc3NpZ24oc2VsZiwgdCk6CiAgICAgICAgIHNlbGYuZmlsbCgpCiAgICAgICAgIGZvciB0YXJnZXQgaW4gdC50YXJnZXRzOgpAQCAtODgsNiArMTAzLDM2IEBACiAgICAgICAgIGlmIHQudmFsdWU6CiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAKKyAgICBkZWYgX1Bhc3Moc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgicGFzcyIpCisKKyAgICBkZWYgX0JyZWFrKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoImJyZWFrIikKKworICAgIGRlZiBfQ29udGludWUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiY29udGludWUiKQorCisgICAgZGVmIF9EZWxldGUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZGVsICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50YXJnZXRzKQorCisgICAgZGVmIF9Bc3NlcnQoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiYXNzZXJ0ICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50ZXN0KQorICAgICAgICBpZiB0Lm1zZzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiwgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5tc2cpCisKKyAgICBkZWYgX0V4ZWMoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZXhlYyAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKKyAgICAgICAgaWYgdC5nbG9iYWxzOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGluICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQuZ2xvYmFscykKKyAgICAgICAgaWYgdC5sb2NhbHM6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQubG9jYWxzKQorCiAgICAgZGVmIF9QcmludChzZWxmLCB0KToKICAgICAgICAgc2VsZi5maWxsKCJwcmludCAiKQogICAgICAgICBkb19jb21tYSA9IEZhbHNlCkBAIC0xMDIsNiArMTQ3LDY3IEBACiAgICAgICAgIGlmIG5vdCB0Lm5sOgogICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCiAKKyAgICBkZWYgX0dsb2JhbChzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJnbG9iYWwiKQorICAgICAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUodC5uYW1lcyk6CisgICAgICAgICAgICBpZiBpICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIgIiArIG4pCisKKyAgICBkZWYgX1lpZWxkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoInlpZWxkIikKKyAgICAgICAgaWYgdC52YWx1ZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiAoIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIikiKQorCisgICAgZGVmIF9SYWlzZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCdyYWlzZSAnKQorICAgICAgICBpZiB0LnR5cGU6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudHlwZSkKKyAgICAgICAgaWYgdC5pbnN0OgorICAgICAgICAgICAgc2VsZi53cml0ZSgiLCAiKQorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0Lmluc3QpCisgICAgICAgIGlmIHQudGJhY2s6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGJhY2spCisKKyAgICBkZWYgX1RyeUV4Y2VwdChzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJ0cnkiKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorCisgICAgICAgIGZvciBleCBpbiB0LmhhbmRsZXJzOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChleCkKKyAgICAgICAgaWYgdC5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLmZpbGwoImVsc2UiKQorICAgICAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQorICAgICAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX1RyeUZpbmFsbHkoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgidHJ5IikKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKworICAgICAgICBzZWxmLmZpbGwoImZpbmFsbHkiKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmZpbmFsYm9keSkKKyAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX2V4Y2VwdGhhbmRsZXIoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgiZXhjZXB0ICIpCisgICAgICAgIGlmIHQudHlwZToKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC50eXBlKQorICAgICAgICBpZiB0Lm5hbWU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIsICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQubmFtZSkKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKwogICAgIGRlZiBfQ2xhc3NEZWYoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUoIlxuIikKICAgICAgICAgc2VsZi5maWxsKCJjbGFzcyAiK3QubmFtZSkKQEAgLTExOSwyMyArMjI1LDExIEBACiAgICAgICAgIHNlbGYud3JpdGUoIlxuIikKICAgICAgICAgc2VsZi5maWxsKCJkZWYgIit0Lm5hbWUgKyAiKCIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5hcmdzKQorICAgICAgICBzZWxmLndyaXRlKCIpIikKICAgICAgICAgc2VsZi5lbnRlcigpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQogICAgICAgICBzZWxmLmxlYXZlKCkKIAotICAgIGRlZiBfSWYoc2VsZiwgdCk6Ci0gICAgICAgIHNlbGYuZmlsbCgiaWYgIikKLSAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRlc3QpCi0gICAgICAgIHNlbGYuZW50ZXIoKQotICAgICAgICAjIFhYWCBlbGlmPwotICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKLSAgICAgICAgc2VsZi5sZWF2ZSgpCi0gICAgICAgIGlmIHQub3JlbHNlOgotICAgICAgICAgICAgc2VsZi5maWxsKCJlbHNlIikKLSAgICAgICAgICAgIHNlbGYuZW50ZXIoKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0Lm9yZWxzZSkKLSAgICAgICAgICAgIHNlbGYubGVhdmUoKQotCiAgICAgZGVmIF9Gb3Ioc2VsZiwgdCk6CiAgICAgICAgIHNlbGYuZmlsbCgiZm9yICIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC50YXJnZXQpCkBAIC0xNTAsNiArMjQ0LDQxIEBACiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQogICAgICAgICAgICAgc2VsZi5sZWF2ZQogCisgICAgZGVmIF9JZihzZWxmLCB0KToKKyAgICAgICAgc2VsZi5maWxsKCJpZiAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQudGVzdCkKKyAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICMgWFhYIGVsaWY/CisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLmxlYXZlKCkKKyAgICAgICAgaWYgdC5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLmZpbGwoImVsc2UiKQorICAgICAgICAgICAgc2VsZi5lbnRlcigpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQub3JlbHNlKQorICAgICAgICAgICAgc2VsZi5sZWF2ZSgpCisKKyAgICBkZWYgX1doaWxlKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmZpbGwoIndoaWxlICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC50ZXN0KQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorICAgICAgICBpZiB0Lm9yZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsbCgiZWxzZSIpCisgICAgICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcmVsc2UpCisgICAgICAgICAgICBzZWxmLmxlYXZlCisKKyAgICBkZWYgX1dpdGgoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZmlsbCgid2l0aCAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuY29udGV4dF9leHByKQorICAgICAgICBpZiB0Lm9wdGlvbmFsX3ZhcnM6CisgICAgICAgICAgICBzZWxmLndyaXRlKCIgYXMgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcHRpb25hbF92YXJzKQorICAgICAgICBzZWxmLmVudGVyKCkKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmJvZHkpCisgICAgICAgIHNlbGYubGVhdmUoKQorCiAgICAgIyBleHByCiAgICAgZGVmIF9TdHIoc2VsZiwgdHJlZSk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0cmVlLnMpKQpAQCAtMTU3LDYgKzI4NiwxMSBAQAogICAgIGRlZiBfTmFtZShzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSh0LmlkKQogCisgICAgZGVmIF9SZXByKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKCJgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnZhbHVlKQorICAgICAgICBzZWxmLndyaXRlKCJgIikKKwogICAgIGRlZiBfTnVtKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKHJlcHIodC5uKSkKIApAQCAtMTY3LDYgKzMwMSwzNyBAQAogICAgICAgICAgICAgc2VsZi53cml0ZSgiLCAiKQogICAgICAgICBzZWxmLndyaXRlKCJdIikKIAorICAgIGRlZiBfTGlzdENvbXAoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIlsiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuZWx0KQorICAgICAgICBmb3IgZ2VuIGluIHQuZ2VuZXJhdG9yczoKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2goZ2VuKQorICAgICAgICBzZWxmLndyaXRlKCJdIikKKworICAgIGRlZiBfR2VuZXJhdG9yRXhwKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKCIoIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LmVsdCkKKyAgICAgICAgZm9yIGdlbiBpbiB0LmdlbmVyYXRvcnM6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGdlbikKKyAgICAgICAgc2VsZi53cml0ZSgiKSIpCisKKyAgICBkZWYgX2NvbXByZWhlbnNpb24oc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIiBmb3IgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRhcmdldCkKKyAgICAgICAgc2VsZi53cml0ZSgiIGluICIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5pdGVyKQorICAgICAgICBmb3IgaWZfY2xhdXNlIGluIHQuaWZzOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGlmICIpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGlmX2NsYXVzZSkKKworICAgIGRlZiBfSWZFeHAoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZGlzcGF0Y2godC5ib2R5KQorICAgICAgICBzZWxmLndyaXRlKCIgaWYgIikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnRlc3QpCisgICAgICAgIGlmIHQub3JlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiIGVsc2UgIikKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5vcmVsc2UpCisKICAgICBkZWYgX0RpY3Qoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUoInsiKQogICAgICAgICBmb3Igayx2IGluIHppcCh0LmtleXMsIHQudmFsdWVzKToKQEAgLTE5NCw4ICszNTksOCBAQAogICAgICAgICBzZWxmLndyaXRlKCIpIikKIAogICAgIGJpbm9wID0geyAiQWRkIjoiKyIsICJTdWIiOiItIiwgIk11bHQiOiIqIiwgIkRpdiI6Ii8iLCAiTW9kIjoiJSIsCi0gICAgICAgICAgICAgICAgICAgICJSU2hpZnQiOiI8PCIsICJCaXRPciI6InwiLCAiQml0WG9yIjoiXiIsICJCaXRBbmQiOiImIiwKLSAgICAgICAgICAgICAgICAgICAgIkZsb29yRGl2IjoiLy8ifQorICAgICAgICAgICAgICAgICAgICAiTFNoaWZ0IjoiPj4iLCAiUlNoaWZ0IjoiPDwiLCAiQml0T3IiOiJ8IiwgIkJpdFhvciI6Il4iLCAiQml0QW5kIjoiJiIsCisgICAgICAgICAgICAgICAgICAgICJGbG9vckRpdiI6Ii8vIiwgIlBvdyI6ICIqKiJ9CiAgICAgZGVmIF9CaW5PcChzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSgiKCIpCiAgICAgICAgIHNlbGYuZGlzcGF0Y2godC5sZWZ0KQpAQCAtMjEzLDYgKzM3OCwxNSBAQAogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChlKQogICAgICAgICAgICAgc2VsZi53cml0ZSgiKSIpCiAKKyAgICBib29sb3BzID0ge19hc3QuQW5kOiAnYW5kJywgX2FzdC5PcjogJ29yJ30KKyAgICBkZWYgX0Jvb2xPcChzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiKCIpCisgICAgICAgIHNlbGYuZGlzcGF0Y2godC52YWx1ZXNbMF0pCisgICAgICAgIGZvciB2IGluIHQudmFsdWVzWzE6XToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiAlcyAiICUgc2VsZi5ib29sb3BzW3Qub3AuX19jbGFzc19fXSkKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2godikKKyAgICAgICAgc2VsZi53cml0ZSgiKSIpCisKICAgICBkZWYgX0F0dHJpYnV0ZShzZWxmLHQpOgogICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAgICAgICAgIHNlbGYud3JpdGUoIi4iKQpAQCAtMjM0LDEyICs0MDgsMTIgQEAKICAgICAgICAgICAgIGlmIGNvbW1hOiBzZWxmLndyaXRlKCIsICIpCiAgICAgICAgICAgICBlbHNlOiBjb21tYSA9IFRydWUKICAgICAgICAgICAgIHNlbGYud3JpdGUoIioiKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0YXJhcmcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQuc3RhcmFyZ3MpCiAgICAgICAgIGlmIHQua3dhcmdzOgogICAgICAgICAgICAgaWYgY29tbWE6IHNlbGYud3JpdGUoIiwgIikKICAgICAgICAgICAgIGVsc2U6IGNvbW1hID0gVHJ1ZQogICAgICAgICAgICAgc2VsZi53cml0ZSgiKioiKQotICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0YXJhcmcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKHQua3dhcmdzKQogICAgICAgICBzZWxmLndyaXRlKCIpIikKIAogICAgIGRlZiBfU3Vic2NyaXB0KHNlbGYsIHQpOgpAQCAtMjQ5LDYgKzQyMyw5IEBACiAgICAgICAgIHNlbGYud3JpdGUoIl0iKQogCiAgICAgIyBzbGljZQorICAgIGRlZiBfRWxsaXBzaXMoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoIi4uLiIpCisKICAgICBkZWYgX0luZGV4KHNlbGYsIHQpOgogICAgICAgICBzZWxmLmRpc3BhdGNoKHQudmFsdWUpCiAKQEAgLTI2Miw2ICs0MzksMTIgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGUoIjoiKQogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnN0ZXApCiAKKyAgICBkZWYgX0V4dFNsaWNlKHNlbGYsIHQpOgorICAgICAgICBmb3IgaSwgZCBpbiBlbnVtZXJhdGUodC5kaW1zKToKKyAgICAgICAgICAgIGlmIGkgIT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCc6ICcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGQpCisKICAgICAjIG90aGVycwogICAgIGRlZiBfYXJndW1lbnRzKHNlbGYsIHQpOgogICAgICAgICBmaXJzdCA9IFRydWUKQEAgLTI4MywxMyArNDY2LDUxIEBACiAgICAgICAgIGlmIHQua3dhcmc6CiAgICAgICAgICAgICBpZiBmaXJzdDpmaXJzdCA9IEZhbHNlCiAgICAgICAgICAgICBlbHNlOiBzZWxmLndyaXRlKCIsICIpCi0gICAgICAgICAgICBzZWxmLndyaXRlKCIqKiIrc2VsZi5rd2FyZykKLSAgICAgICAgc2VsZi53cml0ZSgiKSIpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIqKiIrdC5rd2FyZykKIAotZGVmIHJvdW5kdHJpcChmaWxlbmFtZSk6CisgICAgZGVmIF9rZXl3b3JkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLndyaXRlKHQuYXJnKQorICAgICAgICBzZWxmLndyaXRlKCI9IikKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0LnZhbHVlKQorCisgICAgZGVmIF9MYW1iZGEoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImxhbWJkYSAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYXJncykKKyAgICAgICAgc2VsZi53cml0ZSgiOiAiKQorICAgICAgICBzZWxmLmRpc3BhdGNoKHQuYm9keSkKKworZGVmIHJvdW5kdHJpcChmaWxlbmFtZSwgb3V0cHV0PXN5cy5zdGRvdXQpOgogICAgIHNvdXJjZSA9IG9wZW4oZmlsZW5hbWUpLnJlYWQoKQogICAgIHRyZWUgPSBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsICJleGVjIiwgMHg0MDApCi0gICAgVW5wYXJzZXIodHJlZSkKKyAgICBVbnBhcnNlcih0cmVlLCBvdXRwdXQpCisKKworCitkZWYgdGVzdGRpcihhKToKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gW24gZm9yIG4gaW4gb3MubGlzdGRpcihhKSBpZiBuLmVuZHN3aXRoKCcucHknKV0KKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkRpcmVjdG9yeSBub3QgcmVhZGFibGU6ICVzIiAlIGEKKyAgICBlbHNlOgorICAgICAgICBmb3IgbiBpbiBuYW1lczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGEsIG4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBwcmludCAnVGVzdGluZyAlcycgJSBmdWxsbmFtZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcm91bmR0cmlwKGZ1bGxuYW1lLCBvdXRwdXQpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgRmFpbGVkIHRvIGNvbXBpbGUsIGV4Y2VwdGlvbiBpcyAlcycgJSByZXByKGUpCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHRlc3RkaXIoZnVsbG5hbWUpCisKK2RlZiBtYWluKGFyZ3MpOgorICAgIGlmIGFyZ3NbMF0gPT0gJy0tdGVzdGRpcic6CisgICAgICAgIGZvciBhIGluIGFyZ3NbMTpdOgorICAgICAgICAgICAgdGVzdGRpcihhKQorICAgIGVsc2U6CisgICAgICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgICAgICByb3VuZHRyaXAoYSkKIAogaWYgX19uYW1lX189PSdfX21haW5fXyc6Ci0gICAgcm91bmR0cmlwKHN5cy5hcmd2WzFdKQorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvRGVtby9wZGlzdC9tYWtlY2hhbmdlbG9nLnB5IGIvRGVtby9wZGlzdC9tYWtlY2hhbmdlbG9nLnB5CmluZGV4IGIyNmYzMGIuLjFmZmE1ODggMTAwNzU1Ci0tLSBhL0RlbW8vcGRpc3QvbWFrZWNoYW5nZWxvZy5weQorKysgYi9EZW1vL3BkaXN0L21ha2VjaGFuZ2Vsb2cucHkKQEAgLTYsNyArNiw3IEBACiAKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBpbXBvcnQgZ2V0b3B0CiBpbXBvcnQgdGltZQogCkBAIC0zNSw5ICszNSw5IEBACiAgICAgZm9yIHJldiBpbiBhbGxyZXZzOgogICAgICAgICBmb3JtYXRyZXYocmV2LCBwcmVmaXgpCiAKLXBhcnNlZGF0ZXByb2cgPSByZWdleC5jb21waWxlKAotICAgICdeZGF0ZTogXChbMC05XStcKS9cKFswLTldK1wpL1woWzAtOV0rXCkgJyArCi0gICAgJ1woWzAtOV0rXCk6XChbMC05XStcKTpcKFswLTldK1wpOyAgYXV0aG9yOiBcKFteIDtdK1wpJykKK3BhcnNlZGF0ZXByb2cgPSByZS5jb21waWxlKAorICAgICdeZGF0ZTogKFswLTldKykvKFswLTldKykvKFswLTldKykgJyArCisgICAgJyhbMC05XSspOihbMC05XSspOihbMC05XSspOyAgYXV0aG9yOiAoW14gO10rKScpCiAKIGF1dGhvcm1hcCA9IHsKICAgICAnZ3VpZG8nOiAnR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPicsCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIHByaW50CiAgICAgICAgIHByaW50CiAKLXN0YXJ0cHJvZyA9IHJlZ2V4LmNvbXBpbGUoIl5Xb3JraW5nIGZpbGU6IFwoLipcKSQiKQorc3RhcnRwcm9nID0gcmUuY29tcGlsZSgiXldvcmtpbmcgZmlsZTogKC4qKSQiKQogCiBkZWYgZ2V0bmV4dGZpbGUoZik6CiAgICAgd2hpbGUgMToKZGlmZiAtLWdpdCBhL0RlbW8vcGRpc3QvcmNzYnVtcCBiL0RlbW8vcGRpc3QvcmNzYnVtcAppbmRleCBlNGU5ZWQ1Li40ZmEwNzhlIDEwMDc1NQotLS0gYS9EZW1vL3BkaXN0L3Jjc2J1bXAKKysrIGIvRGVtby9wZGlzdC9yY3NidW1wCkBAIC02LDEyICs2LDEyIEBACiAjIFB5dGhvbiBzY3JpcHQgZm9yIGJ1bXBpbmcgdXAgYW4gUkNTIG1ham9yIHJldmlzaW9uIG51bWJlci4KIAogaW1wb3J0IHN5cwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGltcG9ydCByY3NsaWIKIGltcG9ydCBzdHJpbmcKIAogV0lUSExPQ0sgPSAxCi1tYWpvcnJldl9yZSA9IHJlZ2V4LmNvbXBpbGUoJ15bMC05XSsnKQorbWFqb3JyZXZfcmUgPSByZS5jb21waWxlKCdeWzAtOV0rJykKIAogZGlyID0gcmNzbGliLlJDUygpCiAKZGlmZiAtLWdpdCBhL0RlbW8vcGRpc3QvcmNzbGliLnB5IGIvRGVtby9wZGlzdC9yY3NsaWIucHkKaW5kZXggZDVmN2I2NS4uM2U2Mzg2OSAxMDA3NTUKLS0tIGEvRGVtby9wZGlzdC9yY3NsaWIucHkKKysrIGIvRGVtby9wZGlzdC9yY3NsaWIucHkKQEAgLTgsNyArOCw3IEBACiAKIGltcG9ydCBmbm1hdGNoCiBpbXBvcnQgb3MKLWltcG9ydCByZWdzdWIKK2ltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IHRlbXBmaWxlCiAKQEAgLTE1MCw3ICsxNTAsNyBAQAogICAgICAgICAgICAgY21kID0gJ2NpICVzJXMgLXQlcyAlcyAlcycgJSBcCiAgICAgICAgICAgICAgICAgICAobG9ja2ZsYWcsIHJldiwgZi5uYW1lLCBvdGhlcmZsYWdzLCBuYW1lKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgbWVzc2FnZSA9IHJlZ3N1Yi5nc3ViKCdcKFtcXCIkYF1cKScsICdcXFxcXFwxJywgbWVzc2FnZSkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSByZS5zdWIocicoW1wiJGBdKScsIHInXFxcMScsIG1lc3NhZ2UpCiAgICAgICAgICAgICBjbWQgPSAnY2kgJXMlcyAtbSIlcyIgJXMgJXMnICUgXAogICAgICAgICAgICAgICAgICAgKGxvY2tmbGFnLCByZXYsIG1lc3NhZ2UsIG90aGVyZmxhZ3MsIG5hbWUpCiAgICAgICAgIHJldHVybiBzZWxmLl9zeXN0ZW0oY21kKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL2VxZml4LnB5IGIvRGVtby9zY3JpcHRzL2VxZml4LnB5CmluZGV4IDE2NWNhNDkuLjM1YzQzYWEgMTAwNzU1Ci0tLSBhL0RlbW8vc2NyaXB0cy9lcWZpeC5weQorKysgYi9EZW1vL3NjcmlwdHMvZXFmaXgucHkKQEAgLTI5LDcgKzI5LDcgQEAKICMgaW50byBhIHByb2dyYW0gZm9yIGEgZGlmZmVyZW50IGNoYW5nZSB0byBQeXRob24gcHJvZ3JhbXMuLi4KIAogaW1wb3J0IHN5cwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGltcG9ydCBvcwogZnJvbSBzdGF0IGltcG9ydCAqCiBpbXBvcnQgc3RyaW5nCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICBpZiBmaXgoYXJnKTogYmFkID0gMQogICAgIHN5cy5leGl0KGJhZCkKIAotaXNweXRob25wcm9nID0gcmVnZXguY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCitpc3B5dGhvbnByb2cgPSByZS5jb21waWxlKCdeW2EtekEtWjAtOV9dK1wucHkkJykKIGRlZiBpc3B5dGhvbihuYW1lKToKICAgICByZXR1cm4gaXNweXRob25wcm9nLm1hdGNoKG5hbWUpID49IDAKIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIGlmIGxpbmVubyA9PSAxIGFuZCBnIGlzIE5vbmUgYW5kIGxpbmVbOjJdID09ICcjISc6CiAgICAgICAgICAgICAjIENoZWNrIGZvciBub24tUHl0aG9uIHNjcmlwdHMKICAgICAgICAgICAgIHdvcmRzID0gc3RyaW5nLnNwbGl0KGxpbmVbMjpdKQotICAgICAgICAgICAgaWYgd29yZHMgYW5kIHJlZ2V4LnNlYXJjaCgnW3BQXXl0aG9uJywgd29yZHNbMF0pIDwgMDoKKyAgICAgICAgICAgIGlmIHdvcmRzIGFuZCByZS5zZWFyY2goJ1twUF15dGhvbicsIHdvcmRzWzBdKSA8IDA6CiAgICAgICAgICAgICAgICAgbXNnID0gZmlsZW5hbWUgKyAnOiAnICsgd29yZHNbMF0KICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyAnIHNjcmlwdDsgbm90IGZpeGVkXG4nCiAgICAgICAgICAgICAgICAgZXJyKG1zZykKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9mdHBzdGF0cy5weSBiL0RlbW8vc2NyaXB0cy9mdHBzdGF0cy5weQppbmRleCBiMzdhNThkLi41YzE1OTllIDEwMDc1NQotLS0gYS9EZW1vL3NjcmlwdHMvZnRwc3RhdHMucHkKKysrIGIvRGVtby9zY3JpcHRzL2Z0cHN0YXRzLnB5CkBAIC0xMywxMiArMTMsMTIgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IHN0cmluZwogaW1wb3J0IGdldG9wdAogCi1wYXQgPSAnXlwoW2EtekEtWjAtOSA6XSpcKSFcKC4qXCkhXCguKlwpIVwoWzw+XS4qXCkhXChbMC05XStcKSFcKFswLTldK1wpJCcKLXByb2cgPSByZWdleC5jb21waWxlKHBhdCkKK3BhdCA9ICdeKFthLXpBLVowLTkgOl0qKSEoLiopISguKikhKFs8Pl0uKikhKFswLTldKykhKFswLTldKykkJworcHJvZyA9IHJlLmNvbXBpbGUocGF0KQogCiBkZWYgbWFpbigpOgogICAgIG1heGl0ZW1zID0gMjUKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9tYm94Y29udmVydC5weSBiL0RlbW8vc2NyaXB0cy9tYm94Y29udmVydC5weQppbmRleCA1MDJkNzc0Li44YzQ2MmYzIDEwMDc1NQotLS0gYS9EZW1vL3NjcmlwdHMvbWJveGNvbnZlcnQucHkKKysrIGIvRGVtby9zY3JpcHRzL21ib3hjb252ZXJ0LnB5CkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzdGF0CiBpbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogCiBkZWYgbWFpbigpOgogICAgIGRvZmlsZSA9IG1tZGYKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBpZiBzdHM6CiAgICAgICAgIHN5cy5leGl0KHN0cykKIAotbnVtZXJpYyA9IHJlZ2V4LmNvbXBpbGUoJ1sxLTldWzAtOV0qJykKK251bWVyaWMgPSByZS5jb21waWxlKCdbMS05XVswLTldKicpCiAKIGRlZiBtaChkaXIpOgogICAgIHN0cyA9IDAKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy91cGRhdGUucHkgYi9EZW1vL3NjcmlwdHMvdXBkYXRlLnB5CmluZGV4IDMyYWQ2YzguLmM5MzYwMjYgMTAwNzU1Ci0tLSBhL0RlbW8vc2NyaXB0cy91cGRhdGUucHkKKysrIGIvRGVtby9zY3JpcHRzL3VwZGF0ZS5weQpAQCAtOCwxMCArOCwxMCBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiAKLXBhdCA9ICdeXChbXjogXHRcbl0rXCk6XChbMS05XVswLTldKlwpOicKLXByb2cgPSByZWdleC5jb21waWxlKHBhdCkKK3BhdCA9ICdeKFteOiBcdFxuXSspOihbMS05XVswLTldKik6JworcHJvZyA9IHJlLmNvbXBpbGUocGF0KQogCiBjbGFzcyBGaWxlT2JqOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CmRpZmYgLS1naXQgYS9EZW1vL3NvY2tldHMvbWNhc3QucHkgYi9EZW1vL3NvY2tldHMvbWNhc3QucHkKaW5kZXggMTIyZGFkNy4uMWFiZDMwNSAxMDA3NTUKLS0tIGEvRGVtby9zb2NrZXRzL21jYXN0LnB5CisrKyBiL0RlbW8vc29ja2V0cy9tY2FzdC5weQpAQCAtMTMsNyArMTMsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKLWltcG9ydCByZWdzdWIKIGZyb20gc29ja2V0IGltcG9ydCAqCiAKIApkaWZmIC0tZ2l0IGEvRGVtby90aXgvZ3JpZC5weSBiL0RlbW8vdGl4L2dyaWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL0RlbW8vdGl4L2dyaWQucHkKQEAgLTAsMCArMSwyOCBAQAorIyMjCitpbXBvcnQgVGl4IGFzIHRrCitmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisKK3I9IHRrLlRrKCkKK3IudGl0bGUoInRlc3QiKQorCitsPXRrLkxhYmVsKHIsIG5hbWU9ImFfbGFiZWwiKQorbC5wYWNrKCkKKworY2xhc3MgTXlHcmlkKHRrLkdyaWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBrd2FyZ3NbJ2VkaXRub3RpZnknXT0gc2VsZi5lZGl0bm90aWZ5CisgICAgICAgIHRrLkdyaWQuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBlZGl0bm90aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCitnID0gTXlHcmlkKHIsIG5hbWU9ImFfZ3JpZCIsCitzZWxlY3R1bml0PSJjZWxsIikKK2cucGFjayhmaWxsPXRrLkJPVEgpCitmb3IgeCBpbiB4cmFuZ2UoNSk6CisgICAgZm9yIHkgaW4geHJhbmdlKDUpOgorICAgICAgICBnLnNldCh4LHksdGV4dD1zdHIoKHgseSkpKQorCitjID0gdGsuQnV0dG9uKHIsIHRleHQ9IkNsb3NlIiwgY29tbWFuZD1yLmRlc3Ryb3kpCitjLnBhY2soKQorCit0ay5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vTWFuUGFnZS5weSBiL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CmluZGV4IDkxMTk2MWUuLjIyMWFmODggMTAwNzU1Ci0tLSBhL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby9NYW5QYWdlLnB5CkBAIC0xLDYgKzEsNiBAQAogIyBXaWRnZXQgdG8gZGlzcGxheSBhIG1hbiBwYWdlCiAKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBmcm9tIFRraW50ZXIgaW1wb3J0ICoKIGZyb20gVGtpbnRlciBpbXBvcnQgX3RraW50ZXIKIGZyb20gU2Nyb2xsZWRUZXh0IGltcG9ydCBTY3JvbGxlZFRleHQKQEAgLTExLDEwICsxMSwxMCBAQAogCiAjIFhYWCBSZWNvZ25pemluZyBmb290ZXJzIGlzIHN5c3RlbSBkZXBlbmRlbnQKICMgKFRoaXMgb25lIHdvcmtzIGZvciBJUklYIDUuMiBhbmQgU29sYXJpcyAyLjIpCi1mb290ZXJwcm9nID0gcmVnZXguY29tcGlsZSgKK2Zvb3RlcnByb2cgPSByZS5jb21waWxlKAogICAgICAgICAnXiAgICAgUGFnZSBbMS05XVswLTldKlsgXHRdK1x8Xi4qTGFzdCBjaGFuZ2U6LipbMS05XVswLTldKlxuJykKLWVtcHR5cHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bIFx0XSpcbicpCi11bHByb2cgPSByZWdleC5jb21waWxlKCdeWyBcdF0qW1h2IV9dW1h2IV8gXHRdKlxuJykKK2VtcHR5cHJvZyA9IHJlLmNvbXBpbGUoJ15bIFx0XSpcbicpCit1bHByb2cgPSByZS5jb21waWxlKCdeWyBcdF0qW1h2IV9dW1h2IV8gXHRdKlxuJykKIAogIyBCYXNpYyBNYW4gUGFnZSBjbGFzcyAtLSBkb2VzIG5vdCBkaXNhYmxlIGVkaXRpbmcKIGNsYXNzIEVkaXRhYmxlTWFuUGFnZShTY3JvbGxlZFRleHQpOgpkaWZmIC0tZ2l0IGEvRGVtby90a2ludGVyL2d1aWRvL21ib3gucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQppbmRleCA5YjE2ZjZiLi4zYzM2ZDg4IDEwMDc1NQotLS0gYS9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQorKysgYi9EZW1vL3RraW50ZXIvZ3VpZG8vbWJveC5weQpAQCAtNCw3ICs0LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IGdldG9wdAogaW1wb3J0IHN0cmluZwogaW1wb3J0IG1obGliCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBzY2FubWVudS51bnBvc3QoKQogICAgIHNjYW5tZW51Lmludm9rZSgnYWN0aXZlJykKIAotc2NhbnBhcnNlciA9IHJlZ2V4LmNvbXBpbGUoJ14gKlwoWzAtOV0rXCknKQorc2NhbnBhcnNlciA9IHJlLmNvbXBpbGUoJ14gKihbMC05XSspJykKIAogZGVmIG9wZW5fZm9sZGVyKGU9Tm9uZSk6CiAgICAgZ2xvYmFsIGZvbGRlciwgbWhmCmRpZmYgLS1naXQgYS9EZW1vL3RraW50ZXIvZ3VpZG8vdGttYW4ucHkgYi9EZW1vL3RraW50ZXIvZ3VpZG8vdGttYW4ucHkKaW5kZXggMTFkOTY5MC4uNmIwYjY0MSAxMDA3NTUKLS0tIGEvRGVtby90a2ludGVyL2d1aWRvL3RrbWFuLnB5CisrKyBiL0RlbW8vdGtpbnRlci9ndWlkby90a21hbi5weQpAQCAtNSw3ICs1LDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHN0cmluZwotaW1wb3J0IHJlZ2V4CitpbXBvcnQgcmUKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogZnJvbSBNYW5QYWdlIGltcG9ydCBNYW5QYWdlCiAKQEAgLTIwOCwxNSArMjA4LDE1IEBACiAgICAgICAgICAgICBwcmludCAnRW1wdHkgc2VhcmNoIHN0cmluZycKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBub3Qgc2VsZi5jYXNldmFyLmdldCgpOgotICAgICAgICAgICAgbWFwID0gcmVnZXguY2FzZWZvbGQKKyAgICAgICAgICAgIG1hcCA9IHJlLklHTk9SRUNBU0UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1hcCA9IE5vbmUKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgbWFwOgotICAgICAgICAgICAgICAgIHByb2cgPSByZWdleC5jb21waWxlKHNlYXJjaCwgbWFwKQorICAgICAgICAgICAgICAgIHByb2cgPSByZS5jb21waWxlKHNlYXJjaCwgbWFwKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShzZWFyY2gpCi0gICAgICAgIGV4Y2VwdCByZWdleC5lcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHByb2cgPSByZS5jb21waWxlKHNlYXJjaCkKKyAgICAgICAgZXhjZXB0IHJlLmVycm9yLCBtc2c6CiAgICAgICAgICAgICBzZWxmLmZyYW1lLmJlbGwoKQogICAgICAgICAgICAgcHJpbnQgJ1JlZ2V4IGVycm9yOicsIG1zZwogICAgICAgICAgICAgcmV0dXJuCmRpZmYgLS1naXQgYS9Eb2MvTWFrZWZpbGUuZGVwcyBiL0RvYy9NYWtlZmlsZS5kZXBzCmluZGV4IDgzMjQwMmQuLjIwYzA2ODggMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZS5kZXBzCisrKyBiL0RvYy9NYWtlZmlsZS5kZXBzCkBAIC0xMjYsNiArMTI2LDcgQEAKIAlsaWIvbGlid2FybmluZ3MudGV4IFwKIAlsaWIvbGliaW1wLnRleCBcCiAJbGliL2xpYnppcGltcG9ydC50ZXggXAorCWxpYi9saWJydW5weS50ZXggXAogCWxpYi9saWJwa2d1dGlsLnRleCBcCiAJbGliL2xpYnBhcnNlci50ZXggXAogCWxpYi9saWJibHRpbi50ZXggXApkaWZmIC0tZ2l0IGEvRG9jL2FwaS9jb25jcmV0ZS50ZXggYi9Eb2MvYXBpL2NvbmNyZXRlLnRleAppbmRleCA1NTIxYjgwLi4xOTgyYmFlIDEwMDY0NAotLS0gYS9Eb2MvYXBpL2NvbmNyZXRlLnRleAorKysgYi9Eb2MvYXBpL2NvbmNyZXRlLnRleApAQCAtMTU2LDcgKzE1Niw3IEBACiAgIENyZWF0ZSBhIG5ldyBpbnRlZ2VyIG9iamVjdCB3aXRoIGEgdmFsdWUgb2YgXHZhcntpdmFsfS4KIAogICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBrZWVwcyBhbiBhcnJheSBvZiBpbnRlZ2VyIG9iamVjdHMgZm9yIGFsbAotICBpbnRlZ2VycyBiZXR3ZWVuIFxjb2Rley0xfSBhbmQgXGNvZGV7MTAwfSwgd2hlbiB5b3UgY3JlYXRlIGFuIGludCBpbgorICBpbnRlZ2VycyBiZXR3ZWVuIFxjb2Rley01fSBhbmQgXGNvZGV7MjU2fSwgd2hlbiB5b3UgY3JlYXRlIGFuIGludCBpbgogICB0aGF0IHJhbmdlIHlvdSBhY3R1YWxseSBqdXN0IGdldCBiYWNrIGEgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZwogICBvYmplY3QuIFNvIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIFxjb2RlezF9LiAgSQogICBzdXNwZWN0IHRoZSBiZWhhdmlvdXIgb2YgUHl0aG9uIGluIHRoaXMgY2FzZSBpcyB1bmRlZmluZWQuIDotKQpAQCAtMzMzLDcgKzMzMyw5IEBACiAgIFRoZSBwb2ludGVyIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0aW5nIHZhbHVlIHVzaW5nCiAgIFxjZnVuY3Rpb257UHlMb25nX0FzVm9pZFB0cigpfS4KICAgXHZlcnNpb25hZGRlZHsxLjUuMn0KLVxlbmR7Y2Z1bmNkZXNjfQorICBcdmVyc2lvbmNoYW5nZWRbSWYgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gTE9OR19NQVgsCisgIGEgcG9zaXRpdmUgbG9uZyBpbnRlZ2VyIGlzIHJldHVybmVkXXsyLjV9CisgXGVuZHtjZnVuY2Rlc2N9CiAKIFxiZWdpbntjZnVuY2Rlc2N9e2xvbmd9e1B5TG9uZ19Bc0xvbmd9e1B5T2JqZWN0ICpweWxvbmd9CiAgIFJldHVybiBhIEMgXGN0eXBle2xvbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50cyBvZgpAQCAtMzk0LDYgKzM5Niw4IEBACiAgIHByb2R1Y2UgYSB1c2FibGUgXGN0eXBle3ZvaWR9IHBvaW50ZXIgZm9yIHZhbHVlcyBjcmVhdGVkIHdpdGgKICAgXGNmdW5jdGlvbntQeUxvbmdfRnJvbVZvaWRQdHIoKX0uCiAgIFx2ZXJzaW9uYWRkZWR7MS41LjJ9CisgIFx2ZXJzaW9uY2hhbmdlZFtGb3IgdmFsdWVzIG91dHNpZGUgMC4uTE9OR19NQVgsIGJvdGggc2lnbmVkIGFuZAorICB1bnNpZ25lZCBpbnRlZ2VycyBhcmUgYWNjY2VwdGVkXXsyLjV9CiBcZW5ke2NmdW5jZGVzY30KIAogCkBAIC0xODAzLDggKzE4MDcsOSBAQAogCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5TGlzdF9HZXRJdGVtfXtQeU9iamVjdCAqbGlzdCwgUHlfc3NpemVfdCBpbmRleH0KICAgUmV0dXJuIHRoZSBvYmplY3QgYXQgcG9zaXRpb24gXHZhcntwb3N9IGluIHRoZSBsaXN0IHBvaW50ZWQgdG8gYnkKLSAgXHZhcntwfS4gIElmIFx2YXJ7cG9zfSBpcyBvdXQgb2YgYm91bmRzLCByZXR1cm4gXE5VTEx7fSBhbmQgc2V0IGFuCi0gIFxleGNlcHRpb257SW5kZXhFcnJvcn0gZXhjZXB0aW9uLgorICBcdmFye3B9LiAgVGhlIHBvc2l0aW9uIG11c3QgYmUgcG9zaXRpdmUsIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUKKyAgbGlzdCBpcyBub3Qgc3VwcG9ydGVkLiAgSWYgXHZhcntwb3N9IGlzIG91dCBvZiBib3VuZHMsIHJldHVybiBcTlVMTHt9CisgIGFuZCBzZXQgYW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfSBleGNlcHRpb24uCiBcZW5ke2NmdW5jZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUxpc3RfR0VUX0lURU19e1B5T2JqZWN0ICpsaXN0LCBQeV9zc2l6ZV90IGl9CkBAIC0yMjY0LDggKzIyNjksOCBAQAogXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeUZ1bmN0aW9uX05ld317UHlPYmplY3QgKmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZ2xvYmFsc30KICAgUmV0dXJuIGEgbmV3IGZ1bmN0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZGUgb2JqZWN0Ci0gIFx2YXJ7Y29kZX0uIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgdGhlIGdsb2JhbAotICB2YXJhaWJsZXMgYWNjZXNzaWJsZSB0byB0aGUgZnVuY3Rpb24uCisgIFx2YXJ7Y29kZX0uIFx2YXJ7Z2xvYmFsc30gbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgZ2xvYmFsCisgIHZhcmlhYmxlcyBhY2Nlc3NpYmxlIHRvIHRoZSBmdW5jdGlvbi4KIAogICBUaGUgZnVuY3Rpb24ncyBkb2NzdHJpbmcsIG5hbWUgYW5kIFx2YXJ7X19tb2R1bGVfX30gYXJlIHJldHJpZXZlZAogICBmcm9tIHRoZSBjb2RlIG9iamVjdCwgdGhlIGFyZ3VtZW50IGRlZmF1bHRzIGFuZCBjbG9zdXJlIGFyZSBzZXQgdG8KQEAgLTI4MTEsNiArMjgxNiw3IEBACiAKIFxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlHZW5fTmV3fXtQeUZyYW1lT2JqZWN0ICpmcmFtZX0KICAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgZ2VuZXJhdG9yIG9iamVjdCBiYXNlZCBvbiB0aGUgXHZhcntmcmFtZX0gb2JqZWN0LgorICBBIHJlZmVyZW5jZSB0byBcdmFye2ZyYW1lfSBpcyBzdG9sZW4gYnkgdGhpcyBmdW5jdGlvbi4KICAgVGhlIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBcTlVMTHt9LgogXGVuZHtjZnVuY2Rlc2N9CiAKQEAgLTMwMjUsOSArMzAzMSw3IEBACiBcY2Z1bmN0aW9ue1B5TnVtYmVyX09yKCl9LCBcY2Z1bmN0aW9ue1B5TnVtYmVyX1hvcigpfSwKIFxjZnVuY3Rpb257UHlOdW1iZXJfSW5QbGFjZUFkZCgpfSwgXGNmdW5jdGlvbntQeU51bWJlcl9JblBsYWNlU3VidHJhY3QoKX0sCiBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VPcigpfSwgYW5kIFxjZnVuY3Rpb257UHlOdW1iZXJfSW5QbGFjZVhvcigpfSkuCi1Ob3RlLCBcY2Z1bmN0aW9ue1B5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdCgpfSBpcyBhbHNvIHVzZWZ1bCBjbGVhcmluZwotY2xlYXJpbmcgYSBzZXQgKFxjb2Rle3MtPXN9KS4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgCisKIFxiZWdpbntjdHlwZWRlc2N9e1B5U2V0T2JqZWN0fQogICBUaGlzIHN1YnR5cGUgb2YgXGN0eXBle1B5T2JqZWN0fSBpcyB1c2VkIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGEgZm9yCiAgIGJvdGggXGNsYXNze3NldH0gYW5kIFxjbGFzc3tmcm96ZW5zZXR9IG9iamVjdHMuICBJdCBpcyBsaWtlIGEKQEAgLTMxMTEsNyArMzExNSw2IEBACiAgIFxjbGFzc3tmcm96ZW5zZXR9LCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgIAogXGVuZHtjZnVuY2Rlc2N9CiAKLQogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5zdGFuY2VzIG9mIFxjbGFzc3tzZXR9IG9yCiBpdHMgc3VidHlwZXMgYnV0IG5vdCBmb3IgaW5zdGFuY2VzIG9mIFxjbGFzc3tmcm96ZW5zZXR9IG9yIGl0cyBzdWJ0eXBlcy4KIApAQCAtMzE0Miw0ICszMTQ1LDYgQEAKICAgb2YgXGNsYXNze3NldH0gb3IgaXRzIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgCiBcZW5ke2NmdW5jZGVzY30KIAotCitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5U2V0X0NsZWFyfXtQeU9iamVjdCAqc2V0fQorICBFbXB0eSBhbiBleGlzdGluZyBzZXQgb2YgYWxsIGVsZW1lbnRzLgorXGVuZHtjZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2ludHJvLnRleCBiL0RvYy9hcGkvaW50cm8udGV4CmluZGV4IDYwOGQ1NjIuLjk2ZjE4ZWMgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvaW50cm8udGV4CisrKyBiL0RvYy9hcGkvaW50cm8udGV4CkBAIC01NjksOCArNTY5LDExIEBACiBTb21ldGltZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBgYHVuaW5pdGlhbGl6ZScnIFB5dGhvbi4gIEZvciBpbnN0YW5jZSwgCiB0aGUgYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gc3RhcnQgb3ZlciAobWFrZSBhbm90aGVyIGNhbGwgdG8gCiBcY2Z1bmN0aW9ue1B5X0luaXRpYWxpemUoKX0pIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAKLXVzZSBvZiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgUHl0aG9uLiAgVGhpcwordXNlIG9mIFB5dGhvbiBhbmQgd2FudHMgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFB5dGhvbi4gIFRoaXMKIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgY2FsbGluZyBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplKCl9LiAgVGhlIGZ1bmN0aW9uCiBcY2Z1bmN0aW9ue1B5X0lzSW5pdGlhbGl6ZWQoKX1cdHRpbmRleHtQeV9Jc0luaXRpYWxpemVkKCl9IHJldHVybnMKIHRydWUgaWYgUHl0aG9uIGlzIGN1cnJlbnRseSBpbiB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUuICBNb3JlCiBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLgorTm90aWNlIHRoYXQgXGNmdW5jdGlvbntQeV9GaW5hbGl6ZX0gZG9lcyBcZW1waHtub3R9IGZyZWUgYWxsIG1lbW9yeQorYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGUuZy4gbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24KK21vZHVsZXMgY3VycmVudGx5IGNhbm5vdCBiZSByZWxlYXNlZC4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvbWVtb3J5LnRleCBiL0RvYy9hcGkvbWVtb3J5LnRleAppbmRleCAzZGJlOWE1Li40YmMyYzdhIDEwMDY0NAotLS0gYS9Eb2MvYXBpL21lbW9yeS50ZXgKKysrIGIvRG9jL2FwaS9tZW1vcnkudGV4CkBAIC0xOTUsOSArMTk1LDcgQEAKIEluIGFkZGl0aW9uIHRvIHRoZSBmdW5jdGlvbnMgYWltZWQgYXQgaGFuZGxpbmcgcmF3IG1lbW9yeSBibG9ja3MgZnJvbQogdGhlIFB5dGhvbiBoZWFwLCBvYmplY3RzIGluIFB5dGhvbiBhcmUgYWxsb2NhdGVkIGFuZCByZWxlYXNlZCB3aXRoCiBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ldygpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9OZXdWYXIoKX0gYW5kCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0RlbCgpfSwgb3Igd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIG1hY3JvcwotXGNmdW5jdGlvbntQeU9iamVjdF9ORVcoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfTkVXX1ZBUigpfSBhbmQKLVxjZnVuY3Rpb257UHlPYmplY3RfREVMKCl9LgorXGNmdW5jdGlvbntQeU9iamVjdF9EZWwoKX0uCiAKIFRoZXNlIHdpbGwgYmUgZXhwbGFpbmVkIGluIHRoZSBuZXh0IGNoYXB0ZXIgb24gZGVmaW5pbmcgYW5kCiBpbXBsZW1lbnRpbmcgbmV3IG9iamVjdCB0eXBlcyBpbiBDLgpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9uZXd0eXBlcy50ZXggYi9Eb2MvYXBpL25ld3R5cGVzLnRleAppbmRleCBiN2UyNWI5Li4yZDc1OGIwIDEwMDY0NAotLS0gYS9Eb2MvYXBpL25ld3R5cGVzLnRleAorKysgYi9Eb2MvYXBpL25ld3R5cGVzLnRleApAQCAtNjIsMjMgKzYyLDYgQEAKICAgYWZ0ZXIgdGhpcyBjYWxsIGFzIHRoZSBtZW1vcnkgaXMgbm8gbG9uZ2VyIGEgdmFsaWQgUHl0aG9uIG9iamVjdC4KIFxlbmR7Y2Z1bmNkZXNjfQogCi1cYmVnaW57Y2Z1bmNkZXNjfXtcdmFye1RZUEV9Kn17UHlPYmplY3RfTkVXfXtUWVBFLCBQeVR5cGVPYmplY3QgKnR5cGV9Ci0gIE1hY3JvIHZlcnNpb24gb2YgXGNmdW5jdGlvbntQeU9iamVjdF9OZXcoKX0sIHRvIGdhaW4gcGVyZm9ybWFuY2UgYXQKLSAgdGhlIGV4cGVuc2Ugb2Ygc2FmZXR5LiAgVGhpcyBkb2VzIG5vdCBjaGVjayBcdmFye3R5cGV9IGZvciBhIFxOVUxMe30KLSAgdmFsdWUuCi1cZW5ke2NmdW5jZGVzY30KLQotXGJlZ2lue2NmdW5jZGVzY317XHZhcntUWVBFfSp9e1B5T2JqZWN0X05FV19WQVJ9e1RZUEUsIFB5VHlwZU9iamVjdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZX0KLSAgTWFjcm8gdmVyc2lvbiBvZiBcY2Z1bmN0aW9ue1B5T2JqZWN0X05ld1ZhcigpfSwgdG8gZ2FpbiBwZXJmb3JtYW5jZQotICBhdCB0aGUgZXhwZW5zZSBvZiBzYWZldHkuICBUaGlzIGRvZXMgbm90IGNoZWNrIFx2YXJ7dHlwZX0gZm9yIGEKLSAgXE5VTEx7fSB2YWx1ZS4KLVxlbmR7Y2Z1bmNkZXNjfQotCi1cYmVnaW57Y2Z1bmNkZXNjfXt2b2lkfXtQeU9iamVjdF9ERUx9e1B5T2JqZWN0ICpvcH0KLSAgTWFjcm8gdmVyc2lvbiBvZiBcY2Z1bmN0aW9ue1B5T2JqZWN0X0RlbCgpfS4KLVxlbmR7Y2Z1bmNkZXNjfQotCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5X0luaXRNb2R1bGV9e2NoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWV0aG9kRGVmICptZXRob2RzfQogICBDcmVhdGUgYSBuZXcgbW9kdWxlIG9iamVjdCBiYXNlZCBvbiBhIG5hbWUgYW5kIHRhYmxlIG9mIGZ1bmN0aW9ucywKZGlmZiAtLWdpdCBhL0RvYy9hcGkvcmVmY291bnRzLmRhdCBiL0RvYy9hcGkvcmVmY291bnRzLmRhdAppbmRleCBmM2JkMzJlLi43YmJhMDExIDEwMDY0NAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2FwaS9yZWZjb3VudHMuZGF0CkBAIC0zMSw2ICszMSw5IEBACiAjIFRoZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBBUEkgbWFudWFsLCBub3QgdGhlIHNvdXJjZQogIyBjb2RlLiAKIAorUHlCb29sX0Zyb21Mb25nOlB5T2JqZWN0Kjo6KzE6CitQeUJvb2xfRnJvbUxvbmc6bG9uZzp2OjA6CisKIFB5QnVmZmVyX0Zyb21PYmplY3Q6UHlPYmplY3QqOjorMToKIFB5QnVmZmVyX0Zyb21PYmplY3Q6UHlPYmplY3QqOmJhc2U6KzE6CiBQeUJ1ZmZlcl9Gcm9tT2JqZWN0OmludDpvZmZzZXQ6OgpAQCAtMTEwLDYgKzExMywzNSBAQAogUHlDb21wbGV4X1JlYWxBc0RvdWJsZTpkb3VibGU6OjoKIFB5Q29tcGxleF9SZWFsQXNEb3VibGU6UHlPYmplY3QqOm9wOjA6CiAKK1B5RGF0ZV9Gcm9tRGF0ZTpQeU9iamVjdCo6OisxOgorUHlEYXRlX0Zyb21EYXRlOmludDp5ZWFyOjoKK1B5RGF0ZV9Gcm9tRGF0ZTppbnQ6bW9udGg6OgorUHlEYXRlX0Zyb21EYXRlOmludDpkYXk6OgorCitQeURhdGVfRnJvbVRpbWVzdGFtcDpQeU9iamVjdCo6OisxOgorUHlEYXRlX0Zyb21UaW1lc3RhbXA6UHlPYmplY3QqOmFyZ3M6MDoKKworUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6UHlPYmplY3QqOjorMToKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDp5ZWFyOjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDptb250aDo6CitQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6ZGF5OjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDpob3VyOjoKK1B5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lOmludDptaW51dGU6OgorUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWU6aW50OnNlY29uZDo6CitQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZTppbnQ6dXNlY29uZDo6CisKK1B5RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcDpQeU9iamVjdCo6OisxOgorUHlEYXRlVGltZV9Gcm9tVGltZXN0YW1wOlB5T2JqZWN0KjphcmdzOjA6CisKK1B5RGVsdGFfRnJvbURTVTpQeU9iamVjdCo6OisxOgorUHlEZWx0YV9Gcm9tRFNVOmludDpkYXlzOjoKK1B5RGVsdGFfRnJvbURTVTppbnQ6c2Vjb25kczo6CitQeURlbHRhX0Zyb21EU1U6aW50OnVzZWNvbmRzOjoKKworUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeU9iamVjdCo6OisxOgorUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeVR5cGVPYmplY3QqOnR5cGU6OgorUHlEZXNjcl9OZXdDbGFzc01ldGhvZDpQeU1ldGhvZERlZio6bWV0aG9kOjoKKwogUHlEZXNjcl9OZXdHZXRTZXQ6UHlPYmplY3QqOjorMToKIFB5RGVzY3JfTmV3R2V0U2V0OlB5VHlwZU9iamVjdCo6dHlwZTo6CiBQeURlc2NyX05ld0dldFNldDpQeUdldFNldERlZio6Z2V0c2V0OjoKQEAgLTIyNiw2ICsyNTgsMTUgQEAKIFB5RXJyX1Jlc3RvcmU6UHlPYmplY3QqOnZhbHVlOi0xOgogUHlFcnJfUmVzdG9yZTpQeU9iamVjdCo6dHJhY2ViYWNrOi0xOgogCitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycjpQeU9iamVjdCo6Om51bGw6CitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycjpQeU9iamVjdCo6dHlwZTowOgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnI6aW50OmllcnI6OgorCitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZTpQeU9iamVjdCo6Om51bGw6CitQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZTpQeU9iamVjdCo6dHlwZTowOgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6aW50OmllcnI6OgorUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWU6Y2hhcio6ZmlsZW5hbWU6OgorCiBQeUVycl9TZXRGcm9tRXJybm86UHlPYmplY3QqOjpudWxsOgogUHlFcnJfU2V0RnJvbUVycm5vOlB5T2JqZWN0Kjp0eXBlOjA6CiAKQEAgLTMzNyw2ICszNzgsMTMgQEAKIFB5RmxvYXRfRnJvbURvdWJsZTpQeU9iamVjdCo6OisxOgogUHlGbG9hdF9Gcm9tRG91YmxlOmRvdWJsZTp2OjoKIAorUHlGbG9hdF9Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6CitQeUZsb2F0X0Zyb21TdHJpbmc6UHlPYmplY3QqOnN0cjowOgorUHlGbG9hdF9Gcm9tU3RyaW5nOmNoYXIqKjpwZW5kOjA6aWdub3JlZAorCitQeUZyb3plblNldF9OZXc6UHlPYmplY3QqOjorMToKK1B5RnJvemVuU2V0X05ldzpQeU9iamVjdCo6aXRlcmFibGU6MDoKKwogUHlGdW5jdGlvbl9HZXRDbG9zdXJlOlB5T2JqZWN0Kjo6MDoKIFB5RnVuY3Rpb25fR2V0Q2xvc3VyZTpQeU9iamVjdCo6b3A6MDoKIApAQCAtMzY0LDYgKzQxMiw5IEBACiBQeUZ1bmN0aW9uX1NldERlZmF1bHRzOlB5T2JqZWN0KjpvcDowOgogUHlGdW5jdGlvbl9TZXREZWZhdWx0czpQeU9iamVjdCo6ZGVmYXVsdHM6KzE6CiAKK1B5R2VuX05ldzpQeU9iamVjdCo6OisxOgorUHlHZW5fTmV3OlB5RnJhbWVPYmplY3QqOmZyYW1lOjA6CisKIFB5X0luaXRNb2R1bGU6UHlPYmplY3QqOjowOgogUHlfSW5pdE1vZHVsZTpjaGFyKjpuYW1lOjoKIFB5X0luaXRNb2R1bGU6UHlNZXRob2REZWZbXTptZXRob2RzOjoKQEAgLTQzMiw2ICs0ODMsMTQgQEAKIFB5SW50X0Zyb21Mb25nOlB5T2JqZWN0Kjo6KzE6CiBQeUludF9Gcm9tTG9uZzpsb25nOml2YWw6OgogCitQeUludF9Gcm9tU3RyaW5nOlB5T2JqZWN0Kjo6KzE6CitQeUludF9Gcm9tU3RyaW5nOmNoYXIqOnN0cjowOgorUHlJbnRfRnJvbVN0cmluZzpjaGFyKio6cGVuZDowOgorUHlJbnRfRnJvbVN0cmluZzppbnQ6YmFzZTowOgorCitQeUludF9Gcm9tU3NpemVfdDpQeU9iamVjdCo6OisxOgorUHlJbnRfRnJvbVNzaXplX3Q6UHlfc3NpemVfdDppdmFsOjoKKwogUHlJbnRfR2V0TWF4Omxvbmc6OjoKIAogUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyOnZvaWQ6OjoKQEAgLTkzOSw2ICs5OTgsMzEgQEAKIFB5UnVuX0ZpbGU6UHlPYmplY3QqOmdsb2JhbHM6MDoKIFB5UnVuX0ZpbGU6UHlPYmplY3QqOmxvY2FsczowOgogCitQeVJ1bl9GaWxlRXg6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKK1B5UnVuX0ZpbGVFeDpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRXg6Y2hhcio6ZmlsZW5hbWU6OgorUHlSdW5fRmlsZUV4OmludDpzdGFydDo6CitQeVJ1bl9GaWxlRXg6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVFeDpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9GaWxlRXg6aW50OmNsb3NlaXQ6OgorCitQeVJ1bl9GaWxlRmxhZ3M6UHlPYmplY3QqOjorMTo/Pz8gLS0gc2FtZSBhcyBldmFsX2NvZGUyKCkKK1B5UnVuX0ZpbGVGbGFnczpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRmxhZ3M6Y2hhcio6ZmlsZW5hbWU6OgorUHlSdW5fRmlsZUZsYWdzOmludDpzdGFydDo6CitQeVJ1bl9GaWxlRmxhZ3M6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9GaWxlRmxhZ3M6UHlDb21waWxlckZsYWdzKjpmbGFnczo6CisKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCitQeVJ1bl9GaWxlRXhGbGFnczpGSUxFKjpmcDo6CitQeVJ1bl9GaWxlRXhGbGFnczpjaGFyKjpmaWxlbmFtZTo6CitQeVJ1bl9GaWxlRXhGbGFnczppbnQ6c3RhcnQ6OgorUHlSdW5fRmlsZUV4RmxhZ3M6UHlPYmplY3QqOmdsb2JhbHM6MDoKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5T2JqZWN0Kjpsb2NhbHM6MDoKK1B5UnVuX0ZpbGVFeEZsYWdzOmludDpjbG9zZWl0OjoKK1B5UnVuX0ZpbGVFeEZsYWdzOlB5Q29tcGlsZXJGbGFncyo6ZmxhZ3M6OgorCiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3A6aW50Ojo6CiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3A6RklMRSo6ZnA6OgogUHlSdW5fSW50ZXJhY3RpdmVMb29wOmNoYXIqOmZpbGVuYW1lOjoKQEAgLTk2MCw2ICsxMDQ0LDEzIEBACiBQeVJ1bl9TdHJpbmc6UHlPYmplY3QqOmdsb2JhbHM6MDoKIFB5UnVuX1N0cmluZzpQeU9iamVjdCo6bG9jYWxzOjA6CiAKK1B5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0Kjo6KzE6Pz8/IC0tIHNhbWUgYXMgZXZhbF9jb2RlMigpCitQeVJ1bl9TdHJpbmdGbGFnczpjaGFyKjpzdHI6OgorUHlSdW5fU3RyaW5nRmxhZ3M6aW50OnN0YXJ0OjoKK1B5UnVuX1N0cmluZ0ZsYWdzOlB5T2JqZWN0KjpnbG9iYWxzOjA6CitQeVJ1bl9TdHJpbmdGbGFnczpQeU9iamVjdCo6bG9jYWxzOjA6CitQeVJ1bl9TdHJpbmdGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKKwogUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6OisxOgogUHlTZXFJdGVyX05ldzpQeU9iamVjdCo6c2VxOjoKIApAQCAtMTA1Myw2ICsxMTQ0LDkgQEAKIFB5U2V0X0Rpc2NhcmQ6UHlPYmplY3QqOnNldDowOgogUHlTZXRfRGlzY2FyZDpQeU9iamVjdCo6a2V5Oi0xOm5vIGVmZmVjdCBpZiBrZXkgbm90IGZvdW5kCiAKK1B5U2V0X05ldzpQeU9iamVjdCo6OisxOgorUHlTZXRfTmV3OlB5T2JqZWN0KjppdGVyYWJsZTowOgorCiBQeVNldF9Qb3A6UHlPYmplY3QqOjowOm9yIHJldHVybnMgTlVMTCBhbmQgcmFpc2VzIEtleUVycm9yIGlmIHNldCBpcyBlbXB0eQogUHlTZXRfUG9wOlB5T2JqZWN0KjpzZXQ6MDoKIApAQCAtMTE2Nyw2ICsxMjYxLDEyIEBACiBQeVRocmVhZFN0YXRlX1N3YXA6UHlUaHJlYWRTdGF0ZSo6OjoKIFB5VGhyZWFkU3RhdGVfU3dhcDpQeVRocmVhZFN0YXRlKjp0c3RhdGU6OgogCitQeVRpbWVfRnJvbVRpbWU6UHlPYmplY3QqOjorMToKK1B5VGltZV9Gcm9tVGltZTppbnQ6aG91cjo6CitQeVRpbWVfRnJvbVRpbWU6aW50Om1pbnV0ZTo6CitQeVRpbWVfRnJvbVRpbWU6aW50OnNlY29uZDo6CitQeVRpbWVfRnJvbVRpbWU6aW50OnVzZWNvbmQ6OgorCiBQeVR1cGxlX0NoZWNrOmludDo6OgogUHlUdXBsZV9DaGVjazpQeU9iamVjdCo6cDowOgogCkBAIC0xMTg2LDYgKzEyODYsMTAgQEAKIFB5VHVwbGVfTmV3OlB5T2JqZWN0Kjo6KzE6CiBQeVR1cGxlX05ldzppbnQ6bGVuOjoKIAorUHlUdXBsZV9QYWNrOlB5T2JqZWN0Kjo6KzE6CitQeVR1cGxlX1BhY2s6aW50Omxlbjo6CitQeVR1cGxlX1BhY2s6UHlPYmplY3QqOi4uLjowOgorCiBQeVR1cGxlX1NFVF9JVEVNOnZvaWQ6OjoKIFB5VHVwbGVfU0VUX0lURU06UHlUdXBsZU9iamVjdCo6cDowOgogUHlUdXBsZV9TRVRfSVRFTTppbnQ6cG9zOjoKQEAgLTEyOTgsNiArMTQwMiwxOSBAQAogUHlVbmljb2RlX0RlY29kZTpjb25zdCBjaGFyKjplbmNvZGluZzo6CiBQeVVuaWNvZGVfRGVjb2RlOmNvbnN0IGNoYXIqOmVycm9yczo6CiAKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOlB5T2JqZWN0Kjo6KzE6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDpjb25zdCBjaGFyKjpzOjoKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOmludDpzaXplOjoKK1B5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsOmNvbnN0IGNoYXIqOmVycm9yczo6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDppbnQqOmJ5dGVvcmRlcjo6CitQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bDppbnQqOmNvbnN1bWVkOjoKKworUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpQeU9iamVjdCo6OisxOgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpjb25zdCBjaGFyKjpzOjoKK1B5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw6aW50OnNpemU6OgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDpjb25zdCBjaGFyKjplcnJvcnM6OgorUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bDppbnQqOmNvbnN1bWVkOjoKKwogUHlVbmljb2RlX0VuY29kZTpQeU9iamVjdCo6OisxOgogUHlVbmljb2RlX0VuY29kZTpjb25zdCBQeV9VTklDT0RFKjpzOjoKIFB5VW5pY29kZV9FbmNvZGU6aW50OnNpemU6OgpAQCAtMTUxMyw2ICsxNjMwLDEyIEBACiBQeV9Db21waWxlU3RyaW5nOmNoYXIqOmZpbGVuYW1lOjoKIFB5X0NvbXBpbGVTdHJpbmc6aW50OnN0YXJ0OjoKIAorUHlfQ29tcGlsZVN0cmluZ0ZsYWdzOlB5T2JqZWN0Kjo6KzE6CitQeV9Db21waWxlU3RyaW5nRmxhZ3M6Y2hhcio6c3RyOjoKK1B5X0NvbXBpbGVTdHJpbmdGbGFnczpjaGFyKjpmaWxlbmFtZTo6CitQeV9Db21waWxlU3RyaW5nRmxhZ3M6aW50OnN0YXJ0OjoKK1B5X0NvbXBpbGVTdHJpbmdGbGFnczpQeUNvbXBpbGVyRmxhZ3MqOmZsYWdzOjoKKwogUHlfREVDUkVGOnZvaWQ6OjoKIFB5X0RFQ1JFRjpQeU9iamVjdCo6bzotMToKIApkaWZmIC0tZ2l0IGEvRG9jL2NvbW1vbnRleC9ib2lsZXJwbGF0ZS50ZXggYi9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleAppbmRleCBiNGM5ZjQ4Li41NWE0MTg0IDEwMDY0NAotLS0gYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleAorKysgYi9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleApAQCAtNSw1ICs1LDUgQEAKIAlFbWFpbDogXGVtYWlse2RvY3NAcHl0aG9uLm9yZ30KIH0KIAotXGRhdGV7XHRvZGF5fQkJCSUgWFhYIHVwZGF0ZSBiZWZvcmUgZmluYWwgcmVsZWFzZSEKK1xkYXRlezV0aCBBcHJpbCAyMDA2fQkJCSUgWFhYIHVwZGF0ZSBiZWZvcmUgZmluYWwgcmVsZWFzZSEKIFxpbnB1dHtwYXRjaGxldmVsfQkJJSBpbmNsdWRlIFB5dGhvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2xpY2Vuc2UudGV4IGIvRG9jL2NvbW1vbnRleC9saWNlbnNlLnRleAppbmRleCA1MjVjZThhLi5kMTU1NGMyIDEwMDY0NAotLS0gYS9Eb2MvY29tbW9udGV4L2xpY2Vuc2UudGV4CisrKyBiL0RvYy9jb21tb250ZXgvbGljZW5zZS50ZXgKQEAgLTQ5LDYgKzQ5LDggQEAKICAgXGxpbmV2ezIuNH17Mi4zfXsyMDA0fXtQU0Z9e3llc30KICAgXGxpbmV2ezIuNC4xfXsyLjR9ezIwMDV9e1BTRn17eWVzfQogICBcbGluZXZ7Mi40LjJ9ezIuNC4xfXsyMDA1fXtQU0Z9e3llc30KKyAgXGxpbmV2ezIuNC4zfXsyLjQuMn17MjAwNn17UFNGfXt5ZXN9CisgIFxsaW5ldnsyLjV9ezIuNH17MjAwNn17UFNGfXt5ZXN9CiBcZW5ke3RhYmxldn0KIAogXG5vdGV7R1BMLWNvbXBhdGlibGUgZG9lc24ndCBtZWFuIHRoYXQgd2UncmUgZGlzdHJpYnV0aW5nCkBAIC00MzAsMjYgKzQzMiw0OSBAQAogVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgXG1vZHVsZXttZDV9IG1vZHVsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG5vdGljZToKIAogXGJlZ2lue3ZlcmJhdGltfQotQ29weXJpZ2h0IChDKSAxOTkxLTIsIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIENyZWF0ZWQgMTk5MS4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuCisgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKLWlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQotb3IgdGhpcyBmdW5jdGlvbi4KKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogCi1MaWNlbnNlIGlzIGFsc28gZ3JhbnRlZCB0byBtYWtlIGFuZCB1c2UgZGVyaXZhdGl2ZSB3b3JrcyBwcm92aWRlZAotdGhhdCBzdWNoIHdvcmtzIGFyZSBpZGVudGlmaWVkIGFzICJkZXJpdmVkIGZyb20gdGhlIFJTQSBEYXRhCi1TZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwKLW1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhlIGRlcml2ZWQgd29yay4KKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogCi1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKLXRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcwotc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgorICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKyAgTC4gUGV0ZXIgRGV1dHNjaAorICBnaG9zdEBhbGFkZGluLmNvbQorCisgIEluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIE1ENSAoUkZDIDEzMjEpLgorCisgIFRoaXMgY29kZSBpbXBsZW1lbnRzIHRoZSBNRDUgQWxnb3JpdGhtIGRlZmluZWQgaW4gUkZDIDEzMjEsIHdob3NlCisgIHRleHQgaXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTMyMS50eHQKKyAgVGhlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBSRkMsIGluY2x1ZGluZyB0aGUgdGVzdCBzdWl0ZQorICAoc2VjdGlvbiBBLjUpIGJ1dCBleGNsdWRpbmcgdGhlIHJlc3Qgb2YgQXBwZW5kaXggQS4gIEl0IGRvZXMgbm90IGluY2x1ZGUKKyAgYW55IGNvZGUgb3IgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGlkZW50aWZpZWQgaW4gdGhlIFJGQyBhcyBiZWluZworICBjb3B5cmlnaHRlZC4KKworICBUaGUgb3JpZ2luYWwgYW5kIHByaW5jaXBhbCBhdXRob3Igb2YgbWQ1LmggaXMgTC4gUGV0ZXIgRGV1dHNjaAorICA8Z2hvc3RAYWxhZGRpbi5jb20+LiAgT3RoZXIgYXV0aG9ycyBhcmUgbm90ZWQgaW4gdGhlIGNoYW5nZSBoaXN0b3J5CisgIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKKworICAyMDAyLTA0LTEzIGxwZCBSZW1vdmVkIHN1cHBvcnQgZm9yIG5vbi1BTlNJIGNvbXBpbGVyczsgcmVtb3ZlZAorCXJlZmVyZW5jZXMgdG8gR2hvc3RzY3JpcHQ7IGNsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7CisJbm93IGhhbmRsZXMgYnl0ZSBvcmRlciBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseS4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSk7CisJYWRkZWQgY29uZGl0aW9uYWxpemF0aW9uIGZvciBDKysgY29tcGlsYXRpb24gZnJvbSBNYXJ0aW4KKwlQdXJzY2hrZSA8cHVyc2Noa2VAYm5sLmdvdj4uCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCiBcZW5ke3ZlcmJhdGltfQogCiAKZGlmZiAtLWdpdCBhL0RvYy9kaXN0L2Rpc3QudGV4IGIvRG9jL2Rpc3QvZGlzdC50ZXgKaW5kZXggZDZkZGFkOC4uM2JhNTFkMCAxMDA2NDQKLS0tIGEvRG9jL2Rpc3QvZGlzdC50ZXgKKysrIGIvRG9jL2Rpc3QvZGlzdC50ZXgKQEAgLTE0NjcsNyArMTQ2Nyw3IEBACiAgIFxsaW5laWl7XCVkZXNjcmlwdGlvbiAoc2VjdGlvbil9e1xvcHRpb257bG9uZ1xfZGVzY3JpcHRpb259fQogXGVuZHt0YWJsZWlpfQogCi1BZGRpdGlvbmFsbHksIHRoZXJlIG1hbnkgb3B0aW9ucyBpbiBcZmlsZXsuc3BlY30gZmlsZXMgdGhhdCBkb24ndCBoYXZlCitBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSBtYW55IG9wdGlvbnMgaW4gXGZpbGV7LnNwZWN9IGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZQogY29ycmVzcG9uZGluZyBvcHRpb25zIGluIHRoZSBzZXR1cCBzY3JpcHQuICBNb3N0IG9mIHRoZXNlIGFyZSBoYW5kbGVkCiB0aHJvdWdoIG9wdGlvbnMgdG8gdGhlIFxjb21tYW5ke2JkaXN0XF9ycG19IGNvbW1hbmQgYXMgZm9sbG93czoKIApAQCAtMTczNyw2ICsxNzM3LDggQEAKIFxjaGFwdGVye1VwbG9hZGluZyBQYWNrYWdlcyB0byB0aGUgUGFja2FnZSBJbmRleH0KIFxsYWJlbHtwYWNrYWdlLXVwbG9hZH0KIAorXHZlcnNpb25hZGRlZHsyLjV9CisKIFRoZSBQeXRob24gUGFja2FnZSBJbmRleCAoUHlQSSkgbm90IG9ubHkgc3RvcmVzIHRoZSBwYWNrYWdlIGluZm8sIGJ1dCBhbHNvIAogdGhlIHBhY2thZ2UgZGF0YSBpZiB0aGUgYXV0aG9yIG9mIHRoZSBwYWNrYWdlIHdpc2hlcyB0by4gVGhlIGRpc3R1dGlscwogY29tbWFuZCBcY29tbWFuZHt1cGxvYWR9IHB1c2hlcyB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzIHRvIFB5UEkuCkBAIC0xNzU0LDggKzE3NTYsMjEgQEAKIGRpc3RyaWJ1dGlvbnMgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIGludm9jYXRpb24gaW5jbHVkaW5nCiB0aGUgXGNvbW1hbmR7dXBsb2FkfSBjb21tYW5kIGFyZSB1cGxvYWRlZC4KIAotVGhlIFxjb21tYW5ke3VwbG9hZH0gY29tbWFuZCB1c2VzIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgc3RvcmVkIGluCi10aGUgZmlsZSBcZmlsZXtcJEhPTUUvLnB5cGlyY30sIHNlZSBzZWN0aW9uflxyZWZ7cHlwaXJjfS4KK1RoZSBcY29tbWFuZHt1cGxvYWR9IGNvbW1hbmQgdXNlcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgcmVwb3NpdG9yeQorVVJMIGZyb20gdGhlIFxmaWxle1wkSE9NRS8ucHlwaXJjfSBmaWxlIChzZWUgc2VjdGlvbn5ccmVme3B5cGlyY30gZm9yCittb3JlIG9uIHRoaXMgZmlsZSkuCisKK1lvdSBjYW4gdXNlIHRoZSBccHJvZ3JhbW9wdHstLXNpZ259IG9wdGlvbiB0byB0ZWxsIFxjb21tYW5ke3VwbG9hZH0gdG8KK3NpZ24gZWFjaCB1cGxvYWRlZCBmaWxlIHVzaW5nIEdQRyAoR05VIFByaXZhY3kgR3VhcmQpLiAgVGhlIAorXHByb2dyYW17Z3BnfSBwcm9ncmFtIG11c3QgYmUgYXZhaWxhYmxlIGZvciBleGVjdXRpb24gb24gdGhlIHN5c3RlbQorXGVudnZhcntQQVRIfS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoaWNoIGtleSB0byB1c2UgZm9yIHNpZ25pbmcKK3VzaW5nIHRoZSBccHJvZ3JhbW9wdHstLWlkZW50aXR5PVx2YXJ7bmFtZX19IG9wdGlvbi4KKworT3RoZXIgXGNvbW1hbmR7dXBsb2FkfSBvcHRpb25zIGluY2x1ZGUgCitccHJvZ3JhbW9wdHstLXJlcG9zaXRvcnk9XHZhcnt1cmx9fSAod2hpY2ggbGV0cyB5b3Ugb3ZlcnJpZGUgdGhlCityZXBvc2l0b3J5IHNldHRpbmcgZnJvbSBcZmlsZXtcJEhPTUUvLnB5cGlyY30pLCBhbmQKK1xwcm9ncmFtb3B0ey0tc2hvdy1yZXNwb25zZX0gKHdoaWNoIGRpc3BsYXlzIHRoZSBmdWxsIHJlc3BvbnNlIHRleHQKK2Zyb20gdGhlIFB5UEkgc2VydmVyIGZvciBoZWxwIGluIGRlYnVnZ2luZyB1cGxvYWQgcHJvYmxlbXMpLgogCiBcY2hhcHRlcntFeGFtcGxlc30KIFxsYWJlbHtleGFtcGxlc30KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9yZWdleC50ZXggYi9Eb2MvaG93dG8vcmVnZXgudGV4CmluZGV4IDg3ZmRhZDIuLmY5ODY3YWUgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9yZWdleC50ZXgKKysrIGIvRG9jL2hvd3RvL3JlZ2V4LnRleApAQCAtMzMsMTEgKzMzLDggQEAKIAogVGhlIFxtb2R1bGV7cmV9IG1vZHVsZSB3YXMgYWRkZWQgaW4gUHl0aG9uIDEuNSwgYW5kIHByb3ZpZGVzCiBQZXJsLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucy4gIEVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uCi1jYW1lIHdpdGggdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSwgd2hpY2ggcHJvdmlkZXMgRW1hY3Mtc3R5bGUKLXBhdHRlcm5zLiAgRW1hY3Mtc3R5bGUgcGF0dGVybnMgYXJlIHNsaWdodGx5IGxlc3MgcmVhZGFibGUgYW5kCi1kb24ndCBwcm92aWRlIGFzIG1hbnkgZmVhdHVyZXMsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcmVhc29uIHRvIHVzZQotdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSB3aGVuIHdyaXRpbmcgbmV3IGNvZGUsIHRob3VnaCB5b3UgbWlnaHQKLWVuY291bnRlciBvbGQgY29kZSB0aGF0IHVzZXMgaXQuCitjYW1lIHdpdGggdGhlIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSwgd2hpY2ggcHJvdmlkZWQgRW1hY3Mtc3R5bGUKK3BhdHRlcm5zLiAgXG1vZHVsZXtyZWdleH0gbW9kdWxlIHdhcyByZW1vdmVkIGluIFB5dGhvbiAyLjUuCiAKIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKG9yIFJFcykgYXJlIGVzc2VudGlhbGx5IGEgdGlueSwgaGlnaGx5CiBzcGVjaWFsaXplZCBwcm9ncmFtbWluZyBsYW5ndWFnZSBlbWJlZGRlZCBpbnNpZGUgUHl0aG9uIGFuZCBtYWRlCkBAIC0xNDU4LDcgKzE0NTUsNyBAQAogYnkgTydSZWlsbHkuICBVbmZvcnR1bmF0ZWx5LCBpdCBleGNsdXNpdmVseSBjb25jZW50cmF0ZXMgb24gUGVybCBhbmQKIEphdmEncyBmbGF2b3VycyBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgZG9lc24ndCBjb250YWluIGFueSBQeXRob24KIG1hdGVyaWFsIGF0IGFsbCwgc28gaXQgd29uJ3QgYmUgdXNlZnVsIGFzIGEgcmVmZXJlbmNlIGZvciBwcm9ncmFtbWluZwotaW4gUHl0aG9uLiAgKFRoZSBmaXJzdCBlZGl0aW9uIGNvdmVyZWQgUHl0aG9uJ3Mgbm93LW9ic29sZXRlCitpbiBQeXRob24uICAoVGhlIGZpcnN0IGVkaXRpb24gY292ZXJlZCBQeXRob24ncyBub3ctcmVtb3ZlZAogXG1vZHVsZXtyZWdleH0gbW9kdWxlLCB3aGljaCB3b24ndCBoZWxwIHlvdSBtdWNoLikgIENvbnNpZGVyIGNoZWNraW5nCiBpdCBvdXQgZnJvbSB5b3VyIGxpYnJhcnkuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvY29tcGlsZXIudGV4IGIvRG9jL2xpYi9jb21waWxlci50ZXgKaW5kZXggZTYxOWE5YS4uZjA5MjZlNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9jb21waWxlci50ZXgKKysrIGIvRG9jL2xpYi9jb21waWxlci50ZXgKQEAgLTQwLDkgKzQwLDkgQEAKIAogXGJlZ2lue2Z1bmNkZXNjfXtwYXJzZX17YnVmfQogUmV0dXJucyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBmb3IgdGhlIFB5dGhvbiBzb3VyY2UgY29kZSBpbiBcdmFye2J1Zn0uCi1UaGUgZnVuY3Rpb24gcmFpc2VzIFN5bnRheEVycm9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzb3VyY2UKLWNvZGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgXGNsYXNze2NvbXBpbGVyLmFzdC5Nb2R1bGV9IGluc3RhbmNlIHRoYXQKLWNvbnRhaW5zIHRoZSB0cmVlLiAgCitUaGUgZnVuY3Rpb24gcmFpc2VzIFxleGNlcHRpb257U3ludGF4RXJyb3J9IGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZQorc291cmNlIGNvZGUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgXGNsYXNze2NvbXBpbGVyLmFzdC5Nb2R1bGV9IGluc3RhbmNlCit0aGF0IGNvbnRhaW5zIHRoZSB0cmVlLiAgCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3BhcnNlRmlsZX17cGF0aH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtZGlyLnB5IGIvRG9jL2xpYi9lbWFpbC1kaXIucHkKaW5kZXggMmQ4OWEyZi4uYzA0ZjU3ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC1kaXIucHkKKysrIGIvRG9jL2xpYi9lbWFpbC1kaXIucHkKQEAgLTEsODMgKzEsNjkgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi0iIiJTZW5kIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeSBhcyBhIE1JTUUgbWVzc2FnZS4KKyIiIlNlbmQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGFzIGEgTUlNRSBtZXNzYWdlLiIiIgogCi1Vc2FnZTogZGlybWFpbCBbb3B0aW9uc10gZnJvbSB0byBbdG8gLi4uXSoKLQotT3B0aW9uczoKLSAgICAtaCAvIC0taGVscAotICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCi0KLSAgICAtZCBkaXJlY3RvcnkKLSAgICAtLWRpcmVjdG9yeT1kaXJlY3RvcnkKLSAgICAgICAgTWFpbCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIG90aGVyd2lzZSB1c2UgdGhlCi0gICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgT25seSB0aGUgcmVndWxhciBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBzZW50LAotICAgICAgICBhbmQgd2UgZG9uJ3QgcmVjdXJzZSB0byBzdWJkaXJlY3Rvcmllcy4KLQotYGZyb20nIGlzIHRoZSBlbWFpbCBhZGRyZXNzIG9mIHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuCi0KLWB0bycgaXMgdGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlY2lwaWVudCBvZiB0aGUgbWVzc2FnZSwgYW5kIG11bHRpcGxlCi1yZWNpcGllbnRzIG1heSBiZSBnaXZlbi4KLQotVGhlIGVtYWlsIGlzIHNlbnQgYnkgZm9yd2FyZGluZyB0byB5b3VyIGxvY2FsIFNNVFAgc2VydmVyLCB3aGljaCB0aGVuIGRvZXMgdGhlCi1ub3JtYWwgZGVsaXZlcnkgcHJvY2Vzcy4gIFlvdXIgbG9jYWwgbWFjaGluZSBtdXN0IGJlIHJ1bm5pbmcgYW4gU01UUCBzZXJ2ZXIuCi0iIiIKLQotaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgc3lzCiBpbXBvcnQgc210cGxpYgogIyBGb3IgZ3Vlc3NpbmcgTUlNRSB0eXBlIGJhc2VkIG9uIGZpbGUgbmFtZSBleHRlbnNpb24KIGltcG9ydCBtaW1ldHlwZXMKIAotZnJvbSBlbWFpbCBpbXBvcnQgRW5jb2RlcnMKLWZyb20gZW1haWwuTWVzc2FnZSBpbXBvcnQgTWVzc2FnZQotZnJvbSBlbWFpbC5NSU1FQXVkaW8gaW1wb3J0IE1JTUVBdWRpbwotZnJvbSBlbWFpbC5NSU1FQmFzZSBpbXBvcnQgTUlNRUJhc2UKLWZyb20gZW1haWwuTUlNRU11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAotZnJvbSBlbWFpbC5NSU1FSW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQotZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUuYXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLm1pbWUuaW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQorZnJvbSBlbWFpbC5taW1lLm11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAorZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0CiAKIENPTU1BU1BBQ0UgPSAnLCAnCiAKIAotZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6Ci0gICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXwotICAgIGlmIG1zZzoKLSAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCi0gICAgc3lzLmV4aXQoY29kZSkKLQotCiBkZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaGQ6JywgWydoZWxwJywgJ2RpcmVjdG9yeT0nXSkKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6Ci0gICAgICAgIHVzYWdlKDEsIG1zZykKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9IiIiXAorU2VuZCB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgYXMgYSBNSU1FIG1lc3NhZ2UuCiAKLSAgICBkaXIgPSBvcy5jdXJkaXIKLSAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6Ci0gICAgICAgICAgICB1c2FnZSgwKQotICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGlyZWN0b3J5Jyk6Ci0gICAgICAgICAgICBkaXIgPSBhcmcKK1VzYWdlOiAlcHJvZyBbb3B0aW9uc10KIAotICAgIGlmIGxlbihhcmdzKSA8IDI6Ci0gICAgICAgIHVzYWdlKDEpCi0KLSAgICBzZW5kZXIgPSBhcmdzWzBdCi0gICAgcmVjaXBzID0gYXJnc1sxOl0KLQorVW5sZXNzIHRoZSAtbyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBlbWFpbCBpcyBzZW50IGJ5IGZvcndhcmRpbmcgdG8geW91ciBsb2NhbAorU01UUCBzZXJ2ZXIsIHdoaWNoIHRoZW4gZG9lcyB0aGUgbm9ybWFsIGRlbGl2ZXJ5IHByb2Nlc3MuICBZb3VyIGxvY2FsIG1hY2hpbmUKK211c3QgYmUgcnVubmluZyBhbiBTTVRQIHNlcnZlci4KKyIiIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLWQnLCAnLS1kaXJlY3RvcnknLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J3N0cmluZycsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IiIiTWFpbCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBPbmx5IHRoZSByZWd1bGFyCisgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcmUgc2VudCwgYW5kIHdlIGRvbid0IHJlY3Vyc2UgdG8KKyAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3Rvcmllcy4iIiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1vJywgJy0tb3V0cHV0JywKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J3N0b3JlJywgbWV0YXZhcj0nRklMRScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iIiJQcmludCB0aGUgY29tcG9zZWQgbWVzc2FnZSB0byBGSUxFIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBTTVRQIHNlcnZlci4iIiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc2VuZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzdHJpbmcnLCBhY3Rpb249J3N0b3JlJywgbWV0YXZhcj0nU0VOREVSJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgdmFsdWUgb2YgdGhlIEZyb206IGhlYWRlciAocmVxdWlyZWQpJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXInLCAnLS1yZWNpcGllbnQnLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J3N0cmluZycsIGFjdGlvbj0nYXBwZW5kJywgbWV0YXZhcj0nUkVDSVBJRU5UJywKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLCBkZXN0PSdyZWNpcGllbnRzJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBIFRvOiBoZWFkZXIgdmFsdWUgKGF0IGxlYXN0IG9uZSByZXF1aXJlZCknKQorICAgIG9wdHMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgaWYgbm90IG9wdHMuc2VuZGVyIG9yIG5vdCBvcHRzLnJlY2lwaWVudHM6CisgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBkaXJlY3RvcnkgPSBvcHRzLmRpcmVjdG9yeQorICAgIGlmIG5vdCBkaXJlY3Rvcnk6CisgICAgICAgIGRpcmVjdG9yeSA9ICcuJwogICAgICMgQ3JlYXRlIHRoZSBlbmNsb3NpbmcgKG91dGVyKSBtZXNzYWdlCiAgICAgb3V0ZXIgPSBNSU1FTXVsdGlwYXJ0KCkKLSAgICBvdXRlclsnU3ViamVjdCddID0gJ0NvbnRlbnRzIG9mIGRpcmVjdG9yeSAlcycgJSBvcy5wYXRoLmFic3BhdGgoZGlyKQotICAgIG91dGVyWydUbyddID0gQ09NTUFTUEFDRS5qb2luKHJlY2lwcykKLSAgICBvdXRlclsnRnJvbSddID0gc2VuZGVyCisgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdDb250ZW50cyBvZiBkaXJlY3RvcnkgJXMnICUgb3MucGF0aC5hYnNwYXRoKGRpcmVjdG9yeSkKKyAgICBvdXRlclsnVG8nXSA9IENPTU1BU1BBQ0Uuam9pbihvcHRzLnJlY2lwaWVudHMpCisgICAgb3V0ZXJbJ0Zyb20nXSA9IG9wdHMuc2VuZGVyCiAgICAgb3V0ZXIucHJlYW1ibGUgPSAnWW91IHdpbGwgbm90IHNlZSB0aGlzIGluIGEgTUlNRS1hd2FyZSBtYWlsIHJlYWRlci5cbicKLSAgICAjIFRvIGd1YXJhbnRlZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCi0gICAgb3V0ZXIuZXBpbG9ndWUgPSAnJwogCi0gICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyKToKLSAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGZpbGVuYW1lKQorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIyBHdWVzcyB0aGUgY29udGVudCB0eXBlIGJhc2VkIG9uIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uLiAgRW5jb2RpbmcKQEAgLTEwOCwxNiArOTQsMjEgQEAKICAgICAgICAgICAgIG1zZy5zZXRfcGF5bG9hZChmcC5yZWFkKCkpCiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgICAgICAjIEVuY29kZSB0aGUgcGF5bG9hZCB1c2luZyBCYXNlNjQKLSAgICAgICAgICAgIEVuY29kZXJzLmVuY29kZV9iYXNlNjQobXNnKQorICAgICAgICAgICAgZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NChtc2cpCiAgICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIKICAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPWZpbGVuYW1lKQogICAgICAgICBvdXRlci5hdHRhY2gobXNnKQotCi0gICAgIyBOb3cgc2VuZCB0aGUgbWVzc2FnZQotICAgIHMgPSBzbXRwbGliLlNNVFAoKQotICAgIHMuY29ubmVjdCgpCi0gICAgcy5zZW5kbWFpbChzZW5kZXIsIHJlY2lwcywgb3V0ZXIuYXNfc3RyaW5nKCkpCi0gICAgcy5jbG9zZSgpCisgICAgIyBOb3cgc2VuZCBvciBzdG9yZSB0aGUgbWVzc2FnZQorICAgIGNvbXBvc2VkID0gb3V0ZXIuYXNfc3RyaW5nKCkKKyAgICBpZiBvcHRzLm91dHB1dDoKKyAgICAgICAgZnAgPSBvcGVuKG9wdHMub3V0cHV0LCAndycpCisgICAgICAgIGZwLndyaXRlKGNvbXBvc2VkKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgICAgcyA9IHNtdHBsaWIuU01UUCgpCisgICAgICAgIHMuY29ubmVjdCgpCisgICAgICAgIHMuc2VuZG1haWwob3B0cy5zZW5kZXIsIG9wdHMucmVjaXBpZW50cywgY29tcG9zZWQpCisgICAgICAgIHMuY2xvc2UoKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLW1pbWUucHkgYi9Eb2MvbGliL2VtYWlsLW1pbWUucHkKaW5kZXggMDQ4YTU5Zi4uNTA5NzI1MyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC1taW1lLnB5CisrKyBiL0RvYy9saWIvZW1haWwtbWltZS5weQpAQCAtMiw4ICsyLDggQEAKIGltcG9ydCBzbXRwbGliCiAKICMgSGVyZSBhcmUgdGhlIGVtYWlsIHBhY2thZ2UgbW9kdWxlcyB3ZSdsbCBuZWVkCi1mcm9tIGVtYWlsLk1JTUVJbWFnZSBpbXBvcnQgTUlNRUltYWdlCi1mcm9tIGVtYWlsLk1JTUVNdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKK2Zyb20gZW1haWwubWltZS5pbWFnZSBpbXBvcnQgTUlNRUltYWdlCitmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0CiAKIENPTU1BU1BBQ0UgPSAnLCAnCiAKQEAgLTE1LDggKzE1LDYgQEAKIG1zZ1snRnJvbSddID0gbWUKIG1zZ1snVG8nXSA9IENPTU1BU1BBQ0Uuam9pbihmYW1pbHkpCiBtc2cucHJlYW1ibGUgPSAnT3VyIGZhbWlseSByZXVuaW9uJwotIyBHdWFyYW50ZWVzIHRoZSBtZXNzYWdlIGVuZHMgaW4gYSBuZXdsaW5lCi1tc2cuZXBpbG9ndWUgPSAnJwogCiAjIEFzc3VtZSB3ZSBrbm93IHRoYXQgdGhlIGltYWdlIGZpbGVzIGFyZSBhbGwgaW4gUE5HIGZvcm1hdAogZm9yIGZpbGUgaW4gcG5nZmlsZXM6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLXNpbXBsZS5weSBiL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CmluZGV4IGE0NDVmMWIuLjQ0MTUyYTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CisrKyBiL0RvYy9saWIvZW1haWwtc2ltcGxlLnB5CkBAIC0yLDcgKzIsNyBAQAogaW1wb3J0IHNtdHBsaWIKIAogIyBJbXBvcnQgdGhlIGVtYWlsIG1vZHVsZXMgd2UnbGwgbmVlZAotZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAogCiAjIE9wZW4gYSBwbGFpbiB0ZXh0IGZpbGUgZm9yIHJlYWRpbmcuICBGb3IgdGhpcyBleGFtcGxlLCBhc3N1bWUgdGhhdAogIyB0aGUgdGV4dCBmaWxlIGNvbnRhaW5zIG9ubHkgQVNDSUkgY2hhcmFjdGVycy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWwtdW5wYWNrLnB5IGIvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKaW5kZXggYjE2NmZkYi4uZmMwNWQ5OSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKKysrIGIvRG9jL2xpYi9lbWFpbC11bnBhY2sucHkKQEAgLTEsNTkgKzEsNDQgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi0iIiJVbnBhY2sgYSBNSU1FIG1lc3NhZ2UgaW50byBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KKyIiIlVucGFjayBhIE1JTUUgbWVzc2FnZSBpbnRvIGEgZGlyZWN0b3J5IG9mIGZpbGVzLiIiIgogCi1Vc2FnZTogdW5wYWNrbWFpbCBbb3B0aW9uc10gbXNnZmlsZQotCi1PcHRpb25zOgotICAgIC1oIC8gLS1oZWxwCi0gICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdC4KLQotICAgIC1kIGRpcmVjdG9yeQotICAgIC0tZGlyZWN0b3J5PWRpcmVjdG9yeQotICAgICAgICBVbnBhY2sgdGhlIE1JTUUgbWVzc2FnZSBpbnRvIHRoZSBuYW1lZCBkaXJlY3RvcnksIHdoaWNoIHdpbGwgYmUKLSAgICAgICAgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCi0KLW1zZ2ZpbGUgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgTUlNRSBtZXNzYWdlLgotIiIiCi0KLWltcG9ydCBzeXMKIGltcG9ydCBvcwotaW1wb3J0IGdldG9wdAoraW1wb3J0IHN5cworaW1wb3J0IGVtYWlsCiBpbXBvcnQgZXJybm8KIGltcG9ydCBtaW1ldHlwZXMKLWltcG9ydCBlbWFpbAogCi0KLWRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgotICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF9fZG9jX18KLSAgICBpZiBtc2c6Ci0gICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwotICAgIHN5cy5leGl0KGNvZGUpCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAogCiBkZWYgbWFpbigpOgotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnaGQ6JywgWydoZWxwJywgJ2RpcmVjdG9yeT0nXSkKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6Ci0gICAgICAgIHVzYWdlKDEsIG1zZykKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9IiIiXAorVW5wYWNrIGEgTUlNRSBtZXNzYWdlIGludG8gYSBkaXJlY3Rvcnkgb2YgZmlsZXMuCiAKLSAgICBkaXIgPSBvcy5jdXJkaXIKLSAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6Ci0gICAgICAgICAgICB1c2FnZSgwKQotICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGlyZWN0b3J5Jyk6Ci0gICAgICAgICAgICBkaXIgPSBhcmcKK1VzYWdlOiAlcHJvZyBbb3B0aW9uc10gbXNnZmlsZQorIiIiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZCcsICctLWRpcmVjdG9yeScsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nc3RyaW5nJywgYWN0aW9uPSdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iIiJVbnBhY2sgdGhlIE1JTUUgbWVzc2FnZSBpbnRvIHRoZSBuYW1lZAorICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgIGV4aXN0LiIiIikKKyAgICBvcHRzLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIGlmIG5vdCBvcHRzLmRpcmVjdG9yeToKKyAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgICAgICBzeXMuZXhpdCgxKQogCiAgICAgdHJ5OgogICAgICAgICBtc2dmaWxlID0gYXJnc1swXQogICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICB1c2FnZSgxKQorICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCisgICAgICAgIHN5cy5leGl0KDEpCiAKICAgICB0cnk6Ci0gICAgICAgIG9zLm1rZGlyKGRpcikKKyAgICAgICAgb3MubWtkaXIob3B0cy5kaXJlY3RvcnkpCiAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CiAgICAgICAgICMgSWdub3JlIGRpcmVjdG9yeSBleGlzdHMgZXJyb3IKLSAgICAgICAgaWYgZS5lcnJubyA8PiBlcnJuby5FRVhJU1Q6IHJhaXNlCisgICAgICAgIGlmIGUuZXJybm8gPD4gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgcmFpc2UKIAogICAgIGZwID0gb3Blbihtc2dmaWxlKQogICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQpAQCAtNzQsOCArNTksOCBAQAogICAgICAgICAgICAgICAgIGV4dCA9ICcuYmluJwogICAgICAgICAgICAgZmlsZW5hbWUgPSAncGFydC0lMDNkJXMnICUgKGNvdW50ZXIsIGV4dCkKICAgICAgICAgY291bnRlciArPSAxCi0gICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSksICd3YicpCi0gICAgICAgIGZwLndyaXRlKHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPTEpKQorICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKG9wdHMuZGlyZWN0b3J5LCBmaWxlbmFtZSksICd3YicpCisgICAgICAgIGZwLndyaXRlKHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpKQogICAgICAgICBmcC5jbG9zZSgpCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbC50ZXggYi9Eb2MvbGliL2VtYWlsLnRleAppbmRleCAzYTkwZTIyLi42ODUzMzI1IDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsLnRleAorKysgYi9Eb2MvbGliL2VtYWlsLnRleApAQCAtMSw0ICsxLDQgQEAKLSUgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyUgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICUgQXV0aG9yOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBXYXJzYXcpCiAKIFxzZWN0aW9ue1xtb2R1bGV7ZW1haWx9IC0tLQpAQCAtMTgsMTAgKzE4LDEwIEBACiBzdWNoIGFzIFxyZWZtb2R1bGV7cmZjODIyfSwgXHJlZm1vZHVsZXttaW1ldG9vbHN9LAogXHJlZm1vZHVsZXttdWx0aWZpbGV9LCBhbmQgb3RoZXIgbm9uLXN0YW5kYXJkIHBhY2thZ2VzIHN1Y2ggYXMKIFxtb2R1bGV7bWltZWNudGx9LiAgSXQgaXMgc3BlY2lmaWNhbGx5IFxlbXBoe25vdH0gZGVzaWduZWQgdG8gZG8gYW55Ci1zZW5kaW5nIG9mIGVtYWlsIG1lc3NhZ2VzIHRvIFNNVFAgKFxyZmN7MjgyMX0pIHNlcnZlcnM7IHRoYXQgaXMgdGhlCi1mdW5jdGlvbiBvZiB0aGUgXHJlZm1vZHVsZXtzbXRwbGlifSBtb2R1bGUuICBUaGUgXG1vZHVsZXtlbWFpbH0KLXBhY2thZ2UgYXR0ZW1wdHMgdG8gYmUgYXMgUkZDLWNvbXBsaWFudCBhcyBwb3NzaWJsZSwgc3VwcG9ydGluZyBpbgotYWRkaXRpb24gdG8gXHJmY3syODIyfSwgc3VjaCBNSU1FLXJlbGF0ZWQgUkZDcyBhcworc2VuZGluZyBvZiBlbWFpbCBtZXNzYWdlcyB0byBTTVRQIChccmZjezI4MjF9KSwgTk5UUCwgb3Igb3RoZXIgc2VydmVyczsgdGhvc2UKK2FyZSBmdW5jdGlvbnMgb2YgbW9kdWxlcyBzdWNoIGFzIFxyZWZtb2R1bGV7c210cGxpYn0gYW5kIFxyZWZtb2R1bGV7bm50cGxpYn0uCitUaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBhdHRlbXB0cyB0byBiZSBhcyBSRkMtY29tcGxpYW50IGFzIHBvc3NpYmxlLAorc3VwcG9ydGluZyBpbiBhZGRpdGlvbiB0byBccmZjezI4MjJ9LCBzdWNoIE1JTUUtcmVsYXRlZCBSRkNzIGFzCiBccmZjezIwNDV9LCBccmZjezIwNDZ9LCBccmZjezIwNDd9LCBhbmQgXHJmY3syMjMxfS4KIAogVGhlIHByaW1hcnkgZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZSBvZiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBpcwpAQCAtNDEsNyArNDEsNyBAQAogc2hvdWxkIGJlIGNvbW1vbiBpbiBhcHBsaWNhdGlvbnM6IGFuIGVtYWlsIG1lc3NhZ2UgaXMgcmVhZCBhcyBmbGF0CiB0ZXh0IGZyb20gYSBmaWxlIG9yIG90aGVyIHNvdXJjZSwgdGhlIHRleHQgaXMgcGFyc2VkIHRvIHByb2R1Y2UgdGhlCiBvYmplY3Qgc3RydWN0dXJlIG9mIHRoZSBlbWFpbCBtZXNzYWdlLCB0aGlzIHN0cnVjdHVyZSBpcyBtYW5pcHVsYXRlZCwKLWFuZCBmaW5hbGx5IHJlbmRlcmVkIGJhY2sgaW50byBmbGF0IHRleHQuCithbmQgZmluYWxseSwgdGhlIG9iamVjdCB0cmVlIGlzIHJlbmRlcmVkIGJhY2sgaW50byBmbGF0IHRleHQuCiAKIEl0IGlzIHBlcmZlY3RseSBmZWFzaWJsZSB0byBjcmVhdGUgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgb3V0IG9mIHdob2xlCiBjbG90aCAtLS0gaS5lLiBjb21wbGV0ZWx5IGZyb20gc2NyYXRjaC4gIEZyb20gdGhlcmUsIGEgc2ltaWxhcgpAQCAtNTYsNiArNTYsNyBAQAogCiBcYmVnaW57c2VlYWxzb30KICAgICBcc2VlbW9kdWxle3NtdHBsaWJ9e1NNVFAgcHJvdG9jb2wgY2xpZW50fQorICAgIFxzZWVtb2R1bGV7bm50cGxpYn17Tk5UUCBwcm90b2NvbCBjbGllbnR9CiBcZW5ke3NlZWFsc299CiAKIFxzdWJzZWN0aW9ue1JlcHJlc2VudGluZyBhbiBlbWFpbCBtZXNzYWdlfQpAQCAtODgsMjIgKzg5LDUxIEBACiBcc3Vic2VjdGlvbntJdGVyYXRvcnN9CiBcaW5wdXR7ZW1haWxpdGVyfQogCi1cc3Vic2VjdGlvbntQYWNrYWdlIEhpc3Rvcnl9Citcc3Vic2VjdGlvbntQYWNrYWdlIEhpc3RvcnlcbGFiZWx7ZW1haWwtcGtnLWhpc3Rvcnl9fQogCi1WZXJzaW9uIDEgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2Ugd2FzIGJ1bmRsZWQgd2l0aCBQeXRob24KLXJlbGVhc2VzIHVwIHRvIFB5dGhvbiAyLjIuMS4gIFZlcnNpb24gMiB3YXMgZGV2ZWxvcGVkIGZvciB0aGUgUHl0aG9uCi0yLjMgcmVsZWFzZSwgYW5kIGJhY2twb3J0ZWQgdG8gUHl0aG9uIDIuMi4yLiAgSXQgd2FzIGFsc28gYXZhaWxhYmxlIGFzCi1hIHNlcGFyYXRlIGRpc3R1dGlscy1iYXNlZCBwYWNrYWdlLCBhbmQgaXMgY29tcGF0aWJsZSBiYWNrIHRvIFB5dGhvbiAyLjEuCitUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgcmVsZWFzZSBoaXN0b3J5IG9mIHRoZSBlbWFpbCBwYWNrYWdlLCBjb3JyZXNwb25kaW5nCit0byB0aGUgdmVyc2lvbiBvZiBQeXRob24gdGhhdCB0aGUgcGFja2FnZSB3YXMgcmVsZWFzZWQgd2l0aC4gIEZvciBwdXJwb3NlcyBvZgordGhpcyBkb2N1bWVudCwgd2hlbiB5b3Ugc2VlIGEgbm90ZSBhYm91dCBjaGFuZ2Ugb3IgYWRkZWQgdmVyc2lvbnMsIHRoZXNlIHJlZmVyCit0byB0aGUgUHl0aG9uIHZlcnNpb24gdGhlIGNoYW5nZSB3YXMgbWFkZSBpdCwgXGVtcGh7bm90fSB0aGUgZW1haWwgcGFja2FnZQordmVyc2lvbi4gIFRoaXMgdGFibGUgYWxzbyBkZXNjcmliZXMgdGhlIFB5dGhvbiBjb21wYXRpYmlsaXR5IG9mIGVhY2ggdmVyc2lvbgorb2YgdGhlIHBhY2thZ2UuCiAKLVxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMy4wIHdhcyByZWxlYXNlZCB3aXRoIFB5dGhvbiAyLjQgYW5kIGFzIGEgc2VwYXJhdGUKLWRpc3R1dGlscy1iYXNlZCBwYWNrYWdlLiAgSXQgaXMgY29tcGF0aWJsZSBiYWNrIHRvIFB5dGhvbiAyLjMuCitcYmVnaW57dGFibGVpaWl9e2x8bHxsfXtjb25zdGFudH17ZW1haWwgdmVyc2lvbn17ZGlzdHJpYnV0ZWQgd2l0aH17Y29tcGF0aWJsZSB3aXRofQorXGxpbmVpaWl7MS54fXtQeXRob24gMi4yLjAgdG8gUHl0aG9uIDIuMi4xfXtcZW1waHtubyBsb25nZXIgc3VwcG9ydGVkfX0KK1xsaW5laWlpezIuNX17UHl0aG9uIDIuMi4yKyBhbmQgUHl0aG9uIDIuM317UHl0aG9uIDIuMSB0byAyLjV9CitcbGluZWlpaXszLjB9e1B5dGhvbiAyLjR9e1B5dGhvbiAyLjMgdG8gMi41fQorXGxpbmVpaWl7NC4wfXtQeXRob24gMi41fXtQeXRob24gMi4zIHRvIDIuNX0KK1xlbmR7dGFibGVpaWl9CiAKLUhlcmUgYXJlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMyBhbmQgdmVyc2lvbiAyOgorSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc29uIDQgYW5kIHZlcnNpb24gMzoKKworXGJlZ2lue2l0ZW1pemV9CitcaXRlbSBBbGwgbW9kdWxlcyBoYXZlIGJlZW4gcmVuYW1lZCBhY2NvcmRpbmcgdG8gXHBlcHs4fSBzdGFuZGFyZHMuICBGb3IKKyAgICAgIGV4YW1wbGUsIHRoZSB2ZXJzaW9uIDMgbW9kdWxlIFxtb2R1bGV7ZW1haWwuTWVzc2FnZX0gd2FzIHJlbmFtZWQgdG8KKyAgICAgIFxtb2R1bGV7ZW1haWwubWVzc2FnZX0gaW4gdmVyc2lvbiA0LgorCitcaXRlbSBBIG5ldyBzdWJwYWNrYWdlIFxtb2R1bGV7ZW1haWwubWltZX0gd2FzIGFkZGVkIGFuZCBhbGwgdGhlIHZlcnNpb24gMworICAgICAgXG1vZHVsZXtlbWFpbC5NSU1FKn0gbW9kdWxlcyB3ZXJlIHJlbmFtZWQgYW5kIHNpdHVhdGVkIGludG8gdGhlCisgICAgICBcbW9kdWxle2VtYWlsLm1pbWV9IHN1YnBhY2thZ2UuICBGb3IgZXhhbXBsZSwgdGhlIHZlcnNpb24gMyBtb2R1bGUKKyAgICAgIFxtb2R1bGV7ZW1haWwuTUlNRVRleHR9IHdhcyByZW5hbWVkIHRvIFxtb2R1bGV7ZW1haWwubWltZS50ZXh0fS4KKworICAgICAgXGVtcGh7Tm90ZSB0aGF0IHRoZSB2ZXJzaW9uIDMgbmFtZXMgd2lsbCBjb250aW51ZSB0byB3b3JrIHVudGlsIFB5dGhvbgorICAgICAgMi42fS4KKworXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWwubWltZS5hcHBsaWNhdGlvbn0gbW9kdWxlIHdhcyBhZGRlZCwgd2hpY2ggY29udGFpbnMgdGhlCisgICAgICBcY2xhc3N7TUlNRUFwcGxpY2F0aW9ufSBjbGFzcy4KKworXGl0ZW0gTWV0aG9kcyB0aGF0IHdlcmUgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDMgaGF2ZSBiZWVuIHJlbW92ZWQuICBUaGVzZQorICAgICAgaW5jbHVkZSBcbWV0aG9ke0dlbmVyYXRvci5fX2NhbGxfXygpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF90eXBlKCl9LAorICAgICAgXG1ldGhvZHtNZXNzYWdlLmdldF9tYWluX3R5cGUoKX0sIFxtZXRob2R7TWVzc2FnZS5nZXRfc3VidHlwZSgpfS4KK1xlbmR7aXRlbWl6ZX0KKworSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiAzIGFuZCB2ZXJzaW9uIDI6CiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gVGhlIFxjbGFzc3tGZWVkUGFyc2VyfSBjbGFzcyB3YXMgaW50cm9kdWNlZCwgYW5kIHRoZSBcY2xhc3N7UGFyc2VyfQogICAgICAgY2xhc3Mgd2FzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBcY2xhc3N7RmVlZFBhcnNlcn0uICBBbGwgcGFyc2luZwotICAgICAgdGhlcmUgZm9yIGlzIG5vbi1zdHJpY3QsIGFuZCBwYXJzaW5nIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IG5ldmVyIHRvCisgICAgICB0aGVyZWZvcmUgaXMgbm9uLXN0cmljdCwgYW5kIHBhcnNpbmcgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgbmV2ZXIgdG8KICAgICAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFByb2JsZW1zIGZvdW5kIHdoaWxlIHBhcnNpbmcgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbgogICAgICAgdGhlIG1lc3NhZ2UncyBcdmFye2RlZmVjdH0gYXR0cmlidXRlLgogCkBAIC0xMTcsNyArMTQ3LDcgQEAKICAgICAgIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9LCBcbWV0aG9ke01lc3NhZ2UuZ2V0X3R5cGUoKX0sCiAgICAgICBcbWV0aG9ke01lc3NhZ2UuZ2V0X21haW5fdHlwZSgpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF9zdWJ0eXBlKCl9LCBhbmQKICAgICAgIHRoZSBcdmFye3N0cmljdH0gYXJndW1lbnQgdG8gdGhlIFxjbGFzc3tQYXJzZXJ9IGNsYXNzLiAgVGhlc2UgYXJlCi0gICAgICBleHBlY3RlZCB0byBiZSByZW1vdmVkIGluIGVtYWlsIDMuMS4KKyAgICAgIGV4cGVjdGVkIHRvIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgogCiBcaXRlbSBTdXBwb3J0IGZvciBQeXRob25zIGVhcmxpZXIgdGhhbiAyLjMgaGFzIGJlZW4gcmVtb3ZlZC4KIFxlbmR7aXRlbWl6ZX0KQEAgLTI3OCwxMiArMzA4LDEyIEBACiBcaXRlbSBUaGUgbWV0aG9kIFxtZXRob2R7Z2V0cGF5bG9hZGFzdGV4dCgpfSB3YXMgcmVtb3ZlZC4gIFNpbWlsYXIKICAgICAgIGZ1bmN0aW9uYWxpdHkKICAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgXGNsYXNze0RlY29kZWRHZW5lcmF0b3J9IGNsYXNzIGluIHRoZQotICAgICAgXHJlZm1vZHVsZXtlbWFpbC5HZW5lcmF0b3J9IG1vZHVsZS4KKyAgICAgIFxyZWZtb2R1bGV7ZW1haWwuZ2VuZXJhdG9yfSBtb2R1bGUuCiAKIFxpdGVtIFRoZSBtZXRob2QgXG1ldGhvZHtnZXRib2R5YXN0ZXh0KCl9IHdhcyByZW1vdmVkLiAgWW91IGNhbiBnZXQKICAgICAgIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBieSBjcmVhdGluZyBhbiBpdGVyYXRvciB3aXRoCiAgICAgICBcZnVuY3Rpb257dHlwZWRfc3VicGFydF9pdGVyYXRvcigpfSBpbiB0aGUKLSAgICAgIFxyZWZtb2R1bGV7ZW1haWwuSXRlcmF0b3JzfSBtb2R1bGUuCisgICAgICBccmVmbW9kdWxle2VtYWlsLml0ZXJhdG9yc30gbW9kdWxlLgogXGVuZHtpdGVtaXplfQogCiBUaGUgXGNsYXNze1BhcnNlcn0gY2xhc3MgaGFzIG5vIGRpZmZlcmVuY2VzIGluIGl0cyBwdWJsaWMgaW50ZXJmYWNlLgpAQCAtMjk1LDcgKzMyNSw3IEBACiBpbiBccmZjezE4OTR9Ln0uCiAKIFRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzcyBoYXMgbm8gZGlmZmVyZW5jZXMgaW4gaXRzIHB1YmxpYwotaW50ZXJmYWNlLiAgVGhlcmUgaXMgYSBuZXcgY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuR2VuZXJhdG9yfQoraW50ZXJmYWNlLiAgVGhlcmUgaXMgYSBuZXcgY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuZ2VuZXJhdG9yfQogbW9kdWxlIHRob3VnaCwgY2FsbGVkIFxjbGFzc3tEZWNvZGVkR2VuZXJhdG9yfSB3aGljaCBwcm92aWRlcyBtb3N0IG9mCiB0aGUgZnVuY3Rpb25hbGl0eSBwcmV2aW91c2x5IGF2YWlsYWJsZSBpbiB0aGUKIFxtZXRob2R7TWVzc2FnZS5nZXRwYXlsb2FkYXN0ZXh0KCl9IG1ldGhvZC4KQEAgLTMyOSwxMSArMzU5LDExIEBACiAKIFxtb2R1bGV7bWltZWxpYn0gcHJvdmlkZWQgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBpbiBpdHMKIFxtb2R1bGV7YWRkcmVzc30gYW5kIFxtb2R1bGV7ZGF0ZX0gbW9kdWxlcy4gIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMKLWhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgXHJlZm1vZHVsZXtlbWFpbC5VdGlsc30gbW9kdWxlLgoraGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBccmVmbW9kdWxle2VtYWlsLnV0aWxzfSBtb2R1bGUuCiAKIFRoZSBcY29kZXtNc2dSZWFkZXJ9IGNsYXNzL21vZHVsZSBoYXMgYmVlbiByZW1vdmVkLiAgSXRzIGZ1bmN0aW9uYWxpdHkKIGlzIG1vc3QgY2xvc2VseSBzdXBwb3J0ZWQgaW4gdGhlIFxmdW5jdGlvbntib2R5X2xpbmVfaXRlcmF0b3IoKX0KLWZ1bmN0aW9uIGluIHRoZSBccmVmbW9kdWxle2VtYWlsLkl0ZXJhdG9yc30gbW9kdWxlLgorZnVuY3Rpb24gaW4gdGhlIFxyZWZtb2R1bGV7ZW1haWwuaXRlcmF0b3JzfSBtb2R1bGUuCiAKIFxzdWJzZWN0aW9ue0V4YW1wbGVzfQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsY2hhcnNldHMudGV4IGIvRG9jL2xpYi9lbWFpbGNoYXJzZXRzLnRleAppbmRleCAxOGYyYTAxLi5lMGJlNjhhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsY2hhcnNldHMudGV4CisrKyBiL0RvYy9saWIvZW1haWxjaGFyc2V0cy50ZXgKQEAgLTEsNCArMSw0IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuQ2hhcnNldH0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5jaGFyc2V0fQogXG1vZHVsZXN5bm9wc2lze0NoYXJhY3RlciBTZXRzfQogCiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNsYXNzIFxjbGFzc3tDaGFyc2V0fSBmb3IgcmVwcmVzZW50aW5nCkBAIC03LDYgKzcsOCBAQAogbWFuaXB1bGF0aW5nIHRoaXMgcmVnaXN0cnkuICBJbnN0YW5jZXMgb2YgXGNsYXNze0NoYXJzZXR9IGFyZSB1c2VkIGluCiBzZXZlcmFsIG90aGVyIG1vZHVsZXMgd2l0aGluIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLgogCitJbXBvcnQgdGhpcyBjbGFzcyBmcm9tIHRoZSBcbW9kdWxle2VtYWlsLmNoYXJzZXR9IG1vZHVsZS4KKwogXHZlcnNpb25hZGRlZHsyLjIuMn0KIAogXGJlZ2lue2NsYXNzZGVzY317Q2hhcnNldH17XG9wdGlvbmFse2lucHV0X2NoYXJzZXR9fQpAQCAtMTUzLDcgKzE1NSw3IEBACiBmb3IgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRzLCB3aGljaCBoYXZlIGxpbmUgbGVuZ3RoIGlzc3VlcyAobXVsdGlieXRlCiBjaGFyYWN0ZXJzIG11c3QgYmUgc3BsaXQgb24gYSBjaGFyYWN0ZXIsIG5vdCBhIGJ5dGUgYm91bmRhcnkpOyB1c2UgdGhlCiBoaWdoZXItbGV2ZWwgXGNsYXNze0hlYWRlcn0gY2xhc3MgdG8gZGVhbCB3aXRoIHRoZXNlIGlzc3VlcyAoc2VlCi1ccmVmbW9kdWxle2VtYWlsLkhlYWRlcn0pLiAgXHZhcntjb252ZXJ0fSBkZWZhdWx0cyB0byBcY29kZXtGYWxzZX0uCitccmVmbW9kdWxle2VtYWlsLmhlYWRlcn0pLiAgXHZhcntjb252ZXJ0fSBkZWZhdWx0cyB0byBcY29kZXtGYWxzZX0uCiAKIFRoZSB0eXBlIG9mIGVuY29kaW5nIChiYXNlNjQgb3IgcXVvdGVkLXByaW50YWJsZSkgd2lsbCBiZSBiYXNlZCBvbgogdGhlIFx2YXJ7aGVhZGVyX2VuY29kaW5nfSBhdHRyaWJ1dGUuCkBAIC0xODgsNyArMTkwLDcgQEAKIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gY29tcGFyZSB0d28gXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlcyBmb3IgaW5lcXVhbGl0eS4KIFxlbmR7bWV0aG9kZGVzY30KIAotVGhlIFxtb2R1bGV7ZW1haWwuQ2hhcnNldH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZworVGhlIFxtb2R1bGV7ZW1haWwuY2hhcnNldH0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZwogZnVuY3Rpb25zIGZvciBhZGRpbmcgbmV3IGVudHJpZXMgdG8gdGhlIGdsb2JhbCBjaGFyYWN0ZXIgc2V0LCBhbGlhcywKIGFuZCBjb2RlYyByZWdpc3RyaWVzOgogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4IGIvRG9jL2xpYi9lbWFpbGVuY29kZXJzLnRleAppbmRleCBhNDllMDRkLi4zZDA1YzJhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZW5jb2RlcnMudGV4CisrKyBiL0RvYy9saWIvZW1haWxlbmNvZGVycy50ZXgKQEAgLTEsNCArMSw0IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuRW5jb2RlcnN9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuZW5jb2RlcnN9CiBcbW9kdWxlc3lub3BzaXN7RW5jb2RlcnMgZm9yIGVtYWlsIG1lc3NhZ2UgcGF5bG9hZHMufQogCiBXaGVuIGNyZWF0aW5nIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzIGZyb20gc2NyYXRjaCwgeW91IG9mdGVuIG5lZWQgdG8KQEAgLTcsNyArNyw3IEBACiB0eXBlIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYmluYXJ5IGRhdGEuCiAKIFRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlIHByb3ZpZGVzIHNvbWUgY29udmVuaWVudCBlbmNvZGluZ3MgaW4gaXRzCi1cbW9kdWxle0VuY29kZXJzfSBtb2R1bGUuICBUaGVzZSBlbmNvZGVycyBhcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUKK1xtb2R1bGV7ZW5jb2RlcnN9IG1vZHVsZS4gIFRoZXNlIGVuY29kZXJzIGFyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZQogXGNsYXNze01JTUVBdWRpb30gYW5kIFxjbGFzc3tNSU1FSW1hZ2V9IGNsYXNzIGNvbnN0cnVjdG9ycyB0byBwcm92aWRlIGRlZmF1bHQKIGVuY29kaW5ncy4gIEFsbCBlbmNvZGVyIGZ1bmN0aW9ucyB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgbWVzc2FnZQogb2JqZWN0IHRvIGVuY29kZS4gIFRoZXkgdXN1YWxseSBleHRyYWN0IHRoZSBwYXlsb2FkLCBlbmNvZGUgaXQsIGFuZCByZXNldCB0aGUKZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxleGMudGV4IGIvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKaW5kZXggNmFjMDg4OS4uM2NlZjFkNSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKKysrIGIvRG9jL2xpYi9lbWFpbGV4Yy50ZXgKQEAgLTEsOCArMSw4IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuRXJyb3JzfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLmVycm9yc30KIFxtb2R1bGVzeW5vcHNpc3tUaGUgZXhjZXB0aW9uIGNsYXNzZXMgdXNlZCBieSB0aGUgZW1haWwgcGFja2FnZS59CiAKIFRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhlCi1cbW9kdWxle2VtYWlsLkVycm9yc30gbW9kdWxlOgorXG1vZHVsZXtlbWFpbC5lcnJvcnN9IG1vZHVsZToKIAogXGJlZ2lue2V4Y2NsYXNzZGVzY317TWVzc2FnZUVycm9yfXt9CiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aGF0IHRoZSBcbW9kdWxle2VtYWlsfQpAQCAtNTksNyArNTksNyBAQAogXG1pbWV0eXBle211bHRpcGFydC9hbHRlcm5hdGl2ZX0gaGFkIGEgbWFsZm9ybWVkIGhlYWRlciwgdGhhdCBuZXN0ZWQgbWVzc2FnZQogb2JqZWN0IHdvdWxkIGhhdmUgYSBkZWZlY3QsIGJ1dCB0aGUgY29udGFpbmluZyBtZXNzYWdlcyB3b3VsZCBub3QuCiAKLUFsbCBkZWZlY3QgY2xhc3NlcyBhcmUgc3ViY2xhc3NlZCBmcm9tIFxjbGFzc3tlbWFpbC5FcnJvcnMuTWVzc2FnZURlZmVjdH0sIGJ1dAorQWxsIGRlZmVjdCBjbGFzc2VzIGFyZSBzdWJjbGFzc2VkIGZyb20gXGNsYXNze2VtYWlsLmVycm9ycy5NZXNzYWdlRGVmZWN0fSwgYnV0CiB0aGlzIGNsYXNzIGlzIFxlbXBoe25vdH0gYW4gZXhjZXB0aW9uIQogCiBcdmVyc2lvbmFkZGVkW0FsbCB0aGUgZGVmZWN0IGNsYXNzZXMgd2VyZSBhZGRlZF17Mi40fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbGdlbmVyYXRvci50ZXggYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAppbmRleCAzMzBhYmMwLi4zNDE1NDQyIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAorKysgYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleApAQCAtMSw0ICsxLDQgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5HZW5lcmF0b3J9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuZ2VuZXJhdG9yfQogXG1vZHVsZXN5bm9wc2lze0dlbmVyYXRlIGZsYXQgdGV4dCBlbWFpbCBtZXNzYWdlcyBmcm9tIGEgbWVzc2FnZSBzdHJ1Y3R1cmUufQogCiBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHRhc2tzIGlzIHRvIGdlbmVyYXRlIHRoZSBmbGF0IHRleHQgb2YgdGhlIGVtYWlsCkBAIC04LDcgKzgsNyBAQAogY29uc29sZS4gIFRha2luZyBhIG1lc3NhZ2Ugb2JqZWN0IHN0cnVjdHVyZSBhbmQgcHJvZHVjaW5nIGEgZmxhdCB0ZXh0CiBkb2N1bWVudCBpcyB0aGUgam9iIG9mIHRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzcy4KIAotQWdhaW4sIGFzIHdpdGggdGhlIFxyZWZtb2R1bGV7ZW1haWwuUGFyc2VyfSBtb2R1bGUsIHlvdSBhcmVuJ3QgbGltaXRlZAorQWdhaW4sIGFzIHdpdGggdGhlIFxyZWZtb2R1bGV7ZW1haWwucGFyc2VyfSBtb2R1bGUsIHlvdSBhcmVuJ3QgbGltaXRlZAogdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGJ1bmRsZWQgZ2VuZXJhdG9yOyB5b3UgY291bGQgd3JpdGUgb25lCiBmcm9tIHNjcmF0Y2ggeW91cnNlbGYuICBIb3dldmVyIHRoZSBidW5kbGVkIGdlbmVyYXRvciBrbm93cyBob3cgdG8KIGdlbmVyYXRlIG1vc3QgZW1haWwgaW4gYSBzdGFuZGFyZHMtY29tcGxpYW50IHdheSwgc2hvdWxkIGhhbmRsZSBNSU1FCkBAIC0xNyw3ICsxNyw4IEBACiBcY2xhc3N7UGFyc2VyfSBjbGFzcywgYW5kIGJhY2sgdG8gZmxhdCB0ZXh0LCBpcyBpZGVtcG90ZW50ICh0aGUgaW5wdXQKIGlzIGlkZW50aWNhbCB0byB0aGUgb3V0cHV0KS4KIAotSGVyZSBhcmUgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBcY2xhc3N7R2VuZXJhdG9yfSBjbGFzczoKK0hlcmUgYXJlIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgXGNsYXNze0dlbmVyYXRvcn0gY2xhc3MsIGltcG9ydGVkIGZyb20gdGhlCitcbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gbW9kdWxlOgogCiBcYmVnaW57Y2xhc3NkZXNjfXtHZW5lcmF0b3J9e291dGZwXG9wdGlvbmFseywgbWFuZ2xlX2Zyb21fXG9wdGlvbmFseywKICAgICBtYXhoZWFkZXJsZW59fX0KQEAgLTQwLDcgKzQxLDcgQEAKIE9wdGlvbmFsIFx2YXJ7bWF4aGVhZGVybGVufSBzcGVjaWZpZXMgdGhlIGxvbmdlc3QgbGVuZ3RoIGZvciBhCiBub24tY29udGludWVkIGhlYWRlci4gIFdoZW4gYSBoZWFkZXIgbGluZSBpcyBsb25nZXIgdGhhbgogXHZhcnttYXhoZWFkZXJsZW59IChpbiBjaGFyYWN0ZXJzLCB3aXRoIHRhYnMgZXhwYW5kZWQgdG8gOCBzcGFjZXMpLAotdGhlIGhlYWRlciB3aWxsIGJlIHNwbGl0IGFzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuSGVhZGVyfQordGhlIGhlYWRlciB3aWxsIGJlIHNwbGl0IGFzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuaGVhZGVyLkhlYWRlcn0KIGNsYXNzLiAgU2V0IHRvIHplcm8gdG8gZGlzYWJsZSBoZWFkZXIgd3JhcHBpbmcuICBUaGUgZGVmYXVsdCBpcyA3OCwgYXMKIHJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKSBieSBccmZjezI4MjJ9LgogXGVuZHtjbGFzc2Rlc2N9CkBAIC04MSw5ICs4Miw5IEBACiBBcyBhIGNvbnZlbmllbmNlLCBzZWUgdGhlIG1ldGhvZHMgXG1ldGhvZHtNZXNzYWdlLmFzX3N0cmluZygpfSBhbmQKIFxjb2Rle3N0cihhTWVzc2FnZSl9LCBhLmsuYS4gXG1ldGhvZHtNZXNzYWdlLl9fc3RyX18oKX0sIHdoaWNoCiBzaW1wbGlmeSB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYQotbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSBccmVmbW9kdWxle2VtYWlsLk1lc3NhZ2V9LgorbWVzc2FnZSBvYmplY3QuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSBccmVmbW9kdWxle2VtYWlsLm1lc3NhZ2V9LgogCi1UaGUgXG1vZHVsZXtlbWFpbC5HZW5lcmF0b3J9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZGVyaXZlZCBjbGFzcywKK1RoZSBcbW9kdWxle2VtYWlsLmdlbmVyYXRvcn0gbW9kdWxlIGFsc28gcHJvdmlkZXMgYSBkZXJpdmVkIGNsYXNzLAogY2FsbGVkIFxjbGFzc3tEZWNvZGVkR2VuZXJhdG9yfSB3aGljaCBpcyBsaWtlIHRoZSBcY2xhc3N7R2VuZXJhdG9yfQogYmFzZSBjbGFzcywgZXhjZXB0IHRoYXQgbm9uLVxtaW1ldHlwZXt0ZXh0fSBwYXJ0cyBhcmUgc3Vic3RpdHV0ZWQgd2l0aAogYSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFydC4KQEAgLTEyOCwxMyArMTI5LDUgQEAKIFx2ZXJzaW9uYWRkZWR7Mi4yLjJ9CiBcZW5ke2NsYXNzZGVzY30KIAotXHN1YnN1YnNlY3Rpb257RGVwcmVjYXRlZCBtZXRob2RzfQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQgaW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiAyLgotVGhleSBhcmUgZG9jdW1lbnRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtHZW5lcmF0b3Jde19fY2FsbF9ffXttc2dcb3B0aW9uYWx7LCB1bml4ZnJvbX19Ci1UaGlzIG1ldGhvZCBpcyBpZGVudGljYWwgdG8gdGhlIFxtZXRob2R7ZmxhdHRlbigpfSBtZXRob2QuCi0KLVxkZXByZWNhdGVkezIuMi4yfXtVc2UgdGhlIFxtZXRob2R7ZmxhdHRlbigpfSBtZXRob2QgaW5zdGVhZC59Ci1cZW5ke21ldGhvZGRlc2N9CitcdmVyc2lvbmNoYW5nZWRbVGhlIHByZXZpb3VzbHkgZGVwcmVjYXRlZCBtZXRob2QgXG1ldGhvZHtfX2NhbGxfXygpfSB3YXMKK3JlbW92ZWRdezIuNX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvZW1haWxoZWFkZXJzLnRleCBiL0RvYy9saWIvZW1haWxoZWFkZXJzLnRleAppbmRleCAyNzk1NjQ0Yi4uNTI0ZDA4YyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbGhlYWRlcnMudGV4CisrKyBiL0RvYy9saWIvZW1haWxoZWFkZXJzLnRleApAQCAtMSw0ICsxLDQgQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5IZWFkZXJ9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuaGVhZGVyfQogXG1vZHVsZXN5bm9wc2lze1JlcHJlc2VudGluZyBub24tQVNDSUkgaGVhZGVyc30KIAogXHJmY3syODIyfSBpcyB0aGUgYmFzZSBzdGFuZGFyZCB0aGF0IGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIGVtYWlsCkBAIC0xNSwxNyArMTUsMTggQEAKIGNvbnRhaW5pbmcgbm9uLVxBU0NJSXt9IGNoYXJhY3RlcnMgaW50byBccmZjezI4MjJ9LWNvbXBsaWFudCBmb3JtYXQuCiBUaGVzZSBSRkNzIGluY2x1ZGUgXHJmY3syMDQ1fSwgXHJmY3syMDQ2fSwgXHJmY3syMDQ3fSwgYW5kIFxyZmN7MjIzMX0uCiBUaGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBzdXBwb3J0cyB0aGVzZSBzdGFuZGFyZHMgaW4gaXRzCi1cbW9kdWxle2VtYWlsLkhlYWRlcn0gYW5kIFxtb2R1bGV7ZW1haWwuQ2hhcnNldH0gbW9kdWxlcy4KK1xtb2R1bGV7ZW1haWwuaGVhZGVyfSBhbmQgXG1vZHVsZXtlbWFpbC5jaGFyc2V0fSBtb2R1bGVzLgogCiBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIG5vbi1cQVNDSUl7fSBjaGFyYWN0ZXJzIGluIHlvdXIgZW1haWwgaGVhZGVycywKIHNheSBpbiB0aGUgXG1haWxoZWFkZXJ7U3ViamVjdH0gb3IgXG1haWxoZWFkZXJ7VG99IGZpZWxkcywgeW91IHNob3VsZAogdXNlIHRoZSBcY2xhc3N7SGVhZGVyfSBjbGFzcyBhbmQgYXNzaWduIHRoZSBmaWVsZCBpbiB0aGUKIFxjbGFzc3tNZXNzYWdlfSBvYmplY3QgdG8gYW4gaW5zdGFuY2Ugb2YgXGNsYXNze0hlYWRlcn0gaW5zdGVhZCBvZgotdXNpbmcgYSBzdHJpbmcgZm9yIHRoZSBoZWFkZXIgdmFsdWUuICBGb3IgZXhhbXBsZToKK3VzaW5nIGEgc3RyaW5nIGZvciB0aGUgaGVhZGVyIHZhbHVlLiAgSW1wb3J0IHRoZSBcY2xhc3N7SGVhZGVyfSBjbGFzcyBmcm9tIHRoZQorXG1vZHVsZXtlbWFpbC5oZWFkZXJ9IG1vZHVsZS4gIEZvciBleGFtcGxlOgogCiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBlbWFpbC5NZXNzYWdlIGltcG9ydCBNZXNzYWdlCi0+Pj4gZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IEhlYWRlcgorPj4+IGZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorPj4+IGZyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIKID4+PiBtc2cgPSBNZXNzYWdlKCkKID4+PiBoID0gSGVhZGVyKCdwXHhmNnN0YWwnLCAnaXNvLTg4NTktMScpCiA+Pj4gbXNnWydTdWJqZWN0J10gPSBoCkBAIC04Nyw3ICs4OCw3IEBACiBBcHBlbmQgdGhlIHN0cmluZyBcdmFye3N9IHRvIHRoZSBNSU1FIGhlYWRlci4KIAogT3B0aW9uYWwgXHZhcntjaGFyc2V0fSwgaWYgZ2l2ZW4sIHNob3VsZCBiZSBhIFxjbGFzc3tDaGFyc2V0fSBpbnN0YW5jZQotKHNlZSBccmVmbW9kdWxle2VtYWlsLkNoYXJzZXR9KSBvciB0aGUgbmFtZSBvZiBhIGNoYXJhY3RlciBzZXQsIHdoaWNoCisoc2VlIFxyZWZtb2R1bGV7ZW1haWwuY2hhcnNldH0pIG9yIHRoZSBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldCwgd2hpY2gKIHdpbGwgYmUgY29udmVydGVkIHRvIGEgXGNsYXNze0NoYXJzZXR9IGluc3RhbmNlLiAgQSB2YWx1ZSBvZgogXGNvZGV7Tm9uZX0gKHRoZSBkZWZhdWx0KSBtZWFucyB0aGF0IHRoZSBcdmFye2NoYXJzZXR9IGdpdmVuIGluIHRoZQogY29uc3RydWN0b3IgaXMgdXNlZC4KQEAgLTEzOSw3ICsxNDAsNyBAQAogVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBjb21wYXJlIHR3byBcY2xhc3N7SGVhZGVyfSBpbnN0YW5jZXMgZm9yIGluZXF1YWxpdHkuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVRoZSBcbW9kdWxle2VtYWlsLkhlYWRlcn0gbW9kdWxlIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZworVGhlIFxtb2R1bGV7ZW1haWwuaGVhZGVyfSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nCiBjb252ZW5pZW50IGZ1bmN0aW9ucy4KIAogXGJlZ2lue2Z1bmNkZXNjfXtkZWNvZGVfaGVhZGVyfXtoZWFkZXJ9CkBAIC0xNTUsNyArMTU2LDcgQEAKIEhlcmUncyBhbiBleGFtcGxlOgogCiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gZnJvbSBlbWFpbC5IZWFkZXIgaW1wb3J0IGRlY29kZV9oZWFkZXIKKz4+PiBmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgZGVjb2RlX2hlYWRlcgogPj4+IGRlY29kZV9oZWFkZXIoJz0/aXNvLTg4NTktMT9xP3A9RjZzdGFsPz0nKQogWygncFx4ZjZzdGFsJywgJ2lzby04ODU5LTEnKV0KIFxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsaXRlci50ZXggYi9Eb2MvbGliL2VtYWlsaXRlci50ZXgKaW5kZXggZDFhOGY5OC4uZWY4ZWY2ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbGl0ZXIudGV4CisrKyBiL0RvYy9saWIvZW1haWxpdGVyLnRleApAQCAtMSw4ICsxLDggQEAKLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5JdGVyYXRvcnN9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuaXRlcmF0b3JzfQogXG1vZHVsZXN5bm9wc2lze0l0ZXJhdGUgb3ZlciBhICBtZXNzYWdlIG9iamVjdCB0cmVlLn0KIAogSXRlcmF0aW5nIG92ZXIgYSBtZXNzYWdlIG9iamVjdCB0cmVlIGlzIGZhaXJseSBlYXN5IHdpdGggdGhlCi1cbWV0aG9ke01lc3NhZ2Uud2FsaygpfSBtZXRob2QuICBUaGUgXG1vZHVsZXtlbWFpbC5JdGVyYXRvcnN9IG1vZHVsZQorXG1ldGhvZHtNZXNzYWdlLndhbGsoKX0gbWV0aG9kLiAgVGhlIFxtb2R1bGV7ZW1haWwuaXRlcmF0b3JzfSBtb2R1bGUKIHByb3ZpZGVzIHNvbWUgdXNlZnVsIGhpZ2hlciBsZXZlbCBpdGVyYXRpb25zIG92ZXIgbWVzc2FnZSBvYmplY3QKIHRyZWVzLgogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsbWVzc2FnZS50ZXggYi9Eb2MvbGliL2VtYWlsbWVzc2FnZS50ZXgKaW5kZXggOWI0MTg1Mi4uN2JkN2RkOCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbG1lc3NhZ2UudGV4CisrKyBiL0RvYy9saWIvZW1haWxtZXNzYWdlLnRleApAQCAtMSwxMCArMSwxMSBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLk1lc3NhZ2V9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWVzc2FnZX0KIFxtb2R1bGVzeW5vcHNpc3tUaGUgYmFzZSBjbGFzcyByZXByZXNlbnRpbmcgZW1haWwgbWVzc2FnZXMufQogCiBUaGUgY2VudHJhbCBjbGFzcyBpbiB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBpcyB0aGUKLVxjbGFzc3tNZXNzYWdlfSBjbGFzczsgaXQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBcbW9kdWxle2VtYWlsfQotb2JqZWN0IG1vZGVsLiAgXGNsYXNze01lc3NhZ2V9IHByb3ZpZGVzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yCi1zZXR0aW5nIGFuZCBxdWVyeWluZyBoZWFkZXIgZmllbGRzLCBhbmQgZm9yIGFjY2Vzc2luZyBtZXNzYWdlIGJvZGllcy4KK1xjbGFzc3tNZXNzYWdlfSBjbGFzcywgaW1wb3J0ZWQgZnJvbSB0aGUgXG1vZHVsZXtlbWFpbC5tZXNzYWdlfSBtb2R1bGUuICBJdCBpcwordGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBcbW9kdWxle2VtYWlsfSBvYmplY3QgbW9kZWwuICBcY2xhc3N7TWVzc2FnZX0gcHJvdmlkZXMKK3RoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIHNldHRpbmcgYW5kIHF1ZXJ5aW5nIGhlYWRlciBmaWVsZHMsIGFuZCBmb3IKK2FjY2Vzc2luZyBtZXNzYWdlIGJvZGllcy4KIAogQ29uY2VwdHVhbGx5LCBhIFxjbGFzc3tNZXNzYWdlfSBvYmplY3QgY29uc2lzdHMgb2YgXGVtcGh7aGVhZGVyc30gYW5kCiBcZW1waHtwYXlsb2Fkc30uICBIZWFkZXJzIGFyZSBccmZjezI4MjJ9IHN0eWxlIGZpZWxkIG5hbWVzIGFuZApAQCAtNDUsNyArNDYsNyBAQAogCiBcYmVnaW57dmVyYmF0aW19CiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gZW1haWwuR2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKK2Zyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKIGZwID0gU3RyaW5nSU8oKQogZyA9IEdlbmVyYXRvcihmcCwgbWFuZ2xlX2Zyb21fPUZhbHNlLCBtYXhoZWFkZXJsZW49NjApCiBnLmZsYXR0ZW4obXNnKQpAQCAtMTE5LDcgKzEyMCw3IEBACiAKIFxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtzZXRfY2hhcnNldH17Y2hhcnNldH0KIFNldCB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUgcGF5bG9hZCB0byBcdmFye2NoYXJzZXR9LCB3aGljaCBjYW4KLWVpdGhlciBiZSBhIFxjbGFzc3tDaGFyc2V0fSBpbnN0YW5jZSAoc2VlIFxyZWZtb2R1bGV7ZW1haWwuQ2hhcnNldH0pLCBhCitlaXRoZXIgYmUgYSBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UgKHNlZSBccmVmbW9kdWxle2VtYWlsLmNoYXJzZXR9KSwgYQogc3RyaW5nIG5hbWluZyBhIGNoYXJhY3RlciBzZXQsCiBvciBcY29kZXtOb25lfS4gIElmIGl0IGlzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhCiBcY2xhc3N7Q2hhcnNldH0gaW5zdGFuY2UuICBJZiBcdmFye2NoYXJzZXR9IGlzIFxjb2Rle05vbmV9LCB0aGUKQEAgLTEyOCw4ICsxMjksOCBAQAogXGV4Y2VwdGlvbntUeXBlRXJyb3J9LgogCiBUaGUgbWVzc2FnZSB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgb2YgdHlwZSBcbWltZXR5cGV7dGV4dC8qfSBlbmNvZGVkIHdpdGgKLVxjb2Rle2NoYXJzZXQuaW5wdXRfY2hhcnNldH0uICBJdCB3aWxsIGJlIGNvbnZlcnRlZCB0bwotXGNvZGV7Y2hhcnNldC5vdXRwdXRfY2hhcnNldH0KK1x2YXJ7Y2hhcnNldC5pbnB1dF9jaGFyc2V0fS4gIEl0IHdpbGwgYmUgY29udmVydGVkIHRvCitcdmFye2NoYXJzZXQub3V0cHV0X2NoYXJzZXR9CiBhbmQgZW5jb2RlZCBwcm9wZXJseSwgaWYgbmVlZGVkLCB3aGVuIGdlbmVyYXRpbmcgdGhlIHBsYWluIHRleHQKIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiAgTUlNRSBoZWFkZXJzCiAoXG1haWxoZWFkZXJ7TUlNRS1WZXJzaW9ufSwgXG1haWxoZWFkZXJ7Q29udGVudC1UeXBlfSwKQEAgLTUxMyw2ICs1MTQsOSBAQAogXGVuZHt2ZXJiYXRpbX0KIFxlbmR7bWV0aG9kZGVzY30KIAorXHZlcnNpb25jaGFuZ2VkW1RoZSBwcmV2aW91c2x5IGRlcHJlY2F0ZWQgbWV0aG9kcyBcbWV0aG9ke2dldF90eXBlKCl9LAorXG1ldGhvZHtnZXRfbWFpbl90eXBlKCl9LCBhbmQgXG1ldGhvZHtnZXRfc3VidHlwZSgpfSB3ZXJlIHJlbW92ZWRdezIuNX0KKwogXGNsYXNze01lc3NhZ2V9IG9iamVjdHMgY2FuIGFsc28gb3B0aW9uYWxseSBjb250YWluIHR3byBpbnN0YW5jZQogYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBwbGFpbiB0ZXh0IG9mIGEgTUlNRQogbWVzc2FnZS4KQEAgLTUzMiw3ICs1MzYsNyBAQAogaXMgd3JpdGluZyBvdXQgdGhlIHBsYWluIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBNSU1FIG1lc3NhZ2UsIGFuZCBpdAogZmluZHMgdGhlIG1lc3NhZ2UgaGFzIGEgXHZhcntwcmVhbWJsZX0gYXR0cmlidXRlLCBpdCB3aWxsIHdyaXRlIHRoaXMKIHRleHQgaW4gdGhlIGFyZWEgYmV0d2VlbiB0aGUgaGVhZGVycyBhbmQgdGhlIGZpcnN0IGJvdW5kYXJ5LiAgU2VlCi1ccmVmbW9kdWxle2VtYWlsLlBhcnNlcn0gYW5kIFxyZWZtb2R1bGV7ZW1haWwuR2VuZXJhdG9yfSBmb3IgZGV0YWlscy4KK1xyZWZtb2R1bGV7ZW1haWwucGFyc2VyfSBhbmQgXHJlZm1vZHVsZXtlbWFpbC5nZW5lcmF0b3J9IGZvciBkZXRhaWxzLgogCiBOb3RlIHRoYXQgaWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBubyBwcmVhbWJsZSwgdGhlCiBcdmFye3ByZWFtYmxlfSBhdHRyaWJ1dGUgd2lsbCBiZSBcY29kZXtOb25lfS4KQEAgLTU0Myw1OCArNTQ3LDE1IEBACiBhdHRyaWJ1dGUsIGV4Y2VwdCB0aGF0IGl0IGNvbnRhaW5zIHRleHQgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIGxhc3QKIGJvdW5kYXJ5IGFuZCB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgogCi1PbmUgbm90ZTogd2hlbiBnZW5lcmF0aW5nIHRoZSBmbGF0IHRleHQgZm9yIGEgXG1pbWV0eXBle211bHRpcGFydH0KLW1lc3NhZ2UgdGhhdCBoYXMgbm8gXHZhcntlcGlsb2d1ZX0gKHVzaW5nIHRoZSBzdGFuZGFyZAotXGNsYXNze0dlbmVyYXRvcn0gY2xhc3MpLCBubyBuZXdsaW5lIGlzIGFkZGVkIGFmdGVyIHRoZSBjbG9zaW5nCi1ib3VuZGFyeSBsaW5lLiAgSWYgdGhlIG1lc3NhZ2Ugb2JqZWN0IGhhcyBhbiBcdmFye2VwaWxvZ3VlfSBhbmQgaXRzCi12YWx1ZSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbmV3bGluZSwgYSBuZXdsaW5lIGlzIHByaW50ZWQgYWZ0ZXIgdGhlCi1jbG9zaW5nIGJvdW5kYXJ5LiAgVGhpcyBzZWVtcyBhIGxpdHRsZSBjbHVtc3ksIGJ1dCBpdCBtYWtlcyB0aGUgbW9zdAotcHJhY3RpY2FsIHNlbnNlLiAgVGhlIHVwc2hvdCBpcyB0aGF0IGlmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IGEKLW5ld2xpbmUgZ2V0IHByaW50ZWQgYWZ0ZXIgeW91ciBjbG9zaW5nIFxtaW1ldHlwZXttdWx0aXBhcnR9IGJvdW5kYXJ5LAotc2V0IHRoZSBcdmFye2VwaWxvZ3VlfSB0byB0aGUgZW1wdHkgc3RyaW5nLgorXHZlcnNpb25jaGFuZ2VkW1lvdSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGVwaWxvZ3VlIHRvIHRoZSBlbXB0eSBzdHJpbmcgaW4KK29yZGVyIGZvciB0aGUgXGNsYXNze0dlbmVyYXRvcn0gdG8gcHJpbnQgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlCitmaWxlXXsyLjV9CiBcZW5ke2RhdGFkZXNjfQogCiBcYmVnaW57ZGF0YWRlc2N9e2RlZmVjdHN9CiBUaGUgXHZhcntkZWZlY3RzfSBhdHRyaWJ1dGUgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgcHJvYmxlbXMgZm91bmQgd2hlbgotcGFyc2luZyB0aGlzIG1lc3NhZ2UuICBTZWUgXHJlZm1vZHVsZXtlbWFpbC5FcnJvcnN9IGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCitwYXJzaW5nIHRoaXMgbWVzc2FnZS4gIFNlZSBccmVmbW9kdWxle2VtYWlsLmVycm9yc30gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24KIG9mIHRoZSBwb3NzaWJsZSBwYXJzaW5nIGRlZmVjdHMuCiAKIFx2ZXJzaW9uYWRkZWR7Mi40fQogXGVuZHtkYXRhZGVzY30KLQotXHN1YnN1YnNlY3Rpb257RGVwcmVjYXRlZCBtZXRob2RzfQotCi1cdmVyc2lvbmNoYW5nZWRbVGhlIFxtZXRob2R7YWRkX3BheWxvYWQoKX0gbWV0aG9kIHdhcyByZW1vdmVkOyB1c2UgdGhlCi1cbWV0aG9ke2F0dGFjaCgpfSBtZXRob2QgaW5zdGVhZF17Mi40fQotCi1UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGRlcHJlY2F0ZWQuICBUaGV5IGFyZSBkb2N1bWVudGVkIGhlcmUgZm9yCi1jb21wbGV0ZW5lc3MuCi0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfdHlwZX17XG9wdGlvbmFse2ZhaWxvYmp9fQotUmV0dXJuIHRoZSBtZXNzYWdlJ3MgY29udGVudCB0eXBlLCBhcyBhIHN0cmluZyBvZiB0aGUgZm9ybQotXG1pbWV0eXBle21haW50eXBlL3N1YnR5cGV9IGFzIHRha2VuIGZyb20gdGhlCi1cbWFpbGhlYWRlcntDb250ZW50LVR5cGV9IGhlYWRlci4KLVRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29lcmNlZCB0byBsb3dlcmNhc2UuCi0KLUlmIHRoZXJlIGlzIG5vIFxtYWlsaGVhZGVye0NvbnRlbnQtVHlwZX0gaGVhZGVyIGluIHRoZSBtZXNzYWdlLAotXHZhcntmYWlsb2JqfSBpcyByZXR1cm5lZCAoZGVmYXVsdHMgdG8gXGNvZGV7Tm9uZX0pLgotCi1cZGVwcmVjYXRlZHsyLjIuMn17VXNlIHRoZSBcbWV0aG9ke2dldF9jb250ZW50X3R5cGUoKX0gbWV0aG9kIGluc3RlYWQufQotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY31bTWVzc2FnZV17Z2V0X21haW5fdHlwZX17XG9wdGlvbmFse2ZhaWxvYmp9fQotUmV0dXJuIHRoZSBtZXNzYWdlJ3MgXGVtcGh7bWFpbn0gY29udGVudCB0eXBlLiAgVGhpcyBlc3NlbnRpYWxseSByZXR1cm5zIHRoZQotXHZhcnttYWludHlwZX0gcGFydCBvZiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IFxtZXRob2R7Z2V0X3R5cGUoKX0sIHdpdGggdGhlCi1zYW1lIHNlbWFudGljcyBmb3IgXHZhcntmYWlsb2JqfS4KLQotXGRlcHJlY2F0ZWR7Mi4yLjJ9e1VzZSB0aGUgXG1ldGhvZHtnZXRfY29udGVudF9tYWludHlwZSgpfSBtZXRob2QgaW5zdGVhZC59Ci1cZW5ke21ldGhvZGRlc2N9Ci0KLVxiZWdpbnttZXRob2RkZXNjfVtNZXNzYWdlXXtnZXRfc3VidHlwZX17XG9wdGlvbmFse2ZhaWxvYmp9fQotUmV0dXJuIHRoZSBtZXNzYWdlJ3Mgc3ViLWNvbnRlbnQgdHlwZS4gIFRoaXMgZXNzZW50aWFsbHkgcmV0dXJucyB0aGUKLVx2YXJ7c3VidHlwZX0gcGFydCBvZiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IFxtZXRob2R7Z2V0X3R5cGUoKX0sIHdpdGggdGhlCi1zYW1lIHNlbWFudGljcyBmb3IgXHZhcntmYWlsb2JqfS4KLQotXGRlcHJlY2F0ZWR7Mi4yLjJ9e1VzZSB0aGUgXG1ldGhvZHtnZXRfY29udGVudF9zdWJ0eXBlKCl9IG1ldGhvZCBpbnN0ZWFkLn0KLVxlbmR7bWV0aG9kZGVzY30KLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbG1pbWViYXNlLnRleCBiL0RvYy9saWIvZW1haWxtaW1lYmFzZS50ZXgKaW5kZXggMDcwYzlhMi4uNDczNWJlMyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9lbWFpbG1pbWViYXNlLnRleAorKysgYi9Eb2MvbGliL2VtYWlsbWltZWJhc2UudGV4CkBAIC0xLDMgKzEsMTEgQEAKK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUuYmFzZX0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLm5vbm11bHRpcGFydH0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLm11bHRpcGFydH0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5taW1lLmF1ZGlvfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUuaW1hZ2V9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwubWltZS5tZXNzYWdlfQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLm1pbWUudGV4dH0KIE9yZGluYXJpbHksIHlvdSBnZXQgYSBtZXNzYWdlIG9iamVjdCBzdHJ1Y3R1cmUgYnkgcGFzc2luZyBhIGZpbGUgb3IKIHNvbWUgdGV4dCB0byBhIHBhcnNlciwgd2hpY2ggcGFyc2VzIHRoZSB0ZXh0IGFuZCByZXR1cm5zIHRoZSByb290CiBtZXNzYWdlIG9iamVjdC4gIEhvd2V2ZXIgeW91IGNhbiBhbHNvIGJ1aWxkIGEgY29tcGxldGUgbWVzc2FnZQpAQCAtNiwyNiArMTQsMTYgQEAKIFxjbGFzc3tNZXNzYWdlfSBvYmplY3RzLCBtb3ZlIHRoZW0gYXJvdW5kLCBldGMuICBUaGlzIG1ha2VzIGEgdmVyeQogY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIHNsaWNpbmctYW5kLWRpY2luZyBNSU1FIG1lc3NhZ2VzLgogCi1Zb3UgY2FuIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc3RydWN0dXJlIGJ5IGNyZWF0aW5nIFxjbGFzc3tNZXNzYWdlfQotaW5zdGFuY2VzLCBhZGRpbmcgYXR0YWNobWVudHMgYW5kIGFsbCB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycyBtYW51YWxseS4KLUZvciBNSU1FIG1lc3NhZ2VzIHRob3VnaCwgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgcHJvdmlkZXMgc29tZQotY29udmVuaWVudCBzdWJjbGFzc2VzIHRvIG1ha2UgdGhpbmdzIGVhc2llci4gIEVhY2ggb2YgdGhlc2UgY2xhc3Nlcwotc2hvdWxkIGJlIGltcG9ydGVkIGZyb20gYSBtb2R1bGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjbGFzcywgZnJvbQotd2l0aGluIHRoZSBcbW9kdWxle2VtYWlsfSBwYWNrYWdlLiAgRS5nLjoKLQotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IGVtYWlsLk1JTUVJbWFnZS5NSU1FSW1hZ2UKLVxlbmR7dmVyYmF0aW19Ci0KLW9yCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gZW1haWwuTUlNRVRleHQgaW1wb3J0IE1JTUVUZXh0Ci1cZW5ke3ZlcmJhdGltfQorWW91IGNhbiBjcmVhdGUgYSBuZXcgb2JqZWN0IHN0cnVjdHVyZSBieSBjcmVhdGluZyBcY2xhc3N7TWVzc2FnZX0gaW5zdGFuY2VzLAorYWRkaW5nIGF0dGFjaG1lbnRzIGFuZCBhbGwgdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgbWFudWFsbHkuICBGb3IgTUlNRQorbWVzc2FnZXMgdGhvdWdoLCB0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSBwcm92aWRlcyBzb21lIGNvbnZlbmllbnQKK3N1YmNsYXNzZXMgdG8gbWFrZSB0aGluZ3MgZWFzaWVyLgogCiBIZXJlIGFyZSB0aGUgY2xhc3NlczoKIAogXGJlZ2lue2NsYXNzZGVzY317TUlNRUJhc2V9e19tYWludHlwZSwgX3N1YnR5cGUsICoqX3BhcmFtc30KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLmJhc2V9CisKIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCB0aGUgTUlNRS1zcGVjaWZpYyBzdWJjbGFzc2VzIG9mCiBcY2xhc3N7TWVzc2FnZX0uICBPcmRpbmFyaWx5IHlvdSB3b24ndCBjcmVhdGUgaW5zdGFuY2VzIHNwZWNpZmljYWxseQogb2YgXGNsYXNze01JTUVCYXNlfSwgYWx0aG91Z2ggeW91IGNvdWxkLiAgXGNsYXNze01JTUVCYXNlfSBpcyBwcm92aWRlZApAQCAtNDUsNiArNDMsOCBAQAogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVOb25NdWx0aXBhcnR9e30KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLm5vbm11bHRpcGFydH0KKwogQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRUJhc2V9LCB0aGlzIGlzIGFuIGludGVybWVkaWF0ZSBiYXNlIGNsYXNzIGZvcgogTUlNRSBtZXNzYWdlcyB0aGF0IGFyZSBub3QgXG1pbWV0eXBle211bHRpcGFydH0uICBUaGUgcHJpbWFyeSBwdXJwb3NlCiBvZiB0aGlzIGNsYXNzIGlzIHRvIHByZXZlbnQgdGhlIHVzZSBvZiB0aGUgXG1ldGhvZHthdHRhY2goKX0gbWV0aG9kLApAQCAtNTcsNiArNTcsNyBAQAogCiBcYmVnaW57Y2xhc3NkZXNjfXtNSU1FTXVsdGlwYXJ0fXtcb3B0aW9uYWx7c3VidHlwZVxvcHRpb25hbHssCiAgICAgYm91bmRhcnlcb3B0aW9uYWx7LCBfc3VicGFydHNcb3B0aW9uYWx7LCBfcGFyYW1zfX19fX0KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLm11bHRpcGFydH0KIAogQSBzdWJjbGFzcyBvZiBcY2xhc3N7TUlNRUJhc2V9LCB0aGlzIGlzIGFuIGludGVybWVkaWF0ZSBiYXNlIGNsYXNzIGZvcgogTUlNRSBtZXNzYWdlcyB0aGF0IGFyZSBcbWltZXR5cGV7bXVsdGlwYXJ0fS4gIE9wdGlvbmFsIFx2YXJ7X3N1YnR5cGV9CkBAIC04MCw4ICs4MSwzMSBAQAogXHZlcnNpb25hZGRlZHsyLjIuMn0KIFxlbmR7Y2xhc3NkZXNjfQogCitcYmVnaW57Y2xhc3NkZXNjfXtNSU1FQXBwbGljYXRpb259e19kYXRhXG9wdGlvbmFseywgX3N1YnR5cGVcb3B0aW9uYWx7LAorICAgIF9lbmNvZGVyXG9wdGlvbmFseywgKipfcGFyYW1zfX19fQorTW9kdWxlOiBcbW9kdWxle2VtYWlsLm1pbWUuYXBwbGljYXRpb259CisKK0Egc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVBcHBsaWNhdGlvbn0gY2xhc3MgaXMKK3VzZWQgdG8gcmVwcmVzZW50IE1JTUUgbWVzc2FnZSBvYmplY3RzIG9mIG1ham9yIHR5cGUgXG1pbWV0eXBle2FwcGxpY2F0aW9ufS4KK1x2YXJ7X2RhdGF9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBieXRlIGRhdGEuICBPcHRpb25hbCBcdmFye19zdWJ0eXBlfQorc3BlY2lmaWVzIHRoZSBNSU1FIHN1YnR5cGUgYW5kIGRlZmF1bHRzIHRvIFxtaW1ldHlwZXtvY3RldC1zdHJlYW19LiAgCisKK09wdGlvbmFsIFx2YXJ7X2VuY29kZXJ9IGlzIGEgY2FsbGFibGUgKGkuZS4gZnVuY3Rpb24pIHdoaWNoIHdpbGwKK3BlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBvZiB0aGUgZGF0YSBmb3IgdHJhbnNwb3J0LiAgVGhpcworY2FsbGFibGUgdGFrZXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgXGNsYXNze01JTUVBcHBsaWNhdGlvbn0gaW5zdGFuY2UuCitJdCBzaG91bGQgdXNlIFxtZXRob2R7Z2V0X3BheWxvYWQoKX0gYW5kIFxtZXRob2R7c2V0X3BheWxvYWQoKX0gdG8KK2NoYW5nZSB0aGUgcGF5bG9hZCB0byBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQgYW55CitcbWFpbGhlYWRlcntDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nfSBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlCitvYmplY3QgYXMgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgYmFzZTY0LiAgU2VlIHRoZQorXHJlZm1vZHVsZXtlbWFpbC5lbmNvZGVyc30gbW9kdWxlIGZvciBhIGxpc3Qgb2YgdGhlIGJ1aWx0LWluIGVuY29kZXJzLgorCitcdmFye19wYXJhbXN9IGFyZSBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUgYmFzZSBjbGFzcyBjb25zdHJ1Y3Rvci4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtjbGFzc2Rlc2N9CisKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVBdWRpb317X2F1ZGlvZGF0YVxvcHRpb25hbHssIF9zdWJ0eXBlXG9wdGlvbmFseywKICAgICBfZW5jb2RlclxvcHRpb25hbHssICoqX3BhcmFtc319fX0KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLmF1ZGlvfQogCiBBIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSwgdGhlIFxjbGFzc3tNSU1FQXVkaW99IGNsYXNzCiBpcyB1c2VkIHRvIGNyZWF0ZSBNSU1FIG1lc3NhZ2Ugb2JqZWN0cyBvZiBtYWpvciB0eXBlIFxtaW1ldHlwZXthdWRpb30uCkBAIC0xMDAsMTMgKzEyNCwxNCBAQAogY2hhbmdlIHRoZSBwYXlsb2FkIHRvIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKIFxtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UKIG9iamVjdCBhcyBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBiYXNlNjQuICBTZWUgdGhlCi1ccmVmbW9kdWxle2VtYWlsLkVuY29kZXJzfSBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCitccmVmbW9kdWxle2VtYWlsLmVuY29kZXJzfSBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCiAKIFx2YXJ7X3BhcmFtc30gYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e01JTUVJbWFnZX17X2ltYWdlZGF0YVxvcHRpb25hbHssIF9zdWJ0eXBlXG9wdGlvbmFseywKICAgICBfZW5jb2RlclxvcHRpb25hbHssICoqX3BhcmFtc319fX0KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLmltYWdlfQogCiBBIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSwgdGhlIFxjbGFzc3tNSU1FSW1hZ2V9IGNsYXNzIGlzCiB1c2VkIHRvIGNyZWF0ZSBNSU1FIG1lc3NhZ2Ugb2JqZWN0cyBvZiBtYWpvciB0eXBlIFxtaW1ldHlwZXtpbWFnZX0uCkBAIC0xMjUsMTMgKzE1MCwxNSBAQAogY2hhbmdlIHRoZSBwYXlsb2FkIHRvIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKIFxtYWlsaGVhZGVye0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmd9IG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UKIG9iamVjdCBhcyBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBiYXNlNjQuICBTZWUgdGhlCi1ccmVmbW9kdWxle2VtYWlsLkVuY29kZXJzfSBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCitccmVmbW9kdWxle2VtYWlsLmVuY29kZXJzfSBtb2R1bGUgZm9yIGEgbGlzdCBvZiB0aGUgYnVpbHQtaW4gZW5jb2RlcnMuCiAKIFx2YXJ7X3BhcmFtc30gYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoIHRvIHRoZSBcY2xhc3N7TUlNRUJhc2V9CiBjb25zdHJ1Y3Rvci4KIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57Y2xhc3NkZXNjfXtNSU1FTWVzc2FnZX17X21zZ1xvcHRpb25hbHssIF9zdWJ0eXBlfX0KK01vZHVsZTogXG1vZHVsZXtlbWFpbC5taW1lLm1lc3NhZ2V9CisKIEEgc3ViY2xhc3Mgb2YgXGNsYXNze01JTUVOb25NdWx0aXBhcnR9LCB0aGUgXGNsYXNze01JTUVNZXNzYWdlfSBjbGFzcwogaXMgdXNlZCB0byBjcmVhdGUgTUlNRSBvYmplY3RzIG9mIG1haW4gdHlwZSBcbWltZXR5cGV7bWVzc2FnZX0uCiBcdmFye19tc2d9IGlzIHVzZWQgYXMgdGhlIHBheWxvYWQsIGFuZCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGNsYXNzCkBAIC0xNDMsNiArMTcwLDggQEAKIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57Y2xhc3NkZXNjfXtNSU1FVGV4dH17X3RleHRcb3B0aW9uYWx7LCBfc3VidHlwZVxvcHRpb25hbHssIF9jaGFyc2V0fX19CitNb2R1bGU6IFxtb2R1bGV7ZW1haWwubWltZS50ZXh0fQorCiBBIHN1YmNsYXNzIG9mIFxjbGFzc3tNSU1FTm9uTXVsdGlwYXJ0fSwgdGhlIFxjbGFzc3tNSU1FVGV4dH0gY2xhc3MgaXMKIHVzZWQgdG8gY3JlYXRlIE1JTUUgb2JqZWN0cyBvZiBtYWpvciB0eXBlIFxtaW1ldHlwZXt0ZXh0fS4KIFx2YXJ7X3RleHR9IGlzIHRoZSBzdHJpbmcgZm9yIHRoZSBwYXlsb2FkLiAgXHZhcntfc3VidHlwZX0gaXMgdGhlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlscGFyc2VyLnRleCBiL0RvYy9saWIvZW1haWxwYXJzZXIudGV4CmluZGV4IDVmYWM5MmYuLjYwOWZhNDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWxwYXJzZXIudGV4CisrKyBiL0RvYy9saWIvZW1haWxwYXJzZXIudGV4CkBAIC0xLDQgKzEsNCBAQAotXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2VtYWlsLlBhcnNlcn0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbWFpbC5wYXJzZXJ9CiBcbW9kdWxlc3lub3BzaXN7UGFyc2UgZmxhdCB0ZXh0IGVtYWlsIG1lc3NhZ2VzIHRvIHByb2R1Y2UgYSBtZXNzYWdlCiAJICAgICAgICBvYmplY3Qgc3RydWN0dXJlLn0KIApAQCAtNDEsOSArNDEsMTAgQEAKIAogXHZlcnNpb25hZGRlZHsyLjR9CiAKLVRoZSBcY2xhc3N7RmVlZFBhcnNlcn0gcHJvdmlkZXMgYW4gQVBJIHRoYXQgaXMgY29uZHVjaXZlIHRvIGluY3JlbWVudGFsCi1wYXJzaW5nIG9mIGVtYWlsIG1lc3NhZ2VzLCBzdWNoIGFzIHdvdWxkIGJlIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlIHRleHQgb2YKLWFuIGVtYWlsIG1lc3NhZ2UgZnJvbSBhIHNvdXJjZSB0aGF0IGNhbiBibG9jayAoZS5nLiBhIHNvY2tldCkuICBUaGUKK1RoZSBcY2xhc3N7RmVlZFBhcnNlcn0sIGltcG9ydGVkIGZyb20gdGhlIFxtb2R1bGV7ZW1haWwuZmVlZHBhcnNlcn0gbW9kdWxlLAorcHJvdmlkZXMgYW4gQVBJIHRoYXQgaXMgY29uZHVjaXZlIHRvIGluY3JlbWVudGFsIHBhcnNpbmcgb2YgZW1haWwgbWVzc2FnZXMsCitzdWNoIGFzIHdvdWxkIGJlIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlIHRleHQgb2YgYW4gZW1haWwgbWVzc2FnZSBmcm9tIGEKK3NvdXJjZSB0aGF0IGNhbiBibG9jayAoZS5nLiBhIHNvY2tldCkuICBUaGUKIFxjbGFzc3tGZWVkUGFyc2VyfSBjYW4gb2YgY291cnNlIGJlIHVzZWQgdG8gcGFyc2UgYW4gZW1haWwgbWVzc2FnZSBmdWxseQogY29udGFpbmVkIGluIGEgc3RyaW5nIG9yIGEgZmlsZSwgYnV0IHRoZSBjbGFzc2ljIFxjbGFzc3tQYXJzZXJ9IEFQSSBtYXkgYmUKIG1vcmUgY29udmVuaWVudCBmb3Igc3VjaCB1c2UgY2FzZXMuICBUaGUgc2VtYW50aWNzIGFuZCByZXN1bHRzIG9mIHRoZSB0d28KQEAgLTU2LDE0ICs1NywxNCBAQAogam9iIG9mIHBhcnNpbmcgbm9uLWNvbXBsaWFudCBtZXNzYWdlcywgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhCiBtZXNzYWdlIHdhcyBkZWVtZWQgYnJva2VuLiAgSXQgd2lsbCBwb3B1bGF0ZSBhIG1lc3NhZ2Ugb2JqZWN0J3MgXHZhcntkZWZlY3RzfQogYXR0cmlidXRlIHdpdGggYSBsaXN0IG9mIGFueSBwcm9ibGVtcyBpdCBmb3VuZCBpbiBhIG1lc3NhZ2UuICBTZWUgdGhlCi1ccmVmbW9kdWxle2VtYWlsLkVycm9yc30gbW9kdWxlIGZvciB0aGUgbGlzdCBvZiBkZWZlY3RzIHRoYXQgaXQgY2FuIGZpbmQuCitccmVmbW9kdWxle2VtYWlsLmVycm9yc30gbW9kdWxlIGZvciB0aGUgbGlzdCBvZiBkZWZlY3RzIHRoYXQgaXQgY2FuIGZpbmQuCiAKIEhlcmUgaXMgdGhlIEFQSSBmb3IgdGhlIFxjbGFzc3tGZWVkUGFyc2VyfToKIAogXGJlZ2lue2NsYXNzZGVzY317RmVlZFBhcnNlcn17XG9wdGlvbmFse19mYWN0b3J5fX0KIENyZWF0ZSBhIFxjbGFzc3tGZWVkUGFyc2VyfSBpbnN0YW5jZS4gIE9wdGlvbmFsIFx2YXJ7X2ZhY3Rvcnl9IGlzIGEKIG5vLWFyZ3VtZW50IGNhbGxhYmxlIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgbWVzc2FnZSBvYmplY3QgaXMKLW5lZWRlZC4gIEl0IGRlZmF1bHRzIHRvIHRoZSBcY2xhc3N7ZW1haWwuTWVzc2FnZS5NZXNzYWdlfSBjbGFzcy4KK25lZWRlZC4gIEl0IGRlZmF1bHRzIHRvIHRoZSBcY2xhc3N7ZW1haWwubWVzc2FnZS5NZXNzYWdlfSBjbGFzcy4KIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bRmVlZFBhcnNlcl17ZmVlZH17ZGF0YX0KQEAgLTgyLDIxICs4MywyMiBAQAogCiBcc3Vic3Vic2VjdGlvbntQYXJzZXIgY2xhc3MgQVBJfQogCi1UaGUgXGNsYXNze1BhcnNlcn0gcHJvdmlkZXMgYW4gQVBJIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYSBtZXNzYWdlIHdoZW4KLXRoZSBjb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBhcmUgYXZhaWxhYmxlIGluIGEgc3RyaW5nIG9yIGZpbGUuICBUaGUKLVxtb2R1bGV7ZW1haWwuUGFyc2VyfSBtb2R1bGUgYWxzbyBwcm92aWRlcyBhIHNlY29uZCBjbGFzcywgY2FsbGVkCitUaGUgXGNsYXNze1BhcnNlcn0gY2xhc3MsIGltcG9ydGVkIGZyb20gdGhlIFxtb2R1bGV7ZW1haWwucGFyc2VyfSBtb2R1bGUsCitwcm92aWRlcyBhbiBBUEkgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSBhIG1lc3NhZ2Ugd2hlbiB0aGUgY29tcGxldGUgY29udGVudHMKK29mIHRoZSBtZXNzYWdlIGFyZSBhdmFpbGFibGUgaW4gYSBzdHJpbmcgb3IgZmlsZS4gIFRoZQorXG1vZHVsZXtlbWFpbC5wYXJzZXJ9IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgc2Vjb25kIGNsYXNzLCBjYWxsZWQKIFxjbGFzc3tIZWFkZXJQYXJzZXJ9IHdoaWNoIGNhbiBiZSB1c2VkIGlmIHlvdSdyZSBvbmx5IGludGVyZXN0ZWQgaW4KIHRoZSBoZWFkZXJzIG9mIHRoZSBtZXNzYWdlLiBcY2xhc3N7SGVhZGVyUGFyc2VyfSBjYW4gYmUgbXVjaCBmYXN0ZXIgaW4KIHRoZXNlIHNpdHVhdGlvbnMsIHNpbmNlIGl0IGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UgdGhlIG1lc3NhZ2UgYm9keSwKIGluc3RlYWQgc2V0dGluZyB0aGUgcGF5bG9hZCB0byB0aGUgcmF3IGJvZHkgYXMgYSBzdHJpbmcuCiBcY2xhc3N7SGVhZGVyUGFyc2VyfSBoYXMgdGhlIHNhbWUgQVBJIGFzIHRoZSBcY2xhc3N7UGFyc2VyfSBjbGFzcy4KIAotXGJlZ2lue2NsYXNzZGVzY317UGFyc2VyfXtcb3B0aW9uYWx7X2NsYXNzXG9wdGlvbmFseywgc3RyaWN0fX19CitcYmVnaW57Y2xhc3NkZXNjfXtQYXJzZXJ9e1xvcHRpb25hbHtfY2xhc3N9fQogVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgXGNsYXNze1BhcnNlcn0gY2xhc3MgdGFrZXMgYW4gb3B0aW9uYWwKIGFyZ3VtZW50IFx2YXJ7X2NsYXNzfS4gIFRoaXMgbXVzdCBiZSBhIGNhbGxhYmxlIGZhY3RvcnkgKHN1Y2ggYXMgYQogZnVuY3Rpb24gb3IgYSBjbGFzcyksIGFuZCBpdCBpcyB1c2VkIHdoZW5ldmVyIGEgc3ViLW1lc3NhZ2Ugb2JqZWN0CiBuZWVkcyB0byBiZSBjcmVhdGVkLiAgSXQgZGVmYXVsdHMgdG8gXGNsYXNze01lc3NhZ2V9IChzZWUKLVxyZWZtb2R1bGV7ZW1haWwuTWVzc2FnZX0pLiAgVGhlIGZhY3Rvcnkgd2lsbCBiZSBjYWxsZWQgd2l0aG91dAorXHJlZm1vZHVsZXtlbWFpbC5tZXNzYWdlfSkuICBUaGUgZmFjdG9yeSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0CiBhcmd1bWVudHMuCiAKIFRoZSBvcHRpb25hbCBcdmFye3N0cmljdH0gZmxhZyBpcyBpZ25vcmVkLiAgXGRlcHJlY2F0ZWR7Mi40fXtCZWNhdXNlIHRoZQpAQCAtMjAxLDYgKzIwMyw2IEBACiAgICAgICBcbWV0aG9ke2lzX211bHRpcGFydCgpfSBtZXRob2QgbWF5IHJldHVybiBcY29kZXtGYWxzZX0uICBJZiBzdWNoCiAgICAgICBtZXNzYWdlcyB3ZXJlIHBhcnNlZCB3aXRoIHRoZSBcY2xhc3N7RmVlZFBhcnNlcn0sIHRoZXkgd2lsbCBoYXZlIGFuCiAgICAgICBpbnN0YW5jZSBvZiB0aGUgXGNsYXNze011bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdH0gY2xhc3MgaW4gdGhlaXIKLSAgICAgIFx2YXJ7ZGVmZWN0c30gYXR0cmlidXRlIGxpc3QuICBTZWUgXHJlZm1vZHVsZXtlbWFpbC5FcnJvcnN9IGZvcgorICAgICAgXHZhcntkZWZlY3RzfSBhdHRyaWJ1dGUgbGlzdC4gIFNlZSBccmVmbW9kdWxle2VtYWlsLmVycm9yc30gZm9yCiAgICAgICBkZXRhaWxzLgogXGVuZHtpdGVtaXplfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbHV0aWwudGV4IGIvRG9jL2xpYi9lbWFpbHV0aWwudGV4CmluZGV4IDQ5MWEyYjkuLmZlOTY0NzMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWx1dGlsLnRleAorKysgYi9Eb2MvbGliL2VtYWlsdXRpbC50ZXgKQEAgLTEsNyArMSw3IEBACi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwuVXRpbHN9CitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17ZW1haWwudXRpbHN9CiBcbW9kdWxlc3lub3BzaXN7TWlzY2VsbGFuZW91cyBlbWFpbCBwYWNrYWdlIHV0aWxpdGllcy59CiAKLVRoZXJlIGFyZSBzZXZlcmFsIHVzZWZ1bCB1dGlsaXRpZXMgcHJvdmlkZWQgaW4gdGhlIFxtb2R1bGV7ZW1haWwuVXRpbHN9CitUaGVyZSBhcmUgc2V2ZXJhbCB1c2VmdWwgdXRpbGl0aWVzIHByb3ZpZGVkIGluIHRoZSBcbW9kdWxle2VtYWlsLnV0aWxzfQogbW9kdWxlOgogCiBcYmVnaW57ZnVuY2Rlc2N9e3F1b3RlfXtzdHJ9CkBAIC0zOCw3ICszOCw3IEBACiBzaW1wbGUgZXhhbXBsZSB0aGF0IGdldHMgYWxsIHRoZSByZWNpcGllbnRzIG9mIGEgbWVzc2FnZToKIAogXGJlZ2lue3ZlcmJhdGltfQotZnJvbSBlbWFpbC5VdGlscyBpbXBvcnQgZ2V0YWRkcmVzc2VzCitmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBnZXRhZGRyZXNzZXMKIAogdG9zID0gbXNnLmdldF9hbGwoJ3RvJywgW10pCiBjY3MgPSBtc2cuZ2V0X2FsbCgnY2MnLCBbXSkKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCBmYWQ4ZmU3Li5lYWMzNWRlIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC04Nyw3ICs4Nyw2IEBACiBcaW5wdXR7bGlic3RyaW5nc30gICAgICAgICAgICAgICUgU3RyaW5nIFNlcnZpY2VzCiBcaW5wdXR7bGlic3RyaW5nfQogXGlucHV0e2xpYnJlfQotXGlucHV0e2xpYnJlY29udmVydH0KIFxpbnB1dHtsaWJzdHJ1Y3R9ICAgJSBYWFggYWxzby9iZXR0ZXIgaW4gRmlsZSBGb3JtYXRzPwogXGlucHV0e2xpYmRpZmZsaWJ9CiBcaW5wdXR7bGlic3RyaW5naW99CkBAIC0zNzIsNiArMzcxLDcgQEAKIFxpbnB1dHtsaWJibHRpbn0gICAgICAgICAgICAgICAgJSByZWFsbHkgX19idWlsdGluX18KIFxpbnB1dHtsaWJtYWlufSAgICAgICAgICAgICAgICAgJSByZWFsbHkgX19tYWluX18KIFxpbnB1dHtsaWJ3YXJuaW5nc30KK1xpbnB1dHtsaWJjb250ZXh0bGlifQogXGlucHV0e2xpYmF0ZXhpdH0KIFxpbnB1dHtsaWJ0cmFjZWJhY2t9CiBcaW5wdXR7bGliZnV0dXJlfSAgICAgICAgICAgICAgICUgcmVhbGx5IF9fZnV0dXJlX18KQEAgLTM5NSw2ICszOTUsNyBAQAogXGlucHV0e2xpYnppcGltcG9ydH0KIFxpbnB1dHtsaWJwa2d1dGlsfQogXGlucHV0e2xpYm1vZHVsZWZpbmRlcn0KK1xpbnB1dHtsaWJydW5weX0KIAogCiAlID09PT09PT09PT09PT0KQEAgLTQ1NCw4ICs0NTUsNiBAQAogJVxpbnB1dHtsaWJjbXBjYWNoZX0KICVcaW5wdXR7bGliY21wfQogJVxpbnB1dHtsaWJuaX0KLSVcaW5wdXR7bGlicmVnZXh9Ci0lXGlucHV0e2xpYnJlZ3N1Yn0KIAogXGNoYXB0ZXJ7UmVwb3J0aW5nIEJ1Z3N9CiBcaW5wdXR7cmVwb3J0aW5nYnVnc30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYXJyYXkudGV4IGIvRG9jL2xpYi9saWJhcnJheS50ZXgKaW5kZXggODk3MzEwZC4uZWFmNTg4OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJhcnJheS50ZXgKKysrIGIvRG9jL2xpYi9saWJhcnJheS50ZXgKQEAgLTEzOSw4ICsxMzksOCBAQAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bYXJyYXlde2Zyb211bmljb2RlfXtzfQotRXh0ZW5kcyB0aGlzIGFycmF5IHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiB1bmljb2RlIHN0cmluZy4KLVRoZSBhcnJheSBtdXN0IGJlIGEgdHlwZSAndScgYXJyYXk7IG90aGVyd2lzZSBhIFZhbHVlRXJyb3IKK0V4dGVuZHMgdGhpcyBhcnJheSB3aXRoIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gdW5pY29kZSBzdHJpbmcuICBUaGUgYXJyYXkKK211c3QgYmUgYSB0eXBlIFxjb2Rleyd1J30gYXJyYXk7IG90aGVyd2lzZSBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0KIGlzIHJhaXNlZC4gIFVzZSBcc2FtcHthcnJheS5mcm9tc3RyaW5nKHVzdHIuZGVjb2RlKGVuYykpfSB0bwogYXBwZW5kIFVuaWNvZGUgZGF0YSB0byBhbiBhcnJheSBvZiBzb21lIG90aGVyIHR5cGUuCiBcZW5ke21ldGhvZGRlc2N9CkBAIC0xOTcsOCArMTk3LDggQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9W2FycmF5XXt0b3VuaWNvZGV9e30KIENvbnZlcnQgdGhlIGFycmF5IHRvIGEgdW5pY29kZSBzdHJpbmcuICBUaGUgYXJyYXkgbXVzdCBiZQotYSB0eXBlICd1JyBhcnJheTsgb3RoZXJ3aXNlIGEgVmFsdWVFcnJvciBpcyByYWlzZWQuICBVc2UKLWFycmF5LnRvc3RyaW5nKCkuZGVjb2RlKGVuYykgdG8gb2J0YWluIGEgdW5pY29kZSBzdHJpbmcKK2EgdHlwZSBcY29kZXsndSd9IGFycmF5OyBvdGhlcndpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzIHJhaXNlZC4KK1VzZSBcc2FtcHthcnJheS50b3N0cmluZygpLmRlY29kZShlbmMpfSB0byBvYnRhaW4gYSB1bmljb2RlIHN0cmluZwogZnJvbSBhbiBhcnJheSBvZiBzb21lIG90aGVyIHR5cGUuCiBcZW5ke21ldGhvZGRlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYXN0LnRleCBiL0RvYy9saWIvbGliYXN0LnRleAppbmRleCBiM2MzMTQ4Li5iMjk1NmFlIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmFzdC50ZXgKKysrIGIvRG9jL2xpYi9saWJhc3QudGV4CkBAIC00NywxMSArNDcsMTEgQEAKIGNhbiBoYXZlIHplcm8tb3ItbW9yZSB2YWx1ZXMgKG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrKSwgdGhlCiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIFB5dGhvbiBsaXN0cy4KIAotXHN1YnNlY3Rpb257QWJzdHJhY3QgR3JhbW1hcn0KK1xzZWN0aW9ue0Fic3RyYWN0IEdyYW1tYXJ9CiAKIFRoZSBtb2R1bGUgZGVmaW5lcyBhIHN0cmluZyBjb25zdGFudCBcY29kZXtfX3ZlcnNpb25fX30gd2hpY2gKIGlzIHRoZSBkZWNpbWFsIHN1YnZlcnNpb24gcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIHNob3duIGJlbG93LgogCiBUaGUgYWJzdHJhY3QgZ3JhbW1hciBpcyBjdXJyZW50bHkgZGVmaW5lZCBhcyBmb2xsb3dzOgogCi1cdmVyYmF0aW1pbnB1dHsuLi8uLi9QYXJzZXIvUHl0aG9uLmFzZGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorXHZlcmJhdGltaW5wdXR7Li4vLi4vUGFyc2VyL1B5dGhvbi5hc2RsfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJhdWRpb29wLnRleCBiL0RvYy9saWIvbGliYXVkaW9vcC50ZXgKaW5kZXggNzZiY2RiZi4uNTJjNmYzZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJhdWRpb29wLnRleAorKysgYi9Eb2MvbGliL2xpYmF1ZGlvb3AudGV4CkBAIC0xMiw5ICsxMiwxMCBAQAogbW9kdWxlcy4gIEFsbCBzY2FsYXIgaXRlbXMgYXJlIGludGVnZXJzLCB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZS4KIAogJSBUaGlzIHBhcmEgaXMgbW9zdGx5IGhlcmUgdG8gcHJvdmlkZSBhbiBleGN1c2UgZm9yIHRoZSBpbmRleCBlbnRyaWVzLi4uCi1UaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciB1LUxBVyBhbmQgSW50ZWwvRFZJIEFEUENNIGVuY29kaW5ncy4KK1RoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGEtTEFXLCB1LUxBVyBhbmQgSW50ZWwvRFZJIEFEUENNIGVuY29kaW5ncy4KIFxpbmRleHtJbnRlbC9EVkkgQURQQ019CiBcaW5kZXh7QURQQ00sIEludGVsL0RWSX0KK1xpbmRleHthLUxBV30KIFxpbmRleHt1LUxBV30KIAogQSBmZXcgb2YgdGhlIG1vcmUgY29tcGxpY2F0ZWQgb3BlcmF0aW9ucyBvbmx5IHRha2UgMTYtYml0IHNhbXBsZXMsCkBAIC00Miw2ICs0MywxMyBAQAogaGFzIHRoZSB3aWR0aCBzcGVjaWZpZWQgaW4gXHZhcnt3aWR0aH0uCiBcZW5ke2Z1bmNkZXNjfQogCitcYmVnaW57ZnVuY2Rlc2N9e2FsYXcybGlufXtmcmFnbWVudCwgd2lkdGh9CitDb252ZXJ0IHNvdW5kIGZyYWdtZW50cyBpbiBhLUxBVyBlbmNvZGluZyB0byBsaW5lYXJseSBlbmNvZGVkIHNvdW5kCitmcmFnbWVudHMuICBhLUxBVyBlbmNvZGluZyBhbHdheXMgdXNlcyA4IGJpdHMgc2FtcGxlcywgc28gXHZhcnt3aWR0aH0KK3JlZmVycyBvbmx5IHRvIHRoZSBzYW1wbGUgd2lkdGggb2YgdGhlIG91dHB1dCBmcmFnbWVudCBoZXJlLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e2F2Z317ZnJhZ21lbnQsIHdpZHRofQogUmV0dXJuIHRoZSBhdmVyYWdlIG92ZXIgYWxsIHNhbXBsZXMgaW4gdGhlIGZyYWdtZW50LgogXGVuZHtmdW5jZGVzY30KQEAgLTk4LDEwICsxMDYsNiBAQAogUmV0dXJuIHRoZSB2YWx1ZSBvZiBzYW1wbGUgXHZhcntpbmRleH0gZnJvbSB0aGUgZnJhZ21lbnQuCiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e2xpbjJsaW59e2ZyYWdtZW50LCB3aWR0aCwgbmV3d2lkdGh9Ci1Db252ZXJ0IHNhbXBsZXMgYmV0d2VlbiAxLSwgMi0gYW5kIDQtYnl0ZSBmb3JtYXRzLgotXGVuZHtmdW5jZGVzY30KLQogXGJlZ2lue2Z1bmNkZXNjfXtsaW4yYWRwY219e2ZyYWdtZW50LCB3aWR0aCwgc3RhdGV9CiBDb252ZXJ0IHNhbXBsZXMgdG8gNCBiaXQgSW50ZWwvRFZJIEFEUENNIGVuY29kaW5nLiAgQURQQ00gY29kaW5nIGlzIGFuCiBhZGFwdGl2ZSBjb2Rpbmcgc2NoZW1lLCB3aGVyZWJ5IGVhY2ggNCBiaXQgbnVtYmVyIGlzIHRoZSBkaWZmZXJlbmNlCkBAIC0xMTcsNiArMTIxLDE4IEBACiBwYWNrZWQgMiA0LWJpdCB2YWx1ZXMgcGVyIGJ5dGUuCiBcZW5ke2Z1bmNkZXNjfQogCitcYmVnaW57ZnVuY2Rlc2N9e2xpbjJhbGF3fXtmcmFnbWVudCwgd2lkdGh9CitDb252ZXJ0IHNhbXBsZXMgaW4gdGhlIGF1ZGlvIGZyYWdtZW50IHRvIGEtTEFXIGVuY29kaW5nIGFuZCByZXR1cm4KK3RoaXMgYXMgYSBQeXRob24gc3RyaW5nLiAgYS1MQVcgaXMgYW4gYXVkaW8gZW5jb2RpbmcgZm9ybWF0IHdoZXJlYnkKK3lvdSBnZXQgYSBkeW5hbWljIHJhbmdlIG9mIGFib3V0IDEzIGJpdHMgdXNpbmcgb25seSA4IGJpdCBzYW1wbGVzLiAgSXQKK2lzIHVzZWQgYnkgdGhlIFN1biBhdWRpbyBoYXJkd2FyZSwgYW1vbmcgb3RoZXJzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2xpbjJsaW59e2ZyYWdtZW50LCB3aWR0aCwgbmV3d2lkdGh9CitDb252ZXJ0IHNhbXBsZXMgYmV0d2VlbiAxLSwgMi0gYW5kIDQtYnl0ZSBmb3JtYXRzLgorXGVuZHtmdW5jZGVzY30KKwogXGJlZ2lue2Z1bmNkZXNjfXtsaW4ydWxhd317ZnJhZ21lbnQsIHdpZHRofQogQ29udmVydCBzYW1wbGVzIGluIHRoZSBhdWRpbyBmcmFnbWVudCB0byB1LUxBVyBlbmNvZGluZyBhbmQgcmV0dXJuCiB0aGlzIGFzIGEgUHl0aG9uIHN0cmluZy4gIHUtTEFXIGlzIGFuIGF1ZGlvIGVuY29kaW5nIGZvcm1hdCB3aGVyZWJ5CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmJzZGRiLnRleCBiL0RvYy9saWIvbGliYnNkZGIudGV4CmluZGV4IGZhN2JiNGIuLmE1Y2RhNmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliYnNkZGIudGV4CisrKyBiL0RvYy9saWIvbGliYnNkZGIudGV4CkBAIC0xNSw5ICsxNSw4IEBACiBzZXJpYWxpemUgdGhlbSBzb21laG93LCB0eXBpY2FsbHkgdXNpbmcgXGZ1bmN0aW9ue21hcnNoYWwuZHVtcHMoKX0gb3IgCiBcZnVuY3Rpb257cGlja2xlLmR1bXBzfS4KIAotU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zIHRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgcmVxdWlyZXMgdGhlCi1CZXJrZWxleSBEQiBsaWJyYXJ5IHZlcnNpb24gMy4yIG9yIGxhdGVyIChpdCBpcyBrbm93biB0byB3b3JrIHdpdGggMy4yCi10aHJvdWdoIDQuMyBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcpLgorVGhlIFxtb2R1bGV7YnNkZGJ9IG1vZHVsZSByZXF1aXJlcyBhIEJlcmtlbGV5IERCIGxpYnJhcnkgdmVyc2lvbiBmcm9tCiszLjMgdGhydSA0LjQuCiAKIFxiZWdpbntzZWVhbHNvfQogICBcc2VldXJse2h0dHA6Ly9weWJzZGRiLnNvdXJjZWZvcmdlLm5ldC99e1dlYnNpdGUgd2l0aCBkb2N1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNhbGVuZGFyLnRleCBiL0RvYy9saWIvbGliY2FsZW5kYXIudGV4CmluZGV4IGJmM2E3ZDYuLmFjZmQyZGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY2FsZW5kYXIudGV4CisrKyBiL0RvYy9saWIvbGliY2FsZW5kYXIudGV4CkBAIC0xNSwxMiArMTUsMTc3IEBACiB3ZWVrIHRvIFN1bmRheSAoNikgb3IgdG8gYW55IG90aGVyIHdlZWtkYXkuICBQYXJhbWV0ZXJzIHRoYXQgc3BlY2lmeQogZGF0ZXMgYXJlIGdpdmVuIGFzIGludGVnZXJzLgogCi1Nb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucyByZWx5IG9uIHRoZSBcbW9kdWxle2RhdGV0aW1lfSBtb2R1bGUgd2hpY2gKLXVzZXMgYW4gaWRlYWxpemVkIGNhbGVuZGFyLCB0aGUgY3VycmVudCBHcmVnb3JpYW4gY2FsZW5kYXIgaW5kZWZpbml0ZWx5Ci1leHRlbmRlZCBpbiBib3RoIGRpcmVjdGlvbnMuICBUaGlzIG1hdGNoZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0icHJvbGVwdGljIEdyZWdvcmlhbiIgY2FsZW5kYXIgaW4gRGVyc2hvd2l0eiBhbmQgUmVpbmdvbGQncyBib29rCi0iQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhciBmb3IgYWxsCi1jb21wdXRhdGlvbnMuCitNb3N0IG9mIHRoZXNlIGZ1bmN0aW9ucyBhbmQgY2xhc3NzZXMgcmVseSBvbiB0aGUgXG1vZHVsZXtkYXRldGltZX0KK21vZHVsZSB3aGljaCB1c2VzIGFuIGlkZWFsaXplZCBjYWxlbmRhciwgdGhlIGN1cnJlbnQgR3JlZ29yaWFuCitjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW4gYm90aCBkaXJlY3Rpb25zLiAgVGhpcyBtYXRjaGVzCit0aGUgZGVmaW5pdGlvbiBvZiB0aGUgInByb2xlcHRpYyBHcmVnb3JpYW4iIGNhbGVuZGFyIGluIERlcnNob3dpdHoKK2FuZCBSZWluZ29sZCdzIGJvb2sgIkNhbGVuZHJpY2FsIENhbGN1bGF0aW9ucyIsIHdoZXJlIGl0J3MgdGhlCitiYXNlIGNhbGVuZGFyIGZvciBhbGwgY29tcHV0YXRpb25zLgorCitcYmVnaW57Y2xhc3NkZXNjfXtDYWxlbmRhcn17XG9wdGlvbmFse2ZpcnN0d2Vla2RheX19CitDcmVhdGVzIGEgXGNsYXNze0NhbGVuZGFyfSBvYmplY3QuIFx2YXJ7Zmlyc3R3ZWVrZGF5fSBpcyBhbiBpbnRlZ2VyCitzcGVjaWZ5aW5nIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuIFxjb2RlezB9IGlzIE1vbmRheSAodGhlIGRlZmF1bHQpLAorXGNvZGV7Nn0gaXMgU3VuZGF5LgorCitBIFxjbGFzc3tDYWxlbmRhcn0gb2JqZWN0IHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcyB0aGF0IGNhbgorYmUgdXNlZCBmb3IgcHJlcGFyaW5nIHRoZSBjYWxlbmRhciBkYXRhIGZvciBmb3JtYXR0aW5nLiBUaGlzCitjbGFzcyBkb2Vzbid0IGRvIGFueSBmb3JtYXR0aW5nIGl0c2VsZi4gVGhpcyBpcyB0aGUgam9iIG9mCitzdWJjbGFzc2VzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKworXGNsYXNze0NhbGVuZGFyfSBpbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtpdGVyd2Vla2RheXN9e3dlZWtkYXl9CitSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSB3ZWVrIGRheSBudW1iZXJzIHRoYXQgd2lsbCBiZSB1c2VkCitmb3Igb25lIHdlZWsuIFRoZSBmaXJzdCBudW1iZXIgZnJvbSB0aGUgaXRlcmF0b3Igd2lsbCBiZSB0aGUKK3NhbWUgYXMgdGhlIG51bWJlciByZXR1cm5lZCBieSBcbWV0aG9ke2ZpcnN0d2Vla2RheSgpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJtb250aGRhdGVzfXt5ZWFyLCBtb250aH0KK1JldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIG1vbnRoIFx2YXJ7bW9udGh9ICgxLTEyKSBpbiB0aGUKK3llYXIgXHZhcnt5ZWFyfS4gVGhpcyBpdGVyYXRvciB3aWxsIHJldHVybiBhbGwgZGF5cyAoYXMKK1xjbGFzc3tkYXRldGltZS5kYXRlfSBvYmplY3RzKSBmb3IgdGhlIG1vbnRoIGFuZCBhbGwgZGF5cworYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgbW9udGggb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbW9udGgKK3RoYXQgYXJlIHJlcXVpcmVkIHRvIGdldCBhIGNvbXBsZXRlIHdlZWsuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpdGVybW9udGhkYXlzMn17eWVhciwgbW9udGh9CitSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSBtb250aCBcdmFye21vbnRofSBpbiB0aGUgeWVhcgorXHZhcnt5ZWFyfSBzaW1pbGFyIHRvIFxtZXRob2R7aXRlcm1vbnRoZGF0ZXMoKX0uIERheXMgcmV0dXJuZWQKK3dpbGwgYmUgdHVwbGVzIGNvbnNpc3Rpbmcgb2YgYSBkYXkgbnVtYmVyIGFuZCBhIHdlZWsgZGF5CitudW1iZXIuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpdGVybW9udGhkYXlzfXt5ZWFyLCBtb250aH0KK1JldHVybiBhbiBpdGVyYXRvciBmb3IgdGhlIG1vbnRoIFx2YXJ7bW9udGh9IGluIHRoZSB5ZWFyCitcdmFye3llYXJ9IHNpbWlsYXIgdG8gXG1ldGhvZHtpdGVybW9udGhkYXRlcygpfS4gRGF5cyByZXR1cm5lZAord2lsbCBzaW1wbHkgYmUgZGF5IG51bWJlcnMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXttb250aGRhdGVzY2FsZW5kYXJ9e3llYXIsIG1vbnRofQorUmV0dXJuIGEgbGlzdCBvZiB0aGUgd2Vla3MgaW4gdGhlIG1vbnRoIFx2YXJ7bW9udGh9IG9mCit0aGUgXHZhcnt5ZWFyfSBhcyBmdWxsIHdlZWtzLiBXZWVrcyBhcmUgbGlzdHMgb2Ygc2V2ZW4KK1xjbGFzc3tkYXRldGltZS5kYXRlfSBvYmplY3RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bW9udGhkYXlzMmNhbGVuZGFyfXt5ZWFyLCBtb250aH0KK1JldHVybiBhIGxpc3Qgb2YgdGhlIHdlZWtzIGluIHRoZSBtb250aCBcdmFye21vbnRofSBvZgordGhlIFx2YXJ7eWVhcn0gYXMgZnVsbCB3ZWVrcy4gV2Vla3MgYXJlIGxpc3RzIG9mIHNldmVuCit0dXBsZXMgb2YgZGF5IG51bWJlcnMgYW5kIHdlZWtkYXkgbnVtYmVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e21vbnRoZGF5c2NhbGVuZGFyfXt5ZWFyLCBtb250aH0KK1JldHVybiBhIGxpc3Qgb2YgdGhlIHdlZWtzIGluIHRoZSBtb250aCBcdmFye21vbnRofSBvZgordGhlIFx2YXJ7eWVhcn0gYXMgZnVsbCB3ZWVrcy4gV2Vla3MgYXJlIGxpc3RzIG9mIHNldmVuCitkYXkgbnVtYmVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3llYXJkYXRlc2NhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KK1JldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nLiBUaGUgcmV0dXJuCit2YWx1ZSBpcyBhIGxpc3Qgb2YgbW9udGggcm93cy4gRWFjaCBtb250aCByb3cgY29udGFpbnMgdXAgdG8gXHZhcnt3aWR0aH0KK21vbnRocyAoZGVmYXVsdGluZyB0byAzKS4gRWFjaCBtb250aCBjb250YWlucyBiZXR3ZWVuIDQgYW5kIDYgd2Vla3MgYW5kCitlYWNoIHdlZWsgY29udGFpbnMgMS0tNyBkYXlzLiBEYXlzIGFyZSBcY2xhc3N7ZGF0ZXRpbWUuZGF0ZX0gb2JqZWN0cy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3llYXJkYXlzMmNhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KK1JldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCitcbWV0aG9ke3llYXJkYXRlc2NhbGVuZGFyKCl9KS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgdHVwbGVzIG9mCitkYXkgbnVtYmVycyBhbmQgd2Vla2RheSBudW1iZXJzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXt5ZWFyZGF5c2NhbGVuZGFyfXt5ZWFyLCBtb250aFxvcHRpb25hbHssIHdpZHRofX0KK1JldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCitcbWV0aG9ke3llYXJkYXRlc2NhbGVuZGFyKCl9KS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgZGF5IG51bWJlcnMuCitEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCitcZW5ke21ldGhvZGRlc2N9CisKKworXGJlZ2lue2NsYXNzZGVzY317VGV4dENhbGVuZGFyfXtcb3B0aW9uYWx7Zmlyc3R3ZWVrZGF5fX0KK1RoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBjYWxlbmRhcnMuCisKK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtjbGFzc2Rlc2N9CisKK1xjbGFzc3tUZXh0Q2FsZW5kYXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdG1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsfX19CitSZXR1cm4gYSBtb250aCdzIGNhbGVuZGFyIGluIGEgbXVsdGktbGluZSBzdHJpbmcuIElmIFx2YXJ7d30gaXMKK3Byb3ZpZGVkLCBpdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkYXRlIGNvbHVtbnMsIHdoaWNoIGFyZQorY2VudGVyZWQuIElmIFx2YXJ7bH0gaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRoYXQKK2VhY2ggd2VlayB3aWxsIHVzZS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKK1xmdW5jdGlvbntzZXRmaXJzdHdlZWtkYXkoKX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtwcm1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsfX19CitQcmludCBhIG1vbnRoJ3MgY2FsZW5kYXIgYXMgcmV0dXJuZWQgYnkgXG1ldGhvZHtmb3JtYXRtb250aCgpfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdHllYXJ9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywgd1xvcHRpb25hbHssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFxvcHRpb25hbHssIGNcb3B0aW9uYWx7LCBtfX19fX0KK1JldHVybiBhIFx2YXJ7bX0tY29sdW1uIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLgorT3B0aW9uYWwgcGFyYW1ldGVycyBcdmFye3d9LCBcdmFye2x9LCBhbmQgXHZhcntjfSBhcmUgZm9yIGRhdGUgY29sdW1uCit3aWR0aCwgbGluZXMgcGVyIHdlZWssIGFuZCBudW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gbW9udGggY29sdW1ucywKK3Jlc3BlY3RpdmVseS4gRGVwZW5kcyBvbiB0aGUgZmlyc3Qgd2Vla2RheSBhcyBzZXQgYnkKK1xtZXRob2R7c2V0Zmlyc3R3ZWVrZGF5KCl9LiAgVGhlIGVhcmxpZXN0IHllYXIgZm9yIHdoaWNoIGEgY2FsZW5kYXIgY2FuCitiZSBnZW5lcmF0ZWQgaXMgcGxhdGZvcm0tZGVwZW5kZW50LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317cHJ5ZWFyfXt0aGV5ZWFyXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGxcb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY1xvcHRpb25hbHssIG19fX19fQorUHJpbnQgdGhlIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyByZXR1cm5lZCBieSBcbWV0aG9ke2Zvcm1hdHllYXIoKX0uCitcZW5ke21ldGhvZGRlc2N9CisKKworXGJlZ2lue2NsYXNzZGVzY317SFRNTENhbGVuZGFyfXtcb3B0aW9uYWx7Zmlyc3R3ZWVrZGF5fX0KK1RoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSFRNTCBjYWxlbmRhcnMuCisKK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtjbGFzc2Rlc2N9CisKK1xjbGFzc3tIVE1MQ2FsZW5kYXJ9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2Zvcm1hdG1vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdpdGh5ZWFyfX0KK1JldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgYXMgYW4gSFRNTCB0YWJsZS4gSWYgXHZhcnt3aXRoeWVhcn0gaXMKK3RydWUgdGhlIHllYXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaGVhZGVyLCBvdGhlcndpc2UganVzdCB0aGUKK21vbnRoIG5hbWUgd2lsbCBiZSB1c2VkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0eWVhcn17dGhleWVhciwgdGhlbW9udGhcb3B0aW9uYWx7LCB3aWR0aH19CitSZXR1cm4gYSB5ZWFyJ3MgY2FsZW5kYXIgYXMgYW4gSFRNTCB0YWJsZS4gXHZhcnt3aWR0aH0gKGRlZmF1bHRpbmcgdG8gMykKK3NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBwZXIgcm93LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Zm9ybWF0eWVhcnBhZ2V9e3RoZXllYXIsIHRoZW1vbnRoXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhcb3B0aW9uYWx7LCBjc3Ncb3B0aW9uYWx7LCBlbmNvZGluZ319fX0KK1JldHVybiBhIHllYXIncyBjYWxlbmRhciBhcyBhIGNvbXBsZXRlIEhUTUwgcGFnZS4gXHZhcnt3aWR0aH0KKyhkZWZhdWx0aW5nIHRvIDMpIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1vbnRocyBwZXIgcm93LiBcdmFye2Nzc30KK2lzIHRoZSBuYW1lIGZvciB0aGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRvIGJlIHVzZWQuIFxjb25zdGFudHtOb25lfQorY2FuIGJlIHBhc3NlZCBpZiBubyBzdHlsZSBzaGVldCBzaG91bGQgYmUgdXNlZC4gXHZhcntlbmNvZGluZ30KK3NwZWNpZmllcyB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIG91dHB1dCAoZGVmYXVsdGluZwordG8gdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nKS4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtMb2NhbGVUZXh0Q2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXlcb3B0aW9uYWx7LCBsb2NhbGV9fX0KK1RoaXMgc3ViY2xhc3Mgb2YgXGNsYXNze1RleHRDYWxlbmRhcn0gY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZQorY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheQorbmFtZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB1bmljb2RlLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtMb2NhbGVIVE1MQ2FsZW5kYXJ9e1xvcHRpb25hbHtmaXJzdHdlZWtkYXlcb3B0aW9uYWx7LCBsb2NhbGV9fX0KK1RoaXMgc3ViY2xhc3Mgb2YgXGNsYXNze0hUTUxDYWxlbmRhcn0gY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZQorY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgorSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheQorbmFtZXMgd2lsbCBiZSByZXR1cm5lZCBhcyB1bmljb2RlLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2NsYXNzZGVzY30KKworCitGb3Igc2ltcGxlIHRleHQgY2FsZW5kYXJzIHRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgogCiBcYmVnaW57ZnVuY2Rlc2N9e3NldGZpcnN0d2Vla2RheX17d2Vla2RheX0KIFNldHMgdGhlIHdlZWtkYXkgKFxjb2RlezB9IGlzIE1vbmRheSwgXGNvZGV7Nn0gaXMgU3VuZGF5KSB0byBzdGFydApAQCAtODAsMTEgKzI0NSw4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e21vbnRofXt0aGV5ZWFyLCB0aGVtb250aFxvcHRpb25hbHssIHdcb3B0aW9uYWx7LCBsfX19Ci1SZXR1cm5zIGEgbW9udGgncyBjYWxlbmRhciBpbiBhIG11bHRpLWxpbmUgc3RyaW5nLiBJZiBcdmFye3d9IGlzCi1wcm92aWRlZCwgaXQgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgZGF0ZSBjb2x1bW5zLCB3aGljaCBhcmUKLWNlbnRlcmVkLiBJZiBcdmFye2x9IGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBsaW5lcyB0aGF0Ci1lYWNoIHdlZWsgd2lsbCB1c2UuIERlcGVuZHMgb24gdGhlIGZpcnN0IHdlZWtkYXkgYXMgc2V0IGJ5Ci1cZnVuY3Rpb257c2V0Zmlyc3R3ZWVrZGF5KCl9LgorUmV0dXJucyBhIG1vbnRoJ3MgY2FsZW5kYXIgaW4gYSBtdWx0aS1saW5lIHN0cmluZyB1c2luZyB0aGUKK1xtZXRob2R7Zm9ybWF0bW9udGh9IG9mIHRoZSBcY2xhc3N7VGV4dENhbGVuZGFyfSBjbGFzcy4KIFx2ZXJzaW9uYWRkZWR7Mi4wfQogXGVuZHtmdW5jZGVzY30KIApAQCAtOTQsMTIgKzI1Niw4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2NhbGVuZGFyfXt5ZWFyXG9wdGlvbmFseywgd1xvcHRpb25hbHssIGxcb3B0aW9uYWx7Y319fX0KLVJldHVybnMgYSAzLWNvbHVtbiBjYWxlbmRhciBmb3IgYW4gZW50aXJlIHllYXIgYXMgYSBtdWx0aS1saW5lIHN0cmluZy4KLU9wdGlvbmFsIHBhcmFtZXRlcnMgXHZhcnt3fSwgXHZhcntsfSwgYW5kIFx2YXJ7Y30gYXJlIGZvciBkYXRlIGNvbHVtbgotd2lkdGgsIGxpbmVzIHBlciB3ZWVrLCBhbmQgbnVtYmVyIG9mIHNwYWNlcyBiZXR3ZWVuIG1vbnRoIGNvbHVtbnMsCi1yZXNwZWN0aXZlbHkuIERlcGVuZHMgb24gdGhlIGZpcnN0IHdlZWtkYXkgYXMgc2V0IGJ5Ci1cZnVuY3Rpb257c2V0Zmlyc3R3ZWVrZGF5KCl9LiAgVGhlIGVhcmxpZXN0IHllYXIgZm9yIHdoaWNoIGEgY2FsZW5kYXIgY2FuCi1iZSBnZW5lcmF0ZWQgaXMgcGxhdGZvcm0tZGVwZW5kZW50LgorUmV0dXJucyBhIDMtY29sdW1uIGNhbGVuZGFyIGZvciBhbiBlbnRpcmUgeWVhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nCit1c2luZyB0aGUgXG1ldGhvZHtmb3JtYXR5ZWFyfSBvZiB0aGUgXGNsYXNze1RleHRDYWxlbmRhcn0gY2xhc3MuCiBcdmVyc2lvbmFkZGVkezIuMH0KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY2dpLnRleCBiL0RvYy9saWIvbGliY2dpLnRleAppbmRleCBjZDZmNThhLi4xZGQ3ZTAzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmNnaS50ZXgKKysrIGIvRG9jL2xpYi9saWJjZ2kudGV4CkBAIC0zMjMsNyArMzIzLDcgQEAKIAogVGhlIG9wdGlvbmFsIGFyZ3VtZW50IFx2YXJ7c3RyaWN0X3BhcnNpbmd9IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoYXQKIHRvIGRvIHdpdGggcGFyc2luZyBlcnJvcnMuICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMKLWFyZSBzaWxlbnRseSBpZ25vcmVkLiAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgVmFsdWVFcnJvcgorYXJlIHNpbGVudGx5IGlnbm9yZWQuICBJZiB0cnVlLCBlcnJvcnMgcmFpc2UgYSBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9CiBleGNlcHRpb24uCiAKIFVzZSB0aGUgXGZ1bmN0aW9ue1xyZWZtb2R1bGV7dXJsbGlifS51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdG8gY29udmVydApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKIFRoZSBvcHRpb25hbCBhcmd1bWVudCBcdmFye3N0cmljdF9wYXJzaW5nfSBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGF0CiB0byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLiAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzCi1hcmUgc2lsZW50bHkgaWdub3JlZC4gIElmIHRydWUsIGVycm9ycyByYWlzZSBhIFZhbHVlRXJyb3IKK2FyZSBzaWxlbnRseSBpZ25vcmVkLiAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQogZXhjZXB0aW9uLgogCiBVc2UgdGhlIFxmdW5jdGlvbntccmVmbW9kdWxle3VybGxpYn0udXJsZW5jb2RlKCl9IGZ1bmN0aW9uIHRvIGNvbnZlcnQKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29kZWNzLnRleCBiL0RvYy9saWIvbGliY29kZWNzLnRleAppbmRleCAxODA2ZWYwLi44YTI0MTdlIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmNvZGVjcy50ZXgKKysrIGIvRG9jL2xpYi9saWJjb2RlY3MudGV4CkBAIC0xMTIsNiArMTEyLDcgQEAKIAogUmFpc2VzIGEgXGV4Y2VwdGlvbntMb29rdXBFcnJvcn0gaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kIG9yIHRoZQogY29kZWMgZG9lc24ndCBzdXBwb3J0IGFuIGluY3JlbWVudGFsIGVuY29kZXIuCitcdmVyc2lvbmFkZGVkezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Z2V0aW5jcmVtZW50YWxkZWNvZGVyfXtlbmNvZGluZ30KQEAgLTEyMCw2ICsxMjEsNyBAQAogCiBSYWlzZXMgYSBcZXhjZXB0aW9ue0xvb2t1cEVycm9yfSBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQgb3IgdGhlCiBjb2RlYyBkb2Vzbid0IHN1cHBvcnQgYW4gaW5jcmVtZW50YWwgZGVjb2Rlci4KK1x2ZXJzaW9uYWRkZWR7Mi41fQogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtnZXRyZWFkZXJ9e2VuY29kaW5nfQpAQCAtMTUwLDcgKzE1Miw3IEBACiBjb250aW51ZS4gVGhlIGVuY29kZXIgd2lsbCBlbmNvZGUgdGhlIHJlcGxhY2VtZW50IGFuZCBjb250aW51ZSBlbmNvZGluZwogdGhlIG9yaWdpbmFsIGlucHV0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIE5lZ2F0aXZlIHBvc2l0aW9uIHZhbHVlcwogd2lsbCBiZSB0cmVhdGVkIGFzIGJlaW5nIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy4gSWYgdGhlCi1yZXN1bHRpbmcgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kIGFuIEluZGV4RXJyb3Igd2lsbCBiZSByYWlzZWQuCityZXN1bHRpbmcgcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kIGFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0gd2lsbCBiZSByYWlzZWQuCiAKIERlY29kaW5nIGFuZCB0cmFuc2xhdGluZyB3b3JrcyBzaW1pbGFyLCBleGNlcHQgXGV4Y2VwdGlvbntVbmljb2RlRGVjb2RlRXJyb3J9CiBvciBcZXhjZXB0aW9ue1VuaWNvZGVUcmFuc2xhdGVFcnJvcn0gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgYW5kCkBAIC0yMjksMTIgKzIzMSwxNCBAQAogVXNlcyBhbiBpbmNyZW1lbnRhbCBlbmNvZGVyIHRvIGl0ZXJhdGl2ZWx5IGVuY29kZSB0aGUgaW5wdXQgcHJvdmlkZWQgYnkKIFx2YXJ7aXRlcmFibGV9LiBUaGlzIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLiBcdmFye2Vycm9yc30gKGFzIHdlbGwgYXMKIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50KSBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgaW5jcmVtZW50YWwgZW5jb2Rlci4KK1x2ZXJzaW9uYWRkZWR7Mi41fQogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtpdGVyZGVjb2RlfXtpdGVyYWJsZSwgZW5jb2Rpbmdcb3B0aW9uYWx7LCBlcnJvcnN9fQogVXNlcyBhbiBpbmNyZW1lbnRhbCBkZWNvZGVyIHRvIGl0ZXJhdGl2ZWx5IGRlY29kZSB0aGUgaW5wdXQgcHJvdmlkZWQgYnkKIFx2YXJ7aXRlcmFibGV9LiBUaGlzIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLiBcdmFye2Vycm9yc30gKGFzIHdlbGwgYXMKIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50KSBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgaW5jcmVtZW50YWwgZW5jb2Rlci4KK1x2ZXJzaW9uYWRkZWR7Mi41fQogXGVuZHtmdW5jZGVzY30KIAogVGhlIG1vZHVsZSBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHdoaWNoIGFyZSB1c2VmdWwKQEAgLTM1NSw2ICszNTksOCBAQAogCiBcc3Vic3Vic2VjdGlvbntJbmNyZW1lbnRhbEVuY29kZXIgT2JqZWN0cyBcbGFiZWx7aW5jcmVtZW50YWwtZW5jb2Rlci1vYmplY3RzfX0KIAorXHZlcnNpb25hZGRlZHsyLjV9CisKIFRoZSBcY2xhc3N7SW5jcmVtZW50YWxFbmNvZGVyfSBjbGFzcyBpcyB1c2VkIGZvciBlbmNvZGluZyBhbiBpbnB1dCBpbiBtdWx0aXBsZQogc3RlcHMuIEl0IGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHdoaWNoIGV2ZXJ5IGluY3JlbWVudGFsIGVuY29kZXIgbXVzdAogZGVmaW5lIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgdG8gdGhlIFB5dGhvbiBjb2RlYyByZWdpc3RyeS4KQEAgLTQzNyw2ICs0NDMsMTAgQEAKICAgRGVjb2RlcyBcdmFye29iamVjdH0gKHRha2luZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGVjb2RlciBpbnRvIGFjY291bnQpCiAgIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZGVjb2RlZCBvYmplY3QuIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0bwogICBcbWV0aG9ke2RlY29kZX0gXHZhcntmaW5hbH0gbXVzdCBiZSB0cnVlICh0aGUgZGVmYXVsdCBpcyBmYWxzZSkuCisgIElmIFx2YXJ7ZmluYWx9IGlzIHRydWUgdGhlIGRlY29kZXIgbXVzdCBkZWNvZGUgdGhlIGlucHV0IGNvbXBsZXRlbHkgYW5kIG11c3QKKyAgZmx1c2ggYWxsIGJ1ZmZlcnMuIElmIHRoaXMgaXNuJ3QgcG9zc2libGUgKGUuZy4gYmVjYXVzZSBvZiBpbmNvbXBsZXRlIGJ5dGUKKyAgc2VxdWVuY2VzIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0KSBpdCBtdXN0IGluaXRpYXRlIGVycm9yIGhhbmRsaW5nIGp1c3QgbGlrZQorICBpbiB0aGUgc3RhdGVsZXNzIGNhc2UgKHdoaWNoIG1pZ2h0IHJhaXNlIGFuIGV4Y2VwdGlvbikuCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtyZXNldH17fQpAQCAtNjkwLDEwICs3MDAsMTAgQEAKIFRoZSBzaW1wbGVzdCBtZXRob2QgaXMgdG8gbWFwIHRoZSBjb2RlcG9pbnRzIDAtMjU1IHRvIHRoZSBieXRlcwogXGNvZGV7MHgwfS1cY29kZXsweGZmfS4gVGhpcyBtZWFucyB0aGF0IGEgdW5pY29kZSBvYmplY3QgdGhhdCBjb250YWlucyAKIGNvZGVwb2ludHMgYWJvdmUgXGNvZGV7VSswMEZGfSBjYW4ndCBiZSBlbmNvZGVkIHdpdGggdGhpcyBtZXRob2QgKHdoaWNoIAotaXMgY2FsbGVkIFxjb2RleydsYXRpbi0xJ30gb3IgXGNvZGV7J2lzby04ODU5LTEnfSkuIHVuaWNvZGUuZW5jb2RlKCkgd2lsbCAKLXJhaXNlIGEgVW5pY29kZUVuY29kZUVycm9yIHRoYXQgbG9va3MgbGlrZSB0aGlzOiBcc2FtcHtVbmljb2RlRW5jb2RlRXJyb3I6Ci0nbGF0aW4tMScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1xlIHUxMjM0JyBpbiBwb3NpdGlvbiAzOiBvcmRpbmFsCi1ub3QgaW4gcmFuZ2UoMjU2KX0uCitpcyBjYWxsZWQgXGNvZGV7J2xhdGluLTEnfSBvciBcY29kZXsnaXNvLTg4NTktMSd9KS4KK1xmdW5jdGlvbnt1bmljb2RlLmVuY29kZSgpfSB3aWxsIHJhaXNlIGEgXGV4Y2VwdGlvbntVbmljb2RlRW5jb2RlRXJyb3J9Cit0aGF0IGxvb2tzIGxpa2UgdGhpczogXHNhbXB7VW5pY29kZUVuY29kZUVycm9yOiAnbGF0aW4tMScgY29kZWMgY2FuJ3QKK2VuY29kZSBjaGFyYWN0ZXIgdSdcZSB1MTIzNCcgaW4gcG9zaXRpb24gMzogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMjU2KX0uCiAKIFRoZXJlJ3MgYW5vdGhlciBncm91cCBvZiBlbmNvZGluZ3MgKHRoZSBzbyBjYWxsZWQgY2hhcm1hcCBlbmNvZGluZ3MpCiB0aGF0IGNob29zZSBhIGRpZmZlcmVudCBzdWJzZXQgb2YgYWxsIHVuaWNvZGUgY29kZSBwb2ludHMgYW5kIGhvdwpAQCAtMTIyMCw3ICsxMjMwLDcgQEAKIAogXGxpbmVpdntyb3RfMTN9CiAgICAgICAgICB7cm90MTN9Ci0gICAgICAgICB7Ynl0ZSBzdHJpbmd9CisgICAgICAgICB7VW5pY29kZSBzdHJpbmd9CiAgICAgICAgICB7UmV0dXJucyB0aGUgQ2Flc2FyLWN5cGhlciBlbmNyeXB0aW9uIG9mIHRoZSBvcGVyYW5kfQogCiBcbGluZWl2e3N0cmluZ19lc2NhcGV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbGxlY3Rpb25zLnRleCBiL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CmluZGV4IDU0MmVmNmIuLmQ5YmZhMzkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CisrKyBiL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CkBAIC0xMCw5ICsxMCwxMSBAQAogCiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGhpZ2gtcGVyZm9ybWFuY2UgY29udGFpbmVyIGRhdGF0eXBlcy4gIEN1cnJlbnRseSwKIHRoZXJlIGFyZSB0d28gZGF0YXR5cGVzLCBkZXF1ZSBhbmQgZGVmYXVsdGRpY3QuCi1GdXR1cmUgYWRkaXRpb25zIG1heSBpbmNsdWRlIEItdHJlZXMgYW5kIEZpYm9uYWNjaSBoZWFwcy4KK0Z1dHVyZSBhZGRpdGlvbnMgbWF5IGluY2x1ZGUgYmFsYW5jZWQgdHJlZXMgYW5kIG9yZGVyZWQgZGljdGlvbmFyaWVzLgogXHZlcnNpb25jaGFuZ2VkW0FkZGVkIGRlZmF1bHRkaWN0XXsyLjV9CiAKK1xzdWJzZWN0aW9ue1xjbGFzc3tkZXF1ZX0gb2JqZWN0cyBcbGFiZWx7ZGVxdWUtb2JqZWN0c319CisKIFxiZWdpbntmdW5jZGVzY317ZGVxdWV9e1xvcHRpb25hbHtpdGVyYWJsZX19CiAgIFJldHVybnMgYSBuZXcgZGVxdWUgb2JqZWN0ZWQgaW5pdGlhbGl6ZWQgbGVmdC10by1yaWdodCAodXNpbmcKICAgXG1ldGhvZHthcHBlbmQoKX0pIHdpdGggZGF0YSBmcm9tIFx2YXJ7aXRlcmFibGV9LiAgSWYgXHZhcntpdGVyYWJsZX0KQEAgLTEzNyw3ICsxMzksNyBAQAogZGVxdWUoWydjJywgJ2InLCAnYSddKQogXGVuZHt2ZXJiYXRpbX0KIAotXHN1YnNlY3Rpb257UmVjaXBlcyBcbGFiZWx7ZGVxdWUtcmVjaXBlc319Citcc3Vic3Vic2VjdGlvbntSZWNpcGVzIFxsYWJlbHtkZXF1ZS1yZWNpcGVzfX0KIAogVGhpcyBzZWN0aW9uIHNob3dzIHZhcmlvdXMgYXBwcm9hY2hlcyB0byB3b3JraW5nIHdpdGggZGVxdWVzLgogCkBAIC0yMTUsNiArMjE3LDggQEAKIAogCiAKK1xzdWJzZWN0aW9ue1xjbGFzc3tkZWZhdWx0ZGljdH0gb2JqZWN0cyBcbGFiZWx7ZGVmYXVsdGRpY3Qtb2JqZWN0c319CisKIFxiZWdpbntmdW5jZGVzY317ZGVmYXVsdGRpY3R9e1xvcHRpb25hbHtkZWZhdWx0X2ZhY3Rvcnlcb3B0aW9uYWx7LCAuLi59fX0KICAgUmV0dXJucyBhIG5ldyBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0LiAgXGNsYXNze2RlZmF1bHRkaWN0fSBpcyBhIHN1YmNsYXNzCiAgIG9mIHRoZSBidWlsdGluIFxjbGFzc3tkaWN0fSBjbGFzcy4gIEl0IG92ZXJyaWRlcyBvbmUgbWV0aG9kIGFuZCBhZGRzIG9uZQpAQCAtMjU1LDMgKzI1OSw3OSBAQAogICBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IsIGlmIHByZXNlbnQsIG9yIHRvIFxjb2Rle05vbmV9LCAKICAgaWYgYWJzZW50LgogXGVuZHtkYXRhZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntcY2xhc3N7ZGVmYXVsdGRpY3R9IEV4YW1wbGVzIFxsYWJlbHtkZWZhdWx0ZGljdC1leGFtcGxlc319CisKK1VzaW5nIFxjbGFzc3tsaXN0fSBhcyB0aGUgXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9LCBpdCBpcyBlYXN5IHRvIGdyb3VwCithIHNlcXVlbmNlIG9mIGtleS12YWx1ZSBwYWlycyBpbnRvIGEgZGljdGlvbmFyeSBvZiBsaXN0czoKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IHMgPSBbKCd5ZWxsb3cnLCAxKSwgKCdibHVlJywgMiksICgneWVsbG93JywgMyksICgnYmx1ZScsIDQpLCAoJ3JlZCcsIDEpXQorPj4+IGQgPSBkZWZhdWx0ZGljdChsaXN0KQorPj4+IGZvciBrLCB2IGluIHM6CisgICAgICAgIGRba10uYXBwZW5kKHYpCisKKz4+PiBkLml0ZW1zKCkKK1soJ2JsdWUnLCBbMiwgNF0pLCAoJ3JlZCcsIFsxXSksICgneWVsbG93JywgWzEsIDNdKV0KK1xlbmR7dmVyYmF0aW19CisKK1doZW4gZWFjaCBrZXkgaXMgZW5jb3VudGVyZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUKK21hcHBpbmc7IHNvIGFuIGVudHJ5IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1c2luZyB0aGUKK1xtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIGVtcHR5IFxjbGFzc3tsaXN0fS4gIFRoZQorXG1ldGhvZHtsaXN0LmFwcGVuZCgpfSBvcGVyYXRpb24gdGhlbiBhdHRhY2hlcyB0aGUgdmFsdWUgdG8gdGhlIG5ldyBsaXN0LiAgV2hlbgora2V5cyBhcmUgZW5jb3VudGVyZWQgYWdhaW4sIHRoZSBsb29rLXVwIHByb2NlZWRzIG5vcm1hbGx5IChyZXR1cm5pbmcgdGhlIGxpc3QKK2ZvciB0aGF0IGtleSkgYW5kIHRoZSBcbWV0aG9ke2xpc3QuYXBwZW5kKCl9IG9wZXJhdGlvbiBhZGRzIGFub3RoZXIgdmFsdWUgdG8KK3RoZSBsaXN0LiBUaGlzIHRlY2huaXF1ZSBpcyBzaW1wbGVyIGFuZCBmYXN0ZXIgdGhhbiBhbiBlcXVpdmFsZW50IHRlY2huaXF1ZQordXNpbmcgXG1ldGhvZHtkaWN0LnNldGRlZmF1bHQoKX06CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBkID0ge30KKz4+PiBmb3IgaywgdiBpbiBzOgorCWQuc2V0ZGVmYXVsdChrLCBbXSkuYXBwZW5kKHYpCisKKz4+PiBkLml0ZW1zKCkKK1soJ2JsdWUnLCBbMiwgNF0pLCAoJ3JlZCcsIFsxXSksICgneWVsbG93JywgWzEsIDNdKV0KK1xlbmR7dmVyYmF0aW19CisKK1NldHRpbmcgdGhlIFxtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSB0byBcY2xhc3N7aW50fSBtYWtlcyB0aGUKK1xjbGFzc3tkZWZhdWx0ZGljdH0gdXNlZnVsIGZvciBjb3VudGluZyAobGlrZSBhIGJhZyBvciBtdWx0aXNldCBpbiBvdGhlcgorbGFuZ3VhZ2VzKToKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IHMgPSAnbWlzc2lzc2lwcGknCis+Pj4gZCA9IGRlZmF1bHRkaWN0KGludCkKKz4+PiBmb3IgayBpbiBzOgorICAgICAgICBkW2tdICs9IDEKKworPj4+IGQuaXRlbXMoKQorWygnaScsIDQpLCAoJ3AnLCAyKSwgKCdzJywgNCksICgnbScsIDEpXQorXGVuZHt2ZXJiYXRpbX0KKworV2hlbiBhIGxldHRlciBpcyBmaXJzdCBlbmNvdW50ZXJlZCwgaXQgaXMgbWlzc2luZyBmcm9tIHRoZSBtYXBwaW5nLCBzbyB0aGUKK1xtZW1iZXJ7ZGVmYXVsdF9mYWN0b3J5fSBmdW5jdGlvbiBjYWxscyBcZnVuY3Rpb257aW50KCl9IHRvIHN1cHBseSBhIGRlZmF1bHQKK2NvdW50IG9mIHplcm8uICBUaGUgaW5jcmVtZW50IG9wZXJhdGlvbiB0aGVuIGJ1aWxkcyB1cCB0aGUgY291bnQgZm9yIGVhY2gKK2xldHRlci4gVGhpcyB0ZWNobmlxdWUgbWFrZXMgY291bnRpbmcgc2ltcGxlciBhbmQgZmFzdGVyIHRoYW4gYW4gZXF1aXZhbGVudAordGVjaG5pcXVlIHVzaW5nIFxtZXRob2R7ZGljdC5nZXQoKX06CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBkID0ge30KKz4+PiBmb3IgayBpbiBzOgorCWRba10gPSBkLmdldChrLCAwKSArIDEKKworPj4+IGQuaXRlbXMoKQorWygnaScsIDQpLCAoJ3AnLCAyKSwgKCdzJywgNCksICgnbScsIDEpXQorXGVuZHt2ZXJiYXRpbX0KKworU2V0dGluZyB0aGUgXG1lbWJlcntkZWZhdWx0X2ZhY3Rvcnl9IHRvIFxjbGFzc3tzZXR9IG1ha2VzIHRoZQorXGNsYXNze2RlZmF1bHRkaWN0fSB1c2VmdWwgZm9yIGJ1aWxkaW5nIGEgZGljdGlvbmFyeSBvZiBzZXRzOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcyA9IFsoJ3JlZCcsIDEpLCAoJ2JsdWUnLCAyKSwgKCdyZWQnLCAzKSwgKCdibHVlJywgNCksICgncmVkJywgMSksICgnYmx1ZScsIDQpXQorPj4+IGQgPSBkZWZhdWx0ZGljdChzZXQpCis+Pj4gZm9yIGssIHYgaW4gczoKKyAgICAgICAgZFtrXS5hZGQodikKKworPj4+IGQuaXRlbXMoKQorWygnYmx1ZScsIHNldChbMiwgNF0pKSwgKCdyZWQnLCBzZXQoWzEsIDNdKSldCitcZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb250ZXh0bGliLnRleCBiL0RvYy9saWIvbGliY29udGV4dGxpYi50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmOWNkZAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvbGliY29udGV4dGxpYi50ZXgKQEAgLTAsMCArMSwxNDQgQEAKK1xzZWN0aW9ue1xtb2R1bGV7Y29udGV4dGxpYn0gLS0tCisgICAgICAgICBVdGlsaXRpZXMgZm9yIFxrZXl3b3Jke3dpdGh9LXN0YXRlbWVudCBjb250ZXh0cy59CisKK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtjb250ZXh0bGlifQorXG1vZHVsZXN5bm9wc2lze1V0aWxpdGllcyBmb3IgXGtleXdvcmR7d2l0aH0tc3RhdGVtZW50IGNvbnRleHRzLn0KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgY29tbW9uIHRhc2tzIGludm9sdmluZyB0aGUKK1xrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC4KKworRnVuY3Rpb25zIHByb3ZpZGVkOgorCitcYmVnaW57ZnVuY2Rlc2N9e2NvbnRleHRtYW5hZ2VyfXtmdW5jfQorVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjb250ZXh0IG1hbmFnZXJzCitmb3IgdXNlIHdpdGggdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCwgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhCitjbGFzcyBvciBzZXBhcmF0ZSBcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLgorCitBIHNpbXBsZSBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCisKK0Bjb250ZXh0bWFuYWdlcgorZGVmIHRhZyhuYW1lKToKKyAgICBwcmludCAiPCVzPiIgJSBuYW1lCisgICAgeWllbGQKKyAgICBwcmludCAiPC8lcz4iICUgbmFtZQorCis+Pj4gd2l0aCB0YWcoImgxIik6CisuLi4gICAgcHJpbnQgImZvbyIKKy4uLgorPGgxPgorZm9vCis8L2gxPgorXGVuZHt2ZXJiYXRpbX0KKworV2hlbiBjYWxsZWQsIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBnZW5lcmF0b3ItaXRlcmF0b3IuCitUaGlzIGl0ZXJhdG9yIG11c3QgeWllbGQgZXhhY3RseSBvbmUgdmFsdWUsIHdoaWNoIHdpbGwgYmUgYm91bmQgdG8gdGhlCit0YXJnZXRzIGluIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQncyBca2V5d29yZHthc30gY2xhdXNlLCBpZiBhbnkuCisKK0F0IHRoZSBwb2ludCB3aGVyZSB0aGUgZ2VuZXJhdG9yIHlpZWxkcywgdGhlIGJsb2NrIG5lc3RlZCBpbiB0aGUKK1xrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBpcyBleGVjdXRlZC4gIFRoZSBnZW5lcmF0b3IgaXMgdGhlbiByZXN1bWVkCithZnRlciB0aGUgYmxvY2sgaXMgZXhpdGVkLiAgSWYgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlCitibG9jaywgaXQgaXMgcmVyYWlzZWQgaW5zaWRlIHRoZSBnZW5lcmF0b3IgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSB5aWVsZAorb2NjdXJyZWQuICBUaHVzLCB5b3UgY2FuIHVzZSBhCitca2V5d29yZHt0cnl9Li4uXGtleXdvcmR7ZXhjZXB0fS4uLlxrZXl3b3Jke2ZpbmFsbHl9IHN0YXRlbWVudCB0byB0cmFwCit0aGUgZXJyb3IgKGlmIGFueSksIG9yIGVuc3VyZSB0aGF0IHNvbWUgY2xlYW51cCB0YWtlcyBwbGFjZS4KKworTm90ZSB0aGF0IHlvdSBjYW4gdXNlIFxjb2Rle0Bjb250ZXh0bWFuYWdlcn0gdG8gZGVmaW5lIGEgY29udGV4dAorbWFuYWdlcidzIFxtZXRob2R7X19jb250ZXh0X199IG1ldGhvZC4gIFRoaXMgaXMgdXN1YWxseSBtb3JlIGNvbnZlbmllbnQKK3RoYW4gY3JlYXRpbmcgYW5vdGhlciBjbGFzcyBqdXN0IHRvIHNlcnZlIGFzIGEgY29udGV4dC4gIEZvciBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCisKK2NsYXNzIFRhZzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgICAgICBwcmludCAiPCVzPiIgJSBzZWxmLm5hbWUKKyAgICAgICAgeWllbGQgc2VsZgorICAgICAgICBwcmludCAiPC8lcz4iICUgc2VsZi5uYW1lCisgICAgICAgIAoraDEgPSBUYWcoImgxIikKKworPj4+IHdpdGggaDEgYXMgbWU6CisuLi4gICAgIHByaW50ICJoZWxsbyBmcm9tIiwgbWUKKzxoMT4KK2hlbGxvIGZyb20gPF9fbWFpbl9fLlRhZyBpbnN0YW5jZSBhdCAweDQwMmNlOGVjPgorPC9oMT4KK1xlbmR7dmVyYmF0aW19CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e25lc3RlZH17Y3R4MVxvcHRpb25hbHssIGN0eDJcb3B0aW9uYWx7LCAuLi59fX0KK0NvbWJpbmUgbXVsdGlwbGUgY29udGV4dCBtYW5hZ2VycyBpbnRvIGEgc2luZ2xlIG5lc3RlZCBjb250ZXh0IG1hbmFnZXIuCisKK0NvZGUgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IG5lc3RlZAorCit3aXRoIG5lc3RlZChBLCBCLCBDKSBhcyAoWCwgWSwgWik6CisgICAgZG9fc29tZXRoaW5nKCkKK1xlbmR7dmVyYmF0aW19CisKK2lzIGVxdWl2YWxlbnQgdG8gdGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQord2l0aCBBIGFzIFg6CisgICAgd2l0aCBCIGFzIFk6CisgICAgICAgIHdpdGggQyBhcyBaOgorICAgICAgICAgICAgZG9fc29tZXRoaW5nKCkKK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCBpZiBvbmUgb2YgdGhlIG5lc3RlZCBjb250ZXh0cycgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QKK3JhaXNlcyBhbiBleGNlcHRpb24sIGFueSBwcmV2aW91cyBleGNlcHRpb24gc3RhdGUgd2lsbCBiZSBsb3N0OyB0aGUgbmV3CitleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG91dGVyIGNvbnRleHRzJyBcbWV0aG9ke19fZXhpdF9fKCl9CittZXRob2QocyksIGlmIGFueS4gIEluIGdlbmVyYWwsIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcyBzaG91bGQgYXZvaWQKK3JhaXNpbmcgZXhjZXB0aW9ucywgYW5kIGluIHBhcnRpY3VsYXIgdGhleSBzaG91bGQgbm90IHJlLXJhaXNlIGEKK3Bhc3NlZC1pbiBleGNlcHRpb24uCitcZW5ke2Z1bmNkZXNjfQorCitcbGFiZWx7Y29udGV4dC1jbG9zaW5nfQorXGJlZ2lue2Z1bmNkZXNjfXtjbG9zaW5nfXt0aGluZ30KK1JldHVybiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IGNsb3NlcyBcdmFye3RoaW5nfSB1cG9uIGNvbXBsZXRpb24gb2YgdGhlCitibG9jay4gIFRoaXMgaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG86CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgY2xvc2luZyh0aGluZyk6CisgICAgdHJ5OgorICAgICAgICB5aWVsZCB0aGluZworICAgIGZpbmFsbHk6CisgICAgICAgIHRoaW5nLmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKK0FuZCBsZXRzIHlvdSB3cml0ZSBjb2RlIGxpa2UgdGhpczoKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY2xvc2luZworaW1wb3J0IGNvZGVjcworCit3aXRoIGNsb3NpbmcoY29kZWNzLm9wZW4oImZvbyIsIGVuY29kaW5nPSJ1dGY4IikpIGFzIGY6CisgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgcHJpbnQgbGluZS5lbmNvZGUoImxhdGluMSIpCitcZW5ke3ZlcmJhdGltfQorCit3aXRob3V0IG5lZWRpbmcgdG8gZXhwbGljaXRseSBjbG9zZSBcY29kZXtmfS4gIEV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJzLAorXGNvZGV7Zi5jbG9zZSgpfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBca2V5d29yZHt3aXRofSBibG9jayBpcyBleGl0ZWQuCisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICBcc2VlcGVwezAzNDN9e1RoZSAid2l0aCIgc3RhdGVtZW50fQorICAgICAgICAge1RoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZQorICAgICAgICAgIFB5dGhvbiBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQufQorXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4IGIvRG9jL2xpYi9saWJjb29raWVsaWIudGV4CmluZGV4IGEzNWY5N2QuLmVmMmQ4MzMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29va2llbGliLnRleAorKysgYi9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXgKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgIGlnbm9yZV9kaXNjYXJkPVxjb25zdGFudHtGYWxzZX0sIGlnbm9yZV9leHBpcmVzPVxjb25zdGFudHtGYWxzZX19CiBTYXZlIGNvb2tpZXMgdG8gYSBmaWxlLgogCi1UaGlzIGJhc2UgY2xhc3MgcmFpc2VzIFxjbGFzc3tOb3RJbXBsZW1lbnRlZEVycm9yfS4gIFN1YmNsYXNzZXMgbWF5CitUaGlzIGJhc2UgY2xhc3MgcmFpc2VzIFxleGNlcHRpb257Tm90SW1wbGVtZW50ZWRFcnJvcn0uICBTdWJjbGFzc2VzIG1heQogbGVhdmUgdGhpcyBtZXRob2QgdW5pbXBsZW1lbnRlZC4KIAogXHZhcntmaWxlbmFtZX0gaXMgdGhlIG5hbWUgb2YgZmlsZSBpbiB3aGljaCB0byBzYXZlIGNvb2tpZXMuICBJZgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjc3YudGV4IGIvRG9jL2xpYi9saWJjc3YudGV4CmluZGV4IGJhMGRmNGYuLjY1MDUzYzcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY3N2LnRleAorKysgYi9Eb2MvbGliL2xpYmNzdi50ZXgKQEAgLTMzLDggKzMzLDkgQEAKIFxiZWdpbntub3RpY2V9CiAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkb2Vzbid0IHN1cHBvcnQgVW5pY29kZQogICBpbnB1dC4gIEFsc28sIHRoZXJlIGFyZSBjdXJyZW50bHkgc29tZSBpc3N1ZXMgcmVnYXJkaW5nIFxBU0NJSXt9IE5VTAotICBjaGFyYWN0ZXJzLiAgQWNjb3JkaW5nbHksIGFsbCBpbnB1dCBzaG91bGQgZ2VuZXJhbGx5IGJlIHByaW50YWJsZQotICBcQVNDSUl7fSB0byBiZSBzYWZlLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICBjaGFyYWN0ZXJzLiAgQWNjb3JkaW5nbHksIGFsbCBpbnB1dCBzaG91bGQgYmUgVVRGLTggb3IgcHJpbnRhYmxlCisgIFxBU0NJSXt9IHRvIGJlIHNhZmU7IHNlZSB0aGUgZXhhbXBsZXMgaW4gc2VjdGlvbn5ccmVme2Nzdi1leGFtcGxlc30uCisgIFRoZXNlIHJlc3RyaWN0aW9ucyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KIFxlbmR7bm90aWNlfQogCiBcYmVnaW57c2VlYWxzb30KQEAgLTM2NSw3ICszNjYsNyBAQAogCiAKIAotXHN1YnNlY3Rpb257RXhhbXBsZXN9Citcc3Vic2VjdGlvbntFeGFtcGxlc1xsYWJlbHtjc3YtZXhhbXBsZXN9fQogCiBUaGUgc2ltcGxlc3QgZXhhbXBsZSBvZiByZWFkaW5nIGEgQ1NWIGZpbGU6CiAKQEAgLTQyNiwzNyArNDI3LDk5IEBACiBcZW5ke3ZlcmJhdGltfQogCiBUaGUgXG1vZHVsZXtjc3Z9IG1vZHVsZSBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgcmVhZGluZyBhbmQgd3JpdGluZwotVW5pY29kZSwgYnV0IGl0IGlzIDgtYml0IGNsZWFuIHNhdmUgZm9yIHNvbWUgcHJvYmxlbXMgd2l0aCBcQVNDSUl7fSBOVUwKLWNoYXJhY3RlcnMsIHNvIHlvdSBjYW4gd3JpdGUgY2xhc3NlcyB0aGF0IGhhbmRsZSB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nCi1mb3IgeW91IGFzIGxvbmcgYXMgeW91IGF2b2lkIGVuY29kaW5ncyBsaWtlIHV0Zi0xNiB0aGF0IHVzZSBOVUxzOgorVW5pY29kZSwgYnV0IGl0IGlzIDgtYml0LWNsZWFuIHNhdmUgZm9yIHNvbWUgcHJvYmxlbXMgd2l0aCBcQVNDSUl7fSBOVUwKK2NoYXJhY3RlcnMuICBTbyB5b3UgY2FuIHdyaXRlIGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgaGFuZGxlIHRoZQorZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZvciB5b3UgYXMgbG9uZyBhcyB5b3UgYXZvaWQgZW5jb2RpbmdzIGxpa2UKK1VURi0xNiB0aGF0IHVzZSBOVUxzLiAgVVRGLTggaXMgcmVjb21tZW5kZWQuCisKK1xmdW5jdGlvbnt1bmljb2RlX2Nzdl9yZWFkZXJ9IGJlbG93IGlzIGEgZ2VuZXJhdG9yIHRoYXQgd3JhcHMKK1xjbGFzc3tjc3YucmVhZGVyfSB0byBoYW5kbGUgVW5pY29kZSBDU1YgZGF0YSAoYSBsaXN0IG9mIFVuaWNvZGUKK3N0cmluZ3MpLiAgXGZ1bmN0aW9ue3V0Zl84X2VuY29kZXJ9IGlzIGEgZ2VuZXJhdG9yIHRoYXQgZW5jb2RlcyB0aGUKK1VuaWNvZGUgc3RyaW5ncyBhcyBVVEYtOCwgb25lIHN0cmluZyAob3Igcm93KSBhdCBhIHRpbWUuICBUaGUgZW5jb2RlZAorc3RyaW5ncyBhcmUgcGFyc2VkIGJ5IHRoZSBDU1YgcmVhZGVyLCBhbmQKK1xmdW5jdGlvbnt1bmljb2RlX2Nzdl9yZWFkZXJ9IGRlY29kZXMgdGhlIFVURi04LWVuY29kZWQgY2VsbHMgYmFjaworaW50byBVbmljb2RlOgogCiBcYmVnaW57dmVyYmF0aW19CiBpbXBvcnQgY3N2CiAKK2RlZiB1bmljb2RlX2Nzdl9yZWFkZXIodW5pY29kZV9jc3ZfZGF0YSwgZGlhbGVjdD1jc3YuZXhjZWwsICoqa3dhcmdzKToKKyAgICAjIGNzdi5weSBkb2Vzbid0IGRvIFVuaWNvZGU7IGVuY29kZSB0ZW1wb3JhcmlseSBhcyBVVEYtODoKKyAgICBjc3ZfcmVhZGVyID0gY3N2LnJlYWRlcih1dGZfOF9lbmNvZGVyKHVuaWNvZGVfY3N2X2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3Q9ZGlhbGVjdCwgKiprd2FyZ3MpCisgICAgZm9yIHJvdyBpbiBjc3ZfcmVhZGVyOgorICAgICAgICAjIGRlY29kZSBVVEYtOCBiYWNrIHRvIFVuaWNvZGUsIGNlbGwgYnkgY2VsbDoKKyAgICAgICAgeWllbGQgW3VuaWNvZGUoY2VsbCwgJ3V0Zi04JykgZm9yIGNlbGwgaW4gcm93XQorCitkZWYgdXRmXzhfZW5jb2Rlcih1bmljb2RlX2Nzdl9kYXRhKToKKyAgICBmb3IgbGluZSBpbiB1bmljb2RlX2Nzdl9kYXRhOgorICAgICAgICB5aWVsZCBsaW5lLmVuY29kZSgndXRmLTgnKQorXGVuZHt2ZXJiYXRpbX0KKworRm9yIGFsbCBvdGhlciBlbmNvZGluZ3MgdGhlIGZvbGxvd2luZyBcY2xhc3N7VW5pY29kZVJlYWRlcn0gYW5kCitcY2xhc3N7VW5pY29kZVdyaXRlcn0gY2xhc3NlcyBjYW4gYmUgdXNlZC4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwKK1x2YXJ7ZW5jb2Rpbmd9IHBhcmFtZXRlciBpbiB0aGVpciBjb25zdHJ1Y3RvciBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEKK3Bhc3NlcyB0aGUgcmVhbCByZWFkZXIgb3Igd3JpdGVyIGVuY29kZWQgYXMgVVRGLTg6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBjc3YsIGNvZGVjcywgY1N0cmluZ0lPCisKK2NsYXNzIFVURjhSZWNvZGVyOgorICAgICIiIgorICAgIEl0ZXJhdG9yIHRoYXQgcmVhZHMgYW4gZW5jb2RlZCBzdHJlYW0gYW5kIHJlZW5jb2RlcyB0aGUgaW5wdXQgdG8gVVRGLTgKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgZW5jb2RpbmcpOgorICAgICAgICBzZWxmLnJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoZW5jb2RpbmcpKGYpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLm5leHQoKS5lbmNvZGUoInV0Zi04IikKKwogY2xhc3MgVW5pY29kZVJlYWRlcjoKKyAgICAiIiIKKyAgICBBIENTViByZWFkZXIgd2hpY2ggd2lsbCBpdGVyYXRlIG92ZXIgbGluZXMgaW4gdGhlIENTViBmaWxlICJmIiwKKyAgICB3aGljaCBpcyBlbmNvZGVkIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KKyAgICAiIiIKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBkaWFsZWN0PWNzdi5leGNlbCwgZW5jb2Rpbmc9InV0Zi04IiwgKiprd2RzKToKKyAgICAgICAgZiA9IFVURjhSZWNvZGVyKGYsIGVuY29kaW5nKQogICAgICAgICBzZWxmLnJlYWRlciA9IGNzdi5yZWFkZXIoZiwgZGlhbGVjdD1kaWFsZWN0LCAqKmt3ZHMpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogCiAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgIHJvdyA9IHNlbGYucmVhZGVyLm5leHQoKQotICAgICAgICByZXR1cm4gW3VuaWNvZGUocywgc2VsZi5lbmNvZGluZykgZm9yIHMgaW4gcm93XQorICAgICAgICByZXR1cm4gW3VuaWNvZGUocywgInV0Zi04IikgZm9yIHMgaW4gcm93XQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZgogCiBjbGFzcyBVbmljb2RlV3JpdGVyOgorICAgICIiIgorICAgIEEgQ1NWIHdyaXRlciB3aGljaCB3aWxsIHdyaXRlIHJvd3MgdG8gQ1NWIGZpbGUgImYiLAorICAgIHdoaWNoIGlzIGVuY29kZWQgaW4gdGhlIGdpdmVuIGVuY29kaW5nLgorICAgICIiIgorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIGRpYWxlY3Q9Y3N2LmV4Y2VsLCBlbmNvZGluZz0idXRmLTgiLCAqKmt3ZHMpOgotICAgICAgICBzZWxmLndyaXRlciA9IGNzdi53cml0ZXIoZiwgZGlhbGVjdD1kaWFsZWN0LCAqKmt3ZHMpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICAjIFJlZGlyZWN0IG91dHB1dCB0byBhIHF1ZXVlCisgICAgICAgIHNlbGYucXVldWUgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzZWxmLndyaXRlciA9IGNzdi53cml0ZXIoc2VsZi5xdWV1ZSwgZGlhbGVjdD1kaWFsZWN0LCAqKmt3ZHMpCisgICAgICAgIHNlbGYuc3RyZWFtID0gZgorICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgpCiAKICAgICBkZWYgd3JpdGVyb3coc2VsZiwgcm93KToKLSAgICAgICAgc2VsZi53cml0ZXIud3JpdGVyb3coW3MuZW5jb2RlKHNlbGYuZW5jb2RpbmcpIGZvciBzIGluIHJvd10pCisgICAgICAgIHNlbGYud3JpdGVyLndyaXRlcm93KFtzLmVuY29kZSgidXRmLTgiKSBmb3IgcyBpbiByb3ddKQorICAgICAgICAjIEZldGNoIFVURi04IG91dHB1dCBmcm9tIHRoZSBxdWV1ZSAuLi4KKyAgICAgICAgZGF0YSA9IHNlbGYucXVldWUuZ2V0dmFsdWUoKQorICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoInV0Zi04IikKKyAgICAgICAgIyAuLi4gYW5kIHJlZW5jb2RlIGl0IGludG8gdGhlIHRhcmdldCBlbmNvZGluZworICAgICAgICBkYXRhID0gc2VsZi5lbmNvZGVyLmVuY29kZShkYXRhKQorICAgICAgICAjIHdyaXRlIHRvIHRoZSB0YXJnZXQgc3RyZWFtCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisgICAgICAgICMgZW1wdHkgcXVldWUKKyAgICAgICAgc2VsZi5xdWV1ZS50cnVuY2F0ZSgwKQogCiAgICAgZGVmIHdyaXRlcm93cyhzZWxmLCByb3dzKToKICAgICAgICAgZm9yIHJvdyBpbiByb3dzOgogICAgICAgICAgICAgc2VsZi53cml0ZXJvdyhyb3cpCiBcZW5ke3ZlcmJhdGltfQotCi1UaGV5IHNob3VsZCB3b3JrIGp1c3QgbGlrZSB0aGUgXGNsYXNze2Nzdi5yZWFkZXJ9IGFuZCBcY2xhc3N7Y3N2LndyaXRlcn0KLWNsYXNzZXMgYnV0IGFkZCBhbiBcdmFye2VuY29kaW5nfSBwYXJhbWV0ZXIuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRhdGV0aW1lLnRleCBiL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4CmluZGV4IDRiYmE1NTMuLmNhZTVkNjAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4CisrKyBiL0RvYy9saWIvbGliZGF0ZXRpbWUudGV4CkBAIC01MDQsNyArNTA0LDcgQEAKICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSwgY29udHJvbGxlZCBieSBhbiBleHBsaWNpdAogICBmb3JtYXQgc3RyaW5nLiAgRm9ybWF0IGNvZGVzIHJlZmVycmluZyB0byBob3VycywgbWludXRlcyBvciBzZWNvbmRzCiAgIHdpbGwgc2VlIDAgdmFsdWVzLgotICBTZWUgdGhlIHNlY3Rpb24gb24gXG1ldGhvZHtzdHJmdGltZSgpfSBiZWhhdmlvci4KKyAgU2VlIHNlY3Rpb25+XHJlZntzdHJmdGltZS1iZWhhdmlvcn0gLS0gXG1ldGhvZHtzdHJmdGltZSgpfSBiZWhhdmlvci4KIFxlbmR7bWV0aG9kZGVzY30KIAogCkBAIC05NzAsOCArOTcwLDggQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9e3N0cmZ0aW1lfXtmb3JtYXR9CiAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUgYW5kIHRpbWUsIGNvbnRyb2xsZWQgYnkgYW4KLSAgZXhwbGljaXQgZm9ybWF0IHN0cmluZy4gIFNlZSB0aGUgc2VjdGlvbiBvbiBcbWV0aG9ke3N0cmZ0aW1lKCl9Ci0gIGJlaGF2aW9yLgorICBleHBsaWNpdCBmb3JtYXQgc3RyaW5nLiAgU2VlIHNlY3Rpb25+XHJlZntzdHJmdGltZS1iZWhhdmlvcn0gLS0KKyAgXG1ldGhvZHtzdHJmdGltZSgpfSBiZWhhdmlvci4KIFxlbmR7bWV0aG9kZGVzY30KIAogCkBAIC0xMTAwLDcgKzExMDAsOCBAQAogCiBcYmVnaW57bWV0aG9kZGVzY317c3RyZnRpbWV9e2Zvcm1hdH0KICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGltZSwgY29udHJvbGxlZCBieSBhbiBleHBsaWNpdAotICBmb3JtYXQgc3RyaW5nLiAgU2VlIHRoZSBzZWN0aW9uIG9uIFxtZXRob2R7c3RyZnRpbWUoKX0gYmVoYXZpb3IuCisgIGZvcm1hdCBzdHJpbmcuICBTZWUgc2VjdGlvbn5ccmVme3N0cmZ0aW1lLWJlaGF2aW9yfSAtLQorICBcbWV0aG9ke3N0cmZ0aW1lKCl9IGJlaGF2aW9yLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317dXRjb2Zmc2V0fXt9CkBAIC0xMzY4LDcgKzEzNjksNyBAQAogLTQgaG91cnMpKS4KIAogCi1cc3Vic2VjdGlvbntcbWV0aG9ke3N0cmZ0aW1lKCl9IEJlaGF2aW9yfQorXHN1YnNlY3Rpb257XG1ldGhvZHtzdHJmdGltZSgpfSBCZWhhdmlvclxsYWJlbHtzdHJmdGltZS1iZWhhdmlvcn19CiAKIFxjbGFzc3tkYXRlfSwgXGNsYXNze2RhdGV0aW1lfSwgYW5kIFxjbGFzc3t0aW1lfQogb2JqZWN0cyBhbGwgc3VwcG9ydCBhIFxjb2Rle3N0cmZ0aW1lKFx2YXJ7Zm9ybWF0fSl9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRlY2ltYWwudGV4IGIvRG9jL2xpYi9saWJkZWNpbWFsLnRleAppbmRleCAwOTJmMDM4Li5mZmMzMzYzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmRlY2ltYWwudGV4CisrKyBiL0RvYy9saWIvbGliZGVjaW1hbC50ZXgKQEAgLTQ0Miw5ICs0NDIsMzMgQEAKICAgU2V0IHRoZSBjdXJyZW50IGNvbnRleHQgZm9yIHRoZSBhY3RpdmUgdGhyZWFkIHRvIFx2YXJ7Y30uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBcZW5ke2Z1bmNkZXNjfSAgCiAKLU5ldyBjb250ZXh0cyBjYW4gZm9ybWVkIHVzaW5nIHRoZSBcY2xhc3N7Q29udGV4dH0gY29uc3RydWN0b3IgZGVzY3JpYmVkIGJlbG93LgotSW4gYWRkaXRpb24sIHRoZSBtb2R1bGUgcHJvdmlkZXMgdGhyZWUgcHJlLW1hZGUgY29udGV4dHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitCZWdpbm5pbmcgd2l0aCBQeXRob24gMi41LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQKK3RvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgYWN0aXZlIGNvbnRleHQuIEZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgY29kZQoraW5jcmVhc2VzIHRoZSBjdXJyZW50IGRlY2ltYWwgcHJlY2lzaW9uIGJ5IDIgcGxhY2VzLCBwZXJmb3JtcyBhCitjYWxjdWxhdGlvbiwgYW5kIHRoZW4gYXV0b21hdGljYWxseSByZXN0b3JlcyB0aGUgcHJldmlvdXMgY29udGV4dDoKIAorXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAoraW1wb3J0IGRlY2ltYWwKKword2l0aCBkZWNpbWFsLmdldGNvbnRleHQoKSBhcyBjdHg6CisgICAgY3R4LnByZWMgKz0gMiAgICMgYWRkIDIgbW9yZSBkaWdpdHMgb2YgcHJlY2lzaW9uCisgICAgY2FsY3VsYXRlX3NvbWV0aGluZygpCitcZW5ke3ZlcmJhdGltfQorCitUaGUgY29udGV4dCB0aGF0J3MgYWN0aXZlIGluIHRoZSBib2R5IG9mIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgaXMKK2EgXGVtcGh7Y29weX0gb2YgdGhlIGNvbnRleHQgeW91IHByb3ZpZGVkIHRvIHRoZSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50LCBzbyBtb2RpZnlpbmcgaXRzIGF0dHJpYnV0ZXMgZG9lc24ndCBhZmZlY3QgYW55dGhpbmcgZXhjZXB0Cit0aGF0IHRlbXBvcmFyeSBjb3B5LgorCitZb3UgY2FuIHVzZSBhbnkgZGVjaW1hbCBjb250ZXh0IGluIGEgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LCBidXQgaWYKK3lvdSBqdXN0IHdhbnQgdG8gbWFrZSBhIHRlbXBvcmFyeSBjaGFuZ2UgdG8gc29tZSBhc3BlY3Qgb2YgdGhlIGN1cnJlbnQKK2NvbnRleHQsIGl0J3MgZWFzaWVzdCB0byBqdXN0IHVzZSBcZnVuY3Rpb257Z2V0Y29udGV4dCgpfSBhcyBzaG93bgorYWJvdmUuCisKK05ldyBjb250ZXh0cyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBcY2xhc3N7Q29udGV4dH0gY29uc3RydWN0b3IKK2Rlc2NyaWJlZCBiZWxvdy4gSW4gYWRkaXRpb24sIHRoZSBtb2R1bGUgcHJvdmlkZXMgdGhyZWUgcHJlLW1hZGUKK2NvbnRleHRzOgogCiBcYmVnaW57Y2xhc3NkZXNjKn17QmFzaWNDb250ZXh0fQogICBUaGlzIGlzIGEgc3RhbmRhcmQgY29udGV4dCBkZWZpbmVkIGJ5IHRoZSBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJmdW5jcy50ZXggYi9Eb2MvbGliL2xpYmZ1bmNzLnRleAppbmRleCAwYmUzYWE5Li5jMDM1MmQzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmZ1bmNzLnRleAorKysgYi9Eb2MvbGliL2xpYmZ1bmNzLnRleApAQCAtNiw3ICs2LDcgQEAKIAogXHNldGluZGV4c3ViaXRlbXsoYnVpbHQtaW4gZnVuY3Rpb24pfQogCi1cYmVnaW57ZnVuY2Rlc2N9e19faW1wb3J0X199e25hbWVcb3B0aW9uYWx7LCBnbG9iYWxzXG9wdGlvbmFseywgbG9jYWxzXG9wdGlvbmFseywgZnJvbWxpc3R9fX19CitcYmVnaW57ZnVuY2Rlc2N9e19faW1wb3J0X199e25hbWVcb3B0aW9uYWx7LCBnbG9iYWxzXG9wdGlvbmFseywgbG9jYWxzXG9wdGlvbmFseywgZnJvbWxpc3Rcb3B0aW9uYWx7LCBsZXZlbH19fX19CiAgIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBieSB0aGUgXGtleXdvcmR7aW1wb3J0fVxzdGluZGV4e2ltcG9ydH0KICAgc3RhdGVtZW50LiAgSXQgbWFpbmx5IGV4aXN0cyBzbyB0aGF0IHlvdSBjYW4gcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIKICAgZnVuY3Rpb24gdGhhdCBoYXMgYSBjb21wYXRpYmxlIGludGVyZmFjZSwgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZQpAQCAtMjAsOSArMjAsOSBAQAogCiAgIEZvciBleGFtcGxlLCB0aGUgc3RhdGVtZW50IFxzYW1we2ltcG9ydCBzcGFtfSByZXN1bHRzIGluIHRoZQogICBmb2xsb3dpbmcgY2FsbDogXGNvZGV7X19pbXBvcnRfXygnc3BhbScsfSBcY29kZXtnbG9iYWxzKCksfQotICBcY29kZXtsb2NhbHMoKSwgW10pfTsgdGhlIHN0YXRlbWVudCBcc2FtcHtmcm9tIHNwYW0uaGFtIGltcG9ydCBlZ2dzfQorICBcY29kZXtsb2NhbHMoKSwgW10sIC0xKX07IHRoZSBzdGF0ZW1lbnQgXHNhbXB7ZnJvbSBzcGFtLmhhbSBpbXBvcnQgZWdnc30KICAgcmVzdWx0cyBpbiBcc2FtcHtfX2ltcG9ydF9fKCdzcGFtLmhhbScsIGdsb2JhbHMoKSwgbG9jYWxzKCksCi0gIFsnZWdncyddKX0uICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggXGNvZGV7bG9jYWxzKCl9IGFuZAorICBbJ2VnZ3MnXSwgLTEpfS4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBcY29kZXtsb2NhbHMoKX0gYW5kCiAgIFxjb2Rle1snZWdncyddfSBhcmUgcGFzc2VkIGluIGFzIGFyZ3VtZW50cywgdGhlCiAgIFxmdW5jdGlvbntfX2ltcG9ydF9fKCl9IGZ1bmN0aW9uIGRvZXMgbm90IHNldCB0aGUgbG9jYWwgdmFyaWFibGUKICAgbmFtZWQgXGNvZGV7ZWdnc307IHRoaXMgaXMgZG9uZSBieSBzdWJzZXF1ZW50IGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQKQEAgLTUyLDYgKzUyLDE1IEBACiAgICAgICAgIG1vZCA9IGdldGF0dHIobW9kLCBjb21wKQogICAgIHJldHVybiBtb2QKIFxlbmR7dmVyYmF0aW19CisKKyAgXHZhcntsZXZlbH0gc3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHMuCisgIFRoZSBkZWZhdWx0IGlzIFxjb2Rley0xfSB3aGljaCBpbmRpY2F0ZXMgYm90aCBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUKKyAgaW1wb3J0cyB3aWxsIGJlIGF0dGVtcHRlZC4gIFxjb2RlezB9IG1lYW5zIG9ubHkgcGVyZm9ybSBhYnNvbHV0ZSBpbXBvcnRzLgorICBQb3NpdGl2ZSB2YWx1ZXMgZm9yIFx2YXJ7bGV2ZWx9IGluZGljYXRlIHRoZSBudW1iZXIgb2YgcGFyZW50IGRpcmVjdG9yaWVzCisgIHRvIHNlYXJjaCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBtb2R1bGUgY2FsbGluZworICBcZnVuY3Rpb257X19pbXBvcnRfX30uCitcdmVyc2lvbmNoYW5nZWRbVGhlIGxldmVsIHBhcmFtZXRlciB3YXMgYWRkZWRdezIuNX0KK1x2ZXJzaW9uY2hhbmdlZFtLZXl3b3JkIHN1cHBvcnQgZm9yIHBhcmFtZXRlcnMgd2FzIGFkZGVkXXsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2Fic317eH0KQEAgLTY4Myw3ICs2OTIsNyBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtvYmplY3R9e30KLSAgUmV0dXJuIGEgbmV3IGZlYXR1cmVsZXNzIG9iamVjdC4gIFxmdW5jdGlvbntvYmplY3QoKX0gaXMgYSBiYXNlCisgIFJldHVybiBhIG5ldyBmZWF0dXJlbGVzcyBvYmplY3QuICBcY2xhc3N7b2JqZWN0fSBpcyBhIGJhc2UKICAgZm9yIGFsbCBuZXcgc3R5bGUgY2xhc3Nlcy4gIEl0IGhhcyB0aGUgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24KICAgdG8gYWxsIGluc3RhbmNlcyBvZiBuZXcgc3R5bGUgY2xhc3Nlcy4KICAgXHZlcnNpb25hZGRlZHsyLjJ9CkBAIC03MTgsOCArNzI3LDExIEBACiBcYmVnaW57ZnVuY2Rlc2N9e3Bvd317eCwgeVxvcHRpb25hbHssIHp9fQogICBSZXR1cm4gXHZhcnt4fSB0byB0aGUgcG93ZXIgXHZhcnt5fTsgaWYgXHZhcnt6fSBpcyBwcmVzZW50LCByZXR1cm4KICAgXHZhcnt4fSB0byB0aGUgcG93ZXIgXHZhcnt5fSwgbW9kdWxvIFx2YXJ7en0gKGNvbXB1dGVkIG1vcmUKLSAgZWZmaWNpZW50bHkgdGhhbiBcY29kZXtwb3coXHZhcnt4fSwgXHZhcnt5fSkgXCVcIFx2YXJ7en19KS4gIFRoZQotICBhcmd1bWVudHMgbXVzdCBoYXZlIG51bWVyaWMgdHlwZXMuICBXaXRoIG1peGVkIG9wZXJhbmQgdHlwZXMsIHRoZQorICBlZmZpY2llbnRseSB0aGFuIFxjb2Rle3BvdyhcdmFye3h9LCBcdmFye3l9KSBcJVwgXHZhcnt6fX0pLgorICBUaGUgdHdvLWFyZ3VtZW50IGZvcm0gXGNvZGV7cG93KFx2YXJ7eH0sIFx2YXJ7eX0pfSBpcyBlcXVpdmFsZW50IHRvIHVzaW5nCisgIHRoZSBwb3dlciBvcGVyYXRvcjogXGNvZGV7XHZhcnt4fSoqXHZhcnt5fX0uCisgIAorICBUaGUgYXJndW1lbnRzIG11c3QgaGF2ZSBudW1lcmljIHR5cGVzLiAgV2l0aCBtaXhlZCBvcGVyYW5kIHR5cGVzLCB0aGUKICAgY29lcmNpb24gcnVsZXMgZm9yIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdG9ycyBhcHBseS4gIEZvciBpbnQgYW5kCiAgIGxvbmcgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcwogICAoYWZ0ZXIgY29lcmNpb24pIHVubGVzcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlOyBpbiB0aGF0CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdjLnRleCBiL0RvYy9saWIvbGliZ2MudGV4CmluZGV4IDU0Y2EyNmMuLjBkMzQwOGIgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZ2MudGV4CisrKyBiL0RvYy9saWIvbGliZ2MudGV4CkBAIC0zNSw3ICszNSw4IEBACiBcYmVnaW57ZnVuY2Rlc2N9e2NvbGxlY3R9e1xvcHRpb25hbHtnZW5lcmF0aW9ufX0KIFdpdGggbm8gYXJndW1lbnRzLCBydW4gYSBmdWxsIGNvbGxlY3Rpb24uICBUaGUgb3B0aW9uYWwgYXJndW1lbnQKIFx2YXJ7Z2VuZXJhdGlvbn0gbWF5IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyB3aGljaCBnZW5lcmF0aW9uIHRvIGNvbGxlY3QKLShmcm9tIDAgdG8gMikuICBBIFZhbHVlRXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBnZW5lcmF0aW9uIG51bWJlciBpcyBpbnZhbGlkLgorKGZyb20gMCB0byAyKS4gIEEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWQgaWYgdGhlIGdlbmVyYXRpb24gbnVtYmVyIAoraXMgaW52YWxpZC4KIFRoZSBudW1iZXIgb2YgdW5yZWFjaGFibGUgb2JqZWN0cyBmb3VuZCBpcyByZXR1cm5lZC4KIAogXHZlcnNpb25jaGFuZ2VkW1RoZSBvcHRpb25hbCBcdmFye2dlbmVyYXRpb259IGFyZ3VtZW50IHdhcyBhZGRlZF17Mi41fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJnZXRwYXNzLnRleCBiL0RvYy9saWIvbGliZ2V0cGFzcy50ZXgKaW5kZXggMjhiZmU4Zi4uMWQxNzdkMyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJnZXRwYXNzLnRleAorKysgYi9Eb2MvbGliL2xpYmdldHBhc3MudGV4CkBAIC0xMSwxMSArMTEsMTUgQEAKIFRoZSBcbW9kdWxle2dldHBhc3N9IG1vZHVsZSBwcm92aWRlcyB0d28gZnVuY3Rpb25zOgogCiAKLVxiZWdpbntmdW5jZGVzY317Z2V0cGFzc317XG9wdGlvbmFse3Byb21wdH19CitcYmVnaW57ZnVuY2Rlc2N9e2dldHBhc3N9e1xvcHRpb25hbHtwcm9tcHRcb3B0aW9uYWx7LCBzdHJlYW19fX0KICAgUHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkIHdpdGhvdXQgZWNob2luZy4gIFRoZSB1c2VyIGlzCiAgIHByb21wdGVkIHVzaW5nIHRoZSBzdHJpbmcgXHZhcntwcm9tcHR9LCB3aGljaCBkZWZhdWx0cyB0bwotICBcY29kZXsnUGFzc3dvcmQ6ICd9LgorICBcY29kZXsnUGFzc3dvcmQ6ICd9LiBPbiBcVU5JWCwgdGhlIHByb21wdCBpcyB3cml0dGVuIHRvIHRoZQorICBmaWxlLWxpa2Ugb2JqZWN0IFx2YXJ7c3RyZWFtfSwgd2hpY2ggZGVmYXVsdHMgdG8KKyAgXGNvZGV7c3lzLnN0ZG91dH0gKHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZCBvbiBXaW5kb3dzKS4KKwogICBBdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCisgIFx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7c3RyZWFtfSBwYXJhbWV0ZXJdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJoYXNobGliLnRleCBiL0RvYy9saWIvbGliaGFzaGxpYi50ZXgKaW5kZXggZTlkMGI1Ny4uNjJlM2ZjNCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJoYXNobGliLnRleAorKysgYi9Eb2MvbGliL2xpYmhhc2hsaWIudGV4CkBAIC0zMSw3ICszMSw3IEBACiBDb25zdHJ1Y3RvcnMgZm9yIGhhc2ggYWxnb3JpdGhtcyB0aGF0IGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGlzIG1vZHVsZSBhcmUKIFxmdW5jdGlvbnttZDUoKX0sIFxmdW5jdGlvbntzaGExKCl9LCBcZnVuY3Rpb257c2hhMjI0KCl9LCBcZnVuY3Rpb257c2hhMjU2KCl9LAogXGZ1bmN0aW9ue3NoYTM4NCgpfSwgYW5kIFxmdW5jdGlvbntzaGE1MTIoKX0uICBBZGRpdGlvbmFsIGFsZ29yaXRobXMgbWF5IGFsc28KLWJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTCBsaWJyYXJ5IHB5dGhvbiB1c2VzIG9uIHlvdXIgcGxhdGZvcm0uCitiZSBhdmFpbGFibGUgZGVwZW5kaW5nIHVwb24gdGhlIE9wZW5TU0wgbGlicmFyeSB0aGF0IFB5dGhvbiB1c2VzIG9uIHlvdXIgcGxhdGZvcm0uCiBcaW5kZXh7T3BlblNTTH0KIAogRm9yIGV4YW1wbGUsIHRvIG9idGFpbiB0aGUgZGlnZXN0IG9mIHRoZSBzdHJpbmcgXGNvZGV7J05vYm9keSBpbnNwZWN0cwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpdGVydG9vbHMudGV4IGIvRG9jL2xpYi9saWJpdGVydG9vbHMudGV4CmluZGV4IDQyMWQ2NDcuLjIwYmJjOGQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliaXRlcnRvb2xzLnRleAorKysgYi9Eb2MvbGliL2xpYml0ZXJ0b29scy50ZXgKQEAgLTI3NiwxMiArMjc2LDMwIEBACiAgICAgIGRlZiBpemlwKCppdGVyYWJsZXMpOgogICAgICAgICAgaXRlcmFibGVzID0gbWFwKGl0ZXIsIGl0ZXJhYmxlcykKICAgICAgICAgIHdoaWxlIGl0ZXJhYmxlczoKLSAgICAgICAgICAgICByZXN1bHQgPSBbaS5uZXh0KCkgZm9yIGkgaW4gaXRlcmFibGVzXQorICAgICAgICAgICAgIHJlc3VsdCA9IFtpdC5uZXh0KCkgZm9yIGl0IGluIGl0ZXJhYmxlc10KICAgICAgICAgICAgICB5aWVsZCB0dXBsZShyZXN1bHQpCiAgIFxlbmR7dmVyYmF0aW19CiAKICAgXHZlcnNpb25jaGFuZ2VkW1doZW4gbm8gaXRlcmFibGVzIGFyZSBzcGVjaWZpZWQsIHJldHVybnMgYSB6ZXJvIGxlbmd0aAotICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgaW5zdGVhZCBvZiByYWlzaW5nIGEgVHlwZUVycm9yIGV4Y2VwdGlvbl17Mi40fSAgCisgICAgICAgICAgICAgICAgICBpdGVyYXRvciBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0KKwkJICBleGNlcHRpb25dezIuNH0KKworICBOb3RlLCB0aGUgbGVmdC10by1yaWdodCBldmFsdWF0aW9uIG9yZGVyIG9mIHRoZSBpdGVyYWJsZXMgaXMgZ3VhcmFudGVlZC4KKyAgVGhpcyBtYWtlcyBwb3NzaWJsZSBhbiBpZGlvbSBmb3IgY2x1c3RlcmluZyBhIGRhdGEgc2VyaWVzIGludG8gbi1sZW5ndGgKKyAgZ3JvdXBzIHVzaW5nIFxzYW1we2l6aXAoKltpdGVyKHMpXSpuKX0uICBGb3IgZGF0YSB0aGF0IGRvZXNuJ3QgZml0CisgIG4tbGVuZ3RoIGdyb3VwcyBleGFjdGx5LCB0aGUgbGFzdCB0dXBsZSBjYW4gYmUgcHJlLXBhZGRlZCB3aXRoIGZpbGwKKyAgdmFsdWVzIHVzaW5nIFxzYW1we2l6aXAoKltjaGFpbihzLCBbTm9uZV0qKG4tMSkpXSpuKX0uCisgICAgICAgICAKKyAgTm90ZSwgd2hlbiBcZnVuY3Rpb257aXppcCgpfSBpcyB1c2VkIHdpdGggdW5lcXVhbCBsZW5ndGggaW5wdXRzLCBzdWJzZXF1ZW50CisgIGl0ZXJhdGlvbiBvdmVyIHRoZSBsb25nZXIgaXRlcmFibGVzIGNhbm5vdCByZWxpYWJseSBiZSBjb250aW51ZWQgYWZ0ZXIKKyAgXGZ1bmN0aW9ue2l6aXAoKX0gdGVybWluYXRlcy4gIFBvdGVudGlhbGx5LCB1cCB0byBvbmUgZW50cnkgd2lsbCBiZSBtaXNzaW5nCisgIGZyb20gZWFjaCBvZiB0aGUgbGVmdC1vdmVyIGl0ZXJhYmxlcy4gVGhpcyBvY2N1cnMgYmVjYXVzZSBhIHZhbHVlIGlzIGZldGNoZWQKKyAgZnJvbSBlYWNoIGl0ZXJhdG9yIGluLXR1cm4sIGJ1dCB0aGUgcHJvY2VzcyBlbmRzIHdoZW4gb25lIG9mIHRoZSBpdGVyYXRvcnMKKyAgdGVybWluYXRlcy4gIFRoaXMgbGVhdmVzIHRoZSBsYXN0IGZldGNoZWQgdmFsdWVzIGluIGxpbWJvICh0aGV5IGNhbm5vdCBiZQorICByZXR1cm5lZCBpbiBhIGZpbmFsLCBpbmNvbXBsZXRlIHR1cGxlIGFuZCB0aGV5IGFyZSBjYW5ub3QgYmUgcHVzaGVkIGJhY2sKKyAgaW50byB0aGUgaXRlcmF0b3IgZm9yIHJldHJpZXZhbCB3aXRoIFxjb2Rle2l0Lm5leHQoKX0pLiAgSW4gZ2VuZXJhbCwKKyAgXGZ1bmN0aW9ue2l6aXAoKX0gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHVuZXF1YWwgbGVuZ3RoIGlucHV0cyB3aGVuIHlvdQorICBkb24ndCBjYXJlIGFib3V0IHRyYWlsaW5nLCB1bm1hdGNoZWQgdmFsdWVzIGZyb20gdGhlIGxvbmdlciBpdGVyYWJsZXMuCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3JlcGVhdH17b2JqZWN0XG9wdGlvbmFseywgdGltZXN9fQpAQCAtNTE3LDQgKzUzNSw5IEBACiAgICAgICAgIHBhc3MKICAgICByZXR1cm4gaXppcChhLCBiKQogCitkZWYgZ3JvdXBlcihuLCBpdGVyYWJsZSwgcGFkdmFsdWU9Tm9uZSk6CisgICAgImdyb3VwZXIoMywgJ2FiY2RlZmcnLCAneCcpIC0tPiAoJ2EnLCdiJywnYycpLCAoJ2QnLCdlJywnZicpLCAoJ2cnLCd4JywneCcpIgorICAgIHJldHVybiBpemlwKCpbY2hhaW4oaXRlcmFibGUsIHJlcGVhdChwYWR2YWx1ZSwgbi0xKSldKm4pCisKKwogXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibGluZWNhY2hlLnRleCBiL0RvYy9saWIvbGlibGluZWNhY2hlLnRleAppbmRleCBjMDIyYmE5Li4xNDc3ZDNjIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmxpbmVjYWNoZS50ZXgKKysrIGIvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4CkBAIC0xNSw3ICsxNSw3IEBACiAKIFRoZSBcbW9kdWxle2xpbmVjYWNoZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKLVxiZWdpbntmdW5jZGVzY317Z2V0bGluZX17ZmlsZW5hbWUsIGxpbmVub30KK1xiZWdpbntmdW5jZGVzY317Z2V0bGluZX17ZmlsZW5hbWUsIGxpbmVub1xvcHRpb25hbHssIG1vZHVsZV9nbG9iYWxzfX0KIEdldCBsaW5lIFx2YXJ7bGluZW5vfSBmcm9tIGZpbGUgbmFtZWQgXHZhcntmaWxlbmFtZX0uIFRoaXMgZnVuY3Rpb24KIHdpbGwgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uIC0tLSBpdCB3aWxsIHJldHVybiBcY29kZXsnJ30gb24gZXJyb3JzCiAodGhlIHRlcm1pbmF0aW5nIG5ld2xpbmUgY2hhcmFjdGVyIHdpbGwgYmUgaW5jbHVkZWQgZm9yIGxpbmVzIHRoYXQgYXJlCkBAIC0yMyw3ICsyMywxMSBAQAogCiBJZiBhIGZpbGUgbmFtZWQgXHZhcntmaWxlbmFtZX0gaXMgbm90IGZvdW5kLCB0aGUgZnVuY3Rpb24gd2lsbCBsb29rCiBmb3IgaXQgaW4gdGhlIG1vZHVsZVxpbmRleGlpaXttb2R1bGV9e3NlYXJjaH17cGF0aH0gc2VhcmNoIHBhdGgsCi1cY29kZXtzeXMucGF0aH0uCitcY29kZXtzeXMucGF0aH0sIGFmdGVyIGZpcnN0IGNoZWNraW5nIGZvciBhIFxwZXB7MzAyfSBcY29kZXtfX2xvYWRlcl9ffQoraW4gXHZhcnttb2R1bGVfZ2xvYmFsc30sIGluIGNhc2UgdGhlIG1vZHVsZSB3YXMgaW1wb3J0ZWQgZnJvbSBhIHppcGZpbGUKK29yIG90aGVyIG5vbi1maWxlc3lzdGVtIGltcG9ydCBzb3VyY2UuIAorCitcdmVyc2lvbmFkZGVkW1RoZSBcdmFye21vZHVsZV9nbG9iYWxzfSBwYXJhbWV0ZXIgd2FzIGFkZGVkXXsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2NsZWFyY2FjaGV9e30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibm50cGxpYi50ZXggYi9Eb2MvbGliL2xpYm5udHBsaWIudGV4CmluZGV4IDdmMTRkZWUuLjEwMzMwZWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibm50cGxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJubnRwbGliLnRleApAQCAtNjgsNDggKzY4LDQ4IEBACiBzZW50IGJlZm9yZSBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQuICBSZWFkZXIgbW9kZSBpcyBzb21ldGltZXMKIG5lY2Vzc2FyeSBpZiB5b3UgYXJlIGNvbm5lY3RpbmcgdG8gYW4gTk5UUCBzZXJ2ZXIgb24gdGhlIGxvY2FsIG1hY2hpbmUKIGFuZCBpbnRlbmQgdG8gY2FsbCByZWFkZXItc3BlY2lmaWMgY29tbWFuZHMsIHN1Y2ggYXMgXHNhbXB7Z3JvdXB9LiAgSWYKLXlvdSBnZXQgdW5leHBlY3RlZCBcY29kZXtOTlRQUGVybWFuZW50RXJyb3J9cywgeW91IG1pZ2h0IG5lZWQgdG8gc2V0Cit5b3UgZ2V0IHVuZXhwZWN0ZWQgXGV4Y2VwdGlvbntOTlRQUGVybWFuZW50RXJyb3J9cywgeW91IG1pZ2h0IG5lZWQgdG8gc2V0CiBcdmFye3JlYWRlcm1vZGV9LiAgXHZhcntyZWFkZXJtb2RlfSBkZWZhdWx0cyB0byBcY29kZXtOb25lfS4KIFx2YXJ7dXNlbmV0cmN9IGRlZmF1bHRzIHRvIFxjb2Rle1RydWV9LgogCiBcdmVyc2lvbmNoYW5nZWRbXHZhcnt1c2VuZXRyY30gYXJndW1lbnQgYWRkZWRdezIuNH0KIFxlbmR7Y2xhc3NkZXNjfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtOTlRQRXJyb3J9e30KLURlcml2ZWQgZnJvbSB0aGUgc3RhbmRhcmQgZXhjZXB0aW9uIFxjb2Rle0V4Y2VwdGlvbn0sIHRoaXMgaXMgdGhlIGJhc2UKLWNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlIFxjb2Rle25udHBsaWJ9IG1vZHVsZS4KLVxlbmR7Y2xhc3NkZXNjfQorXGJlZ2lue2V4Y2Rlc2N9e05OVFBFcnJvcn0KK0Rlcml2ZWQgZnJvbSB0aGUgc3RhbmRhcmQgZXhjZXB0aW9uIFxleGNlcHRpb257RXhjZXB0aW9ufSwgdGhpcyBpcyB0aGUKK2Jhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHJhaXNlZCBieSB0aGUgXG1vZHVsZXtubnRwbGlifSBtb2R1bGUuCitcZW5ke2V4Y2Rlc2N9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e05OVFBSZXBseUVycm9yfXt9CitcYmVnaW57ZXhjZGVzY317Tk5UUFJlcGx5RXJyb3J9CiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gdW5leHBlY3RlZCByZXBseSBpcyByZWNlaXZlZCBmcm9tIHRoZQogc2VydmVyLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uIFxjb2Rle2Vycm9yX3JlcGx5fQogaXMgZXF1aXZhbGVudCB0byB0aGlzIGNsYXNzLgotXGVuZHtjbGFzc2Rlc2N9CitcZW5ke2V4Y2Rlc2N9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e05OVFBUZW1wb3JhcnlFcnJvcn17fQorXGJlZ2lue2V4Y2Rlc2N9e05OVFBUZW1wb3JhcnlFcnJvcn0KIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBlcnJvciBjb2RlIGluIHRoZSByYW5nZSA0MDAtLTQ5OSBpcwogcmVjZWl2ZWQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBleGNlcHRpb24KIFxjb2Rle2Vycm9yX3RlbXB9IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBjbGFzcy4KLVxlbmR7Y2xhc3NkZXNjfQorXGVuZHtleGNkZXNjfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtOTlRQUGVybWFuZW50RXJyb3J9e30KK1xiZWdpbntleGNkZXNjfXtOTlRQUGVybWFuZW50RXJyb3J9CiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3IgY29kZSBpbiB0aGUgcmFuZ2UgNTAwLS01OTkgaXMKIHJlY2VpdmVkLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uCiBcY29kZXtlcnJvcl9wZXJtfSBpcyBlcXVpdmFsZW50IHRvIHRoaXMgY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KK1xlbmR7ZXhjZGVzY30KIAotXGJlZ2lue2NsYXNzZGVzY317Tk5UUFByb3RvY29sRXJyb3J9e30KK1xiZWdpbntleGNkZXNjfXtOTlRQUHJvdG9jb2xFcnJvcn0KIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIHJlcGx5IGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciB0aGF0IGRvZXMKIG5vdCBiZWdpbiB3aXRoIGEgZGlnaXQgaW4gdGhlIHJhbmdlIDEtLTUuICBGb3IgYmFja3dhcmRzCiBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uIFxjb2Rle2Vycm9yX3Byb3RvfSBpcyBlcXVpdmFsZW50IHRvIHRoaXMKIGNsYXNzLgotXGVuZHtjbGFzc2Rlc2N9CitcZW5ke2V4Y2Rlc2N9CiAKLVxiZWdpbntjbGFzc2Rlc2N9e05OVFBEYXRhRXJyb3J9e30KK1xiZWdpbntleGNkZXNjfXtOTlRQRGF0YUVycm9yfQogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZXJlIGlzIHNvbWUgZXJyb3IgaW4gdGhlIHJlc3BvbnNlIGRhdGEuICBGb3IKIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgZXhjZXB0aW9uIFxjb2Rle2Vycm9yX2RhdGF9IGlzCiBlcXVpdmFsZW50IHRvIHRoaXMgY2xhc3MuCi1cZW5ke2NsYXNzZGVzY30KK1xlbmR7ZXhjZGVzY30KIAogCiBcc3Vic2VjdGlvbntOTlRQIE9iamVjdHMgXGxhYmVse25udHAtb2JqZWN0c319CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm9wdHBhcnNlLnRleCBiL0RvYy9saWIvbGlib3B0cGFyc2UudGV4CmluZGV4IDRhYjMyNWIuLjhhY2E1MDEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlib3B0cGFyc2UudGV4CisrKyBiL0RvYy9saWIvbGlib3B0cGFyc2UudGV4CkBAIC0xMDAsOCArMTAwLDggQEAKIHNpbmdsZSBsZXR0ZXIsIGUuZy4gXGNvZGV7Ii14In0gb3IgXGNvZGV7Ii1GIn0uICBBbHNvLCB0cmFkaXRpb25hbCBcVU5JWHt9CiBzeW50YXggYWxsb3dzIG11bHRpcGxlIG9wdGlvbnMgdG8gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgYXJndW1lbnQsCiBlLmcuICBcY29kZXsiLXggLUYifSBpcyBlcXVpdmFsZW50IHRvIFxjb2RleyIteEYifS4gIFRoZSBHTlUgcHJvamVjdAotaW50cm9kdWNlZCBcY29kZXsiLXt9LSJ9IGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIGh5cGhlbi1zZXBhcmF0ZWQgd29yZHMsCi1lLmcuIFxjb2RleyIte30tZmlsZSJ9IG9yIFxjb2RleyIte30tZHJ5LXJ1biJ9LiAgVGhlc2UgYXJlIHRoZSBvbmx5IHR3byBvcHRpb24KK2ludHJvZHVjZWQgXGNvZGV7InstLX0ifSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiBoeXBoZW4tc2VwYXJhdGVkIHdvcmRzLAorZS5nLiBcY29kZXsiey0tfWZpbGUifSBvciBcY29kZXsiey0tfWRyeS1ydW4ifS4gIFRoZXNlIGFyZSB0aGUgb25seSB0d28gb3B0aW9uCiBzeW50YXhlcyBwcm92aWRlZCBieSBcbW9kdWxle29wdHBhcnNlfS4KIAogU29tZSBvdGhlciBvcHRpb24gc3ludGF4ZXMgdGhhdCB0aGUgd29ybGQgaGFzIHNlZW4gaW5jbHVkZToKQEAgLTE3MCw3ICsxNzAsNyBAQAogcHJvZyAtdiAtLXJlcG9ydCAvdG1wL3JlcG9ydC50eHQgZm9vIGJhcgogXGVuZHt2ZXJiYXRpbX0KIAotXGNvZGV7Ii12In0gYW5kIFxjb2RleyIte30tcmVwb3J0In0gYXJlIGJvdGggb3B0aW9ucy4gIEFzc3VtaW5nIHRoYXQKK1xjb2RleyItdiJ9IGFuZCBcY29kZXsiey0tfXJlcG9ydCJ9IGFyZSBib3RoIG9wdGlvbnMuICBBc3N1bWluZyB0aGF0CiBcbG9uZ3Byb2dyYW1vcHR7cmVwb3J0fSB0YWtlcyBvbmUgYXJndW1lbnQsIFxjb2RleyIvdG1wL3JlcG9ydC50eHQifSBpcyBhbiBvcHRpb24KIGFyZ3VtZW50LiAgXGNvZGV7ImZvbyJ9IGFuZCBcY29kZXsiYmFyIn0gYXJlIHBvc2l0aW9uYWwgYXJndW1lbnRzLgogCkBAIC01ODcsNyArNTg3LDcgQEAKIGVycm9uZW91cyBjYWxscyB0byBcY29kZXtwYXJzZS5hZGR7XF99b3B0aW9uKCl9LCBlLmcuIGludmFsaWQgb3B0aW9uIHN0cmluZ3MsCiB1bmtub3duIG9wdGlvbiBhdHRyaWJ1dGVzLCBtaXNzaW5nIG9wdGlvbiBhdHRyaWJ1dGVzLCBldGMuICBUaGVzZSBhcmUKIGRlYWx0IHdpdGggaW4gdGhlIHVzdWFsIHdheTogcmFpc2UgYW4gZXhjZXB0aW9uIChlaXRoZXIKLVxjb2Rle29wdHBhcnNlLk9wdGlvbkVycm9yfSBvciBcY29kZXtUeXBlRXJyb3J9KSBhbmQgbGV0IHRoZSBwcm9ncmFtIGNyYXNoLgorXGV4Y2VwdGlvbntvcHRwYXJzZS5PcHRpb25FcnJvcn0gb3IgXGV4Y2VwdGlvbntUeXBlRXJyb3J9KSBhbmQgbGV0IHRoZSBwcm9ncmFtIGNyYXNoLgogCiBIYW5kbGluZyB1c2VyIGVycm9ycyBpcyBtdWNoIG1vcmUgaW1wb3J0YW50LCBzaW5jZSB0aGV5IGFyZSBndWFyYW50ZWVkCiB0byBoYXBwZW4gbm8gbWF0dGVyIGhvdyBzdGFibGUgeW91ciBjb2RlIGlzLiAgXG1vZHVsZXtvcHRwYXJzZX0gY2FuIGF1dG9tYXRpY2FsbHkKQEAgLTEwMTksOSArMTAxOSw5IEBACiAKIEludGVnZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gXGNvZGV7aW50KCl9IHRvIGNvbnZlcnQgdGhlbSB0byBQeXRob24KIGludGVnZXJzLiAgSWYgXGNvZGV7aW50KCl9IGZhaWxzLCBzbyB3aWxsIFxtb2R1bGV7b3B0cGFyc2V9LCBhbHRob3VnaCB3aXRoIGEgbW9yZQotdXNlZnVsIGVycm9yIG1lc3NhZ2UuICAoSW50ZXJuYWxseSwgXG1vZHVsZXtvcHRwYXJzZX0gcmFpc2VzIE9wdGlvblZhbHVlRXJyb3I7Ci1PcHRpb25QYXJzZXIgY2F0Y2hlcyB0aGlzIGV4Y2VwdGlvbiBoaWdoZXIgdXAgYW5kIHRlcm1pbmF0ZXMgeW91cgotcHJvZ3JhbSB3aXRoIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuKQordXNlZnVsIGVycm9yIG1lc3NhZ2UuICAoSW50ZXJuYWxseSwgXG1vZHVsZXtvcHRwYXJzZX0gcmFpc2VzCitcZXhjZXB0aW9ue09wdGlvblZhbHVlRXJyb3J9OyBPcHRpb25QYXJzZXIgY2F0Y2hlcyB0aGlzIGV4Y2VwdGlvbiBoaWdoZXIKK3VwIGFuZCB0ZXJtaW5hdGVzIHlvdXIgcHJvZ3JhbSB3aXRoIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuKQogCiBMaWtld2lzZSwgXGNvZGV7ZmxvYXR9IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIFxjb2Rle2Zsb2F0KCl9IGZvciBjb252ZXJzaW9uLAogXGNvZGV7bG9uZ30gYXJndW1lbnRzIHRvIFxjb2Rle2xvbmcoKX0sIGFuZCBcY29kZXtjb21wbGV4fSBhcmd1bWVudHMgdG8KQEAgLTEwMzIsNyArMTAzMiw3IEBACiBvcHRpb24gYXR0cmlidXRlIChhIHNlcXVlbmNlIG9mIHN0cmluZ3MpIGRlZmluZXMgdGhlIHNldCBvZiBhbGxvd2VkCiBvcHRpb24gYXJndW1lbnRzLiAgXGNvZGV7b3B0cGFyc2Uub3B0aW9uLmNoZWNre1xffWNob2ljZSgpfSBjb21wYXJlcwogdXNlci1zdXBwbGllZCBvcHRpb24gYXJndW1lbnRzIGFnYWluc3QgdGhpcyBtYXN0ZXIgbGlzdCBhbmQgcmFpc2VzCi1PcHRpb25WYWx1ZUVycm9yIGlmIGFuIGludmFsaWQgc3RyaW5nIGlzIGdpdmVuLgorXGV4Y2VwdGlvbntPcHRpb25WYWx1ZUVycm9yfSBpZiBhbiBpbnZhbGlkIHN0cmluZyBpcyBnaXZlbi4KIAogCiBcc3Vic3Vic2VjdGlvbntRdWVyeWluZyBhbmQgbWFuaXB1bGF0aW5nIHlvdXIgb3B0aW9uIHBhcnNlclxsYWJlbHtvcHRwYXJzZS1xdWVyeWluZy1tYW5pcHVsYXRpbmctb3B0aW9uLXBhcnNlcn19CkBAIC0xMDUyLDcgKzEwNTIsNyBAQAogb3B0aW9uIHN0cmluZ3MsIGFsbCBvZiB0aG9zZSBvcHRpb24gc3RyaW5ncyBiZWNvbWUgaW52YWxpZC4KIAogSWYgXGNvZGV7b3B0e1xffXN0cn0gZG9lcyBub3Qgb2NjdXIgaW4gYW55IG9wdGlvbiBiZWxvbmdpbmcgdG8gdGhpcwotT3B0aW9uUGFyc2VyLCByYWlzZXMgVmFsdWVFcnJvci4KK09wdGlvblBhcnNlciwgcmFpc2VzIFxleGNlcHRpb257VmFsdWVFcnJvcn0uCiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAKQEAgLTEwODcsNyArMTA4Nyw3IEBACiBcYmVnaW57ZGVzY3JpcHRpb259CiBcaXRlbVtcY29kZXtlcnJvcn0gKGRlZmF1bHQpXQogYXNzdW1lIG9wdGlvbiBjb25mbGljdHMgYXJlIGEgcHJvZ3JhbW1pbmcgZXJyb3IgYW5kIHJhaXNlIAotT3B0aW9uQ29uZmxpY3RFcnJvcgorXGV4Y2VwdGlvbntPcHRpb25Db25mbGljdEVycm9yfQogXGl0ZW1bXGNvZGV7cmVzb2x2ZX1dCiByZXNvbHZlIG9wdGlvbiBjb25mbGljdHMgaW50ZWxsaWdlbnRseSAoc2VlIGJlbG93KQogXGVuZHtkZXNjcmlwdGlvbn0KQEAgLTEyNjAsNyArMTI2MCw3IEBACiAKIFxzdWJzdWJzZWN0aW9ue1JhaXNpbmcgZXJyb3JzIGluIGEgY2FsbGJhY2tcbGFiZWx7b3B0cGFyc2UtcmFpc2luZy1lcnJvcnMtaW4tY2FsbGJhY2t9fQogCi1UaGUgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IgaWYgdGhlcmUgYXJlIGFueQorVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCByYWlzZSBcZXhjZXB0aW9ue09wdGlvblZhbHVlRXJyb3J9IGlmIHRoZXJlIGFyZSBhbnkKIHByb2JsZW1zIHdpdGggdGhlIG9wdGlvbiBvciBpdHMgYXJndW1lbnQocykuICBcbW9kdWxle29wdHBhcnNlfSBjYXRjaGVzIHRoaXMgYW5kCiB0ZXJtaW5hdGVzIHRoZSBwcm9ncmFtLCBwcmludGluZyB0aGUgZXJyb3IgbWVzc2FnZSB5b3Ugc3VwcGx5IHRvCiBzdGRlcnIuICBZb3VyIG1lc3NhZ2Ugc2hvdWxkIGJlIGNsZWFyLCBjb25jaXNlLCBhY2N1cmF0ZSwgYW5kIG1lbnRpb24KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3MudGV4IGIvRG9jL2xpYi9saWJvcy50ZXgKaW5kZXggOWFmNTg4OS4uOWRlZDNhZSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJvcy50ZXgKKysrIGIvRG9jL2xpYi9saWJvcy50ZXgKQEAgLTM0Myw2ICszNDMsMTAgQEAKIFx2ZXJzaW9uY2hhbmdlZFtXaGVuIHNwZWNpZmllZCwgdGhlIFx2YXJ7bW9kZX0gYXJndW1lbnQgbXVzdCBub3cgc3RhcnQKICAgd2l0aCBvbmUgb2YgdGhlIGxldHRlcnMgXGNoYXJhY3RlcntyfSwgXGNoYXJhY3Rlcnt3fSwgb3IgXGNoYXJhY3RlcnthfSwKICAgb3RoZXJ3aXNlIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpcyByYWlzZWRdezIuM30KK1x2ZXJzaW9uY2hhbmdlZFtPbiBcVU5JWCwgd2hlbiB0aGUgXHZhcnttb2RlfSBhcmd1bWVudCBzdGFydHMgd2l0aAorICBcY2hhcmFjdGVye2F9LCB0aGUgXHZhcntPX0FQUEVORH0gZmxhZyBpcyBzZXQgb24gdGhlIGZpbGUgZGVzY3JpcHRvcgorICAod2hpY2ggdGhlIFxjZnVuY3Rpb257ZmRvcGVuKCl9IGltcGxlbWVudGF0aW9uIGFscmVhZHkgZG9lcyBvbiBtb3N0CisgIHBsYXRmb3JtcyldezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317cG9wZW59e2NvbW1hbmRcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgYnVmc2l6ZX19fQpAQCAtNTQ3LDcgKzU1MSw4IEBACiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBsb3ctbGV2ZWwgSS9PLiAgRm9yIG5vcm1hbCB1c2FnZSwKIHVzZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue29wZW4oKX0sIHdoaWNoIHJldHVybnMgYSBgYGZpbGUKIG9iamVjdCcnIHdpdGggXG1ldGhvZHtyZWFkKCl9IGFuZCBcbWV0aG9ke3dyaXRlKCl9IG1ldGhvZHMgKGFuZCBtYW55Ci1tb3JlKS4KK21vcmUpLiAgVG8gd3JhcCBhIGZpbGUgZGVzY3JpcHRvciBpbiBhIGBgZmlsZSBvYmplY3QnJywgdXNlCitcZnVuY3Rpb257ZmRvcGVuKCl9LgogXGVuZHtub3RpY2V9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC0xNzMxLDYgKzE3MzYsMjcgQEAKIHJldHVybiBzdWl0YWJsZSBwcm9jZXNzIGhhbmRsZXMuCiBcZW5ke2Z1bmNkZXNjfQogCitcYmVnaW57ZnVuY2Rlc2N9e3dhaXQzfXtcb3B0aW9uYWx7b3B0aW9uc319CitTaW1pbGFyIHRvIFxmdW5jdGlvbnt3YWl0cGlkKCl9LCBleGNlcHQgbm8gcHJvY2VzcyBpZCBhcmd1bWVudCBpcyBnaXZlbiBhbmQKK2EgMy1lbGVtZW50IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNoaWxkJ3MgcHJvY2VzcyBpZCwgZXhpdCBzdGF0dXMgaW5kaWNhdGlvbiwKK2FuZCByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZC4gIFJlZmVyIHRvCitcbW9kdWxle3Jlc291cmNlfS5cZnVuY3Rpb257Z2V0cnVzYWdlKCl9Citmb3IgZGV0YWlscyBvbiByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbi4gIFRoZSBvcHRpb24gYXJndW1lbnQgaXMgdGhlIHNhbWUKK2FzIHRoYXQgcHJvdmlkZWQgdG8gXGZ1bmN0aW9ue3dhaXRwaWQoKX0gYW5kIFxmdW5jdGlvbnt3YWl0NCgpfS4KK0F2YWlsYWJpbGl0eTogXFVOSVguCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317d2FpdDR9e3BpZCwgb3B0aW9uc30KK1NpbWlsYXIgdG8gXGZ1bmN0aW9ue3dhaXRwaWQoKX0sIGV4Y2VwdCBhIDMtZWxlbWVudCB0dXBsZSwgY29udGFpbmluZyB0aGUKK2NoaWxkJ3MgcHJvY2VzcyBpZCwgZXhpdCBzdGF0dXMgaW5kaWNhdGlvbiwgYW5kIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uCitpcyByZXR1cm5lZC4gIFJlZmVyIHRvIFxtb2R1bGV7cmVzb3VyY2V9LlxmdW5jdGlvbntnZXRydXNhZ2UoKX0gZm9yIGRldGFpbHMKK29uIHJlc291cmNlIHVzYWdlIGluZm9ybWF0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byBcZnVuY3Rpb257d2FpdDQoKX0gYXJlCit0aGUgc2FtZSBhcyB0aG9zZSBwcm92aWRlZCB0byBcZnVuY3Rpb257d2FpdHBpZCgpfS4KK0F2YWlsYWJpbGl0eTogXFVOSVguCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxiZWdpbntkYXRhZGVzY317V05PSEFOR30KIFRoZSBvcHRpb24gZm9yIFxmdW5jdGlvbnt3YWl0cGlkKCl9IHRvIHJldHVybiBpbW1lZGlhdGVseSBpZiBubyBjaGlsZAogcHJvY2VzcyBzdGF0dXMgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiBUaGUgZnVuY3Rpb24gcmV0dXJucwpAQCAtMTgxOCwxNCArMTg0NCwxNCBAQAogc3RyaW5nIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGEgZGVmaW5lZCBzeXN0ZW0gdmFsdWU7IHRoZXNlIG5hbWVzIGFyZQogc3BlY2lmaWVkIGluIGEgbnVtYmVyIG9mIHN0YW5kYXJkcyAoXFBPU0lYLCBcVU5JWHt9IDk1LCBcVU5JWHt9IDk4LCBhbmQKIG90aGVycykuICBTb21lIHBsYXRmb3JtcyBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBhcyB3ZWxsLiAgVGhlIG5hbWVzCi1rbm93biB0byB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIGFyZSBnaXZlbiBpbiB0aGUKK2tub3duIHRvIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0gYXJlIGdpdmVuIGFzIHRoZSBrZXlzIG9mIHRoZQogXGNvZGV7Y29uZnN0cl9uYW1lc30gZGljdGlvbmFyeS4gIEZvciBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBub3QKIGluY2x1ZGVkIGluIHRoYXQgbWFwcGluZywgcGFzc2luZyBhbiBpbnRlZ2VyIGZvciBcdmFye25hbWV9IGlzIGFsc28KIGFjY2VwdGVkLgogQXZhaWxhYmlsaXR5OiBNYWNpbnRvc2gsIFxVTklYLgogCi1JZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBzcGVjaWZpZWQgYnkgXHZhcntuYW1lfSBpc24ndCBkZWZpbmVkLCB0aGUKLWVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KK0lmIHRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHNwZWNpZmllZCBieSBcdmFye25hbWV9IGlzbid0IGRlZmluZWQsCitcY29kZXtOb25lfSBpcyByZXR1cm5lZC4KIAogSWYgXHZhcntuYW1lfSBpcyBhIHN0cmluZyBhbmQgaXMgbm90IGtub3duLCBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlzCiByYWlzZWQuICBJZiBhIHNwZWNpZmljIHZhbHVlIGZvciBcdmFye25hbWV9IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleCBiL0RvYy9saWIvbGlib3NzYXVkaW9kZXYudGV4CmluZGV4IGVjNzllOWUuLjIyM2NmMjggMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlib3NzYXVkaW9kZXYudGV4CisrKyBiL0RvYy9saWIvbGlib3NzYXVkaW9kZXYudGV4CkBAIC0zMTEsNyArMzExLDcgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17Y2xvc2V9e30KIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGUgb3BlbiBtaXhlciBkZXZpY2UgZmlsZS4gIEFueSBmdXJ0aGVyIGF0dGVtcHRzIHRvCi11c2UgdGhlIG1peGVyIGFmdGVyIHRoaXMgZmlsZSBpcyBjbG9zZWQgd2lsbCByYWlzZSBhbiBJT0Vycm9yLgordXNlIHRoZSBtaXhlciBhZnRlciB0aGlzIGZpbGUgaXMgY2xvc2VkIHdpbGwgcmFpc2UgYW4gXGV4Y2VwdGlvbntJT0Vycm9yfS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W21peGVyIGRldmljZV17ZmlsZW5vfXt9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnBkYi50ZXggYi9Eb2MvbGliL2xpYnBkYi50ZXgKaW5kZXggNjMwMTE3NS4uYTViMzZhNiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJwZGIudGV4CisrKyBiL0RvYy9saWIvbGlicGRiLnRleApAQCAtMjQwLDYgKzI0MCw0NSBAQAogdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmIGNvbmRpdGlvbiBpcyBhYnNlbnQsIGFueSBleGlzdGluZwogY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSBicmVha3BvaW50IGlzIG1hZGUgdW5jb25kaXRpb25hbC4KIAorXGl0ZW1bY29tbWFuZHMgXG9wdGlvbmFse1x2YXJ7YnBudW1iZXJ9fV0KKworU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyIFx2YXJ7YnBudW1iZXJ9LiAgVGhlCitjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmUKK2NvbnRhaW5pbmcganVzdCAnZW5kJyB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19CisoUGRiKSBjb21tYW5kcyAxCisoY29tKSBwcmludCBzb21lX3ZhcmlhYmxlCisoY29tKSBlbmQKKyhQZGIpCitcZW5ke3ZlcmJhdGltfQorCitUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZAorZm9sbG93IGl0IGltbWVkaWF0ZWx5IHdpdGggIGVuZDsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy4KKworV2l0aCBubyBcdmFye2JwbnVtYmVyfSBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0CiticmVha3BvaW50IHNldC4KKworWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uCitTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIKK2NvbW1hbmQgdGhhdCByZXN1bWVzIGV4ZWN1dGlvbi4KKworU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSBjb250aW51ZSwKK3N0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgdGVybWluYXRlcwordGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBlbmQpLgorVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uCisoZXZlbiB3aXRoIGEgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVywrcKK2Fub3RoZXIgYnJlYWtwb2ludC0td2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bworYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgorCisgICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZQordXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQorYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCit0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQorc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KKworXHZlcnNpb25hZGRlZHsyLjV9CisKIFxpdGVtW3ModGVwKV0KIAogRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwcm9maWxlLnRleCBiL0RvYy9saWIvbGlicHJvZmlsZS50ZXgKaW5kZXggYWZjOTY5NC4uOWZmNWJhMCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJwcm9maWxlLnRleAorKysgYi9Eb2MvbGliL2xpYnByb2ZpbGUudGV4CkBAIC0xMjQsNyArMTI0LDcgQEAKICVcZW5ke2Rlc2NyaXB0aW9ufQogCiAKLVxzZWN0aW9ue0luc3RhbnQgVXNlcnMgTWFudWFsIFxsYWJlbHtwcm9maWxlLWluc3RhbnR9fQorXHNlY3Rpb257SW5zdGFudCBVc2VyJ3MgTWFudWFsIFxsYWJlbHtwcm9maWxlLWluc3RhbnR9fQogCiBUaGlzIHNlY3Rpb24gaXMgcHJvdmlkZWQgZm9yIHVzZXJzIHRoYXQgYGBkb24ndCB3YW50IHRvIHJlYWQgdGhlCiBtYW51YWwuJycgSXQgcHJvdmlkZXMgYSB2ZXJ5IGJyaWVmIG92ZXJ2aWV3LCBhbmQgYWxsb3dzIGEgdXNlciB0bwpAQCAtMzkxLDE3ICszOTEsMTcgQEAKICUgKFRoaXMgXHN0bW9kaW5kZXggdXNlIG1heSBiZSBoYXJkIHRvIGNoYW5nZSA7LSggKQogXHN0bW9kaW5kZXh7cHN0YXRzfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtTdGF0c317ZmlsZW5hbWVcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fQorXGJlZ2lue2NsYXNzZGVzY317U3RhdHN9e2ZpbGVuYW1lXG9wdGlvbmFseywgXG1vcmVhcmdzXG9wdGlvbmFseywgc3RyZWFtPXN5cy5zdGRvdXR9fX0KIFRoaXMgY2xhc3MgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGBgc3RhdGlzdGljcyBvYmplY3QnJwogZnJvbSBhIFx2YXJ7ZmlsZW5hbWV9IChvciBzZXQgb2YgZmlsZW5hbWVzKS4gIFxjbGFzc3tTdGF0c30gb2JqZWN0cyBhcmUKLW1hbmlwdWxhdGVkIGJ5IG1ldGhvZHMsIGluIG9yZGVyIHRvIHByaW50IHVzZWZ1bCByZXBvcnRzLgorbWFuaXB1bGF0ZWQgYnkgbWV0aG9kcywgaW4gb3JkZXIgdG8gcHJpbnQgdXNlZnVsIHJlcG9ydHMuICBZb3UgbWF5IHNwZWNpZnkKK2FuIGFsdGVybmF0ZSBvdXRwdXQgc3RyZWFtIGJ5IGdpdmluZyB0aGUga2V5d29yZCBhcmd1bWVudCwgXGNvZGV7c3RyZWFtfS4KIAotVGhlIGZpbGUgc2VsZWN0ZWQgYnkgdGhlIGFib3ZlIGNvbnN0cnVjdG9yIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkKLXRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gb2YgXG1vZHVsZXtwcm9maWxlfSBvciBcbW9kdWxle2NQcm9maWxlfS4KLVRvIGJlIHNwZWNpZmljLCB0aGVyZSBpcwotXGVtcGh7bm99IGZpbGUgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVkIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMKLXByb2ZpbGVyLCBhbmQgdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eSB3aXRoIGZpbGVzIHByb2R1Y2VkIGJ5IG90aGVyCi1wcm9maWxlcnMuCitUaGUgZmlsZSBzZWxlY3RlZCBieSB0aGUgYWJvdmUgY29uc3RydWN0b3IgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUKK2NvcnJlc3BvbmRpbmcgdmVyc2lvbiBvZiBcbW9kdWxle3Byb2ZpbGV9IG9yIFxtb2R1bGV7Y1Byb2ZpbGV9LiAgVG8gYmUKK3NwZWNpZmljLCB0aGVyZSBpcyBcZW1waHtub30gZmlsZSBjb21wYXRpYmlsaXR5IGd1YXJhbnRlZWQgd2l0aCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoaXMgcHJvZmlsZXIsIGFuZCB0aGVyZSBpcyBubyBjb21wYXRpYmlsaXR5IHdpdGggZmlsZXMgcHJvZHVjZWQKK2J5IG90aGVyIHByb2ZpbGVycy4KICUoc3VjaCBhcyB0aGUgb2xkIHN5c3RlbSBwcm9maWxlcikuCiAKIElmIHNldmVyYWwgZmlsZXMgYXJlIHByb3ZpZGVkLCBhbGwgdGhlIHN0YXRpc3RpY3MgZm9yIGlkZW50aWNhbApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJweWNvbXBpbGUudGV4IGIvRG9jL2xpYi9saWJweWNvbXBpbGUudGV4CmluZGV4IDA0NTgxOTEuLjg1ZjBhYWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlicHljb21waWxlLnRleAorKysgYi9Eb2MvbGliL2xpYnB5Y29tcGlsZS50ZXgKQEAgLTMwLDkgKzMwLDEwIEBACiAgIFxjb2Rleyt9IFxjb2RleydjJ30gKFxjb2RleydvJ30gaWYgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQgaW4gdGhlCiAgIGN1cnJlbnQgaW50ZXJwcmV0ZXIpLiAgSWYgXHZhcntkZmlsZX0gaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzCiAgIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBpbiBlcnJvciBtZXNzYWdlcyBpbnN0ZWFkIG9mIFx2YXJ7ZmlsZX0uIAotICBJZiBcdmFye2RvcmFpc2V9ID0gVHJ1ZSwgYSBQeUNvbXBpbGVFcnJvciBpcyByYWlzZWQgd2hlbiBhbiBlcnJvciBpcyAKLSAgZW5jb3VudGVyZWQgd2hpbGUgY29tcGlsaW5nIFx2YXJ7ZmlsZX0uIElmIFx2YXJ7ZG9yYWlzZX0gPSBGYWxzZSAodGhlIGRlZmF1bHQpLCAKLSAgYW4gZXJyb3Igc3RyaW5nIGlzIHdyaXR0ZW4gdG8gc3lzLnN0ZGVyciwgYnV0IG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisgIElmIFx2YXJ7ZG9yYWlzZX0gaXMgdHJ1ZSwgYSBcZXhjZXB0aW9ue1B5Q29tcGlsZUVycm9yfSBpcyByYWlzZWQgd2hlbgorICBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZSBjb21waWxpbmcgXHZhcntmaWxlfS4gSWYgXHZhcntkb3JhaXNlfQorICBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCBhbiBlcnJvciBzdHJpbmcgaXMgd3JpdHRlbiB0byBcY29kZXtzeXMuc3RkZXJyfSwKKyAgYnV0IG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e21haW59e1xvcHRpb25hbHthcmdzfX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicXVldWUudGV4IGIvRG9jL2xpYi9saWJxdWV1ZS50ZXgKaW5kZXggZjFkODkyYS4uOTVhZDQ3ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJxdWV1ZS50ZXgKKysrIGIvRG9jL2xpYi9saWJxdWV1ZS50ZXgKQEAgLTEsMyArMSw0IEBACisKIFxzZWN0aW9ue1xtb2R1bGV7UXVldWV9IC0tLQogICAgICAgICAgQSBzeW5jaHJvbml6ZWQgcXVldWUgY2xhc3N9CiAKQEAgLTk0LDMgKzk1LDUxIEBACiBcYmVnaW57bWV0aG9kZGVzY317Z2V0X25vd2FpdH17fQogRXF1aXZhbGVudCB0byBcY29kZXtnZXQoRmFsc2UpfS4KIFxlbmR7bWV0aG9kZGVzY30KKworVHdvIG1ldGhvZHMgYXJlIG9mZmVyZWQgdG8gc3VwcG9ydCB0cmFja2luZyB3aGV0aGVyIGVucXVldWVkIHRhc2tzIGhhdmUKK2JlZW4gZnVsbHkgcHJvY2Vzc2VkIGJ5IGRhZW1vbiBjb25zdW1lciB0aHJlYWRzLgorCitcYmVnaW57bWV0aG9kZGVzY317dGFza19kb25lfXt9CitJbmRpY2F0ZSB0aGF0IGEgZm9ybWVybHkgZW5xdWV1ZWQgdGFzayBpcyBjb21wbGV0ZS4gIFVzZWQgYnkgcXVldWUgY29uc3VtZXIKK3RocmVhZHMuICBGb3IgZWFjaCBcbWV0aG9ke2dldCgpfSB1c2VkIHRvIGZldGNoIGEgdGFzaywgYSBzdWJzZXF1ZW50IGNhbGwgdG8KK1xtZXRob2R7dGFza19kb25lKCl9IHRlbGxzIHRoZSBxdWV1ZSB0aGF0IHRoZSBwcm9jZXNzaW5nIG9uIHRoZSB0YXNrIGlzIGNvbXBsZXRlLgorCitJZiBhIFxtZXRob2R7am9pbigpfSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zCitoYXZlIGJlZW4gcHJvY2Vzc2VkIChtZWFuaW5nIHRoYXQgYSBcbWV0aG9ke3Rhc2tfZG9uZSgpfSBjYWxsIHdhcyByZWNlaXZlZAorZm9yIGV2ZXJ5IGl0ZW0gdGhhdCBoYWQgYmVlbiBcbWV0aG9ke3B1dCgpfSBpbnRvIHRoZSBxdWV1ZSkuCisKK1JhaXNlcyBhIFxleGNlcHRpb257VmFsdWVFcnJvcn0gaWYgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiB0aGVyZSB3ZXJlIGl0ZW1zCitwbGFjZWQgaW4gdGhlIHF1ZXVlLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtqb2lufXt9CitCbG9ja3MgdW50aWwgYWxsIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGJlZW4gZ290dGVuIGFuZCBwcm9jZXNzZWQuCisKK1RoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGdvZXMgdXAgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUKK3F1ZXVlLiBUaGUgY291bnQgZ29lcyBkb3duIHdoZW5ldmVyIGEgY29uc3VtZXIgdGhyZWFkIGNhbGxzIFxtZXRob2R7dGFza19kb25lKCl9Cit0byBpbmRpY2F0ZSB0aGF0IHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uIGl0IGlzIGNvbXBsZXRlLgorV2hlbiB0aGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBkcm9wcyB0byB6ZXJvLCBqb2luKCkgdW5ibG9ja3MuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKworRXhhbXBsZSBvZiBob3cgdG8gd2FpdCBmb3IgZW5xdWV1ZWQgdGFza3MgdG8gYmUgY29tcGxldGVkOgorCitcYmVnaW57dmVyYmF0aW19CisgICAgZGVmIHdvcmtlcigpOiAKKyAgICAgICAgd2hpbGUgVHJ1ZTogCisgICAgICAgICAgICBpdGVtID0gcS5nZXQoKSAKKyAgICAgICAgICAgIGRvX3dvcmsoaXRlbSkgCisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpIAorCisgICAgcSA9IFF1ZXVlKCkgCisgICAgZm9yIGkgaW4gcmFuZ2UobnVtX3dvcmtlcl90aHJlYWRzKTogCisgICAgICAgICB0ID0gVGhyZWFkKHRhcmdldD13b3JrZXIpCisgICAgICAgICB0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgdC5zdGFydCgpIAorCisgICAgZm9yIGl0ZW0gaW4gc291cmNlKCk6CisgICAgICAgIHEucHV0KGl0ZW0pIAorCisgICAgcS5qb2luKCkgICAgICAgIyBibG9jayB1bnRpbCBhbGwgdGFza3MgYXJlIGRvbmUKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlLnRleCBiL0RvYy9saWIvbGlicmUudGV4CmluZGV4IDhlNjUxM2EuLjE0MDRlMDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlicmUudGV4CisrKyBiL0RvYy9saWIvbGlicmUudGV4CkBAIC01NjYsOSArNTY2LDYgQEAKID4+PiByZS5zcGxpdCgnXFcrJywgJ1dvcmRzLCB3b3Jkcywgd29yZHMuJywgMSkKIFsnV29yZHMnLCAnd29yZHMsIHdvcmRzLiddCiBcZW5ke3ZlcmJhdGltfQotCi0gIFRoaXMgZnVuY3Rpb24gY29tYmluZXMgYW5kIGV4dGVuZHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YKLSAgdGhlIG9sZCBcZnVuY3Rpb257cmVnc3ViLnNwbGl0KCl9IGFuZCBcZnVuY3Rpb257cmVnc3ViLnNwbGl0eCgpfS4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317ZmluZGFsbH17cGF0dGVybiwgc3RyaW5nXG9wdGlvbmFseywgZmxhZ3N9fQpAQCAtOTM0LDcgKzkzMSw3IEBACiBcbGVmdGxpbmV7XHN0cm9uZ3tBdm9pZGluZyByZWN1cnNpb259fQogCiBJZiB5b3UgY3JlYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCByZXF1aXJlIHRoZSBlbmdpbmUgdG8gcGVyZm9ybSBhCi1sb3Qgb2YgcmVjdXJzaW9uLCB5b3UgbWF5IGVuY291bnRlciBhIFJ1bnRpbWVFcnJvciBleGNlcHRpb24gd2l0aAorbG90IG9mIHJlY3Vyc2lvbiwgeW91IG1heSBlbmNvdW50ZXIgYSBcZXhjZXB0aW9ue1J1bnRpbWVFcnJvcn0gZXhjZXB0aW9uIHdpdGgKIHRoZSBtZXNzYWdlIFxjb2Rle21heGltdW0gcmVjdXJzaW9uIGxpbWl0fSBleGNlZWRlZC4gRm9yIGV4YW1wbGUsCiAKIFxiZWdpbnt2ZXJiYXRpbX0KQEAgLTk0Myw3ICs5NDAsNyBAQAogPj4+IHJlLm1hdGNoKCdCZWdpbiAoXHd8ICkqPyBlbmQnLCBzKS5lbmQoKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci0gIEZpbGUgIi91c3IvbG9jYWwvbGliL3B5dGhvbjIuMy9zcmUucHkiLCBsaW5lIDEzMiwgaW4gbWF0Y2gKKyAgRmlsZSAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMi41L3JlLnB5IiwgbGluZSAxMzIsIGluIG1hdGNoCiAgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5tYXRjaChzdHJpbmcpCiBSdW50aW1lRXJyb3I6IG1heGltdW0gcmVjdXJzaW9uIGxpbWl0IGV4Y2VlZGVkCiBcZW5ke3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJyZWNvbnZlcnQudGV4IGIvRG9jL2xpYi9saWJyZWNvbnZlcnQudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM2ZTUyLi4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGlicmVjb252ZXJ0LnRleAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLVxzZWN0aW9ue1xtb2R1bGV7cmVjb252ZXJ0fSAtLS0KLSAgICAgICAgIENvbnZlcnQgcmVndWxhciBleHByZXNzaW9ucyBmcm9tIHJlZ2V4IHRvIHJlIGZvcm19Ci1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cmVjb252ZXJ0fQotXG1vZHVsZWF1dGhvcntBbmRyZXcgTS4gS3VjaGxpbmd9e2Fta0BhbWsuY2F9Ci1cc2VjdGlvbmF1dGhvcntTa2lwIE1vbnRhbmFyb317c2tpcEBwb2JveC5jb219Ci0KLQotXG1vZHVsZXN5bm9wc2lze0NvbnZlcnQgcmVnZXgtLCBlbWFjcy0gb3Igc2VkLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLXRvIHJlLXN0eWxlIHN5bnRheC59Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmYWNpbGl0eSB0byBjb252ZXJ0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSB0aGUKLXN5bnRheCB1c2VkIGJ5IHRoZSBkZXByZWNhdGVkIFxtb2R1bGV7cmVnZXh9IG1vZHVsZSB0byB0aG9zZSB1c2VkIGJ5IHRoZQotbmV3ZXIgXG1vZHVsZXtyZX0gbW9kdWxlLiAgQmVjYXVzZSBvZiBzaW1pbGFyaXR5IGJldHdlZW4gdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gc3ludGF4IG9mIFxjb2Rle3NlZCgxKX0gYW5kIFxjb2Rle2VtYWNzKDEpfSBhbmQgdGhlCi1cbW9kdWxle3JlZ2V4fSBtb2R1bGUsIGl0IGlzIGFsc28gaGVscGZ1bCB0byBjb252ZXJ0IHBhdHRlcm5zIHdyaXR0ZW4gZm9yCi10aG9zZSB0b29scyB0byBcbW9kdWxle3JlfSBwYXR0ZXJucy4KLQotV2hlbiB1c2VkIGFzIGEgc2NyaXB0LCBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCAob3IgYW55IG90aGVyIGV4cHJlc3Npb24KLWV2YWx1YXRpbmcgdG8gYSBzdHJpbmcpIGlzIHJlYWQgZnJvbSBzdGRpbiwgYW5kIHRoZSB0cmFuc2xhdGVkIGV4cHJlc3Npb24gaXMKLXdyaXR0ZW4gdG8gc3Rkb3V0IGFzIGEgc3RyaW5nIGxpdGVyYWwuICBVbmxlc3Mgc3Rkb3V0IGlzIGEgdHR5LCBubyB0cmFpbGluZwotbmV3bGluZSBpcyB3cml0dGVuIHRvIHN0ZG91dC4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHdpdGgKLUVtYWNzIFxjb2Rle0MtVSBNLXx9IChzaGVsbC1jb21tYW5kLW9uLXJlZ2lvbikgd2hpY2ggZmlsdGVycyB0aGUgcmVnaW9uCi10aHJvdWdoIHRoZSBzaGVsbCBjb21tYW5kLgotCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxle01hc3RlcmluZyBSZWd1bGFyIEV4cHJlc3Npb25zfXtCb29rIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLSAgICAgICAgICAgIGJ5IEplZmZyZXkgRnJpZWRsLCBwdWJsaXNoZWQgYnkgTydSZWlsbHkuICBUaGUgc2Vjb25kIAotICAgICAgICAgICAgZWRpdGlvbiBvZiB0aGUgYm9vayBubyBsb25nZXIgY292ZXJzIFB5dGhvbiBhdCBhbGwsIAotICAgICAgICAgICAgYnV0IHRoZSBmaXJzdCBlZGl0aW9uIGNvdmVyZWQgd3JpdGluZyBnb29kIHJlZ3VsYXIgZXhwcmVzc2lvbgotICAgICAgICAgICAgcGF0dGVybnMgaW4gZ3JlYXQgZGV0YWlsLn0KLVxlbmR7c2VlYWxzb30KLQotXHN1YnNlY3Rpb257TW9kdWxlIENvbnRlbnRzfQotXG5vZGVuYW1le0NvbnRlbnRzIG9mIE1vZHVsZSByZWNvbnZlcnR9Ci0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0d28gZnVuY3Rpb25zIGFuZCBhIGhhbmRmdWwgb2YgY29uc3RhbnRzLgotCi1cYmVnaW57ZnVuY2Rlc2N9e2NvbnZlcnR9e3BhdHRlcm5cb3B0aW9uYWx7LCBzeW50YXg9Tm9uZX19Ci0gQ29udmVydCBhIFx2YXJ7cGF0dGVybn0gcmVwcmVzZW50aW5nIGEgXG1vZHVsZXtyZWdleH0tc3R5cGUgcmVndWxhcgotIGV4cHJlc3Npb24gaW50byBhIFxtb2R1bGV7cmV9LXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIFRoZSBvcHRpb25hbAotIFx2YXJ7c3ludGF4fSBwYXJhbWV0ZXIgaXMgYSBiaXR3aXNlLW9yJ2Qgc2V0IG9mIGZsYWdzIHRoYXQgY29udHJvbCB3aGF0Ci0gY29uc3RydWN0cyBhcmUgY29udmVydGVkLiAgU2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzCi0gY29uc3RhbnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtxdW90ZX17c1xvcHRpb25hbHssIHF1b3RlPU5vbmV9fQotIENvbnZlcnQgYSBzdHJpbmcgb2JqZWN0IHRvIGEgcXVvdGVkIHN0cmluZyBsaXRlcmFsLgotCi0gVGhpcyBpcyBzaW1pbGFyIHRvIFxmdW5jdGlvbntyZXByfSBidXQgd2lsbCByZXR1cm4gYSAicmF3IiBzdHJpbmcgKHInLi4uJwotIG9yIHIiLi4uIikgd2hlbiB0aGUgc3RyaW5nIGNvbnRhaW5zIGJhY2tzbGFzaGVzLCBpbnN0ZWFkIG9mIGRvdWJsaW5nIGFsbAotIGJhY2tzbGFzaGVzLiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgZG9lcyBub3QgYWx3YXlzIGV2YWx1YXRlIHRvIHRoZSBzYW1lCi0gc3RyaW5nIGFzIHRoZSBvcmlnaW5hbDsgaG93ZXZlciBpdCB3aWxsIGRvIGp1c3QgdGhlIHJpZ2h0IHRoaW5nIHdoZW4gcGFzc2VkCi0gaW50byByZS5jb21waWxlKCkuCi0KLSBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGZvcmNlcyB0aGUgc3RyaW5nIHF1b3RlOyBpdCBtdXN0IGJlIGEgc2luZ2xlCi0gY2hhcmFjdGVyIHdoaWNoIGlzIGEgdmFsaWQgUHl0aG9uIHN0cmluZyBxdW90ZS4gIE5vdGUgdGhhdCBwcmlvciB0byBQeXRob24KLSAyLjUgdGhpcyB3b3VsZCBub3QgYWNjZXB0IHRyaXBsZS1xdW90ZWQgc3RyaW5nIGRlbGltaXRlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JFX05PX0JLX1BBUkVOU30KLSBTdXBwcmVzcyBwYXJlbiBjb252ZXJzaW9uLiAgVGhpcyBzaG91bGQgYmUgb21pdHRlZCB3aGVuIGNvbnZlcnRpbmcKLSBcY29kZXtzZWR9LXN0eWxlIG9yIFxjb2Rle2VtYWNzfS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSRV9OT19CS19WQkFSfQotIFN1cHByZXNzIHZlcnRpY2FsIGJhciBjb252ZXJzaW9uLiAgVGhpcyBzaG91bGQgYmUgb21pdHRlZCB3aGVuIGNvbnZlcnRpbmcKLSBcY29kZXtzZWR9LXN0eWxlIG9yIFxjb2Rle2VtYWNzfS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSRV9CS19QTFVTX1FNfQotIEVuYWJsZSBjb252ZXJzaW9uIG9mIFxjb2Rleyt9IGFuZCBcY29kZXs/fSBjaGFyYWN0ZXJzLiAgVGhpcyBzaG91bGQgYmUKLSBhZGRlZCB0byB0aGUgXHZhcntzeW50YXh9IGFyZyBvZiBcZnVuY3Rpb257Y29udmVydH0gd2hlbiBjb252ZXJ0aW5nCi0gXGNvZGV7c2VkfS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zIGFuZCBvbWl0dGVkIHdoZW4gY29udmVydGluZwotIFxjb2Rle2VtYWNzfS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtSRV9ORVdMSU5FX09SfQotIFdoZW4gc2V0LCBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IFxjb2Rle3x9LgotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmVnZXgudGV4IGIvRG9jL2xpYi9saWJyZWdleC50ZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODJmODEuLjAwMDAwMDAKLS0tIGEvRG9jL2xpYi9saWJyZWdleC50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtyZWdleH0gLS0tCi0gICAgICAgICBSZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0aW9uc30KLVxkZWNsYXJlbW9kdWxle2J1aWx0aW59e3JlZ2V4fQotCi1cbW9kdWxlc3lub3BzaXN7UmVndWxhciBleHByZXNzaW9uIHNlYXJjaCBhbmQgbWF0Y2ggb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICBcc3Ryb25ne09ic29sZXRlIX19Ci0KLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG9wZXJhdGlvbnMgc2ltaWxhciB0bwotdGhvc2UgZm91bmQgaW4gRW1hY3MuCi0KLVxzdHJvbmd7T2Jzb2xlc2NlbmNlIG5vdGU6fQotVGhpcyBtb2R1bGUgaXMgb2Jzb2xldGUgYXMgb2YgUHl0aG9uIHZlcnNpb24gMS41OyBpdCBpcyBzdGlsbCBiZWluZwotbWFpbnRhaW5lZCBiZWNhdXNlIG11Y2ggZXhpc3RpbmcgY29kZSBzdGlsbCB1c2VzIGl0LiAgQWxsIG5ldyBjb2RlIGluCi1uZWVkIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc2hvdWxkIHVzZSB0aGUgbmV3Ci1cY29kZXtyZX1ccmVmc3Rtb2RpbmRleHtyZX0gbW9kdWxlLCB3aGljaCBzdXBwb3J0cyB0aGUgbW9yZSBwb3dlcmZ1bAotYW5kIHJlZ3VsYXIgUGVybC1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgRXhpc3RpbmcgY29kZSBzaG91bGQgYmUKLWNvbnZlcnRlZC4gIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZQotXGNvZGV7cmVjb252ZXJ0fVxyZWZzdG1vZGluZGV4e3JlY29udmVydH0gaGVscHMgaW4gY29udmVydGluZwotXGNvZGV7cmVnZXh9IHN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gXGNvZGV7cmV9XHJlZnN0bW9kaW5kZXh7cmV9Ci1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgKEZvciBtb3JlIGNvbnZlcnNpb24gaGVscCwgc2VlIEFuZHJldwotS3VjaGxpbmcnc1xpbmRleHtLdWNobGluZywgQW5kcmV3fSBgYFxtb2R1bGV7cmVnZXgtdG8tcmV9IEhPV1RPJycgYXQKLVx1cmx7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0by9yZWdleC10by1yZS99LikKLQotQnkgZGVmYXVsdCB0aGUgcGF0dGVybnMgYXJlIEVtYWNzLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLSh3aXRoIG9uZSBleGNlcHRpb24pLiAgVGhlcmUgaXMKLWEgd2F5IHRvIGNoYW5nZSB0aGUgc3ludGF4IHRvIG1hdGNoIHRoYXQgb2Ygc2V2ZXJhbCB3ZWxsLWtub3duCi1cVU5JWHt9IHV0aWxpdGllcy4gIFRoZSBleGNlcHRpb24gaXMgdGhhdCBFbWFjcycgXHNhbXB7XGUgc30KLXBhdHRlcm4gaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIHJlZmVyZW5jZXMKLXRoZSBFbWFjcyBzeW50YXggdGFibGVzLgotCi1UaGlzIG1vZHVsZSBpcyA4LWJpdCBjbGVhbjogYm90aCBwYXR0ZXJucyBhbmQgc3RyaW5ncyBtYXkgY29udGFpbiBudWxsCi1ieXRlcyBhbmQgY2hhcmFjdGVycyB3aG9zZSBoaWdoIGJpdCBpcyBzZXQuCi0KLVxzdHJvbmd7UGxlYXNlIG5vdGU6fSBUaGVyZSBpcyBhIGxpdHRsZS1rbm93biBmYWN0IGFib3V0IFB5dGhvbiBzdHJpbmcKLWxpdGVyYWxzIHdoaWNoIG1lYW5zIHRoYXQgeW91IGRvbid0IHVzdWFsbHkgaGF2ZSB0byB3b3JyeSBhYm91dAotZG91YmxpbmcgYmFja3NsYXNoZXMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHVzZWQgdG8gZXNjYXBlIHNwZWNpYWwKLWNoYXJhY3RlcnMgaW4gc3RyaW5nIGxpdGVyYWxzIGFzIHdlbGwgYXMgaW4gcmVndWxhciBleHByZXNzaW9ucy4gIFRoaXMKLWlzIGJlY2F1c2UgUHl0aG9uIGRvZXNuJ3QgcmVtb3ZlIGJhY2tzbGFzaGVzIGZyb20gc3RyaW5nIGxpdGVyYWxzIGlmCi10aGV5IGFyZSBmb2xsb3dlZCBieSBhbiB1bnJlY29nbml6ZWQgZXNjYXBlIGNoYXJhY3Rlci4KLVxlbXBoe0hvd2V2ZXJ9LCBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgbGl0ZXJhbCBcZGZue2JhY2tzbGFzaH0gaW4gYQotcmVndWxhciBleHByZXNzaW9uIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIGxpdGVyYWwsIHlvdSBoYXZlIHRvCi1cZW1waHtxdWFkcnVwbGV9IGl0IG9yIGVuY2xvc2UgaXQgaW4gYSBzaW5nbGV0b24gY2hhcmFjdGVyIGNsYXNzLgotRS5nLlwgIHRvIGV4dHJhY3QgXExhVGVYXCBcc2FtcHtcZSBzZWN0aW9uXHtcdGV4dHJte1xsZG90c31cfX0gaGVhZGVycwotZnJvbSBhIGRvY3VtZW50LCB5b3UgY2FuIHVzZSB0aGlzIHBhdHRlcm46Ci1cY29kZXsnW1xlIF1zZWN0aW9uXHtcZSAoLipcZSApXH0nfS4gIFxlbXBoe0Fub3RoZXIgZXhjZXB0aW9uOn0KLXRoZSBlc2NhcGUgc2VxdWVuY2UgXHNhbXB7XGUgYn0gaXMgc2lnbmlmaWNhbnQgaW4gc3RyaW5nIGxpdGVyYWxzCi0od2hlcmUgaXQgbWVhbnMgdGhlIEFTQ0lJIGJlbGwgY2hhcmFjdGVyKSBhcyB3ZWxsIGFzIGluIEVtYWNzIHJlZ3VsYXIKLWV4cHJlc3Npb25zICh3aGVyZSBpdCBzdGFuZHMgZm9yIGEgd29yZCBib3VuZGFyeSksIHNvIGluIG9yZGVyIHRvCi1zZWFyY2ggZm9yIGEgd29yZCBib3VuZGFyeSwgeW91IHNob3VsZCB1c2UgdGhlIHBhdHRlcm4gXGNvZGV7J1xlIFxlIGInfS4KLVNpbWlsYXJseSwgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBkaWdpdCAwLTcgc2hvdWxkIGJlIGRvdWJsZWQgdG8KLWF2b2lkIGludGVycHJldGF0aW9uIGFzIGFuIG9jdGFsIGVzY2FwZS4KLQotXHN1YnNlY3Rpb257UmVndWxhciBFeHByZXNzaW9uc30KLQotQSByZWd1bGFyIGV4cHJlc3Npb24gKG9yIFJFKSBzcGVjaWZpZXMgYSBzZXQgb2Ygc3RyaW5ncyB0aGF0IG1hdGNoZXMKLWl0OyB0aGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGxldCB5b3UgY2hlY2sgaWYgYSBwYXJ0aWN1bGFyIHN0cmluZwotbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiAob3IgaWYgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24KLW1hdGNoZXMgYSBwYXJ0aWN1bGFyIHN0cmluZywgd2hpY2ggY29tZXMgZG93biB0byB0aGUgc2FtZSB0aGluZykuCi0KLVJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuIGJlIGNvbmNhdGVuYXRlZCB0byBmb3JtIG5ldyByZWd1bGFyCi1leHByZXNzaW9uczsgaWYgXGVtcGh7QX0gYW5kIFxlbXBoe0J9IGFyZSBib3RoIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCi10aGVuIFxlbXBoe0FCfSBpcyBhbHNvIGFuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIElmIGEgc3RyaW5nIFxlbXBoe3B9Ci1tYXRjaGVzIEEgYW5kIGFub3RoZXIgc3RyaW5nIFxlbXBoe3F9IG1hdGNoZXMgQiwgdGhlIHN0cmluZyBcZW1waHtwcX0KLXdpbGwgbWF0Y2ggQUIuICBUaHVzLCBjb21wbGV4IGV4cHJlc3Npb25zIGNhbiBlYXNpbHkgYmUgY29uc3RydWN0ZWQKLWZyb20gc2ltcGxlciBvbmVzIGxpa2UgdGhlIHByaW1pdGl2ZXMgZGVzY3JpYmVkIGhlcmUuICBGb3IgZGV0YWlscyBvZgotdGhlIHRoZW9yeSBhbmQgaW1wbGVtZW50YXRpb24gb2YgcmVndWxhciBleHByZXNzaW9ucywgY29uc3VsdCBhbG1vc3QKLWFueSB0ZXh0Ym9vayBhYm91dCBjb21waWxlciBjb25zdHJ1Y3Rpb24uCi0KLSUgWFhYIFRoZSByZWZlcmVuY2UgY291bGQgYmUgbWFkZSBtb3JlIHNwZWNpZmljLCBzYXkgdG8gCi0lICJDb21waWxlcnM6IFByaW5jaXBsZXMsIFRlY2huaXF1ZXMgYW5kIFRvb2xzIiwgYnkgQWxmcmVkIFYuIEFobywgCi0lIFJhdmkgU2V0aGksIGFuZCBKZWZmcmV5IEQuIFVsbG1hbiwgb3Igc29tZSBGQSB0ZXh0LiAgIAotCi1BIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHRoZSBmb3JtYXQgb2YgcmVndWxhciBleHByZXNzaW9ucyBmb2xsb3dzLgotCi1SZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBjb250YWluIGJvdGggc3BlY2lhbCBhbmQgb3JkaW5hcnkgY2hhcmFjdGVycy4KLU9yZGluYXJ5IGNoYXJhY3RlcnMsIGxpa2UgJ1xjb2Rle0F9JywgJ1xjb2Rle2F9Jywgb3IgJ1xjb2RlezB9JywgYXJlCi10aGUgc2ltcGxlc3QgcmVndWxhciBleHByZXNzaW9uczsgdGhleSBzaW1wbHkgbWF0Y2ggdGhlbXNlbHZlcy4gIFlvdQotY2FuIGNvbmNhdGVuYXRlIG9yZGluYXJ5IGNoYXJhY3RlcnMsIHNvICdcY29kZXtsYXN0fScgbWF0Y2hlcyB0aGUKLWNoYXJhY3RlcnMgJ2xhc3QnLiAgKEluIHRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgd2UnbGwgd3JpdGUgUkUncyBpbgotXGNvZGV7dGhpcyBzcGVjaWFsIGZvbnR9LCB1c3VhbGx5IHdpdGhvdXQgcXVvdGVzLCBhbmQgc3RyaW5ncyB0byBiZQotbWF0Y2hlZCAnaW4gc2luZ2xlIHF1b3RlcycuKQotCi1TcGVjaWFsIGNoYXJhY3RlcnMgZWl0aGVyIHN0YW5kIGZvciBjbGFzc2VzIG9mIG9yZGluYXJ5IGNoYXJhY3RlcnMsIG9yCi1hZmZlY3QgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGFyb3VuZCB0aGVtIGFyZSBpbnRlcnByZXRlZC4KLQotVGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmU6Ci1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtW1xjb2Rley59XSAoRG90LikgIE1hdGNoZXMgYW55IGNoYXJhY3RlciBleGNlcHQgYSBuZXdsaW5lLgotXGl0ZW1bXGNvZGV7XF59XSAoQ2FyZXQuKSAgTWF0Y2hlcyB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4KLVxpdGVtW1xjb2Rle1wkfV0gTWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICAKLVxjb2Rle2Zvb30gbWF0Y2hlcyBib3RoICdmb28nIGFuZCAnZm9vYmFyJywgd2hpbGUgdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gJ1xjb2Rle2Zvb1wkfScgbWF0Y2hlcyBvbmx5ICdmb28nLgotXGl0ZW1bXGNvZGV7Kn1dIENhdXNlcyB0aGUgcmVzdWx0aW5nIFJFIHRvCi1tYXRjaCAwIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgdGhlIHByZWNlZGluZyBSRS4gIFxjb2Rle2FiKn0gd2lsbAotbWF0Y2ggJ2EnLCAnYWInLCBvciAnYScgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiAnYidzLgotXGl0ZW1bXGNvZGV7K31dIENhdXNlcyB0aGUKLXJlc3VsdGluZyBSRSB0byBtYXRjaCAxIG9yIG1vcmUgcmVwZXRpdGlvbnMgb2YgdGhlIHByZWNlZGluZyBSRS4KLVxjb2Rle2FiK30gd2lsbCBtYXRjaCAnYScgZm9sbG93ZWQgYnkgYW55IG5vbi16ZXJvIG51bWJlciBvZiAnYidzOyBpdAotd2lsbCBub3QgbWF0Y2gganVzdCAnYScuCi1caXRlbVtcY29kZXs/fV0gQ2F1c2VzIHRoZSByZXN1bHRpbmcgUkUgdG8KLW1hdGNoIDAgb3IgMSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLiAgXGNvZGV7YWI/fSB3aWxsCi1tYXRjaCBlaXRoZXIgJ2EnIG9yICdhYicuCi0KLVxpdGVtW1xjb2Rle1xlfV0gRWl0aGVyIGVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIChwZXJtaXR0aW5nIHlvdSB0byBtYXRjaAotY2hhcmFjdGVycyBsaWtlICcqPytcJlwkJyksIG9yIHNpZ25hbHMgYSBzcGVjaWFsIHNlcXVlbmNlOyBzcGVjaWFsCi1zZXF1ZW5jZXMgYXJlIGRpc2N1c3NlZCBiZWxvdy4gIFJlbWVtYmVyIHRoYXQgUHl0aG9uIGFsc28gdXNlcyB0aGUKLWJhY2tzbGFzaCBhcyBhbiBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIGxpdGVyYWxzOyBpZiB0aGUgZXNjYXBlCi1zZXF1ZW5jZSBpc24ndCByZWNvZ25pemVkIGJ5IFB5dGhvbidzIHBhcnNlciwgdGhlIGJhY2tzbGFzaCBhbmQKLXN1YnNlcXVlbnQgY2hhcmFjdGVyIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHN0cmluZy4gIEhvd2V2ZXIsCi1pZiBQeXRob24gd291bGQgcmVjb2duaXplIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UsIHRoZSBiYWNrc2xhc2ggc2hvdWxkCi1iZSByZXBlYXRlZCB0d2ljZS4gIAotCi1caXRlbVtcY29kZXtbXX1dIFVzZWQgdG8gaW5kaWNhdGUgYSBzZXQgb2YgY2hhcmFjdGVycy4gIENoYXJhY3RlcnMgY2FuCi1iZSBsaXN0ZWQgaW5kaXZpZHVhbGx5LCBvciBhIHJhbmdlIGlzIGluZGljYXRlZCBieSBnaXZpbmcgdHdvCi1jaGFyYWN0ZXJzIGFuZCBzZXBhcmF0aW5nIHRoZW0gYnkgYSAnLScuICBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlCi1ub3QgYWN0aXZlIGluc2lkZSBzZXRzLiAgRm9yIGV4YW1wbGUsIFxjb2Rle1tha21cJF19Ci13aWxsIG1hdGNoIGFueSBvZiB0aGUgY2hhcmFjdGVycyAnYScsICdrJywgJ20nLCBvciAnXCQnOyBcY29kZXtbYS16XX0gd2lsbAotbWF0Y2ggYW55IGxvd2VyY2FzZSBsZXR0ZXIuICAKLQotSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIFxjb2Rle119IGluc2lkZSBhCi1zZXQsIGl0IG11c3QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2V0OyB0byBpbmNsdWRlIGEgXGNvZGV7LX0sCi1wbGFjZSBpdCBhcyB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIuIAotCi1DaGFyYWN0ZXJzIFxlbXBoe25vdH0gd2l0aGluIGEgcmFuZ2UgY2FuIGJlIG1hdGNoZWQgYnkgaW5jbHVkaW5nIGEKLVxjb2Rle1xefSBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXQ7IFxjb2Rle1xefSBlbHNld2hlcmUgd2lsbAotc2ltcGx5IG1hdGNoIHRoZSAnXGNvZGV7XF59JyBjaGFyYWN0ZXIuICAKLVxlbmR7aXRlbWl6ZX0KLQotVGhlIHNwZWNpYWwgc2VxdWVuY2VzIGNvbnNpc3Qgb2YgJ1xjb2Rle1xlfScgYW5kIGEgY2hhcmFjdGVyCi1mcm9tIHRoZSBsaXN0IGJlbG93LiAgSWYgdGhlIG9yZGluYXJ5IGNoYXJhY3RlciBpcyBub3Qgb24gdGhlIGxpc3QsCi10aGVuIHRoZSByZXN1bHRpbmcgUkUgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLAotXGNvZGV7XGVcJH0gbWF0Y2hlcyB0aGUgY2hhcmFjdGVyICdcJCcuICBPbmVzIHdoZXJlIHRoZSBiYWNrc2xhc2gKLXNob3VsZCBiZSBkb3VibGVkIGluIHN0cmluZyBsaXRlcmFscyBhcmUgaW5kaWNhdGVkLgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtW1xjb2Rle1xlfH1dXGNvZGV7QVxlfEJ9LCB3aGVyZSBBIGFuZCBCIGNhbiBiZSBhcmJpdHJhcnkgUkVzLAotY3JlYXRlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHdpbGwgbWF0Y2ggZWl0aGVyIEEgb3IgQi4gIFRoaXMgY2FuCi1iZSB1c2VkIGluc2lkZSBncm91cHMgKHNlZSBiZWxvdykgYXMgd2VsbC4KLSUKLVxpdGVtW1xjb2Rle1xlKCBcZSl9XSBJbmRpY2F0ZXMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgYSBncm91cDsgdGhlCi1jb250ZW50cyBvZiBhIGdyb3VwIGNhbiBiZSBtYXRjaGVkIGxhdGVyIGluIHRoZSBzdHJpbmcgd2l0aCB0aGUKLVxjb2Rle1xlIFsxLTldfSBzcGVjaWFsIHNlcXVlbmNlLCBkZXNjcmliZWQgbmV4dC4KLVxlbmR7aXRlbWl6ZX0KLQotXGJlZ2lue2Z1bGxsaW5laXRlbXN9Ci1caXRlbVtcY29kZXtcZSBcZSAxLCAuLi4gXGUgXGUgNywgXGUgOCwgXGUgOX1dCi1NYXRjaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ3JvdXAgb2YgdGhlIHNhbWUKLW51bWJlci4gIEZvciBleGFtcGxlLCBcY29kZXtcZSAoLitcZSApIFxlIFxlIDF9IG1hdGNoZXMgJ3RoZSB0aGUnIG9yCi0nNTUgNTUnLCBidXQgbm90ICd0aGUgZW5kJyAobm90ZSB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGdyb3VwKS4gIFRoaXMKLXNwZWNpYWwgc2VxdWVuY2UgY2FuIG9ubHkgYmUgdXNlZCB0byBtYXRjaCBvbmUgb2YgdGhlIGZpcnN0IDkgZ3JvdXBzOwotZ3JvdXBzIHdpdGggaGlnaGVyIG51bWJlcnMgY2FuIGJlIG1hdGNoZWQgdXNpbmcgdGhlIFxjb2Rle1xlIHZ9Ci1zZXF1ZW5jZS4gIChcY29kZXtcZSA4fSBhbmQgXGNvZGV7XGUgOX0gZG9uJ3QgbmVlZCBhIGRvdWJsZSBiYWNrc2xhc2gKLWJlY2F1c2UgdGhleSBhcmUgbm90IG9jdGFsIGRpZ2l0cy4pCi1cZW5ke2Z1bGxsaW5laXRlbXN9Ci0KLVxiZWdpbntpdGVtaXplfQotXGl0ZW1bXGNvZGV7XGUgXGUgYn1dIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IG9ubHkgYXQgdGhlCi1iZWdpbm5pbmcgb3IgZW5kIG9mIGEgd29yZC4gIEEgd29yZCBpcyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YKLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBzbyB0aGUgZW5kIG9mIGEgd29yZCBpcyBpbmRpY2F0ZWQgYnkKLXdoaXRlc3BhY2Ugb3IgYSBub24tYWxwaGFudW1lcmljIGNoYXJhY3Rlci4KLSUKLVxpdGVtW1xjb2Rle1xlIEJ9XSBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCB3aGVuIGl0IGlzIFxlbXBoe25vdH0gYXQgdGhlCi1iZWdpbm5pbmcgb3IgZW5kIG9mIGEgd29yZC4KLSUKLVxpdGVtW1xjb2Rle1xlIHZ9XSBNdXN0IGJlIGZvbGxvd2VkIGJ5IGEgdHdvIGRpZ2l0IGRlY2ltYWwgbnVtYmVyLCBhbmQKLW1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBvZiB0aGUgc2FtZSBudW1iZXIuICBUaGUgZ3JvdXAKLW51bWJlciBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOTksIGluY2x1c2l2ZS4KLSUKLVxpdGVtW1xjb2Rle1xlIHd9XU1hdGNoZXMgYW55IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXI7IHRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gdGhlIHNldCBcY29kZXtbYS16QS1aMC05XX0uCi0lCi1caXRlbVtcY29kZXtcZSBXfV0gTWF0Y2hlcyBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXI7IHRoaXMgaXMKLWVxdWl2YWxlbnQgdG8gdGhlIHNldCBcY29kZXtbXF5hLXpBLVowLTldfS4KLVxpdGVtW1xjb2Rle1xlIDx9XSBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotd29yZC4gIEEgd29yZCBpcyBkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHNvCi10aGUgZW5kIG9mIGEgd29yZCBpcyBpbmRpY2F0ZWQgYnkgd2hpdGVzcGFjZSBvciBhIG5vbi1hbHBoYW51bWVyaWMgCi1jaGFyYWN0ZXIuCi1caXRlbVtcY29kZXtcZSA+fV0gTWF0Y2hlcyB0aGUgZW1wdHkgc3RyaW5nLCBidXQgb25seSBhdCB0aGUgZW5kIG9mIGEKLXdvcmQuCi0KLVxpdGVtW1xjb2Rle1xlIFxlIFxlIFxlfV0gTWF0Y2hlcyBhIGxpdGVyYWwgYmFja3NsYXNoLgotCi0lIEluIEVtYWNzLCB0aGUgZm9sbG93aW5nIHR3byBhcmUgc3RhcnQgb2YgYnVmZmVyL2VuZCBvZiBidWZmZXIuICBJbgotJSBQeXRob24gdGhleSBzZWVtIHRvIGJlIHN5bm9ueW1zIGZvciBeJC4KLVxpdGVtW1xjb2Rle1xlIGB9XSBMaWtlIFxjb2Rle1xefSwgdGhpcyBvbmx5IG1hdGNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZQotc3RyaW5nLgotXGl0ZW1bXGNvZGV7XGUgXGUgJ31dIExpa2UgXGNvZGV7XCR9LCB0aGlzIG9ubHkgbWF0Y2hlcyBhdCB0aGUgZW5kIG9mCi10aGUgc3RyaW5nLgotJSBlbmQgb2YgYnVmZmVyCi1cZW5ke2l0ZW1pemV9Ci0KLVxzdWJzZWN0aW9ue01vZHVsZSBDb250ZW50c30KLVxub2RlbmFtZXtDb250ZW50cyBvZiBNb2R1bGUgcmVnZXh9Ci0KLVRoZSBtb2R1bGUgZGVmaW5lcyB0aGVzZSBmdW5jdGlvbnMsIGFuZCBhbiBleGNlcHRpb246Ci0KLQotXGJlZ2lue2Z1bmNkZXNjfXttYXRjaH17cGF0dGVybiwgc3RyaW5nfQotICBSZXR1cm4gaG93IG1hbnkgY2hhcmFjdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIFx2YXJ7c3RyaW5nfSBtYXRjaAotICB0aGUgcmVndWxhciBleHByZXNzaW9uIFx2YXJ7cGF0dGVybn0uICBSZXR1cm4gXGNvZGV7LTF9IGlmIHRoZQotICBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gKHRoaXMgaXMgZGlmZmVyZW50IGZyb20gYQotICB6ZXJvLWxlbmd0aCBtYXRjaCEpLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzZWFyY2h9e3BhdHRlcm4sIHN0cmluZ30KLSAgUmV0dXJuIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiBcdmFye3N0cmluZ30gdGhhdCBtYXRjaGVzIHRoZSByZWd1bGFyCi0gIGV4cHJlc3Npb24gXHZhcntwYXR0ZXJufS4gIFJldHVybiBcY29kZXstMX0gaWYgbm8gcG9zaXRpb24gaW4gdGhlIHN0cmluZwotICBtYXRjaGVzIHRoZSBwYXR0ZXJuICh0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgemVyby1sZW5ndGggbWF0Y2gKLSAgYW55d2hlcmUhKS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y29tcGlsZX17cGF0dGVyblxvcHRpb25hbHssIHRyYW5zbGF0ZX19Ci0gIENvbXBpbGUgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uCi0gIG9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG1hdGNoaW5nIHVzaW5nIGl0cyBcY29kZXttYXRjaCgpfSBhbmQKLSAgXGNvZGV7c2VhcmNoKCl9IG1ldGhvZHMsIGRlc2NyaWJlZCBiZWxvdy4gIFRoZSBvcHRpb25hbCBhcmd1bWVudAotICBcdmFye3RyYW5zbGF0ZX0sIGlmIHByZXNlbnQsIG11c3QgYmUgYSAyNTYtY2hhcmFjdGVyIHN0cmluZwotICBpbmRpY2F0aW5nIGhvdyBjaGFyYWN0ZXJzIChib3RoIG9mIHRoZSBwYXR0ZXJuIGFuZCBvZiB0aGUgc3RyaW5ncyB0bwotICBiZSBtYXRjaGVkKSBhcmUgdHJhbnNsYXRlZCBiZWZvcmUgY29tcGFyaW5nIHRoZW07IHRoZSBcdmFye2l9LXRoCi0gIGVsZW1lbnQgb2YgdGhlIHN0cmluZyBnaXZlcyB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBjaGFyYWN0ZXIgd2l0aAotICBcQVNDSUl7fSBjb2RlIFx2YXJ7aX0uICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAotICBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nOyBzZWUgdGhlIFxjb2Rle2Nhc2Vmb2xkfSBkYXRhIGl0ZW0gYmVsb3cuCi0KLSAgVGhlIHNlcXVlbmNlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KLXByb2cgPSByZWdleC5jb21waWxlKHBhdCkKLXJlc3VsdCA9IHByb2cubWF0Y2goc3RyKQotXGVuZHt2ZXJiYXRpbX0KLSUKLWlzIGVxdWl2YWxlbnQgdG8KLQotXGJlZ2lue3ZlcmJhdGltfQotcmVzdWx0ID0gcmVnZXgubWF0Y2gocGF0LCBzdHIpCi1cZW5ke3ZlcmJhdGltfQotCi1idXQgdGhlIHZlcnNpb24gdXNpbmcgXGNvZGV7Y29tcGlsZSgpfSBpcyBtb3JlIGVmZmljaWVudCB3aGVuIG11bHRpcGxlCi1yZWd1bGFyIGV4cHJlc3Npb25zIGFyZSB1c2VkIGNvbmN1cnJlbnRseSBpbiBhIHNpbmdsZSBwcm9ncmFtLiAgKFRoZQotY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgbGFzdCBwYXR0ZXJuIHBhc3NlZCB0byBcY29kZXtyZWdleC5tYXRjaCgpfSBvcgotXGNvZGV7cmVnZXguc2VhcmNoKCl9IGlzIGNhY2hlZCwgc28gcHJvZ3JhbXMgdGhhdCB1c2Ugb25seSBhIHNpbmdsZQotcmVndWxhciBleHByZXNzaW9uIGF0IGEgdGltZSBuZWVkbid0IHdvcnJ5IGFib3V0IGNvbXBpbGluZyByZWd1bGFyCi1leHByZXNzaW9ucy4pCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9zeW50YXh9e2ZsYWdzfQotICBTZXQgdGhlIHN5bnRheCB0byBiZSB1c2VkIGJ5IGZ1dHVyZSBjYWxscyB0byBcY29kZXtjb21waWxlKCl9LAotICBcY29kZXttYXRjaCgpfSBhbmQgXGNvZGV7c2VhcmNoKCl9LiAgKEFscmVhZHkgY29tcGlsZWQgZXhwcmVzc2lvbgotICBvYmplY3RzIGFyZSBub3QgYWZmZWN0ZWQuKSAgVGhlIGFyZ3VtZW50IGlzIGFuIGludGVnZXIgd2hpY2ggaXMgdGhlCi0gIE9SIG9mIHNldmVyYWwgZmxhZyBiaXRzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcHJldmlvdXMgdmFsdWUgb2YKLSAgdGhlIHN5bnRheCBmbGFncy4gIE5hbWVzIGZvciB0aGUgZmxhZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkCi0gIG1vZHVsZSBcY29kZXtyZWdleF9zeW50YXh9XHJlZnN0bW9kaW5kZXh7cmVnZXhfc3ludGF4fTsgcmVhZCB0aGUKLSAgZmlsZSBcZmlsZXtyZWdleF9zeW50YXgucHl9IGZvciBtb3JlIGluZm9ybWF0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtnZXRfc3ludGF4fXt9Ci0gIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN5bnRheCBmbGFncyBhcyBhbiBpbnRlZ2VyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzeW1jb21wfXtwYXR0ZXJuXG9wdGlvbmFseywgdHJhbnNsYXRlfX0KLVRoaXMgaXMgbGlrZSBcY29kZXtjb21waWxlKCl9LCBidXQgc3VwcG9ydHMgc3ltYm9saWMgZ3JvdXAgbmFtZXM6IGlmIGEKLXBhcmVudGhlc2lzLWVuY2xvc2VkIGdyb3VwIGJlZ2lucyB3aXRoIGEgZ3JvdXAgbmFtZSBpbiBhbmd1bGFyCi1icmFja2V0cywgZS5nLiBcY29kZXsnXGUoPGlkPlthLXpdW2EtejAtOV0qXGUpJ30sIHRoZSBncm91cCBjYW4KLWJlIHJlZmVyZW5jZWQgYnkgaXRzIG5hbWUgaW4gYXJndW1lbnRzIHRvIHRoZSBcY29kZXtncm91cCgpfSBtZXRob2Qgb2YKLXRoZSByZXN1bHRpbmcgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCwgbGlrZSB0aGlzOgotXGNvZGV7cC5ncm91cCgnaWQnKX0uICBHcm91cCBuYW1lcyBtYXkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycwotYW5kIFxjb2RleydfJ30gb25seS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntleGNkZXNjfXtlcnJvcn0KLSAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgc3RyaW5nIHBhc3NlZCB0byBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBoZXJlCi0gIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiAoZS5nLiwgdW5tYXRjaGVkIHBhcmVudGhlc2VzKSBvcgotICB3aGVuIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJzIGR1cmluZyBjb21waWxhdGlvbiBvciBtYXRjaGluZy4gIChJdCBpcwotICBuZXZlciBhbiBlcnJvciBpZiBhIHN0cmluZyBjb250YWlucyBubyBtYXRjaCBmb3IgYSBwYXR0ZXJuLikKLVxlbmR7ZXhjZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtjYXNlZm9sZH0KLUEgc3RyaW5nIHN1aXRhYmxlIHRvIHBhc3MgYXMgdGhlIFx2YXJ7dHJhbnNsYXRlfSBhcmd1bWVudCB0bwotXGNvZGV7Y29tcGlsZSgpfSB0byBtYXAgYWxsIHVwcGVyIGNhc2UgY2hhcmFjdGVycyB0byB0aGVpciBsb3dlcmNhc2UKLWVxdWl2YWxlbnRzLgotXGVuZHtkYXRhZGVzY30KLQotXG5vaW5kZW50Ci1Db21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBzdXBwb3J0IHRoZXNlIG1ldGhvZHM6Ci0KLVxzZXRpbmRleHN1Yml0ZW17KHJlZ2V4IG1ldGhvZCl9Ci1cYmVnaW57ZnVuY2Rlc2N9e21hdGNofXtzdHJpbmdcb3B0aW9uYWx7LCBwb3N9fQotICBSZXR1cm4gaG93IG1hbnkgY2hhcmFjdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIFx2YXJ7c3RyaW5nfSBtYXRjaAotICB0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uLiAgUmV0dXJuIFxjb2Rley0xfSBpZiB0aGUgc3RyaW5nCi0gIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuICh0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgemVyby1sZW5ndGgKLSAgbWF0Y2ghKS4KLSAgCi0gIFRoZSBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyLCBcdmFye3Bvc30sIGdpdmVzIGFuIGluZGV4IGluIHRoZSBzdHJpbmcKLSAgd2hlcmUgdGhlIHNlYXJjaCBpcyB0byBzdGFydDsgaXQgZGVmYXVsdHMgdG8gXGNvZGV7MH0uICBUaGlzIGlzIG5vdAotICBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8gc2xpY2luZyB0aGUgc3RyaW5nOyB0aGUgXGNvZGV7J1xeJ30gcGF0dGVybgotICBjaGFyYWN0ZXIgbWF0Y2hlcyBhdCB0aGUgcmVhbCBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyBhbmQgYXQgcG9zaXRpb25zCi0gIGp1c3QgYWZ0ZXIgYSBuZXdsaW5lLCBub3QgbmVjZXNzYXJpbHkgYXQgdGhlIGluZGV4IHdoZXJlIHRoZSBzZWFyY2gKLSAgaXMgdG8gc3RhcnQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NlYXJjaH17c3RyaW5nXG9wdGlvbmFseywgcG9zfX0KLSAgUmV0dXJuIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiBcdmFye3N0cmluZ30gdGhhdCBtYXRjaGVzIHRoZSByZWd1bGFyCi0gIGV4cHJlc3Npb24gXGNvZGV7cGF0dGVybn0uICBSZXR1cm4gXGNvZGV7LTF9IGlmIG5vIHBvc2l0aW9uIGluIHRoZQotICBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybiAodGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIHplcm8tbGVuZ3RoCi0gIG1hdGNoIGFueXdoZXJlISkuCi0gIAotICBUaGUgb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgdGhlCi0gIFxjb2Rle21hdGNoKCl9IG1ldGhvZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Z3JvdXB9e2luZGV4LCBpbmRleCwgLi4ufQotVGhpcyBtZXRob2QgaXMgb25seSB2YWxpZCB3aGVuIHRoZSBsYXN0IGNhbGwgdG8gdGhlIFxjb2Rle21hdGNoKCl9Ci1vciBcY29kZXtzZWFyY2goKX0gbWV0aG9kIGZvdW5kIGEgbWF0Y2guICBJdCByZXR1cm5zIG9uZSBvciBtb3JlCi1ncm91cHMgb2YgdGhlIG1hdGNoLiAgSWYgdGhlcmUgaXMgYSBzaW5nbGUgXHZhcntpbmRleH0gYXJndW1lbnQsCi10aGUgcmVzdWx0IGlzIGEgc2luZ2xlIHN0cmluZzsgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGFyZ3VtZW50cywgdGhlCi1yZXN1bHQgaXMgYSB0dXBsZSB3aXRoIG9uZSBpdGVtIHBlciBhcmd1bWVudC4gIElmIHRoZSBcdmFye2luZGV4fSBpcwotemVybywgdGhlIGNvcnJlc3BvbmRpbmcgcmV0dXJuIHZhbHVlIGlzIHRoZSBlbnRpcmUgbWF0Y2hpbmcgc3RyaW5nOyBpZgotaXQgaXMgaW4gdGhlIGluY2x1c2l2ZSByYW5nZSBbMS4uOTldLCBpdCBpcyB0aGUgc3RyaW5nIG1hdGNoaW5nIHRoZQotY29ycmVzcG9uZGluZyBwYXJlbnRoZXNpemVkIGdyb3VwICh1c2luZyB0aGUgZGVmYXVsdCBzeW50YXgsCi1ncm91cHMgYXJlIHBhcmVudGhlc2l6ZWQgdXNpbmcgXGNvZGV7e1xlfSh9IGFuZCBcY29kZXt7XGV9KX0pLiAgSWYgbm8KLXN1Y2ggZ3JvdXAgZXhpc3RzLCB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgaXMgXGNvZGV7Tm9uZX0uCi0KLUlmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2FzIGNvbXBpbGVkIGJ5IFxjb2Rle3N5bWNvbXAoKX0gaW5zdGVhZCBvZgotXGNvZGV7Y29tcGlsZSgpfSwgdGhlIFx2YXJ7aW5kZXh9IGFyZ3VtZW50cyBtYXkgYWxzbyBiZSBzdHJpbmdzCi1pZGVudGlmeWluZyBncm91cHMgYnkgdGhlaXIgZ3JvdXAgbmFtZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxub2luZGVudAotQ29tcGlsZWQgcmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0IHRoZXNlIGRhdGEgYXR0cmlidXRlczoKLQotXHNldGluZGV4c3ViaXRlbXsocmVnZXggYXR0cmlidXRlKX0KLQotXGJlZ2lue2RhdGFkZXNjfXtyZWdzfQotV2hlbiB0aGUgbGFzdCBjYWxsIHRvIHRoZSBcY29kZXttYXRjaCgpfSBvciBcY29kZXtzZWFyY2goKX0gbWV0aG9kIGZvdW5kIGEKLW1hdGNoLCB0aGlzIGlzIGEgdHVwbGUgb2YgcGFpcnMgb2YgaW5kZXhlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQotYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHBhcmVudGhlc2l6ZWQgZ3JvdXBzIGluIHRoZSBwYXR0ZXJuLiAgSW5kaWNlcwotYXJlIHJlbGF0aXZlIHRvIHRoZSBzdHJpbmcgYXJndW1lbnQgcGFzc2VkIHRvIFxjb2Rle21hdGNoKCl9IG9yCi1cY29kZXtzZWFyY2goKX0uICBUaGUgMC10aCB0dXBsZSBnaXZlcyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb3IgdGhlCi13aG9sZSBwYXR0ZXJuLiAgV2hlbiB0aGUgbGFzdCBtYXRjaCBvciBzZWFyY2ggZmFpbGVkLCB0aGlzIGlzCi1cY29kZXtOb25lfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317bGFzdH0KLVdoZW4gdGhlIGxhc3QgY2FsbCB0byB0aGUgXGNvZGV7bWF0Y2goKX0gb3IgXGNvZGV7c2VhcmNoKCl9IG1ldGhvZCBmb3VuZCBhCi1tYXRjaCwgdGhpcyBpcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHBhc3NlZCB0byB0aGF0IG1ldGhvZC4gIFdoZW4gdGhlCi1sYXN0IG1hdGNoIG9yIHNlYXJjaCBmYWlsZWQsIHRoaXMgaXMgXGNvZGV7Tm9uZX0uCi1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e3RyYW5zbGF0ZX0KLVRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBcdmFye3RyYW5zbGF0ZX0gYXJndW1lbnQgdG8KLVxjb2Rle3JlZ2V4LmNvbXBpbGUoKX0gdGhhdCBjcmVhdGVkIHRoaXMgcmVndWxhciBleHByZXNzaW9uIG9iamVjdC4gIElmCi10aGUgXHZhcnt0cmFuc2xhdGV9IGFyZ3VtZW50IHdhcyBvbWl0dGVkIGluIHRoZSBcY29kZXtyZWdleC5jb21waWxlKCl9Ci1jYWxsLCB0aGlzIGlzIFxjb2Rle05vbmV9LgotXGVuZHtkYXRhZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXtnaXZlbnBhdH0KLVRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBhcyBwYXNzZWQgdG8gXGNvZGV7Y29tcGlsZSgpfSBvcgotXGNvZGV7c3ltY29tcCgpfS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cmVhbHBhdH0KLVRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWZ0ZXIgc3RyaXBwaW5nIHRoZSBncm91cCBuYW1lcyBmb3IgcmVndWxhcgotZXhwcmVzc2lvbnMgY29tcGlsZWQgd2l0aCBcY29kZXtzeW1jb21wKCl9LiAgU2FtZSBhcyBcY29kZXtnaXZlbnBhdH0KLW90aGVyd2lzZS4KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Z3JvdXBpbmRleH0KLUEgZGljdGlvbmFyeSBnaXZpbmcgdGhlIG1hcHBpbmcgZnJvbSBzeW1ib2xpYyBncm91cCBuYW1lcyB0byBudW1lcmljYWwKLWdyb3VwIGluZGV4ZXMgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgY29tcGlsZWQgd2l0aCBcY29kZXtzeW1jb21wKCl9LgotXGNvZGV7Tm9uZX0gb3RoZXJ3aXNlLgotXGVuZHtkYXRhZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmVnc3ViLnRleCBiL0RvYy9saWIvbGlicmVnc3ViLnRleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxYjcwMC4uMDAwMDAwMAotLS0gYS9Eb2MvbGliL2xpYnJlZ3N1Yi50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1cc2VjdGlvbntcbW9kdWxle3JlZ3N1Yn0gLS0tCi0gICAgICAgICBTdHJpbmcgb3BlcmF0aW9ucyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zfQotCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cmVnc3VifQotXG1vZHVsZXN5bm9wc2lze1N1YnN0aXR1dGlvbiBhbmQgc3BsaXR0aW5nIG9wZXJhdGlvbnMgdGhhdCB1c2UKLSAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb25zLiAgXHN0cm9uZ3tPYnNvbGV0ZSF9fQotCi0KLVRoaXMgbW9kdWxlIGRlZmluZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHVzZWZ1bCBmb3Igd29ya2luZyB3aXRoCi1yZWd1bGFyIGV4cHJlc3Npb25zIChzZWUgYnVpbHQtaW4gbW9kdWxlIFxyZWZtb2R1bGV7cmVnZXh9KS4KLQotV2FybmluZzogdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgdGhyZWFkLXNhZmUuCi0KLVxzdHJvbmd7T2Jzb2xlc2NlbmNlIG5vdGU6fQotVGhpcyBtb2R1bGUgaXMgb2Jzb2xldGUgYXMgb2YgUHl0aG9uIHZlcnNpb24gMS41OyBpdCBpcyBzdGlsbCBiZWluZwotbWFpbnRhaW5lZCBiZWNhdXNlIG11Y2ggZXhpc3RpbmcgY29kZSBzdGlsbCB1c2VzIGl0LiAgQWxsIG5ldyBjb2RlIGluCi1uZWVkIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc2hvdWxkIHVzZSB0aGUgbmV3IFxyZWZtb2R1bGV7cmV9IG1vZHVsZSwgd2hpY2gKLXN1cHBvcnRzIHRoZSBtb3JlIHBvd2VyZnVsIGFuZCByZWd1bGFyIFBlcmwtc3R5bGUgcmVndWxhciBleHByZXNzaW9ucy4KLUV4aXN0aW5nIGNvZGUgc2hvdWxkIGJlIGNvbnZlcnRlZC4gIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZQotXG1vZHVsZXtyZWNvbnZlcnR9IGhlbHBzIGluIGNvbnZlcnRpbmcgXHJlZm1vZHVsZXtyZWdleH0gc3R5bGUgcmVndWxhcgotZXhwcmVzc2lvbnMgdG8gXHJlZm1vZHVsZXtyZX0gc3R5bGUgcmVndWxhciBleHByZXNzaW9ucy4gIChGb3IgbW9yZQotY29udmVyc2lvbiBoZWxwLCBzZWUgQW5kcmV3IEt1Y2hsaW5nJ3NcaW5kZXh7S3VjaGxpbmcsIEFuZHJld30KLWBgcmVnZXgtdG8tcmUgSE9XVE8nJyBhdAotXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2hvd3RvL3JlZ2V4LXRvLXJlL30uKQotCi0KLVxiZWdpbntmdW5jZGVzY317c3VifXtwYXQsIHJlcGwsIHN0cn0KLVJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgcGF0dGVybiBcdmFye3BhdH0gaW4gc3RyaW5nCi1cdmFye3N0cn0gYnkgcmVwbGFjZW1lbnQgXHZhcntyZXBsfS4gIElmIHRoZSBwYXR0ZXJuIGlzbid0IGZvdW5kLAotdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuICBUaGUgcGF0dGVybiBtYXkgYmUgYSBzdHJpbmcgb3IgYW4KLWFscmVhZHkgY29tcGlsZWQgcGF0dGVybi4gIFRoZSByZXBsYWNlbWVudCBtYXkgY29udGFpbiByZWZlcmVuY2VzCi1cc2FtcHtcZSBcdmFye2RpZ2l0fX0gdG8gc3VicGF0dGVybnMgYW5kIGVzY2FwZWQgYmFja3NsYXNoZXMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2dzdWJ9e3BhdCwgcmVwbCwgc3RyfQotUmVwbGFjZSBhbGwgKG5vbi1vdmVybGFwcGluZykgb2NjdXJyZW5jZXMgb2YgcGF0dGVybiBcdmFye3BhdH0gaW4KLXN0cmluZyBcdmFye3N0cn0gYnkgcmVwbGFjZW1lbnQgXHZhcntyZXBsfS4gIFRoZSBzYW1lIHJ1bGVzIGFzIGZvcgotXGNvZGV7c3ViKCl9IGFwcGx5LiAgRW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIHJlcGxhY2VkIG9ubHkKLXdoZW4gbm90IGFkamFjZW50IHRvIGEgcHJldmlvdXMgbWF0Y2gsIHNvIGUuZy4KLVxjb2Rle2dzdWIoJycsICctJywgJ2FiYycpfSByZXR1cm5zIFxjb2RleyctYS1iLWMtJ30uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NwbGl0fXtzdHIsIHBhdFxvcHRpb25hbHssIG1heHNwbGl0fX0KLVNwbGl0IHRoZSBzdHJpbmcgXHZhcntzdHJ9IGluIGZpZWxkcyBzZXBhcmF0ZWQgYnkgZGVsaW1pdGVycyBtYXRjaGluZwotdGhlIHBhdHRlcm4gXHZhcntwYXR9LCBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBmaWVsZHMuICBPbmx5Ci1ub24tZW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIGNvbnNpZGVyZWQsIHNvIGUuZy4KLVxjb2Rle3NwbGl0KCdhOmInLCAnOionKX0gcmV0dXJucyBcY29kZXtbJ2EnLCAnYiddfSBhbmQKLVxjb2Rle3NwbGl0KCdhYmMnLCAnJyl9IHJldHVybnMgXGNvZGV7WydhYmMnXX0uICBUaGUgXHZhcnttYXhzcGxpdH0KLWRlZmF1bHRzIHRvIDAuIElmIGl0IGlzIG5vbnplcm8sIG9ubHkgXHZhcnttYXhzcGxpdH0gbnVtYmVyIG9mIHNwbGl0cwotb2NjdXIsIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgYXMgdGhlIGZpbmFsCi1lbGVtZW50IG9mIHRoZSBsaXN0LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdHh9e3N0ciwgcGF0XG9wdGlvbmFseywgbWF4c3BsaXR9fQotU3BsaXQgdGhlIHN0cmluZyBcdmFye3N0cn0gaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nCi10aGUgcGF0dGVybiBcdmFye3BhdH0sIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkcyBhcyB3ZWxsCi1hcyB0aGUgc2VwYXJhdG9ycy4gIEZvciBleGFtcGxlLCBcY29kZXtzcGxpdHgoJ2E6OjpiJywgJzoqJyl9IHJldHVybnMKLVxjb2Rle1snYScsICc6OjonLCAnYiddfS4gIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiBiZWhhdmVzIHRoZSBzYW1lCi1hcyBcY29kZXtzcGxpdH0uCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2NhcHdvcmRzfXtzXG9wdGlvbmFseywgcGF0fX0KLUNhcGl0YWxpemUgd29yZHMgc2VwYXJhdGVkIGJ5IG9wdGlvbmFsIHBhdHRlcm4gXHZhcntwYXR9LiAgVGhlIGRlZmF1bHQKLXBhdHRlcm4gdXNlcyBhbnkgY2hhcmFjdGVycyBleGNlcHQgbGV0dGVycywgZGlnaXRzIGFuZCB1bmRlcnNjb3JlcyBhcwotd29yZCBkZWxpbWl0ZXJzLiAgQ2FwaXRhbGl6YXRpb24gaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgZmlyc3QKLWNoYXJhY3RlciBvZiBlYWNoIHdvcmQgdG8gdXBwZXIgY2FzZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2xlYXJfY2FjaGV9e30KLVRoZSByZWdzdWIgbW9kdWxlIG1haW50YWlucyBhIGNhY2hlIG9mIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCi1rZXllZCBvbiB0aGUgcmVndWxhciBleHByZXNzaW9uIHN0cmluZyBhbmQgdGhlIHN5bnRheCBvZiB0aGUgcmVnZXgKLW1vZHVsZSBhdCB0aGUgdGltZSB0aGUgZXhwcmVzc2lvbiB3YXMgY29tcGlsZWQuICBUaGlzIGZ1bmN0aW9uIGNsZWFycwotdGhhdCBjYWNoZS4KLVxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJ1bnB5LnRleCBiL0RvYy9saWIvbGlicnVucHkudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTk5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYnJ1bnB5LnRleApAQCAtMCwwICsxLDc0IEBACitcc2VjdGlvbntcbW9kdWxle3J1bnB5fSAtLS0KKyAgICAgICAgIExvY2F0aW5nIGFuZCBleGVjdXRpbmcgUHl0aG9uIG1vZHVsZXMufQorCitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17cnVucHl9CQklIHN0YW5kYXJkIGxpYnJhcnksIGluIFB5dGhvbgorCitcbW9kdWxlYXV0aG9ye05pY2sgQ29naGxhbn17bmNvZ2hsYW5AZ21haWwuY29tfQorCitcbW9kdWxlc3lub3BzaXN7TG9jYXRlIGFuZCBleGVjdXRlIFB5dGhvbiBtb2R1bGVzIGFzIHNjcmlwdHN9CisKK1x2ZXJzaW9uYWRkZWR7Mi41fQorCitUaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIGlzIHVzZWQgdG8gbG9jYXRlIGFuZCBydW4gUHl0aG9uIG1vZHVsZXMKK3dpdGhvdXQgaW1wb3J0aW5nIHRoZW0gZmlyc3QuIEl0J3MgbWFpbiB1c2UgaXMgdG8gaW1wbGVtZW50IHRoZQorXHByb2dyYW1vcHR7LW19IGNvbW1hbmQgbGluZSBzd2l0Y2ggdGhhdCBhbGxvd3Mgc2NyaXB0cyB0byBiZSBsb2NhdGVkCit1c2luZyB0aGUgUHl0aG9uIG1vZHVsZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZpbGVzeXN0ZW0uCisKK1doZW4gZXhlY3V0ZWQgYXMgYSBzY3JpcHQsIHRoZSBtb2R1bGUgZWZmZWN0aXZlbHkgb3BlcmF0ZXMgYXMgZm9sbG93czoKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgICBkZWwgc3lzLmFyZ3ZbMF0gICMgUmVtb3ZlIHRoZSBydW5weSBtb2R1bGUgZnJvbSB0aGUgYXJndW1lbnRzCisgICAgcnVuX21vZHVsZShzeXMuYXJndlswXSwgcnVuX25hbWU9Il9fbWFpbl9fIiwgYWx0ZXJfc3lzPVRydWUpCitcZW5ke3ZlcmJhdGltfQorCitUaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIHByb3ZpZGVzIGEgc2luZ2xlIGZ1bmN0aW9uOgorCitcYmVnaW57ZnVuY2Rlc2N9e3J1bl9tb2R1bGV9e21vZF9uYW1lXG9wdGlvbmFseywgaW5pdF9nbG9iYWxzfQorXG9wdGlvbmFseywgcnVuX25hbWV9XG9wdGlvbmFseywgYWx0ZXJfc3lzfX0KK0V4ZWN1dGUgdGhlIGNvZGUgb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nCittb2R1bGUgZ2xvYmFscyBkaWN0aW9uYXJ5LiBUaGUgbW9kdWxlJ3MgY29kZSBpcyBmaXJzdCBsb2NhdGVkIHVzaW5nCit0aGUgc3RhbmRhcmQgaW1wb3J0IG1lY2hhbmlzbSAocmVmZXIgdG8gUEVQIDMwMiBmb3IgZGV0YWlscykgYW5kCit0aGVuIGV4ZWN1dGVkIGluIGEgZnJlc2ggbW9kdWxlIG5hbWVzcGFjZS4KKworVGhlIG9wdGlvbmFsIGRpY3Rpb25hcnkgYXJndW1lbnQgXHZhcntpbml0X2dsb2JhbHN9IG1heSBiZSB1c2VkIHRvCitwcmUtcG9wdWxhdGUgdGhlIGdsb2JhbHMgZGljdGlvbmFyeSBiZWZvcmUgdGhlIGNvZGUgaXMgZXhlY3V0ZWQuCitUaGUgc3VwcGxpZWQgZGljdGlvbmFyeSB3aWxsIG5vdCBiZSBtb2RpZmllZC4gSWYgYW55IG9mIHRoZSBzcGVjaWFsCitnbG9iYWwgdmFyaWFibGVzIGJlbG93IGFyZSBkZWZpbmVkIGluIHRoZSBzdXBwbGllZCBkaWN0aW9uYXJ5LCB0aG9zZQorZGVmaW5pdGlvbnMgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIFxjb2Rle3J1bl9tb2R1bGV9IGZ1bmN0aW9uLgorCitUaGUgc3BlY2lhbCBnbG9iYWwgdmFyaWFibGVzIFxjb2Rle19fbmFtZV9ffSwgXGNvZGV7X19maWxlX199LAorXGNvZGV7X19sb2FkZXJfX30gYW5kIFxjb2Rle19fYnVpbHRpbnNfX30gYXJlIHNldCBpbiB0aGUgZ2xvYmFscworZGljdGlvbmFyeSBiZWZvcmUgdGhlIG1vZHVsZSBjb2RlIGlzIGV4ZWN1dGVkLgorCitcY29kZXtfX25hbWVfX30gaXMgc2V0IHRvIFx2YXJ7cnVuX25hbWV9IGlmIHRoaXMgb3B0aW9uYWwgYXJndW1lbnQgaXMKK3N1cHBsaWVkLCBhbmQgdGhlIFx2YXJ7bW9kX25hbWV9IGFyZ3VtZW50IG90aGVyd2lzZS4KKworXGNvZGV7X19sb2FkZXJfX30gaXMgc2V0IHRvIHRoZSBQRVAgMzAyIG1vZHVsZSBsb2FkZXIgdXNlZCB0byByZXRyaWV2ZQordGhlIGNvZGUgZm9yIHRoZSBtb2R1bGUgKFRoaXMgbG9hZGVyIG1heSBiZSBhIHdyYXBwZXIgYXJvdW5kIHRoZQorc3RhbmRhcmQgaW1wb3J0IG1lY2hhbmlzbSkuCisKK1xjb2Rle19fZmlsZV9ffSBpcyBzZXQgdG8gdGhlIG5hbWUgcHJvdmlkZWQgYnkgdGhlIG1vZHVsZSBsb2FkZXIuIElmCit0aGUgbG9hZGVyIGRvZXMgbm90IG1ha2UgZmlsZW5hbWUgaW5mb3JtYXRpb24gYXZhaWxhYmxlLCB0aGlzCit2YXJpYWJsZSBpcyBzZXQgdG8gXGNvZGV7Tm9uZX0uCisKK1xjb2Rle19fYnVpbHRpbnNfX30gaXMgYXV0b21hdGljYWxseSBpbml0aWFsaXNlZCB3aXRoIGEgcmVmZXJlbmNlIHRvCit0aGUgdG9wIGxldmVsIG5hbWVzcGFjZSBvZiB0aGUgXG1vZHVsZXtfX2J1aWx0aW5fX30gbW9kdWxlLgorCitJZiB0aGUgYXJndW1lbnQgXHZhcnthbHRlcl9zeXN9IGlzIHN1cHBsaWVkIGFuZCBldmFsdWF0ZXMgdG8KK1xjb2Rle1RydWV9LCB0aGVuIFxjb2Rle3N5cy5hcmd2WzBdfSBpcyB1cGRhdGVkIHdpdGggdGhlIHZhbHVlIG9mCitcY29kZXtfX2ZpbGVfX30gYW5kIFxjb2Rle3N5cy5tb2R1bGVzW19fbmFtZV9fXX0gaXMgdXBkYXRlZCB3aXRoIGEKK3RlbXBvcmFyeSBtb2R1bGUgb2JqZWN0IGZvciB0aGUgbW9kdWxlIGJlaW5nIGV4ZWN1dGVkLiBCb3RoCitcY29kZXtzeXMuYXJndlswXX0gYW5kIFxjb2Rle3N5cy5tb2R1bGVzW19fbmFtZV9fXX0gYXJlIHJlc3RvcmVkIHRvCit0aGVpciBvcmlnaW5hbCB2YWx1ZXMgYmVmb3JlIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorCitOb3RlIHRoYXQgdGhpcyBtYW5pcHVsYXRpb24gb2YgXG1vZHVsZXtzeXN9IGlzIG5vdCB0aHJlYWQtc2FmZS4gT3RoZXIKK3RocmVhZHMgbWF5IHNlZSB0aGUgcGFydGlhbGx5IGluaXRpYWxpc2VkIG1vZHVsZSwgYXMgd2VsbCBhcyB0aGUKK2FsdGVyZWQgbGlzdCBvZiBhcmd1bWVudHMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIFxtb2R1bGV7c3lzfQorbW9kdWxlIGJlIGxlZnQgYWxvbmUgd2hlbiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhyZWFkZWQgY29kZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorCitcc2VlcGVwezMzOH17RXhlY3V0aW5nIG1vZHVsZXMgYXMgc2NyaXB0c317UEVQIHdyaXR0ZW4gYW5kIAoraW1wbGVtZW50ZWQgYnkgTmljayBDb2dobGFuLn0KKworXGVuZHtzZWVhbHNvfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzZXRzLnRleCBiL0RvYy9saWIvbGlic2V0cy50ZXgKaW5kZXggZGQ4NWVjNy4uMjJiZjM0YiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzZXRzLnRleAorKysgYi9Eb2MvbGliL2xpYnNldHMudGV4CkBAIC0xNTEsMTIgKzE1MSwxMyBAQAogICBcbGluZWlpaXtcdmFye3N9LmFkZChcdmFye3h9KX17fQogICAgICAgICAge2FkZCBlbGVtZW50IFx2YXJ7eH0gdG8gc2V0IFx2YXJ7c319CiAgIFxsaW5laWlpe1x2YXJ7c30ucmVtb3ZlKFx2YXJ7eH0pfXt9Ci0gICAgICAgICB7cmVtb3ZlIFx2YXJ7eH0gZnJvbSBzZXQgXHZhcntzfTsgcmFpc2VzIEtleUVycm9yIGlmIG5vdCBwcmVzZW50fQorICAgICAgICAge3JlbW92ZSBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c307IHJhaXNlcyBcZXhjZXB0aW9ue0tleUVycm9yfQorCSAgaWYgbm90IHByZXNlbnR9CiAgIFxsaW5laWlpe1x2YXJ7c30uZGlzY2FyZChcdmFye3h9KX17fQogICAgICAgICAge3JlbW92ZXMgXHZhcnt4fSBmcm9tIHNldCBcdmFye3N9IGlmIHByZXNlbnR9CiAgIFxsaW5laWlpe1x2YXJ7c30ucG9wKCl9e30KICAgICAgICAgIHtyZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgZWxlbWVudCBmcm9tIFx2YXJ7c307IHJhaXNlcwotCSAgS2V5RXJyb3IgaWYgZW1wdHl9CisJICBcZXhjZXB0aW9ue0tleUVycm9yfSBpZiBlbXB0eX0KICAgXGxpbmVpaWl7XHZhcntzfS5jbGVhcigpfXt9CiAgICAgICAgICB7cmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHNldCBcdmFye3N9fQogXGVuZHt0YWJsZWlpaX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXggYi9Eb2MvbGliL2xpYnNnbWxsaWIudGV4CmluZGV4IDI3YmYwYjAuLjE1NzgzMTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJzZ21sbGliLnRleApAQCAtOTUsMTIgKzk1LDIyIEBACiBzaG91bGQgYmUgdXNlZCB0byBzdXBwb3J0IHNlbWFudGljIGludGVycHJldGF0aW9uIG9mIHRoZSBzdGFydCB0YWcuCiBUaGUgXHZhcnthdHRyaWJ1dGVzfSBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgXGNvZGV7KFx2YXJ7bmFtZX0sCiBcdmFye3ZhbHVlfSl9IHBhaXJzIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgZm91bmQgaW5zaWRlIHRoZSB0YWcncwotXGNvZGV7PD59IGJyYWNrZXRzLiAgVGhlIFx2YXJ7bmFtZX0gaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlCi1hbmQgZG91YmxlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMgaW4gdGhlIFx2YXJ7dmFsdWV9IGhhdmUgYmVlbiBpbnRlcnByZXRlZC4KK1xjb2Rlezw+fSBicmFja2V0cy4KKworVGhlIFx2YXJ7bmFtZX0gaGFzIGJlZW4gdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLgorRG91YmxlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMgaW4gdGhlIFx2YXJ7dmFsdWV9IGhhdmUgYmVlbiBpbnRlcnByZXRlZCwKK2FzIHdlbGwgYXMga25vd24gY2hhcmFjdGVyIHJlZmVyZW5jZXMgYW5kIGtub3duIGVudGl0eSByZWZlcmVuY2VzCit0ZXJtaW5hdGVkIGJ5IGEgc2VtaWNvbG9uIChub3JtYWxseSwgZW50aXR5IHJlZmVyZW5jZXMgY2FuIGJlIHRlcm1pbmF0ZWQKK2J5IGFueSBub24tYWxwaGFudW1lcmljYWwgY2hhcmFjdGVyLCBidXQgdGhpcyB3b3VsZCBicmVhayB0aGUgdmVyeQorY29tbW9uIGNhc2Ugb2YgXGNvZGV7PEEgSFJFRj0idXJsP3NwYW09MVwmZWdncz0yIj59IHdoZW4gXGNvZGV7ZWdnc30KK2lzIGEgdmFsaWQgZW50aXR5IG5hbWUpLgorCiBGb3IgaW5zdGFuY2UsIGZvciB0aGUgdGFnIFxjb2RlezxBIEhSRUY9Imh0dHA6Ly93d3cuY3dpLm5sLyI+fSwgdGhpcwogbWV0aG9kIHdvdWxkIGJlIGNhbGxlZCBhcyBcc2FtcHt1bmtub3duX3N0YXJ0dGFnKCdhJywgWygnaHJlZicsCiAnaHR0cDovL3d3dy5jd2kubmwvJyldKX0uICBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2FsbHMKIFx2YXJ7bWV0aG9kfSB3aXRoIFx2YXJ7YXR0cmlidXRlc30gYXMgdGhlIG9ubHkgYXJndW1lbnQuCitcdmVyc2lvbmFkZGVkW0hhbmRsaW5nIG9mIGVudGl0eSBhbmQgY2hhcmFjdGVyIHJlZmVyZW5jZXMgd2l0aGluCisgICAgICAgICAgICAgIGF0dHJpYnV0ZSB2YWx1ZXNdezIuNX0KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9lbmR0YWd9e3RhZywgbWV0aG9kfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzaHV0aWwudGV4IGIvRG9jL2xpYi9saWJzaHV0aWwudGV4CmluZGV4IGEyMTcxNTAuLjQ0OWQ3NDEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2h1dGlsLnRleAorKysgYi9Eb2MvbGliL2xpYnNodXRpbC50ZXgKQEAgLTczLDE4ICs3MywxOCBAQAogICBJZiBcdmFye3N5bWxpbmtzfSBpcyB0cnVlLCBzeW1ib2xpYyBsaW5rcyBpbgogICB0aGUgc291cmNlIHRyZWUgYXJlIHJlcHJlc2VudGVkIGFzIHN5bWJvbGljIGxpbmtzIGluIHRoZSBuZXcgdHJlZTsKICAgaWYgZmFsc2Ugb3Igb21pdHRlZCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaW5rZWQgZmlsZXMgYXJlIGNvcGllZCB0bwotICB0aGUgbmV3IHRyZWUuICBJZiBleGNlcHRpb24ocykgb2NjdXIsIGFuIEVycm9yIGlzIHJhaXNlZAorICB0aGUgbmV3IHRyZWUuICBJZiBleGNlcHRpb24ocykgb2NjdXIsIGFuIFxleGNlcHRpb257RXJyb3J9IGlzIHJhaXNlZAogICB3aXRoIGEgbGlzdCBvZiByZWFzb25zLgogCiAgIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBleGFtcGxlIHJhdGhlciB0aGFuIAogICBhIHRvb2wuCiAKLSAgXHZlcnNpb25jaGFuZ2VkW0Vycm9yIGlzIHJhaXNlZCBpZiBhbnkgZXhjZXB0aW9ucyBvY2N1ciBkdXJpbmcgY29weWluZywKLSAgcmF0aGVyIHRoYW4gcHJpbnRpbmcgYSBtZXNzYWdlXXsyLjN9CisgIFx2ZXJzaW9uY2hhbmdlZFtcZXhjZXB0aW9ue0Vycm9yfSBpcyByYWlzZWQgaWYgYW55IGV4Y2VwdGlvbnMgb2NjdXIgZHVyaW5nCisgICAgICAgICAgICAgICAgICBjb3B5aW5nLCByYXRoZXIgdGhhbiBwcmludGluZyBhIG1lc3NhZ2VdezIuM30KIAogICBcdmVyc2lvbmNoYW5nZWRbQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBuZWVkZWQgdG8gY3JlYXRlIFx2YXJ7ZHN0fSwKLSAgcmF0aGVyIHRoYW4gcmFpc2luZyBhbiBlcnJvci4gQ29weSBwZXJtaXNzaW9ucyBhbmQgdGltZXMgb2YgZGlyZWN0b3JpZXMgdXNpbmcKLSAgXGZ1bmN0aW9ue2NvcHlzdGF0KCl9XXsyLjV9CisgICAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiByYWlzaW5nIGFuIGVycm9yLiBDb3B5IHBlcm1pc3Npb25zIGFuZCB0aW1lcyBvZgorCQkgIGRpcmVjdG9yaWVzIHVzaW5nIFxmdW5jdGlvbntjb3B5c3RhdCgpfV17Mi41fQogCiBcZW5ke2Z1bmNkZXNjfQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNpZ25hbC50ZXggYi9Eb2MvbGliL2xpYnNpZ25hbC50ZXgKaW5kZXggZjE2OGI2ZC4uY2ZkYjRkZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzaWduYWwudGV4CisrKyBiL0RvYy9saWIvbGlic2lnbmFsLnRleApAQCAtMTAwLDcgKzEwMCw3IEBACiAgIEFueSBwcmV2aW91c2x5IHNjaGVkdWxlZCBhbGFybSBpcyBjYW5jZWxlZCAob25seSBvbmUgYWxhcm0gY2FuCiAgIGJlIHNjaGVkdWxlZCBhdCBhbnkgdGltZSkuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlbiB0aGUgbnVtYmVyIG9mCiAgIHNlY29uZHMgYmVmb3JlIGFueSBwcmV2aW91c2x5IHNldCBhbGFybSB3YXMgdG8gaGF2ZSBiZWVuIGRlbGl2ZXJlZC4KLSAgSWYgXHZhcnt0aW1lfSBpcyB6ZXJvLCBubyBhbGFybSBpZCBzY2hlZHVsZWQsIGFuZCBhbnkgc2NoZWR1bGVkCisgIElmIFx2YXJ7dGltZX0gaXMgemVybywgbm8gYWxhcm0gaXMgc2NoZWR1bGVkLCBhbmQgYW55IHNjaGVkdWxlZAogICBhbGFybSBpcyBjYW5jZWxlZC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzCiAgIHJlbWFpbmluZyBiZWZvcmUgYSBwcmV2aW91c2x5IHNjaGVkdWxlZCBhbGFybS4gIElmIHRoZSByZXR1cm4gdmFsdWUKICAgaXMgemVybywgbm8gYWxhcm0gaXMgY3VycmVudGx5IHNjaGVkdWxlZC4gIChTZWUgdGhlIFxVTklYe30gbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic29ja2V0LnRleCBiL0RvYy9saWIvbGlic29ja2V0LnRleAppbmRleCBjYzdiZDc1Li5jN2I2NTZkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNvY2tldC50ZXgKKysrIGIvRG9jL2xpYi9saWJzb2NrZXQudGV4CkBAIC0zMTcsMTAgKzMxNywxMSBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtmcm9tZmR9e2ZkLCBmYW1pbHksIHR5cGVcb3B0aW9uYWx7LCBwcm90b319Ci1CdWlsZCBhIHNvY2tldCBvYmplY3QgZnJvbSBhbiBleGlzdGluZyBmaWxlIGRlc2NyaXB0b3IgKGFuIGludGVnZXIgYXMKLXJldHVybmVkIGJ5IGEgZmlsZSBvYmplY3QncyBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QpLiAgQWRkcmVzcyBmYW1pbHksCi1zb2NrZXQgdHlwZSBhbmQgcHJvdG9jb2wgbnVtYmVyIGFyZSBhcyBmb3IgdGhlIFxmdW5jdGlvbntzb2NrZXQoKX0gZnVuY3Rpb24KLWFib3ZlLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgcmVmZXIgdG8gYSBzb2NrZXQsIGJ1dCB0aGlzIGlzIG5vdAorRHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgXHZhcntmZH0gKGFuIGludGVnZXIgYXMgcmV0dXJuZWQgYnkgYSBmaWxlCitvYmplY3QncyBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QpIGFuZCBidWlsZCBhIHNvY2tldCBvYmplY3QgZnJvbSB0aGUKK3Jlc3VsdC4gIEFkZHJlc3MgZmFtaWx5LCBzb2NrZXQgdHlwZSBhbmQgcHJvdG9jb2wgbnVtYmVyIGFyZSBhcyBmb3IgdGhlCitcZnVuY3Rpb257c29ja2V0KCl9IGZ1bmN0aW9uIGFib3ZlLgorVGhlIGZpbGUgZGVzY3JpcHRvciBzaG91bGQgcmVmZXIgdG8gYSBzb2NrZXQsIGJ1dCB0aGlzIGlzIG5vdAogY2hlY2tlZCAtLS0gc3Vic2VxdWVudCBvcGVyYXRpb25zIG9uIHRoZSBvYmplY3QgbWF5IGZhaWwgaWYgdGhlIGZpbGUKIGRlc2NyaXB0b3IgaXMgaW52YWxpZC4gIFRoaXMgZnVuY3Rpb24gaXMgcmFyZWx5IG5lZWRlZCwgYnV0IGNhbiBiZQogdXNlZCB0byBnZXQgb3Igc2V0IHNvY2tldCBvcHRpb25zIG9uIGEgc29ja2V0IHBhc3NlZCB0byBhIHByb2dyYW0gYXMKQEAgLTYyNiw3ICs2MjcsNyBAQAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bc29ja2V0XXtnZXR0aW1lb3V0fXt9Ci1SZXR1cm5zIHRoZSB0aW1lb3V0IGluIGZsb2F0aW5nIHNlY29uZHMgYXNzb2NpYXRlZCB3aXRoIHNvY2tldAorUmV0dXJuIHRoZSB0aW1lb3V0IGluIGZsb2F0aW5nIHNlY29uZHMgYXNzb2NpYXRlZCB3aXRoIHNvY2tldAogb3BlcmF0aW9ucywgb3IgXGNvZGV7Tm9uZX0gaWYgbm8gdGltZW91dCBpcyBzZXQuICBUaGlzIHJlZmxlY3RzCiB0aGUgbGFzdCBjYWxsIHRvIFxtZXRob2R7c2V0YmxvY2tpbmcoKX0gb3IgXG1ldGhvZHtzZXR0aW1lb3V0KCl9LgogXHZlcnNpb25hZGRlZHsyLjN9CkBAIC02NzcsNiArNjc4LDI1IEBACiBpbnN0ZWFkLgogCiAKK1NvY2tldCBvYmplY3RzIGFsc28gaGF2ZSB0aGVzZSAocmVhZC1vbmx5KSBhdHRyaWJ1dGVzIHRoYXQgY29ycmVzcG9uZAordG8gdGhlIHZhbHVlcyBnaXZlbiB0byB0aGUgXGNsYXNze3NvY2tldH0gY29uc3RydWN0b3IuCisKK1xiZWdpbnttZW1iZXJkZXNjfVtzb2NrZXRde2ZhbWlseX0KK1RoZSBzb2NrZXQgZmFtaWx5LgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfVtzb2NrZXRde3R5cGV9CitUaGUgc29ja2V0IHR5cGUuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9W3NvY2tldF17cHJvdG99CitUaGUgc29ja2V0IHByb3RvY29sLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21lbWJlcmRlc2N9CisKKwogXHN1YnNlY3Rpb257U1NMIE9iamVjdHMgXGxhYmVse3NzbC1vYmplY3RzfX0KIAogU1NMIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleCBiL0RvYy9saWIvbGlic3RkdHlwZXMudGV4CmluZGV4IGQyYTA0MjUuLjhkMDExZmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4CisrKyBiL0RvYy9saWIvbGlic3RkdHlwZXMudGV4CkBAIC0xODUsMTAgKzE4NSwxMiBAQAogSW4gYWRkaXRpb24sIEJvb2xlYW5zIGFyZSBhIHN1YnR5cGUgb2YgcGxhaW4gaW50ZWdlcnMuCiBQbGFpbiBpbnRlZ2VycyAoYWxzbyBqdXN0IGNhbGxlZCBcZGZue2ludGVnZXJzfSkKIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBcY3R5cGV7bG9uZ30gaW4gQywgd2hpY2ggZ2l2ZXMgdGhlbSBhdCBsZWFzdCAzMgotYml0cyBvZiBwcmVjaXNpb24uICBMb25nIGludGVnZXJzIGhhdmUgdW5saW1pdGVkIHByZWNpc2lvbi4gIEZsb2F0aW5nCi1wb2ludCBudW1iZXJzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBcY3R5cGV7ZG91YmxlfSBpbiBDLiAgQWxsIGJldHMgb24KLXRoZWlyIHByZWNpc2lvbiBhcmUgb2ZmIHVubGVzcyB5b3UgaGFwcGVuIHRvIGtub3cgdGhlIG1hY2hpbmUgeW91IGFyZQotd29ya2luZyB3aXRoLgorYml0cyBvZiBwcmVjaXNpb24gKFxjb2Rle3N5cy5tYXhpbnR9IGlzIGFsd2F5cyBzZXQgdG8gdGhlIG1heGltdW0KK3BsYWluIGludGVnZXIgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAKK1xjb2Rley1zeXMubWF4aW50IC0gMX0pLiAgTG9uZyBpbnRlZ2VycyBoYXZlIHVubGltaXRlZCBwcmVjaXNpb24uCitGbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBcY3R5cGV7ZG91YmxlfSBpbiBDLgorQWxsIGJldHMgb24gdGhlaXIgcHJlY2lzaW9uIGFyZSBvZmYgdW5sZXNzIHlvdSBoYXBwZW4gdG8ga25vdyB0aGUKK21hY2hpbmUgeW91IGFyZSB3b3JraW5nIHdpdGguCiBcb2JpbmRleHtudW1lcmljfQogXG9iaW5kZXh7Qm9vbGVhbn0KIFxvYmluZGV4e2ludGVnZXJ9CkBAIC0yNDksNiArMjUxLDcgQEAKICAgXGhsaW5lCiAgIFxsaW5laWlpe1x2YXJ7eH0gKiBcdmFye3l9fXtwcm9kdWN0IG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19e30KICAgXGxpbmVpaWl7XHZhcnt4fSAvIFx2YXJ7eX19e3F1b3RpZW50IG9mIFx2YXJ7eH0gYW5kIFx2YXJ7eX19eygxKX0KKyAgXGxpbmVpaWl7XHZhcnt4fSAvLyBcdmFye3l9fXsoZmxvb3JlZCkgcXVvdGllbnQgb2YgXHZhcnt4fSBhbmQgXHZhcnt5fX17KDUpfQogICBcbGluZWlpaXtcdmFye3h9IFwle30gXHZhcnt5fX17cmVtYWluZGVyIG9mIFxjb2Rle1x2YXJ7eH0gLyBcdmFye3l9fX17KDQpfQogICBcaGxpbmUKICAgXGxpbmVpaWl7LVx2YXJ7eH19e1x2YXJ7eH0gbmVnYXRlZH17fQpAQCAtMjk5LDYgKzMwMiw5IEBACiBcZGVwcmVjYXRlZHsyLjN9e0luc3RlYWQgY29udmVydCB0byBmbG9hdCB1c2luZyBcZnVuY3Rpb257YWJzKCl9CiBpZiBhcHByb3ByaWF0ZS59CiAKK1xpdGVtWyg1KV0KK0Fsc28gcmVmZXJyZWQgdG8gYXMgaW50ZWdlciBkaXZpc2lvbi4gIFRoZSByZXN1bHRhbnQgdmFsdWUgaXMgYSB3aG9sZSBpbnRlZ2VyLAordGhvdWdoIHRoZSByZXN1bHQncyB0eXBlIGlzIG5vdCBuZWNlc3NhcmlseSBpbnQuCiBcZW5ke2Rlc2NyaXB0aW9ufQogJSBYWFhKSCBleGNlcHRpb25zOiBvdmVyZmxvdyAod2hlbj8gd2hhdCBvcGVyYXRpb25zPykgemVyb2RpdmlzaW9uCiAKQEAgLTEyNzgsNyArMTI4NCw4IEBACiAgIFxsaW5laWlpe1x2YXJ7c30uYWRkKFx2YXJ7eH0pfXt9CiAgICAgICAgICB7YWRkIGVsZW1lbnQgXHZhcnt4fSB0byBzZXQgXHZhcntzfX0KICAgXGxpbmVpaWl7XHZhcntzfS5yZW1vdmUoXHZhcnt4fSl9e30KLSAgICAgICAgIHtyZW1vdmUgXHZhcnt4fSBmcm9tIHNldCBcdmFye3N9OyByYWlzZXMgS2V5RXJyb3IgaWYgbm90IHByZXNlbnR9CisgICAgICAgICB7cmVtb3ZlIFx2YXJ7eH0gZnJvbSBzZXQgXHZhcntzfTsgcmFpc2VzIFxleGNlcHRpb257S2V5RXJyb3J9CisJICBpZiBub3QgcHJlc2VudH0KICAgXGxpbmVpaWl7XHZhcntzfS5kaXNjYXJkKFx2YXJ7eH0pfXt9CiAgICAgICAgICB7cmVtb3ZlcyBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c30gaWYgcHJlc2VudH0KICAgXGxpbmVpaWl7XHZhcntzfS5wb3AoKX17fQpAQCAtMTQ5NSw2ICsxNTAyLDM4IEBACiAgIEFueSBvcGVyYXRpb24gd2hpY2ggcmVxdWlyZXMgdGhhdCB0aGUgZmlsZSBiZSBvcGVuIHdpbGwgcmFpc2UgYQogICBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGFmdGVyIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZC4gIENhbGxpbmcKICAgXG1ldGhvZHtjbG9zZSgpfSBtb3JlIHRoYW4gb25jZSBpcyBhbGxvd2VkLgorCisgIEFzIG9mIFB5dGhvbiAyLjUsIHlvdSBjYW4gYXZvaWQgaGF2aW5nIHRvIGNhbGwgdGhpcyBtZXRob2QgZXhwbGljaXRseQorICBpZiB5b3UgdXNlIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZworICBjb2RlIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSBcY29kZXtmfSB3aGVuIHRoZSBca2V5d29yZHt3aXRofSBibG9jaworICBpcyBleGl0ZWQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKword2l0aCBvcGVuKCJoZWxsby50eHQiKSBhcyBmOgorICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIHByaW50IGxpbmUKK1xlbmR7dmVyYmF0aW19CisKKyAgSW4gb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLCB5b3Ugd291bGQgaGF2ZSBuZWVkZWQgdG8gZG8gdGhpcyB0byBnZXQKKyAgdGhlIHNhbWUgZWZmZWN0OgorCitcYmVnaW57dmVyYmF0aW19CitmID0gb3BlbigiaGVsbG8udHh0IikKK3RyeToKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICBwcmludCBsaW5lCitmaW5hbGx5OgorICAgIGYuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworICBcbm90ZXtOb3QgYWxsIGBgZmlsZS1saWtlJycgdHlwZXMgaW4gUHl0aG9uIHN1cHBvcnQgdXNlIGFzIGEgY29udGV4dAorICBtYW5hZ2VyIGZvciB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LiAgSWYgeW91ciBjb2RlIGlzIGludGVuZGVkIHRvCisgIHdvcmsgd2l0aCBhbnkgZmlsZS1saWtlIG9iamVjdCwgeW91IGNhbiB1c2UgdGhlIFxmdW5jdGlvbntjbG9zaW5nKCl9CisgIGZ1bmN0aW9uIGluIHRoZSBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvYmplY3QKKyAgZGlyZWN0bHkuICBTZWUgc2VjdGlvbn5ccmVme2NvbnRleHQtY2xvc2luZ30gZm9yIGRldGFpbHMufQorICAKIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W2ZpbGVde2ZsdXNofXt9CkBAIC0xNzgzLDE0ICsxODIyLDE0IEBACiBhdHRyaWJ1dGUgd2lsbCBiZSBcY29kZXtOb25lfSBhbmQgaWYgY2FsbGVkLCBhbiBleHBsaWNpdCBcY29kZXtzZWxmfQogb2JqZWN0IG11c3QgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gIEluIHRoaXMgY2FzZSwKIFxjb2Rle3NlbGZ9IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIHVuYm91bmQgbWV0aG9kJ3MgY2xhc3MgKG9yIGEKLXN1YmNsYXNzIG9mIHRoYXQgY2xhc3MpLCBvdGhlcndpc2UgYSBcY29kZXtUeXBlRXJyb3J9IGlzIHJhaXNlZC4KK3N1YmNsYXNzIG9mIHRoYXQgY2xhc3MpLCBvdGhlcndpc2UgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaXMgcmFpc2VkLgogCiBMaWtlIGZ1bmN0aW9uIG9iamVjdHMsIG1ldGhvZHMgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcKIGFyYml0cmFyeSBhdHRyaWJ1dGVzLiAgSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5CiBzdG9yZWQgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0IChcY29kZXttZXRoLmltX2Z1bmN9KSwKIHNldHRpbmcgbWV0aG9kIGF0dHJpYnV0ZXMgb24gZWl0aGVyIGJvdW5kIG9yIHVuYm91bmQgbWV0aG9kcyBpcwogZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSByZXN1bHRzIGluIGEKLVxjb2Rle1R5cGVFcnJvcn0gYmVpbmcgcmFpc2VkLiAgSW4gb3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwKK1xleGNlcHRpb257VHlwZUVycm9yfSBiZWluZyByYWlzZWQuICBJbiBvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLAogeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OgogCiBcYmVnaW57dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4IGIvRG9jL2xpYi9saWJzdWJwcm9jZXNzLnRleAppbmRleCBmNDhiMjliLi40NDE3Nzk3IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CisrKyBiL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKQEAgLTEzNSw4ICsxMzUsOCBAQAogCiBcYmVnaW57ZnVuY2Rlc2N9e2NoZWNrX2NhbGx9eypwb3BlbmFyZ3MsICoqa3dhcmdzfQogUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiBJZiB0aGUgZXhpdAotY29kZSB3YXMgemVybyB0aGVuIHJldHVybiwgb3RoZXJ3aXNlIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZQotQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQorY29kZSB3YXMgemVybyB0aGVuIHJldHVybiwgb3RoZXJ3aXNlIHJhaXNlIFxleGNlcHRpb257Q2FsbGVkUHJvY2Vzc0Vycm9yLn0KK1RoZSBcZXhjZXB0aW9ue0NhbGxlZFByb2Nlc3NFcnJvcn0gb2JqZWN0IHdpbGwgaGF2ZSB0aGUgcmV0dXJuIGNvZGUgaW4gdGhlCiBcbWVtYmVye2Vycm5vfSBhdHRyaWJ1dGUuCiAKIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aHJlYWQudGV4IGIvRG9jL2xpYi9saWJ0aHJlYWQudGV4CmluZGV4IDQ5MTQ5NDguLjllMGMyMDIgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGhyZWFkLnRleAorKysgYi9Eb2MvbGliL2xpYnRocmVhZC50ZXgKQEAgLTEwMCw2ICsxMDAsMTkgQEAKIHNvbWUgdGhyZWFkLCBcY29kZXtGYWxzZX0gaWYgbm90LgogXGVuZHttZXRob2RkZXNjfQogCitJbiBhZGRpdGlvbiB0byB0aGVzZSBtZXRob2RzLCBsb2NrIG9iamVjdHMgY2FuIGFsc28gYmUgdXNlZCB2aWEgdGhlCitca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQsIGUuZy46CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCB0aHJlYWQKKworYV9sb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorCit3aXRoIGFfbG9jazoKKyAgICBwcmludCAiYV9sb2NrIGlzIGxvY2tlZCB3aGlsZSB0aGlzIGV4ZWN1dGVzIgorXGVuZHt2ZXJiYXRpbX0KKwogXHN0cm9uZ3tDYXZlYXRzOn0KIAogXGJlZ2lue2l0ZW1pemV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXggYi9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXgKaW5kZXggMzM4MzlhNC4uOGZiMzEzNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4CisrKyBiL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleApAQCAtNjc1LDMgKzY3NSwyNiBAQAogU3RvcCB0aGUgdGltZXIsIGFuZCBjYW5jZWwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGltZXIncyBhY3Rpb24uICBUaGlzCiB3aWxsIG9ubHkgd29yayBpZiB0aGUgdGltZXIgaXMgc3RpbGwgaW4gaXRzIHdhaXRpbmcgc3RhZ2UuCiBcZW5ke21ldGhvZGRlc2N9CisKK1xzdWJzZWN0aW9ue1VzaW5nIGxvY2tzLCBjb25kaXRpb25zLCBhbmQgc2VtYXBob3JlcyBpbiB0aGUgXGtleXdvcmR7d2l0aH0KK3N0YXRlbWVudCBcbGFiZWx7d2l0aC1sb2Nrc319CisKK0FsbCBvZiB0aGUgb2JqZWN0cyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSB0aGF0IGhhdmUgXG1ldGhvZHthY3F1aXJlKCl9IGFuZAorXG1ldGhvZHtyZWxlYXNlKCl9IG1ldGhvZHMgY2FuIGJlIHVzZWQgYXMgY29udGV4dCBtYW5hZ2VycyBmb3IgYSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50LiAgVGhlIFxtZXRob2R7YWNxdWlyZSgpfSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMKK2VudGVyZWQsIGFuZCBcbWV0aG9ke3JlbGVhc2UoKX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgZXhpdGVkLgorCitDdXJyZW50bHksIFxjbGFzc3tMb2NrfSwgXGNsYXNze1JMb2NrfSwgXGNsYXNze0NvbmRpdGlvbn0sIFxjbGFzc3tTZW1hcGhvcmV9LAorYW5kIFxjbGFzc3tCb3VuZGVkU2VtYXBob3JlfSBvYmplY3RzIG1heSBiZSB1c2VkIGFzIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQgY29udGV4dCBtYW5hZ2Vycy4gIEZvciBleGFtcGxlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitpbXBvcnQgdGhyZWFkaW5nCisKK3NvbWVfcmxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorCit3aXRoIHNvbWVfcmxvY2s6CisgICAgcHJpbnQgInNvbWVfcmxvY2sgaXMgbG9ja2VkIHdoaWxlIHRoaXMgZXhlY3V0ZXMiCitcZW5ke3ZlcmJhdGltfQorCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuZG9jLnRleCBiL0RvYy9saWIvbGlidW5kb2MudGV4CmluZGV4IDZjZWYxODMuLmRmNzgxNTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5kb2MudGV4CisrKyBiL0RvYy9saWIvbGlidW5kb2MudGV4CkBAIC00MiwxNSArNDIsMTUgQEAKIFxiZWdpbntkZXNjcmlwdGlvbn0KIFxpdGVtW1xtb2R1bGV7bnRwYXRofV0KIC0tLSBJbXBsZW1lbnRhdGlvbiBvZiBcbW9kdWxle29zLnBhdGh9IG9uIFdpbjMyLCBXaW42NCwgV2luQ0UsIGFuZAotT1MvMiBwbGF0Zm9ybXMuCisgICAgT1MvMiBwbGF0Zm9ybXMuCiAKIFxpdGVtW1xtb2R1bGV7cG9zaXhwYXRofV0KIC0tLSBJbXBsZW1lbnRhdGlvbiBvZiBcbW9kdWxle29zLnBhdGh9IG9uIFxQT1NJWC4KIAogXGl0ZW1bXG1vZHVsZXtic2RkYjE4NX1dCiAtLS0gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbW9kdWxlIGZvciBzeXN0ZW1zIHdoaWNoIHN0aWxsIHVzZSB0aGUgQmVya2VsZXkKLURCIDEuODUgbW9kdWxlLiAgSXQgaXMgbm9ybWFsbHkgb25seSBhdmFpbGFibGUgb24gY2VydGFpbiBCU0QgVW5peC1iYXNlZAotc3lzdGVtcy4gIEl0IHNob3VsZCBuZXZlciBiZSB1c2VkIGRpcmVjdGx5LgorICAgIERCIDEuODUgbW9kdWxlLiAgSXQgaXMgbm9ybWFsbHkgb25seSBhdmFpbGFibGUgb24gY2VydGFpbiBCU0QgVW5peC1iYXNlZAorICAgIHN5c3RlbXMuICBJdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKIApAQCAtNjIsMTQgKzYyLDE0IEBACiAKIFxpdGVtW1xtb2R1bGV7bGludXhhdWRpb2Rldn1dCiAtLS0gUGxheSBhdWRpbyBkYXRhIG9uIHRoZSBMaW51eCBhdWRpbyBkZXZpY2UuICBSZXBsYWNlZCBpbiBQeXRob24gMi4zCi1ieSB0aGUgXG1vZHVsZXtvc3NhdWRpb2Rldn0gbW9kdWxlLgorICAgIGJ5IHRoZSBcbW9kdWxle29zc2F1ZGlvZGV2fSBtb2R1bGUuCiAKIFxpdGVtW1xtb2R1bGV7c3VuYXVkaW99XQogLS0tIEludGVycHJldCBTdW4gYXVkaW8gaGVhZGVycyAobWF5IGJlY29tZSBvYnNvbGV0ZSBvciBhIHRvb2wvZGVtbykuCiAKIFxpdGVtW1xtb2R1bGV7dG9haWZmfV0KIC0tLSBDb252ZXJ0ICJhcmJpdHJhcnkiIHNvdW5kIGZpbGVzIHRvIEFJRkYgZmlsZXM7IHNob3VsZCBwcm9iYWJseQotYmVjb21lIGEgdG9vbCBvciBkZW1vLiAgUmVxdWlyZXMgdGhlIGV4dGVybmFsIHByb2dyYW0gXHByb2dyYW17c294fS4KKyAgICBiZWNvbWUgYSB0b29sIG9yIGRlbW8uICBSZXF1aXJlcyB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBccHJvZ3JhbXtzb3h9LgogXGVuZHtkZXNjcmlwdGlvbn0KIAogCkBAIC03OCwxMiArNzgsMTMgQEAKIFRoZXNlIG1vZHVsZXMgYXJlIG5vdCBub3JtYWxseSBhdmFpbGFibGUgZm9yIGltcG9ydDsgYWRkaXRpb25hbCB3b3JrCiBtdXN0IGJlIGRvbmUgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZS4KIAotVGhvc2Ugd2hpY2ggYXJlIHdyaXR0ZW4gaW4gUHl0aG9uIHdpbGwgYmUgaW5zdGFsbGVkIGludG8gdGhlIGRpcmVjdG9yeSAKLVxmaWxle2xpYi1vbGQvfSBpbnN0YWxsZWQgYXMgcGFydCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHVzZQotdGhlc2UsIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSBhZGRlZCB0byBcY29kZXtzeXMucGF0aH0sIHBvc3NpYmx5IHVzaW5nCi1cZW52dmFye1BZVEhPTlBBVEh9LgorJSUlIGxpYi1vbGQgaXMgZW1wdHkgYXMgb2YgUHl0aG9uIDIuNQorJSBUaG9zZSB3aGljaCBhcmUgd3JpdHRlbiBpbiBQeXRob24gd2lsbCBiZSBpbnN0YWxsZWQgaW50byB0aGUgZGlyZWN0b3J5IAorJSBcZmlsZXtsaWItb2xkL30gaW5zdGFsbGVkIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkuICBUbyB1c2UKKyUgdGhlc2UsIHRoZSBkaXJlY3RvcnkgbXVzdCBiZSBhZGRlZCB0byBcY29kZXtzeXMucGF0aH0sIHBvc3NpYmx5IHVzaW5nCislIFxlbnZ2YXJ7UFlUSE9OUEFUSH0uCiAKLU9ic29sZXRlIGV4dGVuc2lvbiBtb2R1bGVzIHdyaXR0ZW4gaW4gQyBhcmUgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuCitUaGVzZSBleHRlbnNpb24gbW9kdWxlcyB3cml0dGVuIGluIEMgYXJlIG5vdCBidWlsdCBieSBkZWZhdWx0LgogVW5kZXIgXFVOSVgsIHRoZXNlIG11c3QgYmUgZW5hYmxlZCBieSB1bmNvbW1lbnRpbmcgdGhlIGFwcHJvcHJpYXRlCiBsaW5lcyBpbiBcZmlsZXtNb2R1bGVzL1NldHVwfSBpbiB0aGUgYnVpbGQgdHJlZSBhbmQgZWl0aGVyIHJlYnVpbGRpbmcKIFB5dGhvbiBpZiB0aGUgbW9kdWxlcyBhcmUgc3RhdGljYWxseSBsaW5rZWQsIG9yIGJ1aWxkaW5nIGFuZApAQCAtOTIsMTIyICs5MywxMSBAQAogJSBYWFggbmVlZCBXaW5kb3dzIGluc3RydWN0aW9ucyEKIAogXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXG1vZHVsZXthZGRwYWNrfV0KLS0tLSBBbHRlcm5hdGUgYXBwcm9hY2ggdG8gcGFja2FnZXMuICBVc2UgdGhlIGJ1aWx0LWluIHBhY2thZ2Ugc3VwcG9ydAotaW5zdGVhZC4KLQotXGl0ZW1bXG1vZHVsZXtjbXB9XQotLS0tIEZpbGUgY29tcGFyaXNvbiBmdW5jdGlvbi4gIFVzZSB0aGUgbmV3ZXIgXHJlZm1vZHVsZXtmaWxlY21wfSBpbnN0ZWFkLgotCi1caXRlbVtcbW9kdWxle2NtcGNhY2hlfV0KLS0tLSBDYWNoaW5nIHZlcnNpb24gb2YgdGhlIG9ic29sZXRlIFxtb2R1bGV7Y21wfSBtb2R1bGUuICBVc2UgdGhlCi1uZXdlciBccmVmbW9kdWxle2ZpbGVjbXB9IGluc3RlYWQuCi0KLVxpdGVtW1xtb2R1bGV7Y29kZWhhY2t9XQotLS0tIEV4dHJhY3QgZnVuY3Rpb24gbmFtZSBvciBsaW5lIG51bWJlciBmcm9tIGEgZnVuY3Rpb24KLWNvZGUgb2JqZWN0ICh0aGVzZSBhcmUgbm93IGFjY2Vzc2libGUgYXMgYXR0cmlidXRlczoKLVxtZW1iZXJ7Y28uY29fbmFtZX0sIFxtZW1iZXJ7ZnVuYy5mdW5jX25hbWV9LAotXG1lbWJlcntjby5jb19maXJzdGxpbmVub30pLgotCi1caXRlbVtcbW9kdWxle2RpcmNtcH1dCi0tLS0gQ2xhc3MgdG8gYnVpbGQgZGlyZWN0b3J5IGRpZmYgdG9vbHMgb24gKG1heSBiZWNvbWUgYSBkZW1vIG9yIHRvb2wpLgotXGRlcHJlY2F0ZWR7Mi4wfXtUaGUgXHJlZm1vZHVsZXtmaWxlY21wfSBtb2R1bGUgcmVwbGFjZXMKLVxtb2R1bGV7ZGlyY21wfS59Ci0KLVxpdGVtW1xtb2R1bGV7ZHVtcH1dCi0tLS0gUHJpbnQgcHl0aG9uIGNvZGUgdGhhdCByZWNvbnN0cnVjdHMgYSB2YXJpYWJsZS4KLQotXGl0ZW1bXG1vZHVsZXtmbXR9XQotLS0tIFRleHQgZm9ybWF0dGluZyBhYnN0cmFjdGlvbnMgKHRvbyBzbG93KS4KLQotXGl0ZW1bXG1vZHVsZXtsb2NrZmlsZX1dCi0tLS0gV3JhcHBlciBhcm91bmQgRkNOVEwgZmlsZSBsb2NraW5nICh1c2UKLVxmdW5jdGlvbntmY250bC5sb2NrZigpfS9cZnVuY3Rpb257ZmxvY2soKX0gaW5zdGVhZDsgc2VlIFxyZWZtb2R1bGV7ZmNudGx9KS4KLQotXGl0ZW1bXG1vZHVsZXtuZXdkaXJ9XQotLS0tIE5ldyBcZnVuY3Rpb257ZGlyKCl9IGZ1bmN0aW9uICh0aGUgc3RhbmRhcmQgXGZ1bmN0aW9ue2RpcigpfSBpcwotbm93IGp1c3QgYXMgZ29vZCkuCi0KLVxpdGVtW1xtb2R1bGV7UGFyYX1dCi0tLS0gSGVscGVyIGZvciBcbW9kdWxle2ZtdH0uCi0KLVxpdGVtW1xtb2R1bGV7cG9seX1dCi0tLS0gUG9seW5vbWlhbHMuCi0KLVxpdGVtW1xtb2R1bGV7cmFuZH1dCi0tLS0gT2xkIGludGVyZmFjZSB0byB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCi0KLVxpdGVtW1xtb2R1bGV7cmVnZXh9XQotLS0tIEVtYWNzLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0OyBtYXkgc3RpbGwgYmUgdXNlZCBpbiBzb21lCi1vbGQgY29kZSAoZXh0ZW5zaW9uIG1vZHVsZSkuICBSZWZlciB0byB0aGUKLVxjaXRldGl0bGVbaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8xLjYvbGliL21vZHVsZS1yZWdleC5odG1sXXtQeXRob24KLTEuNiBEb2N1bWVudGF0aW9ufSBmb3IgZG9jdW1lbnRhdGlvbi4KLQotXGl0ZW1bXG1vZHVsZXtyZWdzdWJ9XQotLS0tIFJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBzdHJpbmcgcmVwbGFjZW1lbnQgdXRpbGl0aWVzLCBmb3IgdXNlCi13aXRoIFxtb2R1bGV7cmVnZXh9IChleHRlbnNpb24gbW9kdWxlKS4gIFJlZmVyIHRvIHRoZQotXGNpdGV0aXRsZVtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzEuNi9saWIvbW9kdWxlLXJlZ3N1Yi5odG1sXXtQeXRob24KLTEuNiBEb2N1bWVudGF0aW9ufSBmb3IgZG9jdW1lbnRhdGlvbi4KLQotXGl0ZW1bXG1vZHVsZXtzdGF0Y2FjaGV9XQotLS0tIENhY2hlcyB0aGUgcmVzdWx0cyBvZiBvcy5zdGF0KCkuICBVc2luZyB0aGUgY2FjaGUgY2FuIGJlIGZyYWdpbGUKLWFuZCBlcnJvci1wcm9uZSwganVzdCB1c2UgXGNvZGV7b3Muc3RhdCgpfSBkaXJlY3RseS4KLQotXGl0ZW1bXG1vZHVsZXt0Yn1dCi0tLS0gUHJpbnQgdHJhY2ViYWNrcywgd2l0aCBhIGR1bXAgb2YgbG9jYWwgdmFyaWFibGVzICh1c2UKLVxmdW5jdGlvbntwZGIucG0oKX0gb3IgXHJlZm1vZHVsZXt0cmFjZWJhY2t9IGluc3RlYWQpLgotCiBcaXRlbVtcbW9kdWxle3RpbWluZ31dCi0tLS0gTWVhc3VyZSB0aW1lIGludGVydmFscyB0byBoaWdoIHJlc29sdXRpb24gKHVzZQotXGZ1bmN0aW9ue3RpbWUuY2xvY2soKX0gaW5zdGVhZCkuICAoVGhpcyBpcyBhbiBleHRlbnNpb24gbW9kdWxlLikKLQotXGl0ZW1bXG1vZHVsZXt0enBhcnNlfV0KLS0tLSBQYXJzZSBhIHRpbWV6b25lIHNwZWNpZmljYXRpb24gKHVuZmluaXNoZWQ7IG1heSBkaXNhcHBlYXIgaW4gdGhlCi1mdXR1cmUsIGFuZCBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlIFxlbnZ2YXJ7VFp9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzCi1ub3Qgc2V0KS4KLQotXGl0ZW1bXG1vZHVsZXt1dGlsfV0KLS0tLSBVc2VmdWwgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZml0IGVsc2V3aGVyZS4KLQotXGl0ZW1bXG1vZHVsZXt3aGF0c291bmR9XQotLS0tIFJlY29nbml6ZSBzb3VuZCBmaWxlczsgdXNlIFxyZWZtb2R1bGV7c25kaGRyfSBpbnN0ZWFkLgotCi1caXRlbVtcbW9kdWxle3docmFuZG9tfV0KLS0tLSBPbGQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICBVc2UgXG1vZHVsZXtyYW5kb219IGluc3RlYWQuCi0KLVxpdGVtW1xtb2R1bGV7em1vZH1dCi0tLS0gQ29tcHV0ZSBwcm9wZXJ0aWVzIG9mIG1hdGhlbWF0aWNhbCBgYGZpZWxkcy4nJworLS0tIE1lYXN1cmUgdGltZSBpbnRlcnZhbHMgdG8gaGlnaCByZXNvbHV0aW9uICh1c2UgXGZ1bmN0aW9ue3RpbWUuY2xvY2soKX0KKyAgICBpbnN0ZWFkKS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKLQotVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBvYnNvbGV0ZSwgYnV0IGFyZSBsaWtlbHkgdG8gcmUtc3VyZmFjZSBhcwotdG9vbHMgb3Igc2NyaXB0czoKLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXG1vZHVsZXtmaW5kfV0KLS0tLSBGaW5kIGZpbGVzIG1hdGNoaW5nIHBhdHRlcm4gaW4gZGlyZWN0b3J5IHRyZWUuCi0KLVxpdGVtW1xtb2R1bGV7Z3JlcH1dCi0tLS0gXHByb2dyYW17Z3JlcH0gaW1wbGVtZW50YXRpb24gaW4gUHl0aG9uLgotCi1caXRlbVtcbW9kdWxle3BhY2ttYWlsfV0KLS0tLSBDcmVhdGUgYSBzZWxmLXVucGFja2luZyBcVU5JWHt9IHNoZWxsIGFyY2hpdmUuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KLVRoZSBmb2xsb3dpbmcgbW9kdWxlcyB3ZXJlIGRvY3VtZW50ZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsLCBidXQgYXJlIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgVGhlIHNvdXJjZSBmb3IgdGhlCi1kb2N1bWVudGF0aW9uIGlzIHN0aWxsIGF2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBkb2N1bWVudGF0aW9uIHNvdXJjZQotYXJjaGl2ZS4KLQotXGJlZ2lue2Rlc2NyaXB0aW9ufQotXGl0ZW1bXG1vZHVsZXtuaX1dCi0tLS0gSW1wb3J0IG1vZHVsZXMgaW4gYGBwYWNrYWdlcy4nJyAgQmFzaWMgcGFja2FnZSBzdXBwb3J0IGlzIG5vdwotYnVpbHQgaW4uICBUaGUgYnVpbHQtaW4gc3VwcG9ydCBpcyB2ZXJ5IHNpbWlsYXIgdG8gd2hhdCBpcyBwcm92aWRlZCBpbgotdGhpcyBtb2R1bGUuCi1cZW5ke2Rlc2NyaXB0aW9ufQotCi0KIFxzZWN0aW9ue1NHSS1zcGVjaWZpYyBFeHRlbnNpb24gbW9kdWxlc30KIAogVGhlIGZvbGxvd2luZyBhcmUgU0dJIHNwZWNpZmljLCBhbmQgbWF5IGJlIG91dCBvZiB0b3VjaCB3aXRoIHRoZQpAQCAtMjE5LDUgKzEwOSw1IEBACiAKIFxpdGVtW1xtb2R1bGV7c3Z9XQogLS0tIEludGVyZmFjZSB0byB0aGUgYGBzaW1wbGUgdmlkZW8nJyBib2FyZCBvbiBTR0kgSW5kaWdvCi0ob2Jzb2xldGUgaGFyZHdhcmUpLgorICAgIChvYnNvbGV0ZSBoYXJkd2FyZSkuCiBcZW5ke2Rlc2NyaXB0aW9ufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxsaWIyLnRleCBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKaW5kZXggNzA2YzU0Yi4uZTBjNDU2OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAorKysgYi9Eb2MvbGliL2xpYnVybGxpYjIudGV4CkBAIC0zODQsNyArMzg0LDcgQEAKICAgICBcbWV0aG9ke1x2YXJ7cHJvdG9jb2x9X29wZW4oKX0gYXJlIGNhbGxlZCB0byBoYW5kbGUgdGhlIHJlcXVlc3QuCiAgICAgVGhpcyBzdGFnZSBlbmRzIHdoZW4gYSBoYW5kbGVyIGVpdGhlciByZXR1cm5zIGEKICAgICBub24tXGNvbnN0YW50e05vbmV9IHZhbHVlIChpZS4gYSByZXNwb25zZSksIG9yIHJhaXNlcyBhbiBleGNlcHRpb24KLSAgICAodXN1YWxseSBVUkxFcnJvcikuICBFeGNlcHRpb25zIGFyZSBhbGxvd2VkIHRvIHByb3BhZ2F0ZS4KKyAgICAodXN1YWxseSBcZXhjZXB0aW9ue1VSTEVycm9yfSkuICBFeGNlcHRpb25zIGFyZSBhbGxvd2VkIHRvIHByb3BhZ2F0ZS4KIAogICAgIEluIGZhY3QsIHRoZSBhYm92ZSBhbGdvcml0aG0gaXMgZmlyc3QgdHJpZWQgZm9yIG1ldGhvZHMgbmFtZWQKICAgICBcbWV0aG9ke2RlZmF1bHRfb3Blbn0uICBJZiBhbGwgc3VjaCBtZXRob2RzIHJldHVybgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxwYXJzZS50ZXggYi9Eb2MvbGliL2xpYnVybHBhcnNlLnRleAppbmRleCA4ZjgwZDZiLi5mMThlZmU5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnVybHBhcnNlLnRleAorKysgYi9Eb2MvbGliL2xpYnVybHBhcnNlLnRleApAQCAtMjMsNTAgKzIzLDc2IEBACiBcY29kZXtmaWxlfSwgXGNvZGV7ZnRwfSwgXGNvZGV7Z29waGVyfSwgXGNvZGV7aGRsfSwgXGNvZGV7aHR0cH0sIAogXGNvZGV7aHR0cHN9LCBcY29kZXtpbWFwfSwgXGNvZGV7bWFpbHRvfSwgXGNvZGV7bW1zfSwgXGNvZGV7bmV3c30sIAogXGNvZGV7bm50cH0sIFxjb2Rle3Byb3NwZXJvfSwgXGNvZGV7cnN5bmN9LCBcY29kZXtydHNwfSwgXGNvZGV7cnRzcHV9LCAKLVxjb2Rle3NmdHB9LCBcY29kZXtzaHR0cH0sIFxjb2Rle3NpcH0sIFxjb2Rle3NuZXdzfSwgXGNvZGV7c3ZufSwgCitcY29kZXtzZnRwfSwgXGNvZGV7c2h0dHB9LCBcY29kZXtzaXB9LCBcY29kZXtzaXBzfSwgXGNvZGV7c25ld3N9LCBcY29kZXtzdm59LCAKIFxjb2Rle3N2bitzc2h9LCBcY29kZXt0ZWxuZXR9LCBcY29kZXt3YWlzfS4KLVx2ZXJzaW9uYWRkZWRbU3VwcG9ydCBmb3IgdGhlIFxjb2Rle3NmdHB9IHNjaGVtZV17Mi41fQorCitcdmVyc2lvbmFkZGVkW1N1cHBvcnQgZm9yIHRoZSBcY29kZXtzZnRwfSBhbmQgXGNvZGV7c2lwc30gc2NoZW1lc117Mi41fQogCiBUaGUgXG1vZHVsZXt1cmxwYXJzZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKLVxiZWdpbntmdW5jZGVzY317dXJscGFyc2V9e3VybHN0cmluZ1xvcHRpb25hbHssIGRlZmF1bHRfc2NoZW1lXG9wdGlvbmFseywgYWxsb3dfZnJhZ21lbnRzfX19Ci1QYXJzZSBhIFVSTCBpbnRvIDYgY29tcG9uZW50cywgcmV0dXJuaW5nIGEgNi10dXBsZTogKGFkZHJlc3NpbmcKLXNjaGVtZSwgbmV0d29yayBsb2NhdGlvbiwgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWdtZW50Ci1pZGVudGlmaWVyKS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGdlbmVyYWwgc3RydWN0dXJlIG9mIGEgVVJMOgorXGJlZ2lue2Z1bmNkZXNjfXt1cmxwYXJzZX17dXJsc3RyaW5nXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfc2NoZW1lXG9wdGlvbmFseywgYWxsb3dfZnJhZ21lbnRzfX19CitQYXJzZSBhIFVSTCBpbnRvIHNpeCBjb21wb25lbnRzLCByZXR1cm5pbmcgYSA2LXR1cGxlLiAgVGhpcworY29ycmVzcG9uZHMgdG8gdGhlIGdlbmVyYWwgc3RydWN0dXJlIG9mIGEgVVJMOgogXGNvZGV7XHZhcntzY2hlbWV9Oi8vXHZhcntuZXRsb2N9L1x2YXJ7cGF0aH07XHZhcntwYXJhbWV0ZXJzfT9cdmFye3F1ZXJ5fVwjXHZhcntmcmFnbWVudH19LgogRWFjaCB0dXBsZSBpdGVtIGlzIGEgc3RyaW5nLCBwb3NzaWJseSBlbXB0eS4KLVRoZSBjb21wb25lbnRzIGFyZSBub3QgYnJva2VuIHVwIGluIHNtYWxsZXIgcGFydHMgKGUuZy4gdGhlIG5ldHdvcmsKK1RoZSBjb21wb25lbnRzIGFyZSBub3QgYnJva2VuIHVwIGluIHNtYWxsZXIgcGFydHMgKGZvciBleGFtcGxlLCB0aGUgbmV0d29yawogbG9jYXRpb24gaXMgYSBzaW5nbGUgc3RyaW5nKSwgYW5kIFwlIGVzY2FwZXMgYXJlIG5vdCBleHBhbmRlZC4KLVRoZSBkZWxpbWl0ZXJzIGFzIHNob3duIGFib3ZlIGFyZSBub3QgcGFydCBvZiB0aGUgdHVwbGUgaXRlbXMsCitUaGUgZGVsaW1pdGVycyBhcyBzaG93biBhYm92ZSBhcmUgbm90IHBhcnQgb2YgdGhlIHJlc3VsdCwKIGV4Y2VwdCBmb3IgYSBsZWFkaW5nIHNsYXNoIGluIHRoZSBcdmFye3BhdGh9IGNvbXBvbmVudCwgd2hpY2ggaXMKLXJldGFpbmVkIGlmIHByZXNlbnQuCi0KLUV4YW1wbGU6CityZXRhaW5lZCBpZiBwcmVzZW50LiAgRm9yIGV4YW1wbGU6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLXVybHBhcnNlKCdodHRwOi8vd3d3LmN3aS5ubDo4MC8lN0VndWlkby9QeXRob24uaHRtbCcpCi1cZW5ke3ZlcmJhdGltfQotCi15aWVsZHMgdGhlIHR1cGxlCi0KLVxiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxwYXJzZQorPj4+IG8gPSB1cmxwYXJzZSgnaHR0cDovL3d3dy5jd2kubmw6ODAvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnKQorPj4+IG8KICgnaHR0cCcsICd3d3cuY3dpLm5sOjgwJywgJy8lN0VndWlkby9QeXRob24uaHRtbCcsICcnLCAnJywgJycpCis+Pj4gby5zY2hlbWUKKydodHRwJworPj4+IG8ucG9ydAorODAKKz4+PiBvLmdldHVybCgpCisnaHR0cDovL3d3dy5jd2kubmw6ODAvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnCiBcZW5ke3ZlcmJhdGltfQogCiBJZiB0aGUgXHZhcntkZWZhdWx0X3NjaGVtZX0gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBpdCBnaXZlcyB0aGUKLWRlZmF1bHQgYWRkcmVzc2luZyBzY2hlbWUsIHRvIGJlIHVzZWQgb25seSBpZiB0aGUgVVJMIHN0cmluZyBkb2VzIG5vdAorZGVmYXVsdCBhZGRyZXNzaW5nIHNjaGVtZSwgdG8gYmUgdXNlZCBvbmx5IGlmIHRoZSBVUkwgZG9lcyBub3QKIHNwZWNpZnkgb25lLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXJndW1lbnQgaXMgdGhlIGVtcHR5IHN0cmluZy4KIAotSWYgdGhlIFx2YXJ7YWxsb3dfZnJhZ21lbnRzfSBhcmd1bWVudCBpcyB6ZXJvLCBmcmFnbWVudCBpZGVudGlmaWVycworSWYgdGhlIFx2YXJ7YWxsb3dfZnJhZ21lbnRzfSBhcmd1bWVudCBpcyBmYWxzZSwgZnJhZ21lbnQgaWRlbnRpZmllcnMKIGFyZSBub3QgYWxsb3dlZCwgZXZlbiBpZiB0aGUgVVJMJ3MgYWRkcmVzc2luZyBzY2hlbWUgbm9ybWFsbHkgZG9lcwotc3VwcG9ydCB0aGVtLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXJndW1lbnQgaXMgXGNvZGV7MX0uCitzdXBwb3J0IHRoZW0uICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudCBpcyBcY29uc3RhbnR7VHJ1ZX0uCisKK1RoZSByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZgorXHB5dHlwZXt0dXBsZX0uICBUaGlzIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVhZC1vbmx5Citjb252ZW5pZW5jZSBhdHRyaWJ1dGVzOgorCitcYmVnaW57dGFibGVpdn17bHxjfGx8Y317bWVtYmVyfXtBdHRyaWJ1dGV9e0luZGV4fXtWYWx1ZX17VmFsdWUgaWYgbm90IHByZXNlbnR9CisgIFxsaW5laXZ7c2NoZW1lfSAgezB9IHtVUkwgc2NoZW1lIHNwZWNpZmllcn0gICAgICAgICAgICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntuZXRsb2N9ICB7MX0ge05ldHdvcmsgbG9jYXRpb24gcGFydH0gICAgICAgICAgICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e3BhdGh9ICAgIHsyfSB7SGllcmFyY2hpY2FsIHBhdGh9ICAgICAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7cGFyYW1zfSAgezN9IHtQYXJhbWV0ZXJzIGZvciBsYXN0IHBhdGggZWxlbWVudH0ge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntxdWVyeX0gICB7NH0ge1F1ZXJ5IGNvbXBvbmVudH0gICAgICAgICAgICAgICAgICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e2ZyYWdtZW50fXs1fSB7RnJhZ21lbnQgaWRlbnRpZmllcn0gICAgICAgICAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7dXNlcm5hbWV9eyB9IHtVc2VyIG5hbWV9ICAgICAgICAgICAgICAgICAgICAgICAge1xjb25zdGFudHtOb25lfX0KKyAgXGxpbmVpdntwYXNzd29yZH17IH0ge1Bhc3N3b3JkfSAgICAgICAgICAgICAgICAgICAgICAgICB7XGNvbnN0YW50e05vbmV9fQorICBcbGluZWl2e2hvc3RuYW1lfXsgfSB7SG9zdCBuYW1lIChsb3dlciBjYXNlKX0gICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19CisgIFxsaW5laXZ7cG9ydH0gICAgeyB9IHtQb3J0IG51bWJlciBhcyBpbnRlZ2VyLCBpZiBwcmVzZW50fSB7XGNvbnN0YW50e05vbmV9fQorXGVuZHt0YWJsZWl2fQorCitTZWUgc2VjdGlvbn5ccmVme3VybHBhcnNlLXJlc3VsdC1vYmplY3R9LCBgYFJlc3VsdHMgb2YKK1xmdW5jdGlvbnt1cmxwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3VybHNwbGl0KCl9LCcnIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KKworXHZlcnNpb25jaGFuZ2VkW0FkZGVkIGF0dHJpYnV0ZXMgdG8gcmV0dXJuIHZhbHVlXXsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e3VybHVucGFyc2V9e3R1cGxlfQotQ29uc3RydWN0IGEgVVJMIHN0cmluZyBmcm9tIGEgdHVwbGUgYXMgcmV0dXJuZWQgYnkgXGNvZGV7dXJscGFyc2UoKX0uCitcYmVnaW57ZnVuY2Rlc2N9e3VybHVucGFyc2V9e3BhcnRzfQorQ29uc3RydWN0IGEgVVJMIGZyb20gYSB0dXBsZSBhcyByZXR1cm5lZCBieSBcY29kZXt1cmxwYXJzZSgpfS4KK1RoZSBcdmFye3BhcnRzfSBhcmd1bWVudCBiZSBhbnkgc2l4LWl0ZW0gaXRlcmFibGUuCiBUaGlzIG1heSByZXN1bHQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCBlcXVpdmFsZW50IFVSTCwgaWYgdGhlCi1VUkwgdGhhdCB3YXMgcGFyc2VkIG9yaWdpbmFsbHkgaGFkIHJlZHVuZGFudCBkZWxpbWl0ZXJzLCBlLmcuIGEgPyB3aXRoCi1hbiBlbXB0eSBxdWVyeSAodGhlIGRyYWZ0IHN0YXRlcyB0aGF0IHRoZXNlIGFyZSBlcXVpdmFsZW50KS4KK1VSTCB0aGF0IHdhcyBwYXJzZWQgb3JpZ2luYWxseSBoYWQgdW5uZWNlc3NhcnkgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGUsCithID8gd2l0aCBhbiBlbXB0eSBxdWVyeTsgdGhlIFJGQyBzdGF0ZXMgdGhhdCB0aGVzZSBhcmUgZXF1aXZhbGVudCkuCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3VybHNwbGl0fXt1cmxzdHJpbmdcb3B0aW9uYWx7LApAQCAtNzksMTIgKzEwNSwzOCBAQAogc2VwYXJhdGUgdGhlIHBhdGggc2VnbWVudHMgYW5kIHBhcmFtZXRlcnMuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYQogNS10dXBsZTogKGFkZHJlc3Npbmcgc2NoZW1lLCBuZXR3b3JrIGxvY2F0aW9uLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQKIGlkZW50aWZpZXIpLgorCitUaGUgcmV0dXJuIHZhbHVlIGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YKK1xweXR5cGV7dHVwbGV9LiAgVGhpcyBjbGFzcyBoYXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlYWQtb25seQorY29udmVuaWVuY2UgYXR0cmlidXRlczoKKworXGJlZ2lue3RhYmxlaXZ9e2x8Y3xsfGN9e21lbWJlcn17QXR0cmlidXRlfXtJbmRleH17VmFsdWV9e1ZhbHVlIGlmIG5vdCBwcmVzZW50fQorICBcbGluZWl2e3NjaGVtZX0gICB7MH0ge1VSTCBzY2hlbWUgc3BlY2lmaWVyfSAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7bmV0bG9jfSAgIHsxfSB7TmV0d29yayBsb2NhdGlvbiBwYXJ0fSAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdntwYXRofSAgICAgezJ9IHtIaWVyYXJjaGljYWwgcGF0aH0gICAgICB7ZW1wdHkgc3RyaW5nfQorICBcbGluZWl2e3F1ZXJ5fSAgICB7M30ge1F1ZXJ5IGNvbXBvbmVudH0gICAgICAgIHtlbXB0eSBzdHJpbmd9CisgIFxsaW5laXZ7ZnJhZ21lbnR9IHs0fSB7RnJhZ21lbnQgaWRlbnRpZmllcn0gICAge2VtcHR5IHN0cmluZ30KKyAgXGxpbmVpdnt1c2VybmFtZX0geyB9IHtVc2VyIG5hbWV9ICAgICAgICAgICAgICB7XGNvbnN0YW50e05vbmV9fQorICBcbGluZWl2e3Bhc3N3b3JkfSB7IH0ge1Bhc3N3b3JkfSAgICAgICAgICAgICAgIHtcY29uc3RhbnR7Tm9uZX19CisgIFxsaW5laXZ7aG9zdG5hbWV9IHsgfSB7SG9zdCBuYW1lIChsb3dlciBjYXNlKX0ge1xjb25zdGFudHtOb25lfX0KKyAgXGxpbmVpdntwb3J0fSAgICAgeyB9IHtQb3J0IG51bWJlciBhcyBpbnRlZ2VyLCBpZiBwcmVzZW50fSB7XGNvbnN0YW50e05vbmV9fQorXGVuZHt0YWJsZWl2fQorCitTZWUgc2VjdGlvbn5ccmVme3VybHBhcnNlLXJlc3VsdC1vYmplY3R9LCBgYFJlc3VsdHMgb2YKK1xmdW5jdGlvbnt1cmxwYXJzZSgpfSBhbmQgXGZ1bmN0aW9ue3VybHNwbGl0KCl9LCcnIGZvciBtb3JlCitpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KKwogXHZlcnNpb25hZGRlZHsyLjJ9CitcdmVyc2lvbmNoYW5nZWRbQWRkZWQgYXR0cmlidXRlcyB0byByZXR1cm4gdmFsdWVdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKLVxiZWdpbntmdW5jZGVzY317dXJsdW5zcGxpdH17dHVwbGV9CitcYmVnaW57ZnVuY2Rlc2N9e3VybHVuc3BsaXR9e3BhcnRzfQogQ29tYmluZSB0aGUgZWxlbWVudHMgb2YgYSB0dXBsZSBhcyByZXR1cm5lZCBieSBcZnVuY3Rpb257dXJsc3BsaXQoKX0KIGludG8gYSBjb21wbGV0ZSBVUkwgYXMgYSBzdHJpbmcuCitUaGUgXHZhcntwYXJ0c30gYXJndW1lbnQgYmUgYW55IGZpdmUtaXRlbSBpdGVyYWJsZS4KK1RoaXMgbWF5IHJlc3VsdCBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IGVxdWl2YWxlbnQgVVJMLCBpZiB0aGUKK1VSTCB0aGF0IHdhcyBwYXJzZWQgb3JpZ2luYWxseSBoYWQgdW5uZWNlc3NhcnkgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGUsCithID8gd2l0aCBhbiBlbXB0eSBxdWVyeTsgdGhlIFJGQyBzdGF0ZXMgdGhhdCB0aGVzZSBhcmUgZXF1aXZhbGVudCkuCiBcdmVyc2lvbmFkZGVkezIuMn0KIFxlbmR7ZnVuY2Rlc2N9CiAKQEAgLTkzLDIyICsxNDUsMTYgQEAKIChcdmFye2Jhc2V9KSB3aXRoIGEgYGByZWxhdGl2ZSBVUkwnJyAoXHZhcnt1cmx9KS4gIEluZm9ybWFsbHksIHRoaXMKIHVzZXMgY29tcG9uZW50cyBvZiB0aGUgYmFzZSBVUkwsIGluIHBhcnRpY3VsYXIgdGhlIGFkZHJlc3Npbmcgc2NoZW1lLAogdGhlIG5ldHdvcmsgbG9jYXRpb24gYW5kIChwYXJ0IG9mKSB0aGUgcGF0aCwgdG8gcHJvdmlkZSBtaXNzaW5nCi1jb21wb25lbnRzIGluIHRoZSByZWxhdGl2ZSBVUkwuCi0KLUV4YW1wbGU6Citjb21wb25lbnRzIGluIHRoZSByZWxhdGl2ZSBVUkwuICBGb3IgZXhhbXBsZToKIAogXGJlZ2lue3ZlcmJhdGltfQotdXJsam9pbignaHR0cDovL3d3dy5jd2kubmwvJTdFZ3VpZG8vUHl0aG9uLmh0bWwnLCAnRkFRLmh0bWwnKQotXGVuZHt2ZXJiYXRpbX0KLQoteWllbGRzIHRoZSBzdHJpbmcKLQotXGJlZ2lue3ZlcmJhdGltfQorPj4+IGZyb20gdXJscGFyc2UgaW1wb3J0IHVybGpvaW4KKz4+PiB1cmxqb2luKCdodHRwOi8vd3d3LmN3aS5ubC8lN0VndWlkby9QeXRob24uaHRtbCcsICdGQVEuaHRtbCcpCiAnaHR0cDovL3d3dy5jd2kubmwvJTdFZ3VpZG8vRkFRLmh0bWwnCiBcZW5ke3ZlcmJhdGltfQogCi1UaGUgXHZhcnthbGxvd19mcmFnbWVudHN9IGFyZ3VtZW50IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvcgotXGNvZGV7dXJscGFyc2UoKX0uCitUaGUgXHZhcnthbGxvd19mcmFnbWVudHN9IGFyZ3VtZW50IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFuZCBkZWZhdWx0IGFzCitmb3IgXGZ1bmN0aW9ue3VybHBhcnNlKCl9LgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXt1cmxkZWZyYWd9e3VybH0KQEAgLTEzMywzICsxNzksNjEgQEAKICAgICAgICAgYm90aCBVbmlmb3JtIFJlc291cmNlIE5hbWVzIChVUk5zKSBhbmQgVW5pZm9ybSBSZXNvdXJjZQogICAgICAgICBMb2NhdG9ycyAoVVJMcykufQogXGVuZHtzZWVhbHNvfQorCisKK1xzdWJzZWN0aW9ue1Jlc3VsdHMgb2YgXGZ1bmN0aW9ue3VybHBhcnNlKCl9IGFuZCBcZnVuY3Rpb257dXJsc3BsaXQoKX0KKyAgICAgICAgICAgIFxsYWJlbHt1cmxwYXJzZS1yZXN1bHQtb2JqZWN0fX0KKworVGhlIHJlc3VsdCBvYmplY3RzIGZyb20gdGhlIFxmdW5jdGlvbnt1cmxwYXJzZSgpfSBhbmQKK1xmdW5jdGlvbnt1cmxzcGxpdCgpfSBmdW5jdGlvbnMgYXJlIHN1YmNsYXNzZXMgb2YgdGhlIFxweXR5cGV7dHVwbGV9Cit0eXBlLiAgVGhlc2Ugc3ViY2xhc3NlcyBhZGQgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmVkIGluIHRob3NlCitmdW5jdGlvbnMsIGFzIHdlbGwgYXMgcHJvdmlkZSBhbiBhZGRpdGlvbmFsIG1ldGhvZDoKKworXGJlZ2lue21ldGhvZGRlc2N9W1BhcnNlUmVzdWx0XXtnZXR1cmx9e30KKyAgUmV0dXJuIHRoZSByZS1jb21iaW5lZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBVUkwgYXMgYSBzdHJpbmcuCisgIFRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBvcmlnaW5hbCBVUkwgaW4gdGhhdCB0aGUgc2NoZW1lIHdpbGwgYWx3YXlzCisgIGJlIG5vcm1hbGl6ZWQgdG8gbG93ZXIgY2FzZSBhbmQgZW1wdHkgY29tcG9uZW50cyBtYXkgYmUgZHJvcHBlZC4KKyAgU3BlY2lmaWNhbGx5LCBlbXB0eSBwYXJhbWV0ZXJzLCBxdWVyaWVzLCBhbmQgZnJhZ21lbnQgaWRlbnRpZmllcnMKKyAgd2lsbCBiZSByZW1vdmVkLgorCisgIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgYSBmaXhwb2ludCBpZiBwYXNzZWQgYmFjayB0aHJvdWdoIHRoZQorICBvcmlnaW5hbCBwYXJzaW5nIGZ1bmN0aW9uOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gaW1wb3J0IHVybHBhcnNlCis+Pj4gdXJsID0gJ0hUVFA6Ly93d3cuUHl0aG9uLm9yZy9kb2MvIycKKworPj4+IHIxID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorPj4+IHIxLmdldHVybCgpCisnaHR0cDovL3d3dy5QeXRob24ub3JnL2RvYy8nCisKKz4+PiByMiA9IHVybHBhcnNlLnVybHNwbGl0KHIxLmdldHVybCgpKQorPj4+IHIyLmdldHVybCgpCisnaHR0cDovL3d3dy5QeXRob24ub3JnL2RvYy8nCitcZW5ke3ZlcmJhdGltfQorCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKworVGhlIGZvbGxvd2luZyBjbGFzc2VzIHByb3ZpZGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcGFyc2UgcmVzdWx0czo6CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtCYXNlUmVzdWx0fQorICBCYXNlIGNsYXNzIGZvciB0aGUgY29uY3JldGUgcmVzdWx0IGNsYXNzZXMuICBUaGlzIHByb3ZpZGVzIG1vc3Qgb2YKKyAgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4gIEl0IGRvZXMgbm90IHByb3ZpZGUgYSBcbWV0aG9ke2dldHVybCgpfQorICBtZXRob2QuICBJdCBpcyBkZXJpdmVkIGZyb20gXGNsYXNze3R1cGxlfSwgYnV0IGRvZXMgbm90IG92ZXJyaWRlIHRoZQorICBcbWV0aG9ke19faW5pdF9fKCl9IG9yIFxtZXRob2R7X19uZXdfXygpfSBtZXRob2RzLgorXGVuZHtjbGFzc2Rlc2MqfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e1BhcnNlUmVzdWx0fXtzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnR9CisgIENvbmNyZXRlIGNsYXNzIGZvciBcZnVuY3Rpb257dXJscGFyc2UoKX0gcmVzdWx0cy4gIFRoZQorICBcbWV0aG9ke19fbmV3X18oKX0gbWV0aG9kIGlzIG92ZXJyaWRkZW4gdG8gc3VwcG9ydCBjaGVja2luZyB0aGF0IHRoZQorICByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQuCitcZW5ke2NsYXNzZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtTcGxpdFJlc3VsdH17c2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudH0KKyAgQ29uY3JldGUgY2xhc3MgZm9yIFxmdW5jdGlvbnt1cmxzcGxpdCgpfSByZXN1bHRzLiAgVGhlCisgIFxtZXRob2R7X19uZXdfXygpfSBtZXRob2QgaXMgb3ZlcnJpZGRlbiB0byBzdXBwb3J0IGNoZWNraW5nIHRoYXQgdGhlCisgIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZC4KK1xlbmR7Y2xhc3NkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3YXJuaW5ncy50ZXggYi9Eb2MvbGliL2xpYndhcm5pbmdzLnRleAppbmRleCA4NjU1NDUxLi43YjgyOWEwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYndhcm5pbmdzLnRleAorKysgYi9Eb2MvbGliL2xpYndhcm5pbmdzLnRleApAQCAtMTY5LDcgKzE2OSw4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3dhcm5fZXhwbGljaXR9e21lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwKLSBsaW5lbm9cb3B0aW9uYWx7LCBtb2R1bGVcb3B0aW9uYWx7LCByZWdpc3RyeX19fQorIGxpbmVub1xvcHRpb25hbHssIG1vZHVsZVxvcHRpb25hbHssIHJlZ2lzdHJ5XG9wdGlvbmFseywKKyBtb2R1bGVfZ2xvYmFsc319fX0KIFRoaXMgaXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbmFsaXR5IG9mCiBcZnVuY3Rpb257d2FybigpfSwgcGFzc2luZyBpbiBleHBsaWNpdGx5IHRoZSBtZXNzYWdlLCBjYXRlZ29yeSwKIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIG9wdGlvbmFsbHkgdGhlIG1vZHVsZSBuYW1lIGFuZCB0aGUKQEAgLTE3OSw2ICsxODAsMTEgQEAKIFx2YXJ7bWVzc2FnZX0gbXVzdCBiZSBhIHN0cmluZyBhbmQgXHZhcntjYXRlZ29yeX0gYSBzdWJjbGFzcyBvZgogXGV4Y2VwdGlvbntXYXJuaW5nfSBvciBcdmFye21lc3NhZ2V9IG1heSBiZSBhIFxleGNlcHRpb257V2FybmluZ30gaW5zdGFuY2UsCiBpbiB3aGljaCBjYXNlIFx2YXJ7Y2F0ZWdvcnl9IHdpbGwgYmUgaWdub3JlZC4KKworXHZhcnttb2R1bGVfZ2xvYmFsc30sIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgdGhlIGdsb2JhbCBuYW1lc3BhY2UgaW4gdXNlCitieSB0aGUgY29kZSBmb3Igd2hpY2ggdGhlIHdhcm5pbmcgaXMgaXNzdWVkLiAgKFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0bworc3VwcG9ydCBkaXNwbGF5aW5nIHNvdXJjZSBmb3IgbW9kdWxlcyBmb3VuZCBpbiB6aXBmaWxlcyBvciBvdGhlcgorbm9uLWZpbGVzeXN0ZW0gaW1wb3J0IHNvdXJjZXMsIGFuZCB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4pCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3Nob3d3YXJuaW5nfXttZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnhtbHJwY2xpYi50ZXggYi9Eb2MvbGliL2xpYnhtbHJwY2xpYi50ZXgKaW5kZXggMGZiODhjNS4uMWMzNmY5OSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ4bWxycGNsaWIudGV4CisrKyBiL0RvYy9saWIvbGlieG1scnBjbGliLnRleApAQCAtMjAzLDcgKzIwMyw3IEBACiAKIFxzdWJzZWN0aW9ue0JpbmFyeSBPYmplY3RzIFxsYWJlbHtiaW5hcnktb2JqZWN0c319CiAKLVRoaXMgY2xhc3MgbWF5IGluaXRpYWxpemVkIGZyb20gc3RyaW5nIGRhdGEgKHdoaWNoIG1heSBpbmNsdWRlIE5VTHMpLgorVGhpcyBjbGFzcyBtYXkgYmUgaW5pdGlhbGl6ZWQgZnJvbSBzdHJpbmcgZGF0YSAod2hpY2ggbWF5IGluY2x1ZGUgTlVMcykuCiBUaGUgcHJpbWFyeSBhY2Nlc3MgdG8gdGhlIGNvbnRlbnQgb2YgYSBcY2xhc3N7QmluYXJ5fSBvYmplY3QgaXMKIHByb3ZpZGVkIGJ5IGFuIGF0dHJpYnV0ZToKIApAQCAtMzAzLDEwICszMDMsNiBAQAogXGNvZGV7VHJ1ZX0gb3IgXGNvZGV7RmFsc2V9LgogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXtiaW5hcnl9e2RhdGF9Ci1Ucml2aWFsbHkgY29udmVydCBhbnkgUHl0aG9uIHN0cmluZyB0byBhIFxjbGFzc3tCaW5hcnl9IG9iamVjdC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KIFxiZWdpbntmdW5jZGVzY317ZHVtcHN9e3BhcmFtc1xvcHRpb25hbHssIG1ldGhvZG5hbWVcb3B0aW9uYWx7LCAKIAkgICAgICAgICAgICAgICAgbWV0aG9kcmVzcG9uc2Vcb3B0aW9uYWx7LCBlbmNvZGluZ1xvcHRpb25hbHssCiAJICAgICAgICAgICAgICAgIGFsbG93X25vbmV9fX19fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ6aXBmaWxlLnRleCBiL0RvYy9saWIvbGliemlwZmlsZS50ZXgKaW5kZXggMzJjYTNlMC4uNGUwNmVmNiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ6aXBmaWxlLnRleAorKysgYi9Eb2MvbGliL2xpYnppcGZpbGUudGV4CkBAIC0xNDEsMTAgKzE0MSwxNyBAQAogICBXcml0ZSB0aGUgZmlsZSBuYW1lZCBcdmFye2ZpbGVuYW1lfSB0byB0aGUgYXJjaGl2ZSwgZ2l2aW5nIGl0IHRoZQogICBhcmNoaXZlIG5hbWUgXHZhcnthcmNuYW1lfSAoYnkgZGVmYXVsdCwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzCiAgIFx2YXJ7ZmlsZW5hbWV9LCBidXQgd2l0aG91dCBhIGRyaXZlIGxldHRlciBhbmQgd2l0aCBsZWFkaW5nIHBhdGgKLSAgc2VwYXJhdG9ycyByZW1vdmVkKS4gIElmIGdpdmVuLCBcdmFye2NvbXByZXNzX3R5cGV9IG92ZXJyaWRlcyB0aGUgdmFsdWUKLSAgZ2l2ZW4gZm9yIHRoZSBcdmFye2NvbXByZXNzaW9ufSBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yIGZvcgotICB0aGUgbmV3IGVudHJ5LiAgVGhlIGFyY2hpdmUgbXVzdCBiZSBvcGVuIHdpdGggbW9kZSBcY29kZXsndyd9IG9yCi0gIFxjb2RleydhJ30uCisgIHNlcGFyYXRvcnMgcmVtb3ZlZCkuICBJZiBnaXZlbiwgXHZhcntjb21wcmVzc190eXBlfSBvdmVycmlkZXMgdGhlCisgIHZhbHVlIGdpdmVuIGZvciB0aGUgXHZhcntjb21wcmVzc2lvbn0gcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3RvcgorICBmb3IgdGhlIG5ldyBlbnRyeS4gIFRoZSBhcmNoaXZlIG11c3QgYmUgb3BlbiB3aXRoIG1vZGUgXGNvZGV7J3cnfQorICBvciBcY29kZXsnYSd9LgorICAKKyAgXG5vdGV7VGhlcmUgaXMgbm8gb2ZmaWNpYWwgZmlsZSBuYW1lIGVuY29kaW5nIGZvciBaSVAgZmlsZXMuCisgIElmIHlvdSBoYXZlIHVuaWNvZGUgZmlsZSBuYW1lcywgcGxlYXNlIGNvbnZlcnQgdGhlbSB0byBieXRlIHN0cmluZ3MKKyAgaW4geW91ciBkZXNpcmVkIGVuY29kaW5nIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gXG1ldGhvZHt3cml0ZSgpfS4KKyAgV2luWmlwIGludGVycHJldHMgYWxsIGZpbGUgbmFtZXMgYXMgZW5jb2RlZCBpbiBDUDQzNywgYWxzbyBrbm93bgorICBhcyBET1MgTGF0aW4ufQorCiAgIFxub3Rle0FyY2hpdmUgbmFtZXMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBhcmNoaXZlIHJvb3QsIHRoYXQgaXMsCiAgICAgICAgIHRoZXkgc2hvdWxkIG5vdCBzdGFydCB3aXRoIGEgcGF0aCBzZXBhcmF0b3IufQogXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4IGIvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4CmluZGV4IDBhNjBiMjkuLjc3MGVhMjEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliemlwaW1wb3J0LnRleAorKysgYi9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXgKQEAgLTY5LDggKzY5LDggQEAKIAogXGJlZ2lue2NsYXNzZGVzY317emlwaW1wb3J0ZXJ9e2FyY2hpdmVwYXRofSAKICAgQ3JlYXRlIGEgbmV3IHppcGltcG9ydGVyIGluc3RhbmNlLiBcdmFye2FyY2hpdmVwYXRofSBtdXN0IGJlIGEgcGF0aCB0bwotICBhIHppcGZpbGUuICBcY2xhc3N7WmlwSW1wb3J0RXJyb3J9IGlzIHJhaXNlZCBpZiBcdmFye2FyY2hpdmVwYXRofSBkb2Vzbid0Ci0gIHBvaW50IHRvIGEgdmFsaWQgWklQIGFyY2hpdmUuCisgIGEgemlwZmlsZS4gIFxleGNlcHRpb257WmlwSW1wb3J0RXJyb3J9IGlzIHJhaXNlZCBpZiBcdmFye2FyY2hpdmVwYXRofQorICBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgWklQIGFyY2hpdmUuCiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmRfbW9kdWxlfXtmdWxsbmFtZVxvcHRpb25hbHssIHBhdGh9fQpAQCAtODMsNyArODMsNyBAQAogCiBcYmVnaW57bWV0aG9kZGVzY317Z2V0X2NvZGV9e2Z1bGxuYW1lfQogICBSZXR1cm4gdGhlIGNvZGUgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gUmFpc2UKLSAgXGNsYXNze1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLgorICBcZXhjZXB0aW9ue1ppcEltcG9ydEVycm9yfSBpZiB0aGUgbW9kdWxlIGNvdWxkbid0IGJlIGZvdW5kLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317Z2V0X2RhdGF9e3BhdGhuYW1lfQpAQCAtOTMsMjAgKzkzLDIwIEBACiAKIFxiZWdpbnttZXRob2RkZXNjfXtnZXRfc291cmNlfXtmdWxsbmFtZX0KICAgUmV0dXJuIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuIFJhaXNlCi0gIFxjbGFzc3taaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZCwgcmV0dXJuCisgIFxleGNlcHRpb257WmlwSW1wb3J0RXJyb3J9IGlmIHRoZSBtb2R1bGUgY291bGRuJ3QgYmUgZm91bmQsIHJldHVybgogICBcY29uc3RhbnR7Tm9uZX0gaWYgdGhlIGFyY2hpdmUgZG9lcyBjb250YWluIHRoZSBtb2R1bGUsIGJ1dCBoYXMKICAgbm8gc291cmNlIGZvciBpdC4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2lzX3BhY2thZ2V9e2Z1bGxuYW1lfQogICBSZXR1cm4gVHJ1ZSBpZiB0aGUgbW9kdWxlIHNwZWNpZmllZCBieSBcdmFye2Z1bGxuYW1lfSBpcyBhIHBhY2thZ2UuCi0gIFJhaXNlIFxjbGFzc3taaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZC4KKyAgUmFpc2UgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaWYgdGhlIG1vZHVsZSBjb3VsZG4ndCBiZSBmb3VuZC4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2xvYWRfbW9kdWxlfXtmdWxsbmFtZX0KICAgTG9hZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBieSBcdmFye2Z1bGxuYW1lfS4gXHZhcntmdWxsbmFtZX0gbXVzdCBiZSB0aGUKICAgZnVsbHkgcXVhbGlmaWVkIChkb3R0ZWQpIG1vZHVsZSBuYW1lLiBJdCByZXR1cm5zIHRoZSBpbXBvcnRlZAotICBtb2R1bGUsIG9yIHJhaXNlcyBcY2xhc3N7WmlwSW1wb3J0RXJyb3J9IGlmIGl0IHdhc24ndCBmb3VuZC4KKyAgbW9kdWxlLCBvciByYWlzZXMgXGV4Y2VwdGlvbntaaXBJbXBvcnRFcnJvcn0gaWYgaXQgd2Fzbid0IGZvdW5kLgogXGVuZHttZXRob2RkZXNjfQogCiBcc3Vic2VjdGlvbntFeGFtcGxlc30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliemxpYi50ZXggYi9Eb2MvbGliL2xpYnpsaWIudGV4CmluZGV4IDJkZjhiODUuLmRmYmI0M2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliemxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJ6bGliLnRleApAQCAtMTY2LDExICsxNjYsMTQgQEAKIGRlY29tcHJlc3NlZCwgYW5kIFxtZW1iZXJ7dW5jb25zdW1lZF90YWlsfSBpcyBhbiBlbXB0eSBzdHJpbmcuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVxiZWdpbnttZXRob2RkZXNjfVtEZWNvbXByZXNzXXtmbHVzaH17fQorXGJlZ2lue21ldGhvZGRlc2N9W0RlY29tcHJlc3Nde2ZsdXNofXtcb3B0aW9uYWx7bGVuZ3RofX0KIEFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwgYW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZwogdW5jb21wcmVzc2VkIG91dHB1dCBpcyByZXR1cm5lZC4gIEFmdGVyIGNhbGxpbmcgXG1ldGhvZHtmbHVzaCgpfSwgdGhlCiBcbWV0aG9ke2RlY29tcHJlc3MoKX0gbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgYWdhaW47IHRoZSBvbmx5IHJlYWxpc3RpYwogYWN0aW9uIGlzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgorCitUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIFx2YXJ7bGVuZ3RofSBzZXRzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlCitvdXRwdXQgYnVmZmVyLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57c2VlYWxzb30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbWltZWxpYi50ZXggYi9Eb2MvbGliL21pbWVsaWIudGV4CmluZGV4IDY3ZGU1OTcuLjQ5MWQ4NDQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbWltZWxpYi50ZXgKKysrIGIvRG9jL2xpYi9taW1lbGliLnRleApAQCAtMTIsOSArMTIsOSBAQAogXGF1dGhvcmFkZHJlc3N7XGVtYWlse2JhcnJ5QHB5dGhvbi5vcmd9fQogCiBcZGF0ZXtcdG9kYXl9Ci1ccmVsZWFzZXszLjB9CQkJJSBzb2Z0d2FyZSByZWxlYXNlLCBub3QgZG9jdW1lbnRhdGlvbgorXHJlbGVhc2V7NC4wfQkJCSUgc29mdHdhcmUgcmVsZWFzZSwgbm90IGRvY3VtZW50YXRpb24KIFxzZXRyZWxlYXNlaW5mb3t9CQklIGVtcHR5IGZvciBmaW5hbCByZWxlYXNlCi1cc2V0c2hvcnR2ZXJzaW9uezMuMH0JCSUgbWFqb3IubWlub3Igb25seSBmb3Igc29mdHdhcmUKK1xzZXRzaG9ydHZlcnNpb257NC4wfQkJJSBtYWpvci5taW5vciBvbmx5IGZvciBzb2Z0d2FyZQogCiBcYmVnaW57ZG9jdW1lbnR9CiAKQEAgLTM4LDExICszOCwxMSBAQAogcGFyc2UsIGdlbmVyYXRlLCBhbmQgbW9kaWZ5IGVtYWlsIG1lc3NhZ2VzLCBjb25mb3JtaW5nIHRvIGFsbCB0aGUKIHJlbGV2YW50IGVtYWlsIGFuZCBNSU1FIHJlbGF0ZWQgUkZDcy4KIAotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdmVyc2lvbiAzLjAgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UsIHdoaWNoIGlzCi1kaXN0cmlidXRlZCB3aXRoIFB5dGhvbiAyLjQgYW5kIGlzIGF2YWlsYWJsZSBhcyBhIHN0YW5kYWxvbmUgZGlzdHV0aWxzLWJhc2VkCi1wYWNrYWdlIGZvciB1c2Ugd2l0aCBQeXRob24gMi4zLiAgXG1vZHVsZXtlbWFpbH0gMy4wIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKLVB5dGhvbiB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMi4zLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1cbW9kdWxle2VtYWlsfSBwYWNrYWdlLCBpbmNsdWRpbmcgZG93bmxvYWQgbGlua3MgYW5kIG1haWxpbmcgbGlzdHMsIHNlZQorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdmVyc2lvbiA0LjAgb2YgdGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UsIHdoaWNoIGlzCitkaXN0cmlidXRlZCB3aXRoIFB5dGhvbiAyLjUgYW5kIGlzIGF2YWlsYWJsZSBhcyBhIHN0YW5kYWxvbmUgZGlzdHV0aWxzLWJhc2VkCitwYWNrYWdlIGZvciB1c2Ugd2l0aCBlYXJsaWVyIFB5dGhvbiB2ZXJzaW9ucy4gIFxtb2R1bGV7ZW1haWx9IDQuMCBpcyBub3QKK2NvbXBhdGlibGUgd2l0aCBQeXRob24gdmVyc2lvbnMgZWFybGllciB0aGFuIDIuMy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgXG1vZHVsZXtlbWFpbH0gcGFja2FnZSwgaW5jbHVkaW5nIGRvd25sb2FkIGxpbmtzIGFuZCBtYWlsaW5nIGxpc3RzLCBzZWUKIFx1bGlua3tQeXRob24ncyBlbWFpbCBTSUd9e2h0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2VtYWlsLXNpZ30uCiAKIFRoZSBkb2N1bWVudGF0aW9uIHRoYXQgZm9sbG93cyB3YXMgd3JpdHRlbiBmb3IgdGhlIFB5dGhvbiBwcm9qZWN0LCBzbwpAQCAtNTEsNyArNTEsOCBAQAogCiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtIERlcHJlY2F0aW9uIGFuZCBgYHZlcnNpb24gYWRkZWQnJyBub3RlcyBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICBQeXRob24gdmVyc2lvbiBhIGZlYXR1cmUgd2FzIGFkZGVkIG9yIGRlcHJlY2F0ZWQuCisgICAgICBQeXRob24gdmVyc2lvbiBhIGZlYXR1cmUgd2FzIGFkZGVkIG9yIGRlcHJlY2F0ZWQuICBTZWUKKyAgICAgIHRoZSBwYWNrYWdlIGhpc3RvcnkgaW4gc2VjdGlvbiBccmVme2VtYWlsLXBrZy1oaXN0b3J5fSBmb3IgZGV0YWlscy4KIAogXGl0ZW0gSWYgeW91J3JlIHJlYWRpbmcgdGhpcyBkb2N1bWVudGF0aW9uIGFzIHBhcnQgb2YgdGhlCiAgICAgICBzdGFuZGFsb25lIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UsIHNvbWUgb2YgdGhlIGludGVybmFsIGxpbmtzIHRvCmRpZmYgLS1naXQgYS9Eb2MvbGliL3htbGRvbW1pbmlkb20udGV4IGIvRG9jL2xpYi94bWxkb21taW5pZG9tLnRleAppbmRleCBmNzY1N2ViLi4wOTM5MTVmIDEwMDY0NAotLS0gYS9Eb2MvbGliL3htbGRvbW1pbmlkb20udGV4CisrKyBiL0RvYy9saWIveG1sZG9tbWluaWRvbS50ZXgKQEAgLTE2NSw3ICsxNjUsNyBAQAogCiBXaXRoIGFuIGV4cGxpY2l0IFx2YXJ7ZW5jb2Rpbmd9IGFyZ3VtZW50LCB0aGUgcmVzdWx0IGlzIGEgYnl0ZSBzdHJpbmcKIGluIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBhcmd1bWVudCBpcwotYWx3YXlzIHNwZWNpZmllZC4gVG8gYXZvaWQgVW5pY29kZUVycm9yIGV4Y2VwdGlvbnMgaW4gY2FzZSBvZgorYWx3YXlzIHNwZWNpZmllZC4gVG8gYXZvaWQgXGV4Y2VwdGlvbntVbmljb2RlRXJyb3J9IGV4Y2VwdGlvbnMgaW4gY2FzZSBvZgogdW5yZXByZXNlbnRhYmxlIHRleHQgZGF0YSwgdGhlIGVuY29kaW5nIGFyZ3VtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQKIGFzICJ1dGYtOCIuCiAKZGlmZiAtLWdpdCBhL0RvYy9weXRob24tZG9jcy50eHQgYi9Eb2MvcHl0aG9uLWRvY3MudHh0CmluZGV4IDAxN2ZlY2UuLmJmNDc1YjYgMTAwNjQ0Ci0tLSBhL0RvYy9weXRob24tZG9jcy50eHQKKysrIGIvRG9jL3B5dGhvbi1kb2NzLnR4dApAQCAtMTgwLDQgKzE4MCw0IEBACiAgICAgICB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZW1vdmUsIHNlZSB0aGUgIldoeSBpcyBQeXRob24gSW5zdGFsbGVkIG9uCiAgICAgICBteSBDb21wdXRlcj8iIEZBUSwgZm91bmQgYXQ6CiAKLSAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS9pbnN0YWxsZWQuaHRtbAorICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL2luc3RhbGxlZC8KZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmMy50ZXggYi9Eb2MvcmVmL3JlZjMudGV4CmluZGV4IDczN2I4NjEuLjk2NDAxM2YgMTAwNjQ0Ci0tLSBhL0RvYy9yZWYvcmVmMy50ZXgKKysrIGIvRG9jL3JlZi9yZWYzLnRleApAQCAtMTAzNSw3ICsxMDM1LDcgQEAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntOZXctc3R5bGUgYW5kIGNsYXNzaWMgY2xhc3Nlc30KIAotQ2xhc3NlcyBhbmQgaW5zdGFuY2VzIGNvbWUgaW4gdHdvIGZsYXZvdXJzOiBvbGQtc3R5bGUgb3IgY2xhc3NpYywgYW5kIG5ldy1zdHlsZS4gIAorQ2xhc3NlcyBhbmQgaW5zdGFuY2VzIGNvbWUgaW4gdHdvIGZsYXZvcnM6IG9sZC1zdHlsZSBvciBjbGFzc2ljLCBhbmQgbmV3LXN0eWxlLiAgCiAKIFVwIHRvIFB5dGhvbiAyLjEsIG9sZC1zdHlsZSBjbGFzc2VzIHdlcmUgdGhlIG9ubHkgZmxhdm91ciBhdmFpbGFibGUgdG8gdGhlCiB1c2VyLiAgVGhlIGNvbmNlcHQgb2YgKG9sZC1zdHlsZSkgY2xhc3MgaXMgdW5yZWxhdGVkIHRvIHRoZSBjb25jZXB0IG9mIHR5cGU6IGlmCkBAIC0xMDY1LDEwICsxMDY1LDE0IEBACiBpbXBsZW1lbnRlZCBiZWZvcmUgZm9yIGNvbXBhdGliaWxpdHkgY29uY2VybnMsIGxpa2UgdGhlIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyCiBpbiBjYXNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlLgogCi1UaGlzIG1hbnVlbCBpcyBub3QgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gbmV3LXN0eWxlIGNsYXNzZXMuICBGb3Igbm93LAorVGhpcyBtYW51YWwgaXMgbm90IHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIG5ldy1zdHlsZSBjbGFzc2VzLiAgRm9yIG5vdywKIHBsZWFzZSBzZWUgXHVybHtodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL25ld3N0eWxlLmh0bWx9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1UaGUgcGxhbiBpcyB0byBldmVudHVhbGx5IGRyb3Agb2xkLXN0eWxlIGNsYXNzZXMsIGxlYXZpbmcgb25seSB0aGUgc2VtYW50aWNzIG9mIG5ldy1zdHlsZSBjbGFzc2VzLiAgVGhpcyBjaGFuZ2Ugd2lsbCBwcm9iYWJseSBvbmx5IGJlIGZlYXNpYmxlIGluIFB5dGhvbiAzLjAuCitUaGUgcGxhbiBpcyB0byBldmVudHVhbGx5IGRyb3Agb2xkLXN0eWxlIGNsYXNzZXMsIGxlYXZpbmcgb25seSB0aGUgc2VtYW50aWNzIG9mCituZXctc3R5bGUgY2xhc3Nlcy4gIFRoaXMgY2hhbmdlIHdpbGwgcHJvYmFibHkgb25seSBiZSBmZWFzaWJsZSBpbiBQeXRob24gMy4wLgorXGluZGV4e2NsYXNzfXtuZXctc3R5bGV9CitcaW5kZXh7Y2xhc3N9e2NsYXNzaWN9CitcaW5kZXh7Y2xhc3N9e29sZC1zdHlsZX0KIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1NwZWNpYWwgbWV0aG9kIG5hbWVzXGxhYmVse3NwZWNpYWxuYW1lc319CkBAIC0yMDUzLDE0ICsyMDU3LDE1IEBACiBcaXRlbQogCiBFeGNlcHRpb24gdG8gdGhlIHByZXZpb3VzIGl0ZW06IGlmIHRoZSBsZWZ0IG9wZXJhbmQgaXMgYW4gaW5zdGFuY2Ugb2YKLWEgYnVpbHQtaW4gdHlwZSBvciBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByaWdodCBvcGVyYW5kIGlzIGFuCi1pbnN0YW5jZSBvZiBhIHByb3BlciBzdWJjbGFzcyBvZiB0aGF0IHR5cGUgb3IgY2xhc3MsIHRoZSByaWdodAotb3BlcmFuZCdzIFxtZXRob2R7X19yb3BfXygpfSBtZXRob2QgaXMgdHJpZWQgXGVtcGh7YmVmb3JlfSB0aGUgbGVmdAotb3BlcmFuZCdzIFxtZXRob2R7X19vcF9fKCl9IG1ldGhvZC4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGEgc3ViY2xhc3MgY2FuCi1jb21wbGV0ZWx5IG92ZXJyaWRlIGJpbmFyeSBvcGVyYXRvcnMuICBPdGhlcndpc2UsIHRoZSBsZWZ0IG9wZXJhbmQncwotX19vcF9fIG1ldGhvZCB3b3VsZCBhbHdheXMgYWNjZXB0IHRoZSByaWdodCBvcGVyYW5kOiB3aGVuIGFuIGluc3RhbmNlCi1vZiBhIGdpdmVuIGNsYXNzIGlzIGV4cGVjdGVkLCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoYXQgY2xhc3MKLWlzIGFsd2F5cyBhY2NlcHRhYmxlLgorYSBidWlsdC1pbiB0eXBlIG9yIGEgbmV3LXN0eWxlIGNsYXNzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQgaXMgYW4gaW5zdGFuY2UKK29mIGEgcHJvcGVyIHN1YmNsYXNzIG9mIHRoYXQgdHlwZSBvciBjbGFzcyBhbmQgb3ZlcnJpZGVzIHRoZSBiYXNlJ3MKK1xtZXRob2R7X19yb3BfXygpfSBtZXRob2QsIHRoZSByaWdodCBvcGVyYW5kJ3MgXG1ldGhvZHtfX3JvcF9fKCl9IG1ldGhvZAoraXMgdHJpZWQgXGVtcGh7YmVmb3JlfSB0aGUgbGVmdCBvcGVyYW5kJ3MgXG1ldGhvZHtfX29wX18oKX0gbWV0aG9kLgorCitUaGlzIGlzIGRvbmUgc28gdGhhdCBhIHN1YmNsYXNzIGNhbiBjb21wbGV0ZWx5IG92ZXJyaWRlIGJpbmFyeSBvcGVyYXRvcnMuCitPdGhlcndpc2UsIHRoZSBsZWZ0IG9wZXJhbmQncyBcbWV0aG9ke19fb3BfXygpfSBtZXRob2Qgd291bGQgYWx3YXlzCithY2NlcHQgdGhlIHJpZ2h0IG9wZXJhbmQ6IHdoZW4gYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzcyBpcyBleHBlY3RlZCwKK2FuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyBpcyBhbHdheXMgYWNjZXB0YWJsZS4KIAogXGl0ZW0KIApAQCAtMjEwNiwzICsyMTExLDYzIEBACiBcZnVuY3Rpb257Y29lcmNlKCl9IGZ1bmN0aW9uLgogCiBcZW5ke2l0ZW1pemV9CisKK1xzdWJzZWN0aW9ue0NvbnRleHQgTWFuYWdlcnMgYW5kIENvbnRleHRzXGxhYmVse2NvbnRleHQtbWFuYWdlcnN9fQorCitcdmVyc2lvbmFkZGVkezIuNX0KKworQSBcZGZue2NvbnRleHQgbWFuYWdlcn0gaXMgYW4gb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgZW50cnkgdG8sIGFuZCBleGl0Citmcm9tLCBhIFxkZm57Y29udGV4dH0gc3Vycm91bmRpbmcgYSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUKK25vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCAoZGVzY3JpYmVkIGluCitzZWN0aW9uflxyZWZ7d2l0aH0pLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpcgorbWV0aG9kcy4KK1xzdGluZGV4e3dpdGh9CitcaW5kZXh7Y29udGV4dCBtYW5hZ2VyfQorXGluZGV4e2NvbnRleHR9CisKK1R5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91cwora2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZAorZmlsZXMsIGV0Yy4KKworXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHQgbWFuYWdlcl17X19jb250ZXh0X199e3NlbGZ9CitJbnZva2VkIHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGFzIHRoZSBjb250ZXh0IGV4cHJlc3Npb24gb2YgYQorXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGltcGxlbWVudAorXG1ldGhvZHtfX2VudGVyX18oKX0gYW5kIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcy4gIFNpbXBsZSBjb250ZXh0CittYW5hZ2VycyB0aGF0IHdpc2ggdG8gZGlyZWN0bHkKK2ltcGxlbWVudCBcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBzaG91bGQganVzdAorcmV0dXJuIFx2YXJ7c2VsZn0uCisKK0NvbnRleHQgbWFuYWdlcnMgd3JpdHRlbiBpbiBQeXRob24gY2FuIGFsc28gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHVzaW5nCithIGdlbmVyYXRvciBmdW5jdGlvbiBkZWNvcmF0ZWQgd2l0aCB0aGUKK1xmdW5jdGlvbntjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyfSBkZWNvcmF0b3IsIGFzIHRoaXMgY2FuIGJlIHNpbXBsZXIKK3RoYW4gd3JpdGluZyBpbmRpdmlkdWFsIFxtZXRob2R7X19lbnRlcl9fKCl9IGFuZCBcbWV0aG9ke19fZXhpdF9fKCl9CittZXRob2RzIHdoZW4gdGhlIHN0YXRlIHRvIGJlIG1hbmFnZWQgaXMgY29tcGxleC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHRde19fZW50ZXJfX317c2VsZn0KK0VudGVyIHRoZSBjb250ZXh0IGRlZmluZWQgYnkgdGhpcyBvYmplY3QuIFRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQKK3dpbGwgYmluZCB0aGlzIG1ldGhvZCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpIHNwZWNpZmllZCBpbiB0aGUKK1xrZXl3b3Jke2FzfSBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bY29udGV4dF17X19leGl0X199e2V4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFja30KK0V4aXQgdGhlIGNvbnRleHQgZGVmaW5lZCBieSB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmUgdGhlCitleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGUgY29udGV4dCB3YXMKK2V4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsIGJlCitcY29uc3RhbnR7Tm9uZX0uCisKK0lmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZQorZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZCByZXR1cm4gYQordHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkIG5vcm1hbGx5IHVwb24KK2V4aXQgZnJvbSB0aGlzIG1ldGhvZC4KKworTm90ZSB0aGF0IFxtZXRob2R7X19leGl0X199IG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW4KK2V4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICBcc2VlcGVwezAzNDN9e1RoZSAid2l0aCIgc3RhdGVtZW50fQorICAgICAgICAge1RoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZQorICAgICAgICAgIFB5dGhvbiBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQufQorXGVuZHtzZWVhbHNvfQorCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjYudGV4IGIvRG9jL3JlZi9yZWY2LnRleAppbmRleCBkMWQyM2FjLi4xZWIxMjU4IDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjYudGV4CisrKyBiL0RvYy9yZWYvcmVmNi50ZXgKQEAgLTQ4OCwxMSArNDg4LDEyIEBACiBpbnZva2VkLCB0aGUgZnVuY3Rpb24gY2FuIHByb2NlZWQgZXhhY3RseSBhcyBpZiB0aGUgXGtleXdvcmR7eWllbGR9CiBzdGF0ZW1lbnQgd2VyZSBqdXN0IGFub3RoZXIgZXh0ZXJuYWwgY2FsbC4KIAotVGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIFxrZXl3b3Jke3RyeX0KLWNsYXVzZSBvZiBhIFxrZXl3b3Jke3RyeX0gLi4uXCBca2V5d29yZHtmaW5hbGx5fSBjb25zdHJ1Y3QuICBUaGUKLWRpZmZpY3VsdHkgaXMgdGhhdCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGUgZ2VuZXJhdG9yIHdpbGwgZXZlciBiZQotcmVzdW1lZCwgaGVuY2Ugbm8gZ3VhcmFudGVlIHRoYXQgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGJsb2NrIHdpbGwgZXZlcgotZ2V0IGV4ZWN1dGVkLgorQXMgb2YgUHl0aG9uIHZlcnNpb24gMi41LCB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBub3cKK2FsbG93ZWQgaW4gdGhlIFxrZXl3b3Jke3RyeX0gY2xhdXNlIG9mIGEgXGtleXdvcmR7dHJ5fSAuLi5cIAorXGtleXdvcmR7ZmluYWxseX0gY29uc3RydWN0LiAgSWYgdGhlIGdlbmVyYXRvciBpcyBub3QgcmVzdW1lZCBiZWZvcmUKK2l0IGlzIGZpbmFsaXplZCAoYnkgcmVhY2hpbmcgYSB6ZXJvIHJlZmVyZW5jZSBjb3VudCBvciBieSBiZWluZyBnYXJiYWdlCitjb2xsZWN0ZWQpLCB0aGUgZ2VuZXJhdG9yLWl0ZXJhdG9yJ3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2Qgd2lsbCBiZQorY2FsbGVkLCBhbGxvd2luZyBhbnkgcGVuZGluZyBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2VzIHRvIGV4ZWN1dGUuCiAKIFxiZWdpbntub3RpY2V9CiBJbiBQeXRob24gMi4yLCB0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQKQEAgLTUxMCw2ICs1MTEsMTEgQEAKICAgXHNlZXBlcHswMjU1fXtTaW1wbGUgR2VuZXJhdG9yc30KICAgICAgICAgIHtUaGUgcHJvcG9zYWwgZm9yIGFkZGluZyBnZW5lcmF0b3JzIGFuZCB0aGUgXGtleXdvcmR7eWllbGR9CiAgICAgICAgICAgc3RhdGVtZW50IHRvIFB5dGhvbi59CisKKyAgXHNlZXBlcHswMzQyfXtDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzfQorICAgICAgICAge1RoZSBwcm9wb3NhbCB0aGF0LCBhbW9uZyBvdGhlciBnZW5lcmF0b3IgZW5oYW5jZW1lbnRzLAorICAgICAgICAgIHByb3Bvc2VkIGFsbG93aW5nIFxrZXl3b3Jke3lpZWxkfSB0byBhcHBlYXIgaW5zaWRlIGEKKyAgICAgICAgICBca2V5d29yZHt0cnl9IC4uLiBca2V5d29yZHtmaW5hbGx5fSBibG9jay59CiBcZW5ke3NlZWFsc299CiAKIApkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY3LnRleCBiL0RvYy9yZWYvcmVmNy50ZXgKaW5kZXggOTA2MjdhNC4uYTJkNDZhOCAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY3LnRleAorKysgYi9Eb2MvcmVmL3JlZjcudGV4CkBAIC00Niw2ICs0Niw3IEBACiAgIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbnt3aGlsZV9zdG10fX0KICAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2Zvcl9zdG10fX0KICAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3RyeV9zdG10fX0KKyAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue3dpdGhfc3RtdH19CiAgIFxwcm9kdWN0aW9uY29udHt8IFx0b2tlbntmdW5jZGVmfX0KICAgXHByb2R1Y3Rpb25jb250e3wgXHRva2Vue2NsYXNzZGVmfX0KICAgXHByb2R1Y3Rpb257c3VpdGV9CkBAIC0zMDUsOCArMzA2LDc1IEBACiBcc2VjdGlvbntUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50XGxhYmVse3dpdGh9fQogXHN0aW5kZXh7d2l0aH0KIAotVGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBzcGVjaWZpZXMgCitcdmVyc2lvbmFkZGVkezIuNX0KIAorVGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrCit3aXRoIG1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlCitzZWN0aW9uflxyZWZ7Y29udGV4dC1tYW5hZ2Vyc30pLiBUaGlzIGFsbG93cyBjb21tb24KK1xrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9Li4uXGtleXdvcmR7ZmluYWxseX0gdXNhZ2UgcGF0dGVybnMgdG8KK2JlIGVuY2Fwc3VsYXRlZCBhcyBjb250ZXh0IG1hbmFnZXJzIGZvciBjb252ZW5pZW50IHJldXNlLgorCitcYmVnaW57cHJvZHVjdGlvbmxpc3R9CisgIFxwcm9kdWN0aW9ue3dpdGhfc3RtdH0KKyAgeyJ3aXRoIiBcdG9rZW57ZXhwcmVzc2lvbn0gWyJhcyIgdGFyZ2V0X2xpc3RdICI6IiBcdG9rZW57c3VpdGV9fQorXGVuZHtwcm9kdWN0aW9ubGlzdH0KKworVGhlIGV4ZWN1dGlvbiBvZiB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHByb2NlZWRzIGFzIGZvbGxvd3M6CisKK1xiZWdpbntlbnVtZXJhdGV9CisKK1xpdGVtIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyCitvYmplY3QuCisKK1xpdGVtIFRoZSBjb250ZXh0IG1hbmFnZXIncyBcbWV0aG9ke19fY29udGV4dF9fKCl9IG1ldGhvZCBpcyBpbnZva2VkIHRvCitvYnRhaW4gYSBjb250ZXh0IG9iamVjdC4KKworXGl0ZW0gVGhlIGNvbnRleHQgb2JqZWN0J3MgXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kIGlzIGludm9rZWQuCisKK1xpdGVtIElmIGEgdGFyZ2V0IGxpc3Qgd2FzIGluY2x1ZGVkIGluIHRoZSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50LCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gXG1ldGhvZHtfX2VudGVyX18oKX0gaXMgYXNzaWduZWQgdG8gaXQuCisKK1xub3Rle1RoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZQorXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbgorXG1ldGhvZHtfX2V4aXRfXygpfSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycworZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZSB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzCithbiBlcnJvciBvY2N1cnJpbmcgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy59CisKK1xpdGVtIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC4KKworXGl0ZW0gVGhlIGNvbnRleHQgb2JqZWN0J3MgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QgaXMgaW52b2tlZC4gSWYgYW4KK2V4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmQKK3RyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBcbWV0aG9ke19fZXhpdF9fKCl9LiBPdGhlcndpc2UsCit0aHJlZSBcY29uc3RhbnR7Tm9uZX0gYXJndW1lbnRzIGFyZSBzdXBwbGllZC4KKworSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4KK3ZhbHVlIGZyb20gdGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcworcmVyYWlzZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kCitleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQuCisKK0lmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGUKK3JldHVybiB2YWx1ZSBmcm9tIFxtZXRob2R7X19leGl0X18oKX0gaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkcworYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi4KKworXGVuZHtlbnVtZXJhdGV9CisKK1xiZWdpbntub3RpY2V9CitJbiBQeXRob24gMi41LCB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZAord2hlbiB0aGUgXGNvZGV7d2l0aF9zdGF0ZW1lbnR9IGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gIEl0IHdpbGwgYWx3YXlzCitiZSBlbmFibGVkIGluIFB5dGhvbiAyLjYuICBUaGlzIFxjb2Rle19fZnV0dXJlX199IGltcG9ydCBzdGF0ZW1lbnQgY2FuCitiZSB1c2VkIHRvIGVuYWJsZSB0aGUgZmVhdHVyZToKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorXGVuZHt2ZXJiYXRpbX0KK1xlbmR7bm90aWNlfQorCitcYmVnaW57c2VlYWxzb30KKyAgXHNlZXBlcHswMzQzfXtUaGUgIndpdGgiIHN0YXRlbWVudH0KKyAgICAgICAgIHtUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUKKyAgICAgICAgICBQeXRob24gXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50Ln0KK1xlbmR7c2VlYWxzb30KIAogXHNlY3Rpb257RnVuY3Rpb24gZGVmaW5pdGlvbnNcbGFiZWx7ZnVuY3Rpb259fQogXGluZGV4aWl7ZnVuY3Rpb259e2RlZmluaXRpb259CmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvcHJlY2htLnB5IGIvRG9jL3Rvb2xzL3ByZWNobS5weQppbmRleCA3YjJmMzkzLi41N2E0M2ZkIDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvcHJlY2htLnB5CisrKyBiL0RvYy90b29scy9wcmVjaG0ucHkKQEAgLTE1MCw2ICsxNTAsMjIgQEAKICMgTGlicmFyeSBEb2MgbGlzdCBvZiBib29rczoKICMgZWFjaCAnYm9vaycgOiAoRGlyLCBUaXRsZSwgRmlyc3QgcGFnZSwgQ29udGVudCBwYWdlLCBJbmRleCBwYWdlKQogc3VwcG9ydGVkX2xpYnJhcmllcyA9IHsKKyAgICAnMi41JzoKKyAgICBbCisgICAgICAgIEJvb2soJy4nLCAnTWFpbiBwYWdlJywgJ2luZGV4JyksCisgICAgICAgIEJvb2soJy4nLCAnR2xvYmFsIE1vZHVsZSBJbmRleCcsICdtb2RpbmRleCcpLAorICAgICAgICBCb29rKCd3aGF0c25ldycsICJXaGF0J3MgTmV3IiwgJ2luZGV4JywgJ2NvbnRlbnRzJyksCisgICAgICAgIEJvb2soJ3R1dCcsJ1R1dG9yaWFsJywndHV0Jywnbm9kZTInKSwKKyAgICAgICAgQm9vaygnbGliJywnTGlicmFyeSBSZWZlcmVuY2UnLCdsaWInLCdjb250ZW50cycsJ2dlbmluZGV4JyksCisgICAgICAgIEJvb2soJ3JlZicsJ0xhbmd1YWdlIFJlZmVyZW5jZScsJ3JlZicsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKKyAgICAgICAgQm9vaygnbWFjJywnTWFjaW50b3NoIFJlZmVyZW5jZScsJ21hYycsJ2NvbnRlbnRzJywnZ2VuaW5kZXgnKSwKKyAgICAgICAgQm9vaygnZXh0JywnRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcnLCdleHQnLCdjb250ZW50cycpLAorICAgICAgICBCb29rKCdhcGknLCdQeXRob24vQyBBUEknLCdhcGknLCdjb250ZW50cycsJ2dlbmluZGV4JyksCisgICAgICAgIEJvb2soJ2RvYycsJ0RvY3VtZW50aW5nIFB5dGhvbicsJ2RvYycsJ2NvbnRlbnRzJyksCisgICAgICAgIEJvb2soJ2luc3QnLCdJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzJywgJ2luc3QnLCAnaW5kZXgnKSwKKyAgICAgICAgQm9vaygnZGlzdCcsJ0Rpc3RyaWJ1dGluZyBQeXRob24gTW9kdWxlcycsICdkaXN0JywgJ2luZGV4JywgJ2dlbmluZGV4JyksCisgICAgXSwKKwogICAgICcyLjQnOgogICAgIFsKICAgICAgICAgQm9vaygnLicsICdNYWluIHBhZ2UnLCAnaW5kZXgnKSwKZGlmZiAtLWdpdCBhL0RvYy90b29scy90b2MyYmttLnB5IGIvRG9jL3Rvb2xzL3RvYzJia20ucHkKaW5kZXggNjM2NDU5YS4uYWI2NjliYSAxMDA3NTUKLS0tIGEvRG9jL3Rvb2xzL3RvYzJia20ucHkKKysrIGIvRG9jL3Rvb2xzL3RvYzJia20ucHkKQEAgLTQ0LDYgKzQ0LDIwIEBACiBJTkNMVURFRF9MRVZFTFMgPSAoImNoYXB0ZXIiLCAic2VjdGlvbiIsICJzdWJzZWN0aW9uIiwgInN1YnN1YnNlY3Rpb24iKQogCiAKK2NsYXNzIEJhZFNlY3Rpb25OZXN0aW5nKEV4Y2VwdGlvbik6CisgICAgIiIiUmFpc2VkIGZvciB1bnN1cHBvcnRlZCBzZWN0aW9uIGxldmVsIHRyYW5zaXRpb25zLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsLCBuZXdzZWN0aW9uLCBwYXRoLCBsaW5lbm8pOgorICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKKyAgICAgICAgc2VsZi5uZXdzZWN0aW9uID0gbmV3c2VjdGlvbgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgiaWxsZWdhbCB0cmFuc2l0aW9uIGZyb20gJXMgdG8gJXMgYXQgJXMgKGxpbmUgJXMpIgorICAgICAgICAgICAgICAgICUgKHNlbGYubGV2ZWwsIHNlbGYubmV3c2VjdGlvbiwgc2VsZi5wYXRoLCBzZWxmLmxpbmVubykpCisKKwogZGVmIHBhcnNlX3RvYyhmcCwgYmlncGFydD1Ob25lKToKICAgICB0b2MgPSB0b3AgPSBbXQogICAgIHN0YWNrID0gW3RvY10KQEAgLTY1LDcgKzc5LDEwIEBACiAgICAgICAgICAgICAgICAgaWYgc3R5cGUgbm90IGluIElOQ0xVREVEX0xFVkVMUzoKICAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHBhcmFncmFwaHMgJiBzdWJwYXJhZ3JhcGhzCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gX3RyYW5zaXRpb25fbWFwWyhsZXZlbCwgc3R5cGUpXQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gX3RyYW5zaXRpb25fbWFwWyhsZXZlbCwgc3R5cGUpXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkU2VjdGlvbk5lc3RpbmcobGV2ZWwsIHN0eXBlLCBmcC5uYW1lLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgaWYgZGlyZWN0aW9uID09IE9VVEVSX1RPX0lOTkVSOgogICAgICAgICAgICAgICAgICAgICB0b2MgPSB0b2NbLTFdWy0xXQogICAgICAgICAgICAgICAgICAgICBzdGFjay5pbnNlcnQoMCwgdG9jKQpkaWZmIC0tZ2l0IGEvRG9jL3R1dC90dXQudGV4IGIvRG9jL3R1dC90dXQudGV4CmluZGV4IDA1NDk4NWIuLjdmOWE3ZWUgMTAwNjQ0Ci0tLSBhL0RvYy90dXQvdHV0LnRleAorKysgYi9Eb2MvdHV0L3R1dC50ZXgKQEAgLTEwMTIsNyArMTAxMiw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBBc3NpZ25tZW50IHRvIHNsaWNlcyBpcyBhbHNvIHBvc3NpYmxlLCBhbmQgdGhpcyBjYW4gZXZlbiBjaGFuZ2UgdGhlIHNpemUKLW9mIHRoZSBsaXN0Ogorb2YgdGhlIGxpc3Qgb3IgY2xlYXIgaXQgZW50aXJlbHk6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiAjIFJlcGxhY2Ugc29tZSBpdGVtczoKQEAgLTEwMjcsOSArMTAyNywxNCBAQAogLi4uIGFbMToxXSA9IFsnYmxldGNoJywgJ3h5enp5J10KID4+PiBhCiBbMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KLT4+PiBhWzowXSA9IGEgICAgICMgSW5zZXJ0IChhIGNvcHkgb2YpIGl0c2VsZiBhdCB0aGUgYmVnaW5uaW5nCis+Pj4gIyBJbnNlcnQgKGEgY29weSBvZikgaXRzZWxmIGF0IHRoZSBiZWdpbm5pbmcKKz4+PiBhWzowXSA9IGEKID4+PiBhCiBbMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNCwgMTIzLCAnYmxldGNoJywgJ3h5enp5JywgMTIzNF0KKz4+PiAjIENsZWFyIHRoZSBsaXN0OiByZXBsYWNlIGFsbCBpdGVtcyB3aXRoIGFuIGVtcHR5IGxpc3QKKz4+PiBhWzpdID0gW10KKz4+PiBhCitbXQogXGVuZHt2ZXJiYXRpbX0KIAogVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIFxmdW5jdGlvbntsZW4oKX0gYWxzbyBhcHBsaWVzIHRvIGxpc3RzOgpAQCAtMjAyMyw5ICsyMDI4LDkgQEAKIFRoZXJlIGlzIGEgd2F5IHRvIHJlbW92ZSBhbiBpdGVtIGZyb20gYSBsaXN0IGdpdmVuIGl0cyBpbmRleCBpbnN0ZWFkCiBvZiBpdHMgdmFsdWU6IHRoZSBca2V5d29yZHtkZWx9IHN0YXRlbWVudC4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZQogXG1ldGhvZHtwb3AoKX0pIG1ldGhvZCB3aGljaCByZXR1cm5zIGEgdmFsdWUuICBUaGUgXGtleXdvcmR7ZGVsfQotc3RhdGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgdG8KLXJlbW92ZSBzbGljZXMgZnJvbSBhIGxpc3QgKHdoaWNoIHdlIGRpZCBlYXJsaWVyIGJ5IGFzc2lnbm1lbnQgb2YgYW4KLWVtcHR5IGxpc3QgdG8gdGhlIHNsaWNlKS4gIEZvciBleGFtcGxlOgorc3RhdGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVtb3ZlIHNsaWNlcyBmcm9tIGEgbGlzdCBvciBjbGVhciB0aGUKK2VudGlyZSBsaXN0ICh3aGljaCB3ZSBkaWQgZWFybGllciBieSBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IGxpc3QgdG8KK3RoZSBzbGljZSkuICBGb3IgZXhhbXBsZToKIAogXGJlZ2lue3ZlcmJhdGltfQogPj4+IGEgPSBbLTEsIDEsIDY2LjI1LCAzMzMsIDMzMywgMTIzNC41XQpAQCAtMjAzNSw2ICsyMDQwLDkgQEAKID4+PiBkZWwgYVsyOjRdCiA+Pj4gYQogWzEsIDY2LjI1LCAxMjM0LjVdCis+Pj4gZGVsIGFbOl0KKz4+PiBhCitbXQogXGVuZHt2ZXJiYXRpbX0KIAogXGtleXdvcmR7ZGVsfSBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlbGV0ZSBlbnRpcmUgdmFyaWFibGVzOgpAQCAtMzcxMCwxOSArMzcxOCw0OSBAQAogS2V5Ym9hcmRJbnRlcnJ1cHQKIFxlbmR7dmVyYmF0aW19CiAKLUEgXGVtcGh7ZmluYWxseSBjbGF1c2V9IGlzIGV4ZWN1dGVkIHdoZXRoZXIgb3Igbm90IGFuIGV4Y2VwdGlvbiBoYXMKLW9jY3VycmVkIGluIHRoZSB0cnkgY2xhdXNlLiAgV2hlbiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLCBpdCBpcwotcmUtcmFpc2VkIGFmdGVyIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyBleGVjdXRlZC4gIFRoZSBmaW5hbGx5IGNsYXVzZSBpcwotYWxzbyBleGVjdXRlZCBgYG9uIHRoZSB3YXkgb3V0Jycgd2hlbiB0aGUgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgaXMKLWxlZnQgdmlhIGEgXGtleXdvcmR7YnJlYWt9IG9yIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50LgorQSBcZW1waHtmaW5hbGx5IGNsYXVzZX0gaXMgYWx3YXlzIGV4ZWN1dGVkIGJlZm9yZSBsZWF2aW5nIHRoZQorXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQsIHdoZXRoZXIgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBvciBub3QuCitXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgaW4gdGhlIFxrZXl3b3Jke3RyeX0gY2xhdXNlIGFuZCBoYXMgbm90CitiZWVuIGhhbmRsZWQgYnkgYW4gXGtleXdvcmR7ZXhjZXB0fSBjbGF1c2UgKG9yIGl0IGhhcyBvY2N1cnJlZCBpbiBhCitca2V5d29yZHtleGNlcHR9IG9yIFxrZXl3b3Jke2Vsc2V9IGNsYXVzZSksIGl0IGlzIHJlLXJhaXNlZCBhZnRlciB0aGUKK1xrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSBoYXMgYmVlbiBleGVjdXRlZC4gIFRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UKK2lzIGFsc28gZXhlY3V0ZWQgYGBvbiB0aGUgd2F5IG91dCcnIHdoZW4gYW55IG90aGVyIGNsYXVzZSBvZiB0aGUKK1xrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGlzIGxlZnQgdmlhIGEgXGtleXdvcmR7YnJlYWt9LCBca2V5d29yZHtjb250aW51ZX0KK29yIFxrZXl3b3Jke3JldHVybn0gc3RhdGVtZW50LiAgQSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGU6CiAKLVRoZSBjb2RlIGluIHRoZSBmaW5hbGx5IGNsYXVzZSBpcyB1c2VmdWwgZm9yIHJlbGVhc2luZyBleHRlcm5hbAotcmVzb3VyY2VzIChzdWNoIGFzIGZpbGVzIG9yIG5ldHdvcmsgY29ubmVjdGlvbnMpLCByZWdhcmRsZXNzIG9mCi13aGV0aGVyIHRoZSB1c2Ugb2YgdGhlIHJlc291cmNlIHdhcyBzdWNjZXNzZnVsLgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGRlZiBkaXZpZGUoeCwgeSk6CisuLi4gICAgIHRyeToKKy4uLiAgICAgICAgIHJlc3VsdCA9IHggLyB5CisuLi4gICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKy4uLiAgICAgICAgIHByaW50ICJkaXZpc2lvbiBieSB6ZXJvISIKKy4uLiAgICAgZWxzZToKKy4uLiAgICAgICAgIHByaW50ICJyZXN1bHQgaXMiLCByZXN1bHQKKy4uLiAgICAgZmluYWxseToKKy4uLiAgICAgICAgIHByaW50ICJleGVjdXRpbmcgZmluYWxseSBjbGF1c2UiCisuLi4KKz4+PiBkaXZpZGUoMiwgMSkKK3Jlc3VsdCBpcyAyCitleGVjdXRpbmcgZmluYWxseSBjbGF1c2UKKz4+PiBkaXZpZGUoMiwgMCkKK2RpdmlzaW9uIGJ5IHplcm8hCitleGVjdXRpbmcgZmluYWxseSBjbGF1c2UKKz4+PiBkaXZpZGUoIjIiLCAiMSIpCitleGVjdXRpbmcgZmluYWxseSBjbGF1c2UKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICBGaWxlICI8c3RkaW4+IiwgbGluZSAzLCBpbiBkaXZpZGUKK1R5cGVFcnJvcjogdW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAvOiAnc3RyJyBhbmQgJ3N0cicKK1xlbmR7dmVyYmF0aW19CiAKLUEgXGtleXdvcmR7dHJ5fSBzdGF0ZW1lbnQgbXVzdCBlaXRoZXIgaGF2ZSBvbmUgb3IgbW9yZSBleGNlcHQgY2xhdXNlcwotb3Igb25lIGZpbmFsbHkgY2xhdXNlLCBidXQgbm90IGJvdGggKGJlY2F1c2UgaXQgd291bGQgYmUgdW5jbGVhciB3aGljaAotY2xhdXNlIHNob3VsZCBiZSBleGVjdXRlZCBmaXJzdCkuCitBcyB5b3UgY2FuIHNlZSwgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSBpcyBleGVjdXRlZCBpbiBhbnkKK2V2ZW50LiAgVGhlIFxleGNlcHRpb257VHlwZUVycm9yfSByYWlzZWQgYnkgZGl2aWRpbmcgdHdvIHN0cmluZ3MKK2lzIG5vdCBoYW5kbGVkIGJ5IHRoZSBca2V5d29yZHtleGNlcHR9IGNsYXVzZSBhbmQgdGhlcmVmb3JlCityZS1yYWlzZWQgYWZ0ZXIgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZXMgaGFzIGJlZW4gZXhlY3V0ZWQuCisKK0luIHJlYWwgd29ybGQgYXBwbGljYXRpb25zLCB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIGlzIHVzZWZ1bAorZm9yIHJlbGVhc2luZyBleHRlcm5hbCByZXNvdXJjZXMgKHN1Y2ggYXMgZmlsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyksCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHVzZSBvZiB0aGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWwuCiAKIAogXGNoYXB0ZXJ7Q2xhc3NlcyBcbGFiZWx7Y2xhc3Nlc319CkBAIC01MzQwLDcgKzUzNzgsNyBAQAogCiBcaXRlbSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17TGFuZ3VhZ2UgUmVmZXJlbmNlfTogQSBkZXRhaWxlZCAKIGV4cGxhbmF0aW9uIG9mIFB5dGhvbidzIHN5bnRheCBhbmQgc2VtYW50aWNzLiAgSXQncyBoZWF2eSByZWFkaW5nLCAKLWJ1dCBpcyB1c2VmdWwgYXMgYQorYnV0IGlzIHVzZWZ1bCBhcyBhIGNvbXBsZXRlIGd1aWRlIHRvIHRoZSBsYW5ndWFnZSBpdHNlbGYuCiAKIFxlbmR7aXRlbWl6ZX0KIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CmluZGV4IGI4OWFjMTkuLmJmNDU4ZmEgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXgKQEAgLTEyMTQsOCArMTIxNCw4IEBACiBcaXRlbXtcbW9kdWxle2dldHRleHR9On0gVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24KIChJMThOKSBhbmQgbG9jYWxpemF0aW9uIChMMTBOKSBzdXBwb3J0IGZvciBQeXRob24gcHJvZ3JhbXMgYnkKIHByb3ZpZGluZyBhbiBpbnRlcmZhY2UgdG8gdGhlIEdOVSBnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgotKEludGVncmF0ZWQgYnkgQmFycnkgV2Fyc2F3LCBmcm9tIHNlcGFyYXRlIGNvbnRyaWJ1dGlvbnMgYnkgTWFydGluIHZvbgotTG9ld2lzLCBQZXRlciBGdW5rLCBhbmQgSmFtZXMgSGVuc3RyaWRnZS4pCisoSW50ZWdyYXRlZCBieSBCYXJyeSBXYXJzYXcsIGZyb20gc2VwYXJhdGUgY29udHJpYnV0aW9ucyBieSBNYXJ0aW4gCit2b25+TFwib3dpcywgUGV0ZXIgRnVuaywgYW5kIEphbWVzIEhlbnN0cmlkZ2UuKQogCiBcaXRlbXtcbW9kdWxle2xpbnV4YXVkaW9kZXZ9On0gU3VwcG9ydCBmb3IgdGhlIFxmaWxley9kZXYvYXVkaW99CiBkZXZpY2Ugb24gTGludXgsIGEgdHdpbiB0byB0aGUgZXhpc3RpbmcgXG1vZHVsZXtzdW5hdWRpb2Rldn0gbW9kdWxlLgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4CmluZGV4IGI3ZWEzZjIuLmYzZDAyNDUgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIxLnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXgKQEAgLTUsNyArNSw3IEBACiAlICRJZCQKIAogXHRpdGxle1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMX0KLVxyZWxlYXNlezEuMDB9CitccmVsZWFzZXsxLjAxfQogXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQogXGF1dGhvcmFkZHJlc3N7CiAJXHN0cm9uZ3tQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbn1cXApAQCAtMTYsMTQgKzE2LDcgQEAKIAogXHNlY3Rpb257SW50cm9kdWN0aW9ufQogCi1JdCdzIHRoYXQgdGltZSBhZ2Fpbi4uLiB0aW1lIGZvciBhIG5ldyBQeXRob24gcmVsZWFzZSwgUHl0aG9uIDIuMS4KLU9uZSByZWNlbnQgZ29hbCBvZiB0aGUgUHl0aG9uIGRldmVsb3BtZW50IHRlYW0gaGFzIGJlZW4gdG8gYWNjZWxlcmF0ZQotdGhlIHBhY2Ugb2YgbmV3IHJlbGVhc2VzLCB3aXRoIGEgbmV3IHJlbGVhc2UgY29taW5nIGV2ZXJ5IDYgdG8gOQotbW9udGhzLiAyLjEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdG8gY29tZSBvdXQgYXQgdGhpcyBmYXN0ZXIgcGFjZSwgd2l0aAotdGhlIGZpcnN0IGFscGhhIGFwcGVhcmluZyBpbiBKYW51YXJ5LCAzIG1vbnRocyBhZnRlciB0aGUgZmluYWwgdmVyc2lvbgotb2YgMi4wIHdhcyByZWxlYXNlZC4KLQotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gMi4xLiAgV2hpbGUgdGhlcmUgYXJlbid0IGFzCitUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMi4xLiAgV2hpbGUgdGhlcmUgYXJlbid0IGFzCiBtYW55IGNoYW5nZXMgaW4gMi4xIGFzIHRoZXJlIHdlcmUgaW4gUHl0aG9uIDIuMCwgdGhlcmUgYXJlIHN0aWxsIHNvbWUKIHBsZWFzYW50IHN1cnByaXNlcyBpbiBzdG9yZS4gIDIuMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0byBiZSBzdGVlcmVkCiB0aHJvdWdoIHRoZSB1c2Ugb2YgUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2Fscywgb3IgUEVQcywgc28gbW9zdCBvZgpAQCAtMzQsNiArMjcsMTIgQEAKIFJlZmVyIHRvIHRoZSBQeXRob24gMi4xIGRvY3VtZW50YXRpb24sIG9yIHRvIHRoZSBzcGVjaWZpYyBQRVAsIGZvcgogbW9yZSBkZXRhaWxzIGFib3V0IGFueSBuZXcgZmVhdHVyZSB0aGF0IHBhcnRpY3VsYXJseSBpbnRlcmVzdHMgeW91LgogCitPbmUgcmVjZW50IGdvYWwgb2YgdGhlIFB5dGhvbiBkZXZlbG9wbWVudCB0ZWFtIGhhcyBiZWVuIHRvIGFjY2VsZXJhdGUKK3RoZSBwYWNlIG9mIG5ldyByZWxlYXNlcywgd2l0aCBhIG5ldyByZWxlYXNlIGNvbWluZyBldmVyeSA2IHRvIDkKK21vbnRocy4gMi4xIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRvIGNvbWUgb3V0IGF0IHRoaXMgZmFzdGVyIHBhY2UsIHdpdGgKK3RoZSBmaXJzdCBhbHBoYSBhcHBlYXJpbmcgaW4gSmFudWFyeSwgMyBtb250aHMgYWZ0ZXIgdGhlIGZpbmFsIHZlcnNpb24KK29mIDIuMCB3YXMgcmVsZWFzZWQuCisKIFRoZSBmaW5hbCByZWxlYXNlIG9mIFB5dGhvbiAyLjEgd2FzIG1hZGUgb24gQXByaWwgMTcsIDIwMDEuCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKaW5kZXggZTlmZjRkOS4uNTFiYWVjZSAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleApAQCAtODAzLDggKzgwMyw4IEBACiAKIFRoZSBQRVAgYWxzbyBwcm9wb3NlcyB0aGF0IGFsbCBca2V5d29yZHtpbXBvcnR9IHN0YXRlbWVudHMgYmUgYWJzb2x1dGUKIGltcG9ydHMsIHdpdGggYSBsZWFkaW5nIFxzYW1wey59IGNoYXJhY3RlciB0byBpbmRpY2F0ZSBhIHJlbGF0aXZlCi1pbXBvcnQuICBUaGlzIHBhcnQgb2YgdGhlIFBFUCBpcyBub3QgeWV0IGltcGxlbWVudGVkLCBhbmQgd2lsbCBoYXZlIHRvCi13YWl0IGZvciBQeXRob24gMi41IG9yIHNvbWUgb3RoZXIgZnV0dXJlIHZlcnNpb24uCitpbXBvcnQuICBUaGlzIHBhcnQgb2YgdGhlIFBFUCB3YXMgbm90IGltcGxlbWVudGVkIGZvciBQeXRob24gMi40LAorYnV0IHdhcyBjb21wbGV0ZWQgZm9yIFB5dGhvbiAyLjUuCiAKIFxiZWdpbntzZWVhbHNvfQogXHNlZXBlcHszMjh9e0ltcG9ydHM6IE11bHRpLUxpbmUgYW5kIEFic29sdXRlL1JlbGF0aXZlfQpAQCAtMTMzNiw3ICsxMzM2LDcgQEAKIFxpdGVtIFRoZSBcbW9kdWxle21hcnNoYWx9IG1vZHVsZSBub3cgc2hhcmVzIGludGVybmVkIHN0cmluZ3Mgb24gdW5wYWNraW5nIGEgCiBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgbWF5IHNocmluayB0aGUgc2l6ZSBvZiBjZXJ0YWluIHBpY2tsZSBzdHJpbmdzLAogYnV0IHRoZSBwcmltYXJ5IGVmZmVjdCBpcyB0byBtYWtlIFxmaWxley5weWN9IGZpbGVzIHNpZ25pZmljYW50bHkgc21hbGxlci4KLShDb250cmlidXRlZCBieSBNYXJ0aW4gdm9uIExvZXdpcy4pCisoQ29udHJpYnV0ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzLikKIAogXGl0ZW0gVGhlIFxtb2R1bGV7bm50cGxpYn0gbW9kdWxlJ3MgXGNsYXNze05OVFB9IGNsYXNzIGdhaW5lZAogXG1ldGhvZHtkZXNjcmlwdGlvbigpfSBhbmQgXG1ldGhvZHtkZXNjcmlwdGlvbnMoKX0gbWV0aG9kcyB0byByZXRyaWV2ZSAKQEAgLTE2ODgsNyArMTY4OCw3IEBACiBcYmVnaW57aXRlbWl6ZX0KIAogXGl0ZW0gVGhlIFdpbmRvd3MgcG9ydCBub3cgYnVpbGRzIHVuZGVyIE1TVkMrKyA3LjEgYXMgd2VsbCBhcyB2ZXJzaW9uIDYuCi0gIChDb250cmlidXRlZCBieSBNYXJ0aW4gdm9uIExvZXdpcy4pCisgIChDb250cmlidXRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMuKQogCiBcZW5ke2l0ZW1pemV9CiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAppbmRleCA1NzQzMjg1Li5kYjZjMjVhIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CkBAIC0yLDkgKzIsMTQgQEAKIFx1c2VwYWNrYWdle2Rpc3R1dGlsc30KICUgJElkJAogCislIFRoZSBlYXN5X2luc3RhbGwgc3R1ZmYKKyUgRGVzY3JpYmUgdGhlIHBrZ3V0aWwgbW9kdWxlCislIFN0YXRlZnVsIGNvZGVjIGNoYW5nZXMKKyUgRml4IFhYWCBjb21tZW50cworJSBDb3VudCB1cCB0aGUgcGF0Y2hlcyBhbmQgYnVncwogCiBcdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi41fQotXHJlbGVhc2V7MC4wfQorXHJlbGVhc2V7MC4xfQogXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQogXGF1dGhvcmFkZHJlc3N7XGVtYWlse2Fta0BhbWsuY2F9fQogCkBAIC0xNCw3ICsxOSwxMCBAQAogCiBUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMi41LiAgTm8gcmVsZWFzZSBkYXRlCiBmb3IgUHl0aG9uIDIuNSBoYXMgYmVlbiBzZXQ7IGl0IHdpbGwgcHJvYmFibHkgYmUgcmVsZWFzZWQgaW4gdGhlCi1hdXR1bW4gb2YgMjAwNi4KK2F1dHVtbiBvZiAyMDA2LiAgXHBlcHszNTZ9IGRlc2NyaWJlcyB0aGUgcGxhbm5lZCByZWxlYXNlIHNjaGVkdWxlLgorCitDb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBlcnJvciByZXBvcnRzIGFyZSB3ZWxjb21lOyBwbGVhc2UgZS1tYWlsIHRoZW0gCit0byB0aGUgYXV0aG9yIG9yIG9wZW4gYSBidWcgaW4gdGhlIFB5dGhvbiBidWcgdHJhY2tlci4KIAogJSBYWFggQ29tcGFyZSB3aXRoIHByZXZpb3VzIHJlbGVhc2UgaW4gMiAtIDMgc2VudGVuY2VzIGhlcmUuCiAKQEAgLTI3LDYgKzM1LDMyIEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1xzZWN0aW9ue1BFUCAyNDM6IFVwbG9hZGluZyBNb2R1bGVzIHRvIFB5UEl9CisKK1BFUCAyNDMgZGVzY3JpYmVzIGFuIEhUVFAtYmFzZWQgcHJvdG9jb2wgZm9yIHN1Ym1pdHRpbmcgc29mdHdhcmUKK3BhY2thZ2VzIHRvIGEgY2VudHJhbCBhcmNoaXZlLiAgVGhlIFB5dGhvbiBwYWNrYWdlIGluZGV4IGF0CitcdXJse2h0dHA6Ly9jaGVlc2VzaG9wLnB5dGhvbi5vcmd9IG5vdyBzdXBwb3J0cyBwYWNrYWdlIHVwbG9hZHMsIGFuZAordGhlIG5ldyBcY29tbWFuZHt1cGxvYWR9IERpc3R1dGlscyBjb21tYW5kIHdpbGwgdXBsb2FkIGEgcGFja2FnZSB0byB0aGUKK3JlcG9zaXRvcnkuCisKK0JlZm9yZSBhIHBhY2thZ2UgY2FuIGJlIHVwbG9hZGVkLCB5b3UgbXVzdCBiZSBhYmxlIHRvIGJ1aWxkIGEKK2Rpc3RyaWJ1dGlvbiB1c2luZyB0aGUgXGNvbW1hbmR7c2Rpc3R9IERpc3R1dGlscyBjb21tYW5kLiAgT25jZSB0aGF0Cit3b3JrcywgeW91IGNhbiBydW4gXGNvZGV7cHl0aG9uIHNldHVwLnB5IHVwbG9hZH0gdG8gYWRkIHlvdXIgcGFja2FnZQordG8gdGhlIFB5UEkgYXJjaGl2ZS4gIE9wdGlvbmFsbHkgeW91IGNhbiBHUEctc2lnbiB0aGUgcGFja2FnZSBieQorc3VwcGx5aW5nIHRoZSBcbG9uZ3Byb2dyYW1vcHR7c2lnbn0gYW5kCitcbG9uZ3Byb2dyYW1vcHR7aWRlbnRpdHl9IG9wdGlvbnMuCisKK1xiZWdpbntzZWVhbHNvfQorCitcc2VlcGVwezI0M317TW9kdWxlIFJlcG9zaXRvcnkgVXBsb2FkIE1lY2hhbmlzbX17UEVQIHdyaXR0ZW4gYnkKK1NlYW4gUmVpZnNjaG5laWRlcjsgaW1wbGVtZW50ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzCithbmQgUmljaGFyZCBKb25lcy4gIE5vdGUgdGhhdCB0aGUgUEVQIGRvZXNuJ3QgZXhhY3RseSAKK2Rlc2NyaWJlIHdoYXQncyBpbXBsZW1lbnRlZCBpbiBQeVBJLn0KKworXGVuZHtzZWVhbHNvfQorCisKKyU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzA4OiBDb25kaXRpb25hbCBFeHByZXNzaW9uc30KIAogRm9yIGEgbG9uZyB0aW1lLCBwZW9wbGUgaGF2ZSBiZWVuIHJlcXVlc3RpbmcgYSB3YXkgdG8gd3JpdGUKQEAgLTQzLDEwICs3NywxMCBAQAogXGVuZHt2ZXJiYXRpbX0KIAogVGhlcmUgaGF2ZSBiZWVuIGVuZGxlc3MgdGVkaW91cyBkaXNjdXNzaW9ucyBvZiBzeW50YXggb24gYm90aAotcHl0aG9uLWRldiBhbmQgY29tcC5sYW5nLnB5dGhvbiwgYW5kIGV2ZW4gYSB2b3RlIHRoYXQgZm91bmQgdGhlCi1tYWpvcml0eSBvZiB2b3RlcnMgd2FudGVkIHNvbWUgd2F5IHRvIHdyaXRlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLAotYnV0IHRoZXJlIHdhcyBubyBzeW50YXggdGhhdCB3YXMgY2xlYXJseSBwcmVmZXJyZWQgYnkgYSBtYWpvcml0eS4KLUNhbmRpZGF0ZXMgaW5jbHVkZSBDJ3MgXGNvZGV7Y29uZCA/IHRydWVfdiA6IGZhbHNlX3Z9LAorcHl0aG9uLWRldiBhbmQgY29tcC5sYW5nLnB5dGhvbi4gIEEgdm90ZSB3YXMgZXZlbiBoZWxkIHRoYXQgZm91bmQgdGhlCittYWpvcml0eSBvZiB2b3RlcnMgd2FudGVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIGluIHNvbWUgZm9ybSwKK2J1dCB0aGVyZSB3YXMgbm8gc3ludGF4IHRoYXQgd2FzIHByZWZlcnJlZCBieSBhIGNsZWFyIG1ham9yaXR5LgorQ2FuZGlkYXRlcyBpbmNsdWRlZCBDJ3MgXGNvZGV7Y29uZCA/IHRydWVfdiA6IGZhbHNlX3Z9LAogXGNvZGV7aWYgY29uZCB0aGVuIHRydWVfdiBlbHNlIGZhbHNlX3Z9LCBhbmQgMTYgb3RoZXIgdmFyaWF0aW9ucy4KIAogR3ZSIGV2ZW50dWFsbHkgY2hvc2UgYSBzdXJwcmlzaW5nIHN5bnRheDoKQEAgLTU1LDExICs4OSwxMiBAQAogeCA9IHRydWVfdmFsdWUgaWYgY29uZGl0aW9uIGVsc2UgZmFsc2VfdmFsdWUKIFxlbmR7dmVyYmF0aW19CiAKLUV2YWx1YXRpb24gaXMgc3RpbGwgbGF6eSBhcyBpbiBleGlzdGluZyBCb29sZWFuIGV4cHJlc3Npb24sIHNvIHRoZQotZXZhbHVhdGlvbiBqdW1wcyBhcm91bmQgYSBiaXQuICBUaGUgXHZhcntjb25kaXRpb259IGV4cHJlc3Npb24gaXMKLWV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZSBcdmFye3RydWVfdmFsdWV9IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9ubHkKLWlmIHRoZSBjb25kaXRpb24gd2FzIHRydWUuICBTaW1pbGFybHksIHRoZSBcdmFye2ZhbHNlX3ZhbHVlfQotZXhwcmVzc2lvbiBpcyBvbmx5IGV2YWx1YXRlZCB3aGVuIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCitFdmFsdWF0aW9uIGlzIHN0aWxsIGxhenkgYXMgaW4gZXhpc3RpbmcgQm9vbGVhbiBleHByZXNzaW9ucywgc28gdGhlCitvcmRlciBvZiBldmFsdWF0aW9uIGp1bXBzIGFyb3VuZCBhIGJpdC4gIFRoZSBcdmFye2NvbmRpdGlvbn0KK2V4cHJlc3Npb24gaW4gdGhlIG1pZGRsZSBpcyBldmFsdWF0ZWQgZmlyc3QsIGFuZCB0aGUgXHZhcnt0cnVlX3ZhbHVlfQorZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25seSBpZiB0aGUgY29uZGl0aW9uIHdhcyB0cnVlLiAgU2ltaWxhcmx5LAordGhlIFx2YXJ7ZmFsc2VfdmFsdWV9IGV4cHJlc3Npb24gaXMgb25seSBldmFsdWF0ZWQgd2hlbiB0aGUgY29uZGl0aW9uCitpcyBmYWxzZS4KIAogVGhpcyBzeW50YXggbWF5IHNlZW0gc3RyYW5nZSBhbmQgYmFja3dhcmRzOyB3aHkgZG9lcyB0aGUgY29uZGl0aW9uIGdvCiBpbiB0aGUgXGVtcGh7bWlkZGxlfSBvZiB0aGUgZXhwcmVzc2lvbiwgYW5kIG5vdCBpbiB0aGUgZnJvbnQgYXMgaW4gQydzCkBAIC0xMTAsNyArMTQ1LDcgQEAKIFxiZWdpbntzZWVhbHNvfQogCiBcc2VlcGVwezMwOH17Q29uZGl0aW9uYWwgRXhwcmVzc2lvbnN9e1BFUCB3cml0dGVuIGJ5Ci1HdWlkbyB2YW4gUm9zc3VtIGFuZCBSYXltb25kIEQuIEhldHRpbmdlcjsgaW1wbGVtZW50ZWQgYnkgVGhvbWFzCitHdWlkbyB2YW5+Um9zc3VtIGFuZCBSYXltb25kIEQuIEhldHRpbmdlcjsgaW1wbGVtZW50ZWQgYnkgVGhvbWFzCiBXb3V0ZXJzLn0KIAogXGVuZHtzZWVhbHNvfQpAQCAtMTkyLDcgKzIyNywxNiBAQAogcG9zc2libGUgdG8gbG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgcGFja2FnZSBpbmRleCwgZGV0ZXJtaW5lIHRoZQogZGVwZW5kZW5jaWVzIGZvciBhIHBhY2thZ2UsIGFuZCBkb3dubG9hZCB0aGUgcmVxdWlyZWQgcGFja2FnZXMuCiAKLSUgWFhYIHB1dCBleGFtcGxlIGhlcmUKK1xiZWdpbnt2ZXJiYXRpbX0KK1ZFUlNJT04gPSAnMS4wJworc2V0dXAobmFtZT0nUHlQYWNrYWdlJywgCisgICAgICB2ZXJzaW9uPVZFUlNJT04sCisgICAgICByZXF1aXJlcz1bJ251bWFycmF5JywgJ3psaWIgKD49MS4xLjQpJ10sCisgICAgICBvYnNvbGV0ZXM9WydPbGRQYWNrYWdlJ10KKyAgICAgIGRvd25sb2FkX3VybD0oJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vcHlwYWNrYWdlL2Rpc3QvcGtnLSVzLnRhci5neicKKyAgICAgICAgICAgICAgICAgICAgJSBWRVJTSU9OKSwKKyAgICAgKQorXGVuZHt2ZXJiYXRpbX0KICAKIFxiZWdpbntzZWVhbHNvfQogCkBAIC0yMDYsMzEgKzI1MCwxNzggQEAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzI4OiBBYnNvbHV0ZSBhbmQgUmVsYXRpdmUgSW1wb3J0c30KIAotJSBYWFggd3JpdGUgdGhpcworVGhlIHNpbXBsZXIgcGFydCBvZiBQRVAgMzI4IHdhcyBpbXBsZW1lbnRlZCBpbiBQeXRob24gMi40OiBwYXJlbnRoZXNlcworY291bGQgbm93IGJlIHVzZWQgdG8gZW5jbG9zZSB0aGUgbmFtZXMgaW1wb3J0ZWQgZnJvbSBhIG1vZHVsZSB1c2luZwordGhlIFxjb2Rle2Zyb20gLi4uIGltcG9ydCAuLi59IHN0YXRlbWVudCwgbWFraW5nIGl0IGVhc2llciB0byBpbXBvcnQKK21hbnkgZGlmZmVyZW50IG5hbWVzLgorCitUaGUgbW9yZSBjb21wbGljYXRlZCBwYXJ0IGhhcyBiZWVuIGltcGxlbWVudGVkIGluIFB5dGhvbiAyLjU6CitpbXBvcnRpbmcgYSBtb2R1bGUgY2FuIGJlIHNwZWNpZmllZCB0byB1c2UgYWJzb2x1dGUgb3IKK3BhY2thZ2UtcmVsYXRpdmUgaW1wb3J0cy4gIFRoZSBwbGFuIGlzIHRvIG1vdmUgdG93YXJkIG1ha2luZyBhYnNvbHV0ZQoraW1wb3J0cyB0aGUgZGVmYXVsdCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uLgorCitMZXQncyBzYXkgeW91IGhhdmUgYSBwYWNrYWdlIGRpcmVjdG9yeSBsaWtlIHRoaXM6CitcYmVnaW57dmVyYmF0aW19Citwa2cvCitwa2cvX19pbml0X18ucHkKK3BrZy9tYWluLnB5Citwa2cvc3RyaW5nLnB5CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIGRlZmluZXMgYSBwYWNrYWdlIG5hbWVkIFxtb2R1bGV7cGtnfSBjb250YWluaW5nIHRoZQorXG1vZHVsZXtwa2cubWFpbn0gYW5kIFxtb2R1bGV7cGtnLnN0cmluZ30gc3VibW9kdWxlcy4gIAorCitDb25zaWRlciB0aGUgY29kZSBpbiB0aGUgXGZpbGV7bWFpbi5weX0gbW9kdWxlLiAgV2hhdCBoYXBwZW5zIGlmIGl0CitleGVjdXRlcyB0aGUgc3RhdGVtZW50IFxjb2Rle2ltcG9ydCBzdHJpbmd9PyAgSW4gUHl0aG9uIDIuNCBhbmQKK2VhcmxpZXIsIGl0IHdpbGwgZmlyc3QgbG9vayBpbiB0aGUgcGFja2FnZSdzIGRpcmVjdG9yeSB0byBwZXJmb3JtIGEKK3JlbGF0aXZlIGltcG9ydCwgZmluZHMgXGZpbGV7cGtnL3N0cmluZy5weX0sIGltcG9ydHMgdGhlIGNvbnRlbnRzIG9mCit0aGF0IGZpbGUgYXMgdGhlIFxtb2R1bGV7cGtnLnN0cmluZ30gbW9kdWxlLCBhbmQgdGhhdCBtb2R1bGUgaXMgYm91bmQKK3RvIHRoZSBuYW1lIFxzYW1we3N0cmluZ30gaW4gdGhlIFxtb2R1bGV7cGtnLm1haW59IG1vZHVsZSdzIG5hbWVzcGFjZS4KKworVGhhdCdzIGZpbmUgaWYgXG1vZHVsZXtwa2cuc3RyaW5nfSB3YXMgd2hhdCB5b3Ugd2FudGVkLiAgQnV0IHdoYXQgaWYKK3lvdSB3YW50ZWQgUHl0aG9uJ3Mgc3RhbmRhcmQgXG1vZHVsZXtzdHJpbmd9IG1vZHVsZT8gIFRoZXJlJ3Mgbm8gY2xlYW4KK3dheSB0byBpZ25vcmUgXG1vZHVsZXtwa2cuc3RyaW5nfSBhbmQgbG9vayBmb3IgdGhlIHN0YW5kYXJkIG1vZHVsZTsKK2dlbmVyYWxseSB5b3UgaGFkIHRvIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIFxjb2Rle3N5cy5tb2R1bGVzfSwgd2hpY2gKK2lzIHNsaWdodGx5IHVuY2xlYW4uICAgCitIb2xnZXIgS3Jla2VsJ3MgXG1vZHVsZXtweS5zdGR9IHBhY2thZ2UgcHJvdmlkZXMgYSB0aWRpZXIgd2F5IHRvIHBlcmZvcm0KK2ltcG9ydHMgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSwgXGNvZGV7aW1wb3J0IHB5IDsgcHkuc3RkLnN0cmluZy5qb2luKCl9LAorYnV0IHRoYXQgcGFja2FnZSBpc24ndCBhdmFpbGFibGUgb24gYWxsIFB5dGhvbiBpbnN0YWxsYXRpb25zLgorCitSZWFkaW5nIGNvZGUgd2hpY2ggcmVsaWVzIG9uIHJlbGF0aXZlIGltcG9ydHMgaXMgYWxzbyBsZXNzIGNsZWFyLAorYmVjYXVzZSBhIHJlYWRlciBtYXkgYmUgY29uZnVzZWQgYWJvdXQgd2hpY2ggbW9kdWxlLCBcbW9kdWxle3N0cmluZ30KK29yIFxtb2R1bGV7cGtnLnN0cmluZ30sIGlzIGludGVuZGVkIHRvIGJlIHVzZWQuICBQeXRob24gdXNlcnMgc29vbgorbGVhcm5lZCBub3QgdG8gZHVwbGljYXRlIHRoZSBuYW1lcyBvZiBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZXMgaW4gdGhlCituYW1lcyBvZiB0aGVpciBwYWNrYWdlcycgc3VibW9kdWxlcywgYnV0IHlvdSBjYW4ndCBwcm90ZWN0IGFnYWluc3QKK2hhdmluZyB5b3VyIHN1Ym1vZHVsZSdzIG5hbWUgYmVpbmcgdXNlZCBmb3IgYSBuZXcgbW9kdWxlIGFkZGVkIGluIGEKK2Z1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4KKworSW4gUHl0aG9uIDIuNSwgeW91IGNhbiBzd2l0Y2ggXGtleXdvcmR7aW1wb3J0fSdzIGJlaGF2aW91ciB0byAKK2Fic29sdXRlIGltcG9ydHMgdXNpbmcgYSBcY29kZXtmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydH0KK2RpcmVjdGl2ZS4gIFRoaXMgYWJzb2x1dGUtaW1wb3J0IGJlaGF2aW91ciB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBpbgorYSBmdXR1cmUgdmVyc2lvbiAocHJvYmFibHkgUHl0aG9uIDIuNykuICBPbmNlIGFic29sdXRlIGltcG9ydHMgCithcmUgdGhlIGRlZmF1bHQsIFxjb2Rle2ltcG9ydCBzdHJpbmd9IHdpbGwKK2Fsd2F5cyBmaW5kIHRoZSBzdGFuZGFyZCBsaWJyYXJ5J3MgdmVyc2lvbi4KK0l0J3Mgc3VnZ2VzdGVkIHRoYXQgdXNlcnMgc2hvdWxkIGJlZ2luIHVzaW5nIGFic29sdXRlIGltcG9ydHMgYXMgbXVjaAorYXMgcG9zc2libGUsIHNvIGl0J3MgcHJlZmVyYWJsZSB0byBiZWdpbiB3cml0aW5nIFxjb2Rle2Zyb20gcGtnIGltcG9ydAorc3RyaW5nfSBpbiB5b3VyIGNvZGUuICAKKworUmVsYXRpdmUgaW1wb3J0cyBhcmUgc3RpbGwgcG9zc2libGUgYnkgYWRkaW5nIGEgbGVhZGluZyBwZXJpb2QgCit0byB0aGUgbW9kdWxlIG5hbWUgd2hlbiB1c2luZyB0aGUgXGNvZGV7ZnJvbSAuLi4gaW1wb3J0fSBmb3JtOgorCitcYmVnaW57dmVyYmF0aW19CisjIEltcG9ydCBuYW1lcyBmcm9tIHBrZy5zdHJpbmcKK2Zyb20gLnN0cmluZyBpbXBvcnQgbmFtZTEsIG5hbWUyCisjIEltcG9ydCBwa2cuc3RyaW5nCitmcm9tIC4gaW1wb3J0IHN0cmluZworXGVuZHt2ZXJiYXRpbX0KKworVGhpcyBpbXBvcnRzIHRoZSBcbW9kdWxle3N0cmluZ30gbW9kdWxlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CitwYWNrYWdlLCBzbyBpbiBcbW9kdWxle3BrZy5tYWlufSB0aGlzIHdpbGwgaW1wb3J0IFx2YXJ7bmFtZTF9IGFuZAorXHZhcntuYW1lMn0gZnJvbSBcbW9kdWxle3BrZy5zdHJpbmd9LiAgQWRkaXRpb25hbCBsZWFkaW5nIHBlcmlvZHMKK3BlcmZvcm0gdGhlIHJlbGF0aXZlIGltcG9ydCBzdGFydGluZyBmcm9tIHRoZSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQKK3BhY2thZ2UuICBGb3IgZXhhbXBsZSwgY29kZSBpbiB0aGUgXG1vZHVsZXtBLkIuQ30gbW9kdWxlIGNhbiBkbzoKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSAuIGltcG9ydCBEICAgICAgICAgICAgICAgICAjIEltcG9ydHMgQS5CLkQKK2Zyb20gLi4gaW1wb3J0IEUgICAgICAgICAgICAgICAgIyBJbXBvcnRzIEEuRQorZnJvbSAuLkYgaW1wb3J0IEcgICAgICAgICAgICAgICAjIEltcG9ydHMgQS5GLkcKK1xlbmR7dmVyYmF0aW19CisKK0xlYWRpbmcgcGVyaW9kcyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBcY29kZXtpbXBvcnQgXHZhcnttb2RuYW1lfX0gCitmb3JtIG9mIHRoZSBpbXBvcnQgc3RhdGVtZW50LCBvbmx5IHRoZSBcY29kZXtmcm9tIC4uLiBpbXBvcnR9IGZvcm0uCisKK1xiZWdpbntzZWVhbHNvfQorCitcc2VlcGVwezMyOH17SW1wb3J0czogTXVsdGktTGluZSBhbmQgQWJzb2x1dGUvUmVsYXRpdmV9Cit7UEVQIHdyaXR0ZW4gYnkgQWFoejsgaW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMufQorCitcc2VldXJse2h0dHA6Ly9jb2Rlc3BlYWsubmV0L3B5L2N1cnJlbnQvZG9jL2luZGV4Lmh0bWx9Cit7VGhlIHB5IGxpYnJhcnkgYnkgSG9sZ2VyIEtyZWtlbCwgd2hpY2ggY29udGFpbnMgdGhlIFxtb2R1bGV7cHkuc3RkfSBwYWNrYWdlLn0KKworXGVuZHtzZWVhbHNvfQogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzM4OiBFeGVjdXRpbmcgTW9kdWxlcyBhcyBTY3JpcHRzfQogCi0lIFhYWCB3cml0ZSB0aGlzCitUaGUgXHByb2dyYW1vcHR7LW19IHN3aXRjaCBhZGRlZCBpbiBQeXRob24gMi40IHRvIGV4ZWN1dGUgYSBtb2R1bGUgYXMKK2Egc2NyaXB0IGdhaW5lZCBhIGZldyBtb3JlIGFiaWxpdGllcy4gIEluc3RlYWQgb2YgYmVpbmcgaW1wbGVtZW50ZWQgaW4KK0MgY29kZSBpbnNpZGUgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgdGhlIHN3aXRjaCBub3cgdXNlcyBhbgoraW1wbGVtZW50YXRpb24gaW4gYSBuZXcgbW9kdWxlLCBcbW9kdWxle3J1bnB5fS4KKworVGhlIFxtb2R1bGV7cnVucHl9IG1vZHVsZSBpbXBsZW1lbnRzIGEgbW9yZSBzb3BoaXN0aWNhdGVkIGltcG9ydAorbWVjaGFuaXNtIHNvIHRoYXQgaXQncyBub3cgcG9zc2libGUgdG8gcnVuIG1vZHVsZXMgaW4gYSBwYWNrYWdlIHN1Y2gKK2FzIFxtb2R1bGV7cHljaGVja2VyLmNoZWNrZXJ9LiAgVGhlIG1vZHVsZSBhbHNvIHN1cHBvcnRzIGFsdGVybmF0aXZlCitpbXBvcnQgbWVjaGFuaXNtcyBzdWNoIGFzIHRoZSBcbW9kdWxle3ppcGltcG9ydH0gbW9kdWxlLiAgVGhpcyBtZWFucworeW91IGNhbiBhZGQgYSAuemlwIGFyY2hpdmUncyBwYXRoIHRvIFxjb2Rle3N5cy5wYXRofSBhbmQgdGhlbiB1c2UgdGhlCitccHJvZ3JhbW9wdHstbX0gc3dpdGNoIHRvIGV4ZWN1dGUgY29kZSBmcm9tIHRoZSBhcmNoaXZlLgorCisKK1xiZWdpbntzZWVhbHNvfQorCitcc2VlcGVwezMzOH17RXhlY3V0aW5nIG1vZHVsZXMgYXMgc2NyaXB0c317UEVQIHdyaXR0ZW4gYW5kIAoraW1wbGVtZW50ZWQgYnkgTmljayBDb2dobGFuLn0KKworXGVuZHtzZWVhbHNvfQogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzQxOiBVbmlmaWVkIHRyeS9leGNlcHQvZmluYWxseX0KIAotJSBYWFggd3JpdGUgdGhpcworVW50aWwgUHl0aG9uIDIuNSwgdGhlIFxrZXl3b3Jke3RyeX0gc3RhdGVtZW50IGNhbWUgaW4gdHdvCitmbGF2b3Vycy4gWW91IGNvdWxkIHVzZSBhIFxrZXl3b3Jke2ZpbmFsbHl9IGJsb2NrIHRvIGVuc3VyZSB0aGF0IGNvZGUKK2lzIGFsd2F5cyBleGVjdXRlZCwgb3Igb25lIG9yIG1vcmUgXGtleXdvcmR7ZXhjZXB0fSBibG9ja3MgdG8gY2F0Y2ggCitzcGVjaWZpYyBleGNlcHRpb25zLiAgWW91IGNvdWxkbid0IGNvbWJpbmUgYm90aCBca2V5d29yZHtleGNlcHR9IGJsb2NrcyBhbmQgYQorXGtleXdvcmR7ZmluYWxseX0gYmxvY2ssIGJlY2F1c2UgZ2VuZXJhdGluZyB0aGUgcmlnaHQgYnl0ZWNvZGUgZm9yIHRoZQorY29tYmluZWQgdmVyc2lvbiB3YXMgY29tcGxpY2F0ZWQgYW5kIGl0IHdhc24ndCBjbGVhciB3aGF0IHRoZQorc2VtYW50aWNzIG9mIHRoZSBjb21iaW5lZCBzaG91bGQgYmUuICAKKworR3ZSIHNwZW50IHNvbWUgdGltZSB3b3JraW5nIHdpdGggSmF2YSwgd2hpY2ggZG9lcyBzdXBwb3J0IHRoZQorZXF1aXZhbGVudCBvZiBjb21iaW5pbmcgXGtleXdvcmR7ZXhjZXB0fSBibG9ja3MgYW5kIGEKK1xrZXl3b3Jke2ZpbmFsbHl9IGJsb2NrLCBhbmQgdGhpcyBjbGFyaWZpZWQgd2hhdCB0aGUgc3RhdGVtZW50IHNob3VsZAorbWVhbi4gIEluIFB5dGhvbiAyLjUsIHlvdSBjYW4gbm93IHdyaXRlOgorCitcYmVnaW57dmVyYmF0aW19Cit0cnk6CisgICAgYmxvY2stMSAuLi4KK2V4Y2VwdCBFeGNlcHRpb24xOgorICAgIGhhbmRsZXItMSAuLi4KK2V4Y2VwdCBFeGNlcHRpb24yOgorICAgIGhhbmRsZXItMiAuLi4KK2Vsc2U6CisgICAgZWxzZS1ibG9jaworZmluYWxseToKKyAgICBmaW5hbC1ibG9jayAKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBjb2RlIGluIFx2YXJ7YmxvY2stMX0gaXMgZXhlY3V0ZWQuICBJZiB0aGUgY29kZSByYWlzZXMgYW4KK2V4Y2VwdGlvbiwgdGhlIGhhbmRsZXJzIGFyZSB0cmllZCBpbiBvcmRlcjogXHZhcntoYW5kbGVyLTF9LAorXHZhcntoYW5kbGVyLTJ9LCAuLi4gIElmIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZSBcdmFye2Vsc2UtYmxvY2t9CitpcyBleGVjdXRlZC4gIE5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIHByZXZpb3VzbHksIHRoZQorXHZhcntmaW5hbC1ibG9ja30gaXMgZXhlY3V0ZWQgb25jZSB0aGUgY29kZSBibG9jayBpcyBjb21wbGV0ZSBhbmQgYW55CityYWlzZWQgZXhjZXB0aW9ucyBoYW5kbGVkLiAgRXZlbiBpZiB0aGVyZSdzIGFuIGVycm9yIGluIGFuIGV4Y2VwdGlvbgoraGFuZGxlciBvciB0aGUgXHZhcntlbHNlLWJsb2NrfSBhbmQgYSBuZXcgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlCitcdmFye2ZpbmFsLWJsb2NrfSBpcyBzdGlsbCBleGVjdXRlZC4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzQxfXtVbmlmeWluZyB0cnktZXhjZXB0IGFuZCB0cnktZmluYWxseX17UEVQIHdyaXR0ZW4gYnkgR2VvcmcgQnJhbmRsOyAKK2ltcGxlbWVudGF0aW9uIGJ5IFRob21hcyBMZWUufQorCitcZW5ke3NlZWFsc299CiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAzNDI6IE5ldyBHZW5lcmF0b3IgRmVhdHVyZXN9Citcc2VjdGlvbntQRVAgMzQyOiBOZXcgR2VuZXJhdG9yIEZlYXR1cmVzXGxhYmVse3NlY3Rpb24tZ2VuZXJhdG9yc319CiAKK1B5dGhvbiAyLjUgYWRkcyBhIHNpbXBsZSB3YXkgdG8gcGFzcyB2YWx1ZXMgXGVtcGh7aW50b30gYSBnZW5lcmF0b3IuCiBBcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjMsIGdlbmVyYXRvcnMgb25seSBwcm9kdWNlIG91dHB1dDsgb25jZSBhCiBnZW5lcmF0b3IncyBjb2RlIGlzIGludm9rZWQgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yLCB0aGVyZSdzIG5vIHdheSB0bwogcGFzcyBhbnkgbmV3IGluZm9ybWF0aW9uIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gaXRzIGV4ZWN1dGlvbiBpcwotcmVzdW1lZC4gIEhhY2tpc2ggc29sdXRpb25zIHRvIHRoaXMgaW5jbHVkZSBtYWtpbmcgdGhlIGdlbmVyYXRvcidzCi1jb2RlIGxvb2sgYXQgYSBnbG9iYWwgdmFyaWFibGUgYW5kIHRoZW4gY2hhbmdpbmcgdGhlIGdsb2JhbCB2YXJpYWJsZSdzCityZXN1bWVkLiAgU29tZXRpbWVzIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gc29tZSBpbmZvcm1hdGlvbiB3b3VsZCBiZQordXNlZnVsLiAgSGFja2lzaCBzb2x1dGlvbnMgdG8gdGhpcyBpbmNsdWRlIG1ha2luZyB0aGUgZ2VuZXJhdG9yJ3MgY29kZQorbG9vayBhdCBhIGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhlbiBjaGFuZ2luZyB0aGUgZ2xvYmFsIHZhcmlhYmxlJ3MKIHZhbHVlLCBvciBwYXNzaW5nIGluIHNvbWUgbXV0YWJsZSBvYmplY3QgdGhhdCBjYWxsZXJzIHRoZW4gbW9kaWZ5LgotUHl0aG9uIDIuNSBhZGRzIHRoZSBhYmlsaXR5IHRvIHBhc3MgdmFsdWVzIFxlbXBoe2ludG99IGEgZ2VuZXJhdG9yLgogCiBUbyByZWZyZXNoIHlvdXIgbWVtb3J5IG9mIGJhc2ljIGdlbmVyYXRvcnMsIGhlcmUncyBhIHNpbXBsZSBleGFtcGxlOgogCkBAIC0yMzksNyArNDMwLDcgQEAKICAgICBpID0gMAogICAgIHdoaWxlIGkgPCBtYXhpbXVtOgogICAgICAgICB5aWVsZCBpCi0JaSArPSAxCisgICAgICAgIGkgKz0gMQogXGVuZHt2ZXJiYXRpbX0KIAogV2hlbiB5b3UgY2FsbCBcY29kZXtjb3VudGVyKDEwKX0sIHRoZSByZXN1bHQgaXMgYW4gaXRlcmF0b3IgdGhhdApAQCAtMjYxLDExICs0NTIsMTQgQEAKIGV4cHJlc3Npb24gd2hlbiB5b3UncmUgZG9pbmcgc29tZXRoaW5nIHdpdGggdGhlIHJldHVybmVkIHZhbHVlLCBhcyBpbgogdGhlIGFib3ZlIGV4YW1wbGUuICBUaGUgcGFyZW50aGVzZXMgYXJlbid0IGFsd2F5cyBuZWNlc3NhcnksIGJ1dCBpdCdzCiBlYXNpZXIgdG8gYWx3YXlzIGFkZCB0aGVtIGluc3RlYWQgb2YgaGF2aW5nIHRvIHJlbWVtYmVyIHdoZW4gdGhleSdyZQotbmVlZGVkLlxmb290bm90ZXtUaGUgZXhhY3QgcnVsZXMgYXJlIHRoYXQgYSBca2V5d29yZHt5aWVsZH0tZXhwcmVzc2lvbiBtdXN0Ci1hbHdheXMgYmUgcGFyZW50aGVzaXplZCBleGNlcHQgd2hlbiBpdCBvY2N1cnMgYXQgdGhlIHRvcC1sZXZlbAotZXhwcmVzc2lvbiBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQsIG1lYW5pbmcgeW91IGNhbgotd3JpdGUgXGNvZGV7dmFsID0geWllbGQgaX0gYnV0IGhhdmUgdG8gdXNlIHBhcmVudGhlc2VzIHdoZW4gdGhlcmUncyBhbgotb3BlcmF0aW9uLCBhcyBpbiBcY29kZXt2YWwgPSAoeWllbGQgaSkgKyAxMn0ufQorbmVlZGVkLgorCisoXHBlcHszNDJ9IGV4cGxhaW5zIHRoZSBleGFjdCBydWxlcywgd2hpY2ggYXJlIHRoYXQgYQorXGtleXdvcmR7eWllbGR9LWV4cHJlc3Npb24gbXVzdCBhbHdheXMgYmUgcGFyZW50aGVzaXplZCBleGNlcHQgd2hlbiBpdAorb2NjdXJzIGF0IHRoZSB0b3AtbGV2ZWwgZXhwcmVzc2lvbiBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlIG9mIGFuCithc3NpZ25tZW50LiAgVGhpcyBtZWFucyB5b3UgY2FuIHdyaXRlIFxjb2Rle3ZhbCA9IHlpZWxkIGl9IGJ1dCBoYXZlIHRvCit1c2UgcGFyZW50aGVzZXMgd2hlbiB0aGVyZSdzIGFuIG9wZXJhdGlvbiwgYXMgaW4gXGNvZGV7dmFsID0gKHlpZWxkIGkpCisrIDEyfS4pCiAKIFZhbHVlcyBhcmUgc2VudCBpbnRvIGEgZ2VuZXJhdG9yIGJ5IGNhbGxpbmcgaXRzCiBcbWV0aG9ke3NlbmQoXHZhcnt2YWx1ZX0pfSBtZXRob2QuICBUaGUgZ2VuZXJhdG9yJ3MgY29kZSBpcyB0aGVuCkBAIC0yODEsMTEgKzQ3NSwxMSBAQAogICAgIGkgPSAwCiAgICAgd2hpbGUgaSA8IG1heGltdW06CiAgICAgICAgIHZhbCA9ICh5aWVsZCBpKQotCSMgSWYgdmFsdWUgcHJvdmlkZWQsIGNoYW5nZSBjb3VudGVyCisgICAgICAgICMgSWYgdmFsdWUgcHJvdmlkZWQsIGNoYW5nZSBjb3VudGVyCiAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGkgPSB2YWwKLQllbHNlOgotICAJICAgIGkgKz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSArPSAxCiBcZW5ke3ZlcmJhdGltfQogCiBBbmQgaGVyZSdzIGFuIGV4YW1wbGUgb2YgY2hhbmdpbmcgdGhlIGNvdW50ZXI6CkBAIC0zNDQsMTMgKzUzOCwzMiBAQAogc3Vicm91dGluZXMuICBTdWJyb3V0aW5lcyBhcmUgZW50ZXJlZCBhdCBvbmUgcG9pbnQgYW5kIGV4aXRlZCBhdAogYW5vdGhlciBwb2ludCAodGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIGFuZCBhIFxrZXl3b3Jke3JldHVybgogc3RhdGVtZW50fSksIGJ1dCBjb3JvdXRpbmVzIGNhbiBiZSBlbnRlcmVkLCBleGl0ZWQsIGFuZCByZXN1bWVkIGF0Ci1tYW55IGRpZmZlcmVudCBwb2ludHMgKHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50cykuCittYW55IGRpZmZlcmVudCBwb2ludHMgKHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50cykuICBXZSdsbCBoYXZlIHRvCitmaWd1cmUgb3V0IHBhdHRlcm5zIGZvciB1c2luZyBjb3JvdXRpbmVzIGVmZmVjdGl2ZWx5IGluIFB5dGhvbi4KIAorVGhlIGFkZGl0aW9uIG9mIHRoZSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCBoYXMgb25lIHNpZGUgZWZmZWN0IHRoYXQKK2lzbid0IG9idmlvdXMuICBcbWV0aG9ke2Nsb3NlKCl9IGlzIGNhbGxlZCB3aGVuIGEgZ2VuZXJhdG9yIGlzCitnYXJiYWdlLWNvbGxlY3RlZCwgc28gdGhpcyBtZWFucyB0aGUgZ2VuZXJhdG9yJ3MgY29kZSBnZXRzIG9uZSBsYXN0CitjaGFuY2UgdG8gcnVuIGJlZm9yZSB0aGUgZ2VuZXJhdG9yIGlzIGRlc3Ryb3llZC4gIFRoaXMgbGFzdCBjaGFuY2UKK21lYW5zIHRoYXQgXGNvZGV7dHJ5Li4uZmluYWxseX0gc3RhdGVtZW50cyBpbiBnZW5lcmF0b3JzIGNhbiBub3cgYmUKK2d1YXJhbnRlZWQgdG8gd29yazsgdGhlIFxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZSB3aWxsIG5vdyBhbHdheXMgZ2V0IGEKK2NoYW5jZSB0byBydW4uICBUaGUgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgeW91IGNvdWxkbid0IG1peAorXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudHMgd2l0aCBhIFxjb2Rle3RyeS4uLmZpbmFsbHl9IHN1aXRlIGhhcwordGhlcmVmb3JlIGJlZW4gcmVtb3ZlZC4gIFRoaXMgc2VlbXMgbGlrZSBhIG1pbm9yIGJpdCBvZiBsYW5ndWFnZQordHJpdmlhLCBidXQgdXNpbmcgZ2VuZXJhdG9ycyBhbmQgXGNvZGV7dHJ5Li4uZmluYWxseX0gaXMgYWN0dWFsbHkKK25lY2Vzc2FyeSBpbiBvcmRlciB0byBpbXBsZW1lbnQgdGhlICBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQKK2Rlc2NyaWJlZCBieSBQRVAgMzQzLiAgSSdsbCBsb29rIGF0IHRoaXMgbmV3IHN0YXRlbWVudCBpbiB0aGUgZm9sbG93aW5nIAorc2VjdGlvbi4KKworQW5vdGhlciBldmVuIG1vcmUgZXNvdGVyaWMgZWZmZWN0IG9mIHRoaXMgY2hhbmdlOiBwcmV2aW91c2x5LCB0aGUKK1xtZW1iZXJ7Z2lfZnJhbWV9IGF0dHJpYnV0ZSBvZiBhIGdlbmVyYXRvciB3YXMgYWx3YXlzIGEgZnJhbWUgb2JqZWN0LgorSXQncyBub3cgcG9zc2libGUgZm9yIFxtZW1iZXJ7Z2lfZnJhbWV9IHRvIGJlIFxjb2Rle05vbmV9CitvbmNlIHRoZSBnZW5lcmF0b3IgaGFzIGJlZW4gZXhoYXVzdGVkLgogCiBcYmVnaW57c2VlYWxzb30KIAogXHNlZXBlcHszNDJ9e0Nvcm91dGluZXMgdmlhIEVuaGFuY2VkIEdlbmVyYXRvcnN9e1BFUCB3cml0dGVuIGJ5IAotR3VpZG8gdmFuIFJvc3N1bSBhbmQgUGhpbGxpcCBKLiBFYnk7CitHdWlkbyB2YW5+Um9zc3VtIGFuZCBQaGlsbGlwIEouIEVieTsKIGltcGxlbWVudGVkIGJ5IFBoaWxsaXAgSi4gRWJ5LiAgSW5jbHVkZXMgZXhhbXBsZXMgb2YgCiBzb21lIGZhbmNpZXIgdXNlcyBvZiBnZW5lcmF0b3JzIGFzIGNvcm91dGluZXMufQogCkBAIC0zNjcsMTQgKzU4MCwzMjMgQEAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzQzOiBUaGUgJ3dpdGgnIHN0YXRlbWVudH0KIAotJSBYWFggd3JpdGUgdGhpcworVGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBhbGxvd3MgYSBjbGVhcmVyIHZlcnNpb24gb2YgY29kZSB0aGF0Cit1c2VzIFxjb2Rle3RyeS4uLmZpbmFsbHl9IGJsb2NrcyB0byBlbnN1cmUgdGhhdCBjbGVhbi11cCBjb2RlIGlzCitleGVjdXRlZC4KKworSW4gdGhpcyBzZWN0aW9uLCBJJ2xsIGRpc2N1c3MgdGhlIHN0YXRlbWVudCBhcyBpdCB3aWxsIGNvbW1vbmx5IGJlCit1c2VkLiAgSW4gdGhlIG5leHQgc2VjdGlvbiwgSSdsbCBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCithbmQgc2hvdyBob3cgdG8gd3JpdGUgb2JqZWN0cyBjYWxsZWQgYGBjb250ZXh0IG1hbmFnZXJzJycgYW5kCitgYGNvbnRleHRzJycgZm9yIHVzZSB3aXRoIHRoaXMgc3RhdGVtZW50LgorCitUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGlzIGEgbmV3IGNvbnRyb2wtZmxvdyBzdHJ1Y3R1cmUgd2hvc2UKK2Jhc2ljIHN0cnVjdHVyZSBpczoKKworXGJlZ2lue3ZlcmJhdGltfQord2l0aCBleHByZXNzaW9uIFthcyB2YXJpYWJsZV06CisgICAgd2l0aC1ibG9jaworXGVuZHt2ZXJiYXRpbX0KKworVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgaXQgc2hvdWxkIHJlc3VsdCBpbiBhIHR5cGUgb2Ygb2JqZWN0Cit0aGF0J3MgY2FsbGVkIGEgY29udGV4dCBtYW5hZ2VyLiAgVGhlIGNvbnRleHQgbWFuYWdlciBjYW4gcmV0dXJuIGEKK3ZhbHVlIHRoYXQgY2FuIG9wdGlvbmFsbHkgYmUgYm91bmQgdG8gdGhlIG5hbWUgXHZhcnt2YXJpYWJsZX0uICAoTm90ZQorY2FyZWZ1bGx5OiBcdmFye3ZhcmlhYmxlfSBpcyBcZW1waHtub3R9IGFzc2lnbmVkIHRoZSByZXN1bHQgb2YKK1x2YXJ7ZXhwcmVzc2lvbn0uKSAgT25lIG1ldGhvZCBvZiB0aGUgY29udGV4dCBtYW5hZ2VyIGlzIHJ1biBiZWZvcmUKK1x2YXJ7d2l0aC1ibG9ja30gaXMgZXhlY3V0ZWQsIGFuZCBhbm90aGVyIG1ldGhvZCBpcyBydW4gYWZ0ZXIgdGhlCitibG9jayBpcyBkb25lLCBldmVuIGlmIHRoZSBibG9jayByYWlzZWQgYW4gZXhjZXB0aW9uLgorCitUbyBlbmFibGUgdGhlIHN0YXRlbWVudCBpbiBQeXRob24gMi41LCB5b3UgbmVlZCAKK3RvIGFkZCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSB0byB5b3VyIG1vZHVsZToKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorXGVuZHt2ZXJiYXRpbX0KKworVGhlIHN0YXRlbWVudCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkIGluIFB5dGhvbiAyLjYuCisKK1NvbWUgc3RhbmRhcmQgUHl0aG9uIG9iamVjdHMgY2FuIG5vdyBiZWhhdmUgYXMgY29udGV4dCBtYW5hZ2Vycy4gRmlsZQorb2JqZWN0cyBhcmUgb25lIGV4YW1wbGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3dpdGggb3BlbignL2V0Yy9wYXNzd2QnLCAncicpIGFzIGY6CisgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgcHJpbnQgbGluZQorICAgICAgICAuLi4gbW9yZSBwcm9jZXNzaW5nIGNvZGUgLi4uCitcZW5ke3ZlcmJhdGltfQorCitBZnRlciB0aGlzIHN0YXRlbWVudCBoYXMgZXhlY3V0ZWQsIHRoZSBmaWxlIG9iamVjdCBpbiBcdmFye2Z9IHdpbGwKK2hhdmUgYmVlbiBhdXRvbWF0aWNhbGx5IGNsb3NlZCBhdCB0aGlzIHBvaW50LCBldmVuIGlmIHRoZSAnZm9yJyBsb29wCityYWlzZWQgYW4gZXhjZXB0aW9uIHBhcnQtd2F5IHRocm91Z2ggdGhlIGJsb2NrLgorCitUaGUgXG1vZHVsZXt0aHJlYWRpbmd9IG1vZHVsZSdzIGxvY2tzIGFuZCBjb25kaXRpb24gdmFyaWFibGVzIAorYWxzbyBzdXBwb3J0IHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCit3aXRoIGxvY2s6CisgICAgIyBDcml0aWNhbCBzZWN0aW9uIG9mIGNvZGUKKyAgICAuLi4KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBsb2NrIGlzIGFjcXVpcmVkIGJlZm9yZSB0aGUgYmxvY2sgaXMgZXhlY3V0ZWQsIGFuZCBhbHdheXMgcmVsZWFzZWQgb25jZSAKK3RoZSBibG9jayBpcyBjb21wbGV0ZS4KKworVGhlIFxtb2R1bGV7ZGVjaW1hbH0gbW9kdWxlJ3MgY29udGV4dHMsIHdoaWNoIGVuY2Fwc3VsYXRlIHRoZSBkZXNpcmVkCitwcmVjaXNpb24gYW5kIHJvdW5kaW5nIGNoYXJhY3RlcmlzdGljcyBmb3IgY29tcHV0YXRpb25zLCBjYW4gYWxzbyBiZQordXNlZCBhcyBjb250ZXh0IG1hbmFnZXJzLgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgZGVjaW1hbAorCisjIERpc3BsYXlzIHdpdGggZGVmYXVsdCBwcmVjaXNpb24gb2YgMjggZGlnaXRzCit2MSA9IGRlY2ltYWwuRGVjaW1hbCgnNTc4JykKK3ByaW50IHYxLnNxcnQoKQorCit3aXRoIGRlY2ltYWwuQ29udGV4dChwcmVjPTE2KToKKyAgICAjIEFsbCBjb2RlIGluIHRoaXMgYmxvY2sgdXNlcyBhIHByZWNpc2lvbiBvZiAxNiBkaWdpdHMuCisgICAgIyBUaGUgb3JpZ2luYWwgY29udGV4dCBpcyByZXN0b3JlZCBvbiBleGl0aW5nIHRoZSBibG9jay4KKyAgICBwcmludCB2MS5zcXJ0KCkKK1xlbmR7dmVyYmF0aW19CisKK1xzdWJzZWN0aW9ue1dyaXRpbmcgQ29udGV4dCBNYW5hZ2Vyc30KKworVW5kZXIgdGhlIGhvb2QsIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgaXMgZmFpcmx5IGNvbXBsaWNhdGVkLgorTW9zdCBwZW9wbGUgd2lsbCBvbmx5IHVzZSBca2V5d29yZHt3aXRofSBpbiBjb21wYW55IHdpdGgKK2V4aXN0aW5nIG9iamVjdHMgdGhhdCBhcmUgZG9jdW1lbnRlZCB0byB3b3JrIGFzIGNvbnRleHQgbWFuYWdlcnMsIGFuZAorZG9uJ3QgbmVlZCB0byBrbm93IHRoZXNlIGRldGFpbHMsIHNvIHlvdSBjYW4gc2tpcCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gaWYKK3lvdSBsaWtlLiAgQXV0aG9ycyBvZiBuZXcgY29udGV4dCBtYW5hZ2VycyB3aWxsIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUKK2RldGFpbHMgb2YgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCisKK0EgaGlnaC1sZXZlbCBleHBsYW5hdGlvbiBvZiB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sIGlzOgorCitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhbmQgc2hvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QKK3RoYXQncyBhIGNvbnRleHQgbWFuYWdlciwgbWVhbmluZyB0aGF0IGl0IGhhcyBhIAorXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtZXRob2QuCisKK1xpdGVtIFRoaXMgb2JqZWN0J3MgXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtZXRob2QgaXMgY2FsbGVkLCBhbmQgbXVzdAorcmV0dXJuIGEgY29udGV4dCBvYmplY3QuICAKKworXGl0ZW0gVGhlIGNvbnRleHQncyBcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QgaXMgY2FsbGVkLiAKK1RoZSB2YWx1ZSByZXR1cm5lZCBpcyBhc3NpZ25lZCB0byBcdmFye1ZBUn0uICBJZiBubyBcY29kZXthcyBcdmFye1ZBUn19IAorY2xhdXNlIGlzIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyBzaW1wbHkgZGlzY2FyZGVkLgorCitcaXRlbSBUaGUgY29kZSBpbiBcdmFye0JMT0NLfSBpcyBleGVjdXRlZC4KKworXGl0ZW0gSWYgXHZhcntCTE9DS30gcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIGNvbnRleHQgb2JqZWN0J3MKK1xtZXRob2R7X19leGl0X18oXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9IGlzIGNhbGxlZAord2l0aCB0aGUgZXhjZXB0aW9uJ3MgaW5mb3JtYXRpb24sIHRoZSBzYW1lIHZhbHVlcyByZXR1cm5lZCBieQorXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfS4gIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUKK2NvbnRyb2xzIHdoZXRoZXIgdGhlIGV4Y2VwdGlvbiBpcyByZS1yYWlzZWQ6IGFueSBmYWxzZSB2YWx1ZSAKK3JlLXJhaXNlcyB0aGUgZXhjZXB0aW9uLCBhbmQgXGNvZGV7VHJ1ZX0gd2lsbCByZXN1bHQgaW4gc3VwcHJlc3NpbmcgaXQuCitZb3UnbGwgb25seSByYXJlbHkgd2FudCB0byBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uOyB0aGUgCithdXRob3Igb2YgdGhlIGNvZGUgY29udGFpbmluZyB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHdpbGwgCituZXZlciByZWFsaXplIGFueXRoaW5nIHdlbnQgd3JvbmcuCisKK1xpdGVtIElmIFx2YXJ7QkxPQ0t9IGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24sIAordGhlIGNvbnRleHQgb2JqZWN0J3MgXG1ldGhvZHtfX2V4aXRfXygpfSBpcyBzdGlsbCBjYWxsZWQsCitidXQgXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIGFuZCBcdmFye3RyYWNlYmFja30gYXJlIGFsbCBcY29kZXtOb25lfS4KKworXGVuZHtpdGVtaXplfQorCitMZXQncyB0aGluayB0aHJvdWdoIGFuIGV4YW1wbGUuICBJIHdvbid0IHByZXNlbnQgZGV0YWlsZWQgY29kZSBidXQKK3dpbGwgb25seSBza2V0Y2ggdGhlIG5lY2Vzc2FyeSBjb2RlLiAgVGhlIGV4YW1wbGUgd2lsbCBiZSB3cml0aW5nIGEKK2NvbnRleHQgbWFuYWdlciBmb3IgYSBkYXRhYmFzZSB0aGF0IHN1cHBvcnRzIHRyYW5zYWN0aW9ucy4KKworKEZvciBwZW9wbGUgdW5mYW1pbGlhciB3aXRoIGRhdGFiYXNlIHRlcm1pbm9sb2d5OiBhIHNldCBvZiBjaGFuZ2VzIHRvCit0aGUgZGF0YWJhc2UgYXJlIGdyb3VwZWQgaW50byBhIHRyYW5zYWN0aW9uLiAgVHJhbnNhY3Rpb25zIGNhbiBiZQorZWl0aGVyIGNvbW1pdHRlZCwgbWVhbmluZyB0aGF0IGFsbCB0aGUgY2hhbmdlcyBhcmUgd3JpdHRlbiBpbnRvIHRoZQorZGF0YWJhc2UsIG9yIHJvbGxlZCBiYWNrLCBtZWFuaW5nIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGFsbCBkaXNjYXJkZWQKK2FuZCB0aGUgZGF0YWJhc2UgaXMgdW5jaGFuZ2VkLiAgU2VlIGFueSBkYXRhYmFzZSB0ZXh0Ym9vayBmb3IgbW9yZQoraW5mb3JtYXRpb24uKQorJSBYWFggZmluZCBhIHNob3J0ZXIgcmVmZXJlbmNlPworCitMZXQncyBhc3N1bWUgdGhlcmUncyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4KK091ciBnb2FsIHdpbGwgYmUgdG8gbGV0IHRoZSB1c2VyIHdyaXRlIGNvZGUgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19CitkYl9jb25uZWN0aW9uID0gRGF0YWJhc2VDb25uZWN0aW9uKCkKK3dpdGggZGJfY29ubmVjdGlvbiBhcyBjdXJzb3I6CisgICAgY3Vyc29yLmV4ZWN1dGUoJ2luc2VydCBpbnRvIC4uLicpCisgICAgY3Vyc29yLmV4ZWN1dGUoJ2RlbGV0ZSBmcm9tIC4uLicpCisgICAgIyAuLi4gbW9yZSBvcGVyYXRpb25zIC4uLgorXGVuZHt2ZXJiYXRpbX0KKworVGhlIHRyYW5zYWN0aW9uIHNob3VsZCBlaXRoZXIgYmUgY29tbWl0dGVkIGlmIHRoZSBjb2RlIGluIHRoZSBibG9jaworcnVucyBmbGF3bGVzc2x5LCBvciByb2xsZWQgYmFjayBpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbi4KKworRmlyc3QsIHRoZSBcY2xhc3N7RGF0YWJhc2VDb25uZWN0aW9ufSBuZWVkcyBhIFxtZXRob2R7X19jb250ZXh0X18oKX0KK21ldGhvZC4gIFNvbWV0aW1lcyBhbiBvYmplY3QgY2FuIGJlIGl0cyBvd24gY29udGV4dCBtYW5hZ2VyIGFuZCBjYW4KK3NpbXBseSByZXR1cm4gXGNvZGV7c2VsZn07IHRoZSBcbW9kdWxle3RocmVhZGluZ30gbW9kdWxlJ3MgbG9jayBvYmplY3RzIAorY2FuIGRvIHRoaXMuICBGb3Igb3VyIGRhdGFiYXNlIGV4YW1wbGUsIHRob3VnaCwgd2UgbmVlZCB0byAKK2NyZWF0ZSBhIG5ldyBvYmplY3Q7IEknbGwgY2FsbCB0aGlzIGNsYXNzIFxjbGFzc3tEYXRhYmFzZUNvbnRleHR9LgorT3VyIFxtZXRob2R7X19jb250ZXh0X18oKX0gbXVzdCB0aGVyZWZvcmUgbG9vayBsaWtlIHRoaXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2NsYXNzIERhdGFiYXNlQ29ubmVjdGlvbjoKKyAgICAuLi4KKyAgICBkZWYgX19jb250ZXh0X18gKHNlbGYpOgorICAgICAgICByZXR1cm4gRGF0YWJhc2VDb250ZXh0KHNlbGYpCisKKyAgICAjIERhdGFiYXNlIGludGVyZmFjZQorICAgIGRlZiBjdXJzb3IgKHNlbGYpOgorICAgICAgICAiUmV0dXJucyBhIGN1cnNvciBvYmplY3QgYW5kIHN0YXJ0cyBhIG5ldyB0cmFuc2FjdGlvbiIKKyAgICBkZWYgY29tbWl0IChzZWxmKToKKyAgICAgICAgIkNvbW1pdHMgY3VycmVudCB0cmFuc2FjdGlvbiIKKyAgICBkZWYgcm9sbGJhY2sgKHNlbGYpOgorICAgICAgICAiUm9sbHMgYmFjayBjdXJyZW50IHRyYW5zYWN0aW9uIgorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGNvbnRleHQgbmVlZHMgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IHNvIHRoYXQgdGhlIGNvbm5lY3Rpb24KK29iamVjdCdzIFxtZXRob2R7Y29tbWl0KCl9IG9yIFxtZXRob2R7cm9sbGJhY2soKX0gbWV0aG9kcyBjYW4gYmUKK2NhbGxlZDoKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgRGF0YWJhc2VDb250ZXh0OgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgY29ubmVjdGlvbik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBcbWV0aG9kIHtfX2VudGVyX18oKX0gbWV0aG9kIGlzIHByZXR0eSBlYXN5LCBoYXZpbmcgb25seQordG8gc3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24uICBJbiB0aGlzIGV4YW1wbGUsCit0aGUgcmVzdWx0aW5nIGN1cnNvciBvYmplY3Qgd291bGQgYmUgYSB1c2VmdWwgcmVzdWx0LAorc28gdGhlIG1ldGhvZCB3aWxsIHJldHVybiBpdC4gIFRoZSB1c2VyIGNhbiAKK3RoZW4gYWRkIFxjb2Rle2FzIGN1cnNvcn0gdG8gdGhlaXIgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50Cit0byBiaW5kIHRoZSBjdXJzb3IgdG8gYSB2YXJpYWJsZSBuYW1lLgorCitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBEYXRhYmFzZUNvbnRleHQ6CisgICAgLi4uCisgICAgZGVmIF9fZW50ZXJfXyAoc2VsZik6CisgICAgICAgICMgQ29kZSB0byBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbgorICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKKyAgICAgICAgcmV0dXJuIGN1cnNvcgorXGVuZHt2ZXJiYXRpbX0KKworVGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIGlzIHRoZSBtb3N0IGNvbXBsaWNhdGVkIGJlY2F1c2UgaXQncword2hlcmUgbW9zdCBvZiB0aGUgd29yayBoYXMgdG8gYmUgZG9uZS4gIFRoZSBtZXRob2QgaGFzIHRvIGNoZWNrIGlmIGFuCitleGNlcHRpb24gb2NjdXJyZWQuICBJZiB0aGVyZSB3YXMgbm8gZXhjZXB0aW9uLCB0aGUgdHJhbnNhY3Rpb24gaXMKK2NvbW1pdHRlZC4gIFRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjayBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uLgorSGVyZSB0aGUgY29kZSB3aWxsIGp1c3QgZmFsbCBvZmYgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHJldHVybmluZyAKK3RoZSBkZWZhdWx0IHZhbHVlIG9mIFxjb2Rle05vbmV9LiAgXGNvZGV7Tm9uZX0gaXMgZmFsc2UsIHNvIHRoZSBleGNlcHRpb24KK3dpbGwgYmUgcmUtcmFpc2VkIGF1dG9tYXRpY2FsbHkuICBJZiB5b3Ugd2lzaGVkLCB5b3UgY291bGQgYmUgbW9yZSBleHBsaWNpdAorYW5kIGFkZCBhIFxrZXl3b3Jke3JldHVybn0gYXQgdGhlIG1hcmtlZCBsb2NhdGlvbi4KKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgRGF0YWJhc2VDb250ZXh0OgorICAgIC4uLgorICAgIGRlZiBfX2V4aXRfXyAoc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgaWYgdGIgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm8gZXhjZXB0aW9uLCBzbyBjb21taXQKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBFeGNlcHRpb24gb2NjdXJyZWQsIHNvIHJvbGxiYWNrLgorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgICMgcmV0dXJuIEZhbHNlCitcZW5ke3ZlcmJhdGltfQorCisKK1xzdWJzZWN0aW9ue1RoZSBjb250ZXh0bGliIG1vZHVsZVxsYWJlbHttb2R1bGUtY29udGV4dGxpYn19CisKK1RoZSBuZXcgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUgcHJvdmlkZXMgc29tZSBmdW5jdGlvbnMgYW5kIGEKK2RlY29yYXRvciB0aGF0IGFyZSB1c2VmdWwgZm9yIHdyaXRpbmcgY29udGV4dCBtYW5hZ2Vycy4KKworVGhlIGRlY29yYXRvciBpcyBjYWxsZWQgXGZ1bmN0aW9ue2NvbnRleHRtYW5hZ2VyfSwgYW5kIGxldHMgeW91IHdyaXRlCithIHNpbXBsZSBjb250ZXh0IG1hbmFnZXIgYXMgYSBnZW5lcmF0b3IuICBUaGUgZ2VuZXJhdG9yIHNob3VsZCB5aWVsZAorZXhhY3RseSBvbmUgdmFsdWUuICBUaGUgY29kZSB1cCB0byB0aGUgXGtleXdvcmR7eWllbGR9IHdpbGwgYmUKK2V4ZWN1dGVkIGFzIHRoZSBcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QsIGFuZCB0aGUgdmFsdWUgeWllbGRlZAord2lsbCBiZSB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBnZXQgYm91bmQgdG8gdGhlIHZhcmlhYmxlCitpbiB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50J3MgXGtleXdvcmR7YXN9IGNsYXVzZSwgaWYgYW55LiAgVGhlCitjb2RlIGFmdGVyIHRoZSBca2V5d29yZHt5aWVsZH0gd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUKK1xtZXRob2R7X19leGl0X18oKX0gbWV0aG9kLiAgQW55IGV4Y2VwdGlvbiByYWlzZWQgaW4gdGhlIGJsb2NrIAord2lsbCBiZSByYWlzZWQgYnkgdGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQuCisKK091ciBkYXRhYmFzZSBleGFtcGxlIGZyb20gdGhlIHByZXZpb3VzIHNlY3Rpb24gY291bGQgYmUgd3JpdHRlbiAKK3VzaW5nIHRoaXMgZGVjb3JhdG9yIGFzOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCisKK0Bjb250ZXh0bWFuYWdlcgorZGVmIGRiX3RyYW5zYWN0aW9uIChjb25uZWN0aW9uKToKKyAgICBjdXJzb3IgPSBjb25uZWN0aW9uLmN1cnNvcigpCisgICAgdHJ5OgorICAgICAgICB5aWVsZCBjdXJzb3IKKyAgICBleGNlcHQ6CisgICAgICAgIGNvbm5lY3Rpb24ucm9sbGJhY2soKQorICAgICAgICByYWlzZQorICAgIGVsc2U6CisgICAgICAgIGNvbm5lY3Rpb24uY29tbWl0KCkKKworZGIgPSBEYXRhYmFzZUNvbm5lY3Rpb24oKQord2l0aCBkYl90cmFuc2FjdGlvbihkYikgYXMgY3Vyc29yOgorICAgIC4uLgorXGVuZHt2ZXJiYXRpbX0KKworWW91IGNhbiBhbHNvIHVzZSB0aGlzIGRlY29yYXRvciB0byB3cml0ZSB0aGUgXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtZXRob2QKK2ZvciBhIGNsYXNzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgY2xhc3MgZm9yIHRoZSBjb250ZXh0OgorCitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb246CisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX19jb250ZXh0X18gKHNlbGYpOgorCWN1cnNvciA9IHNlbGYuY3Vyc29yKCkKKwl0cnk6CisJICAgIHlpZWxkIGN1cnNvcgorCWV4Y2VwdDoKKwkgICAgc2VsZi5yb2xsYmFjaygpCisJICAgIHJhaXNlCisJZWxzZToKKwkgICAgc2VsZi5jb21taXQoKQorXGVuZHt2ZXJiYXRpbX0KKworCitUaGVyZSdzIGEgXGZ1bmN0aW9ue25lc3RlZChcdmFye21ncjF9LCBcdmFye21ncjJ9LCAuLi4pfSBtYW5hZ2VyIHRoYXQKK2NvbWJpbmVzIGEgbnVtYmVyIG9mIGNvbnRleHQgbWFuYWdlcnMgc28geW91IGRvbid0IG5lZWQgdG8gd3JpdGUKK25lc3RlZCBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnRzLiAgVGhpcyBleGFtcGxlIHN0YXRlbWVudCBkb2VzIHR3bwordGhpbmdzLCBzdGFydGluZyBhIGRhdGFiYXNlIHRyYW5zYWN0aW9uIGFuZCBhY3F1aXJpbmcgYSB0aHJlYWQgbG9jazoKKworXGJlZ2lue3ZlcmJhdGltfQorbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKK3dpdGggbmVzdGVkIChkYl90cmFuc2FjdGlvbihkYiksIGxvY2spIGFzIChjdXJzb3IsIGxvY2tlZCk6CisgICAgLi4uCitcZW5ke3ZlcmJhdGltfQorCitGaW5hbGx5LCB0aGUgXGZ1bmN0aW9ue2Nsb3NpbmcoXHZhcntvYmplY3R9KX0gY29udGV4dCBtYW5hZ2VyIAorcmV0dXJucyBcdmFye29iamVjdH0gc28gdGhhdCBpdCBjYW4gYmUgYm91bmQgdG8gYSB2YXJpYWJsZSwKK2FuZCBjYWxscyBcY29kZXtcdmFye29iamVjdH0uY2xvc2UoKX0gYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCB1cmxsaWIsIHN5cworZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCisKK3dpdGggY2xvc2luZyh1cmxsaWIudXJsb3BlbignaHR0cDovL3d3dy55YWhvby5jb20nKSkgYXMgZjoKKyAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCitcZW5ke3ZlcmJhdGltfQorCitcYmVnaW57c2VlYWxzb30KKworXHNlZXBlcHszNDN9e1RoZSBgYHdpdGgnJyBzdGF0ZW1lbnR9e1BFUCB3cml0dGVuIGJ5IEd1aWRvIHZhbn5Sb3NzdW0KK2FuZCBOaWNrIENvZ2hsYW47IGltcGxlbWVudGVkIGJ5IE1pa2UgQmxhbmQsIEd1aWRvIHZhbn5Sb3NzdW0sIGFuZAorTmVhbCBOb3J3aXR6LiAgVGhlIFBFUCBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgXGtleXdvcmR7d2l0aH0KK3N0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGhlbHBmdWwgaW4gbGVhcm5pbmcgaG93IGNvbnRleHQgbWFuYWdlcnMKK3dvcmsufQorCitcc2VldXJsey4uL2xpYi9tb2R1bGUtY29udGV4dGxpYi5odG1sfXtUaGUgZG9jdW1lbnRhdGlvbiAKK2ZvciB0aGUgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUufQorCitcZW5ke3NlZWFsc299CiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzNTI6IEV4Y2VwdGlvbnMgYXMgTmV3LVN0eWxlIENsYXNzZXN9CiAKLUV4Y2VwdGlvbiBjbGFzc2VzIGNhbiBub3cgYmUgbmV3LXN0eWxlIGNsYXNzZXMsIG5vdCBqdXN0IGNsYXNzaWMgY2xhc3NlcywKLWFuZCB0aGUgYnVpbHQtaW4gXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzIGFuZCBhbGwKK0V4Y2VwdGlvbiBjbGFzc2VzIGNhbiBub3cgYmUgbmV3LXN0eWxlIGNsYXNzZXMsIG5vdCBqdXN0IGNsYXNzaWMKK2NsYXNzZXMsIGFuZCB0aGUgYnVpbHQtaW4gXGV4Y2VwdGlvbntFeGNlcHRpb259IGNsYXNzIGFuZCBhbGwgdGhlCitzdGFuZGFyZCBidWlsdC1pbiBleGNlcHRpb25zIChcZXhjZXB0aW9ue05hbWVFcnJvcn0sCitcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9LCBldGMuKSBhcmUgbm93IG5ldy1zdHlsZSBjbGFzc2VzLgogCiBUaGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciBleGNlcHRpb25zIGhhcyBiZWVuIHJlYXJyYW5nZWQgYSBiaXQuCiBJbiAyLjUsIHRoZSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGFyZToKQEAgLTQyOCw4ICs5NTAsNzAgQEAKIAogXGJlZ2lue3NlZWFsc299CiAKLVxzZWVwZXB7MzUyfXt9e1BFUCB3cml0dGVuIGJ5IAotQnJldHQgQ2Fubm9uIGFuZCBHdWlkbyB2YW4gUm9zc3VtOyBpbXBsZW1lbnRlZCBieSBCcmV0dCBDYW5ub24ufQorXHNlZXBlcHszNTJ9e1JlcXVpcmVkIFN1cGVyY2xhc3MgZm9yIEV4Y2VwdGlvbnN9e1BFUCB3cml0dGVuIGJ5IAorQnJldHQgQ2Fubm9uIGFuZCBHdWlkbyB2YW5+Um9zc3VtOyBpbXBsZW1lbnRlZCBieSBCcmV0dCBDYW5ub24ufQorCitcZW5ke3NlZWFsc299CisKKworJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1xzZWN0aW9ue1BFUCAzNTM6IFVzaW5nIHNzaXplX3QgYXMgdGhlIGluZGV4IHR5cGVcbGFiZWx7c2VjdGlvbi0zNTN9fQorCitBIHdpZGUtcmFuZ2luZyBjaGFuZ2UgdG8gUHl0aG9uJ3MgQyBBUEksIHVzaW5nIGEgbmV3IAorXGN0eXBle1B5X3NzaXplX3R9IHR5cGUgZGVmaW5pdGlvbiBpbnN0ZWFkIG9mIFxjdHlwZXtpbnR9LCAKK3dpbGwgcGVybWl0IHRoZSBpbnRlcnByZXRlciB0byBoYW5kbGUgbW9yZSBkYXRhIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCitUaGlzIGNoYW5nZSBkb2Vzbid0IGFmZmVjdCBQeXRob24ncyBjYXBhY2l0eSBvbiAzMi1iaXQgcGxhdGZvcm1zLgorCitWYXJpb3VzIHBpZWNlcyBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyIHVzZWQgQydzIFxjdHlwZXtpbnR9IHR5cGUgdG8KK3N0b3JlIHNpemVzIG9yIGNvdW50czsgZm9yIGV4YW1wbGUsIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBsaXN0IG9yCit0dXBsZSB3ZXJlIHN0b3JlZCBpbiBhbiBcY3R5cGV7aW50fS4gIFRoZSBDIGNvbXBpbGVycyBmb3IgbW9zdCA2NC1iaXQKK3BsYXRmb3JtcyBzdGlsbCBkZWZpbmUgXGN0eXBle2ludH0gYXMgYSAzMi1iaXQgdHlwZSwgc28gdGhhdCBtZWFudAordGhhdCBsaXN0cyBjb3VsZCBvbmx5IGhvbGQgdXAgdG8gXGNvZGV7MioqMzEgLSAxfSA9IDIxNDc0ODM2NDcgaXRlbXMuCisoVGhlcmUgYXJlIGFjdHVhbGx5IGEgZmV3IGRpZmZlcmVudCBwcm9ncmFtbWluZyBtb2RlbHMgdGhhdCA2NC1iaXQgQworY29tcGlsZXJzIGNhbiB1c2UgLS0gc2VlCitcdXJse2h0dHA6Ly93d3cudW5peC5vcmcvdmVyc2lvbjIvd2hhdHNuZXcvbHA2NF93cC5odG1sfSBmb3IgYQorZGlzY3Vzc2lvbiAtLSBidXQgdGhlIG1vc3QgY29tbW9ubHkgYXZhaWxhYmxlIG1vZGVsIGxlYXZlcyBcY3R5cGV7aW50fQorYXMgMzIgYml0cy4pCisKK0EgbGltaXQgb2YgMjE0NzQ4MzY0NyBpdGVtcyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgb24gYSAzMi1iaXQgcGxhdGZvcm0KK2JlY2F1c2UgeW91J2xsIHJ1biBvdXQgb2YgbWVtb3J5IGJlZm9yZSBoaXR0aW5nIHRoZSBsZW5ndGggbGltaXQuCitFYWNoIGxpc3QgaXRlbSByZXF1aXJlcyBzcGFjZSBmb3IgYSBwb2ludGVyLCB3aGljaCBpcyA0IGJ5dGVzLCBwbHVzCitzcGFjZSBmb3IgYSBcY3R5cGV7UHlPYmplY3R9IHJlcHJlc2VudGluZyB0aGUgaXRlbS4gIDIxNDc0ODM2NDcqNCBpcworYWxyZWFkeSBtb3JlIGJ5dGVzIHRoYW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSBjYW4gY29udGFpbi4KKworSXQncyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoYXQgbXVjaCBtZW1vcnkgb24gYSA2NC1iaXQgcGxhdGZvcm0sCitob3dldmVyLiAgVGhlIHBvaW50ZXJzIGZvciBhIGxpc3QgdGhhdCBzaXplIHdvdWxkIG9ubHkgcmVxdWlyZSAxNkdpQgorb2Ygc3BhY2UsIHNvIGl0J3Mgbm90IHVucmVhc29uYWJsZSB0aGF0IFB5dGhvbiBwcm9ncmFtbWVycyBtaWdodAorY29uc3RydWN0IGxpc3RzIHRoYXQgbGFyZ2UuICBUaGVyZWZvcmUsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaGFkIHRvCitiZSBjaGFuZ2VkIHRvIHVzZSBzb21lIHR5cGUgb3RoZXIgdGhhbiBcY3R5cGV7aW50fSwgYW5kIHRoaXMgd2lsbCBiZSBhCis2NC1iaXQgdHlwZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgVGhlIGNoYW5nZSB3aWxsIGNhdXNlCitpbmNvbXBhdGliaWxpdGllcyBvbiA2NC1iaXQgbWFjaGluZXMsIHNvIGl0IHdhcyBkZWVtZWQgd29ydGggbWFraW5nCit0aGUgdHJhbnNpdGlvbiBub3csIHdoaWxlIHRoZSBudW1iZXIgb2YgNjQtYml0IHVzZXJzIGlzIHN0aWxsCityZWxhdGl2ZWx5IHNtYWxsLiAgKEluIDUgb3IgMTAgeWVhcnMsIHdlIG1heSBcZW1waHthbGx9IGJlIG9uIDY0LWJpdAorbWFjaGluZXMsIGFuZCB0aGUgdHJhbnNpdGlvbiB3b3VsZCBiZSBtb3JlIHBhaW5mdWwgdGhlbi4pCisKK1RoaXMgY2hhbmdlIG1vc3Qgc3Ryb25nbHkgYWZmZWN0cyBhdXRob3JzIG9mIEMgZXh0ZW5zaW9uIG1vZHVsZXMuICAKK1B5dGhvbiBzdHJpbmdzIGFuZCBjb250YWluZXIgdHlwZXMgc3VjaCBhcyBsaXN0cyBhbmQgdHVwbGVzIAorbm93IHVzZSBcY3R5cGV7UHlfc3NpemVfdH0gdG8gc3RvcmUgdGhlaXIgc2l6ZS4gIAorRnVuY3Rpb25zIHN1Y2ggYXMgXGNmdW5jdGlvbntQeUxpc3RfU2l6ZSgpfSAKK25vdyByZXR1cm4gXGN0eXBle1B5X3NzaXplX3R9LiAgQ29kZSBpbiBleHRlbnNpb24gbW9kdWxlcworbWF5IHRoZXJlZm9yZSBuZWVkIHRvIGhhdmUgc29tZSB2YXJpYWJsZXMgY2hhbmdlZCB0bworXGN0eXBle1B5X3NzaXplX3R9LiAgCisKK1RoZSBcY2Z1bmN0aW9ue1B5QXJnX1BhcnNlVHVwbGUoKX0gYW5kIFxjZnVuY3Rpb257UHlfQnVpbGRWYWx1ZSgpfSBmdW5jdGlvbnMKK2hhdmUgYSBuZXcgY29udmVyc2lvbiBjb2RlLCBcc2FtcHtufSwgZm9yIFxjdHlwZXtQeV9zc2l6ZV90fS4gIAorXGNmdW5jdGlvbntQeUFyZ19QYXJzZVR1cGxlKCl9J3MgXHNhbXB7c1wjfSBhbmQgXHNhbXB7dFwjfSBzdGlsbCBvdXRwdXQKK1xjdHlwZXtpbnR9IGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGRlZmluZSB0aGUgbWFjcm8gCitcY3NpbXBsZW1hY3Jve1BZX1NTSVpFX1RfQ0xFQU59IGJlZm9yZSBpbmNsdWRpbmcgXGZpbGV7UHl0aG9uLmh9IAordG8gbWFrZSB0aGVtIHJldHVybiBcY3R5cGV7UHlfc3NpemVfdH0uCisKK1xwZXB7MzUzfSBoYXMgYSBzZWN0aW9uIG9uIGNvbnZlcnNpb24gZ3VpZGVsaW5lcyB0aGF0IAorZXh0ZW5zaW9uIGF1dGhvcnMgc2hvdWxkIHJlYWQgdG8gbGVhcm4gYWJvdXQgc3VwcG9ydGluZyA2NC1iaXQKK3BsYXRmb3Jtcy4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzUzfXtVc2luZyBzc2l6ZV90IGFzIHRoZSBpbmRleCB0eXBlfXtQRVAgd3JpdHRlbiBhbmQgaW1wbGVtZW50ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzLn0KIAogXGVuZHtzZWVhbHNvfQogCkBAIC00MzcsNyArMTAyMSw0NyBAQAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzNTc6IFRoZSAnX19pbmRleF9fJyBtZXRob2R9CiAKLSUgWFhYIHdyaXRlIHRoaXMKK1RoZSBOdW1QeSBkZXZlbG9wZXJzIGhhZCBhIHByb2JsZW0gdGhhdCBjb3VsZCBvbmx5IGJlIHNvbHZlZCBieSBhZGRpbmcKK2EgbmV3IHNwZWNpYWwgbWV0aG9kLCBcbWV0aG9ke19faW5kZXhfX30uICBXaGVuIHVzaW5nIHNsaWNlIG5vdGF0aW9uLAorYXMgaW4gXGNvZGV7W1x2YXJ7c3RhcnR9Olx2YXJ7c3RvcH06XHZhcntzdGVwfV19LCB0aGUgdmFsdWVzIG9mIHRoZQorXHZhcntzdGFydH0sIFx2YXJ7c3RvcH0sIGFuZCBcdmFye3N0ZXB9IGluZGV4ZXMgbXVzdCBhbGwgYmUgZWl0aGVyCitpbnRlZ2VycyBvciBsb25nIGludGVnZXJzLiAgTnVtUHkgZGVmaW5lcyBhIHZhcmlldHkgb2Ygc3BlY2lhbGl6ZWQKK2ludGVnZXIgdHlwZXMgY29ycmVzcG9uZGluZyB0byB1bnNpZ25lZCBhbmQgc2lnbmVkIGludGVnZXJzIG9mIDgsIDE2LAorMzIsIGFuZCA2NCBiaXRzLCBidXQgdGhlcmUgd2FzIG5vIHdheSB0byBzaWduYWwgdGhhdCB0aGVzZSB0eXBlcyBjb3VsZAorYmUgdXNlZCBhcyBzbGljZSBpbmRleGVzLgorCitTbGljaW5nIGNhbid0IGp1c3QgdXNlIHRoZSBleGlzdGluZyBcbWV0aG9ke19faW50X199IG1ldGhvZCBiZWNhdXNlCit0aGF0IG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGNvZXJjaW9uIHRvIGludGVnZXJzLiAgSWYKK3NsaWNpbmcgdXNlZCBcbWV0aG9ke19faW50X199LCBmbG9hdGluZy1wb2ludCBudW1iZXJzIHdvdWxkIGFsc28KK2JlY29tZSBsZWdhbCBzbGljZSBpbmRleGVzIGFuZCB0aGF0J3MgY2xlYXJseSBhbiB1bmRlc2lyYWJsZQorYmVoYXZpb3VyLgorCitJbnN0ZWFkLCBhIG5ldyBzcGVjaWFsIG1ldGhvZCBjYWxsZWQgXG1ldGhvZHtfX2luZGV4X199IHdhcyBhZGRlZC4gIEl0Cit0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gaW50ZWdlciBnaXZpbmcgdGhlIHNsaWNlIGluZGV4IHRvCit1c2UuICBGb3IgZXhhbXBsZToKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgQzoKKyAgICBkZWYgX19pbmRleF9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgIAorXGVuZHt2ZXJiYXRpbX0KKworVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBhIFB5dGhvbiBpbnRlZ2VyIG9yIGxvbmcgaW50ZWdlci4KK1RoZSBpbnRlcnByZXRlciB3aWxsIGNoZWNrIHRoYXQgdGhlIHR5cGUgcmV0dXJuZWQgaXMgY29ycmVjdCwgYW5kCityYWlzZXMgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQuCisKK0EgY29ycmVzcG9uZGluZyBcbWVtYmVye25iX2luZGV4fSBzbG90IHdhcyBhZGRlZCB0byB0aGUgQy1sZXZlbAorXGN0eXBle1B5TnVtYmVyTWV0aG9kc30gc3RydWN0dXJlIHRvIGxldCBDIGV4dGVuc2lvbnMgaW1wbGVtZW50IHRoaXMKK3Byb3RvY29sLiAgXGNmdW5jdGlvbntQeU51bWJlcl9JbmRleChcdmFye29ian0pfSBjYW4gYmUgdXNlZCBpbgorZXh0ZW5zaW9uIGNvZGUgdG8gY2FsbCB0aGUgXG1ldGhvZHtfX2luZGV4X199IGZ1bmN0aW9uIGFuZCByZXRyaWV2ZQoraXRzIHJlc3VsdC4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWVwZXB7MzU3fXtBbGxvd2luZyBBbnkgT2JqZWN0IHRvIGJlIFVzZWQgZm9yIFNsaWNpbmd9e1BFUCB3cml0dGVuIAorYW5kIGltcGxlbWVudGVkIGJ5IFRyYXZpcyBPbGlwaGFudC59CisKK1xlbmR7c2VlYWxzb30KIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNDQ4LDEwICsxMDcyLDI5IEBACiAKIFxiZWdpbntpdGVtaXplfQogCitcaXRlbSBUaGUgXGNsYXNze2RpY3R9IHR5cGUgaGFzIGEgbmV3IGhvb2sgZm9yIGxldHRpbmcgc3ViY2xhc3NlcworcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUgd2hlbiBhIGtleSBpc24ndCBjb250YWluZWQgaW4gdGhlIGRpY3Rpb25hcnkuCitXaGVuIGEga2V5IGlzbid0IGZvdW5kLCB0aGUgZGljdGlvbmFyeSdzCitcbWV0aG9ke19fbWlzc2luZ19fKFx2YXJ7a2V5fSl9CittZXRob2Qgd2lsbCBiZSBjYWxsZWQuICBUaGlzIGhvb2sgaXMgdXNlZCB0byBpbXBsZW1lbnQKK3RoZSBuZXcgXGNsYXNze2RlZmF1bHRkaWN0fSBjbGFzcyBpbiB0aGUgXG1vZHVsZXtjb2xsZWN0aW9uc30KK21vZHVsZS4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgZGljdGlvbmFyeSAKK3RoYXQgcmV0dXJucyB6ZXJvIGZvciBhbnkgbWlzc2luZyBrZXk6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2NsYXNzIHplcm9kaWN0IChkaWN0KToKKyAgICBkZWYgX19taXNzaW5nX18gKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiAwCisKK2QgPSB6ZXJvZGljdCh7MToxLCAyOjJ9KQorcHJpbnQgZFsxXSwgZFsyXSAgICMgUHJpbnRzIDEsIDIKK3ByaW50IGRbM10sIGRbNF0gICAjIFByaW50cyAwLCAwCitcZW5ke3ZlcmJhdGltfQorCiBcaXRlbSBUaGUgXGZ1bmN0aW9ue21pbigpfSBhbmQgXGZ1bmN0aW9ue21heCgpfSBidWlsdC1pbiBmdW5jdGlvbnMKIGdhaW5lZCBhIFxjb2Rle2tleX0ga2V5d29yZCBhcmd1bWVudCBhbmFsb2dvdXMgdG8gdGhlIFxjb2Rle2tleX0KLWFyZ3VtZW50IGZvciBcbWV0aG9ke3NvcnQoKX0uICBUaGlzIGFyZ3VtZW50IHN1cHBsaWVzIGEgZnVuY3Rpb24KLXRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgYW5kIGlzIGNhbGxlZCBmb3IgZXZlcnkgdmFsdWUgaW4gdGhlIGxpc3Q7IAorYXJndW1lbnQgZm9yIFxtZXRob2R7c29ydCgpfS4gIFRoaXMgYXJndW1lbnQgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGF0Cit0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBhbmQgaXMgY2FsbGVkIGZvciBldmVyeSB2YWx1ZSBpbiB0aGUgbGlzdDsKIFxmdW5jdGlvbnttaW4oKX0vXGZ1bmN0aW9ue21heCgpfSB3aWxsIHJldHVybiB0aGUgZWxlbWVudCB3aXRoIHRoZSAKIHNtYWxsZXN0L2xhcmdlc3QgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBmdW5jdGlvbi4KIEZvciBleGFtcGxlLCB0byBmaW5kIHRoZSBsb25nZXN0IHN0cmluZyBpbiBhIGxpc3QsIHlvdSBjYW4gZG86CkBAIC00NTksNyArMTEwMiw3IEBACiBcYmVnaW57dmVyYmF0aW19CiBMID0gWydtZWRpdW0nLCAnbG9uZ2VzdCcsICdzaG9ydCddCiAjIFByaW50cyAnbG9uZ2VzdCcKLXByaW50IG1heChMLCBrZXk9bGVuKQkJICAgCitwcmludCBtYXgoTCwga2V5PWxlbikgICAgICAgICAgICAgIAogIyBQcmludHMgJ3Nob3J0JywgYmVjYXVzZSBsZXhpY29ncmFwaGljYWxseSAnc2hvcnQnIGhhcyB0aGUgbGFyZ2VzdCB2YWx1ZQogcHJpbnQgbWF4KEwpICAgICAgICAgCiBcZW5ke3ZlcmJhdGltfQpAQCAtNDcyLDkgKzExMTUsMTggQEAKIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyB0cnVlOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4KIFxjb25zdGFudHtGYWxzZX0uICBcZnVuY3Rpb257YWxsKCl9IHJldHVybnMgXGNvbnN0YW50e1RydWV9IG9ubHkgaWYKIGFsbCBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBldmFsdWF0ZSBhcyBiZWluZyB0cnVlLgorKFN1Z2dlc3RlZCBieSBHdlIsIGFuZCBpbXBsZW1lbnRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCiAKLSUgWFhYIHdobyBhZGRlZD8KK1xpdGVtIEFTQ0lJIGlzIG5vdyB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgbW9kdWxlcy4gIEl0J3Mgbm93IAorYSBzeW50YXggZXJyb3IgaWYgYSBtb2R1bGUgY29udGFpbnMgc3RyaW5nIGxpdGVyYWxzIHdpdGggOC1iaXQKK2NoYXJhY3RlcnMgYnV0IGRvZXNuJ3QgaGF2ZSBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbi4gIEluIFB5dGhvbiAyLjQKK3RoaXMgdHJpZ2dlcmVkIGEgd2FybmluZywgbm90IGEgc3ludGF4IGVycm9yLiAgU2VlIFxwZXB7MjYzfSAKK2ZvciBob3cgdG8gZGVjbGFyZSBhIG1vZHVsZSdzIGVuY29kaW5nOyBmb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGFkZCAKK2EgbGluZSBsaWtlIHRoaXMgbmVhciB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgZmlsZToKIAorXGJlZ2lue3ZlcmJhdGltfQorIyAtKi0gY29kaW5nOiBsYXRpbjEgLSotCitcZW5ke3ZlcmJhdGltfQogCiBcaXRlbSBUaGUgbGlzdCBvZiBiYXNlIGNsYXNzZXMgaW4gYSBjbGFzcyBkZWZpbml0aW9uIGNhbiBub3cgYmUgZW1wdHkuICAKIEFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgbm93IGxlZ2FsOgpAQCAtNDg5LDYgKzExNDEsMjQgQEAKIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorXHN1YnNlY3Rpb257SW50ZXJhY3RpdmUgSW50ZXJwcmV0ZXIgQ2hhbmdlc30KKworSW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyLCBcY29kZXtxdWl0fSBhbmQgXGNvZGV7ZXhpdH0gCitoYXZlIGxvbmcgYmVlbiBzdHJpbmdzIHNvIHRoYXQgbmV3IHVzZXJzIGdldCBhIHNvbWV3aGF0IGhlbHBmdWwgbWVzc2FnZQord2hlbiB0aGV5IHRyeSB0byBxdWl0OgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcXVpdAorJ1VzZSBDdHJsLUQgKGkuZS4gRU9GKSB0byBleGl0LicKK1xlbmR7dmVyYmF0aW19CisKK0luIFB5dGhvbiAyLjUsIFxjb2Rle3F1aXR9IGFuZCBcY29kZXtleGl0fSBhcmUgbm93IG9iamVjdHMgdGhhdCBzdGlsbAorcHJvZHVjZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZW1zZWx2ZXMsIGJ1dCBhcmUgYWxzbyBjYWxsYWJsZS4KK05ld2JpZXMgd2hvIHRyeSBcY29kZXtxdWl0KCl9IG9yIFxjb2Rle2V4aXQoKX0gd2lsbCBub3cgZXhpdCB0aGUKK2ludGVycHJldGVyIGFzIHRoZXkgZXhwZWN0LiAgKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbC4pCisKKworJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzdWJzZWN0aW9ue09wdGltaXphdGlvbnN9CiAKIFxiZWdpbntpdGVtaXplfQpAQCAtNTAwLDQzICsxMTcwLDEzNSBAQAogYW5kIGFzIGEgcmVzdWx0IHNldHMgd2lsbCB1c2UgYSB0aGlyZCBsZXNzIG1lbW9yeSBhbmQgYXJlIHNvbWV3aGF0IGZhc3Rlci4KIChJbXBsZW1lbnRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCiAKK1xpdGVtIFRoZSBwZXJmb3JtYW5jZSBvZiBzb21lIFVuaWNvZGUgb3BlcmF0aW9ucywgc3VjaCBhcyAKK2NoYXJhY3RlciBtYXAgZGVjb2RpbmcsIGhhcyBiZWVuIGltcHJvdmVkLgorJSBQYXRjaCAxMzEzOTM5CisKK1xpdGVtIFRoZSBjb2RlIGdlbmVyYXRvcidzIHBlZXBob2xlIG9wdGltaXplciBub3cgcGVyZm9ybXMKK3NpbXBsZSBjb25zdGFudCBmb2xkaW5nIGluIGV4cHJlc3Npb25zLiAgSWYgeW91IHdyaXRlIHNvbWV0aGluZyBsaWtlCitcY29kZXthID0gMiszfSwgdGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZG8gdGhlIGFyaXRobWV0aWMgYW5kIHByb2R1Y2UKK2NvZGUgY29ycmVzcG9uZGluZyB0byBcY29kZXthID0gNX0uCisKIFxlbmR7aXRlbWl6ZX0KIAogVGhlIG5ldCByZXN1bHQgb2YgdGhlIDIuNSBvcHRpbWl6YXRpb25zIGlzIHRoYXQgUHl0aG9uIDIuNSBydW5zIHRoZQotcHlzdG9uZSBiZW5jaG1hcmsgYXJvdW5kIFhYXCUgZmFzdGVyIHRoYW4gUHl0aG9uIDIuNC4KK3B5c3RvbmUgYmVuY2htYXJrIGFyb3VuZCBYWFhcJSBmYXN0ZXIgdGhhbiBQeXRob24gMi40LgogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntOZXcsIEltcHJvdmVkLCBhbmQgRGVwcmVjYXRlZCBNb2R1bGVzfQogCi1BcyB1c3VhbCwgUHl0aG9uJ3Mgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBhIG51bWJlciBvZiBlbmhhbmNlbWVudHMgYW5kCi1idWcgZml4ZXMuICBIZXJlJ3MgYSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIG1vc3Qgbm90YWJsZSBjaGFuZ2VzLCBzb3J0ZWQKLWFscGhhYmV0aWNhbGx5IGJ5IG1vZHVsZSBuYW1lLiBDb25zdWx0IHRoZQotXGZpbGV7TWlzYy9ORVdTfSBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZSBmb3IgYSBtb3JlCi1jb21wbGV0ZSBsaXN0IG9mIGNoYW5nZXMsIG9yIGxvb2sgdGhyb3VnaCB0aGUgU1ZOIGxvZ3MgZm9yIGFsbCB0aGUKLWRldGFpbHMuCitUaGUgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBtYW55IGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzIGluCitQeXRob24gMi41LiAgSGVyZSdzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBtb3N0IG5vdGFibGUgY2hhbmdlcywgc29ydGVkCithbHBoYWJldGljYWxseSBieSBtb2R1bGUgbmFtZS4gQ29uc3VsdCB0aGUgXGZpbGV7TWlzYy9ORVdTfSBmaWxlIGluCit0aGUgc291cmNlIHRyZWUgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0IG9mIGNoYW5nZXMsIG9yIGxvb2sgdGhyb3VnaAordGhlIFNWTiBsb2dzIGZvciBhbGwgdGhlIGRldGFpbHMuCiAKIFxiZWdpbntpdGVtaXplfQogCi0lIGN0eXBlcyBhZGRlZAotCi0lIGNvbGxlY3Rpb25zLmRlcXVlIG5vdyBoYXMgLnJlbW92ZSgpCi0KICUgdGhlIGNQaWNrbGUgbW9kdWxlIG5vIGxvbmdlciBhY2NlcHRzIHRoZSBkZXByZWNhdGVkIE5vbmUgb3B0aW9uIGluIHRoZQogJSBhcmdzIHR1cGxlIHJldHVybmVkIGJ5IF9fcmVkdWNlX18oKS4KIAotJSBjc3YgbW9kdWxlIGltcHJvdmVtZW50cworXGl0ZW0gVGhlIFxtb2R1bGV7YXVkaW9vcH0gbW9kdWxlIG5vdyBzdXBwb3J0cyB0aGUgYS1MQVcgZW5jb2RpbmcsCithbmQgdGhlIGNvZGUgZm9yIHUtTEFXIGVuY29kaW5nIGhhcyBiZWVuIGltcHJvdmVkLiAgKENvbnRyaWJ1dGVkIGJ5CitMYXJzIEltbWlzY2guKQogCi0lIGRhdGV0aW1lLmRhdGV0aW1lKCkgbm93IGhhcyBhIHN0cnB0aW1lIGNsYXNzIG1ldGhvZCB3aGljaCBjYW4gYmUgdXNlZCB0bwotJSBjcmVhdGUgZGF0ZXRpbWUgb2JqZWN0IHVzaW5nIGEgc3RyaW5nIGFuZCBmb3JtYXQuCitcaXRlbSBUaGUgXG1vZHVsZXtjb2xsZWN0aW9uc30gbW9kdWxlIGdhaW5lZCBhIG5ldyB0eXBlLAorXGNsYXNze2RlZmF1bHRkaWN0fSwgdGhhdCBzdWJjbGFzc2VzIHRoZSBzdGFuZGFyZCBcY2xhc3N7ZGljdH0KK3R5cGUuICBUaGUgbmV3IHR5cGUgbW9zdGx5IGJlaGF2ZXMgbGlrZSBhIGRpY3Rpb25hcnkgYnV0IGNvbnN0cnVjdHMgYQorZGVmYXVsdCB2YWx1ZSB3aGVuIGEga2V5IGlzbid0IHByZXNlbnQsIGF1dG9tYXRpY2FsbHkgYWRkaW5nIGl0IHRvIHRoZQorZGljdGlvbmFyeSBmb3IgdGhlIHJlcXVlc3RlZCBrZXkgdmFsdWUuCiAKLVxpdGVtIEEgbmV3IFxtb2R1bGV7aGFzaGxpYn0gbW9kdWxlIGhhcyBiZWVuIGFkZGVkIHRvIHJlcGxhY2UgdGhlCi1cbW9kdWxle21kNX0gYW5kIFxtb2R1bGV7c2hhfSBtb2R1bGVzLiAgXG1vZHVsZXtoYXNobGlifSBhZGRzIHN1cHBvcnQKLWZvciBhZGRpdGlvbmFsIHNlY3VyZSBoYXNoZXMgKFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQsIGFuZCBTSEEtNTEyKS4KLVdoZW4gYXZhaWxhYmxlLCB0aGUgbW9kdWxlIHVzZXMgT3BlblNTTCBmb3IgZmFzdCBwbGF0Zm9ybSBvcHRpbWl6ZWQKLWltcGxlbWVudGF0aW9ucyBvZiBhbGdvcml0aG1zLiAgVGhlIG9sZCBcbW9kdWxle21kNX0gYW5kIFxtb2R1bGV7c2hhfQotbW9kdWxlcyBzdGlsbCBleGlzdCBhcyB3cmFwcGVycyBhcm91bmQgaGFzaGxpYiB0byBwcmVzZXJ2ZSBiYWNrd2FyZHMKLWNvbXBhdGliaWxpdHkuICAoQ29udHJpYnV0ZWQgYnkgR3JlZ29yeSBQLiBTbWl0aC4pCitUaGUgZmlyc3QgYXJndW1lbnQgdG8gXGNsYXNze2RlZmF1bHRkaWN0fSdzIGNvbnN0cnVjdG9yIGlzIGEgZmFjdG9yeQorZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIGtleSBpcyByZXF1ZXN0ZWQgYnV0IG5vdCBmb3VuZC4KK1RoaXMgZmFjdG9yeSBmdW5jdGlvbiByZWNlaXZlcyBubyBhcmd1bWVudHMsIHNvIHlvdSBjYW4gdXNlIGJ1aWx0LWluCit0eXBlIGNvbnN0cnVjdG9ycyBzdWNoIGFzIFxmdW5jdGlvbntsaXN0KCl9IG9yIFxmdW5jdGlvbntpbnQoKX0uICBGb3IKK2V4YW1wbGUsIAoreW91IGNhbiBtYWtlIGFuIGluZGV4IG9mIHdvcmRzIGJhc2VkIG9uIHRoZWlyIGluaXRpYWwgbGV0dGVyIGxpa2UgdGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQord29yZHMgPSAiIiJOZWwgbWV6em8gZGVsIGNhbW1pbiBkaSBub3N0cmEgdml0YQorbWkgcml0cm92YWkgcGVyIHVuYSBzZWx2YSBvc2N1cmEKK2NoZSBsYSBkaXJpdHRhIHZpYSBlcmEgc21hcnJpdGEiIiIubG93ZXIoKS5zcGxpdCgpCisKK2luZGV4ID0gZGVmYXVsdGRpY3QobGlzdCkKKworZm9yIHcgaW4gd29yZHM6CisgICAgaW5pdF9sZXR0ZXIgPSB3WzBdCisgICAgaW5kZXhbaW5pdF9sZXR0ZXJdLmFwcGVuZCh3KQorXGVuZHt2ZXJiYXRpbX0KKworUHJpbnRpbmcgXGNvZGV7aW5kZXh9IHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2RlZmF1bHRkaWN0KDx0eXBlICdsaXN0Jz4sIHsnYyc6IFsnY2FtbWluJywgJ2NoZSddLCAnZSc6IFsnZXJhJ10sIAorICAgICAgICAnZCc6IFsnZGVsJywgJ2RpJywgJ2Rpcml0dGEnXSwgJ20nOiBbJ21lenpvJywgJ21pJ10sIAorICAgICAgICAnbCc6IFsnbGEnXSwgJ28nOiBbJ29zY3VyYSddLCAnbic6IFsnbmVsJywgJ25vc3RyYSddLCAKKyAgICAgICAgJ3AnOiBbJ3BlciddLCAncyc6IFsnc2VsdmEnLCAnc21hcnJpdGEnXSwgCisgICAgICAgICdyJzogWydyaXRyb3ZhaSddLCAndSc6IFsndW5hJ10sICd2JzogWyd2aXRhJywgJ3ZpYSddfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIFxjbGFzc3tkZXF1ZX0gZG91YmxlLWVuZGVkIHF1ZXVlIHR5cGUgc3VwcGxpZWQgYnkgdGhlCitcbW9kdWxle2NvbGxlY3Rpb25zfSBtb2R1bGUgbm93IGhhcyBhIFxtZXRob2R7cmVtb3ZlKFx2YXJ7dmFsdWV9KX0KK21ldGhvZCB0aGF0IHJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHZhcnt2YWx1ZX0gaW4gdGhlIHF1ZXVlLAorcmFpc2luZyBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IGlmIHRoZSB2YWx1ZSBpc24ndCBmb3VuZC4KKworXGl0ZW0gTmV3IG1vZHVsZTogVGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIHVzZSAKK3dpdGggdGhlIG5ldyBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBTZWUKK3NlY3Rpb25+XHJlZnttb2R1bGUtY29udGV4dGxpYn0gZm9yIG1vcmUgYWJvdXQgdGhpcyBtb2R1bGUuCisoQ29udHJpYnV0ZWQgYnkgUGhpbGxpcCBKLiBFYnkuKQorCitcaXRlbSBOZXcgbW9kdWxlOiBUaGUgXG1vZHVsZXtjUHJvZmlsZX0gbW9kdWxlIGlzIGEgQyBpbXBsZW1lbnRhdGlvbiBvZiAKK3RoZSBleGlzdGluZyBcbW9kdWxle3Byb2ZpbGV9IG1vZHVsZSB0aGF0IGhhcyBtdWNoIGxvd2VyIG92ZXJoZWFkLgorVGhlIG1vZHVsZSdzIGludGVyZmFjZSBpcyB0aGUgc2FtZSBhcyBcbW9kdWxle3Byb2ZpbGV9OiB5b3UgcnVuCitcY29kZXtjUHJvZmlsZS5ydW4oJ21haW4oKScpfSB0byBwcm9maWxlIGEgZnVuY3Rpb24sIGNhbiBzYXZlIHByb2ZpbGUKK2RhdGEgdG8gYSBmaWxlLCBldGMuICBJdCdzIG5vdCB5ZXQga25vd24gaWYgdGhlIEhvdHNob3QgcHJvZmlsZXIsCit3aGljaCBpcyBhbHNvIHdyaXR0ZW4gaW4gQyBidXQgZG9lc24ndCBtYXRjaCB0aGUgXG1vZHVsZXtwcm9maWxlfQorbW9kdWxlJ3MgaW50ZXJmYWNlLCB3aWxsIGNvbnRpbnVlIHRvIGJlIG1haW50YWluZWQgaW4gZnV0dXJlIHZlcnNpb25zCitvZiBQeXRob24uICAoQ29udHJpYnV0ZWQgYnkgQXJtaW4gUmlnby4pCisKK1xpdGVtIFRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlLCB3aGljaCBwYXJzZXMgZmlsZXMgaW4KK2NvbW1hLXNlcGFyYXRlZCB2YWx1ZSBmb3JtYXQsIHJlY2VpdmVkIHNldmVyYWwgZW5oYW5jZW1lbnRzIGFuZCBhCitudW1iZXIgb2YgYnVnZml4ZXMuICBZb3UgY2FuIG5vdyBzZXQgdGhlIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhCitmaWVsZCBieSBjYWxsaW5nIHRoZSBcbWV0aG9ke2Nzdi5maWVsZF9zaXplX2xpbWl0KFx2YXJ7bmV3X2xpbWl0fSl9CitmdW5jdGlvbjsgb21pdHRpbmcgdGhlIFx2YXJ7bmV3X2xpbWl0fSBhcmd1bWVudCB3aWxsIHJldHVybiB0aGUKK2N1cnJlbnRseS1zZXQgbGltaXQuICBUaGUgXGNsYXNze3JlYWRlcn0gY2xhc3Mgbm93IGhhcyBhCitcbWVtYmVye2xpbmVfbnVtfSBhdHRyaWJ1dGUgdGhhdCBjb3VudHMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBsaW5lcworcmVhZCBmcm9tIHRoZSBzb3VyY2U7IHJlY29yZHMgY2FuIHNwYW4gbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMsIHNvCitcbWVtYmVye2xpbmVfbnVtfSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlYWQuCisoQ29udHJpYnV0ZWQgYnkgU2tpcCBNb250YW5hcm8gYW5kIEFuZHJldyBNY05hbWFyYS4pCisKK1xpdGVtIFRoZSBcY2xhc3N7ZGF0ZXRpbWV9IGNsYXNzIGluIHRoZSBcbW9kdWxle2RhdGV0aW1lfSAKK21vZHVsZSBub3cgaGFzIGEgXG1ldGhvZHtzdHJwdGltZShcdmFye3N0cmluZ30sIFx2YXJ7Zm9ybWF0fSl9IAorbWV0aG9kIGZvciBwYXJzaW5nIGRhdGUgc3RyaW5ncywgY29udHJpYnV0ZWQgYnkgSm9zaCBTcG9lcnJpLgorSXQgdXNlcyB0aGUgc2FtZSBmb3JtYXQgY2hhcmFjdGVycyBhcyBcZnVuY3Rpb257dGltZS5zdHJwdGltZSgpfSBhbmQKK1xmdW5jdGlvbnt0aW1lLnN0cmZ0aW1lKCl9OgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQorCit0cyA9IGRhdGV0aW1lLnN0cnB0aW1lKCcxMDoxMzoxNSAyMDA2LTAzLTA3JywKKyAgICAgICAgICAgICAgICAgICAgICAgJyVIOiVNOiVTICVZLSVtLSVkJykKK1xlbmR7dmVyYmF0aW19CisKK1xpdGVtIFRoZSBcbW9kdWxle2ZpbGVpbnB1dH0gbW9kdWxlIHdhcyBtYWRlIG1vcmUgZmxleGlibGUuCitVbmljb2RlIGZpbGVuYW1lcyBhcmUgbm93IHN1cHBvcnRlZCwgYW5kIGEgXHZhcnttb2RlfSBwYXJhbWV0ZXIgdGhhdAorZGVmYXVsdHMgdG8gXGNvZGV7InIifSB3YXMgYWRkZWQgdG8gdGhlCitcZnVuY3Rpb257aW5wdXQoKX0gZnVuY3Rpb24gdG8gYWxsb3cgb3BlbmluZyBmaWxlcyBpbiBiaW5hcnkgb3IKK3VuaXZlcnNhbC1uZXdsaW5lIG1vZGUuICBBbm90aGVyIG5ldyBwYXJhbWV0ZXIsIFx2YXJ7b3Blbmhvb2t9LAorbGV0cyB5b3UgdXNlIGEgZnVuY3Rpb24gb3RoZXIgdGhhbiBcZnVuY3Rpb257b3BlbigpfSAKK3RvIG9wZW4gdGhlIGlucHV0IGZpbGVzLiAgT25jZSB5b3UncmUgaXRlcmF0aW5nIG92ZXIgCit0aGUgc2V0IG9mIGZpbGVzLCB0aGUgXGNsYXNze0ZpbGVJbnB1dH0gb2JqZWN0J3MgbmV3CitcbWV0aG9ke2ZpbGVubygpfSByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50bHkgb3BlbmVkIGZpbGUuCisoQ29udHJpYnV0ZWQgYnkgR2VvcmcgQnJhbmRsLikKKworXGl0ZW0gSW4gdGhlIFxtb2R1bGV7Z2N9IG1vZHVsZSwgdGhlIG5ldyBcZnVuY3Rpb257Z2V0X2NvdW50KCl9IGZ1bmN0aW9uCityZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gY291bnRzIGZvciB0aGUKK3RocmVlIEdDIGdlbmVyYXRpb25zLiAgVGhpcyBpcyBhY2NvdW50aW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZ2FyYmFnZQorY29sbGVjdG9yOyB3aGVuIHRoZXNlIGNvdW50cyByZWFjaCBhIHNwZWNpZmllZCB0aHJlc2hvbGQsIGEgZ2FyYmFnZQorY29sbGVjdGlvbiBzd2VlcCB3aWxsIGJlIG1hZGUuICBUaGUgZXhpc3RpbmcgXGZ1bmN0aW9ue2djLmNvbGxlY3QoKX0KK2Z1bmN0aW9uIG5vdyB0YWtlcyBhbiBvcHRpb25hbCBcdmFye2dlbmVyYXRpb259IGFyZ3VtZW50IG9mIDAsIDEsIG9yIDIKK3RvIHNwZWNpZnkgd2hpY2ggZ2VuZXJhdGlvbiB0byBjb2xsZWN0LgogCiBcaXRlbSBUaGUgXGZ1bmN0aW9ue25zbWFsbGVzdCgpfSBhbmQgCiBcZnVuY3Rpb257bmxhcmdlc3QoKX0gZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle2hlYXBxfSBtb2R1bGUgCkBAIC01NjgsNiArMTMzMCwxMSBAQAogCiAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCitcaXRlbSBUaGUgXG1vZHVsZXtuaXN9IG1vZHVsZSBub3cgc3VwcG9ydHMgYWNjZXNzaW5nIGRvbWFpbnMgb3RoZXIKK3RoYW4gdGhlIHN5c3RlbSBkZWZhdWx0IGRvbWFpbiBieSBzdXBwbHlpbmcgYSBcdmFye2RvbWFpbn0gYXJndW1lbnQgdG8KK3RoZSBcZnVuY3Rpb257bmlzLm1hdGNoKCl9IGFuZCBcZnVuY3Rpb257bmlzLm1hcHMoKX0gZnVuY3Rpb25zLgorKENvbnRyaWJ1dGVkIGJ5IEJlbiBCZWxsLikKKwogXGl0ZW0gVGhlIFxtb2R1bGV7b3BlcmF0b3J9IG1vZHVsZSdzIFxmdW5jdGlvbntpdGVtZ2V0dGVyKCl9IAogYW5kIFxmdW5jdGlvbnthdHRyZ2V0dGVyKCl9IGZ1bmN0aW9ucyBub3cgc3VwcG9ydCBtdWx0aXBsZSBmaWVsZHMuICAKIEEgY2FsbCBzdWNoIGFzIFxjb2Rle29wZXJhdG9yLmF0dHJnZXR0ZXIoJ2EnLCAnYicpfQpAQCAtNTc1LDExICsxMzQyLDEwIEBACiB0aGF0IHJldHJpZXZlcyB0aGUgXG1lbWJlcnthfSBhbmQgXG1lbWJlcntifSBhdHRyaWJ1dGVzLiAgQ29tYmluaW5nIAogdGhpcyBuZXcgZmVhdHVyZSB3aXRoIHRoZSBcbWV0aG9ke3NvcnQoKX0gbWV0aG9kJ3MgXGNvZGV7a2V5fSBwYXJhbWV0ZXIgCiBsZXRzIHlvdSBlYXNpbHkgc29ydCBsaXN0cyB1c2luZyBtdWx0aXBsZSBmaWVsZHMuCi0KLSUgWFhYIHdobyBhZGRlZD8KKyhDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCiAKIAotXGl0ZW0gVGhlIFxtb2R1bGV7b3N9IG1vZHVsZSB1bmRlcndlbnQgYSBudW1iZXIgb2YgY2hhbmdlcy4gIFRoZQorXGl0ZW0gVGhlIFxtb2R1bGV7b3N9IG1vZHVsZSB1bmRlcndlbnQgc2V2ZXJhbCBjaGFuZ2VzLiAgVGhlCiBcbWVtYmVye3N0YXRfZmxvYXRfdGltZXN9IHZhcmlhYmxlIG5vdyBkZWZhdWx0cyB0byB0cnVlLCBtZWFuaW5nIHRoYXQKIFxmdW5jdGlvbntvcy5zdGF0KCl9IHdpbGwgbm93IHJldHVybiB0aW1lIHZhbHVlcyBhcyBmbG9hdHMuICAoVGhpcwogZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgXGZ1bmN0aW9ue29zLnN0YXQoKX0gd2lsbCByZXR1cm4gdGltZXMKQEAgLTU5MSwxMSArMTM1NywzNCBAQAogXGZ1bmN0aW9ue29zLmxzZWVrKCl9IGZ1bmN0aW9uLiAgVHdvIG5ldyBjb25zdGFudHMgZm9yIGxvY2tpbmcgYXJlCiBcbWVtYmVye29zLk9fU0hMT0NLfSBhbmQgXG1lbWJlcntvcy5PX0VYTE9DS30uCiAKK1R3byBuZXcgZnVuY3Rpb25zLCBcZnVuY3Rpb257d2FpdDMoKX0gYW5kIFxmdW5jdGlvbnt3YWl0NCgpfSwgd2VyZQorYWRkZWQuICBUaGV5J3JlIHNpbWlsYXIgdGhlIFxmdW5jdGlvbnt3YWl0cGlkKCl9IGZ1bmN0aW9uIHdoaWNoIHdhaXRzCitmb3IgYSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgYW5kIHJldHVybnMgYSB0dXBsZSBvZiB0aGUgcHJvY2VzcyBJRCBhbmQKK2l0cyBleGl0IHN0YXR1cywgYnV0IFxmdW5jdGlvbnt3YWl0MygpfSBhbmQgXGZ1bmN0aW9ue3dhaXQ0KCl9IHJldHVybgorYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIFxmdW5jdGlvbnt3YWl0MygpfSBkb2Vzbid0IHRha2UgYSBwcm9jZXNzIElECithcyBpbnB1dCwgc28gaXQgd2FpdHMgZm9yIGFueSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQgYW5kIHJldHVybnMgYQorMy10dXBsZSBvZiBcdmFye3Byb2Nlc3MtaWR9LCBcdmFye2V4aXQtc3RhdHVzfSwgXHZhcntyZXNvdXJjZS11c2FnZX0KK2FzIHJldHVybmVkIGZyb20gdGhlIFxmdW5jdGlvbntyZXNvdXJjZS5nZXRydXNhZ2UoKX0gZnVuY3Rpb24uCitcZnVuY3Rpb257d2FpdDQoXHZhcntwaWR9KX0gZG9lcyB0YWtlIGEgcHJvY2VzcyBJRC4KKyhDb250cmlidXRlZCBieSBDaGFkIEouIFNjaHJvZWRlci4pCisKIE9uIEZyZWVCU0QsIHRoZSBcZnVuY3Rpb257b3Muc3RhdCgpfSBmdW5jdGlvbiBub3cgcmV0dXJucyAKIHRpbWVzIHdpdGggbmFub3NlY29uZCByZXNvbHV0aW9uLCBhbmQgdGhlIHJldHVybmVkIG9iamVjdAogbm93IGhhcyBcbWVtYmVye3N0X2dlbn0gYW5kIFxtZW1iZXJ7c3RfYmlydGh0aW1lfS4KIFRoZSBcbWVtYmVye3N0X2ZsYWdzfSBtZW1iZXIgaXMgYWxzbyBhdmFpbGFibGUsIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBpdC4KLSUgWFhYIHBhdGNoIDExODA2OTUsIDEyMTIxMTcKKyhDb250cmlidXRlZCBieSBBbnR0aSBMb3VrbyBhbmQgIERpZWdvIFBldHRlblxgby4pCislIChQYXRjaCAxMTgwNjk1LCAxMjEyMTE3KQorCitcaXRlbSBUaGUgb2xkIFxtb2R1bGV7cmVnZXh9IGFuZCBcbW9kdWxle3JlZ3N1Yn0gbW9kdWxlcywgd2hpY2ggaGF2ZSBiZWVuIAorZGVwcmVjYXRlZCBldmVyIHNpbmNlIFB5dGhvbiAyLjAsIGhhdmUgZmluYWxseSBiZWVuIGRlbGV0ZWQuICAKK090aGVyIGRlbGV0ZWQgbW9kdWxlczogXG1vZHVsZXtzdGF0Y2FjaGV9LCBcbW9kdWxle3R6cGFyc2V9LAorXG1vZHVsZXt3aHJhbmRvbX0uCisKK1xpdGVtIFRoZSBcZmlsZXtsaWItb2xkfSBkaXJlY3RvcnksCit3aGljaCBpbmNsdWRlcyBhbmNpZW50IG1vZHVsZXMgc3VjaCBhcyBcbW9kdWxle2RpcmNtcH0gYW5kCitcbW9kdWxle25pfSwgd2FzIGFsc28gZGVsZXRlZC4gIFxmaWxle2xpYi1vbGR9IHdhc24ndCBvbiB0aGUgZGVmYXVsdAorXGNvZGV7c3lzLnBhdGh9LCBzbyB1bmxlc3MgeW91ciBwcm9ncmFtcyBleHBsaWNpdGx5IGFkZGVkIHRoZSBkaXJlY3RvcnkgdG8gCitcY29kZXtzeXMucGF0aH0sIHRoaXMgcmVtb3ZhbCBzaG91bGRuJ3QgYWZmZWN0IHlvdXIgY29kZS4KIAogXGl0ZW0gVGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUgbm93IHN1cHBvcnRzIFxjb25zdGFudHtBRl9ORVRMSU5LfQogc29ja2V0cyBvbiBMaW51eCwgdGhhbmtzIHRvIGEgcGF0Y2ggZnJvbSBQaGlsaXBwZSBCaW9uZGkuICAKQEAgLTYwNSw5ICsxMzk0LDI2IEBACiBJbiBQeXRob24gY29kZSwgbmV0bGluayBhZGRyZXNzZXMgYXJlIHJlcHJlc2VudGVkIGFzIGEgdHVwbGUgb2YgMiBpbnRlZ2VycywgCiBcY29kZXsoXHZhcntwaWR9LCBcdmFye2dyb3VwX21hc2t9KX0uCiAKLVxpdGVtIE5ldyBtb2R1bGU6IFxtb2R1bGV7c3B3ZH0gcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlCi1zaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2Ugb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQuICAKLSUgWFhYIGdpdmUgZXhhbXBsZQorU29ja2V0IG9iamVjdHMgYWxzbyBnYWluZWQgYWNjZXNzb3IgbWV0aG9kcyBcbWV0aG9ke2dldGZhbWlseSgpfSwgCitcbWV0aG9ke2dldHR5cGUoKX0sIGFuZCBcbWV0aG9ke2dldHByb3RvKCl9IG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlCitmYW1pbHksIHR5cGUsIGFuZCBwcm90b2NvbCB2YWx1ZXMgZm9yIHRoZSBzb2NrZXQuCisKK1xpdGVtIE5ldyBtb2R1bGU6IHRoZSBcbW9kdWxle3Nwd2R9IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yCithY2Nlc3NpbmcgdGhlIHNoYWRvdyBwYXNzd29yZCBkYXRhYmFzZSBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCAKK3NoYWRvdyBwYXNzd29yZHMuCisKK1xpdGVtIFRoZSBQeXRob24gZGV2ZWxvcGVycyBzd2l0Y2hlZCBmcm9tIENWUyB0byBTdWJ2ZXJzaW9uIGR1cmluZyB0aGUgMi41CitkZXZlbG9wbWVudCBwcm9jZXNzLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4YWN0IGJ1aWxkIHZlcnNpb24gaXMgCithdmFpbGFibGUgYXMgdGhlIFxjb2Rle3N5cy5zdWJ2ZXJzaW9ufSB2YXJpYWJsZSwgYSAzLXR1cGxlCitvZiBcY29kZXsoXHZhcntpbnRlcnByZXRlci1uYW1lfSwgXHZhcnticmFuY2gtbmFtZX0sIFx2YXJ7cmV2aXNpb24tcmFuZ2V9KX0uCitGb3IgZXhhbXBsZSwgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyAKK215IGNvcHkgb2YgMi41IHdhcyByZXBvcnRpbmcgXGNvZGV7KCdDUHl0aG9uJywgJ3RydW5rJywgJzQ1MzEzOjQ1MzE1Jyl9LgorCitUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHRvIEMgZXh0ZW5zaW9ucyB2aWEgdGhlIAorXGNmdW5jdGlvbntQeV9HZXRCdWlsZEluZm8oKX0gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgCitzdHJpbmcgb2YgYnVpbGQgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgorXGNvZGV7InRydW5rOjQ1MzU1OjQ1MzU2TSwgQXByIDEzIDIwMDYsIDA3OjQyOjE5In0uICAKKyhDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQogCiBcaXRlbSBUaGUgXGNsYXNze1RhckZpbGV9IGNsYXNzIGluIHRoZSBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBub3cgaGFzCiBhbiBcbWV0aG9ke2V4dHJhY3RhbGwoKX0gbWV0aG9kIHRoYXQgZXh0cmFjdHMgYWxsIG1lbWJlcnMgZnJvbSB0aGUKQEAgLTYyNSwxNyArMTQzMSwyOCBAQAogYnkgc29tZSBzcGVjaWZpY2F0aW9ucywgc28gaXQncyBzdGlsbCBhdmFpbGFibGUgYXMgCiBcbWVtYmVye3VuaWNvZGVkYXRhLmRiXzNfMl8wfS4KIAotXGl0ZW0gQSBuZXcgcGFja2FnZSBcbW9kdWxle3htbC5ldHJlZX0gaGFzIGJlZW4gYWRkZWQsIHdoaWNoIGNvbnRhaW5zCi1hIHN1YnNldCBvZiB0aGUgRWxlbWVudFRyZWUgWE1MIGxpYnJhcnkuICBBdmFpbGFibGUgbW9kdWxlcyBhcmUKLVxtb2R1bGV7RWxlbWVudFRyZWV9LCBcbW9kdWxle0VsZW1lbnRQYXRofSwgYW5kCi1cbW9kdWxle0VsZW1lbnRJbmNsdWRlfSwgZnJvbSBFbGVtZW50VHJlZSAxLjIuNi4gKENvbnRyaWJ1dGVkIGJ5Ci1GcmVkcmlrIEx1bmRoLikKK1xpdGVtIFRoZSBcbW9kdWxle3dlYmJyb3dzZXJ9IG1vZHVsZSByZWNlaXZlZCBhIG51bWJlciBvZgorZW5oYW5jZW1lbnRzLgorSXQncyBub3cgdXNhYmxlIGFzIGEgc2NyaXB0IHdpdGggXGNvZGV7cHl0aG9uIC1tIHdlYmJyb3dzZXJ9LCB0YWtpbmcgYQorVVJMIGFzIHRoZSBhcmd1bWVudDsgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHN3aXRjaGVzIAordG8gY29udHJvbCB0aGUgYmVoYXZpb3VyIChccHJvZ3JhbW9wdHstbn0gZm9yIGEgbmV3IGJyb3dzZXIgd2luZG93LCAKK1xwcm9ncmFtb3B0ey10fSBmb3IgYSBuZXcgdGFiKS4gIE5ldyBtb2R1bGUtbGV2ZWwgZnVuY3Rpb25zLAorXGZ1bmN0aW9ue29wZW5fbmV3KCl9IGFuZCBcZnVuY3Rpb257b3Blbl9uZXdfdGFiKCl9LCB3ZXJlIGFkZGVkIAordG8gc3VwcG9ydCB0aGlzLiAgVGhlIG1vZHVsZSdzIFxmdW5jdGlvbntvcGVuKCl9IGZ1bmN0aW9uIHN1cHBvcnRzIGFuCithZGRpdGlvbmFsIGZlYXR1cmUsIGFuIFx2YXJ7YXV0b3JhaXNlfSBwYXJhbWV0ZXIgdGhhdCBzaWduYWxzIHdoZXRoZXIKK3RvIHJhaXNlIHRoZSBvcGVuIHdpbmRvdyB3aGVuIHBvc3NpYmxlLiBBIG51bWJlciBvZiBhZGRpdGlvbmFsCiticm93c2VycyB3ZXJlIGFkZGVkIHRvIHRoZSBzdXBwb3J0ZWQgbGlzdCBzdWNoIGFzIEZpcmVmb3gsIE9wZXJhLAorS29ucXVlcm9yLCBhbmQgZWxpbmtzLiAgKENvbnRyaWJ1dGVkIGJ5IE9sZWcgQnJveXRtYW5uIGFuZCBHZW9yZ2UKK0JyYW5kbC4pCislIFBhdGNoICM3NTQwMjIKKwogCiBcaXRlbSBUaGUgXG1vZHVsZXt4bWxycGNsaWJ9IG1vZHVsZSBub3cgc3VwcG9ydHMgcmV0dXJuaW5nIAogICAgICAgXGNsYXNze2RhdGV0aW1lfSBvYmplY3RzIGZvciB0aGUgWE1MLVJQQyBkYXRlIHR5cGUuICBTdXBwbHkgCiAgICAgICBcY29kZXt1c2VfZGF0ZXRpbWU9VHJ1ZX0gdG8gdGhlIFxmdW5jdGlvbntsb2FkcygpfSBmdW5jdGlvbgogICAgICAgb3IgdGhlIFxjbGFzc3tVbm1hcnNoYWxsZXJ9IGNsYXNzIHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUuCi0lIFhYWCBwYXRjaCAxMTIwMzUzCisgICAgICAoQ29udHJpYnV0ZWQgYnkgU2tpcCBNb250YW5hcm8uKQorJSBQYXRjaCAxMTIwMzUzCiAKIAogXGVuZHtpdGVtaXplfQpAQCAtNjQzLDEzICsxNDYwLDM1OCBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0lIHdob2xlIG5ldyBtb2R1bGVzIGdldCBkZXNjcmliZWQgaW4gXHN1YnNlY3Rpb25zIGhlcmUKK1xzdWJzZWN0aW9ue1RoZSBjdHlwZXMgcGFja2FnZX0KIAotJSBYWFggbmV3IGRpc3R1dGlscyBmZWF0dXJlczogdXBsb2FkCitUaGUgXG1vZHVsZXtjdHlwZXN9IHBhY2thZ2UsIHdyaXR0ZW4gYnkgVGhvbWFzIEhlbGxlciwgaGFzIGJlZW4gYWRkZWQgCit0byB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFxtb2R1bGV7Y3R5cGVzfSBsZXRzIHlvdSBjYWxsIGFyYml0cmFyeSBmdW5jdGlvbnMgCitpbiBzaGFyZWQgbGlicmFyaWVzIG9yIERMTHMuICBMb25nLXRpbWUgdXNlcnMgbWF5IHJlbWVtYmVyIHRoZSBcbW9kdWxle2RsfSBtb2R1bGUsIHdoaWNoIAorcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBsb2FkaW5nIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZW0uICBUaGUgXG1vZHVsZXtjdHlwZXN9IHBhY2thZ2UgaXMgbXVjaCBmYW5jaWVyLgogCi0lIFhYWCBzaG91bGQgaGFzaGxpYiBwZXJoYXBzIGJlIGRlc2NyaWJlZCBoZXJlIGluc3RlYWQ/Ci0lIFhYWCBzaG91bGQgeG1sLmV0cmVlIHBlcmhhcHMgYmUgZGVzY3JpYmVkIGhlcmUgaW5zdGVhZD8KK1RvIGxvYWQgYSBzaGFyZWQgbGlicmFyeSBvciBETEwsIHlvdSBtdXN0IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgCitcY2xhc3N7Q0RMTH0gY2xhc3MgYW5kIHByb3ZpZGUgdGhlIG5hbWUgb3IgcGF0aCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKK29yIERMTC4gIE9uY2UgdGhhdCdzIGRvbmUsIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgZnVuY3Rpb25zCitieSBhY2Nlc3NpbmcgdGhlbSBhcyBhdHRyaWJ1dGVzIG9mIHRoZSBcY2xhc3N7Q0RMTH0gb2JqZWN0LiAgCiAKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBjdHlwZXMKKworbGliYyA9IGN0eXBlcy5DRExMKCdsaWJjLnNvLjYnKQorcmVzdWx0ID0gbGliYy5wcmludGYoIkxpbmUgb2Ygb3V0cHV0XG4iKQorXGVuZHt2ZXJiYXRpbX0KKworVHlwZSBjb25zdHJ1Y3RvcnMgZm9yIHRoZSB2YXJpb3VzIEMgdHlwZXMgYXJlIHByb3ZpZGVkOiBcZnVuY3Rpb257Y19pbnR9LAorXGZ1bmN0aW9ue2NfZmxvYXR9LCBcZnVuY3Rpb257Y19kb3VibGV9LCBcZnVuY3Rpb257Y19jaGFyX3B9IChlcXVpdmFsZW50IHRvIFxjdHlwZXtjaGFyICp9KSwgYW5kIHNvIGZvcnRoLiAgVW5saWtlIFB5dGhvbidzIHR5cGVzLCB0aGUgQyB2ZXJzaW9ucyBhcmUgYWxsIG11dGFibGU7IHlvdSBjYW4gYXNzaWduIHRvIHRoZWlyIFxtZW1iZXJ7dmFsdWV9IGF0dHJpYnV0ZQordG8gY2hhbmdlIHRoZSB3cmFwcGVkIHZhbHVlLiAgUHl0aG9uIGludGVnZXJzIGFuZCBzdHJpbmdzIHdpbGwgYmUgYXV0b21hdGljYWxseQorY29udmVydGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIEMgdHlwZXMsIGJ1dCBmb3Igb3RoZXIgdHlwZXMgeW91IAorbXVzdCBjYWxsIHRoZSBjb3JyZWN0IHR5cGUgY29uc3RydWN0b3IuICAoQW5kIEkgbWVhbiBcZW1waHttdXN0fTsgCitnZXR0aW5nIGl0IHdyb25nIHdpbGwgb2Z0ZW4gcmVzdWx0IGluIHRoZSBpbnRlcnByZXRlciBjcmFzaGluZyAKK3dpdGggYSBzZWdtZW50YXRpb24gZmF1bHQuKQorCitZb3Ugc2hvdWxkbid0IHVzZSBcZnVuY3Rpb257Y19jaGFyX3B9IHdpdGggYSBQeXRob24gc3RyaW5nIHdoZW4gdGhlIEMgZnVuY3Rpb24gd2lsbCBiZSBtb2RpZnlpbmcgdGhlIG1lbW9yeSBhcmVhLCBiZWNhdXNlIFB5dGhvbiBzdHJpbmdzIGFyZSAKK3N1cHBvc2VkIHRvIGJlIGltbXV0YWJsZTsgYnJlYWtpbmcgdGhpcyBydWxlIHdpbGwgY2F1c2UgcHV6emxpbmcgYnVncy4gIFdoZW4geW91IG5lZWQgYSBtb2RpZmlhYmxlIG1lbW9yeSBhcmVhLAordXNlIFxmdW5jdGlvbntjcmVhdGVfc3RyaW5nX2J1ZmZlcigpfToKKworXGJlZ2lue3ZlcmJhdGltfQorcyA9ICJ0aGlzIGlzIGEgc3RyaW5nIgorYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHMpCitsaWJjLnN0cmZyeShidWYpCitcZW5ke3ZlcmJhdGltfQorCitDIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byByZXR1cm4gaW50ZWdlcnMsIGJ1dCB5b3UgY2FuIHNldAordGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgdG8gCitjaGFuZ2UgdGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGxpYmMuYXRvZignMi43MTgyOCcpCistMTc4Mzk1NzYxNgorPj4+IGxpYmMuYXRvZi5yZXN0eXBlID0gY3R5cGVzLmNfZG91YmxlCis+Pj4gbGliYy5hdG9mKCcyLjcxODI4JykKKzIuNzE4MjgKK1xlbmR7dmVyYmF0aW19CisKK1xtb2R1bGV7Y3R5cGVzfSBhbHNvIHByb3ZpZGVzIGEgd3JhcHBlciBmb3IgUHl0aG9uJ3MgQyBBUEkgCithcyB0aGUgXGNvZGV7Y3R5cGVzLnB5dGhvbmFwaX0gb2JqZWN0LiAgVGhpcyBvYmplY3QgZG9lcyBcZW1waHtub3R9IAorcmVsZWFzZSB0aGUgZ2xvYmFsIGludGVycHJldGVyIGxvY2sgYmVmb3JlIGNhbGxpbmcgYSBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgbG9jayBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nIGludG8gdGhlIGludGVycHJldGVyJ3MgY29kZS4gIAorVGhlcmUncyBhIFxjbGFzc3tweV9vYmplY3QoKX0gdHlwZSBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgY3JlYXRlIGEgCitcY3R5cGV7UHlPYmplY3QgKn0gcG9pbnRlci4gIEEgc2ltcGxlIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgY3R5cGVzCisKK2QgPSB7fQorY3R5cGVzLnB5dGhvbmFwaS5QeU9iamVjdF9TZXRJdGVtKGN0eXBlcy5weV9vYmplY3QoZCksCisgICAgICAgICAgY3R5cGVzLnB5X29iamVjdCgiYWJjIiksICBjdHlwZXMucHlfb2JqZWN0KDEpKQorIyBkIGlzIG5vdyB7J2FiYycsIDF9LgorXGVuZHt2ZXJiYXRpbX0KKworRG9uJ3QgZm9yZ2V0IHRvIHVzZSBcY2xhc3N7cHlfb2JqZWN0KCl9OyBpZiBpdCdzIG9taXR0ZWQgeW91IGVuZCAKK3VwIHdpdGggYSBzZWdtZW50YXRpb24gZmF1bHQuCisKK1xtb2R1bGV7Y3R5cGVzfSBoYXMgYmVlbiBhcm91bmQgZm9yIGEgd2hpbGUsIGJ1dCBwZW9wbGUgc3RpbGwgd3JpdGUgCithbmQgZGlzdHJpYnV0aW9uIGhhbmQtY29kZWQgZXh0ZW5zaW9uIG1vZHVsZXMgYmVjYXVzZSB5b3UgY2FuJ3QgcmVseSBvbiBcbW9kdWxle2N0eXBlc30gYmVpbmcgcHJlc2VudC4KK1BlcmhhcHMgZGV2ZWxvcGVycyB3aWxsIGJlZ2luIHRvIHdyaXRlIAorUHl0aG9uIHdyYXBwZXJzIGF0b3AgYSBsaWJyYXJ5IGFjY2Vzc2VkIHRocm91Z2ggXG1vZHVsZXtjdHlwZXN9IGluc3RlYWQKK29mIGV4dGVuc2lvbiBtb2R1bGVzLCBub3cgdGhhdCBcbW9kdWxle2N0eXBlc30gaXMgaW5jbHVkZWQgd2l0aCBjb3JlIFB5dGhvbi4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWV1cmx7aHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy90aGVsbGVyL2N0eXBlcy99Cit7VGhlIGN0eXBlcyB3ZWIgcGFnZSwgd2l0aCBhIHR1dG9yaWFsLCByZWZlcmVuY2UsIGFuZCBGQVEufQorCitcZW5ke3NlZWFsc299CisKKworJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1xzdWJzZWN0aW9ue1RoZSBFbGVtZW50VHJlZSBwYWNrYWdlfQorCitBIHN1YnNldCBvZiBGcmVkcmlrIEx1bmRoJ3MgRWxlbWVudFRyZWUgbGlicmFyeSBmb3IgcHJvY2Vzc2luZyBYTUwgaGFzCitiZWVuIGFkZGVkIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFzIFxtb2R1bGV7eG1sY29yZS5ldHJlZX0uICBUaGUKK2F2YWlsYWJsZSBtb2R1bGVzIGFyZQorXG1vZHVsZXtFbGVtZW50VHJlZX0sIFxtb2R1bGV7RWxlbWVudFBhdGh9LCBhbmQKK1xtb2R1bGV7RWxlbWVudEluY2x1ZGV9IGZyb20gRWxlbWVudFRyZWUgMS4yLjYuICAgCitUaGUgXG1vZHVsZXtjRWxlbWVudFRyZWV9IGFjY2VsZXJhdG9yIG1vZHVsZSBpcyBhbHNvIGluY2x1ZGVkLiAKKworVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIHdpbGwgcHJvdmlkZSBhIGJyaWVmIG92ZXJ2aWV3IG9mIHVzaW5nCitFbGVtZW50VHJlZS4gIEZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IgRWxlbWVudFRyZWUgaXMgYXZhaWxhYmxlIGF0CitcdXJse2h0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudC1pbmRleC5odG19LgorCitFbGVtZW50VHJlZSByZXByZXNlbnRzIGFuIFhNTCBkb2N1bWVudCBhcyBhIHRyZWUgb2YgZWxlbWVudCBub2Rlcy4KK1RoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50IGlzIHN0b3JlZCBhcyB0aGUgXG1lbWJlcnsudGV4dH0KK2FuZCBcbWVtYmVyey50YWlsfSBhdHRyaWJ1dGVzIG9mIAorKFRoaXMgaXMgb25lIG9mIHRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIEVsZW1lbnRUcmVlIGFuZCAKK3RoZSBEb2N1bWVudCBPYmplY3QgTW9kZWw7IGluIHRoZSBET00gdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50Cit0eXBlcyBvZiBub2RlLCBpbmNsdWRpbmcgXGNsYXNze1RleHROb2RlfS4pCisKK1RoZSBtb3N0IGNvbW1vbmx5IHVzZWQgcGFyc2luZyBmdW5jdGlvbiBpcyBcZnVuY3Rpb257cGFyc2UoKX0sIHRoYXQKK3Rha2VzIGVpdGhlciBhIHN0cmluZyAoYXNzdW1lZCB0byBjb250YWluIGEgZmlsZW5hbWUpIG9yIGEgZmlsZS1saWtlCitvYmplY3QgYW5kIHJldHVybnMgYW4gXGNsYXNze0VsZW1lbnRUcmVlfSBpbnN0YW5jZToKKworXGJlZ2lue3ZlcmJhdGltfQorZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCit0cmVlID0gRVQucGFyc2UoJ2V4LTEueG1sJykKKworZmVlZCA9IHVybGxpYi51cmxvcGVuKAorICAgICAgICAgICdodHRwOi8vcGxhbmV0LnB5dGhvbi5vcmcvcnNzMTAueG1sJykKK3RyZWUgPSBFVC5wYXJzZShmZWVkKQorXGVuZHt2ZXJiYXRpbX0KKworT25jZSB5b3UgaGF2ZSBhbiBcY2xhc3N7RWxlbWVudFRyZWV9IGluc3RhbmNlLCB5b3UKK2NhbiBjYWxsIGl0cyBcbWV0aG9ke2dldHJvb3QoKX0gbWV0aG9kIHRvIGdldCB0aGUgcm9vdCBcY2xhc3N7RWxlbWVudH0gbm9kZS4KKworVGhlcmUncyBhbHNvIGFuIFxmdW5jdGlvbntYTUwoKX0gZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHN0cmluZyBsaXRlcmFsCithbmQgcmV0dXJucyBhbiBcY2xhc3N7RWxlbWVudH0gbm9kZSAobm90IGFuIFxjbGFzc3tFbGVtZW50VHJlZX0pLiAgCitUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgdGlkeSB3YXkgdG8gaW5jb3Jwb3JhdGUgWE1MIGZyYWdtZW50cywKK2FwcHJvYWNoaW5nIHRoZSBjb252ZW5pZW5jZSBvZiBhbiBYTUwgbGl0ZXJhbDoKKworXGJlZ2lue3ZlcmJhdGltfQorc3ZnID0gZXQuWE1MKCIiIjxzdmcgd2lkdGg9IjEwcHgiIHZlcnNpb249IjEuMCI+CisgICAgICAgICAgICAgPC9zdmc+IiIiKQorc3ZnLnNldCgnaGVpZ2h0JywgJzMyMHB4JykKK3N2Zy5hcHBlbmQoZWxlbTEpCitcZW5ke3ZlcmJhdGltfQorCitFYWNoIFhNTCBlbGVtZW50IHN1cHBvcnRzIHNvbWUgZGljdGlvbmFyeS1saWtlIGFuZCBzb21lIGxpc3QtbGlrZQorYWNjZXNzIG1ldGhvZHMuICBEaWN0aW9uYXJ5LWxpa2Ugb3BlcmF0aW9ucyBhcmUgdXNlZCB0byBhY2Nlc3MgYXR0cmlidXRlCit2YWx1ZXMsIGFuZCBsaXN0LWxpa2Ugb3BlcmF0aW9ucyBhcmUgdXNlZCB0byBhY2Nlc3MgY2hpbGQgbm9kZXMuCisKK1xiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fQorICBcbGluZWlpe2VsZW1bbl19e1JldHVybnMgbid0aCBjaGlsZCBlbGVtZW50Ln0KKyAgXGxpbmVpaXtlbGVtW206bl19e1JldHVybnMgbGlzdCBvZiBtJ3RoIHRocm91Z2ggbid0aCBjaGlsZCBlbGVtZW50cy59CisgIFxsaW5laWl7bGVuKGVsZW0pfXtSZXR1cm5zIG51bWJlciBvZiBjaGlsZCBlbGVtZW50cy59CisgIFxsaW5laWl7ZWxlbS5nZXRjaGlsZHJlbigpfXtSZXR1cm5zIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMufQorICBcbGluZWlpe2VsZW0uYXBwZW5kKGVsZW0yKX17QWRkcyBcdmFye2VsZW0yfSBhcyBhIGNoaWxkLn0KKyAgXGxpbmVpaXtlbGVtLmluc2VydChpbmRleCwgZWxlbTIpfXtJbnNlcnRzIFx2YXJ7ZWxlbTJ9IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24ufQorICBcbGluZWlpe2RlbCBlbGVtW25dfXtEZWxldGVzIG4ndGggY2hpbGQgZWxlbWVudC59CisgIFxsaW5laWl7ZWxlbS5rZXlzKCl9e1JldHVybnMgbGlzdCBvZiBhdHRyaWJ1dGUgbmFtZXMufQorICBcbGluZWlpe2VsZW0uZ2V0KG5hbWUpfXtSZXR1cm5zIHZhbHVlIG9mIGF0dHJpYnV0ZSBcdmFye25hbWV9Ln0KKyAgXGxpbmVpaXtlbGVtLnNldChuYW1lLCB2YWx1ZSl9e1NldHMgbmV3IHZhbHVlIGZvciBhdHRyaWJ1dGUgXHZhcntuYW1lfS59CisgIFxsaW5laWl7ZWxlbS5hdHRyaWJ9e1JldHJpZXZlcyB0aGUgZGljdGlvbmFyeSBjb250YWluaW5nIGF0dHJpYnV0ZXMufQorICBcbGluZWlpe2RlbCBlbGVtLmF0dHJpYltuYW1lXX17RGVsZXRlcyBhdHRyaWJ1dGUgXHZhcntuYW1lfS59CitcZW5ke3RhYmxlaWl9CisKK0NvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgYWxzbyByZXByZXNlbnRlZCBhcworXGNsYXNze0VsZW1lbnR9IG5vZGVzLiAgVG8gY2hlY2sgaWYgYSBub2RlIGlzIGEgY29tbWVudCBvciBwcm9jZXNzaW5nCitpbnN0cnVjdGlvbnM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2lmIGVsZW0udGFnIGlzIEVULkNvbW1lbnQ6CisgICAgLi4uCitlbGlmIGVsZW0udGFnIGlzIEVULlByb2Nlc3NpbmdJbnN0cnVjdGlvbjoKKyAgICAuLi4KK1xlbmR7dmVyYmF0aW19CisKK1RvIGdlbmVyYXRlIFhNTCBvdXRwdXQsIHlvdSBzaG91bGQgY2FsbCB0aGUKK1xtZXRob2R7RWxlbWVudFRyZWUud3JpdGUoKX0gbWV0aG9kLiAgTGlrZSBcZnVuY3Rpb257cGFyc2UoKX0sCitpdCBjYW4gdGFrZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0OgorCitcYmVnaW57dmVyYmF0aW19CisjIEVuY29kaW5nIGlzIFVTLUFTQ0lJCit0cmVlLndyaXRlKCdvdXRwdXQueG1sJykKKworIyBFbmNvZGluZyBpcyBVVEYtOAorZiA9IG9wZW4oJ291dHB1dC54bWwnLCAndycpCit0cmVlLndyaXRlKGYsICd1dGYtOCcpCitcZW5ke3ZlcmJhdGltfQorCisoQ2F1dGlvbjogdGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBmb3Igb3V0cHV0IGlzIEFTQ0lJLCB3aGljaCBpc24ndAordmVyeSB1c2VmdWwgZm9yIGdlbmVyYWwgWE1MIHdvcmssIHJhaXNpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGFyZQorYW55IGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIFlvdSBzaG91bGQgYWx3YXlzCitzcGVjaWZ5IGEgZGlmZmVyZW50IGVuY29kaW5nIHN1Y2ggYXMgVVRGLTggdGhhdCBjYW4gaGFuZGxlIGFueSBVbmljb2RlCitjaGFyYWN0ZXIuKQorCitUaGlzIHNlY3Rpb24gaXMgb25seSBhIHBhcnRpYWwgZGVzY3JpcHRpb24gb2YgdGhlIEVsZW1lbnRUcmVlIGludGVyZmFjZXMuCitQbGVhc2UgcmVhZCB0aGUgcGFja2FnZSdzIG9mZmljaWFsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWV1cmx7aHR0cDovL2VmZmJvdC5vcmcvem9uZS9lbGVtZW50LWluZGV4Lmh0bX0KK3tPZmZpY2lhbCBkb2N1bWVudGF0aW9uIGZvciBFbGVtZW50VHJlZS59CisKKworXGVuZHtzZWVhbHNvfQorCisKKyU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citcc3Vic2VjdGlvbntUaGUgaGFzaGxpYiBwYWNrYWdlfQorCitBIG5ldyBcbW9kdWxle2hhc2hsaWJ9IG1vZHVsZSwgd3JpdHRlbiBieSBHcmVnb3J5IFAuIFNtaXRoLCAKK2hhcyBiZWVuIGFkZGVkIHRvIHJlcGxhY2UgdGhlCitcbW9kdWxle21kNX0gYW5kIFxtb2R1bGV7c2hhfSBtb2R1bGVzLiAgXG1vZHVsZXtoYXNobGlifSBhZGRzIHN1cHBvcnQKK2ZvciBhZGRpdGlvbmFsIHNlY3VyZSBoYXNoZXMgKFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQsIGFuZCBTSEEtNTEyKS4KK1doZW4gYXZhaWxhYmxlLCB0aGUgbW9kdWxlIHVzZXMgT3BlblNTTCBmb3IgZmFzdCBwbGF0Zm9ybSBvcHRpbWl6ZWQKK2ltcGxlbWVudGF0aW9ucyBvZiBhbGdvcml0aG1zLiAgCisKK1RoZSBvbGQgXG1vZHVsZXttZDV9IGFuZCBcbW9kdWxle3NoYX0gbW9kdWxlcyBzdGlsbCBleGlzdCBhcyB3cmFwcGVycworYXJvdW5kIGhhc2hsaWIgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBUaGUgbmV3IG1vZHVsZSdzCitpbnRlcmZhY2UgaXMgdmVyeSBjbG9zZSB0byB0aGF0IG9mIHRoZSBvbGQgbW9kdWxlcywgYnV0IG5vdCBpZGVudGljYWwuCitUaGUgbW9zdCBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucworZm9yIGNyZWF0aW5nIG5ldyBoYXNoaW5nIG9iamVjdHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LgorCitcYmVnaW57dmVyYmF0aW19CisjIE9sZCB2ZXJzaW9ucworaCA9IG1kNS5tZDUoKSAgIAoraCA9IG1kNS5uZXcoKSAgIAorCisjIE5ldyB2ZXJzaW9uIAoraCA9IGhhc2hsaWIubWQ1KCkKKworIyBPbGQgdmVyc2lvbnMKK2ggPSBzaGEuc2hhKCkgICAKK2ggPSBzaGEubmV3KCkgICAKKworIyBOZXcgdmVyc2lvbiAKK2ggPSBoYXNobGliLnNoYTEoKQorCisjIEhhc2ggdGhhdCB3ZXJlbid0IHByZXZpb3VzbHkgYXZhaWxhYmxlCitoID0gaGFzaGxpYi5zaGEyMjQoKQoraCA9IGhhc2hsaWIuc2hhMjU2KCkKK2ggPSBoYXNobGliLnNoYTM4NCgpCitoID0gaGFzaGxpYi5zaGE1MTIoKQorCisjIEFsdGVybmF0aXZlIGZvcm0KK2ggPSBoYXNobGliLm5ldygnbWQ1JykgICAgICAgICAgIyBQcm92aWRlIGFsZ29yaXRobSBhcyBhIHN0cmluZworXGVuZHt2ZXJiYXRpbX0KKworT25jZSBhIGhhc2ggb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyBiZWZvcmU6CitcbWV0aG9ke3VwZGF0ZShcdmFye3N0cmluZ30pfSBoYXNoZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byB0aGUgCitjdXJyZW50IGRpZ2VzdCBzdGF0ZSwgXG1ldGhvZHtkaWdlc3QoKX0gYW5kIFxtZXRob2R7aGV4ZGlnZXN0KCl9CityZXR1cm4gdGhlIGRpZ2VzdCB2YWx1ZSBhcyBhIGJpbmFyeSBzdHJpbmcgb3IgYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cywKK2FuZCBcbWV0aG9ke2NvcHkoKX0gcmV0dXJucyBhIG5ldyBoYXNoaW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRpZ2VzdCBzdGF0ZS4KKworCislPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorXHN1YnNlY3Rpb257VGhlIHNxbGl0ZTMgcGFja2FnZX0KKworVGhlIHB5c3FsaXRlIG1vZHVsZSAoXHVybHtodHRwOi8vd3d3LnB5c3FsaXRlLm9yZ30pLCBhIHdyYXBwZXIgZm9yIHRoZQorU1FMaXRlIGVtYmVkZGVkIGRhdGFiYXNlLCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc3RhbmRhcmQgbGlicmFyeSB1bmRlcgordGhlIHBhY2thZ2UgbmFtZSBcbW9kdWxle3NxbGl0ZTN9LiAgCisKK1NRTGl0ZSBpcyBhIEMgbGlicmFyeSB0aGF0IHByb3ZpZGVzIGEgU1FMLWxhbmd1YWdlIGRhdGFiYXNlIHRoYXQKK3N0b3JlcyBkYXRhIGluIGRpc2sgZmlsZXMgd2l0aG91dCByZXF1aXJpbmcgYSBzZXBhcmF0ZSBzZXJ2ZXIgcHJvY2Vzcy4KK3B5c3FsaXRlIHdhcyB3cml0dGVuIGJ5IEdlcmhhcmQgSFwiYXJpbmcgYW5kIHByb3ZpZGVzIGEgU1FMIGludGVyZmFjZQorY29tcGxpYW50IHdpdGggdGhlIERCLUFQSSAyLjAgc3BlY2lmaWNhdGlvbiBkZXNjcmliZWQgYnkKK1xwZXB7MjQ5fS4gVGhpcyBtZWFucyB0aGF0IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byB3cml0ZSB0aGUgZmlyc3QKK3ZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbnMgdXNpbmcgU1FMaXRlIGZvciBkYXRhIHN0b3JhZ2UuICBJZgorc3dpdGNoaW5nIHRvIGEgbGFyZ2VyIGRhdGFiYXNlIHN1Y2ggYXMgUG9zdGdyZVNRTCBvciBPcmFjbGUgaXMKK2xhdGVyIG5lY2Vzc2FyeSwgdGhlIHN3aXRjaCBzaG91bGQgYmUgcmVsYXRpdmVseSBlYXN5LgorCitJZiB5b3UncmUgY29tcGlsaW5nIHRoZSBQeXRob24gc291cmNlIHlvdXJzZWxmLCBub3RlIHRoYXQgdGhlIHNvdXJjZQordHJlZSBkb2Vzbid0IGluY2x1ZGUgdGhlIFNRTGl0ZSBjb2RlLCBvbmx5IHRoZSB3cmFwcGVyIG1vZHVsZS4KK1lvdSdsbCBuZWVkIHRvIGhhdmUgdGhlIFNRTGl0ZSBsaWJyYXJpZXMgYW5kIGhlYWRlcnMgaW5zdGFsbGVkIGJlZm9yZQorY29tcGlsaW5nIFB5dGhvbiwgYW5kIHRoZSBidWlsZCBwcm9jZXNzIHdpbGwgY29tcGlsZSB0aGUgbW9kdWxlIHdoZW4KK3RoZSBuZWNlc3NhcnkgaGVhZGVycyBhcmUgYXZhaWxhYmxlLgorCitUbyB1c2UgdGhlIG1vZHVsZSwgeW91IG11c3QgZmlyc3QgY3JlYXRlIGEgXGNsYXNze0Nvbm5lY3Rpb259IG9iamVjdAordGhhdCByZXByZXNlbnRzIHRoZSBkYXRhYmFzZS4gIEhlcmUgdGhlIGRhdGEgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIAorXGZpbGV7L3RtcC9leGFtcGxlfSBmaWxlOgorCitcYmVnaW57dmVyYmF0aW19Citjb25uID0gc3FsaXRlMy5jb25uZWN0KCcvdG1wL2V4YW1wbGUnKQorXGVuZHt2ZXJiYXRpbX0KKworWW91IGNhbiBhbHNvIHN1cHBseSB0aGUgc3BlY2lhbCBuYW1lIFxzYW1wezptZW1vcnk6fSB0byBjcmVhdGUKK2EgZGF0YWJhc2UgaW4gUkFNLgorCitPbmNlIHlvdSBoYXZlIGEgXGNsYXNze0Nvbm5lY3Rpb259LCB5b3UgY2FuIGNyZWF0ZSBhIFxjbGFzc3tDdXJzb3J9IAorb2JqZWN0IGFuZCBjYWxsIGl0cyBcbWV0aG9ke2V4ZWN1dGUoKX0gbWV0aG9kIHRvIHBlcmZvcm0gU1FMIGNvbW1hbmRzOgorCitcYmVnaW57dmVyYmF0aW19CitjID0gY29ubi5jdXJzb3IoKQorCisjIENyZWF0ZSB0YWJsZQorYy5leGVjdXRlKCcnJ2NyZWF0ZSB0YWJsZSBzdG9ja3MKKyhkYXRlIHRpbWVzdGFtcCwgdHJhbnMgdmFyY2hhciwgc3ltYm9sIHZhcmNoYXIsCisgcXR5IGRlY2ltYWwsIHByaWNlIGRlY2ltYWwpJycnKQorCisjIEluc2VydCBhIHJvdyBvZiBkYXRhCitjLmV4ZWN1dGUoIiIiaW5zZXJ0IGludG8gc3RvY2tzCisgICAgICAgICAgdmFsdWVzICgnMjAwNi0wMS0wNScsJ0JVWScsJ1JIQVQnLDEwMCwzNS4xNCkiIiIpCitcZW5ke3ZlcmJhdGltfSAgICAKKworVXN1YWxseSB5b3VyIFNRTCBvcGVyYXRpb25zIHdpbGwgbmVlZCB0byB1c2UgdmFsdWVzIGZyb20gUHl0aG9uCit2YXJpYWJsZXMuICBZb3Ugc2hvdWxkbid0IGFzc2VtYmxlIHlvdXIgcXVlcnkgdXNpbmcgUHl0aG9uJ3Mgc3RyaW5nCitvcGVyYXRpb25zIGJlY2F1c2UgZG9pbmcgc28gaXMgaW5zZWN1cmU7IGl0IG1ha2VzIHlvdXIgcHJvZ3JhbQordnVsbmVyYWJsZSB0byBhbiBTUUwgaW5qZWN0aW9uIGF0dGFjay4gIAorCitJbnN0ZWFkLCB1c2UgU1FMaXRlJ3MgcGFyYW1ldGVyIHN1YnN0aXR1dGlvbi4gIFB1dCBcc2FtcHs/fSBhcyBhCitwbGFjZWhvbGRlciB3aGVyZXZlciB5b3Ugd2FudCB0byB1c2UgYSB2YWx1ZSwgYW5kIHRoZW4gcHJvdmlkZSBhIHR1cGxlCitvZiB2YWx1ZXMgYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgY3Vyc29yJ3MgXG1ldGhvZHtleGVjdXRlKCl9CittZXRob2QuICBGb3IgZXhhbXBsZToKKworXGJlZ2lue3ZlcmJhdGltfSAgICAKKyMgTmV2ZXIgZG8gdGhpcyAtLSBpbnNlY3VyZSEKK3N5bWJvbCA9ICdJQk0nCitjLmV4ZWN1dGUoIi4uLiB3aGVyZSBzeW1ib2wgPSAnJXMnIiAlIHN5bWJvbCkKKworIyBEbyB0aGlzIGluc3RlYWQKK3QgPSAoc3ltYm9sLCkKK2MuZXhlY3V0ZSgnc2VsZWN0ICogZnJvbSBzdG9ja3Mgd2hlcmUgc3ltYm9sPT8nLCAoJ0lCTScsKSkKKworIyBMYXJnZXIgZXhhbXBsZQorZm9yIHQgaW4gKCgnMjAwNi0wMy0yOCcsICdCVVknLCAnSUJNJywgMTAwMCwgNDUuMDApLAorICAgICAgICAgICgnMjAwNi0wNC0wNScsICdCVVknLCAnTVNPRlQnLCAxMDAwLCA3Mi4wMCksCisgICAgICAgICAgKCcyMDA2LTA0LTA2JywgJ1NFTEwnLCAnSUJNJywgNTAwLCA1My4wMCksCisgICAgICAgICApOgorICAgIGMuZXhlY3V0ZSgnaW5zZXJ0IGludG8gc3RvY2tzIHZhbHVlcyAoPyw/LD8sPyw/KScsIHQpCitcZW5ke3ZlcmJhdGltfQorCitUbyByZXRyaWV2ZSBkYXRhIGFmdGVyIGV4ZWN1dGluZyBhIFNFTEVDVCBzdGF0ZW1lbnQsIHlvdSBjYW4gZWl0aGVyIAordHJlYXQgdGhlIGN1cnNvciBhcyBhbiBpdGVyYXRvciwgY2FsbCB0aGUgY3Vyc29yJ3MgXG1ldGhvZHtmZXRjaG9uZSgpfQorbWV0aG9kIHRvIHJldHJpZXZlIGEgc2luZ2xlIG1hdGNoaW5nIHJvdywgCitvciBjYWxsIFxtZXRob2R7ZmV0Y2hhbGwoKX0gdG8gZ2V0IGEgbGlzdCBvZiB0aGUgbWF0Y2hpbmcgcm93cy4KKworVGhpcyBleGFtcGxlIHVzZXMgdGhlIGl0ZXJhdG9yIGZvcm06CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjID0gY29ubi5jdXJzb3IoKQorPj4+IGMuZXhlY3V0ZSgnc2VsZWN0ICogZnJvbSBzdG9ja3Mgb3JkZXIgYnkgcHJpY2UnKQorPj4+IGZvciByb3cgaW4gYzoKKy4uLiAgICBwcmludCByb3cKKy4uLgorKHUnMjAwNi0wMS0wNScsIHUnQlVZJywgdSdSSEFUJywgMTAwLCAzNS4xNDAwMDAwMDAwMDAwMDEpCisodScyMDA2LTAzLTI4JywgdSdCVVknLCB1J0lCTScsIDEwMDAsIDQ1LjApCisodScyMDA2LTA0LTA2JywgdSdTRUxMJywgdSdJQk0nLCA1MDAsIDUzLjApCisodScyMDA2LTA0LTA1JywgdSdCVVknLCB1J01TT0ZUJywgMTAwMCwgNzIuMCkKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFNRTCBkaWFsZWN0IHN1cHBvcnRlZCBieSBTUUxpdGUsIHNlZSAKK1x1cmx7aHR0cDovL3d3dy5zcWxpdGUub3JnfS4KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWV1cmx7aHR0cDovL3d3dy5weXNxbGl0ZS5vcmd9Cit7VGhlIHB5c3FsaXRlIHdlYiBwYWdlLn0KKworXHNlZXVybHtodHRwOi8vd3d3LnNxbGl0ZS5vcmd9Cit7VGhlIFNRTGl0ZSB3ZWIgcGFnZTsgdGhlIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIHRoZSBzeW50YXggYW5kIHRoZQorYXZhaWxhYmxlIGRhdGEgdHlwZXMgZm9yIHRoZSBzdXBwb3J0ZWQgU1FMIGRpYWxlY3QufQorCitcc2VlcGVwezI0OX17RGF0YWJhc2UgQVBJIFNwZWNpZmljYXRpb24gMi4wfXtQRVAgd3JpdHRlbiBieQorTWFyYy1BbmRyXCdlIExlbWJ1cmcufQorCitcZW5ke3NlZWFsc299CiAKIAogJSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02NTksMTEgKzE4MjEsMzIgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKLVxpdGVtIFRoZSBkZXNpZ24gb2YgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGhhcyBjaGFuZ2VkIGEgZ3JlYXQgZGVhbCwgbm8KLWxvbmdlciBnZW5lcmF0aW5nIGJ5dGVjb2RlIGJ5IHRyYXZlcnNpbmcgdGhlIHBhcnNlIHRyZWUuICBJbnN0ZWFkCitcaXRlbSBUaGUgbGFyZ2VzdCBjaGFuZ2UgdG8gdGhlIEMgQVBJIGNhbWUgZnJvbSBccGVwezM1M30sCit3aGljaCBtb2RpZmllcyB0aGUgaW50ZXJwcmV0ZXIgdG8gdXNlIGEgXGN0eXBle1B5X3NzaXplX3R9IHR5cGUKK2RlZmluaXRpb24gaW5zdGVhZCBvZiBcY3R5cGV7aW50fS4gIFNlZSB0aGUgZWFybGllcgorc2VjdGlvbn5ccmVme3NlY3Rpb24tMzUzfSBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgY2hhbmdlLgorCitcaXRlbSBUaGUgZGVzaWduIG9mIHRoZSBieXRlY29kZSBjb21waWxlciBoYXMgY2hhbmdlZCBhIGdyZWF0IGRlYWwsIHRvCitubyBsb25nZXIgZ2VuZXJhdGUgYnl0ZWNvZGUgYnkgdHJhdmVyc2luZyB0aGUgcGFyc2UgdHJlZS4gIEluc3RlYWQKIHRoZSBwYXJzZSB0cmVlIGlzIGNvbnZlcnRlZCB0byBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSAob3IgQVNUKSwgYW5kIGl0IGlzIAogdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIHRoYXQncyB0cmF2ZXJzZWQgdG8gcHJvZHVjZSB0aGUgYnl0ZWNvZGUuCiAKK0l0J3MgcG9zc2libGUgZm9yIFB5dGhvbiBjb2RlIHRvIG9idGFpbiBBU1Qgb2JqZWN0cyBieSB1c2luZyB0aGUgCitcZnVuY3Rpb257Y29tcGlsZSgpfSBidWlsdC1pbiBhbmQgc3BlY2lmeWluZyBcY29kZXtfYXN0LlB5Q0ZfT05MWV9BU1R9CithcyB0aGUgdmFsdWUgb2YgdGhlIAorXHZhcntmbGFnc30gcGFyYW1ldGVyOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIF9hc3QgaW1wb3J0IFB5Q0ZfT05MWV9BU1QKK2FzdCA9IGNvbXBpbGUoIiIiYT0wCitmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgYSArPSBpCisiIiIsICI8c3RyaW5nPiIsICdleGVjJywgUHlDRl9PTkxZX0FTVCkKKworYXNzaWdubWVudCA9IGFzdC5ib2R5WzBdCitmb3JfbG9vcCA9IGFzdC5ib2R5WzFdCitcZW5ke3ZlcmJhdGltfQorCiBObyBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIHRoZSBBU1QgY29kZSB5ZXQuICBUbyBzdGFydAogbGVhcm5pbmcgYWJvdXQgaXQsIHJlYWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZhcmlvdXMgQVNUIG5vZGVzIGluCiBcZmlsZXtQYXJzZXIvUHl0aG9uLmFzZGx9LiAgQSBQeXRob24gc2NyaXB0IHJlYWRzIHRoaXMgZmlsZSBhbmQKQEAgLTY4OSw2ICsxODcyLDE4IEBACiBuZXcgc2V0LCBcY2Z1bmN0aW9ue1B5U2V0X0FkZCgpfSBhbmQgXGNmdW5jdGlvbntQeVNldF9EaXNjYXJkKCl9IHRvCiBhZGQgYW5kIHJlbW92ZSBlbGVtZW50cywgYW5kIFxjZnVuY3Rpb257UHlTZXRfQ29udGFpbnN9IGFuZAogXGNmdW5jdGlvbntQeVNldF9TaXplfSB0byBleGFtaW5lIHRoZSBzZXQncyBzdGF0ZS4KKyhDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCisKK1xpdGVtIEMgY29kZSBjYW4gbm93IG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhhY3QgcmV2aXNpb24KK29mIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgYnkgY2FsbGluZyB0aGUgCitcY2Z1bmN0aW9ue1B5X0dldEJ1aWxkSW5mbygpfSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSAKK3N0cmluZyBvZiBidWlsZCBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CitcY29kZXsidHJ1bms6NDUzNTU6NDUzNTZNLCBBcHIgMTMgMjAwNiwgMDc6NDI6MTkifS4gIAorKENvbnRyaWJ1dGVkIGJ5IEJhcnJ5IFdhcnNhdy4pCisKK1xpdGVtIFRoZSBDUHl0aG9uIGludGVycHJldGVyIGlzIHN0aWxsIHdyaXR0ZW4gaW4gQywgYnV0IAordGhlIGNvZGUgY2FuIG5vdyBiZSBjb21waWxlZCB3aXRoIGEge1xDcHB9IGNvbXBpbGVyIHdpdGhvdXQgZXJyb3JzLiAgCisoSW1wbGVtZW50ZWQgYnkgQW50aG9ueSBCYXh0ZXIsIE1hcnRpbiB2b25+TFwib3dpcywgU2tpcCBNb250YW5hcm8uKQogCiBcaXRlbSBUaGUgXGNmdW5jdGlvbntQeVJhbmdlX05ldygpfSBmdW5jdGlvbiB3YXMgcmVtb3ZlZC4gIEl0IHdhcwogbmV2ZXIgZG9jdW1lbnRlZCwgbmV2ZXIgdXNlZCBpbiB0aGUgY29yZSBjb2RlLCBhbmQgaGFkIGRhbmdlcm91c2x5IGxheApAQCAtNzAwLDcgKzE4OTUsMTcgQEAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc3Vic2VjdGlvbntQb3J0LVNwZWNpZmljIENoYW5nZXN9CiAKLVBsYXRmb3JtLXNwZWNpZmljIGNoYW5nZXMgZ28gaGVyZS4KK1xiZWdpbntpdGVtaXplfQorCitcaXRlbSBNYWNPUyBYICgxMC4zIGFuZCBoaWdoZXIpOiBkeW5hbWljIGxvYWRpbmcgb2YgbW9kdWxlcworbm93IHVzZXMgdGhlIFxjZnVuY3Rpb257ZGxvcGVuKCl9IGZ1bmN0aW9uIGluc3RlYWQgb2YgTWFjT1Mtc3BlY2lmaWMKK2Z1bmN0aW9ucy4KKworXGl0ZW0gV2luZG93czogXGZpbGV7LmRsbH0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBhcyBhIGZpbGVuYW1lIGV4dGVuc2lvbiBmb3IgCitleHRlbnNpb24gbW9kdWxlcy4gIFxmaWxley5weWR9IGlzIG5vdyB0aGUgb25seSBmaWxlbmFtZSBleHRlbnNpb24gdGhhdCB3aWxsCitiZSBzZWFyY2hlZCBmb3IuCisKK1xlbmR7aXRlbWl6ZX0KIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzE1LDcgKzE5MjAsMzggQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKLVxpdGVtIERldGFpbHMgZ28gaGVyZS4KK1xpdGVtIEV2YW4gSm9uZXMncyBwYXRjaCB0byBvYm1hbGxvYywgZmlyc3QgZGVzY3JpYmVkIGluIGEgdGFsaworYXQgUHlDb24gREMgMjAwNSwgd2FzIGFwcGxpZWQuICBQeXRob24gMi40IGFsbG9jYXRlZCBzbWFsbCBvYmplY3RzIGluCisyNTZLLXNpemVkIGFyZW5hcywgYnV0IG5ldmVyIGZyZWVkIGFyZW5hcy4gIFdpdGggdGhpcyBwYXRjaCwgUHl0aG9uCit3aWxsIGZyZWUgYXJlbmFzIHdoZW4gdGhleSdyZSBlbXB0eS4gIFRoZSBuZXQgZWZmZWN0IGlzIHRoYXQgb24gc29tZQorcGxhdGZvcm1zLCB3aGVuIHlvdSBhbGxvY2F0ZSBtYW55IG9iamVjdHMsIFB5dGhvbidzIG1lbW9yeSB1c2FnZSBtYXkKK2FjdHVhbGx5IGRyb3Agd2hlbiB5b3UgZGVsZXRlIHRoZW0sIGFuZCB0aGUgbWVtb3J5IG1heSBiZSByZXR1cm5lZCB0bwordGhlIG9wZXJhdGluZyBzeXN0ZW0uICAoSW1wbGVtZW50ZWQgYnkgRXZhbiBKb25lcywgYW5kIHJld29ya2VkIGJ5IFRpbQorUGV0ZXJzLikKKworTm90ZSB0aGF0IHRoaXMgY2hhbmdlIG1lYW5zIGV4dGVuc2lvbiBtb2R1bGVzIG5lZWQgdG8gYmUgbW9yZSBjYXJlZnVsCit3aXRoIGhvdyB0aGV5IGFsbG9jYXRlIG1lbW9yeS4gIFB5dGhvbidzIEFQSSBoYXMgbWFueSBkaWZmZXJlbnQKK2Z1bmN0aW9ucyBmb3IgYWxsb2NhdGluZyBtZW1vcnkgdGhhdCBhcmUgZ3JvdXBlZCBpbnRvIGZhbWlsaWVzLiAgRm9yCitleGFtcGxlLCBcY2Z1bmN0aW9ue1B5TWVtX01hbGxvYygpfSwgXGNmdW5jdGlvbntQeU1lbV9SZWFsbG9jKCl9LCBhbmQKK1xjZnVuY3Rpb257UHlNZW1fRnJlZSgpfSBhcmUgb25lIGZhbWlseSB0aGF0IGFsbG9jYXRlcyByYXcgbWVtb3J5LAord2hpbGUgXGNmdW5jdGlvbntQeU9iamVjdF9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfUmVhbGxvYygpfSwKK2FuZCBcY2Z1bmN0aW9ue1B5T2JqZWN0X0ZyZWUoKX0gYXJlIGFub3RoZXIgZmFtaWx5IHRoYXQncyBzdXBwb3NlZCB0bworYmUgdXNlZCBmb3IgY3JlYXRpbmcgUHl0aG9uIG9iamVjdHMuICAKKworUHJldmlvdXNseSB0aGVzZSBkaWZmZXJlbnQgZmFtaWxpZXMgYWxsIHJlZHVjZWQgdG8gdGhlIHBsYXRmb3JtJ3MKK1xjZnVuY3Rpb257bWFsbG9jKCl9IGFuZCBcY2Z1bmN0aW9ue2ZyZWUoKX0gZnVuY3Rpb25zLiAgVGhpcyBtZWFudCAKK2l0IGRpZG4ndCBtYXR0ZXIgaWYgeW91IGdvdCB0aGluZ3Mgd3JvbmcgYW5kIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCB0aGUKK1xjZnVuY3Rpb257UHlNZW19IGZ1bmN0aW9uIGJ1dCBmcmVlZCBpdCB3aXRoIHRoZSBcY2Z1bmN0aW9ue1B5T2JqZWN0fQorZnVuY3Rpb24uICBXaXRoIHRoZSBvYm1hbGxvYyBjaGFuZ2UsIHRoZXNlIGZhbWlsaWVzIG5vdyBkbyBkaWZmZXJlbnQKK3RoaW5ncywgYW5kIG1pc21hdGNoZXMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYSBzZWdmYXVsdC4gIFlvdSBzaG91bGQKK2NhcmVmdWxseSB0ZXN0IHlvdXIgQyBleHRlbnNpb24gbW9kdWxlcyB3aXRoIFB5dGhvbiAyLjUuCisKK1xpdGVtIENvdmVyaXR5LCBhIGNvbXBhbnkgdGhhdCBtYXJrZXRzIGEgc291cmNlIGNvZGUgYW5hbHlzaXMgdG9vbAorICBjYWxsZWQgUHJldmVudCwgcHJvdmlkZWQgdGhlIHJlc3VsdHMgb2YgdGhlaXIgZXhhbWluYXRpb24gb2YgdGhlIFB5dGhvbgorICBzb3VyY2UgY29kZS4gIFRoZSBhbmFseXNpcyBmb3VuZCBhYm91dCA2MCBidWdzIHRoYXQgCisgIHdlcmUgcXVpY2tseSBmaXhlZC4gIE1hbnkgb2YgdGhlIGJ1Z3Mgd2VyZSByZWZjb3VudGluZyBwcm9ibGVtcywgb2Z0ZW4KKyAgb2NjdXJyaW5nIGluIGVycm9yLWhhbmRsaW5nIGNvZGUuICBTZWUKKyAgXHVybHtodHRwOi8vc2Nhbi5jb3Zlcml0eS5jb219IGZvciB0aGUgc3RhdGlzdGljcy4KIAogXGVuZHtpdGVtaXplfQogCkBAIC03MjgsMjQgKzE5NjQsMzIgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKLVxpdGVtIFNvbWUgb2xkIGRlcHJlY2F0ZWQgbW9kdWxlcyAoXG1vZHVsZXtzdGF0Y2FjaGV9LCBcbW9kdWxle3R6cGFyc2V9LAotICAgICAgXG1vZHVsZXt3aHJhbmRvbX0pICBoYXZlIGJlZW4gbW92ZWQgdG8gXGZpbGV7TGliL2xpYi1vbGR9LgotWW91IGNhbiBnZXQgYWNjZXNzIHRvIHRoZXNlIG1vZHVsZXMgIGFnYWluIGJ5IGFkZGluZyB0aGUgZGlyZWN0b3J5IAotdG8geW91ciBcY29kZXtzeXMucGF0aH06CitcaXRlbSBBU0NJSSBpcyBub3cgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIG1vZHVsZXMuICBJdCdzIG5vdyAKK2Egc3ludGF4IGVycm9yIGlmIGEgbW9kdWxlIGNvbnRhaW5zIHN0cmluZyBsaXRlcmFscyB3aXRoIDgtYml0CitjaGFyYWN0ZXJzIGJ1dCBkb2Vzbid0IGhhdmUgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24uICBJbiBQeXRob24gMi40Cit0aGlzIHRyaWdnZXJlZCBhIHdhcm5pbmcsIG5vdCBhIHN5bnRheCBlcnJvci4KIAotXGJlZ2lue3ZlcmJhdGltfQotaW1wb3J0IG9zCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitcaXRlbSBUaGUgXG1vZHVsZXtwaWNrbGV9IG1vZHVsZSBubyBsb25nZXIgdXNlcyB0aGUgZGVwcmVjYXRlZCBcdmFye2Jpbn0gcGFyYW1ldGVyLgogCi1saWJfZGlyID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKHN0YW5kYXJkX2xpYj1UcnVlKQotb2xkX2RpciA9IG9zLnBhdGguam9pbihsaWJfZGlyLCAnbGliLW9sZCcpCi1zeXMucGF0aC5hcHBlbmQob2xkX2RpcikKLVxlbmR7dmVyYmF0aW19CitcaXRlbSBQcmV2aW91c2x5LCB0aGUgXG1lbWJlcntnaV9mcmFtZX0gYXR0cmlidXRlIG9mIGEgZ2VuZXJhdG9yCit3YXMgYWx3YXlzIGEgZnJhbWUgb2JqZWN0LiAgQmVjYXVzZSBvZiB0aGUgXHBlcHszNDJ9IGNoYW5nZXMKK2Rlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7c2VjdGlvbi1nZW5lcmF0b3JzfSwgaXQncyBub3cgcG9zc2libGUKK2ZvciBcbWVtYmVye2dpX2ZyYW1lfSB0byBiZSBcY29kZXtOb25lfS4KIAotRG9pbmcgc28gaXMgZGlzY291cmFnZWQsIGhvd2V2ZXI7IGl0J3MgYmV0dGVyIHRvIHVwZGF0ZSBhbnkgY29kZSB0aGF0Ci1zdGlsbCB1c2VzIHRoZXNlIG1vZHVsZXMuCitcaXRlbSBDIEFQSTogTWFueSBmdW5jdGlvbnMgbm93IHVzZSBcY3R5cGV7UHlfc3NpemVfdH0gCitpbnN0ZWFkIG9mIFxjdHlwZXtpbnR9IHRvIGFsbG93IHByb2Nlc3NpbmcgbW9yZSBkYXRhIAorb24gNjQtYml0IG1hY2hpbmVzLiAgRXh0ZW5zaW9uIGNvZGUgbWF5IG5lZWQgdG8gbWFrZSAKK3RoZSBzYW1lIGNoYW5nZSB0byBhdm9pZCB3YXJuaW5ncyBhbmQgdG8gc3VwcG9ydCA2NC1iaXQgbWFjaGluZXMuCitTZWUgdGhlIGVhcmxpZXIKK3NlY3Rpb25+XHJlZntzZWN0aW9uLTM1M30gZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGlzIGNoYW5nZS4KIAotJSB0aGUgcGlja2xlIG1vZHVsZSBubyBsb25nZXIgdXNlcyB0aGUgZGVwcmVjYXRlZCBiaW4gcGFyYW1ldGVyLgorXGl0ZW0gQyBBUEk6IAorVGhlIG9ibWFsbG9jIGNoYW5nZXMgbWVhbiB0aGF0IAoreW91IG11c3QgYmUgY2FyZWZ1bCB0byBub3QgbWl4IHVzYWdlIAorb2YgdGhlIFxjZnVuY3Rpb257UHlNZW1fKigpfSBhbmQgXGNmdW5jdGlvbntQeU9iamVjdF8qKCl9CitmYW1pbGllcyBvZiBmdW5jdGlvbnMuIE1lbW9yeSBhbGxvY2F0ZWQgd2l0aCAKK29uZSBmYW1pbHkncyBcY2Z1bmN0aW9ueypfTWFsbG9jKCl9IG11c3QgYmUgCitmcmVlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGZhbWlseSdzIFxjZnVuY3Rpb257Kl9GcmVlKCl9IGZ1bmN0aW9uLgogCiBcZW5ke2l0ZW1pemV9CiAKQEAgLTc1NSw2ICsxOTk5LDcgQEAKIAogVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgcGVvcGxlIGZvciBvZmZlcmluZwogc3VnZ2VzdGlvbnMsIGNvcnJlY3Rpb25zIGFuZCBhc3Npc3RhbmNlIHdpdGggdmFyaW91cyBkcmFmdHMgb2YgdGhpcwotYXJ0aWNsZTogLgorYXJ0aWNsZTogUGhpbGxpcCBKLiBFYnksIEtlbnQgSm9obnNvbiwgTWFydGluIHZvbn5MXCJvd2lzLCBHdXN0YXZvCitOaWVtZXllciwgTWlrZSBSb3ZuZXIsIFRob21hcyBXb3V0ZXJzLgogCiBcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvR3JhbW1hci9HcmFtbWFyIGIvR3JhbW1hci9HcmFtbWFyCmluZGV4IDMzYzM3ZDIuLmE2MTNkZTYgMTAwNjQ0Ci0tLSBhL0dyYW1tYXIvR3JhbW1hcgorKysgYi9HcmFtbWFyL0dyYW1tYXIKQEAgLTcsNiArNyw5IEBACiAjICAgICAgICB3aXRoIHNvbWVvbmUgd2hvIGNhbjsgYXNrIGFyb3VuZCBvbiBweXRob24tZGV2IGZvciBoZWxwLiAgRnJlZAogIyAgICAgICAgRHJha2UgPGZkcmFrZUBhY20ub3JnPiB3aWxsIHByb2JhYmx5IGJlIGxpc3RlbmluZyB0aGVyZS4KIAorIyBOT1RFIFdFTEw6IFlvdSBzaG91bGQgYWxzbyBmb2xsb3cgYWxsIHRoZSBzdGVwcyBsaXN0ZWQgaW4gUEVQIDMwNiwKKyMgIkhvdyB0byBDaGFuZ2UgUHl0aG9uJ3MgR3JhbW1hciIKKwogIyBTdGFydCBzeW1ib2xzIGZvciB0aGUgZ3JhbW1hcjoKICMJc2luZ2xlX2lucHV0IGlzIGEgc2luZ2xlIGludGVyYWN0aXZlIHN0YXRlbWVudDsKICMJZmlsZV9pbnB1dCBpcyBhIG1vZHVsZSBvciBzZXF1ZW5jZSBvZiBjb21tYW5kcyByZWFkIGZyb20gYW4gaW5wdXQgZmlsZTsKQEAgLTExOSwxMSArMTIyLDExIEBACiAKIGxpc3RfaXRlcjogbGlzdF9mb3IgfCBsaXN0X2lmCiBsaXN0X2ZvcjogJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0bGlzdF9zYWZlIFtsaXN0X2l0ZXJdCi1saXN0X2lmOiAnaWYnIHRlc3QgW2xpc3RfaXRlcl0KK2xpc3RfaWY6ICdpZicgb2xkX3Rlc3QgW2xpc3RfaXRlcl0KIAogZ2VuX2l0ZXI6IGdlbl9mb3IgfCBnZW5faWYKIGdlbl9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgb3JfdGVzdCBbZ2VuX2l0ZXJdCi1nZW5faWY6ICdpZicgdGVzdCBbZ2VuX2l0ZXJdCitnZW5faWY6ICdpZicgb2xkX3Rlc3QgW2dlbl9pdGVyXQogCiB0ZXN0bGlzdDE6IHRlc3QgKCcsJyB0ZXN0KSoKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCBiM2JjMDYzLi4zZTIxMDMwIDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtMzUsOSArMzUsMTAgQEAKIHR5cGVkZWYgc3RydWN0IF9hbGlhcyAqYWxpYXNfdHk7CiAKIAorZW51bSBfbW9kX2tpbmQge01vZHVsZV9raW5kPTEsIEludGVyYWN0aXZlX2tpbmQ9MiwgRXhwcmVzc2lvbl9raW5kPTMsCisgICAgICAgICAgICAgICAgIFN1aXRlX2tpbmQ9NH07CiBzdHJ1Y3QgX21vZCB7Ci0gICAgICAgIGVudW0geyBNb2R1bGVfa2luZD0xLCBJbnRlcmFjdGl2ZV9raW5kPTIsIEV4cHJlc3Npb25fa2luZD0zLAotICAgICAgICAgICAgICAgU3VpdGVfa2luZD00IH0ga2luZDsKKyAgICAgICAgZW51bSBfbW9kX2tpbmQga2luZDsKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKQEAgLTU4LDE0ICs1OSwxNSBAQAogICAgICAgICB9IHY7CiB9OwogCitlbnVtIF9zdG10X2tpbmQge0Z1bmN0aW9uRGVmX2tpbmQ9MSwgQ2xhc3NEZWZfa2luZD0yLCBSZXR1cm5fa2luZD0zLAorICAgICAgICAgICAgICAgICAgRGVsZXRlX2tpbmQ9NCwgQXNzaWduX2tpbmQ9NSwgQXVnQXNzaWduX2tpbmQ9NiwgUHJpbnRfa2luZD03LAorICAgICAgICAgICAgICAgICAgRm9yX2tpbmQ9OCwgV2hpbGVfa2luZD05LCBJZl9raW5kPTEwLCBXaXRoX2tpbmQ9MTEsCisgICAgICAgICAgICAgICAgICBSYWlzZV9raW5kPTEyLCBUcnlFeGNlcHRfa2luZD0xMywgVHJ5RmluYWxseV9raW5kPTE0LAorICAgICAgICAgICAgICAgICAgQXNzZXJ0X2tpbmQ9MTUsIEltcG9ydF9raW5kPTE2LCBJbXBvcnRGcm9tX2tpbmQ9MTcsCisgICAgICAgICAgICAgICAgICBFeGVjX2tpbmQ9MTgsIEdsb2JhbF9raW5kPTE5LCBFeHByX2tpbmQ9MjAsIFBhc3Nfa2luZD0yMSwKKyAgICAgICAgICAgICAgICAgIEJyZWFrX2tpbmQ9MjIsIENvbnRpbnVlX2tpbmQ9MjN9Owogc3RydWN0IF9zdG10IHsKLSAgICAgICAgZW51bSB7IEZ1bmN0aW9uRGVmX2tpbmQ9MSwgQ2xhc3NEZWZfa2luZD0yLCBSZXR1cm5fa2luZD0zLAotICAgICAgICAgICAgICAgRGVsZXRlX2tpbmQ9NCwgQXNzaWduX2tpbmQ9NSwgQXVnQXNzaWduX2tpbmQ9NiwgUHJpbnRfa2luZD03LAotICAgICAgICAgICAgICAgRm9yX2tpbmQ9OCwgV2hpbGVfa2luZD05LCBJZl9raW5kPTEwLCBXaXRoX2tpbmQ9MTEsCi0gICAgICAgICAgICAgICBSYWlzZV9raW5kPTEyLCBUcnlFeGNlcHRfa2luZD0xMywgVHJ5RmluYWxseV9raW5kPTE0LAotICAgICAgICAgICAgICAgQXNzZXJ0X2tpbmQ9MTUsIEltcG9ydF9raW5kPTE2LCBJbXBvcnRGcm9tX2tpbmQ9MTcsCi0gICAgICAgICAgICAgICBFeGVjX2tpbmQ9MTgsIEdsb2JhbF9raW5kPTE5LCBFeHByX2tpbmQ9MjAsIFBhc3Nfa2luZD0yMSwKLSAgICAgICAgICAgICAgIEJyZWFrX2tpbmQ9MjIsIENvbnRpbnVlX2tpbmQ9MjMgfSBraW5kOworICAgICAgICBlbnVtIF9zdG10X2tpbmQga2luZDsKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG5hbWU7CkBAIC0xODEsMTIgKzE4MywxNCBAQAogICAgICAgICBpbnQgY29sX29mZnNldDsKIH07CiAKK2VudW0gX2V4cHJfa2luZCB7Qm9vbE9wX2tpbmQ9MSwgQmluT3Bfa2luZD0yLCBVbmFyeU9wX2tpbmQ9MywgTGFtYmRhX2tpbmQ9NCwKKyAgICAgICAgICAgICAgICAgIElmRXhwX2tpbmQ9NSwgRGljdF9raW5kPTYsIExpc3RDb21wX2tpbmQ9NywKKyAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckV4cF9raW5kPTgsIFlpZWxkX2tpbmQ9OSwgQ29tcGFyZV9raW5kPTEwLAorICAgICAgICAgICAgICAgICAgQ2FsbF9raW5kPTExLCBSZXByX2tpbmQ9MTIsIE51bV9raW5kPTEzLCBTdHJfa2luZD0xNCwKKyAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZV9raW5kPTE1LCBTdWJzY3JpcHRfa2luZD0xNiwgTmFtZV9raW5kPTE3LAorICAgICAgICAgICAgICAgICAgTGlzdF9raW5kPTE4LCBUdXBsZV9raW5kPTE5fTsKIHN0cnVjdCBfZXhwciB7Ci0gICAgICAgIGVudW0geyBCb29sT3Bfa2luZD0xLCBCaW5PcF9raW5kPTIsIFVuYXJ5T3Bfa2luZD0zLCBMYW1iZGFfa2luZD00LAotICAgICAgICAgICAgICAgSWZFeHBfa2luZD01LCBEaWN0X2tpbmQ9NiwgTGlzdENvbXBfa2luZD03LCBHZW5lcmF0b3JFeHBfa2luZD04LAotICAgICAgICAgICAgICAgWWllbGRfa2luZD05LCBDb21wYXJlX2tpbmQ9MTAsIENhbGxfa2luZD0xMSwgUmVwcl9raW5kPTEyLAotICAgICAgICAgICAgICAgTnVtX2tpbmQ9MTMsIFN0cl9raW5kPTE0LCBBdHRyaWJ1dGVfa2luZD0xNSwgU3Vic2NyaXB0X2tpbmQ9MTYsCi0gICAgICAgICAgICAgICBOYW1lX2tpbmQ9MTcsIExpc3Rfa2luZD0xOCwgVHVwbGVfa2luZD0xOSB9IGtpbmQ7CisgICAgICAgIGVudW0gX2V4cHJfa2luZCBraW5kOwogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xvcF90eSBvcDsKQEAgLTIzNiw3ICsyNDAsNyBAQAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqb3BzOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9pbnRfc2VxICpvcHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqY29tcGFyYXRvcnM7CiAgICAgICAgICAgICAgICAgfSBDb21wYXJlOwogICAgICAgICAgICAgICAgIApAQCAtMjkyLDkgKzI5Niw5IEBACiAgICAgICAgIGludCBjb2xfb2Zmc2V0OwogfTsKIAorZW51bSBfc2xpY2Vfa2luZCB7RWxsaXBzaXNfa2luZD0xLCBTbGljZV9raW5kPTIsIEV4dFNsaWNlX2tpbmQ9MywgSW5kZXhfa2luZD00fTsKIHN0cnVjdCBfc2xpY2UgewotICAgICAgICBlbnVtIHsgRWxsaXBzaXNfa2luZD0xLCBTbGljZV9raW5kPTIsIEV4dFNsaWNlX2tpbmQ9MywgSW5kZXhfa2luZD00IH0KLSAgICAgICAgICAgICAgIGtpbmQ7CisgICAgICAgIGVudW0gX3NsaWNlX2tpbmQga2luZDsKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGxvd2VyOwpAQCAtMzIzLDYgKzMyNyw4IEBACiAgICAgICAgIGV4cHJfdHkgdHlwZTsKICAgICAgICAgZXhwcl90eSBuYW1lOwogICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgaW50IGxpbmVubzsKKyAgICAgICAgaW50IGNvbF9vZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgX2FyZ3VtZW50cyB7CkBAIC00MDMsNyArNDA5LDcgQEAKIGV4cHJfdHkgR2VuZXJhdG9yRXhwKGV4cHJfdHkgZWx0LCBhc2RsX3NlcSAqIGdlbmVyYXRvcnMsIGludCBsaW5lbm8sIGludAogICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogZXhwcl90eSBZaWVsZChleHByX3R5IHZhbHVlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwotZXhwcl90eSBDb21wYXJlKGV4cHJfdHkgbGVmdCwgYXNkbF9zZXEgKiBvcHMsIGFzZGxfc2VxICogY29tcGFyYXRvcnMsIGludAorZXhwcl90eSBDb21wYXJlKGV4cHJfdHkgbGVmdCwgYXNkbF9pbnRfc2VxICogb3BzLCBhc2RsX3NlcSAqIGNvbXBhcmF0b3JzLCBpbnQKICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CiBleHByX3R5IENhbGwoZXhwcl90eSBmdW5jLCBhc2RsX3NlcSAqIGFyZ3MsIGFzZGxfc2VxICoga2V5d29yZHMsIGV4cHJfdHkKICAgICAgICAgICAgICBzdGFyYXJncywgZXhwcl90eSBrd2FyZ3MsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCkBAIC00MjcsOCArNDMzLDggQEAKIHNsaWNlX3R5IEluZGV4KGV4cHJfdHkgdmFsdWUsIFB5QXJlbmEgKmFyZW5hKTsKIGNvbXByZWhlbnNpb25fdHkgY29tcHJlaGVuc2lvbihleHByX3R5IHRhcmdldCwgZXhwcl90eSBpdGVyLCBhc2RsX3NlcSAqIGlmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7Ci1leGNlcHRoYW5kbGVyX3R5IGV4Y2VwdGhhbmRsZXIoZXhwcl90eSB0eXBlLCBleHByX3R5IG5hbWUsIGFzZGxfc2VxICogYm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7CitleGNlcHRoYW5kbGVyX3R5IGV4Y2VwdGhhbmRsZXIoZXhwcl90eSB0eXBlLCBleHByX3R5IG5hbWUsIGFzZGxfc2VxICogYm9keSwgaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogYXJndW1lbnRzX3R5IGFyZ3VtZW50cyhhc2RsX3NlcSAqIGFyZ3MsIGlkZW50aWZpZXIgdmFyYXJnLCBpZGVudGlmaWVyIGt3YXJnLAogICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqIGRlZmF1bHRzLCBQeUFyZW5hICphcmVuYSk7CiBrZXl3b3JkX3R5IGtleXdvcmQoaWRlbnRpZmllciBhcmcsIGV4cHJfdHkgdmFsdWUsIFB5QXJlbmEgKmFyZW5hKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYWJzdHJhY3QuaCBiL0luY2x1ZGUvYWJzdHJhY3QuaAppbmRleCBiNzZmMjU3Li5kNGJkNTg4IDEwMDY0NAotLS0gYS9JbmNsdWRlL2Fic3RyYWN0LmgKKysrIGIvSW5jbHVkZS9hYnN0cmFjdC5oCkBAIC00LDYgKzQsMTEgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNpZmRlZiBQWV9TU0laRV9UX0NMRUFOCisjZGVmaW5lIFB5T2JqZWN0X0NhbGxGdW5jdGlvbiBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUCisjZGVmaW5lIFB5T2JqZWN0X0NhbGxNZXRob2QgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQKKyNlbmRpZgorCiAvKiBBYnN0cmFjdCBPYmplY3QgSW50ZXJmYWNlIChtYW55IHRoYW5rcyB0byBKaW0gRnVsdG9uKSAqLwogCiAvKgpAQCAtMzM3LDYgKzM0MiwxMSBAQAogCSBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCiAgICAgICAgKi8KIAorICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLAorCQkJCQkJCSBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQoUHlPYmplY3QgKm8sCisJCQkJCQkgICAgICAgY2hhciAqbmFtZSwKKwkJCQkJCSAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL2FzZGwuaCBiL0luY2x1ZGUvYXNkbC5oCmluZGV4IGMxYzU2MDMuLjg0ZTgzN2UgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYXNkbC5oCisrKyBiL0luY2x1ZGUvYXNkbC5oCkBAIC01LDcgKzUsOSBAQAogdHlwZWRlZiBQeU9iamVjdCAqIHN0cmluZzsKIHR5cGVkZWYgUHlPYmplY3QgKiBvYmplY3Q7CiAKKyNpZm5kZWYgX19jcGx1c3BsdXMKIHR5cGVkZWYgZW51bSB7ZmFsc2UsIHRydWV9IGJvb2w7CisjZW5kaWYKIAogLyogSXQgd291bGQgYmUgbmljZSBpZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgYXNkbF9jLnB5IHdhcyBjb21wbGV0ZWx5CiAgICBpbmRlcGVuZGVudCBvZiBQeXRob24sIGJ1dCBpdCBpcyBhIGdvYWwgdGhlIHJlcXVpcmVzIHRvbyBtdWNoIHdvcmsKQEAgLTIwLDcgKzIyLDEzIEBACiAgICAgdm9pZCAqZWxlbWVudHNbMV07CiB9IGFzZGxfc2VxOwogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNpemU7CisgICAgaW50IGVsZW1lbnRzWzFdOworfSBhc2RsX2ludF9zZXE7CisKIGFzZGxfc2VxICphc2RsX3NlcV9uZXcoaW50IHNpemUsIFB5QXJlbmEgKmFyZW5hKTsKK2FzZGxfaW50X3NlcSAqYXNkbF9pbnRfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpOwogCiAjZGVmaW5lIGFzZGxfc2VxX0dFVChTLCBJKSAoUyktPmVsZW1lbnRzWyhJKV0KICNkZWZpbmUgYXNkbF9zZXFfTEVOKFMpICgoUykgPT0gTlVMTCA/IDAgOiAoUyktPnNpemUpCmRpZmYgLS1naXQgYS9JbmNsdWRlL2NvZGUuaCBiL0luY2x1ZGUvY29kZS5oCmluZGV4IGE0NTA5ZTMuLjIzZDllMTcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvY29kZS5oCisrKyBiL0luY2x1ZGUvY29kZS5oCkBAIC00NCw3ICs0NCw3IEBACiAvKiBUaGVzZSBhcmUgbm8gbG9uZ2VyIHVzZWQuICovCiAjZGVmaW5lIENPX0dFTkVSQVRPUl9BTExPV0VEICAgIDB4MTAwMAogI2RlZmluZSBDT19GVVRVUkVfRElWSVNJT04gICAgCTB4MjAwMAotI2RlZmluZSBDT19GVVRVUkVfQUJTSU1QT1JUCTB4NDAwMCAvKiBhYnNvbHV0ZSBpbXBvcnQgYnkgZGVmYXVsdCAqLworI2RlZmluZSBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUIDB4NDAwMCAvKiBkbyBhYnNvbHV0ZSBpbXBvcnRzIGJ5IGRlZmF1bHQgKi8KICNkZWZpbmUgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UICAweDgwMDAKICNlbmRpZgogCkBAIC03Miw2ICs3MiwyMSBAQAogCSgoKihjbyktPmNvX2NvZGUtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0cmVhZGJ1ZmZlcikgXAogCSAoKGNvKS0+Y29fY29kZSwgMCwgKHZvaWQgKiopKHBwKSkpCiAKK3R5cGVkZWYgc3RydWN0IF9hZGRyX3BhaXIgeworICAgICAgICBpbnQgYXBfbG93ZXI7CisgICAgICAgIGludCBhcF91cHBlcjsKK30gUHlBZGRyUGFpcjsKKworLyogQ2hlY2sgd2hldGhlciBsYXN0aSAoYW4gaW5zdHJ1Y3Rpb24gb2Zmc2V0KSBmYWxscyBvdXRzaWRlIGJvdW5kcworICAgYW5kIHdoZXRoZXIgaXQgaXMgYSBsaW5lIG51bWJlciB0aGF0IHNob3VsZCBiZSB0cmFjZWQuICBSZXR1cm5zCisgICBhIGxpbmUgbnVtYmVyIGlmIGl0IHNob3VsZCBiZSB0cmFjZWQgb3IgLTEgaWYgdGhlIGxpbmUgc2hvdWxkIG5vdC4KKworICAgSWYgbGFzdGkgaXMgbm90IHdpdGhpbiBib3VuZHMsIHVwZGF0ZXMgYm91bmRzLgorKi8KKworUHlBUElfRlVOQyhpbnQpIFB5Q29kZV9DaGVja0xpbmVOdW1iZXIoUHlDb2RlT2JqZWN0KiBjbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0aSwgUHlBZGRyUGFpciAqYm91bmRzKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY29tcGlsZS5oIGIvSW5jbHVkZS9jb21waWxlLmgKaW5kZXggNGFjNjk4Mi4uMmJkZTZmYiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9jb21waWxlLmgKKysrIGIvSW5jbHVkZS9jb21waWxlLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgRlVUVVJFX05FU1RFRF9TQ09QRVMgIm5lc3RlZF9zY29wZXMiCiAjZGVmaW5lIEZVVFVSRV9HRU5FUkFUT1JTICJnZW5lcmF0b3JzIgogI2RlZmluZSBGVVRVUkVfRElWSVNJT04gImRpdmlzaW9uIgotI2RlZmluZSBGVVRVUkVfQUJTSU1QT1JUICJhYnNvbHV0ZV9pbXBvcnQiCisjZGVmaW5lIEZVVFVSRV9BQlNPTFVURV9JTVBPUlQgImFic29sdXRlX2ltcG9ydCIKICNkZWZpbmUgRlVUVVJFX1dJVEhfU1RBVEVNRU5UICJ3aXRoX3N0YXRlbWVudCIKIAogc3RydWN0IF9tb2Q7IC8qIERlY2xhcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHR5cGUgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvZ2Vub2JqZWN0LmggYi9JbmNsdWRlL2dlbm9iamVjdC5oCmluZGV4IGY0MjI2ZWQuLmNhODQ0MzIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZ2Vub2JqZWN0LmgKKysrIGIvSW5jbHVkZS9nZW5vYmplY3QuaApAQCAtMTMsNiArMTMsNyBAQAogCVB5T2JqZWN0X0hFQUQKIAkvKiBUaGUgZ2lfIHByZWZpeCBpcyBpbnRlbmRlZCB0byByZW1pbmQgb2YgZ2VuZXJhdG9yLWl0ZXJhdG9yLiAqLwogCisJLyogTm90ZTogZ2lfZnJhbWUgY2FuIGJlIE5VTEwgaWYgdGhlIGdlbmVyYXRvciBpcyAiZmluaXNoZWQiICovCiAJc3RydWN0IF9mcmFtZSAqZ2lfZnJhbWU7CiAKIAkvKiBUcnVlIGlmIGdlbmVyYXRvciBpcyBiZWluZyBleGVjdXRlZC4gKi8KQEAgLTI4LDYgKzI5LDcgQEAKICNkZWZpbmUgUHlHZW5fQ2hlY2tFeGFjdChvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5R2VuX1R5cGUpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlHZW5fTmV3KHN0cnVjdCBfZnJhbWUgKik7CitQeUFQSV9GVU5DKGludCkgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKFB5R2VuT2JqZWN0ICopOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvbW9kc3VwcG9ydC5oIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKaW5kZXggYzM1NmYwMy4uMjNkNWQzYSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9tb2RzdXBwb3J0LmgKKysrIGIvSW5jbHVkZS9tb2RzdXBwb3J0LmgKQEAgLTE3LDggKzE3LDEwIEBACiAjZGVmaW5lIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcwlfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCiAjZGVmaW5lIFB5QXJnX1ZhUGFyc2UJCQlfUHlBcmdfVmFQYXJzZV9TaXplVAogI2RlZmluZSBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcwlfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKLSNkZWZpbmUgUHlBcmdfQnVpbGRWYWx1ZQkJX1B5QXJnX0J1aWxkVmFsdWVfU2l6ZVQKLSNkZWZpbmUgUHlBcmdfVmFCdWlsZFZhbHVlCQlfUHlBcmdfVmFCdWlsZFZhbHVlX1NpemVUCisjZGVmaW5lIFB5X0J1aWxkVmFsdWUJCQlfUHlfQnVpbGRWYWx1ZV9TaXplVAorI2RlZmluZSBQeV9WYUJ1aWxkVmFsdWUJCQlfUHlfVmFCdWlsZFZhbHVlX1NpemVUCisjZWxzZQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiAjZW5kaWYKIAogUHlBUElfRlVOQyhpbnQpIFB5QXJnX1BhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKQEAgLTI3LDYgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCAuLi4pOwogUHlBUElfRlVOQyhpbnQpIFB5QXJnX1VucGFja1R1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgLi4uKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfQnVpbGRWYWx1ZShjb25zdCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKiwgLi4uKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfTm9LZXl3b3Jkcyhjb25zdCBjaGFyICpmdW5jbmFtZSwgUHlPYmplY3QgKmt3KTsKIAogUHlBUElfRlVOQyhpbnQpIFB5QXJnX1ZhUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IDkxOTgwMDcuLmNkYmRkZmUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtMzI3LDYgKzMyNyw3IEBACiAJUHlfc3NpemVfdCB0cF9hbGxvY3M7CiAJUHlfc3NpemVfdCB0cF9mcmVlczsKIAlQeV9zc2l6ZV90IHRwX21heGFsbG9jOworCXN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKIAlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CiAjZW5kaWYKIH0gUHlUeXBlT2JqZWN0OwpAQCAtNTY2LDYgKzU2Nyw5IEBACiBQeUFQSV9EQVRBKFB5X3NzaXplX3QpIF9QeV9SZWZUb3RhbDsKIFB5QVBJX0ZVTkModm9pZCkgX1B5X05lZ2F0aXZlUmVmY291bnQoY29uc3QgY2hhciAqZm5hbWUsCiAJCQkJCSAgICBpbnQgbGluZW5vLCBQeU9iamVjdCAqb3ApOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlEaWN0X0R1bW15KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlTZXRfRHVtbXkodm9pZCk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeV9HZXRSZWZUb3RhbCh2b2lkKTsKICNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTAlfUHlfUmVmVG90YWwrKwogI2RlZmluZSBfUHlfREVDX1JFRlRPVEFMCV9QeV9SZWZUb3RhbC0tCiAjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEJLApAQCAtNTgzLDggKzU4Nyw5IEBACiAKICNpZmRlZiBDT1VOVF9BTExPQ1MKIFB5QVBJX0ZVTkModm9pZCkgaW5jX2NvdW50KFB5VHlwZU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgZGVjX2NvdW50KFB5VHlwZU9iamVjdCAqKTsKICNkZWZpbmUgX1B5X0lOQ19UUEFMTE9DUyhPUCkJaW5jX2NvdW50KChPUCktPm9iX3R5cGUpCi0jZGVmaW5lIF9QeV9JTkNfVFBGUkVFUyhPUCkJKE9QKS0+b2JfdHlwZS0+dHBfZnJlZXMrKworI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApCWRlY19jb3VudCgoT1ApLT5vYl90eXBlKQogI2RlZmluZSBfUHlfREVDX1RQRlJFRVMoT1ApCShPUCktPm9iX3R5cGUtPnRwX2ZyZWVzLS0KICNkZWZpbmUgX1B5X0NPVU5UX0FMTE9DU19DT01NQQksCiAjZWxzZQpAQCAtNjMwLDYgKzYzNSw0MCBAQAogCWVsc2UJCQkJCQlcCiAJCV9QeV9EZWFsbG9jKChQeU9iamVjdCAqKShvcCkpCiAKKy8qIFNhZmVseSBkZWNyZWYgYG9wYCBhbmQgc2V0IGBvcGAgdG8gTlVMTCwgZXNwZWNpYWxseSB1c2VmdWwgaW4gdHBfY2xlYXIKKyAqIGFuZCB0cF9kZWFsbG9jIGltcGxlbWVudGF0b25zLgorICoKKyAqIE5vdGUgdGhhdCAidGhlIG9idmlvdXMiIGNvZGUgY2FuIGJlIGRlYWRseToKKyAqCisgKiAgICAgUHlfWERFQ1JFRihvcCk7CisgKiAgICAgb3AgPSBOVUxMOworICoKKyAqIFR5cGljYWxseSwgYG9wYCBpcyBzb21ldGhpbmcgbGlrZSBzZWxmLT5jb250YWluZWUsIGFuZCBgc2VsZmAgaXMgZG9uZQorICogdXNpbmcgaXRzIGBjb250YWluZWVgIG1lbWJlci4gIEluIHRoZSBjb2RlIHNlcXVlbmNlIGFib3ZlLCBzdXBwb3NlCisgKiBgY29udGFpbmVlYCBpcyBub24tTlVMTCB3aXRoIGEgcmVmY291bnQgb2YgMS4gIEl0cyByZWZjb3VudCBmYWxscyB0bworICogMCBvbiB0aGUgZmlyc3QgbGluZSwgd2hpY2ggY2FuIHRyaWdnZXIgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiBjb2RlLAorICogcG9zc2libHkgaW5jbHVkaW5nIGZpbmFsaXplcnMgKGxpa2UgX19kZWxfXyBtZXRob2RzIG9yIHdlYWtyZWYgY2FsbGJhY2tzKQorICogY29kZWQgaW4gUHl0aG9uLCB3aGljaCBpbiB0dXJuIGNhbiByZWxlYXNlIHRoZSBHSUwgYW5kIGFsbG93IG90aGVyIHRocmVhZHMKKyAqIHRvIHJ1biwgZXRjLiAgU3VjaCBjb2RlIG1heSBldmVuIGludm9rZSBtZXRob2RzIG9mIGBzZWxmYCBhZ2Fpbiwgb3IgY2F1c2UKKyAqIGN5Y2xpYyBnYyB0byB0cmlnZ2VyLCBidXQtLSBvb3BzISAtLXNlbGYtPmNvbnRhaW5lZSBzdGlsbCBwb2ludHMgdG8gdGhlCisgKiBvYmplY3QgYmVpbmcgdG9ybiBkb3duLCBhbmQgaXQgbWF5IGJlIGluIGFuIGluc2FuZSBzdGF0ZSB3aGlsZSBiZWluZyB0b3JuCisgKiBkb3duLiAgVGhpcyBoYXMgaW4gZmFjdCBiZWVuIGEgcmljaCBoaXN0b3JpYyBzb3VyY2Ugb2YgbWlzZXJhYmxlIChyYXJlICYKKyAqIGhhcmQtdG8tZGlhZ25vc2UpIHNlZ2ZhdWx0aW5nIChhbmQgb3RoZXIpIGJ1Z3MuCisgKgorICogVGhlIHNhZmUgd2F5IGlzOgorICoKKyAqICAgICAgUHlfQ0xFQVIob3ApOworICoKKyAqIFRoYXQgYXJyYW5nZXMgdG8gc2V0IGBvcGAgdG8gTlVMTCBfYmVmb3JlXyBkZWNyZWYnaW5nLCBzbyB0aGF0IGFueSBjb2RlCisgKiB0cmlnZ2VyZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBgb3BgIGdldHRpbmcgdG9ybiBkb3duIG5vIGxvbmdlciBiZWxpZXZlcworICogYG9wYCBwb2ludHMgdG8gYSB2YWxpZCBvYmplY3QuCisgKgorICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGl0J3Mgc2FmZSB0byB1c2UgdGhlIG5haXZlIGNvZGUsIGJ1dCB0aGV5J3JlIGJyaXR0bGUuCisgKiBGb3IgZXhhbXBsZSwgaWYgYG9wYCBwb2ludHMgdG8gYSBQeXRob24gaW50ZWdlciwgeW91IGtub3cgdGhhdCBkZXN0cm95aW5nCisgKiBvbmUgb2YgdGhvc2UgY2FuJ3QgY2F1c2UgcHJvYmxlbXMgLS0gYnV0IGluIHBhcnQgdGhhdCByZWxpZXMgb24gdGhhdAorICogUHl0aG9uIGludGVnZXJzIGFyZW4ndCBjdXJyZW50bHkgd2Vha2x5IHJlZmVyZW5jYWJsZS4gIEJlc3QgcHJhY3RpY2UgaXMKKyAqIHRvIHVzZSBQeV9DTEVBUigpIGV2ZW4gaWYgeW91IGNhbid0IHRoaW5rIG9mIGEgcmVhc29uIGZvciB3aHkgeW91IG5lZWQgdG8uCisgKi8KICNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCVwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAogICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCVwKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqaW1wbC5oIGIvSW5jbHVkZS9vYmppbXBsLmgKaW5kZXggN2M2ODE5NC4uMDNiNmE4ZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vYmppbXBsLmgKKysrIGIvSW5jbHVkZS9vYmppbXBsLmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAvKiBNYWNyb3MgKi8KICNpZmRlZiBXSVRIX1BZTUFMTE9DCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQWU1BTExPQ19ERUJVRwkvKiBXSVRIX1BZTUFMTE9DICYmIFBZTUFMTE9DX0RFQlVHICovCiBQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnTWFsbG9jKHNpemVfdCBuYnl0ZXMpOwogUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcyk7CiBQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0ZyZWUodm9pZCAqcCk7CkBAIC0xMjQsMTEgKzEyNCw3IEBACiAjZWxzZQkvKiAhIFdJVEhfUFlNQUxMT0MgKi8KICNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlQeU1lbV9NQUxMT0MKICNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlQeU1lbV9SRUFMTE9DCi0vKiBUaGlzIGlzIGFuIG9kZCBvbmUhICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBleHRlbnNpb25zLCB0aGUKLSAgIFB5TWVtICJyZWxlYXNlIG1lbW9yeSIgZnVuY3Rpb25zIGhhdmUgdG8gaW52b2tlIHRoZSBvYmplY3QgYWxsb2NhdG9yJ3MKLSAgIGZyZWUoKSBmdW5jdGlvbi4gIFdoZW4gcHltYWxsb2MgaXNuJ3QgZW5hYmxlZCwgdGhhdCBsZWF2ZXMgdXMgdXNpbmcKLSAgIHRoZSBwbGF0Zm9ybSBmcmVlKCkuICovCi0jZGVmaW5lIFB5T2JqZWN0X0ZSRUUJCWZyZWUKKyNkZWZpbmUgUHlPYmplY3RfRlJFRQkJUHlNZW1fRlJFRQogCiAjZW5kaWYJLyogV0lUSF9QWU1BTExPQyAqLwogCkBAIC0zMDcsMTMgKzMwMywxMyBAQAogICogInZpc2l0IiBhbmQgImFyZyIuICBUaGlzIGlzIGludGVuZGVkIHRvIGtlZXAgdHBfdHJhdmVyc2UgZnVuY3Rpb25zCiAgKiBsb29raW5nIGFzIG11Y2ggYWxpa2UgYXMgcG9zc2libGUuCiAgKi8KLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQlcCi0gICAgICAgIGRvIHsgCQkJCQkJXAotICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7CQlcCi0gICAgICAgICAgICAgICAgfQkJCQkJXAorI2RlZmluZSBQeV9WSVNJVChvcCkJCQkJCQkJXAorICAgICAgICBkbyB7IAkJCQkJCQkJXAorICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKFB5T2JqZWN0ICopKG9wKSwgYXJnKTsJXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZyZXQpCQkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OwkJCQlcCisgICAgICAgICAgICAgICAgfQkJCQkJCQlcCiAgICAgICAgIH0gd2hpbGUgKDApCiAKIC8qIFRoaXMgaXMgaGVyZSBmb3IgdGhlIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBFeHRlbnNpb25zIHRoYXQKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltZW0uaCBiL0luY2x1ZGUvcHltZW0uaAppbmRleCBmOGFlZjI5Li42NzFmOTY3IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bWVtLmgKKysrIGIvSW5jbHVkZS9weW1lbS5oCkBAIC01OSw2ICs1OSw3IEBACiAvKiBSZWRpcmVjdCBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgdG8gUHl0aG9uJ3MgZGVidWdnaW5nIGFsbG9jYXRvci4gKi8KICNkZWZpbmUgUHlNZW1fTUFMTE9DCQlQeU9iamVjdF9NQUxMT0MKICNkZWZpbmUgUHlNZW1fUkVBTExPQwkJUHlPYmplY3RfUkVBTExPQworI2RlZmluZSBQeU1lbV9GUkVFCQlQeU9iamVjdF9GUkVFCiAKICNlbHNlCS8qICEgUFlNQUxMT0NfREVCVUcgKi8KIApAQCAtNjgsMTQgKzY5LDEwIEBACiAgICBweW1hbGxvYy4gVG8gc29sdmUgdGhlc2UgcHJvYmxlbXMsIGFsbG9jYXRlIGFuIGV4dHJhIGJ5dGUuICovCiAjZGVmaW5lIFB5TWVtX01BTExPQyhuKSAgICAgICAgIG1hbGxvYygobikgPyAobikgOiAxKQogI2RlZmluZSBQeU1lbV9SRUFMTE9DKHAsIG4pICAgICByZWFsbG9jKChwKSwgKG4pID8gKG4pIDogMSkKKyNkZWZpbmUgUHlNZW1fRlJFRQkJZnJlZQogCiAjZW5kaWYJLyogUFlNQUxMT0NfREVCVUcgKi8KIAotLyogSW4gb3JkZXIgdG8gYXZvaWQgYnJlYWtpbmcgb2xkIGNvZGUgbWl4aW5nIFB5T2JqZWN0X3tOZXcsIE5FV30gd2l0aAotICAgUHlNZW1fe0RlbCwgREVMfSBhbmQgUHlNZW1fe0ZyZWUsIEZSRUV9LCB0aGUgUHlNZW0gInJlbGVhc2UgbWVtb3J5IgotICAgZnVuY3Rpb25zIGhhdmUgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgb2JqZWN0IGRlYWxsb2NhdG9yLiAqLwotI2RlZmluZSBQeU1lbV9GUkVFICAgICAgICAgICAJUHlPYmplY3RfRlJFRQotCiAvKgogICogVHlwZS1vcmllbnRlZCBtZW1vcnkgaW50ZXJmYWNlCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTk1LDExICs5MiwxMSBAQAogI2RlZmluZSBQeU1lbV9SRVNJWkUocCwgdHlwZSwgbikgXAogCSggKHApID0gKHR5cGUgKikgUHlNZW1fUkVBTExPQygocCksIChuKSAqIHNpemVvZih0eXBlKSkgKQogCi0vKiBJbiBvcmRlciB0byBhdm9pZCBicmVha2luZyBvbGQgY29kZSBtaXhpbmcgUHlPYmplY3Rfe05ldywgTkVXfSB3aXRoCi0gICBQeU1lbV97RGVsLCBERUx9IGFuZCBQeU1lbV97RnJlZSwgRlJFRX0sIHRoZSBQeU1lbSAicmVsZWFzZSBtZW1vcnkiCi0gICBmdW5jdGlvbnMgaGF2ZSB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBvYmplY3QgZGVhbGxvY2F0b3IuICovCi0jZGVmaW5lIFB5TWVtX0RlbAkJUHlPYmplY3RfRnJlZQotI2RlZmluZSBQeU1lbV9ERUwJCVB5T2JqZWN0X0ZSRUUKKy8qIFB5TWVte0RlbCxERUx9IGFyZSBsZWZ0IG92ZXIgZnJvbSBhbmNpZW50IGRheXMsIGFuZCBzaG91bGRuJ3QgYmUgdXNlZAorICogYW55bW9yZS4gIFRoZXkncmUganVzdCBjb25mdXNpbmcgYWxpYXNlcyBmb3IgUHlNZW1fe0ZyZWUsRlJFRX0gbm93LgorICovCisjZGVmaW5lIFB5TWVtX0RlbAkJUHlNZW1fRnJlZQorI2RlZmluZSBQeU1lbV9ERUwJCVB5TWVtX0ZSRUUKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5cG9ydC5oIGIvSW5jbHVkZS9weXBvcnQuaAppbmRleCA5MTExZDg2Li4yYmNlNDE1IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5cG9ydC5oCisrKyBiL0luY2x1ZGUvcHlwb3J0LmgKQEAgLTg1LDYgKzg1LDEwIEBACiAjICAgZXJyb3IgIlB5dGhvbiBuZWVkcyBhIHR5cGVkZWYgZm9yIFB5X3VpbnRwdHJfdCBpbiBweXBvcnQuaC4iCiAjZW5kaWYgLyogSEFWRV9VSU5UUFRSX1QgKi8KIAorLyogUHlfc3NpemVfdCBpcyBhIHNpZ25lZCBpbnRlZ3JhbCB0eXBlIHN1Y2ggdGhhdCBzaXplb2YoUHlfc3NpemVfdCkgPT0KKyAqIHNpemVvZihzaXplX3QpLiAgQzk5IGRvZXNuJ3QgZGVmaW5lIHN1Y2ggYSB0aGluZyBkaXJlY3RseSAoc2l6ZV90IGlzIGFuCisgKiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlKS4gIFNlZSBQRVAgMzUzIGZvciBkZXRhaWxzLgorICovCiAjaWZkZWYgSEFWRV9TU0laRV9UCiB0eXBlZGVmIHNzaXplX3QJCVB5X3NzaXplX3Q7CiAjZWxpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9TSVpFX1QKQEAgLTkyLDcgKzk2LDQ2IEBACiAjZWxzZQogIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV9zc2l6ZV90IGluIHB5cG9ydC5oLiIKICNlbmRpZgorCisvKiBMYXJnZXN0IHBvc2l0aXZlIHZhbHVlIG9mIHR5cGUgUHlfc3NpemVfdC4gKi8KICNkZWZpbmUgUFlfU1NJWkVfVF9NQVggKChQeV9zc2l6ZV90KSgoKHNpemVfdCktMSk+PjEpKQorLyogU21hbGxlc3QgbmVnYXRpdmUgdmFsdWUgb2YgdHlwZSBQeV9zc2l6ZV90LiAqLworI2RlZmluZSBQWV9TU0laRV9UX01JTiAoLVBZX1NTSVpFX1RfTUFYLTEpCisKKy8qIFBZX0ZPUk1BVF9TSVpFX1QgaXMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBtb2RpZmllciBmb3IgdXNlIGluIGEgcHJpbnRmCisgKiBmb3JtYXQgdG8gY29udmVydCBhbiBhcmd1bWVudCB3aXRoIHRoZSB3aWR0aCBvZiBhIHNpemVfdCBvciBQeV9zc2l6ZV90LgorICogQzk5IGludHJvZHVjZWQgInoiIGZvciB0aGlzIHB1cnBvc2UsIGJ1dCBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IHRoYXQ7CisgKiBlLmcuLCBNUyBjb21waWxlcnMgdXNlICJJIiBpbnN0ZWFkLgorICoKKyAqIFRoZXNlICJoaWdoIGxldmVsIiBQeXRob24gZm9ybWF0IGZ1bmN0aW9ucyBpbnRlcnByZXQgInoiIGNvcnJlY3RseSBvbgorICogYWxsIHBsYXRmb3JtcyAoUHl0aG9uIGludGVycHJldHMgdGhlIGZvcm1hdCBzdHJpbmcgaXRzZWxmLCBhbmQgZG9lcyB3aGF0ZXZlcgorICogdGhlIHBsYXRmb3JtIEMgcmVxdWlyZXMgdG8gY29udmVydCBhIHNpemVfdC9QeV9zc2l6ZV90IGFyZ3VtZW50KToKKyAqCisgKiAgICAgUHlTdHJpbmdfRnJvbUZvcm1hdAorICogICAgIFB5RXJyX0Zvcm1hdAorICogICAgIFB5U3RyaW5nX0Zyb21Gb3JtYXRWCisgKgorICogTG93ZXItbGV2ZWwgdXNlcyByZXF1aXJlIHRoYXQgeW91IGludGVycG9sYXRlIHRoZSBjb3JyZWN0IGZvcm1hdCBtb2RpZmllcgorICogeW91cnNlbGYgKGUuZy4sIGNhbGxpbmcgcHJpbnRmLCBmcHJpbnRmLCBzcHJpbnRmLCBQeU9TX3NucHJpbnRmKTsgZm9yCisgKiBleGFtcGxlLAorICoKKyAqICAgICBQeV9zc2l6ZV90IGluZGV4OworICogICAgIGZwcmludGYoc3RkZXJyLCAiaW5kZXggJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBzdWNrc1xuIiwgaW5kZXgpOworICoKKyAqIFRoYXQgd2lsbCBleHBhbmQgdG8gJWxkLCBvciAlSWQsIG9yIHRvIHNvbWV0aGluZyBlbHNlIGNvcnJlY3QgZm9yIGEKKyAqIFB5X3NzaXplX3Qgb24gdGhlIHBsYXRmb3JtLgorICovCisjaWZuZGVmIFBZX0ZPUk1BVF9TSVpFX1QKKyMgICBpZiBTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9JTlQKKyMgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgIiIKKyMgICBlbGlmIFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0xPTkcKKyMgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgImwiCisjICAgZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCisjICAgICAgIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UICJJIgorIyAgIGVsc2UKKyMgICAgICAgZXJyb3IgIlRoaXMgcGxhdGZvcm0ncyBweWNvbmZpZy5oIG5lZWRzIHRvIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UIgorIyAgIGVuZGlmCisjZW5kaWYKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCkBAIC0zNjcsNyArNDEwLDggQEAKICAqICAgIHR5cGVkZWYgaW50IFQxIFB5X0RFUFJFQ0FURUQoMi40KTsKICAqICAgIGV4dGVybiBpbnQgeCgpIFB5X0RFUFJFQ0FURUQoMi41KTsKICAqLwotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID49IDQpIHx8IFwKKwkJCSAgKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKSkKICNkZWZpbmUgUHlfREVQUkVDQVRFRChWRVJTSU9OX1VOVVNFRCkgX19hdHRyaWJ1dGVfXygoX19kZXByZWNhdGVkX18pKQogI2Vsc2UKICNkZWZpbmUgUHlfREVQUkVDQVRFRChWRVJTSU9OX1VOVVNFRCkKQEAgLTQzNiwxNCArNDgwLDEyIEBACiAjZW5kaWYKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotT24gNC40QlNELWRlc2NlbmRhbnRzLCBjdHlwZSBmdW5jdGlvbnMgc2VydmVzIHRoZSB3aG9sZSByYW5nZSBvZgotd2NoYXJfdCBjaGFyYWN0ZXIgc2V0IHJhdGhlciB0aGFuIHNpbmdsZSBieXRlIGNvZGUgcG9pbnRzIG9ubHkuCi1UaGlzIGNoYXJhY3RlcmlzdGljIGNhbiBicmVhayBzb21lIG9wZXJhdGlvbnMgb2Ygc3RyaW5nIG9iamVjdAotaW5jbHVkaW5nIHN0ci51cHBlcigpIGFuZCBzdHIuc3BsaXQoKSBvbiBVVEYtOCBsb2NhbGVzLiAgVGhpcwotd29ya2Fyb3VuZCB3YXMgcHJvdmlkZWQgYnkgVGltIFJvYmJpbnMgb2YgRnJlZUJTRCBwcm9qZWN0LiAgSGUgc2FpZAotdGhlIGluY29tcGF0aWJpbGl0eSB3aWxsIGJlIGZpeGVkIGluIEZyZWVCU0QgNi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogT24gNC40QlNELWRlc2NlbmRhbnRzLCBjdHlwZSBmdW5jdGlvbnMgc2VydmVzIHRoZSB3aG9sZSByYW5nZSBvZgorICogd2NoYXJfdCBjaGFyYWN0ZXIgc2V0IHJhdGhlciB0aGFuIHNpbmdsZSBieXRlIGNvZGUgcG9pbnRzIG9ubHkuCisgKiBUaGlzIGNoYXJhY3RlcmlzdGljIGNhbiBicmVhayBzb21lIG9wZXJhdGlvbnMgb2Ygc3RyaW5nIG9iamVjdAorICogaW5jbHVkaW5nIHN0ci51cHBlcigpIGFuZCBzdHIuc3BsaXQoKSBvbiBVVEYtOCBsb2NhbGVzLiAgVGhpcworICogd29ya2Fyb3VuZCB3YXMgcHJvdmlkZWQgYnkgVGltIFJvYmJpbnMgb2YgRnJlZUJTRCBwcm9qZWN0LgorICovCiAKICNpZmRlZiBfX0ZyZWVCU0RfXwogI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zZXRvYmplY3QuaCBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKaW5kZXggY2VhOTVjYy4uY2M5Mzk2OCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zZXRvYmplY3QuaAorKysgYi9JbmNsdWRlL3NldG9iamVjdC5oCkBAIC03OCwxMCArNzgsMTMgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGcm96ZW5TZXRfTmV3KFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNldF9TaXplKFB5T2JqZWN0ICphbnlzZXQpOwogI2RlZmluZSBQeVNldF9HRVRfU0laRShzbykgKCgoUHlTZXRPYmplY3QgKikoc28pKS0+dXNlZCkKK1B5QVBJX0ZVTkMoaW50KSBQeVNldF9DbGVhcihQeU9iamVjdCAqc2V0KTsKIFB5QVBJX0ZVTkMoaW50KSBQeVNldF9Db250YWlucyhQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KTsKIFB5QVBJX0ZVTkMoaW50KSBQeVNldF9EaXNjYXJkKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXkpOwogUHlBUElfRlVOQyhpbnQpIFB5U2V0X0FkZChQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqa2V5KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTZXRfTmV4dChQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqZW50cnkpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNldF9Qb3AoUHlPYmplY3QgKnNldCk7CitQeUFQSV9GVU5DKGludCkgX1B5U2V0X1VwZGF0ZShQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqaXRlcmFibGUpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2xpY2VvYmplY3QuaCBiL0luY2x1ZGUvc2xpY2VvYmplY3QuaAppbmRleCAxN2YzNmRjLi5kYmMzNGIyIDEwMDY0NAotLS0gYS9JbmNsdWRlL3NsaWNlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zbGljZW9iamVjdC5oCkBAIC0zMCw2ICszMCw3IEBACiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTbGljZV9OZXcoUHlPYmplY3QqIHN0YXJ0LCBQeU9iamVjdCogc3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogc3RlcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNsaWNlX0Zyb21JbmRpY2VzKFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3Qgc3RvcCk7CiBQeUFQSV9GVU5DKGludCkgUHlTbGljZV9HZXRJbmRpY2VzKFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVNsaWNlX0dldEluZGljZXNFeChQeVNsaWNlT2JqZWN0ICpyLCBQeV9zc2l6ZV90IGxlbmd0aCwKZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmluZGV4IGYwZmM2MmEuLjVhZmZlZmMgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UKKysrIGIvTElDRU5TRQpAQCAtNTEsNiArNTEsOCBAQAogICAgIDIuNCAgICAgICAgICAgICAyLjMgICAgICAgICAyMDA0ICAgICAgICBQU0YgICAgICAgICB5ZXMKICAgICAyLjQuMSAgICAgICAgICAgMi40ICAgICAgICAgMjAwNSAgICAgICAgUFNGICAgICAgICAgeWVzCiAgICAgMi40LjIgICAgICAgICAgIDIuNC4xICAgICAgIDIwMDUgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNC4zICAgICAgICAgICAyLjQuMiAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjUgICAgICAgICAgICAgMi40ICAgICAgICAgMjAwNiAgICAgICAgUFNGICAgICAgICAgeWVzCiAKIEZvb3Rub3RlczoKIApkaWZmIC0tZ2l0IGEvTGliL1F1ZXVlLnB5IGIvTGliL1F1ZXVlLnB5CmluZGV4IGM2YzYwOGIuLjUxYWQzNTQgMTAwNjQ0Ci0tLSBhL0xpYi9RdWV1ZS5weQorKysgYi9MaWIvUXVldWUucHkKQEAgLTM1LDYgKzM1LDUxIEBACiAgICAgICAgICMgTm90aWZ5IG5vdF9mdWxsIHdoZW5ldmVyIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZTsKICAgICAgICAgIyBhIHRocmVhZCB3YWl0aW5nIHRvIHB1dCBpcyBub3RpZmllZCB0aGVuLgogICAgICAgICBzZWxmLm5vdF9mdWxsID0gdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLm11dGV4KQorICAgICAgICAjIE5vdGlmeSBhbGxfdGFza3NfZG9uZSB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHVuZmluaXNoZWQgdGFza3MKKyAgICAgICAgIyBkcm9wcyB0byB6ZXJvOyB0aHJlYWQgd2FpdGluZyB0byBqb2luKCkgaXMgbm90aWZpZWQgdG8gcmVzdW1lCisgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKHNlbGYubXV0ZXgpCisgICAgICAgIHNlbGYudW5maW5pc2hlZF90YXNrcyA9IDAKKworICAgIGRlZiB0YXNrX2RvbmUoc2VsZik6CisgICAgICAgICIiIkluZGljYXRlIHRoYXQgYSBmb3JtZXJseSBlbnF1ZXVlZCB0YXNrIGlzIGNvbXBsZXRlLgorCisgICAgICAgIFVzZWQgYnkgUXVldWUgY29uc3VtZXIgdGhyZWFkcy4gIEZvciBlYWNoIGdldCgpIHVzZWQgdG8gZmV0Y2ggYSB0YXNrLAorICAgICAgICBhIHN1YnNlcXVlbnQgY2FsbCB0byB0YXNrX2RvbmUoKSB0ZWxscyB0aGUgcXVldWUgdGhhdCB0aGUgcHJvY2Vzc2luZworICAgICAgICBvbiB0aGUgdGFzayBpcyBjb21wbGV0ZS4KKworICAgICAgICBJZiBhIGpvaW4oKSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zCisgICAgICAgIGhhdmUgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIHRhc2tfZG9uZSgpIGNhbGwgd2FzIHJlY2VpdmVkCisgICAgICAgIGZvciBldmVyeSBpdGVtIHRoYXQgaGFkIGJlZW4gcHV0KCkgaW50byB0aGUgcXVldWUpLgorCisgICAgICAgIFJhaXNlcyBhIFZhbHVlRXJyb3IgaWYgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiB0aGVyZSB3ZXJlIGl0ZW1zCisgICAgICAgIHBsYWNlZCBpbiB0aGUgcXVldWUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmZpbmlzaGVkID0gc2VsZi51bmZpbmlzaGVkX3Rhc2tzIC0gMQorICAgICAgICAgICAgaWYgdW5maW5pc2hlZCA8PSAwOgorICAgICAgICAgICAgICAgIGlmIHVuZmluaXNoZWQgPCAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0YXNrX2RvbmUoKSBjYWxsZWQgdG9vIG1hbnkgdGltZXMnKQorICAgICAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUubm90aWZ5QWxsKCkKKyAgICAgICAgICAgIHNlbGYudW5maW5pc2hlZF90YXNrcyA9IHVuZmluaXNoZWQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUucmVsZWFzZSgpCisKKyAgICBkZWYgam9pbihzZWxmKToKKyAgICAgICAgIiIiQmxvY2tzIHVudGlsIGFsbCBpdGVtcyBpbiB0aGUgUXVldWUgaGF2ZSBiZWVuIGdvdHRlbiBhbmQgcHJvY2Vzc2VkLgorCisgICAgICAgIFRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGdvZXMgdXAgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUKKyAgICAgICAgcXVldWUuIFRoZSBjb3VudCBnb2VzIGRvd24gd2hlbmV2ZXIgYSBjb25zdW1lciB0aHJlYWQgY2FsbHMgdGFza19kb25lKCkKKyAgICAgICAgdG8gaW5kaWNhdGUgdGhlIGl0ZW0gd2FzIHJldHJpZXZlZCBhbmQgYWxsIHdvcmsgb24gaXQgaXMgY29tcGxldGUuCisKKyAgICAgICAgV2hlbiB0aGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBkcm9wcyB0byB6ZXJvLCBqb2luKCkgdW5ibG9ja3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBzZWxmLnVuZmluaXNoZWRfdGFza3M6CisgICAgICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS53YWl0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUucmVsZWFzZSgpCiAKICAgICBkZWYgcXNpemUoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgYXBwcm94aW1hdGUgc2l6ZSBvZiB0aGUgcXVldWUgKG5vdCByZWxpYWJsZSEpLiIiIgpAQCAtODYsNiArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZ1bGwKICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZnVsbC53YWl0KHJlbWFpbmluZykKICAgICAgICAgICAgIHNlbGYuX3B1dChpdGVtKQorICAgICAgICAgICAgc2VsZi51bmZpbmlzaGVkX3Rhc2tzICs9IDEKICAgICAgICAgICAgIHNlbGYubm90X2VtcHR5Lm5vdGlmeSgpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weSBiL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKaW5kZXggMTU2YzJiYS4uYTBiNDRlMSAxMDA2NDQKLS0tIGEvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weQorKysgYi9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5CkBAIC0xMDQsNyArMTA0LDExIEBACiBpbXBvcnQgU29ja2V0U2VydmVyCiBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKIGltcG9ydCBzeXMKLWltcG9ydCBvcywgZmNudGwKK2ltcG9ydCBvcwordHJ5OgorICAgIGltcG9ydCBmY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZjbnRsID0gTm9uZQogCiBkZWYgcmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKG9iaiwgYXR0ciwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpOgogICAgICIiInJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZShhLCAnYi5jLmQnKSA9PiBhLmIuYy5kCkBAIC00OTMsNyArNDk3LDcgQEAKICAgICAgICAgIyBbQnVnICMxMjIyNzkwXSBJZiBwb3NzaWJsZSwgc2V0IGNsb3NlLW9uLWV4ZWMgZmxhZzsgaWYgYQogICAgICAgICAjIG1ldGhvZCBzcGF3bnMgYSBzdWJwcm9jZXNzLCB0aGUgc3VicHJvY2VzcyBzaG91bGRuJ3QgaGF2ZQogICAgICAgICAjIHRoZSBsaXN0ZW5pbmcgc29ja2V0IG9wZW4uCi0gICAgICAgIGlmIGhhc2F0dHIoZmNudGwsICdGRF9DTE9FWEVDJyk6CisgICAgICAgIGlmIGZjbnRsIGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKGZjbnRsLCAnRkRfQ0xPRVhFQycpOgogICAgICAgICAgICAgZmxhZ3MgPSBmY250bC5mY250bChzZWxmLmZpbGVubygpLCBmY250bC5GX0dFVEZEKQogICAgICAgICAgICAgZmxhZ3MgfD0gZmNudGwuRkRfQ0xPRVhFQwogICAgICAgICAgICAgZmNudGwuZmNudGwoc2VsZi5maWxlbm8oKSwgZmNudGwuRl9TRVRGRCwgZmxhZ3MpCmRpZmYgLS1naXQgYS9MaWIvX19mdXR1cmVfXy5weSBiL0xpYi9fX2Z1dHVyZV9fLnB5CmluZGV4IGQ5NWNlNWYuLmQ4ZTE0ZDEgMTAwNjQ0Ci0tLSBhL0xpYi9fX2Z1dHVyZV9fLnB5CisrKyBiL0xpYi9fX2Z1dHVyZV9fLnB5CkBAIC02NCw3ICs2NCw3IEBACiBDT19ORVNURUQgICAgICAgICAgICA9IDB4MDAxMCAgICMgbmVzdGVkX3Njb3BlcwogQ09fR0VORVJBVE9SX0FMTE9XRUQgPSAwICAgICAgICAjIGdlbmVyYXRvcnMgKG9ic29sZXRlLCB3YXMgMHgxMDAwKQogQ09fRlVUVVJFX0RJVklTSU9OICAgPSAweDIwMDAgICAjIGRpdmlzaW9uCi1DT19GVVRVUkVfQUJTSU1QT1JUICA9IDB4NDAwMCAgICMgYWJzb2x1dGVfaW1wb3J0CitDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUID0gMHg0MDAwICMgcGVyZm9ybSBhYnNvbHV0ZSBpbXBvcnRzIGJ5IGRlZmF1bHQKIENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVCAgPSAweDgwMDAgICAjIHdpdGggc3RhdGVtZW50CiAKIGNsYXNzIF9GZWF0dXJlOgpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIGFic29sdXRlX2ltcG9ydCA9IF9GZWF0dXJlKCgyLCA1LCAwLCAiYWxwaGEiLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCA3LCAwLCAiYWxwaGEiLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9BQlNJTVBPUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUKQogCiB3aXRoX3N0YXRlbWVudCA9IF9GZWF0dXJlKCgyLCA1LCAwLCAiYWxwaGEiLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDYsIDAsICJhbHBoYSIsIDApLApkaWZmIC0tZ2l0IGEvTGliL190aHJlYWRpbmdfbG9jYWwucHkgYi9MaWIvX3RocmVhZGluZ19sb2NhbC5weQppbmRleCA5MDcxN2E4Li5mMGNlODU3IDEwMDY0NAotLS0gYS9MaWIvX3RocmVhZGluZ19sb2NhbC5weQorKysgYi9MaWIvX3RocmVhZGluZ19sb2NhbC5weQpAQCAtMSw5ICsxLDkgQEAKLSIiIlRocmVhZC1sb2NhbCBvYmplY3RzCisiIiJUaHJlYWQtbG9jYWwgb2JqZWN0cy4KIAotKE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBwcm92aWRlcyBhIFB5dGhvbiB2ZXJzaW9uIG9mIHRocmVhZAotIHRocmVhZGluZy5sb2NhbCBjbGFzcy4gIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBQeXRob24geW91J3JlCi0gdXNpbmcsIHRoZXJlIG1heSBiZSBhIGZhc3RlciBvbmUgYXZhaWxhYmxlLiAgWW91IHNob3VsZCBhbHdheXMgaW1wb3J0Ci0gdGhlIGxvY2FsIGNsYXNzIGZyb20gdGhyZWFkaW5nLikKKyhOb3RlIHRoYXQgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBQeXRob24gdmVyc2lvbiBvZiB0aGUgdGhyZWFkaW5nLmxvY2FsCisgY2xhc3MuICBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHlvdSdyZSB1c2luZywgdGhlcmUgbWF5IGJlIGEKKyBmYXN0ZXIgb25lIGF2YWlsYWJsZS4gIFlvdSBzaG91bGQgYWx3YXlzIGltcG9ydCB0aGUgYGxvY2FsYCBjbGFzcyBmcm9tCisgYHRocmVhZGluZ2AuKQogCiBUaHJlYWQtbG9jYWwgb2JqZWN0cyBzdXBwb3J0IHRoZSBtYW5hZ2VtZW50IG9mIHRocmVhZC1sb2NhbCBkYXRhLgogSWYgeW91IGhhdmUgZGF0YSB0aGF0IHlvdSB3YW50IHRvIGJlIGxvY2FsIHRvIGEgdGhyZWFkLCBzaW1wbHkgY3JlYXRlCkBAIC0xMzMsNyArMTMzLDE3IEBACiA+Pj4gZGVsIG15ZGF0YQogIiIiCiAKLSMgVGhyZWFkaW5nIGltcG9ydCBpcyBhdCBlbmQKK19fYWxsX18gPSBbImxvY2FsIl0KKworIyBXZSBuZWVkIHRvIHVzZSBvYmplY3RzIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUsIGJ1dCB0aGUgdGhyZWFkaW5nCisjIG1vZHVsZSBtYXkgYWxzbyB3YW50IHRvIHVzZSBvdXIgYGxvY2FsYCBjbGFzcywgaWYgc3VwcG9ydCBmb3IgbG9jYWxzCisjIGlzbid0IGNvbXBpbGVkIGluIHRvIHRoZSBgdGhyZWFkYCBtb2R1bGUuICBUaGlzIGNyZWF0ZXMgcG90ZW50aWFsIHByb2JsZW1zCisjIHdpdGggY2lyY3VsYXIgaW1wb3J0cy4gIEZvciB0aGF0IHJlYXNvbiwgd2UgZG9uJ3QgaW1wb3J0IGB0aHJlYWRpbmdgCisjIHVudGlsIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIChhIGhhY2sgc3VmZmljaWVudCB0byB3b3JtIGFyb3VuZCB0aGUKKyMgcG90ZW50aWFsIHByb2JsZW1zKS4gIE5vdGUgdGhhdCBhbG1vc3QgYWxsIHBsYXRmb3JtcyBkbyBoYXZlIHN1cHBvcnQgZm9yCisjIGxvY2FscyBpbiB0aGUgYHRocmVhZGAgbW9kdWxlLCBhbmQgdGhlcmUgaXMgbm8gY2lyY3VsYXIgaW1wb3J0IHByb2JsZW0KKyMgdGhlbiwgc28gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBmaWRkbGluZyB0aGUgb3JkZXIgb2YgaW1wb3J0cyBoZXJlIHdvbid0CisjIG1hbmlmZXN0IG9uIG1vc3QgYm94ZXMuCiAKIGNsYXNzIF9sb2NhbGJhc2Uob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnX2xvY2FsX19rZXknLCAnX2xvY2FsX19hcmdzJywgJ19sb2NhbF9fbG9jaycKQEAgLTIwMiwzNiArMjEyLDMwIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQogCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKIAotICAgIGRlZiBfX2RlbF9fKCk6Ci0gICAgICAgIHRocmVhZGluZ19lbnVtZXJhdGUgPSBlbnVtZXJhdGUKLSAgICAgICAgX19nZXRhdHRyaWJ1dGVfXyA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fCisgICAgICAgIGtleSA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfbG9jYWxfX2tleScpCiAKLSAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6Ci0gICAgICAgICAgICBrZXkgPSBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfbG9jYWxfX2tleScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRocmVhZHMgPSBsaXN0KHRocmVhZGluZy5lbnVtZXJhdGUoKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBJZiBlbnVtZXJhdGUgZmFpbHMsIGFzIGl0IHNlZW1zIHRvIGRvIGR1cmluZworICAgICAgICAgICAgIyBzaHV0ZG93biwgd2UnbGwgc2tpcCBjbGVhbnVwIHVuZGVyIHRoZSBhc3N1bXB0aW9uCisgICAgICAgICAgICAjIHRoYXQgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiB1cC4KKyAgICAgICAgICAgIHJldHVybgogCisgICAgICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkczoKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB0aHJlYWRzID0gbGlzdCh0aHJlYWRpbmdfZW51bWVyYXRlKCkpCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgIyBpZiBlbnVtZXJhdGUgZmFpbHMsIGFzIGl0IHNlZW1zIHRvIGRvIGR1cmluZwotICAgICAgICAgICAgICAgICMgc2h1dGRvd24sIHdlJ2xsIHNraXAgY2xlYW51cCB1bmRlciB0aGUgYXNzdW1wdGlvbgotICAgICAgICAgICAgICAgICMgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHRvIGNsZWFuIHVwCi0gICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgX19kaWN0X18gPSB0aHJlYWQuX19kaWN0X18KKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRocmVhZCBpcyBkeWluZywgcmVzdCBpbiBwZWFjZS4KKyAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgICAgICBmb3IgdGhyZWFkIGluIHRocmVhZHM6CisgICAgICAgICAgICBpZiBrZXkgaW4gX19kaWN0X186CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBfX2RpY3RfXyA9IHRocmVhZC5fX2RpY3RfXwotICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgIyBUaHJlYWQgaXMgZHlpbmcsIHJlc3QgaW4gcGVhY2UKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZGVsIF9fZGljdF9fW2tleV0KKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MgIyBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpbiB0aGlzIHRocmVhZAogCi0gICAgICAgICAgICAgICAgaWYga2V5IGluIF9fZGljdF9fOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWwgX19kaWN0X19ba2V5XQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzICMgZGlkbid0IGhhdmUgYW55dGhpbmcgaW4gdGhpcyB0aHJlYWQKLQotICAgICAgICByZXR1cm4gX19kZWxfXwotICAgIF9fZGVsX18gPSBfX2RlbF9fKCkKLQotZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRUaHJlYWQsIGVudW1lcmF0ZSwgUkxvY2sKK2Zyb20gdGhyZWFkaW5nIGltcG9ydCBjdXJyZW50VGhyZWFkLCBSTG9jawpkaWZmIC0tZ2l0IGEvTGliL2JkYi5weSBiL0xpYi9iZGIucHkKaW5kZXggOGY4MDhjYy4uMDhiNDhjMyAxMDA2NDQKLS0tIGEvTGliL2JkYi5weQorKysgYi9MaWIvYmRiLnB5CkBAIC00NzksMTAgKzQ3OSwxMCBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZGlzcCA9ICdrZWVwICcKICAgICAgICAgaWYgc2VsZi5lbmFibGVkOgotICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAneWVzJworICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAneWVzICAnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkaXNwID0gZGlzcCArICdubyAnCi0gICAgICAgIHByaW50ICclLTRkYnJlYWtwb2ludCAgICAlcyBhdCAlczolZCcgJSAoc2VsZi5udW1iZXIsIGRpc3AsCisgICAgICAgICAgICBkaXNwID0gZGlzcCArICdubyAgICcKKyAgICAgICAgcHJpbnQgJyUtNGRicmVha3BvaW50ICAgJXMgYXQgJXM6JWQnICUgKHNlbGYubnVtYmVyLCBkaXNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUsIHNlbGYubGluZSkKICAgICAgICAgaWYgc2VsZi5jb25kOgogICAgICAgICAgICAgcHJpbnQgJ1x0c3RvcCBvbmx5IGlmICVzJyAlIChzZWxmLmNvbmQsKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL19faW5pdF9fLnB5IGIvTGliL2JzZGRiL19faW5pdF9fLnB5CmluZGV4IGQzZWU3NzMuLmMwMDRjMDggMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9fX2luaXRfXy5weQorKysgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKQEAgLTI4NywxMCArMjg3LDkgQEAKICAgICAgICAgICAgIGNhY2hlc2l6ZT1Ob25lLCBsb3JkZXI9Tm9uZSwgaGZsYWdzPTApOgogCiAgICAgZmxhZ3MgPSBfY2hlY2tmbGFnKGZsYWcsIGZpbGUpCi0gICAgZSA9IF9vcGVuREJFbnYoKQorICAgIGUgPSBfb3BlbkRCRW52KGNhY2hlc2l6ZSkKICAgICBkID0gZGIuREIoZSkKICAgICBkLnNldF9mbGFncyhoZmxhZ3MpCi0gICAgaWYgY2FjaGVzaXplIGlzIG5vdCBOb25lOiBkLnNldF9jYWNoZXNpemUoMCwgY2FjaGVzaXplKQogICAgIGlmIHBnc2l6ZSBpcyBub3QgTm9uZTogICAgZC5zZXRfcGFnZXNpemUocGdzaXplKQogICAgIGlmIGxvcmRlciBpcyBub3QgTm9uZTogICAgZC5zZXRfbG9yZGVyKGxvcmRlcikKICAgICBpZiBmZmFjdG9yIGlzIG5vdCBOb25lOiAgIGQuc2V0X2hfZmZhY3RvcihmZmFjdG9yKQpAQCAtMzA1LDkgKzMwNCw4IEBACiAgICAgICAgICAgICBwZ3NpemU9Tm9uZSwgbG9yZGVyPU5vbmUpOgogCiAgICAgZmxhZ3MgPSBfY2hlY2tmbGFnKGZsYWcsIGZpbGUpCi0gICAgZSA9IF9vcGVuREJFbnYoKQorICAgIGUgPSBfb3BlbkRCRW52KGNhY2hlc2l6ZSkKICAgICBkID0gZGIuREIoZSkKLSAgICBpZiBjYWNoZXNpemUgaXMgbm90IE5vbmU6IGQuc2V0X2NhY2hlc2l6ZSgwLCBjYWNoZXNpemUpCiAgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCiAgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiBkLnNldF9sb3JkZXIobG9yZGVyKQogICAgIGQuc2V0X2ZsYWdzKGJ0ZmxhZ3MpCkBAIC0zMjQsOSArMzIyLDggQEAKICAgICAgICAgICAgIHJsZW49Tm9uZSwgZGVsaW09Tm9uZSwgc291cmNlPU5vbmUsIHBhZD1Ob25lKToKIAogICAgIGZsYWdzID0gX2NoZWNrZmxhZyhmbGFnLCBmaWxlKQotICAgIGUgPSBfb3BlbkRCRW52KCkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCiAgICAgZCA9IGRiLkRCKGUpCi0gICAgaWYgY2FjaGVzaXplIGlzIG5vdCBOb25lOiBkLnNldF9jYWNoZXNpemUoMCwgY2FjaGVzaXplKQogICAgIGlmIHBnc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfcGFnZXNpemUocGdzaXplKQogICAgIGlmIGxvcmRlciBpcyBub3QgTm9uZTogZC5zZXRfbG9yZGVyKGxvcmRlcikKICAgICBkLnNldF9mbGFncyhybmZsYWdzKQpAQCAtMzM5LDggKzMzNiwxMyBAQAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1kZWYgX29wZW5EQkVudigpOgorZGVmIF9vcGVuREJFbnYoY2FjaGVzaXplKToKICAgICBlID0gZGIuREJFbnYoKQorICAgIGlmIGNhY2hlc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgY2FjaGVzaXplID49IDIwNDgwOgorICAgICAgICAgICAgZS5zZXRfY2FjaGVzaXplKDAsIGNhY2hlc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiY2FjaGVzaXplIG11c3QgYmUgPj0gMjA0ODAiCiAgICAgZS5vcGVuKCcuJywgZGIuREJfUFJJVkFURSB8IGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX0lOSVRfTVBPT0wpCiAgICAgcmV0dXJuIGUKIApAQCAtMzU4LDcgKzM2MCw3IEBACiAgICAgICAgICNmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX1RSVU5DQVRFCiAgICAgICAgICMgd2UgdXNlZCBkYi5EQl9UUlVOQ0FURSBmbGFnIGZvciB0aGlzIGJlZm9yZSBidXQgQmVya2VsZXlEQgogICAgICAgICAjIDQuMi41MiBjaGFuZ2VkIHRvIGRpc2FsbG93ZWQgdHJ1bmNhdGUgd2l0aCB0eG4gZW52aXJvbm1lbnRzLgotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlKToKKyAgICAgICAgaWYgZmlsZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CiAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZSkKICAgICBlbHNlOgogICAgICAgICByYWlzZSBlcnJvciwgImZsYWdzIHNob3VsZCBiZSBvbmUgb2YgJ3InLCAndycsICdjJyBvciAnbiciCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2FsbC5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CmluZGV4IDk3MmNkMDYuLmFiZmFmNDcgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CkBAIC02NSw2ICs2NSw3IEBACiAgICAgICAgICd0ZXN0X2pvaW4nLAogICAgICAgICAndGVzdF9sb2NrJywKICAgICAgICAgJ3Rlc3RfbWlzYycsCisgICAgICAgICd0ZXN0X3BpY2tsZScsCiAgICAgICAgICd0ZXN0X3F1ZXVlJywKICAgICAgICAgJ3Rlc3RfcmVjbm8nLAogICAgICAgICAndGVzdF90aHJlYWQnLApkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE2ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHkKQEAgLTAsMCArMSw3NSBAQAorCitpbXBvcnQgc3lzLCBvcywgc3RyaW5nCitpbXBvcnQgcGlja2xlCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjUGlja2xlID0gTm9uZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZ2xvYgorCit0cnk6CisgICAgIyBGb3IgUHl0aG9ucyB3L2Rpc3R1dGlscyBweWJzZGRiCisgICAgZnJvbSBic2RkYjMgaW1wb3J0IGRiCitleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgIyBGb3IgUHl0aG9uIDIuMworICAgIGZyb20gYnNkZGIgaW1wb3J0IGRiCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgcGlja2xlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlZlcmlmeSB0aGF0IERCRXJyb3IgY2FuIGJlIHBpY2tsZWQgYW5kIHVucGlja2xlZCIiIgorICAgIGRiX2hvbWUgPSAnZGJfaG9tZScKKyAgICBkYl9uYW1lID0gJ3Rlc3QtZGJvYmouZGInCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGhvbWVEaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSwgJ2RiX2hvbWUnKQorICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCisgICAgICAgIHRyeTogb3MubWtkaXIoaG9tZURpcikKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RiJyk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdlbnYnKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmVudgorICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oc2VsZi5ob21lRGlyLCAnKicpKQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlKQorCisgICAgZGVmIF9iYXNlX3Rlc3RfcGlja2xlX0RCRXJyb3Ioc2VsZiwgcGlja2xlKToKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmRiX25hbWUsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5kYi5wdXQoJ3NwYW0nLCAnZWdncycpCisgICAgICAgIGFzc2VydCBzZWxmLmRiWydzcGFtJ10gPT0gJ2VnZ3MnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KCdzcGFtJywgJ2hhbScsIGZsYWdzPWRiLkRCX05PT1ZFUldSSVRFKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZWdnOgorICAgICAgICAgICAgcGlja2xlZEVnZyA9IHBpY2tsZS5kdW1wcyhlZ2cpCisgICAgICAgICAgICAjcHJpbnQgcmVwcihwaWNrbGVkRWdnKQorICAgICAgICAgICAgcm90dGVuRWdnID0gcGlja2xlLmxvYWRzKHBpY2tsZWRFZ2cpCisgICAgICAgICAgICBpZiByb3R0ZW5FZ2cuYXJncyAhPSBlZ2cuYXJncyBvciB0eXBlKHJvdHRlbkVnZykgIT0gdHlwZShlZ2cpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgKHJvdHRlbkVnZywgJyE9JywgZWdnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAid2hlcmUncyBteSBEQkVycm9yIGV4Y2VwdGlvbj8hPyIKKworICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwMV9waWNrbGVfREJFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5fYmFzZV90ZXN0X3BpY2tsZV9EQkVycm9yKHBpY2tsZT1waWNrbGUpCisKKyAgICBpZiBjUGlja2xlOgorICAgICAgICBkZWYgdGVzdDAyX2NQaWNrbGVfREJFcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Jhc2VfdGVzdF9waWNrbGVfREJFcnJvcihwaWNrbGU9Y1BpY2tsZSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHBpY2tsZVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvTGliL2NhbGVuZGFyLnB5IGIvTGliL2NhbGVuZGFyLnB5CmluZGV4IDNmZmNmZjUuLjc4MDBhYWUgMTAwNjQ0Ci0tLSBhL0xpYi9jYWxlbmRhci5weQorKysgYi9MaWIvY2FsZW5kYXIucHkKQEAgLTUsMTcgKzUsMzIgQEAKIFN1bmRheSBhcyB0aGUgbGFzdCAodGhlIEV1cm9wZWFuIGNvbnZlbnRpb24pLiBVc2Ugc2V0Zmlyc3R3ZWVrZGF5KCkgdG8KIHNldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwPU1vbmRheSwgNj1TdW5kYXkpLiIiIgogCi1pbXBvcnQgZGF0ZXRpbWUKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCBzeXMsIGRhdGV0aW1lLCBsb2NhbGUKIAotX19hbGxfXyA9IFsiZXJyb3IiLCJzZXRmaXJzdHdlZWtkYXkiLCJmaXJzdHdlZWtkYXkiLCJpc2xlYXAiLAotICAgICAgICAgICAibGVhcGRheXMiLCJ3ZWVrZGF5IiwibW9udGhyYW5nZSIsIm1vbnRoY2FsZW5kYXIiLAotICAgICAgICAgICAicHJtb250aCIsIm1vbnRoIiwicHJjYWwiLCJjYWxlbmRhciIsInRpbWVnbSIsCi0gICAgICAgICAgICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiLAotICAgICAgICAgICAid2Vla2hlYWRlciJdCitfX2FsbF9fID0gWyJJbGxlZ2FsTW9udGhFcnJvciIsICJJbGxlZ2FsV2Vla2RheUVycm9yIiwgInNldGZpcnN0d2Vla2RheSIsCisgICAgICAgICAgICJmaXJzdHdlZWtkYXkiLCAiaXNsZWFwIiwgImxlYXBkYXlzIiwgIndlZWtkYXkiLCAibW9udGhyYW5nZSIsCisgICAgICAgICAgICJtb250aGNhbGVuZGFyIiwgInBybW9udGgiLCAibW9udGgiLCAicHJjYWwiLCAiY2FsZW5kYXIiLAorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciJdCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCiBlcnJvciA9IFZhbHVlRXJyb3IKIAorIyBFeGNlcHRpb25zIHJhaXNlZCBmb3IgYmFkIGlucHV0CitjbGFzcyBJbGxlZ2FsTW9udGhFcnJvcihWYWx1ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9udGgpOgorICAgICAgICBzZWxmLm1vbnRoID0gbW9udGgKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJiYWQgbW9udGggbnVtYmVyICVyOyBtdXN0IGJlIDEtMTIiICUgc2VsZi5tb250aAorCisKK2NsYXNzIElsbGVnYWxXZWVrZGF5RXJyb3IoVmFsdWVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdlZWtkYXkpOgorICAgICAgICBzZWxmLndlZWtkYXkgPSB3ZWVrZGF5CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiYmFkIHdlZWtkYXkgbnVtYmVyICVyOyBtdXN0IGJlIDAgKE1vbmRheSkgdG8gNiAoU3VuZGF5KSIgJSBzZWxmLndlZWtkYXkKKworCiAjIENvbnN0YW50cyBmb3IgbW9udGhzIHJlZmVyZW5jZWQgbGF0ZXIKIEphbnVhcnkgPSAxCiBGZWJydWFyeSA9IDIKQEAgLTMwLDcgKzQ1LDcgQEAKIAogY2xhc3MgX2xvY2FsaXplZF9tb250aDoKIAotICAgIF9tb250aHMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCBpKzEsIDEpLnN0cmZ0aW1lIGZvciBpIGluIHJhbmdlKDEyKV0KKyAgICBfbW9udGhzID0gW2RhdGV0aW1lLmRhdGUoMjAwMSwgaSsxLCAxKS5zdHJmdGltZSBmb3IgaSBpbiB4cmFuZ2UoMTIpXQogICAgIF9tb250aHMuaW5zZXJ0KDAsIGxhbWJkYSB4OiAiIikKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXQpOgpAQCAtNDYsMTAgKzYxLDExIEBACiAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgIHJldHVybiAxMwogCisKIGNsYXNzIF9sb2NhbGl6ZWRfZGF5OgogCiAgICAgIyBKYW51YXJ5IDEsIDIwMDEsIHdhcyBhIE1vbmRheS4KLSAgICBfZGF5cyA9IFtkYXRldGltZS5kYXRlKDIwMDEsIDEsIGkrMSkuc3RyZnRpbWUgZm9yIGkgaW4gcmFuZ2UoNyldCisgICAgX2RheXMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCAxLCBpKzEpLnN0cmZ0aW1lIGZvciBpIGluIHhyYW5nZSg3KV0KIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXQpOgogICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdApAQCAtNjQsNiArODAsNyBAQAogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gNwogCisKICMgRnVsbCBhbmQgYWJicmV2aWF0ZWQgbmFtZXMgb2Ygd2Vla2RheXMKIGRheV9uYW1lID0gX2xvY2FsaXplZF9kYXkoJyVBJykKIGRheV9hYmJyID0gX2xvY2FsaXplZF9kYXkoJyVhJykKQEAgLTc1LDIzICs5MiwxMiBAQAogIyBDb25zdGFudHMgZm9yIHdlZWtkYXlzCiAoTU9OREFZLCBUVUVTREFZLCBXRURORVNEQVksIFRIVVJTREFZLCBGUklEQVksIFNBVFVSREFZLCBTVU5EQVkpID0gcmFuZ2UoNykKIAotX2ZpcnN0d2Vla2RheSA9IDAgICAgICAgICAgICAgICAgICAgICAgICMgMCA9IE1vbmRheSwgNiA9IFN1bmRheQotCi1kZWYgZmlyc3R3ZWVrZGF5KCk6Ci0gICAgcmV0dXJuIF9maXJzdHdlZWtkYXkKLQotZGVmIHNldGZpcnN0d2Vla2RheSh3ZWVrZGF5KToKLSAgICAiIiJTZXQgd2Vla2RheSAoTW9uZGF5PTAsIFN1bmRheT02KSB0byBzdGFydCBlYWNoIHdlZWsuIiIiCi0gICAgZ2xvYmFsIF9maXJzdHdlZWtkYXkKLSAgICBpZiBub3QgTU9OREFZIDw9IHdlZWtkYXkgPD0gU1VOREFZOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCi0gICAgICAgICAgICAgICdiYWQgd2Vla2RheSBudW1iZXI7IG11c3QgYmUgMCAoTW9uZGF5KSB0byA2IChTdW5kYXkpJwotICAgIF9maXJzdHdlZWtkYXkgPSB3ZWVrZGF5CiAKIGRlZiBpc2xlYXAoeWVhcik6CiAgICAgIiIiUmV0dXJuIDEgZm9yIGxlYXAgeWVhcnMsIDAgZm9yIG5vbi1sZWFwIHllYXJzLiIiIgogICAgIHJldHVybiB5ZWFyICUgNCA9PSAwIGFuZCAoeWVhciAlIDEwMCAhPSAwIG9yIHllYXIgJSA0MDAgPT0gMCkKIAorCiBkZWYgbGVhcGRheXMoeTEsIHkyKToKICAgICAiIiJSZXR1cm4gbnVtYmVyIG9mIGxlYXAgeWVhcnMgaW4gcmFuZ2UgW3kxLCB5MikuCiAgICAgICAgQXNzdW1lIHkxIDw9IHkyLiIiIgpAQCAtOTksMTI4ICsxMDUsNTAxIEBACiAgICAgeTIgLT0gMQogICAgIHJldHVybiAoeTIvLzQgLSB5MS8vNCkgLSAoeTIvLzEwMCAtIHkxLy8xMDApICsgKHkyLy80MDAgLSB5MS8vNDAwKQogCisKIGRlZiB3ZWVrZGF5KHllYXIsIG1vbnRoLCBkYXkpOgogICAgICIiIlJldHVybiB3ZWVrZGF5ICgwLTYgfiBNb24tU3VuKSBmb3IgeWVhciAoMTk3MC0uLi4pLCBtb250aCAoMS0xMiksCiAgICAgICAgZGF5ICgxLTMxKS4iIiIKICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS53ZWVrZGF5KCkKIAorCiBkZWYgbW9udGhyYW5nZSh5ZWFyLCBtb250aCk6CiAgICAgIiIiUmV0dXJuIHdlZWtkYXkgKDAtNiB+IE1vbi1TdW4pIGFuZCBudW1iZXIgb2YgZGF5cyAoMjgtMzEpIGZvcgogICAgICAgIHllYXIsIG1vbnRoLiIiIgogICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnYmFkIG1vbnRoIG51bWJlcicKKyAgICAgICAgcmFpc2UgSWxsZWdhbE1vbnRoRXJyb3IobW9udGgpCiAgICAgZGF5MSA9IHdlZWtkYXkoeWVhciwgbW9udGgsIDEpCiAgICAgbmRheXMgPSBtZGF5c1ttb250aF0gKyAobW9udGggPT0gRmVicnVhcnkgYW5kIGlzbGVhcCh5ZWFyKSkKICAgICByZXR1cm4gZGF5MSwgbmRheXMKIAotZGVmIG1vbnRoY2FsZW5kYXIoeWVhciwgbW9udGgpOgotICAgICIiIlJldHVybiBhIG1hdHJpeCByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgotICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyBkYXlzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4iIiIKLSAgICBkYXkxLCBuZGF5cyA9IG1vbnRocmFuZ2UoeWVhciwgbW9udGgpCi0gICAgcm93cyA9IFtdCi0gICAgcjcgPSByYW5nZSg3KQotICAgIGRheSA9IChfZmlyc3R3ZWVrZGF5IC0gZGF5MSArIDYpICUgNyAtIDUgICAjIGZvciBsZWFkaW5nIDAncyBpbiBmaXJzdCB3ZWVrCi0gICAgd2hpbGUgZGF5IDw9IG5kYXlzOgotICAgICAgICByb3cgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMF0KLSAgICAgICAgZm9yIGkgaW4gcjc6Ci0gICAgICAgICAgICBpZiAxIDw9IGRheSA8PSBuZGF5czogcm93W2ldID0gZGF5Ci0gICAgICAgICAgICBkYXkgPSBkYXkgKyAxCi0gICAgICAgIHJvd3MuYXBwZW5kKHJvdykKLSAgICByZXR1cm4gcm93cwogCi1kZWYgcHJ3ZWVrKHRoZXdlZWssIHdpZHRoKToKLSAgICAiIiJQcmludCBhIHNpbmdsZSB3ZWVrIChubyBuZXdsaW5lKS4iIiIKLSAgICBwcmludCB3ZWVrKHRoZXdlZWssIHdpZHRoKSwKK2NsYXNzIENhbGVuZGFyKG9iamVjdCk6CisgICAgIiIiCisgICAgQmFzZSBjYWxlbmRhciBjbGFzcy4gVGhpcyBjbGFzcyBkb2Vzbid0IGRvIGFueSBmb3JtYXR0aW5nLiBJdCBzaW1wbHkKKyAgICBwcm92aWRlcyBkYXRhIHRvIHN1YmNsYXNzZXMuCisgICAgIiIiCiAKLWRlZiB3ZWVrKHRoZXdlZWssIHdpZHRoKToKLSAgICAiIiJSZXR1cm5zIGEgc2luZ2xlIHdlZWsgaW4gYSBzdHJpbmcgKG5vIG5ld2xpbmUpLiIiIgotICAgIGRheXMgPSBbXQotICAgIGZvciBkYXkgaW4gdGhld2VlazoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTApOgorICAgICAgICBzZWxmLmZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheSAjIDAgPSBNb25kYXksIDYgPSBTdW5kYXkKKworICAgIGRlZiBnZXRmaXJzdHdlZWtkYXkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maXJzdHdlZWtkYXkgJSA3CisKKyAgICBkZWYgc2V0Zmlyc3R3ZWVrZGF5KHNlbGYsIGZpcnN0d2Vla2RheSk6CisgICAgICAgIHNlbGYuX2ZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheQorCisgICAgZmlyc3R3ZWVrZGF5ID0gcHJvcGVydHkoZ2V0Zmlyc3R3ZWVrZGF5LCBzZXRmaXJzdHdlZWtkYXkpCisKKyAgICBkZWYgaXRlcndlZWtkYXlzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaXRlcmF0b3IgZm9yIG9uZSB3ZWVrIG9mIHdlZWtkYXkgbnVtYmVycyBzdGFydGluZyB3aXRoIHRoZQorICAgICAgICBjb25maWd1cmVkIGZpcnN0IG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLmZpcnN0d2Vla2RheSwgc2VsZi5maXJzdHdlZWtkYXkgKyA3KToKKyAgICAgICAgICAgIHlpZWxkIGklNworCisgICAgZGVmIGl0ZXJtb250aGRhdGVzKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhbiBpdGVyYXRvciBmb3Igb25lIG1vbnRoLiBUaGUgaXRlcmF0b3Igd2lsbCB5aWVsZCBkYXRldGltZS5kYXRlCisgICAgICAgIHZhbHVlcyBhbmQgd2lsbCBhbHdheXMgaXRlcmF0ZSB0aHJvdWdoIGNvbXBsZXRlIHdlZWtzLCBzbyBpdCB3aWxsIHlpZWxkCisgICAgICAgIGRhdGVzIG91dHNpZGUgdGhlIHNwZWNpZmllZCBtb250aC4KKyAgICAgICAgIiIiCisgICAgICAgIGRhdGUgPSBkYXRldGltZS5kYXRlKHllYXIsIG1vbnRoLCAxKQorICAgICAgICAjIEdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgd2VlaworICAgICAgICBkYXlzID0gKGRhdGUud2Vla2RheSgpIC0gc2VsZi5maXJzdHdlZWtkYXkpICUgNworICAgICAgICBkYXRlIC09IGRhdGV0aW1lLnRpbWVkZWx0YShkYXlzPWRheXMpCisgICAgICAgIG9uZWRheSA9IGRhdGV0aW1lLnRpbWVkZWx0YShkYXlzPTEpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB5aWVsZCBkYXRlCisgICAgICAgICAgICBkYXRlICs9IG9uZWRheQorICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aCBhbmQgZGF0ZS53ZWVrZGF5KCkgPT0gc2VsZi5maXJzdHdlZWtkYXk6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBpdGVybW9udGhkYXlzMihzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBMaWtlIGl0ZXJtb250aGRhdGVzKCksIGJ1dCB3aWxsIHlpZWxkIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikKKyAgICAgICAgdHVwbGVzLiBGb3IgZGF5cyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgbW9udGggdGhlIGRheSBudW1iZXIgaXMgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkYXRlIGluIHNlbGYuaXRlcm1vbnRoZGF0ZXMoeWVhciwgbW9udGgpOgorICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aDoKKyAgICAgICAgICAgICAgICB5aWVsZCAoMCwgZGF0ZS53ZWVrZGF5KCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIChkYXRlLmRheSwgZGF0ZS53ZWVrZGF5KCkpCisKKyAgICBkZWYgaXRlcm1vbnRoZGF5cyhzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBMaWtlIGl0ZXJtb250aGRhdGVzKCksIGJ1dCB3aWxsIHlpZWxkIGRheSBudW1iZXJzIHR1cGxlcy4gRm9yIGRheXMKKyAgICAgICAgb3V0c2lkZSB0aGUgc3BlY2lmaWVkIG1vbnRoIHRoZSBkYXkgbnVtYmVyIGlzIDAuCisgICAgICAgICIiIgorICAgICAgICBmb3IgZGF0ZSBpbiBzZWxmLml0ZXJtb250aGRhdGVzKHllYXIsIG1vbnRoKToKKyAgICAgICAgICAgIGlmIGRhdGUubW9udGggIT0gbW9udGg6CisgICAgICAgICAgICAgICAgeWllbGQgMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBkYXRlLmRheQorCisgICAgZGVmIG1vbnRoZGF0ZXNjYWxlbmRhcihzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtYXRyaXggKGxpc3Qgb2YgbGlzdHMpIHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyB3ZWVrIGVudHJpZXMgYXJlIGRhdGV0aW1lLmRhdGUgdmFsdWVzLgorICAgICAgICAiIiIKKyAgICAgICAgZGF0ZXMgPSBsaXN0KHNlbGYuaXRlcm1vbnRoZGF0ZXMoeWVhciwgbW9udGgpKQorICAgICAgICByZXR1cm4gWyBkYXRlc1tpOmkrN10gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihkYXRlcyksIDcpIF0KKworICAgIGRlZiBtb250aGRheXMyY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyB3ZWVrIGVudHJpZXMgYXJlCisgICAgICAgIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikgdHVwbGVzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGgKKyAgICAgICAgYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBkYXlzID0gbGlzdChzZWxmLml0ZXJtb250aGRheXMyKHllYXIsIG1vbnRoKSkKKyAgICAgICAgcmV0dXJuIFsgZGF5c1tpOmkrN10gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihkYXlzKSwgNykgXQorCisgICAgZGVmIG1vbnRoZGF5c2NhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2VlazsgZGF5cyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBkYXlzID0gbGlzdChzZWxmLml0ZXJtb250aGRheXMoeWVhciwgbW9udGgpKQorICAgICAgICByZXR1cm4gWyBkYXlzW2k6aSs3XSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRheXMpLCA3KSBdCisKKyAgICBkZWYgeWVhcmRhdGVzY2FsZW5kYXIoc2VsZiwgeWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgeWVhciByZWFkeSBmb3IgZm9ybWF0dGluZy4gVGhlIHJldHVybgorICAgICAgICB2YWx1ZSBpcyBhIGxpc3Qgb2YgbW9udGggcm93cy4gRWFjaCBtb250aCByb3cgY29udGFpbnMgdXB0byB3aWR0aCBtb250aHMuCisgICAgICAgIEVhY2ggbW9udGggY29udGFpbnMgYmV0d2VlbiA0IGFuZCA2IHdlZWtzIGFuZCBlYWNoIHdlZWsgY29udGFpbnMgMS03CisgICAgICAgIGRheXMuIERheXMgYXJlIGRhdGV0aW1lLmRhdGUgb2JqZWN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIG1vbnRocyA9IFsKKyAgICAgICAgICAgIHNlbGYubW9udGhkYXRlc2NhbGVuZGFyKHllYXIsIGkpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMikKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gW21vbnRoc1tpOmkrd2lkdGhdIGZvciBpIGluIHhyYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworICAgIGRlZiB5ZWFyZGF5czJjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCisgICAgICAgIHllYXJkYXRlc2NhbGVuZGFyKCkpLiBFbnRyaWVzIGluIHRoZSB3ZWVrIGxpc3RzIGFyZQorICAgICAgICAoZGF5IG51bWJlciwgd2Vla2RheSBudW1iZXIpIHR1cGxlcy4gRGF5IG51bWJlcnMgb3V0c2lkZSB0aGlzIG1vbnRoIGFyZQorICAgICAgICB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgbW9udGhzID0gWworICAgICAgICAgICAgc2VsZi5tb250aGRheXMyY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyKQorICAgICAgICBdCisgICAgICAgIHJldHVybiBbbW9udGhzW2k6aSt3aWR0aF0gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihtb250aHMpLCB3aWR0aCkgXQorCisgICAgZGVmIHllYXJkYXlzY2FsZW5kYXIoc2VsZiwgeWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgeWVhciByZWFkeSBmb3IgZm9ybWF0dGluZyAoc2ltaWxhciB0bworICAgICAgICB5ZWFyZGF0ZXNjYWxlbmRhcigpKS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgZGF5IG51bWJlcnMuCisgICAgICAgIERheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIG1vbnRocyA9IFsKKyAgICAgICAgICAgIHNlbGYubW9udGhkYXlzY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyKQorICAgICAgICBdCisgICAgICAgIHJldHVybiBbbW9udGhzW2k6aSt3aWR0aF0gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihtb250aHMpLCB3aWR0aCkgXQorCisKK2NsYXNzIFRleHRDYWxlbmRhcihDYWxlbmRhcik6CisgICAgIiIiCisgICAgU3ViY2xhc3Mgb2YgQ2FsZW5kYXIgdGhhdCBvdXRwdXRzIGEgY2FsZW5kYXIgYXMgYSBzaW1wbGUgcGxhaW4gdGV4dAorICAgIHNpbWlsYXIgdG8gdGhlIFVOSVggcHJvZ3JhbSBjYWwuCisgICAgIiIiCisKKyAgICBkZWYgcHJ3ZWVrKHNlbGYsIHRoZXdlZWssIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IGEgc2luZ2xlIHdlZWsgKG5vIG5ld2xpbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgcHJpbnQgc2VsZi53ZWVrKHRoZXdlZWssIHdpZHRoKSwKKworICAgIGRlZiBmb3JtYXRkYXkoc2VsZiwgZGF5LCB3ZWVrZGF5LCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgZm9ybWF0dGVkIGRheS4KKyAgICAgICAgIiIiCiAgICAgICAgIGlmIGRheSA9PSAwOgogICAgICAgICAgICAgcyA9ICcnCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzID0gJyUyaScgJSBkYXkgICAgICAgICAgICAgIyByaWdodC1hbGlnbiBzaW5nbGUtZGlnaXQgZGF5cwotICAgICAgICBkYXlzLmFwcGVuZChzLmNlbnRlcih3aWR0aCkpCi0gICAgcmV0dXJuICcgJy5qb2luKGRheXMpCisgICAgICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCkKIAotZGVmIHdlZWtoZWFkZXIod2lkdGgpOgotICAgICIiIlJldHVybiBhIGhlYWRlciBmb3IgYSB3ZWVrLiIiIgotICAgIGlmIHdpZHRoID49IDk6Ci0gICAgICAgIG5hbWVzID0gZGF5X25hbWUKLSAgICBlbHNlOgotICAgICAgICBuYW1lcyA9IGRheV9hYmJyCi0gICAgZGF5cyA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoX2ZpcnN0d2Vla2RheSwgX2ZpcnN0d2Vla2RheSArIDcpOgotICAgICAgICBkYXlzLmFwcGVuZChuYW1lc1tpJTddWzp3aWR0aF0uY2VudGVyKHdpZHRoKSkKLSAgICByZXR1cm4gJyAnLmpvaW4oZGF5cykKKyAgICBkZWYgZm9ybWF0d2VlayhzZWxmLCB0aGV3ZWVrLCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgc2luZ2xlIHdlZWsgaW4gYSBzdHJpbmcgKG5vIG5ld2xpbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuZm9ybWF0ZGF5KGQsIHdkLCB3aWR0aCkgZm9yIChkLCB3ZCkgaW4gdGhld2VlaykKIAotZGVmIHBybW9udGgodGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKLSAgICAiIiJQcmludCBhIG1vbnRoJ3MgY2FsZW5kYXIuIiIiCi0gICAgcHJpbnQgbW9udGgodGhleWVhciwgdGhlbW9udGgsIHcsIGwpLAorICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSwgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGZvcm1hdHRlZCB3ZWVrIGRheSBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2lkdGggPj0gOToKKyAgICAgICAgICAgIG5hbWVzID0gZGF5X25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gZGF5X2FiYnIKKyAgICAgICAgcmV0dXJuIG5hbWVzW2RheV1bOndpZHRoXS5jZW50ZXIod2lkdGgpCiAKLWRlZiBtb250aCh0aGV5ZWFyLCB0aGVtb250aCwgdz0wLCBsPTApOgotICAgICIiIlJldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgc3RyaW5nIChtdWx0aS1saW5lKS4iIiIKLSAgICB3ID0gbWF4KDIsIHcpCi0gICAgbCA9IG1heCgxLCBsKQotICAgIHMgPSAoIiVzICVyIiAlIChtb250aF9uYW1lW3RoZW1vbnRoXSwgdGhleWVhcikpLmNlbnRlcigKLSAgICAgICAgICAgICAgICAgNyAqICh3ICsgMSkgLSAxKS5yc3RyaXAoKSArIFwKLSAgICAgICAgICdcbicgKiBsICsgd2Vla2hlYWRlcih3KS5yc3RyaXAoKSArICdcbicgKiBsCi0gICAgZm9yIGF3ZWVrIGluIG1vbnRoY2FsZW5kYXIodGhleWVhciwgdGhlbW9udGgpOgotICAgICAgICBzID0gcyArIHdlZWsoYXdlZWssIHcpLnJzdHJpcCgpICsgJ1xuJyAqIGwKLSAgICByZXR1cm4gc1s6LWxdICsgJ1xuJworICAgIGRlZiBmb3JtYXR3ZWVraGVhZGVyKHNlbGYsIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGhlYWRlciBmb3IgYSB3ZWVrLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuZm9ybWF0d2Vla2RheShpLCB3aWR0aCkgZm9yIGkgaW4gc2VsZi5pdGVyd2Vla2RheXMoKSkKIAotIyBTcGFjaW5nIG9mIG1vbnRoIGNvbHVtbnMgZm9yIDMtY29sdW1uIHllYXIgY2FsZW5kYXIKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aWR0aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgbW9udGggbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIHMgPSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgIHMgPSAiJXMgJXIiICUgKHMsIHRoZXllYXIpCisgICAgICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCkKKworICAgIGRlZiBwcm1vbnRoKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3PTAsIGw9MCk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgICIiIgorICAgICAgICBwcmludCBzZWxmLmZvcm1hdG1vbnRoKHRoZXllYXIsIHRoZW1vbnRoLCB3LCBsKSwKKworICAgIGRlZiBmb3JtYXRtb250aChzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgdz0wLCBsPTApOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbW9udGgncyBjYWxlbmRhciBzdHJpbmcgKG11bHRpLWxpbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgdyA9IG1heCgyLCB3KQorICAgICAgICBsID0gbWF4KDEsIGwpCisgICAgICAgIHMgPSBzZWxmLmZvcm1hdG1vbnRobmFtZSh0aGV5ZWFyLCB0aGVtb250aCwgNyAqICh3ICsgMSkgLSAxKQorICAgICAgICBzID0gcy5yc3RyaXAoKQorICAgICAgICBzICs9ICdcbicgKiBsCisgICAgICAgIHMgKz0gc2VsZi5mb3JtYXR3ZWVraGVhZGVyKHcpLnJzdHJpcCgpCisgICAgICAgIHMgKz0gJ1xuJyAqIGwKKyAgICAgICAgZm9yIHdlZWsgaW4gc2VsZi5tb250aGRheXMyY2FsZW5kYXIodGhleWVhciwgdGhlbW9udGgpOgorICAgICAgICAgICAgcyArPSBzZWxmLmZvcm1hdHdlZWsod2VlaywgdykucnN0cmlwKCkKKyAgICAgICAgICAgIHMgKz0gJ1xuJyAqIGwKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBmb3JtYXR5ZWFyKHNlbGYsIHRoZXllYXIsIHc9MiwgbD0xLCBjPTYsIG09Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgeWVhcidzIGNhbGVuZGFyIGFzIGEgbXVsdGktbGluZSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICB3ID0gbWF4KDIsIHcpCisgICAgICAgIGwgPSBtYXgoMSwgbCkKKyAgICAgICAgYyA9IG1heCgyLCBjKQorICAgICAgICBjb2x3aWR0aCA9ICh3ICsgMSkgKiA3IC0gMQorICAgICAgICB2ID0gW10KKyAgICAgICAgYSA9IHYuYXBwZW5kCisgICAgICAgIGEocmVwcih0aGV5ZWFyKS5jZW50ZXIoY29sd2lkdGgqbStjKihtLTEpKS5yc3RyaXAoKSkKKyAgICAgICAgYSgnXG4nKmwpCisgICAgICAgIGhlYWRlciA9IHNlbGYuZm9ybWF0d2Vla2hlYWRlcih3KQorICAgICAgICBmb3IgKGksIHJvdykgaW4gZW51bWVyYXRlKHNlbGYueWVhcmRheXMyY2FsZW5kYXIodGhleWVhciwgbSkpOgorICAgICAgICAgICAgIyBtb250aHMgaW4gdGhpcyByb3cKKyAgICAgICAgICAgIG1vbnRocyA9IHhyYW5nZShtKmkrMSwgbWluKG0qKGkrMSkrMSwgMTMpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICBuYW1lcyA9IChzZWxmLmZvcm1hdG1vbnRobmFtZSh0aGV5ZWFyLCBrLCBjb2x3aWR0aCwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBtb250aHMpCisgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyhuYW1lcywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICBoZWFkZXJzID0gKGhlYWRlciBmb3IgayBpbiBtb250aHMpCisgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyhoZWFkZXJzLCBjb2x3aWR0aCwgYykucnN0cmlwKCkpCisgICAgICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgICAgICMgbWF4IG51bWJlciBvZiB3ZWVrcyBmb3IgdGhpcyByb3cKKyAgICAgICAgICAgIGhlaWdodCA9IG1heChsZW4oY2FsKSBmb3IgY2FsIGluIHJvdykKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShoZWlnaHQpOgorICAgICAgICAgICAgICAgIHdlZWtzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgY2FsIGluIHJvdzoKKyAgICAgICAgICAgICAgICAgICAgaWYgaiA+PSBsZW4oY2FsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZCgnJykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZChzZWxmLmZvcm1hdHdlZWsoY2FsW2pdLCB3KSkKKyAgICAgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyh3ZWVrcywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgICAgIGEoJ1xuJyAqIGwpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgcHJ5ZWFyKHNlbGYsIHRoZXllYXIsIHc9MCwgbD0wLCBjPTYsIG09Myk6CisgICAgICAgICIiIlByaW50IGEgeWVhcidzIGNhbGVuZGFyLiIiIgorICAgICAgICBwcmludCBzZWxmLmZvcm1hdHllYXIodGhleWVhciwgdywgbCwgYywgbSkKKworCitjbGFzcyBIVE1MQ2FsZW5kYXIoQ2FsZW5kYXIpOgorICAgICIiIgorICAgIFRoaXMgY2FsZW5kYXIgcmV0dXJucyBjb21wbGV0ZSBIVE1MIHBhZ2VzLgorICAgICIiIgorCisgICAgIyBDU1MgY2xhc3NlcyBmb3IgdGhlIGRheSA8dGQ+cworICAgIGNzc2NsYXNzZXMgPSBbIm1vbiIsICJ0dWUiLCAid2VkIiwgInRodSIsICJmcmkiLCAic2F0IiwgInN1biJdCisKKyAgICBkZWYgZm9ybWF0ZGF5KHNlbGYsIGRheSwgd2Vla2RheSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBkYXkgYXMgYSB0YWJsZSBjZWxsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZGF5ID09IDA6CisgICAgICAgICAgICByZXR1cm4gJzx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+JyAjIGRheSBvdXRzaWRlIG1vbnRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJzx0ZCBjbGFzcz0iJXMiPiVkPC90ZD4nICUgKHNlbGYuY3NzY2xhc3Nlc1t3ZWVrZGF5XSwgZGF5KQorCisgICAgZGVmIGZvcm1hdHdlZWsoc2VsZiwgdGhld2Vlayk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBjb21wbGV0ZSB3ZWVrIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcnLmpvaW4oc2VsZi5mb3JtYXRkYXkoZCwgd2QpIGZvciAoZCwgd2QpIGluIHRoZXdlZWspCisgICAgICAgIHJldHVybiAnPHRyPiVzPC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHdlZWtkYXkgbmFtZSBhcyBhIHRhYmxlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAnPHRoIGNsYXNzPSIlcyI+JXM8L3RoPicgJSAoc2VsZi5jc3NjbGFzc2VzW2RheV0sIGRheV9hYmJyW2RheV0pCisKKyAgICBkZWYgZm9ybWF0d2Vla2hlYWRlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGhlYWRlciBmb3IgYSB3ZWVrIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcnLmpvaW4oc2VsZi5mb3JtYXR3ZWVrZGF5KGkpIGZvciBpIGluIHNlbGYuaXRlcndlZWtkYXlzKCkpCisgICAgICAgIHJldHVybiAnPHRyPiVzPC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtb250aCBuYW1lIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICBzID0gJyVzICVzJyAlIChtb250aF9uYW1lW3RoZW1vbnRoXSwgdGhleWVhcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSAnJXMnICUgbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgcmV0dXJuICc8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+JXM8L3RoPjwvdHI+JyAlIHMKKworICAgIGRlZiBmb3JtYXRtb250aChzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgbW9udGggYXMgYSB0YWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYSgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPicpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdG1vbnRobmFtZSh0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9d2l0aHllYXIpKQorICAgICAgICBhKCdcbicpCisgICAgICAgIGEoc2VsZi5mb3JtYXR3ZWVraGVhZGVyKCkpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgZm9yIHdlZWsgaW4gc2VsZi5tb250aGRheXMyY2FsZW5kYXIodGhleWVhciwgdGhlbW9udGgpOgorICAgICAgICAgICAgYShzZWxmLmZvcm1hdHdlZWsod2VlaykpCisgICAgICAgICAgICBhKCdcbicpCisgICAgICAgIGEoJzwvdGFibGU+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICByZXR1cm4gJycuam9pbih2KQorCisgICAgZGVmIGZvcm1hdHllYXIoc2VsZiwgdGhleWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgeWVhciBhcyBhIHRhYmxlIG9mIHRhYmxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgd2lkdGggPSBtYXgod2lkdGgsIDEpCisgICAgICAgIGEoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InllYXIiPicpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYSgnPHRyPjx0aCBjb2xzcGFuPSIlZCIgY2xhc3M9InllYXIiPiVzPC90aD48L3RyPicgJSAod2lkdGgsIHRoZXllYXIpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMiwgd2lkdGgpOgorICAgICAgICAgICAgIyBtb250aHMgaW4gdGhpcyByb3cKKyAgICAgICAgICAgIG1vbnRocyA9IHhyYW5nZShpLCBtaW4oaSt3aWR0aCwgMTMpKQorICAgICAgICAgICAgYSgnPHRyPicpCisgICAgICAgICAgICBmb3IgbSBpbiBtb250aHM6CisgICAgICAgICAgICAgICAgYSgnPHRkPicpCisgICAgICAgICAgICAgICAgYShzZWxmLmZvcm1hdG1vbnRoKHRoZXllYXIsIG0sIHdpdGh5ZWFyPUZhbHNlKSkKKyAgICAgICAgICAgICAgICBhKCc8L3RkPicpCisgICAgICAgICAgICBhKCc8L3RyPicpCisgICAgICAgIGEoJzwvdGFibGU+JykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikKKworICAgIGRlZiBmb3JtYXR5ZWFycGFnZShzZWxmLCB0aGV5ZWFyLCB3aWR0aD0zLCBjc3M9J2NhbGVuZGFyLmNzcycsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIHllYXIgYXMgYSBjb21wbGV0ZSBIVE1MIHBhZ2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIlcyI/PlxuJyAlIGVuY29kaW5nKQorICAgICAgICBhKCc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+XG4nKQorICAgICAgICBhKCc8aHRtbD5cbicpCisgICAgICAgIGEoJzxoZWFkPlxuJykKKyAgICAgICAgYSgnPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JXMiIC8+XG4nICUgZW5jb2RpbmcpCisgICAgICAgIGlmIGNzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGEoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IiVzIiAvPlxuJyAlIGNzcykKKyAgICAgICAgYSgnPHRpdGxlPkNhbGVuZGFyIGZvciAlZDwvdGl0bGVcbicgJSB0aGV5ZWFyKQorICAgICAgICBhKCc8L2hlYWQ+XG4nKQorICAgICAgICBhKCc8Ym9keT5cbicpCisgICAgICAgIGEoc2VsZi5mb3JtYXR5ZWFyKHRoZXllYXIsIHdpZHRoKSkKKyAgICAgICAgYSgnPC9ib2R5PlxuJykKKyAgICAgICAgYSgnPC9odG1sPlxuJykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikuZW5jb2RlKGVuY29kaW5nLCAieG1sY2hhcnJlZnJlcGxhY2UiKQorCisKK2NsYXNzIFRpbWVFbmNvZGluZzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxlKToKKyAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKKworICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYub2xkbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSwgc2VsZi5sb2NhbGUpCisgICAgICAgIHJldHVybiBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FKVsxXQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSwgc2VsZi5vbGRsb2NhbGUpCisKKworY2xhc3MgTG9jYWxlVGV4dENhbGVuZGFyKFRleHRDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3aWxsIHJldHVybgorICAgIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLiBJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcworICAgIGFuIGVuY29kaW5nIGFsbCBzdHJpbmdzIGNvbnRhaW5pbmcgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgd2lsbCBiZSByZXR1cm5lZAorICAgIGFzIHVuaWNvZGUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTAsIGxvY2FsZT1Ob25lKToKKyAgICAgICAgVGV4dENhbGVuZGFyLl9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheSkKKyAgICAgICAgaWYgbG9jYWxlIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpCisgICAgICAgIHNlbGYubG9jYWxlID0gbG9jYWxlCisKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXksIHdpZHRoKToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgaWYgd2lkdGggPj0gOToKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGRheV9uYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWVzID0gZGF5X2FiYnIKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lc1tkYXldCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICByZXR1cm4gbmFtZVs6d2lkdGhdLmNlbnRlcih3aWR0aCkKKworICAgIGRlZiBmb3JtYXRtb250aG5hbWUoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpZHRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgcyA9IG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gcy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgICAgICBzID0gIiVzICVyIiAlIChzLCB0aGV5ZWFyKQorICAgICAgICAgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoKQorCisKK2NsYXNzIExvY2FsZUhUTUxDYWxlbmRhcihIVE1MQ2FsZW5kYXIpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgd2lsbCByZXR1cm4KKyAgICBtb250aCBhbmQgd2Vla2RheSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZS4gSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMKKyAgICBhbiBlbmNvZGluZyBhbGwgc3RyaW5ncyBjb250YWluaW5nIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICBhcyB1bmljb2RlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXk9MCwgbG9jYWxlPU5vbmUpOgorICAgICAgICBIVE1MQ2FsZW5kYXIuX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5KQorICAgICAgICBpZiBsb2NhbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKCkKKyAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKKworICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBkYXlfYWJicltkYXldCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gcy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICByZXR1cm4gJzx0aCBjbGFzcz0iJXMiPiVzPC90aD4nICUgKHNlbGYuY3NzY2xhc3Nlc1tkYXldLCBzKQorCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICAgICAgcyA9ICclcyAlcycgJSAocywgdGhleWVhcikKKyAgICAgICAgICAgIHJldHVybiAnPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPiVzPC90aD48L3RyPicgJSBzCisKKworIyBTdXBwb3J0IGZvciBvbGQgbW9kdWxlIGxldmVsIGludGVyZmFjZQorYyA9IFRleHRDYWxlbmRhcigpCisKK2ZpcnN0d2Vla2RheSA9IGMuZ2V0Zmlyc3R3ZWVrZGF5CisKK2RlZiBzZXRmaXJzdHdlZWtkYXkoZmlyc3R3ZWVrZGF5KToKKyAgICBpZiBub3QgTU9OREFZIDw9IGZpcnN0d2Vla2RheSA8PSBTVU5EQVk6CisgICAgICAgIHJhaXNlIElsbGVnYWxXZWVrZGF5RXJyb3IoZmlyc3R3ZWVrZGF5KQorICAgIGMuZmlyc3R3ZWVrZGF5ID0gZmlyc3R3ZWVrZGF5CisKK21vbnRoY2FsZW5kYXIgPSBjLm1vbnRoZGF5c2NhbGVuZGFyCitwcndlZWsgPSBjLnByd2Vlaword2VlayA9IGMuZm9ybWF0d2Vlaword2Vla2hlYWRlciA9IGMuZm9ybWF0d2Vla2hlYWRlcgorcHJtb250aCA9IGMucHJtb250aAorbW9udGggPSBjLmZvcm1hdG1vbnRoCitjYWxlbmRhciA9IGMuZm9ybWF0eWVhcgorcHJjYWwgPSBjLnByeWVhcgorCisKKyMgU3BhY2luZyBvZiBtb250aCBjb2x1bW5zIGZvciBtdWx0aS1jb2x1bW4geWVhciBjYWxlbmRhcgogX2NvbHdpZHRoID0gNyozIC0gMSAgICAgICAgICMgQW1vdW50IHByaW50ZWQgYnkgcHJ3ZWVrKCkKIF9zcGFjaW5nID0gNiAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBzcGFjZXMgYmV0d2VlbiBjb2x1bW5zCiAKLWRlZiBmb3JtYXQzYyhhLCBiLCBjLCBjb2x3aWR0aD1fY29sd2lkdGgsIHNwYWNpbmc9X3NwYWNpbmcpOgotICAgICIiIlByaW50cyAzLWNvbHVtbiBmb3JtYXR0aW5nIGZvciB5ZWFyIGNhbGVuZGFycyIiIgotICAgIHByaW50IGZvcm1hdDNjc3RyaW5nKGEsIGIsIGMsIGNvbHdpZHRoLCBzcGFjaW5nKQogCi1kZWYgZm9ybWF0M2NzdHJpbmcoYSwgYiwgYywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKLSAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIGZvcm1hdHRlZCBmcm9tIDMgc3RyaW5ncywgY2VudGVyZWQgd2l0aGluIDMgY29sdW1ucy4iIiIKLSAgICByZXR1cm4gKGEuY2VudGVyKGNvbHdpZHRoKSArICcgJyAqIHNwYWNpbmcgKyBiLmNlbnRlcihjb2x3aWR0aCkgKwotICAgICAgICAgICAgJyAnICogc3BhY2luZyArIGMuY2VudGVyKGNvbHdpZHRoKSkKK2RlZiBmb3JtYXQoY29scywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKKyAgICAiIiJQcmludHMgbXVsdGktY29sdW1uIGZvcm1hdHRpbmcgZm9yIHllYXIgY2FsZW5kYXJzIiIiCisgICAgcHJpbnQgZm9ybWF0c3RyaW5nKGNvbHMsIGNvbHdpZHRoLCBzcGFjaW5nKQogCi1kZWYgcHJjYWwoeWVhciwgdz0wLCBsPTAsIGM9X3NwYWNpbmcpOgotICAgICIiIlByaW50IGEgeWVhcidzIGNhbGVuZGFyLiIiIgotICAgIHByaW50IGNhbGVuZGFyKHllYXIsIHcsIGwsIGMpLAogCi1kZWYgY2FsZW5kYXIoeWVhciwgdz0wLCBsPTAsIGM9X3NwYWNpbmcpOgotICAgICIiIlJldHVybnMgYSB5ZWFyJ3MgY2FsZW5kYXIgYXMgYSBtdWx0aS1saW5lIHN0cmluZy4iIiIKLSAgICB3ID0gbWF4KDIsIHcpCi0gICAgbCA9IG1heCgxLCBsKQotICAgIGMgPSBtYXgoMiwgYykKLSAgICBjb2x3aWR0aCA9ICh3ICsgMSkgKiA3IC0gMQotICAgIHMgPSByZXByKHllYXIpLmNlbnRlcihjb2x3aWR0aCAqIDMgKyBjICogMikucnN0cmlwKCkgKyAnXG4nICogbAotICAgIGhlYWRlciA9IHdlZWtoZWFkZXIodykKLSAgICBoZWFkZXIgPSBmb3JtYXQzY3N0cmluZyhoZWFkZXIsIGhlYWRlciwgaGVhZGVyLCBjb2x3aWR0aCwgYykucnN0cmlwKCkKLSAgICBmb3IgcSBpbiByYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyLCAzKToKLSAgICAgICAgcyA9IChzICsgJ1xuJyAqIGwgKwotICAgICAgICAgICAgIGZvcm1hdDNjc3RyaW5nKG1vbnRoX25hbWVbcV0sIG1vbnRoX25hbWVbcSsxXSwgbW9udGhfbmFtZVtxKzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSArCi0gICAgICAgICAgICAgJ1xuJyAqIGwgKyBoZWFkZXIgKyAnXG4nICogbCkKLSAgICAgICAgZGF0YSA9IFtdCi0gICAgICAgIGhlaWdodCA9IDAKLSAgICAgICAgZm9yIGFtb250aCBpbiByYW5nZShxLCBxICsgMyk6Ci0gICAgICAgICAgICBjYWwgPSBtb250aGNhbGVuZGFyKHllYXIsIGFtb250aCkKLSAgICAgICAgICAgIGlmIGxlbihjYWwpID4gaGVpZ2h0OgotICAgICAgICAgICAgICAgIGhlaWdodCA9IGxlbihjYWwpCi0gICAgICAgICAgICBkYXRhLmFwcGVuZChjYWwpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGhlaWdodCk6Ci0gICAgICAgICAgICB3ZWVrcyA9IFtdCi0gICAgICAgICAgICBmb3IgY2FsIGluIGRhdGE6Ci0gICAgICAgICAgICAgICAgaWYgaSA+PSBsZW4oY2FsKToKLSAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKCcnKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZCh3ZWVrKGNhbFtpXSwgdykpCi0gICAgICAgICAgICBzID0gcyArIGZvcm1hdDNjc3RyaW5nKHdlZWtzWzBdLCB3ZWVrc1sxXSwgd2Vla3NbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSArICdcbicgKiBsCi0gICAgcmV0dXJuIHNbOi1sXSArICdcbicKK2RlZiBmb3JtYXRzdHJpbmcoY29scywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIGZvcm1hdHRlZCBmcm9tIG4gc3RyaW5ncywgY2VudGVyZWQgd2l0aGluIG4gY29sdW1ucy4iIiIKKyAgICBzcGFjaW5nICo9ICcgJworICAgIHJldHVybiBzcGFjaW5nLmpvaW4oYy5jZW50ZXIoY29sd2lkdGgpIGZvciBjIGluIGNvbHMpCisKIAogRVBPQ0ggPSAxOTcwCiBfRVBPQ0hfT1JEID0gZGF0ZXRpbWUuZGF0ZShFUE9DSCwgMSwgMSkudG9vcmRpbmFsKCkKIAorCiBkZWYgdGltZWdtKHR1cGxlKToKICAgICAiIiJVbnJlbGF0ZWQgYnV0IGhhbmR5IGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBVbml4IHRpbWVzdGFtcCBmcm9tIEdNVC4iIiIKICAgICB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCA9IHR1cGxlWzo2XQpAQCAtMjI5LDMgKzYwOCw5NyBAQAogICAgIG1pbnV0ZXMgPSBob3Vycyo2MCArIG1pbnV0ZQogICAgIHNlY29uZHMgPSBtaW51dGVzKjYwICsgc2Vjb25kCiAgICAgcmV0dXJuIHNlY29uZHMKKworCitkZWYgbWFpbihhcmdzKToKKyAgICBpbXBvcnQgb3B0cGFyc2UKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9InVzYWdlOiAlcHJvZyBbb3B0aW9uc10gW3llYXIgW21vbnRoXV0iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXciLCAiLS13aWR0aCIsCisgICAgICAgIGRlc3Q9IndpZHRoIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0yLAorICAgICAgICBoZWxwPSJ3aWR0aCBvZiBkYXRlIGNvbHVtbiAoZGVmYXVsdCAyLCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1sIiwgIi0tbGluZXMiLAorICAgICAgICBkZXN0PSJsaW5lcyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MSwKKyAgICAgICAgaGVscD0ibnVtYmVyIG9mIGxpbmVzIGZvciBlYWNoIHdlZWsgKGRlZmF1bHQgMSwgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItcyIsICItLXNwYWNpbmciLAorICAgICAgICBkZXN0PSJzcGFjaW5nIiwgdHlwZT0iaW50IiwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLW0iLCAiLS1tb250aHMiLAorICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLWMiLCAiLS1jc3MiLAorICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1MIiwgIi0tbG9jYWxlIiwKKyAgICAgICAgZGVzdD0ibG9jYWxlIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICBoZWxwPSJsb2NhbGUgdG8gYmUgdXNlZCBmcm9tIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAorICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXQiLCAiLS10eXBlIiwKKyAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBjaG9pY2VzPSgidGV4dCIsICJodG1sIiksCisgICAgICAgIGhlbHA9Im91dHB1dCB0eXBlICh0ZXh0IG9yIGh0bWwpIgorICAgICkKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisKKyAgICBpZiBvcHRpb25zLmxvY2FsZSBhbmQgbm90IG9wdGlvbnMuZW5jb2Rpbmc6CisgICAgICAgIHBhcnNlci5lcnJvcigiaWYgLS1sb2NhbGUgaXMgc3BlY2lmaWVkIC0tZW5jb2RpbmcgaXMgcmVxdWlyZWQiKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaWYgb3B0aW9ucy50eXBlID09ICJodG1sIjoKKyAgICAgICAgaWYgb3B0aW9ucy5sb2NhbGU6CisgICAgICAgICAgICBjYWwgPSBMb2NhbGVIVE1MQ2FsZW5kYXIobG9jYWxlPW9wdGlvbnMubG9jYWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FsID0gSFRNTENhbGVuZGFyKCkKKyAgICAgICAgZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIHByaW50IGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgcHJpbnQgY2FsLmZvcm1hdHllYXJwYWdlKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVsc2U6CisgICAgICAgIGlmIG9wdGlvbnMubG9jYWxlOgorICAgICAgICAgICAgY2FsID0gTG9jYWxlVGV4dENhbGVuZGFyKGxvY2FsZT1vcHRpb25zLmxvY2FsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhbCA9IFRleHRDYWxlbmRhcigpCisgICAgICAgIG9wdGRpY3QgPSBkaWN0KHc9b3B0aW9ucy53aWR0aCwgbD1vcHRpb25zLmxpbmVzKQorICAgICAgICBpZiBsZW4oYXJncykgIT0gMzoKKyAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZworICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0eWVhcihkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgoaW50KGFyZ3NbMV0pLCBpbnQoYXJnc1syXSksICoqb3B0ZGljdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgaWYgb3B0aW9ucy5lbmNvZGluZzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5lbmNvZGUob3B0aW9ucy5lbmNvZGluZykKKyAgICAgICAgcHJpbnQgcmVzdWx0CisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvTGliL2NvZGVjcy5weSBiL0xpYi9jb2RlY3MucHkKaW5kZXggMjg4NTZjNy4uMTUxOGQ3NSAxMDA2NDQKLS0tIGEvTGliL2NvZGVjcy5weQorKysgYi9MaWIvY29kZWNzLnB5CkBAIC0xNCw4ICsxNCw3IEBACiB0cnk6CiAgICAgZnJvbSBfY29kZWNzIGltcG9ydCAqCiBleGNlcHQgSW1wb3J0RXJyb3IsIHdoeToKLSAgICByYWlzZSBTeXN0ZW1FcnJvcixcCi0gICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIHRoZSBidWlsdGluIGNvZGVjczogJXMnICUgd2h5CisgICAgcmFpc2UgU3lzdGVtRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHRoZSBidWlsdGluIGNvZGVjczogJXMnICUgd2h5KQogCiBfX2FsbF9fID0gWyJyZWdpc3RlciIsICJsb29rdXAiLCAib3BlbiIsICJFbmNvZGVkRmlsZSIsICJCT00iLCAiQk9NX0JFIiwKICAgICAgICAgICAgIkJPTV9MRSIsICJCT00zMl9CRSIsICJCT00zMl9MRSIsICJCT002NF9CRSIsICJCT002NF9MRSIsCkBAIC0xNTYsMTMgKzE1NSwxMyBAQAogCiBjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIob2JqZWN0KToKICAgICAiIiIKLSAgICBBIEluY3JlbWVudGFsRW5jb2RlciBlbmNvZGVzIGFuIGlucHV0IGluIG11bHRpcGxlIHN0ZXBzLiBUaGUgaW5wdXQgY2FuIGJlCisgICAgQW4gSW5jcmVtZW50YWxFbmNvZGVyIGVuY29kZXMgYW4gaW5wdXQgaW4gbXVsdGlwbGUgc3RlcHMuIFRoZSBpbnB1dCBjYW4gYmUKICAgICBwYXNzZWQgcGllY2UgYnkgcGllY2UgdG8gdGhlIGVuY29kZSgpIG1ldGhvZC4gVGhlIEluY3JlbWVudGFsRW5jb2RlciByZW1lbWJlcnMKICAgICB0aGUgc3RhdGUgb2YgdGhlIEVuY29kaW5nIHByb2Nlc3MgYmV0d2VlbiBjYWxscyB0byBlbmNvZGUoKS4KICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICAgIiIiCi0gICAgICAgIENyZWF0ZXMgYSBJbmNyZW1lbnRhbEVuY29kZXIgaW5zdGFuY2UuCisgICAgICAgIENyZWF0ZXMgYW4gSW5jcmVtZW50YWxFbmNvZGVyIGluc3RhbmNlLgogCiAgICAgICAgIFRoZSBJbmNyZW1lbnRhbEVuY29kZXIgbWF5IHVzZSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lcyBieQogICAgICAgICBwcm92aWRpbmcgdGhlIGVycm9ycyBrZXl3b3JkIGFyZ3VtZW50LiBTZWUgdGhlIG1vZHVsZSBkb2NzdHJpbmcKQEAgLTE4Miw2ICsxODEsMzMgQEAKICAgICAgICAgUmVzZXRzIHRoZSBlbmNvZGVyIHRvIHRoZSBpbml0aWFsIHN0YXRlLgogICAgICAgICAiIiIKIAorY2xhc3MgQnVmZmVyZWRJbmNyZW1lbnRhbEVuY29kZXIoSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICAiIiIKKyAgICBUaGlzIHN1YmNsYXNzIG9mIEluY3JlbWVudGFsRW5jb2RlciBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZWNsYXNzIGZvciBhbgorICAgIGluY3JlbWVudGFsIGVuY29kZXIgaWYgdGhlIGVuY29kZXIgbXVzdCBrZWVwIHNvbWUgb2YgdGhlIG91dHB1dCBpbiBhCisgICAgYnVmZmVyIGJldHdlZW4gY2FsbHMgdG8gZW5jb2RlKCkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIEluY3JlbWVudGFsRW5jb2Rlci5fX2luaXRfXyhzZWxmLCBlcnJvcnMpCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIgIyB1bmVuY29kZWQgaW5wdXQgdGhhdCBpcyBrZXB0IGJldHdlZW4gY2FsbHMgdG8gZW5jb2RlKCkKKworICAgIGRlZiBfYnVmZmVyX2VuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzLCBmaW5hbCk6CisgICAgICAgICMgT3ZlcndyaXRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNzZXM6IEl0IG11c3QgZW5jb2RlIGlucHV0CisgICAgICAgICMgYW5kIHJldHVybiBhbiAob3V0cHV0LCBsZW5ndGggY29uc3VtZWQpIHR1cGxlCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgIyBlbmNvZGUgaW5wdXQgKHRha2luZyB0aGUgYnVmZmVyIGludG8gYWNjb3VudCkKKyAgICAgICAgZGF0YSA9IHNlbGYuYnVmZmVyICsgaW5wdXQKKyAgICAgICAgKHJlc3VsdCwgY29uc3VtZWQpID0gc2VsZi5fYnVmZmVyX2VuY29kZShkYXRhLCBzZWxmLmVycm9ycywgZmluYWwpCisgICAgICAgICMga2VlcCB1bmVuY29kZWQgaW5wdXQgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICBzZWxmLmJ1ZmZlciA9IGRhdGFbY29uc3VtZWQ6XQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIEluY3JlbWVudGFsRW5jb2Rlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisKIGNsYXNzIEluY3JlbWVudGFsRGVjb2RlcihvYmplY3QpOgogICAgICIiIgogICAgIEFuIEluY3JlbWVudGFsRGVjb2RlciBkZWNvZGVzIGFuIGlucHV0IGluIG11bHRpcGxlIHN0ZXBzLiBUaGUgaW5wdXQgY2FuIGJlCkBAIC0yMzQsNyArMjYwLDcgQEAKIAogICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICAgSW5jcmVtZW50YWxEZWNvZGVyLnJlc2V0KHNlbGYpCi0gICAgICAgIHNlbGYuYnl0ZWJ1ZmZlciA9ICIiCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKIAogIwogIyBUaGUgU3RyZWFtV3JpdGVyIGFuZCBTdHJlYW1SZWFkZXIgY2xhc3MgcHJvdmlkZSBnZW5lcmljIHdvcmtpbmcKZGlmZiAtLWdpdCBhL0xpYi9jb250ZXh0bGliLnB5IGIvTGliL2NvbnRleHRsaWIucHkKaW5kZXggMGE1ZDYwOC4uYWE1MzM1ZCAxMDA2NDQKLS0tIGEvTGliL2NvbnRleHRsaWIucHkKKysrIGIvTGliL2NvbnRleHRsaWIucHkKQEAgLTMwLDkgKzMwLDIyIEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5nZW4udGhyb3codHlwZSwgdmFsdWUsIHRyYWNlYmFjaykKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImdlbmVyYXRvciBkaWRuJ3Qgc3RvcCBhZnRlciB0aHJvdygpIikKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uLCBleGM6CisgICAgICAgICAgICAgICAgIyBTdXBwcmVzcyB0aGUgZXhjZXB0aW9uICp1bmxlc3MqIGl0J3MgdGhlIHNhbWUgZXhjZXB0aW9uIHRoYXQKKyAgICAgICAgICAgICAgICAjIHdhcyBwYXNzZWQgdG8gdGhyb3coKS4gIFRoaXMgcHJldmVudHMgYSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgIyByYWlzZWQgaW5zaWRlIHRoZSAid2l0aCIgc3RhdGVtZW50IGZyb20gYmVpbmcgc3VwcHJlc3NlZAorICAgICAgICAgICAgICAgIHJldHVybiBleGMgaXMgbm90IHZhbHVlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBvbmx5IHJlLXJhaXNlIGlmIGl0J3MgKm5vdCogdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcworICAgICAgICAgICAgICAgICMgcGFzc2VkIHRvIHRocm93KCksIGJlY2F1c2UgX19leGl0X18oKSBtdXN0IG5vdCByYWlzZQorICAgICAgICAgICAgICAgICMgYW4gZXhjZXB0aW9uIHVubGVzcyBfX2V4aXRfXygpIGl0c2VsZiBmYWlsZWQuICBCdXQgdGhyb3coKQorICAgICAgICAgICAgICAgICMgaGFzIHRvIHJhaXNlIHRoZSBleGNlcHRpb24gdG8gc2lnbmFsIHByb3BhZ2F0aW9uLCBzbyB0aGlzCisgICAgICAgICAgICAgICAgIyBmaXhlcyB0aGUgaW1wZWRhbmNlIG1pc21hdGNoIGJldHdlZW4gdGhlIHRocm93KCkgcHJvdG9jb2wKKyAgICAgICAgICAgICAgICAjIGFuZCB0aGUgX19leGl0X18oKSBwcm90b2NvbC4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgaWYgc3lzLmV4Y19pbmZvKClbMV0gaXMgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQogCiAKIGRlZiBjb250ZXh0bWFuYWdlcihmdW5jKToKQEAgLTY4LDYgKzgxLDcgQEAKICAgICB0cnk6CiAgICAgICAgIGhlbHBlci5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KICAgICAgICAgaGVscGVyLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICAgICAgaGVscGVyLl9fZGljdF9fID0gZnVuYy5fX2RpY3RfXwogICAgIGV4Y2VwdDoKICAgICAgICAgcGFzcwogICAgIHJldHVybiBoZWxwZXIKZGlmZiAtLWdpdCBhL0xpYi9jb3B5X3JlZy5weSBiL0xpYi9jb3B5X3JlZy5weQppbmRleCAxNjk1MjBkLi5mNDY2MWVkIDEwMDY0NAotLS0gYS9MaWIvY29weV9yZWcucHkKKysrIGIvTGliL2NvcHlfcmVnLnB5CkBAIC0xMTEsOCArMTExLDE5IEBACiAgICAgICAgICMgU2xvdHMgZm91bmQgLS0gZ2F0aGVyIHNsb3QgbmFtZXMgZnJvbSBhbGwgYmFzZSBjbGFzc2VzCiAgICAgICAgIGZvciBjIGluIGNscy5fX21yb19fOgogICAgICAgICAgICAgaWYgIl9fc2xvdHNfXyIgaW4gYy5fX2RpY3RfXzoKLSAgICAgICAgICAgICAgICBuYW1lcyArPSBbbmFtZSBmb3IgbmFtZSBpbiBjLl9fZGljdF9fWyJfX3Nsb3RzX18iXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluICgiX19kaWN0X18iLCAiX193ZWFrcmVmX18iKV0KKyAgICAgICAgICAgICAgICBzbG90cyA9IGMuX19kaWN0X19bJ19fc2xvdHNfXyddCisgICAgICAgICAgICAgICAgIyBpZiBjbGFzcyBoYXMgYSBzaW5nbGUgc2xvdCwgaXQgY2FuIGJlIGdpdmVuIGFzIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgIHNsb3RzID0gKHNsb3RzLCkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzbG90czoKKyAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIGRlc2NyaXB0b3JzCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gKCJfX2RpY3RfXyIsICJfX3dlYWtyZWZfXyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIyBtYW5nbGVkIG5hbWVzCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBub3QgbmFtZS5lbmRzd2l0aCgnX18nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZCgnXyVzJXMnICUgKGMuX19uYW1lX18sIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKG5hbWUpCiAKICAgICAjIENhY2hlIHRoZSBvdXRjb21lIGluIHRoZSBjbGFzcyBpZiBhdCBhbGwgcG9zc2libGUKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCBkZDBmNjQwLi4yOGFjMTgwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTksMTEgKzksNyBAQAogZnJvbSBfY3R5cGVzIGltcG9ydCBfUG9pbnRlcgogZnJvbSBfY3R5cGVzIGltcG9ydCBDRnVuY1B0ciBhcyBfQ0Z1bmNQdHIKIGZyb20gX2N0eXBlcyBpbXBvcnQgX192ZXJzaW9uX18gYXMgX2N0eXBlc192ZXJzaW9uCi10cnk6Ci0gICAgZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAotZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgotICAgIFJUTERfR0xPQkFMID0gUlRMRF9MT0NBTCA9IE5vbmUKLQorZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAogZnJvbSBfY3R5cGVzIGltcG9ydCBBcmd1bWVudEVycm9yCiAKIGZyb20gc3RydWN0IGltcG9ydCBjYWxjc2l6ZSBhcyBfY2FsY3NpemUKQEAgLTMwNCwxMCArMzAwLDExIEBACiAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQogICAgICAgICByZXR1cm4gc2VsZi5fX2dldGl0ZW1fXyhuYW1lKQogCi0gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgotICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cihuYW1lLCBzZWxmKQotICAgICAgICBmdW5jLl9fbmFtZV9fID0gbmFtZQotICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCk6CisgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKChuYW1lX29yX29yZGluYWwsIHNlbGYpKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lX29yX29yZGluYWwsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lX29yX29yZGluYWwKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZV9vcl9vcmRpbmFsLCBmdW5jKQogICAgICAgICByZXR1cm4gZnVuYwogCiBjbGFzcyBQeURMTChDRExMKToKQEAgLTM4NCwyMSArMzgxLDI5IEBACiAKIF9wb2ludGVyX3R5cGVfY2FjaGVbTm9uZV0gPSBjX3ZvaWRfcAogCi0jIGZ1bmN0aW9ucwotCi1mcm9tIF9jdHlwZXMgaW1wb3J0IF9tZW1tb3ZlX2FkZHIsIF9tZW1zZXRfYWRkciwgX3N0cmluZ19hdF9hZGRyLCBjYXN0Ci0KIGlmIHNpemVvZihjX3VpbnQpID09IHNpemVvZihjX3ZvaWRfcCk6CiAgICAgY19zaXplX3QgPSBjX3VpbnQKIGVsaWYgc2l6ZW9mKGNfdWxvbmcpID09IHNpemVvZihjX3ZvaWRfcCk6CiAgICAgY19zaXplX3QgPSBjX3Vsb25nCiAKKyMgZnVuY3Rpb25zCisKK2Zyb20gX2N0eXBlcyBpbXBvcnQgX21lbW1vdmVfYWRkciwgX21lbXNldF9hZGRyLCBfc3RyaW5nX2F0X2FkZHIsIF9jYXN0X2FkZHIKKwogIyMgdm9pZCAqbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKIG1lbW1vdmUgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdm9pZF9wLCBjX3ZvaWRfcCwgY19zaXplX3QpKF9tZW1tb3ZlX2FkZHIpCiAKICMjIHZvaWQgKm1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KQogbWVtc2V0ID0gQ0ZVTkNUWVBFKGNfdm9pZF9wLCBjX3ZvaWRfcCwgY19pbnQsIGNfc2l6ZV90KShfbWVtc2V0X2FkZHIpCiAKK2RlZiBQWUZVTkNUWVBFKHJlc3R5cGUsICphcmd0eXBlcyk6CisgICAgY2xhc3MgQ0Z1bmN0aW9uVHlwZShfQ0Z1bmNQdHIpOgorICAgICAgICBfYXJndHlwZXNfID0gYXJndHlwZXMKKyAgICAgICAgX3Jlc3R5cGVfID0gcmVzdHlwZQorICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQorICAgIHJldHVybiBDRnVuY3Rpb25UeXBlCitjYXN0ID0gUFlGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBweV9vYmplY3QpKF9jYXN0X2FkZHIpCisKIF9zdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKIGRlZiBzdHJpbmdfYXQocHRyLCBzaXplPTApOgogICAgICIiInN0cmluZ19hdChhZGRyWywgc2l6ZV0pIC0+IHN0cmluZwpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9fbG9hZGVyLnB5IGIvTGliL2N0eXBlcy9fbG9hZGVyLnB5CmluZGV4IDdiZGU2YzYuLjdhNDhjMWMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvX2xvYWRlci5weQorKysgYi9MaWIvY3R5cGVzL19sb2FkZXIucHkKQEAgLTEsMTQgKzEsMTEgQEAKLSMgV09SSyBJTiBQUk9HUkVTUyEgIERPIE5PVCAoeWV0KSBVU0UhCiBpbXBvcnQgc3lzLCBvcwogaW1wb3J0IGN0eXBlcwogCi1fX2FsbF9fID0gWyJMaWJyYXJ5TG9hZGVyIiwgIlJUTERfTE9DQUwiLCAiUlRMRF9HTE9CQUwiXQotCiBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5IGFzIGRsb3BlbgotICAgIFJUTERfTE9DQUwgPSBSVExEX0dMT0JBTCA9IE5vbmUKIGVsc2U6Ci0gICAgZnJvbSBfY3R5cGVzIGltcG9ydCBkbG9wZW4sIFJUTERfTE9DQUwsIFJUTERfR0xPQkFMCisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBkbG9wZW4KK2Zyb20gX2N0eXBlcyBpbXBvcnQgUlRMRF9MT0NBTCwgUlRMRF9HTE9CQUwKIAogIyBfZmluZExpYihuYW1lKSByZXR1cm5zIGFuIGl0ZXJhYmxlIG9mIHBvc3NpYmxlIG5hbWVzIGZvciBhIGxpYnJhcnkuCiBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKQEAgLTU2LDcgKzUzLDEwIEBACiAgICAgICAgIGV4cHIgPSAnL1teXChcKVxzXSpsaWIlc1wuW15cKFwpXHNdKicgJSBuYW1lCiAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChleHByLCBvcy5wb3BlbignL3NiaW4vbGRjb25maWcgLXAgMj4vZGV2L251bGwnKS5yZWFkKCkpCiAgICAgICAgIGlmIG5vdCByZXM6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgY21kID0gJ2xkZCAlcyAyPi9kZXYvbnVsbCcgJSBzeXMuZXhlY3V0YWJsZQorICAgICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIG9zLnBvcGVuKGNtZCkucmVhZCgpKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDApCiAKICAgICBkZWYgX2dldF9zb25hbWUoZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CmluZGV4IDFiMzFmOTAuLmQwYWRhNDAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhci5fX2N0eXBlX2xlX18gaXMgY19jaGFyKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19jaGFyLl9fY3R5cGVfYmVfXyBpcyBjX2NoYXIpCiAKLSAgICBkZWYgdGVzdF9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMShzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKICAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKICAgICAgICAgZWxzZToKQEAgLTE5OCwxNyArMTk4LDIwIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgUywgIl9maWVsZHNfIiwgWygicyIsIFQpXSkKIAotICAgICMgY3Jhc2hlcyBvbiBzb2xhcmlzIHdpdGggYSBjb3JlIGR1bXAuCi0gICAgZGVmIFhfdGVzdF9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMihzZWxmKToKKyAgICAgICAgIyBzdGFuZGFyZCBwYWNraW5nIGluIHN0cnVjdCB1c2VzIG5vIGFsaWdubWVudC4KKyAgICAgICAgIyBTbywgd2UgaGF2ZSB0byBhbGlnbiB1c2luZyBwYWQgYnl0ZXMuCisgICAgICAgICMKKyAgICAgICAgIyBVbmFsaWduZWQgYWNjZXNzZXMgd2lsbCBjcmFzaCBQeXRob24gKG9uIHRob3NlIHBsYXRmb3JtcyB0aGF0CisgICAgICAgICMgZG9uJ3QgYWxsb3cgaXQsIGxpa2Ugc3BhcmMgc29sYXJpcykuCiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCi0gICAgICAgICAgICBmbXQgPSAiPmJoaWQiCisgICAgICAgICAgICBmbXQgPSAiPmJ4aGlkIgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQotICAgICAgICAgICAgZm10ID0gIjxiaGlkIgorICAgICAgICAgICAgZm10ID0gIjxieGhpZCIKIAogICAgICAgICBjbGFzcyBTKGJhc2UpOgotICAgICAgICAgICAgX3BhY2tfID0gMSAjIHN0cnVjdCB3aXRoICc8JyBvciAnPicgdXNlcyBzdGFuZGFyZCBhbGlnbm1lbnQuCiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBjX2J5dGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19zaG9ydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2ludCksCkBAIC0yMTgsNSArMjIxLDYwIEBACiAgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCiAKKyAgICBkZWYgdGVzdF91bmFsaWduZWRfbm9ubmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmIgaCB4aSB4ZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI8YiBoIHhpIHhkIgorCisgICAgICAgIGNsYXNzIFMoYmFzZSk6CisgICAgICAgICAgICBfcGFja18gPSAxCisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBjX2J5dGUpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2ludCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygpCisgICAgICAgIHMxLmIgPSAweDEyCisgICAgICAgIHMxLmggPSAweDEyMzQKKyAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKKyAgICAgICAgczEuZCA9IDMuMTQKKyAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMxKSwgYmluKHMyKSkKKworICAgIGRlZiB0ZXN0X3VuYWxpZ25lZF9uYXRpdmVfc3RydWN0X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIGZtdCA9ICI8YiBoIHhpIHhkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIj5iIGggeGkgeGQiCisKKyAgICAgICAgY2xhc3MgUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX3BhY2tfID0gMQorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19ieXRlKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19zaG9ydCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19pbnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8yIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfZG91YmxlKV0KKworICAgICAgICBzMSA9IFMoKQorICAgICAgICBzMS5iID0gMHgxMgorICAgICAgICBzMS5oID0gMHgxMjM0CisgICAgICAgIHMxLmkgPSAweDEyMzQ1Njc4CisgICAgICAgIHMxLmQgPSAzLjE0CisgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKaW5kZXggN2MyYjI4Yi4uNmUwNzk4ZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgIGlmIG5hbWVbOjJdID09ICdfXycgYW5kIG5hbWVbLTI6XSA9PSAnX18nOgogICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCi0gICAgICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cigic18iICsgbmFtZSwgc2VsZikKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKCgic18iICsgbmFtZSwgc2VsZikpCiAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCiAgICAgICAgICAgICByZXR1cm4gZnVuYwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CmluZGV4IDM5ZTcwZTMuLjczMThmMjkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC0xNDAsNSArMTQwLDEwIEBACiAgICAgICAgIHIuYVswXS54ID0gNDIKICAgICAgICAgci5hWzBdLnkgPSA5OQogCisgICAgICAgICMgdG8gYXZvaWQgbGVha2luZyB3aGVuIHRlc3RzIGFyZSBydW4gc2V2ZXJhbCB0aW1lcworICAgICAgICAjIGNsZWFuIHVwIHRoZSB0eXBlcyBsZWZ0IGluIHRoZSBjYWNoZS4KKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbUE9JTlRdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQppbmRleCA4MDU2NGI4Li40NTU4NDE3IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTIsNDAgKzIsNzIgQEAKIGltcG9ydCBzeXMsIHVuaXR0ZXN0CiBpbXBvcnQgb3MsIFN0cmluZ0lPCiAKK2xpYmNfbmFtZSA9IE5vbmUKK2lmIG9zLm5hbWUgPT0gIm50IjoKKyAgICBsaWJjX25hbWUgPSAibXN2Y3J0IgorZWxpZiBvcy5uYW1lID09ICJjZSI6CisgICAgbGliY19uYW1lID0gImNvcmVkbGwiCitlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBsaWJjX25hbWUgPSAibGliYy5keWxpYiIKK2VsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgorICAgIGxpYmNfbmFtZSA9ICJjeWd3aW4xLmRsbCIKK2Vsc2U6CisgICAgZm9yIGxpbmUgaW4gb3MucG9wZW4oImxkZCAlcyIgJSBzeXMuZXhlY3V0YWJsZSk6CisgICAgICAgIGlmICJsaWJjLnNvIiBpbiBsaW5lOgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJvcGVuYnNkMyI6CisgICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzRdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpYmNfbmFtZSA9IGxpbmUuc3BsaXQoKVsyXQorIyMgICAgICAgICAgICBwcmludCAibGliY19uYW1lIGlzIiwgbGliY19uYW1lCisgICAgICAgICAgICBicmVhaworCiBjbGFzcyBMb2FkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIHVua25vd25kbGwgPSAieHhyYW5kb21uYW1leHgiCiAKLSAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgotICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6Ci0gICAgICAgICAgICBuYW1lID0gIm1zdmNydCIKLSAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6Ci0gICAgICAgICAgICBuYW1lID0gImNvcmVkbGwiCi0gICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgICAgICAgICAgbmFtZSA9ICJsaWJjLmR5bGliIgotICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJmcmVlYnNkIik6Ci0gICAgICAgICAgICBuYW1lID0gImxpYmMuc28iCi0gICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJzdW5vczUiOgotICAgICAgICAgICAgbmFtZSA9ICJsaWJjLnNvIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9ICJsaWJjLnNvLjYiCi0gICAgICAgIGNkbGwubG9hZChuYW1lKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWQsIHNlbGYudW5rbm93bmRsbCkKKyAgICBpZiBsaWJjX25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgIGRlZiB0ZXN0X2xvYWQoc2VsZik6CisgICAgICAgICAgICBjZGxsLmxvYWQobGliY19uYW1lKQorICAgICAgICAgICAgY2RsbC5sb2FkKG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZCwgc2VsZi51bmtub3duZGxsKQogCi0gICAgZGVmIHRlc3RfbG9hZF92ZXJzaW9uKHNlbGYpOgotICAgICAgICB2ZXJzaW9uID0gIjYiCi0gICAgICAgIG5hbWUgPSAiYyIKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJsaW51eDIiOgotICAgICAgICAgICAgY2RsbC5sb2FkX3ZlcnNpb24obmFtZSwgdmVyc2lvbikKKyAgICBpZiBsaWJjX25hbWUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSA9PSAibGliYy5zby42IjoKKyAgICAgICAgZGVmIHRlc3RfbG9hZF92ZXJzaW9uKHNlbGYpOgorICAgICAgICAgICAgY2RsbC5sb2FkX3ZlcnNpb24oImMiLCAiNiIpCiAgICAgICAgICAgICAjIGxpbnV4IHVzZXMgdmVyc2lvbiwgbGliYyA5IHNob3VsZCBub3QgZXhpc3QKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBuYW1lLCAiOSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBzZWxmLnVua25vd25kbGwsICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkX3ZlcnNpb24sICJjIiwgIjkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkX3ZlcnNpb24sIHNlbGYudW5rbm93bmRsbCwgIiIpCiAKLSAgICBpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAic3Vub3M1IjoKICAgICAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKICAgICAgICAgICAgIG5hbWUgPSAiYyIKICAgICAgICAgICAgIGNkbGwuZmluZChuYW1lKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5maW5kLCBzZWxmLnVua25vd25kbGwpCiAKKyAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgorICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICAgICAgICAgIHdpbmRsbC5sb2FkX2xpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgV2luRExMKCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICAgICAgICAgICAgIHdpbmRsbC5sb2FkX2xpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIFdpbkRMTCgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKKworICAgICAgICBkZWYgdGVzdF9sb2FkX29yZGluYWxfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICAgICAgZGxsID0gV2luRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgICAgICMgV2UgbG9hZCB0aGUgc2FtZSBmdW5jdGlvbiBib3RoIHZpYSBvcmRpbmFsIGFuZCBuYW1lCisgICAgICAgICAgICBmdW5jX29yZCA9IGRsbFsyXQorICAgICAgICAgICAgZnVuY19uYW1lID0gZGxsLkdldFN0cmluZworICAgICAgICAgICAgIyBhZGRyZXNzb2YgZ2V0cyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBzdG9yZWQKKyAgICAgICAgICAgIGFfb3JkID0gYWRkcmVzc29mKGZ1bmNfb3JkKQorICAgICAgICAgICAgYV9uYW1lID0gYWRkcmVzc29mKGZ1bmNfbmFtZSkKKyAgICAgICAgICAgIGZfb3JkX2FkZHIgPSBjX3ZvaWRfcC5mcm9tX2FkZHJlc3MoYV9vcmQpLnZhbHVlCisgICAgICAgICAgICBmX25hbWVfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX25hbWUpLnZhbHVlCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChoZXgoZl9vcmRfYWRkciksIGhleChmX25hbWVfYWRkcikpCisKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQppbmRleCA2MTcyYWJiLi4zYTMyNGE2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtMTY2LDYgKzE2NiwxOCBAQAogICAgICAgICByZXN1bHQgPSBmdW5jKCBieXJlZihhcmdjKSwgYXJndiApCiAgICAgICAgIGFzc2VydCByZXN1bHQgPT0gJ3dvcmxkJywgcmVzdWx0CiAKKyAgICBkZWYgdGVzdF9idWdfMTQ2Nzg1MihzZWxmKToKKyAgICAgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9NTMyMTU0JmFpZD0xNDY3ODUyJmdyb3VwX2lkPTcxNzAyCisgICAgICAgIHggPSBjX2ludCg1KQorICAgICAgICBkdW1teSA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMyMDAwKToKKyAgICAgICAgICAgIGR1bW15LmFwcGVuZChjX2ludChpKSkKKyAgICAgICAgeSA9IGNfaW50KDYpCisgICAgICAgIHAgPSBwb2ludGVyKHgpCisgICAgICAgIHBwID0gcG9pbnRlcihwKQorICAgICAgICBxID0gcG9pbnRlcih5KQorICAgICAgICBwcFswXSA9IHEgICAgICAgICAjIDw9PQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA2KQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9zaXgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCAyYjRmZGZmLi5mZTBhNDBhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtOCw4ICs4LDEwIEBACiAKICAgICBjbGFzcyBUZXN0UlRMRF9HTE9CQUwodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICAgICBkZWYgdGVzdF9HTChzZWxmKToKLSAgICAgICAgICAgIGNkbGwubG9hZCgnbGliR0wuc28nLCBtb2RlPVJUTERfR0xPQkFMKQotICAgICAgICAgICAgY2RsbC5sb2FkKCdsaWJHTFUuc28nKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoJy91c3IvbGliL2xpYkdMLnNvJyk6CisgICAgICAgICAgICAgICAgY2RsbC5sb2FkKCdsaWJHTC5zbycsIG1vZGU9UlRMRF9HTE9CQUwpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9saWIvbGliR0xVLnNvJyk6CisgICAgICAgICAgICAgICAgY2RsbC5sb2FkKCdsaWJHTFUuc28nKQogCiAjI2lmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtICE9ICJkYXJ3aW4iOgogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQppbmRleCAyYzNkNzViLi40N2Y1ZGExIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKQEAgLTI0LDYgKzI0LDE5IEBACiBpbXBvcnQgX2N0eXBlc190ZXN0CiB0ZXN0ZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKIAorIyBSZXR1cm4gbWFjaGluZSBhZGRyZXNzIGBhYCBhcyBhIChwb3NzaWJseSBsb25nKSBub24tbmVnYXRpdmUgaW50ZWdlci4KKyMgU3RhcnRpbmcgd2l0aCBQeXRob24gMi41LCBpZChhbnl0aGluZykgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZSwgYW5kCisjIHRoZSBjdHlwZXMgYWRkcmVzc29mKCkgaW5oZXJpdHMgdGhhdCB2aWEgUHlMb25nX0Zyb21Wb2lkUHRyKCkuCitkZWYgcG9zaXRpdmVfYWRkcmVzcyhhKToKKyAgICBpZiBhID49IDA6CisgICAgICAgIHJldHVybiBhCisgICAgIyBWaWV3IHRoZSBiaXRzIGluIGBhYCBhcyB1bnNpZ25lZCBpbnN0ZWFkLgorICAgIGltcG9ydCBzdHJ1Y3QKKyAgICBudW1fYml0cyA9IHN0cnVjdC5jYWxjc2l6ZSgiUCIpICogOCAjIG51bSBiaXRzIGluIG5hdGl2ZSBtYWNoaW5lIGFkZHJlc3MKKyAgICBhICs9IDFMIDw8IG51bV9iaXRzCisgICAgYXNzZXJ0IGEgPj0gMAorICAgIHJldHVybiBhCisKIGRlZiBjX3didWZmZXIoaW5pdCk6CiAgICAgbiA9IGxlbihpbml0KSArIDEKICAgICByZXR1cm4gKGNfd2NoYXIgKiBuKSgqaW5pdCkKQEAgLTQzLDcgKzU2LDggQEAKICAgICAgICAgY2kgPSBjX2ludCgwKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfaW50KSwKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWRkcmVzc29mKGNpKSwgZnVuYyhieXJlZihjaSkpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwb3NpdGl2ZV9hZGRyZXNzKGFkZHJlc3NvZihjaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9hZGRyZXNzKGZ1bmMoYnlyZWYoY2kpKSkpCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfY2hhcl9wLAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBieXJlZihjaSkpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQppbmRleCBjZDUwY2E4Li43OGE2NjViIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKQEAgLTUxLDE2ICs1MSwxNCBAQAogICAgIGRlZiB0ZXN0X0ludGVnZXJEaXZpc2lvbkVycm9yKHNlbGYpOgogICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpKGNhbGxiYWNrX2Z1bmMpCiAgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVyb0RpdmlzaW9uRXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8iKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXVs6MTldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVyb0RpdmlzaW9uRXJyb3I6ICIpCiAKICAgICBkZWYgdGVzdF9GbG9hdERpdmlzaW9uRXJyb3Ioc2VsZik6CiAgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2RvdWJsZSkoY2FsbGJhY2tfZnVuYykKICAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgMC4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBkaXZpc2lvbiIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIikKIAogICAgIGRlZiB0ZXN0X1R5cGVFcnJvckRpdmlzaW9uRXJyb3Ioc2VsZik6CiAgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2NoYXJfcCkoY2FsbGJhY2tfZnVuYykKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKaW5kZXggNmZiOWNhMC4uMjA4YzAwZSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKQEAgLTIwLDUgKzIwLDggQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOCwgc2l6ZW9mKGNfaW50NjQpKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg4LCBzaXplb2YoY191aW50NjQpKQogCisgICAgZGVmIHRlc3Rfc2l6ZV90KHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoY192b2lkX3ApLCBzaXplb2YoY19zaXplX3QpKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM0M2JhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkKQEAgLTAsMCArMSw0NSBAQAoraW1wb3J0IHN5cywgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK3N0cnVjdHVyZXMgPSBbXQorYnl0ZXN3YXBwZWRfc3RydWN0dXJlcyA9IFtdCisKKworaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICBTd2FwcGVkU3RydWN0dXJlID0gQmlnRW5kaWFuU3RydWN0dXJlCitlbHNlOgorICAgIFN3YXBwZWRTdHJ1Y3R1cmUgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKworZm9yIHR5cCBpbiBbY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZywKKyAgICAgICAgICAgIGNfZmxvYXQsIGNfZG91YmxlLAorICAgICAgICAgICAgY191c2hvcnQsIGNfdWludCwgY191bG9uZywgY191bG9uZ2xvbmddOgorICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgX3BhY2tfID0gMQorICAgICAgICBfZmllbGRzXyA9IFsoInBhZCIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICgidmFsdWUiLCB0eXApXQorICAgIGNsYXNzIFkoU3dhcHBlZFN0cnVjdHVyZSk6CisgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgX2ZpZWxkc18gPSBbKCJwYWQiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAoInZhbHVlIiwgdHlwKV0KKyAgICBzdHJ1Y3R1cmVzLmFwcGVuZChYKQorICAgIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXMuYXBwZW5kKFkpCisKK2NsYXNzIFRlc3RTdHJ1Y3R1cmVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9uYXRpdmUoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gc3RydWN0dXJlczoKKyMjICAgICAgICAgICAgcHJpbnQgdHlwLnZhbHVlCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXAudmFsdWUub2Zmc2V0LCAxKQorICAgICAgICAgICAgbyA9IHR5cCgpCisgICAgICAgICAgICBvLnZhbHVlID0gNAorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoby52YWx1ZSwgNCkKKworICAgIGRlZiB0ZXN0X3N3YXBwZWQoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gYnl0ZXN3YXBwZWRfc3RydWN0dXJlczoKKyMjICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgdHlwLnZhbHVlCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXAudmFsdWUub2Zmc2V0LCAxKQorICAgICAgICAgICAgbyA9IHR5cCgpCisgICAgICAgICAgICBvLnZhbHVlID0gNAorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoby52YWx1ZSwgNCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CmluZGV4IDZlYTVkNTcuLjU3NzEyNTIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQpAQCAtMTg1LDcgKzE4NSw5IEBACiAKICAgICAgICAgIyBmb3IgZXh0ZW5zaW9ucyB1bmRlciBDeWd3aW4gYW5kIEF0aGVPUyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlCiAgICAgICAgICMgYXBwZW5kZWQgdG8gbGlicmFyeV9kaXJzCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2N5Z3dpbicgb3Igc3lzLnBsYXRmb3JtWzo2XSA9PSAnYXRoZW9zJzoKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAnY3lnd2luJyBvciBzeXMucGxhdGZvcm1bOjZdID09ICdhdGhlb3MnIG9yIFwKKyAgICAgICAgICAgICAgIChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKSBhbmQKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKSk6CiAgICAgICAgICAgICBpZiBzdHJpbmcuZmluZChzeXMuZXhlY3V0YWJsZSwgc3lzLmV4ZWNfcHJlZml4KSAhPSAtMToKICAgICAgICAgICAgICAgICAjIGJ1aWxkaW5nIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJsaWIiLApAQCAtNjg4LDYgKzY5MCwxMyBAQAogICAgICAgICAgICAgIyBleHRlbnNpb25zLCBpdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbGlzdAogICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliLCAibSJdICsgZXh0cmEKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZC4lZCIKKyAgICAgICAgICAgICAgICBweXRob25saWIgPSAodGVtcGxhdGUgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcyArIFtweXRob25saWJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCiAKICMgY2xhc3MgYnVpbGRfZXh0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CmluZGV4IDc3MjM3NjEuLjQ1MzE1MWQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CkBAIC02MDEsNiArNjAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2hlYWRlcnMnLCBoYXNfaGVhZGVycyksCiAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgaGFzX3NjcmlwdHMpLAogICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZGF0YScsICAgIGhhc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2VnZ19pbmZvJywgbGFtYmRhIHNlbGY6VHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgXQogCiAjIGNsYXNzIGluc3RhbGwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxYWMyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CkBAIC0wLDAgKzEsNzUgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm8KKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdpbnN0YWxsX2VnZ19pbmZvJyBjb21tYW5kLCBmb3IgaW5zdGFsbGluZworYSBwYWNrYWdlJ3MgUEtHLUlORk8gbWV0YWRhdGEuIiIiCisKKworZnJvbSBkaXN0dXRpbHMuY21kIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAoraW1wb3J0IG9zLCBzeXMsIHJlCisKK2NsYXNzIGluc3RhbGxfZWdnX2luZm8oQ29tbWFuZCk6CisgICAgIiIiSW5zdGFsbCBhbiAuZWdnLWluZm8gZmlsZSBmb3IgdGhlIHBhY2thZ2UiIiIKKworICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgcGFja2FnZSdzIFBLRy1JTkZPIG1ldGFkYXRhIGFzIGFuIC5lZ2ctaW5mbyBmaWxlIgorICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0byIpLAorICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywoJ2luc3RhbGxfZGlyJywnaW5zdGFsbF9kaXInKSkKKyAgICAgICAgYmFzZW5hbWUgPSAiJXMtJXMtcHklcy5lZ2ctaW5mbyIgJSAoCisgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkpLAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV92ZXJzaW9uKHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkpKSwKKyAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXQorICAgICAgICApCisgICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQorICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldAorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRhcmdldCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayh0YXJnZXQpOgorICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUodGFyZ2V0LCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoc2VsZi50YXJnZXQsKSwiUmVtb3ZpbmcgIit0YXJnZXQpCisgICAgICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgdGFyZ2V0KQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAndycpCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS53cml0ZV9wa2dfZmlsZShmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKKworCisjIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gc2V0dXB0b29scycgcGtnX3Jlc291cmNlcyBtb2R1bGUgYW5kCisjIGNhbiBiZSByZXBsYWNlZCBieSBpbXBvcnRpbmcgdGhlbSBmcm9tIHBrZ19yZXNvdXJjZXMgb25jZSBpdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgc3RkbGliLgorCitkZWYgc2FmZV9uYW1lKG5hbWUpOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCisKKyAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCisgICAgIiIiCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCisKKworZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKKyAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZworCisgICAgU3BhY2VzIGJlY29tZSBkb3RzLCBhbmQgYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBiZWNvbWUKKyAgICBkYXNoZXMsIHdpdGggcnVucyBvZiBtdWx0aXBsZSBkYXNoZXMgY29uZGVuc2VkIHRvIGEgc2luZ2xlIGRhc2guCisgICAgIiIiCisgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsJy4nKQorICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQorCisKK2RlZiB0b19maWxlbmFtZShuYW1lKToKKyAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQorCisgICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCisgICAgIiIiCisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsJ18nKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKaW5kZXggNjI3NjdhMy4uNmY0Y2U4MSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKICAgICAgICAgKCdzaWduJywgJ3MnLAogICAgICAgICAgJ3NpZ24gZmlsZXMgdG8gdXBsb2FkIHVzaW5nIGdwZycpLAorICAgICAgICAoJ2lkZW50aXR5PScsICdpJywgJ0dQRyBpZGVudGl0eSB1c2VkIHRvIHNpZ24gZmlsZXMnKSwKICAgICAgICAgXQogICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnc2hvdy1yZXNwb25zZScsICdzaWduJ10KIApAQCAtMzgsOCArMzksMTMgQEAKICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gJycKICAgICAgICAgc2VsZi5zaG93X3Jlc3BvbnNlID0gMAogICAgICAgICBzZWxmLnNpZ24gPSBGYWxzZQorICAgICAgICBzZWxmLmlkZW50aXR5ID0gTm9uZQogCiAgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaWRlbnRpdHkgYW5kIG5vdCBzZWxmLnNpZ246CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiTXVzdCB1c2UgLS1zaWduIGZvciAtLWlkZW50aXR5IHRvIGhhdmUgbWVhbmluZyIKKyAgICAgICAgICAgICkKICAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdIT01FJyk6CiAgICAgICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICcucHlwaXJjJykKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKQEAgLTY3LDcgKzczLDEwIEBACiAgICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUpOgogICAgICAgICAjIFNpZ24gaWYgcmVxdWVzdGVkCiAgICAgICAgIGlmIHNlbGYuc2lnbjoKLSAgICAgICAgICAgIHNwYXduKCgiZ3BnIiwgIi0tZGV0YWNoLXNpZ24iLCAiLWEiLCBmaWxlbmFtZSksCisgICAgICAgICAgICBncGdfYXJncyA9IFsiZ3BnIiwgIi0tZGV0YWNoLXNpZ24iLCAiLWEiLCBmaWxlbmFtZV0KKyAgICAgICAgICAgIGlmIHNlbGYuaWRlbnRpdHk6CisgICAgICAgICAgICAgICAgZ3BnX2FyZ3NbMjoyXSA9IFsiLS1sb2NhbC11c2VyIiwgc2VsZi5pZGVudGl0eV0KKyAgICAgICAgICAgIHNwYXduKGdwZ19hcmdzLAogICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAKICAgICAgICAgIyBGaWxsIGluIHRoZSBkYXRhIC0gc2VuZCBhbGwgdGhlIG1ldGEtZGF0YSBpbiBjYXNlIHdlIG5lZWQgdG8KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvbG9nLnB5IGIvTGliL2Rpc3R1dGlscy9sb2cucHkKaW5kZXggY2YzZWUxMy4uOTVkNGMxYyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9sb2cucHkKKysrIGIvTGliL2Rpc3R1dGlscy9sb2cucHkKQEAgLTIwLDcgKzIwLDEyIEBACiAKICAgICBkZWYgX2xvZyhzZWxmLCBsZXZlbCwgbXNnLCBhcmdzKToKICAgICAgICAgaWYgbGV2ZWwgPj0gc2VsZi50aHJlc2hvbGQ6Ci0gICAgICAgICAgICBwcmludCBtc2cgJSBhcmdzCisgICAgICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgICAgICAjIG1zZyBtYXkgY29udGFpbiBhICclJy4gSWYgYXJncyBpcyBlbXB0eSwKKyAgICAgICAgICAgICAgICAjIGRvbid0IGV2ZW4gdHJ5IHRvIHN0cmluZy1mb3JtYXQKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnICUgYXJncwogICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAKICAgICBkZWYgbG9nKHNlbGYsIGxldmVsLCBtc2csICphcmdzKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKaW5kZXggZGM2MDNiZS4uNDk1MzZmMCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKQEAgLTMxLDcgKzMxLDcgQEAKIAogcHl0aG9uX2J1aWxkID0gb3MucGF0aC5pc2ZpbGUobGFuZG1hcmspCiAKLWRlbCBhcmd2MF9wYXRoLCBsYW5kbWFyaworZGVsIGxhbmRtYXJrCiAKIAogZGVmIGdldF9weXRob25fdmVyc2lvbigpOgpAQCAtMTg1LDcgKzE4NSw3IEBACiBkZWYgZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCk6CiAgICAgIiIiUmV0dXJuIGZ1bGwgcGF0aG5hbWUgb2YgaW5zdGFsbGVkIHB5Y29uZmlnLmggZmlsZS4iIiIKICAgICBpZiBweXRob25fYnVpbGQ6Ci0gICAgICAgIGluY19kaXIgPSBvcy5jdXJkaXIKKyAgICAgICAgaW5jX2RpciA9IGFyZ3YwX3BhdGgKICAgICBlbHNlOgogICAgICAgICBpbmNfZGlyID0gZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKQogICAgIGlmIGdldF9weXRob25fdmVyc2lvbigpIDwgJzIuMic6CkBAIC0yMTMsOCArMjEzLDggQEAKICAgICAiIiIKICAgICBpZiBnIGlzIE5vbmU6CiAgICAgICAgIGcgPSB7fQotICAgIGRlZmluZV9yeCA9IHJlLmNvbXBpbGUoIiNkZWZpbmUgKFtBLVpdW0EtWjAtOV9dKykgKC4qKVxuIikKLSAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVowLTlfXSspIFsqXS9cbiIpCisgICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aYS16MC05X10rKSAoLiopXG4iKQorICAgIHVuZGVmX3J4ID0gcmUuY29tcGlsZSgiL1sqXSAjdW5kZWYgKFtBLVpdW0EtWmEtejAtOV9dKykgWypdL1xuIikKICAgICAjCiAgICAgd2hpbGUgMToKICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKQEAgLTM1MSw2ICszNTEsMTcgQEAKIAogICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKIAorICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6CisgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCisgICAgICAgIHBhcnNlX2NvbmZpZ19oKGZpbGUoZmlsZW5hbWUpLCBnKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgIG15X21zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGZpbGVuYW1lCisgICAgICAgIGlmIGhhc2F0dHIobXNnLCAic3RyZXJyb3IiKToKKyAgICAgICAgICAgIG15X21zZyA9IG15X21zZyArICIgKCVzKSIgJSBtc2cuc3RyZXJyb3IKKworICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKKwogICAgICMgT24gTWFjT1NYIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHNldHRpbmcgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgIyBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ6IGNvbmZpZ3VyZSBiYXNlcyBzb21lIGNob2ljZXMgb24gaXQgc28KICAgICAjIGl0IG5lZWRzIHRvIGJlIGNvbXBhdGlibGUuCkBAIC0zNjEsNyArMzcyLDcgQEAKICAgICAgICAgaWYgY3VyX3RhcmdldCA9PSAnJzoKICAgICAgICAgICAgIGN1cl90YXJnZXQgPSBjZmdfdGFyZ2V0CiAgICAgICAgICAgICBvcy5wdXRlbnYoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcsIGNmZ190YXJnZXQpCi0gICAgICAgIGlmIGNmZ190YXJnZXQgIT0gY3VyX3RhcmdldDoKKyAgICAgICAgZWxpZiBtYXAoaW50LCBjZmdfdGFyZ2V0LnNwbGl0KCcuJykpID4gbWFwKGludCwgY3VyX3RhcmdldC5zcGxpdCgnLicpKToKICAgICAgICAgICAgIG15X21zZyA9ICgnJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBtaXNtYXRjaDogbm93ICIlcyIgYnV0ICIlcyIgZHVyaW5nIGNvbmZpZ3VyZScKICAgICAgICAgICAgICAgICAlIChjdXJfdGFyZ2V0LCBjZmdfdGFyZ2V0KSkKICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXlfbXNnKQpkaWZmIC0tZ2l0IGEvTGliL2RvY3Rlc3QucHkgYi9MaWIvZG9jdGVzdC5weQppbmRleCA2MjQ0ZmFlLi43MGMzNTVhIDEwMDY0NAotLS0gYS9MaWIvZG9jdGVzdC5weQorKysgYi9MaWIvZG9jdGVzdC5weQpAQCAtMjM2LDYgKzIzNiwxNSBAQAogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBtb2R1bGUsIHN0cmluZywgb3IgTm9uZSIpCiAKK2RlZiBfbG9hZF90ZXN0ZmlsZShmaWxlbmFtZSwgcGFja2FnZSwgbW9kdWxlX3JlbGF0aXZlKToKKyAgICBpZiBtb2R1bGVfcmVsYXRpdmU6CisgICAgICAgIHBhY2thZ2UgPSBfbm9ybWFsaXplX21vZHVsZShwYWNrYWdlLCAzKQorICAgICAgICBmaWxlbmFtZSA9IF9tb2R1bGVfcmVsYXRpdmVfcGF0aChwYWNrYWdlLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgaGFzYXR0cihwYWNrYWdlLCAnX19sb2FkZXJfXycpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihwYWNrYWdlLl9fbG9hZGVyX18sICdnZXRfZGF0YScpOgorICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlLl9fbG9hZGVyX18uZ2V0X2RhdGEoZmlsZW5hbWUpLCBmaWxlbmFtZQorICAgIHJldHVybiBvcGVuKGZpbGVuYW1lKS5yZWFkKCksIGZpbGVuYW1lCisKIGRlZiBfaW5kZW50KHMsIGluZGVudD00KToKICAgICAiIiIKICAgICBBZGQgdGhlIGdpdmVuIG51bWJlciBvZiBzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBiZWdpbm5pbmcgZXZlcnkKQEAgLTEzMTksMTMgKzEzMjgsMTMgQEAKICAgICBfX0xJTkVDQUNIRV9GSUxFTkFNRV9SRSA9IHJlLmNvbXBpbGUocic8ZG9jdGVzdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKD9QPG5hbWU+W1x3XC5dKyknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXFsoP1A8ZXhhbXBsZW51bT5cZCspXF0+JCcpCi0gICAgZGVmIF9fcGF0Y2hlZF9saW5lY2FjaGVfZ2V0bGluZXMoc2VsZiwgZmlsZW5hbWUpOgorICAgIGRlZiBfX3BhdGNoZWRfbGluZWNhY2hlX2dldGxpbmVzKHNlbGYsIGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKICAgICAgICAgbSA9IHNlbGYuX19MSU5FQ0FDSEVfRklMRU5BTUVfUkUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgIGlmIG0gYW5kIG0uZ3JvdXAoJ25hbWUnKSA9PSBzZWxmLnRlc3QubmFtZToKICAgICAgICAgICAgIGV4YW1wbGUgPSBzZWxmLnRlc3QuZXhhbXBsZXNbaW50KG0uZ3JvdXAoJ2V4YW1wbGVudW0nKSldCiAgICAgICAgICAgICByZXR1cm4gZXhhbXBsZS5zb3VyY2Uuc3BsaXRsaW5lcyhUcnVlKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2F2ZV9saW5lY2FjaGVfZ2V0bGluZXMoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zYXZlX2xpbmVjYWNoZV9nZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCiAKICAgICBkZWYgcnVuKHNlbGYsIHRlc3QsIGNvbXBpbGVmbGFncz1Ob25lLCBvdXQ9Tm9uZSwgY2xlYXJfZ2xvYnM9VHJ1ZSk6CiAgICAgICAgICIiIgpAQCAtMTkzMyw5ICsxOTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgcGF0aHMuIikKIAogICAgICMgUmVsYXRpdml6ZSB0aGUgcGF0aAotICAgIGlmIG1vZHVsZV9yZWxhdGl2ZToKLSAgICAgICAgcGFja2FnZSA9IF9ub3JtYWxpemVfbW9kdWxlKHBhY2thZ2UpCi0gICAgICAgIGZpbGVuYW1lID0gX21vZHVsZV9yZWxhdGl2ZV9wYXRoKHBhY2thZ2UsIGZpbGVuYW1lKQorICAgIHRleHQsIGZpbGVuYW1lID0gX2xvYWRfdGVzdGZpbGUoZmlsZW5hbWUsIHBhY2thZ2UsIG1vZHVsZV9yZWxhdGl2ZSkKIAogICAgICMgSWYgbm8gbmFtZSB3YXMgZ2l2ZW4sIHRoZW4gdXNlIHRoZSBmaWxlJ3MgbmFtZS4KICAgICBpZiBuYW1lIGlzIE5vbmU6CkBAIC0xOTU1LDggKzE5NjIsNyBAQAogICAgICAgICBydW5uZXIgPSBEb2NUZXN0UnVubmVyKHZlcmJvc2U9dmVyYm9zZSwgb3B0aW9uZmxhZ3M9b3B0aW9uZmxhZ3MpCiAKICAgICAjIFJlYWQgdGhlIGZpbGUsIGNvbnZlcnQgaXQgdG8gYSB0ZXN0LCBhbmQgcnVuIGl0LgotICAgIHMgPSBvcGVuKGZpbGVuYW1lKS5yZWFkKCkKLSAgICB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KHMsIGdsb2JzLCBuYW1lLCBmaWxlbmFtZSwgMCkKKyAgICB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KHRleHQsIGdsb2JzLCBuYW1lLCBmaWxlbmFtZSwgMCkKICAgICBydW5uZXIucnVuKHRlc3QpCiAKICAgICBpZiByZXBvcnQ6CkBAIC0yMzM2LDE1ICsyMzQyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHBhdGhzLiIpCiAKICAgICAjIFJlbGF0aXZpemUgdGhlIHBhdGguCi0gICAgaWYgbW9kdWxlX3JlbGF0aXZlOgotICAgICAgICBwYWNrYWdlID0gX25vcm1hbGl6ZV9tb2R1bGUocGFja2FnZSkKLSAgICAgICAgcGF0aCA9IF9tb2R1bGVfcmVsYXRpdmVfcGF0aChwYWNrYWdlLCBwYXRoKQorICAgIGRvYywgcGF0aCA9IF9sb2FkX3Rlc3RmaWxlKHBhdGgsIHBhY2thZ2UsIG1vZHVsZV9yZWxhdGl2ZSkKKwogICAgIGlmICJfX2ZpbGVfXyIgbm90IGluIGdsb2JzOgogICAgICAgICBnbG9ic1siX19maWxlX18iXSA9IHBhdGgKIAogICAgICMgRmluZCB0aGUgZmlsZSBhbmQgcmVhZCBpdC4KICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQotICAgIGRvYyA9IG9wZW4ocGF0aCkucmVhZCgpCiAKICAgICAjIENvbnZlcnQgaXQgdG8gYSB0ZXN0LCBhbmQgd3JhcCBpdCBpbiBhIERvY0ZpbGVDYXNlLgogICAgIHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9icywgbmFtZSwgcGF0aCwgMCkKZGlmZiAtLWdpdCBhL0xpYi9kdW1teV90aHJlYWQucHkgYi9MaWIvZHVtbXlfdGhyZWFkLnB5CmluZGV4IGZiM2FiYmYuLmQ2OWQ4NDAgMTAwNjQ0Ci0tLSBhL0xpYi9kdW1teV90aHJlYWQucHkKKysrIGIvTGliL2R1bW15X3RocmVhZC5weQpAQCAtMTEzLDYgKzExMywxNCBAQAogICAgICAgICAgICAgc2VsZi5sb2NrZWRfc3RhdHVzID0gVHJ1ZQogICAgICAgICAgICAgcmV0dXJuIFRydWUKIAorICAgIF9fZW50ZXJfXyA9IGFjcXVpcmUKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXAsIHZhbCwgdGIpOgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCiAgICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgICIiIlJlbGVhc2UgdGhlIGR1bW15IGxvY2suIiIiCiAgICAgICAgICMgWFhYIFBlcmhhcHMgc2hvdWxkbid0IGFjdHVhbGx5IGJvdGhlciB0byB0ZXN0PyAgQ291bGQgbGVhZApkaWZmIC0tZ2l0IGEvTGliL2Vhc3lfaW5zdGFsbC5weSBiL0xpYi9lYXN5X2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3ZTk4NAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lYXN5X2luc3RhbGwucHkKQEAgLTAsMCArMSw1IEBACisiIiJSdW4gdGhlIEVhc3lJbnN0YWxsIGNvbW1hbmQiIiIKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IG1haW4KKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQppbmRleCBlNWMwZTJlLi5mMDEyNjBmIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX19pbml0X18ucHkKKysrIGIvTGliL2VtYWlsL19faW5pdF9fLnB5CkBAIC00LDkgKzQsMTAgQEAKIAogIiIiQSBwYWNrYWdlIGZvciBwYXJzaW5nLCBoYW5kbGluZywgYW5kIGdlbmVyYXRpbmcgZW1haWwgbWVzc2FnZXMuIiIiCiAKLV9fdmVyc2lvbl9fID0gJzMuMC4xJworX192ZXJzaW9uX18gPSAnNC4wYTInCiAKIF9fYWxsX18gPSBbCisgICAgIyBPbGQgbmFtZXMKICAgICAnYmFzZTY0TUlNRScsCiAgICAgJ0NoYXJzZXQnLAogICAgICdFbmNvZGVycycsCkBAIC0yNyw2ICsyOCwxOSBAQAogICAgICdVdGlscycsCiAgICAgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLAogICAgICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgIyBuZXcgbmFtZXMKKyAgICAnYmFzZTY0bWltZScsCisgICAgJ2NoYXJzZXQnLAorICAgICdlbmNvZGVycycsCisgICAgJ2Vycm9ycycsCisgICAgJ2dlbmVyYXRvcicsCisgICAgJ2hlYWRlcicsCisgICAgJ2l0ZXJhdG9ycycsCisgICAgJ21lc3NhZ2UnLAorICAgICdtaW1lJywKKyAgICAncGFyc2VyJywKKyAgICAncXVvcHJpbWltZScsCisgICAgJ3V0aWxzJywKICAgICBdCiAKIApAQCAtMzksNyArNTMsNyBAQAogCiAgICAgT3B0aW9uYWwgX2NsYXNzIGFuZCBzdHJpY3QgYXJlIHBhc3NlZCB0byB0aGUgUGFyc2VyIGNvbnN0cnVjdG9yLgogICAgICIiIgotICAgIGZyb20gZW1haWwuUGFyc2VyIGltcG9ydCBQYXJzZXIKKyAgICBmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCiAgICAgcmV0dXJuIFBhcnNlcigqYXJncywgKiprd3MpLnBhcnNlc3RyKHMpCiAKIApAQCAtNDgsNSArNjIsNjIgQEAKIAogICAgIE9wdGlvbmFsIF9jbGFzcyBhbmQgc3RyaWN0IGFyZSBwYXNzZWQgdG8gdGhlIFBhcnNlciBjb25zdHJ1Y3Rvci4KICAgICAiIiIKLSAgICBmcm9tIGVtYWlsLlBhcnNlciBpbXBvcnQgUGFyc2VyCisgICAgZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgogICAgIHJldHVybiBQYXJzZXIoKmFyZ3MsICoqa3dzKS5wYXJzZShmcCkKKworCisMCisjIExhenkgbG9hZGluZyB0byBwcm92aWRlIG5hbWUgbWFwcGluZyBmcm9tIG5ldy1zdHlsZSBuYW1lcyAoUEVQIDggY29tcGF0aWJsZQorIyBlbWFpbCA0LjAgbW9kdWxlIG5hbWVzKSwgdG8gb2xkLXN0eWxlIG5hbWVzIChlbWFpbCAzLjAgbW9kdWxlIG5hbWVzKS4KK2ltcG9ydCBzeXMKKworY2xhc3MgTGF6eUltcG9ydGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZV9uYW1lKToKKyAgICAgICAgc2VsZi5fX25hbWVfXyA9ICdlbWFpbC4nICsgbW9kdWxlX25hbWUKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgX19pbXBvcnRfXyhzZWxmLl9fbmFtZV9fKQorICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tzZWxmLl9fbmFtZV9fXQorICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShtb2QuX19kaWN0X18pCisgICAgICAgIHJldHVybiBnZXRhdHRyKG1vZCwgbmFtZSkKKworCitfTE9XRVJOQU1FUyA9IFsKKyAgICAjIGVtYWlsLjxvbGQgbmFtZT4gLT4gZW1haWwuPG5ldyBuYW1lIGlzIGxvd2VyY2FzZWQgb2xkIG5hbWU+CisgICAgJ0NoYXJzZXQnLAorICAgICdFbmNvZGVycycsCisgICAgJ0Vycm9ycycsCisgICAgJ0ZlZWRQYXJzZXInLAorICAgICdHZW5lcmF0b3InLAorICAgICdIZWFkZXInLAorICAgICdJdGVyYXRvcnMnLAorICAgICdNZXNzYWdlJywKKyAgICAnUGFyc2VyJywKKyAgICAnVXRpbHMnLAorICAgICdiYXNlNjRNSU1FJywKKyAgICAncXVvcHJpTUlNRScsCisgICAgXQorCitfTUlNRU5BTUVTID0gWworICAgICMgZW1haWwuTUlNRTxvbGQgbmFtZT4gLT4gZW1haWwubWltZS48bmV3IG5hbWUgaXMgbG93ZXJjYXNlZCBvbGQgbmFtZT4KKyAgICAnQXVkaW8nLAorICAgICdCYXNlJywKKyAgICAnSW1hZ2UnLAorICAgICdNZXNzYWdlJywKKyAgICAnTXVsdGlwYXJ0JywKKyAgICAnTm9uTXVsdGlwYXJ0JywKKyAgICAnVGV4dCcsCisgICAgXQorCitmb3IgX25hbWUgaW4gX0xPV0VSTkFNRVM6CisgICAgaW1wb3J0ZXIgPSBMYXp5SW1wb3J0ZXIoX25hbWUubG93ZXIoKSkKKyAgICBzeXMubW9kdWxlc1snZW1haWwuJyArIF9uYW1lXSA9IGltcG9ydGVyCisgICAgc2V0YXR0cihzeXMubW9kdWxlc1snZW1haWwnXSwgX25hbWUsIGltcG9ydGVyKQorCisKK2ltcG9ydCBlbWFpbC5taW1lCitmb3IgX25hbWUgaW4gX01JTUVOQU1FUzoKKyAgICBpbXBvcnRlciA9IExhenlJbXBvcnRlcignbWltZS4nICsgX25hbWUubG93ZXIoKSkKKyAgICBzeXMubW9kdWxlc1snZW1haWwuTUlNRScgKyBfbmFtZV0gPSBpbXBvcnRlcgorICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ2VtYWlsJ10sICdNSU1FJyArIF9uYW1lLCBpbXBvcnRlcikKKyAgICBzZXRhdHRyKHN5cy5tb2R1bGVzWydlbWFpbC5taW1lJ10sIF9uYW1lLCBpbXBvcnRlcikKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5IGIvTGliL2VtYWlsL19wYXJzZWFkZHIucHkKaW5kZXggN2Q3NTllZi4uNTgyMWRkZiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL19wYXJzZWFkZHIucHkKKysrIGIvTGliL2VtYWlsL19wYXJzZWFkZHIucHkKQEAgLTYsNiArNiwxMyBAQAogTGlmdGVkIGRpcmVjdGx5IGZyb20gcmZjODIyLnB5LiAgVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSByZXdyaXR0ZW4uCiAiIiIKIAorX19hbGxfXyA9IFsKKyAgICAnbWt0aW1lX3R6JywKKyAgICAncGFyc2VkYXRlJywKKyAgICAncGFyc2VkYXRlX3R6JywKKyAgICAncXVvdGUnLAorICAgIF0KKwogaW1wb3J0IHRpbWUKIAogU1BBQ0UgPSAnICcKQEAgLTExNyw3ICsxMjQsOCBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHpzaWduID0gMQogICAgICAgICB0em9mZnNldCA9IHR6c2lnbiAqICggKHR6b2Zmc2V0Ly8xMDApKjM2MDAgKyAodHpvZmZzZXQgJSAxMDApKjYwKQotICAgIHJldHVybiB5eSwgbW0sIGRkLCB0aGgsIHRtbSwgdHNzLCAwLCAxLCAwLCB0em9mZnNldAorICAgICMgRGF5bGlnaHQgU2F2aW5nIFRpbWUgZmxhZyBpcyBzZXQgdG8gLTEsIHNpbmNlIERTVCBpcyB1bmtub3duLgorICAgIHJldHVybiB5eSwgbW0sIGRkLCB0aGgsIHRtbSwgdHNzLCAwLCAxLCAtMSwgdHpvZmZzZXQKIAogCiBkZWYgcGFyc2VkYXRlKGRhdGEpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL2Jhc2U2NE1JTUUucHkgYi9MaWIvZW1haWwvYmFzZTY0bWltZS5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvYmFzZTY0TUlNRS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKaW5kZXggNmVkMWQ1My4uMDEyOWQ5ZCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL2Jhc2U2NE1JTUUucHkKKysrIGIvTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIApAQCAtMjQsOSArMjQsMjEgQEAKIG1vZHVsZS4KICIiIgogCitfX2FsbF9fID0gWworICAgICdiYXNlNjRfbGVuJywKKyAgICAnYm9keV9kZWNvZGUnLAorICAgICdib2R5X2VuY29kZScsCisgICAgJ2RlY29kZScsCisgICAgJ2RlY29kZXN0cmluZycsCisgICAgJ2VuY29kZScsCisgICAgJ2VuY29kZXN0cmluZycsCisgICAgJ2hlYWRlcl9lbmNvZGUnLAorICAgIF0KKwogaW1wb3J0IHJlCisKIGZyb20gYmluYXNjaWkgaW1wb3J0IGIyYV9iYXNlNjQsIGEyYl9iYXNlNjQKLWZyb20gZW1haWwuVXRpbHMgaW1wb3J0IGZpeF9lb2xzCitmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmaXhfZW9scwogCiBDUkxGID0gJ1xyXG4nCiBOTCA9ICdcbicKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9DaGFyc2V0LnB5IGIvTGliL2VtYWlsL2NoYXJzZXQucHkKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0NoYXJzZXQucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9jaGFyc2V0LnB5CmluZGV4IGZkNDA0M2IuLjhmMjE4YjIgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9DaGFyc2V0LnB5CisrKyBiL0xpYi9lbWFpbC9jaGFyc2V0LnB5CkBAIC0yLDkgKzIsMTggQEAKICMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZCwgQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKLWltcG9ydCBlbWFpbC5iYXNlNjRNSU1FCi1pbXBvcnQgZW1haWwucXVvcHJpTUlNRQotZnJvbSBlbWFpbC5FbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKK19fYWxsX18gPSBbCisgICAgJ0NoYXJzZXQnLAorICAgICdhZGRfYWxpYXMnLAorICAgICdhZGRfY2hhcnNldCcsCisgICAgJ2FkZF9jb2RlYycsCisgICAgXQorCitpbXBvcnQgZW1haWwuYmFzZTY0bWltZQoraW1wb3J0IGVtYWlsLnF1b3ByaW1pbWUKKworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAogCiAKIAwKQEAgLTE4Niw4ICsxOTUsMTcgQEAKICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXRfY2hhcnNldD1ERUZBVUxUX0NIQVJTRVQpOgogICAgICAgICAjIFJGQyAyMDQ2LCAkNC4xLjIgc2F5cyBjaGFyc2V0cyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLiAgV2UgY29lcmNlIHRvCi0gICAgICAgICMgdW5pY29kZSBiZWNhdXNlIGl0cyAubG93ZXIoKSBpcyBsb2NhbGUgaW5zZW5zaXRpdmUuCi0gICAgICAgIGlucHV0X2NoYXJzZXQgPSB1bmljb2RlKGlucHV0X2NoYXJzZXQsICdhc2NpaScpLmxvd2VyKCkKKyAgICAgICAgIyB1bmljb2RlIGJlY2F1c2UgaXRzIC5sb3dlcigpIGlzIGxvY2FsZSBpbnNlbnNpdGl2ZS4gIElmIHRoZSBhcmd1bWVudAorICAgICAgICAjIGlzIGFscmVhZHkgYSB1bmljb2RlLCB3ZSBsZWF2ZSBpdCBhdCB0aGF0LCBidXQgZW5zdXJlIHRoYXQgdGhlCisgICAgICAgICMgY2hhcnNldCBpcyBBU0NJSSwgYXMgdGhlIHN0YW5kYXJkIChSRkMgWFhYKSByZXF1aXJlcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dF9jaGFyc2V0LCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0LmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0ID0gdW5pY29kZShpbnB1dF9jaGFyc2V0LCAnYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JzLkNoYXJzZXRFcnJvcihpbnB1dF9jaGFyc2V0KQorICAgICAgICBpbnB1dF9jaGFyc2V0ID0gaW5wdXRfY2hhcnNldC5sb3dlcigpCiAgICAgICAgICMgU2V0IHRoZSBpbnB1dCBjaGFyc2V0IGFmdGVyIGZpbHRlcmluZyB0aHJvdWdoIHRoZSBhbGlhc2VzCiAgICAgICAgIHNlbGYuaW5wdXRfY2hhcnNldCA9IEFMSUFTRVMuZ2V0KGlucHV0X2NoYXJzZXQsIGlucHV0X2NoYXJzZXQpCiAgICAgICAgICMgV2UgY2FuIHRyeSB0byBndWVzcyB3aGljaCBlbmNvZGluZyBhbmQgY29udmVyc2lvbiB0byB1c2UgYnkgdGhlCkBAIC0zMDcsMTIgKzMyNSwxMiBAQAogICAgICAgICBjc2V0ID0gc2VsZi5nZXRfb3V0cHV0X2NoYXJzZXQoKQogICAgICAgICAjIFRoZSBsZW4ocykgb2YgYSA3Yml0IGVuY29kaW5nIGlzIGxlbihzKQogICAgICAgICBpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBCQVNFNjQ6Ci0gICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0TUlNRS5iYXNlNjRfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgogICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFFQOgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgogICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFNIT1JURVNUOgotICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0TUlNRS5iYXNlNjRfbGVuKHMpCi0gICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9sZW4ocykKKyAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKQorICAgICAgICAgICAgbGVucXAgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKHMpCiAgICAgICAgICAgICByZXR1cm4gbWluKGxlbmI2NCwgbGVucXApICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBsZW4ocykKQEAgLTMzNSwxNiArMzUzLDE2IEBACiAgICAgICAgICAgICBzID0gc2VsZi5jb252ZXJ0KHMpCiAgICAgICAgICMgN2JpdC84Yml0IGVuY29kaW5ncyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQgKG1vZHVsbyBjb252ZXJzaW9ucykKICAgICAgICAgaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gQkFTRTY0OgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NE1JTUUuaGVhZGVyX2VuY29kZShzLCBjc2V0KQorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZShzLCBjc2V0KQogICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFFQOgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX2VuY29kZShzLCBjc2V0LCBtYXhsaW5lbGVuPU5vbmUpCisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQsIG1heGxpbmVsZW49Tm9uZSkKICAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBTSE9SVEVTVDoKLSAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NE1JTUUuYmFzZTY0X2xlbihzKQotICAgICAgICAgICAgbGVucXAgPSBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuKHMpCisgICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykKKyAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKQogICAgICAgICAgICAgaWYgbGVuYjY0IDwgbGVucXA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NE1JTUUuaGVhZGVyX2VuY29kZShzLCBjc2V0KQorICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX2VuY29kZShzLCBjc2V0LCBtYXhsaW5lbGVuPU5vbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZShzLCBjc2V0LCBtYXhsaW5lbGVuPU5vbmUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gcwogCkBAIC0zNjMsOCArMzgxLDggQEAKICAgICAgICAgICAgIHMgPSBzZWxmLmNvbnZlcnQocykKICAgICAgICAgIyA3Yml0LzhiaXQgZW5jb2RpbmdzIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZCAobW9kdWxlIGNvbnZlcnNpb25zKQogICAgICAgICBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgQkFTRTY0OgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NE1JTUUuYm9keV9lbmNvZGUocykKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmJvZHlfZW5jb2RlKHMpCiAgICAgICAgIGVsaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIFFQOgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaU1JTUUuYm9keV9lbmNvZGUocykKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmJvZHlfZW5jb2RlKHMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gcwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0VuY29kZXJzLnB5IGIvTGliL2VtYWlsL2VuY29kZXJzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9FbmNvZGVycy5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2VuY29kZXJzLnB5CmluZGV4IGJhYWMyYTMuLjA2MDE2Y2QgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9FbmNvZGVycy5weQorKysgYi9MaWIvZW1haWwvZW5jb2RlcnMucHkKQEAgLTEsMTIgKzEsMjIgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiRW5jb2RpbmdzIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4iIiIKIAorX19hbGxfXyA9IFsKKyAgICAnZW5jb2RlXzdvcjhiaXQnLAorICAgICdlbmNvZGVfYmFzZTY0JywKKyAgICAnZW5jb2RlX25vb3AnLAorICAgICdlbmNvZGVfcXVvcHJpJywKKyAgICBdCisKIGltcG9ydCBiYXNlNjQKKwogZnJvbSBxdW9wcmkgaW1wb3J0IGVuY29kZXN0cmluZyBhcyBfZW5jb2Rlc3RyaW5nCiAKKworDAogZGVmIF9xZW5jb2RlKHMpOgogICAgIGVuYyA9IF9lbmNvZGVzdHJpbmcocywgcXVvdGV0YWJzPVRydWUpCiAgICAgIyBNdXN0IGVuY29kZSBzcGFjZXMsIHdoaWNoIHF1b3ByaS5lbmNvZGVzdHJpbmcoKSBkb2Vzbid0IGRvCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvRXJyb3JzLnB5IGIvTGliL2VtYWlsL2Vycm9ycy5weQpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvRXJyb3JzLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvZXJyb3JzLnB5CmluZGV4IGUxM2EyYzcuLmQ1MmE2MjQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9FcnJvcnMucHkKKysrIGIvTGliL2VtYWlsL2Vycm9ycy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIApAQCAtMjYsNiArMjYsMTAgQEAKICAgICAiIiJDb252ZXJzaW9uIHRvIGEgbXVsdGlwYXJ0IGlzIHByb2hpYml0ZWQuIiIiCiAKIAorY2xhc3MgQ2hhcnNldEVycm9yKE1lc3NhZ2VFcnJvcik6CisgICAgIiIiQW4gaWxsZWdhbCBjaGFyc2V0IHdhcyBnaXZlbi4iIiIKKworCiAMCiAjIFRoZXNlIGFyZSBwYXJzaW5nIGRlZmVjdHMgd2hpY2ggdGhlIHBhcnNlciB3YXMgYWJsZSB0byB3b3JrIGFyb3VuZC4KIGNsYXNzIE1lc3NhZ2VEZWZlY3Q6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvRmVlZFBhcnNlci5weSBiL0xpYi9lbWFpbC9mZWVkcGFyc2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9GZWVkUGFyc2VyLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvZmVlZHBhcnNlci5weQppbmRleCBhMjEzMGUyLi5hZmIwMmIzIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvRmVlZFBhcnNlci5weQorKysgYi9MaWIvZW1haWwvZmVlZHBhcnNlci5weQpAQCAtMTksOSArMTksMTIgQEAKIG9iamVjdCdzIC5kZWZlY3RzIGF0dHJpYnV0ZS4KICIiIgogCitfX2FsbF9fID0gWydGZWVkUGFyc2VyJ10KKwogaW1wb3J0IHJlCi1mcm9tIGVtYWlsIGltcG9ydCBFcnJvcnMKLWZyb20gZW1haWwgaW1wb3J0IE1lc3NhZ2UKKworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlCiAKIE5MQ1JFID0gcmUuY29tcGlsZSgnXHJcbnxccnxcbicpCiBOTENSRV9ib2wgPSByZS5jb21waWxlKCcoXHJcbnxccnxcbiknKQpAQCAtMTMwLDcgKzEzMyw3IEBACiBjbGFzcyBGZWVkUGFyc2VyOgogICAgICIiIkEgZmVlZC1zdHlsZSBwYXJzZXIgb2YgZW1haWwuIiIiCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgX2ZhY3Rvcnk9TWVzc2FnZS5NZXNzYWdlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2ZhY3Rvcnk9bWVzc2FnZS5NZXNzYWdlKToKICAgICAgICAgIiIiX2ZhY3RvcnkgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIHRvIGNyZWF0ZSBhIG5ldyBtZXNzYWdlIG9iaiIiIgogICAgICAgICBzZWxmLl9mYWN0b3J5ID0gX2ZhY3RvcnkKICAgICAgICAgc2VsZi5faW5wdXQgPSBCdWZmZXJlZFN1YkZpbGUoKQpAQCAtMTY0LDcgKzE2Nyw3IEBACiAgICAgICAgICMgTG9vayBmb3IgZmluYWwgc2V0IG9mIGRlZmVjdHMKICAgICAgICAgaWYgcm9vdC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnIFwKICAgICAgICAgICAgICAgIGFuZCBub3Qgcm9vdC5pc19tdWx0aXBhcnQoKToKLSAgICAgICAgICAgIHJvb3QuZGVmZWN0cy5hcHBlbmQoRXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCgpKQorICAgICAgICAgICAgcm9vdC5kZWZlY3RzLmFwcGVuZChlcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KCkpCiAgICAgICAgIHJldHVybiByb290CiAKICAgICBkZWYgX25ld19tZXNzYWdlKHNlbGYpOgpAQCAtMjc3LDcgKzI4MCw3IEBACiAgICAgICAgICAgICAgICAgIyBkZWZpbmVkIGEgYm91bmRhcnkuICBUaGF0J3MgYSBwcm9ibGVtIHdoaWNoIHdlJ2xsIGhhbmRsZSBieQogICAgICAgICAgICAgICAgICMgcmVhZGluZyBldmVyeXRoaW5nIHVudGlsIHRoZSBFT0YgYW5kIG1hcmtpbmcgdGhlIG1lc3NhZ2UgYXMKICAgICAgICAgICAgICAgICAjIGRlZmVjdGl2ZS4KLSAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoRXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCgpKQorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KCkpCiAgICAgICAgICAgICAgICAgbGluZXMgPSBbXQogICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgogICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAgICAgICAgIyB0aGF0IGFzIGEgZGVmZWN0IGFuZCBzdG9yZSB0aGUgY2FwdHVyZWQgdGV4dCBhcyB0aGUgcGF5bG9hZC4KICAgICAgICAgICAgICMgRXZlcnl0aGluZyBmcm9tIGhlcmUgdG8gdGhlIEVPRiBpcyBlcGlsb2d1ZS4KICAgICAgICAgICAgIGlmIGNhcHR1cmluZ19wcmVhbWJsZToKLSAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoRXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCgpKQorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KCkpCiAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLnNldF9wYXlsb2FkKEVNUFRZU1RSSU5HLmpvaW4ocHJlYW1ibGUpKQogICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gW10KICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9pbnB1dDoKQEAgLTQzMiw3ICs0MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBoZWFkZXJzIHdhcyBhIGNvbnRpbnVhdGlvbi4gIFRoaXMKICAgICAgICAgICAgICAgICAgICAgIyBpcyBpbGxlZ2FsLCBzbyBsZXQncyBub3RlIHRoZSBkZWZlY3QsIHN0b3JlIHRoZSBpbGxlZ2FsCiAgICAgICAgICAgICAgICAgICAgICMgbGluZSwgYW5kIGlnbm9yZSBpdCBmb3IgcHVycG9zZXMgb2YgaGVhZGVycy4KLSAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gRXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGRlZmVjdCA9IGVycm9ycy5GaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdChsaW5lKQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZGVmZWN0KQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGxhc3R2YWx1ZS5hcHBlbmQobGluZSkKQEAgLTQ2MCwxMyArNDYzLDEzIEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgIyBXZWlyZGx5IHBsYWNlZCB1bml4LWZyb20gbGluZS4gIE5vdGUgdGhpcyBhcyBhIGRlZmVjdAogICAgICAgICAgICAgICAgICAgICAjIGFuZCBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgIGRlZmVjdCA9IEVycm9ycy5NaXNwbGFjZWRFbnZlbG9wZUhlYWRlckRlZmVjdChsaW5lKQorICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWlzcGxhY2VkRW52ZWxvcGVIZWFkZXJEZWZlY3QobGluZSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICMgU3BsaXQgdGhlIGxpbmUgb24gdGhlIGNvbG9uIHNlcGFyYXRpbmcgZmllbGQgbmFtZSBmcm9tIHZhbHVlLgogICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnOicpCiAgICAgICAgICAgICBpZiBpIDwgMDoKLSAgICAgICAgICAgICAgICBkZWZlY3QgPSBFcnJvcnMuTWFsZm9ybWVkSGVhZGVyRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLk1hbGZvcm1lZEhlYWRlckRlZmVjdChsaW5lKQogICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGxhc3RoZWFkZXIgPSBsaW5lWzppXQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0dlbmVyYXRvci5weSBiL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0dlbmVyYXRvci5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2dlbmVyYXRvci5weQppbmRleCA3OTY5OTE2Li42ZTdhNTE1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvR2VuZXJhdG9yLnB5CisrKyBiL0xpYi9lbWFpbC9nZW5lcmF0b3IucHkKQEAgLTQsMTQgKzQsMTYgQEAKIAogIiIiQ2xhc3NlcyB0byBnZW5lcmF0ZSBwbGFpbiB0ZXh0IGZyb20gYSBtZXNzYWdlIG9iamVjdCB0cmVlLiIiIgogCitfX2FsbF9fID0gWydHZW5lcmF0b3InLCAnRGVjb2RlZEdlbmVyYXRvciddCisKIGltcG9ydCByZQogaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCByYW5kb20KIGltcG9ydCB3YXJuaW5ncwotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKLWZyb20gZW1haWwuSGVhZGVyIGltcG9ydCBIZWFkZXIKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlcgogCiBVTkRFUlNDT1JFID0gJ18nCiBOTCA9ICdcbicKQEAgLTgxLDEyICs4Myw2IEBACiAgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgdWZyb20KICAgICAgICAgc2VsZi5fd3JpdGUobXNnKQogCi0gICAgIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCB0aGlzIGlzIHNsb3dlcgotICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBtc2csIHVuaXhmcm9tPUZhbHNlKToKLSAgICAgICAgd2FybmluZ3Mud2FybignX19jYWxsX18oKSBkZXByZWNhdGVkOyB1c2UgZmxhdHRlbigpJywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIHNlbGYuZmxhdHRlbihtc2csIHVuaXhmcm9tKQotCiAgICAgZGVmIGNsb25lKHNlbGYsIGZwKToKICAgICAgICAgIiIiQ2xvbmUgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLiIiIgogICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oZnAsIHNlbGYuX21hbmdsZV9mcm9tXywgc2VsZi5fbWF4aGVhZGVybGVuKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0hlYWRlci5weSBiL0xpYi9lbWFpbC9oZWFkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0hlYWRlci5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2hlYWRlci5weQppbmRleCA1ZTI0YWZlLi4xODNjMzM3IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvSGVhZGVyLnB5CisrKyBiL0xpYi9lbWFpbC9oZWFkZXIucHkKQEAgLTEsMTYgKzEsMjMgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZCwgQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkhlYWRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25hbGl0eS4iIiIKIAorX19hbGxfXyA9IFsKKyAgICAnSGVhZGVyJywKKyAgICAnZGVjb2RlX2hlYWRlcicsCisgICAgJ21ha2VfaGVhZGVyJywKKyAgICBdCisKIGltcG9ydCByZQogaW1wb3J0IGJpbmFzY2lpCiAKLWltcG9ydCBlbWFpbC5xdW9wcmlNSU1FCi1pbXBvcnQgZW1haWwuYmFzZTY0TUlNRQotZnJvbSBlbWFpbC5FcnJvcnMgaW1wb3J0IEhlYWRlclBhcnNlRXJyb3IKLWZyb20gZW1haWwuQ2hhcnNldCBpbXBvcnQgQ2hhcnNldAoraW1wb3J0IGVtYWlsLnF1b3ByaW1pbWUKK2ltcG9ydCBlbWFpbC5iYXNlNjRtaW1lCisKK2Zyb20gZW1haWwuZXJyb3JzIGltcG9ydCBIZWFkZXJQYXJzZUVycm9yCitmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKIAogTkwgPSAnXG4nCiBTUEFDRSA9ICcgJwpAQCAtNDIsNyArNDksNyBAQAogCiAMCiAjIEhlbHBlcnMKLV9tYXhfYXBwZW5kID0gZW1haWwucXVvcHJpTUlNRS5fbWF4X2FwcGVuZAorX21heF9hcHBlbmQgPSBlbWFpbC5xdW9wcmltaW1lLl9tYXhfYXBwZW5kCiAKIAogDApAQCAtODIsMTAgKzg5LDEwIEBACiAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IHBhcnRzWzJdCiAgICAgICAgICAgICAgICAgZGVjID0gTm9uZQogICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nID09ICdxJzoKLSAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfZGVjb2RlKGVuY29kZWQpCisgICAgICAgICAgICAgICAgICAgIGRlYyA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX2RlY29kZShlbmNvZGVkKQogICAgICAgICAgICAgICAgIGVsaWYgZW5jb2RpbmcgPT0gJ2InOgogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5iYXNlNjRNSU1FLmRlY29kZShlbmNvZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwuYmFzZTY0bWltZS5kZWNvZGUoZW5jb2RlZCkKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgIyBUdXJuIHRoaXMgaW50byBhIGhpZ2hlciBsZXZlbCBleGNlcHRpb24uICBCQVc6IFJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB3ZSB0aHJvdyB0aGUgbG93ZXIgbGV2ZWwgZXhjZXB0aW9uIGF3YXkgYnV0CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvSXRlcmF0b3JzLnB5IGIvTGliL2VtYWlsL2l0ZXJhdG9ycy5weQpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvSXRlcmF0b3JzLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvaXRlcmF0b3JzLnB5CmluZGV4IDc0YTkzYzcuLmU5OWYyMjggMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9JdGVyYXRvcnMucHkKKysrIGIvTGliL2VtYWlsL2l0ZXJhdG9ycy5weQpAQCAtMSw5ICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIlZhcmlvdXMgdHlwZXMgb2YgdXNlZnVsIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycy4iIiIKIAorX19hbGxfXyA9IFsKKyAgICAnYm9keV9saW5lX2l0ZXJhdG9yJywKKyAgICAndHlwZWRfc3VicGFydF9pdGVyYXRvcicsCisgICAgJ3dhbGsnLAorICAgICMgRG8gbm90IGluY2x1ZGUgX3N0cnVjdHVyZSgpIHNpbmNlIGl0J3MgcGFydCBvZiB0aGUgZGVidWdnaW5nIEFQSS4KKyAgICBdCisKIGltcG9ydCBzeXMKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCkBAIC0yNSw3ICszMiw2IEBACiAKIAwKICMgVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgaW1wb3J0ZWQgaW50byB0aGUgSXRlcmF0b3JzLnB5IGludGVyZmFjZSBtb2R1bGUuCi0jIFRoZSBQeXRob24gMi4yIHZlcnNpb24gdXNlcyBnZW5lcmF0b3JzIGZvciBlZmZpY2llbmN5LgogZGVmIGJvZHlfbGluZV9pdGVyYXRvcihtc2csIGRlY29kZT1GYWxzZSk6CiAgICAgIiIiSXRlcmF0ZSBvdmVyIHRoZSBwYXJ0cywgcmV0dXJuaW5nIHN0cmluZyBwYXlsb2FkcyBsaW5lLWJ5LWxpbmUuCiAKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NZXNzYWdlLnB5IGIvTGliL2VtYWlsL21lc3NhZ2UucHkKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01lc3NhZ2UucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9tZXNzYWdlLnB5CmluZGV4IGJjNzY0MTYuLjUwZDkwYjQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CkBAIC00LDYgKzQsOCBAQAogCiAiIiJCYXNpYyBtZXNzYWdlIG9iamVjdCBmb3IgdGhlIGVtYWlsIHBhY2thZ2Ugb2JqZWN0IG1vZGVsLiIiIgogCitfX2FsbF9fID0gWydNZXNzYWdlJ10KKwogaW1wb3J0IHJlCiBpbXBvcnQgdXUKIGltcG9ydCBiaW5hc2NpaQpAQCAtMTEsOSArMTMsOSBAQAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKICMgSW50cmFwYWNrYWdlIGltcG9ydHMKLWZyb20gZW1haWwgaW1wb3J0IFV0aWxzCi1mcm9tIGVtYWlsIGltcG9ydCBFcnJvcnMKLWZyb20gZW1haWwgaW1wb3J0IENoYXJzZXQKK2ltcG9ydCBlbWFpbC5jaGFyc2V0Citmcm9tIGVtYWlsIGltcG9ydCB1dGlscworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCiAKIFNFTUlTUEFDRSA9ICc7ICcKIApAQCAtNDEsMTEgKzQzLDExIEBACiAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgICMgRW5jb2RlIGFzIHBlciBSRkMgMjIzMQogICAgICAgICAgICAgcGFyYW0gKz0gJyonCi0gICAgICAgICAgICB2YWx1ZSA9IFV0aWxzLmVuY29kZV9yZmMyMjMxKHZhbHVlWzJdLCB2YWx1ZVswXSwgdmFsdWVbMV0pCisgICAgICAgICAgICB2YWx1ZSA9IHV0aWxzLmVuY29kZV9yZmMyMjMxKHZhbHVlWzJdLCB2YWx1ZVswXSwgdmFsdWVbMV0pCiAgICAgICAgICMgQkFXOiBQbGVhc2UgY2hlY2sgdGhpcy4gIEkgdGhpbmsgdGhhdCBpZiBxdW90ZSBpcyBzZXQgaXQgc2hvdWxkCiAgICAgICAgICMgZm9yY2UgcXVvdGluZyBldmVuIGlmIG5vdCBuZWNlc3NhcnkuCiAgICAgICAgIGlmIHF1b3RlIG9yIHRzcGVjaWFscy5zZWFyY2godmFsdWUpOgotICAgICAgICAgICAgcmV0dXJuICclcz0iJXMiJyAlIChwYXJhbSwgVXRpbHMucXVvdGUodmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuICclcz0iJXMiJyAlIChwYXJhbSwgdXRpbHMucXVvdGUodmFsdWUpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuICclcz0lcycgJSAocGFyYW0sIHZhbHVlKQogICAgIGVsc2U6CkBAIC03MCwxNCArNzIsMTQgQEAKIAogCiBkZWYgX3VucXVvdGV2YWx1ZSh2YWx1ZSk6Ci0gICAgIyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIFV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoKSBiZWNhdXNlIGl0IGRvZXNuJ3QKKyAgICAjIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZSgpIGJlY2F1c2UgaXQgZG9lc24ndAogICAgICMgdHJ5IHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgdW5pY29kZS4gIE1lc3NhZ2UuZ2V0X3BhcmFtKCkgYW5kCiAgICAgIyBNZXNzYWdlLmdldF9wYXJhbXMoKSBhcmUgYm90aCBjdXJyZW50bHkgZGVmaW5lZCB0byByZXR1cm4gdGhlIHR1cGxlIGluCiAgICAgIyB0aGUgZmFjZSBvZiBSRkMgMjIzMSBwYXJhbWV0ZXJzLgogICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKLSAgICAgICAgcmV0dXJuIHZhbHVlWzBdLCB2YWx1ZVsxXSwgVXRpbHMudW5xdW90ZSh2YWx1ZVsyXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdXRpbHMudW5xdW90ZSh2YWx1ZVsyXSkKICAgICBlbHNlOgotICAgICAgICByZXR1cm4gVXRpbHMudW5xdW90ZSh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHV0aWxzLnVucXVvdGUodmFsdWUpCiAKIAogDApAQCAtMTg4LDE3ICsxOTAsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgY3RlID0gc2VsZi5nZXQoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgICAgICAgaWYgY3RlID09ICdxdW90ZWQtcHJpbnRhYmxlJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuX3FkZWNvZGUocGF5bG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuX3FkZWNvZGUocGF5bG9hZCkKICAgICAgICAgICAgIGVsaWYgY3RlID09ICdiYXNlNjQnOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLl9iZGVjb2RlKHBheWxvYWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5fYmRlY29kZShwYXlsb2FkKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgIyBJbmNvcnJlY3QgcGFkZGluZwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZAogICAgICAgICAgICAgZWxpZiBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgogICAgICAgICAgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHV1LmRlY29kZShTdHJpbmdJTyhwYXlsb2FkKydcbicpLCBzZnApCisgICAgICAgICAgICAgICAgICAgIHV1LmRlY29kZShTdHJpbmdJTyhwYXlsb2FkKydcbicpLCBzZnAsIHF1aWV0PVRydWUpCiAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZnAuZ2V0dmFsdWUoKQogICAgICAgICAgICAgICAgIGV4Y2VwdCB1dS5FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgIyBTb21lIGRlY29kaW5nIHByb2JsZW0KQEAgLTIzNyw4ICsyMzksOCBAQAogICAgICAgICAgICAgc2VsZi5fY2hhcnNldCA9IE5vbmUKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIHN0cik6Ci0gICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldC5DaGFyc2V0KGNoYXJzZXQpCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQuQ2hhcnNldCk6CisgICAgICAgICAgICBjaGFyc2V0ID0gZW1haWwuY2hhcnNldC5DaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIGVtYWlsLmNoYXJzZXQuQ2hhcnNldCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoY2hhcnNldCkKICAgICAgICAgIyBCQVc6IHNob3VsZCB3ZSBhY2NlcHQgc3RyaW5ncyB0aGF0IGNhbiBzZXJ2ZSBhcyBhcmd1bWVudHMgdG8gdGhlCiAgICAgICAgICMgQ2hhcnNldCBjb25zdHJ1Y3Rvcj8KQEAgLTQxMyw0OSArNDE1LDYgQEAKICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKF9uYW1lKQogCiAgICAgIwotICAgICMgRGVwcmVjYXRlZCBtZXRob2RzLiAgVGhlc2Ugd2lsbCBiZSByZW1vdmVkIGluIGVtYWlsIDMuMS4KLSAgICAjCi0KLSAgICBkZWYgZ2V0X3R5cGUoc2VsZiwgZmFpbG9iaj1Ob25lKToKLSAgICAgICAgIiIiUmV0dXJucyB0aGUgbWVzc2FnZSdzIGNvbnRlbnQgdHlwZS4KLQotICAgICAgICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNvZXJjZWQgdG8gbG93ZXJjYXNlIGFuZCByZXR1cm5lZCBhcyBhIHNpbmdsZQotICAgICAgICBzdHJpbmcgb2YgdGhlIGZvcm0gYG1haW50eXBlL3N1YnR5cGUnLiAgSWYgdGhlcmUgd2FzIG5vIENvbnRlbnQtVHlwZQotICAgICAgICBoZWFkZXIgaW4gdGhlIG1lc3NhZ2UsIGZhaWxvYmogaXMgcmV0dXJuZWQgKGRlZmF1bHRzIHRvIE5vbmUpLgotICAgICAgICAiIiIKLSAgICAgICAgd2FybmluZ3Mud2FybignZ2V0X3R5cGUoKSBkZXByZWNhdGVkOyB1c2UgZ2V0X2NvbnRlbnRfdHlwZSgpJywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQotICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0KCdjb250ZW50LXR5cGUnLCBtaXNzaW5nKQotICAgICAgICBpZiB2YWx1ZSBpcyBtaXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgcmV0dXJuIHBhcmFtcmUuc3BsaXQodmFsdWUpWzBdLmxvd2VyKCkuc3RyaXAoKQotCi0gICAgZGVmIGdldF9tYWluX3R5cGUoc2VsZiwgZmFpbG9iaj1Ob25lKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgbWFpbiBjb250ZW50IHR5cGUgaWYgcHJlc2VudC4iIiIKLSAgICAgICAgd2FybmluZ3Mud2FybignZ2V0X21haW5fdHlwZSgpIGRlcHJlY2F0ZWQ7IHVzZSBnZXRfY29udGVudF9tYWludHlwZSgpJywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQotICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0X3R5cGUobWlzc2luZykKLSAgICAgICAgaWYgY3R5cGUgaXMgbWlzc2luZzoKLSAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIGlmIGN0eXBlLmNvdW50KCcvJykgPD4gMToKLSAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIHJldHVybiBjdHlwZS5zcGxpdCgnLycpWzBdCi0KLSAgICBkZWYgZ2V0X3N1YnR5cGUoc2VsZiwgZmFpbG9iaj1Ob25lKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgY29udGVudCBzdWJ0eXBlIGlmIHByZXNlbnQuIiIiCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2dldF9zdWJ0eXBlKCkgZGVwcmVjYXRlZDsgdXNlIGdldF9jb250ZW50X3N1YnR5cGUoKScsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKLSAgICAgICAgY3R5cGUgPSBzZWxmLmdldF90eXBlKG1pc3NpbmcpCi0gICAgICAgIGlmIGN0eXBlIGlzIG1pc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICBpZiBjdHlwZS5jb3VudCgnLycpIDw+IDE6Ci0gICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVsxXQotCi0gICAgIwogICAgICMgVXNlIHRoZXNlIHRocmVlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgdGhyZWUgYWJvdmUuCiAgICAgIwogCkBAIC01MzcsNyArNDk2LDcgQEAKICAgICAgICAgICAgICAgICBuYW1lID0gcC5zdHJpcCgpCiAgICAgICAgICAgICAgICAgdmFsID0gJycKICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoKG5hbWUsIHZhbCkpCi0gICAgICAgIHBhcmFtcyA9IFV0aWxzLmRlY29kZV9wYXJhbXMocGFyYW1zKQorICAgICAgICBwYXJhbXMgPSB1dGlscy5kZWNvZGVfcGFyYW1zKHBhcmFtcykKICAgICAgICAgcmV0dXJuIHBhcmFtcwogCiAgICAgZGVmIGdldF9wYXJhbXMoc2VsZiwgZmFpbG9iaj1Ob25lLCBoZWFkZXI9J2NvbnRlbnQtdHlwZScsIHVucXVvdGU9VHJ1ZSk6CkBAIC03MTQsNyArNjczLDcgQEAKICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfcGFyYW0oJ25hbWUnLCBtaXNzaW5nLCAnY29udGVudC1kaXNwb3NpdGlvbicpCiAgICAgICAgIGlmIGZpbGVuYW1lIGlzIG1pc3Npbmc6CiAgICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICByZXR1cm4gVXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShmaWxlbmFtZSkuc3RyaXAoKQorICAgICAgICByZXR1cm4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShmaWxlbmFtZSkuc3RyaXAoKQogCiAgICAgZGVmIGdldF9ib3VuZGFyeShzZWxmLCBmYWlsb2JqPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGJvdW5kYXJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bG9hZCBpZiBwcmVzZW50LgpAQCAtNzI3LDcgKzY4Niw3IEBACiAgICAgICAgIGlmIGJvdW5kYXJ5IGlzIG1pc3Npbmc6CiAgICAgICAgICAgICByZXR1cm4gZmFpbG9iagogICAgICAgICAjIFJGQyAyMDQ2IHNheXMgdGhhdCBib3VuZGFyaWVzIG1heSBiZWdpbiBidXQgbm90IGVuZCBpbiB3L3MKLSAgICAgICAgcmV0dXJuIFV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoYm91bmRhcnkpLnJzdHJpcCgpCisgICAgICAgIHJldHVybiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGJvdW5kYXJ5KS5yc3RyaXAoKQogCiAgICAgZGVmIHNldF9ib3VuZGFyeShzZWxmLCBib3VuZGFyeSk6CiAgICAgICAgICIiIlNldCB0aGUgYm91bmRhcnkgcGFyYW1ldGVyIGluIENvbnRlbnQtVHlwZSB0byAnYm91bmRhcnknLgpAQCAtNzQ0LDcgKzcwMyw3IEBACiAgICAgICAgIGlmIHBhcmFtcyBpcyBtaXNzaW5nOgogICAgICAgICAgICAgIyBUaGVyZSB3YXMgbm8gQ29udGVudC1UeXBlIGhlYWRlciwgYW5kIHdlIGRvbid0IGtub3cgd2hhdCB0eXBlCiAgICAgICAgICAgICAjIHRvIHNldCBpdCB0bywgc28gcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgICAgICAgICAgcmFpc2UgRXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsICdObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kJworICAgICAgICAgICAgcmFpc2UgZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IoJ05vIENvbnRlbnQtVHlwZSBoZWFkZXIgZm91bmQnKQogICAgICAgICBuZXdwYXJhbXMgPSBbXQogICAgICAgICBmb3VuZHAgPSBGYWxzZQogICAgICAgICBmb3IgcGssIHB2IGluIHBhcmFtczoKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5IGIvTGliL2VtYWlsL21pbWUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weSBiL0xpYi9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGJiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weQpAQCAtMCwwICsxLDM2IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogS2VpdGggRGFydAorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgYXBwbGljYXRpb24vKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWyJNSU1FQXBwbGljYXRpb24iXQorCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKK2NsYXNzIE1JTUVBcHBsaWNhdGlvbihNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBhcHBsaWNhdGlvbi8qIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9kYXRhLCBfc3VidHlwZT0nb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGFwcGxpY2F0aW9uLyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF9kYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBhcHBsaWNhdG9pbiBkYXRhLgorCisgICAgICAgIF9zdWJ0eXBlIGlzIHRoZSBNSU1FIGNvbnRlbnQgdHlwZSBzdWJ0eXBlLCBkZWZhdWx0aW5nIHRvCisgICAgICAgICdvY3RldC1zdHJlYW0nLgorCisgICAgICAgIF9lbmNvZGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgZW5jb2RpbmcgZm9yCisgICAgICAgIHRyYW5zcG9ydCBvZiB0aGUgYXBwbGljYXRpb24gZGF0YSwgZGVmYXVsdGluZyB0byBiYXNlNjQgZW5jb2RpbmcuCisKKyAgICAgICAgQW55IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYmFzZSBjbGFzcworICAgICAgICBjb25zdHJ1Y3Rvciwgd2hpY2ggdHVybnMgdGhlbSBpbnRvIHBhcmFtZXRlcnMgb24gdGhlIENvbnRlbnQtVHlwZQorICAgICAgICBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbnZhbGlkIGFwcGxpY2F0aW9uIE1JTUUgc3VidHlwZScpCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2FwcGxpY2F0aW9uJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfZGF0YSkKKyAgICAgICAgX2VuY29kZXIoc2VsZikKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FQXVkaW8ucHkgYi9MaWIvZW1haWwvbWltZS9hdWRpby5weQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRUF1ZGlvLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9hdWRpby5weQppbmRleCAyNjZlYzRjLi5jNzI5MGM0IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRUF1ZGlvLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL2F1ZGlvLnB5CkBAIC0xLDE1ICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQW50aG9ueSBCYXh0ZXIKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGF1ZGlvLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKIAotaW1wb3J0IHNuZGhkcgotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitfX2FsbF9fID0gWydNSU1FQXVkaW8nXQogCi1mcm9tIGVtYWlsIGltcG9ydCBFcnJvcnMKLWZyb20gZW1haWwgaW1wb3J0IEVuY29kZXJzCi1mcm9tIGVtYWlsLk1JTUVOb25NdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKK2ltcG9ydCBzbmRoZHIKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAogCiAKIAwKQEAgLTQyLDcgKzQzLDcgQEAKICAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBhdWRpby8qIE1JTUUgZG9jdW1lbnRzLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9hdWRpb2RhdGEsIF9zdWJ0eXBlPU5vbmUsCi0gICAgICAgICAgICAgICAgIF9lbmNvZGVyPUVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CiAgICAgICAgICIiIkNyZWF0ZSBhbiBhdWRpby8qIHR5cGUgTUlNRSBkb2N1bWVudC4KIAogICAgICAgICBfYXVkaW9kYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBhdWRpbyBkYXRhLiAgSWYgdGhpcyBkYXRhCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRUJhc2UucHkgYi9MaWIvZW1haWwvbWltZS9iYXNlLnB5CnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FQmFzZS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvYmFzZS5weQppbmRleCA4ODY5MWY4Li5hYzkxOTI1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRUJhc2UucHkKKysrIGIvTGliL2VtYWlsL21pbWUvYmFzZS5weQpAQCAtMSwxNCArMSwxNiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHNwZWNpYWxpemF0aW9ucy4iIiIKIAotZnJvbSBlbWFpbCBpbXBvcnQgTWVzc2FnZQorX19hbGxfXyA9IFsnTUlNRUJhc2UnXQorCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlCiAKIAogDAotY2xhc3MgTUlNRUJhc2UoTWVzc2FnZS5NZXNzYWdlKToKK2NsYXNzIE1JTUVCYXNlKG1lc3NhZ2UuTWVzc2FnZSk6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBzcGVjaWFsaXphdGlvbnMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgX21haW50eXBlLCBfc3VidHlwZSwgKipfcGFyYW1zKToKQEAgLTE4LDcgKzIwLDcgQEAKICAgICAgICAgYXJndW1lbnRzLiAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGhlYWRlciBhcmUgdGFrZW4gZnJvbSB0aGUKICAgICAgICAga2V5d29yZCBhcmd1bWVudHMuCiAgICAgICAgICIiIgotICAgICAgICBNZXNzYWdlLk1lc3NhZ2UuX19pbml0X18oc2VsZikKKyAgICAgICAgbWVzc2FnZS5NZXNzYWdlLl9faW5pdF9fKHNlbGYpCiAgICAgICAgIGN0eXBlID0gJyVzLyVzJyAlIChfbWFpbnR5cGUsIF9zdWJ0eXBlKQogICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGN0eXBlLCAqKl9wYXJhbXMpCiAgICAgICAgIHNlbGZbJ01JTUUtVmVyc2lvbiddID0gJzEuMCcKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FSW1hZ2UucHkgYi9MaWIvZW1haWwvbWltZS9pbWFnZS5weQpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRUltYWdlLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9pbWFnZS5weQppbmRleCBhNjU4MDY3Li41NTYzODIzIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRUltYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL2ltYWdlLnB5CkBAIC0xLDE0ICsxLDE1IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkNsYXNzIHJlcHJlc2VudGluZyBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCiAKK19fYWxsX18gPSBbJ01JTUVJbWFnZSddCisKIGltcG9ydCBpbWdoZHIKIAotZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCi1mcm9tIGVtYWlsIGltcG9ydCBFbmNvZGVycwotZnJvbSBlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0Citmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAogCiAKIAwKQEAgLTE2LDcgKzE3LDcgQEAKICAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgX2ltYWdlZGF0YSwgX3N1YnR5cGU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgX2VuY29kZXI9RW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKICAgICAgICAgIiIiQ3JlYXRlIGFuIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50LgogCiAgICAgICAgIF9pbWFnZWRhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGltYWdlIGRhdGEuICBJZiB0aGlzIGRhdGEKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FTWVzc2FnZS5weSBiL0xpYi9lbWFpbC9taW1lL21lc3NhZ2UucHkKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVNZXNzYWdlLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9tZXNzYWdlLnB5CmluZGV4IDMwMjE5MzQuLjI3NWRiZmQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FTWVzc2FnZS5weQorKysgYi9MaWIvZW1haWwvbWltZS9tZXNzYWdlLnB5CkBAIC0xLDExICsxLDEzIEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkNsYXNzIHJlcHJlc2VudGluZyBtZXNzYWdlLyogTUlNRSBkb2N1bWVudHMuIiIiCiAKLWZyb20gZW1haWwgaW1wb3J0IE1lc3NhZ2UKLWZyb20gZW1haWwuTUlNRU5vbk11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorX19hbGxfXyA9IFsnTUlNRU1lc3NhZ2UnXQorCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CiAKIAogDApAQCAtMjMsMTAgKzI1LDEwIEBACiAgICAgICAgIHRoZSB0ZXJtICJyZmM4MjIiIGlzIHRlY2huaWNhbGx5IG91dGRhdGVkIGJ5IFJGQyAyODIyKS4KICAgICAgICAgIiIiCiAgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ21lc3NhZ2UnLCBfc3VidHlwZSkKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoX21zZywgTWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoX21zZywgbWVzc2FnZS5NZXNzYWdlKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQXJndW1lbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1lc3NhZ2UnKQogICAgICAgICAjIEl0J3MgY29udmVuaWVudCB0byB1c2UgdGhpcyBiYXNlIGNsYXNzIG1ldGhvZC4gIFdlIG5lZWQgdG8gZG8gaXQKICAgICAgICAgIyB0aGlzIHdheSBvciB3ZSdsbCBnZXQgYW4gZXhjZXB0aW9uCi0gICAgICAgIE1lc3NhZ2UuTWVzc2FnZS5hdHRhY2goc2VsZiwgX21zZykKKyAgICAgICAgbWVzc2FnZS5NZXNzYWdlLmF0dGFjaChzZWxmLCBfbXNnKQogICAgICAgICAjIEFuZCBiZSBzdXJlIG91ciBkZWZhdWx0IHR5cGUgaXMgc2V0IGNvcnJlY3RseQogICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9NSU1FTXVsdGlwYXJ0LnB5IGIvTGliL2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5CnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FTXVsdGlwYXJ0LnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKaW5kZXggOTA3MmE2NC4uNWM4YzlkYiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVNdWx0aXBhcnQucHkKKysrIGIvTGliL2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5CkBAIC0xLDE0ICsxLDE2IEBACi0jIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKIAotZnJvbSBlbWFpbCBpbXBvcnQgTUlNRUJhc2UKK19fYWxsX18gPSBbJ01JTUVNdWx0aXBhcnQnXQorCitmcm9tIGVtYWlsLm1pbWUuYmFzZSBpbXBvcnQgTUlNRUJhc2UKIAogCiAMCi1jbGFzcyBNSU1FTXVsdGlwYXJ0KE1JTUVCYXNlLk1JTUVCYXNlKToKK2NsYXNzIE1JTUVNdWx0aXBhcnQoTUlNRUJhc2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfc3VidHlwZT0nbWl4ZWQnLCBib3VuZGFyeT1Ob25lLCBfc3VicGFydHM9Tm9uZSwKQEAgLTMxLDcgKzMzLDcgQEAKICAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBhcmUgdGFrZW4gZnJvbSB0aGUKICAgICAgICAga2V5d29yZCBhcmd1bWVudHMgKG9yIHBhc3NlZCBpbnRvIHRoZSBfcGFyYW1zIGFyZ3VtZW50KS4KICAgICAgICAgIiIiCi0gICAgICAgIE1JTUVCYXNlLk1JTUVCYXNlLl9faW5pdF9fKHNlbGYsICdtdWx0aXBhcnQnLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBNSU1FQmFzZS5fX2luaXRfXyhzZWxmLCAnbXVsdGlwYXJ0JywgX3N1YnR5cGUsICoqX3BhcmFtcykKICAgICAgICAgaWYgX3N1YnBhcnRzOgogICAgICAgICAgICAgZm9yIHAgaW4gX3N1YnBhcnRzOgogICAgICAgICAgICAgICAgIHNlbGYuYXR0YWNoKHApCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRU5vbk11bHRpcGFydC5weSBiL0xpYi9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weQpzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRU5vbk11bHRpcGFydC5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5CmluZGV4IDQxOTVkMmEuLmRkMjgwYjUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FTm9uTXVsdGlwYXJ0LnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weQpAQCAtMSwxNSArMSwxNyBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHR5cGUgbWVzc2FnZXMgdGhhdCBhcmUgbm90IG11bHRpcGFydC4iIiIKIAotZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCi1mcm9tIGVtYWlsIGltcG9ydCBNSU1FQmFzZQorX19hbGxfXyA9IFsnTUlNRU5vbk11bHRpcGFydCddCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCiAKIAogDAotY2xhc3MgTUlNRU5vbk11bHRpcGFydChNSU1FQmFzZS5NSU1FQmFzZSk6CitjbGFzcyBNSU1FTm9uTXVsdGlwYXJ0KE1JTUVCYXNlKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZXMuIiIiCiAKICAgICBfX3B5Y2hlY2tlcl9fID0gJ3VudXNlZG5hbWVzPXBheWxvYWQnCkBAIC0xOCw3ICsyMCw3IEBACiAgICAgICAgICMgVGhlIHB1YmxpYyBBUEkgcHJvaGliaXRzIGF0dGFjaGluZyBtdWx0aXBsZSBzdWJwYXJ0cyB0byBNSU1FQmFzZQogICAgICAgICAjIGRlcml2ZWQgc3VidHlwZXMgc2luY2Ugbm9uZSBvZiB0aGVtIGFyZSwgYnkgZGVmaW5pdGlvbiwgb2YgY29udGVudAogICAgICAgICAjIHR5cGUgbXVsdGlwYXJ0LyoKLSAgICAgICAgcmFpc2UgRXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvcigKKyAgICAgICAgcmFpc2UgZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvcigKICAgICAgICAgICAgICdDYW5ub3QgYXR0YWNoIGFkZGl0aW9uYWwgc3VicGFydHMgdG8gbm9uLW11bHRpcGFydC8qJykKIAogICAgIGRlbCBfX3B5Y2hlY2tlcl9fCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRVRleHQucHkgYi9MaWIvZW1haWwvbWltZS90ZXh0LnB5CnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FVGV4dC5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvdGV4dC5weQppbmRleCA1ZWYxODc2Li41NzQ3ZGI1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRVRleHQucHkKKysrIGIvTGliL2VtYWlsL21pbWUvdGV4dC5weQpAQCAtMSwxMSArMSwxMyBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCiAKLWZyb20gZW1haWwuTUlNRU5vbk11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAotZnJvbSBlbWFpbC5FbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKK19fYWxsX18gPSBbJ01JTUVUZXh0J10KKworZnJvbSBlbWFpbC5lbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKIAogCiAMCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvUGFyc2VyLnB5IGIvTGliL2VtYWlsL3BhcnNlci5weQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvUGFyc2VyLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvcGFyc2VyLnB5CmluZGV4IDBjMDUyMjQuLjJmY2FmMjUgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9QYXJzZXIucHkKKysrIGIvTGliL2VtYWlsL3BhcnNlci5weQpAQCAtMSwxMyArMSwxNiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdywgVGhvbWFzIFdvdXRlcnMsIEFudGhvbnkgQmF4dGVyCiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkEgcGFyc2VyIG9mIFJGQyAyODIyIGFuZCBNSU1FIGVtYWlsIG1lc3NhZ2VzLiIiIgogCitfX2FsbF9fID0gWydQYXJzZXInLCAnSGVhZGVyUGFyc2VyJ10KKwogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gZW1haWwuRmVlZFBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgotZnJvbSBlbWFpbC5NZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKK2Zyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCiAKIAogDApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3F1b3ByaU1JTUUucHkgYi9MaWIvZW1haWwvcXVvcHJpbWltZS5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvcXVvcHJpTUlNRS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL3F1b3ByaW1pbWUucHkKaW5kZXggYTliNWQ0OS4uYTU2NThkZCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3F1b3ByaU1JTUUucHkKKysrIGIvTGliL2VtYWlsL3F1b3ByaW1pbWUucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIApAQCAtMjYsOSArMjYsMjcgQEAKIHdyYXBwaW5nIGlzc3VlcywgdXNlIHRoZSBlbWFpbC5IZWFkZXIgbW9kdWxlLgogIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ2JvZHlfZGVjb2RlJywKKyAgICAnYm9keV9lbmNvZGUnLAorICAgICdib2R5X3F1b3ByaV9jaGVjaycsCisgICAgJ2JvZHlfcXVvcHJpX2xlbicsCisgICAgJ2RlY29kZScsCisgICAgJ2RlY29kZXN0cmluZycsCisgICAgJ2VuY29kZScsCisgICAgJ2VuY29kZXN0cmluZycsCisgICAgJ2hlYWRlcl9kZWNvZGUnLAorICAgICdoZWFkZXJfZW5jb2RlJywKKyAgICAnaGVhZGVyX3F1b3ByaV9jaGVjaycsCisgICAgJ2hlYWRlcl9xdW9wcmlfbGVuJywKKyAgICAncXVvdGUnLAorICAgICd1bnF1b3RlJywKKyAgICBdCisKIGltcG9ydCByZQorCiBmcm9tIHN0cmluZyBpbXBvcnQgaGV4ZGlnaXRzCi1mcm9tIGVtYWlsLlV0aWxzIGltcG9ydCBmaXhfZW9scworZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZml4X2VvbHMKIAogQ1JMRiA9ICdcclxuJwogTkwgPSAnXG4nCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQppbmRleCA1YTQyYzIyNy4uZDk3NzY5MyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC0zOSw5ICszOSw2IEBACiBFTVBUWVNUUklORyA9ICcnCiBTUEFDRSA9ICcgJwogCi0jIFdlIGRvbid0IGNhcmUgYWJvdXQgRGVwcmVjYXRpb25XYXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScsICcnLCBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQotCiAKIAwKIGRlZiBvcGVuZmlsZShmaWxlbmFtZSwgbW9kZT0ncicpOgpAQCAtODcsNyArODQsNyBAQAogICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCiAgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQogICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMS4wJykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMSInKQogICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tODg1OS0xJykKICAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKQEAgLTIxMSw2ICsyMDgsMTkgQEAKICAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdmb28nKQogICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnZm9vJykKIAorICAgIGRlZiB0ZXN0X2RlY29kZV9ib2d1c191dV9wYXlsb2FkX3F1aWV0bHkoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2JlZ2luIDY2NCBmb28udHh0XG4lPFcxRj0wMDAwSCBcbiBcbmVuZFxuJykKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAneC11dWVuY29kZScKKyAgICAgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcGF5bG9hZAorICAgICAgICAgICAgbXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9sZF9zdGRlcnIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZnAuZ2V0dmFsdWUoKSwgJycpCisKICAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCkBAIC04OTMsNyArOTAzLDcgQEAKICAgICAgICAgc2VsZi5fYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhKQogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hdS5nZXRfdHlwZSgpLCAnYXVkaW8vYmFzaWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKIAogICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgogICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQpAQCAtOTAxLDcgKzkxMSw3IEBACiAKICAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgogICAgICAgICBhdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEsICdmaXNoJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdS5nZXRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCiAKICAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTkzNiw3ICs5NDYsNyBAQAogICAgICAgICBzZWxmLl9pbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhKQogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9naWYnKQogCiAgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIHBheWxvYWQgPSBzZWxmLl9pbS5nZXRfcGF5bG9hZCgpCkBAIC05NDQsNyArOTU0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CiAgICAgICAgIGltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEsICdmaXNoJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbS5nZXRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCiAKICAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTk3Niw3ICs5ODYsNyBAQAogICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCi0gICAgICAgIGVxKHNlbGYuX21zZy5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQogICAgICAgICBtaXNzaW5nID0gW10KICAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCkBAIC0xMDQ1LDcgKzEwNTUsNyBAQAogICAgICAgICAjIHRlc3RzCiAgICAgICAgIG0gPSBzZWxmLl9tc2cKICAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIGVxKG0uZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKICAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQogICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKQEAgLTEzNzksNyArMTM4OSw3IEBACiAgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogCkBAIC0xNTMxLDcgKzE1NDEsNyBAQAogICAgICAgICBtID0gTWVzc2FnZSgpCiAgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKICAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCi0gICAgICAgIGVxKHIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKQEAgLTE1NzIsNyArMTU4Miw3IEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQpAQCAtMTU4NiwxMiArMTU5NiwxMiBAQAogICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKICAgICAgICAgIyBtc2cgMTYgaXMgYSBEZWxpdmVyeSBTdGF0dXMgTm90aWZpY2F0aW9uLCBzZWUgUkZDIDE4OTQKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQogICAgICAgICB1bmxlc3MobXNnLmlzX211bHRpcGFydCgpKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQogICAgICAgICAjIFN1YnBhcnQgMSBpcyBhIHRleHQvcGxhaW4sIGh1bWFuIHJlYWRhYmxlIHNlY3Rpb24KICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShzdWJwYXJ0LmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCiBUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKIApAQCAtMTYxMSw3ICsxNjIxLDcgQEAKICAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQogICAgICAgICAjIG9iamVjdHMuCiAgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEoc3VicGFydC5nZXRfdHlwZSgpLCAnbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKICAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgogICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCkBAIC0xNjI5LDEzICsxNjM5LDEzIEBACiAgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtKCdyZmM4MjInLCBoZWFkZXI9J2ZpbmFsLXJlY2lwaWVudCcpLCAnJykKICAgICAgICAgIyBTdWJwYXJ0IDMgaXMgdGhlIG9yaWdpbmFsIG1lc3NhZ2UKICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgyKQotICAgICAgICBlcShzdWJwYXJ0LmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQotICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3Vic3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc3Vic3VicGFydFsnbWVzc2FnZS1pZCddLAogICAgICAgICAgICAnPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PicpCiAKQEAgLTE3MDYsMTYgKzE3MTYsMTYgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQogICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBlcShjb250YWluZXIxYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAKICAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfd2l0aF9leHBsaWNpdF9jb250YWluZXJfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0xNzI2LDE2ICsxNzM2LDE2IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKICAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKLSAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBlcShjb250YWluZXIyYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTc1MCw5ICsxNzYwLDkgQEAKICAgICAgICAgc3VicGFydDIgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MmEpCiAgICAgICAgIGNvbnRhaW5lci5hdHRhY2goc3VicGFydDEpCiAgICAgICAgIGNvbnRhaW5lci5hdHRhY2goc3VicGFydDIpCi0gICAgICAgIGVxKHN1YnBhcnQxLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgZXEoc3VicGFydDEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHN1YnBhcnQyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgbmVxKGNvbnRhaW5lci5hc19zdHJpbmcoMCksICcnJ1wKIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9IkJPVU5EQVJZIgpAQCAtMTc4NCw5ICsxNzk0LDkgQEAKICAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQogICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCiAgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KLSAgICAgICAgZXEoc3VicGFydDEuZ2V0X3R5cGUoKSwgTm9uZSkKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKHN1YnBhcnQyLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAogQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCkBAIC0xODQ3LDcgKzE4NTcsNyBAQAogICAgIGRlZiB0ZXN0X3BhcnNlX3RleHRfbWVzc2FnZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKClbMV0sICgnY2hhcnNldCcsICd1cy1hc2NpaScpKQpAQCAtMTg1OSw3ICsxODY5LDcgQEAKICAgICBkZWYgdGVzdF9wYXJzZV91bnR5cGVkX21lc3NhZ2Uoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKICAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQogICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKQEAgLTE5MzMsNyArMTk0Myw3IEBACiAgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcwogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCiAgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCiAgICAgICAgIHBhcmFtcyA9IHt9CiAgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKQEAgLTE5NDUsMTMgKzE5NTUsMTMgQEAKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1YnBhcnRzIGFyZSB3aGF0IHdlIGV4cGVjdAogICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDApCi0gICAgICAgIGVxKG1zZzEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQotICAgICAgICBlcShtc2cyLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKG1zZzIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKG1zZzIuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQogICAgICAgICBtc2czID0gbXNnLmdldF9wYXlsb2FkKDIpCi0gICAgICAgIGVxKG1zZzMuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQogICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQpAQCAtMTk2NSw3ICsxOTc1LDcgQEAKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCiAgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycwotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAogICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KICAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCkBAIC0xOTczLDcgKzE5ODMsNyBAQAogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQotICAgICAgICBlcShtc2cxLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCiAKQEAgLTIwNTgsMTMgKzIwNjgsMTkgQEAKICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXygnZW1haWwnKQogICAgICAgICBhbGwgPSBtb2R1bGUuX19hbGxfXwogICAgICAgICBhbGwuc29ydCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRlcicsICdJdGVyYXRvcnMnLCAnTUlNRUF1ZGlvJywgJ01JTUVCYXNlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXJzZXInLCAnVXRpbHMnLCAnYmFzZTY0TUlNRScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdW9wcmlNSU1FJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbCisgICAgICAgICAgICAjIE9sZCBuYW1lcworICAgICAgICAgICAgJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCisgICAgICAgICAgICAnSGVhZGVyJywgJ0l0ZXJhdG9ycycsICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLAorICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKKyAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAorICAgICAgICAgICAgJ1BhcnNlcicsICdVdGlscycsICdiYXNlNjRNSU1FJywKKyAgICAgICAgICAgICMgbmV3IG5hbWVzCisgICAgICAgICAgICAnYmFzZTY0bWltZScsICdjaGFyc2V0JywgJ2VuY29kZXJzJywgJ2Vycm9ycycsICdnZW5lcmF0b3InLAorICAgICAgICAgICAgJ2hlYWRlcicsICdpdGVyYXRvcnMnLCAnbWVzc2FnZScsICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsICdtaW1lJywgJ3BhcnNlcicsCisgICAgICAgICAgICAncXVvcHJpTUlNRScsICdxdW9wcmltaW1lJywgJ3V0aWxzJywKKyAgICAgICAgICAgIF0pCiAKICAgICBkZWYgdGVzdF9mb3JtYXRkYXRlKHNlbGYpOgogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQpAQCAtMjA5NywxMiArMjExMywxMiBAQAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBlcShVdGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCi0gICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgMCwgLTI4ODAwKSkKKyAgICAgICAgICAgKDIwMDMsIDIsIDI1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKIAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9jb21wYWN0X25vX2RheW9md2VlayhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIGVxKFV0aWxzLnBhcnNlZGF0ZV90eignNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAotICAgICAgICAgICAoMjAwMywgMiwgNSwgMTMsIDQ3LCAyNiwgMCwgMSwgMCwgLTI4ODAwKSkKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQogCiAgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjM1Niw3ICsyMzcyLDcgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKICAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQogICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQogCkBAIC0yNDA1LDEwICsyNDIxLDEwIEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCi0gICAgICAgIGVxKHBhcnQxLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKICAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEocGFydDIuZ2V0X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCiAKICAgICBkZWYgdGVzdF9tdWx0aXBhcnRfZGlnZXN0X3dpdGhfZXh0cmFfbWltZV9oZWFkZXJzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI0MjcsMjEgKzI0NDMsMjEgQEAKICAgICAgICAgZXEobXNnLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShwYXJ0MS5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHBhcnQxLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4ocGFydDEuZ2V0X3BheWxvYWQoKSksIDEpCiAgICAgICAgIHBhcnQxYSA9IHBhcnQxLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKHBhcnQxYS5pc19tdWx0aXBhcnQoKSwgMCkKLSAgICAgICAgZXEocGFydDFhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBuZXEocGFydDFhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDFcbicpCiAgICAgICAgICMgbmV4dCBtZXNzYWdlL3JmYzgyMgogICAgICAgICBwYXJ0MiA9IG1zZy5nZXRfcGF5bG9hZCgxKQotICAgICAgICBlcShwYXJ0Mi5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHBhcnQyLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4ocGFydDIuZ2V0X3BheWxvYWQoKSksIDEpCiAgICAgICAgIHBhcnQyYSA9IHBhcnQyLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKHBhcnQyYS5pc19tdWx0aXBhcnQoKSwgMCkKLSAgICAgICAgZXEocGFydDJhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBuZXEocGFydDJhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDJcbicpCiAKICAgICBkZWYgdGVzdF90aHJlZV9saW5lcyhzZWxmKToKQEAgLTI3MjMsNiArMjczOSwxMSBAQAogICAgICAgICBjID0gQ2hhcnNldCgnZmFrZScpCiAgICAgICAgIGVxKCdoZWxsbyB3XHhmNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCiAKKyAgICBkZWYgdGVzdF91bmljb2RlX2NoYXJzZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFcnJvcnMuQ2hhcnNldEVycm9yLCBDaGFyc2V0LCAnYXNjXHhmZmlpJykKKwogCiAMCiAjIFRlc3QgbXVsdGlsaW5ndWFsIE1JTUUgaGVhZGVycy4KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKaW5kZXggMTU5OTg5Yy4uMzhiN2Q5NSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKQEAgLTEwLDYgKzEwLDEzIEBACiBmcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCiBmcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKIAorIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkCisKIAogDAogY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJhY2NkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weQpAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsIGltcG9ydCBUZXN0RW1haWxCYXNlCitmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKK2Zyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIsIGRlY29kZV9oZWFkZXIKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorCisjIFdlJ3JlIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBidXQgaXQgZG9lc24ndCBoYXZlIHRoZSBidWlsdC1pbiBBc2lhbgorIyBjb2RlY3MsIHNvIHdlIGhhdmUgdG8gc2tpcCBhbGwgdGhlc2UgdGVzdHMuCit0cnk6CisgICAgdW5pY29kZSgnZm9vJywgJ2V1Yy1qcCcpCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQKKworCisMCitjbGFzcyBUZXN0RW1haWxBc2lhbkNvZGVjcyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9qYXBhbmVzZV9jb2RlY3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGogPSBDaGFyc2V0KCJldWMtanAiKQorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGggPSBIZWFkZXIoIkhlbGxvIFdvcmxkISIpCisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBnaGVsbG8gPSAnR3JceGZjXHhkZiBHb3R0IScKKyAgICAgICAgaC5hcHBlbmQoamhlbGxvLCBqKQorICAgICAgICBoLmFwcGVuZChnaGVsbG8sIGcpCisgICAgICAgICMgQkFXOiBUaGlzIHVzZWQgdG8gLS0gYW5kIG1heWJlIHNob3VsZCAtLSBmb2xkIHRoZSB0d28gaXNvLTg4NTktMQorICAgICAgICAjIGNodW5rcyBpbnRvIGEgc2luZ2xlIGVuY29kZWQgd29yZC4gIEhvd2V2ZXIgaXQgZG9lc24ndCB2aW9sYXRlIHRoZQorICAgICAgICAjIHN0YW5kYXJkIHRvIGhhdmUgdGhlbSBhcyB0d28gZW5jb2RlZCBjaHVua3MgYW5kIG1heWJlIGl0J3MKKyAgICAgICAgIyByZWFzb25hYmxlIDx3aW5rPiBmb3IgZWFjaCAuYXBwZW5kKCkgY2FsbCB0byByZXN1bHQgaW4gYSBzZXBhcmF0ZQorICAgICAgICAjIGVuY29kZWQgd29yZC4KKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorSGVsbG8gV29ybGQhID0/aXNvLTIwMjItanA/Yj9HeVJDSlU4bGJTRThKVzhoUENWckpVa2hLaHNvUWc9PT89CisgPT9pc28tODg1OS0xP3E/R3I9RkM9REY/PSA9P2lzby04ODU5LTE/cT9fR290dCE/PSIiIikKKyAgICAgICAgZXEoZGVjb2RlX2hlYWRlcihoLmVuY29kZSgpKSwKKyAgICAgICAgICAgWygnSGVsbG8gV29ybGQhJywgTm9uZSksCisgICAgICAgICAgICAoJ1x4MWIkQiVPJW0hPCVvITwlayVJISpceDFiKEInLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICgnR3JceGZjXHhkZiBHb3R0IScsICdpc28tODg1OS0xJyldKQorICAgICAgICBsb25nID0gJ3Rlc3QtamEgXHhhNFx4ZDhceGM1XHhlYVx4YjlceGM2XHhhNFx4YjVceGE0XHhlY1x4YTRceGJmXHhhNVx4ZTFceGExXHhiY1x4YTVceGViXHhhNFx4Y2ZceGJiXHhjYVx4YjJceGYxXHhiY1x4ZDRceGE0XHhjZVx4YmVceGI1XHhjN1x4YTdceGE0XHhmMlx4YzJceGQ0XHhhNFx4YzNceGE0XHhjNlx4YTRceGE0XHhhNFx4ZGVceGE0XHhiOScKKyAgICAgICAgaCA9IEhlYWRlcihsb25nLCBqLCBoZWFkZXJfbmFtZT0iU3ViamVjdCIpCisgICAgICAgICMgdGVzdCBhIHZlcnkgbG9uZyBoZWFkZXIKKyAgICAgICAgZW5jID0gaC5lbmNvZGUoKQorICAgICAgICAjIFRLOiBzcGxpdHRpbmcgcG9pbnQgbWF5IGRpZmZlciBieSBjb2RlYyBkZXNpZ24gYW5kL29yIEhlYWRlciBlbmNvZGluZworICAgICAgICBlcShlbmMgLCAiIiJcCis9P2lzby0yMDIyLWpwP2I/ZEdWemRDMXFZU0FiSkVJa1dFVnFPVVlrTlNSc0pEOGxZU0U4Sldza1R6dEtHeWhDPz0KKyA9P2lzby0yMDIyLWpwP2I/R3lSQ01uRThWQ1JPUGpWSEp5UnlRbFFrUXlSR0pDUWtYaVE1R3loQz89IiIiKQorICAgICAgICAjIFRLOiBmdWxsIGRlY29kZSBjb21wYXJpc29uCisgICAgICAgIGVxKGguX191bmljb2RlX18oKS5lbmNvZGUoJ2V1Yy1qcCcpLCBsb25nKQorCisgICAgZGVmIHRlc3RfcGF5bG9hZF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGpjb2RlICA9ICdldWMtanAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoamhlbGxvLCBqY29kZSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUobXNnLmdldF9wYXlsb2FkKCksIG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoamhlbGxvLCB1c3RyLmVuY29kZShqY29kZSkpCisKKworDAorZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RFbWFpbEFzaWFuQ29kZWNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RFbWFpbEFzaWFuQ29kZWNzKQorCisKKwwKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzJlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTAsMCArMSwzMDc4IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgZW1haWwKKworZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyLCBtYWtlX2hlYWRlcgorZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlciwgSGVhZGVyUGFyc2VyCitmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yLCBEZWNvZGVkR2VuZXJhdG9yCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5hcHBsaWNhdGlvbiBpbXBvcnQgTUlNRUFwcGxpY2F0aW9uCitmcm9tIGVtYWlsLm1pbWUuYXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0Citmcm9tIGVtYWlsLm1pbWUuaW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQorZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLm1pbWUubWVzc2FnZSBpbXBvcnQgTUlNRU1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5tdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKK2Zyb20gZW1haWwgaW1wb3J0IHV0aWxzCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsIGltcG9ydCBpdGVyYXRvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGJhc2U2NG1pbWUKK2Zyb20gZW1haWwgaW1wb3J0IHF1b3ByaW1pbWUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdAorZnJvbSBlbWFpbC50ZXN0IGltcG9ydCBfX2ZpbGVfXyBhcyBsYW5kbWFyaworCisKK05MID0gJ1xuJworRU1QVFlTVFJJTkcgPSAnJworU1BBQ0UgPSAnICcKKworCisMCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgZmlsZW5hbWUpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSkKKworCisMCisjIEJhc2UgdGVzdCBjbGFzcworY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkxpa2UgZmFpbFVubGVzc0VxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKKyAgICAgICAgaWYgZmlyc3QgPD4gc2Vjb25kOgorICAgICAgICAgICAgc2ZpcnN0ID0gc3RyKGZpcnN0KQorICAgICAgICAgICAgc3NlY29uZCA9IHN0cihzZWNvbmQpCisgICAgICAgICAgICBkaWZmID0gZGlmZmxpYi5uZGlmZihzZmlyc3Quc3BsaXRsaW5lcygpLCBzc2Vjb25kLnNwbGl0bGluZXMoKSkKKyAgICAgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgcHJpbnQgPj4gZnAsIE5MLCBOTC5qb2luKGRpZmYpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24sIGZwLmdldHZhbHVlKCkKKworICAgIGRlZiBfbXNnb2JqKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZShmaW5kZmlsZShmaWxlbmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICByZXR1cm4gbXNnCisKKworDAorIyBUZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgTWVzc2FnZSBjbGFzcydzIEFQSQorY2xhc3MgVGVzdE1lc3NhZ2VBUEkoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X2FsbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzIwLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCdjYycpLCBbJ2NjY0B6enoub3JnJywgJ2RkZEB6enoub3JnJywgJ2VlZUB6enoub3JnJ10pCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCd4eCcsICduL2EnKSwgJ24vYScpCisKKyAgICBkZWYgdGVzdF9nZXRzZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTg4NTktMScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICdpc28tODg1OS0xJykKKyAgICAgICAgIyBSZW1vdmUgdGhlIGNoYXJzZXQKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCBOb25lKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgVHJ5IGFkZGluZyBhIGNoYXJzZXQgd2hlbiB0aGVyZSdzIGFscmVhZHkgTUlNRSBoZWFkZXJzIHByZXNlbnQKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTUlNRS1WZXJzaW9uJ10gPSAnMi4wJworICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQveC13ZWlyZCcKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAncXVpbnRlZC1wdW50YWJsZScKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcyLjAnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC94LXdlaXJkOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVpbnRlZC1wdW50YWJsZScpCisKKyAgICBkZWYgdGVzdF9zZXRfY2hhcnNldF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfcGF5bG9hZF93aXRoX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGhpcyBpcyBhIHN0cmluZyBwYXlsb2FkJywgY2hhcnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF9nZXRfY2hhcnNldHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA4LnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnaXNvLTg4NTktMicsICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOS50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoJ2RpbmdiYXQnKQorICAgICAgICBlcShjaGFyc2V0cywgWydkaW5nYmF0JywgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnZGluZ2JhdCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2tvaTgtciddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEyLnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCBOb25lLCAnaXNvLTg4NTktMicsCisgICAgICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLCAndXMtYXNjaWknLCAna29pOC1yJ10pCisKKyAgICBkZWYgdGVzdF9nZXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9maWxlbmFtZSgpLCAnZGluZ3VzZmlzaC5naWYnKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lX3dpdGhfbmFtZV9wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQ0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICBkZWYgdGVzdF9nZXRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICAjIE5vIHF1b3RlcyEKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3Rfc2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG9uZSBoYXMgbm8gZXhpc3RpbmcgYm91bmRhcnkgcGFyYW1ldGVyLCBidXQgdGhlIENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBoZWFkZXIgYXBwZWFycyBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgVGhpcyBvbmUgaGFzIGEgQ29udGVudC1UeXBlOiBoZWFkZXIsIHdpdGggYSBib3VuZGFyeSwgc3R1Y2sgaW4gdGhlCisgICAgICAgICMgbWlkZGxlIG9mIGl0cyBoZWFkZXJzLiAgTWFrZSBzdXJlIHRoZSBvcmRlciBpcyBwcmVzZXJ2ZWQ7IGl0IHNob3VsZAorICAgICAgICAjIGJlIGZpZnRoLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGhlYWRlciwgdmFsdWUgPSBtc2cuaXRlbXMoKVs0XQorICAgICAgICBlcShoZWFkZXIubG93ZXIoKSwgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGVxKHZhbHVlLCAnbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiJykKKyAgICAgICAgIyBBbmQgdGhpcyBvbmUgaGFzIG5vIENvbnRlbnQtVHlwZTogaGVhZGVyIGF0IGFsbC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zZXRfYm91bmRhcnksICdCT1VOREFSWScpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTAudHh0JykKKyAgICAgICAgIyBUaGUgb3V0ZXIgbWVzc2FnZSBpcyBhIG11bHRpcGFydAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBOb25lKQorICAgICAgICAjIFN1YnBhcnQgMSBpcyA3Yml0IGVuY29kZWQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDApLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS5cbicpCisgICAgICAgICMgU3VicGFydCAyIGlzIHF1b3ByaQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnXHhhMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSFcbicpCisgICAgICAgICMgU3VicGFydCAzIGlzIGJhc2U2NAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMikuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuJykKKyAgICAgICAgIyBTdWJwYXJ0IDQgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDMpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci5cbicpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF91dV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnYmVnaW4gNjY2IC1cbis6JjVMOyZcXEA9Vl1SOyYwIFxuIFxuZW5kXG4nKQorICAgICAgICBmb3IgY3RlIGluICgneC11dWVuY29kZScsICd1dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gY3RlCisgICAgICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICAjIE5vdyB0cnkgc29tZSBib2d1cyBkYXRhCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xNy50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBEZWNvZGVkR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHMuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X19jb250YWluc19fKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCisgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCisgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUTycgaW4gbXNnKQorCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEodGV4dCwgbXNnLmFzX3N0cmluZygpKQorICAgICAgICBmdWxscmVwciA9IHN0cihtc2cpCisgICAgICAgIGxpbmVzID0gZnVsbHJlcHIuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCisgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKKworICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiQ29udGVudC1UeXBlOiBibGFyZzsgYmF6OyBib29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmF6JyksICcnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiRnJvbTogZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYmxhcmc7IGZpbGVuYW1lXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9ib3VuZGFyeSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbz1vbmU7IGJhcj10d287IGJhej10aHJlZVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnb25lJyksICgnYmFyJywgJ3R3bycpLCAoJ2JheicsICd0aHJlZScpXSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9b25lOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2xpYmVyYWwoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ0NvbnRlbnQtVHlwZTogTXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeSA9ICJDUElNU1NNVFBDMDZwNWYzdEciJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ2JvdW5kYXJ5JyksICdDUElNU1NNVFBDMDZwNWYzdEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICJYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4iKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JywgaGVhZGVyPSd4LWhlYWRlcicpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JyksIE5vbmUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPSJvbmUiOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdmb28nLCBoZWFkZXI9J3gtaGVhZGVyJyksICcnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICdvbmUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXonLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICAjIFhYWDogV2UgYXJlIG5vdCBSRkMtMjA0NSBjb21wbGlhbnQhICBXZSBjYW5ub3QgcGFyc2U6CisgICAgICAgICMgbXNnWyJDb250ZW50LVR5cGUiXSA9ICd0ZXh0L3BsYWluOyB3ZWlyZD0iaGV5OyBkb2xseT8gW3lvdV0gQCA8XFwiaG9tZVxcIj4/IicKKyAgICAgICAgIyBtc2cuZ2V0X3BhcmFtKCJ3ZWlyZCIpCisgICAgICAgICMgeWV0LgorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2Z1bmt5X2NvbnRpbnVhdGlvbl9saW5lcyhzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjIudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BhcmFtKCduYW1lJyksICd3aWJibGUuSlBHJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV93aXRoX3NlbWlzX2luX3F1b3RlcyhzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGltYWdlL3BqcGVnOyBuYW1lPSJKaW0mYW1wOyZhbXA7SmlsbCJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScpLCAnSmltJmFtcDsmYW1wO0ppbGwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ25hbWUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkppbSZhbXA7JmFtcDtKaWxsIicpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tMjAyMi1qcCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby0yMDIyLWpwJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnaW1wb3J0YW5jZScsICdoaWdoIHZhbHVlJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnaW1wb3J0YW5jZScpLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCB1bnF1b3RlPUZhbHNlKSwgJyJoaWdoIHZhbHVlIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICdoaWdoIHZhbHVlJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyh1bnF1b3RlPUZhbHNlKSwgWygndGV4dC9wbGFpbicsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnY2hhcnNldCcsICciaXNvLTIwMjItanAiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnImhpZ2ggdmFsdWUiJyldKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ2lzby05OTk5LXh4JywgaGVhZGVyPSdYLUppbW15JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIGhlYWRlcj0nWC1KaW1teScpLCAnaXNvLTk5OTkteHgnKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwgKCdyZXBvcnQtdHlwZScsICdkZWxpdmVyeS1zdGF0dXMnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgb2xkX3ZhbCA9IG1zZy5nZXRfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgbXNnLmRlbF9wYXJhbSgicmVwb3J0LXR5cGUiKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyldKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIsIG9sZF92YWwpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAgICgncmVwb3J0LXR5cGUnLCBvbGRfdmFsKV0pCisKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW1fb25fb3RoZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKyAgICAgICAgbXNnLmRlbF9wYXJhbSgnZmlsZW5hbWUnLCAnY29udGVudC1kaXNwb3NpdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sICdhdHRhY2htZW50JykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1zZy5zZXRfdHlwZSwgJ3RleHQnKQorICAgICAgICBtc2cuc2V0X3R5cGUoJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L2h0bWwnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9odG1sOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3R5cGVfb25fb3RoZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydYLUNvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nCisgICAgICAgIG1zZy5zZXRfdHlwZSgnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ1gtQ29udGVudC1UeXBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ3gtY29udGVudC10eXBlJ10sICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICduby1zbGFzaC1pbi10aGlzLXN0cmluZycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdGaXJzdCcsICdPbmUnKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignU2Vjb25kJywgJ1R3bycpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdUaGlyZCcsICdUaHJlZScpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJ10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUnLCAnVHdvJywgJ1RocmVlJ10pCisgICAgICAgIG1zZy5yZXBsYWNlX2hlYWRlcignU2Vjb25kJywgJ1R3ZW50eScpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJ10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUnLCAnVHdlbnR5JywgJ1RocmVlJ10pCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdGaXJzdCcsICdFbGV2ZW4nKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ0ZpcnN0JywgJ09uZSBIdW5kcmVkJykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnLCAnRmlyc3QnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZSBIdW5kcmVkJywgJ1R3ZW50eScsICdUaHJlZScsICdFbGV2ZW4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIG1zZy5yZXBsYWNlX2hlYWRlciwgJ0ZvdXJ0aCcsICdNaXNzaW5nJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgeCA9ICdBd0RwMFA3Ly95Nkx3S0VBY1BhLzZRPTknCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ2NvbnRlbnQtdHlwZSddID0gJ2F1ZGlvL3gtbWlkaScKKyAgICAgICAgbXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10gPSAnYmFzZTY0JworICAgICAgICBtc2cuc2V0X3BheWxvYWQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCB4KQorCisKKwwKKyMgVGVzdCB0aGUgZW1haWwuZW5jb2RlcnMgbW9kdWxlCitjbGFzcyBUZXN0RW5jb2RlcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZV9lbXB0eV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfY2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFdpdGggbm8gZXhwbGljaXQgX2NoYXJzZXQgaXRzIHVzLWFzY2lpLCBhbmQgYWxsIGFyZSA3LWJpdAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorICAgICAgICAjIFNpbWlsYXIsIGJ1dCB3aXRoIDgtYml0IGRhdGEKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIFx4Zjggd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICAjIEFuZCBub3cgd2l0aCBhIGRpZmZlcmVudCBjaGFyc2V0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJywgX2NoYXJzZXQ9J2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorCisKKwwKKyMgVGVzdCBsb25nIGhlYWRlciB3cmFwcGluZworY2xhc3MgVGVzdExvbmdIZWFkZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NwbGl0X2xvbmdfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dAorCit0ZXN0CisiIiIpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiBidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQKKwordGVzdAorIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX2FsbW9zdF91bnNwbGl0dGFibGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIikKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19ub25zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGN6X2hlYWQgPSAiRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoIGRceGY5dnRpcHUuLiAiCisgICAgICAgIHV0ZjhfaGVhZCA9IHUiXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3XHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBoID0gSGVhZGVyKGdfaGVhZCwgZywgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PQorCisiIiIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmQ/PQorID0/aXNvLTg4NTktMT9xP2VyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGk/PQorID0/aXNvLTg4NTktMT9xP3NjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmc/PQorID0/aXNvLTg4NTktMT9xP2VuX2JlZj1GNnJkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0Pz0KKyA9P2lzby04ODU5LTI/cT9yb3BvbGVfc2VfaHJvdXRpbHlfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U/PQorID0/dXRmLTg/Yj80NEcrNDRHYjQ0S1Q0NENDNUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I/PQorID0/dXRmLTg/Yj80NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q00/PQorID0/dXRmLTg/cT9XZW5uX2lzdF9kYXNfTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXM/PQorID0/dXRmLTg/Yj9JRTlrWlhJZ1pHbGxJRVpzYVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm93PT0/PQorID0/dXRmLTg/Yj80NEdtNDRHRTQ0Rys0NEdaNDRDQz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZV93aXRoX3RhYl9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJywKKyAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CitcdHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJycpCisgICAgICAgICMgSXQnZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgYWRkX2hlYWRlcigpIGhlcmUsIGJ1dCB0aGF0IGRvZXNuJ3QKKyAgICAgICAgIyBndWFyYW50ZWUgYW4gb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgIG1zZ1snWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCddID0gKAorICAgICAgICAgICAgJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgJycnXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0OiB3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworXHRzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKworJycnKQorCisgICAgZGVmIHRlc3Rfbm9fc2VtaXNfaGVhZGVyX3NwbGl0dGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAndGVzdEBkb20uYWluJworICAgICAgICBtc2dbJ1JlZmVyZW5jZXMnXSA9IFNQQUNFLmpvaW4oWyc8JWRAZG9tLmFpbj4nICUgaSBmb3IgaSBpbiByYW5nZSgxMCldKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1Rlc3QnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogdGVzdEBkb20uYWluCitSZWZlcmVuY2VzOiA8MEBkb20uYWluPiA8MUBkb20uYWluPiA8MkBkb20uYWluPiA8M0Bkb20uYWluPiA8NEBkb20uYWluPgorXHQ8NUBkb20uYWluPiA8NkBkb20uYWluPiA8N0Bkb20uYWluPiA8OEBkb20uYWluPiA8OUBkb20uYWluPgorCitUZXN0IiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc3BsaXRfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAnUmVmZXJlbmNlczogJyArICd4JyAqIDgwCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK1JlZmVyZW5jZXM6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX211bHRpcGxlX2xvbmdfbGluZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpIiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX2ZpcnN0X2xpbmVfb25seV9pc19sb25nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdIGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj03OCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkJywKKyAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdCitcdGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIGggPSBIZWFkZXIoJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCcsICdpc28tODg1OS0xJywKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZCgnZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZScpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1N1YmplY3Q6ID0/aXNvLTg4NTktMT9xP0JyaXRpc2NoZV9SZWdpZXJ1bmdfZ2lidD89ID0/aXNvLTg4NTktMT9xP2dyPUZDbmVzPz0KKyA9P2lzby04ODU5LTE/cT9fTGljaHRfZj1GQ3JfT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGU/PQorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nXzhiaXRfaGVhZGVyX25vX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlcGx5LVRvJ10gPSAnQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+JworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlcGx5LVRvOiBCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQgZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZSA8YS12ZXJ5LWxvbmctYWRkcmVzc0BleGFtcGxlLmNvbT4KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ190b19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHRvID0gJyJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1Piw8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sIlNvbWVvbmUgVGVzdCAjQiIgPHNvbWVvbmVAdW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCAiU29tZW9uZSBUZXN0ICNEIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4nCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1RvJ10gPSB0bworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKDApLCAnJydcCitUbzogIlNvbWVvbmUgVGVzdCAjQSIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwKK1x0IlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+CisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZV9hZnRlcl9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLicKKyAgICAgICAgaCA9IEhlYWRlcihzKQorICAgICAgICBoLmFwcGVuZCgnQWRkIGFub3RoZXIgbGluZS4nKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc3RyaW5nIHdoaWNoIGhhcyBhbG1vc3QgdGhlIGxpbWl0IG9mIGhlYWRlciBsZW5ndGguCisgQWRkIGFub3RoZXIgbGluZS4iIiIpCisKKyAgICBkZWYgdGVzdF9zaG9ydGVyX2xpbmVfd2l0aF9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIHNlbnRlbmNlLiAoU3VycHJpc2U/KScpCisgICAgICAgIGVxKGguZW5jb2RlKCksCisgICAgICAgICAgICdUaGlzIGlzIGEgc2hvcnRlciBsaW5lLiBBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorCisgICAgZGVmIHRlc3RfbG9uZ19maWVsZF9uYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmbiA9ICdYLVZlcnktVmVyeS1WZXJ5LUxvbmctSGVhZGVyLU5hbWUnCisgICAgICAgIGdzID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGggPSBIZWFkZXIoZ3MsICdpc28tODg1OS0xJywgaGVhZGVyX25hbWU9Zm4pCisgICAgICAgICMgQkFXOiB0aGlzIHNlZW1zIGJyb2tlbiBiZWNhdXNlIHRoZSBmaXJzdCBsaW5lIGlzIHRvbyBsb25nCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfPz0KKyA9P2lzby04ODU5LTE/cT9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfPz0KKyA9P2lzby04ODU5LTE/cT9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nPz0KKyA9P2lzby04ODU5LTE/cT9lZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNnJkZXJ0PTJFXz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19yZWNlaXZlZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGggPSAnZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5IGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7IFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTEnXSA9IEhlYWRlcihoLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZC0yJ10gPSBoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZC0xOiBmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkKK1x0aHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKK1x0V2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorUmVjZWl2ZWQtMjogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CitcdGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CitcdFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAKKworIiIiKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2hlYWRlcmluc3RfZXEoc2VsZik6CisgICAgICAgIGggPSAnPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPiAoRGF2aWQgQnJlbW5lclwncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKScKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMSddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZC0xJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMiddID0gaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQtMTogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorXHQoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCitSZWNlaXZlZC0yOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CitcdChEYXZpZCBCcmVtbmVyJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIikKKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ191bmJyZWFrYWJsZV9saW5lc193aXRoX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHQgPSAiIiJcCisgaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwIiIiCisgICAgICAgIG1zZ1snRmFjZS0xJ10gPSB0CisgICAgICAgIG1zZ1snRmFjZS0yJ10gPSBIZWFkZXIodCwgaGVhZGVyX25hbWU9J0ZhY2UtMicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRmFjZS0xOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKK1x0bG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwCitGYWNlLTI6IGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9hbm90aGVyX2xvbmdfbXVsdGlsaW5lX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICcnJ1wKK1JlY2VpdmVkOiBmcm9tIHNpaW1hZ2UuY29tIChbMTcyLjI1LjEuM10pIGJ5IHppbWEuc2lsaWNvbmltYWdlLmNvbSB3aXRoIE1pY3Jvc29mdCBTTVRQU1ZDKDUuMC4yMTk1LjQ5MDUpOworXHRXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aAorXHRNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsgV2VkLCAxNiBPY3QgMjAwMiAwNzo0MToxMSAtMDcwMAorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVzX3dpdGhfZGlmZmVyZW50X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9ICIiIlwKK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgICAgICAgIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4iIiIKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTGlzdCddID0gaAorICAgICAgICBtc2dbJ0xpc3QnXSA9IEhlYWRlcihoLCBoZWFkZXJfbmFtZT0nTGlzdCcpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKK1x0PG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPgorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+CisKKyIiIikKKworCisMCisjIFRlc3QgbWFuZ2xpbmcgb2YgIkZyb20gIiBsaW5lcyBpbiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UKK2NsYXNzIFRlc3RGcm9tTWFuZ2xpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5tc2dbJ0Zyb20nXSA9ICdhYWFAYmJiLm9yZycKKyAgICAgICAgc2VsZi5tc2cuc2V0X3BheWxvYWQoIiIiXAorRnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfbWFuZ2xlZF9mcm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCis+RnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfZG9udF9tYW5nbGVfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89RmFsc2UpCisgICAgICAgIGcuZmxhdHRlbihzZWxmLm1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0Zyb206IGFhYUBiYmIub3JnCisKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVBdWRpbyBjbGFzcworY2xhc3MgVGVzdE1JTUVBdWRpbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBwaWNrIHVwIHRoZSBhdWRpb3Rlc3QuYXUgdGhhdCBsaXZlcyBpbiBlbWFpbC90ZXN0L2RhdGEuCisgICAgICAgICMgSW4gUHl0aG9uLCB0aGVyZSdzIGFuIGF1ZGlvdGVzdC5hdSBsaXZpbmcgaW4gTGliL3Rlc3QgYnV0IHRoYXQgaXNuJ3QKKyAgICAgICAgIyBpbmNsdWRlZCBpbiBzb21lIGJpbmFyeSBkaXN0cm9zIHRoYXQgZG9uJ3QgaW5jbHVkZSB0aGUgdGVzdAorICAgICAgICAjIHBhY2thZ2UuICBUaGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIG9uIHRoZSAuam9pbigpIGlzIHNpZ25pZmljYW50CisgICAgICAgICMgc2luY2UgZmluZGZpbGUoKSB3aWxsIGRvIGEgZGlybmFtZSgpLgorICAgICAgICBkYXRhZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgJycpCisgICAgICAgIGZwID0gb3BlbihmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JywgZGF0YWRpciksICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2F1ZGlvZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9hdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGF1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBzZWxmLl9hdS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBlcShzZWxmLl9hdVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImF1ZGlvdGVzdC5hdSInKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2F1ZGlvdGVzdC5hdScpXSkKKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnYXVkaW90ZXN0LmF1JykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FSW1hZ2UgY2xhc3MKK2NsYXNzIFRlc3RNSU1FSW1hZ2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnUHlCYW5uZXIwNDguZ2lmJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5faW1nZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9pbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhKQorCisgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9naWYnKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9pbS5nZXRfcGF5bG9hZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZTY0LmRlY29kZXN0cmluZyhwYXlsb2FkKSwgc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEsICdmaXNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9maXNoJykKKworICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgc2VsZi5faW0uYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBlcShzZWxmLl9pbVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImRpbmd1c2Zpc2guZ2lmIicpCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbXMoaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgIFsoJ2F0dGFjaG1lbnQnLCAnJyksICgnZmlsZW5hbWUnLCAnZGluZ3VzZmlzaC5naWYnKV0pCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbSgnZmlsZW5hbWUnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgJ2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FQXBwbGljYXRpb24gY2xhc3MKK2NsYXNzIFRlc3RNSU1FQXBwbGljYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisKKyAgICBkZWYgdGVzdF9ib2R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYnl0ZXMgPSAnXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXMpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnK3Z2OC9mNy8nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlcykKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVUZXh0IGNsYXNzCitjbGFzcyBUZXN0TUlNRVRleHQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbXNnID0gTUlNRVRleHQoJ2hlbGxvIHRoZXJlJykKKworICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JywgbWlzc2luZywgaGVhZGVyPSdmb29iYXInKQorICAgICAgICAgICAgICAgaXMgbWlzc2luZykKKworICAgIGRlZiB0ZXN0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB0aGVyZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQorCisgICAgZGVmIHRlc3RfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScsIF9jaGFyc2V0PSd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisKKwwKKyMgVGVzdCBjb21wbGljYXRlZCBtdWx0aXBhcnQvKiBtZXNzYWdlcworY2xhc3MgVGVzdE11bHRpcGFydChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBjb250YWluZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgaW1hZ2UgPSBNSU1FSW1hZ2UoZGF0YSwgbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbWFnZS5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGludHJvID0gTUlNRVRleHQoJycnXAorSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorJycnKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGludHJvKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGltYWdlKQorICAgICAgICBjb250YWluZXJbJ0Zyb20nXSA9ICdCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPicKKyAgICAgICAgY29udGFpbmVyWydUbyddID0gJ0Rpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+JworICAgICAgICBjb250YWluZXJbJ1N1YmplY3QnXSA9ICdIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gnCisKKyAgICAgICAgbm93ID0gOTg3ODA5NzAyLjU0ODQ4NTk5CisgICAgICAgIHRpbWV0dXBsZSA9IHRpbWUubG9jYWx0aW1lKG5vdykKKyAgICAgICAgaWYgdGltZXR1cGxlWy0xXSA9PSAwOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS50aW1lem9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS5hbHR6b25lCisgICAgICAgIGlmIHR6c2VjcyA+IDA6CisgICAgICAgICAgICBzaWduID0gJy0nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gJysnCisgICAgICAgIHR6b2Zmc2V0ID0gJyAlcyUwNGQnICUgKHNpZ24sIHR6c2VjcyAvIDM2KQorICAgICAgICBjb250YWluZXJbJ0RhdGUnXSA9IHRpbWUuc3RyZnRpbWUoCisgICAgICAgICAgICAnJWEsICVkICViICVZICVIOiVNOiVTJywKKyAgICAgICAgICAgIHRpbWUubG9jYWx0aW1lKG5vdykpICsgdHpvZmZzZXQKKyAgICAgICAgc2VsZi5fbXNnID0gY29udGFpbmVyCisgICAgICAgIHNlbGYuX2ltID0gaW1hZ2UKKyAgICAgICAgc2VsZi5fdHh0ID0gaW50cm8KKworICAgIGRlZiB0ZXN0X2hpZXJhcmNoeShzZWxmKToKKyAgICAgICAgIyBjb252ZW5pZW5jZQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgbSA9IHNlbGYuX21zZworICAgICAgICB1bmxlc3MobS5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobS5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBlcShsZW4obS5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcmFpc2VzKEluZGV4RXJyb3IsIG0uZ2V0X3BheWxvYWQsIDIpCisgICAgICAgIG0wID0gbS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBtMSA9IG0uZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKG0wIGlzIHNlbGYuX3R4dCkKKyAgICAgICAgdW5sZXNzKG0xIGlzIHNlbGYuX2ltKQorICAgICAgICBlcShtLmdldF9wYXlsb2FkKCksIFttMCwgbTFdKQorICAgICAgICB1bmxlc3Mobm90IG0wLmlzX211bHRpcGFydCgpKQorICAgICAgICB1bmxlc3Mobm90IG0xLmlzX211bHRpcGFydCgpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfbXVsdGlwYXJ0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIHRleHQgPSAiIiJcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQorIiIiCisgICAgICAgIG1zZyA9IFBhcnNlcigpLnBhcnNlc3RyKHRleHQpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbCh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCisKKyAgICBkZWYgdGVzdF9ub19wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tJycnKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorCistLUJPVU5EQVJZLS0KKycnJykKKworICAgIGRlZiB0ZXN0X29uZV9wYXJ0X2luX2FfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfcHJlYW1ibGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSBOb25lCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0KKycnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbmxfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICdcbicKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisKKycnJykKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZXh0ZXJuYWxfYm9keShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIG1zZzEgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnKQorICAgICAgICBlcShsZW4obXNnMS5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnMS5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2V4dGVybmFsLWJvZHknKQorICAgICAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgICAgICBzdWJzdWJwYXJ0ID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICAgICAgZXEoc3Vic3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgIyBtc2dfMzcudHh0IGlzIGEgbXVsdGlwYXJ0IHRoYXQgY29udGFpbnMgdHdvIGRhc2gtYm91bmRhcnkncyBpbiBhCisgICAgICAgICMgcm93LiAgT3VyIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IGNhbGxzIGZvciBpZ25vcmluZyB0aGUgc2Vjb25kCisgICAgICAgICMgYW5kIHN1YnNlcXVlbnQgYm91bmRhcmllcy4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzcudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2lubmVyX2NvbnRhaW5zX291dGVyX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIG1zZ18zOC50eHQgaGFzIGFuIGlubmVyIHBhcnQgdGhhdCBjb250YWlucyBvdXRlciBib3VuZGFyaWVzLiAgTXkKKyAgICAgICAgIyBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiAoYmFzZWQgb24gc2VjdGlvbnMgNS4xIGFuZCA1LjEuMikgc2F5CisgICAgICAgICMgdGhlc2UgYXJlIGlsbGVnYWwgYW5kIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB1bnRlcm1pbmF0ZWQgaW5uZXIKKyAgICAgICAgIyBwYXJ0cy4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzgudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9taXhlZAorICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisiIiIpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfd2l0aF9zYW1lX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIG1zZyAzOS50eHQgaXMgc2ltaWxhcmx5IGV2aWwgaW4gdGhhdCBpdCdzIGdvdCBpbm5lciBwYXJ0cyB0aGF0IHVzZQorICAgICAgICAjIHRoZSBzYW1lIGJvdW5kYXJ5IGFzIG91dGVyIHBhcnRzLiAgQWdhaW4sIEkgYmVsaWV2ZSB0aGUgd2F5IHRoaXMgaXMKKyAgICAgICAgIyBwYXJzZWQgaXMgY2xvc2VzdCB0byB0aGUgc3Bpcml0IG9mIFJGQyAyMDQ2CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM5LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICB0ZXh0L3BsYWluCisiIiIpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV9pbl9ub25fbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBib3VuZGFyeT0iLS05NjEyODQyMzY1NTI1MjIyNjkiCisKKy0tLS05NjEyODQyMzY1NTI1MjIyNjkKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN0JpdAorCis8aHRtbD48L2h0bWw+CisKKy0tLS05NjEyODQyMzY1NTI1MjIyNjktLQorJycnKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aF9sZWFkaW5nX3NwYWNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygnJydcCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIgICAgWFhYWCIKKworLS0gICAgWFhYWAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKworLS0gICAgWFhYWAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKy0tICAgIFhYWFgtLQorJycnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBlcShtc2cuZ2V0X2JvdW5kYXJ5KCksICcgICAgWFhYWCcpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV93aXRob3V0X3RyYWlsaW5nX25ld2xpbmUoc2VsZik6CisgICAgICAgIG0gPSBQYXJzZXIoKS5wYXJzZXN0cigiIiJcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09CitDb250ZW50LVR5cGU6IGltYWdlL2ZpbGUxLmpwZworTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitZWE5rWmc9PQorLS09PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0tLSIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobS5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZCgpLCAnWVhOa1pnPT0nKQorCisKKwwKKyMgVGVzdCBzb21lIGJhZGx5IGZvcm1hdHRlZCBtZXNzYWdlcworY2xhc3MgVGVzdE5vbkNvbmZvcm1hbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE1LnR4dCcpCisgICAgICAgICMgWFhYIFdlIGNhbiBwcm9iYWJseSBldmVudHVhbGx5IGRvIGJldHRlcgorICAgICAgICBpbm5lciA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5uZXIuZGVmZWN0cyksIDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjUudHh0JykKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgJDUuMiBzYXlzIGludmFsaWQgeWllbGRzIHRleHQvcGxhaW4KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0JworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgQ2xlYXIgdGhlIG9sZCB2YWx1ZSBhbmQgdHJ5IHNvbWV0aGluZyAvcmVhbGx5LyBpbnZhbGlkCisgICAgICAgIGRlbCBtc2dbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnZm9vJworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGlkZW1wb3RlbnRseSBnZW5lcmF0ZWQKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBuZXEocy5nZXR2YWx1ZSgpLCAnQ29udGVudC1UeXBlOiBmb29cblxuJykKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIiIiXAorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc2VwYXJhdGluZ19ibGFua19saW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNS50eHQnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogaGVyZSdzIHNvbWV0aGluZyBpbnRlcmVzdGluZworCitjb3VudGVyIHRvIFJGQyAyODIyLCB0aGVyZSdzIG5vIHNlcGFyYXRpbmcgbmV3bGluZSBoZXJlCisiIiIpCisKKyAgICBkZWYgdGVzdF9seWluZ19tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBvdXRlciA9IHNlbGYuX21zZ29iaignbXNnXzQyLnR4dCcpCisgICAgICAgICMgVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGlzOgorICAgICAgICAjCisgICAgICAgICMgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICMgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgICAgIG11bHRpcGFydC9taXhlZCBbKl0KKyAgICAgICAgIworICAgICAgICAjIFsqXSBUaGlzIG1lc3NhZ2UgaXMgbWlzc2luZyBpdHMgc3RhcnQgYm91bmRhcnkKKyAgICAgICAgYmFkID0gb3V0ZXIuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmFkLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKworDAorIyBUZXN0IFJGQyAyMDQ3IGhlYWRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK2NsYXNzIFRlc3RSRkMyMDQ3KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X211bHRpbGluZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXoKKyBmb28gYmFyID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbCisgICAgICAgICAgICAoJ1JlOicsIE5vbmUpLAorICAgICAgICAgICAgKCdyXHg4YWtzbVx4OWFyZ1x4OGNzJywgJ21hYy1pY2VsYW5kJyksCisgICAgICAgICAgICAoJ2JheiBmb28gYmFyJywgTm9uZSksCisgICAgICAgICAgICAoJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKV0pCisgICAgICAgIGVxKHN0cihtYWtlX2hlYWRlcihkaCkpLAorICAgICAgICAgICAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXogZm9vIGJhcgorID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJz0/SVNPLTg4NTktMT9RP0FuZHI9RTk/PSBQaXJhcmQgPHBpcmFyZEBkb20uYWluPicKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdBbmRyXHhlOScsICdpc28tODg1OS0xJyksICgnUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nLCBOb25lKV0pCisgICAgICAgIGh1ID0gdW5pY29kZShtYWtlX2hlYWRlcihkaCkpLmVuY29kZSgnbGF0aW4tMScpCisgICAgICAgIGVxKGh1LCAnQW5kclx4ZTkgUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcl91bmljb2RlXzIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoZSA9P2lzby04ODU5LTE/Yj9jWFZwWTJzZ1luSnZkMjRnWm05ND89IGp1bXBlZCBvdmVyIHRoZSA9P2lzby04ODU5LTE/Yj9iR0Y2ZVNCa2IyYz0/PScKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdUaGUnLCBOb25lKSwgKCdxdWljayBicm93biBmb3gnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICgnanVtcGVkIG92ZXIgdGhlJywgTm9uZSksICgnbGF6eSBkb2cnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgaHUgPSBtYWtlX2hlYWRlcihkaCkuX191bmljb2RlX18oKQorICAgICAgICBlcShodSwgdSdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZycpCisKKworDAorIyBUZXN0IHRoZSBNSU1FTWVzc2FnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVNZXNzYWdlKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzExLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3RleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTUlNRU1lc3NhZ2UsICdhIHBsYWluIHN0cmluZycpCisKKyAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdAorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKHN1YnBhcnQgaXMgbSkKKyAgICAgICAgZXEoc3VicGFydFsnc3ViamVjdCddLCBzdWJqZWN0KQorCisgICAgZGVmIHRlc3RfYmFkX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZzEgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMVsnU3ViamVjdCddID0gJ3N1YnBhcnQgMScKKyAgICAgICAgbXNnMiA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cyWydTdWJqZWN0J10gPSAnc3VicGFydCAyJworICAgICAgICByID0gTUlNRU1lc3NhZ2UobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvciwgci5hdHRhY2gsIG1zZzIpCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZShzZWxmKToKKyAgICAgICAgIyBGaXJzdCBjcmFmdCB0aGUgbWVzc2FnZSB0byBiZSBlbmNhcHN1bGF0ZWQKKyAgICAgICAgbSA9IE1lc3NhZ2UoKQorICAgICAgICBtWydTdWJqZWN0J10gPSAnQW4gZW5jbG9zZWQgbWVzc2FnZScKKyAgICAgICAgbS5zZXRfcGF5bG9hZCgnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCisgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQorICAgICAgICByWydTdWJqZWN0J10gPSAnVGhlIGVuY2xvc2luZyBtZXNzYWdlJworICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IFRoZSBlbmNsb3NpbmcgbWVzc2FnZQorCitTdWJqZWN0OiBBbiBlbmNsb3NlZCBtZXNzYWdlCisKK0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisiIiIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9tZXNzYWdlX3JmYzgyMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQorICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorCisgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworIiIiKQorICAgICAgICAjIFN1YnBhcnQgMiBjb250YWlucyB0aGUgbWFjaGluZSBwYXJzYWJsZSBEU04gaW5mb3JtYXRpb24uICBJdAorICAgICAgICAjIGNvbnNpc3RzIG9mIHR3byBibG9ja3Mgb2YgaGVhZGVycywgcmVwcmVzZW50ZWQgYnkgdHdvIG5lc3RlZCBNZXNzYWdlCisgICAgICAgICMgb2JqZWN0cy4KKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgorICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCisgICAgICAgIGRzbjEgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjEsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24xWydvcmlnaW5hbC1lbnZlbG9wZS1pZCddLCAnMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdScpCisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCdkbnMnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgJycpCisgICAgICAgICMgVHJ5IGEgbWlzc2luZyBvbmUgPHdpbms+CisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCduc2QnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgTm9uZSkKKyAgICAgICAgZHNuMiA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMiwgTWVzc2FnZSkpCisgICAgICAgIGVxKGRzbjJbJ2FjdGlvbiddLCAnZmFpbGVkJykKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW1zKGhlYWRlcj0nb3JpZ2luYWwtcmVjaXBpZW50JyksCisgICAgICAgICAgIFsoJ3JmYzgyMicsICcnKSwgKCdqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUnLCAnJyldKQorICAgICAgICBlcShkc24yLmdldF9wYXJhbSgncmZjODIyJywgaGVhZGVyPSdmaW5hbC1yZWNpcGllbnQnKSwgJycpCisgICAgICAgICMgU3VicGFydCAzIGlzIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3Vic3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3Vic3VicGFydCwgTWVzc2FnZSkpCisgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKKyAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQorCisgICAgZGVmIHRlc3RfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snVG8nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ1Rlc3QnCisgICAgICAgIG1zZy5wcmVhbWJsZSA9ICdNSU1FIG1lc3NhZ2UnCisgICAgICAgIG1zZy5lcGlsb2d1ZSA9ICdFbmQgb2YgTUlNRSBtZXNzYWdlXG4nCisgICAgICAgIG1zZzEgPSBNSU1FVGV4dCgnT25lJykKKyAgICAgICAgbXNnMiA9IE1JTUVUZXh0KCdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMSkKKyAgICAgICAgbXNnLmF0dGFjaChtc2cyKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX25sX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IFRlc3QKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKK01JTUUgbWVzc2FnZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK09uZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1R3bworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMzAudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdHlwZV93aXRoX2V4cGxpY2l0X2NvbnRhaW5lcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfbm9uX3BhcnNlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFNldCB1cCBjb250YWluZXIKKyAgICAgICAgY29udGFpbmVyID0gTUlNRU11bHRpcGFydCgnZGlnZXN0JywgJ0JPVU5EQVJZJykKKyAgICAgICAgY29udGFpbmVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgIyBTZXQgdXAgc3VicGFydHMKKyAgICAgICAgc3VicGFydDFhID0gTUlNRVRleHQoJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgc3VicGFydDJhID0gTUlNRVRleHQoJ21lc3NhZ2UgMlxuJykKKyAgICAgICAgc3VicGFydDEgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MWEpCisgICAgICAgIHN1YnBhcnQyID0gTUlNRU1lc3NhZ2Uoc3VicGFydDJhKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQxKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQyKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKycnJykKKyAgICAgICAgZGVsIHN1YnBhcnQxWydjb250ZW50LXR5cGUnXQorICAgICAgICBkZWwgc3VicGFydDFbJ21pbWUtdmVyc2lvbiddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQyWydtaW1lLXZlcnNpb24nXQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9taW1lX2F0dGFjaG1lbnRzX2luX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGV4dDEgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgdGV4dDIgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydChfc3VicGFydHM9KHRleHQxLCB0ZXh0MikpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKSwgdGV4dDEpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgxKSwgdGV4dDIpCisKKworDAorIyBBIGdlbmVyYWwgdGVzdCBvZiBwYXJzZXItPm1vZGVsLT5nZW5lcmF0b3IgaWRlbXBvdGVuY3kuICBJT1csIHJlYWQgYSBtZXNzYWdlCisjIGluLCBwYXJzZSBpdCBpbnRvIGEgbWVzc2FnZSBvYmplY3QgdHJlZSwgdGhlbiB3aXRob3V0IHRvdWNoaW5nIHRoZSB0cmVlLAorIyByZWdlbmVyYXRlIHRoZSBwbGFpbiB0ZXh0LiAgVGhlIG9yaWdpbmFsIHRleHQgYW5kIHRoZSB0cmFuc2Zvcm1lZCB0ZXh0CisjIHNob3VsZCBiZSBpZGVudGljYWwuICBOb3RlOiB0aGF0IHdlIGlnbm9yZSB0aGUgVW5peC1Gcm9tIHNpbmNlIHRoYXQgbWF5CisjIGNvbnRhaW4gYSBjaGFuZ2VkIGRhdGUuCitjbGFzcyBUZXN0SWRlbXBvdGVudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhkYXRhKQorICAgICAgICByZXR1cm4gbXNnLCBkYXRhCisKKyAgICBkZWYgX2lkZW1wb3RlbnQoc2VsZiwgbXNnLCB0ZXh0KToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfdGV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKVsxXSwgKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCBOb25lKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsIE5vbmUpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcGFyc2VfdW50eXBlZF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI3LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Rfd2l0aF9wYXJ0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWl4ZWRfd2l0aF9pbWFnZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfcmVwb3J0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wcmVhbWJsZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfb25lX3BhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX3BhcnRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfY2hhcnNldChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tb3JlX3JmYzIyMzFfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzMudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF90ZXh0X3BsYWluX2luX2FfbXVsdGlwYXJ0X2RpZ2VzdChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfbXVsdGlwYXJ0X21peGVkcyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTJhLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKKyAgICAgICAgICAgIHBhcmFtc1twa10gPSBwdgorICAgICAgICBlcShwYXJhbXNbJ3JlcG9ydC10eXBlJ10sICdkZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShwYXJhbXNbJ2JvdW5kYXJ5J10sICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCAnVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQorICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnNCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnNCwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorCisgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQorICAgICAgICAjIENoZWNrIHNvbWUgb2YgdGhlIG91dGVyIGhlYWRlcnMKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAorICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1xuJykKKworCisMCisjIFRlc3QgdmFyaW91cyBvdGhlciBiaXRzIG9mIHRoZSBwYWNrYWdlJ3MgZnVuY3Rpb25hbGl0eQorY2xhc3MgVGVzdE1pc2NlbGxhbmVvdXMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0KQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICMgaWRlbXBvdGVuY3kuCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGUoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgICAgICBmcC5zZWVrKDApCisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmdfd2l0aF9jbGFzcyhzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2csIE15TWVzc2FnZSkpCisgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJ2VtYWlsJykKKyAgICAgICAgIyBDYW4ndCB1c2Ugc29ydGVkKCkgaGVyZSBkdWUgdG8gUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgICAgIGFsbCA9IG1vZHVsZS5fX2FsbF9fWzpdCisgICAgICAgIGFsbC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsKKyAgICAgICAgICAgICMgT2xkIG5hbWVzCisgICAgICAgICAgICAnQ2hhcnNldCcsICdFbmNvZGVycycsICdFcnJvcnMnLCAnR2VuZXJhdG9yJywKKyAgICAgICAgICAgICdIZWFkZXInLCAnSXRlcmF0b3JzJywgJ01JTUVBdWRpbycsICdNSU1FQmFzZScsCisgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAorICAgICAgICAgICAgJ01JTUVOb25NdWx0aXBhcnQnLCAnTUlNRVRleHQnLCAnTWVzc2FnZScsCisgICAgICAgICAgICAnUGFyc2VyJywgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLAorICAgICAgICAgICAgIyBuZXcgbmFtZXMKKyAgICAgICAgICAgICdiYXNlNjRtaW1lJywgJ2NoYXJzZXQnLCAnZW5jb2RlcnMnLCAnZXJyb3JzJywgJ2dlbmVyYXRvcicsCisgICAgICAgICAgICAnaGVhZGVyJywgJ2l0ZXJhdG9ycycsICdtZXNzYWdlJywgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywgJ21pbWUnLCAncGFyc2VyJywKKyAgICAgICAgICAgICdxdW9wcmlNSU1FJywgJ3F1b3ByaW1pbWUnLCAndXRpbHMnLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5wYXJzZWRhdGUodXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1UcnVlKSlbOjZdLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KVs6Nl0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlX3VzZWdtdChzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9RmFsc2UpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIC0wMDAwJywgdGltZS5nbXRpbWUobm93KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9VHJ1ZSksCisgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywgdGltZS5nbXRpbWUobm93KSkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJycpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Qoc2VsZik6CisgICAgICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJ1dlZCwzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKCdXZWQsIDMgQXByIDIwMDIgMTQ6NTg6MjYgKzA4MDAnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlKCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwKSkKKyAgICAgICAgZXEodGltZS5sb2NhbHRpbWUodClbOjZdLCB0aW1ldHVwWzo2XSkKKyAgICAgICAgZXEoaW50KHRpbWUuc3RyZnRpbWUoJyVZJywgdGltZXR1cCkpLCAyMDAzKQorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwWzo5XSkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5mb3JtYXRhZGRyKHV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBcnRodXIgXFxCYWNrc2xhc2hcXCBGb29iYXIiIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJworICAgICAgICBiID0gJ3BlcnNvbkBkb20uYWluJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih1dGlscy5mb3JtYXRhZGRyKChhLCBiKSkpLCAoYSwgYikpCisKKyAgICBkZWYgdGVzdF9uYW1lX3dpdGhfZG90KHNlbGYpOgorICAgICAgICB4ID0gJ0pvaG4gWC4gRG9lIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICB5ID0gJyJKb2huIFguIERvZSIgPGp4ZEBleGFtcGxlLmNvbT4nCisgICAgICAgIGEsIGIgPSAoJ0pvaG4gWC4gRG9lJywgJ2p4ZEBleGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHgpLCAoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHkpLCAoYSwgYikpCisgICAgICAgICMgZm9ybWF0YWRkcigpIHF1b3RlcyB0aGUgbmFtZSBpZiB0aGVyZSdzIGEgZG90IGluIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpLCB5KQorCisgICAgZGVmIHRlc3RfcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5OyBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBIFNpbGx5OyBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZml4X2VvbHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9cclxuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9cblxyJyksICdoZWxsb1xyXG5cclxuJykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmUgPSBzZWxmLmZhaWxJZkVxdWFsCisgICAgICAgIGNzZXQxID0gQ2hhcnNldCgpCisgICAgICAgIGNzZXQyID0gQ2hhcnNldCgpCisgICAgICAgIGVxKGNzZXQxLCAndXMtYXNjaWknKQorICAgICAgICBlcShjc2V0MSwgJ1VTLUFTQ0lJJykKKyAgICAgICAgZXEoY3NldDEsICdVcy1Bc0NpSScpCisgICAgICAgIGVxKCd1cy1hc2NpaScsIGNzZXQxKQorICAgICAgICBlcSgnVVMtQVNDSUknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VzLUFzQ2lJJywgY3NldDEpCisgICAgICAgIG5lKGNzZXQxLCAndXNhc2NpaScpCisgICAgICAgIG5lKGNzZXQxLCAnVVNBU0NJSScpCisgICAgICAgIG5lKGNzZXQxLCAnVXNBc0NpSScpCisgICAgICAgIG5lKCd1c2FzY2lpJywgY3NldDEpCisgICAgICAgIG5lKCdVU0FTQ0lJJywgY3NldDEpCisgICAgICAgIG5lKCdVc0FzQ2lJJywgY3NldDEpCisgICAgICAgIGVxKGNzZXQxLCBjc2V0MikKKyAgICAgICAgZXEoY3NldDIsIGNzZXQxKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKFsnYXBlcnNvbkBkb20uYWluIChBbCBQZXJzb24pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnVkIFBlcnNvbiA8YnBlcnNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnQWwgUGVyc29uJywgJ2FwZXJzb25AZG9tLmFpbicpLAorICAgICAgICAgICAgKCdCdWQgUGVyc29uJywgJ2JwZXJzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19uYXN0eShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcyhbJ2ZvbzogOyddKSwgWygnJywgJycpXSkKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ1tdKi0tID1+JCddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJycsICcnKSwgKCcnLCAnKi0tJyldKQorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoCisgICAgICAgICAgIFsnZm9vOiA7JywgJyJKYXNvbiBSLiBNYXN0YWxlciIgPGphc29uQGRvbS5haW4+J10pLAorICAgICAgICAgICBbKCcnLCAnJyksICgnSmFzb24gUi4gTWFzdGFsZXInLCAnamFzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X3V0aWxzX3F1b3RlX3VucXVvdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdmb29cXHdhY2t5Im5hbWUnKQorICAgICAgICBlcShtc2cuZ2V0X2ZpbGVuYW1lKCksICdmb29cXHdhY2t5Im5hbWUnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF9ib2d1c19jaGFyc2V0KHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnbm90IGEgY2hhcnNldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfdXBwZXJjYXNlX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JworICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXRmLTgnKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdhR1ZzYkc4Z2QyOXliR1E9XG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisgICAgICAgICMgVHJ5IGFub3RoZXIgb25lCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9IlVTLUFTQ0lJIicKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1cy1hc2NpaScpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksIGVuY29kZXJzLmVuY29kZV83b3I4Yml0KQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRzX2Nhc2VfaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgIGxjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICB1YyA9IENoYXJzZXQoJ1VTLUFTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYy5nZXRfYm9keV9lbmNvZGluZygpLCB1Yy5nZXRfYm9keV9lbmNvZGluZygpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9mYWxsc19pbnNpZGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgVGhlIFBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgY2h1bmtzIG9mIGRhdGEgdG8gRmVlZFBhcnNlciBpbiA4MTkyCisgICAgICAgICMgYnl0ZSBndWxwcy4gIFNGIGJ1ZyAjMTA3NjQ4NSBmb3VuZCBvbmUgb2YgdGhvc2UgY2h1bmtzIGluc2lkZQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGhlYWRlciBibG9jaywgd2hpY2ggdHJpZ2dlcmVkIGFuCisgICAgICAgICMgdW5yZWFkbGluZSgpIG9mIE5lZWRNb3JlRGF0YS4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDMudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9yZXBvcnQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9yZmM4MjItaGVhZGVycworIiIiKQorCisKKwwKKyMgVGVzdCB0aGUgaXRlcmF0b3IvZ2VuZXJhdG9ycworY2xhc3MgVGVzdEl0ZXJhdG9ycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9ib2R5X2xpbmVfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGaXJzdCBhIHNpbXBsZSBub24tbXVsdGlwYXJ0IG1lc3NhZ2UKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA2KQorICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIG1zZy5nZXRfcGF5bG9hZCgpKQorICAgICAgICAjIE5vdyBhIG1vcmUgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNDMpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xOS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIGZwLnJlYWQoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAyKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKyIiIikKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3JfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csICd0ZXh0JywgJ3BsYWluJykKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBzdWJwYXJ0cyA9IDAKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gaXQ6CisgICAgICAgICAgICBzdWJwYXJ0cyArPSAxCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3VicGFydC5nZXRfcGF5bG9hZCgpKQorICAgICAgICBlcShzdWJwYXJ0cywgMSkKKyAgICAgICAgZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksICIiIlwKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKworDAorY2xhc3MgVGVzdFBhcnNlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfaGVhZGVyX3BhcnNlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgUGFyc2Ugb25seSB0aGUgaGVhZGVycyBvZiBhIGNvbXBsZXggbXVsdGlwYXJ0IE1JTUUgZG9jdW1lbnQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IEhlYWRlclBhcnNlcigpLnBhcnNlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlcShtc2dbJ2Zyb20nXSwgJ3BwcC1yZXF1ZXN0QHp6ei5vcmcnKQorICAgICAgICBlcShtc2dbJ3RvJ10sICdwcHBAenp6Lm9yZycpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRoaXMgbWVzc2FnZSBjb250YWlucyBhIGxpbmUgYWZ0ZXIgdGhlIFN1YmplY3Q6IGhlYWRlciB0aGF0IGhhcyBvbmx5CisgICAgICAgICMgd2hpdGVzcGFjZSwgYnV0IGl0IGlzIG5vdCBlbXB0eSEKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IHRoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXQKK1x4MjAKK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb25fbGFzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIExpa2UgdGhlIHByZXZpb3VzIHRlc3QsIGJ1dCB0aGUgc3ViamVjdCBsaW5lIGlzIHRoZSBsYXN0CisgICAgICAgICMgaGVhZGVyLgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorRGF0ZTogTW9uLCA4IEFwciAyMDAyIDE1OjA5OjE5IC0wNDAwCitNZXNzYWdlLUlEOiBzcGFtCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCisKK0hlcmUncyB0aGUgbWVzc2FnZSBib2R5CisiIiIpCisgICAgICAgIGVxKG1zZ1snc3ViamVjdCddLCAndGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdFxuICcpCisgICAgICAgIGVxKG1zZ1snbWVzc2FnZS1pZCddLCAnc3BhbScpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHlcbiIpCisKKyAgICBkZWYgdGVzdF9jcmxmX3NlcGFyYXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjYudHh0JywgbW9kZT0ncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vcmlzY29zJykKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9kaWdlc3Rfd2l0aF9leHRyYV9taW1lX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIFN0cnVjdHVyZSBpczoKKyAgICAgICAgIyBtdWx0aXBhcnQvZGlnZXN0CisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgIGVxKG1zZy5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQxLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MWEgPSBwYXJ0MS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MWEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQxYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAxXG4nKQorICAgICAgICAjIG5leHQgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQyLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MmEgPSBwYXJ0Mi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MmEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQyYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAyXG4nKQorCisgICAgZGVmIHRlc3RfdGhyZWVfbGluZXMoc2VsZik6CisgICAgICAgICMgQSBidWcgcmVwb3J0IGJ5IEFuZHJldyBNY05hbWFyYQorICAgICAgICBsaW5lcyA9IFsnRnJvbTogQW5kcmV3IFBlcnNvbiA8YXBlcnNvbkBkb20uYWluJywKKyAgICAgICAgICAgICAgICAgJ1N1YmplY3Q6IFRlc3QnLAorICAgICAgICAgICAgICAgICAnRGF0ZTogVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCddCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoTkwuam9pbihsaW5lcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydkYXRlJ10sICdUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX2xpbmVfZmVlZF9hbmRfY2FycmlhZ2VfcmV0dXJuX2luX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZvciBbIDEwMDI0NzUgXSBlbWFpbCBtZXNzYWdlIHBhcnNlciBkb2Vzbid0IGhhbmRsZSBcclxuIGNvcnJlY3RseQorICAgICAgICB2YWx1ZTEgPSAndGV4dCcKKyAgICAgICAgdmFsdWUyID0gJ21vcmUgdGV4dCcKKyAgICAgICAgbSA9ICdIZWFkZXI6ICVzXHJcbk5leHQtSGVhZGVyOiAlc1xyXG5cclxuQm9keVxyXG5cclxuJyAlICgKKyAgICAgICAgICAgIHZhbHVlMSwgdmFsdWUyKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXQoJ0hlYWRlcicpLCB2YWx1ZTEpCisgICAgICAgIGVxKG1zZy5nZXQoJ05leHQtSGVhZGVyJyksIHZhbHVlMikKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfaGVhZGVyX3N5bnRheChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb206IGZvb1xuRnJvbTogYmFyXG4hIiNRVVg7fjogem9vXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobGVuKG1zZy5rZXlzKCkpLCAzKQorICAgICAgICBrZXlzID0gbXNnLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBlcShrZXlzLCBbJyEiI1FVWDt+JywgJz5Gcm9tJywgJ0Zyb20nXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfc3BhY2Vfbm90X2FsbG93ZWRfaW5faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbSBmb29AZXhhbXBsZS5jb20gMTE6MjU6NTNcbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMCkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfb25lX2NoYXJhY3Rlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJ0E6IGZpcnN0IGhlYWRlclxuQjogc2Vjb25kIGhlYWRlclxuQ0M6IHRoaXJkIGhlYWRlclxuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGhlYWRlcnMgPSBtc2cua2V5cygpCisgICAgICAgIGhlYWRlcnMuc29ydCgpCisgICAgICAgIGVxKGhlYWRlcnMsIFsnQScsICdCJywgJ0NDJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKworDAorY2xhc3MgVGVzdEJhc2U2NCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5iYXNlNjRfbGVuKCdoZWxsbycpLAorICAgICAgICAgICBsZW4oYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJywgZW9sPScnKSkpCisgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgIGlmICAgc2l6ZSA9PSAwIDogYnNpemUgPSAwCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMyA6IGJzaXplID0gNAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDYgOiBic2l6ZSA9IDgKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA5IDogYnNpemUgPSAxMgorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDEyOiBic2l6ZSA9IDE2CisgICAgICAgICAgICBlbHNlICAgICAgICAgICA6IGJzaXplID0gMjAKKyAgICAgICAgICAgIGVxKGJhc2U2NG1pbWUuYmFzZTY0X2xlbigneCcqc2l6ZSksIGJzaXplKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzg9JyksICdoZWxsbycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4PScsICdYJyksICdoZWxsbycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4TkNuZHZjbXhrXG4nLCAnWCcpLCAnaGVsbG9Yd29ybGQnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJyksICdhR1ZzYkc4PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG9cbicpLCAnYUdWc2JHOEtcbicpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsb1xuJywgMCksICdhR1ZzYkc4TkNnPT1cbicpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmcKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUE9PQorIiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJQT09XHIKKyIiIikKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoZSA9IGJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBlcShoZSgnaGVsbG8nKSwgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzg9Pz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4TkNuZHZjbXhrPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGNoYXJzZXQgb3B0aW9uCisgICAgICAgIGVxKGhlKCdoZWxsbycsIGNoYXJzZXQ9J2lzby04ODU5LTInKSwgJz0/aXNvLTg4NTktMj9iP2FHVnNiRzg9Pz0nKQorICAgICAgICAjIFRlc3QgdGhlIGtlZXBfZW9scyBmbGFnCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnLCBrZWVwX2VvbHM9VHJ1ZSksCisgICAgICAgICAgICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4S2QyOXliR1E9Pz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PQorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2c/PSIiIikKKworCisMCitjbGFzcyBUZXN0UXVvcHJpKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaGxpdCA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnMCcpLCBvcmQoJzknKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFsnIScsICcqJywgJysnLCAnLScsICcvJywgJyAnXQorICAgICAgICBzZWxmLmhub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmhsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5obGl0KSArIGxlbihzZWxmLmhub24pID09IDI1NgorICAgICAgICBzZWxmLmJsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnICcpLCBvcmQoJ34nKSsxKV0gKyBbJ1x0J10KKyAgICAgICAgc2VsZi5ibGl0LnJlbW92ZSgnPScpCisgICAgICAgIHNlbGYuYm5vbiA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMjU2KSBpZiBjaHIoeCkgbm90IGluIHNlbGYuYmxpdF0KKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLmJsaXQpICsgbGVuKHNlbGYuYm5vbikgPT0gMjU2CisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhxbCA9IHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4KKyAgICAgICAgZW5jID0gcXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGZvciBzIGluICgnaGVsbG8nLCAnaEBlQGxAbEBvQCcpOgorICAgICAgICAgICAgIyBFbXB0eSBjaGFyc2V0IGFuZCBubyBsaW5lLWVuZGluZ3MuICA3ID09IFJGQyBjaHJvbWUKKyAgICAgICAgICAgIGVxKGhxbChzKSwgbGVuKGVuYyhzLCBjaGFyc2V0PScnLCBlb2w9JycpKS03KQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBlcShocWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIGVxKGhxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJxbCA9IHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfbGVuCisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgorICAgICAgICAgICAgZXEoYnFsKGMpLCAzKQorCisgICAgZGVmIHRlc3RfcXVvdGVfdW5xdW90ZV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgYyA9IGNocih4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW9wcmltaW1lLnVucXVvdGUocXVvcHJpbWltZS5xdW90ZShjKSksIGMpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBxdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89MEQ9MEF3b3JsZD89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/cT9oZWxsbz89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPVRydWUpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89MEF3b3JsZD89JykKKyAgICAgICAgIyBUZXN0IGEgbm9uLUFTQ0lJIGNoYXJhY3RlcgorICAgICAgICBlcShoZSgnaGVsbG9ceGM3dGhlcmUnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPUM3dGhlcmU/PScpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCis9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4X3h4Pz0KKyA9P2lzby04ODU5LTE/cT94eF94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz0KKyA9P2lzby04ODU5LTE/cT94eHhfeHh4eF94eHh4X3h4eHhfeHh4Pz0KKyA9P2lzby04ODU5LTE/cT94X3h4eHhfeHh4eF8/PSIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89XHIKKyA9P2lzby04ODU5LTE/cT94eF94eHh4X3h4eHhfeHh4eF94eHh4Pz1ccgorID0/aXNvLTg4NTktMT9xP194eHh4X3h4eHhfeHh4eF94eHh4X3g/PVxyCisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89XHIKKyA9P2lzby04ODU5LTE/cT94X3h4eHhfeHh4eF8/PSIiIikKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG8nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG9cbndvcmxkJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcpLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ2hlbGxvXHJcbndvcmxkJywgMCksICdoZWxsb1xud29ybGQnKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD0KKyB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eD0KK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAoreHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4PVxyCisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9XHIKK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpLCAiIiJcCitvbmUgbGluZQorCit0d28gbGluZSIiIikKKworCisMCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IGNoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQ2hhcnNldE1vZHVsZS5DSEFSU0VUU1snZmFrZSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIE1ha2Ugc3VyZSB1cy1hc2NpaSA9IG5vIFVuaWNvZGUgY29udmVyc2lvbgorICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzID0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgc3AgPSBjLnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZXEocywgYy5mcm9tX3NwbGl0dGFibGUoc3ApKQorICAgICAgICAjIHRlc3QgOC1iaXQgaWRlbXBvdGVuY3kgd2l0aCB1cy1hc2NpaQorICAgICAgICBzID0gJ1x4YTRceGEyXHhhNFx4YTRceGE0XHhhNlx4YTRceGE4XHhhNFx4YWEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggUVAgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIGVxKCdoZWxsbyB3PUY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggQmFzZTY0IGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3V0Zi04JykKKyAgICAgICAgZXEoJ2FHVnNiRzhnZDI5eWJHUT1cbicsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdvcmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIE5vbmUgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcSgnaGVsbG8gd29ybGQnLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSB0aGUgY29udmVydCBhcmd1bWVudCwgd2hlcmUgaW5wdXQgY29kZWMgPD4gb3V0cHV0IGNvZGVjCisgICAgICAgIGMgPSBDaGFyc2V0KCdldWMtanAnKQorICAgICAgICAjIFdpdGggYXBvbG9naWVzIHRvIFRva2lvIEtpa3VjaGkgOykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXEoJ1x4MWIkQjVGQ087fklXXHgxYihCJywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JykpCisgICAgICAgICAgICBlcSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLAorICAgICAgICAgICAgICAgYy5ib2R5X2VuY29kZSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLCBGYWxzZSkpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgV2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0aGUgSmFwYW5lc2UgY29kZWNzIGluc3RhbGxlZAorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3RpbmcgU0YgYnVnICM2MjU1MDksIHdoaWNoIHdlIGhhdmUgdG8gZmFrZSwgc2luY2UgdGhlcmUgYXJlIG5vCisgICAgICAgICMgYnVpbHQtaW4gZW5jb2RpbmdzIHdoZXJlIHRoZSBoZWFkZXIgZW5jb2RpbmcgaXMgUVAgYnV0IHRoZSBib2R5CisgICAgICAgICMgZW5jb2RpbmcgaXMgbm90LgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBjaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgQ2hhcnNldE1vZHVsZS5hZGRfY2hhcnNldCgnZmFrZScsIENoYXJzZXRNb2R1bGUuUVAsIE5vbmUpCisgICAgICAgIGMgPSBDaGFyc2V0KCdmYWtlJykKKyAgICAgICAgZXEoJ2hlbGxvIHdceGY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2hhcnNldF9uYW1lKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCh1J3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2hhcnNldCksICd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5DaGFyc2V0RXJyb3IsIENoYXJzZXQsICdhc2NceGZmaWknKQorCisKKwwKKyMgVGVzdCBtdWx0aWxpbmd1YWwgTUlNRSBoZWFkZXJzLgorY2xhc3MgVGVzdEhlYWRlcihUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnIEdvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISAgR29vZGJ5ZSBXb3JsZCEnKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3N1cnByaXNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJ0dvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfbmVlZHNfbm9fZGVjb2Rpbmcoc2VsZik6CisgICAgICAgIGggPSAnbm8gZGVjb2RpbmcgbmVlZGVkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZV9oZWFkZXIoaCksIFsoaCwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQorICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxlbihsKSA8PSA3NikKKworICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBjeiA9IENoYXJzZXQoImlzby04ODU5LTIiKQorICAgICAgICB1dGY4ID0gQ2hhcnNldCgidXRmLTgiKQorICAgICAgICBnX2hlYWQgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgY3pfaGVhZCA9ICJGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggZFx4Zjl2dGlwdS4uICIKKyAgICAgICAgdXRmOF9oZWFkID0gdSJcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDBcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGNcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0Llx1MzAwZFx1MzA2OFx1OGEwMFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rbz89CisgPT9pc28tODg1OS0xP3E/bWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbj89CisgPT9pc28tODg1OS0xP3E/ZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNj89CisgPT9pc28tODg1OS0xP3E/cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXRyb3BvbGVfc2VfaHJvdXRpbHk/PQorID0/aXNvLTg4NTktMj9xP19wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0gPT91dGYtOD9iPzVxMmo1Nks2Pz0KKyA9P3V0Zi04P2I/NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDPz0KKyA9P3V0Zi04P2I/NUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I0NEdDNDRHbzQ0R3Y0NEduPz0KKyA9P3V0Zi04P2I/NDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0Z6Pz0KKyA9P3V0Zi04P3E/X051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzX09kZXJfZGllX0ZsPz0KKyA9P3V0Zi04P2I/YVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm8rT0JwdU9CaE9PQnZ1T0JtUT09Pz0KKyA9P3V0Zi04P2I/NDRDQz89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGVuYyksCisgICAgICAgICAgIFsoZ19oZWFkLCAiaXNvLTg4NTktMSIpLCAoY3pfaGVhZCwgImlzby04ODU5LTIiKSwKKyAgICAgICAgICAgICh1dGY4X2hlYWQsICJ1dGYtOCIpXSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUoaCkKKyAgICAgICAgZXEodXN0ci5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICdEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kICcKKyAgICAgICAgICAgJ2tvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhjM1x4YmNkbFx4YzNceGJjbmRpc2NoZW4gJworICAgICAgICAgICAnV2FuZGdlbVx4YzNceGE0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuICcKKyAgICAgICAgICAgJ2JlZlx4YzNceGI2cmRlcnQuIEZpbmFuXHhjNFx4OGRuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kICcKKyAgICAgICAgICAgJ3RsYWtlbSBqZWppY2ggZFx4YzVceGFmdnRpcHUuLiBceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MScKKyAgICAgICAgICAgJ1x4YWJceGU4XHhhOFx4ODBceGUzXHg4MVx4ODZceGUzXHg4MVx4YThceGU3XHhiZlx4YmJceGU4XHhhOFx4YjMnCisgICAgICAgICAgICdceGUzXHg4MVx4YWZceGUzXHg4MVx4OTVceGUzXHg4Mlx4OGNceGUzXHg4MVx4YTZceGUzXHg4MVx4ODRceGUzJworICAgICAgICAgICAnXHg4MVx4YmVceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKKyAgICAgICAgICAgJ1x4YThceGUzXHg4MVx4YWZceGUzXHg4M1x4ODlceGUzXHg4Mlx4YTRceGUzXHg4M1x4ODRceGU4XHhhYVx4OWUnCisgICAgICAgICAgICdceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MVx4OGNceGUzXHg4MFx4ODFceGUzXHg4MVx4ODJceGUzJworICAgICAgICAgICAnXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MVx4OWZceGUzXHg4Mlx4ODlceGUzXHg4MicKKyAgICAgICAgICAgJ1x4ODFceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MFx4ODJceGU1XHhhZVx4OWZceGU5XHg5YVx4OWInCisgICAgICAgICAgICdceGUzXHg4MVx4YWJceGUzXHg4MVx4YWZceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0ICcKKyAgICAgICAgICAgJ3VuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCAnCisgICAgICAgICAgICdnZXJzcHV0Llx4ZTNceDgwXHg4ZFx4ZTNceDgxXHhhOFx4ZThceGE4XHg4MFx4ZTNceDgxXHhhM1x4ZTNceDgxJworICAgICAgICAgICAnXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZVx4ZTNceDgxXHg5OVx4ZTNceDgwXHg4MicpCisgICAgICAgICMgVGVzdCBtYWtlX2hlYWRlcigpCisgICAgICAgIG5ld2ggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKGVuYykpCisgICAgICAgIGVxKG5ld2gsIGVuYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9jdG9yX2RlZmF1bHRfYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGVxKGgsICcnKQorICAgICAgICBoLmFwcGVuZCgnZm9vJywgQ2hhcnNldCgnaXNvLTg4NTktMScpKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/Zm9vPz0nKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfbWF4bGluZWxlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICdBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJworICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aAorIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUKKyA3NnRoIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBtYXhsaW5lbGVuPTEwMjQsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgaHN0cikKKworICAgIGRlZiB0ZXN0X3VzX2FzY2lpX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHgsIFsoJ2hlbGxvJywgTm9uZSldKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoeCkKKyAgICAgICAgZXEocywgaC5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgZXEoaCwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorCisjIyAgICBkZWYgdGVzdF91bmljb2RlX2Vycm9yKHNlbGYpOgorIyMgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgaCA9IEhlYWRlcigpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCAnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgdSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF91dGY4X3Nob3J0ZXN0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcih1J3BceGY2c3RhbCcsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P3E/cD1DMz1CNnN0YWw/PScpCisgICAgICAgIGggPSBIZWFkZXIodSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9iPzZJK0s1Wnl3NXBtQzVhU3I/PScpCisKKyAgICBkZWYgdGVzdF9iYWRfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB4ID0gJ1lud3A0ZFVFYmF5IEF1Y3Rpb24gU2VtaWFyLSBObyBDaGFyZ2UgXHg5NiBFYXJuIEJpZycKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB4KQorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHgpCisgICAgICAgIGVxKHN0cihIZWFkZXIoeCwgZXJyb3JzPSdyZXBsYWNlJykpLCB4KQorICAgICAgICBoLmFwcGVuZCh4LCBlcnJvcnM9J3JlcGxhY2UnKQorICAgICAgICBlcShzdHIoaCksIHgpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVkX2FkamFjZW50X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBoLmFwcGVuZCgnd29ybGQnKQorICAgICAgICBzID0gaC5lbmNvZGUoKQorICAgICAgICBlcShzLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PSB3b3JsZCcpCisgICAgICAgIGggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKHMpKQorICAgICAgICBlcShoLmVuY29kZSgpLCBzKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dGs9Pz0gPT9rb2k4LXI/cT89Q0E/PSB6ei4nCisgICAgICAgIHBhcnRzID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShwYXJ0cywgWygnU3ViamVjdDonLCBOb25lKSwgKCdceGYwXHhkMlx4Y2ZceGQ3XHhjNVx4ZDJceGNiXHhjMSBceGNlXHhjMSBceGM2XHhjOVx4Y2VceGMxXHhjY1x4ZDhceGNlXHhkOVx4Y2EnLCAna29pOC1yJyksICgnenouJywgTm9uZSldKQorICAgICAgICBoZHIgPSBtYWtlX2hlYWRlcihwYXJ0cykKKyAgICAgICAgZXEoaGRyLmVuY29kZSgpLAorICAgICAgICAgICAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dG5LPz0genouJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfaGVhZGVyKHNlbGYpOgorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBzID0gJ1N1YmplY3Q6ID0/RVVDLUtSP0I/Q1NpeHBMRHRLU0MvN0xpdXZzYXg0aUM2dUxtd01jaWpJS0hhSUx6U3dkL0gwU0M4K0xDandMc2d2N1cvK01qM0lRPz0nCisgICAgICAgIHJhaXNlcyhlcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgZGVjb2RlX2hlYWRlciwgcykKKworCisMCisjIFRlc3QgUkZDIDIyMzEgaGVhZGVyIHBhcmFtZXRlcnMgKGVuL2RlKWNvZGluZworY2xhc3MgVGVzdFJGQzIyMzEoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjkudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScsIHVucXVvdGU9RmFsc2UpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJyJUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0ISInKSkKKworICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJycsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKK1x0aWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpOworXHR0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdmb28nLCAnYmFyJywgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZvbycsIGhlYWRlcj0nQ29udGVudC1UeXBlJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorXHRpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsKK1x0dGl0bGUqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzbiUyN3QlMjBpdCUyMSIKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZ2V0X2NvbnRlbnRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMyLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksICd1cy1hc2NpaScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bSIKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBOQU1FKjA9ZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU07IE5BTUUqMT1QX25zbWFpbC5odG0KKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdOQU1FJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUsICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKK1x0Ym91bmRhcnkqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRib3VuZGFyeSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfYm91bmRhcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIG5vbnNlbnNpY2FsIGNoYXJzZXQgdmFsdWUsIGJ1dCB0ZXN0cyB0aGUgY29kZSBhbnl3YXkKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKK1x0Y2hhcnNldCowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGNoYXJzZXQqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqMD1YLVVOS05PV04nJ215ZmlsZS50eHQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKKworCisMCitkZWYgX3Rlc3RjbGFzc2VzKCk6CisgICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmV0dXJuIFtnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjbGFzcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvVXRpbHMucHkgYi9MaWIvZW1haWwvdXRpbHMucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL1V0aWxzLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvdXRpbHMucHkKaW5kZXggOWJhNzYwMS4uMjUwZWIxOSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL1V0aWxzLnB5CisrKyBiL0xpYi9lbWFpbC91dGlscy5weQpAQCAtMSw5ICsxLDI0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIk1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzLiIiIgogCitfX2FsbF9fID0gWworICAgICdjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlJywKKyAgICAnZGVjb2RlX3BhcmFtcycsCisgICAgJ2RlY29kZV9yZmMyMjMxJywKKyAgICAnZW5jb2RlX3JmYzIyMzEnLAorICAgICdmb3JtYXRhZGRyJywKKyAgICAnZm9ybWF0ZGF0ZScsCisgICAgJ2dldGFkZHJlc3NlcycsCisgICAgJ21ha2VfbXNnaWQnLAorICAgICdwYXJzZWFkZHInLAorICAgICdwYXJzZWRhdGUnLAorICAgICdwYXJzZWRhdGVfdHonLAorICAgICd1bnF1b3RlJywKKyAgICBdCisKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgdGltZQpAQCAtMjQsNyArMzksNyBAQAogZnJvbSBxdW9wcmkgaW1wb3J0IGRlY29kZXN0cmluZyBhcyBfcWRlY29kZQogCiAjIEludHJhcGFja2FnZSBpbXBvcnRzCi1mcm9tIGVtYWlsLkVuY29kZXJzIGltcG9ydCBfYmVuY29kZSwgX3FlbmNvZGUKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IF9iZW5jb2RlLCBfcWVuY29kZQogCiBDT01NQVNQQUNFID0gJywgJwogRU1QVFlTVFJJTkcgPSAnJwpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9iaWc1LnB5IGIvTGliL2VuY29kaW5ncy9iaWc1LnB5CmluZGV4IGQ1NmFhMWIuLjdhZGViMGUgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvYmlnNS5weQorKysgYi9MaWIvZW5jb2RpbmdzL2JpZzUucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgYmlnNS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEJJRzUKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGJpZzUucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc190dywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfdHcuZ2V0Y29kZWMoJ2JpZzUnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdiaWc1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9iaWc1aGtzY3MucHkgYi9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQppbmRleCA0NDM5OTdmLi4zNTBkZjM3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQorKysgYi9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBiaWc1aGtzY3MucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBCSUc1SEtTQ1MKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGJpZzVoa3Njcy5weSx2IDEuMSAyMDA0LzA2LzI5IDA1OjE0OjI3IHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2hrLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19oay5nZXRjb2RlYygnYmlnNWhrc2NzJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nYmlnNWhrc2NzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDkzMi5weSBiL0xpYi9lbmNvZGluZ3MvY3A5MzIucHkKaW5kZXggMzg5MzdmNS4uZTAxZjU5YiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDkzMi5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTMyLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTMyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5MzIKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTMyLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdjcDkzMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTMyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDk0OS5weSBiL0xpYi9lbmNvZGluZ3MvY3A5NDkucHkKaW5kZXggMGYzYzg0Ny4uNjI3Yzg3MSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDk0OS5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTQ5LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTQ5LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NDkKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTQ5LnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3Nfa3IsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2tyLmdldGNvZGVjKCdjcDk0OScpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTQ5JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDk1MC5weSBiL0xpYi9lbmNvZGluZ3MvY3A5NTAucHkKaW5kZXggZGFiM2UyOC4uMzllZWM1ZSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDk1MC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTUwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTUwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NTAKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTUwLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfdHcsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX3R3LmdldGNvZGVjKCdjcDk1MCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTUwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkgYi9MaWIvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weQppbmRleCAwMmQ1NWNhLi43MmI4N2FlYSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2ppc18yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pJU18yMDA0CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfamlzXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qaXNfMjAwNCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXNfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKaW5kZXggMzBmMTczZS4uY2M0N2QwNCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2ppc3gwMjEzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pJU1gwMjEzCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfamlzeDAyMTMucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qaXN4MDIxMycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXN4MDIxMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2pwLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfanAucHkKaW5kZXggYTM5NDdhMy4uN2JjYmU0MSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfanAucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfanAucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2pwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pQCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfanAucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qcCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qcCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZXVjX2tyLnB5IGIvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKaW5kZXggYmJlYmVlOC4uYzFmYjEyNiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKKysrIGIvTGliL2VuY29kaW5ncy9ldWNfa3IucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZXVjX2tyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0tSCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBldWNfa3IucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2V1Y19rcicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19rcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2IxODAzMC5weSBiL0xpYi9lbmNvZGluZ3MvZ2IxODAzMC5weQppbmRleCA3ZWNhMzE5Li4zNGZiNmMzIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2diMTgwMzAucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYjE4MDMwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGdiMTgwMzAucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQjE4MDMwCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYjE4MDMwLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdnYjE4MDMwJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZ2IxODAzMCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2IyMzEyLnB5IGIvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKaW5kZXggNTEzMGVmYS4uM2MzYjgzNyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYjIzMTIucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZ2IyMzEyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0IyMzEyCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYjIzMTIucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diMjMxMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diMjMxMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvZ2JrLnB5IGIvTGliL2VuY29kaW5ncy9nYmsucHkKaW5kZXggNjc4NTRiYy4uMWI0NWRiOCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9nYmsucHkKKysrIGIvTGliL2VuY29kaW5ncy9nYmsucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZ2JrLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0JLCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBnYmsucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diaycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diaycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaHoucHkgYi9MaWIvZW5jb2RpbmdzL2h6LnB5CmluZGV4IDM5NDA4OTQuLjM4MzQ0MmEgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaHoucHkKKysrIGIvTGliL2VuY29kaW5ncy9oei5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBoei5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEhaCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBoei5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnaHonKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdoeicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaWRuYS5weSBiL0xpYi9lbmNvZGluZ3MvaWRuYS5weQppbmRleCA4YmRhZTMyLi5lYTkwZDY3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lkbmEucHkKKysrIGIvTGliL2VuY29kaW5ncy9pZG5hLnB5CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzcoYykgb3IgXAogICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M4KGMpIG9yIFwKICAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jOShjKToKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIkludmFsaWQgY2hhcmFjdGVyICVzIiAlIHJlcHIoYykKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgJXIiICUgYykKIAogICAgICMgQ2hlY2sgYmlkaQogICAgIFJhbmRBTCA9IG1hcChzdHJpbmdwcmVwLmluX3RhYmxlX2QxLCBsYWJlbCkKQEAgLTQ4LDE0ICs0OCwxNCBAQAogICAgICAgICAgICAgIyAyKSBJZiBhIHN0cmluZyBjb250YWlucyBhbnkgUmFuZEFMQ2F0IGNoYXJhY3RlciwgdGhlIHN0cmluZwogICAgICAgICAgICAgIyBNVVNUIE5PVCBjb250YWluIGFueSBMQ2F0IGNoYXJhY3Rlci4KICAgICAgICAgICAgIGlmIGZpbHRlcihzdHJpbmdwcmVwLmluX3RhYmxlX2QyLCBsYWJlbCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMiIKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlZpb2xhdGlvbiBvZiBCSURJIHJlcXVpcmVtZW50IDIiKQogCiAgICAgICAgICAgICAjIDMpIElmIGEgc3RyaW5nIGNvbnRhaW5zIGFueSBSYW5kQUxDYXQgY2hhcmFjdGVyLCBhCiAgICAgICAgICAgICAjIFJhbmRBTENhdCBjaGFyYWN0ZXIgTVVTVCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQogICAgICAgICAgICAgIyBzdHJpbmcsIGFuZCBhIFJhbmRBTENhdCBjaGFyYWN0ZXIgTVVTVCBiZSB0aGUgbGFzdAogICAgICAgICAgICAgIyBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZy4KICAgICAgICAgICAgIGlmIG5vdCBSYW5kQUxbMF0gb3Igbm90IFJhbmRBTFstMV06Ci0gICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMyIKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlZpb2xhdGlvbiBvZiBCSURJIHJlcXVpcmVtZW50IDMiKQogCiAgICAgcmV0dXJuIGxhYmVsCiAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgIyBTa2lwIHRvIHN0ZXAgOC4KICAgICAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKICAgICAgICAgICAgIHJldHVybiBsYWJlbAotICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJsYWJlbCB0b28gbG9uZyIKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCiAKICAgICAjIFN0ZXAgMjogbmFtZXByZXAKICAgICBsYWJlbCA9IG5hbWVwcmVwKGxhYmVsKQpAQCAtODUsMTEgKzg1LDExIEBACiAgICAgICAgICMgU2tpcCB0byBzdGVwIDguCiAgICAgICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CiAgICAgICAgICAgICByZXR1cm4gbGFiZWwKLSAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAibGFiZWwgdG9vIGxvbmciCisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQogCiAgICAgIyBTdGVwIDU6IENoZWNrIEFDRSBwcmVmaXgKICAgICBpZiBsYWJlbC5zdGFydHN3aXRoKHVhY2VfcHJlZml4KToKLSAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiTGFiZWwgc3RhcnRzIHdpdGggQUNFIHByZWZpeCIKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJMYWJlbCBzdGFydHMgd2l0aCBBQ0UgcHJlZml4IikKIAogICAgICMgU3RlcCA2OiBFbmNvZGUgd2l0aCBQVU5ZQ09ERQogICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCJwdW55Y29kZSIpCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAjIFN0ZXAgODogQ2hlY2sgc2l6ZQogICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CiAgICAgICAgIHJldHVybiBsYWJlbAotICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgImxhYmVsIHRvbyBsb25nIgorICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQogCiBkZWYgVG9Vbmljb2RlKGxhYmVsKToKICAgICAjIFN0ZXAgMTogQ2hlY2sgZm9yIEFTQ0lJCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoImFzY2lpIikKICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIkludmFsaWQgY2hhcmFjdGVyIGluIElETiBsYWJlbCIKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gSUROIGxhYmVsIikKICAgICAjIFN0ZXAgMzogQ2hlY2sgZm9yIEFDRSBwcmVmaXgKICAgICBpZiBub3QgbGFiZWwuc3RhcnRzd2l0aChhY2VfcHJlZml4KToKICAgICAgICAgcmV0dXJuIHVuaWNvZGUobGFiZWwsICJhc2NpaSIpCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAjIFN0ZXAgNzogQ29tcGFyZSB0aGUgcmVzdWx0IG9mIHN0ZXAgNiB3aXRoIHRoZSBvbmUgb2Ygc3RlcCAzCiAgICAgIyBsYWJlbDIgd2lsbCBhbHJlYWR5IGJlIGluIGxvd2VyIGNhc2UuCiAgICAgaWYgbGFiZWwubG93ZXIoKSAhPSBsYWJlbDI6Ci0gICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgKCJJRE5BIGRvZXMgbm90IHJvdW5kLXRyaXAiLCBsYWJlbCwgbGFiZWwyKQorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIklETkEgZG9lcyBub3Qgcm91bmQtdHJpcCIsIGxhYmVsLCBsYWJlbDIpCiAKICAgICAjIFN0ZXAgODogcmV0dXJuIHRoZSByZXN1bHQgb2Ygc3RlcCA1CiAgICAgcmV0dXJuIHJlc3VsdApAQCAtMTQ4LDcgKzE0OCw3IEBACiAKICAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICAgIyBJRE5BIGlzIHF1aXRlIGNsZWFyIHRoYXQgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgc3RyaWN0Ci0gICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycworICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycykKIAogICAgICAgICBpZiBub3QgaW5wdXQ6CiAgICAgICAgICAgICByZXR1cm4gIiIsIDAKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgogCiAgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzCisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQogCiAgICAgICAgIGlmIG5vdCBpbnB1dDoKICAgICAgICAgICAgIHJldHVybiB1IiIsIDAKQEAgLTE5NCwxMyArMTk0LDc5IEBACiAKICAgICAgICAgcmV0dXJuIHUiLiIuam9pbihyZXN1bHQpK3RyYWlsaW5nX2RvdCwgbGVuKGlucHV0KQogCi1jbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6Ci0gICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gQ29kZWMoKS5lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgorICAgICAgICAgICAgIyBJRE5BIGlzIHF1aXRlIGNsZWFyIHRoYXQgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgc3RyaWN0CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQogCi1jbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6Ci0gICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICByZXR1cm4gQ29kZWMoKS5kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gKCIiLCAwKQorCisgICAgICAgIGxhYmVscyA9IGRvdHMuc3BsaXQoaW5wdXQpCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CisgICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChUb0FTQ0lJKGxhYmVsKSkKKyAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgc2l6ZSArPSAxCisgICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKKworICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKKyAgICAgICAgcmVzdWx0ID0gIi4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAorICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQorCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQorCisgICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dCwgdW5pY29kZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZworICAgICAgICAgICAgaW5wdXQgPSBzdHIoaW5wdXQpCisgICAgICAgICAgICB1bmljb2RlKGlucHV0LCAiYXNjaWkiKQorICAgICAgICAgICAgbGFiZWxzID0gaW5wdXQuc3BsaXQoIi4iKQorCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgorICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJworCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvVW5pY29kZShsYWJlbCkpCisgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgIHNpemUgKz0gMQorICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCisKKyAgICAgICAgcmVzdWx0ID0gdSIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKKyAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQorICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKIAogY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weQppbmRleCAxMDk2NThiLi5hYjA0MDYwIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanAucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CmluZGV4IDIwMWJkMjguLjk5NzA0NGQgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfMS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMQogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF8xLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8xJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8xJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQppbmRleCA3YTYxMDE4Li45MTA2YmY3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBpc28yMDIyX2pwXzIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzIKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanBfMi5weSx2IDEuMiAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yMDA0LnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKaW5kZXggMjQ5NzEyNC4uNDAxOThiZiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcF8yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8yMDA0CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzIwMDQnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzIwMDQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CmluZGV4IDhiMmVkMDAuLjM0NmUwOGIgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfMy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF8zLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8zJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8zJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHkKaW5kZXggOTdjYjRlNy4uNzUyYmFiOSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfZXh0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF9FWFQKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanBfZXh0LnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF9leHQnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwX2V4dCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9rci5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9rci5weQppbmRleCBmNTU0OWNhLi5iZjcwMTg3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2tyLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfa3IucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0tSCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2tyLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9rcicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfa3InLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2pvaGFiLnB5IGIvTGliL2VuY29kaW5ncy9qb2hhYi5weQppbmRleCBiNmE4N2Q3Li41MTJhZWViIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2pvaGFiLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvam9oYWIucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgam9oYWIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBKT0hBQgogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogam9oYWIucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2pvaGFiJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nam9oYWInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weSBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CmluZGV4IGVjNWU1MTcuLjgzMzgxMTcgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIHNoaWZ0X2ppcy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJUwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdzaGlmdF9qaXMnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdzaGlmdF9qaXMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5IGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weQppbmRleCA0NDZjZDdjLi4xNjFiMWU4IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgc2hpZnRfamlzXzIwMDQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBTSElGVF9KSVNfMjAwNAogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzXzIwMDQucHksdiAxLjEgMjAwNC8wNy8wNyAxNjoxODoyNSBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc18yMDA0JykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzXzIwMDQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5IGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weQppbmRleCA0OTU0NjhiLi5jYjY1M2Y1IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5CisrKyBiL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgc2hpZnRfamlzeDAyMTMucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBTSElGVF9KSVNYMDIxMwogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogc2hpZnRfamlzeDAyMTMucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc3gwMjEzJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzeDAyMTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZ2V0cGFzcy5weSBiL0xpYi9nZXRwYXNzLnB5CmluZGV4IGEzMGQzYTEuLjgyMDRhNDcgMTAwNjQ0Ci0tLSBhL0xpYi9nZXRwYXNzLnB5CisrKyBiL0xpYi9nZXRwYXNzLnB5CkBAIC0xNSwxMSArMTUsMTQgQEAKIAogX19hbGxfXyA9IFsiZ2V0cGFzcyIsImdldHVzZXIiXQogCi1kZWYgdW5peF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcpOgorZGVmIHVuaXhfZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CiAgICAgIiIiUHJvbXB0IGZvciBhIHBhc3N3b3JkLCB3aXRoIGVjaG8gdHVybmVkIG9mZi4KKyAgICBUaGUgcHJvbXB0IGlzIHdyaXR0ZW4gb24gc3RyZWFtLCBieSBkZWZhdWx0IHN0ZG91dC4KIAogICAgIFJlc3RvcmUgdGVybWluYWwgc2V0dGluZ3MgYXQgZW5kLgogICAgICIiIgorICAgIGlmIHN0cmVhbSBpcyBOb25lOgorICAgICAgICBzdHJlYW0gPSBzeXMuc3Rkb3V0CiAKICAgICB0cnk6CiAgICAgICAgIGZkID0gc3lzLnN0ZGluLmZpbGVubygpCkBAIC0zMiwxOCArMzUsMTggQEAKICAgICBuZXdbM10gPSBuZXdbM10gJiB+dGVybWlvcy5FQ0hPICMgMyA9PSAnbGZsYWdzJwogICAgIHRyeToKICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBuZXcpCi0gICAgICAgIHBhc3N3ZCA9IF9yYXdfaW5wdXQocHJvbXB0KQorICAgICAgICBwYXNzd2QgPSBfcmF3X2lucHV0KHByb21wdCwgc3RyZWFtKQogICAgIGZpbmFsbHk6CiAgICAgICAgIHRlcm1pb3MudGNzZXRhdHRyKGZkLCB0ZXJtaW9zLlRDU0FEUkFJTiwgb2xkKQogCi0gICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHN0cmVhbS53cml0ZSgnXG4nKQogICAgIHJldHVybiBwYXNzd2QKIAogCi1kZWYgd2luX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJyk6CitkZWYgd2luX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgogICAgICIiIlByb21wdCBmb3IgcGFzc3dvcmQgd2l0aCBlY2hvIG9mZiwgdXNpbmcgV2luZG93cyBnZXRjaCgpLiIiIgogICAgIGlmIHN5cy5zdGRpbiBpcyBub3Qgc3lzLl9fc3RkaW5fXzoKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfZ2V0cGFzcyhwcm9tcHQpCisgICAgICAgIHJldHVybiBkZWZhdWx0X2dldHBhc3MocHJvbXB0LCBzdHJlYW0pCiAgICAgaW1wb3J0IG1zdmNydAogICAgIGZvciBjIGluIHByb21wdDoKICAgICAgICAgbXN2Y3J0LnB1dGNoKGMpCkBAIC02MywxNiArNjYsMTggQEAKICAgICByZXR1cm4gcHcKIAogCi1kZWYgZGVmYXVsdF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcpOgotICAgIHByaW50ICJXYXJuaW5nOiBQcm9ibGVtIHdpdGggZ2V0cGFzcy4gUGFzc3dvcmRzIG1heSBiZSBlY2hvZWQuIgotICAgIHJldHVybiBfcmF3X2lucHV0KHByb21wdCkKK2RlZiBkZWZhdWx0X2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIldhcm5pbmc6IFByb2JsZW0gd2l0aCBnZXRwYXNzLiBQYXNzd29yZHMgbWF5IGJlIGVjaG9lZC4iCisgICAgcmV0dXJuIF9yYXdfaW5wdXQocHJvbXB0LCBzdHJlYW0pCiAKIAotZGVmIF9yYXdfaW5wdXQocHJvbXB0PSIiKToKK2RlZiBfcmF3X2lucHV0KHByb21wdD0iIiwgc3RyZWFtPU5vbmUpOgogICAgICMgVGhpcyBkb2Vzbid0IHNhdmUgdGhlIHN0cmluZyBpbiB0aGUgR05VIHJlYWRsaW5lIGhpc3RvcnkuCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRvdXQKICAgICBwcm9tcHQgPSBzdHIocHJvbXB0KQogICAgIGlmIHByb21wdDoKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQpCisgICAgICAgIHN0cmVhbS53cml0ZShwcm9tcHQpCiAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCiAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgIHJhaXNlIEVPRkVycm9yCmRpZmYgLS1naXQgYS9MaWIvZ2xvYi5weSBiL0xpYi9nbG9iLnB5CmluZGV4IGVjYzZkMjUuLjk1NjU2Y2MgMTAwNjQ0Ci0tLSBhL0xpYi9nbG9iLnB5CisrKyBiL0xpYi9nbG9iLnB5CkBAIC02MCw3ICs2MCw3IEBACiAgICAgaWYgYmFzZW5hbWUgPT0gJyc6CiAgICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQogICAgICAgICAjIGRpcmVjdG9yeSBzZXBhcmF0b3IuICAncSp4Lycgc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuCi0gICAgICAgIGlmIG9zLmlzZGlyKGRpcm5hbWUpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgICBlbHNlOgogICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKaW5kZXggY2UxZmQyYS4uZGVlYjVjNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL0lPQmluZGluZy5weQpAQCAtMzc3LDYgKzM3Nyw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAid2IiKQogICAgICAgICAgICAgZi53cml0ZShjaGFycykKKyAgICAgICAgICAgIGYuZmx1c2goKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCBiYmU5ODc4Li44MTYzMzMwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSw3ICsxLDEwIEBACi1XaGF0J3MgTmV3IGluIElETEUgMS4yYTA/Ci09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBJRExFIDEuMmExPworPT09PT09PT09PT09PT09PT09PT09PT09PQogCi0qUmVsZWFzZSBkYXRlOiBYWC1YWFgtMjAwNioKKypSZWxlYXNlIGRhdGU6IDA1LUFQUi0yMDA2KgorCistIFNvdXJjZSBmaWxlIGYuZmx1c2goKSBhZnRlciB3cml0aW5nOyB0cnlpbmcgdG8gYXZvaWQgbG9zc2FnZSBpZiB1c2VyCisgIGtpbGxzIEdVSS4KIAogLSBPcHRpb25zIC8gS2V5cyAvIEFkdmFuY2VkIGRpYWxvZyBtYWRlIGZ1bmN0aW9uYWwuICBBbHNvLCBhbGxvdyBiaW5kaW5nCiAgIG9mICdtb3ZlbWVudCcga2V5cy4KQEAgLTcwLDcgKzczLDcgQEAKIAogLSBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIHdoZW4gLmlkbGVyYyBjYW4ndCBiZSBjcmVhdGVkICh3YXJuIGFuZCBleGl0KS4KIAotLSBUaGUgR1VJIHdhcyBoYW5naW5nIGlmIHRoZSBzaGVsbCB3aW5kb3cgd2FzIGNsb3NlZCB3aGlsZSBhIHJhd19pbnB1dCgpIAorLSBUaGUgR1VJIHdhcyBoYW5naW5nIGlmIHRoZSBzaGVsbCB3aW5kb3cgd2FzIGNsb3NlZCB3aGlsZSBhIHJhd19pbnB1dCgpCiAgIHdhcyBwZW5kaW5nLiAgUmVzdG9yZWQgdGhlIHF1aXQoKSBvZiB0aGUgcmVhZGxpbmUoKSBtYWlubG9vcCgpLgogICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9pZGxlLWRldi8yMDA0LURlY2VtYmVyLzAwMjMwNy5odG1sCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CmluZGV4IGVlZjI4ODUuLmZiZGU1NmMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQpAQCAtMSArMSBAQAotSURMRV9WRVJTSU9OID0gIjEuMmEwIgorSURMRV9WRVJTSU9OID0gIjEuMmExIgpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCA1N2JmMThjLi4yZTRkOTg3IDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIGlmICdiJyBpbiBtb2RlIGFuZCBzdHJpbmcubG93ZXIoZmlsZW5hbWVbLWxlbihzdWZmaXgpOl0pID09IHN1ZmZpeDoKICAgICAgICAgICAgICMgTG9va3MgbGlrZSBhIGJpbmFyeSBmaWxlLiAgV2Ugd2FudCB0byBvbmx5IHJldHVybiBhIHRleHQgZmlsZS4KICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBvciBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QpLCAnX19sb2FkZXJfXycpOgogICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogZGVmIGdldGFic2ZpbGUob2JqZWN0KToKQEAgLTM3OSw3ICszNzksNyBAQAogICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQogICAgIGZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKKyAgICAgICAgaWYgaXNtb2R1bGUobW9kdWxlKSBhbmQgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgogICAgICAgICAgICAgbW9kdWxlc2J5ZmlsZVsKICAgICAgICAgICAgICAgICBvcy5wYXRoLnJlYWxwYXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YWJzZmlsZShtb2R1bGUpKV0gPSBtb2R1bGUuX19uYW1lX18KQEAgLTQwNiw3ICs0MDYsNyBAQAogICAgIGluIHRoZSBmaWxlIGFuZCB0aGUgbGluZSBudW1iZXIgaW5kZXhlcyBhIGxpbmUgaW4gdGhhdCBsaXN0LiAgQW4gSU9FcnJvcgogICAgIGlzIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4iIiIKICAgICBmaWxlID0gZ2V0c291cmNlZmlsZShvYmplY3QpIG9yIGdldGZpbGUob2JqZWN0KQotICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUpCisgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSwgZ2V0bW9kdWxlKG9iamVjdCkuX19kaWN0X18pCiAgICAgaWYgbm90IGxpbmVzOgogICAgICAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZ2V0IHNvdXJjZSBjb2RlJykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvUGFyYS5weSBiL0xpYi9saWItb2xkL1BhcmEucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDhkYzYuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvUGFyYS5weQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0jIFRleHQgZm9ybWF0dGluZyBhYnN0cmFjdGlvbnMKLSMgTm90ZSAtLSB0aGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSwgaXQncyB0b28gc2xvdyBhbnl3YXkKLQotCi0jIE9mdC11c2VkIHR5cGUgb2JqZWN0Ci1JbnQgPSB0eXBlKDApCi0KLQotIyBSZXByZXNlbnQgYSBwYXJhZ3JhcGguICBUaGlzIGlzIGEgbGlzdCBvZiB3b3JkcyB3aXRoIGFzc29jaWF0ZWQKLSMgZm9udCBhbmQgc2l6ZSBpbmZvcm1hdGlvbiwgcGx1cyBpbmRlbnRzIGFuZCBqdXN0aWZpY2F0aW9uIGZvciB0aGUKLSMgZW50aXJlIHBhcmFncmFwaC4KLSMgT25jZSB0aGUgd29yZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGEgcGFyYWdyYXBoLCBpdCBjYW4gYmUgbGFpZCBvdXQKLSMgZm9yIGRpZmZlcmVudCBsaW5lIHdpZHRocy4gIE9uY2UgbGFpZCBvdXQsIGl0IGNhbiBiZSByZW5kZXJlZCBhdAotIyBkaWZmZXJlbnQgc2NyZWVuIGxvY2F0aW9ucy4gIE9uY2UgcmVuZGVyZWQsIGl0IGNhbiBiZSBxdWVyaWVkCi0jIGZvciBtb3VzZSBoaXRzLCBhbmQgcGFydHMgb2YgdGhlIHRleHQgY2FuIGJlIGhpZ2hsaWdodGVkCi1jbGFzcyBQYXJhOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYud29yZHMgPSBbXSAjIFRoZSB3b3JkcwotICAgICAgICBzZWxmLmp1c3QgPSAnbCcgIyBKdXN0aWZpY2F0aW9uOiAnbCcsICdyJywgJ2xyJyBvciAnYycKLSAgICAgICAgc2VsZi5pbmRlbnRfbGVmdCA9IHNlbGYuaW5kZW50X3JpZ2h0ID0gc2VsZi5pbmRlbnRfaGFuZyA9IDAKLSAgICAgICAgIyBGaW5hbCBsYXktb3V0IHBhcmFtZXRlcnMsIG1heSBjaGFuZ2UKLSAgICAgICAgc2VsZi5sZWZ0ID0gc2VsZi50b3AgPSBzZWxmLnJpZ2h0ID0gc2VsZi5ib3R0b20gPSBcCi0gICAgICAgICAgICAgICAgc2VsZi53aWR0aCA9IHNlbGYuaGVpZ2h0ID0gc2VsZi5saW5lcyA9IE5vbmUKLSAgICAjCi0gICAgIyBBZGQgYSB3b3JkLCBjb21wdXRpbmcgc2l6ZSBpbmZvcm1hdGlvbiBmb3IgaXQuCi0gICAgIyBXb3JkcyBtYXkgYWxzbyBiZSBhZGRlZCBtYW51YWxseSBieSBhcHBlbmRpbmcgdG8gc2VsZi53b3JkcwotICAgICMgRWFjaCB3b3JkIHNob3VsZCBiZSBhIDctdHVwbGU6Ci0gICAgIyAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0gICAgZGVmIGFkZHdvcmQoc2VsZiwgZCwgZm9udCwgdGV4dCwgc3BhY2UsIHN0cmV0Y2gpOgotICAgICAgICBpZiBmb250IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZC5zZXRmb250KGZvbnQpCi0gICAgICAgIHdpZHRoID0gZC50ZXh0d2lkdGgodGV4dCkKLSAgICAgICAgYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIGRlc2NlbnQgPSBkLmxpbmVoZWlnaHQoKSAtIGFzY2VudAotICAgICAgICBzcHcgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNwYWNlID0gc3BhY2UgKiBzcHcKLSAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKiBzcHcKLSAgICAgICAgdHVwbGUgPSAoZm9udCwgdGV4dCwgd2lkdGgsIHNwYWNlLCBzdHJldGNoLCBhc2NlbnQsIGRlc2NlbnQpCi0gICAgICAgIHNlbGYud29yZHMuYXBwZW5kKHR1cGxlKQotICAgICMKLSAgICAjIEhvb2tzIHRvIGJlZ2luIGFuZCBlbmQgYW5jaG9ycyAtLSBpbnNlcnQgbnVtYmVycyBpbiB0aGUgd29yZCBsaXN0IQotICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoaWQpCi0gICAgIwotICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQoMCkKLSAgICAjCi0gICAgIyBSZXR1cm4gdGhlIHRvdGFsIGxlbmd0aCAod2lkdGgpIG9mIHRoZSB0ZXh0IGFkZGVkIHNvIGZhciwgaW4gcGl4ZWxzCi0gICAgZGVmIGdldGxlbmd0aChzZWxmKToKLSAgICAgICAgdG90YWwgPSAwCi0gICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBpZiB0eXBlKHdvcmQpIGlzIG5vdCBJbnQ6Ci0gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdvcmRbMl0gKyB3b3JkWzNdCi0gICAgICAgIHJldHVybiB0b3RhbAotICAgICMKLSAgICAjIFRhYiB0byBhIGdpdmVuIHBvc2l0aW9uIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBsZWZ0IGluZGVudCk6Ci0gICAgIyByZW1vdmUgYWxsIHN0cmV0Y2gsIGFkZCBmaXhlZCBzcGFjZSB1cCB0byB0aGUgbmV3IGluZGVudC4KLSAgICAjIElmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGFscmVhZHkgYXQgdGhlIHRhYiBzdG9wLAotICAgICMgZG9uJ3QgYWRkIGFueSBuZXcgc3BhY2UgKGJ1dCBzdGlsbCByZW1vdmUgdGhlIHN0cmV0Y2gpCi0gICAgZGVmIHRhYnRvKHNlbGYsIHRhYik6Ci0gICAgICAgIHRvdGFsID0gMAotICAgICAgICBhcywgZGUgPSAxLCAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLndvcmRzKSk6Ci0gICAgICAgICAgICB3b3JkID0gc2VsZi53b3Jkc1tpXQotICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6IGNvbnRpbnVlCi0gICAgICAgICAgICAoZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUpID0gd29yZAotICAgICAgICAgICAgc2VsZi53b3Jkc1tpXSA9IChmbywgdGUsIHdpLCBzcCwgMCwgYXMsIGRlKQotICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIHdpICsgc3AKLSAgICAgICAgaWYgdG90YWwgPCB0YWI6Ci0gICAgICAgICAgICBzZWxmLndvcmRzLmFwcGVuZCgoTm9uZSwgJycsIDAsIHRhYi10b3RhbCwgMCwgYXMsIGRlKSkKLSAgICAjCi0gICAgIyBNYWtlIGEgaGFuZ2luZyB0YWc6IHRhYiB0byBoYW5nLCBpbmNyZW1lbnQgaW5kZW50X2xlZnQgYnkgaGFuZywKLSAgICAjIGFuZCByZXNldCBpbmRlbnRfaGFuZyB0byAtaGFuZwotICAgIGRlZiBtYWtlaGFuZ2luZ3RhZyhzZWxmLCBoYW5nKToKLSAgICAgICAgc2VsZi50YWJ0byhoYW5nKQotICAgICAgICBzZWxmLmluZGVudF9sZWZ0ID0gc2VsZi5pbmRlbnRfbGVmdCArIGhhbmcKLSAgICAgICAgc2VsZi5pbmRlbnRfaGFuZyA9IC1oYW5nCi0gICAgIwotICAgICMgRGVjaWRlIHdoZXJlIHRoZSBsaW5lIGJyZWFrcyB3aWxsIGJlIGdpdmVuIHNvbWUgc2NyZWVuIHdpZHRoCi0gICAgZGVmIGxheW91dChzZWxmLCBsaW5ld2lkdGgpOgotICAgICAgICBzZWxmLndpZHRoID0gbGluZXdpZHRoCi0gICAgICAgIGhlaWdodCA9IDAKLSAgICAgICAgc2VsZi5saW5lcyA9IGxpbmVzID0gW10KLSAgICAgICAgYXZhaWwxID0gc2VsZi53aWR0aCAtIHNlbGYuaW5kZW50X2xlZnQgLSBzZWxmLmluZGVudF9yaWdodAotICAgICAgICBhdmFpbCA9IGF2YWlsMSAtIHNlbGYuaW5kZW50X2hhbmcKLSAgICAgICAgd29yZHMgPSBzZWxmLndvcmRzCi0gICAgICAgIGkgPSAwCi0gICAgICAgIG4gPSBsZW4od29yZHMpCi0gICAgICAgIGxhc3Rmb250ID0gTm9uZQotICAgICAgICB3aGlsZSBpIDwgbjoKLSAgICAgICAgICAgIGZpcnN0Zm9udCA9IGxhc3Rmb250Ci0gICAgICAgICAgICBjaGFyY291bnQgPSAwCi0gICAgICAgICAgICB3aWR0aCA9IDAKLSAgICAgICAgICAgIHN0cmV0Y2ggPSAwCi0gICAgICAgICAgICBhc2NlbnQgPSAwCi0gICAgICAgICAgICBkZXNjZW50ID0gMAotICAgICAgICAgICAgbHNwID0gMAotICAgICAgICAgICAgaiA9IGkKLSAgICAgICAgICAgIHdoaWxlIGkgPCBuOgotICAgICAgICAgICAgICAgIHdvcmQgPSB3b3Jkc1tpXQotICAgICAgICAgICAgICAgIGlmIHR5cGUod29yZCkgaXMgSW50OgotICAgICAgICAgICAgICAgICAgICBpZiB3b3JkID4gMCBhbmQgd2lkdGggPj0gYXZhaWw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0gICAgICAgICAgICAgICAgaWYgd2lkdGggKyB3aSA+IGF2YWlsIGFuZCB3aWR0aCA+IDAgYW5kIHdpID4gMDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpZiBmbyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgbGFzdGZvbnQgPSBmbwotICAgICAgICAgICAgICAgICAgICBpZiB3aWR0aCA9PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rmb250ID0gZm8KLSAgICAgICAgICAgICAgICBjaGFyY291bnQgPSBjaGFyY291bnQgKyBsZW4odGUpICsgKHNwID4gMCkKLSAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoICsgd2kgKyBzcAotICAgICAgICAgICAgICAgIGxzcCA9IHNwCi0gICAgICAgICAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggKyBzdAotICAgICAgICAgICAgICAgIGxzdCA9IHN0Ci0gICAgICAgICAgICAgICAgYXNjZW50ID0gbWF4KGFzY2VudCwgYXMpCi0gICAgICAgICAgICAgICAgZGVzY2VudCA9IG1heChkZXNjZW50LCBkZSkKLSAgICAgICAgICAgICAgICBpID0gaSsxCi0gICAgICAgICAgICB3aGlsZSBpID4gaiBhbmQgdHlwZSh3b3Jkc1tpLTFdKSBpcyBJbnQgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgd29yZHNbaS0xXSA+IDA6IGkgPSBpLTEKLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGggLSBsc3AKLSAgICAgICAgICAgIGlmIGkgPCBuOgotICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gbHN0Ci0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSAwCi0gICAgICAgICAgICB0dXBsZSA9IGktaiwgZmlyc3Rmb250LCBjaGFyY291bnQsIHdpZHRoLCBzdHJldGNoLCBcCi0gICAgICAgICAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudAotICAgICAgICAgICAgbGluZXMuYXBwZW5kKHR1cGxlKQotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgYXNjZW50ICsgZGVzY2VudAotICAgICAgICAgICAgYXZhaWwgPSBhdmFpbDEKLSAgICAgICAgc2VsZi5oZWlnaHQgPSBoZWlnaHQKLSAgICAjCi0gICAgIyBDYWxsIGEgZnVuY3Rpb24gZm9yIGFsbCB3b3JkcyBpbiBhIGxpbmUKLSAgICBkZWYgdmlzaXQoc2VsZiwgd29yZGZ1bmMsIGFuY2hvcmZ1bmMpOgotICAgICAgICBhdmFpbDEgPSBzZWxmLndpZHRoIC0gc2VsZi5pbmRlbnRfbGVmdCAtIHNlbGYuaW5kZW50X3JpZ2h0Ci0gICAgICAgIGF2YWlsID0gYXZhaWwxIC0gc2VsZi5pbmRlbnRfaGFuZwotICAgICAgICB2ID0gc2VsZi50b3AKLSAgICAgICAgaSA9IDAKLSAgICAgICAgZm9yIHR1cGxlIGluIHNlbGYubGluZXM6Ci0gICAgICAgICAgICB3b3JkY291bnQsIGZpcnN0Zm9udCwgY2hhcmNvdW50LCB3aWR0aCwgc3RyZXRjaCwgXAotICAgICAgICAgICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZQotICAgICAgICAgICAgaCA9IHNlbGYubGVmdCArIHNlbGYuaW5kZW50X2xlZnQKLSAgICAgICAgICAgIGlmIGkgPT0gMDogaCA9IGggKyBzZWxmLmluZGVudF9oYW5nCi0gICAgICAgICAgICBleHRyYSA9IDAKLSAgICAgICAgICAgIGlmIHNlbGYuanVzdCA9PSAncic6IGggPSBoICsgYXZhaWwgLSB3aWR0aAotICAgICAgICAgICAgZWxpZiBzZWxmLmp1c3QgPT0gJ2MnOiBoID0gaCArIChhdmFpbCAtIHdpZHRoKSAvIDIKLSAgICAgICAgICAgIGVsaWYgc2VsZi5qdXN0ID09ICdscicgYW5kIHN0cmV0Y2ggPiAwOgotICAgICAgICAgICAgICAgIGV4dHJhID0gYXZhaWwgLSB3aWR0aAotICAgICAgICAgICAgdjIgPSB2ICsgYXNjZW50ICsgZGVzY2VudAotICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgaSt3b3JkY291bnQpOgotICAgICAgICAgICAgICAgIHdvcmQgPSBzZWxmLndvcmRzW2pdCi0gICAgICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gYW5jaG9yZnVuYyhzZWxmLCB0dXBsZSwgd29yZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgdikKLSAgICAgICAgICAgICAgICAgICAgaWYgb2sgaXMgbm90IE5vbmU6IHJldHVybiBvawotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICAgICAgICAgIGlmIGV4dHJhID4gMCBhbmQgc3RyZXRjaCA+IDA6Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gZXh0cmEgKiBzdCAvIHN0cmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYSAtIGV4Ci0gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2ggPSBzdHJldGNoIC0gc3QKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBleCA9IDAKLSAgICAgICAgICAgICAgICBoMiA9IGggKyB3aSArIHNwICsgZXgKLSAgICAgICAgICAgICAgICBvayA9IHdvcmRmdW5jKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoMiwgdjIsIChqPT1pKSwgKGo9PWkrd29yZGNvdW50LTEpKQotICAgICAgICAgICAgICAgIGlmIG9rIGlzIG5vdCBOb25lOiByZXR1cm4gb2sKLSAgICAgICAgICAgICAgICBoID0gaDIKLSAgICAgICAgICAgIHYgPSB2MgotICAgICAgICAgICAgaSA9IGkgKyB3b3JkY291bnQKLSAgICAgICAgICAgIGF2YWlsID0gYXZhaWwxCi0gICAgIwotICAgICMgUmVuZGVyIGEgcGFyYWdyYXBoIGluICJkcmF3aW5nIG9iamVjdCIgZCwgdXNpbmcgdGhlIHJlY3RhbmdsZQotICAgICMgZ2l2ZW4gYnkgKGxlZnQsIHRvcCwgcmlnaHQpIHdpdGggYW4gdW5zcGVjaWZpZWQgYm90dG9tLgotICAgICMgUmV0dXJuIHRoZSBjb21wdXRlZCBib3R0b20gb2YgdGhlIHRleHQuCi0gICAgZGVmIHJlbmRlcihzZWxmLCBkLCBsZWZ0LCB0b3AsIHJpZ2h0KToKLSAgICAgICAgaWYgc2VsZi53aWR0aCAhPSByaWdodC1sZWZ0OgotICAgICAgICAgICAgc2VsZi5sYXlvdXQocmlnaHQtbGVmdCkKLSAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAotICAgICAgICBzZWxmLnRvcCA9IHRvcAotICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKLSAgICAgICAgc2VsZi5ib3R0b20gPSBzZWxmLnRvcCArIHNlbGYuaGVpZ2h0Ci0gICAgICAgIHNlbGYuYW5jaG9yaWQgPSAwCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuZCA9IGQKLSAgICAgICAgICAgIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3JlbmRlcndvcmQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3JlbmRlcmFuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAgICAgcmV0dXJuIHNlbGYuYm90dG9tCi0gICAgIwotICAgIGRlZiBfcmVuZGVyd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaCwgdiwgaDIsIHYyLCBpc2ZpcnN0LCBpc2xhc3QpOgotICAgICAgICBpZiB3b3JkWzBdIGlzIG5vdCBOb25lOiBzZWxmLmQuc2V0Zm9udCh3b3JkWzBdKQotICAgICAgICBiYXNlbGluZSA9IHYgKyB0dXBsZVs1XQotICAgICAgICBzZWxmLmQudGV4dCgoaCwgYmFzZWxpbmUgLSB3b3JkWzVdKSwgd29yZFsxXSkKLSAgICAgICAgaWYgc2VsZi5hbmNob3JpZCA+IDA6Ci0gICAgICAgICAgICBzZWxmLmQubGluZSgoaCwgYmFzZWxpbmUrMiksIChoMiwgYmFzZWxpbmUrMikpCi0gICAgIwotICAgIGRlZiBfcmVuZGVyYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IHdvcmQKLSAgICAjCi0gICAgIyBSZXR1cm4gd2hpY2ggYW5jaG9yKHMpIHdhcyBoaXQgYnkgdGhlIG1vdXNlCi0gICAgZGVmIGhpdGNoZWNrKHNlbGYsIG1vdXNlaCwgbW91c2V2KToKLSAgICAgICAgc2VsZi5tb3VzZWggPSBtb3VzZWgKLSAgICAgICAgc2VsZi5tb3VzZXYgPSBtb3VzZXYKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IDAKLSAgICAgICAgc2VsZi5oaXRzID0gW10KLSAgICAgICAgc2VsZi52aXNpdChzZWxmLl9fY2xhc3NfXy5faGl0Y2hlY2t3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX2hpdGNoZWNrYW5jaG9yKQotICAgICAgICByZXR1cm4gc2VsZi5oaXRzCi0gICAgIwotICAgIGRlZiBfaGl0Y2hlY2t3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGlmIHNlbGYuYW5jaG9yaWQgPiAwIGFuZCBoIDw9IHNlbGYubW91c2VoIDw9IGgyIGFuZCBcCi0gICAgICAgICAgICAgICAgdiA8PSBzZWxmLm1vdXNldiA8PSB2MjoKLSAgICAgICAgICAgIHNlbGYuaGl0cy5hcHBlbmQoc2VsZi5hbmNob3JpZCkKLSAgICAjCi0gICAgZGVmIF9oaXRjaGVja2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0gICAgICAgIHNlbGYuYW5jaG9yaWQgPSB3b3JkCi0gICAgIwotICAgICMgUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFuY2hvciBpZCBpcyBwcmVzZW50Ci0gICAgZGVmIGhhc2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIHJldHVybiBpZCBpbiBzZWxmLndvcmRzIG9yIC1pZCBpbiBzZWxmLndvcmRzCi0gICAgIwotICAgICMgRXh0cmFjdCB0aGUgcmF3IHRleHQgZnJvbSB0aGUgd29yZCBsaXN0LCBzdWJzdGl0dXRpbmcgb25lIHNwYWNlCi0gICAgIyBmb3Igbm9uLWVtcHR5IGludGVyLXdvcmQgc3BhY2UsIGFuZCB0ZXJtaW5hdGluZyB3aXRoICdcbicKLSAgICBkZWYgZXh0cmFjdChzZWxmKToKLSAgICAgICAgdGV4dCA9ICcnCi0gICAgICAgIGZvciB3IGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBpZiB0eXBlKHcpIGlzIG5vdCBJbnQ6Ci0gICAgICAgICAgICAgICAgd29yZCA9IHdbMV0KLSAgICAgICAgICAgICAgICBpZiB3WzNdOiB3b3JkID0gd29yZCArICcgJwotICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgd29yZAotICAgICAgICByZXR1cm4gdGV4dCArICdcbicKLSAgICAjCi0gICAgIyBSZXR1cm4gd2hpY2ggY2hhcmFjdGVyIHBvc2l0aW9uIHdhcyBoaXQgYnkgdGhlIG1vdXNlLCBhcwotICAgICMgYW4gb2Zmc2V0IGluIHRoZSBlbnRpcmUgdGV4dCBhcyByZXR1cm5lZCBieSBleHRyYWN0KCkuCi0gICAgIyBSZXR1cm4gTm9uZSBpZiB0aGUgbW91c2Ugd2FzIG5vdCBpbiB0aGlzIHBhcmFncmFwaAotICAgIGRlZiB3aGVyZWlzKHNlbGYsIGQsIG1vdXNlaCwgbW91c2V2KToKLSAgICAgICAgaWYgbW91c2V2IDwgc2VsZi50b3Agb3IgbW91c2V2ID4gc2VsZi5ib3R0b206Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBzZWxmLm1vdXNlaCA9IG1vdXNlaAotICAgICAgICBzZWxmLm1vdXNldiA9IG1vdXNldgotICAgICAgICBzZWxmLmxhc3Rmb250ID0gTm9uZQotICAgICAgICBzZWxmLmNoYXJjb3VudCA9IDAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3doZXJlaXN3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fd2hlcmVpc2FuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAjCi0gICAgZGVmIF93aGVyZWlzd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCi0gICAgICAgIGggPSBoMQotICAgICAgICBpZiBpc2ZpcnN0OiBoMSA9IDAKLSAgICAgICAgaWYgaXNsYXN0OiBoMiA9IDk5OTk5OQotICAgICAgICBpZiBub3QgKHYxIDw9IHNlbGYubW91c2V2IDw9IHYyIGFuZCBoMSA8PSBzZWxmLm1vdXNlaCA8PSBoMik6Ci0gICAgICAgICAgICBzZWxmLmNoYXJjb3VudCA9IHNlbGYuY2hhcmNvdW50ICsgbGVuKHRlKSArIChzcCA+IDApCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgc2VsZi5sYXN0Zm9udCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYubGFzdGZvbnQpCi0gICAgICAgIGNjID0gMAotICAgICAgICBmb3IgYyBpbiB0ZToKLSAgICAgICAgICAgIGN3ID0gc2VsZi5kLnRleHR3aWR0aChjKQotICAgICAgICAgICAgaWYgc2VsZi5tb3VzZWggPD0gaCArIGN3LzI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcmNvdW50ICsgY2MKLSAgICAgICAgICAgIGNjID0gY2MrMQotICAgICAgICAgICAgaCA9IGgrY3cKLSAgICAgICAgc2VsZi5jaGFyY291bnQgPSBzZWxmLmNoYXJjb3VudCArIGNjCi0gICAgICAgIGlmIHNlbGYubW91c2VoIDw9IChoK2gyKSAvIDI6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFyY291bnQKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJjb3VudCArIDEKLSAgICAjCi0gICAgZGVmIF93aGVyZWlzYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICAjIFJldHVybiBzY3JlZW4gcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byBwb3NpdGlvbiBpbiBwYXJhZ3JhcGguCi0gICAgIyBSZXR1cm4gdHVwbGUgKGgsIHZ0b3AsIHZiYXNlbGluZSwgdmJvdHRvbSkuCi0gICAgIyBUaGlzIGlzIG1vcmUgb3IgbGVzcyB0aGUgaW52ZXJzZSBvZiB3aGVyZWlzKCkKLSAgICBkZWYgc2NyZWVucG9zKHNlbGYsIGQsIHBvcyk6Ci0gICAgICAgIGlmIHBvcyA8IDA6Ci0gICAgICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSBzZWxmLmxpbmVzWzBdWzU6N10KLSAgICAgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYudG9wLCBzZWxmLnRvcCArIGFzY2VudCwgXAotICAgICAgICAgICAgICAgICAgICBzZWxmLnRvcCArIGFzY2VudCArIGRlc2NlbnQKLSAgICAgICAgc2VsZi5wb3MgPSBwb3MKLSAgICAgICAgc2VsZi5sYXN0Zm9udCA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAgICAgb2sgPSBzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9zY3JlZW5wb3N3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX3NjcmVlbnBvc2FuY2hvcikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAgICAgaWYgb2sgaXMgTm9uZToKLSAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHNlbGYubGluZXNbLTFdWzU6N10KLSAgICAgICAgICAgIG9rID0gc2VsZi5yaWdodCwgc2VsZi5ib3R0b20gLSBhc2NlbnQgLSBkZXNjZW50LCBcCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYm90dG9tIC0gZGVzY2VudCwgc2VsZi5ib3R0b20KLSAgICAgICAgcmV0dXJuIG9rCi0gICAgIwotICAgIGRlZiBfc2NyZWVucG9zd29yZChzZWxmLCB0dXBsZSwgd29yZCwgaDEsIHYxLCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGZvLCB0ZSwgd2ksIHNwLCBzdCwgYXMsIGRlID0gd29yZAotICAgICAgICBpZiBmbyBpcyBub3QgTm9uZTogc2VsZi5sYXN0Zm9udCA9IGZvCi0gICAgICAgIGNjID0gbGVuKHRlKSArIChzcCA+IDApCi0gICAgICAgIGlmIHNlbGYucG9zID4gY2M6Ci0gICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYucG9zIC0gY2MKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLnBvcyA8IGNjOgotICAgICAgICAgICAgc2VsZi5kLnNldGZvbnQoc2VsZi5sYXN0Zm9udCkKLSAgICAgICAgICAgIGggPSBoMSArIHNlbGYuZC50ZXh0d2lkdGgodGVbOnNlbGYucG9zXSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGggPSBoMgotICAgICAgICBhc2NlbnQsIGRlc2NlbnQgPSB0dXBsZVs1OjddCi0gICAgICAgIHJldHVybiBoLCB2MSwgdjErYXNjZW50LCB2MgotICAgICMKLSAgICBkZWYgX3NjcmVlbnBvc2FuY2hvcihzZWxmLCB0dXBsZSwgd29yZCwgaCwgdik6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgIyBJbnZlcnQgdGhlIHN0cmV0Y2ggb2YgdGV4dCBiZXR3ZWVuIHBvczEgYW5kIHBvczIuCi0gICAgIyBJZiBwb3MxIGlzIE5vbmUsIHRoZSBiZWdpbm5pbmcgaXMgaW1wbGllZDsKLSAgICAjIGlmIHBvczIgaXMgTm9uZSwgdGhlIGVuZCBpcyBpbXBsaWVkLgotICAgICMgVW5kb2VzIGl0cyBvd24gZWZmZWN0IHdoZW4gY2FsbGVkIGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzCi0gICAgZGVmIGludmVydChzZWxmLCBkLCBwb3MxLCBwb3MyKToKLSAgICAgICAgaWYgcG9zMSBpcyBOb25lOgotICAgICAgICAgICAgcG9zMSA9IHNlbGYubGVmdCwgc2VsZi50b3AsIHNlbGYudG9wLCBzZWxmLnRvcAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcG9zMSA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczEpCi0gICAgICAgIGlmIHBvczIgaXMgTm9uZToKLSAgICAgICAgICAgIHBvczIgPSBzZWxmLnJpZ2h0LCBzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbSxzZWxmLmJvdHRvbQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcG9zMiA9IHNlbGYuc2NyZWVucG9zKGQsIHBvczIpCi0gICAgICAgIGgxLCB0b3AxLCBiYXNlbGluZTEsIGJvdHRvbTEgPSBwb3MxCi0gICAgICAgIGgyLCB0b3AyLCBiYXNlbGluZTIsIGJvdHRvbTIgPSBwb3MyCi0gICAgICAgIGlmIGJvdHRvbTEgPD0gdG9wMjoKLSAgICAgICAgICAgIGQuaW52ZXJ0KChoMSwgdG9wMSksIChzZWxmLnJpZ2h0LCBib3R0b20xKSkKLSAgICAgICAgICAgIGgxID0gc2VsZi5sZWZ0Ci0gICAgICAgICAgICBpZiBib3R0b20xIDwgdG9wMjoKLSAgICAgICAgICAgICAgICBkLmludmVydCgoaDEsIGJvdHRvbTEpLCAoc2VsZi5yaWdodCwgdG9wMikpCi0gICAgICAgICAgICB0b3AxLCBib3R0b20xID0gdG9wMiwgYm90dG9tMgotICAgICAgICBkLmludmVydCgoaDEsIHRvcDEpLCAoaDIsIGJvdHRvbTIpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvYWRkcGFjay5weSBiL0xpYi9saWItb2xkL2FkZHBhY2sucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjI2MDEuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvYWRkcGFjay5weQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMgVGhpcyBtb2R1bGUgcHJvdmlkZXMgc3RhbmRhcmQgc3VwcG9ydCBmb3IgInBhY2thZ2VzIi4KLSMKLSMgVGhlIGlkZWEgaXMgdGhhdCBsYXJnZSBncm91cHMgb2YgcmVsYXRlZCBtb2R1bGVzIGNhbiBiZSBwbGFjZWQgaW4KLSMgdGhlaXIgb3duIHN1YmRpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHRoZSBQeXRob24gc2VhcmNoIHBhdGgKLSMgaW4gYSByZWxhdGl2ZWx5IGVhc3kgd2F5LgotIwotIyBUaGUgY3VycmVudCB2ZXJzaW9uIHRha2VzIGEgcGFja2FnZSBuYW1lIGFuZCBzZWFyY2hlcyB0aGUgUHl0aG9uCi0jIHNlYXJjaCBwYXRoIGZvciBhIGRpcmVjdG9yeSBieSB0aGF0IG5hbWUsIGFuZCBpZiBmb3VuZCBhZGRzIGl0IHRvCi0jIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKHN5cy5wYXRoKS4gIEl0IG1haW50YWlucyBhIGxpc3Qgb2YgcGFja2FnZXMKLSMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCBzbyBhZGRpbmcgdGhlIHNhbWUgcGFja2FnZSBtYW55IHRpbWVzCi0jIGlzIE9LLgotIwotIyBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGEgZmFpcmx5IHN0eWxpemVkIG1hbm5lcjogZWFjaCBtb2R1bGUKLSMgdGhhdCB3YW50cyB0byB1c2UgYSBwYXJ0aWN1bGFyIHBhY2thZ2UsIHNheSAnRm9vJywgaXMgc3VwcG9zZWQgdG8KLSMgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvZGU6Ci0jCi0jICAgZnJvbSBhZGRwYWNrIGltcG9ydCBhZGRwYWNrCi0jICAgYWRkcGFjaygnRm9vJykKLSMgICA8aW1wb3J0IG1vZHVsZXMgZnJvbSBwYWNrYWdlIEZvbz4KLSMKLSMgQWRkaXRpb25hbCBhcmd1bWVudHMsIHdoZW4gcHJlc2VudCwgcHJvdmlkZSBhZGRpdGlvbmFsIHBsYWNlcyB3aGVyZQotIyB0byBsb29rIGZvciB0aGUgcGFja2FnZSBiZWZvcmUgdHJ5aW5nIHN5cy5wYXRoICh0aGVzZSBtYXkgYmUgZWl0aGVyCi0jIHN0cmluZ3Mgb3IgbGlzdHMvdHVwbGVzIG9mIHN0cmluZ3MpLiAgQWxzbywgaWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBhCi0jIGZ1bGwgcGF0aG5hbWUsIGZpcnN0IHRoZSBsYXN0IGNvbXBvbmVudCBpcyB0cmllZCBpbiB0aGUgdXN1YWwgd2F5LAotIyB0aGVuIHRoZSBmdWxsIHBhdGhuYW1lIGlzIHRyaWVkIGxhc3QuICBJZiB0aGUgcGFja2FnZSBuYW1lIGlzIGEKLSMgKnJlbGF0aXZlKiBwYXRobmFtZSAoVU5JWDogY29udGFpbnMgYSBzbGFzaCBidXQgZG9lc24ndCBzdGFydCB3aXRoCi0jIG9uZSksIHRoZW4gbm90aGluZyBzcGVjaWFsIGlzIGRvbmUuICBUaGUgcGFja2FnZXMgIi9mb28vYmFyL2JsZXRjaCIKLSMgYW5kICJibGV0Y2giIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lLCBidXQgdW5yZWxhdGVkIHRvICJiYXIvYmxldGNoIi4KLSMKLSMgSWYgdGhlIGFsZ29yaXRobSBmaW5kcyBtb3JlIHRoYW4gb25lIHN1aXRhYmxlIHN1YmRpcmVjdG9yeSwgYWxsIGFyZQotIyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggLS0gdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBvdmVycmlkZSBwYXJ0Ci0jIG9mIGEgcGFja2FnZS4gIFRoZSBzYW1lIHBhdGggd2lsbCBub3QgYmUgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0jCi0jIElmIG5vIGRpcmVjdG9yeSBpcyBmb3VuZCwgSW1wb3J0RXJyb3IgaXMgcmFpc2VkLgotCi1fcGFja3MgPSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB7cGFjazogW3BhdGhuYW1lLCAuLi5dLCAuLi59Ci0KLWRlZiBhZGRwYWNrKHBhY2ssICpsb2NhdGlvbnMpOgotICAgIGltcG9ydCBvcwotICAgIGlmIG9zLnBhdGguaXNhYnMocGFjayk6Ci0gICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKHBhY2spCi0gICAgZWxzZToKLSAgICAgICAgYmFzZSA9IHBhY2sKLSAgICBpZiBfcGFja3MuaGFzX2tleShiYXNlKToKLSAgICAgICAgcmV0dXJuCi0gICAgaW1wb3J0IHN5cwotICAgIHBhdGggPSBbXQotICAgIGZvciBsb2MgaW4gX2ZsYXR0ZW4obG9jYXRpb25zKSArIHN5cy5wYXRoOgotICAgICAgICBmbiA9IG9zLnBhdGguam9pbihsb2MsIGJhc2UpCi0gICAgICAgIGlmIGZuIG5vdCBpbiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKGZuKToKLSAgICAgICAgICAgIHBhdGguYXBwZW5kKGZuKQotICAgIGlmIHBhY2sgIT0gYmFzZSBhbmQgcGFjayBub3QgaW4gcGF0aCBhbmQgb3MucGF0aC5pc2RpcihwYWNrKToKLSAgICAgICAgcGF0aC5hcHBlbmQocGFjaykKLSAgICBpZiBub3QgcGF0aDogcmFpc2UgSW1wb3J0RXJyb3IsICdwYWNrYWdlICcgKyBwYWNrICsgJyBub3QgZm91bmQnCi0gICAgX3BhY2tzW2Jhc2VdID0gcGF0aAotICAgIGZvciBmbiBpbiBwYXRoOgotICAgICAgICBpZiBmbiBub3QgaW4gc3lzLnBhdGg6Ci0gICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQoZm4pCi0KLWRlZiBfZmxhdHRlbihsb2NhdGlvbnMpOgotICAgIGxvY3MgPSBbXQotICAgIGZvciBsb2MgaW4gbG9jYXRpb25zOgotICAgICAgICBpZiB0eXBlKGxvYykgPT0gdHlwZSgnJyk6Ci0gICAgICAgICAgICBsb2NzLmFwcGVuZChsb2MpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2NzID0gbG9jcyArIF9mbGF0dGVuKGxvYykKLSAgICByZXR1cm4gbG9jcwpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvY21wLnB5IGIvTGliL2xpYi1vbGQvY21wLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YTI1Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2NtcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSIiIkVmZmljaWVudGx5IGNvbXBhcmUgZmlsZXMsIGJvb2xlYW4gb3V0Y29tZSBvbmx5IChlcXVhbCAvIG5vdCBlcXVhbCkuCi0KLVRyaWNrcyAodXNlZCBpbiB0aGlzIG9yZGVyKToKLSAgICAtIEZpbGVzIHdpdGggaWRlbnRpY2FsIHR5cGUsIHNpemUgJiBtdGltZSBhcmUgYXNzdW1lZCB0byBiZSBjbG9uZXMKLSAgICAtIEZpbGVzIHdpdGggZGlmZmVyZW50IHR5cGUgb3Igc2l6ZSBjYW5ub3QgYmUgaWRlbnRpY2FsCi0gICAgLSBXZSBrZWVwIGEgY2FjaGUgb2Ygb3V0Y29tZXMgb2YgZWFybGllciBjb21wYXJpc29ucwotICAgIC0gV2UgZG9uJ3QgZm9yayBhIHByb2Nlc3MgdG8gcnVuICdjbXAnIGJ1dCByZWFkIHRoZSBmaWxlcyBvdXJzZWx2ZXMKLSIiIgotCi1pbXBvcnQgb3MKLQotY2FjaGUgPSB7fQotCi1kZWYgY21wKGYxLCBmMiwgc2hhbGxvdz0xKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcywgdXNlIHRoZSBjYWNoZSBpZiBwb3NzaWJsZS4KLSAgICBSZXR1cm4gMSBmb3IgaWRlbnRpY2FsIGZpbGVzLCAwIGZvciBkaWZmZXJlbnQuCi0gICAgUmFpc2UgZXhjZXB0aW9ucyBpZiBlaXRoZXIgZmlsZSBjb3VsZCBub3QgYmUgc3RhdHRlZCwgcmVhZCwgZXRjLiIiIgotICAgIHMxLCBzMiA9IHNpZyhvcy5zdGF0KGYxKSksIHNpZyhvcy5zdGF0KGYyKSkKLSAgICBpZiBzMVswXSAhPSA4IG9yIHMyWzBdICE9IDg6Ci0gICAgICAgICMgRWl0aGVyIGlzIGEgbm90IGEgcGxhaW4gZmlsZSAtLSBhbHdheXMgcmVwb3J0IGFzIGRpZmZlcmVudAotICAgICAgICByZXR1cm4gMAotICAgIGlmIHNoYWxsb3cgYW5kIHMxID09IHMyOgotICAgICAgICAjIHR5cGUsIHNpemUgJiBtdGltZSBtYXRjaCAtLSByZXBvcnQgc2FtZQotICAgICAgICByZXR1cm4gMQotICAgIGlmIHMxWzoyXSAhPSBzMls6Ml06ICMgVHlwZXMgb3Igc2l6ZXMgZGlmZmVyLCBkb24ndCBib3RoZXIKLSAgICAgICAgIyB0eXBlcyBvciBzaXplcyBkaWZmZXIgLS0gcmVwb3J0IGRpZmZlcmVudAotICAgICAgICByZXR1cm4gMAotICAgICMgc2FtZSB0eXBlIGFuZCBzaXplIC0tIGxvb2sgaW4gdGhlIGNhY2hlCi0gICAga2V5ID0gKGYxLCBmMikKLSAgICB0cnk6Ci0gICAgICAgIGNzMSwgY3MyLCBvdXRjb21lID0gY2FjaGVba2V5XQotICAgICAgICAjIGNhY2hlIGhpdAotICAgICAgICBpZiBzMSA9PSBjczEgYW5kIHMyID09IGNzMjoKLSAgICAgICAgICAgICMgY2FjaGVkIHNpZ25hdHVyZXMgbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBvdXRjb21lCi0gICAgICAgICMgc3RhbGUgY2FjaGVkIHNpZ25hdHVyZShzKQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgIyBjYWNoZSBtaXNzCi0gICAgICAgIHBhc3MKLSAgICAjIHJlYWxseSBjb21wYXJlCi0gICAgb3V0Y29tZSA9IGRvX2NtcChmMSwgZjIpCi0gICAgY2FjaGVba2V5XSA9IHMxLCBzMiwgb3V0Y29tZQotICAgIHJldHVybiBvdXRjb21lCi0KLWRlZiBzaWcoc3QpOgotICAgICIiIlJldHVybiBzaWduYXR1cmUgKGkuZS4sIHR5cGUsIHNpemUsIG10aW1lKSBmcm9tIHJhdyBzdGF0IGRhdGEKLSAgICAwLTU6IHN0X21vZGUsIHN0X2lubywgc3RfZGV2LCBzdF9ubGluaywgc3RfdWlkLCBzdF9naWQKLSAgICA2LTk6IHN0X3NpemUsIHN0X2F0aW1lLCBzdF9tdGltZSwgc3RfY3RpbWUiIiIKLSAgICB0eXBlID0gc3RbMF0gLyA0MDk2Ci0gICAgc2l6ZSA9IHN0WzZdCi0gICAgbXRpbWUgPSBzdFs4XQotICAgIHJldHVybiB0eXBlLCBzaXplLCBtdGltZQotCi1kZWYgZG9fY21wKGYxLCBmMik6Ci0gICAgIiIiQ29tcGFyZSB0d28gZmlsZXMsIHJlYWxseS4iIiIKLSAgICBidWZzaXplID0gOCoxMDI0ICMgQ291bGQgYmUgdHVuZWQKLSAgICBmcDEgPSBvcGVuKGYxLCAncmInKQotICAgIGZwMiA9IG9wZW4oZjIsICdyYicpCi0gICAgd2hpbGUgMToKLSAgICAgICAgYjEgPSBmcDEucmVhZChidWZzaXplKQotICAgICAgICBiMiA9IGZwMi5yZWFkKGJ1ZnNpemUpCi0gICAgICAgIGlmIGIxICE9IGIyOiByZXR1cm4gMAotICAgICAgICBpZiBub3QgYjE6IHJldHVybiAxCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9jbXBjYWNoZS5weSBiL0xpYi9saWItb2xkL2NtcGNhY2hlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU0MGY4Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2NtcGNhY2hlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIiIiRWZmaWNpZW50bHkgY29tcGFyZSBmaWxlcywgYm9vbGVhbiBvdXRjb21lIG9ubHkgKGVxdWFsIC8gbm90IGVxdWFsKS4KLQotVHJpY2tzICh1c2VkIGluIHRoaXMgb3JkZXIpOgotICAgIC0gVXNlIHRoZSBzdGF0Y2FjaGUgbW9kdWxlIHRvIGF2b2lkIHN0YXR0aW5nIGZpbGVzIG1vcmUgdGhhbiBvbmNlCi0gICAgLSBGaWxlcyB3aXRoIGlkZW50aWNhbCB0eXBlLCBzaXplICYgbXRpbWUgYXJlIGFzc3VtZWQgdG8gYmUgY2xvbmVzCi0gICAgLSBGaWxlcyB3aXRoIGRpZmZlcmVudCB0eXBlIG9yIHNpemUgY2Fubm90IGJlIGlkZW50aWNhbAotICAgIC0gV2Uga2VlcCBhIGNhY2hlIG9mIG91dGNvbWVzIG9mIGVhcmxpZXIgY29tcGFyaXNvbnMKLSAgICAtIFdlIGRvbid0IGZvcmsgYSBwcm9jZXNzIHRvIHJ1biAnY21wJyBidXQgcmVhZCB0aGUgZmlsZXMgb3Vyc2VsdmVzCi0iIiIKLQotaW1wb3J0IG9zCi1mcm9tIHN0YXQgaW1wb3J0ICoKLWltcG9ydCBzdGF0Y2FjaGUKLQotCi0jIFRoZSBjYWNoZS4KLSMKLWNhY2hlID0ge30KLQotCi1kZWYgY21wKGYxLCBmMiwgc2hhbGxvdz0xKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcywgdXNlIHRoZSBjYWNoZSBpZiBwb3NzaWJsZS4KLSAgICBNYXkgcmFpc2Ugb3MuZXJyb3IgaWYgYSBzdGF0IG9yIG9wZW4gb2YgZWl0aGVyIGZhaWxzLgotICAgIFJldHVybiAxIGZvciBpZGVudGljYWwgZmlsZXMsIDAgZm9yIGRpZmZlcmVudC4KLSAgICBSYWlzZSBleGNlcHRpb25zIGlmIGVpdGhlciBmaWxlIGNvdWxkIG5vdCBiZSBzdGF0dGVkLCByZWFkLCBldGMuIiIiCi0gICAgczEsIHMyID0gc2lnKHN0YXRjYWNoZS5zdGF0KGYxKSksIHNpZyhzdGF0Y2FjaGUuc3RhdChmMikpCi0gICAgaWYgbm90IFNfSVNSRUcoczFbMF0pIG9yIG5vdCBTX0lTUkVHKHMyWzBdKToKLSAgICAgICAgIyBFaXRoZXIgaXMgYSBub3QgYSBwbGFpbiBmaWxlIC0tIGFsd2F5cyByZXBvcnQgYXMgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgaWYgc2hhbGxvdyBhbmQgczEgPT0gczI6Ci0gICAgICAgICMgdHlwZSwgc2l6ZSAmIG10aW1lIG1hdGNoIC0tIHJlcG9ydCBzYW1lCi0gICAgICAgIHJldHVybiAxCi0gICAgaWYgczFbOjJdICE9IHMyWzoyXTogIyBUeXBlcyBvciBzaXplcyBkaWZmZXIsIGRvbid0IGJvdGhlcgotICAgICAgICAjIHR5cGVzIG9yIHNpemVzIGRpZmZlciAtLSByZXBvcnQgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgIyBzYW1lIHR5cGUgYW5kIHNpemUgLS0gbG9vayBpbiB0aGUgY2FjaGUKLSAgICBrZXkgPSBmMSArICcgJyArIGYyCi0gICAgaWYgY2FjaGUuaGFzX2tleShrZXkpOgotICAgICAgICBjczEsIGNzMiwgb3V0Y29tZSA9IGNhY2hlW2tleV0KLSAgICAgICAgIyBjYWNoZSBoaXQKLSAgICAgICAgaWYgczEgPT0gY3MxIGFuZCBzMiA9PSBjczI6Ci0gICAgICAgICAgICAjIGNhY2hlZCBzaWduYXR1cmVzIG1hdGNoCi0gICAgICAgICAgICByZXR1cm4gb3V0Y29tZQotICAgICAgICAjIHN0YWxlIGNhY2hlZCBzaWduYXR1cmUocykKLSAgICAjIHJlYWxseSBjb21wYXJlCi0gICAgb3V0Y29tZSA9IGRvX2NtcChmMSwgZjIpCi0gICAgY2FjaGVba2V5XSA9IHMxLCBzMiwgb3V0Y29tZQotICAgIHJldHVybiBvdXRjb21lCi0KLWRlZiBzaWcoc3QpOgotICAgICIiIlJldHVybiBzaWduYXR1cmUgKGkuZS4sIHR5cGUsIHNpemUsIG10aW1lKSBmcm9tIHJhdyBzdGF0IGRhdGEuIiIiCi0gICAgcmV0dXJuIFNfSUZNVChzdFtTVF9NT0RFXSksIHN0W1NUX1NJWkVdLCBzdFtTVF9NVElNRV0KLQotZGVmIGRvX2NtcChmMSwgZjIpOgotICAgICIiIkNvbXBhcmUgdHdvIGZpbGVzLCByZWFsbHkuIiIiCi0gICAgI3ByaW50ICcgICAgY21wJywgZjEsIGYyICMgWFhYIHJlbW92ZSB3aGVuIGRlYnVnZ2VkCi0gICAgYnVmc2l6ZSA9IDgqMTAyNCAjIENvdWxkIGJlIHR1bmVkCi0gICAgZnAxID0gb3BlbihmMSwgJ3JiJykKLSAgICBmcDIgPSBvcGVuKGYyLCAncmInKQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGIxID0gZnAxLnJlYWQoYnVmc2l6ZSkKLSAgICAgICAgYjIgPSBmcDIucmVhZChidWZzaXplKQotICAgICAgICBpZiBiMSAhPSBiMjogcmV0dXJuIDAKLSAgICAgICAgaWYgbm90IGIxOiByZXR1cm4gMQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvY29kZWhhY2sucHkgYi9MaWIvbGliLW9sZC9jb2RlaGFjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZTNhMS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9jb2RlaGFjay5weQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSMgQSBzdWJyb3V0aW5lIGZvciBleHRyYWN0aW5nIGEgZnVuY3Rpb24gbmFtZSBmcm9tIGEgY29kZSBvYmplY3QKLSMgKHdpdGggY2FjaGUpCi0KLWltcG9ydCBzeXMKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IHN0cmluZwotaW1wb3J0IG9zCi1pbXBvcnQgbGluZWNhY2hlCi0KLSMgWFhYIFRoZSBmdW5jdGlvbnMgZ2V0Y29kZW5hbWUoKSBhbmQgZ2V0ZnVuY25hbWUoKSBhcmUgbm93IG9ic29sZXRlCi0jIFhYWCBhcyBjb2RlIGFuZCBmdW5jdGlvbiBvYmplY3RzIG5vdyBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUgLS0KLSMgWFhYIGNvLmNvX25hbWUgYW5kIGYuZnVuY19uYW1lLgotIyBYWFggZ2V0bGluZW5vKCkgaXMgbm93IGFsc28gb2Jzb2xldGUgYmVjYXVzZSBvZiB0aGUgbmV3IGF0dHJpYnV0ZQotIyBYWFggb2YgY29kZSBvYmplY3RzLCBjby5jb19maXJzdGxpbmVuby4KLQotIyBFeHRyYWN0IHRoZSBmdW5jdGlvbiBvciBjbGFzcyBuYW1lIGZyb20gYSBjb2RlIG9iamVjdC4KLSMgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIHNpbmNlIGEgY29kZSBvYmplY3QgZG9lc24ndCBjb250YWluCi0jIHRoZSBuYW1lIGRpcmVjdGx5LiAgU28gd2hhdCBkbyB3ZSBkbzoKLSMgLSBnZXQgdGhlIGZpbGVuYW1lICh3aGljaCAqaXMqIGluIHRoZSBjb2RlIG9iamVjdCkKLSMgLSBsb29rIGluIHRoZSBjb2RlIHN0cmluZyB0byBmaW5kIHRoZSBmaXJzdCBTRVRfTElORU5PIGluc3RydWN0aW9uCi0jICAgKHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24pCi0jIC0gZ2V0IHRoZSBsaW5lIGZyb20gdGhlIGZpbGUKLSMgLSBpZiB0aGUgbGluZSBzdGFydHMgd2l0aCAnY2xhc3MnIG9yICdkZWYnIChhZnRlciBwb3NzaWJsZSB3aGl0ZXNwYWNlKSwKLSMgICBleHRyYWN0IHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcgotIwotIyBUaGlzIGJyZWFrcyBhcGFydCB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmVhZCBmcm9tIDxzdGRpbj4KLSMgb3IgY29uc3RydWN0ZWQgYnkgZXhlYygpLCB3aGVuIHRoZSBmaWxlIGlzIG5vdCBhY2Nlc3NpYmxlLAotIyBhbmQgYWxzbyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHdoZW4gYSBsaW5lIGlzCi0jIGNvbnRpbnVlZCB3aXRoIGEgYmFja3NsYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gb3IgY2xhc3MgbmFtZS4KLSMKLSMgQmVjYXVzZSB0aGlzIGlzIGEgcHJldHR5IGV4cGVuc2l2ZSBoYWNrLCBhIGNhY2hlIGlzIGtlcHQuCi0KLVNFVF9MSU5FTk8gPSAxMjcgIyBUaGUgb3Bjb2RlIChzZWUgIm9wY29kZS5oIiBpbiB0aGUgUHl0aG9uIHNvdXJjZSkKLWlkZW50Y2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnXycgIyBJZGVudGlmaWVyIGNoYXJhY3RlcnMKLQotX25hbWVjYWNoZSA9IHt9ICMgVGhlIGNhY2hlCi0KLWRlZiBnZXRjb2RlbmFtZShjbyk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gY28uY29fbmFtZQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGtleSA9IGBjb2AgIyBhcmJpdHJhcnkgYnV0IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHN0cmluZwotICAgIGlmIF9uYW1lY2FjaGUuaGFzX2tleShrZXkpOiByZXR1cm4gX25hbWVjYWNoZVtrZXldCi0gICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQotICAgIGNvZGUgPSBjby5jb19jb2RlCi0gICAgbmFtZSA9ICcnCi0gICAgaWYgb3JkKGNvZGVbMF0pID09IFNFVF9MSU5FTk86Ci0gICAgICAgIGxpbmVubyA9IG9yZChjb2RlWzFdKSB8IG9yZChjb2RlWzJdKSA8PCA4Ci0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQotICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQotICAgICAgICBpZiBsZW4od29yZHMpID49IDIgYW5kIHdvcmRzWzBdIGluICgnZGVmJywgJ2NsYXNzJyk6Ci0gICAgICAgICAgICBuYW1lID0gd29yZHNbMV0KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihuYW1lKSk6Ci0gICAgICAgICAgICAgICAgaWYgbmFtZVtpXSBub3QgaW4gaWRlbnRjaGFyczoKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbOmldCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgX25hbWVjYWNoZVtrZXldID0gbmFtZQotICAgIHJldHVybiBuYW1lCi0KLSMgVXNlIHRoZSBhYm92ZSByb3V0aW5lIHRvIGZpbmQgYSBmdW5jdGlvbidzIG5hbWUuCi0KLWRlZiBnZXRmdW5jbmFtZShmdW5jKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBmdW5jLmZ1bmNfbmFtZQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIHJldHVybiBnZXRjb2RlbmFtZShmdW5jLmZ1bmNfY29kZSkKLQotIyBBIHBhcnQgb2YgdGhlIGFib3ZlIGNvZGUgdG8gZXh0cmFjdCBqdXN0IHRoZSBsaW5lIG51bWJlciBmcm9tIGEgY29kZSBvYmplY3QuCi0KLWRlZiBnZXRsaW5lbm8oY28pOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNvLmNvX2ZpcnN0bGluZW5vCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgY29kZSA9IGNvLmNvX2NvZGUKLSAgICBpZiBvcmQoY29kZVswXSkgPT0gU0VUX0xJTkVOTzoKLSAgICAgICAgcmV0dXJuIG9yZChjb2RlWzFdKSB8IG9yZChjb2RlWzJdKSA8PCA4Ci0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIC0xCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9kaXJjbXAucHkgYi9MaWIvbGliLW9sZC9kaXJjbXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2JmMmEuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZGlyY21wLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSIiIkEgY2xhc3MgdG8gYnVpbGQgZGlyZWN0b3J5IGRpZmYgdG9vbHMgb24uIiIiCi0KLWltcG9ydCBvcwotCi1pbXBvcnQgZGlyY2FjaGUKLWltcG9ydCBjbXBjYWNoZQotaW1wb3J0IHN0YXRjYWNoZQotZnJvbSBzdGF0IGltcG9ydCAqCi0KLWNsYXNzIGRpcmNtcDoKLSAgICAiIiJEaXJlY3RvcnkgY29tcGFyaXNvbiBjbGFzcy4iIiIKLQotICAgIGRlZiBuZXcoc2VsZiwgYSwgYik6Ci0gICAgICAgICIiIkluaXRpYWxpemUuIiIiCi0gICAgICAgIHNlbGYuYSA9IGEKLSAgICAgICAgc2VsZi5iID0gYgotICAgICAgICAjIFByb3BlcnRpZXMgdGhhdCBjYWxsZXIgbWF5IGNoYW5nZSBiZWZvcmUgY2FsbGluZyBzZWxmLnJ1bigpOgotICAgICAgICBzZWxmLmhpZGUgPSBbb3MuY3VyZGlyLCBvcy5wYXJkaXJdICMgTmFtZXMgbmV2ZXIgdG8gYmUgc2hvd24KLSAgICAgICAgc2VsZi5pZ25vcmUgPSBbJ1JDUycsICd0YWdzJ10gIyBOYW1lcyBpZ25vcmVkIGluIGNvbXBhcmlzb24KLQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgIiIiQ29tcGFyZSBldmVyeXRoaW5nIGV4Y2VwdCBjb21tb24gc3ViZGlyZWN0b3JpZXMuIiIiCi0gICAgICAgIHNlbGYuYV9saXN0ID0gZmlsdGVyKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi5hKSwgc2VsZi5oaWRlKQotICAgICAgICBzZWxmLmJfbGlzdCA9IGZpbHRlcihkaXJjYWNoZS5saXN0ZGlyKHNlbGYuYiksIHNlbGYuaGlkZSkKLSAgICAgICAgc2VsZi5hX2xpc3Quc29ydCgpCi0gICAgICAgIHNlbGYuYl9saXN0LnNvcnQoKQotICAgICAgICBzZWxmLnBoYXNlMSgpCi0gICAgICAgIHNlbGYucGhhc2UyKCkKLSAgICAgICAgc2VsZi5waGFzZTMoKQotCi0gICAgZGVmIHBoYXNlMShzZWxmKToKLSAgICAgICAgIiIiQ29tcHV0ZSBjb21tb24gbmFtZXMuIiIiCi0gICAgICAgIHNlbGYuYV9vbmx5ID0gW10KLSAgICAgICAgc2VsZi5jb21tb24gPSBbXQotICAgICAgICBmb3IgeCBpbiBzZWxmLmFfbGlzdDoKLSAgICAgICAgICAgIGlmIHggaW4gc2VsZi5iX2xpc3Q6Ci0gICAgICAgICAgICAgICAgc2VsZi5jb21tb24uYXBwZW5kKHgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuYV9vbmx5LmFwcGVuZCh4KQotCi0gICAgICAgIHNlbGYuYl9vbmx5ID0gW10KLSAgICAgICAgZm9yIHggaW4gc2VsZi5iX2xpc3Q6Ci0gICAgICAgICAgICBpZiB4IG5vdCBpbiBzZWxmLmNvbW1vbjoKLSAgICAgICAgICAgICAgICBzZWxmLmJfb25seS5hcHBlbmQoeCkKLQotICAgIGRlZiBwaGFzZTIoc2VsZik6Ci0gICAgICAgICIiIkRpc3Rpbmd1aXNoIGZpbGVzLCBkaXJlY3RvcmllcywgZnVubmllcy4iIiIKLSAgICAgICAgc2VsZi5jb21tb25fZGlycyA9IFtdCi0gICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzID0gW10KLSAgICAgICAgc2VsZi5jb21tb25fZnVubnkgPSBbXQotCi0gICAgICAgIGZvciB4IGluIHNlbGYuY29tbW9uOgotICAgICAgICAgICAgYV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYSwgeCkKLSAgICAgICAgICAgIGJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmIsIHgpCi0KLSAgICAgICAgICAgIG9rID0gMQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGFfc3RhdCA9IHN0YXRjYWNoZS5zdGF0KGFfcGF0aCkKLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgotICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYV9wYXRoLCAnOicsIHdoeVsxXQotICAgICAgICAgICAgICAgIG9rID0gMAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGJfc3RhdCA9IHN0YXRjYWNoZS5zdGF0KGJfcGF0aCkKLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgotICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYl9wYXRoLCAnOicsIHdoeVsxXQotICAgICAgICAgICAgICAgIG9rID0gMAotCi0gICAgICAgICAgICBpZiBvazoKLSAgICAgICAgICAgICAgICBhX3R5cGUgPSBTX0lGTVQoYV9zdGF0W1NUX01PREVdKQotICAgICAgICAgICAgICAgIGJfdHlwZSA9IFNfSUZNVChiX3N0YXRbU1RfTU9ERV0pCi0gICAgICAgICAgICAgICAgaWYgYV90eXBlICE9IGJfdHlwZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZnVubnkuYXBwZW5kKHgpCi0gICAgICAgICAgICAgICAgZWxpZiBTX0lTRElSKGFfdHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2RpcnMuYXBwZW5kKHgpCi0gICAgICAgICAgICAgICAgZWxpZiBTX0lTUkVHKGFfdHlwZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzLmFwcGVuZCh4KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueS5hcHBlbmQoeCkKLQotICAgIGRlZiBwaGFzZTMoc2VsZik6Ci0gICAgICAgICIiIkZpbmQgb3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gY29tbW9uIGZpbGVzLiIiIgotICAgICAgICB4eCA9IGNtcGZpbGVzKHNlbGYuYSwgc2VsZi5iLCBzZWxmLmNvbW1vbl9maWxlcykKLSAgICAgICAgc2VsZi5zYW1lX2ZpbGVzLCBzZWxmLmRpZmZfZmlsZXMsIHNlbGYuZnVubnlfZmlsZXMgPSB4eAotCi0gICAgZGVmIHBoYXNlNChzZWxmKToKLSAgICAgICAgIiIiRmluZCBvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb21tb24gc3ViZGlyZWN0b3JpZXMuCi0gICAgICAgIEEgbmV3IGRpcmNtcCBvYmplY3QgaXMgY3JlYXRlZCBmb3IgZWFjaCBjb21tb24gc3ViZGlyZWN0b3J5LAotICAgICAgICB0aGVzZSBhcmUgc3RvcmVkIGluIGEgZGljdGlvbmFyeSBpbmRleGVkIGJ5IGZpbGVuYW1lLgotICAgICAgICBUaGUgaGlkZSBhbmQgaWdub3JlIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQuIiIiCi0gICAgICAgIHNlbGYuc3ViZGlycyA9IHt9Ci0gICAgICAgIGZvciB4IGluIHNlbGYuY29tbW9uX2RpcnM6Ci0gICAgICAgICAgICBhX3ggPSBvcy5wYXRoLmpvaW4oc2VsZi5hLCB4KQotICAgICAgICAgICAgYl94ID0gb3MucGF0aC5qb2luKHNlbGYuYiwgeCkKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XSA9IG5ld2RkID0gZGlyY21wKCkubmV3KGFfeCwgYl94KQotICAgICAgICAgICAgbmV3ZGQuaGlkZSA9IHNlbGYuaGlkZQotICAgICAgICAgICAgbmV3ZGQuaWdub3JlID0gc2VsZi5pZ25vcmUKLSAgICAgICAgICAgIG5ld2RkLnJ1bigpCi0KLSAgICBkZWYgcGhhc2U0X2Nsb3N1cmUoc2VsZik6Ci0gICAgICAgICIiIlJlY3Vyc2l2ZWx5IGNhbGwgcGhhc2U0KCkgb24gc3ViZGlyZWN0b3JpZXMuIiIiCi0gICAgICAgIHNlbGYucGhhc2U0KCkKLSAgICAgICAgZm9yIHggaW4gc2VsZi5zdWJkaXJzLmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5waGFzZTRfY2xvc3VyZSgpCi0KLSAgICBkZWYgcmVwb3J0KHNlbGYpOgotICAgICAgICAiIiJQcmludCBhIHJlcG9ydCBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIGFuZCBiLiIiIgotICAgICAgICAjIEFzc3VtZSB0aGF0IHBoYXNlcyAxIHRvIDMgaGF2ZSBiZWVuIGV4ZWN1dGVkCi0gICAgICAgICMgT3V0cHV0IGZvcm1hdCBpcyBwdXJwb3NlbHkgbG91c3kKLSAgICAgICAgcHJpbnQgJ2RpZmYnLCBzZWxmLmEsIHNlbGYuYgotICAgICAgICBpZiBzZWxmLmFfb25seToKLSAgICAgICAgICAgIHByaW50ICdPbmx5IGluJywgc2VsZi5hLCAnOicsIHNlbGYuYV9vbmx5Ci0gICAgICAgIGlmIHNlbGYuYl9vbmx5OgotICAgICAgICAgICAgcHJpbnQgJ09ubHkgaW4nLCBzZWxmLmIsICc6Jywgc2VsZi5iX29ubHkKLSAgICAgICAgaWYgc2VsZi5zYW1lX2ZpbGVzOgotICAgICAgICAgICAgcHJpbnQgJ0lkZW50aWNhbCBmaWxlcyA6Jywgc2VsZi5zYW1lX2ZpbGVzCi0gICAgICAgIGlmIHNlbGYuZGlmZl9maWxlczoKLSAgICAgICAgICAgIHByaW50ICdEaWZmZXJpbmcgZmlsZXMgOicsIHNlbGYuZGlmZl9maWxlcwotICAgICAgICBpZiBzZWxmLmZ1bm55X2ZpbGVzOgotICAgICAgICAgICAgcHJpbnQgJ1Ryb3VibGUgd2l0aCBjb21tb24gZmlsZXMgOicsIHNlbGYuZnVubnlfZmlsZXMKLSAgICAgICAgaWYgc2VsZi5jb21tb25fZGlyczoKLSAgICAgICAgICAgIHByaW50ICdDb21tb24gc3ViZGlyZWN0b3JpZXMgOicsIHNlbGYuY29tbW9uX2RpcnMKLSAgICAgICAgaWYgc2VsZi5jb21tb25fZnVubnk6Ci0gICAgICAgICAgICBwcmludCAnQ29tbW9uIGZ1bm55IGNhc2VzIDonLCBzZWxmLmNvbW1vbl9mdW5ueQotCi0gICAgZGVmIHJlcG9ydF9jbG9zdXJlKHNlbGYpOgotICAgICAgICAiIiJQcmludCByZXBvcnRzIG9uIHNlbGYgYW5kIG9uIHN1YmRpcnMuCi0gICAgICAgIElmIHBoYXNlIDQgaGFzbid0IGJlZW4gZG9uZSwgbm8gc3ViZGlyIHJlcG9ydHMgYXJlIHByaW50ZWQuIiIiCi0gICAgICAgIHNlbGYucmVwb3J0KCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgeCA9IHNlbGYuc3ViZGlycwotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gIyBObyBzdWJkaXJlY3RvcmllcyBjb21wdXRlZAotICAgICAgICBmb3IgeCBpbiBzZWxmLnN1YmRpcnMua2V5cygpOgotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5yZXBvcnRfY2xvc3VyZSgpCi0KLSAgICBkZWYgcmVwb3J0X3BoYXNlNF9jbG9zdXJlKHNlbGYpOgotICAgICAgICAiIiJSZXBvcnQgYW5kIGRvIHBoYXNlIDQgcmVjdXJzaXZlbHkuIiIiCi0gICAgICAgIHNlbGYucmVwb3J0KCkKLSAgICAgICAgc2VsZi5waGFzZTQoKQotICAgICAgICBmb3IgeCBpbiBzZWxmLnN1YmRpcnMua2V5cygpOgotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XS5yZXBvcnRfcGhhc2U0X2Nsb3N1cmUoKQotCi0KLWRlZiBjbXBmaWxlcyhhLCBiLCBjb21tb24pOgotICAgICIiIkNvbXBhcmUgY29tbW9uIGZpbGVzIGluIHR3byBkaXJlY3Rvcmllcy4KLSAgICBSZXR1cm46Ci0gICAgICAgIC0gZmlsZXMgdGhhdCBjb21wYXJlIGVxdWFsCi0gICAgICAgIC0gZmlsZXMgdGhhdCBjb21wYXJlIGRpZmZlcmVudAotICAgICAgICAtIGZ1bm55IGNhc2VzIChjYW4ndCBzdGF0IGV0Yy4pIiIiCi0KLSAgICByZXMgPSAoW10sIFtdLCBbXSkKLSAgICBmb3IgeCBpbiBjb21tb246Ci0gICAgICAgIHJlc1tjbXAob3MucGF0aC5qb2luKGEsIHgpLCBvcy5wYXRoLmpvaW4oYiwgeCkpXS5hcHBlbmQoeCkKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIGNtcChhLCBiKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcy4KLSAgICBSZXR1cm46Ci0gICAgICAgIDAgZm9yIGVxdWFsCi0gICAgICAgIDEgZm9yIGRpZmZlcmVudAotICAgICAgICAyIGZvciBmdW5ueSBjYXNlcyAoY2FuJ3Qgc3RhdCwgZXRjLikiIiIKLQotICAgIHRyeToKLSAgICAgICAgaWYgY21wY2FjaGUuY21wKGEsIGIpOiByZXR1cm4gMAotICAgICAgICByZXR1cm4gMQotICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcmV0dXJuIDIKLQotCi1kZWYgZmlsdGVyKGxpc3QsIHNraXApOgotICAgICIiIlJldHVybiBhIGNvcHkgd2l0aCBpdGVtcyB0aGF0IG9jY3VyIGluIHNraXAgcmVtb3ZlZC4iIiIKLQotICAgIHJlc3VsdCA9IFtdCi0gICAgZm9yIGl0ZW0gaW4gbGlzdDoKLSAgICAgICAgaWYgaXRlbSBub3QgaW4gc2tpcDogcmVzdWx0LmFwcGVuZChpdGVtKQotICAgIHJldHVybiByZXN1bHQKLQotCi1kZWYgZGVtbygpOgotICAgICIiIkRlbW9uc3RyYXRpb24gYW5kIHRlc3RpbmcuIiIiCi0KLSAgICBpbXBvcnQgc3lzCi0gICAgaW1wb3J0IGdldG9wdAotICAgIG9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ3InKQotICAgIGlmIGxlbihhcmdzKSAhPSAyOgotICAgICAgICByYWlzZSBnZXRvcHQuZXJyb3IsICduZWVkIGV4YWN0bHkgdHdvIGFyZ3MnCi0gICAgZGQgPSBkaXJjbXAoKS5uZXcoYXJnc1swXSwgYXJnc1sxXSkKLSAgICBkZC5ydW4oKQotICAgIGlmICgnLXInLCAnJykgaW4gb3B0aW9uczoKLSAgICAgICAgZGQucmVwb3J0X3BoYXNlNF9jbG9zdXJlKCkKLSAgICBlbHNlOgotICAgICAgICBkZC5yZXBvcnQoKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGRlbW8oKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZHVtcC5weSBiL0xpYi9saWItb2xkL2R1bXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmRiYTguLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZHVtcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMgTW9kdWxlICdkdW1wJwotIwotIyBQcmludCBweXRob24gY29kZSB0aGF0IHJlY29uc3RydWN0cyBhIHZhcmlhYmxlLgotIyBUaGlzIG9ubHkgd29ya3MgaW4gY2VydGFpbiBjYXNlcy4KLSMKLSMgSXQgd29ya3MgZmluZSBmb3I6Ci0jIC0gaW50cyBhbmQgZmxvYXRzIChleGNlcHQgTmFOcyBhbmQgb3RoZXIgd2VpcmQgdGhpbmdzKQotIyAtIHN0cmluZ3MKLSMgLSBjb21wb3VuZHMgYW5kIGxpc3RzLCBwcm92aWRlZCBpdCB3b3JrcyBmb3IgYWxsIHRoZWlyIGVsZW1lbnRzCi0jIC0gaW1wb3J0ZWQgbW9kdWxlcywgcHJvdmlkZWQgdGhlaXIgbmFtZSBpcyB0aGUgbW9kdWxlIG5hbWUKLSMKLSMgSXQgd29ya3MgZm9yIHRvcC1sZXZlbCBkaWN0aW9uYXJpZXMgYnV0IG5vdCBmb3IgZGljdGlvbmFyaWVzCi0jIGNvbnRhaW5lZCBpbiBvdGhlciBvYmplY3RzIChjb3VsZCBiZSBtYWRlIHRvIHdvcmsgd2l0aCBzb21lIGhhc3NsZQotIyB0aG91Z2gpLgotIwotIyBJdCBkb2VzIG5vdCB3b3JrIGZvciBmdW5jdGlvbnMgKGFsbCBzb3J0cyksIGNsYXNzZXMsIGNsYXNzIG9iamVjdHMsCi0jIHdpbmRvd3MsIGZpbGVzIGV0Yy4KLSMKLSMgRmluYWxseSwgb2JqZWN0cyByZWZlcmVuY2VkIGJ5IG1vcmUgdGhhbiBvbmUgbmFtZSBvciBjb250YWluZWQgaW4gbW9yZQotIyB0aGFuIG9uZSBvdGhlciBvYmplY3QgbG9zZSB0aGVpciBzaGFyaW5nIHByb3BlcnR5ICh0aGlzIGlzIGJhZCBmb3IKLSMgc3RyaW5ncyB1c2VkIGFzIGV4Y2VwdGlvbiBpZGVudGlmaWVycywgZm9yIGluc3RhbmNlKS4KLQotIyBEdW1wIGEgd2hvbGUgc3ltYm9sIHRhYmxlCi0jCi1kZWYgZHVtcHN5bXRhYihkaWN0KToKLSAgICBmb3Iga2V5IGluIGRpY3Qua2V5cygpOgotICAgICAgICBkdW1wdmFyKGtleSwgZGljdFtrZXldKQotCi0jIER1bXAgYSBzaW5nbGUgdmFyaWFibGUKLSMKLWRlZiBkdW1wdmFyKG5hbWUsIHgpOgotICAgIGltcG9ydCBzeXMKLSAgICB0ID0gdHlwZSh4KQotICAgIGlmIHQgPT0gdHlwZSh7fSk6Ci0gICAgICAgIHByaW50IG5hbWUsICc9IHt9JwotICAgICAgICBmb3Iga2V5IGluIHgua2V5cygpOgotICAgICAgICAgICAgaXRlbSA9IHhba2V5XQotICAgICAgICAgICAgaWYgbm90IHByaW50YWJsZShpdGVtKToKLSAgICAgICAgICAgICAgICBwcmludCAnIycsCi0gICAgICAgICAgICBwcmludCBuYW1lLCAnWycsIGBrZXlgLCAnXSA9JywgYGl0ZW1gCi0gICAgZWxpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApLCB0eXBlKFtdKSwgdHlwZSgoKSkpOgotICAgICAgICBpZiBub3QgcHJpbnRhYmxlKHgpOgotICAgICAgICAgICAgcHJpbnQgJyMnLAotICAgICAgICBwcmludCBuYW1lLCAnPScsIGB4YAotICAgIGVsaWYgdCA9PSB0eXBlKHN5cyk6Ci0gICAgICAgIHByaW50ICdpbXBvcnQnLCBuYW1lLCAnIycsIHgKLSAgICBlbHNlOgotICAgICAgICBwcmludCAnIycsIG5hbWUsICc9JywgeAotCi0jIGNoZWNrIGlmIGEgdmFsdWUgaXMgcHJpbnRhYmxlIGluIGEgd2F5IHRoYXQgY2FuIGJlIHJlYWQgYmFjayB3aXRoIGlucHV0KCkKLSMKLWRlZiBwcmludGFibGUoeCk6Ci0gICAgdCA9IHR5cGUoeCkKLSAgICBpZiB0IGluICh0eXBlKCcnKSwgdHlwZSgwKSwgdHlwZSgwLjApKToKLSAgICAgICAgcmV0dXJuIDEKLSAgICBpZiB0IGluICh0eXBlKFtdKSwgdHlwZSgoKSkpOgotICAgICAgICBmb3IgaXRlbSBpbiB4OgotICAgICAgICAgICAgaWYgbm90IHByaW50YWJsZShpdGVtKToKLSAgICAgICAgICAgICAgICByZXR1cm4gMAotICAgICAgICByZXR1cm4gMQotICAgIGlmIHggPT0ge306Ci0gICAgICAgIHJldHVybiAxCi0gICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL2ZpbmQucHkgYi9MaWIvbGliLW9sZC9maW5kLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFkNzcxLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2ZpbmQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1pbXBvcnQgZm5tYXRjaAotaW1wb3J0IG9zCi0KLV9kZWJ1ZyA9IDAKLQotX3BydW5lID0gWycoKiknXQotCi1kZWYgZmluZChwYXR0ZXJuLCBkaXIgPSBvcy5jdXJkaXIpOgotICAgIGxpc3QgPSBbXQotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCi0gICAgbmFtZXMuc29ydCgpCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIGlmIG5hbWUgaW4gKG9zLmN1cmRpciwgb3MucGFyZGlyKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpciwgbmFtZSkKLSAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHBhdHRlcm4pOgotICAgICAgICAgICAgbGlzdC5hcHBlbmQoZnVsbG5hbWUpCi0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgotICAgICAgICAgICAgZm9yIHAgaW4gX3BydW5lOgotICAgICAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChuYW1lLCBwKToKLSAgICAgICAgICAgICAgICAgICAgaWYgX2RlYnVnOiBwcmludCAic2tpcCIsIGBmdWxsbmFtZWAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgX2RlYnVnOiBwcmludCAiZGVzY2VuZCBpbnRvIiwgYGZ1bGxuYW1lYAotICAgICAgICAgICAgICAgIGxpc3QgPSBsaXN0ICsgZmluZChwYXR0ZXJuLCBmdWxsbmFtZSkKLSAgICByZXR1cm4gbGlzdApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZm10LnB5IGIvTGliL2xpYi1vbGQvZm10LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdkMzdhLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2ZtdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0jIFRleHQgZm9ybWF0dGluZyBhYnN0cmFjdGlvbnMKLSMgTm90ZSAtLSB0aGlzIG1vZHVsZSBpcyBvYnNvbGV0ZSwgaXQncyB0b28gc2xvdyBhbnl3YXkKLQotCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgUGFyYQotCi0KLSMgQSBmb3JtYXR0ZXIgYmFjay1lbmQgb2JqZWN0IGhhcyBvbmUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJ5IHRoZSBmb3JtYXR0ZXI6Ci0jIGFkZHBhcmEocCksIHdoZXJlIHAgaXMgYSBwYXJhZ3JhcGggb2JqZWN0LiAgRm9yIGV4YW1wbGU6Ci0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gZG8gbm90aGluZyBhdCBhbGwgd2l0aCB0aGUgcGFyYWdyYXBocwotY2xhc3MgTnVsbEJhY2tFbmQ6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYmduX2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgZGVmIGVuZF9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBwYXNzCi0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gY29sbGVjdCB0aGUgcGFyYWdyYXBocyBpbiBhIGxpc3QKLWNsYXNzIFNhdmluZ0JhY2tFbmQoTnVsbEJhY2tFbmQpOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFyYWxpc3QgPSBbXQotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5wYXJhbGlzdC5hcHBlbmQocCkKLSAgICAjCi0gICAgZGVmIGhpdGNoZWNrKHNlbGYsIGgsIHYpOgotICAgICAgICBoaXRzID0gW10KLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIGlmIHAudG9wIDw9IHYgPD0gcC5ib3R0b206Ci0gICAgICAgICAgICAgICAgZm9yIGlkIGluIHAuaGl0Y2hlY2soaCwgdik6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGlkIG5vdCBpbiBoaXRzOgotICAgICAgICAgICAgICAgICAgICAgICAgaGl0cy5hcHBlbmQoaWQpCi0gICAgICAgIHJldHVybiBoaXRzCi0gICAgIwotICAgIGRlZiBleHRyYWN0KHNlbGYpOgotICAgICAgICB0ZXh0ID0gJycKLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgKHAuZXh0cmFjdCgpKQotICAgICAgICByZXR1cm4gdGV4dAotICAgICMKLSAgICBkZWYgZXh0cmFjdHBhcnQoc2VsZiwgbG9uZzEsIGxvbmcyKToKLSAgICAgICAgaWYgbG9uZzEgPiBsb25nMjogbG9uZzEsIGxvbmcyID0gbG9uZzIsIGxvbmcxCi0gICAgICAgIHBhcmExLCBwb3MxID0gbG9uZzEKLSAgICAgICAgcGFyYTIsIHBvczIgPSBsb25nMgotICAgICAgICB0ZXh0ID0gJycKLSAgICAgICAgd2hpbGUgcGFyYTEgPCBwYXJhMjoKLSAgICAgICAgICAgIHB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtwYXJhMV0uZXh0cmFjdCgpCi0gICAgICAgICAgICB0ZXh0ID0gdGV4dCArIHB0ZXh0W3BvczE6XQotICAgICAgICAgICAgcG9zMSA9IDAKLSAgICAgICAgICAgIHBhcmExID0gcGFyYTEgKyAxCi0gICAgICAgIHB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtwYXJhMl0uZXh0cmFjdCgpCi0gICAgICAgIHJldHVybiB0ZXh0ICsgcHRleHRbcG9zMTpwb3MyXQotICAgICMKLSAgICBkZWYgd2hlcmVpcyhzZWxmLCBkLCBoLCB2KToKLSAgICAgICAgdG90YWwgPSAwCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnBhcmFsaXN0KSk6Ci0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgcmVzdWx0ID0gcC53aGVyZWlzKGQsIGgsIHYpCi0gICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGksIHJlc3VsdAotICAgICAgICByZXR1cm4gTm9uZQotICAgICMKLSAgICBkZWYgcm91bmR0b3dvcmRzKHNlbGYsIGxvbmcxLCBsb25nMik6Ci0gICAgICAgIGksIG9mZnNldCA9IGxvbmcxCi0gICAgICAgIHRleHQgPSBzZWxmLnBhcmFsaXN0W2ldLmV4dHJhY3QoKQotICAgICAgICB3aGlsZSBvZmZzZXQgPiAwIGFuZCB0ZXh0W29mZnNldC0xXSAhPSAnICc6IG9mZnNldCA9IG9mZnNldC0xCi0gICAgICAgIGxvbmcxID0gaSwgb2Zmc2V0Ci0gICAgICAgICMKLSAgICAgICAgaSwgb2Zmc2V0ID0gbG9uZzIKLSAgICAgICAgdGV4dCA9IHNlbGYucGFyYWxpc3RbaV0uZXh0cmFjdCgpCi0gICAgICAgIG4gPSBsZW4odGV4dCkKLSAgICAgICAgd2hpbGUgb2Zmc2V0IDwgbi0xIGFuZCB0ZXh0W29mZnNldF0gIT0gJyAnOiBvZmZzZXQgPSBvZmZzZXQrMQotICAgICAgICBsb25nMiA9IGksIG9mZnNldAotICAgICAgICAjCi0gICAgICAgIHJldHVybiBsb25nMSwgbG9uZzIKLSAgICAjCi0gICAgZGVmIHJvdW5kdG9wYXJhZ3JhcGhzKHNlbGYsIGxvbmcxLCBsb25nMik6Ci0gICAgICAgIGxvbmcxID0gbG9uZzFbMF0sIDAKLSAgICAgICAgbG9uZzIgPSBsb25nMlswXSwgbGVuKHNlbGYucGFyYWxpc3RbbG9uZzJbMF1dLmV4dHJhY3QoKSkKLSAgICAgICAgcmV0dXJuIGxvbmcxLCBsb25nMgotCi0KLSMgRm9ybWF0dGVyIGJhY2stZW5kIHRvIHNlbmQgdGhlIHRleHQgZGlyZWN0bHkgdG8gdGhlIGRyYXdpbmcgb2JqZWN0Ci1jbGFzcyBXcml0aW5nQmFja0VuZChOdWxsQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkLCB3aWR0aCk6Ci0gICAgICAgIHNlbGYuZCA9IGQKLSAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoCi0gICAgICAgIHNlbGYubGluZW5vID0gMAotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5saW5lbm8gPSBwLnJlbmRlcihzZWxmLmQsIDAsIHNlbGYubGluZW5vLCBzZWxmLndpZHRoKQotCi0KLSMgQSBmb3JtYXR0ZXIgcmVjZWl2ZXMgYSBzdHJlYW0gb2YgZm9ybWF0dGluZyBpbnN0cnVjdGlvbnMgYW5kIGFzc2VtYmxlcwotIyB0aGVzZSBpbnRvIGEgc3RyZWFtIG9mIHBhcmFncmFwaHMgb24gdG8gYSBiYWNrLWVuZC4gIFRoZSBhc3NlbWJseSBpcwotIyBwYXJhbWV0cml6ZWQgYnkgYSB0ZXh0IG1lYXN1cmVtZW50IG9iamVjdCwgd2hpY2ggbXVzdCBtYXRjaCB0aGUgb3V0cHV0Ci0jIG9wZXJhdGlvbnMgb2YgdGhlIGJhY2stZW5kLiAgVGhlIGJhY2stZW5kIGlzIHJlc3BvbnNpYmxlIGZvciBzcGxpdHRpbmcKLSMgcGFyYWdyYXBocyB1cCBpbiBsaW5lcyBvZiBhIGdpdmVuIG1heGltdW0gd2lkdGguICAoVGhpcyBpcyBkb25lIGJlY2F1c2UKLSMgaW4gYSB3aW5kb3dpbmcgZW52aXJvbm1lbnQsIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXMsIHRoZXJlIGlzIG5vCi0jIG5lZWQgdG8gcmVkbyB0aGUgYXNzZW1ibHkgaW50byBwYXJhZ3JhcGhzLCBidXQgdGhlIHNwbGl0dGluZyBpbnRvIGxpbmVzCi0jIG11c3QgYmUgZG9uZSB0YWtpbmcgdGhlIG5ldyB3aW5kb3cgc2l6ZSBpbnRvIGFjY291bnQuKQotCi0KLSMgRm9ybWF0dGVyIGJhc2UgY2xhc3MuICBJbml0aWFsaXplIGl0IHdpdGggYSB0ZXh0IG1lYXN1cmVtZW50IG9iamVjdCwKLSMgd2hpY2ggaXMgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMsIGFuZCBhIGJhY2stZW5kIG9iamVjdCwKLSMgd2hpY2ggcmVjZWl2ZXMgdGhlIGNvbXBsZXRlZCBwYXJhZ3JhcGhzLiAgVGhlIGZvcm1hdHRpbmcgbWV0aG9kcyBhcmU6Ci0jIHNldGZvbnQoZm9udCkKLSMgc2V0bGVmdGluZGVudChuc3BhY2VzKQotIyBzZXRqdXN0KHR5cGUpIHdoZXJlIHR5cGUgaXMgJ2wnLCAnYycsICdyJywgb3IgJ2xyJwotIyBmbHVzaCgpCi0jIHZzcGFjZShubGluZXMpCi0jIG5lZWR2c3BhY2UobmxpbmVzKQotIyBhZGR3b3JkKHdvcmQsIG5zcGFjZXMpCi1jbGFzcyBCYXNlRm9ybWF0dGVyOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZCwgYik6Ci0gICAgICAgICMgRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgdGV4dCBtZWFzdXJlbWVudHMKLSAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAjCi0gICAgICAgICMgQmFja0VuZCBvYmplY3QgcmVjZWl2aW5nIGNvbXBsZXRlZCBwYXJhZ3JhcGhzCi0gICAgICAgIHNlbGYuYiA9IGIKLSAgICAgICAgIwotICAgICAgICAjIFBhcmFtZXRlcnMgb2YgdGhlIGZvcm1hdHRpbmcgbW9kZWwKLSAgICAgICAgc2VsZi5sZWZ0aW5kZW50ID0gMAotICAgICAgICBzZWxmLmp1c3QgPSAnbCcKLSAgICAgICAgc2VsZi5mb250ID0gTm9uZQotICAgICAgICBzZWxmLmJsYW5rbGluZXMgPSAwCi0gICAgICAgICMKLSAgICAgICAgIyBQYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCBmb250Ci0gICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0gICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0gICAgICAgICMKLSAgICAgICAgIyBQYXJhbWV0ZXIgZGVyaXZlZCBmcm9tIHRoZSBkZWZhdWx0IGZvbnQKLSAgICAgICAgc2VsZi5uX3NwYWNlID0gc2VsZi5zcGFjZQotICAgICAgICAjCi0gICAgICAgICMgQ3VycmVudCBwYXJhZ3JhcGggYmVpbmcgYnVpbHQKLSAgICAgICAgc2VsZi5wYXJhID0gTm9uZQotICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCi0gICAgICAgICMKLSAgICAgICAgIyBGb250IHRvIHNldCBvbiB0aGUgbmV4dCB3b3JkCi0gICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCi0gICAgIwotICAgIGRlZiBuZXdwYXJhKHNlbGYpOgotICAgICAgICByZXR1cm4gUGFyYS5QYXJhKCkKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6Ci0gICAgICAgIGlmIGZvbnQgaXMgTm9uZTogcmV0dXJuCi0gICAgICAgIHNlbGYuZm9udCA9IHNlbGYubmV4dGZvbnQgPSBmb250Ci0gICAgICAgIGQgPSBzZWxmLmQKLSAgICAgICAgZC5zZXRmb250KGZvbnQpCi0gICAgICAgIHNlbGYuc3BhY2UgPSBkLnRleHR3aWR0aCgnICcpCi0gICAgICAgIHNlbGYubGluZSA9IGQubGluZWhlaWdodCgpCi0gICAgICAgIHNlbGYuYXNjZW50ID0gZC5iYXNlbGluZSgpCi0gICAgICAgIHNlbGYuZGVzY2VudCA9IHNlbGYubGluZSAtIHNlbGYuYXNjZW50Ci0gICAgIwotICAgIGRlZiBzZXRsZWZ0aW5kZW50KHNlbGYsIG5zcGFjZXMpOgotICAgICAgICBzZWxmLmxlZnRpbmRlbnQgPSBpbnQoc2VsZi5uX3NwYWNlICogbnNwYWNlcykKLSAgICAgICAgaWYgc2VsZi5wYXJhOgotICAgICAgICAgICAgaGFuZyA9IHNlbGYubGVmdGluZGVudCAtIHNlbGYucGFyYS5pbmRlbnRfbGVmdAotICAgICAgICAgICAgaWYgaGFuZyA+IDAgYW5kIHNlbGYucGFyYS5nZXRsZW5ndGgoKSA8PSBoYW5nOgotICAgICAgICAgICAgICAgIHNlbGYucGFyYS5tYWtlaGFuZ2luZ3RhZyhoYW5nKQotICAgICAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDEKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgIwotICAgIGRlZiBzZXRyaWdodGluZGVudChzZWxmLCBuc3BhY2VzKToKLSAgICAgICAgc2VsZi5yaWdodGluZGVudCA9IGludChzZWxmLm5fc3BhY2UgKiBuc3BhY2VzKQotICAgICAgICBpZiBzZWxmLnBhcmE6Ci0gICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X3JpZ2h0ID0gc2VsZi5yaWdodGluZGVudAotICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgIwotICAgIGRlZiBzZXRqdXN0KHNlbGYsIGp1c3QpOgotICAgICAgICBzZWxmLmp1c3QgPSBqdXN0Ci0gICAgICAgIGlmIHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0gICAgIwotICAgIGRlZiBmbHVzaChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5iLmFkZHBhcmEoc2VsZi5wYXJhKQotICAgICAgICAgICAgc2VsZi5wYXJhID0gTm9uZQotICAgICAgICAgICAgaWYgc2VsZi5mb250IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRmb250KHNlbGYuZm9udCkKLSAgICAgICAgc2VsZi5ub3NwYWNlID0gMQotICAgICMKLSAgICBkZWYgdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICBpZiBubGluZXMgPiAwOgotICAgICAgICAgICAgc2VsZi5wYXJhID0gc2VsZi5uZXdwYXJhKCkKLSAgICAgICAgICAgIHR1cGxlID0gTm9uZSwgJycsIDAsIDAsIDAsIGludChubGluZXMqc2VsZi5saW5lKSwgMAotICAgICAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCh0dXBsZSkKLSAgICAgICAgICAgIHNlbGYuZmx1c2goKQotICAgICAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gc2VsZi5ibGFua2xpbmVzICsgbmxpbmVzCi0gICAgIwotICAgIGRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIHNlbGYuZmx1c2goKSAjIEp1c3QgdG8gYmUgc3VyZQotICAgICAgICBpZiBubGluZXMgPiBzZWxmLmJsYW5rbGluZXM6Ci0gICAgICAgICAgICBzZWxmLnZzcGFjZShubGluZXMgLSBzZWxmLmJsYW5rbGluZXMpCi0gICAgIwotICAgIGRlZiBhZGR3b3JkKHNlbGYsIHRleHQsIHNwYWNlKToKLSAgICAgICAgaWYgc2VsZi5ub3NwYWNlIGFuZCBub3QgdGV4dDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm5vc3BhY2UgPSAwCi0gICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDAKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYucGFyYSA9IHNlbGYubmV3cGFyYSgpCi0gICAgICAgICAgICBzZWxmLnBhcmEuaW5kZW50X2xlZnQgPSBzZWxmLmxlZnRpbmRlbnQKLSAgICAgICAgICAgIHNlbGYucGFyYS5qdXN0ID0gc2VsZi5qdXN0Ci0gICAgICAgICAgICBzZWxmLm5leHRmb250ID0gc2VsZi5mb250Ci0gICAgICAgIHNwYWNlID0gaW50KHNwYWNlICogc2VsZi5zcGFjZSkKLSAgICAgICAgc2VsZi5wYXJhLndvcmRzLmFwcGVuZCgoc2VsZi5uZXh0Zm9udCwgdGV4dCwKLSAgICAgICAgICAgICAgICBzZWxmLmQudGV4dHdpZHRoKHRleHQpLCBzcGFjZSwgc3BhY2UsCi0gICAgICAgICAgICAgICAgc2VsZi5hc2NlbnQsIHNlbGYuZGVzY2VudCkpCi0gICAgICAgIHNlbGYubmV4dGZvbnQgPSBOb25lCi0gICAgIwotICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKLSAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKLSAgICAgICAgc2VsZi5wYXJhLmJnbl9hbmNob3IoaWQpCi0gICAgIwotICAgIGRlZiBlbmRfYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgaWYgbm90IHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDAKLSAgICAgICAgICAgIHNlbGYuYWRkd29yZCgnJywgMCkKLSAgICAgICAgc2VsZi5wYXJhLmVuZF9hbmNob3IoaWQpCi0KLQotIyBNZWFzdXJpbmcgb2JqZWN0IGZvciBtZWFzdXJpbmcgdGV4dCBhcyB2aWV3ZWQgb24gYSB0dHkKLWNsYXNzIE51bGxNZWFzdXJlcjoKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiB0ZXh0d2lkdGgoc2VsZiwgdGV4dCk6Ci0gICAgICAgIHJldHVybiBsZW4odGV4dCkKLSAgICAjCi0gICAgZGVmIGxpbmVoZWlnaHQoc2VsZik6Ci0gICAgICAgIHJldHVybiAxCi0gICAgIwotICAgIGRlZiBiYXNlbGluZShzZWxmKToKLSAgICAgICAgcmV0dXJuIDAKLQotCi0jIERyYXdpbmcgb2JqZWN0IGZvciB3cml0aW5nIHBsYWluIEFTQ0lJIHRleHQgdG8gYSBmaWxlCi1jbGFzcyBGaWxlV3JpdGVyOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZnApOgotICAgICAgICBzZWxmLmZwID0gZnAKLSAgICAgICAgc2VsZi5saW5lbm8sIHNlbGYuY29sbm8gPSAwLCAwCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnQpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiB0ZXh0KHNlbGYsIChoLCB2KSwgc3RyKToKLSAgICAgICAgaWYgbm90IHN0cjogcmV0dXJuCi0gICAgICAgIGlmICdcbicgaW4gc3RyOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2NhblwndCB3cml0ZSBcXG4nCi0gICAgICAgIHdoaWxlIHNlbGYubGluZW5vIDwgdjoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJ1xuJykKLSAgICAgICAgICAgIHNlbGYuY29sbm8sIHNlbGYubGluZW5vID0gMCwgc2VsZi5saW5lbm8gKyAxCi0gICAgICAgIHdoaWxlIHNlbGYubGluZW5vID4gdjoKLSAgICAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXDAzM1tBJykgIyBBTlNJIHVwIGFycm93Ci0gICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vIC0gMQotICAgICAgICBpZiBzZWxmLmNvbG5vIDwgaDoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJyAnICogKGggLSBzZWxmLmNvbG5vKSkKLSAgICAgICAgZWxpZiBzZWxmLmNvbG5vID4gaDoKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJ1xiJyAqIChzZWxmLmNvbG5vIC0gaCkpCi0gICAgICAgIHNlbGYuY29sbm8gPSBoCi0gICAgICAgIHNlbGYuZnAud3JpdGUoc3RyKQotICAgICAgICBzZWxmLmNvbG5vID0gaCArIGxlbihzdHIpCi0KLQotIyBGb3JtYXR0aW5nIGNsYXNzIHRvIGRvIG5vdGhpbmcgYXQgYWxsIHdpdGggdGhlIGRhdGEKLWNsYXNzIE51bGxGb3JtYXR0ZXIoQmFzZUZvcm1hdHRlcik6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgZCA9IE51bGxNZWFzdXJlcigpCi0gICAgICAgIGIgPSBOdWxsQmFja0VuZCgpCi0gICAgICAgIEJhc2VGb3JtYXR0ZXIuX19pbml0X18oc2VsZiwgZCwgYikKLQotCi0jIEZvcm1hdHRpbmcgY2xhc3MgdG8gd3JpdGUgZGlyZWN0bHkgdG8gYSBmaWxlCi1jbGFzcyBXcml0aW5nRm9ybWF0dGVyKEJhc2VGb3JtYXR0ZXIpOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIHdpZHRoKToKLSAgICAgICAgZG0gPSBOdWxsTWVhc3VyZXIoKQotICAgICAgICBkdyA9IEZpbGVXcml0ZXIoZnApCi0gICAgICAgIGIgPSBXcml0aW5nQmFja0VuZChkdywgd2lkdGgpCi0gICAgICAgIEJhc2VGb3JtYXR0ZXIuX19pbml0X18oc2VsZiwgZG0sIGIpCi0gICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDEKLSAgICAjCi0gICAgIyBTdXBwcmVzcyBtdWx0aXBsZSBibGFuayBsaW5lcwotICAgIGRlZiBuZWVkdnNwYWNlKHNlbGYsIG5saW5lcyk6Ci0gICAgICAgIEJhc2VGb3JtYXR0ZXIubmVlZHZzcGFjZShzZWxmLCBtaW4oMSwgbmxpbmVzKSkKLQotCi0jIEEgIkZ1bm55Rm9ybWF0dGVyIiB3cml0ZXMgQVNDSUkgdGV4dCB3aXRoIGEgdHdpc3Q6ICpib2xkIHdvcmRzKiwKLSMgX2l0YWxpYyB0ZXh0XyBhbmQgX3VuZGVybGluZWQgd29yZHNfLCBhbmQgYHF1b3RlZCB0ZXh0Jy4KLSMgSXQgYXNzdW1lcyB0aGF0IHRoZSBmb250cyBhcmUgJ3InLCAnaScsICdiJywgJ3UnLCAncSc6IChyb21hbiwKLSMgaXRhbGljLCBib2xkLCB1bmRlcmxpbmUsIHF1b3RlKS4KLSMgTW9yZW92ZXIsIGlmIHRoZSBmb250IGlzIGluIHVwcGVyIGNhc2UsIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCB0bwotIyBVUFBFUiBDQVNFLgotY2xhc3MgRnVubnlGb3JtYXR0ZXIoV3JpdGluZ0Zvcm1hdHRlcik6Ci0gICAgIwotICAgIGRlZiBmbHVzaChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5wYXJhOiBmaW5hbGl6ZShzZWxmLnBhcmEpCi0gICAgICAgIFdyaXRpbmdGb3JtYXR0ZXIuZmx1c2goc2VsZikKLQotCi0jIFN1cnJvdW5kcyAqYm9sZCB3b3JkcyogYW5kIF9pdGFsaWMgdGV4dF8gaW4gYSBwYXJhZ3JhcGggd2l0aAotIyBhcHByb3ByaWF0ZSBtYXJrZXJzLCBmaXhpbmcgdGhlIHNpemUgKGFzc3VtaW5nIHRoZXNlIGNoYXJhY3RlcnMnCi0jIHdpZHRoIGlzIDEpLgotb3BlbmNoYXIgPSBcCi0gICAgeydiJzonKicsICdpJzonXycsICd1JzonXycsICdxJzonYCcsICdCJzonKicsICdJJzonXycsICdVJzonXycsICdRJzonYCd9Ci1jbG9zZWNoYXIgPSBcCi0gICAgeydiJzonKicsICdpJzonXycsICd1JzonXycsICdxJzonXCcnLCAnQic6JyonLCAnSSc6J18nLCAnVSc6J18nLCAnUSc6J1wnJ30KLWRlZiBmaW5hbGl6ZShwYXJhKToKLSAgICBvbGRmb250ID0gY3VyZm9udCA9ICdyJwotICAgIHBhcmEud29yZHMuYXBwZW5kKCgncicsICcnLCAwLCAwLCAwLCAwKSkgIyB0ZW1wb3JhcnksIGRlbGV0ZWQgYXQgZW5kCi0gICAgZm9yIGkgaW4gcmFuZ2UobGVuKHBhcmEud29yZHMpKToKLSAgICAgICAgZm8sIHRlLCB3aSA9IHBhcmEud29yZHNbaV1bOjNdCi0gICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOiBjdXJmb250ID0gZm8KLSAgICAgICAgaWYgY3VyZm9udCAhPSBvbGRmb250OgotICAgICAgICAgICAgaWYgY2xvc2VjaGFyLmhhc19rZXkob2xkZm9udCk6Ci0gICAgICAgICAgICAgICAgYyA9IGNsb3NlY2hhcltvbGRmb250XQotICAgICAgICAgICAgICAgIGogPSBpLTEKLSAgICAgICAgICAgICAgICB3aGlsZSBqID4gMCBhbmQgcGFyYS53b3Jkc1tqXVsxXSA9PSAnJzogaiA9IGotMQotICAgICAgICAgICAgICAgIGZvMSwgdGUxLCB3aTEgPSBwYXJhLndvcmRzW2pdWzozXQotICAgICAgICAgICAgICAgIHRlMSA9IHRlMSArIGMKLSAgICAgICAgICAgICAgICB3aTEgPSB3aTEgKyBsZW4oYykKLSAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2pdID0gKGZvMSwgdGUxLCB3aTEpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYS53b3Jkc1tqXVszOl0KLSAgICAgICAgICAgIGlmIG9wZW5jaGFyLmhhc19rZXkoY3VyZm9udCkgYW5kIHRlOgotICAgICAgICAgICAgICAgIGMgPSBvcGVuY2hhcltjdXJmb250XQotICAgICAgICAgICAgICAgIHRlID0gYyArIHRlCi0gICAgICAgICAgICAgICAgd2kgPSBsZW4oYykgKyB3aQotICAgICAgICAgICAgICAgIHBhcmEud29yZHNbaV0gPSAoZm8sIHRlLCB3aSkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2ldWzM6XQotICAgICAgICAgICAgaWYgdGU6IG9sZGZvbnQgPSBjdXJmb250Ci0gICAgICAgICAgICBlbHNlOiBvbGRmb250ID0gJ3InCi0gICAgICAgIGlmIGN1cmZvbnQgaW4gc3RyaW5nLnVwcGVyY2FzZToKLSAgICAgICAgICAgIHRlID0gc3RyaW5nLnVwcGVyKHRlKQotICAgICAgICAgICAgcGFyYS53b3Jkc1tpXSA9IChmbywgdGUsIHdpKSArIHBhcmEud29yZHNbaV1bMzpdCi0gICAgZGVsIHBhcmEud29yZHNbLTFdCi0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gZHJhdyB0aGUgdGV4dCBpbiBhIHdpbmRvdy4KLSMgVGhpcyBoYXMgYW4gb3B0aW9uIHRvIGRyYXcgd2hpbGUgdGhlIHBhcmFncmFwaHMgYXJlIGJlaW5nIGFkZGVkLAotIyB0byBtaW5pbWl6ZSB0aGUgZGVsYXkgYmVmb3JlIHRoZSB1c2VyIHNlZXMgYW55dGhpbmcuCi0jIFRoaXMgbWFuYWdlcyB0aGUgZW50aXJlICJkb2N1bWVudCIgb2YgdGhlIHdpbmRvdy4KLWNsYXNzIFN0ZHdpbkJhY2tFbmQoU2F2aW5nQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aW5kb3csIGRyYXdub3cpOgotICAgICAgICBzZWxmLndpbmRvdyA9IHdpbmRvdwotICAgICAgICBzZWxmLmRyYXdub3cgPSBkcmF3bm93Ci0gICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuZ2V0d2luc2l6ZSgpWzBdCi0gICAgICAgIHNlbGYuc2VsZWN0aW9uID0gTm9uZQotICAgICAgICBzZWxmLmhlaWdodCA9IDAKLSAgICAgICAgd2luZG93LnNldG9yaWdpbigwLCAwKQotICAgICAgICB3aW5kb3cuc2V0ZG9jc2l6ZSgwLCAwKQotICAgICAgICBzZWxmLmQgPSB3aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgU2F2aW5nQmFja0VuZC5fX2luaXRfXyhzZWxmKQotICAgICMKLSAgICBkZWYgZmluaXNoKHNlbGYpOgotICAgICAgICBzZWxmLmQuY2xvc2UoKQotICAgICAgICBzZWxmLmQgPSBOb25lCi0gICAgICAgIHNlbGYud2luZG93LnNldGRvY3NpemUoMCwgc2VsZi5oZWlnaHQpCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBzZWxmLnBhcmFsaXN0LmFwcGVuZChwKQotICAgICAgICBpZiBzZWxmLmRyYXdub3c6Ci0gICAgICAgICAgICBzZWxmLmhlaWdodCA9IFwKLSAgICAgICAgICAgICAgICAgICAgcC5yZW5kZXIoc2VsZi5kLCAwLCBzZWxmLmhlaWdodCwgc2VsZi53aWR0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHAubGF5b3V0KHNlbGYud2lkdGgpCi0gICAgICAgICAgICBwLmxlZnQgPSAwCi0gICAgICAgICAgICBwLnRvcCA9IHNlbGYuaGVpZ2h0Ci0gICAgICAgICAgICBwLnJpZ2h0ID0gc2VsZi53aWR0aAotICAgICAgICAgICAgcC5ib3R0b20gPSBzZWxmLmhlaWdodCArIHAuaGVpZ2h0Ci0gICAgICAgICAgICBzZWxmLmhlaWdodCA9IHAuYm90dG9tCi0gICAgIwotICAgIGRlZiByZXNpemUoc2VsZik6Ci0gICAgICAgIHNlbGYud2luZG93LmNoYW5nZSgoMCwgMCksIChzZWxmLndpZHRoLCBzZWxmLmhlaWdodCkpCi0gICAgICAgIHNlbGYud2lkdGggPSBzZWxmLndpbmRvdy5nZXR3aW5zaXplKClbMF0KLSAgICAgICAgc2VsZi5oZWlnaHQgPSAwCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICBwLmxheW91dChzZWxmLndpZHRoKQotICAgICAgICAgICAgcC5sZWZ0ID0gMAotICAgICAgICAgICAgcC50b3AgPSBzZWxmLmhlaWdodAotICAgICAgICAgICAgcC5yaWdodCA9IHNlbGYud2lkdGgKLSAgICAgICAgICAgIHAuYm90dG9tID0gc2VsZi5oZWlnaHQgKyBwLmhlaWdodAotICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSBwLmJvdHRvbQotICAgICAgICBzZWxmLndpbmRvdy5jaGFuZ2UoKDAsIDApLCAoc2VsZi53aWR0aCwgc2VsZi5oZWlnaHQpKQotICAgICAgICBzZWxmLndpbmRvdy5zZXRkb2NzaXplKDAsIHNlbGYuaGVpZ2h0KQotICAgICMKLSAgICBkZWYgcmVkcmF3KHNlbGYsIGFyZWEpOgotICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgKGxlZnQsIHRvcCksIChyaWdodCwgYm90dG9tKSA9IGFyZWEKLSAgICAgICAgZC5lcmFzZShhcmVhKQotICAgICAgICBkLmNsaXByZWN0KGFyZWEpCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICBpZiB0b3AgPCBwLmJvdHRvbSBhbmQgcC50b3AgPCBib3R0b206Ci0gICAgICAgICAgICAgICAgdiA9IHAucmVuZGVyKGQsIHAubGVmdCwgcC50b3AsIHAucmlnaHQpCi0gICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgc2VsZi5pbnZlcnQoZCwgc2VsZi5zZWxlY3Rpb24pCi0gICAgICAgIGQuY2xvc2UoKQotICAgICMKLSAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIG5ldyk6Ci0gICAgICAgIGlmIG5ldzoKLSAgICAgICAgICAgIGxvbmcxLCBsb25nMiA9IG5ldwotICAgICAgICAgICAgcG9zMSA9IGxvbmcxWzozXQotICAgICAgICAgICAgcG9zMiA9IGxvbmcyWzozXQotICAgICAgICAgICAgbmV3ID0gcG9zMSwgcG9zMgotICAgICAgICBpZiBuZXcgIT0gc2VsZi5zZWxlY3Rpb246Ci0gICAgICAgICAgICBkID0gc2VsZi53aW5kb3cuYmVnaW5kcmF3aW5nKCkKLSAgICAgICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIHNlbGYuc2VsZWN0aW9uKQotICAgICAgICAgICAgaWYgbmV3OgotICAgICAgICAgICAgICAgIHNlbGYuaW52ZXJ0KGQsIG5ldykKLSAgICAgICAgICAgIGQuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5zZWxlY3Rpb24gPSBuZXcKLSAgICAjCi0gICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uCi0gICAgIwotICAgIGRlZiBleHRyYWN0c2VsZWN0aW9uKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKLSAgICAgICAgICAgIGEsIGIgPSBzZWxmLnNlbGVjdGlvbgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdHBhcnQoYSwgYikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgIwotICAgIGRlZiBpbnZlcnQoc2VsZiwgZCwgcmVnaW9uKToKLSAgICAgICAgbG9uZzEsIGxvbmcyID0gcmVnaW9uCi0gICAgICAgIGlmIGxvbmcxID4gbG9uZzI6IGxvbmcxLCBsb25nMiA9IGxvbmcyLCBsb25nMQotICAgICAgICBwYXJhMSwgcG9zMSA9IGxvbmcxCi0gICAgICAgIHBhcmEyLCBwb3MyID0gbG9uZzIKLSAgICAgICAgd2hpbGUgcGFyYTEgPCBwYXJhMjoKLSAgICAgICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTFdLmludmVydChkLCBwb3MxLCBOb25lKQotICAgICAgICAgICAgcG9zMSA9IE5vbmUKLSAgICAgICAgICAgIHBhcmExID0gcGFyYTEgKyAxCi0gICAgICAgIHNlbGYucGFyYWxpc3RbcGFyYTJdLmludmVydChkLCBwb3MxLCBwb3MyKQotICAgICMKLSAgICBkZWYgc2VhcmNoKHNlbGYsIHByb2cpOgotICAgICAgICBpbXBvcnQgcmUsIHN0cmluZwotICAgICAgICBpZiB0eXBlKHByb2cpIGlzIHR5cGUoJycpOgotICAgICAgICAgICAgcHJvZyA9IHJlLmNvbXBpbGUoc3RyaW5nLmxvd2VyKHByb2cpKQotICAgICAgICBpZiBzZWxmLnNlbGVjdGlvbjoKLSAgICAgICAgICAgIGlvbGQgPSBzZWxmLnNlbGVjdGlvblswXVswXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW9sZCA9IC0xCi0gICAgICAgIGhpdCA9IE5vbmUKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFyYWxpc3QpKToKLSAgICAgICAgICAgIGlmIGkgPT0gaW9sZCBvciBpIDwgaW9sZCBhbmQgaGl0OgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5sb3dlcihwLmV4dHJhY3QoKSkKLSAgICAgICAgICAgIG1hdGNoID0gcHJvZy5zZWFyY2godGV4dCkKLSAgICAgICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgICAgIGEsIGIgPSBtYXRjaC5ncm91cCgwKQotICAgICAgICAgICAgICAgIGxvbmcxID0gaSwgYQotICAgICAgICAgICAgICAgIGxvbmcyID0gaSwgYgotICAgICAgICAgICAgICAgIGhpdCA9IGxvbmcxLCBsb25nMgotICAgICAgICAgICAgICAgIGlmIGkgPiBpb2xkOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBpZiBoaXQ6Ci0gICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0gICAgICAgICAgICBpID0gaGl0WzBdWzBdCi0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygocC5sZWZ0LCBwLnRvcCksIChwLnJpZ2h0LCBwLmJvdHRvbSkpCi0gICAgICAgICAgICByZXR1cm4gMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAjCi0gICAgZGVmIHNob3dhbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgotICAgICAgICAgICAgcCA9IHNlbGYucGFyYWxpc3RbaV0KLSAgICAgICAgICAgIGlmIHAuaGFzYW5jaG9yKGlkKToKLSAgICAgICAgICAgICAgICBsb25nMSA9IGksIDAKLSAgICAgICAgICAgICAgICBsb25nMiA9IGksIGxlbihwLmV4dHJhY3QoKSkKLSAgICAgICAgICAgICAgICBoaXQgPSBsb25nMSwgbG9uZzIKLSAgICAgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihoaXQpCi0gICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuc2hvdygKLSAgICAgICAgICAgICAgICAgICAgICAgIChwLmxlZnQsIHAudG9wKSwgKHAucmlnaHQsIHAuYm90dG9tKSkKLSAgICAgICAgICAgICAgICBicmVhawotCi0KLSMgR0wgZXh0ZW5zaW9ucwotCi1jbGFzcyBHTEZvbnRDYWNoZToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnJlc2V0KCkKLSAgICAgICAgc2VsZi5zZXRmb250KCcnKQotICAgICMKLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZm9udGtleSA9IE5vbmUKLSAgICAgICAgc2VsZi5mb250aGFuZGxlID0gTm9uZQotICAgICAgICBzZWxmLmZvbnRpbmZvID0gTm9uZQotICAgICAgICBzZWxmLmZvbnRjYWNoZSA9IHt9Ci0gICAgIwotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5yZXNldCgpCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgotICAgICAgICBpZiBmb250a2V5ID09ICcnOgotICAgICAgICAgICAgZm9udGtleSA9ICdUaW1lcy1Sb21hbiAxMicKLSAgICAgICAgZWxpZiAnICcgbm90IGluIGZvbnRrZXk6Ci0gICAgICAgICAgICBmb250a2V5ID0gZm9udGtleSArICcgMTInCi0gICAgICAgIGlmIGZvbnRrZXkgPT0gc2VsZi5mb250a2V5OgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoZm9udGtleSk6Ci0gICAgICAgICAgICBoYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtmb250a2V5XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaW1wb3J0IHN0cmluZwotICAgICAgICAgICAgaSA9IHN0cmluZy5pbmRleChmb250a2V5LCAnICcpCi0gICAgICAgICAgICBuYW1lLCBzaXplc3RyID0gZm9udGtleVs6aV0sIGZvbnRrZXlbaTpdCi0gICAgICAgICAgICBzaXplID0gZXZhbChzaXplc3RyKQotICAgICAgICAgICAga2V5MSA9IG5hbWUgKyAnIDEnCi0gICAgICAgICAgICBrZXkgPSBuYW1lICsgJyAnICsgYHNpemVgCi0gICAgICAgICAgICAjIE5CIGtleSBtYXkgZGlmZmVyIGZyb20gZm9udGtleSEKLSAgICAgICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5KToKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLmZvbnRjYWNoZVtrZXldCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZm9udGNhY2hlLmhhc19rZXkoa2V5MSk6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuZm9udGNhY2hlW2tleTFdCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGZtCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGZtLmZpbmRmb250KG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZm9udGNhY2hlW2tleTFdID0gaGFuZGxlCi0gICAgICAgICAgICAgICAgaGFuZGxlID0gaGFuZGxlLnNjYWxlZm9udChzaXplKQotICAgICAgICAgICAgICAgIHNlbGYuZm9udGNhY2hlW2ZvbnRrZXldID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb250Y2FjaGVba2V5XSA9IGhhbmRsZQotICAgICAgICBzZWxmLmZvbnRrZXkgPSBmb250a2V5Ci0gICAgICAgIGlmIHNlbGYuZm9udGhhbmRsZSAhPSBoYW5kbGU6Ci0gICAgICAgICAgICBzZWxmLmZvbnRoYW5kbGUgPSBoYW5kbGUKLSAgICAgICAgICAgIHNlbGYuZm9udGluZm8gPSBoYW5kbGUuZ2V0Zm9udGluZm8oKQotICAgICAgICAgICAgaGFuZGxlLnNldGZvbnQoKQotCi0KLWNsYXNzIEdMTWVhc3VyZXIoR0xGb250Q2FjaGUpOgotICAgICMKLSAgICBkZWYgdGV4dHdpZHRoKHNlbGYsIHRleHQpOgotICAgICAgICByZXR1cm4gc2VsZi5mb250aGFuZGxlLmdldHN0cndpZHRoKHRleHQpCi0gICAgIwotICAgIGRlZiBiYXNlbGluZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZm9udGluZm9bNl0gLSBzZWxmLmZvbnRpbmZvWzNdCi0gICAgIwotICAgIGRlZiBsaW5laGVpZ2h0KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5mb250aW5mb1s2XQotCi0KLWNsYXNzIEdMV3JpdGVyKEdMRm9udENhY2hlKToKLSAgICAjCi0gICAgIyBOT1RFUzoKLSAgICAjICgxKSBVc2UgZ2wub3J0aG8yIHRvIHVzZSBYIHBpeGVsIGNvb3JkaW5hdGVzIQotICAgICMKLSAgICBkZWYgdGV4dChzZWxmLCAoaCwgdiksIHRleHQpOgotICAgICAgICBpbXBvcnQgZ2wsIGZtCi0gICAgICAgIGdsLmNtb3YyaShoLCB2ICsgc2VsZi5mb250aW5mb1s2XSAtIHNlbGYuZm9udGluZm9bM10pCi0gICAgICAgIGZtLnByc3RyKHRleHQpCi0gICAgIwotICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRrZXkpOgotICAgICAgICBvbGRoYW5kbGUgPSBzZWxmLmZvbnRoYW5kbGUKLSAgICAgICAgR0xGb250Q2FjaGUuc2V0Zm9udChmb250a2V5KQotICAgICAgICBpZiBzZWxmLmZvbnRoYW5kbGUgIT0gb2xkaGFuZGxlOgotICAgICAgICAgICAgaGFuZGxlLnNldGZvbnQoKQotCi0KLWNsYXNzIEdMTWVhc3VyZXJXcml0ZXIoR0xNZWFzdXJlciwgR0xXcml0ZXIpOgotICAgIHBhc3MKLQotCi1jbGFzcyBHTEJhY2tFbmQoU2F2aW5nQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWQpOgotICAgICAgICBpbXBvcnQgZ2wKLSAgICAgICAgZ2wud2luc2V0KHdpZCkKLSAgICAgICAgc2VsZi53aWQgPSB3aWQKLSAgICAgICAgc2VsZi53aWR0aCA9IGdsLmdldHNpemUoKVsxXQotICAgICAgICBzZWxmLmhlaWdodCA9IDAKLSAgICAgICAgc2VsZi5kID0gR0xNZWFzdXJlcldyaXRlcigpCi0gICAgICAgIFNhdmluZ0JhY2tFbmQuX19pbml0X18oc2VsZikKLSAgICAjCi0gICAgZGVmIGZpbmlzaChzZWxmKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgYWRkcGFyYShzZWxmLCBwKToKLSAgICAgICAgc2VsZi5wYXJhbGlzdC5hcHBlbmQocCkKLSAgICAgICAgc2VsZi5oZWlnaHQgPSBwLnJlbmRlcihzZWxmLmQsIDAsIHNlbGYuaGVpZ2h0LCBzZWxmLndpZHRoKQotICAgICMKLSAgICBkZWYgcmVkcmF3KHNlbGYpOgotICAgICAgICBpbXBvcnQgZ2wKLSAgICAgICAgZ2wud2luc2V0KHNlbGYud2lkKQotICAgICAgICB3aWR0aCA9IGdsLmdldHNpemUoKVsxXQotICAgICAgICBpZiB3aWR0aCAhPSBzZWxmLndpZHRoOgotICAgICAgICAgICAgc2V0ZG9jc2l6ZSA9IDEKLSAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aWR0aAotICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgICAgICBwLnRvcCA9IHAuYm90dG9tID0gTm9uZQotICAgICAgICBkID0gc2VsZi5kCi0gICAgICAgIHYgPSAwCi0gICAgICAgIGZvciBwIGluIHNlbGYucGFyYWxpc3Q6Ci0gICAgICAgICAgICB2ID0gcC5yZW5kZXIoZCwgMCwgdiwgd2lkdGgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9ncmVwLnB5IGIvTGliL2xpYi1vbGQvZ3JlcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNjc0Ni4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9ncmVwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyAnZ3JlcCcKLQotaW1wb3J0IHJlZ2V4Ci1mcm9tIHJlZ2V4X3N5bnRheCBpbXBvcnQgKgotCi1vcHRfc2hvd193aGVyZSA9IDAKLW9wdF9zaG93X2ZpbGVuYW1lID0gMAotb3B0X3Nob3dfbGluZW5vID0gMQotCi1kZWYgZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9HUkVQLCBwYXQsIGZpbGVzKQotCi1kZWYgZWdyZXAocGF0LCAqZmlsZXMpOgotICAgIHJldHVybiBnZ3JlcChSRV9TWU5UQVhfRUdSRVAsIHBhdCwgZmlsZXMpCi0KLWRlZiBlbWdyZXAocGF0LCAqZmlsZXMpOgotICAgIHJldHVybiBnZ3JlcChSRV9TWU5UQVhfRU1BQ1MsIHBhdCwgZmlsZXMpCi0KLWRlZiBnZ3JlcChzeW50YXgsIHBhdCwgZmlsZXMpOgotICAgIGlmIGxlbihmaWxlcykgPT0gMSBhbmQgdHlwZShmaWxlc1swXSkgPT0gdHlwZShbXSk6Ci0gICAgICAgIGZpbGVzID0gZmlsZXNbMF0KLSAgICBnbG9iYWwgb3B0X3Nob3dfZmlsZW5hbWUKLSAgICBvcHRfc2hvd19maWxlbmFtZSA9IChsZW4oZmlsZXMpICE9IDEpCi0gICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCi0gICAgdHJ5OgotICAgICAgICBwcm9nID0gcmVnZXguY29tcGlsZShwYXQpCi0gICAgZmluYWxseToKLSAgICAgICAgc3ludGF4ID0gcmVnZXguc2V0X3N5bnRheChzeW50YXgpCi0gICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLSAgICAgICAgbGluZW5vID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICAgICAgaWYgcHJvZy5zZWFyY2gobGluZSkgPj0gMDoKLSAgICAgICAgICAgICAgICBzaG93bGluZShmaWxlbmFtZSwgbGluZW5vLCBsaW5lLCBwcm9nKQotICAgICAgICBmcC5jbG9zZSgpCi0KLWRlZiBwZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgaWYgbGVuKGZpbGVzKSA9PSAxIGFuZCB0eXBlKGZpbGVzWzBdKSA9PSB0eXBlKFtdKToKLSAgICAgICAgZmlsZXMgPSBmaWxlc1swXQotICAgIGdsb2JhbCBvcHRfc2hvd19maWxlbmFtZQotICAgIG9wdF9zaG93X2ZpbGVuYW1lID0gKGxlbihmaWxlcykgIT0gMSkKLSAgICBpbXBvcnQgcmUKLSAgICBwcm9nID0gcmUuY29tcGlsZShwYXQpCi0gICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKLSAgICAgICAgbGluZW5vID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICAgICAgaWYgcHJvZy5zZWFyY2gobGluZSk6Ci0gICAgICAgICAgICAgICAgc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZykKLSAgICAgICAgZnAuY2xvc2UoKQotCi1kZWYgc2hvd2xpbmUoZmlsZW5hbWUsIGxpbmVubywgbGluZSwgcHJvZyk6Ci0gICAgaWYgbGluZVstMTpdID09ICdcbic6IGxpbmUgPSBsaW5lWzotMV0KLSAgICBpZiBvcHRfc2hvd19saW5lbm86Ci0gICAgICAgIHByZWZpeCA9IGBsaW5lbm9gLnJqdXN0KDMpICsgJzogJwotICAgIGVsc2U6Ci0gICAgICAgIHByZWZpeCA9ICcnCi0gICAgaWYgb3B0X3Nob3dfZmlsZW5hbWU6Ci0gICAgICAgIHByZWZpeCA9IGZpbGVuYW1lICsgJzogJyArIHByZWZpeAotICAgIHByaW50IHByZWZpeCArIGxpbmUKLSAgICBpZiBvcHRfc2hvd193aGVyZToKLSAgICAgICAgc3RhcnQsIGVuZCA9IHByb2cucmVncygpWzBdCi0gICAgICAgIGxpbmUgPSBsaW5lWzpzdGFydF0KLSAgICAgICAgaWYgJ1x0JyBub3QgaW4gbGluZToKLSAgICAgICAgICAgIHByZWZpeCA9ICcgJyAqIChsZW4ocHJlZml4KSArIHN0YXJ0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJlZml4ID0gJyAnICogbGVuKHByZWZpeCkKLSAgICAgICAgICAgIGZvciBjIGluIGxpbmU6Ci0gICAgICAgICAgICAgICAgaWYgYyAhPSAnXHQnOiBjID0gJyAnCi0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgYwotICAgICAgICBpZiBzdGFydCA9PSBlbmQ6IHByZWZpeCA9IHByZWZpeCArICdcXCcKLSAgICAgICAgZWxzZTogcHJlZml4ID0gcHJlZml4ICsgJ14nKihlbmQtc3RhcnQpCi0gICAgICAgIHByaW50IHByZWZpeApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbG9ja2ZpbGUucHkgYi9MaWIvbGliLW9sZC9sb2NrZmlsZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOWI0OC4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9sb2NrZmlsZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWltcG9ydCBzdHJ1Y3QsIGZjbnRsCi0KLWRlZiB3cml0ZWxvY2soZik6Ci0gICAgX2xvY2soZiwgZmNudGwuRl9XUkxDSykKLQotZGVmIHJlYWRsb2NrKGYpOgotICAgIF9sb2NrKGYsIGZjbnRsLkZfUkRMQ0spCi0KLWRlZiB1bmxvY2soZik6Ci0gICAgX2xvY2soZiwgZmNudGwuRl9VTkxDSykKLQotZGVmIF9sb2NrKGYsIG9wKToKLSAgICBkdW1teSA9IGZjbnRsLmZjbnRsKGYuZmlsZW5vKCksIGZjbnRsLkZfU0VUTEtXLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2soJzJoOGwnLCBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbmV3ZGlyLnB5IGIvTGliL2xpYi1vbGQvbmV3ZGlyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTZiZWNjLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL25ld2Rpci5weQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgTmV3IGRpcigpIGZ1bmN0aW9uCi0KLQotIyBUaGlzIHNob3VsZCBiZSB0aGUgbmV3IGRpcigpLCBleGNlcHQgdGhhdCBpdCBzaG91bGQgc3RpbGwgbGlzdAotIyB0aGUgY3VycmVudCBsb2NhbCBuYW1lIHNwYWNlIGJ5IGRlZmF1bHQKLQotZGVmIGxpc3RhdHRycyh4KToKLSAgICB0cnk6Ci0gICAgICAgIGRpY3RrZXlzID0geC5fX2RpY3RfXy5rZXlzKCkKLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBkaWN0a2V5cyA9IFtdCi0gICAgIwotICAgIHRyeToKLSAgICAgICAgbWV0aG9kcyA9IHguX19tZXRob2RzX18KLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBtZXRob2RzID0gW10KLSAgICAjCi0gICAgdHJ5OgotICAgICAgICBtZW1iZXJzID0geC5fX21lbWJlcnNfXwotICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgIG1lbWJlcnMgPSBbXQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIHRoZV9jbGFzcyA9IHguX19jbGFzc19fCi0gICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgdGhlX2NsYXNzID0gTm9uZQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIGJhc2VzID0geC5fX2Jhc2VzX18KLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICBiYXNlcyA9ICgpCi0gICAgIwotICAgIHRvdGFsID0gZGljdGtleXMgKyBtZXRob2RzICsgbWVtYmVycwotICAgIGlmIHRoZV9jbGFzczoKLSAgICAgICAgIyBJdCdzIGEgY2xhc3MgaW5zdGFjZTsgYWRkIHRoZSBjbGFzcydzIGF0dHJpYnV0ZXMKLSAgICAgICAgIyB0aGF0IGFyZSBmdW5jdGlvbnMgKG1ldGhvZHMpLi4uCi0gICAgICAgIGNsYXNzX2F0dHJzID0gbGlzdGF0dHJzKHRoZV9jbGFzcykKLSAgICAgICAgY2xhc3NfbWV0aG9kcyA9IFtdCi0gICAgICAgIGZvciBuYW1lIGluIGNsYXNzX2F0dHJzOgotICAgICAgICAgICAgaWYgaXNfZnVuY3Rpb24oZ2V0YXR0cih0aGVfY2xhc3MsIG5hbWUpKToKLSAgICAgICAgICAgICAgICBjbGFzc19tZXRob2RzLmFwcGVuZChuYW1lKQotICAgICAgICB0b3RhbCA9IHRvdGFsICsgY2xhc3NfbWV0aG9kcwotICAgIGVsaWYgYmFzZXM6Ci0gICAgICAgICMgSXQncyBhIGRlcml2ZWQgY2xhc3M7IGFkZCB0aGUgYmFzZSBjbGFzcyBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciBiYXNlIGluIGJhc2VzOgotICAgICAgICAgICAgYmFzZV9hdHRycyA9IGxpc3RhdHRycyhiYXNlKQotICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIGJhc2VfYXR0cnMKLSAgICB0b3RhbC5zb3J0KCkKLSAgICByZXR1cm4gdG90YWwKLSAgICBpID0gMAotICAgIHdoaWxlIGkrMSA8IGxlbih0b3RhbCk6Ci0gICAgICAgIGlmIHRvdGFsW2ldID09IHRvdGFsW2krMV06Ci0gICAgICAgICAgICBkZWwgdG90YWxbaSsxXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaSA9IGkrMQotICAgIHJldHVybiB0b3RhbAotCi0KLSMgSGVscGVyIHRvIHJlY29nbml6ZSBmdW5jdGlvbnMKLQotZGVmIGlzX2Z1bmN0aW9uKHgpOgotICAgIHJldHVybiB0eXBlKHgpID09IHR5cGUoaXNfZnVuY3Rpb24pCi0KLQotIyBBcHByb3hpbWF0aW9uIG9mIGJ1aWx0aW4gZGlyKCk7IGJ1dCBub3RlIHRoYXQgdGhpcyBsaXN0cyB0aGUgdXNlcidzCi0jIHZhcmlhYmxlcyBieSBkZWZhdWx0LCBub3QgdGhlIGN1cnJlbnQgbG9jYWwgbmFtZSBzcGFjZS4KLQotZGVmIGRpcih4ID0gTm9uZSk6Ci0gICAgaWYgeCBpcyBub3QgTm9uZToKLSAgICAgICAgcmV0dXJuIGxpc3RhdHRycyh4KQotICAgIGVsc2U6Ci0gICAgICAgIGltcG9ydCBfX21haW5fXwotICAgICAgICByZXR1cm4gbGlzdGF0dHJzKF9fbWFpbl9fKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvbmkucHkgYi9MaWIvbGliLW9sZC9uaS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0Zjk4OS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9uaS5weQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0iIiJOZXcgaW1wb3J0IHNjaGVtZSB3aXRoIHBhY2thZ2Ugc3VwcG9ydC4KLQotUXVpY2sgUmVmZXJlbmNlCi0tLS0tLS0tLS0tLS0tLS0KLQotLSBUbyBlbmFibGUgcGFja2FnZSBzdXBwb3J0LCBleGVjdXRlICJpbXBvcnQgbmkiIGJlZm9yZSBpbXBvcnRpbmcgYW55Ci0gIHBhY2thZ2VzLiAgSW1wb3J0aW5nIHRoaXMgbW9kdWxlIGF1dG9tYXRpY2FsbHkgaW5zdGFsbHMgdGhlIHJlbGV2YW50Ci0gIGltcG9ydCBob29rcy4KLQotLSBUbyBjcmVhdGUgYSBwYWNrYWdlIG5hbWVkIHNwYW0gY29udGFpbmluZyBzdWItbW9kdWxlcyBoYW0sIGJhY29uIGFuZAotICBlZ2dzLCBjcmVhdGUgYSBkaXJlY3Rvcnkgc3BhbSBzb21ld2hlcmUgb24gUHl0aG9uJ3MgbW9kdWxlIHNlYXJjaAotICBwYXRoIChpLmUuIHNwYW0ncyBwYXJlbnQgZGlyZWN0b3J5IG11c3QgYmUgb25lIG9mIHRoZSBkaXJlY3RvcmllcyBpbgotICBzeXMucGF0aCBvciAkUFlUSE9OUEFUSCk7IHRoZW4gY3JlYXRlIGZpbGVzIGhhbS5weSwgYmFjb24ucHkgYW5kCi0gIGVnZ3MucHkgaW5zaWRlIHNwYW0uCi0KLS0gVG8gaW1wb3J0IG1vZHVsZSBoYW0gZnJvbSBwYWNrYWdlIHNwYW0gYW5kIHVzZSBmdW5jdGlvbiBoYW1uZWdncygpCi0gIGZyb20gdGhhdCBtb2R1bGUsIHlvdSBjYW4gZWl0aGVyIGRvCi0KLSAgICBpbXBvcnQgc3BhbS5oYW0gICAgICAgICAgICAgIyAqbm90KiAiaW1wb3J0IHNwYW0iICEhIQotICAgIHNwYW0uaGFtLmhhbW5lZ2dzKCkKLQotICBvcgotCi0gICAgZnJvbSBzcGFtIGltcG9ydCBoYW0KLSAgICBoYW0uaGFtbmVnZ3MoKQotCi0gIG9yCi0KLSAgICBmcm9tIHNwYW0uaGFtIGltcG9ydCBoYW1uZWdncwotICAgIGhhbW5lZ2dzKCkKLQotLSBJbXBvcnRpbmcganVzdCAic3BhbSIgZG9lcyBub3QgZG8gd2hhdCB5b3UgZXhwZWN0OiBpdCBjcmVhdGVzIGFuCi0gIGVtcHR5IHBhY2thZ2UgbmFtZWQgc3BhbSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYnV0IGl0IGRvZXMKLSAgbm90IGltcG9ydCBzcGFtJ3Mgc3VibW9kdWxlcy4gIFRoZSBvbmx5IHN1Ym1vZHVsZSB0aGF0IGlzIGd1YXJhbnRlZWQKLSAgdG8gYmUgaW1wb3J0ZWQgaXMgc3BhbS5fX2luaXRfXywgaWYgaXQgZXhpc3RzLiAgTm90ZSB0aGF0Ci0gIHNwYW0uX19pbml0X18gaXMgYSBzdWJtb2R1bGUgb2YgcGFja2FnZSBzcGFtLiAgSXQgY2FuIHJlZmVyZW5jZSB0bwotICBzcGFtJ3MgbmFtZXNwYWNlIHZpYSB0aGUgJ19fLicgcHJlZml4LCBmb3IgaW5zdGFuY2UKLQotICAgIF9fLnNwYW1faW5pdGVkID0gMSAgICAgICAgICAjIFNldCBhIHBhY2thZ2UtbGV2ZWwgdmFyaWFibGUKLQotCi0KLVRoZW9yeSBvZiBPcGVyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQSBQYWNrYWdlIGlzIGEgbW9kdWxlIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgbW9kdWxlcy4gIFBhY2thZ2VzIGNhbiBiZQotbmVzdGVkLiAgUGFja2FnZSBpbnRyb2R1Y2UgZG90dGVkIG5hbWVzIGZvciBtb2R1bGVzLCBsaWtlIFAuUS5NLCB3aGljaAotY291bGQgY29ycmVzcG9uZCB0byBhIGZpbGUgUC9RL00ucHkgZm91bmQgc29tZXdoZXJlIG9uIHN5cy5wYXRoLiAgSXQKLWlzIHBvc3NpYmxlIHRvIGltcG9ydCBhIHBhY2thZ2UgaXRzZWxmLCB0aG91Z2ggdGhpcyBtYWtlcyBsaXR0bGUgc2Vuc2UKLXVubGVzcyB0aGUgcGFja2FnZSBjb250YWlucyBhIG1vZHVsZSBjYWxsZWQgX19pbml0X18uCi0KLUEgcGFja2FnZSBoYXMgdHdvIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgdGhlIG5hbWVzcGFjZSB1c2VkIGZvcgotcGFja2FnZXMgYW5kIG1vZHVsZXMsIGJvdGggaW5pdGlhbGl6ZWQgdG8gc2Vuc2libGUgZGVmYXVsdHMgdGhlIGZpcnN0Ci10aW1lIHRoZSBwYWNrYWdlIGlzIHJlZmVyZW5jZWQuCi0KLSgxKSBBIHBhY2thZ2UncyAqbW9kdWxlIHNlYXJjaCBwYXRoKiwgY29udGFpbmVkIGluIHRoZSBwZXItcGFja2FnZQotdmFyaWFibGUgX19wYXRoX18sIGRlZmluZXMgYSBsaXN0IG9mICpkaXJlY3Rvcmllcyogd2hlcmUgc3VibW9kdWxlcyBvcgotc3VicGFja2FnZXMgb2YgdGhlIHBhY2thZ2UgYXJlIHNlYXJjaGVkLiAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlCi1kaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZS4gIFNldHRpbmcgdGhpcyB2YXJpYWJsZSB0byBOb25lIG1ha2VzCi10aGUgbW9kdWxlIHNlYXJjaCBwYXRoIGRlZmF1bHQgdG8gc3lzLnBhdGggKHRoaXMgaXMgbm90IHF1aXRlIHRoZSBzYW1lCi1hcyBzZXR0aW5nIGl0IHRvIHN5cy5wYXRoLCBzaW5jZSB0aGUgbGF0dGVyIHdvbid0IHRyYWNrIGxhdGVyCi1hc3NpZ25tZW50cyB0byBzeXMucGF0aCkuCi0KLSgyKSBBIHBhY2thZ2UncyAqaW1wb3J0IGRvbWFpbiosIGNvbnRhaW5lZCBpbiB0aGUgcGVyLXBhY2thZ2UgdmFyaWFibGUKLV9fZG9tYWluX18sIGRlZmluZXMgYSBsaXN0IG9mICpwYWNrYWdlcyogdGhhdCBhcmUgc2VhcmNoZWQgKHVzaW5nCi10aGVpciByZXNwZWN0aXZlIG1vZHVsZSBzZWFyY2ggcGF0aHMpIHRvIHNhdGlzZnkgaW1wb3J0cy4gIEl0IGlzCi1pbml0aWFsaXplZCB0byB0aGUgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBwYWNrYWdlIGl0c2VsZiwgaXRzIHBhcmVudAotcGFja2FnZSwgaXRzIHBhcmVudCdzIHBhcmVudCwgYW5kIHNvIG9uLCBlbmRpbmcgd2l0aCB0aGUgcm9vdCBwYWNrYWdlCi0odGhlIG5hbWVsZXNzIHBhY2thZ2UgY29udGFpbmluZyBhbGwgdG9wLWxldmVsIHBhY2thZ2VzIGFuZCBtb2R1bGVzLAotd2hvc2UgbW9kdWxlIHNlYXJjaCBwYXRoIGlzIE5vbmUsIGltcGx5aW5nIHN5cy5wYXRoKS4KLQotVGhlIGRlZmF1bHQgZG9tYWluIGltcGxlbWVudHMgYSBzZWFyY2ggYWxnb3JpdGhtIGNhbGxlZCAiZXhwYW5kaW5nCi1zZWFyY2giLiAgQW4gYWx0ZXJuYXRpdmUgc2VhcmNoIGFsZ29yaXRobSBjYWxsZWQgImV4cGxpY2l0IHNlYXJjaCIKLWZpeGVzIHRoZSBpbXBvcnQgc2VhcmNoIHBhdGggdG8gY29udGFpbiBvbmx5IHRoZSByb290IHBhY2thZ2UsCi1yZXF1aXJpbmcgdGhlIG1vZHVsZXMgaW4gdGhlIHBhY2thZ2UgdG8gbmFtZSBhbGwgaW1wb3J0ZWQgbW9kdWxlcyBieQotdGhlaXIgZnVsbCBuYW1lLiAgVGhlIGNvbnZlbnRpb24gb2YgdXNpbmcgJ19fJyB0byByZWZlciB0byB0aGUgY3VycmVudAotcGFja2FnZSAoYm90aCBhcyBhIHBlci1tb2R1bGUgdmFyaWFibGUgYW5kIGluIG1vZHVsZSBuYW1lcykgY2FuIGJlCi11c2VkIGJ5IHBhY2thZ2VzIHVzaW5nIGV4cGxpY2l0IHNlYXJjaCB0byByZWZlciB0byBtb2R1bGVzIGluIHRoZSBzYW1lCi1wYWNrYWdlOyB0aGlzIGNvbWJpbmF0aW9uIGlzIGtub3duIGFzICJleHBsaWNpdC1yZWxhdGl2ZSBzZWFyY2giLgotCi1UaGUgUGFja2FnZUltcG9ydGVyIGFuZCBQYWNrYWdlTG9hZGVyIGNsYXNzZXMgdG9nZXRoZXIgaW1wbGVtZW50IHRoZQotZm9sbG93aW5nIHBvbGljaWVzOgotCi0tIFRoZXJlIGlzIGEgcm9vdCBwYWNrYWdlLCB3aG9zZSBuYW1lIGlzICcnLiAgSXQgY2Fubm90IGJlIGltcG9ydGVkCi0gIGRpcmVjdGx5IGJ1dCBtYXkgYmUgcmVmZXJlbmNlZCwgZS5nLiBieSB1c2luZyAnX18nIGZyb20gYSB0b3AtbGV2ZWwKLSAgbW9kdWxlLgotCi0tIEluIGVhY2ggbW9kdWxlIG9yIHBhY2thZ2UsIHRoZSB2YXJpYWJsZSAnX18nIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvCi0gIHRoZSBwYXJlbnQgcGFja2FnZTsgaW4gdGhlIHJvb3QgcGFja2FnZSwgJ19fJyBwb2ludHMgdG8gaXRzZWxmLgotCi0tIEluIHRoZSBuYW1lIGZvciBpbXBvcnRlZCBtb2R1bGVzIChlLmcuIE0gaW4gImltcG9ydCBNIiBvciAiZnJvbSBNCi0gIGltcG9ydCAuLi4iKSwgYSBsZWFkaW5nICdfXycgcmVmZXJzIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UgKGkuZS4KLSAgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgY3VycmVudCBtb2R1bGUpOyBsZWFkaW5nICdfXy5fXycgYW5kIHNvCi0gIG9uIHJlZmVyIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UncyBwYXJlbnQsIGFuZCBzbyBvbi4gIFRoZSB1c2Ugb2YKLSAgJ19fJyBlbHNld2hlcmUgaW4gdGhlIG1vZHVsZSBuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLS0gTW9kdWxlcyBhcmUgc2VhcmNoZWQgdXNpbmcgdGhlICJleHBhbmRpbmcgc2VhcmNoIiBhbGdvcml0aG0gYnkKLSAgdmlydHVlIG9mIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBfX2RvbWFpbl9fLgotCi0tIElmIEEuQi5DIGlzIGltcG9ydGVkLCBBIGlzIHNlYXJjaGVkIHVzaW5nIF9fZG9tYWluX187IHRoZW4KLSAgc3VicGFja2FnZSBCIGlzIHNlYXJjaGVkIGluIEEgdXNpbmcgaXRzIF9fcGF0aF9fLCBhbmQgc28gb24uCi0KLS0gQnVpbHQtaW4gbW9kdWxlcyBoYXZlIHByaW9yaXR5OiBldmVuIGlmIGEgZmlsZSBzeXMucHkgZXhpc3RzIGluIGEKLSAgcGFja2FnZSwgImltcG9ydCBzeXMiIGltcG9ydHMgdGhlIGJ1aWx0LWluIHN5cyBtb2R1bGUuCi0KLS0gVGhlIHNhbWUgaG9sZHMgZm9yIGZyb3plbiBtb2R1bGVzLCBmb3IgYmV0dGVyIG9yIGZvciB3b3JzZS4KLQotLSBTdWJtb2R1bGVzIGFuZCBzdWJwYWNrYWdlcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgbG9hZGVkIHdoZW4gdGhlaXIKLSAgcGFyZW50IHBhY2thZ2VzIGlzIGxvYWRlZC4KLQotLSBUaGUgY29uc3RydWN0ICJmcm9tIHBhY2thZ2UgaW1wb3J0ICoiIGlzIGlsbGVnYWwuICAoSXQgY2FuIHN0aWxsIGJlCi0gIHVzZWQgdG8gaW1wb3J0IG5hbWVzIGZyb20gYSBtb2R1bGUuKQotCi0tIFdoZW4gImZyb20gcGFja2FnZSBpbXBvcnQgbW9kdWxlMSwgbW9kdWxlMiwgLi4uIiBpcyB1c2VkLCB0aG9zZQotICAgIG1vZHVsZXMgYXJlIGV4cGxpY2l0bHkgbG9hZGVkLgotCi0tIFdoZW4gYSBwYWNrYWdlIGlzIGxvYWRlZCwgaWYgaXQgaGFzIGEgc3VibW9kdWxlIF9faW5pdF9fLCB0aGF0Ci0gIG1vZHVsZSBpcyBsb2FkZWQuICBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZSByZXF1aXJlZCBzdWJtb2R1bGVzIGNhbgotICBiZSBsb2FkZWQsIHRoZSBfX3BhdGhfXyB2YXJpYWJsZSBleHRlbmRlZCwgZXRjLiAgVGhlIF9faW5pdF9fIG1vZHVsZQotICBpcyBsb2FkZWQgZXZlbiBpZiB0aGUgcGFja2FnZSB3YXMgbG9hZGVkIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIGEKLSAgc3R1YiBmb3IgYSBzdWItcGFja2FnZTogaWYgImltcG9ydCBQLlEuUiIgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSB0bwotICBQLCBhbmQgUCBoYXMgYSBzdWJtb2R1bGUgX19pbml0X18sIFAuX19pbml0X18gaXMgbG9hZGVkIGJlZm9yZSBQLlEKLSAgaXMgZXZlbiBzZWFyY2hlZC4KLQotQ2F2ZWF0czoKLQotLSBJdCBpcyBwb3NzaWJsZSB0byBpbXBvcnQgYSBwYWNrYWdlIHRoYXQgaGFzIG5vIF9faW5pdF9fIHN1Ym1vZHVsZTsKLSAgdGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bCBidXQgdGhlcmUgbWF5IGJlIHVzZWZ1bCBhcHBsaWNhdGlvbnMKLSAgZm9yIGl0IChlLmcuIHRvIG1hbmlwdWxhdGUgaXRzIHNlYXJjaCBwYXRocyBmcm9tIHRoZSBvdXRzaWRlISkuCi0KLS0gVGhlcmUgYXJlIG5vIHNwZWNpYWwgcHJvdmlzaW9ucyBmb3Igb3MuY2hkaXIoKS4gIElmIHlvdSBwbGFuIHRvIHVzZQotICBvcy5jaGRpcigpIGJlZm9yZSB5b3UgaGF2ZSBpbXBvcnRlZCBhbGwgeW91ciBtb2R1bGVzLCBpdCBpcyBiZXR0ZXIKLSAgbm90IHRvIGhhdmUgcmVsYXRpdmUgcGF0aG5hbWVzIGluIHN5cy5wYXRoLiAgKFRoaXMgY291bGQgYWN0dWFsbHkgYmUKLSAgZml4ZWQgYnkgY2hhbmdpbmcgdGhlIGltcGxlbWVudGF0aW9uIG9mIHBhdGhfam9pbigpIGluIHRoZSBob29rIHRvCi0gIGFic29sdXRpemUgcGF0aHMuKQotCi0tIFBhY2thZ2VzIGFuZCBtb2R1bGVzIGFyZSBpbnRyb2R1Y2VkIGluIHN5cy5tb2R1bGVzIGFzIHNvb24gYXMgdGhlaXIKLSAgbG9hZGluZyBpcyBzdGFydGVkLiAgV2hlbiB0aGUgbG9hZGluZyBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGV4Y2VwdGlvbiwKLSAgdGhlIHN5cy5tb2R1bGVzIGVudHJpZXMgcmVtYWluIGFyb3VuZC4KLQotLSBUaGVyZSBhcmUgbm8gc3BlY2lhbCBtZWFzdXJlcyB0byBzdXBwb3J0IG11dHVhbGx5IHJlY3Vyc2l2ZSBtb2R1bGVzLAotICBidXQgaXQgd2lsbCB3b3JrIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgd2hlcmUgaXQgd29ya3MgaW4gdGhlCi0gIGZsYXQgbW9kdWxlIHNwYWNlIHN5c3RlbS4KLQotLSBTb21ldGltZXMgZHVtbXkgZW50cmllcyAod2hvc2UgdmFsdWUgaXMgTm9uZSkgYXJlIGVudGVyZWQgaW4KLSAgc3lzLm1vZHVsZXMsIHRvIGluZGljYXRlIHRoYXQgYSBwYXJ0aWN1bGFyIG1vZHVsZSBkb2VzIG5vdCBleGlzdCAtLQotICB0aGlzIGlzIGRvbmUgdG8gc3BlZWQgdXAgdGhlIGV4cGFuZGluZyBzZWFyY2ggYWxnb3JpdGhtIHdoZW4gYQotICBtb2R1bGUgcmVzaWRpbmcgYXQgYSBoaWdoZXIgbGV2ZWwgaXMgcmVwZWF0ZWRseSBpbXBvcnRlZCAoUHl0aG9uCi0gIHByb21pc2VzIHRoYXQgaW1wb3J0aW5nIGEgcHJldmlvdXNseSBpbXBvcnRlZCBtb2R1bGUgaXMgY2hlYXAhKQotCi0tIEFsdGhvdWdoIGR5bmFtaWNhbGx5IGxvYWRlZCBleHRlbnNpb25zIGFyZSBhbGxvd2VkIGluc2lkZSBwYWNrYWdlcywKLSAgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKGhhcmRjb2RlZCBpbiB0aGUgaW50ZXJwcmV0ZXIpIG9mIHRoZWlyCi0gIGluaXRpYWxpemF0aW9uIG1heSBjYXVzZSBwcm9ibGVtcyBpZiBhbiBleHRlbnNpb24gaW52b2tlcyB0aGUKLSAgaW50ZXJwcmV0ZXIgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbi4KLQotLSByZWxvYWQoKSBtYXkgZmluZCBhbm90aGVyIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBvbmx5IGlmIGl0IG9jY3VycyBvbgotICB0aGUgcGFja2FnZSBzZWFyY2ggcGF0aC4gIFRodXMsIGl0IGtlZXBzIHRoZSBjb25uZWN0aW9uIHRvIHRoZQotICBwYWNrYWdlIHRvIHdoaWNoIHRoZSBtb2R1bGUgYmVsb25ncywgYnV0IG1heSBmaW5kIGEgZGlmZmVyZW50IGZpbGUuCi0KLVhYWCBOZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgbmFtZSBmb3IgJycsIGUuZy4gJ19fcm9vdF9fJy4KLQotIiIiCi0KLQotaW1wb3J0IGltcAotaW1wb3J0IHN5cwotaW1wb3J0IF9fYnVpbHRpbl9fCi0KLWltcG9ydCBpaG9va3MKLWZyb20gaWhvb2tzIGltcG9ydCBNb2R1bGVMb2FkZXIsIE1vZHVsZUltcG9ydGVyCi0KLQotY2xhc3MgUGFja2FnZUxvYWRlcihNb2R1bGVMb2FkZXIpOgotCi0gICAgIiIiQSBzdWJjbGFzcyBvZiBNb2R1bGVMb2FkZXIgd2l0aCBwYWNrYWdlIHN1cHBvcnQuCi0KLSAgICBmaW5kX21vZHVsZV9pbl9kaXIoKSB3aWxsIHN1Y2NlZWQgaWYgdGhlcmUncyBhIHN1YmRpcmVjdG9yeSB3aXRoCi0gICAgdGhlIGdpdmVuIG5hbWU7IGxvYWRfbW9kdWxlKCkgd2lsbCBjcmVhdGUgYSBzdHViIGZvciBhIHBhY2thZ2UgYW5kCi0gICAgbG9hZCBpdHMgX19pbml0X18gbW9kdWxlIGlmIGl0IGV4aXN0cy4KLQotICAgICIiIgotCi0gICAgZGVmIGZpbmRfbW9kdWxlX2luX2RpcihzZWxmLCBuYW1lLCBkaXIpOgotICAgICAgICBpZiBkaXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBkaXJuYW1lID0gc2VsZi5ob29rcy5wYXRoX2pvaW4oZGlyLCBuYW1lKQotICAgICAgICAgICAgaWYgc2VsZi5ob29rcy5wYXRoX2lzZGlyKGRpcm5hbWUpOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBkaXJuYW1lLCAoJycsICcnLCAnUEFDS0FHRScpCi0gICAgICAgIHJldHVybiBNb2R1bGVMb2FkZXIuZmluZF9tb2R1bGVfaW5fZGlyKHNlbGYsIG5hbWUsIGRpcikKLQotICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZik6Ci0gICAgICAgIGZpbGUsIGZpbGVuYW1lLCBpbmZvID0gc3R1ZmYKLSAgICAgICAgc3VmZiwgbW9kZSwgdHlwZSA9IGluZm8KLSAgICAgICAgaWYgdHlwZSA9PSAnUEFDS0FHRSc6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkX3BhY2thZ2UobmFtZSwgc3R1ZmYpCi0gICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobmFtZSk6Ci0gICAgICAgICAgICBtID0gc3lzLm1vZHVsZXNbbmFtZV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbSA9IGltcC5uZXdfbW9kdWxlKG5hbWUpCi0gICAgICAgIHNlbGYuc2V0X3BhcmVudChtKQotICAgICAgICBpZiB0eXBlID09IGltcC5DX0VYVEVOU0lPTiBhbmQgJy4nIGluIG5hbWU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkX2R5bmFtaWMobmFtZSwgc3R1ZmYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlTG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYsIG5hbWUsIHN0dWZmKQotCi0gICAgZGVmIGxvYWRfZHluYW1pYyhzZWxmLCBuYW1lLCBzdHVmZik6Ci0gICAgICAgIGZpbGUsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgdHlwZSkgPSBzdHVmZgotICAgICAgICAjIEhhY2sgYXJvdW5kIHJlc3RyaWN0aW9uIGluIGltcC5sb2FkX2R5bmFtaWMoKQotICAgICAgICBpID0gbmFtZS5yZmluZCgnLicpCi0gICAgICAgIHRhaWwgPSBuYW1lW2krMTpdCi0gICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkodGFpbCk6Ci0gICAgICAgICAgICBzYXZlID0gc3lzLm1vZHVsZXNbdGFpbF0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNhdmUgPSBOb25lCi0gICAgICAgIHN5cy5tb2R1bGVzW3RhaWxdID0gaW1wLm5ld19tb2R1bGUobmFtZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbSA9IGltcC5sb2FkX2R5bmFtaWModGFpbCwgZmlsZW5hbWUsIGZpbGUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBzYXZlOgotICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW3RhaWxdID0gc2F2ZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbdGFpbF0KLSAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgbG9hZF9wYWNrYWdlKHNlbGYsIG5hbWUsIHN0dWZmKToKLSAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGluZm8gPSBzdHVmZgotICAgICAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG5hbWUpOgotICAgICAgICAgICAgcGFja2FnZSA9IHN5cy5tb2R1bGVzW25hbWVdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IHBhY2thZ2UgPSBpbXAubmV3X21vZHVsZShuYW1lKQotICAgICAgICBwYWNrYWdlLl9fcGF0aF9fID0gW2ZpbGVuYW1lXQotICAgICAgICBzZWxmLmluaXRfcGFja2FnZShwYWNrYWdlKQotICAgICAgICByZXR1cm4gcGFja2FnZQotCi0gICAgZGVmIGluaXRfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgc2VsZi5zZXRfcGFyZW50KHBhY2thZ2UpCi0gICAgICAgIHNlbGYuc2V0X2RvbWFpbihwYWNrYWdlKQotICAgICAgICBzZWxmLmNhbGxfaW5pdF9tb2R1bGUocGFja2FnZSkKLQotICAgIGRlZiBzZXRfcGFyZW50KHNlbGYsIG0pOgotICAgICAgICBuYW1lID0gbS5fX25hbWVfXwotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lWzpuYW1lLnJmaW5kKCcuJyldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1lID0gJycKLSAgICAgICAgbS5fXyA9IHN5cy5tb2R1bGVzW25hbWVdCi0KLSAgICBkZWYgc2V0X2RvbWFpbihzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgbmFtZSA9IHBhY2thZ2UuX19uYW1lX18KLSAgICAgICAgcGFja2FnZS5fX2RvbWFpbl9fID0gZG9tYWluID0gW25hbWVdCi0gICAgICAgIHdoaWxlICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmZpbmQoJy4nKV0KLSAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQobmFtZSkKLSAgICAgICAgaWYgbmFtZToKLSAgICAgICAgICAgIGRvbWFpbi5hcHBlbmQoJycpCi0KLSAgICBkZWYgY2FsbF9pbml0X21vZHVsZShzZWxmLCBwYWNrYWdlKToKLSAgICAgICAgc3R1ZmYgPSBzZWxmLmZpbmRfbW9kdWxlKCdfX2luaXRfXycsIHBhY2thZ2UuX19wYXRoX18pCi0gICAgICAgIGlmIHN0dWZmOgotICAgICAgICAgICAgbSA9IHNlbGYubG9hZF9tb2R1bGUocGFja2FnZS5fX25hbWVfXyArICcuX19pbml0X18nLCBzdHVmZikKLSAgICAgICAgICAgIHBhY2thZ2UuX19pbml0X18gPSBtCi0KLQotY2xhc3MgUGFja2FnZUltcG9ydGVyKE1vZHVsZUltcG9ydGVyKToKLQotICAgICIiIkltcG9ydGVyIHRoYXQgdW5kZXJzdGFuZHMgcGFja2FnZXMgYW5kICdfXycuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9hZGVyID0gTm9uZSwgdmVyYm9zZSA9IDApOgotICAgICAgICBNb2R1bGVJbXBvcnRlci5fX2luaXRfXyhzZWxmLAotICAgICAgICBsb2FkZXIgb3IgUGFja2FnZUxvYWRlcihOb25lLCB2ZXJib3NlKSwgdmVyYm9zZSkKLQotICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIG5hbWUsIGdsb2JhbHM9e30sIGxvY2Fscz17fSwgZnJvbWxpc3Q9W10pOgotICAgICAgICBpZiBnbG9iYWxzLmhhc19rZXkoJ19fJyk6Ci0gICAgICAgICAgICBwYWNrYWdlID0gZ2xvYmFsc1snX18nXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBObyBjYWxsaW5nIGNvbnRleHQsIGFzc3VtZSBpbiByb290IHBhY2thZ2UKLSAgICAgICAgICAgIHBhY2thZ2UgPSBzeXMubW9kdWxlc1snJ10KLSAgICAgICAgaWYgbmFtZVs6M10gaW4gKCdfXy4nLCAnX18nKToKLSAgICAgICAgICAgIHAgPSBwYWNrYWdlCi0gICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KLSAgICAgICAgICAgIHdoaWxlIG5hbWVbOjNdIGluICgnX18uJywgJ19fJyk6Ci0gICAgICAgICAgICAgICAgcCA9IHAuX18KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVszOl0KLSAgICAgICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbmlzaChwYWNrYWdlLCBwLCAnJywgZnJvbWxpc3QpCi0gICAgICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgICAgICBpID0gbmFtZS5maW5kKCcuJykKLSAgICAgICAgICAgICAgICBuYW1lLCB0YWlsID0gbmFtZVs6aV0sIG5hbWVbaTpdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHRhaWwgPSAnJwotICAgICAgICAgICAgbW5hbWUgPSBwLl9fbmFtZV9fIGFuZCBwLl9fbmFtZV9fKycuJytuYW1lIG9yIG5hbWUKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDEobW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5maW5pc2gocGFja2FnZSwgbSwgdGFpbCwgZnJvbWxpc3QpCi0gICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgaSA9IG5hbWUuZmluZCgnLicpCi0gICAgICAgICAgICBuYW1lLCB0YWlsID0gbmFtZVs6aV0sIG5hbWVbaTpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YWlsID0gJycKLSAgICAgICAgZm9yIHBuYW1lIGluIHBhY2thZ2UuX19kb21haW5fXzoKLSAgICAgICAgICAgIG1uYW1lID0gcG5hbWUgYW5kIHBuYW1lKycuJytuYW1lIG9yIG5hbWUKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDAobW5hbWUpCi0gICAgICAgICAgICBpZiBtOiBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBzdWNoIG1vZHVsZSAlcyIgJSBuYW1lCi0gICAgICAgIHJldHVybiBzZWxmLmZpbmlzaChtLCBtLCB0YWlsLCBmcm9tbGlzdCkKLQotICAgIGRlZiBmaW5pc2goc2VsZiwgbW9kdWxlLCBtLCB0YWlsLCBmcm9tbGlzdCk6Ci0gICAgICAgICMgR290IC4uLi5BOyBub3cgZ2V0IC4uLi5BLkIuQy5ECi0gICAgICAgIHluYW1lID0gbS5fX25hbWVfXwotICAgICAgICBpZiB0YWlsIGFuZCBzeXMubW9kdWxlcy5oYXNfa2V5KHluYW1lICsgdGFpbCk6ICMgRmFzdCBwYXRoCi0gICAgICAgICAgICB5bmFtZSwgdGFpbCA9IHluYW1lICsgdGFpbCwgJycKLSAgICAgICAgICAgIG0gPSBzZWxmLmdldDEoeW5hbWUpCi0gICAgICAgIHdoaWxlIHRhaWw6Ci0gICAgICAgICAgICBpID0gdGFpbC5maW5kKCcuJywgMSkKLSAgICAgICAgICAgIGlmIGkgPiAwOgotICAgICAgICAgICAgICAgIGhlYWQsIHRhaWwgPSB0YWlsWzppXSwgdGFpbFtpOl0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaGVhZCwgdGFpbCA9IHRhaWwsICcnCi0gICAgICAgICAgICB5bmFtZSA9IHluYW1lICsgaGVhZAotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0MSh5bmFtZSkKLQotICAgICAgICAjIEdvdCAuLi4uQS5CLkMuRDsgbm93IGZpbmFsaXplIHRoaW5ncyBkZXBlbmRpbmcgb24gZnJvbWxpc3QKLSAgICAgICAgaWYgbm90IGZyb21saXN0OgotICAgICAgICAgICAgcmV0dXJuIG1vZHVsZQotICAgICAgICBpZiAnX18nIGluIGZyb21saXN0OgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJDYW4ndCBpbXBvcnQgX18gZnJvbSBhbnl3aGVyZSIKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobSwgJ19fcGF0aF9fJyk6IHJldHVybiBtCi0gICAgICAgIGlmICcqJyBpbiBmcm9tbGlzdDoKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiQ2FuJ3QgaW1wb3J0ICogZnJvbSBhIHBhY2thZ2UiCi0gICAgICAgIGZvciBmIGluIGZyb21saXN0OgotICAgICAgICAgICAgaWYgaGFzYXR0cihtLCBmKTogY29udGludWUKLSAgICAgICAgICAgIGZuYW1lID0geW5hbWUgKyAnLicgKyBmCi0gICAgICAgICAgICBzZWxmLmdldDEoZm5hbWUpCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgZ2V0MShzZWxmLCBuYW1lKToKLSAgICAgICAgbSA9IHNlbGYuZ2V0KG5hbWUpCi0gICAgICAgIGlmIG5vdCBtOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgJXMiICUgbmFtZQotICAgICAgICByZXR1cm4gbQotCi0gICAgZGVmIGdldDAoc2VsZiwgbmFtZSk6Ci0gICAgICAgIG0gPSBzZWxmLmdldChuYW1lKQotICAgICAgICBpZiBub3QgbToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gTm9uZQotICAgICAgICByZXR1cm4gbQotCi0gICAgZGVmIGdldChzZWxmLCBuYW1lKToKLSAgICAgICAgIyBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCBvciBsb2FkIGEgbW9kdWxlIHdoZW4gaXRzIHBhcmVudCBleGlzdHMKLSAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleShuYW1lKToKLSAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKLSAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpKzE6XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGVhZCwgdGFpbCA9ICcnLCBuYW1lCi0gICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1toZWFkXS5fX3BhdGhfXwotICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKHRhaWwsIHBhdGgpCi0gICAgICAgIGlmIG5vdCBzdHVmZjoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbSA9IHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKG5hbWUsIHN0dWZmKQotICAgICAgICBpZiBoZWFkOgotICAgICAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1toZWFkXSwgdGFpbCwgbSkKLSAgICAgICAgcmV0dXJuIG0KLQotICAgIGRlZiByZWxvYWQoc2VsZiwgbW9kdWxlKToKLSAgICAgICAgbmFtZSA9IG1vZHVsZS5fX25hbWVfXwotICAgICAgICBpZiAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKLSAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpKzE6XQotICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW2hlYWRdLl9fcGF0aF9fCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YWlsID0gbmFtZQotICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzWycnXS5fX3BhdGhfXwotICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKHRhaWwsIHBhdGgpCi0gICAgICAgIGlmIG5vdCBzdHVmZjoKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICVzIiAlIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKG5hbWUsIHN0dWZmKQotCi0gICAgZGVmIHVubG9hZChzZWxmLCBtb2R1bGUpOgotICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgImRvbid0IGtub3cgaG93IHRvIHVubG9hZCBwYWNrYWdlcyB5ZXQiCi0gICAgICAgIFBhY2thZ2VJbXBvcnRlci51bmxvYWQoc2VsZiwgbW9kdWxlKQotCi0gICAgZGVmIGluc3RhbGwoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBzeXMubW9kdWxlcy5oYXNfa2V5KCcnKToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzWycnXSA9IHBhY2thZ2UgPSBpbXAubmV3X21vZHVsZSgnJykKLSAgICAgICAgICAgIHBhY2thZ2UuX19wYXRoX18gPSBOb25lCi0gICAgICAgICAgICBzZWxmLmxvYWRlci5pbml0X3BhY2thZ2UocGFja2FnZSkKLSAgICAgICAgICAgIGZvciBtIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgotICAgICAgICAgICAgICAgIGlmIG5vdCBtOiBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKG0sICdfXycpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRlci5zZXRfcGFyZW50KG0pCi0gICAgICAgIE1vZHVsZUltcG9ydGVyLmluc3RhbGwoc2VsZikKLQotCi1kZWYgaW5zdGFsbCh2ID0gMCk6Ci0gICAgaWhvb2tzLmluc3RhbGwoUGFja2FnZUltcG9ydGVyKE5vbmUsIHYpKQotCi1kZWYgdW5pbnN0YWxsKCk6Ci0gICAgaWhvb2tzLnVuaW5zdGFsbCgpCi0KLWRlZiBuaSh2ID0gMCk6Ci0gICAgaW5zdGFsbCh2KQotCi1kZWYgbm8oKToKLSAgICB1bmluc3RhbGwoKQotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBwZGIKLSAgICB0cnk6Ci0gICAgICAgIHRlc3Rwcm9wZXIoKQotICAgIGV4Y2VwdDoKLSAgICAgICAgc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCi0gICAgICAgIHByaW50Ci0gICAgICAgIHByaW50IHN5cy5sYXN0X3R5cGUsICc6Jywgc3lzLmxhc3RfdmFsdWUKLSAgICAgICAgcHJpbnQKLSAgICAgICAgcGRiLnBtKCkKLQotZGVmIHRlc3Rwcm9wZXIoKToKLSAgICBpbnN0YWxsKDEpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgbWFjdGVzdAotICAgICAgICBwcmludCBkaXIobWFjdGVzdCkKLSAgICAgICAgcmF3X2lucHV0KCdPSz8nKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHVuaW5zdGFsbCgpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0KCkKLWVsc2U6Ci0gICAgaW5zdGFsbCgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9wYWNrbWFpbC5weSBiL0xpYi9saWItb2xkL3BhY2ttYWlsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTY5MTA4Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3BhY2ttYWlsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMgTW9kdWxlICdwYWNrbWFpbCcgLS0gY3JlYXRlIGEgc2VsZi11bnBhY2tpbmcgc2hlbGwgYXJjaGl2ZS4KLQotIyBUaGlzIG1vZHVsZSB3b3JrcyBvbiBVTklYIGFuZCBvbiB0aGUgTWFjOyB0aGUgYXJjaGl2ZXMgY2FuIHVucGFjawotIyB0aGVtc2VsdmVzIG9ubHkgb24gVU5JWC4KLQotaW1wb3J0IG9zCi1mcm9tIHN0YXQgaW1wb3J0IFNUX01USU1FCi0KLSMgUHJpbnQgaGVscAotZGVmIGhlbHAoKToKLSAgICBwcmludCAnQWxsIGZucyBoYXZlIGEgZmlsZSBvcGVuIGZvciB3cml0aW5nIGFzIGZpcnN0IHBhcmFtZXRlcicKLSAgICBwcmludCAncGFjayhmLCBmdWxsbmFtZSwgbmFtZSk6IHBhY2sgZnVsbG5hbWUgYXMgbmFtZScKLSAgICBwcmludCAncGFja3NvbWUoZiwgZGlyZWN0b3J5LCBuYW1lbGlzdCk6IHNlbGVjdGVkIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotICAgIHByaW50ICdwYWNrYWxsKGYsIGRpcmVjdG9yeSk6IHBhY2sgYWxsIGZpbGVzIGZyb20gZGlyZWN0b3J5JwotICAgIHByaW50ICdwYWNrbm90b2xkZXIoZiwgZGlyZWN0b3J5LCBuYW1lKTogcGFjayBhbGwgZmlsZXMgZnJvbSBkaXJlY3RvcnknCi0gICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGEgZmlsZSB0aGVyZScKLSAgICBwcmludCAncGFja3RyZWUoZiwgZGlyZWN0b3J5KTogcGFjayBlbnRpcmUgZGlyZWN0b3J5IHRyZWUnCi0KLSMgUGFjayBvbmUgZmlsZQotZGVmIHBhY2sob3V0ZnAsIGZpbGUsIG5hbWUpOgotICAgIGZwID0gb3BlbihmaWxlLCAncicpCi0gICAgb3V0ZnAud3JpdGUoJ2VjaG8gJyArIG5hbWUgKyAnXG4nKQotICAgIG91dGZwLndyaXRlKCdzZWQgInMvXlgvLyIgPiInICsgbmFtZSArICciIDw8IiEiXG4nKQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICBpZiBsaW5lWy0xOl0gIT0gJ1xuJzoKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJ1xuJwotICAgICAgICBvdXRmcC53cml0ZSgnWCcgKyBsaW5lKQotICAgIG91dGZwLndyaXRlKCchXG4nKQotICAgIGZwLmNsb3NlKCkKLQotIyBQYWNrIHNvbWUgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeQotZGVmIHBhY2tzb21lKG91dGZwLCBkaXJuYW1lLCBuYW1lcyk6Ci0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIHByaW50IG5hbWUKLSAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQotICAgICAgICBwYWNrKG91dGZwLCBmaWxlLCBuYW1lKQotCi0jIFBhY2sgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkKLWRlZiBwYWNrYWxsKG91dGZwLCBkaXJuYW1lKToKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLicpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0gICAgdHJ5OgotICAgICAgICBuYW1lcy5yZW1vdmUoJy4uJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICBuYW1lcy5zb3J0KCkKLSAgICBwYWNrc29tZShvdXRmcCwgZGlybmFtZSwgbmFtZXMpCi0KLSMgUGFjayBhbGwgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSB0aGF0IGFyZSBub3Qgb2xkZXIgdGhhbiBhIGdpdmUgb25lCi1kZWYgcGFja25vdG9sZGVyKG91dGZwLCBkaXJuYW1lLCBvbGRlc3QpOgotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQotICAgIHRyeToKLSAgICAgICAgbmFtZXMucmVtb3ZlKCcuJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLi4nKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotICAgIG9sZGVzdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBvbGRlc3QpCi0gICAgc3QgPSBvcy5zdGF0KG9sZGVzdCkKLSAgICBtdGltZSA9IHN0W1NUX01USU1FXQotICAgIHRvZG8gPSBbXQotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBwcmludCBuYW1lLCAnLi4uJywKLSAgICAgICAgc3QgPSBvcy5zdGF0KG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKLSAgICAgICAgaWYgc3RbU1RfTVRJTUVdID49IG10aW1lOgotICAgICAgICAgICAgcHJpbnQgJ1llcy4nCi0gICAgICAgICAgICB0b2RvLmFwcGVuZChuYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ05vLicKLSAgICB0b2RvLnNvcnQoKQotICAgIHBhY2tzb21lKG91dGZwLCBkaXJuYW1lLCB0b2RvKQotCi0jIFBhY2sgYSB3aG9sZSB0cmVlIChubyBleGNlcHRpb25zKQotZGVmIHBhY2t0cmVlKG91dGZwLCBkaXJuYW1lKToKLSAgICBwcmludCAncGFja3RyZWUnLCBkaXJuYW1lCi0gICAgb3V0ZnAud3JpdGUoJ21rZGlyICcgKyB1bml4Zml4KGRpcm5hbWUpICsgJ1xuJykKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLicpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0gICAgdHJ5OgotICAgICAgICBuYW1lcy5yZW1vdmUoJy4uJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICBzdWJkaXJzID0gW10KLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6Ci0gICAgICAgICAgICBzdWJkaXJzLmFwcGVuZChmdWxsbmFtZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICdwYWNrJywgZnVsbG5hbWUKLSAgICAgICAgICAgIHBhY2sob3V0ZnAsIGZ1bGxuYW1lLCB1bml4Zml4KGZ1bGxuYW1lKSkKLSAgICBmb3Igc3ViZGlybmFtZSBpbiBzdWJkaXJzOgotICAgICAgICBwYWNrdHJlZShvdXRmcCwgc3ViZGlybmFtZSkKLQotZGVmIHVuaXhmaXgobmFtZSk6Ci0gICAgY29tcHMgPSBuYW1lLnNwbGl0KG9zLnNlcCkKLSAgICByZXMgPSAnJwotICAgIGZvciBjb21wIGluIGNvbXBzOgotICAgICAgICBpZiBjb21wOgotICAgICAgICAgICAgaWYgcmVzOiByZXMgPSByZXMgKyAnLycKLSAgICAgICAgICAgIHJlcyA9IHJlcyArIGNvbXAKLSAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9wb2x5LnB5IGIvTGliL2xpYi1vbGQvcG9seS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YTFkYy4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9wb2x5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBtb2R1bGUgJ3BvbHknIC0tIFBvbHlub21pYWxzCi0KLSMgQSBwb2x5bm9taWFsIGlzIHJlcHJlc2VudGVkIGJ5IGEgbGlzdCBvZiBjb2VmZmljaWVudHMsIGUuZy4sCi0jIFsxLCAxMCwgNV0gcmVwcmVzZW50cyAxKngqKjAgKyAxMCp4KioxICsgNSp4KioyIChvciAxICsgMTB4ICsgNXgqKjIpLgotIyBUaGVyZSBpcyBubyB3YXkgdG8gc3VwcHJlc3MgaW50ZXJuYWwgemVyb3M7IHRyYWlsaW5nIHplcm9zIGFyZQotIyB0YWtlbiBvdXQgYnkgbm9ybWFsaXplKCkuCi0KLWRlZiBub3JtYWxpemUocCk6ICMgU3RyaXAgdW5uZWNlc3NhcnkgemVybyBjb2VmZmljaWVudHMKLSAgICBuID0gbGVuKHApCi0gICAgd2hpbGUgbjoKLSAgICAgICAgaWYgcFtuLTFdOiByZXR1cm4gcFs6bl0KLSAgICAgICAgbiA9IG4tMQotICAgIHJldHVybiBbXQotCi1kZWYgcGx1cyhhLCBiKToKLSAgICBpZiBsZW4oYSkgPCBsZW4oYik6IGEsIGIgPSBiLCBhICMgbWFrZSBzdXJlIGEgaXMgdGhlIGxvbmdlc3QKLSAgICByZXMgPSBhWzpdICMgbWFrZSBhIGNvcHkKLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYikpOgotICAgICAgICByZXNbaV0gPSByZXNbaV0gKyBiW2ldCi0gICAgcmV0dXJuIG5vcm1hbGl6ZShyZXMpCi0KLWRlZiBtaW51cyhhLCBiKToKLSAgICBuZWdfYiA9IG1hcChsYW1iZGEgeDogLXgsIGJbOl0pCi0gICAgcmV0dXJuIHBsdXMoYSwgbmVnX2IpCi0KLWRlZiBvbmUocG93ZXIsIGNvZWZmKTogIyBSZXByZXNlbnRhdGlvbiBvZiBjb2VmZiAqIHgqKnBvd2VyCi0gICAgcmVzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShwb3dlcik6IHJlcy5hcHBlbmQoMCkKLSAgICByZXR1cm4gcmVzICsgW2NvZWZmXQotCi1kZWYgdGltZXMoYSwgYik6Ci0gICAgcmVzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYSkpOgotICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oYikpOgotICAgICAgICAgICAgcmVzID0gcGx1cyhyZXMsIG9uZShpK2osIGFbaV0qYltqXSkpCi0gICAgcmV0dXJuIHJlcwotCi1kZWYgcG93ZXIoYSwgbik6ICMgUmFpc2UgcG9seW5vbWlhbCBhIHRvIHRoZSBwb3NpdGl2ZSBpbnRlZ3JhbCBwb3dlciBuCi0gICAgaWYgbiA9PSAwOiByZXR1cm4gWzFdCi0gICAgaWYgbiA9PSAxOiByZXR1cm4gYQotICAgIGlmIG4vMioyID09IG46Ci0gICAgICAgIGIgPSBwb3dlcihhLCBuLzIpCi0gICAgICAgIHJldHVybiB0aW1lcyhiLCBiKQotICAgIHJldHVybiB0aW1lcyhwb3dlcihhLCBuLTEpLCBhKQotCi1kZWYgZGVyKGEpOiAjIEZpcnN0IGRlcml2YXRpdmUKLSAgICByZXMgPSBhWzE6XQotICAgIGZvciBpIGluIHJhbmdlKGxlbihyZXMpKToKLSAgICAgICAgcmVzW2ldID0gcmVzW2ldICogKGkrMSkKLSAgICByZXR1cm4gcmVzCi0KLSMgQ29tcHV0aW5nIGEgcHJpbWl0aXZlIGZ1bmN0aW9uIHdvdWxkIHJlcXVpcmUgcmF0aW9uYWwgYXJpdGhtZXRpYy4uLgpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvcmFuZC5weSBiL0xpYi9saWItb2xkL3JhbmQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTdiNjkuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvcmFuZC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgTW9kdWxlICdyYW5kJwotIyBEb24ndCB1c2UgdW5sZXNzIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCBDJ3MgcmFuZCgpIQotCi1pbXBvcnQgd2hyYW5kb20KLQotZGVmIHNyYW5kKHNlZWQpOgotICAgIHdocmFuZG9tLnNlZWQoc2VlZCUyNTYsIHNlZWQvMjU2JTI1Niwgc2VlZC82NTUzNiUyNTYpCi0KLWRlZiByYW5kKCk6Ci0gICAgcmV0dXJuIGludCh3aHJhbmRvbS5yYW5kb20oKSAqIDMyNzY4LjApICUgMzI3NjgKLQotZGVmIGNob2ljZShzZXEpOgotICAgIHJldHVybiBzZXFbcmFuZCgpICUgbGVuKHNlcSldCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9zdGF0Y2FjaGUucHkgYi9MaWIvbGliLW9sZC9zdGF0Y2FjaGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzgzOTMuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvc3RhdGNhY2hlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotIiIiTWFpbnRhaW4gYSBjYWNoZSBvZiBzdGF0KCkgaW5mb3JtYXRpb24gb24gZmlsZXMuCi0KLVRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcmVzZXQgdGhlIGNhY2hlIG9yIHRvIHNlbGVjdGl2ZWx5IHJlbW92ZSBpdGVtcy4KLSIiIgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oIlRoZSBzdGF0Y2FjaGUgbW9kdWxlIGlzIG9ic29sZXRlLiAgVXNlIG9zLnN0YXQoKSBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLWRlbCB3YXJuaW5ncwotCi1pbXBvcnQgb3MgYXMgX29zCi1mcm9tIHN0YXQgaW1wb3J0ICoKLQotX19hbGxfXyA9IFsic3RhdCIsInJlc2V0IiwiZm9yZ2V0IiwiZm9yZ2V0X3ByZWZpeCIsImZvcmdldF9kaXIiLAotICAgICAgICAgICAiZm9yZ2V0X2V4Y2VwdF9wcmVmaXgiLCJpc2RpciJdCi0KLSMgVGhlIGNhY2hlLiAgS2V5cyBhcmUgcGF0aG5hbWVzLCB2YWx1ZXMgYXJlIG9zLnN0YXQgb3V0Y29tZXMuCi0jIFJlbWVtYmVyIHRoYXQgbXVsdGlwbGUgdGhyZWFkcyBtYXkgYmUgY2FsbGluZyB0aGlzISAgU28sIGUuZy4sIHRoYXQKLSMgcGF0aCBpbiBjYWNoZSByZXR1cm5zIDEgZG9lc24ndCBtZWFuIHRoZSBjYWNoZSB3aWxsIHN0aWxsIGNvbnRhaW4KLSMgcGF0aCBvbiB0aGUgbmV4dCBsaW5lLiAgQ29kZSBkZWZlbnNpdmVseS4KLQotY2FjaGUgPSB7fQotCi1kZWYgc3RhdChwYXRoKToKLSAgICAiIiJTdGF0IGEgZmlsZSwgcG9zc2libHkgb3V0IG9mIHRoZSBjYWNoZS4iIiIKLSAgICByZXQgPSBjYWNoZS5nZXQocGF0aCwgTm9uZSkKLSAgICBpZiByZXQgaXMgTm9uZToKLSAgICAgICAgY2FjaGVbcGF0aF0gPSByZXQgPSBfb3Muc3RhdChwYXRoKQotICAgIHJldHVybiByZXQKLQotZGVmIHJlc2V0KCk6Ci0gICAgIiIiQ2xlYXIgdGhlIGNhY2hlLiIiIgotICAgIGNhY2hlLmNsZWFyKCkKLQotIyBGb3IgdGhyZWFkIHNhZnRleSwgYWx3YXlzIHVzZSBmb3JnZXQoKSBpbnRlcm5hbGx5IHRvby4KLWRlZiBmb3JnZXQocGF0aCk6Ci0gICAgIiIiUmVtb3ZlIGEgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBjYWNoZSwgaWYgaXQgZXhpc3RzLiIiIgotICAgIHRyeToKLSAgICAgICAgZGVsIGNhY2hlW3BhdGhdCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBwYXNzCi0KLWRlZiBmb3JnZXRfcHJlZml4KHByZWZpeCk6Ci0gICAgIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgd2l0aCBhIGdpdmVuIHByZWZpeC4iIiIKLSAgICBmb3IgcGF0aCBpbiBjYWNoZS5rZXlzKCk6Ci0gICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgotICAgICAgICAgICAgZm9yZ2V0KHBhdGgpCi0KLWRlZiBmb3JnZXRfZGlyKHByZWZpeCk6Ci0gICAgIiIiRm9yZ2V0IGEgZGlyZWN0b3J5IGFuZCBhbGwgZW50cmllcyBleGNlcHQgZm9yIGVudHJpZXMgaW4gc3ViZGlycy4iIiIKLQotICAgICMgUmVtb3ZlIHRyYWlsaW5nIHNlcGFyYXRvciwgaWYgYW55LiAgVGhpcyBpcyB0cmlja3kgdG8gZG8gaW4gYQotICAgICMgeC1wbGF0Zm9ybSB3YXkuICBGb3IgZXhhbXBsZSwgV2luZG93cyBhY2NlcHRzIGJvdGggLyBhbmQgXCBhcwotICAgICMgc2VwYXJhdG9ycywgYW5kIGlmIHRoZXJlJ3Mgbm90aGluZyAqYnV0KiBhIHNlcGFyYXRvciB3ZSB3YW50IHRvCi0gICAgIyBwcmVzZXJ2ZSB0aGF0IHRoaXMgaXMgdGhlIHJvb3QuICBPbmx5IG9zLnBhdGggaGFzIHRoZSBwbGF0Zm9ybQotICAgICMga25vd2xlZGdlIHdlIG5lZWQuCi0gICAgZnJvbSBvcy5wYXRoIGltcG9ydCBzcGxpdCwgam9pbgotICAgIHByZWZpeCA9IHNwbGl0KGpvaW4ocHJlZml4LCAieHh4IikpWzBdCi0gICAgZm9yZ2V0KHByZWZpeCkKLSAgICBmb3IgcGF0aCBpbiBjYWNoZS5rZXlzKCk6Ci0gICAgICAgICMgRmlyc3QgY2hlY2sgdGhhdCB0aGUgcGF0aCBhdCBsZWFzdCBzdGFydHMgd2l0aCB0aGUgcHJlZml4LCBzbwotICAgICAgICAjIHRoYXQgd2hlbiBpdCBkb2Vzbid0IHdlIGNhbiBhdm9pZCBwYXlpbmcgZm9yIHNwbGl0KCkuCi0gICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpIGFuZCBzcGxpdChwYXRoKVswXSA9PSBwcmVmaXg6Ci0gICAgICAgICAgICBmb3JnZXQocGF0aCkKLQotZGVmIGZvcmdldF9leGNlcHRfcHJlZml4KHByZWZpeCk6Ci0gICAgIiIiUmVtb3ZlIGFsbCBwYXRobmFtZXMgZXhjZXB0IHdpdGggYSBnaXZlbiBwcmVmaXguCi0KLSAgICBOb3JtYWxseSB1c2VkIHdpdGggcHJlZml4ID0gJy8nIGFmdGVyIGEgY2hkaXIoKS4KLSAgICAiIiIKLQotICAgIGZvciBwYXRoIGluIGNhY2hlLmtleXMoKToKLSAgICAgICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgotICAgICAgICAgICAgZm9yZ2V0KHBhdGgpCi0KLWRlZiBpc2RpcihwYXRoKToKLSAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBkaXJlY3RvcnksIGVsc2UgRmFsc2UuIiIiCi0gICAgdHJ5OgotICAgICAgICBzdCA9IHN0YXQocGF0aCkKLSAgICBleGNlcHQgX29zLmVycm9yOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gU19JU0RJUihzdC5zdF9tb2RlKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdGIucHkgYi9MaWIvbGliLW9sZC90Yi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MzU1OS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC90Yi5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0jIFByaW50IHRyYWNlYmFja3MsIHdpdGggYSBkdW1wIG9mIGxvY2FsIHZhcmlhYmxlcy4KLSMgQWxzbyBhbiBpbnRlcmFjdGl2ZSBzdGFjayB0cmFjZSBicm93c2VyLgotIyBOb3RlIC0tIHRoaXMgbW9kdWxlIGlzIG9ic29sZXRlIC0tIHVzZSBwZGIucG0oKSBpbnN0ZWFkLgotCi1pbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IGxpbmVjYWNoZQotCi1kZWYgYnIoKTogYnJvd3NlcihzeXMubGFzdF90cmFjZWJhY2spCi0KLWRlZiB0YigpOiBwcmludHRiKHN5cy5sYXN0X3RyYWNlYmFjaykKLQotZGVmIGJyb3dzZXIodGIpOgotICAgIGlmIG5vdCB0YjoKLSAgICAgICAgcHJpbnQgJ05vIHRyYWNlYmFjay4nCi0gICAgICAgIHJldHVybgotICAgIHRibGlzdCA9IFtdCi0gICAgd2hpbGUgdGI6Ci0gICAgICAgIHRibGlzdC5hcHBlbmQodGIpCi0gICAgICAgIHRiID0gdGIudGJfbmV4dAotICAgIHB0ciA9IGxlbih0Ymxpc3QpLTEKLSAgICB0YiA9IHRibGlzdFtwdHJdCi0gICAgd2hpbGUgMToKLSAgICAgICAgaWYgdGIgIT0gdGJsaXN0W3B0cl06Ci0gICAgICAgICAgICB0YiA9IHRibGlzdFtwdHJdCi0gICAgICAgICAgICBwcmludCBgcHRyYCArICc6JywKLSAgICAgICAgICAgIHByaW50dGJoZWFkZXIodGIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGxpbmUgPSByYXdfaW5wdXQoJ1RCOiAnKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBwcmludCAnXG5bSW50ZXJydXB0ZWRdJwotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICAgICAgcHJpbnQgJ1xuW0VPRl0nCi0gICAgICAgICAgICBicmVhawotICAgICAgICBjbWQgPSBsaW5lLnN0cmlwKCkKLSAgICAgICAgaWYgY21kOgotICAgICAgICAgICAgaWYgY21kID09ICdxdWl0JzoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2xpc3QnOgotICAgICAgICAgICAgICAgIGJyb3dzZXJsaXN0KHRiKQotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ3VwJzoKLSAgICAgICAgICAgICAgICBpZiBwdHItMSA+PSAwOiBwdHIgPSBwdHItMQotICAgICAgICAgICAgICAgIGVsc2U6IHByaW50ICdCb3R0b20gb2Ygc3RhY2suJwotICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2Rvd24nOgotICAgICAgICAgICAgICAgIGlmIHB0cisxIDwgbGVuKHRibGlzdCk6IHB0ciA9IHB0cisxCi0gICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgJ1RvcCBvZiBzdGFjay4nCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnbG9jYWxzJzoKLSAgICAgICAgICAgICAgICBwcmludHN5bWJvbHModGIudGJfZnJhbWUuZl9sb2NhbHMpCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnZ2xvYmFscyc6Ci0gICAgICAgICAgICAgICAgcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfZ2xvYmFscykKLSAgICAgICAgICAgIGVsaWYgY21kIGluICgnPycsICdoZWxwJyk6Ci0gICAgICAgICAgICAgICAgYnJvd3NlcmhlbHAoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBicm93c2VyZXhlYyh0YiwgY21kKQotCi1kZWYgYnJvd3Nlcmxpc3QodGIpOgotICAgIGZpbGVuYW1lID0gdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0gICAgbGluZW5vID0gdGIudGJfbGluZW5vCi0gICAgbGFzdCA9IGxpbmVubwotICAgIGZpcnN0ID0gbWF4KDEsIGxhc3QtMTApCi0gICAgZm9yIGkgaW4gcmFuZ2UoZmlyc3QsIGxhc3QrMSk6Ci0gICAgICAgIGlmIGkgPT0gbGluZW5vOiBwcmVmaXggPSAnKioqJyArIGBpYC5yanVzdCg0KSArICc6JwotICAgICAgICBlbHNlOiBwcmVmaXggPSBgaWAucmp1c3QoNykgKyAnOicKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBpKQotICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQotICAgICAgICBwcmludCBwcmVmaXggKyBsaW5lCi0KLWRlZiBicm93c2VyZXhlYyh0YiwgY21kKToKLSAgICBsb2NhbHMgPSB0Yi50Yl9mcmFtZS5mX2xvY2FscwotICAgIGdsb2JhbHMgPSB0Yi50Yl9mcmFtZS5mX2dsb2JhbHMKLSAgICB0cnk6Ci0gICAgICAgIGV4ZWMgY21kKydcbicgaW4gZ2xvYmFscywgbG9jYWxzCi0gICAgZXhjZXB0OgotICAgICAgICB0LCB2ID0gc3lzLmV4Y19pbmZvKClbOjJdCi0gICAgICAgIHByaW50ICcqKiogRXhjZXB0aW9uOicsCi0gICAgICAgIGlmIHR5cGUodCkgaXMgdHlwZSgnJyk6Ci0gICAgICAgICAgICBwcmludCB0LAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgdC5fX25hbWVfXywKLSAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHByaW50ICc6JywgdiwKLSAgICAgICAgcHJpbnQKLSAgICAgICAgcHJpbnQgJ1R5cGUgaGVscCB0byBnZXQgaGVscC4nCi0KLWRlZiBicm93c2VyaGVscCgpOgotICAgIHByaW50Ci0gICAgcHJpbnQgJyAgICBUaGlzIGlzIHRoZSB0cmFjZWJhY2sgYnJvd3Nlci4gIENvbW1hbmRzIGFyZTonCi0gICAgcHJpbnQgJyAgICAgICAgdXAgICAgICA6IG1vdmUgb25lIGxldmVsIHVwIGluIHRoZSBjYWxsIHN0YWNrJwotICAgIHByaW50ICcgICAgICAgIGRvd24gICAgOiBtb3ZlIG9uZSBsZXZlbCBkb3duIGluIHRoZSBjYWxsIHN0YWNrJwotICAgIHByaW50ICcgICAgICAgIGxvY2FscyAgOiBwcmludCBhbGwgbG9jYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0gICAgcHJpbnQgJyAgICAgICAgZ2xvYmFscyA6IHByaW50IGFsbCBnbG9iYWwgdmFyaWFibGVzIGF0IHRoaXMgbGV2ZWwnCi0gICAgcHJpbnQgJyAgICAgICAgbGlzdCAgICA6IGxpc3Qgc291cmNlIGNvZGUgYXJvdW5kIHRoZSBmYWlsdXJlJwotICAgIHByaW50ICcgICAgICAgIGhlbHAgICAgOiBwcmludCBoZWxwICh3aGF0IHlvdSBhcmUgcmVhZGluZyBub3cpJwotICAgIHByaW50ICcgICAgICAgIHF1aXQgICAgOiBiYWNrIHRvIGNvbW1hbmQgaW50ZXJwcmV0ZXInCi0gICAgcHJpbnQgJyAgICBUeXBpbmcgYW55IG90aGVyIDEtbGluZSBzdGF0ZW1lbnQgd2lsbCBleGVjdXRlIGl0JwotICAgIHByaW50ICcgICAgdXNpbmcgdGhlIGN1cnJlbnQgbGV2ZWxcJ3Mgc3ltYm9sIHRhYmxlcycKLSAgICBwcmludAotCi1kZWYgcHJpbnR0Yih0Yik6Ci0gICAgd2hpbGUgdGI6Ci0gICAgICAgIHByaW50MXRiKHRiKQotICAgICAgICB0YiA9IHRiLnRiX25leHQKLQotZGVmIHByaW50MXRiKHRiKToKLSAgICBwcmludHRiaGVhZGVyKHRiKQotICAgIGlmIHRiLnRiX2ZyYW1lLmZfbG9jYWxzIGlzIG5vdCB0Yi50Yl9mcmFtZS5mX2dsb2JhbHM6Ci0gICAgICAgIHByaW50c3ltYm9scyh0Yi50Yl9mcmFtZS5mX2xvY2FscykKLQotZGVmIHByaW50dGJoZWFkZXIodGIpOgotICAgIGZpbGVuYW1lID0gdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0gICAgbGluZW5vID0gdGIudGJfbGluZW5vCi0gICAgaW5mbyA9ICciJyArIGZpbGVuYW1lICsgJyIoJyArIGBsaW5lbm9gICsgJyknCi0gICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgaWYgbGluZToKLSAgICAgICAgaW5mbyA9IGluZm8gKyAnOiAnICsgbGluZS5zdHJpcCgpCi0gICAgcHJpbnQgaW5mbwotCi1kZWYgcHJpbnRzeW1ib2xzKGQpOgotICAgIGtleXMgPSBkLmtleXMoKQotICAgIGtleXMuc29ydCgpCi0gICAgZm9yIG5hbWUgaW4ga2V5czoKLSAgICAgICAgcHJpbnQgJyAgJyArIG5hbWUubGp1c3QoMTIpICsgJzonLAotICAgICAgICBwcmludG9iamVjdChkW25hbWVdLCA0KQotICAgICAgICBwcmludAotCi1kZWYgcHJpbnRvYmplY3QodiwgbWF4bGV2ZWwpOgotICAgIGlmIHYgaXMgTm9uZToKLSAgICAgICAgcHJpbnQgJ05vbmUnLAotICAgIGVsaWYgdHlwZSh2KSBpbiAodHlwZSgwKSwgdHlwZSgwLjApKToKLSAgICAgICAgcHJpbnQgdiwKLSAgICBlbGlmIHR5cGUodikgaXMgdHlwZSgnJyk6Ci0gICAgICAgIGlmIGxlbih2KSA+IDIwOgotICAgICAgICAgICAgcHJpbnQgYHZbOjE3XSArICcuLi4nYCwKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50IGB2YCwKLSAgICBlbGlmIHR5cGUodikgaXMgdHlwZSgoKSk6Ci0gICAgICAgIHByaW50ICcoJywKLSAgICAgICAgcHJpbnRsaXN0KHYsIG1heGxldmVsKQotICAgICAgICBwcmludCAnKScsCi0gICAgZWxpZiB0eXBlKHYpIGlzIHR5cGUoW10pOgotICAgICAgICBwcmludCAnWycsCi0gICAgICAgIHByaW50bGlzdCh2LCBtYXhsZXZlbCkKLSAgICAgICAgcHJpbnQgJ10nLAotICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKHt9KToKLSAgICAgICAgcHJpbnQgJ3snLAotICAgICAgICBwcmludGRpY3QodiwgbWF4bGV2ZWwpCi0gICAgICAgIHByaW50ICd9JywKLSAgICBlbHNlOgotICAgICAgICBwcmludCB2LAotCi1kZWYgcHJpbnRsaXN0KHYsIG1heGxldmVsKToKLSAgICBuID0gbGVuKHYpCi0gICAgaWYgbiA9PSAwOiByZXR1cm4KLSAgICBpZiBtYXhsZXZlbCA8PSAwOgotICAgICAgICBwcmludCAnLi4uJywKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGkgaW4gcmFuZ2UobWluKDYsIG4pKToKLSAgICAgICAgcHJpbnRvYmplY3QodltpXSwgbWF4bGV2ZWwtMSkKLSAgICAgICAgaWYgaSsxIDwgbjogcHJpbnQgJywnLAotICAgIGlmIG4gPiA2OiBwcmludCAnLi4uJywKLQotZGVmIHByaW50ZGljdCh2LCBtYXhsZXZlbCk6Ci0gICAga2V5cyA9IHYua2V5cygpCi0gICAgbiA9IGxlbihrZXlzKQotICAgIGlmIG4gPT0gMDogcmV0dXJuCi0gICAgaWYgbWF4bGV2ZWwgPD0gMDoKLSAgICAgICAgcHJpbnQgJy4uLicsCi0gICAgICAgIHJldHVybgotICAgIGtleXMuc29ydCgpCi0gICAgZm9yIGkgaW4gcmFuZ2UobWluKDYsIG4pKToKLSAgICAgICAga2V5ID0ga2V5c1tpXQotICAgICAgICBwcmludCBga2V5YCArICc6JywKLSAgICAgICAgcHJpbnRvYmplY3QodltrZXldLCBtYXhsZXZlbC0xKQotICAgICAgICBpZiBpKzEgPCBuOiBwcmludCAnLCcsCi0gICAgaWYgbiA+IDY6IHByaW50ICcuLi4nLApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvdHpwYXJzZS5weSBiL0xpYi9saWItb2xkL3R6cGFyc2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDY4YjUuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvdHpwYXJzZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSIiIlBhcnNlIGEgdGltZXpvbmUgc3BlY2lmaWNhdGlvbi4iIiIKLQotIyBYWFggVW5maW5pc2hlZC4KLSMgWFhYIE9ubHkgdGhlIHR5cGljYWwgZm9ybSAiWFhYaGhZWVk7ZGRkL2hoLGRkZC9oaCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4KLQotaW1wb3J0IHdhcm5pbmdzCi13YXJuaW5ncy53YXJuKAotICAgICJUaGUgdHpwYXJzZSBtb2R1bGUgaXMgb2Jzb2xldGUgYW5kIHdpbGwgZGlzYXBwZWFyIGluIHRoZSBmdXR1cmUiLAotICAgIERlcHJlY2F0aW9uV2FybmluZykKLQotdHpwYXQgPSAoJ14oW0EtWl1bQS1aXVtBLVpdKShbLStdP1swLTldKykoW0EtWl1bQS1aXVtBLVpdKTsnCi0gICAgICAgICAgJyhbMC05XSspLyhbMC05XSspLChbMC05XSspLyhbMC05XSspJCcpCi0KLXR6cHJvZyA9IE5vbmUKLQotZGVmIHR6cGFyc2UodHpzdHIpOgotICAgICIiIkdpdmVuIGEgdGltZXpvbmUgc3BlYywgcmV0dXJuIGEgdHVwbGUgb2YgaW5mb3JtYXRpb24KLSAgICAodHpuYW1lLCBkZWx0YSwgZHN0bmFtZSwgZGF5c3RhcnQsIGhvdXJzdGFydCwgZGF5ZW5kLCBob3VyZW5kKSwKLSAgICB3aGVyZSAndHpuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgdGltZXpvbmUsICdkZWx0YScgaXMgdGhlIG9mZnNldAotICAgIGluIGhvdXJzIGZyb20gR01ULCAnZHN0bmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGRheWxpZ2h0LXNhdmluZwotICAgIHRpbWV6b25lLCBhbmQgJ2RheXN0YXJ0Jy8naG91cnN0YXJ0JyBhbmQgJ2RheWVuZCcvJ2hvdXJlbmQnCi0gICAgc3BlY2lmeSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwb2ludHMgZm9yIGRheWxpZ2h0IHNhdmluZyB0aW1lLiIiIgotICAgIGdsb2JhbCB0enByb2cKLSAgICBpZiB0enByb2cgaXMgTm9uZToKLSAgICAgICAgaW1wb3J0IHJlCi0gICAgICAgIHR6cHJvZyA9IHJlLmNvbXBpbGUodHpwYXQpCi0gICAgbWF0Y2ggPSB0enByb2cubWF0Y2godHpzdHIpCi0gICAgaWYgbm90IG1hdGNoOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnbm90IHRoZSBUWiBzeW50YXggSSB1bmRlcnN0YW5kJwotICAgIHN1YnMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKDEsIDgpOgotICAgICAgICBzdWJzLmFwcGVuZChtYXRjaC5ncm91cChpKSkKLSAgICBmb3IgaSBpbiAoMSwgMywgNCwgNSwgNik6Ci0gICAgICAgIHN1YnNbaV0gPSBldmFsKHN1YnNbaV0pCi0gICAgW3R6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZF0gPSBzdWJzCi0gICAgcmV0dXJuICh0em5hbWUsIGRlbHRhLCBkc3RuYW1lLCBkYXlzdGFydCwgaG91cnN0YXJ0LCBkYXllbmQsIGhvdXJlbmQpCi0KLWRlZiB0emxvY2FsdGltZShzZWNzLCBwYXJhbXMpOgotICAgICIiIkdpdmVuIGEgVW5peCB0aW1lIGluIHNlY29uZHMgYW5kIGEgdHVwbGUgb2YgaW5mb3JtYXRpb24gYWJvdXQKLSAgICBhIHRpbWV6b25lIGFzIHJldHVybmVkIGJ5IHR6cGFyc2UoKSwgcmV0dXJuIHRoZSBsb2NhbCB0aW1lIGluIHRoZQotICAgIGZvcm0gKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjLCB5ZGF5LCB3ZGF5LCB0em5hbWUpLiIiIgotICAgIGltcG9ydCB0aW1lCi0gICAgKHR6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZCkgPSBwYXJhbXMKLSAgICB5ZWFyLCBtb250aCwgZGF5cywgaG91cnMsIG1pbnMsIHNlY3MsIHlkYXksIHdkYXksIGlzZHN0ID0gXAotICAgICAgICAgICAgdGltZS5nbXRpbWUoc2VjcyAtIGRlbHRhKjM2MDApCi0gICAgaWYgKGRheXN0YXJ0LCBob3Vyc3RhcnQpIDw9ICh5ZGF5KzEsIGhvdXJzKSA8IChkYXllbmQsIGhvdXJlbmQpOgotICAgICAgICB0em5hbWUgPSBkc3RuYW1lCi0gICAgICAgIGhvdXJzID0gaG91cnMgKyAxCi0gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlzLCBob3VycywgbWlucywgc2VjcywgeWRheSwgd2RheSwgdHpuYW1lCi0KLWRlZiB0enNldCgpOgotICAgICIiIkRldGVybWluZSB0aGUgY3VycmVudCB0aW1lem9uZSBmcm9tIHRoZSAiVFoiIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgotICAgIGdsb2JhbCB0enBhcmFtcywgdGltZXpvbmUsIGFsdHpvbmUsIGRheWxpZ2h0LCB0em5hbWUKLSAgICBpbXBvcnQgb3MKLSAgICB0enN0ciA9IG9zLmVudmlyb25bJ1RaJ10KLSAgICB0enBhcmFtcyA9IHR6cGFyc2UodHpzdHIpCi0gICAgdGltZXpvbmUgPSB0enBhcmFtc1sxXSAqIDM2MDAKLSAgICBhbHR6b25lID0gdGltZXpvbmUgLSAzNjAwCi0gICAgZGF5bGlnaHQgPSAxCi0gICAgdHpuYW1lID0gdHpwYXJhbXNbMF0sIHR6cGFyYW1zWzJdCi0KLWRlZiBpc2RzdChzZWNzKToKLSAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkYXlsaWdodC1zYXZpbmcgdGltZSBpcyBpbiBlZmZlY3QgZm9yIHRoZSBnaXZlbgotICAgIFVuaXggdGltZSBpbiB0aGUgY3VycmVudCB0aW1lem9uZS4iIiIKLSAgICBpbXBvcnQgdGltZQotICAgICh0em5hbWUsIGRlbHRhLCBkc3RuYW1lLCBkYXlzdGFydCwgaG91cnN0YXJ0LCBkYXllbmQsIGhvdXJlbmQpID0gXAotICAgICAgICAgICAgdHpwYXJhbXMKLSAgICB5ZWFyLCBtb250aCwgZGF5cywgaG91cnMsIG1pbnMsIHNlY3MsIHlkYXksIHdkYXksIGlzZHN0ID0gXAotICAgICAgICAgICAgdGltZS5nbXRpbWUoc2VjcyAtIGRlbHRhKjM2MDApCi0gICAgcmV0dXJuIChkYXlzdGFydCwgaG91cnN0YXJ0KSA8PSAoeWRheSsxLCBob3VycykgPCAoZGF5ZW5kLCBob3VyZW5kKQotCi10enNldCgpCi0KLWRlZiBsb2NhbHRpbWUoc2Vjcyk6Ci0gICAgIiIiR2V0IHRoZSBsb2NhbCB0aW1lIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiIiIgotICAgIHJldHVybiB0emxvY2FsdGltZShzZWNzLCB0enBhcmFtcykKLQotZGVmIHRlc3QoKToKLSAgICBmcm9tIHRpbWUgaW1wb3J0IGFzY3RpbWUsIGdtdGltZQotICAgIGltcG9ydCB0aW1lLCBzeXMKLSAgICBub3cgPSB0aW1lLnRpbWUoKQotICAgIHggPSBsb2NhbHRpbWUobm93KQotICAgIHRtID0geFs6LTFdICsgKDAsKQotICAgIHByaW50ICdub3cgPScsIG5vdywgJz0nLCBhc2N0aW1lKHRtKSwgeFstMV0KLSAgICBub3cgPSBub3cgLSBub3cgJSAoMjQqMzYwMCkKLSAgICBpZiBzeXMuYXJndlsxOl06IG5vdyA9IG5vdyArIGV2YWwoc3lzLmFyZ3ZbMV0pCi0gICAgeCA9IGdtdGltZShub3cpCi0gICAgdG0gPSB4WzotMV0gKyAoMCwpCi0gICAgcHJpbnQgJ2dtdGltZSA9Jywgbm93LCAnPScsIGFzY3RpbWUodG0pLCAneWRheSA9JywgeFstMl0KLSAgICBqYW4xID0gbm93IC0geFstMl0qMjQqMzYwMAotICAgIHggPSBsb2NhbHRpbWUoamFuMSkKLSAgICB0bSA9IHhbOi0xXSArICgwLCkKLSAgICBwcmludCAnamFuMSA9JywgamFuMSwgJz0nLCBhc2N0aW1lKHRtKSwgeFstMV0KLSAgICBmb3IgZCBpbiByYW5nZSg4NSwgOTUpICsgcmFuZ2UoMjY1LCAyNzUpOgotICAgICAgICB0ID0gamFuMSArIGQqMjQqMzYwMAotICAgICAgICB4ID0gbG9jYWx0aW1lKHQpCi0gICAgICAgIHRtID0geFs6LTFdICsgKDAsKQotICAgICAgICBwcmludCAnZCA9JywgZCwgJ3QgPScsIHQsICc9JywgYXNjdGltZSh0bSksIHhbLTFdCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC91dGlsLnB5IGIvTGliL2xpYi1vbGQvdXRpbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0YWYxZS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC91dGlsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyBNb2R1bGUgJ3V0aWwnIC0tIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGZpdCBlbHNld2hlcmUKLQotIyBOQjogVGhlc2UgYXJlIG5vdyBidWlsdC1pbiBmdW5jdGlvbnMsIGJ1dCB0aGlzIG1vZHVsZSBpcyBwcm92aWRlZAotIyBmb3IgY29tcGF0aWJpbGl0eS4gIERvbid0IHVzZSBpbiBuZXcgcHJvZ3JhbXMgdW5sZXNzIHlvdSBuZWVkIGJhY2t3YXJkCi0jIGNvbXBhdGliaWxpdHkgKGkuZS4gbmVlZCB0byBydW4gd2l0aCBvbGQgaW50ZXJwcmV0ZXJzKS4KLQotCi0jIFJlbW92ZSBhbiBpdGVtIGZyb20gYSBsaXN0LgotIyBObyBjb21wbGFpbnRzIGlmIGl0IGlzbid0IGluIHRoZSBsaXN0IGF0IGFsbC4KLSMgSWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCByZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2UuCi0jCi1kZWYgcmVtb3ZlKGl0ZW0sIGxpc3QpOgotICAgIGlmIGl0ZW0gaW4gbGlzdDogbGlzdC5yZW1vdmUoaXRlbSkKLQotCi0jIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgZmlsZSdzIGNvbnRlbnRzLgotIwotZGVmIHJlYWRmaWxlKGZuKToKLSAgICByZXR1cm4gcmVhZG9wZW5maWxlKG9wZW4oZm4sICdyJykpCi0KLQotIyBSZWFkIGFuIG9wZW4gZmlsZSB1bnRpbCBFT0YuCi0jCi1kZWYgcmVhZG9wZW5maWxlKGZwKToKLSAgICByZXR1cm4gZnAucmVhZCgpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC93aGF0c291bmQucHkgYi9MaWIvbGliLW9sZC93aGF0c291bmQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWRmMjMuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvd2hhdHNvdW5kLnB5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZnJvbSBzbmRoZHIgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3docmFuZG9tLnB5IGIvTGliL2xpYi1vbGQvd2hyYW5kb20ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGQxYTQuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvd2hyYW5kb20ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIiIiV2ljaG1hbi1IaWxsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgotCi1XaWNobWFubiwgQi4gQS4gJiBIaWxsLCBJLiBELiAoMTk4MikKLUFsZ29yaXRobSBBUyAxODM6Ci1BbiBlZmZpY2llbnQgYW5kIHBvcnRhYmxlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotQXBwbGllZCBTdGF0aXN0aWNzIDMxICgxOTgyKSAxODgtMTkwCi0KLXNlZSBhbHNvOgotICAgICAgICBDb3JyZWN0aW9uIHRvIEFsZ29yaXRobSBBUyAxODMKLSAgICAgICAgQXBwbGllZCBTdGF0aXN0aWNzIDMzICgxOTg0KSAxMjMKLQotICAgICAgICBNY0xlb2QsIEEuIEkuICgxOTg1KQotICAgICAgICBBIHJlbWFyayBvbiBBbGdvcml0aG0gQVMgMTgzCi0gICAgICAgIEFwcGxpZWQgU3RhdGlzdGljcyAzNCAoMTk4NSksMTk4LTIwMAotCi0KLVVTRToKLXdocmFuZG9tLnJhbmRvbSgpICAgICAgIHlpZWxkcyBkb3VibGUgcHJlY2lzaW9uIHJhbmRvbSBudW1iZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYmV0d2VlbiAwIGFuZCAxLgotCi13aHJhbmRvbS5zZWVkKHgsIHksIHopICBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgd2hyYW5kb20ucmFuZG9tKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZWQgdGhlIGdlbmVyYXRvcgotCi1UaGVyZSBpcyBhbHNvIGFuIGludGVyZmFjZSB0byBjcmVhdGUgbXVsdGlwbGUgaW5kZXBlbmRlbnQKLXJhbmRvbSBnZW5lcmF0b3JzLCBhbmQgdG8gY2hvb3NlIGZyb20gb3RoZXIgcmFuZ2VzLgotCi0KLQotTXVsdGktdGhyZWFkaW5nIG5vdGU6IHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2VkIGhlcmUgaXMgbm90Ci10aHJlYWQtc2FmZTsgaXQgaXMgcG9zc2libGUgdGhhdCBuZWFybHkgc2ltdWx0YW5lb3VzIGNhbGxzIGluCi1kaWZmZXJlbnQgdGhlYWRzIHJldHVybiB0aGUgc2FtZSByYW5kb20gdmFsdWUuICBUbyBhdm9pZCB0aGlzLCB5b3UKLWhhdmUgdG8gdXNlIGEgbG9jayBhcm91bmQgYWxsIGNhbGxzLiAgKEkgZGlkbid0IHdhbnQgdG8gc2xvdyB0aGlzCi1kb3duIGluIHRoZSBzZXJpYWwgY2FzZSBieSB1c2luZyBhIGxvY2sgaGVyZS4pCi0iIiIKLQotaW1wb3J0IHdhcm5pbmdzCi13YXJuaW5ncy53YXJuKCJ0aGUgd2hyYW5kb20gbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgdGhlIHJhbmRvbSBtb2R1bGUiLAotICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0KLSMgVHJhbnNsYXRlZCBieSBHdWlkbyB2YW4gUm9zc3VtIGZyb20gQyBzb3VyY2UgcHJvdmlkZWQgYnkKLSMgQWRyaWFuIEJhZGRlbGV5LgotCi0KLWNsYXNzIHdocmFuZG9tOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4ID0gMCwgeSA9IDAsIHogPSAwKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZS4KLSAgICAgICAgV2l0aG91dCBhcmd1bWVudHMsIGluaXRpYWxpemUgZnJvbSBjdXJyZW50IHRpbWUuCi0gICAgICAgIFdpdGggYXJndW1lbnRzICh4LCB5LCB6KSwgaW5pdGlhbGl6ZSBmcm9tIHRoZW0uIiIiCi0gICAgICAgIHNlbGYuc2VlZCh4LCB5LCB6KQotCi0gICAgZGVmIHNlZWQoc2VsZiwgeCA9IDAsIHkgPSAwLCB6ID0gMCk6Ci0gICAgICAgICIiIlNldCB0aGUgc2VlZCBmcm9tICh4LCB5LCB6KS4KLSAgICAgICAgVGhlc2UgbXVzdCBiZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgWzAsIDI1NikuIiIiCi0gICAgICAgIGlmIG5vdCB0eXBlKHgpID09IHR5cGUoeSkgPT0gdHlwZSh6KSA9PSB0eXBlKDApOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnc2VlZHMgbXVzdCBiZSBpbnRlZ2VycycKLSAgICAgICAgaWYgbm90ICgwIDw9IHggPCAyNTYgYW5kIDAgPD0geSA8IDI1NiBhbmQgMCA8PSB6IDwgMjU2KToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdzZWVkcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NiknCi0gICAgICAgIGlmIDAgPT0geCA9PSB5ID09IHo6Ci0gICAgICAgICAgICAjIEluaXRpYWxpemUgZnJvbSBjdXJyZW50IHRpbWUKLSAgICAgICAgICAgIGltcG9ydCB0aW1lCi0gICAgICAgICAgICB0ID0gbG9uZyh0aW1lLnRpbWUoKSAqIDI1NikKLSAgICAgICAgICAgIHQgPSBpbnQoKHQmMHhmZmZmZmYpIF4gKHQ+PjI0KSkKLSAgICAgICAgICAgIHQsIHggPSBkaXZtb2QodCwgMjU2KQotICAgICAgICAgICAgdCwgeSA9IGRpdm1vZCh0LCAyNTYpCi0gICAgICAgICAgICB0LCB6ID0gZGl2bW9kKHQsIDI1NikKLSAgICAgICAgIyBaZXJvIGlzIGEgcG9vciBzZWVkLCBzbyBzdWJzdGl0dXRlIDEKLSAgICAgICAgc2VsZi5fc2VlZCA9ICh4IG9yIDEsIHkgb3IgMSwgeiBvciAxKQotCi0gICAgZGVmIHJhbmRvbShzZWxmKToKLSAgICAgICAgIiIiR2V0IHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkuIiIiCi0gICAgICAgICMgVGhpcyBwYXJ0IGlzIHRocmVhZC11bnNhZmU6Ci0gICAgICAgICMgQkVHSU4gQ1JJVElDQUwgU0VDVElPTgotICAgICAgICB4LCB5LCB6ID0gc2VsZi5fc2VlZAotICAgICAgICAjCi0gICAgICAgIHggPSAoMTcxICogeCkgJSAzMDI2OQotICAgICAgICB5ID0gKDE3MiAqIHkpICUgMzAzMDcKLSAgICAgICAgeiA9ICgxNzAgKiB6KSAlIDMwMzIzCi0gICAgICAgICMKLSAgICAgICAgc2VsZi5fc2VlZCA9IHgsIHksIHoKLSAgICAgICAgIyBFTkQgQ1JJVElDQUwgU0VDVElPTgotICAgICAgICAjCi0gICAgICAgIHJldHVybiAoeC8zMDI2OS4wICsgeS8zMDMwNy4wICsgei8zMDMyMy4wKSAlIDEuMAotCi0gICAgZGVmIHVuaWZvcm0oc2VsZiwgYSwgYik6Ci0gICAgICAgICIiIkdldCBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFthLCBiKS4iIiIKLSAgICAgICAgcmV0dXJuIGEgKyAoYi1hKSAqIHNlbGYucmFuZG9tKCkKLQotICAgIGRlZiByYW5kaW50KHNlbGYsIGEsIGIpOgotICAgICAgICAiIiJHZXQgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgcmFuZ2UgW2EsIGJdIGluY2x1ZGluZwotICAgICAgICBib3RoIGVuZCBwb2ludHMuCi0KLSAgICAgICAgKERlcHJlY2F0ZWQ7IHVzZSByYW5kcmFuZ2UgYmVsb3cuKSIiIgotICAgICAgICByZXR1cm4gc2VsZi5yYW5kcmFuZ2UoYSwgYisxKQotCi0gICAgZGVmIGNob2ljZShzZWxmLCBzZXEpOgotICAgICAgICAiIiJDaG9vc2UgYSByYW5kb20gZWxlbWVudCBmcm9tIGEgbm9uLWVtcHR5IHNlcXVlbmNlLiIiIgotICAgICAgICByZXR1cm4gc2VxW2ludChzZWxmLnJhbmRvbSgpICogbGVuKHNlcSkpXQotCi0gICAgZGVmIHJhbmRyYW5nZShzZWxmLCBzdGFydCwgc3RvcD1Ob25lLCBzdGVwPTEsIGludD1pbnQsIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgICAgICIiIkNob29zZSBhIHJhbmRvbSBpdGVtIGZyb20gcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkuCi0KLSAgICAgICAgVGhpcyBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIHJhbmRpbnQoKSB3aGljaCBpbmNsdWRlcyB0aGUKLSAgICAgICAgZW5kcG9pbnQ7IGluIFB5dGhvbiB0aGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgeW91IHdhbnQuCi0gICAgICAgIERvIG5vdCBzdXBwbHkgdGhlICdpbnQnIGFuZCAnZGVmYXVsdCcgYXJndW1lbnRzLiIiIgotICAgICAgICAjIFRoaXMgY29kZSBpcyBhIGJpdCBtZXNzeSB0byBtYWtlIGl0IGZhc3QgZm9yIHRoZQotICAgICAgICAjIGNvbW1vbiBjYXNlIHdoaWxlIHN0aWxsIGRvaW5nIGFkZXF1YXRlIGVycm9yIGNoZWNraW5nCi0gICAgICAgIGlzdGFydCA9IGludChzdGFydCkKLSAgICAgICAgaWYgaXN0YXJ0ICE9IHN0YXJ0OgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIGFyZyAxIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaWYgc3RvcCBpcyBkZWZhdWx0OgotICAgICAgICAgICAgaWYgaXN0YXJ0ID4gMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYucmFuZG9tKCkgKiBpc3RhcnQpCi0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpc3RvcCA9IGludChzdG9wKQotICAgICAgICBpZiBpc3RvcCAhPSBzdG9wOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIHN0b3AgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpZiBzdGVwID09IDE6Ci0gICAgICAgICAgICBpZiBpc3RhcnQgPCBpc3RvcDoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXN0YXJ0ICsgaW50KHNlbGYucmFuZG9tKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXN0b3AgLSBpc3RhcnQpKQotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaXN0ZXAgPSBpbnQoc3RlcCkKLSAgICAgICAgaWYgaXN0ZXAgIT0gc3RlcDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub24taW50ZWdlciBzdGVwIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgaWYgaXN0ZXAgPiAwOgotICAgICAgICAgICAgbiA9IChpc3RvcCAtIGlzdGFydCArIGlzdGVwIC0gMSkgLyBpc3RlcAotICAgICAgICBlbGlmIGlzdGVwIDwgMDoKLSAgICAgICAgICAgIG4gPSAoaXN0b3AgLSBpc3RhcnQgKyBpc3RlcCArIDEpIC8gaXN0ZXAKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpIgotCi0gICAgICAgIGlmIG4gPD0gMDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkiCi0gICAgICAgIHJldHVybiBpc3RhcnQgKyBpc3RlcCppbnQoc2VsZi5yYW5kb20oKSAqIG4pCi0KLQotIyBJbml0aWFsaXplIGZyb20gdGhlIGN1cnJlbnQgdGltZQotX2luc3QgPSB3aHJhbmRvbSgpCi1zZWVkID0gX2luc3Quc2VlZAotcmFuZG9tID0gX2luc3QucmFuZG9tCi11bmlmb3JtID0gX2luc3QudW5pZm9ybQotcmFuZGludCA9IF9pbnN0LnJhbmRpbnQKLWNob2ljZSA9IF9pbnN0LmNob2ljZQotcmFuZHJhbmdlID0gX2luc3QucmFuZHJhbmdlCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC96bW9kLnB5IGIvTGliL2xpYi1vbGQvem1vZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmNDlkZi4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC96bW9kLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyBtb2R1bGUgJ3ptb2QnCi0KLSMgQ29tcHV0ZSBwcm9wZXJ0aWVzIG9mIG1hdGhlbWF0aWNhbCAiZmllbGRzIiBmb3JtZWQgYnkgdGFraW5nCi0jIFovbiAodGhlIHdob2xlIG51bWJlcnMgbW9kdWxvIHNvbWUgd2hvbGUgbnVtYmVyIG4pIGFuZCBhbgotIyBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIChpLmUuLCBhIHBvbHlub21pYWwgd2l0aCBvbmx5IGNvbXBsZXggemVyb3MpLAotIyBlLmcuLCBaLzUgYW5kIFgqKjIgKyAyLgotIwotIyBUaGUgZmllbGQgaXMgZm9ybWVkIGJ5IHRha2luZyBhbGwgcG9zc2libGUgbGluZWFyIGNvbWJpbmF0aW9ucyBvZgotIyBhIHNldCBvZiBkIGJhc2UgdmVjdG9ycyAod2hlcmUgZCBpcyB0aGUgZGVncmVlIG9mIHRoZSBwb2x5bm9taWFsKS4KLSMKLSMgTm90ZSB0aGF0IHRoaXMgcHJvY2VkdXJlIGRvZXNuJ3QgeWllbGQgYSBmaWVsZCBmb3IgYWxsIGNvbWJpbmF0aW9ucwotIyBvZiBuIGFuZCBwOiBpdCBtYXkgd2VsbCBiZSB0aGF0IHNvbWUgbnVtYmVycyBoYXZlIG1vcmUgdGhhbiBvbmUKLSMgaW52ZXJzZSBhbmQgb3RoZXJzIGhhdmUgbm9uZS4gIFRoaXMgaXMgd2hhdCB3ZSBjaGVjay4KLSMKLSMgUmVtZW1iZXIgdGhhdCBhIGZpZWxkIGlzIGEgcmluZyB3aGVyZSBlYWNoIGVsZW1lbnQgaGFzIGFuIGludmVyc2UuCi0jIEEgcmluZyBoYXMgY29tbXV0YXRpdmUgYWRkaXRpb24gYW5kIG11bHRpcGxpY2F0aW9uLCBhIHplcm8gYW5kIGEgb25lOgotIyAwKnggPSB4KjAgPSAwLCAwK3ggPSB4KzAgPSB4LCAxKnggPSB4KjEgPSB4LiAgQWxzbywgdGhlIGRpc3RyaWJ1dGl2ZQotIyBwcm9wZXJ0eSBob2xkczogYSooYitjKSA9IGEqYiArIGIqYy4KLSMgKFhYWCBJIGZvcmdldCBpZiB0aGlzIGlzIGFuIGF4aW9tIG9yIGZvbGxvd3MgZnJvbSB0aGUgcnVsZXMuKQotCi1pbXBvcnQgcG9seQotCi0KLSMgRXhhbXBsZSBOIGFuZCBwb2x5bm9taWFsCi0KLU4gPSA1Ci1QID0gcG9seS5wbHVzKHBvbHkub25lKDAsIDIpLCBwb2x5Lm9uZSgyLCAxKSkgIyAyICsgeCoqMgotCi0KLSMgUmV0dXJuIHggbW9kdWxvIHkuICBSZXR1cm5zID49IDAgZXZlbiBpZiB4IDwgMC4KLQotZGVmIG1vZCh4LCB5KToKLSAgICByZXR1cm4gZGl2bW9kKHgsIHkpWzFdCi0KLQotIyBOb3JtYWxpemUgYSBwb2x5bm9taWFsIG1vZHVsbyBuIGFuZCBtb2R1bG8gcC4KLQotZGVmIG5vcm0oYSwgbiwgcCk6Ci0gICAgYSA9IHBvbHkubW9kdWxvKGEsIHApCi0gICAgYSA9IGFbOl0KLSAgICBmb3IgaSBpbiByYW5nZShsZW4oYSkpOiBhW2ldID0gbW9kKGFbaV0sIG4pCi0gICAgYSA9IHBvbHkubm9ybWFsaXplKGEpCi0gICAgcmV0dXJuIGEKLQotCi0jIE1ha2UgYSBsaXN0IG9mIGFsbCBuXmQgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIGZpZWxkLgotCi1kZWYgbWFrZV9hbGwobWF0KToKLSAgICBhbGwgPSBbXQotICAgIGZvciByb3cgaW4gbWF0OgotICAgICAgICBmb3IgYSBpbiByb3c6Ci0gICAgICAgICAgICBhbGwuYXBwZW5kKGEpCi0gICAgcmV0dXJuIGFsbAotCi1kZWYgbWFrZV9lbGVtZW50cyhuLCBkKToKLSAgICBpZiBkID09IDA6IHJldHVybiBbcG9seS5vbmUoMCwgMCldCi0gICAgc3ViID0gbWFrZV9lbGVtZW50cyhuLCBkLTEpCi0gICAgYWxsID0gW10KLSAgICBmb3IgYSBpbiBzdWI6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgotICAgICAgICAgICAgYWxsLmFwcGVuZChwb2x5LnBsdXMoYSwgcG9seS5vbmUoZC0xLCBpKSkpCi0gICAgcmV0dXJuIGFsbAotCi1kZWYgbWFrZV9pbnYoYWxsLCBuLCBwKToKLSAgICB4ID0gcG9seS5vbmUoMSwgMSkKLSAgICBpbnYgPSBbXQotICAgIGZvciBhIGluIGFsbDoKLSAgICAgICAgaW52LmFwcGVuZChub3JtKHBvbHkudGltZXMoYSwgeCksIG4sIHApKQotICAgIHJldHVybiBpbnYKLQotZGVmIGNoZWNrZmllbGQobiwgcCk6Ci0gICAgYWxsID0gbWFrZV9lbGVtZW50cyhuLCBsZW4ocCktMSkKLSAgICBpbnYgPSBtYWtlX2ludihhbGwsIG4sIHApCi0gICAgYWxsMSA9IGFsbFs6XQotICAgIGludjEgPSBpbnZbOl0KLSAgICBhbGwxLnNvcnQoKQotICAgIGludjEuc29ydCgpCi0gICAgaWYgYWxsMSA9PSBpbnYxOiBwcmludCAnQklOR08hJwotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdTb3JyeTonLCBuLCBwCi0gICAgICAgIHByaW50IGFsbAotICAgICAgICBwcmludCBpbnYKLQotZGVmIHJqKHMsIHdpZHRoKToKLSAgICBpZiB0eXBlKHMpIGlzIG5vdCB0eXBlKCcnKTogcyA9IGBzYAotICAgIG4gPSBsZW4ocykKLSAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcwotICAgIHJldHVybiAnICcqKHdpZHRoIC0gbikgKyBzCi0KLWRlZiBsaihzLCB3aWR0aCk6Ci0gICAgaWYgdHlwZShzKSBpcyBub3QgdHlwZSgnJyk6IHMgPSBgc2AKLSAgICBuID0gbGVuKHMpCi0gICAgaWYgbiA+PSB3aWR0aDogcmV0dXJuIHMKLSAgICByZXR1cm4gcyArICcgJyood2lkdGggLSBuKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9UaXgucHkgYi9MaWIvbGliLXRrL1RpeC5weQppbmRleCAyZmIxMzA3Li4xNGMzYzI0IDEwMDc1NQotLS0gYS9MaWIvbGliLXRrL1RpeC5weQorKysgYi9MaWIvbGliLXRrL1RpeC5weQpAQCAtMTU0MSw4ICsxNTQxLDggQEAKICAgICAgICAgJycnVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZW50cnkgZ2l2ZW4gYnkKICAgICAgZW50cnlQYXRoIGhhcyBjaGlsZHJlbiBlbnRyaWVzIGFuZCB3aGV0aGVyIHRoZSBjaGlsZHJlbiBhcmUgdmlzaWJsZS4gbW9kZQogICAgICBtdXN0IGJlIG9uZSBvZiBvcGVuLCBjbG9zZSBvciBub25lLiBJZiBtb2RlIGlzIHNldCB0byBvcGVuLCBhICgrKQotICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0byB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIGNsb3NlLCBhICgtKQotICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0byB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIG5vbmUsIG5vCisgICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRoZSB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIGNsb3NlLCBhICgtKQorICAgICBpbmRpY2F0b3IgaXMgZHJhd24gbmV4dCB0aGUgdGhlIGVudHJ5LiBJZiBtb2RlIGlzIHNldCB0byBub25lLCBubwogICAgICBpbmRpY2F0b3JzIHdpbGwgYmUgZHJhd24gZm9yIHRoaXMgZW50cnkuIFRoZSBkZWZhdWx0IG1vZGUgaXMgbm9uZS4gVGhlCiAgICAgIG9wZW4gbW9kZSBpbmRpY2F0ZXMgdGhlIGVudHJ5IGhhcyBoaWRkZW4gY2hpbGRyZW4gYW5kIHRoaXMgZW50cnkgY2FuIGJlCiAgICAgIG9wZW5lZCBieSB0aGUgdXNlci4gVGhlIGNsb3NlIG1vZGUgaW5kaWNhdGVzIHRoYXQgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUKQEAgLTE3NzMsNiArMTc3Myw3IEBACiAgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKICAgICBwYXNzCiAKKwogY2xhc3MgR3JpZChUaXhXaWRnZXQpOgogICAgICcnJ1RoZSBUaXggR3JpZCBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgd2luZG93ICBhbmQgbWFrZXMgaXQgaW50byBhCiAgICAgdGl4R3JpZCB3aWRnZXQuIEFkZGl0aW9uYWwgb3B0aW9ucywgbWF5IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZApAQCAtMTc4NywyNiArMTc4OCwxMDEgQEAKICAgICBib3JkZXIuCiAKICAgICBTdWJ3aWRnZXRzIC0gTm9uZScnJwotICAgIHBhc3MKKyAgICAjIHZhbGlkIHNwZWNpZmljIHJlc291cmNlcyBhcyBvZiBUayA4LjQKKyAgICAjIGVkaXRkb25lY21kLCBlZGl0bm90aWZ5Y21kLCBmbG9hdGluZ2NvbHMsIGZsb2F0aW5ncm93cywgZm9ybWF0Y21kLAorICAgICMgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsIGxlZnRtYXJnaW4sIGl0ZW10eXBlLCBzZWxlY3Rtb2RlLAorICAgICMgc2VsZWN0dW5pdCwgdG9wbWFyZ2luLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc3RhdGljPSBbXQorICAgICAgICBzZWxmLmNuZj0gY25mCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhHcmlkJywgc3RhdGljLCBjbmYsIGt3KQogCisgICAgIyB2YWxpZCBvcHRpb25zIGFzIG9mIFRrIDguNAorICAgICMgYW5jaG9yLCBiZHR5cGUsIGNnZXQsIGNvbmZpZ3VyZSwgZGVsZXRlLCBkcmFnc2l0ZSwgZHJvcHNpdGUsIGVudHJ5Y2dldCwgZWRpdAorICAgICMgZW50cnljb25maWd1cmUsIGZvcm1hdCwgZ2VvbWV0cnlpbmZvLCBpbmZvLCBpbmRleCwgbW92ZSwgbmVhcmVzdCwgc2VsZWN0aW9uCisgICAgIyBzZXQsIHNpemUsIHVuc2V0LCB4dmlldywgeXZpZXcKICAgICAjIGRlZiBhbmNob3Igb3B0aW9uID9hcmdzIC4uLj8KKyAgICBkZWYgYW5jaG9yX2dldChzZWxmKToKKyAgICAgICAgIkdldCB0aGUgKHgseSkgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudCBhbmNob3IgY2VsbCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICdhbmNob3InLCAnZ2V0JykpCisKICAgICAjIGRlZiBiZHR5cGUKICAgICAjIGRlZiBkZWxldGUgZGltIGZyb20gP3RvPworICAgIGRlZiBkZWxldGVfcm93KHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHJvd3MgYmV0d2VlbiBmcm9tXyBhbmQgdG8gaW5jbHVzaXZlLgorICAgICAgICBJZiB0byBpcyBub3QgcHJvdmlkZWQsICBkZWxldGUgb25seSByb3cgYXQgZnJvbV8iIiIKKyAgICAgICAgaWYgdG8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ3JvdycsIGZyb21fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAncm93JywgZnJvbV8sIHRvKQorICAgIGRlZiBkZWxldGVfY29sdW1uKHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIGNvbHVtbnMgYmV0d2VlbiBmcm9tXyBhbmQgdG8gaW5jbHVzaXZlLgorICAgICAgICBJZiB0byBpcyBub3QgcHJvdmlkZWQsICBkZWxldGUgb25seSBjb2x1bW4gYXQgZnJvbV8iIiIKKyAgICAgICAgaWYgdG8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ2NvbHVtbicsIGZyb21fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAnY29sdW1uJywgZnJvbV8sIHRvKQogICAgICMgZGVmIGVkaXQgYXBwbHkKICAgICAjIGRlZiBlZGl0IHNldCB4IHkKLSAgICAjIGRlZiBlbnRyeWNnZXQgeCB5IG9wdGlvbgotICAgICMgZGVmIGVudHJ5Y29uZmlndXJlIHggeSA/b3B0aW9uPyA/dmFsdWUgb3B0aW9uIHZhbHVlIC4uLj8KKworICAgIGRlZiBlbnRyeWNnZXQoc2VsZiwgeCwgeSwgb3B0aW9uKToKKyAgICAgICAgIkdldCB0aGUgb3B0aW9uIHZhbHVlIGZvciBjZWxsIGF0ICh4LHkpIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYsICdlbnRyeWNnZXQnLCB4LCB5LCBvcHRpb24pCisKKyAgICBkZWYgZW50cnljb25maWd1cmUoc2VsZiwgeCwgeSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VudHJ5Y29uZmlndXJlJywgeCwgeSwgKnNlbGYuX29wdGlvbnMoTm9uZSwga3cpKQogICAgICMgZGVmIGZvcm1hdAogICAgICMgZGVmIGluZGV4CisKKyAgICBkZWYgaW5mb19leGlzdHMoc2VsZiwgeCwgeSk6CisgICAgICAgICJSZXR1cm4gVHJ1ZSBpZiBkaXNwbGF5IGl0ZW0gZXhpc3RzIGF0ICh4LHkpIgorICAgICAgICByZXR1cm4gYm9vbChpbnQoc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2V4aXN0cycsIHgsIHkpKSkKKworICAgIGRlZiBpbmZvX2Jib3goc2VsZiwgeCwgeSk6CisgICAgICAgICMgVGhpcyBzZWVtcyB0byBhbHdheXMgcmV0dXJuICcnLCBhdCBsZWFzdCBmb3IgJ3RleHQnIGRpc3BsYXlpdGVtcworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2Jib3gnLCB4LCB5KQorCisgICAgZGVmIG5lYXJlc3Qoc2VsZiwgeCwgeSk6CisgICAgICAgICJSZXR1cm4gY29vcmRpbmF0ZSBvZiBjZWxsIG5lYXJlc3QgcGl4ZWwgY29vcmRpbmF0ZSAoeCx5KSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICduZWFyZXN0JywgeCwgeSkpCisKKyAgICAjIGRlZiBzZWxlY3Rpb24gYWRqdXN0CisgICAgIyBkZWYgc2VsZWN0aW9uIGNsZWFyCisgICAgIyBkZWYgc2VsZWN0aW9uIGluY2x1ZGVzCisgICAgIyBkZWYgc2VsZWN0aW9uIHNldAorICAgICMgZGVmIHNlbGVjdGlvbiB0b2dnbGUKICAgICAjIGRlZiBtb3ZlIGRpbSBmcm9tIHRvIG9mZnNldAotICAgICMgZGVmIHNldCB4IHkgPy1pdGVtdHlwZSB0eXBlPyA/b3B0aW9uIHZhbHVlLi4uPworCisgICAgZGVmIHNldChzZWxmLCB4LCB5LCBpdGVtdHlwZT1Ob25lLCAqKmt3KToKKyAgICAgICAgYXJncz0gc2VsZi5fb3B0aW9ucyhzZWxmLmNuZiwga3cpCisgICAgICAgIGlmIGl0ZW10eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncz0gKCctaXRlbXR5cGUnLCBpdGVtdHlwZSkgKyBhcmdzCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnc2V0JywgeCwgeSwgKmFyZ3MpCisKICAgICAjIGRlZiBzaXplIGRpbSBpbmRleCA/b3B0aW9uIHZhbHVlIC4uLj8KICAgICAjIGRlZiB1bnNldCB4IHkKLSAgICAjIGRlZiB4dmlldwotICAgICMgZGVmIHl2aWV3CiAKLWNsYXNzIFNjcm9sbGVkR3JpZChUaXhXaWRnZXQpOgorICAgIGRlZiB4dmlldyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGRvdWJsZXMoc2VsZi50ay5jYWxsKHNlbGYsICd4dmlldycpKQorICAgIGRlZiB4dmlld19tb3ZldG8oc2VsZiwgZnJhY3Rpb24pOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwneHZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisgICAgZGVmIHh2aWV3X3Njcm9sbChzZWxmLCBjb3VudCwgd2hhdD0idW5pdHMiKToKKyAgICAgICAgIlNjcm9sbCByaWdodCAoY291bnQ+MCkgb3IgbGVmdCA8Y291bnQ+IG9mIHVuaXRzfHBhZ2VzIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3h2aWV3JywgJ3Njcm9sbCcsIGNvdW50LCB3aGF0KQorCisgICAgZGVmIHl2aWV3KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0ZG91YmxlcyhzZWxmLnRrLmNhbGwoc2VsZiwgJ3l2aWV3JykpCisgICAgZGVmIHl2aWV3X21vdmV0byhzZWxmLCBmcmFjdGlvbik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCd5c3ZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisgICAgZGVmIHl2aWV3X3Njcm9sbChzZWxmLCBjb3VudCwgd2hhdD0idW5pdHMiKToKKyAgICAgICAgIlNjcm9sbCBkb3duIChjb3VudD4wKSBvciB1cCA8Y291bnQ+IG9mIHVuaXRzfHBhZ2VzIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3l2aWV3JywgJ3Njcm9sbCcsIGNvdW50LCB3aGF0KQorCitjbGFzcyBTY3JvbGxlZEdyaWQoR3JpZCk6CiAgICAgJycnU2Nyb2xsZWQgR3JpZCB3aWRnZXRzJycnCiAKICAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAotICAgIHBhc3MKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHN0YXRpYz0gW10KKyAgICAgICAgc2VsZi5jbmY9IGNuZgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRHcmlkJywgc3RhdGljLCBjbmYsIGt3KQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9Ua2ludGVyLnB5IGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CmluZGV4IGQ2MDBjZDcuLjBiYTk1NGUgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvVGtpbnRlci5weQorKysgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKQEAgLTQ0OSwxOCArNDQ5LDE1IEBACiAgICAgICAgICAgICAjIEknZCByYXRoZXIgdXNlIHRpbWUuc2xlZXAobXMqMC4wMDEpCiAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2FmdGVyJywgbXMpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFhYWCBEaXNndXN0aW5nIGhhY2sgdG8gY2xlYW4gdXAgYWZ0ZXIgY2FsbGluZyBmdW5jCi0gICAgICAgICAgICB0bXAgPSBbXQotICAgICAgICAgICAgZGVmIGNhbGxpdChmdW5jPWZ1bmMsIGFyZ3M9YXJncywgc2VsZj1zZWxmLCB0bXA9dG1wKToKKyAgICAgICAgICAgIGRlZiBjYWxsaXQoKToKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCiAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKHRtcFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChuYW1lKQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGl0KQotICAgICAgICAgICAgdG1wLmFwcGVuZChuYW1lKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnYWZ0ZXInLCBtcywgbmFtZSkKICAgICBkZWYgYWZ0ZXJfaWRsZShzZWxmLCBmdW5jLCAqYXJncyk6CiAgICAgICAgICIiIkNhbGwgRlVOQyBvbmNlIGlmIHRoZSBUY2wgbWFpbiBsb29wIGhhcyBubyBldmVudCB0bwpAQCAtNDg2LDcgKzQ4MywyNCBAQAogICAgIGRlZiBiZWxsKHNlbGYsIGRpc3BsYXlvZj0wKToKICAgICAgICAgIiIiUmluZyBhIGRpc3BsYXkncyBiZWxsLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoKCdiZWxsJywpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikpCisKICAgICAjIENsaXBib2FyZCBoYW5kbGluZzoKKyAgICBkZWYgY2xpcGJvYXJkX2dldChzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiUmV0cmlldmUgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQgb24gd2luZG93J3MgZGlzcGxheS4KKworICAgICAgICBUaGUgd2luZG93IGtleXdvcmQgZGVmYXVsdHMgdG8gdGhlIHJvb3Qgd2luZG93IG9mIHRoZSBUa2ludGVyCisgICAgICAgIGFwcGxpY2F0aW9uLgorCisgICAgICAgIFRoZSB0eXBlIGtleXdvcmQgc3BlY2lmaWVzIHRoZSBmb3JtIGluIHdoaWNoIHRoZSBkYXRhIGlzCisgICAgICAgIHRvIGJlIHJldHVybmVkIGFuZCBzaG91bGQgYmUgYW4gYXRvbSBuYW1lIHN1Y2ggYXMgU1RSSU5HCisgICAgICAgIG9yIEZJTEVfTkFNRS4gIFR5cGUgZGVmYXVsdHMgdG8gU1RSSU5HLgorCisgICAgICAgIFRoaXMgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvOgorCisgICAgICAgIHNlbGVjdGlvbl9nZXQoQ0xJUEJPQVJEKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ2NsaXBib2FyZCcsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQorCiAgICAgZGVmIGNsaXBib2FyZF9jbGVhcihzZWxmLCAqKmt3KToKICAgICAgICAgIiIiQ2xlYXIgdGhlIGRhdGEgaW4gdGhlIFRrIGNsaXBib2FyZC4KIApkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90a0ZvbnQucHkgYi9MaWIvbGliLXRrL3RrRm9udC5weQppbmRleCA1YjVhNmJhLi4xNWRlYTJlIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3RrRm9udC5weQorKysgYi9MaWIvbGliLXRrL3RrRm9udC5weQpAQCAtMTA4LDcgKzEwOCw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuZGVsZXRlX2ZvbnQ6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2FsbCgiZm9udCIsICJkZWxldGUiLCBzZWxmLm5hbWUpCi0gICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFRraW50ZXIuVGNsRXJyb3IpOgorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgY29weShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9saW5lY2FjaGUucHkgYi9MaWIvbGluZWNhY2hlLnB5CmluZGV4IDJjY2M2YzYuLmY0OTY5NWEgMTAwNjQ0Ci0tLSBhL0xpYi9saW5lY2FjaGUucHkKKysrIGIvTGliL2xpbmVjYWNoZS5weQpAQCAtMTAsOCArMTAsOCBAQAogCiBfX2FsbF9fID0gWyJnZXRsaW5lIiwgImNsZWFyY2FjaGUiLCAiY2hlY2tjYWNoZSJdCiAKLWRlZiBnZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pOgotICAgIGxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUpCitkZWYgZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICBsaW5lcyA9IGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKICAgICBpZiAxIDw9IGxpbmVubyA8PSBsZW4obGluZXMpOgogICAgICAgICByZXR1cm4gbGluZXNbbGluZW5vLTFdCiAgICAgZWxzZToKQEAgLTMwLDE0ICszMCwxNCBAQAogICAgIGNhY2hlID0ge30KIAogCi1kZWYgZ2V0bGluZXMoZmlsZW5hbWUpOgorZGVmIGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKICAgICAiIiJHZXQgdGhlIGxpbmVzIGZvciBhIGZpbGUgZnJvbSB0aGUgY2FjaGUuCiAgICAgVXBkYXRlIHRoZSBjYWNoZSBpZiBpdCBkb2Vzbid0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHRoaXMgZmlsZSBhbHJlYWR5LiIiIgogCiAgICAgaWYgZmlsZW5hbWUgaW4gY2FjaGU6CiAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KICAgICBlbHNlOgotICAgICAgICByZXR1cm4gdXBkYXRlY2FjaGUoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCiAKIAogZGVmIGNoZWNrY2FjaGUoZmlsZW5hbWU9Tm9uZSk6CkBAIC01NCw2ICs1NCw4IEBACiAKICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICBzaXplLCBtdGltZSwgbGluZXMsIGZ1bGxuYW1lID0gY2FjaGVbZmlsZW5hbWVdCisgICAgICAgIGlmIG10aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZSAgICMgbm8tb3AgZm9yIGZpbGVzIGxvYWRlZCB2aWEgYSBfX2xvYWRlcl9fCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgICAgICBleGNlcHQgb3MuZXJyb3I6CkBAIC02Myw3ICs2NSw3IEBACiAgICAgICAgICAgICBkZWwgY2FjaGVbZmlsZW5hbWVdCiAKIAotZGVmIHVwZGF0ZWNhY2hlKGZpbGVuYW1lKToKK2RlZiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CiAgICAgIiIiVXBkYXRlIGEgY2FjaGUgZW50cnkgYW5kIHJldHVybiBpdHMgbGlzdCBvZiBsaW5lcy4KICAgICBJZiBzb21ldGhpbmcncyB3cm9uZywgcHJpbnQgYSBtZXNzYWdlLCBkaXNjYXJkIHRoZSBjYWNoZSBlbnRyeSwKICAgICBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuIiIiCkBAIC03MiwxMiArNzQsMzQgQEAKICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQogICAgIGlmIG5vdCBmaWxlbmFtZSBvciBmaWxlbmFtZVswXSArIGZpbGVuYW1lWy0xXSA9PSAnPD4nOgogICAgICAgICByZXR1cm4gW10KKwogICAgIGZ1bGxuYW1lID0gZmlsZW5hbWUKICAgICB0cnk6CiAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQogICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgotICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4KICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorCisgICAgICAgICMgVHJ5IGZvciBhIF9fbG9hZGVyX18sIGlmIGF2YWlsYWJsZQorICAgICAgICBpZiBtb2R1bGVfZ2xvYmFscyBhbmQgJ19fbG9hZGVyX18nIGluIG1vZHVsZV9nbG9iYWxzOgorICAgICAgICAgICAgbmFtZSA9IG1vZHVsZV9nbG9iYWxzLmdldCgnX19uYW1lX18nKQorICAgICAgICAgICAgbG9hZGVyID0gbW9kdWxlX2dsb2JhbHNbJ19fbG9hZGVyX18nXQorICAgICAgICAgICAgZ2V0X3NvdXJjZSA9IGdldGF0dHIobG9hZGVyLCAnZ2V0X3NvdXJjZScsIE5vbmUpCisKKyAgICAgICAgICAgIGlmIG5hbWUgYW5kIGdldF9zb3VyY2U6CisgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUuc3RhcnRzd2l0aChuYW1lLnNwbGl0KCcuJylbLTFdKycuJyk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRfc291cmNlKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkYXRhKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGluZSsnXG4nIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpXSwgZnVsbG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KKworICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4KKwogICAgICAgICBmb3IgZGlybmFtZSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgICMgV2hlbiB1c2luZyBpbXB1dGlsLCBzeXMucGF0aCBtYXkgY29udGFpbiB0aGluZ3Mgb3RoZXIgdGhhbgogICAgICAgICAgICAgIyBzdHJpbmdzOyBpZ25vcmUgdGhlbSB3aGVuIGl0IGhhcHBlbnMuCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weSBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CmluZGV4IDdkYjBkYWIuLjk3OTg5MzEgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CisrKyBiL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5CkBAIC03MTksNyArNzE5LDcgQEAKICAgICAgICAgSWYgc3RybSBpcyBub3Qgc3BlY2lmaWVkLCBzeXMuc3RkZXJyIGlzIHVzZWQuCiAgICAgICAgICIiIgogICAgICAgICBIYW5kbGVyLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIGlmIG5vdCBzdHJtOgorICAgICAgICBpZiBzdHJtIGlzIE5vbmU6CiAgICAgICAgICAgICBzdHJtID0gc3lzLnN0ZGVycgogICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cm0KICAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBOb25lCmRpZmYgLS1naXQgYS9MaWIvbWltZXRvb2xzLnB5IGIvTGliL21pbWV0b29scy5weQppbmRleCAwYjY5OGFjLi44YzFjYzE5IDEwMDY0NAotLS0gYS9MaWIvbWltZXRvb2xzLnB5CisrKyBiL0xpYi9taW1ldG9vbHMucHkKQEAgLTEyNyw3ICsxMjcsMTAgQEAKICAgICBpbXBvcnQgdGltZQogICAgIGlmIF9wcmVmaXggaXMgTm9uZToKICAgICAgICAgaW1wb3J0IHNvY2tldAotICAgICAgICBob3N0aWQgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaG9zdGlkID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBob3N0aWQgPSAnMTI3LjAuMC4xJwogICAgICAgICB0cnk6CiAgICAgICAgICAgICB1aWQgPSByZXByKG9zLmdldHVpZCgpKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvbWltZXR5cGVzLnB5IGIvTGliL21pbWV0eXBlcy5weQppbmRleCA3YThiNzY1Li5iZWUyZmY3IDEwMDY0NAotLS0gYS9MaWIvbWltZXR5cGVzLnB5CisrKyBiL0xpYi9taW1ldHlwZXMucHkKQEAgLTMxNSwxNjIgKzMxNSwxNzEgQEAKICAgICByZXR1cm4gZGIudHlwZXNfbWFwW1RydWVdCiAKIAotc3VmZml4X21hcCA9IHsKLSAgICAnLnRneic6ICcudGFyLmd6JywKLSAgICAnLnRheic6ICcudGFyLmd6JywKLSAgICAnLnR6JzogJy50YXIuZ3onLAotICAgIH0KK2RlZiBfZGVmYXVsdF9taW1lX3R5cGVzKCk6CisgICAgZ2xvYmFsIHN1ZmZpeF9tYXAKKyAgICBnbG9iYWwgZW5jb2RpbmdzX21hcAorICAgIGdsb2JhbCB0eXBlc19tYXAKKyAgICBnbG9iYWwgY29tbW9uX3R5cGVzCiAKLWVuY29kaW5nc19tYXAgPSB7Ci0gICAgJy5neic6ICdnemlwJywKLSAgICAnLlonOiAnY29tcHJlc3MnLAotICAgIH0KKyAgICBzdWZmaXhfbWFwID0geworICAgICAgICAnLnRneic6ICcudGFyLmd6JywKKyAgICAgICAgJy50YXonOiAnLnRhci5neicsCisgICAgICAgICcudHonOiAnLnRhci5neicsCisgICAgICAgIH0KIAotIyBCZWZvcmUgYWRkaW5nIG5ldyB0eXBlcywgbWFrZSBzdXJlIHRoZXkgYXJlIGVpdGhlciByZWdpc3RlcmVkIHdpdGggSUFOQSwgYXQKLSMgaHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMKLSMgb3IgZXh0ZW5zaW9ucywgaS5lLiB1c2luZyB0aGUgeC0gcHJlZml4CisgICAgZW5jb2RpbmdzX21hcCA9IHsKKyAgICAgICAgJy5neic6ICdnemlwJywKKyAgICAgICAgJy5aJzogJ2NvbXByZXNzJywKKyAgICAgICAgfQogCi0jIElmIHlvdSBhZGQgdG8gdGhlc2UsIHBsZWFzZSBrZWVwIHRoZW0gc29ydGVkIQotdHlwZXNfbWFwID0gewotICAgICcuYScgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAotICAgICcuYWknICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKLSAgICAnLmFpZicgICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmFpZmMnICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmFpZmYnICAgOiAnYXVkaW8veC1haWZmJywKLSAgICAnLmF1JyAgICAgOiAnYXVkaW8vYmFzaWMnLAotICAgICcuYXZpJyAgICA6ICd2aWRlby94LW1zdmlkZW8nLAotICAgICcuYmF0JyAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLmJjcGlvJyAgOiAnYXBwbGljYXRpb24veC1iY3BpbycsCi0gICAgJy5iaW4nICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5ibXAnICAgIDogJ2ltYWdlL3gtbXMtYm1wJywKLSAgICAnLmMnICAgICAgOiAndGV4dC9wbGFpbicsCi0gICAgIyBEdXBsaWNhdGVzIDooCi0gICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtY2RmJywKLSAgICAnLmNkZicgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAotICAgICcuY3BpbycgICA6ICdhcHBsaWNhdGlvbi94LWNwaW8nLAotICAgICcuY3NoJyAgICA6ICdhcHBsaWNhdGlvbi94LWNzaCcsCi0gICAgJy5jc3MnICAgIDogJ3RleHQvY3NzJywKLSAgICAnLmRsbCcgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLmRvYycgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKLSAgICAnLmRvdCcgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKLSAgICAnLmR2aScgICAgOiAnYXBwbGljYXRpb24veC1kdmknLAotICAgICcuZW1sJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5lcHMnICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAotICAgICcuZXR4JyAgICA6ICd0ZXh0L3gtc2V0ZXh0JywKLSAgICAnLmV4ZScgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLmdpZicgICAgOiAnaW1hZ2UvZ2lmJywKLSAgICAnLmd0YXInICAgOiAnYXBwbGljYXRpb24veC1ndGFyJywKLSAgICAnLmgnICAgICAgOiAndGV4dC9wbGFpbicsCi0gICAgJy5oZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtaGRmJywKLSAgICAnLmh0bScgICAgOiAndGV4dC9odG1sJywKLSAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKLSAgICAnLmllZicgICAgOiAnaW1hZ2UvaWVmJywKLSAgICAnLmpwZScgICAgOiAnaW1hZ2UvanBlZycsCi0gICAgJy5qcGVnJyAgIDogJ2ltYWdlL2pwZWcnLAotICAgICcuanBnJyAgICA6ICdpbWFnZS9qcGVnJywKLSAgICAnLmpzJyAgICAgOiAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywKLSAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCi0gICAgJy5sYXRleCcgIDogJ2FwcGxpY2F0aW9uL3gtbGF0ZXgnLAotICAgICcubTF2JyAgICA6ICd2aWRlby9tcGVnJywKLSAgICAnLm1hbicgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tYW4nLAotICAgICcubWUnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1lJywKLSAgICAnLm1odCcgICAgOiAnbWVzc2FnZS9yZmM4MjInLAotICAgICcubWh0bWwnICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5taWYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbWlmJywKLSAgICAnLm1vdicgICAgOiAndmlkZW8vcXVpY2t0aW1lJywKLSAgICAnLm1vdmllJyAgOiAndmlkZW8veC1zZ2ktbW92aWUnLAotICAgICcubXAyJyAgICA6ICdhdWRpby9tcGVnJywKLSAgICAnLm1wMycgICAgOiAnYXVkaW8vbXBlZycsCi0gICAgJy5tcGEnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubXBlJyAgICA6ICd2aWRlby9tcGVnJywKLSAgICAnLm1wZWcnICAgOiAndmlkZW8vbXBlZycsCi0gICAgJy5tcGcnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubXMnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1zJywKLSAgICAnLm5jJyAgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAotICAgICcubndzJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5vJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5vYmonICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5vZGEnICAgIDogJ2FwcGxpY2F0aW9uL29kYScsCi0gICAgJy5wMTInICAgIDogJ2FwcGxpY2F0aW9uL3gtcGtjczEyJywKLSAgICAnLnA3YycgICAgOiAnYXBwbGljYXRpb24vcGtjczctbWltZScsCi0gICAgJy5wYm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywKLSAgICAnLnBkZicgICAgOiAnYXBwbGljYXRpb24vcGRmJywKLSAgICAnLnBmeCcgICAgOiAnYXBwbGljYXRpb24veC1wa2NzMTInLAotICAgICcucGdtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAnLAotICAgICcucGwnICAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLnBuZycgICAgOiAnaW1hZ2UvcG5nJywKLSAgICAnLnBubScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAnLAotICAgICcucG90JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCi0gICAgJy5wcGEnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBwbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLAotICAgICcucHBzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCi0gICAgJy5wcHQnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBzJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCi0gICAgJy5wd3onICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnB5JyAgICAgOiAndGV4dC94LXB5dGhvbicsCi0gICAgJy5weWMnICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAotICAgICcucHlvJyAgICA6ICdhcHBsaWNhdGlvbi94LXB5dGhvbi1jb2RlJywKLSAgICAnLnF0JyAgICAgOiAndmlkZW8vcXVpY2t0aW1lJywKLSAgICAnLnJhJyAgICAgOiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAotICAgICcucmFtJyAgICA6ICdhcHBsaWNhdGlvbi94LXBuLXJlYWxhdWRpbycsCi0gICAgJy5yYXMnICAgIDogJ2ltYWdlL3gtY211LXJhc3RlcicsCi0gICAgJy5yZGYnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCi0gICAgJy5yZ2InICAgIDogJ2ltYWdlL3gtcmdiJywKLSAgICAnLnJvZmYnICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCi0gICAgJy5ydHgnICAgIDogJ3RleHQvcmljaHRleHQnLAotICAgICcuc2dtJyAgICA6ICd0ZXh0L3gtc2dtbCcsCi0gICAgJy5zZ21sJyAgIDogJ3RleHQveC1zZ21sJywKLSAgICAnLnNoJyAgICAgOiAnYXBwbGljYXRpb24veC1zaCcsCi0gICAgJy5zaGFyJyAgIDogJ2FwcGxpY2F0aW9uL3gtc2hhcicsCi0gICAgJy5zbmQnICAgIDogJ2F1ZGlvL2Jhc2ljJywKLSAgICAnLnNvJyAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLnNyYycgICAgOiAnYXBwbGljYXRpb24veC13YWlzLXNvdXJjZScsCi0gICAgJy5zdjRjcGlvJzogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3BpbycsCi0gICAgJy5zdjRjcmMnIDogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3JjJywKLSAgICAnLnN3ZicgICAgOiAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnLAotICAgICcudCcgICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKLSAgICAnLnRhcicgICAgOiAnYXBwbGljYXRpb24veC10YXInLAotICAgICcudGNsJyAgICA6ICdhcHBsaWNhdGlvbi94LXRjbCcsCi0gICAgJy50ZXgnICAgIDogJ2FwcGxpY2F0aW9uL3gtdGV4JywKLSAgICAnLnRleGknICAgOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKLSAgICAnLnRleGluZm8nOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKLSAgICAnLnRpZicgICAgOiAnaW1hZ2UvdGlmZicsCi0gICAgJy50aWZmJyAgIDogJ2ltYWdlL3RpZmYnLAotICAgICcudHInICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKLSAgICAnLnRzdicgICAgOiAndGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcycsCi0gICAgJy50eHQnICAgIDogJ3RleHQvcGxhaW4nLAotICAgICcudXN0YXInICA6ICdhcHBsaWNhdGlvbi94LXVzdGFyJywKLSAgICAnLnZjZicgICAgOiAndGV4dC94LXZjYXJkJywKLSAgICAnLndhdicgICAgOiAnYXVkaW8veC13YXYnLAotICAgICcud2l6JyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAotICAgICcud3NkbCcgICA6ICdhcHBsaWNhdGlvbi94bWwnLAotICAgICcueGJtJyAgICA6ICdpbWFnZS94LXhiaXRtYXAnLAotICAgICcueGxiJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAotICAgICMgRHVwbGljYXRlcyA6KAotICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi9leGNlbCcsCi0gICAgJy54bHMnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsCi0gICAgJy54bWwnICAgIDogJ3RleHQveG1sJywKLSAgICAnLnhwZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKLSAgICAnLnhwbScgICAgOiAnaW1hZ2UveC14cGl4bWFwJywKLSAgICAnLnhzbCcgICAgOiAnYXBwbGljYXRpb24veG1sJywKLSAgICAnLnh3ZCcgICAgOiAnaW1hZ2UveC14d2luZG93ZHVtcCcsCi0gICAgJy56aXAnICAgIDogJ2FwcGxpY2F0aW9uL3ppcCcsCi0gICAgfQorICAgICMgQmVmb3JlIGFkZGluZyBuZXcgdHlwZXMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBlaXRoZXIgcmVnaXN0ZXJlZCB3aXRoIElBTkEsCisgICAgIyBhdCBodHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcworICAgICMgb3IgZXh0ZW5zaW9ucywgaS5lLiB1c2luZyB0aGUgeC0gcHJlZml4CiAKLSMgVGhlc2UgYXJlIG5vbi1zdGFuZGFyZCB0eXBlcywgY29tbW9ubHkgZm91bmQgaW4gdGhlIHdpbGQuICBUaGV5IHdpbGwgb25seQotIyBtYXRjaCBpZiBzdHJpY3Q9MCBmbGFnIGlzIGdpdmVuIHRvIHRoZSBBUEkgbWV0aG9kcy4KKyAgICAjIElmIHlvdSBhZGQgdG8gdGhlc2UsIHBsZWFzZSBrZWVwIHRoZW0gc29ydGVkIQorICAgIHR5cGVzX21hcCA9IHsKKyAgICAgICAgJy5hJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuYWknICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5haWYnICAgIDogJ2F1ZGlvL3gtYWlmZicsCisgICAgICAgICcuYWlmYycgICA6ICdhdWRpby94LWFpZmYnLAorICAgICAgICAnLmFpZmYnICAgOiAnYXVkaW8veC1haWZmJywKKyAgICAgICAgJy5hdScgICAgIDogJ2F1ZGlvL2Jhc2ljJywKKyAgICAgICAgJy5hdmknICAgIDogJ3ZpZGVvL3gtbXN2aWRlbycsCisgICAgICAgICcuYmF0JyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5iY3BpbycgIDogJ2FwcGxpY2F0aW9uL3gtYmNwaW8nLAorICAgICAgICAnLmJpbicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5ibXAnICAgIDogJ2ltYWdlL3gtbXMtYm1wJywKKyAgICAgICAgJy5jJyAgICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAjIER1cGxpY2F0ZXMgOigKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtY2RmJywKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbmV0Y2RmJywKKyAgICAgICAgJy5jcGlvJyAgIDogJ2FwcGxpY2F0aW9uL3gtY3BpbycsCisgICAgICAgICcuY3NoJyAgICA6ICdhcHBsaWNhdGlvbi94LWNzaCcsCisgICAgICAgICcuY3NzJyAgICA6ICd0ZXh0L2NzcycsCisgICAgICAgICcuZGxsJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmRvYycgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy5kb3QnICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCisgICAgICAgICcuZHZpJyAgICA6ICdhcHBsaWNhdGlvbi94LWR2aScsCisgICAgICAgICcuZW1sJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcuZXBzJyAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5ldHgnICAgIDogJ3RleHQveC1zZXRleHQnLAorICAgICAgICAnLmV4ZScgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5naWYnICAgIDogJ2ltYWdlL2dpZicsCisgICAgICAgICcuZ3RhcicgICA6ICdhcHBsaWNhdGlvbi94LWd0YXInLAorICAgICAgICAnLmgnICAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcuaGRmJyAgICA6ICdhcHBsaWNhdGlvbi94LWhkZicsCisgICAgICAgICcuaHRtJyAgICA6ICd0ZXh0L2h0bWwnLAorICAgICAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKKyAgICAgICAgJy5pZWYnICAgIDogJ2ltYWdlL2llZicsCisgICAgICAgICcuanBlJyAgICA6ICdpbWFnZS9qcGVnJywKKyAgICAgICAgJy5qcGVnJyAgIDogJ2ltYWdlL2pwZWcnLAorICAgICAgICAnLmpwZycgICAgOiAnaW1hZ2UvanBlZycsCisgICAgICAgICcuanMnICAgICA6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLAorICAgICAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcubGF0ZXgnICA6ICdhcHBsaWNhdGlvbi94LWxhdGV4JywKKyAgICAgICAgJy5tMXYnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1hbicgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tYW4nLAorICAgICAgICAnLm1lJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tZScsCisgICAgICAgICcubWh0JyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWh0bWwnICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWlmJyAgICA6ICdhcHBsaWNhdGlvbi94LW1pZicsCisgICAgICAgICcubW92JyAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLm1vdmllJyAgOiAndmlkZW8veC1zZ2ktbW92aWUnLAorICAgICAgICAnLm1wMicgICAgOiAnYXVkaW8vbXBlZycsCisgICAgICAgICcubXAzJyAgICA6ICdhdWRpby9tcGVnJywKKyAgICAgICAgJy5tcGEnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1wZScgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXBlZycgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcGcnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1zJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tcycsCisgICAgICAgICcubmMnICAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCisgICAgICAgICcubndzJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubycgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLm9iaicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5vZGEnICAgIDogJ2FwcGxpY2F0aW9uL29kYScsCisgICAgICAgICcucDEyJyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucDdjJyAgICA6ICdhcHBsaWNhdGlvbi9wa2NzNy1taW1lJywKKyAgICAgICAgJy5wYm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywKKyAgICAgICAgJy5wZGYnICAgIDogJ2FwcGxpY2F0aW9uL3BkZicsCisgICAgICAgICcucGZ4JyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucGdtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAnLAorICAgICAgICAnLnBsJyAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcucG5nJyAgICA6ICdpbWFnZS9wbmcnLAorICAgICAgICAnLnBubScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAnLAorICAgICAgICAnLnBvdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwYScgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLAorICAgICAgICAnLnBwcycgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBzJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCisgICAgICAgICcucHd6JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHknICAgICA6ICd0ZXh0L3gtcHl0aG9uJywKKyAgICAgICAgJy5weWMnICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAorICAgICAgICAnLnB5bycgICAgOiAnYXBwbGljYXRpb24veC1weXRob24tY29kZScsCisgICAgICAgICcucXQnICAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLnJhJyAgICAgOiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhbScgICAgOiAnYXBwbGljYXRpb24veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhcycgICAgOiAnaW1hZ2UveC1jbXUtcmFzdGVyJywKKyAgICAgICAgJy5yZGYnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcucmdiJyAgICA6ICdpbWFnZS94LXJnYicsCisgICAgICAgICcucm9mZicgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKKyAgICAgICAgJy5ydHgnICAgIDogJ3RleHQvcmljaHRleHQnLAorICAgICAgICAnLnNnbScgICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNnbWwnICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNoJyAgICAgOiAnYXBwbGljYXRpb24veC1zaCcsCisgICAgICAgICcuc2hhcicgICA6ICdhcHBsaWNhdGlvbi94LXNoYXInLAorICAgICAgICAnLnNuZCcgICAgOiAnYXVkaW8vYmFzaWMnLAorICAgICAgICAnLnNvJyAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5zcmMnICAgIDogJ2FwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UnLAorICAgICAgICAnLnN2NGNwaW8nOiAnYXBwbGljYXRpb24veC1zdjRjcGlvJywKKyAgICAgICAgJy5zdjRjcmMnIDogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3JjJywKKyAgICAgICAgJy5zd2YnICAgIDogJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKKyAgICAgICAgJy50JyAgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAorICAgICAgICAnLnRhcicgICAgOiAnYXBwbGljYXRpb24veC10YXInLAorICAgICAgICAnLnRjbCcgICAgOiAnYXBwbGljYXRpb24veC10Y2wnLAorICAgICAgICAnLnRleCcgICAgOiAnYXBwbGljYXRpb24veC10ZXgnLAorICAgICAgICAnLnRleGknICAgOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKKyAgICAgICAgJy50ZXhpbmZvJzogJ2FwcGxpY2F0aW9uL3gtdGV4aW5mbycsCisgICAgICAgICcudGlmJyAgICA6ICdpbWFnZS90aWZmJywKKyAgICAgICAgJy50aWZmJyAgIDogJ2ltYWdlL3RpZmYnLAorICAgICAgICAnLnRyJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCisgICAgICAgICcudHN2JyAgICA6ICd0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzJywKKyAgICAgICAgJy50eHQnICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLnVzdGFyJyAgOiAnYXBwbGljYXRpb24veC11c3RhcicsCisgICAgICAgICcudmNmJyAgICA6ICd0ZXh0L3gtdmNhcmQnLAorICAgICAgICAnLndhdicgICAgOiAnYXVkaW8veC13YXYnLAorICAgICAgICAnLndpeicgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy53c2RsJyAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcueGJtJyAgICA6ICdpbWFnZS94LXhiaXRtYXAnLAorICAgICAgICAnLnhsYicgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKKyAgICAgICAgIyBEdXBsaWNhdGVzIDooCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi9leGNlbCcsCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAorICAgICAgICAnLnhtbCcgICAgOiAndGV4dC94bWwnLAorICAgICAgICAnLnhwZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy54cG0nICAgIDogJ2ltYWdlL3gteHBpeG1hcCcsCisgICAgICAgICcueHNsJyAgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnh3ZCcgICAgOiAnaW1hZ2UveC14d2luZG93ZHVtcCcsCisgICAgICAgICcuemlwJyAgICA6ICdhcHBsaWNhdGlvbi96aXAnLAorICAgICAgICB9CiAKLSMgUGxlYXNlIHNvcnQgdGhlc2UgdG9vCi1jb21tb25fdHlwZXMgPSB7Ci0gICAgJy5qcGcnIDogJ2ltYWdlL2pwZycsCi0gICAgJy5taWQnIDogJ2F1ZGlvL21pZGknLAotICAgICcubWlkaSc6ICdhdWRpby9taWRpJywKLSAgICAnLnBjdCcgOiAnaW1hZ2UvcGljdCcsCi0gICAgJy5waWMnIDogJ2ltYWdlL3BpY3QnLAotICAgICcucGljdCc6ICdpbWFnZS9waWN0JywKLSAgICAnLnJ0ZicgOiAnYXBwbGljYXRpb24vcnRmJywKLSAgICAnLnh1bCcgOiAndGV4dC94dWwnCi0gICAgfQorICAgICMgVGhlc2UgYXJlIG5vbi1zdGFuZGFyZCB0eXBlcywgY29tbW9ubHkgZm91bmQgaW4gdGhlIHdpbGQuICBUaGV5IHdpbGwKKyAgICAjIG9ubHkgbWF0Y2ggaWYgc3RyaWN0PTAgZmxhZyBpcyBnaXZlbiB0byB0aGUgQVBJIG1ldGhvZHMuCisKKyAgICAjIFBsZWFzZSBzb3J0IHRoZXNlIHRvbworICAgIGNvbW1vbl90eXBlcyA9IHsKKyAgICAgICAgJy5qcGcnIDogJ2ltYWdlL2pwZycsCisgICAgICAgICcubWlkJyA6ICdhdWRpby9taWRpJywKKyAgICAgICAgJy5taWRpJzogJ2F1ZGlvL21pZGknLAorICAgICAgICAnLnBjdCcgOiAnaW1hZ2UvcGljdCcsCisgICAgICAgICcucGljJyA6ICdpbWFnZS9waWN0JywKKyAgICAgICAgJy5waWN0JzogJ2ltYWdlL3BpY3QnLAorICAgICAgICAnLnJ0ZicgOiAnYXBwbGljYXRpb24vcnRmJywKKyAgICAgICAgJy54dWwnIDogJ3RleHQveHVsJworICAgICAgICB9CisKKworX2RlZmF1bHRfbWltZV90eXBlcygpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi9wZGIucHkgYi9MaWIvcGRiLnB5CmluZGV4IDFhYTJlYWUuLjViN2VhOTkgMTAwNzU1Ci0tLSBhL0xpYi9wZGIucHkKKysrIGIvTGliL3BkYi5weQpAQCAtOTEsNiArOTEsMTIgQEAKICAgICAgICAgICAgICAgICBzZWxmLnJjTGluZXMuYXBwZW5kKGxpbmUpCiAgICAgICAgICAgICByY0ZpbGUuY2xvc2UoKQogCisgICAgICAgIHNlbGYuY29tbWFuZHMgPSB7fSAjIGFzc29jaWF0ZXMgYSBjb21tYW5kIGxpc3QgdG8gYnJlYWtwb2ludCBudW1iZXJzCisgICAgICAgIHNlbGYuY29tbWFuZHNfZG9wcm9tcHQgPSB7fSAjIGZvciBlYWNoIGJwIG51bSwgdGVsbHMgaWYgdGhlIHByb21wdCBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50ID0ge30gIyBmb3IgZWFjaCBicCBudW0sIHRlbGxzIGlmIHRoZSBzdGFjayB0cmFjZSBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfZGVmaW5pbmcgPSBGYWxzZSAjIFRydWUgd2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZGVmaW5pbmcgYSBjb21tYW5kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19ibnVtID0gTm9uZSAjIFRoZSBicmVha3BvaW50IG51bWJlciBmb3Igd2hpY2ggd2UgYXJlIGRlZmluaW5nIGEgbGlzdAorCiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBiZGIuQmRiLnJlc2V0KHNlbGYpCiAgICAgICAgIHNlbGYuZm9yZ2V0KCkKQEAgLTEzNyw3ICsxNDMsMjggQEAKICAgICAgICAgICAgICAgICBvciBmcmFtZS5mX2xpbmVubzw9IDApOgogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZSA9IDAKLSAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5icF9jb21tYW5kcyhmcmFtZSk6CisgICAgICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIGJwX2NvbW1hbmRzKHNlbGYsZnJhbWUpOgorICAgICAgICAiIiIgQ2FsbCBldmVyeSBjb21tYW5kIHRoYXQgd2FzIHNldCBmb3IgdGhlIGN1cnJlbnQgYWN0aXZlIGJyZWFrcG9pbnQgKGlmIHRoZXJlIGlzIG9uZSkKKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBub3JtYWwgaW50ZXJhY3Rpb24gZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQsIEZhbHNlIG90aGVyd2lzZSAiIiIKKyAgICAgICAgI3NlbGYuY3VycmVudGJwIGlzIHNldCBpbiBiZGIucHkgaW4gYmRiLmJyZWFrX2hlcmUgaWYgYSBicmVha3BvaW50IHdhcyBoaXQKKyAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCJjdXJyZW50YnAiLEZhbHNlKSBhbmQgc2VsZi5jdXJyZW50YnAgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGN1cnJlbnRicCA9IHNlbGYuY3VycmVudGJwCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRicCA9IDAKKyAgICAgICAgICAgIGxhc3RjbWRfYmFjayA9IHNlbGYubGFzdGNtZAorICAgICAgICAgICAgc2VsZi5zZXR1cChmcmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuY29tbWFuZHNbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLm9uZWNtZChsaW5lKQorICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gbGFzdGNtZF9iYWNrCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19zaWxlbnRbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W2N1cnJlbnRicF06CisgICAgICAgICAgICAgICAgc2VsZi5jbWRsb29wKCkKKyAgICAgICAgICAgIHNlbGYuZm9yZ2V0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gMQogCiAgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgogICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUuIiIiCkBAIC0yMDIsMTIgKzIyOSw3MCBAQAogICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzptYXJrZXJdLnJzdHJpcCgpCiAgICAgICAgIHJldHVybiBsaW5lCiAKKyAgICBkZWYgb25lY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZQorICAgICAgICB0byB0aGUgcHJvbXB0LgorCisgICAgICAgIENoZWNrcyB3ZXRoZXIgIHRoaXMgbGluZSBpcyB0eXBlZCBpbiB0aGUgbm9ybWFsIHByb21wdCBvciBpbiBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzX2RlZmluaW5nOgorICAgICAgICAgICAgcmV0dXJuIGNtZC5DbWQub25lY21kKHNlbGYsIGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVfY29tbWFuZF9kZWYobGluZSkKKworICAgIGRlZiBoYW5kbGVfY29tbWFuZF9kZWYoc2VsZixsaW5lKToKKyAgICAgICAgIiIiIEhhbmRsZXMgb25lIGNvbW1hbmQgbGluZSBkdXJpbmcgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uICIiIgorICAgICAgICBjbWQsIGFyZywgbGluZSA9IHNlbGYucGFyc2VsaW5lKGxpbmUpCisgICAgICAgIGlmIGNtZCA9PSAnc2lsZW50JzoKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50W3NlbGYuY29tbWFuZHNfYm51bV0gPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gIyBjb250aW51ZSB0byBoYW5kbGUgb3RoZXIgY21kIGRlZiBpbiB0aGUgY21kIGxpc3QKKyAgICAgICAgZWxpZiBjbWQgPT0gJ2VuZCc6CisgICAgICAgICAgICBzZWxmLmNtZHF1ZXVlID0gW10KKyAgICAgICAgICAgIHJldHVybiAxICMgZW5kIG9mIGNtZCBsaXN0CisgICAgICAgIGNtZGxpc3QgPSBzZWxmLmNvbW1hbmRzW3NlbGYuY29tbWFuZHNfYm51bV0KKyAgICAgICAgaWYgKGFyZyk6CisgICAgICAgICAgICBjbWRsaXN0LmFwcGVuZChjbWQrJyAnK2FyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZGxpc3QuYXBwZW5kKGNtZCkKKyAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgbXVzdCBzdG9wCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHNlbGYsICdkb18nICsgY21kKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBmdW5jID0gc2VsZi5kZWZhdWx0CisgICAgICAgIGlmIGZ1bmMuZnVuY19uYW1lIGluIHNlbGYuY29tbWFuZHNfcmVzdW1pbmcgOiAjIG9uZSBvZiB0aGUgcmVzdW1pbmcgY29tbWFuZHMuCisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W3NlbGYuY29tbWFuZHNfYm51bV0gPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jbWRxdWV1ZSA9IFtdCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4KKwogICAgICMgQ29tbWFuZCBkZWZpbml0aW9ucywgY2FsbGVkIGJ5IGNtZGxvb3AoKQogICAgICMgVGhlIGFyZ3VtZW50IGlzIHRoZSByZW1haW5pbmcgc3RyaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUKICAgICAjIFJldHVybiB0cnVlIHRvIGV4aXQgZnJvbSB0aGUgY29tbWFuZCBsb29wCiAKICAgICBkb19oID0gY21kLkNtZC5kb19oZWxwCiAKKyAgICBkZWYgZG9fY29tbWFuZHMoc2VsZiwgYXJnKToKKyAgICAgICAgIiIiRGVmaW5lcyBhIGxpc3Qgb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB0byBhIGJyZWFrcG9pbnQKKyAgICAgICAgVGhvc2UgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYnJlYWtwb2ludCBjYXVzZXMgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24uIiIiCisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICBibnVtID0gbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBibnVtID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCAiVXNhZ2UgOiBjb21tYW5kcyBbYm51bV1cbiAgICAgICAgLi4uXG4gICAgICAgIGVuZCIKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb21tYW5kc19ibnVtID0gYm51bQorICAgICAgICBzZWxmLmNvbW1hbmRzW2JudW1dID0gW10KKyAgICAgICAgc2VsZi5jb21tYW5kc19kb3Byb21wdFtibnVtXSA9IFRydWUKKyAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnRbYm51bV0gPSBGYWxzZQorICAgICAgICBwcm9tcHRfYmFjayA9IHNlbGYucHJvbXB0CisgICAgICAgIHNlbGYucHJvbXB0ID0gJyhjb20pICcKKyAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IFRydWUKKyAgICAgICAgc2VsZi5jbWRsb29wKCkKKyAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0X2JhY2sKKwogICAgIGRlZiBkb19icmVhayhzZWxmLCBhcmcsIHRlbXBvcmFyeSA9IDApOgogICAgICAgICAjIGJyZWFrIFsgKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssICJjb25kaXRpb24iXSBdCiAgICAgICAgIGlmIG5vdCBhcmc6CkBAIC02OTEsNiArNzc2LDkgQEAKICAgICAgICAgaWYgYXJnc1swXSBpbiBzZWxmLmFsaWFzZXM6CiAgICAgICAgICAgICBkZWwgc2VsZi5hbGlhc2VzW2FyZ3NbMF1dCiAKKyAgICAjbGlzdCBvZiBhbGwgdGhlIGNvbW1hbmRzIG1ha2luZyB0aGUgcHJvZ3JhbSByZXN1bWUgZXhlY3V0aW9uLgorICAgIGNvbW1hbmRzX3Jlc3VtaW5nID0gWydkb19jb250aW51ZScsICdkb19zdGVwJywgJ2RvX25leHQnLCAnZG9fcmV0dXJuJywgJ2RvX3F1aXQnLCAnZG9fanVtcCddCisKICAgICAjIFByaW50IGEgdHJhY2ViYWNrIHN0YXJ0aW5nIGF0IHRoZSB0b3Agc3RhY2sgZnJhbWUuCiAgICAgIyBUaGUgbW9zdCByZWNlbnRseSBlbnRlcmVkIGZyYW1lIGlzIHByaW50ZWQgbGFzdDsKICAgICAjIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gZGJ4IGFuZCBnZGIsIGJ1dCBjb25zaXN0ZW50IHdpdGgKQEAgLTk0NCw2ICsxMDMyLDQxIEBACiAgICAgICAgIHByaW50ICIiInVuYWxpYXMgbmFtZQogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGFsaWFzLiIiIgogCisgICAgZGVmIGhlbHBfY29tbWFuZHMoc2VsZik6CisgICAgICAgIHByaW50ICIiImNvbW1hbmRzIFticG51bWJlcl0KKyhjb20pIC4uLgorKGNvbSkgZW5kCisoUGRiKQorCitTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgYnBudW1iZXIuICBUaGUKK2NvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZQorY29udGFpbmluZyBqdXN0ICdlbmQnIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuCisKK1RvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kCitmb2xsb3cgaXQgaW1tZWRpYXRlbHkgd2l0aCAgZW5kOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLgorCitXaXRoIG5vIGJwbnVtYmVyIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QKK2JyZWFrcG9pbnQgc2V0LgorCitZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi4KK1NpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlcgorY29tbWFuZCB0aGF0IHJlc3VtZXMgZXhlY3V0aW9uLgorCitTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLAorc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzCit0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGVuZCkuCitUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24KKyhldmVuIHdpdGggYSBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIKK2Fub3RoZXIgYnJlYWtwb2ludC0td2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bworYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgorCisgICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZQordXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQorYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCit0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQorc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KKyIiIgorCiAgICAgZGVmIGhlbHBfcGRiKHNlbGYpOgogICAgICAgICBoZWxwKCkKIApkaWZmIC0tZ2l0IGEvTGliL3BrZ19yZXNvdXJjZXMucHkgYi9MaWIvcGtnX3Jlc291cmNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZjYzkwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3BrZ19yZXNvdXJjZXMucHkKQEAgLTAsMCArMSwyMzc3IEBACisiIiJQYWNrYWdlIHJlc291cmNlIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXNvdXJjZSBpcyBhIGxvZ2ljYWwgZmlsZSBjb250YWluZWQgd2l0aGluIGEgcGFja2FnZSwgb3IgYSBsb2dpY2FsCitzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCit0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbAorcGF0aCBzZXBhcmF0b3IgaXMuICBEbyBub3QgdXNlIG9zLnBhdGggb3BlcmF0aW9ucyB0byBtYW5pcHVsYXRlIHJlc291cmNlCituYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgorCitUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIG5vcm1hbCBmaWxlc3lzdGVtIHBhY2thZ2VzLAorLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAorLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKK21ldGhvZC4KKyIiIgorCitpbXBvcnQgc3lzLCBvcywgemlwaW1wb3J0LCB0aW1lLCByZSwgaW1wLCBuZXcsIHBrZ3V0aWwgICMgWFhYCitmcm9tIHNldHMgaW1wb3J0IEltbXV0YWJsZVNldAorZnJvbSBvcyBpbXBvcnQgdXRpbWUsIHJlbmFtZSwgdW5saW5rICAgICMgY2FwdHVyZSB0aGVzZSB0byBieXBhc3Mgc2FuZGJveGluZworZnJvbSBvcyBpbXBvcnQgb3BlbiBhcyBvc19vcGVuCisKK2RlZiBnZXRfc3VwcG9ydGVkX3BsYXRmb3JtKCk6CisgICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KKworICAgIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIG5vcm1hbGx5IHJlcG9ydHMgdGhlIG1pbmltdW0gdmVyc2lvbgorICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQorICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCisgICAgdmVyc2lvbiBvZiBNYWMgT1MgWCB0aGF0IHdlIGFyZSAqcnVubmluZyouICBUbyBhbGxvdyB1c2FnZSBvZiBwYWNrYWdlcyB0aGF0CisgICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCisgICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KKworICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cworICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgorICAgICIiIgorICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKTsgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQorICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcyAgICAjIG5vdCBNYWMgT1MgWAorICAgIHJldHVybiBwbGF0CisKK19fYWxsX18gPSBbCisgICAgIyBCYXNpYyByZXNvdXJjZSBhY2Nlc3MgYW5kIGRpc3RyaWJ1dGlvbi9lbnRyeSBwb2ludCBkaXNjb3ZlcnkKKyAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICAnZ2V0X2Rpc3RyaWJ1dGlvbicsCisgICAgJ2xvYWRfZW50cnlfcG9pbnQnLCAnZ2V0X2VudHJ5X21hcCcsICdnZXRfZW50cnlfaW5mbycsICdpdGVyX2VudHJ5X3BvaW50cycsCisgICAgJ3Jlc291cmNlX3N0cmluZycsICdyZXNvdXJjZV9zdHJlYW0nLCAncmVzb3VyY2VfZmlsZW5hbWUnLAorICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCisKKyAgICAjIEVudmlyb25tZW50YWwgY29udHJvbAorICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCisgICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKKyAgICAnZ2V0X2RlZmF1bHRfY2FjaGUnLAorCisgICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKKyAgICAnRW52aXJvbm1lbnQnLCAnV29ya2luZ1NldCcsICdSZXNvdXJjZU1hbmFnZXInLAorICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCisKKyAgICAjIEV4Y2VwdGlvbnMKKyAgICAnUmVzb2x1dGlvbkVycm9yJywnVmVyc2lvbkNvbmZsaWN0JywnRGlzdHJpYnV0aW9uTm90Rm91bmQnLCdVbmtub3duRXh0cmEnLAorICAgICdFeHRyYWN0aW9uRXJyb3InLAorCisgICAgIyBQYXJzaW5nIGZ1bmN0aW9ucyBhbmQgc3RyaW5nIHV0aWxpdGllcworICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKKyAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKKyAgICAnc2FmZV9leHRyYScsICd0b19maWxlbmFtZScsCisKKyAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCisgICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAorCisgICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cworICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCisKKyAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCisgICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCisgICAgJ1BhdGhNZXRhZGF0YScsICdFZ2dNZXRhZGF0YScsICdFbXB0eVByb3ZpZGVyJywgJ2VtcHR5X3Byb3ZpZGVyJywKKyAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCisgICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCisgICAgJ2ZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcycsICdnZXRfaW1wb3J0ZXInLAorCisgICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQorICAgICdydW5fbWFpbicsICdBdmFpbGFibGVEaXN0cmlidXRpb25zJywKK10KK2NsYXNzIFJlc29sdXRpb25FcnJvcihFeGNlcHRpb24pOgorICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXytyZXByKHNlbGYuYXJncykKKworY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CisgICAgIiIiQW4gYWxyZWFkeS1pbnN0YWxsZWQgdmVyc2lvbiBjb25mbGljdHMgd2l0aCB0aGUgcmVxdWVzdGVkIHZlcnNpb24iIiIKKworY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKKyAgICAiIiJBIHJlcXVlc3RlZCBkaXN0cmlidXRpb24gd2FzIG5vdCBmb3VuZCIiIgorCitjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKKyAgICAiIiJEaXN0cmlidXRpb24gZG9lc24ndCBoYXZlIGFuICJleHRyYSBmZWF0dXJlIiBvZiB0aGUgZ2l2ZW4gbmFtZSIiIgorCitfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KK1BZX01BSk9SID0gc3lzLnZlcnNpb25bOjNdCitFR0dfRElTVCAgICA9IDMKK0JJTkFSWV9ESVNUID0gMgorU09VUkNFX0RJU1QgPSAxCitDSEVDS09VVF9ESVNUID0gMAorREVWRUxPUF9ESVNUID0gLTEKKworZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKKyAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKKworICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKKyAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAorICAgIHJldHVybnMgYW4gYGBJUmVzb3VyY2VQcm92aWRlcmBgIGZvciB0aGF0IG1vZHVsZS4KKyAgICAiIiIKKyAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKKworZGVmIGdldF9wcm92aWRlcihtb2R1bGVPclJlcSk6CisgICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCisgICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSxSZXF1aXJlbWVudCk6CisgICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCisgICAgdHJ5OgorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIF9faW1wb3J0X18obW9kdWxlT3JSZXEpCisgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQorICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCisgICAgcmV0dXJuIF9maW5kX2FkYXB0ZXIoX3Byb3ZpZGVyX2ZhY3RvcmllcywgbG9hZGVyKShtb2R1bGUpCisKK2RlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKKyAgICBpZiBub3QgX2NhY2hlOgorICAgICAgICBpbmZvID0gb3MucG9wZW4oJy91c3IvYmluL3N3X3ZlcnMnKS5yZWFkKCkuc3BsaXRsaW5lcygpCisgICAgICAgIGZvciBsaW5lIGluIGluZm86CisgICAgICAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdChOb25lLCAxKQorICAgICAgICAgICAgaWYga2V5ID09ICdQcm9kdWN0VmVyc2lvbjonOgorICAgICAgICAgICAgICAgIF9jYWNoZS5hcHBlbmQodmFsdWUuc3RyaXAoKS5zcGxpdCgiLiIpKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiV2hhdD8hIgorICAgIHJldHVybiBfY2FjaGVbMF0KKworZGVmIF9tYWNvc3hfYXJjaChtYWNoaW5lKToKKyAgICByZXR1cm4geydQb3dlclBDJzoncHBjJywgJ1Bvd2VyX01hY2ludG9zaCc6J3BwYyd9LmdldChtYWNoaW5lLG1hY2hpbmUpCisKK2RlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKKyAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIHN0cmluZyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucworCisgICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CisgICAgbmVlZHMgc29tZSBoYWNrcyBmb3IgTGludXggYW5kIE1hYyBPUyBYLgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorICAgIHBsYXQgPSBnZXRfcGxhdGZvcm0oKQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ZXJzaW9uID0gX21hY29zeF92ZXJzKCkKKyAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCisgICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgaWYgc29tZW9uZSBpcyBydW5uaW5nIGEgbm9uLU1hYyBkYXJ3aW4gc3lzdGVtLCB0aGlzIHdpbGwgZmFsbAorICAgICAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIHBsYXQKKworbWFjb3NWZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyIm1hY29zeC0oXGQrKVwuKFxkKyktKC4qKSIpCitkYXJ3aW5WZXJzaW9uU3RyaW5nID0gcmUuY29tcGlsZShyImRhcndpbi0oXGQrKVwuKFxkKylcLihcZCspLSguKikiKQorZ2V0X3BsYXRmb3JtID0gZ2V0X2J1aWxkX3BsYXRmb3JtICAgIyBYWFggYmFja3dhcmQgY29tcGF0CisKK2RlZiBjb21wYXRpYmxlX3BsYXRmb3Jtcyhwcm92aWRlZCxyZXF1aXJlZCk6CisgICAgIiIiQ2FuIGNvZGUgZm9yIHRoZSBgcHJvdmlkZWRgIHBsYXRmb3JtIHJ1biBvbiB0aGUgYHJlcXVpcmVkYCBwbGF0Zm9ybT8KKworICAgIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgcGxhdGZvcm0gaXMgYGBOb25lYGAsIG9yIHRoZSBwbGF0Zm9ybXMgYXJlIGVxdWFsLgorCisgICAgWFhYIE5lZWRzIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBMaW51eCBhbmQgb3RoZXIgdW5peHkgT1Nlcy4KKyAgICAiIiIKKyAgICBpZiBwcm92aWRlZCBpcyBOb25lIG9yIHJlcXVpcmVkIGlzIE5vbmUgb3IgcHJvdmlkZWQ9PXJlcXVpcmVkOgorICAgICAgICByZXR1cm4gVHJ1ZSAgICAgIyBlYXN5IGNhc2UKKworICAgICMgTWFjIE9TIFggc3BlY2lhbCBjYXNlcworICAgIHJlcU1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChyZXF1aXJlZCkKKyAgICBpZiByZXFNYWM6CisgICAgICAgIHByb3ZNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCisKKyAgICAgICAgIyBpcyB0aGlzIGEgTWFjIHBhY2thZ2U/CisgICAgICAgIGlmIG5vdCBwcm92TWFjOgorICAgICAgICAgICAgIyB0aGlzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBidWlsdCBiZWZvcmUKKyAgICAgICAgICAgICMgc2V0dXB0b29scyAwLjYuIEFsbCBwYWNrYWdlcyBidWlsdCBhZnRlciB0aGlzIHBvaW50IHdpbGwKKyAgICAgICAgICAgICMgdXNlIHRoZSBuZXcgbWFjb3N4IGRlc2lnbmF0aW9uLgorICAgICAgICAgICAgcHJvdkRhcndpbiA9IGRhcndpblZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCisgICAgICAgICAgICBpZiBwcm92RGFyd2luOgorICAgICAgICAgICAgICAgIGR2ZXJzaW9uID0gaW50KHByb3ZEYXJ3aW4uZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgbWFjb3N2ZXJzaW9uID0gIiVzLiVzIiAlIChyZXFNYWMuZ3JvdXAoMSksIHJlcU1hYy5ncm91cCgyKSkKKyAgICAgICAgICAgICAgICBpZiBkdmVyc2lvbiA9PSA3IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjMiIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgZHZlcnNpb24gPT0gOCBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC40IjoKKworICAgICAgICAgICAgICAgICAgICAjaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgICN3YXJuaW5ncy53YXJuKCJNYWMgZWdncyBzaG91bGQgYmUgcmVidWlsdCB0byAiCisgICAgICAgICAgICAgICAgICAgICMgICAgInVzZSB0aGUgbWFjb3N4IGRlc2lnbmF0aW9uIGluc3RlYWQgb2YgZGFyd2luLiIsCisgICAgICAgICAgICAgICAgICAgICMgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICAgICMgZWdnIGlzbid0IG1hY29zeCBvciBsZWdhY3kgZGFyd2luCisKKyAgICAgICAgIyBhcmUgdGhleSB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFuZCBtYWNoaW5lIHR5cGU/CisgICAgICAgIGlmIHByb3ZNYWMuZ3JvdXAoMSkgIT0gcmVxTWFjLmdyb3VwKDEpIG9yIFwKKyAgICAgICAgICAgIHByb3ZNYWMuZ3JvdXAoMykgIT0gcmVxTWFjLmdyb3VwKDMpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKworCisgICAgICAgICMgaXMgdGhlIHJlcXVpcmVkIE9TIG1ham9yIHVwZGF0ZSA+PSB0aGUgcHJvdmlkZWQgb25lPworICAgICAgICBpZiBpbnQocHJvdk1hYy5ncm91cCgyKSkgPiBpbnQocmVxTWFjLmdyb3VwKDIpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIFhYWCBMaW51eCBhbmQgb3RoZXIgcGxhdGZvcm1zJyBzcGVjaWFsIGNhc2VzIHNob3VsZCBnbyBoZXJlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bl9zY3JpcHQoZGlzdF9zcGVjLCBzY3JpcHRfbmFtZSk6CisgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBgZGlzdF9zcGVjYCBhbmQgcnVuIGl0cyBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgorICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKKyAgICBuYW1lID0gbnNbJ19fbmFtZV9fJ10KKyAgICBucy5jbGVhcigpCisgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCisgICAgcmVxdWlyZShkaXN0X3NwZWMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQorCitydW5fbWFpbiA9IHJ1bl9zY3JpcHQgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGdldF9kaXN0cmlidXRpb24oZGlzdCk6CisgICAgIiIiUmV0dXJuIGEgY3VycmVudCBkaXN0cmlidXRpb24gb2JqZWN0IGZvciBhIFJlcXVpcmVtZW50IG9yIHN0cmluZyIiIgorICAgIGlmIGlzaW5zdGFuY2UoZGlzdCxiYXNlc3RyaW5nKTogZGlzdCA9IFJlcXVpcmVtZW50LnBhcnNlKGRpc3QpCisgICAgaWYgaXNpbnN0YW5jZShkaXN0LFJlcXVpcmVtZW50KTogZGlzdCA9IGdldF9wcm92aWRlcihkaXN0KQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpc3QsRGlzdHJpYnV0aW9uKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBzdHJpbmcsIFJlcXVpcmVtZW50LCBvciBEaXN0cmlidXRpb24iLCBkaXN0KQorICAgIHJldHVybiBkaXN0CisKK2RlZiBsb2FkX2VudHJ5X3BvaW50KGRpc3QsIGdyb3VwLCBuYW1lKToKKyAgICAiIiJSZXR1cm4gYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgZm9yIGBkaXN0YCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgorICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmxvYWRfZW50cnlfcG9pbnQoZ3JvdXAsIG5hbWUpCisKK2RlZiBnZXRfZW50cnlfbWFwKGRpc3QsIGdyb3VwPU5vbmUpOgorICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKKyAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfbWFwKGdyb3VwKQorCitkZWYgZ2V0X2VudHJ5X2luZm8oZGlzdCwgZ3JvdXAsIG5hbWUpOgorICAgICIiIlJldHVybiB0aGUgRW50cnlQb2ludCBvYmplY3QgZm9yIGBncm91cGArYG5hbWVgLCBvciBgYE5vbmVgYCIiIgorICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9pbmZvKGdyb3VwLCBuYW1lKQorCisKK3RyeToKKyAgICBmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9pbXBvcnRlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBfcGtndXRpbCBhcyBwa2d1dGlsCisgICAgZ2V0X2ltcG9ydGVyID0gcGtndXRpbC5nZXRfaW1wb3J0ZXIKK2Vsc2U6CisgICAgaW1wb3J0IHBrZ3V0aWwKKworCitjbGFzcyBJTWV0YWRhdGFQcm92aWRlcjoKKworICAgIGRlZiBoYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UncyBkaXN0cmlidXRpb24gY29udGFpbiB0aGUgbmFtZWQgbWV0YWRhdGE/IiIiCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgorICAgICAgICAiIiJUaGUgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKKworICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CisgICAgICAgICIiIllpZWxkIG5hbWVkIG1ldGFkYXRhIHJlc291cmNlIGFzIGxpc3Qgb2Ygbm9uLWJsYW5rIG5vbi1jb21tZW50IGxpbmVzCisKKyAgICAgICBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gZWFjaCBsaW5lLCBhbmQgbGluZXMKKyAgICAgICB3aXRoIGBgI2BgIGFzIHRoZSBmaXJzdCBub24tYmxhbmsgY2hhcmFjdGVyIGFyZSBvbWl0dGVkLiIiIgorCisgICAgZGVmIG1ldGFkYXRhX2lzZGlyKG5hbWUpOgorICAgICAgICAiIiJJcyB0aGUgbmFtZWQgbWV0YWRhdGEgYSBkaXJlY3Rvcnk/ICAobGlrZSBgYG9zLnBhdGguaXNkaXIoKWBgKSIiIgorCisgICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIobmFtZSk6CisgICAgICAgICIiIkxpc3Qgb2YgbWV0YWRhdGEgbmFtZXMgaW4gdGhlIGRpcmVjdG9yeSAobGlrZSBgYG9zLmxpc3RkaXIoKWBgKSIiIgorCisgICAgZGVmIHJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIG5hbWVkIHNjcmlwdCBpbiB0aGUgc3VwcGxpZWQgbmFtZXNwYWNlIGRpY3Rpb25hcnkiIiIKKworCisKKworCisKKworCisKKworY2xhc3MgSVJlc291cmNlUHJvdmlkZXIoSU1ldGFkYXRhUHJvdmlkZXIpOgorICAgICIiIkFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyIiIgorCisgICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIGByZXNvdXJjZV9uYW1lYAorCisgICAgICAgIGBtYW5hZ2VyYCBtdXN0IGJlIGFuIGBgSVJlc291cmNlTWFuYWdlcmBgIiIiCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3IgYHJlc291cmNlX25hbWVgCisKKyAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYHJlc291cmNlX25hbWVgCisKKyAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKKworICAgIGRlZiBoYXNfcmVzb3VyY2UocmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UgY29udGFpbiB0aGUgbmFtZWQgcmVzb3VyY2U/IiIiCisKKyAgICBkZWYgcmVzb3VyY2VfaXNkaXIocmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCisKKyAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiTGlzdCBvZiByZXNvdXJjZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBXb3JraW5nU2V0KG9iamVjdCk6CisgICAgIiIiQSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBkaXN0cmlidXRpb25zIG9uIHN5cy5wYXRoIChvciBhIHNpbWlsYXIgbGlzdCkiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnRyaWVzPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgd29ya2luZyBzZXQgZnJvbSBsaXN0IG9mIHBhdGggZW50cmllcyAoZGVmYXVsdD1zeXMucGF0aCkiIiIKKyAgICAgICAgc2VsZi5lbnRyaWVzID0gW10KKyAgICAgICAgc2VsZi5lbnRyeV9rZXlzID0ge30KKyAgICAgICAgc2VsZi5ieV9rZXkgPSB7fQorICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCisKKyAgICAgICAgaWYgZW50cmllcyBpcyBOb25lOgorICAgICAgICAgICAgZW50cmllcyA9IHN5cy5wYXRoCisKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICBzZWxmLmFkZF9lbnRyeShlbnRyeSkKKworCisgICAgZGVmIGFkZF9lbnRyeShzZWxmLCBlbnRyeSk6CisgICAgICAgICIiIkFkZCBhIHBhdGggaXRlbSB0byBgYC5lbnRyaWVzYGAsIGZpbmRpbmcgYW55IGRpc3RyaWJ1dGlvbnMgb24gaXQKKworICAgICAgICBgYGZpbmRfZGlzdHJpYnV0aW9ucyhlbnRyeSxGYWxzZSlgYCBpcyB1c2VkIHRvIGZpbmQgZGlzdHJpYnV0aW9ucworICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXRoIGVudHJ5LCBhbmQgdGhleSBhcmUgYWRkZWQuICBgZW50cnlgIGlzCisgICAgICAgIGFsd2F5cyBhcHBlbmRlZCB0byBgYC5lbnRyaWVzYGAsIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgorICAgICAgICAoVGhpcyBpcyBiZWNhdXNlIGBgc3lzLnBhdGhgYCBjYW4gY29udGFpbiB0aGUgc2FtZSB2YWx1ZSBtb3JlIHRoYW4KKyAgICAgICAgb25jZSwgYW5kIHRoZSBgYC5lbnRyaWVzYGAgb2YgdGhlIGBgc3lzLnBhdGhgYCBXb3JraW5nU2V0IHNob3VsZCBhbHdheXMKKyAgICAgICAgZXF1YWwgYGBzeXMucGF0aGBgLikKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LCBbXSkKKyAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKKyAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKToKKyAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QsIGVudHJ5LCBGYWxzZSkKKworCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGRpc3QpOgorICAgICAgICAiIiJUcnVlIGlmIGBkaXN0YCBpcyB0aGUgYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHByb2plY3QiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYnlfa2V5LmdldChkaXN0LmtleSkgPT0gZGlzdAorCisKKworCisKKyAgICBkZWYgZmluZChzZWxmLCByZXEpOgorICAgICAgICAiIiJGaW5kIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIHJlcXVpcmVtZW50IGByZXFgCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCB0aGlzCisgICAgICAgIHJldHVybnMgaXQgYXMgbG9uZyBhcyBpdCBtZWV0cyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZWQgYnkKKyAgICAgICAgYHJlcWAuICBCdXQsIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBpdAorICAgICAgICBkb2VzICpub3QqIG1lZXQgdGhlIGByZXFgIHJlcXVpcmVtZW50LCBgYFZlcnNpb25Db25mbGljdGBgIGlzIHJhaXNlZC4KKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCBgYE5vbmVgYAorICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKKyAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgZGlzdCBub3QgaW4gcmVxOgorICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QscmVxKSAgICAgIyBYWFggYWRkIG1vcmUgaW5mbworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRpc3QKKworICAgIGRlZiBpdGVyX2VudHJ5X3BvaW50cyhzZWxmLCBncm91cCwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiWWllbGQgZW50cnkgcG9pbnQgb2JqZWN0cyBmcm9tIGBncm91cGAgbWF0Y2hpbmcgYG5hbWVgCisKKyAgICAgICAgSWYgYG5hbWVgIGlzIE5vbmUsIHlpZWxkcyBhbGwgZW50cnkgcG9pbnRzIGluIGBncm91cGAgZnJvbSBhbGwKKyAgICAgICAgZGlzdHJpYnV0aW9ucyBpbiB0aGUgd29ya2luZyBzZXQsIG90aGVyd2lzZSBvbmx5IG9uZXMgbWF0Y2hpbmcKKyAgICAgICAgYm90aCBgZ3JvdXBgIGFuZCBgbmFtZWAgYXJlIHlpZWxkZWQgKGluIGRpc3RyaWJ1dGlvbiBvcmRlcikuCisgICAgICAgICIiIgorICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgorICAgICAgICAgICAgZW50cmllcyA9IGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBmb3IgZXAgaW4gZW50cmllcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZXAKKyAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgICAgIHlpZWxkIGVudHJpZXNbbmFtZV0KKworICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHJlcXVpcmVzLCBzY3JpcHRfbmFtZSk6CisgICAgICAgICIiIkxvY2F0ZSBkaXN0cmlidXRpb24gZm9yIGByZXF1aXJlc2AgYW5kIHJ1biBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgorICAgICAgICBucyA9IHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzCisgICAgICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQorICAgICAgICBucy5jbGVhcigpCisgICAgICAgIG5zWydfX25hbWVfXyddID0gbmFtZQorICAgICAgICBzZWxmLnJlcXVpcmUocmVxdWlyZXMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQorCisKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBmb3Igbm9uLWR1cGxpY2F0ZSBwcm9qZWN0cyBpbiB0aGUgd29ya2luZyBzZXQKKworICAgICAgICBUaGUgeWllbGQgb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpdGVtcycgcGF0aCBlbnRyaWVzIHdlcmUKKyAgICAgICAgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VlbiA9IHt9CisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5lbnRyeV9rZXlzW2l0ZW1dOgorICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VlbjoKKyAgICAgICAgICAgICAgICAgICAgc2VlbltrZXldPTEKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5ieV9rZXlba2V5XQorCisgICAgZGVmIGFkZChzZWxmLCBkaXN0LCBlbnRyeT1Ob25lLCBpbnNlcnQ9VHJ1ZSk6CisgICAgICAgICIiIkFkZCBgZGlzdGAgdG8gd29ya2luZyBzZXQsIGFzc29jaWF0ZWQgd2l0aCBgZW50cnlgCisKKyAgICAgICAgSWYgYGVudHJ5YCBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGBgLmxvY2F0aW9uYGAgb2YgYGRpc3RgLgorICAgICAgICBPbiBleGl0IGZyb20gdGhpcyByb3V0aW5lLCBgZW50cnlgIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtpbmcKKyAgICAgICAgc2V0J3MgYGAuZW50cmllc2BgIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSBwcmVzZW50KS4KKworICAgICAgICBgZGlzdGAgaXMgb25seSBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaWYgaXQncyBmb3IgYSBwcm9qZWN0IHRoYXQKKyAgICAgICAgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBkaXN0cmlidXRpb24gaW4gdGhlIHNldC4gIElmIGl0J3MgYWRkZWQsIGFueQorICAgICAgICBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBgYHN1YnNjcmliZSgpYGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaW5zZXJ0OgorICAgICAgICAgICAgZGlzdC5pbnNlcnRfb24oc2VsZi5lbnRyaWVzLCBlbnRyeSkKKworICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgorICAgICAgICAgICAgZW50cnkgPSBkaXN0LmxvY2F0aW9uCisgICAgICAgIGtleXMgPSBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSxbXSkKKworICAgICAgICBpZiBkaXN0LmtleSBpbiBzZWxmLmJ5X2tleToKKyAgICAgICAgICAgIHJldHVybiAgICAgICMgaWdub3JlIGhpZGRlbiBkaXN0cm9zCisKKyAgICAgICAgc2VsZi5ieV9rZXlbZGlzdC5rZXldID0gZGlzdAorICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czoKKyAgICAgICAgICAgIGtleXMuYXBwZW5kKGRpc3Qua2V5KQorCisgICAgICAgIHNlbGYuX2FkZGVkX25ldyhkaXN0KQorCisKKyAgICBkZWYgcmVzb2x2ZShzZWxmLCByZXF1aXJlbWVudHMsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIkxpc3QgYWxsIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIChyZWN1cnNpdmVseSkgbWVldCBgcmVxdWlyZW1lbnRzYAorCisgICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAorICAgICAgICBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZS4gIElmCisgICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKKyAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKKyAgICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggZWFjaCByZXF1aXJlbWVudCB0aGF0IGNhbm5vdCBiZSBtZXQgYnkgYW4KKyAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgorICAgICAgICBgYE5vbmVgYC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmVxdWlyZW1lbnRzID0gbGlzdChyZXF1aXJlbWVudHMpWzo6LTFdICAjIHNldCB1cCB0aGUgc3RhY2sKKyAgICAgICAgcHJvY2Vzc2VkID0ge30gICMgc2V0IG9mIHByb2Nlc3NlZCByZXF1aXJlbWVudHMKKyAgICAgICAgYmVzdCA9IHt9ICAjIGtleSAtPiBkaXN0CisgICAgICAgIHRvX2FjdGl2YXRlID0gW10KKworICAgICAgICB3aGlsZSByZXF1aXJlbWVudHM6CisgICAgICAgICAgICByZXEgPSByZXF1aXJlbWVudHMucG9wKDApICAgIyBwcm9jZXNzIGRlcGVuZGVuY2llcyBicmVhZHRoLWZpcnN0CisgICAgICAgICAgICBpZiByZXEgaW4gcHJvY2Vzc2VkOgorICAgICAgICAgICAgICAgICMgSWdub3JlIGN5Y2xpYyBvciByZWR1bmRhbnQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQorICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCisgICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQorICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2gocmVxLCBzZWxmLCBpbnN0YWxsZXIpCisgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSkgICMgWFhYIHB1dCBtb3JlIGluZm8gaGVyZQorICAgICAgICAgICAgICAgIHRvX2FjdGl2YXRlLmFwcGVuZChkaXN0KQorICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgorICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QscmVxKSAjIFhYWCBwdXQgbW9yZSBpbmZvIGhlcmUKKyAgICAgICAgICAgIHJlcXVpcmVtZW50cy5leHRlbmQoZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXSkKKyAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQorCisgICAgICAgIHJldHVybiB0b19hY3RpdmF0ZSAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKKworICAgIGRlZiBmaW5kX3BsdWdpbnMoc2VsZiwKKyAgICAgICAgcGx1Z2luX2VudiwgZnVsbF9lbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUsIGZhbGxiYWNrPVRydWUKKyAgICApOgorICAgICAgICAiIiJGaW5kIGFsbCBhY3RpdmF0YWJsZSBkaXN0cmlidXRpb25zIGluIGBwbHVnaW5fZW52YAorCisgICAgICAgIEV4YW1wbGUgdXNhZ2U6OgorCisgICAgICAgICAgICBkaXN0cmlidXRpb25zLCBlcnJvcnMgPSB3b3JraW5nX3NldC5maW5kX3BsdWdpbnMoCisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQocGx1Z2luX2Rpcmxpc3QpCisgICAgICAgICAgICApCisgICAgICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLCBkaXN0cmlidXRpb25zKSAgIyBhZGQgcGx1Z2lucytsaWJzIHRvIHN5cy5wYXRoCisgICAgICAgICAgICBwcmludCAiQ291bGRuJ3QgbG9hZCIsIGVycm9ycyAgICAgICAgIyBkaXNwbGF5IGVycm9ycworCisgICAgICAgIFRoZSBgcGx1Z2luX2VudmAgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCisgICAgICAgIG9ubHkgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBpbiB0aGUgcHJvamVjdCdzICJwbHVnaW4gZGlyZWN0b3J5IiBvcgorICAgICAgICBkaXJlY3Rvcmllcy4gVGhlIGBmdWxsX2VudmAsIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgCisgICAgICAgIGNvbnRhaW5zIGFsbCBjdXJyZW50bHktYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMuICBJZiBgZnVsbF9lbnZgIGlzIG5vdAorICAgICAgICBzdXBwbGllZCwgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBgYFdvcmtpbmdTZXRgYCB0aGlzCisgICAgICAgIG1ldGhvZCBpcyBjYWxsZWQgb24sIHdoaWNoIHdpbGwgdHlwaWNhbGx5IG1lYW4gdGhhdCBldmVyeSBkaXJlY3Rvcnkgb24KKyAgICAgICAgYGBzeXMucGF0aGBgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZGlzdHJpYnV0aW9ucy4KKworICAgICAgICBgaW5zdGFsbGVyYCBpcyBhIHN0YW5kYXJkIGluc3RhbGxlciBjYWxsYmFjayBhcyB1c2VkIGJ5IHRoZQorICAgICAgICBgYHJlc29sdmUoKWBgIG1ldGhvZC4gVGhlIGBmYWxsYmFja2AgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQKKyAgICAgICAgYXR0ZW1wdCB0byByZXNvbHZlIG9sZGVyIHZlcnNpb25zIG9mIGEgcGx1Z2luIGlmIHRoZSBuZXdlc3QgdmVyc2lvbgorICAgICAgICBjYW5ub3QgYmUgcmVzb2x2ZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIDItdHVwbGU6IChgZGlzdHJpYnV0aW9uc2AsIGBlcnJvcl9pbmZvYCksIHdoZXJlCisgICAgICAgIGBkaXN0cmlidXRpb25zYCBpcyBhIGxpc3Qgb2YgdGhlIGRpc3RyaWJ1dGlvbnMgZm91bmQgaW4gYHBsdWdpbl9lbnZgCisgICAgICAgIHRoYXQgd2VyZSBsb2FkYWJsZSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQKKyAgICAgICAgdG8gcmVzb2x2ZSB0aGVpciBkZXBlbmRlbmNpZXMuICBgZXJyb3JfaW5mb2AgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcKKyAgICAgICAgdW5sb2FkYWJsZSBwbHVnaW4gZGlzdHJpYnV0aW9ucyB0byBhbiBleGNlcHRpb24gaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUKKyAgICAgICAgZXJyb3IgdGhhdCBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBgYERpc3RyaWJ1dGlvbk5vdEZvdW5kYGAgb3IKKyAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcGx1Z2luX3Byb2plY3RzID0gbGlzdChwbHVnaW5fZW52KQorICAgICAgICBwbHVnaW5fcHJvamVjdHMuc29ydCgpICAjIHNjYW4gcHJvamVjdCBuYW1lcyBpbiBhbHBoYWJldGljIG9yZGVyCisKKyAgICAgICAgZXJyb3JfaW5mbyA9IHt9CisgICAgICAgIGRpc3RyaWJ1dGlvbnMgPSB7fQorCisgICAgICAgIGlmIGZ1bGxfZW52IGlzIE5vbmU6CisgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCisgICAgICAgICAgICBlbnYgKz0gcGx1Z2luX2VudgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52ID0gZnVsbF9lbnYgKyBwbHVnaW5fZW52CisKKyAgICAgICAgc2hhZG93X3NldCA9IHNlbGYuX19jbGFzc19fKFtdKQorICAgICAgICBtYXAoc2hhZG93X3NldC5hZGQsIHNlbGYpICAgIyBwdXQgYWxsIG91ciBlbnRyaWVzIGluIHNoYWRvd19zZXQKKworICAgICAgICBmb3IgcHJvamVjdF9uYW1lIGluIHBsdWdpbl9wcm9qZWN0czoKKworICAgICAgICAgICAgZm9yIGRpc3QgaW4gcGx1Z2luX2Vudltwcm9qZWN0X25hbWVdOgorCisgICAgICAgICAgICAgICAgcmVxID0gW2Rpc3QuYXNfcmVxdWlyZW1lbnQoKV0KKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWVzID0gc2hhZG93X3NldC5yZXNvbHZlKHJlcSwgZW52LCBpbnN0YWxsZXIpCisKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzb2x1dGlvbkVycm9yLHY6CisgICAgICAgICAgICAgICAgICAgIGVycm9yX2luZm9bZGlzdF0gPSB2ICAgICMgc2F2ZSBlcnJvciBpbmZvCisgICAgICAgICAgICAgICAgICAgIGlmIGZhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyB0cnkgdGhlIG5leHQgb2xkZXIgdmVyc2lvbiBvZiBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICAgICAjIGdpdmUgdXAgb24gdGhpcyBwcm9qZWN0LCBrZWVwIGdvaW5nCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYXAoc2hhZG93X3NldC5hZGQsIHJlc29sdmVlcykKKyAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucy51cGRhdGUoZGljdC5mcm9ta2V5cyhyZXNvbHZlZXMpKQorCisgICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzcywgbm8gbmVlZCB0byB0cnkgYW55IG1vcmUgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZGlzdHJpYnV0aW9ucyA9IGxpc3QoZGlzdHJpYnV0aW9ucykKKyAgICAgICAgZGlzdHJpYnV0aW9ucy5zb3J0KCkKKworICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9ucywgZXJyb3JfaW5mbworCisKKworCisKKyAgICBkZWYgcmVxdWlyZShzZWxmLCAqcmVxdWlyZW1lbnRzKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgZGlzdHJpYnV0aW9ucyBtYXRjaGluZyBgcmVxdWlyZW1lbnRzYCBhcmUgYWN0aXZhdGVkCisKKyAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHN0cmluZyBvciBhIChwb3NzaWJseS1uZXN0ZWQpIHNlcXVlbmNlCisgICAgICAgIHRoZXJlb2YsIHNwZWNpZnlpbmcgdGhlIGRpc3RyaWJ1dGlvbnMgYW5kIHZlcnNpb25zIHJlcXVpcmVkLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBkaXN0cmlidXRpb25zIHRoYXQgbmVlZGVkIHRvIGJlCisgICAgICAgIGFjdGl2YXRlZCB0byBmdWxmaWxsIHRoZSByZXF1aXJlbWVudHM7IGFsbCByZWxldmFudCBkaXN0cmlidXRpb25zIGFyZQorICAgICAgICBpbmNsdWRlZCwgZXZlbiBpZiB0aGV5IHdlcmUgYWxyZWFkeSBhY3RpdmF0ZWQgaW4gdGhpcyB3b3JraW5nIHNldC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbmVlZGVkID0gc2VsZi5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQorCisgICAgICAgIGZvciBkaXN0IGluIG5lZWRlZDoKKyAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCisKKyAgICAgICAgcmV0dXJuIG5lZWRlZAorCisKKyAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiSW52b2tlIGBjYWxsYmFja2AgZm9yIGFsbCBkaXN0cmlidXRpb25zIChpbmNsdWRpbmcgZXhpc3Rpbmcgb25lcykiIiIKKyAgICAgICAgaWYgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQorICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgorICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKKworCisgICAgZGVmIF9hZGRlZF9uZXcoc2VsZiwgZGlzdCk6CisgICAgICAgIGZvciBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKKyAgICAgICAgICAgIGNhbGxiYWNrKGRpc3QpCisKKworCisKKworCisKKworCisKKworY2xhc3MgRW52aXJvbm1lbnQob2JqZWN0KToKKyAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwgcHl0aG9uPVBZX01BSk9SKToKKyAgICAgICAgIiIiU25hcHNob3QgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgb24gYSBzZWFyY2ggcGF0aAorCisgICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgYHNlYXJjaF9wYXRoYCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvZiBgYHN5cy5wYXRoYGAgaXRlbXMuICBJZiBub3QKKyAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgorCisgICAgICAgIGBwbGF0Zm9ybWAgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHBsYXRmb3JtCisgICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCisgICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCisgICAgICAgIG9wdGlvbmFsIHN0cmluZyBuYW1pbmcgdGhlIGRlc2lyZWQgdmVyc2lvbiBvZiBQeXRob24gKGUuZy4gYGAnMi40J2BgKTsKKyAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KKworICAgICAgICBZb3UgbWF5IGV4cGxpY2l0bHkgc2V0IGBwbGF0Zm9ybWAgKGFuZC9vciBgcHl0aG9uYCkgdG8gYGBOb25lYGAgaWYgeW91CisgICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQorICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgorICAgICAgICBzZWxmLnNjYW4oc2VhcmNoX3BhdGgpCisKKyAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKKyAgICAgICAgIiIiSXMgZGlzdHJpYnV0aW9uIGBkaXN0YCBhY2NlcHRhYmxlIGZvciB0aGlzIGVudmlyb25tZW50PworCisgICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgd2hlbiB0aGlzIGVudmlyb25tZW50IHdhcyBjcmVhdGVkLCBvciBGYWxzZQorICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoc2VsZi5weXRob24gaXMgTm9uZSBvciBkaXN0LnB5X3ZlcnNpb24gaXMgTm9uZQorICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uPT1zZWxmLnB5dGhvbikgXAorICAgICAgICAgICBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSxzZWxmLnBsYXRmb3JtKQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBkaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgorICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKKworICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgorICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKKworICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgorICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAorICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuICBPbmx5IGRpc3RyaWJ1dGlvbnMgY29uZm9ybWluZyB0bworICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWFyY2hfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAorCisgICAgICAgIGZvciBpdGVtIGluIHNlYXJjaF9wYXRoOgorICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixwcm9qZWN0X25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jYWNoZVtwcm9qZWN0X25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb2plY3RfbmFtZSA9IHByb2plY3RfbmFtZS5sb3dlcigpCisgICAgICAgICAgICBpZiBwcm9qZWN0X25hbWUgbm90IGluIHNlbGYuX2Rpc3RtYXA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgaWYgcHJvamVjdF9uYW1lIG5vdCBpbiBzZWxmLl9jYWNoZToKKyAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fY2FjaGVbcHJvamVjdF9uYW1lXSA9IHNlbGYuX2Rpc3RtYXBbcHJvamVjdF9uYW1lXQorICAgICAgICAgICAgX3NvcnRfZGlzdHMoZGlzdHMpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlW3Byb2plY3RfbmFtZV0KKworICAgIGRlZiBhZGQoc2VsZixkaXN0KToKKyAgICAgICAgIiIiQWRkIGBkaXN0YCBpZiB3ZSBgYGNhbl9hZGQoKWBgIGl0IGFuZCBpdCBpc24ndCBhbHJlYWR5IGFkZGVkIiIiCisgICAgICAgIGlmIHNlbGYuY2FuX2FkZChkaXN0KSBhbmQgZGlzdC5oYXNfdmVyc2lvbigpOgorICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksW10pCisgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKKyAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKKyAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBpbiBzZWxmLl9jYWNoZToKKyAgICAgICAgICAgICAgICAgICAgX3NvcnRfZGlzdHMoc2VsZi5fY2FjaGVbZGlzdC5rZXldKQorCisKKyAgICBkZWYgYmVzdF9tYXRjaChzZWxmLCByZXEsIHdvcmtpbmdfc2V0LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIkZpbmQgZGlzdHJpYnV0aW9uIGJlc3QgbWF0Y2hpbmcgYHJlcWAgYW5kIHVzYWJsZSBvbiBgd29ya2luZ19zZXRgCisKKyAgICAgICAgVGhpcyBjYWxscyB0aGUgYGBmaW5kKHJlcSlgYCBtZXRob2Qgb2YgdGhlIGB3b3JraW5nX3NldGAgdG8gc2VlIGlmIGEKKyAgICAgICAgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGlzIGFscmVhZHkgYWN0aXZlLiAgKFRoaXMgbWF5IHJhaXNlCisgICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaWYgYW4gdW5zdWl0YWJsZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKKyAgICAgICAgYWN0aXZlIGluIHRoZSBzcGVjaWZpZWQgYHdvcmtpbmdfc2V0YC4pICBJZiBhIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbgorICAgICAgICBpc24ndCBhY3RpdmUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5ld2VzdCBkaXN0cmlidXRpb24gaW4gdGhlCisgICAgICAgIGVudmlyb25tZW50IHRoYXQgbWVldHMgdGhlIGBgUmVxdWlyZW1lbnRgYCBpbiBgcmVxYC4gIElmIG5vIHN1aXRhYmxlCisgICAgICAgIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwgYW5kIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkLCB0aGVuIHRoZSByZXN1bHQgb2YKKyAgICAgICAgY2FsbGluZyB0aGUgZW52aXJvbm1lbnQncyBgYG9idGFpbihyZXEsIGluc3RhbGxlcilgYCBtZXRob2Qgd2lsbCBiZQorICAgICAgICByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKKyAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBkaXN0CisgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CisgICAgICAgICAgICBpZiBkaXN0IGluIHJlcToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAorICAgICAgICByZXR1cm4gc2VsZi5vYnRhaW4ocmVxLCBpbnN0YWxsZXIpICMgdHJ5IGFuZCBkb3dubG9hZC9pbnN0YWxsCisKKyAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIChlLmcuIHZpYSBkb3dubG9hZCkKKworICAgICAgICBPYnRhaW4gYSBkaXN0cm8gdGhhdCBtYXRjaGVzIHJlcXVpcmVtZW50IChlLmcuIHZpYSBkb3dubG9hZCkuICBJbiB0aGUKKyAgICAgICAgYmFzZSBgYEVudmlyb25tZW50YGAgY2xhc3MsIHRoaXMgcm91dGluZSBqdXN0IHJldHVybnMKKyAgICAgICAgYGBpbnN0YWxsZXIocmVxdWlyZW1lbnQpYGAsIHVubGVzcyBgaW5zdGFsbGVyYCBpcyBOb25lLCBpbiB3aGljaCBjYXNlCisgICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbWV0aG9kIGlzIGEgaG9vayB0aGF0IGFsbG93cyBzdWJjbGFzc2VzCisgICAgICAgIHRvIGF0dGVtcHQgb3RoZXIgd2F5cyBvZiBvYnRhaW5pbmcgYSBkaXN0cmlidXRpb24gYmVmb3JlIGZhbGxpbmcgYmFjaworICAgICAgICB0byB0aGUgYGluc3RhbGxlcmAgYXJndW1lbnQuIiIiCisgICAgICAgIGlmIGluc3RhbGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZXIocmVxdWlyZW1lbnQpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIllpZWxkIHRoZSB1bmlxdWUgcHJvamVjdCBuYW1lcyBvZiB0aGUgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMiIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaXN0bWFwLmtleXMoKToKKyAgICAgICAgICAgIGlmIHNlbGZba2V5XTogeWllbGQga2V5CisKKworCisKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJJbi1wbGFjZSBhZGRpdGlvbiBvZiBhIGRpc3RyaWJ1dGlvbiBvciBlbnZpcm9ubWVudCIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLERpc3RyaWJ1dGlvbik6CisgICAgICAgICAgICBzZWxmLmFkZChvdGhlcikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLEVudmlyb25tZW50KToKKyAgICAgICAgICAgIGZvciBwcm9qZWN0IGluIG90aGVyOgorICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIG90aGVyW3Byb2plY3RdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBhZGQgJXIgdG8gZW52aXJvbm1lbnQiICUgKG90aGVyLCkpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkFkZCBhbiBlbnZpcm9ubWVudCBvciBkaXN0cmlidXRpb24gdG8gYW4gZW52aXJvbm1lbnQiIiIKKyAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQorICAgICAgICBmb3IgZW52IGluIHNlbGYsIG90aGVyOgorICAgICAgICAgICAgbmV3ICs9IGVudgorICAgICAgICByZXR1cm4gbmV3CisKKworQXZhaWxhYmxlRGlzdHJpYnV0aW9ucyA9IEVudmlyb25tZW50ICAgICMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworCitjbGFzcyBFeHRyYWN0aW9uRXJyb3IoUnVudGltZUVycm9yKToKKyAgICAiIiJBbiBlcnJvciBvY2N1cnJlZCBleHRyYWN0aW5nIGEgcmVzb3VyY2UKKworICAgIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGZyb20gaW5zdGFuY2VzIG9mIHRoaXMgZXhjZXB0aW9uOgorCisgICAgbWFuYWdlcgorICAgICAgICBUaGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IHJhaXNlZCB0aGlzIGV4Y2VwdGlvbgorCisgICAgY2FjaGVfcGF0aAorICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGV4dHJhY3Rpb24KKworICAgIG9yaWdpbmFsX2Vycm9yCisgICAgICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgdGhhdCBjYXVzZWQgZXh0cmFjdGlvbiB0byBmYWlsCisgICAgIiIiCisKKworCisKK2NsYXNzIFJlc291cmNlTWFuYWdlcjoKKyAgICAiIiJNYW5hZ2UgcmVzb3VyY2UgZXh0cmFjdGlvbiBhbmQgcGFja2FnZXMiIiIKKyAgICBleHRyYWN0aW9uX3BhdGggPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGVkX2ZpbGVzID0ge30KKworICAgIGRlZiByZXNvdXJjZV9leGlzdHMoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIkRvZXMgdGhlIG5hbWVkIHJlc291cmNlIGV4aXN0PyIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKQorCisgICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYW4gZXhpc3RpbmcgZGlyZWN0b3J5PyIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2lzZGlyKAorICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQorICAgICAgICApCisKKyAgICBkZWYgcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKKyAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2VfZmlsZW5hbWUoCisgICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9zdHJlYW0oc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJlYW0oCisgICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9zdHJpbmcoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIGdldF9wcm92aWRlcihwYWNrYWdlX29yX3JlcXVpcmVtZW50KS5nZXRfcmVzb3VyY2Vfc3RyaW5nKAorICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQorICAgICAgICApCisKKyAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiTGlzdCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIHJlc291cmNlIGRpcmVjdG9yeSIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLnJlc291cmNlX2xpc3RkaXIoCisgICAgICAgICAgICByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiBleHRyYWN0aW9uX2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW1zIGV4dHJhY3RpbmcgZmlsZShzKSIiIgorCisgICAgICAgIG9sZF9leGMgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBjYWNoZV9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQorCisgICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcigiIiJDYW4ndCBleHRyYWN0IGZpbGUocykgdG8gZWdnIGNhY2hlCisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGV4dHJhY3QgZmlsZShzKSB0byB0aGUgUHl0aG9uIGVnZworY2FjaGU6CisKKyAgJXMKKworVGhlIFB5dGhvbiBlZ2cgY2FjaGUgZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBzZXQgdG86CisKKyAgJXMKKworUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBZb3UgY2FuCitjaGFuZ2UgdGhlIGNhY2hlIGRpcmVjdG9yeSBieSBzZXR0aW5nIHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb25tZW50Cit2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KKyIiIiAgICAgICAgICUgKG9sZF9leGMsIGNhY2hlX3BhdGgpCisgICAgICAgICkKKyAgICAgICAgZXJyLm1hbmFnZXIgICAgICAgID0gc2VsZgorICAgICAgICBlcnIuY2FjaGVfcGF0aCAgICAgPSBjYWNoZV9wYXRoCisgICAgICAgIGVyci5vcmlnaW5hbF9lcnJvciA9IG9sZF9leGMKKyAgICAgICAgcmFpc2UgZXJyCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgorICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCisKKyAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCisgICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQorICAgICAgICBlbmNsb3NpbmcgZWdnICh3aGljaCBtYXkgbm90IGJlIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgemlwZmlsZSEpLAorICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKKyAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KKyAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bworICAgICAgICBleHRyYWN0LCBhcyBpdCB0cmFja3MgdGhlIGdlbmVyYXRlZCBuYW1lcyBmb3IgcG9zc2libGUgY2xlYW51cCBsYXRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKKyAgICAgICAgdGFyZ2V0X3BhdGggPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9wYXRoLCBhcmNoaXZlX25hbWUrJy10bXAnLCAqbmFtZXMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9lcnJvcigpCisKKyAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQorICAgICAgICByZXR1cm4gdGFyZ2V0X3BhdGgKKworCisgICAgZGVmIHBvc3Rwcm9jZXNzKHNlbGYsIHRlbXBuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKKworICAgICAgICBUaGlzIGlzIHdoZXJlIE1hYyBoZWFkZXIgcmV3cml0ZXMgc2hvdWxkIGJlIGRvbmU7IG90aGVyIHBsYXRmb3JtcyBkb24ndAorICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCisKKyAgICAgICAgUmVzb3VyY2UgcHJvdmlkZXJzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIE9OTFkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcworICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgorCisgICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKKyAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCisgICAgICAgIHJldHVybnMuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWAorCisKKyAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCisKKyAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQorICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKKyAgICAgICAgaXMgYmFzZWQgb24gdGhlIGBgUFlUSE9OX0VHR19DQUNIRWBgIGVudmlyb25tZW50IHZhcmlhYmxlLCB3aXRoIHZhcmlvdXMKKyAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKKyAgICAgICAgZGV0YWlscy4pCisKKyAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KKyAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQorICAgICAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBidXQgdGhlbiB5b3UgbXVzdCBjYWxsIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHRvCisgICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CisgICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KKworICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKKyAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKKyAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKKworICAgIGRlZiBjbGVhbnVwX3Jlc291cmNlcyhzZWxmLCBmb3JjZT1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKKyAgICAgICAgb2YgdGhlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0aGF0IGNvdWxkIG5vdCBiZSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKKyAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQorICAgICAgICBkaXJlY3RvcnkgZXhjbHVzaXZlIHRvIGEgc2luZ2xlIHByb2Nlc3MuICBUaGlzIG1ldGhvZCBpcyBub3QKKyAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgorICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CisgICAgICAgIGRpcmVjdG9yeSB1c2VkIGZvciBleHRyYWN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYCisKKworCitkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKKyAgICAiIiJEZXRlcm1pbmUgdGhlIGRlZmF1bHQgY2FjaGUgbG9jYXRpb24KKworICAgIFRoaXMgcmV0dXJucyB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldC4KKyAgICBPdGhlcndpc2UsIG9uIFdpbmRvd3MsIGl0IHJldHVybnMgYSAiUHl0aG9uLUVnZ3MiIHN1YmRpcmVjdG9yeSBvZiB0aGUKKyAgICAiQXBwbGljYXRpb24gRGF0YSIgZGlyZWN0b3J5LiAgT24gYWxsIG90aGVyIHN5c3RlbXMsIGl0J3MgIn4vLnB5dGhvbi1lZ2dzIi4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uWydQWVRIT05fRUdHX0NBQ0hFJ10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGlmIG9zLm5hbWUhPSdudCc6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vLnB5dGhvbi1lZ2dzJykKKworICAgIGFwcF9kYXRhID0gJ0FwcGxpY2F0aW9uIERhdGEnICAgIyBYWFggdGhpcyBtYXkgYmUgbG9jYWxlLXNwZWNpZmljIQorICAgIGFwcF9ob21lcyA9IFsKKyAgICAgICAgKCgnQVBQREFUQScsKSwgTm9uZSksICAgICAgICMgYmVzdCBvcHRpb24sIHNob3VsZCBiZSBsb2NhbGUtc2FmZQorICAgICAgICAoKCdVU0VSUFJPRklMRScsKSwgYXBwX2RhdGEpLAorICAgICAgICAoKCdIT01FRFJJVkUnLCdIT01FUEFUSCcpLCBhcHBfZGF0YSksCisgICAgICAgICgoJ0hPTUVQQVRIJywpLCBhcHBfZGF0YSksCisgICAgICAgICgoJ0hPTUUnLCksIE5vbmUpLAorICAgICAgICAoKCdXSU5ESVInLCksIGFwcF9kYXRhKSwgICAgIyA5NS85OC9NRQorICAgIF0KKworICAgIGZvciBrZXlzLCBzdWJkaXIgaW4gYXBwX2hvbWVzOgorICAgICAgICBkaXJuYW1lID0gJycKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgaWYga2V5IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uW2tleV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzdWJkaXI6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLHN1YmRpcikKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ1B5dGhvbi1FZ2dzJykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAiUGxlYXNlIHNldCB0aGUgUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9tZW50IHZhcmlhYmxlIgorICAgICAgICApCisKK2RlZiBzYWZlX25hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKKworICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKKworCitkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCisKKyAgICBTcGFjZXMgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJlY29tZQorICAgIGRhc2hlcywgd2l0aCBydW5zIG9mIG11bHRpcGxlIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KKyAgICAiIiIKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywnLicpCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCisKKworZGVmIHNhZmVfZXh0cmEoZXh0cmEpOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQorCisgICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICdfJywKKyAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKKworCitkZWYgdG9fZmlsZW5hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KKworICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgorICAgICIiIgorICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCdfJykKKworCisKKworCisKKworCitjbGFzcyBOdWxsUHJvdmlkZXI6CisgICAgIiIiVHJ5IHRvIGltcGxlbWVudCByZXNvdXJjZXMgYW5kIG1ldGFkYXRhIGZvciBhcmJpdHJhcnkgUEVQIDMwMiBsb2FkZXJzIiIiCisKKyAgICBlZ2dfbmFtZSA9IE5vbmUKKyAgICBlZ2dfaW5mbyA9IE5vbmUKKyAgICBsb2FkZXIgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlKToKKyAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQorICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gU3RyaW5nSU8oc2VsZi5nZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorCisgICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHlpZWxkX2xpbmVzKHNlbGYuZ2V0X21ldGFkYXRhKG5hbWUpKQorCisgICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYscmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbyxuYW1lKSkKKworCisgICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZixyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCxyZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsbmFtZSk6CisgICAgICAgIGlmIHNlbGYuZWdnX2luZm86CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsc2NyaXB0X25hbWUsbmFtZXNwYWNlKToKKyAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJytzY3JpcHRfbmFtZQorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfbWV0YWRhdGEoc2NyaXB0KToKKyAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigiTm8gc2NyaXB0IG5hbWVkICVyIiAlIHNjcmlwdF9uYW1lKQorICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsJ1xuJykKKyAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsJ1xuJykKKyAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbyxzY3JpcHQpCisgICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgorICAgICAgICAgICAgZXhlY2ZpbGUoc2NyaXB0X2ZpbGVuYW1lLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyb20gbGluZWNhY2hlIGltcG9ydCBjYWNoZQorICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKKyAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCisgICAgICAgICAgICApCisgICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsc2NyaXB0X2ZpbGVuYW1lLCdleGVjJykKKyAgICAgICAgICAgIGV4ZWMgc2NyaXB0X2NvZGUgaW4gbmFtZXNwYWNlLCBuYW1lc3BhY2UKKworICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKKyAgICAgICAgKQorCisgICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCisgICAgICAgICkKKworICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCisgICAgICAgICkKKworICAgIGRlZiBfZm4oc2VsZiwgYmFzZSwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKKworICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShwYXRoKQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCisgICAgICAgICkKKworcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCisKKworY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKKyAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbW9kdWxlKToKKyAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsbW9kdWxlKQorICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQorCisgICAgZGVmIF9zZXR1cF9wcmVmaXgoc2VsZik6CisgICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgorICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKKyAgICAgICAgcGF0aCA9IHNlbGYubW9kdWxlX3BhdGgKKyAgICAgICAgb2xkID0gTm9uZQorICAgICAgICB3aGlsZSBwYXRoIT1vbGQ6CisgICAgICAgICAgICBpZiBwYXRoLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJykKKyAgICAgICAgICAgICAgICBzZWxmLmVnZ19yb290ID0gcGF0aAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvbGQgPSBwYXRoCisgICAgICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorCisKKworCisKKworCisKK2NsYXNzIERlZmF1bHRQcm92aWRlcihFZ2dQcm92aWRlcik6CisgICAgIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIGluIHRoZSBmaWxlc3lzdGVtIiIiCisKKyAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCisKKyAgICBkZWYgX2lzZGlyKHNlbGYscGF0aCk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHBhdGgpCisKKyAgICBkZWYgX2xpc3RkaXIoc2VsZixwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gb3BlbihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSwgJ3JiJykKKworICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgorICAgICAgICBzdHJlYW0gPSBvcGVuKHBhdGgsICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorCityZWdpc3Rlcl9sb2FkZXJfdHlwZSh0eXBlKE5vbmUpLCBEZWZhdWx0UHJvdmlkZXIpCisKKworY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgorICAgICIiIlByb3ZpZGVyIHRoYXQgcmV0dXJucyBub3RoaW5nIGZvciBhbGwgcmVxdWVzdHMiIiIKKworICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZixwYXRoOiBGYWxzZQorICAgIF9nZXQgICAgICAgICAgPSBsYW1iZGEgc2VsZixwYXRoOiAnJworICAgIF9saXN0ZGlyICAgICAgPSBsYW1iZGEgc2VsZixwYXRoOiBbXQorICAgIG1vZHVsZV9wYXRoICAgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKKworCisKKworY2xhc3MgWmlwUHJvdmlkZXIoRWdnUHJvdmlkZXIpOgorICAgICIiIlJlc291cmNlIHN1cHBvcnQgZm9yIHppcHMgYW5kIGVnZ3MiIiIKKworICAgIGVhZ2VycyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgorICAgICAgICBFZ2dQcm92aWRlci5fX2luaXRfXyhzZWxmLG1vZHVsZSkKKyAgICAgICAgc2VsZi56aXBpbmZvID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW3NlbGYubG9hZGVyLmFyY2hpdmVdCisgICAgICAgIHNlbGYuemlwX3ByZSA9IHNlbGYubG9hZGVyLmFyY2hpdmUrb3Muc2VwCisKKyAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgorICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhIHppcGZpbGUgc3VicGF0aAorICAgICAgICAjIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5IGNhY2hlIGZvciBvdXIgdGFyZ2V0IGFyY2hpdmUKKyAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKKyAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsc2VsZi56aXBfcHJlKQorICAgICAgICApCisKKyAgICBkZWYgX3BhcnRzKHNlbGYsemlwX3BhdGgpOgorICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0IGxpc3QKKyAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlK3ppcF9wYXRoICAjIHBzZXVkby1mcyBwYXRoCisgICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuZWdnX3Jvb3Qrb3Muc2VwKToKKyAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuZWdnX3Jvb3QpKzE6XS5zcGxpdChvcy5zZXApCisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCxzZWxmLmVnZ19yb290KQorICAgICAgICApCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfbmFtZToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICAgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdCAuemlwIgorICAgICAgICAgICAgKQorICAgICAgICAjIG5vIG5lZWQgdG8gbG9jayBmb3IgZXh0cmFjdGlvbiwgc2luY2Ugd2UgdXNlIHRlbXAgbmFtZXMKKyAgICAgICAgemlwX3BhdGggPSBzZWxmLl9yZXNvdXJjZV90b196aXAocmVzb3VyY2VfbmFtZSkKKyAgICAgICAgZWFnZXJzID0gc2VsZi5fZ2V0X2VhZ2VyX3Jlc291cmNlcygpCisgICAgICAgIGlmICcvJy5qb2luKHNlbGYuX3BhcnRzKHppcF9wYXRoKSkgaW4gZWFnZXJzOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZWFnZXJzOgorICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgc2VsZi5fZWFnZXJfdG9femlwKG5hbWUpKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCB6aXBfcGF0aCkKKworICAgIGRlZiBfZXh0cmFjdF9yZXNvdXJjZShzZWxmLCBtYW5hZ2VyLCB6aXBfcGF0aCk6CisKKyAgICAgICAgaWYgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2luZGV4KClbemlwX3BhdGhdOgorICAgICAgICAgICAgICAgIGxhc3QgPSBzZWxmLl9leHRyYWN0X3Jlc291cmNlKAorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLCBvcy5wYXRoLmpvaW4oemlwX3BhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShsYXN0KSAgIyByZXR1cm4gdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgbmFtZQorCisgICAgICAgIHppcF9zdGF0ID0gc2VsZi56aXBpbmZvW3ppcF9wYXRoXQorICAgICAgICB0LGQsc2l6ZSA9IHppcF9zdGF0WzVdLCB6aXBfc3RhdFs2XSwgemlwX3N0YXRbM10KKyAgICAgICAgZGF0ZV90aW1lID0gKAorICAgICAgICAgICAgKGQ+PjkpKzE5ODAsIChkPj41KSYweEYsIGQmMHgxRiwgICAgICAgICAgICAgICAgICAgICAgIyB5bWQKKyAgICAgICAgICAgICh0JjB4RkZGRik+PjExLCAodD4+NSkmMHgzRiwgKHQmMHgxRikgKiAyLCAwLCAwLCAtMSAgICMgaG1zLCBldGMuCisgICAgICAgICkKKyAgICAgICAgdGltZXN0YW1wID0gdGltZS5ta3RpbWUoZGF0ZV90aW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlYWxfcGF0aCA9IG1hbmFnZXIuZ2V0X2NhY2hlX3BhdGgoCisgICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSwgc2VsZi5fcGFydHMoemlwX3BhdGgpCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CisgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQocmVhbF9wYXRoKQorICAgICAgICAgICAgICAgIGlmIHN0YXQuc3Rfc2l6ZT09c2l6ZSBhbmQgc3RhdC5zdF9tdGltZT09dGltZXN0YW1wOgorICAgICAgICAgICAgICAgICAgICAjIHNpemUgYW5kIHN0YW1wIG1hdGNoLCBkb24ndCBib3RoZXIgZXh0cmFjdGluZworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCisKKyAgICAgICAgICAgIG91dGYsIHRtcG5hbSA9IF9ta3N0ZW1wKCIuJGV4dHJhY3QiLCBkaXI9b3MucGF0aC5kaXJuYW1lKHJlYWxfcGF0aCkpCisgICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCisgICAgICAgICAgICBvcy5jbG9zZShvdXRmKQorICAgICAgICAgICAgdXRpbWUodG1wbmFtLCAodGltZXN0YW1wLHRpbWVzdGFtcCkpCisgICAgICAgICAgICBtYW5hZ2VyLnBvc3Rwcm9jZXNzKHRtcG5hbSwgcmVhbF9wYXRoKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQorCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQocmVhbF9wYXRoKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXQuc3Rfc2l6ZT09c2l6ZSBhbmQgc3RhdC5zdF9tdGltZT09dGltZXN0YW1wOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaXplIGFuZCBzdGFtcCBtYXRjaCwgc29tZWJvZHkgZGlkIGl0IGp1c3QgYWhlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdXMsIHNvIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5uYW1lPT0nbnQnOiAgICAgIyBXaW5kb3dzLCBkZWwgb2xkIGZpbGUgYW5kIHJldHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgbWFuYWdlci5leHRyYWN0aW9uX2Vycm9yKCkgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgorCisgICAgICAgIHJldHVybiByZWFsX3BhdGgKKworICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lYWdlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGVhZ2VycyA9IFtdCisgICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCisgICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycworICAgICAgICByZXR1cm4gc2VsZi5lYWdlcnMKKworICAgIGRlZiBfaW5kZXgoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBpbmQgPSB7fQorICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgorICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCisgICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XS5hcHBlbmQocGFydHNbLTFdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdID0gW3BhcnRzLnBvcCgpXQorICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKKyAgICAgICAgICAgIHJldHVybiBpbmQKKworICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CisgICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKKyAgICAgICAgcmV0dXJuIHppcF9wYXRoIGluIHNlbGYuemlwaW5mbyBvciB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpCisKKyAgICBkZWYgX2lzZGlyKHNlbGYsZnNwYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKKworICAgIGRlZiBfbGlzdGRpcihzZWxmLGZzcGF0aCk6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCisKKyAgICBkZWYgX2VhZ2VyX3RvX3ppcChzZWxmLHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYuZWdnX3Jvb3QscmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgscmVzb3VyY2VfbmFtZSkpCisKK3JlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBGaWxlTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CisgICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcworCisgICAgVXNhZ2U6OgorCisgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCisKKyAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCisgICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CisgICAgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYscGF0aCk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWU9PSdQS0ctSU5GTycKKworICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgaWYgbmFtZT09J1BLRy1JTkZPJzoKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHNlbGYucGF0aCwnclUnKS5yZWFkKCkKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIG1ldGFkYXRhIGV4Y2VwdCBQS0ctSU5GTyBpcyBhdmFpbGFibGUiKQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFBhdGhNZXRhZGF0YShEZWZhdWx0UHJvdmlkZXIpOgorICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciBlZ2cgZGlyZWN0b3JpZXMKKworICAgIFVzYWdlOjoKKworICAgICAgICAjIERldmVsb3BtZW50IGVnZ3M6CisKKyAgICAgICAgZWdnX2luZm8gPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUuZWdnLWluZm8iCisgICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQorICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShiYXNlX2RpciwgZWdnX2luZm8pCisgICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYmFzZWRpcixwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLG1ldGFkYXRhPW1ldGFkYXRhKQorCisgICAgICAgICMgVW5wYWNrZWQgZWdnIGRpcmVjdG9yaWVzOgorCisgICAgICAgIGVnZ19wYXRoID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLXZlci1weXZlci1ldGMuZWdnIgorICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLCdFR0ctSU5GTycpKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlZ2dfaW5mbyk6CisgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBwYXRoCisgICAgICAgIHNlbGYuZWdnX2luZm8gPSBlZ2dfaW5mbworCisKK2NsYXNzIEVnZ01ldGFkYXRhKFppcFByb3ZpZGVyKToKKyAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgLmVnZyBmaWxlcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGltcG9ydGVyKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWV0YWRhdGEgcHJvdmlkZXIgZnJvbSBhIHppcGltcG9ydGVyIiIiCisKKyAgICAgICAgc2VsZi56aXBpbmZvID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2ltcG9ydGVyLmFyY2hpdmVdCisgICAgICAgIHNlbGYuemlwX3ByZSA9IGltcG9ydGVyLmFyY2hpdmUrb3Muc2VwCisgICAgICAgIHNlbGYubG9hZGVyID0gaW1wb3J0ZXIKKyAgICAgICAgaWYgaW1wb3J0ZXIucHJlZml4OgorICAgICAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihpbXBvcnRlci5hcmNoaXZlLCBpbXBvcnRlci5wcmVmaXgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gaW1wb3J0ZXIuYXJjaGl2ZQorICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQorCisKKworX2Rpc3RyaWJ1dGlvbl9maW5kZXJzID0ge30KKworZGVmIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRlcl90eXBlLCBkaXN0cmlidXRpb25fZmluZGVyKToKKyAgICAiIiJSZWdpc3RlciBgZGlzdHJpYnV0aW9uX2ZpbmRlcmAgdG8gZmluZCBkaXN0cmlidXRpb25zIGluIHN5cy5wYXRoIGl0ZW1zCisKKyAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KKyAgICBoYW5kbGVyKSwgYW5kIGBkaXN0cmlidXRpb25fZmluZGVyYCBpcyBhIGNhbGxhYmxlIHRoYXQsIHBhc3NlZCBhIHBhdGgKKyAgICBpdGVtIGFuZCB0aGUgaW1wb3J0ZXIgaW5zdGFuY2UsIHlpZWxkcyBgYERpc3RyaWJ1dGlvbmBgIGluc3RhbmNlcyBmb3VuZCBvbgorICAgIHRoYXQgcGF0aCBpdGVtLiAgU2VlIGBgcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGhgYCBmb3IgYW4gZXhhbXBsZS4iIiIKKyAgICBfZGlzdHJpYnV0aW9uX2ZpbmRlcnNbaW1wb3J0ZXJfdHlwZV0gPSBkaXN0cmlidXRpb25fZmluZGVyCisKKworZGVmIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSB2aWEgYHBhdGhfaXRlbWAiIiIKKyAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCisgICAgZmluZGVyID0gX2ZpbmRfYWRhcHRlcihfZGlzdHJpYnV0aW9uX2ZpbmRlcnMsIGltcG9ydGVyKQorICAgIHJldHVybiBmaW5kZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seSkKKworZGVmIGZpbmRfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoaW1wb3J0ZXIpCisgICAgaWYgbWV0YWRhdGEuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgorICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShwYXRoX2l0ZW0sIG1ldGFkYXRhPW1ldGFkYXRhKQorICAgIGlmIG9ubHk6CisgICAgICAgIHJldHVybiAgIyBkb24ndCB5aWVsZCBuZXN0ZWQgZGlzdHJvcworICAgIGZvciBzdWJpdGVtIGluIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoJy8nKToKKyAgICAgICAgaWYgc3ViaXRlbS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCisgICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpOgorICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKKworcmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmluZF9pbl96aXApCisKK2RlZiBTdHJpbmdJTygqYXJncywgKiprdyk6CisgICAgIiIiVGh1bmsgdG8gbG9hZCB0aGUgcmVhbCBTdHJpbmdJTyBvbiBkZW1hbmQiIiIKKyAgICBnbG9iYWwgU3RyaW5nSU8KKyAgICB0cnk6CisgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICByZXR1cm4gU3RyaW5nSU8oKmFyZ3MsKiprdykKKworZGVmIGZpbmRfbm90aGluZyhpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKKyAgICByZXR1cm4gKCkKK3JlZ2lzdGVyX2ZpbmRlcihvYmplY3QsZmluZF9ub3RoaW5nKQorCitkZWYgZmluZF9vbl9wYXRoKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSBvbiBhIHN5cy5wYXRoIGRpcmVjdG9yeSIiIgorICAgIHBhdGhfaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKHBhdGhfaXRlbSkKKworICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aF9pdGVtKToKKyAgICAgICAgaWYgcGF0aF9pdGVtLmxvd2VyKCkuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICMgdW5wYWNrZWQgZWdnCisgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG1ldGFkYXRhPVBhdGhNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLCBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCdFR0ctSU5GTycpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CisgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihwYXRoX2l0ZW0pOgorICAgICAgICAgICAgICAgIGxvd2VyID0gZW50cnkubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKKyAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxscGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGVnZy1pbmZvIGRpcmVjdG9yeSwgYWxsb3cgZ2V0dGluZyBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEocGF0aF9pdGVtLCBmdWxscGF0aCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKGZ1bGxwYXRoKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSxlbnRyeSxtZXRhZGF0YSxwcmVjZWRlbmNlPURFVkVMT1BfRElTVAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2cnKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CisgICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmaWxlKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdHJpcCgpOiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZmluZF9kaXN0cmlidXRpb25zKGxpbmUucnN0cmlwKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKKworX25hbWVzcGFjZV9oYW5kbGVycyA9IHt9CitfbmFtZXNwYWNlX3BhY2thZ2VzID0ge30KKworZGVmIHJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyX3R5cGUsIG5hbWVzcGFjZV9oYW5kbGVyKToKKyAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCisKKyAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KKyAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgorCisgICAgICAgIGRlZiBuYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcixwYXRoX2VudHJ5LG1vZHVsZU5hbWUsbW9kdWxlKToKKyAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCisKKyAgICBOYW1lc3BhY2UgaGFuZGxlcnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBpbXBvcnRlciBvYmplY3QgaGFzIGFscmVhZHkKKyAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CisgICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgorICAgIGVxdWl2YWxlbnQgc3VicGF0aC4gIEZvciBhbiBleGFtcGxlIG5hbWVzcGFjZSBoYW5kbGVyLCBzZWUKKyAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCisgICAgIiIiCisgICAgX25hbWVzcGFjZV9oYW5kbGVyc1tpbXBvcnRlcl90eXBlXSA9IG5hbWVzcGFjZV9oYW5kbGVyCisKK2RlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgorICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgorICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKKyAgICBpZiBpbXBvcnRlciBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQorICAgIGlmIGxvYWRlciBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKKyAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gbmV3Lm1vZHVsZShwYWNrYWdlTmFtZSkKKyAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW107IF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQorICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCdfX3BhdGhfXycpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCisgICAgaGFuZGxlciA9IF9maW5kX2FkYXB0ZXIoX25hbWVzcGFjZV9oYW5kbGVycywgaW1wb3J0ZXIpCisgICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIscGF0aF9pdGVtLHBhY2thZ2VOYW1lLG1vZHVsZSkKKyAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fOyBwYXRoLmFwcGVuZChzdWJwYXRoKQorICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUocGFja2FnZU5hbWUpOyBtb2R1bGUuX19wYXRoX18gPSBwYXRoCisgICAgcmV0dXJuIHN1YnBhdGgKKworZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKKyAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKKworICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgIHRyeToKKyAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBhdGgsIHBhcmVudCA9IHN5cy5wYXRoLCBOb25lCisgICAgICAgIGlmICcuJyBpbiBwYWNrYWdlTmFtZToKKyAgICAgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbOi0xXSkKKyAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKKyAgICAgICAgICAgIF9faW1wb3J0X18ocGFyZW50KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKKworICAgICAgICAjIFRyYWNrIHdoYXQgcGFja2FnZXMgYXJlIG5hbWVzcGFjZXMsIHNvIHdoZW4gbmV3IHBhdGggaXRlbXMgYXJlIGFkZGVkLAorICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKKyAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCxbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQorICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsW10pCisKKyAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgorICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAorICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CisgICAgICAgICAgICBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pCisKKyAgICBmaW5hbGx5OgorICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKworZGVmIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhwYXRoX2l0ZW0sIHBhcmVudD1Ob25lKToKKyAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgorICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgIHRyeToKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gX25hbWVzcGFjZV9wYWNrYWdlcy5nZXQocGFyZW50LCgpKToKKyAgICAgICAgICAgIHN1YnBhdGggPSBfaGFuZGxlX25zKHBhY2thZ2UsIHBhdGhfaXRlbSkKKyAgICAgICAgICAgIGlmIHN1YnBhdGg6IGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzdWJwYXRoLHBhY2thZ2UpCisgICAgZmluYWxseToKKyAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisKK2RlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CisgICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCisKKyAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCisgICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCisgICAgZm9yIGl0ZW0gaW4gbW9kdWxlLl9fcGF0aF9fOgorICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKT09bm9ybWFsaXplZDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCisgICAgICAgIHJldHVybiBzdWJwYXRoCisKK3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKK3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQorCisKK2RlZiBudWxsX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CisgICAgcmV0dXJuIE5vbmUKKworcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LG51bGxfbnNfaGFuZGxlcikKKworCitkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgorICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKKyAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKSkKKworZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLF9jYWNoZT17fSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSk6CisgICAgcGFydHMgPSBwYWNrYWdlTmFtZS5zcGxpdCgnLicpCisgICAgbmFtZSA9IHBhcnRzLnBvcCgpCisgICAgaWYgcGFydHM6CisgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhcnRzKQorICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW3BhcmVudF0sIG5hbWUsIHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSkKKworCitkZWYgeWllbGRfbGluZXMoc3Rycyk6CisgICAgIiIiWWllbGQgbm9uLWVtcHR5L25vbi1jb21tZW50IGxpbmVzIG9mIGEgYGBiYXNlc3RyaW5nYGAgb3Igc2VxdWVuY2UiIiIKKyAgICBpZiBpc2luc3RhbmNlKHN0cnMsYmFzZXN0cmluZyk6CisgICAgICAgIGZvciBzIGluIHN0cnMuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgcyA9IHMuc3RyaXAoKQorICAgICAgICAgICAgaWYgcyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnIycpOiAgICAgIyBza2lwIGJsYW5rIGxpbmVzL2NvbW1lbnRzCisgICAgICAgICAgICAgICAgeWllbGQgcworICAgIGVsc2U6CisgICAgICAgIGZvciBzcyBpbiBzdHJzOgorICAgICAgICAgICAgZm9yIHMgaW4geWllbGRfbGluZXMoc3MpOgorICAgICAgICAgICAgICAgIHlpZWxkIHMKKworTElORV9FTkQgPSByZS5jb21waWxlKHIiXHMqKCMuKik/JCIpLm1hdGNoICAgICAgICAgIyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50CitDT05USU5VRSA9IHJlLmNvbXBpbGUociJccypcXFxzKigjLiopPyQiKS5tYXRjaCAgICAjIGxpbmUgY29udGludWF0aW9uCitESVNUUk8gICA9IHJlLmNvbXBpbGUociJccyooKFx3fFstLl0pKykiKS5tYXRjaCAgICAjIERpc3RyaWJ1dGlvbiBvciBleHRyYQorVkVSU0lPTiAgPSByZS5jb21waWxlKHIiXHMqKDw9P3w+PT98PT18IT0pXHMqKChcd3xbLS5dKSspIikubWF0Y2ggICMgdmVyLiBpbmZvCitDT01NQSAgICA9IHJlLmNvbXBpbGUociJccyosIikubWF0Y2ggICAgICAgICAgICAgICAjIGNvbW1hIGJldHdlZW4gaXRlbXMKK09CUkFDS0VUID0gcmUuY29tcGlsZShyIlxzKlxbIikubWF0Y2gKK0NCUkFDS0VUID0gcmUuY29tcGlsZShyIlxzKlxdIikubWF0Y2gKK01PRFVMRSAgID0gcmUuY29tcGlsZShyIlx3KyhcLlx3KykqJCIpLm1hdGNoCitFR0dfTkFNRSA9IHJlLmNvbXBpbGUoCisgICAgciIoP1A8bmFtZT5bXi1dKykiCisgICAgciIoIC0oP1A8dmVyPlteLV0rKSAoLXB5KD9QPHB5dmVyPlteLV0rKSAoLSg/UDxwbGF0Pi4rKSk/ICk/ICk/IiwKKyAgICByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRQorKS5tYXRjaAorCitjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwufCAtKScsIHJlLlZFUkJPU0UpCityZXBsYWNlID0geydwcmUnOidjJywgJ3ByZXZpZXcnOidjJywnLSc6J2ZpbmFsLScsJ3JjJzonYyd9LmdldAorCitkZWYgX3BhcnNlX3ZlcnNpb25fcGFydHMocyk6CisgICAgZm9yIHBhcnQgaW4gY29tcG9uZW50X3JlLnNwbGl0KHMpOgorICAgICAgICBwYXJ0ID0gcmVwbGFjZShwYXJ0LHBhcnQpCisgICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQ9PScuJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHBhcnRbOjFdIGluICcwMTIzNDU2Nzg5JzoKKyAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgJyonK3BhcnQKKworICAgIHlpZWxkICcqZmluYWwnICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKKworZGVmIHBhcnNlX3ZlcnNpb24ocyk6CisgICAgIiIiQ29udmVydCBhIHZlcnNpb24gc3RyaW5nIHRvIGEgY2hyb25vbG9naWNhbGx5LXNvcnRhYmxlIGtleQorCisgICAgVGhpcyBpcyBhIHJvdWdoIGNyb3NzIGJldHdlZW4gZGlzdHV0aWxzJyBTdHJpY3RWZXJzaW9uIGFuZCBMb29zZVZlcnNpb247CisgICAgaWYgeW91IGdpdmUgaXQgdmVyc2lvbnMgdGhhdCB3b3VsZCB3b3JrIHdpdGggU3RyaWN0VmVyc2lvbiwgdGhlbiBpdCBiZWhhdmVzCisgICAgdGhlIHNhbWU7IG90aGVyd2lzZSBpdCBhY3RzIGxpa2UgYSBzbGlnaHRseS1zbWFydGVyIExvb3NlVmVyc2lvbi4gSXQgaXMKKyAgICAqcG9zc2libGUqIHRvIGNyZWF0ZSBwYXRob2xvZ2ljYWwgdmVyc2lvbiBjb2Rpbmcgc2NoZW1lcyB0aGF0IHdpbGwgZm9vbAorICAgIHRoaXMgcGFyc2VyLCBidXQgdGhleSBzaG91bGQgYmUgdmVyeSByYXJlIGluIHByYWN0aWNlLgorCisgICAgVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgYSB0dXBsZSBvZiBzdHJpbmdzLiAgTnVtZXJpYyBwb3J0aW9ucyBvZiB0aGUKKyAgICB2ZXJzaW9uIGFyZSBwYWRkZWQgdG8gOCBkaWdpdHMgc28gdGhleSB3aWxsIGNvbXBhcmUgbnVtZXJpY2FsbHksIGJ1dAorICAgIHdpdGhvdXQgcmVseWluZyBvbiBob3cgbnVtYmVycyBjb21wYXJlIHJlbGF0aXZlIHRvIHN0cmluZ3MuICBEb3RzIGFyZQorICAgIGRyb3BwZWQsIGJ1dCBkYXNoZXMgYXJlIHJldGFpbmVkLiAgVHJhaWxpbmcgemVyb3MgYmV0d2VlbiBhbHBoYSBzZWdtZW50cworICAgIG9yIGRhc2hlcyBhcmUgc3VwcHJlc3NlZCwgc28gdGhhdCBlLmcuICIyLjQuMCIgaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcworICAgICIyLjQiLiBBbHBoYW51bWVyaWMgcGFydHMgYXJlIGxvd2VyLWNhc2VkLgorCisgICAgVGhlIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgc3RyaW5ncyBsaWtlICItIiBhbmQgYW55IGFscGhhIHN0cmluZyB0aGF0CisgICAgYWxwaGFiZXRpY2FsbHkgZm9sbG93cyAiZmluYWwiICByZXByZXNlbnRzIGEgInBhdGNoIGxldmVsIi4gIFNvLCAiMi40LTEiCisgICAgaXMgYXNzdW1lZCB0byBiZSBhIGJyYW5jaCBvciBwYXRjaCBvZiAiMi40IiwgYW5kIHRoZXJlZm9yZSAiMi40LjEiIGlzCisgICAgY29uc2lkZXJlZCBuZXdlciB0aGFuICIyLjQtMSIsIHdoaWMgaW4gdHVybiBpcyBuZXdlciB0aGFuICIyLjQiLgorCisgICAgU3RyaW5ncyBsaWtlICJhIiwgImIiLCAiYyIsICJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIgYW5kIHNvIG9uICh0aGF0CisgICAgY29tZSBiZWZvcmUgImZpbmFsIiBhbHBoYWJldGljYWxseSkgYXJlIGFzc3VtZWQgdG8gYmUgcHJlLXJlbGVhc2UgdmVyc2lvbnMsCisgICAgc28gdGhhdCB0aGUgdmVyc2lvbiAiMi40IiBpcyBjb25zaWRlcmVkIG5ld2VyIHRoYW4gIjIuNGExIi4KKworICAgIEZpbmFsbHksIHRvIGhhbmRsZSBtaXNjZWxsYW5lb3VzIGNhc2VzLCB0aGUgc3RyaW5ncyAicHJlIiwgInByZXZpZXciLCBhbmQKKyAgICAicmMiIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSAiYyIsIGkuZS4gYXMgdGhvdWdoIHRoZXkgd2VyZSByZWxlYXNlCisgICAgY2FuZGlkYXRlcywgYW5kIHRoZXJlZm9yZSBhcmUgbm90IGFzIG5ldyBhcyBhIHZlcnNpb24gc3RyaW5nIHRoYXQgZG9lcyBub3QKKyAgICBjb250YWluIHRoZW0uCisgICAgIiIiCisgICAgcGFydHMgPSBbXQorICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMubG93ZXIoKSk6CisgICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgnKicpOgorICAgICAgICAgICAgaWYgcGFydDwnKmZpbmFsJzogICAjIHJlbW92ZSAnLScgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKKyAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdPT0nKmZpbmFsLSc6IHBhcnRzLnBvcCgpCisgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKKyAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV09PScwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKKyAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCisgICAgcmV0dXJuIHR1cGxlKHBhcnRzKQorCitjbGFzcyBFbnRyeVBvaW50KG9iamVjdCk6CisgICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhbiBhZHZlcnRpc2VkIGltcG9ydGFibGUgb2JqZWN0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kdWxlX25hbWUsIGF0dHJzPSgpLCBleHRyYXM9KCksIGRpc3Q9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBNT0RVTEUobW9kdWxlX25hbWUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBtb2R1bGUgbmFtZSIsIG1vZHVsZV9uYW1lKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZQorICAgICAgICBzZWxmLmF0dHJzID0gdHVwbGUoYXR0cnMpCisgICAgICAgIHNlbGYuZXh0cmFzID0gUmVxdWlyZW1lbnQucGFyc2UoKCJ4WyVzXSIgJSAnLCcuam9pbihleHRyYXMpKSkuZXh0cmFzCisgICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgaWYgc2VsZi5hdHRyczoKKyAgICAgICAgICAgIHMgKz0gJzonICsgJy4nLmpvaW4oc2VsZi5hdHRycykKKyAgICAgICAgaWYgc2VsZi5leHRyYXM6CisgICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJFbnRyeVBvaW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKKworICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgaWYgcmVxdWlyZTogc2VsZi5yZXF1aXJlKGVudiwgaW5zdGFsbGVyKQorICAgICAgICBlbnRyeSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZ2xvYmFscygpLGdsb2JhbHMoKSwgWydfX25hbWVfXyddKQorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGVudHJ5ID0gZ2V0YXR0cihlbnRyeSxhdHRyKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCIlciBoYXMgbm8gJXIgYXR0cmlidXRlIiAlIChlbnRyeSxhdHRyKSkKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgcmVxdWlyZShzZWxmLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKKyAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQorICAgICAgICBtYXAod29ya2luZ19zZXQuYWRkLAorICAgICAgICAgICAgd29ya2luZ19zZXQucmVzb2x2ZShzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpLGVudixpbnN0YWxsZXIpKQorCisKKworICAgICNAY2xhc3NtZXRob2QKKyAgICBkZWYgcGFyc2UoY2xzLCBzcmMsIGRpc3Q9Tm9uZSk6CisgICAgICAgICIiIlBhcnNlIGEgc2luZ2xlIGVudHJ5IHBvaW50IGZyb20gc3RyaW5nIGBzcmNgCisKKyAgICAgICAgRW50cnkgcG9pbnQgc3ludGF4IGZvbGxvd3MgdGhlIGZvcm06OgorCisgICAgICAgICAgICBuYW1lID0gc29tZS5tb2R1bGU6c29tZS5hdHRyIFtleHRyYTEsZXh0cmEyXQorCisgICAgICAgIFRoZSBlbnRyeSBuYW1lIGFuZCBtb2R1bGUgbmFtZSBhcmUgcmVxdWlyZWQsIGJ1dCB0aGUgYGA6YXR0cnNgYCBhbmQKKyAgICAgICAgYGBbZXh0cmFzXWBgIHBhcnRzIGFyZSBvcHRpb25hbAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXR0cnMgPSBleHRyYXMgPSAoKQorICAgICAgICAgICAgbmFtZSx2YWx1ZSA9IHNyYy5zcGxpdCgnPScsMSkKKyAgICAgICAgICAgIGlmICdbJyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSxleHRyYXMgPSB2YWx1ZS5zcGxpdCgnWycsMSkKKyAgICAgICAgICAgICAgICByZXEgPSBSZXF1aXJlbWVudC5wYXJzZSgieFsiK2V4dHJhcykKKyAgICAgICAgICAgICAgICBpZiByZXEuc3BlY3M6IHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgICAgICBleHRyYXMgPSByZXEuZXh0cmFzCisgICAgICAgICAgICBpZiAnOicgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUsYXR0cnMgPSB2YWx1ZS5zcGxpdCgnOicsMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgTU9EVUxFKGF0dHJzLnJzdHJpcCgpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgICAgIGF0dHJzID0gYXR0cnMucnN0cmlwKCkuc3BsaXQoJy4nKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgIkVudHJ5UG9pbnQgbXVzdCBiZSBpbiAnbmFtZT1tb2R1bGU6YXR0cnMgW2V4dHJhc10nIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgc3JjCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2xzKG5hbWUuc3RyaXAoKSwgdmFsdWUubHN0cmlwKCksIGF0dHJzLCBleHRyYXMsIGRpc3QpCisKKyAgICBwYXJzZSA9IGNsYXNzbWV0aG9kKHBhcnNlKQorCisKKworCisKKworCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlX2dyb3VwKGNscywgZ3JvdXAsIGxpbmVzLCBkaXN0PU5vbmUpOgorICAgICAgICAiIiJQYXJzZSBhbiBlbnRyeSBwb2ludCBncm91cCIiIgorICAgICAgICBpZiBub3QgTU9EVUxFKGdyb3VwKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZ3JvdXAgbmFtZSIsIGdyb3VwKQorICAgICAgICB0aGlzID0ge30KKyAgICAgICAgZm9yIGxpbmUgaW4geWllbGRfbGluZXMobGluZXMpOgorICAgICAgICAgICAgZXAgPSBjbHMucGFyc2UobGluZSwgZGlzdCkKKyAgICAgICAgICAgIGlmIGVwLm5hbWUgaW4gdGhpczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEdXBsaWNhdGUgZW50cnkgcG9pbnQiLCBncm91cCwgZXAubmFtZSkKKyAgICAgICAgICAgIHRoaXNbZXAubmFtZV09ZXAKKyAgICAgICAgcmV0dXJuIHRoaXMKKworICAgIHBhcnNlX2dyb3VwID0gY2xhc3NtZXRob2QocGFyc2VfZ3JvdXApCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlX21hcChjbHMsIGRhdGEsIGRpc3Q9Tm9uZSk6CisgICAgICAgICIiIlBhcnNlIGEgbWFwIG9mIGVudHJ5IHBvaW50IGdyb3VwcyIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsZGljdCk6CisgICAgICAgICAgICBkYXRhID0gZGF0YS5pdGVtcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gc3BsaXRfc2VjdGlvbnMoZGF0YSkKKyAgICAgICAgbWFwcyA9IHt9CisgICAgICAgIGZvciBncm91cCwgbGluZXMgaW4gZGF0YToKKyAgICAgICAgICAgIGlmIGdyb3VwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmVzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkVudHJ5IHBvaW50cyBtdXN0IGJlIGxpc3RlZCBpbiBncm91cHMiKQorICAgICAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCisgICAgICAgICAgICBpZiBncm91cCBpbiBtYXBzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBncm91cCBuYW1lIiwgZ3JvdXApCisgICAgICAgICAgICBtYXBzW2dyb3VwXSA9IGNscy5wYXJzZV9ncm91cChncm91cCwgbGluZXMsIGRpc3QpCisgICAgICAgIHJldHVybiBtYXBzCisKKyAgICBwYXJzZV9tYXAgPSBjbGFzc21ldGhvZChwYXJzZV9tYXApCisKKworCisKKworCitjbGFzcyBEaXN0cmlidXRpb24ob2JqZWN0KToKKyAgICAiIiJXcmFwIGFuIGFjdHVhbCBvciBwb3RlbnRpYWwgc3lzLnBhdGggZW50cnkgdy9tZXRhZGF0YSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwgdmVyc2lvbj1Ob25lLAorICAgICAgICBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLCBwcmVjZWRlbmNlID0gRUdHX0RJU1QKKyAgICApOgorICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbih2ZXJzaW9uKQorICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCisgICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KKyAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQorICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fbG9jYXRpb24oY2xzLGxvY2F0aW9uLGJhc2VuYW1lLG1ldGFkYXRhPU5vbmUsKiprdyk6CisgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBbTm9uZV0qNAorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKKyAgICAgICAgaWYgZXh0Lmxvd2VyKCkgaW4gKCIuZWdnIiwiLmVnZy1pbmZvIik6CisgICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAorICAgICAgICAgICAgICAgICAgICAnbmFtZScsJ3ZlcicsJ3B5dmVyJywncGxhdCcKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBjbHMoCisgICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcGxhdGZvcm09cGxhdGZvcm0sICoqa3cKKyAgICAgICAgKQorICAgIGZyb21fbG9jYXRpb24gPSBjbGFzc21ldGhvZChmcm9tX2xvY2F0aW9uKQorCisgICAgaGFzaGNtcCA9IHByb3BlcnR5KAorICAgICAgICBsYW1iZGEgc2VsZjogKAorICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCdwYXJzZWRfdmVyc2lvbicsKCkpLCBzZWxmLnByZWNlZGVuY2UsIHNlbGYua2V5LAorICAgICAgICAgICAgLWxlbihzZWxmLmxvY2F0aW9uIG9yICcnKSwgc2VsZi5sb2NhdGlvbiwgc2VsZi5weV92ZXJzaW9uLAorICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybQorICAgICAgICApCisgICAgKQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIGNtcChzZWxmLmhhc2hjbXAsIG90aGVyKQorICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQorCisgICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKKyAgICAjIG1ldGFkYXRhIHVudGlsL3VubGVzcyBpdCdzIGFjdHVhbGx5IG5lZWRlZC4gIChpLmUuLCBzb21lIGRpc3RyaWJ1dGlvbnMKKyAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQorCisgICAgI0Bwcm9wZXJ0eQorICAgIGRlZiBrZXkoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5fa2V5ID0ga2V5ID0gc2VsZi5wcm9qZWN0X25hbWUubG93ZXIoKQorICAgICAgICAgICAgcmV0dXJuIGtleQorICAgIGtleSA9IHByb3BlcnR5KGtleSkKKworICAgICNAcHJvcGVydHkKKyAgICBkZWYgcGFyc2VkX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9wYXJzZWRfdmVyc2lvbiA9IHB2ID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCisgICAgICAgICAgICByZXR1cm4gcHYKKworICAgIHBhcnNlZF92ZXJzaW9uID0gcHJvcGVydHkocGFyc2VkX3ZlcnNpb24pCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIHZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnUEtHLUlORk8nKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgndmVyc2lvbjonKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNhZmVfdmVyc2lvbihsaW5lLnNwbGl0KCc6JywxKVsxXS5zdHJpcCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyAnVmVyc2lvbjonIGhlYWRlciBhbmQvb3IgUEtHLUlORk8gZmlsZSIsIHNlbGYKKyAgICAgICAgICAgICAgICApCisgICAgdmVyc2lvbiA9IHByb3BlcnR5KHZlcnNpb24pCisKKworCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIF9kZXBfbWFwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KKyAgICAgICAgICAgIGZvciBuYW1lIGluICdyZXF1aXJlcy50eHQnLCAnZGVwZW5kcy50eHQnOgorICAgICAgICAgICAgICAgIGZvciBleHRyYSxyZXFzIGluIHNwbGl0X3NlY3Rpb25zKHNlbGYuX2dldF9tZXRhZGF0YShuYW1lKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOiBleHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEpCisgICAgICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCisgICAgICAgICAgICByZXR1cm4gZG0KKyAgICBfZGVwX21hcCA9IHByb3BlcnR5KF9kZXBfbWFwKQorCisgICAgZGVmIHJlcXVpcmVzKHNlbGYsZXh0cmFzPSgpKToKKyAgICAgICAgIiIiTGlzdCBvZiBSZXF1aXJlbWVudHMgbmVlZGVkIGZvciB0aGlzIGRpc3RybyBpZiBgZXh0cmFzYCBhcmUgdXNlZCIiIgorICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKKyAgICAgICAgZGVwcyA9IFtdCisgICAgICAgIGRlcHMuZXh0ZW5kKGRtLmdldChOb25lLCgpKSkKKyAgICAgICAgZm9yIGV4dCBpbiBleHRyYXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gZGVwcworCisgICAgZGVmIF9nZXRfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgaWYgc2VsZi5oYXNfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZixwYXRoPU5vbmUpOgorICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgorICAgICAgICBpZiBwYXRoIGlzIE5vbmU6IHBhdGggPSBzeXMucGF0aAorICAgICAgICBzZWxmLmluc2VydF9vbihwYXRoKQorICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgorICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHNlbGYubG9jYXRpb24pCisgICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgorICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczogZGVjbGFyZV9uYW1lc3BhY2UocGtnKQorCisgICAgZGVmIGVnZ19uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hhdCB0aGlzIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIC5lZ2cgZmlsZW5hbWUgc2hvdWxkIGJlIiIiCisgICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAorICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yIFBZX01BSk9SCisgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLnBsYXRmb3JtOgorICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nK3NlbGYucGxhdGZvcm0KKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubG9jYXRpb246CisgICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsc2VsZi5sb2NhdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICB0cnk6IHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsJ3ZlcnNpb24nLE5vbmUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiB2ZXJzaW9uID0gTm9uZQorICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCisgICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYucHJvamVjdF9uYW1lLHZlcnNpb24pCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZixhdHRyKToKKyAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKKyAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcixhdHRyCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3Byb3ZpZGVyLCBhdHRyKQorCisgICAgI0BjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscyxmaWxlbmFtZSxtZXRhZGF0YT1Ob25lLCAqKmt3KToKKyAgICAgICAgcmV0dXJuIGNscy5mcm9tX2xvY2F0aW9uKAorICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCisgICAgICAgICAgICAqKmt3CisgICAgICAgICkKKyAgICBmcm9tX2ZpbGVuYW1lID0gY2xhc3NtZXRob2QoZnJvbV9maWxlbmFtZSkKKworICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgYGBSZXF1aXJlbWVudGBgIHRoYXQgbWF0Y2hlcyB0aGlzIGRpc3RyaWJ1dGlvbiBleGFjdGx5IiIiCisgICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZSgnJXM9PSVzJyAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi52ZXJzaW9uKSkKKworICAgIGRlZiBsb2FkX2VudHJ5X3BvaW50KHNlbGYsIGdyb3VwLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgorICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsbmFtZSkKKyAgICAgICAgaWYgZXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJFbnRyeSBwb2ludCAlciBub3QgZm91bmQiICUgKChncm91cCxuYW1lKSwpKQorICAgICAgICByZXR1cm4gZXAubG9hZCgpCisKKyAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCisgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCx7fSkKKyAgICAgICAgcmV0dXJuIGVwX21hcAorCisgICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeV9tYXAoZ3JvdXApLmdldChuYW1lKQorCisgICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2MgPSBOb25lKToKKyAgICAgICAgIiIiSW5zZXJ0IHNlbGYubG9jYXRpb24gaW4gcGF0aCBiZWZvcmUgaXRzIG5lYXJlc3QgcGFyZW50IGRpcmVjdG9yeSIiIgorICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgorICAgICAgICBpZiBub3QgbG9jOiByZXR1cm4KKyAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdmVyc2lvbl9jb25mbGljdCgpCisgICAgICAgIGJlc3QsIHBvcyA9IDAsIC0xCisgICAgICAgIGZvciBwLGl0ZW0gaW4gZW51bWVyYXRlKHBhdGgpOgorICAgICAgICAgICAgaXRlbSA9IF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pCisgICAgICAgICAgICBpZiBsb2Muc3RhcnRzd2l0aChpdGVtKSBhbmQgbGVuKGl0ZW0pPmJlc3QgYW5kIGxvYzw+aXRlbToKKyAgICAgICAgICAgICAgICBiZXN0LCBwb3MgPSBsZW4oaXRlbSksIHAKKyAgICAgICAgaWYgcG9zPT0tMToKKyAgICAgICAgICAgIGlmIGxvYyBub3QgaW4gcGF0aDogcGF0aC5hcHBlbmQobG9jKQorICAgICAgICBlbGlmIGxvYyBub3QgaW4gcGF0aFs6cG9zKzFdOgorICAgICAgICAgICAgd2hpbGUgbG9jIGluIHBhdGg6IHBhdGgucmVtb3ZlKGxvYykKKyAgICAgICAgICAgIHBhdGguaW5zZXJ0KHBvcyxsb2MpCisKKworICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmtleT09J3NldHVwdG9vbHMnOgorICAgICAgICAgICAgcmV0dXJuICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKKworICAgICAgICBuc3AgPSBkaWN0LmZyb21rZXlzKHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpKQorICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQorICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKKyAgICAgICAgICAgIGlmIChtb2RuYW1lIG5vdCBpbiBzeXMubW9kdWxlcyBvciBtb2RuYW1lIGluIG5zcAorICAgICAgICAgICAgICAgIG9yIG1vZG5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlcworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCisgICAgICAgICAgICBpZiBmbiBhbmQgbm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaXNzdWVfd2FybmluZygKKyAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKKyAgICAgICAgICAgICAgICAiIHRvIHN5cy5wYXRoIiAlIChtb2RuYW1lLCBmbiwgc2VsZi5sb2NhdGlvbiksCisgICAgICAgICAgICApCisKKyAgICBkZWYgaGFzX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbgorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiK3JlcHIoc2VsZikpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjbG9uZShzZWxmLCoqa3cpOgorICAgICAgICAiIiJDb3B5IHRoaXMgZGlzdHJpYnV0aW9uLCBzdWJzdGl0dXRpbmcgaW4gYW55IGNoYW5nZWQga2V5d29yZCBhcmdzIiIiCisgICAgICAgIGZvciBhdHRyIGluICgKKyAgICAgICAgICAgICdwcm9qZWN0X25hbWUnLCAndmVyc2lvbicsICdweV92ZXJzaW9uJywgJ3BsYXRmb3JtJywgJ2xvY2F0aW9uJywKKyAgICAgICAgICAgICdwcmVjZWRlbmNlJworICAgICAgICApOgorICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsYXR0cixOb25lKSkKKyAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCisKKworCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIGV4dHJhcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KKyAgICBleHRyYXMgPSBwcm9wZXJ0eShleHRyYXMpCisKKworZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsKiprdyk6CisgICAgbGV2ZWwgPSAxCisgICAgZyA9IGdsb2JhbHMoKQorICAgIHRyeToKKyAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KKyAgICAgICAgIyB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIHRvIHVzZSBmb3IgdGhlIHdhcm5pbmcKKyAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CisgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgd2FybihzdGFja2xldmVsID0gbGV2ZWwrMSwgKmFyZ3MsICoqa3cpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKKyAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAorCisgICAgYHN0cnNgIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYGBiYXNlc3RyaW5nYGAsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkKKyAgICBpdGVyYWJsZSB0aGVyZW9mLgorICAgICIiIgorICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucworICAgIGxpbmVzID0gaXRlcih5aWVsZF9saW5lcyhzdHJzKSkKKworICAgIGRlZiBzY2FuX2xpc3QoSVRFTSxURVJNSU5BVE9SLGxpbmUscCxncm91cHMsaXRlbV9uYW1lKToKKworICAgICAgICBpdGVtcyA9IFtdCisKKyAgICAgICAgd2hpbGUgbm90IFRFUk1JTkFUT1IobGluZSxwKToKKyAgICAgICAgICAgIGlmIENPTlRJTlVFKGxpbmUscCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZXMubmV4dCgpOyBwID0gMAorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIlxcIG11c3Qgbm90IGFwcGVhciBvbiB0aGUgbGFzdCBub25ibGFuayBsaW5lIgorICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgIG1hdGNoID0gSVRFTShsaW5lLHApCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhwZWN0ZWQgIitpdGVtX25hbWUrIiBpbiIsbGluZSwiYXQiLGxpbmVbcDpdKQorCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQobWF0Y2guZ3JvdXAoKmdyb3VwcykpCisgICAgICAgICAgICBwID0gbWF0Y2guZW5kKCkKKworICAgICAgICAgICAgbWF0Y2ggPSBDT01NQShsaW5lLHApCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBwID0gbWF0Y2guZW5kKCkgIyBza2lwIHRoZSBjb21tYQorICAgICAgICAgICAgZWxpZiBub3QgVEVSTUlOQVRPUihsaW5lLHApOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAnLCcgb3IgZW5kLW9mLWxpc3QgaW4iLGxpbmUsImF0IixsaW5lW3A6XQorICAgICAgICAgICAgICAgICkKKworICAgICAgICBtYXRjaCA9IFRFUk1JTkFUT1IobGluZSxwKQorICAgICAgICBpZiBtYXRjaDogcCA9IG1hdGNoLmVuZCgpICAgIyBza2lwIHRoZSB0ZXJtaW5hdG9yLCBpZiBhbnkKKyAgICAgICAgcmV0dXJuIGxpbmUsIHAsIGl0ZW1zCisKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgbWF0Y2ggPSBESVNUUk8obGluZSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTWlzc2luZyBkaXN0cmlidXRpb24gc3BlYyIsIGxpbmUpCisgICAgICAgIHByb2plY3RfbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHAgPSBtYXRjaC5lbmQoKQorICAgICAgICBleHRyYXMgPSBbXQorCisgICAgICAgIG1hdGNoID0gT0JSQUNLRVQobGluZSxwKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKQorICAgICAgICAgICAgbGluZSwgcCwgZXh0cmFzID0gc2Nhbl9saXN0KAorICAgICAgICAgICAgICAgIERJU1RSTywgQ0JSQUNLRVQsIGxpbmUsIHAsICgxLCksICInZXh0cmEnIG5hbWUiCisgICAgICAgICAgICApCisKKyAgICAgICAgbGluZSwgcCwgc3BlY3MgPSBzY2FuX2xpc3QoVkVSU0lPTixMSU5FX0VORCxsaW5lLHAsKDEsMiksInZlcnNpb24gc3BlYyIpCisgICAgICAgIHNwZWNzID0gWyhvcCxzYWZlX3ZlcnNpb24odmFsKSkgZm9yIG9wLHZhbCBpbiBzcGVjc10KKyAgICAgICAgeWllbGQgUmVxdWlyZW1lbnQocHJvamVjdF9uYW1lLCBzcGVjcywgZXh0cmFzKQorCisKK2RlZiBfc29ydF9kaXN0cyhkaXN0cyk6CisgICAgdG1wID0gWyhkaXN0Lmhhc2hjbXAsZGlzdCkgZm9yIGRpc3QgaW4gZGlzdHNdCisgICAgdG1wLnNvcnQoKQorICAgIGRpc3RzWzo6LTFdID0gW2QgZm9yIGhjLGQgaW4gdG1wXQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFJlcXVpcmVtZW50OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0X25hbWUsIHNwZWNzLCBleHRyYXMpOgorICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgorICAgICAgICBzZWxmLnVuc2FmZV9uYW1lLCBwcm9qZWN0X25hbWUgPSBwcm9qZWN0X25hbWUsIHNhZmVfbmFtZShwcm9qZWN0X25hbWUpCisgICAgICAgIHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLmtleSA9IHByb2plY3RfbmFtZSwgcHJvamVjdF9uYW1lLmxvd2VyKCkKKyAgICAgICAgaW5kZXggPSBbKHBhcnNlX3ZlcnNpb24odiksc3RhdGVfbWFjaGluZVtvcF0sb3AsdikgZm9yIG9wLHYgaW4gc3BlY3NdCisgICAgICAgIGluZGV4LnNvcnQoKQorICAgICAgICBzZWxmLnNwZWNzID0gWyhvcCx2ZXIpIGZvciBwYXJzZWQsdHJhbnMsb3AsdmVyIGluIGluZGV4XQorICAgICAgICBzZWxmLmluZGV4LCBzZWxmLmV4dHJhcyA9IGluZGV4LCB0dXBsZShtYXAoc2FmZV9leHRyYSxleHRyYXMpKQorICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCisgICAgICAgICAgICBzZWxmLmtleSwgdHVwbGUoWyhvcCxwYXJzZWQpIGZvciBwYXJzZWQsdHJhbnMsb3AsdmVyIGluIGluZGV4XSksCisgICAgICAgICAgICBJbW11dGFibGVTZXQoc2VsZi5leHRyYXMpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBzcGVjcyA9ICcsJy5qb2luKFsnJy5qb2luKHMpIGZvciBzIGluIHNlbGYuc3BlY3NdKQorICAgICAgICBleHRyYXMgPSAnLCcuam9pbihzZWxmLmV4dHJhcykKKyAgICAgICAgaWYgZXh0cmFzOiBleHRyYXMgPSAnWyVzXScgJSBleHRyYXMKKyAgICAgICAgcmV0dXJuICclcyVzJXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBleHRyYXMsIHNwZWNzKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsUmVxdWlyZW1lbnQpIGFuZCBzZWxmLmhhc2hDbXA9PW90aGVyLmhhc2hDbXAKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixpdGVtKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLERpc3RyaWJ1dGlvbik6CisgICAgICAgICAgICBpZiBpdGVtLmtleSA8PiBzZWxmLmtleTogcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLmluZGV4OiBpdGVtID0gaXRlbS5wYXJzZWRfdmVyc2lvbiAgIyBvbmx5IGdldCBpZiB3ZSBuZWVkIGl0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpdGVtLGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaXRlbSA9IHBhcnNlX3ZlcnNpb24oaXRlbSkKKyAgICAgICAgbGFzdCA9IE5vbmUKKyAgICAgICAgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gc2VsZi5pbmRleDoKKyAgICAgICAgICAgIGFjdGlvbiA9IHRyYW5zW2NtcChpdGVtLHBhcnNlZCldCisgICAgICAgICAgICBpZiBhY3Rpb249PSdGJzogICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PSdUJzogICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PScrJzogICBsYXN0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBhY3Rpb249PSctJyBvciBsYXN0IGlzIE5vbmU6ICAgbGFzdCA9IEZhbHNlCisgICAgICAgIGlmIGxhc3QgaXMgTm9uZTogbGFzdCA9IFRydWUgICAgIyBubyBydWxlcyBlbmNvdW50ZXJlZAorICAgICAgICByZXR1cm4gbGFzdAorCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faGFzaAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gIlJlcXVpcmVtZW50LnBhcnNlKCVyKSIgJSBzdHIoc2VsZikKKworICAgICNAc3RhdGljbWV0aG9kCisgICAgZGVmIHBhcnNlKHMpOgorICAgICAgICByZXFzID0gbGlzdChwYXJzZV9yZXF1aXJlbWVudHMocykpCisgICAgICAgIGlmIHJlcXM6CisgICAgICAgICAgICBpZiBsZW4ocmVxcyk9PTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXNbMF0KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkV4cGVjdGVkIG9ubHkgb25lIHJlcXVpcmVtZW50IiwgcykKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gcmVxdWlyZW1lbnRzIGZvdW5kIiwgcykKKworICAgIHBhcnNlID0gc3RhdGljbWV0aG9kKHBhcnNlKQorCitzdGF0ZV9tYWNoaW5lID0geworICAgICMgICAgICAgPT48CisgICAgJzwnIDogICctLVQnLAorICAgICc8PSc6ICAnVC1UJywKKyAgICAnPicgOiAgJ0YrRicsCisgICAgJz49JzogICdUK0YnLAorICAgICc9PSc6ICAnVC4uJywKKyAgICAnIT0nOiAgJ0YrKycsCit9CisKKworZGVmIF9nZXRfbXJvKGNscyk6CisgICAgIiIiR2V0IGFuIG1ybyBmb3IgYSB0eXBlIG9yIGNsYXNzaWMgY2xhc3MiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsdHlwZSk6CisgICAgICAgIGNsYXNzIGNscyhjbHMsb2JqZWN0KTogcGFzcworICAgICAgICByZXR1cm4gY2xzLl9fbXJvX19bMTpdCisgICAgcmV0dXJuIGNscy5fX21yb19fCisKK2RlZiBfZmluZF9hZGFwdGVyKHJlZ2lzdHJ5LCBvYik6CisgICAgIiIiUmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgYG9iYCBmcm9tIGByZWdpc3RyeWAiIiIKKyAgICBmb3IgdCBpbiBfZ2V0X21ybyhnZXRhdHRyKG9iLCAnX19jbGFzc19fJywgdHlwZShvYikpKToKKyAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKKyAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQorCisKK2RlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgorICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKKyAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CisgICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCisKK2RlZiBzcGxpdF9zZWN0aW9ucyhzKToKKyAgICAiIiJTcGxpdCBhIHN0cmluZyBvciBpdGVyYWJsZSB0aGVyZW9mIGludG8gKHNlY3Rpb24sY29udGVudCkgcGFpcnMKKworICAgIEVhY2ggYGBzZWN0aW9uYGAgaXMgYSBzdHJpcHBlZCB2ZXJzaW9uIG9mIHRoZSBzZWN0aW9uIGhlYWRlciAoIltzZWN0aW9uXSIpCisgICAgYW5kIGVhY2ggYGBjb250ZW50YGAgaXMgYSBsaXN0IG9mIHN0cmlwcGVkIGxpbmVzIGV4Y2x1ZGluZyBibGFuayBsaW5lcyBhbmQKKyAgICBjb21tZW50LW9ubHkgbGluZXMuICBJZiB0aGVyZSBhcmUgYW55IHN1Y2ggbGluZXMgYmVmb3JlIHRoZSBmaXJzdCBzZWN0aW9uCisgICAgaGVhZGVyLCB0aGV5J3JlIHJldHVybmVkIGluIGEgZmlyc3QgYGBzZWN0aW9uYGAgb2YgYGBOb25lYGAuCisgICAgIiIiCisgICAgc2VjdGlvbiA9IE5vbmUKKyAgICBjb250ZW50ID0gW10KKyAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhzKToKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbIik6CisgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCJdIik6CisgICAgICAgICAgICAgICAgaWYgc2VjdGlvbiBvciBjb250ZW50OgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWN0aW9uLCBjb250ZW50CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHNlY3Rpb24gaGVhZGluZyIsIGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lKQorCisgICAgIyB3cmFwIHVwIGxhc3Qgc2VnbWVudAorICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKKworZGVmIF9ta3N0ZW1wKCphcmdzLCoqa3cpOgorICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IG1rc3RlbXAKKyAgICBvbGRfb3BlbiA9IG9zLm9wZW4KKyAgICB0cnk6CisgICAgICAgIG9zLm9wZW4gPSBvc19vcGVuICAgIyB0ZW1wb3JhcmlseSBieXBhc3Mgc2FuZGJveGluZworICAgICAgICByZXR1cm4gbWtzdGVtcCgqYXJncywqKmt3KQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLm9wZW4gPSBvbGRfb3BlbiAgIyBhbmQgdGhlbiBwdXQgaXQgYmFjaworCisKKyMgU2V0IHVwIGdsb2JhbCByZXNvdXJjZSBtYW5hZ2VyCitfbWFuYWdlciA9IFJlc291cmNlTWFuYWdlcigpCitkZWYgX2luaXRpYWxpemUoZyk6CisgICAgZm9yIG5hbWUgaW4gZGlyKF9tYW5hZ2VyKToKKyAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgZ1tuYW1lXSA9IGdldGF0dHIoX21hbmFnZXIsIG5hbWUpCitfaW5pdGlhbGl6ZShnbG9iYWxzKCkpCisKKyMgUHJlcGFyZSB0aGUgbWFzdGVyIHdvcmtpbmcgc2V0IGFuZCBtYWtlIHRoZSBgYHJlcXVpcmUoKWBgIEFQSSBhdmFpbGFibGUKK3dvcmtpbmdfc2V0ID0gV29ya2luZ1NldCgpCit0cnk6CisgICAgIyBEb2VzIHRoZSBtYWluIHByb2dyYW0gbGlzdCBhbnkgcmVxdWlyZW1lbnRzPworICAgIGZyb20gX19tYWluX18gaW1wb3J0IF9fcmVxdWlyZXNfXworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgIyBObzoganVzdCB1c2UgdGhlIGRlZmF1bHQgd29ya2luZyBzZXQgYmFzZWQgb24gc3lzLnBhdGgKK2Vsc2U6CisgICAgIyBZZXM6IGVuc3VyZSB0aGUgcmVxdWlyZW1lbnRzIGFyZSBtZXQsIGJ5IHByZWZpeGluZyBzeXMucGF0aCBpZiBuZWNlc3NhcnkKKyAgICB0cnk6CisgICAgICAgIHdvcmtpbmdfc2V0LnJlcXVpcmUoX19yZXF1aXJlc19fKQorICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6ICAgICAjIHRyeSBpdCB3aXRob3V0IGRlZmF1bHRzIGFscmVhZHkgb24gc3lzLnBhdGgKKyAgICAgICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0KFtdKSAgICAjIGJ5IHN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgcGF0aAorICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldC5yZXNvbHZlKAorICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKF9fcmVxdWlyZXNfXyksIEVudmlyb25tZW50KCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdvcmtpbmdfc2V0LmFkZChkaXN0KQorICAgICAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6ICAjIGFkZCBhbnkgbWlzc2luZyBlbnRyaWVzIGZyb20gc3lzLnBhdGgKKyAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiB3b3JraW5nX3NldC5lbnRyaWVzOgorICAgICAgICAgICAgICAgIHdvcmtpbmdfc2V0LmFkZF9lbnRyeShlbnRyeSkKKyAgICAgICAgc3lzLnBhdGhbOl0gPSB3b3JraW5nX3NldC5lbnRyaWVzICAgIyB0aGVuIGNvcHkgYmFjayB0byBzeXMucGF0aAorCityZXF1aXJlID0gd29ya2luZ19zZXQucmVxdWlyZQoraXRlcl9lbnRyeV9wb2ludHMgPSB3b3JraW5nX3NldC5pdGVyX2VudHJ5X3BvaW50cworYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIgPSB3b3JraW5nX3NldC5zdWJzY3JpYmUKK3J1bl9zY3JpcHQgPSB3b3JraW5nX3NldC5ydW5fc2NyaXB0CitydW5fbWFpbiA9IHJ1bl9zY3JpcHQgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCwgYW5kIGVuc3VyZSB0aGF0CisjIGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlIChlLmcuIGJ5CisjIGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwuCithZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZSgpKQord29ya2luZ19zZXQuZW50cmllcz1bXTsgbWFwKHdvcmtpbmdfc2V0LmFkZF9lbnRyeSxzeXMucGF0aCkgIyBtYXRjaCBvcmRlcgpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCBmYmQ3MDhhLi43MzE2ODkyIDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtMSw3ICsxLDQzMiBAQAogIiIiVXRpbGl0aWVzIHRvIHN1cHBvcnQgcGFja2FnZXMuIiIiCiAKKyMgTk9URTogVGhpcyBtb2R1bGUgbXVzdCByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGFzIGl0IGlzIHNoYXJlZAorIyBieSBzZXR1cHRvb2xzIGZvciBkaXN0cmlidXRpb24gd2l0aCBQeXRob24gMi4zIGFuZCB1cC4KKwogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitpbXBvcnQgb3MucGF0aAorZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQorCitfX2FsbF9fID0gWworICAgICdnZXRfaW1wb3J0ZXInLCAnaXRlcl9pbXBvcnRlcnMnLCAnZ2V0X2xvYWRlcicsICdmaW5kX2xvYWRlcicsCisgICAgJ3dhbGtfcGFja2FnZXMnLCAnaXRlcl9tb2R1bGVzJywKKyAgICAnSW1wSW1wb3J0ZXInLCAnSW1wTG9hZGVyJywgJ3JlYWRfY29kZScsICdleHRlbmRfcGF0aCcsCitdCisKK2RlZiByZWFkX2NvZGUoc3RyZWFtKToKKyAgICAjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIFBFUCAzMDIgZW11bGF0aW9uIHRvCisgICAgIyBjb3JyZWN0bHkgaGFuZGxlIGNvbXBpbGVkIGZpbGVzCisgICAgaW1wb3J0IG1hcnNoYWwKKworICAgIG1hZ2ljID0gc3RyZWFtLnJlYWQoNCkKKyAgICBpZiBtYWdpYyAhPSBpbXAuZ2V0X21hZ2ljKCk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBzdHJlYW0ucmVhZCg0KSAjIFNraXAgdGltZXN0YW1wCisgICAgcmV0dXJuIG1hcnNoYWwubG9hZChzdHJlYW0pCisKKworZGVmIHNpbXBsZWdlbmVyaWMoZnVuYyk6CisgICAgIiIiTWFrZSBhIHRyaXZpYWwgc2luZ2xlLWRpc3BhdGNoIGdlbmVyaWMgZnVuY3Rpb24iIiIKKyAgICByZWdpc3RyeSA9IHt9CisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsKiprdyk6CisgICAgICAgIG9iID0gYXJnc1swXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbHMgPSBvYi5fX2NsYXNzX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgY2xzID0gdHlwZShvYikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXJvID0gY2xzLl9fbXJvX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsYXNzIGNscyhjbHMsb2JqZWN0KTogcGFzcworICAgICAgICAgICAgICAgIG1ybyA9IGNscy5fX21yb19fWzE6XQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBtcm8gPSBvYmplY3QsICAgIyBtdXN0IGJlIGFuIEV4dGVuc2lvbkNsYXNzIG9yIHNvbWUgc3VjaCAgOigKKyAgICAgICAgZm9yIHQgaW4gbXJvOgorICAgICAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0oKmFyZ3MsKiprdykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCoqa3cpCisgICAgdHJ5OgorICAgICAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICAgIGV4Y2VwdCAoVHlwZUVycm9yLEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgcGFzcyAgICAjIFB5dGhvbiAyLjMgZG9lc24ndCBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgcmVuYW1lZAorCisgICAgZGVmIHJlZ2lzdGVyKHR5cCwgZnVuYz1Ob25lKToKKyAgICAgICAgaWYgZnVuYyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBmOiByZWdpc3Rlcih0eXAsIGYpCisgICAgICAgIHJlZ2lzdHJ5W3R5cF0gPSBmdW5jCisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICB3cmFwcGVyLl9fZGljdF9fID0gZnVuYy5fX2RpY3RfXworICAgIHdyYXBwZXIuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgIHdyYXBwZXIucmVnaXN0ZXIgPSByZWdpc3RlcgorICAgIHJldHVybiB3cmFwcGVyCisKKworZGVmIHdhbGtfcGFja2FnZXMocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSk6CisgICAgIiIiWWllbGQgc3VibW9kdWxlIG5hbWVzK2xvYWRlcnMgcmVjdXJzaXZlbHksIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisKKyAgICBkZWYgc2VlbihwLG09e30pOgorICAgICAgICBpZiBwIGluIG06IHJldHVybiBUcnVlCisgICAgICAgIG1bcF0gPSBUcnVlCisKKyAgICBmb3IgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnIGluIGl0ZXJfbW9kdWxlcyhwYXRoLCBwcmVmaXgpOgorICAgICAgICB5aWVsZCBpbXBvcnRlciwgbmFtZSwgaXNwa2cKKworICAgICAgICBpZiBpc3BrZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW25hbWVdLCAnX19wYXRoX18nLCBOb25lKSBvciBbXQorCisgICAgICAgICAgICAgICAgIyBkb24ndCB0cmF2ZXJzZSBwYXRoIGl0ZW1zIHdlJ3ZlIHNlZW4gYmVmb3JlCisgICAgICAgICAgICAgICAgcGF0aCA9IFtwIGZvciBwIGluIHBhdGggaWYgbm90IHNlZW4ocCldCisKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCisKK2RlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgorICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIGZvciBwYXRoIG9yIHN5cy5wYXRoIiIiCisgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICBpbXBvcnRlcnMgPSBpdGVyX2ltcG9ydGVycygpCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0ZXJzID0gbWFwKGdldF9pbXBvcnRlciwgcGF0aCkKKworICAgIHlpZWxkZWQgPSB7fQorICAgIGZvciBpIGluIGltcG9ydGVyczoKKyAgICAgICAgZm9yIG5hbWUsIGlzcGtnIGluIGl0ZXJfaW1wb3J0ZXJfbW9kdWxlcyhpLCBwcmVmaXgpOgorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICB5aWVsZGVkW25hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIGksIG5hbWUsIGlzcGtnCisKKworI0BzaW1wbGVnZW5lcmljCitkZWYgaXRlcl9pbXBvcnRlcl9tb2R1bGVzKGltcG9ydGVyLCBwcmVmaXg9JycpOgorICAgIGlmIG5vdCBoYXNhdHRyKGltcG9ydGVyLCdpdGVyX21vZHVsZXMnKToKKyAgICAgICAgcmV0dXJuIFtdCisgICAgcmV0dXJuIGltcG9ydGVyLml0ZXJfbW9kdWxlcyhwcmVmaXgpCisKK2l0ZXJfaW1wb3J0ZXJfbW9kdWxlcyA9IHNpbXBsZWdlbmVyaWMoaXRlcl9pbXBvcnRlcl9tb2R1bGVzKQorCisKK2NsYXNzIEltcEltcG9ydGVyOgorICAgICIiIlBFUCAzMDIgSW1wb3J0ZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorCisgICAgSW1wSW1wb3J0ZXIoZGlybmFtZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMgdGhhdAorICAgIGRpcmVjdG9yeS4gIEltcEltcG9ydGVyKE5vbmUpIHByb2R1Y2VzIGEgUEVQIDMwMiBpbXBvcnRlciB0aGF0IHNlYXJjaGVzCisgICAgdGhlIGN1cnJlbnQgc3lzLnBhdGgsIHBsdXMgYW55IG1vZHVsZXMgdGhhdCBhcmUgZnJvemVuIG9yIGJ1aWx0LWluLgorCisgICAgTm90ZSB0aGF0IEltcEltcG9ydGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGJlaW5nIHVzZWQgYnkgcGxhY2VtZW50CisgICAgb24gc3lzLm1ldGFfcGF0aC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICMgTm90ZTogd2UgaWdub3JlICdwYXRoJyBhcmd1bWVudCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdmlhIG1ldGFfcGF0aAorICAgICAgICBzdWJuYW1lID0gZnVsbG5hbWUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgaWYgc3VibmFtZSAhPSBmdWxsbmFtZSBhbmQgc2VsZi5wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gW29zLnBhdGgucmVhbHBhdGgoc2VsZi5wYXRoKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGV0YyA9IGltcC5maW5kX21vZHVsZShzdWJuYW1lLCBwYXRoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gSW1wTG9hZGVyKGZ1bGxuYW1lLCBmaWxlLCBmaWxlbmFtZSwgZXRjKQorCisgICAgZGVmIGl0ZXJfbW9kdWxlcyhzZWxmLCBwcmVmaXg9JycpOgorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZSBvciBub3Qgb3MucGF0aC5pc2RpcihzZWxmLnBhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgeWllbGRlZCA9IHt9CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisKKyAgICAgICAgZmlsZW5hbWVzID0gb3MubGlzdGRpcihzZWxmLnBhdGgpCisgICAgICAgIGZpbGVuYW1lcy5zb3J0KCkgICMgaGFuZGxlIHBhY2thZ2VzIGJlZm9yZSBzYW1lLW5hbWVkIG1vZHVsZXMKKworICAgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmbikKKyAgICAgICAgICAgIGlmIG1vZG5hbWU9PSdfX2luaXRfXycgb3IgbW9kbmFtZSBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBmbikKKyAgICAgICAgICAgIGlzcGtnID0gRmFsc2UKKworICAgICAgICAgICAgaWYgbm90IG1vZG5hbWUgYW5kIG9zLnBhdGguaXNkaXIocGF0aCkgYW5kICcuJyBub3QgaW4gZm46CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IGZuCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHN1Ym5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZm4pCisgICAgICAgICAgICAgICAgICAgIGlmIHN1Ym5hbWU9PSdfX2luaXRfXyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpc3BrZyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBub3QgYSBwYWNrYWdlCisKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgYW5kICcuJyBub3QgaW4gbW9kbmFtZToKKyAgICAgICAgICAgICAgICB5aWVsZGVkW21vZG5hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIHByZWZpeCArIG1vZG5hbWUsIGlzcGtnCisKKworY2xhc3MgSW1wTG9hZGVyOgorICAgICIiIlBFUCAzMDIgTG9hZGVyIHRoYXQgd3JhcHMgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBhbGdvcml0aG0KKyAgICAiIiIKKyAgICBjb2RlID0gc291cmNlID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bGxuYW1lLCBmaWxlLCBmaWxlbmFtZSwgZXRjKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5mdWxsbmFtZSA9IGZ1bGxuYW1lCisgICAgICAgIHNlbGYuZXRjID0gZXRjCisKKyAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBpbXAubG9hZF9tb2R1bGUoZnVsbG5hbWUsIHNlbGYuZmlsZSwgc2VsZi5maWxlbmFtZSwgc2VsZi5ldGMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgIyBOb3RlOiB3ZSBkb24ndCBzZXQgX19sb2FkZXJfXyBiZWNhdXNlIHdlIHdhbnQgdGhlIG1vZHVsZSB0byBsb29rCisgICAgICAgICMgbm9ybWFsOyBpLmUuIHRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHN0YW5kYXJkIGltcG9ydCBtYWNoaW5lcnkKKyAgICAgICAgcmV0dXJuIG1vZAorCisgICAgZGVmIGdldF9kYXRhKHNlbGYsIHBhdGhuYW1lKToKKyAgICAgICAgcmV0dXJuIG9wZW4ocGF0aG5hbWUsICJyYiIpLnJlYWQoKQorCisgICAgZGVmIF9yZW9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmlsZSBhbmQgc2VsZi5maWxlLmNsb3NlZDoKKyAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JVJykKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgaW4gKGltcC5QWV9DT01QSUxFRCwgaW1wLkNfRVhURU5TSU9OKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpCisKKyAgICBkZWYgX2ZpeF9uYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5mdWxsbmFtZQorICAgICAgICBlbGlmIGZ1bGxuYW1lICE9IHNlbGYuZnVsbG5hbWU6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTG9hZGVyIGZvciBtb2R1bGUgJXMgY2Fubm90IGhhbmRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlICVzIiAlIChzZWxmLmZ1bGxuYW1lLCBmdWxsbmFtZSkpCisgICAgICAgIHJldHVybiBmdWxsbmFtZQorCisgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5ldGNbMl09PWltcC5QS0dfRElSRUNUT1JZCisKKyAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgZnVsbG5hbWU9Tm9uZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIGlmIHNlbGYuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICAgICAgaWYgbW9kX3R5cGU9PWltcC5QWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgc291cmNlID0gc2VsZi5nZXRfc291cmNlKGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IGNvbXBpbGUoc291cmNlLCBzZWxmLmZpbGVuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUFlfQ09NUElMRUQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVvcGVuKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IHJlYWRfY29kZShzZWxmLmZpbGUpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IHNlbGYuX2dldF9kZWxlZ2F0ZSgpLmdldF9jb2RlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZQorCisgICAgZGVmIGdldF9zb3VyY2Uoc2VsZiwgZnVsbG5hbWU9Tm9uZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIGlmIHNlbGYuc291cmNlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBzZWxmLmZpbGUucmVhZCgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QWV9DT01QSUxFRDoKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lWzotMV0pOgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihzZWxmLmZpbGVuYW1lWzotMV0sICdyVScpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc291cmNlID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNlbGYuX2dldF9kZWxlZ2F0ZSgpLmdldF9zb3VyY2UoKQorICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2UKKworCisgICAgZGVmIF9nZXRfZGVsZWdhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBJbXBJbXBvcnRlcihzZWxmLmZpbGVuYW1lKS5maW5kX21vZHVsZSgnX19pbml0X18nKQorCisgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICBpZiBzZWxmLmV0Y1syXT09aW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X2ZpbGVuYW1lKCkKKyAgICAgICAgZWxpZiBzZWxmLmV0Y1syXSBpbiAoaW1wLlBZX1NPVVJDRSwgaW1wLlBZX0NPTVBJTEVELCBpbXAuQ19FWFRFTlNJT04pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCit0cnk6CisgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGZyb20gemlwaW1wb3J0IGltcG9ydCB6aXBpbXBvcnRlcgorCisgICAgZGVmIGl0ZXJfemlwaW1wb3J0X21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6CisgICAgICAgIGRpcmxpc3QgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbaW1wb3J0ZXIuYXJjaGl2ZV0ua2V5cygpCisgICAgICAgIGRpcmxpc3Quc29ydCgpCisgICAgICAgIF9wcmVmaXggPSBpbXBvcnRlci5wcmVmaXgKKyAgICAgICAgcGxlbiA9IGxlbihfcHJlZml4KQorICAgICAgICB5aWVsZGVkID0ge30KKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgZm9yIGZuIGluIGRpcmxpc3Q6CisgICAgICAgICAgICBpZiBub3QgZm4uc3RhcnRzd2l0aChfcHJlZml4KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmbiA9IGZuW3BsZW46XS5zcGxpdChvcy5zZXApCisKKyAgICAgICAgICAgIGlmIGxlbihmbik9PTIgYW5kIGZuWzFdLnN0YXJ0c3dpdGgoJ19faW5pdF9fLnB5Jyk6CisgICAgICAgICAgICAgICAgaWYgZm5bMF0gbm90IGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkZWRbZm5bMF1dID0gMQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBmblswXSwgVHJ1ZQorCisgICAgICAgICAgICBpZiBsZW4oZm4pIT0xOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZm5bMF0pCisgICAgICAgICAgICBpZiBtb2RuYW1lPT0nX19pbml0X18nOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgYW5kICcuJyBub3QgaW4gbW9kbmFtZSBhbmQgbW9kbmFtZSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICB5aWVsZGVkW21vZG5hbWVdID0gMQorICAgICAgICAgICAgICAgIHlpZWxkIHByZWZpeCArIG1vZG5hbWUsIEZhbHNlCisKKyAgICBpdGVyX2ltcG9ydGVyX21vZHVsZXMucmVnaXN0ZXIoemlwaW1wb3J0ZXIsIGl0ZXJfemlwaW1wb3J0X21vZHVsZXMpCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKKworZGVmIGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pOgorICAgICIiIlJldHJpZXZlIGEgUEVQIDMwMiBpbXBvcnRlciBmb3IgdGhlIGdpdmVuIHBhdGggaXRlbQorCisgICAgVGhlIHJldHVybmVkIGltcG9ydGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQorICAgIGlmIGl0IHdhcyBuZXdseSBjcmVhdGVkIGJ5IGEgcGF0aCBob29rLgorCisgICAgSWYgdGhlcmUgaXMgbm8gaW1wb3J0ZXIsIGEgd3JhcHBlciBhcm91bmQgdGhlIGJhc2ljIGltcG9ydAorICAgIG1hY2hpbmVyeSBpcyByZXR1cm5lZC4gVGhpcyB3cmFwcGVyIGlzIG5ldmVyIGluc2VydGVkIGludG8KKyAgICB0aGUgaW1wb3J0ZXIgY2FjaGUgKE5vbmUgaXMgaW5zZXJ0ZWQgaW5zdGVhZCkuCisKKyAgICBUaGUgY2FjaGUgKG9yIHBhcnQgb2YgaXQpIGNhbiBiZSBjbGVhcmVkIG1hbnVhbGx5IGlmIGEKKyAgICByZXNjYW4gb2Ygc3lzLnBhdGhfaG9va3MgaXMgbmVjZXNzYXJ5LgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0ZXIgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2l0ZW1dCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBmb3IgcGF0aF9ob29rIGluIHN5cy5wYXRoX2hvb2tzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydGVyID0gcGF0aF9ob29rKHBhdGhfaXRlbSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQorICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5zZXRkZWZhdWx0KHBhdGhfaXRlbSxpbXBvcnRlcikKKworICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydGVyID0gSW1wSW1wb3J0ZXIocGF0aF9pdGVtKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIGltcG9ydGVyCisKKworZGVmIGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lPSIiKToKKyAgICAiIiJZaWVsZCBQRVAgMzAyIGltcG9ydGVycyBmb3IgdGhlIGdpdmVuIG1vZHVsZSBuYW1lCisKKyAgICBJZiBmdWxsbmFtZSBjb250YWlucyBhICcuJywgdGhlIGltcG9ydGVycyB3aWxsIGJlIGZvciB0aGUgcGFja2FnZQorICAgIGNvbnRhaW5pbmcgZnVsbG5hbWUsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgaW1wb3J0ZXJzIGZvciBzeXMubWV0YV9wYXRoLAorICAgIHN5cy5wYXRoLCBhbmQgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBtYWNoaW5lcnksIGluIHRoYXQgb3JkZXIuICBJZgorICAgIHRoZSBuYW1lZCBtb2R1bGUgaXMgaW4gYSBwYWNrYWdlLCB0aGF0IHBhY2thZ2UgaXMgaW1wb3J0ZWQgYXMgYSBzaWRlCisgICAgZWZmZWN0IG9mIGludm9raW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgICBOb24gUEVQIDMwMiBtZWNoYW5pc21zIChlLmcuIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5KSB1c2VkIGJ5IHRoZQorICAgIHN0YW5kYXJkIGltcG9ydCBtYWNoaW5lcnkgdG8gZmluZCBmaWxlcyBpbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbnMKKyAgICBhcmUgcGFydGlhbGx5IHN1cHBvcnRlZCwgYnV0IGFyZSBzZWFyY2hlZCBBRlRFUiBzeXMucGF0aC4gTm9ybWFsbHksCisgICAgdGhlc2UgbG9jYXRpb25zIGFyZSBzZWFyY2hlZCBCRUZPUkUgc3lzLnBhdGgsIHByZXZlbnRpbmcgc3lzLnBhdGgKKyAgICBlbnRyaWVzIGZyb20gc2hhZG93aW5nIHRoZW0uCisKKyAgICBGb3IgdGhpcyB0byBjYXVzZSBhIHZpc2libGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvdXIsIHRoZXJlIG11c3QKKyAgICBiZSBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUgdGhhdCBpcyBhY2Nlc3NpYmxlIHZpYSBib3RoIHN5cy5wYXRoCisgICAgYW5kIG9uZSBvZiB0aGUgbm9uIFBFUCAzMDIgZmlsZSBzeXN0ZW0gbWVjaGFuaXNtcy4gSW4gdGhpcyBjYXNlLAorICAgIHRoZSBlbXVsYXRpb24gd2lsbCBmaW5kIHRoZSBmb3JtZXIgdmVyc2lvbiwgd2hpbGUgdGhlIGJ1aWx0aW4KKyAgICBpbXBvcnQgbWVjaGFuaXNtIHdpbGwgZmluZCB0aGUgbGF0dGVyLgorCisgICAgSXRlbXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgdGhpcyBkaXNjcmVwYW5jeToKKyAgICAgICAgaW1wLkNfRVhURU5TSU9OLCBpbXAuUFlfU09VUkNFLCBpbXAuUFlfQ09NUElMRUQsIGltcC5QS0dfRElSRUNUT1JZCisgICAgIiIiCisgICAgaWYgZnVsbG5hbWUuc3RhcnRzd2l0aCgnLicpOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiUmVsYXRpdmUgbW9kdWxlIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKQorICAgIGlmICcuJyBpbiBmdWxsbmFtZToKKyAgICAgICAgIyBHZXQgdGhlIGNvbnRhaW5pbmcgcGFja2FnZSdzIF9fcGF0aF9fCisgICAgICAgIHBrZyA9ICcuJy5qb2luKGZ1bGxuYW1lLnNwbGl0KCcuJylbOi0xXSkKKyAgICAgICAgaWYgcGtnIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIF9faW1wb3J0X18ocGtnKQorICAgICAgICBwYXRoID0gZ2V0YXR0cihzeXMubW9kdWxlc1twa2ddLCdfX3BhdGhfXycsTm9uZSkgb3IgW10KKyAgICBlbHNlOgorICAgICAgICBmb3IgaW1wb3J0ZXIgaW4gc3lzLm1ldGFfcGF0aDoKKyAgICAgICAgICAgIHlpZWxkIGltcG9ydGVyCisgICAgICAgIHBhdGggPSBzeXMucGF0aAorICAgIGZvciBpdGVtIGluIHBhdGg6CisgICAgICAgIHlpZWxkIGdldF9pbXBvcnRlcihpdGVtKQorICAgIGlmICcuJyBub3QgaW4gZnVsbG5hbWU6CisgICAgICAgIHlpZWxkIEltcEltcG9ydGVyKCkKKworZGVmIGdldF9sb2FkZXIobW9kdWxlX29yX25hbWUpOgorICAgICIiIkdldCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBtb2R1bGVfb3JfbmFtZQorCisgICAgSWYgdGhlIG1vZHVsZSBvciBwYWNrYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBub3JtYWwgaW1wb3J0CisgICAgbWVjaGFuaXNtLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoYXQgbWFjaGluZXJ5CisgICAgaXMgcmV0dXJuZWQuICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuCisgICAgSWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBub3QgYWxyZWFkeSBpbXBvcnRlZCwgaXRzIGNvbnRhaW5pbmcgcGFja2FnZQorICAgIChpZiBhbnkpIGlzIGltcG9ydGVkLCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlIHBhY2thZ2UgX19wYXRoX18uCisKKyAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgaXRlcl9pbXBvcnRlcnMoKSwgYW5kIGlzIHRodXMgc3ViamVjdCB0byB0aGUgc2FtZQorICAgIGxpbWl0YXRpb25zIHJlZ2FyZGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBzcGVjaWFsIGltcG9ydCBsb2NhdGlvbnMgc3VjaAorICAgIGFzIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5LgorICAgICIiIgorICAgIGlmIG1vZHVsZV9vcl9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICBtb2R1bGVfb3JfbmFtZSA9IHN5cy5tb2R1bGVzW21vZHVsZV9vcl9uYW1lXQorICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlX29yX25hbWUsIE1vZHVsZVR5cGUpOgorICAgICAgICBtb2R1bGUgPSBtb2R1bGVfb3JfbmFtZQorICAgICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwnX19sb2FkZXJfXycsTm9uZSkKKyAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgorICAgICAgICBmdWxsbmFtZSA9IG1vZHVsZS5fX25hbWVfXworICAgIGVsc2U6CisgICAgICAgIGZ1bGxuYW1lID0gbW9kdWxlX29yX25hbWUKKyAgICByZXR1cm4gZmluZF9sb2FkZXIoZnVsbG5hbWUpCisKK2RlZiBmaW5kX2xvYWRlcihmdWxsbmFtZSk6CisgICAgIiIiRmluZCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBmdWxsbmFtZQorCisgICAgSWYgZnVsbG5hbWUgY29udGFpbnMgZG90cywgcGF0aCBtdXN0IGJlIHRoZSBjb250YWluaW5nIHBhY2thZ2UncyBfX3BhdGhfXy4KKyAgICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuIFRoaXMgZnVuY3Rpb24gdXNlcworICAgIGl0ZXJfaW1wb3J0ZXJzKCksIGFuZCBpcyB0aHVzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgcmVnYXJkaW5nCisgICAgcGxhdGZvcm0tc3BlY2lmaWMgc3BlY2lhbCBpbXBvcnQgbG9jYXRpb25zIHN1Y2ggYXMgdGhlIFdpbmRvd3MgcmVnaXN0cnkuCisgICAgIiIiCisgICAgZm9yIGltcG9ydGVyIGluIGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lKToKKyAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoZnVsbG5hbWUpCisgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBsb2FkZXIKKworICAgIHJldHVybiBOb25lCisKIAogZGVmIGV4dGVuZF9wYXRoKHBhdGgsIG5hbWUpOgogICAgICIiIkV4dGVuZCBhIHBhY2thZ2UncyBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5IGIvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CmluZGV4IGIwMzVkOWUuLjc2YmRiMDYgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weQorKysgYi9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkKQEAgLTI1LDcgKzI1LDcgQEAKICAgICBwYXNzCiAKICMgRmlsZSBoZWFkZXIgZm9ybWF0OiBtYWdpYywgdmVyc2lvbiwgdW51c2VkLCBudW1iZXIgb2YgZW50cmllcwotQVNfSEVBREVSX0ZPUk1BVD0iPmxsMTZzaCIKK0FTX0hFQURFUl9GT1JNQVQ9Ij5MTDE2c2giCiBBU19IRUFERVJfTEVOR1RIPTI2CiAjIFRoZSBmbGFnIHdvcmRzIGZvciBBcHBsZVNpbmdsZQogQVNfTUFHSUM9MHgwMDA1MTYwMApkaWZmIC0tZ2l0IGEvTGliL3BsYXRmb3JtLnB5IGIvTGliL3BsYXRmb3JtLnB5CmluZGV4IDYyZmRhZjQuLjI4OGJjOTUgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0Zm9ybS5weQorKysgYi9MaWIvcGxhdGZvcm0ucHkKQEAgLTYwNyw3ICs2MDcsOCBAQAogICAgICAgICB2ZXJzaW9uaW5mbyA9ICh2ZXJzaW9uLHN0YWdlLG5vbnJlbCkKICAgICBpZiBzeXNhOgogICAgICAgICBtYWNoaW5lID0gezB4MTogJzY4aycsCi0gICAgICAgICAgICAgICAgICAgMHgyOiAnUG93ZXJQQyd9LmdldChzeXNhLCcnKQorICAgICAgICAgICAgICAgICAgIDB4MjogJ1Bvd2VyUEMnLAorICAgICAgICAgICAgICAgICAgIDB4YTogJ2kzODYnfS5nZXQoc3lzYSwnJykKICAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uaW5mbyxtYWNoaW5lCiAKIGRlZiBfamF2YV9nZXRwcm9wKG5hbWUsZGVmYXVsdCk6CmRpZmYgLS1naXQgYS9MaWIvcG9wZW4yLnB5IGIvTGliL3BvcGVuMi5weQppbmRleCA1NDU0M2JlLi42N2ViZDI2IDEwMDY0NAotLS0gYS9MaWIvcG9wZW4yLnB5CisrKyBiL0xpYi9wb3BlbjIucHkKQEAgLTIwLDcgKzIwLDEzIEBACiAKIGRlZiBfY2xlYW51cCgpOgogICAgIGZvciBpbnN0IGluIF9hY3RpdmVbOl06Ci0gICAgICAgIGluc3QucG9sbCgpCisgICAgICAgIGlmIGluc3QucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpID49IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoaW5zdCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGlmIHR3byB0aHJlYWRzIGNyZWF0ZSBhIG5ldyBQb3BlbiBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAjIEl0J3MgaGFybWxlc3MgdGhhdCBpdCB3YXMgYWxyZWFkeSByZW1vdmVkLCBzbyBpZ25vcmUuCisgICAgICAgICAgICAgICAgcGFzcwogCiBjbGFzcyBQb3BlbjM6CiAgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgY2hpbGQgcHJvY2Vzcy4gIE5vcm1hbGx5IGluc3RhbmNlcyBhcmUgY3JlYXRlZApAQCAtMzksNiArNDUsNyBAQAogICAgICAgICBzcGVjaWZpZWQsIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgSS9PIGJ1ZmZlcnMgdG8vZnJvbSB0aGUgY2hpbGQKICAgICAgICAgcHJvY2Vzcy4iIiIKICAgICAgICAgX2NsZWFudXAoKQorICAgICAgICBzZWxmLmNtZCA9IGNtZAogICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IG9zLnBpcGUoKQogICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IG9zLnBpcGUoKQogICAgICAgICBpZiBjYXB0dXJlc3RkZXJyOgpAQCAtNjAsNyArNjcsMTMgQEAKICAgICAgICAgICAgIHNlbGYuY2hpbGRlcnIgPSBvcy5mZG9wZW4oZXJyb3V0LCAncicsIGJ1ZnNpemUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmNoaWxkZXJyID0gTm9uZQotICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCisgICAgICAgIHNlbGYucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCisgICAgICAgIGlmIHNlbGYuc3RzIDwgMDoKKyAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KKyAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKICAgICBkZWYgX3J1bl9jaGlsZChzZWxmLCBjbWQpOgogICAgICAgICBpZiBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyk6CkBAIC03NSwyNiArODgsMjggQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLl9leGl0KDEpCiAKLSAgICBkZWYgcG9sbChzZWxmKToKKyAgICBkZWYgcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIGlmIGl0IGhhcyBmaW5pc2hlZCwKICAgICAgICAgb3IgLTEgaWYgaXQgaGFzbid0IGZpbmlzaGVkIHlldC4iIiIKICAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICAjIHBpZCB3aWxsIGJlIDAgaWYgc2VsZi5waWQgaGFzbid0IHRlcm1pbmF0ZWQKICAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCi0gICAgICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGlmIF9kZWFkc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gX2RlYWRzdGF0ZQogICAgICAgICByZXR1cm4gc2VsZi5zdHMKIAogICAgIGRlZiB3YWl0KHNlbGYpOgogICAgICAgICAiIiJXYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4iIiIKICAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgogICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCAwKQotICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgotICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCi0gICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKyAgICAgICAgICAgICMgVGhpcyB1c2VkIHRvIGJlIGEgdGVzdCwgYnV0IGl0IGlzIGJlbGlldmVkIHRvIGJlCisgICAgICAgICAgICAjIGFsd2F5cyB0cnVlLCBzbyBJIGNoYW5nZWQgaXQgdG8gYW4gYXNzZXJ0aW9uIC0gbXZsCisgICAgICAgICAgICBhc3NlcnQgcGlkID09IHNlbGYucGlkCisgICAgICAgICAgICBzZWxmLnN0cyA9IHN0cwogICAgICAgICByZXR1cm4gc2VsZi5zdHMKIAogCkBAIC0xMDMsNiArMTE4LDcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGJ1ZnNpemU9LTEpOgogICAgICAgICBfY2xlYW51cCgpCisgICAgICAgIHNlbGYuY21kID0gY21kCiAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCkBAIC0xMTYsNyArMTMyLDYgQEAKICAgICAgICAgc2VsZi50b2NoaWxkID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAndycsIGJ1ZnNpemUpCiAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQogICAgICAgICBzZWxmLmZyb21jaGlsZCA9IG9zLmZkb3BlbihjMnByZWFkLCAncicsIGJ1ZnNpemUpCi0gICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKIAogaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIiBvciBzeXMucGxhdGZvcm0gPT0gIm9zMmVteCI6CkBAIC0xODYsNiArMjAxLDkgQEAKICAgICBfX2FsbF9fLmV4dGVuZChbIlBvcGVuMyIsICJQb3BlbjQiXSkKIAogZGVmIF90ZXN0KCk6CisgICAgIyBXaGVuIHRoZSB0ZXN0IHJ1bnMsIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgb3BlbiBwaXBlcworICAgIF9jbGVhbnVwKCkKKyAgICBhc3NlcnQgbm90IF9hY3RpdmUsICJBY3RpdmUgcGlwZXMgd2hlbiB0ZXN0IHN0YXJ0cyAiICsgcmVwcihbYy5jbWQgZm9yIGMgaW4gX2FjdGl2ZV0pCiAgICAgY21kICA9ICJjYXQiCiAgICAgdGVzdHN0ciA9ICJhYiBjZFxuIgogICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTIxNiw2ICsyMzQsNyBAQAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmV4cGVjdGVkICVyIG9uIHN0ZGVyciIgJSAoZ290LCkpCiAgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKICAgICAgICAgaW5zdC53YWl0KCkKKyAgICBfY2xlYW51cCgpCiAgICAgaWYgX2FjdGl2ZToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiX2FjdGl2ZSBub3QgZW1wdHkiKQogICAgIHByaW50ICJBbGwgT0siCmRpZmYgLS1naXQgYS9MaWIvcHN0YXRzLnB5IGIvTGliL3BzdGF0cy5weQppbmRleCA5MzBjYzZkLi5jM2E4ODI4IDEwMDY0NAotLS0gYS9MaWIvcHN0YXRzLnB5CisrKyBiL0xpYi9wc3RhdHMucHkKQEAgLTMyLDYgKzMyLDcgQEAKICMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KIAogCitpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCiBpbXBvcnQgbWFyc2hhbApAQCAtNTgsMTggKzU5LDMxIEBACiAgICAgcHJpbnRlZC4KIAogICAgIFRoZSBzb3J0X3N0YXRzKCkgbWV0aG9kIG5vdyBwcm9jZXNzZXMgc29tZSBhZGRpdGlvbmFsIG9wdGlvbnMgKGkuZS4sIGluCi0gICAgYWRkaXRpb24gdG8gdGhlIG9sZCAtMSwgMCwgMSwgb3IgMikuICBJdCB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHF1b3RlZAotICAgIHN0cmluZ3MgdG8gc2VsZWN0IHRoZSBzb3J0IG9yZGVyLiAgRm9yIGV4YW1wbGUgc29ydF9zdGF0cygndGltZScsICduYW1lJykKLSAgICBzb3J0cyBvbiB0aGUgbWFqb3Iga2V5IG9mICJpbnRlcm5hbCBmdW5jdGlvbiB0aW1lIiwgYW5kIG9uIHRoZSBtaW5vcgotICAgIGtleSBvZiAndGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uJy4gIExvb2sgYXQgdGhlIHR3byB0YWJsZXMgaW4gc29ydF9zdGF0cygpCi0gICAgYW5kIGdldF9zb3J0X2FyZ19kZWZzKHNlbGYpIGZvciBtb3JlIGV4YW1wbGVzLgorICAgIGFkZGl0aW9uIHRvIHRoZSBvbGQgLTEsIDAsIDEsIG9yIDIpLiAgSXQgdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgorICAgIHF1b3RlZCBzdHJpbmdzIHRvIHNlbGVjdCB0aGUgc29ydCBvcmRlci4gIEZvciBleGFtcGxlIHNvcnRfc3RhdHMoJ3RpbWUnLAorICAgICduYW1lJykgc29ydHMgb24gdGhlIG1ham9yIGtleSBvZiAnaW50ZXJuYWwgZnVuY3Rpb24gdGltZScsIGFuZCBvbiB0aGUKKyAgICBtaW5vciBrZXkgb2YgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbicuICBMb29rIGF0IHRoZSB0d28gdGFibGVzIGluCisgICAgc29ydF9zdGF0cygpIGFuZCBnZXRfc29ydF9hcmdfZGVmcyhzZWxmKSBmb3IgbW9yZSBleGFtcGxlcy4KIAotICAgIEFsbCBtZXRob2RzIG5vdyByZXR1cm4gInNlbGYiLCAgc28geW91IGNhbiBzdHJpbmcgdG9nZXRoZXIgY29tbWFuZHMgbGlrZToKKyAgICBBbGwgbWV0aG9kcyByZXR1cm4gc2VsZiwgIHNvIHlvdSBjYW4gc3RyaW5nIHRvZ2V0aGVyIGNvbW1hbmRzIGxpa2U6CiAgICAgICAgIFN0YXRzKCdmb28nLCAnZ29vJykuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoJ2NhbGxzJykuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0YXRzKDUpLnByaW50X2NhbGxlcnMoNSkKICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAjIEkgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gZXhwbGljdGx5IHNwZWNpZnkgYSBzdHJlYW0ga2V5d29yZCBhcmcKKyAgICAgICAgIyB3aXRoICphcmdzOgorICAgICAgICAjICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCBzdHJlYW09c3lzLnN0ZG91dCk6IC4uLgorICAgICAgICAjIHNvIEkgdXNlICoqa3dkcyBhbmQgc3FhdXdrIGlmIHNvbWV0aGluZyB1bmV4cGVjdGVkIGlzIHBhc3NlZCBpbi4KKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmICJzdHJlYW0iIGluIGt3ZHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IGt3ZHNbInN0cmVhbSJdCisgICAgICAgICAgICBkZWwga3dkc1sic3RyZWFtIl0KKyAgICAgICAgaWYga3dkczoKKyAgICAgICAgICAgIGtleXMgPSBrd2RzLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIGV4dHJhcyA9ICIsICIuam9pbihbIiVzPSVzIiAlIChrLCBrd2RzW2tdKSBmb3IgayBpbiBrZXlzXSkKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bnJlY29nbml6ZWQga2V5d29yZCBhcmdzOiAlcyIgJSBleHRyYXMKICAgICAgICAgaWYgbm90IGxlbihhcmdzKToKICAgICAgICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgZWxzZToKQEAgLTk2LDkgKzExMCw5IEBACiAgICAgICAgICAgICB0cm91YmxlID0gMAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaWYgdHJvdWJsZToKLSAgICAgICAgICAgICAgICBwcmludCAiSW52YWxpZCB0aW1pbmcgZGF0YSIsCi0gICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQgc2VsZi5maWxlc1stMV0sCi0gICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkludmFsaWQgdGltaW5nIGRhdGEiLAorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZXM6IHByaW50ID4+IHNlbGYuc3RyZWFtLCBzZWxmLmZpbGVzWy0xXSwKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogCiAgICAgZGVmIGxvYWRfc3RhdHMoc2VsZiwgYXJnKToKICAgICAgICAgaWYgbm90IGFyZzogIHNlbGYuc3RhdHMgPSB7fQpAQCAtMzIwLDcgKzMzNCw3IEBACiAKICAgICAgICAgaWYgbm90IGxpc3Q6CiAgICAgICAgICAgICByZXR1cm4gMCwgbGlzdAotICAgICAgICBwcmludCBtc2cKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIG1zZwogICAgICAgICBpZiBjb3VudCA8IGxlbihzZWxmLnN0YXRzKToKICAgICAgICAgICAgIHdpZHRoID0gMAogICAgICAgICAgICAgZm9yIGZ1bmMgaW4gbGlzdDoKQEAgLTMzMCwyNCArMzQ0LDI0IEBACiAKICAgICBkZWYgcHJpbnRfc3RhdHMoc2VsZiwgKmFtb3VudCk6CiAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLmZpbGVzOgotICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUKLSAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmaWxlbmFtZQorICAgICAgICBpZiBzZWxmLmZpbGVzOiBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICBpbmRlbnQgPSAnICcgKiA4CiAgICAgICAgIGZvciBmdW5jIGluIHNlbGYudG9wX2xldmVsOgotICAgICAgICAgICAgcHJpbnQgaW5kZW50LCBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpCiAKLSAgICAgICAgcHJpbnQgaW5kZW50LCBzZWxmLnRvdGFsX2NhbGxzLCAiZnVuY3Rpb24gY2FsbHMiLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBzZWxmLnRvdGFsX2NhbGxzLCAiZnVuY3Rpb24gY2FsbHMiLAogICAgICAgICBpZiBzZWxmLnRvdGFsX2NhbGxzICE9IHNlbGYucHJpbV9jYWxsczoKLSAgICAgICAgICAgIHByaW50ICIoJWQgcHJpbWl0aXZlIGNhbGxzKSIgJSBzZWxmLnByaW1fY2FsbHMsCi0gICAgICAgIHByaW50ICJpbiAlLjNmIENQVSBzZWNvbmRzIiAlIHNlbGYudG90YWxfdHQKLSAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKCVkIHByaW1pdGl2ZSBjYWxscykiICUgc2VsZi5wcmltX2NhbGxzLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgImluICUuM2YgQ1BVIHNlY29uZHMiICUgc2VsZi50b3RhbF90dAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICB3aWR0aCwgbGlzdCA9IHNlbGYuZ2V0X3ByaW50X2xpc3QoYW1vdW50KQogICAgICAgICBpZiBsaXN0OgogICAgICAgICAgICAgc2VsZi5wcmludF90aXRsZSgpCiAgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgogICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfbGluZShmdW5jKQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBwcmludF9jYWxsZWVzKHNlbGYsICphbW91bnQpOgpAQCAtMzYxLDggKzM3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBzZWxmLmFsbF9jYWxsZWVzW2Z1bmNdKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCB7fSkKLSAgICAgICAgICAgIHByaW50Ci0gICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgIHJldHVybiBzZWxmCiAKICAgICBkZWYgcHJpbnRfY2FsbGVycyhzZWxmLCAqYW1vdW50KToKQEAgLTM3MiwxMiArMzg2LDEyIEBACiAgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgogICAgICAgICAgICAgICAgIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzID0gc2VsZi5zdGF0c1tmdW5jXQogICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBjYWxsZXJzLCAiPC0iKQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBwcmludF9jYWxsX2hlYWRpbmcoc2VsZiwgbmFtZV9zaXplLCBjb2x1bW5fdGl0bGUpOgotICAgICAgICBwcmludCAiRnVuY3Rpb24gIi5sanVzdChuYW1lX3NpemUpICsgY29sdW1uX3RpdGxlCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiRnVuY3Rpb24gIi5sanVzdChuYW1lX3NpemUpICsgY29sdW1uX3RpdGxlCiAgICAgICAgICMgcHJpbnQgc3ViLWhlYWRlciBvbmx5IGlmIHdlIGhhdmUgbmV3LXN0eWxlIGNhbGxlcnMKICAgICAgICAgc3ViaGVhZGVyID0gRmFsc2UKICAgICAgICAgZm9yIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzIGluIHNlbGYuc3RhdHMuaXRlcnZhbHVlcygpOgpAQCAtMzg2LDEyICs0MDAsMTIgQEAKICAgICAgICAgICAgICAgICBzdWJoZWFkZXIgPSBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSkKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBpZiBzdWJoZWFkZXI6Ci0gICAgICAgICAgICBwcmludCAiICIqbmFtZV9zaXplICsgIiAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAiKm5hbWVfc2l6ZSArICIgICAgbmNhbGxzICB0b3R0aW1lICBjdW10aW1lIgogCiAgICAgZGVmIHByaW50X2NhbGxfbGluZShzZWxmLCBuYW1lX3NpemUsIHNvdXJjZSwgY2FsbF9kaWN0LCBhcnJvdz0iLT4iKToKLSAgICAgICAgcHJpbnQgZnVuY19zdGRfc3RyaW5nKHNvdXJjZSkubGp1c3QobmFtZV9zaXplKSArIGFycm93LAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZnVuY19zdGRfc3RyaW5nKHNvdXJjZSkubGp1c3QobmFtZV9zaXplKSArIGFycm93LAogICAgICAgICBpZiBub3QgY2FsbF9kaWN0OgotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgY2xpc3QgPSBjYWxsX2RpY3Qua2V5cygpCiAgICAgICAgIGNsaXN0LnNvcnQoKQpAQCAtNDExLDMwICs0MjUsMzAgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc3Vic3RhdHMgPSAnJXMoJXIpICVzJyAlIChuYW1lLCB2YWx1ZSwgZjgoc2VsZi5zdGF0c1tmdW5jXVszXSkpCiAgICAgICAgICAgICAgICAgbGVmdF93aWR0aCA9IG5hbWVfc2l6ZSArIDMKLSAgICAgICAgICAgIHByaW50IGluZGVudCpsZWZ0X3dpZHRoICsgc3Vic3RhdHMKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBpbmRlbnQqbGVmdF93aWR0aCArIHN1YnN0YXRzCiAgICAgICAgICAgICBpbmRlbnQgPSAiICIKIAogICAgIGRlZiBwcmludF90aXRsZShzZWxmKToKLSAgICAgICAgcHJpbnQgJyAgIG5jYWxscyAgdG90dGltZSAgcGVyY2FsbCAgY3VtdGltZSAgcGVyY2FsbCcsIFwKLSAgICAgICAgICAgICAgJ2ZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbiknCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsJywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICdmaWxlbmFtZTpsaW5lbm8oZnVuY3Rpb24pJwogCiAgICAgZGVmIHByaW50X2xpbmUoc2VsZiwgZnVuYyk6ICAjIGhhY2sgOiBzaG91bGQgcHJpbnQgcGVyY2VudGFnZXMKICAgICAgICAgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgPSBzZWxmLnN0YXRzW2Z1bmNdCiAgICAgICAgIGMgPSBzdHIobmMpCiAgICAgICAgIGlmIG5jICE9IGNjOgogICAgICAgICAgICAgYyA9IGMgKyAnLycgKyBzdHIoY2MpCi0gICAgICAgIHByaW50IGMucmp1c3QoOSksCi0gICAgICAgIHByaW50IGY4KHR0KSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGMucmp1c3QoOSksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOCh0dCksCiAgICAgICAgIGlmIG5jID09IDA6Ci0gICAgICAgICAgICBwcmludCAnICcqOCwKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICcqOCwKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50IGY4KHR0L25jKSwKLSAgICAgICAgcHJpbnQgZjgoY3QpLAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KHR0L25jKSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KGN0KSwKICAgICAgICAgaWYgY2MgPT0gMDoKLSAgICAgICAgICAgIHByaW50ICcgJyo4LAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgJyo4LAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgZjgoY3QvY2MpLAotICAgICAgICBwcmludCBmdW5jX3N0ZF9zdHJpbmcoZnVuYykKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOChjdC9jYyksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmdW5jX3N0ZF9zdHJpbmcoZnVuYykKIAogY2xhc3MgVHVwbGVDb21wOgogICAgICIiIlRoaXMgY2xhc3MgcHJvdmlkZXMgYSBnZW5lcmljIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgYW55IHR3byB0dXBsZXMuCkBAIC01NDksNyArNTYzLDcgQEAKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGZyYWMgPSBmbG9hdCh0ZXJtKQogICAgICAgICAgICAgICAgICAgICBpZiBmcmFjID4gMSBvciBmcmFjIDwgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJGcmFjdGlvbiBhcmd1bWVudCBtdXMgYmUgaW4gWzAsIDFdIgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJGcmFjdGlvbiBhcmd1bWVudCBtdXN0IGJlIGluIFswLCAxXSIKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hcHBlbmQoZnJhYykKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTU1OSw5MyArNTczLDkzIEBACiAgICAgICAgICAgICBpZiBzZWxmLnN0YXRzOgogICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZi5zdGF0cywgZm4pKCpwcm9jZXNzZWQpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgbG9hZGVkLiIKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBnZW5lcmljX2hlbHAoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiQXJndW1lbnRzIG1heSBiZToiCi0gICAgICAgICAgICBwcmludCAiKiBBbiBpbnRlZ2VyIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gcHJpbnQuIgotICAgICAgICAgICAgcHJpbnQgIiogQSBkZWNpbWFsIGZyYWN0aW9uYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSwgY29udHJvbGxpbmciCi0gICAgICAgICAgICBwcmludCAiICB3aGF0IGZyYWN0aW9uIG9mIHNlbGVjdGVkIGVudHJpZXMgdG8gcHJpbnQuIgotICAgICAgICAgICAgcHJpbnQgIiogQSByZWd1bGFyIGV4cHJlc3Npb247IG9ubHkgZW50cmllcyB3aXRoIGZ1bmN0aW9uIG5hbWVzIgotICAgICAgICAgICAgcHJpbnQgIiAgdGhhdCBtYXRjaCBpdCBhcmUgcHJpbnRlZC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkFyZ3VtZW50cyBtYXkgYmU6IgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIqIEFuIGludGVnZXIgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBwcmludC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiogQSBkZWNpbWFsIGZyYWN0aW9uYWwgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSwgY29udHJvbGxpbmciCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAgd2hhdCBmcmFjdGlvbiBvZiBzZWxlY3RlZCBlbnRyaWVzIHRvIHByaW50LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbjsgb25seSBlbnRyaWVzIHdpdGggZnVuY3Rpb24gbmFtZXMiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiAgdGhhdCBtYXRjaCBpdCBhcmUgcHJpbnRlZC4iCiAKICAgICAgICAgZGVmIGRvX2FkZChzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHNlbGYuc3RhdHMuYWRkKGxpbmUpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9hZGQoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiQWRkIHByb2ZpbGUgaW5mbyBmcm9tIGdpdmVuIGZpbGUgdG8gY3VycmVudCBzdGF0aXN0aWNzIG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkFkZCBwcm9maWxlIGluZm8gZnJvbSBnaXZlbiBmaWxlIHRvIGN1cnJlbnQgc3RhdGlzdGljcyBvYmplY3QuIgogCiAgICAgICAgIGRlZiBkb19jYWxsZWVzKHNlbGYsIGxpbmUpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJpYygncHJpbnRfY2FsbGVlcycsIGxpbmUpCiAgICAgICAgIGRlZiBoZWxwX2NhbGxlZXMoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiUHJpbnQgY2FsbGVlcyBzdGF0aXN0aWNzIGZyb20gdGhlIGN1cnJlbnQgc3RhdCBvYmplY3QuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJQcmludCBjYWxsZWVzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCiAgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCiAKICAgICAgICAgZGVmIGRvX2NhbGxlcnMoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9jYWxsZXJzJywgbGluZSkKICAgICAgICAgZGVmIGhlbHBfY2FsbGVycyhzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJQcmludCBjYWxsZXJzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IGNhbGxlcnMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKICAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKIAogICAgICAgICBkZWYgZG9fRU9GKHNlbGYsIGxpbmUpOgotICAgICAgICAgICAgcHJpbnQgIiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiIgogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgZGVmIGhlbHBfRU9GKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCiAKICAgICAgICAgZGVmIGRvX3F1aXQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICBkZWYgaGVscF9xdWl0KHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCiAKICAgICAgICAgZGVmIGRvX3JlYWQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cyA9IFN0YXRzKGxpbmUpCiAgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZ3M6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50IGFyZ3NbMV0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGFyZ3NbMV0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSBsaW5lICsgIiUgIgogICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5wcm9tcHQpID4gMjoKICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5wcm9tcHRbLTI6XQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgY3VycmVudCAtLSBjYW5ub3QgcmVsb2FkLiIKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGN1cnJlbnQgLS0gY2Fubm90IHJlbG9hZC4iCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9yZWFkKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlJlYWQgaW4gcHJvZmlsZSBkYXRhIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlJlYWQgaW4gcHJvZmlsZSBkYXRhIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4iCiAKICAgICAgICAgZGVmIGRvX3JldmVyc2Uoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBzZWxmLnN0YXRzLnJldmVyc2Vfb3JkZXIoKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGhlbHBfcmV2ZXJzZShzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJSZXZlcnNlIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgcmVwb3J0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUmV2ZXJzZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgcHJvZmlsaW5nIHJlcG9ydC4iCiAKICAgICAgICAgZGVmIGRvX3NvcnQoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBhYmJyZXZzID0gc2VsZi5zdGF0cy5nZXRfc29ydF9hcmdfZGVmcygpCiAgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgZmlsdGVyKGxhbWJkYSB4LGE9YWJicmV2czogeCBub3QgaW4gYSxsaW5lLnNwbGl0KCkpOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMuc29ydF9zdGF0cygqbGluZS5zcGxpdCgpKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiVmFsaWQgc29ydCBrZXlzICh1bmlxdWUgcHJlZml4ZXMgYXJlIGFjY2VwdGVkKToiCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJWYWxpZCBzb3J0IGtleXMgKHVuaXF1ZSBwcmVmaXhlcyBhcmUgYWNjZXB0ZWQpOiIKICAgICAgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIFN0YXRzLnNvcnRfYXJnX2RpY3RfZGVmYXVsdC5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzIC0tICVzIiAlIChrZXksIHZhbHVlWzFdKQorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiVzIC0tICVzIiAlIChrZXksIHZhbHVlWzFdKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGhlbHBfc29ydChzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJTb3J0IHByb2ZpbGUgZGF0YSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGtleXMuIgotICAgICAgICAgICAgcHJpbnQgIihUeXBpbmcgYHNvcnQnIHdpdGhvdXQgYXJndW1lbnRzIGxpc3RzIHZhbGlkIGtleXMuKSIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiU29ydCBwcm9maWxlIGRhdGEgYWNjb3JkaW5nIHRvIHNwZWNpZmllZCBrZXlzLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKFR5cGluZyBgc29ydCcgd2l0aG91dCBhcmd1bWVudHMgbGlzdHMgdmFsaWQga2V5cy4pIgogICAgICAgICBkZWYgY29tcGxldGVfc29ydChzZWxmLCB0ZXh0LCAqYXJncyk6CiAgICAgICAgICAgICByZXR1cm4gW2EgZm9yIGEgaW4gU3RhdHMuc29ydF9hcmdfZGljdF9kZWZhdWx0IGlmIGEuc3RhcnRzd2l0aCh0ZXh0KV0KIAogICAgICAgICBkZWYgZG9fc3RhdHMoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9zdGF0cycsIGxpbmUpCiAgICAgICAgIGRlZiBoZWxwX3N0YXRzKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlByaW50IHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCiAgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCiAKICAgICAgICAgZGVmIGRvX3N0cmlwKHNlbGYsIGxpbmUpOgogICAgICAgICAgICAgc2VsZi5zdGF0cy5zdHJpcF9kaXJzKCkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBoZWxwX3N0cmlwKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlN0cmlwIGxlYWRpbmcgcGF0aCBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lcyBpbiB0aGUgcmVwb3J0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiU3RyaXAgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWVzIGluIHRoZSByZXBvcnQuIgogCiAgICAgICAgIGRlZiBwb3N0Y21kKHNlbGYsIHN0b3AsIGxpbmUpOgogICAgICAgICAgICAgaWYgc3RvcDoKQEAgLTY1MywxNCArNjY3LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgaW1wb3J0IHN5cwotICAgIHByaW50ICJXZWxjb21lIHRvIHRoZSBwcm9maWxlIHN0YXRpc3RpY3MgYnJvd3Nlci4iCisgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJXZWxjb21lIHRvIHRoZSBwcm9maWxlIHN0YXRpc3RpY3MgYnJvd3Nlci4iCiAgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CiAgICAgICAgIGluaXRwcm9maWxlID0gc3lzLmFyZ3ZbMV0KICAgICBlbHNlOgogICAgICAgICBpbml0cHJvZmlsZSA9IE5vbmUKICAgICB0cnk6CiAgICAgICAgIFByb2ZpbGVCcm93c2VyKGluaXRwcm9maWxlKS5jbWRsb29wKCkKLSAgICAgICAgcHJpbnQgIkdvb2RieWUuIgorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkdvb2RieWUuIgogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKaW5kZXggYjZhZmM3Zi4uY2YzODYzMCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtNTIsMTAgKzUyLDE2IEBACiAjICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgY2hhbmdlZCB3aXRoIG9zLmNoZGlyKCksIGFuIGluY29ycmVjdAogIyAgICAgcGF0aCB3aWxsIGJlIGRpc3BsYXllZC4KIAotaW1wb3J0IHN5cywgaW1wLCBvcywgcmUsIHR5cGVzLCBpbnNwZWN0LCBfX2J1aWx0aW5fXworaW1wb3J0IHN5cywgaW1wLCBvcywgcmUsIHR5cGVzLCBpbnNwZWN0LCBfX2J1aWx0aW5fXywgcGtndXRpbAogZnJvbSByZXByIGltcG9ydCBSZXByCiBmcm9tIHN0cmluZyBpbXBvcnQgZXhwYW5kdGFicywgZmluZCwgam9pbiwgbG93ZXIsIHNwbGl0LCBzdHJpcCwgcmZpbmQsIHJzdHJpcAotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK3RyeToKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgY2xhc3MgZGVxdWUobGlzdCk6CisgICAgICAgIGRlZiBwb3BsZWZ0KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9wKDApCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbW1vbiByb3V0aW5lcwogCkBAIC0xODIsNiArMTg4LDIzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICByZXR1cm4gRmFsc2UKIAorZGVmIHNvdXJjZV9zeW5vcHNpcyhmaWxlKToKKyAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgd2hpbGUgbGluZVs6MV0gPT0gJyMnIG9yIG5vdCBzdHJpcChsaW5lKToKKyAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICBsaW5lID0gc3RyaXAobGluZSkKKyAgICBpZiBsaW5lWzo0XSA9PSAnciIiIic6IGxpbmUgPSBsaW5lWzE6XQorICAgIGlmIGxpbmVbOjNdID09ICciIiInOgorICAgICAgICBsaW5lID0gbGluZVszOl0KKyAgICAgICAgaWYgbGluZVstMTpdID09ICdcXCc6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgd2hpbGUgbm90IHN0cmlwKGxpbmUpOgorICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIHJlc3VsdCA9IHN0cmlwKHNwbGl0KGxpbmUsICciIiInKVswXSkKKyAgICBlbHNlOiByZXN1bHQgPSBOb25lCisgICAgcmV0dXJuIHJlc3VsdAorCiBkZWYgc3lub3BzaXMoZmlsZW5hbWUsIGNhY2hlPXt9KToKICAgICAiIiJHZXQgdGhlIG9uZS1saW5lIHN1bW1hcnkgb3V0IG9mIGEgbW9kdWxlIGZpbGUuIiIiCiAgICAgbXRpbWUgPSBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQpAQCAtMTk2LDI0ICsyMTksMTEgQEAKICAgICAgICAgaWYgaW5mbyBhbmQgJ2InIGluIGluZm9bMl06ICMgYmluYXJ5IG1vZHVsZXMgaGF2ZSB0byBiZSBpbXBvcnRlZAogICAgICAgICAgICAgdHJ5OiBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUoJ19fdGVtcF9fJywgZmlsZSwgZmlsZW5hbWUsIGluZm9bMTpdKQogICAgICAgICAgICAgZXhjZXB0OiByZXR1cm4gTm9uZQotICAgICAgICAgICAgcmVzdWx0ID0gc3BsaXQobW9kdWxlLl9fZG9jX18gb3IgJycsICdcbicpWzBdCisgICAgICAgICAgICByZXN1bHQgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQogICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfX3RlbXBfXyddCiAgICAgICAgIGVsc2U6ICMgdGV4dCBtb2R1bGVzIGNhbiBiZSBkaXJlY3RseSBleGFtaW5lZAotICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQotICAgICAgICAgICAgd2hpbGUgbGluZVs6MV0gPT0gJyMnIG9yIG5vdCBzdHJpcChsaW5lKToKLSAgICAgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICBsaW5lID0gc3RyaXAobGluZSkKLSAgICAgICAgICAgIGlmIGxpbmVbOjRdID09ICdyIiIiJzogbGluZSA9IGxpbmVbMTpdCi0gICAgICAgICAgICBpZiBsaW5lWzozXSA9PSAnIiIiJzoKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVszOl0KLSAgICAgICAgICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xcJzogbGluZSA9IGxpbmVbOi0xXQotICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzdHJpcChsaW5lKToKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJpcChzcGxpdChsaW5lLCAnIiIiJylbMF0pCi0gICAgICAgICAgICBlbHNlOiByZXN1bHQgPSBOb25lCi0gICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlX3N5bm9wc2lzKGZpbGUpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKG10aW1lLCByZXN1bHQpCiAgICAgcmV0dXJuIHJlc3VsdAogCkBAIC02NDMsMTYgKzY1Myw4IEBACiAKICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3BhdGhfXycpOgogICAgICAgICAgICAgbW9kcGtncyA9IFtdCi0gICAgICAgICAgICBtb2RuYW1lcyA9IFtdCi0gICAgICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKG9iamVjdC5fX3BhdGhfX1swXSk6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvYmplY3QuX19wYXRoX19bMF0sIGZpbGUpCi0gICAgICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmaWxlKQotICAgICAgICAgICAgICAgIGlmIG1vZG5hbWUgIT0gJ19faW5pdF9fJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgbW9kbmFtZSBub3QgaW4gbW9kbmFtZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgobW9kbmFtZSwgbmFtZSwgMCwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lcy5hcHBlbmQobW9kbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgoZmlsZSwgbmFtZSwgMSwgMCkpCisgICAgICAgICAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKG9iamVjdC5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG1vZG5hbWUsIG5hbWUsIGlzcGtnLCAwKSkKICAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCiAgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4obW9kcGtncywgc2VsZi5tb2Rwa2dsaW5rKQogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKApAQCAtNzk2LDcgKzc5OCwxMCBAQAogICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJwogCiAgICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBhdHRycy5zb3J0KGxhbWJkYSB0MSwgdDI6IGNtcCh0MVswXSwgdDJbMF0pKSAgICAjIDIuMyBjb21wYXQKIAogICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KICAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoJ01ldGhvZHMgJXMnICUgdGFnLCBhdHRycywKQEAgLTkxNCwyNSArOTE5LDkgQEAKICAgICAgICAgIiIiR2VuZXJhdGUgYW4gSFRNTCBpbmRleCBmb3IgYSBkaXJlY3Rvcnkgb2YgbW9kdWxlcy4iIiIKICAgICAgICAgbW9kcGtncyA9IFtdCiAgICAgICAgIGlmIHNoYWRvd2VkIGlzIE5vbmU6IHNoYWRvd2VkID0ge30KLSAgICAgICAgc2VlbiA9IHt9Ci0gICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXIpCi0KLSAgICAgICAgZGVmIGZvdW5kKG5hbWUsIGlzcGFja2FnZSwKLSAgICAgICAgICAgICAgICAgIG1vZHBrZ3M9bW9kcGtncywgc2hhZG93ZWQ9c2hhZG93ZWQsIHNlZW49c2Vlbik6Ci0gICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWVuOgotICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChuYW1lLCAnJywgaXNwYWNrYWdlLCBuYW1lIGluIHNoYWRvd2VkKSkKLSAgICAgICAgICAgICAgICBzZWVuW25hbWVdID0gMQotICAgICAgICAgICAgICAgIHNoYWRvd2VkW25hbWVdID0gMQotCi0gICAgICAgICMgUGFja2FnZSBzcGFtL19faW5pdF9fLnB5IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBtb2R1bGUgc3BhbS5weS4KLSAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgICAgIGlmIGlzcGFja2FnZShwYXRoKTogZm91bmQoZmlsZSwgMSkKLSAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZmlsZSkKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lOiBmb3VuZChtb2RuYW1lLCAwKQorICAgICAgICBmb3IgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKFtkaXJdKToKKyAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChuYW1lLCAnJywgaXNwa2csIG5hbWUgaW4gc2hhZG93ZWQpKQorICAgICAgICAgICAgc2hhZG93ZWRbbmFtZV0gPSAxCiAKICAgICAgICAgbW9kcGtncy5zb3J0KCkKICAgICAgICAgY29udGVudHMgPSBzZWxmLm11bHRpY29sdW1uKG1vZHBrZ3MsIHNlbGYubW9kcGtnbGluaykKQEAgLTEwNTksMTQgKzEwNDgsMTIgQEAKIAogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fcGF0aF9fJyk6CiAgICAgICAgICAgICBtb2Rwa2dzID0gW10KLSAgICAgICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIob2JqZWN0Ll9fcGF0aF9fWzBdKToKLSAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9iamVjdC5fX3BhdGhfX1swXSwgZmlsZSkKLSAgICAgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZpbGUpCi0gICAgICAgICAgICAgICAgaWYgbW9kbmFtZSAhPSAnX19pbml0X18nOgotICAgICAgICAgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCBtb2RuYW1lIG5vdCBpbiBtb2Rwa2dzOgotICAgICAgICAgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQobW9kbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZWxpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChmaWxlICsgJyAocGFja2FnZSknKQorICAgICAgICAgICAgZm9yIGltcG9ydGVyLCBtb2RuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhvYmplY3QuX19wYXRoX18pOgorICAgICAgICAgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChtb2RuYW1lICsgJyAocGFja2FnZSknKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKG1vZG5hbWUpCisKICAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oCiAgICAgICAgICAgICAgICAgJ1BBQ0tBR0UgQ09OVEVOVFMnLCBqb2luKG1vZHBrZ3MsICdcbicpKQpAQCAtMTQ5MCwyMCArMTQ3Nyw5IEBACiBkZWYgd3JpdGVkb2NzKGRpciwgcGtncGF0aD0nJywgZG9uZT1Ob25lKToKICAgICAiIiJXcml0ZSBvdXQgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhbGwgbW9kdWxlcyBpbiBhIGRpcmVjdG9yeSB0cmVlLiIiIgogICAgIGlmIGRvbmUgaXMgTm9uZTogZG9uZSA9IHt9Ci0gICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihkaXIpOgotICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOgotICAgICAgICAgICAgd3JpdGVkb2NzKHBhdGgsIHBrZ3BhdGggKyBmaWxlICsgJy4nLCBkb25lKQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShwYXRoKQotICAgICAgICAgICAgaWYgbW9kbmFtZToKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lID09ICdfX2luaXRfXyc6Ci0gICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBwa2dwYXRoWzotMV0gIyByZW1vdmUgdHJhaWxpbmcgcGVyaW9kCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHBrZ3BhdGggKyBtb2RuYW1lCi0gICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBub3QgaW4gZG9uZToKLSAgICAgICAgICAgICAgICAgICAgZG9uZVttb2RuYW1lXSA9IDEKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVkb2MobW9kbmFtZSkKKyAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhbZGlyXSwgcGtncGF0aCk6CisgICAgICAgIHdyaXRlZG9jKG1vZG5hbWUpCisgICAgcmV0dXJuCiAKIGRlZiByYXdfaW5wdXQocHJvbXB0KToKICAgICBzeXMuc3Rkb3V0LndyaXRlKHByb21wdCkKQEAgLTE4MzUsMzAgKzE4MTEsOSBAQAogICAgICAgICAgICAgc2VsZi5zdGF0ZS5hcHBlbmQoKGNoaWxkLCBzZWxmLmNoaWxkcmVuKGNoaWxkKSkpCiAgICAgICAgIHJldHVybiBjaGlsZAogCi1jbGFzcyBNb2R1bGVTY2FubmVyKFNjYW5uZXIpOgorCitjbGFzcyBNb2R1bGVTY2FubmVyOgogICAgICIiIkFuIGludGVycnVwdGlibGUgc2Nhbm5lciB0aGF0IHNlYXJjaGVzIG1vZHVsZSBzeW5vcHNlcy4iIiIKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHJvb3RzID0gbWFwKGxhbWJkYSBkaXI6IChkaXIsICcnKSwgcGF0aGRpcnMoKSkKLSAgICAgICAgU2Nhbm5lci5fX2luaXRfXyhzZWxmLCByb290cywgc2VsZi5zdWJtb2R1bGVzLCBzZWxmLmlzbmV3cGFja2FnZSkKLSAgICAgICAgc2VsZi5pbm9kZXMgPSBtYXAobGFtYmRhIChkaXIsIHBrZyk6IG9zLnN0YXQoZGlyKS5zdF9pbm8sIHJvb3RzKQotCi0gICAgZGVmIHN1Ym1vZHVsZXMoc2VsZiwgKGRpciwgcGFja2FnZSkpOgotICAgICAgICBjaGlsZHJlbiA9IFtdCi0gICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIoZGlyKToKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKQotICAgICAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSArIChwYWNrYWdlIGFuZCAnLicpICsgZmlsZSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSkpCi0gICAgICAgIGNoaWxkcmVuLnNvcnQoKSAjIHNvIHRoYXQgc3BhbS5weSBjb21lcyBiZWZvcmUgc3BhbS5weWMgb3Igc3BhbS5weW8KLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuCi0KLSAgICBkZWYgaXNuZXdwYWNrYWdlKHNlbGYsIChkaXIsIHBhY2thZ2UpKToKLSAgICAgICAgaW5vZGUgPSBvcy5wYXRoLmV4aXN0cyhkaXIpIGFuZCBvcy5zdGF0KGRpcikuc3RfaW5vCi0gICAgICAgIGlmIG5vdCAob3MucGF0aC5pc2xpbmsoZGlyKSBhbmQgaW5vZGUgaW4gc2VsZi5pbm9kZXMpOgotICAgICAgICAgICAgc2VsZi5pbm9kZXMuYXBwZW5kKGlub2RlKSAjIGRldGVjdCBjaXJjdWxhciBzeW1ib2xpYyBsaW5rcwotICAgICAgICAgICAgcmV0dXJuIGlzcGFja2FnZShkaXIpCi0gICAgICAgIHJldHVybiBGYWxzZQogCiAgICAgZGVmIHJ1bihzZWxmLCBjYWxsYmFjaywga2V5PU5vbmUsIGNvbXBsZXRlcj1Ob25lKToKICAgICAgICAgaWYga2V5OiBrZXkgPSBsb3dlcihrZXkpCkBAIC0xODc1LDIyICsxODMwLDMxIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIGZpbmQobG93ZXIobW9kbmFtZSArICcgLSAnICsgZGVzYyksIGtleSkgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsIGRlc2MpCiAKLSAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKLSAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5leHQoKQotICAgICAgICAgICAgaWYgbm90IG5vZGU6IGJyZWFrCi0gICAgICAgICAgICBwYXRoLCBwYWNrYWdlID0gbm9kZQotICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShwYXRoKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCkgYW5kIG1vZG5hbWU6Ci0gICAgICAgICAgICAgICAgbW9kbmFtZSA9IHBhY2thZ2UgKyAocGFja2FnZSBhbmQgJy4nKSArIG1vZG5hbWUKLSAgICAgICAgICAgICAgICBpZiBub3QgbW9kbmFtZSBpbiBzZWVuOgotICAgICAgICAgICAgICAgICAgICBzZWVuW21vZG5hbWVdID0gMSAjIGlmIHdlIHNlZSBzcGFtLnB5LCBza2lwIHNwYW0ucHljCi0gICAgICAgICAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgJycpCisgICAgICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKCk6CisgICAgICAgICAgICBpZiBzZWxmLnF1aXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsICcnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9hZGVyLCdnZXRfc291cmNlJyk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBTdHJpbmdJTworICAgICAgICAgICAgICAgICAgICBkZXNjID0gc291cmNlX3N5bm9wc2lzKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nSU8uU3RyaW5nSU8obG9hZGVyLmdldF9zb3VyY2UobW9kbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICkgb3IgJycKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb2FkZXIsJ2dldF9maWxlbmFtZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGxvYWRlci5nZXRfZmlsZW5hbWUobW9kbmFtZSkKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBzeW5vcHNpcyhwYXRoKSBvciAnJwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwga2V5KSA+PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhdGgsIG1vZG5hbWUsIGRlc2MpCi0gICAgICAgIGlmIGNvbXBsZXRlcjogY29tcGxldGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gZ2V0YXR0cihtb2R1bGUsJ19fZmlsZV9fJyxOb25lKQorICAgICAgICAgICAgICAgIGlmIGZpbmQobG93ZXIobW9kbmFtZSArICcgLSAnICsgZGVzYyksIGtleSkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYykKKworICAgICAgICBpZiBjb21wbGV0ZXI6CisgICAgICAgICAgICBjb21wbGV0ZXIoKQogCiBkZWYgYXByb3BvcyhrZXkpOgogICAgICIiIlByaW50IGFsbCB0aGUgb25lLWxpbmUgbW9kdWxlIHN1bW1hcmllcyB0aGF0IGNvbnRhaW4gYSBzdWJzdHJpbmcuIiIiCkBAIC0xOTU1LDcgKzE5MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAnQnVpbHQtaW4gTW9kdWxlcycsICcjZmZmZmZmJywgJyNlZTc3YWEnLCBjb250ZW50cyldCiAKICAgICAgICAgICAgICAgICBzZWVuID0ge30KLSAgICAgICAgICAgICAgICBmb3IgZGlyIGluIHBhdGhkaXJzKCk6CisgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5hcHBlbmQoaHRtbC5pbmRleChkaXIsIHNlZW4pKQogICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gaGVhZGluZyArIGpvaW4oaW5kaWNlcykgKyAnJyc8cCBhbGlnbj1yaWdodD4KIDxmb250IGNvbG9yPSIjOTA5MDkwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48c3Ryb25nPgpkaWZmIC0tZ2l0IGEvTGliL3JhbmRvbS5weSBiL0xpYi9yYW5kb20ucHkKaW5kZXggYjRhZDJiMy4uNDY1ZjQ3NyAxMDA2NDQKLS0tIGEvTGliL3JhbmRvbS5weQorKysgYi9MaWIvcmFuZG9tLnB5CkBAIC0yODUsNiArMjg1LDE1IEBACiAgICAgICAgIGxhcmdlIHBvcHVsYXRpb246ICAgc2FtcGxlKHhyYW5nZSgxMDAwMDAwMCksIDYwKQogICAgICAgICAiIiIKIAorICAgICAgICAjIFhYWCBBbHRob3VnaCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIGBwb3B1bGF0aW9uYCBpcyAiYSBzZXF1ZW5jZSIsCisgICAgICAgICMgWFhYIGF0dGVtcHRzIGFyZSBtYWRlIHRvIGNhdGVyIHRvIGFueSBpdGVyYWJsZSB3aXRoIGEgX19sZW5fXworICAgICAgICAjIFhYWCBtZXRob2QuICBUaGlzIGhhcyBoYWQgbWl4ZWQgc3VjY2Vzcy4gIEV4YW1wbGVzIGZyb20gYm90aAorICAgICAgICAjIFhYWCBzaWRlczogIHNldHMgd29yayBmaW5lLCBhbmQgc2hvdWxkIGJlY29tZSBvZmZpY2lhbGx5IHN1cHBvcnRlZDsKKyAgICAgICAgIyBYWFggZGljdHMgYXJlIG11Y2ggaGFyZGVyLCBhbmQgaGF2ZSBmYWlsZWQgaW4gdmFyaW91cyBzdWJ0bGUKKyAgICAgICAgIyBYWFggd2F5cyBhY3Jvc3MgYXR0ZW1wdHMuICBTdXBwb3J0IGZvciBtYXBwaW5nIHR5cGVzIHNob3VsZCBwcm9iYWJseQorICAgICAgICAjIFhYWCBiZSBkcm9wcGVkIChhbmQgdXNlcnMgc2hvdWxkIHBhc3MgbWFwcGluZy5rZXlzKCkgb3IgLnZhbHVlcygpCisgICAgICAgICMgWFhYIGV4cGxpY2l0bHkpLgorCiAgICAgICAgICMgU2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudCBlbnRhaWxzIHRyYWNraW5nIGVpdGhlciBwb3RlbnRpYWwKICAgICAgICAgIyBzZWxlY3Rpb25zICh0aGUgcG9vbCkgaW4gYSBsaXN0IG9yIHByZXZpb3VzIHNlbGVjdGlvbnMgaW4gYSBzZXQuCiAKQEAgLTMwNCw3ICszMTMsOSBAQAogICAgICAgICBzZXRzaXplID0gMjEgICAgICAgICMgc2l6ZSBvZiBhIHNtYWxsIHNldCBtaW51cyBzaXplIG9mIGFuIGVtcHR5IGxpc3QKICAgICAgICAgaWYgayA+IDU6CiAgICAgICAgICAgICBzZXRzaXplICs9IDQgKiogX2NlaWwoX2xvZyhrICogMywgNCkpICMgdGFibGUgc2l6ZSBmb3IgYmlnIHNldHMKLSAgICAgICAgaWYgbiA8PSBzZXRzaXplOiAgICAjIGlzIGFuIG4tbGVuZ3RoIGxpc3Qgc21hbGxlciB0aGFuIGEgay1sZW5ndGggc2V0CisgICAgICAgIGlmIG4gPD0gc2V0c2l6ZSBvciBoYXNhdHRyKHBvcHVsYXRpb24sICJrZXlzIik6CisgICAgICAgICAgICAjIEFuIG4tbGVuZ3RoIGxpc3QgaXMgc21hbGxlciB0aGFuIGEgay1sZW5ndGggc2V0LCBvciB0aGlzIGlzIGEKKyAgICAgICAgICAgICMgbWFwcGluZyB0eXBlIHNvIHRoZSBvdGhlciBhbGdvcml0aG0gd291bGRuJ3Qgd29yay4KICAgICAgICAgICAgIHBvb2wgPSBsaXN0KHBvcHVsYXRpb24pCiAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6ICAgICAgICAgIyBpbnZhcmlhbnQ6ICBub24tc2VsZWN0ZWQgYXQgWzAsbi1pKQogICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogKG4taSkpCkBAIC0zMTIsMTcgKzMyMywxOCBAQAogICAgICAgICAgICAgICAgIHBvb2xbal0gPSBwb29sW24taS0xXSAgICMgbW92ZSBub24tc2VsZWN0ZWQgaXRlbSBpbnRvIHZhY2FuY3kKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBuID4gMCBhbmQgKHBvcHVsYXRpb25bMF0sIHBvcHVsYXRpb25bbi8vMl0sIHBvcHVsYXRpb25bbi0xXSkKLSAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBLZXlFcnJvcik6ICAgIyBoYW5kbGUgbm9uLXNlcXVlbmNlIGl0ZXJhYmxlcwotICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSB0dXBsZShwb3B1bGF0aW9uKQotICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZXQoKQotICAgICAgICAgICAgc2VsZWN0ZWRfYWRkID0gc2VsZWN0ZWQuYWRkCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6Ci0gICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiBuKQotICAgICAgICAgICAgICAgIHdoaWxlIGogaW4gc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBzZXQoKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX2FkZCA9IHNlbGVjdGVkLmFkZAorICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShrKToKICAgICAgICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiBuKQotICAgICAgICAgICAgICAgIHNlbGVjdGVkX2FkZChqKQotICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBvcHVsYXRpb25bal0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgaiBpbiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkKGopCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBvcHVsYXRpb25bal0KKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBLZXlFcnJvcik6ICAgIyBoYW5kbGUgKGF0IGxlYXN0KSBzZXRzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwb3B1bGF0aW9uLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zYW1wbGUodHVwbGUocG9wdWxhdGlvbiksIGspCiAgICAgICAgIHJldHVybiByZXN1bHQKIAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVhbC12YWx1ZWQgZGlzdHJpYnV0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3JlY29udmVydC5weSBiL0xpYi9yZWNvbnZlcnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY0YmFiNWIuLjAwMDAwMDAKLS0tIGEvTGliL3JlY29udmVydC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLXIiIiJDb252ZXJ0IG9sZCAoInJlZ2V4IikgcmVndWxhciBleHByZXNzaW9ucyB0byBuZXcgc3ludGF4ICgicmUiKS4KLQotV2hlbiBpbXBvcnRlZCBhcyBhIG1vZHVsZSwgdGhlcmUgYXJlIHR3byBmdW5jdGlvbnMsIHdpdGggdGhlaXIgb3duCi1zdHJpbmdzOgotCi0gIGNvbnZlcnQocywgc3ludGF4PU5vbmUpIC0tIGNvbnZlcnQgYSByZWdleCByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmUgc3ludGF4Ci0KLSAgcXVvdGUocykgLS0gcmV0dXJuIGEgcXVvdGVkIHN0cmluZyBsaXRlcmFsCi0KLVdoZW4gdXNlZCBhcyBhIHNjcmlwdCwgcmVhZCBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCAob3IgYW55IG90aGVyCi1leHByZXNzaW9uIGV2YWx1YXRpbmcgdG8gYSBzdHJpbmcpIGZyb20gc3RkaW4sIGFuZCB3cml0ZSB0aGUKLXRyYW5zbGF0ZWQgZXhwcmVzc2lvbiB0byBzdGRvdXQgYXMgYSBzdHJpbmcgbGl0ZXJhbC4gIFVubGVzcyBzdGRvdXQgaXMKLWEgdHR5LCBubyB0cmFpbGluZyBcbiBpcyB3cml0dGVuIHRvIHN0ZG91dC4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGl0Ci1jYW4gYmUgdXNlZCB3aXRoIEVtYWNzIEMtVSBNLXwgKHNoZWxsLWNvbW1hbmQtb24tcmVnaW9uIHdpdGggYXJndW1lbnQKLXdoaWNoIGZpbHRlcnMgdGhlIHJlZ2lvbiB0aHJvdWdoIHRoZSBzaGVsbCBjb21tYW5kKS4KLQotTm8gYXR0ZW1wdCBoYXMgYmVlbiBtYWRlIGF0IGNvZGluZyBmb3IgcGVyZm9ybWFuY2UuCi0KLVRyYW5zbGF0aW9uIHRhYmxlLi4uCi0KLSAgICBcKCAgICAoICAgICAodW5sZXNzIFJFX05PX0JLX1BBUkVOUyBzZXQpCi0gICAgXCkgICAgKSAgICAgKHVubGVzcyBSRV9OT19CS19QQVJFTlMgc2V0KQotICAgIFx8ICAgIHwgICAgICh1bmxlc3MgUkVfTk9fQktfVkJBUiBzZXQpCi0gICAgXDwgICAgXGIgICAgKG5vdCBxdWl0ZSB0aGUgc2FtZSwgYnV0IGFsbGEuLi4pCi0gICAgXD4gICAgXGIgICAgKG5vdCBxdWl0ZSB0aGUgc2FtZSwgYnV0IGFsbGEuLi4pCi0gICAgXGAgICAgXEEKLSAgICBcJyAgICBcWgotCi1Ob3QgdHJhbnNsYXRlZC4uLgotCi0gICAgLgotICAgIF4KLSAgICAkCi0gICAgKgotICAgICsgICAgICAgICAgICh1bmxlc3MgUkVfQktfUExVU19RTSBzZXQsIHRoZW4gdG8gXCspCi0gICAgPyAgICAgICAgICAgKHVubGVzcyBSRV9CS19QTFVTX1FNIHNldCwgdGhlbiB0byBcPykKLSAgICBcCi0gICAgXGIKLSAgICBcQgotICAgIFx3Ci0gICAgXFcKLSAgICBcMSAuLi4gXDkKLQotU3BlY2lhbCBjYXNlcy4uLgotCi0gICAgTm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgcmVwbGFjZWQgYnkgdGhlaXIgMy1kaWdpdAotICAgIGVzY2FwZSBjb2RlIChleGNlcHQgXHQsIFxuLCBcciwgd2hpY2ggdXNlIG1uZW1vbmljIGVzY2FwZXMpCi0KLSAgICBOZXdsaW5lIGlzIHR1cm5lZCBpbnRvIHwgd2hlbiBSRV9ORVdMSU5FX09SIGlzIHNldAotCi1YWFggVG8gYmUgZG9uZS4uLgotCi0gICAgWy4uLl0gICAgIChkaWZmZXJlbnQgdHJlYXRtZW50IG9mIGJhY2tzbGFzaGVkIGl0ZW1zPykKLSAgICBbXi4uLl0gICAgKGRpZmZlcmVudCB0cmVhdG1lbnQgb2YgYmFja3NsYXNoZWQgaXRlbXM/KQotICAgIF4gJCAqICsgPyAoaW4gc29tZSBlcnJvciBjb250ZXh0cyB0aGVzZSBhcmUgcHJvYmFibHkgdHJlYXRlZCBkaWZmZXJlbnRseSkKLSAgICBcdkREICBcREQgKGluIHRoZSByZWdleCBkb2NzIGJ1dCBvbmx5IHdvcmtzIHdoZW4gUkVfQU5TSV9IRVggc2V0KQotCi0iIiIKLQotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiogcmVnZXggLioiLCBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPTEpCi0KLWltcG9ydCByZWdleAotZnJvbSByZWdleF9zeW50YXggaW1wb3J0ICogIyBSRV8qCi0KLV9fYWxsX18gPSBbImNvbnZlcnQiLCJxdW90ZSJdCi0KLSMgRGVmYXVsdCB0cmFuc2xhdGlvbiB0YWJsZQotbWFzdGVydGFibGUgPSB7Ci0gICAgcidcPCc6IHInXGInLAotICAgIHInXD4nOiByJ1xiJywKLSAgICByJ1xgJzogcidcQScsCi0gICAgcidcJyc6IHInXFonLAotICAgIHInXCgnOiAnKCcsCi0gICAgcidcKSc6ICcpJywKLSAgICByJ1x8JzogJ3wnLAotICAgICcoJzogcidcKCcsCi0gICAgJyknOiByJ1wpJywKLSAgICAnfCc6IHInXHwnLAotICAgICdcdCc6IHInXHQnLAotICAgICdcbic6IHInXG4nLAotICAgICdccic6IHInXHInLAotfQotCi0KLWRlZiBjb252ZXJ0KHMsIHN5bnRheD1Ob25lKToKLSAgICAiIiJDb252ZXJ0IGEgcmVnZXggcmVndWxhciBleHByZXNzaW9uIHRvIHJlIHN5bnRheC4KLQotICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uLCBhcyBhIHN0cmluZyBvYmplY3QsCi0gICAganVzdCBsaWtlIGl0IHdvdWxkIGJlIHBhc3NlZCB0byByZWdleC5jb21waWxlKCkuICAoSS5lLiwgcGFzcyB0aGUKLSAgICBhY3R1YWwgc3RyaW5nIG9iamVjdCAtLSBzdHJpbmcgcXVvdGVzIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KLSAgICByZW1vdmVkIGFuZCB0aGUgc3RhbmRhcmQgZXNjYXBlIHByb2Nlc3NpbmcgaGFzIGFscmVhZHkgYmVlbiBkb25lLAotICAgIGUuZy4gYnkgZXZhbCgpLikKLQotICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJlZ2V4IHN5bnRheCB2YXJpYW50IHRvIGJlCi0gICAgdXNlZC4gIFRoaXMgaXMgYW4gaW50ZWdlciBtYXNrIGFzIHBhc3NlZCB0byByZWdleC5zZXRfc3ludGF4KCk7Ci0gICAgdGhlIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBpbiByZWdleF9zeW50YXguICBXaGVuIG5vdCBzcGVjaWZpZWQsIG9yCi0gICAgd2hlbiBOb25lIGlzIGdpdmVuLCB0aGUgY3VycmVudCByZWdleCBzeW50YXggbWFzayAoYXMgcmV0cmlldmVkIGJ5Ci0gICAgcmVnZXguZ2V0X3N5bnRheCgpKSBpcyB1c2VkIC0tIHdoaWNoIGlzIDAgYnkgZGVmYXVsdC4KLQotICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sIGFzIGEgc3RyaW5nIG9iamVjdCB0aGF0Ci0gICAgY291bGQgYmUgcGFzc2VkIHRvIHJlLmNvbXBpbGUoKS4gIChJLmUuLCBubyBzdHJpbmcgcXVvdGVzIGhhdmUKLSAgICBiZWVuIGFkZGVkIC0tIHVzZSBxdW90ZSgpIGJlbG93LCBvciByZXByKCkuKQotCi0gICAgVGhlIGNvbnZlcnNpb24gaXMgbm90IGFsd2F5cyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QuICBNb3JlCi0gICAgc3ludGFjdGljYWwgYW5hbHlzaXMgc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgYm9yZGVybGluZQotICAgIGNhc2VzIGFuZCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZW0uICBGb3IgZXhhbXBsZSwgJ3gqPycgaXMgbm90Ci0gICAgdHJhbnNsYXRlZCBjb3JyZWN0bHkuCi0KLSAgICAiIiIKLSAgICB0YWJsZSA9IG1hc3RlcnRhYmxlLmNvcHkoKQotICAgIGlmIHN5bnRheCBpcyBOb25lOgotICAgICAgICBzeW50YXggPSByZWdleC5nZXRfc3ludGF4KCkKLSAgICBpZiBzeW50YXggJiBSRV9OT19CS19QQVJFTlM6Ci0gICAgICAgIGRlbCB0YWJsZVtyJ1woJ10sIHRhYmxlW3InXCknXQotICAgICAgICBkZWwgdGFibGVbJygnXSwgdGFibGVbJyknXQotICAgIGlmIHN5bnRheCAmIFJFX05PX0JLX1ZCQVI6Ci0gICAgICAgIGRlbCB0YWJsZVtyJ1x8J10KLSAgICAgICAgZGVsIHRhYmxlWyd8J10KLSAgICBpZiBzeW50YXggJiBSRV9CS19QTFVTX1FNOgotICAgICAgICB0YWJsZVsnKyddID0gcidcKycKLSAgICAgICAgdGFibGVbJz8nXSA9IHInXD8nCi0gICAgICAgIHRhYmxlW3InXCsnXSA9ICcrJwotICAgICAgICB0YWJsZVtyJ1w/J10gPSAnPycKLSAgICBpZiBzeW50YXggJiBSRV9ORVdMSU5FX09SOgotICAgICAgICB0YWJsZVsnXG4nXSA9ICd8JwotICAgIHJlcyA9ICIiCi0KLSAgICBpID0gMAotICAgIGVuZCA9IGxlbihzKQotICAgIHdoaWxlIGkgPCBlbmQ6Ci0gICAgICAgIGMgPSBzW2ldCi0gICAgICAgIGkgPSBpKzEKLSAgICAgICAgaWYgYyA9PSAnXFwnOgotICAgICAgICAgICAgYyA9IHNbaV0KLSAgICAgICAgICAgIGkgPSBpKzEKLSAgICAgICAgICAgIGtleSA9ICdcXCcgKyBjCi0gICAgICAgICAgICBrZXkgPSB0YWJsZS5nZXQoa2V5LCBrZXkpCi0gICAgICAgICAgICByZXMgPSByZXMgKyBrZXkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGMgPSB0YWJsZS5nZXQoYywgYykKLSAgICAgICAgICAgIHJlcyA9IHJlcyArIGMKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIHF1b3RlKHMsIHF1b3RlPU5vbmUpOgotICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgb2JqZWN0IHRvIGEgcXVvdGVkIHN0cmluZyBsaXRlcmFsLgotCi0gICAgVGhpcyBpcyBzaW1pbGFyIHRvIHJlcHIoKSBidXQgd2lsbCByZXR1cm4gYSAicmF3IiBzdHJpbmcgKHInLi4uJwotICAgIG9yIHIiLi4uIikgd2hlbiB0aGUgc3RyaW5nIGNvbnRhaW5zIGJhY2tzbGFzaGVzLCBpbnN0ZWFkIG9mCi0gICAgZG91YmxpbmcgYWxsIGJhY2tzbGFzaGVzLiAgVGhlIHJlc3VsdGluZyBzdHJpbmcgZG9lcyAqbm90KiBhbHdheXMKLSAgICBldmFsdWF0ZSB0byB0aGUgc2FtZSBzdHJpbmcgYXMgdGhlIG9yaWdpbmFsOyBob3dldmVyIGl0IHdpbGwgZG8KLSAgICBqdXN0IHRoZSByaWdodCB0aGluZyB3aGVuIHBhc3NlZCBpbnRvIHJlLmNvbXBpbGUoKS4KLQotICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgZm9yY2VzIHRoZSBzdHJpbmcgcXVvdGU7IGl0IG11c3QgYmUKLSAgICBhIHNpbmdsZSBjaGFyYWN0ZXIgd2hpY2ggaXMgYSB2YWxpZCBQeXRob24gc3RyaW5nIHF1b3RlLgotCi0gICAgIiIiCi0gICAgaWYgcXVvdGUgaXMgTm9uZToKLSAgICAgICAgcSA9ICInIgotICAgICAgICBhbHRxID0gIiciCi0gICAgICAgIGlmIHEgaW4gcyBhbmQgYWx0cSBub3QgaW4gczoKLSAgICAgICAgICAgIHEgPSBhbHRxCi0gICAgZWxzZToKLSAgICAgICAgYXNzZXJ0IHF1b3RlIGluICgnIicsICInIiwgJyIiIicsICInJyciKQotICAgICAgICBxID0gcXVvdGUKLSAgICByZXMgPSBxCi0gICAgZm9yIGMgaW4gczoKLSAgICAgICAgaWYgYyA9PSBxOiBjID0gJ1xcJyArIGMKLSAgICAgICAgZWxpZiBjIDwgJyAnIG9yIGMgPiAnfic6IGMgPSAiXFwlMDNvIiAlIG9yZChjKQotICAgICAgICByZXMgPSByZXMgKyBjCi0gICAgcmVzID0gcmVzICsgcQotICAgIGlmICdcXCcgaW4gcmVzOgotICAgICAgICByZXMgPSAncicgKyByZXMKLSAgICByZXR1cm4gcmVzCi0KLQotZGVmIG1haW4oKToKLSAgICAiIiJNYWluIHByb2dyYW0gLS0gY2FsbGVkIHdoZW4gcnVuIGFzIGEgc2NyaXB0LiIiIgotICAgIGltcG9ydCBzeXMKLSAgICBzID0gZXZhbChzeXMuc3RkaW4ucmVhZCgpKQotICAgIHN5cy5zdGRvdXQud3JpdGUocXVvdGUoY29udmVydChzKSkpCi0gICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKToKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvcmVnZXhfc3ludGF4LnB5IGIvTGliL3JlZ2V4X3N5bnRheC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhMGRiZi4uMDAwMDAwMAotLS0gYS9MaWIvcmVnZXhfc3ludGF4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIiIiQ29uc3RhbnRzIGZvciBzZWxlY3RpbmcgcmVnZXhwIHN5bnRheGVzIGZvciB0aGUgb2Jzb2xldGUgcmVnZXggbW9kdWxlLgotCi1UaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgInJlZ2V4IiBoYXMgbm93Ci1iZWVuIHJlcGxhY2VkIGJ5IHRoZSBuZXcgcmVndWxhciBleHByZXNzaW9uIG1vZHVsZSwgInJlIi4KLQotVGhlc2UgYml0cyBhcmUgcGFzc2VkIHRvIHJlZ2V4LnNldF9zeW50YXgoKSB0byBjaG9vc2UgYW1vbmcKLWFsdGVybmF0aXZlIHJlZ2V4cCBzeW50YXhlcy4KLSIiIgotCi0jIDEgbWVhbnMgcGxhaW4gcGFyZW50aGVzZXMgc2VydmUgYXMgZ3JvdXBpbmcsIGFuZCBiYWNrc2xhc2gKLSMgICBwYXJlbnRoZXNlcyBhcmUgbmVlZGVkIGZvciBsaXRlcmFsIHNlYXJjaGluZy4KLSMgMCBtZWFucyBiYWNrc2xhc2gtcGFyZW50aGVzZXMgYXJlIGdyb3VwaW5nLCBhbmQgcGxhaW4gcGFyZW50aGVzZXMKLSMgICBhcmUgZm9yIGxpdGVyYWwgc2VhcmNoaW5nLgotUkVfTk9fQktfUEFSRU5TID0gMQotCi0jIDEgbWVhbnMgcGxhaW4gfCBzZXJ2ZXMgYXMgdGhlICJvciItb3BlcmF0b3IsIGFuZCBcfCBpcyBhIGxpdGVyYWwuCi0jIDAgbWVhbnMgXHwgc2VydmVzIGFzIHRoZSAib3IiLW9wZXJhdG9yLCBhbmQgfCBpcyBhIGxpdGVyYWwuCi1SRV9OT19CS19WQkFSID0gMgotCi0jIDAgbWVhbnMgcGxhaW4gKyBvciA/IHNlcnZlcyBhcyBhbiBvcGVyYXRvciwgYW5kIFwrLCBcPyBhcmUgbGl0ZXJhbHMuCi0jIDEgbWVhbnMgXCssIFw/IGFyZSBvcGVyYXRvcnMgYW5kIHBsYWluICssID8gYXJlIGxpdGVyYWxzLgotUkVfQktfUExVU19RTSA9IDQKLQotIyAxIG1lYW5zIHwgYmluZHMgdGlnaHRlciB0aGFuIF4gb3IgJC4KLSMgMCBtZWFucyB0aGUgY29udHJhcnkuCi1SRV9USUdIVF9WQkFSID0gOAotCi0jIDEgbWVhbnMgdHJlYXQgXG4gYXMgYW4gX09SIG9wZXJhdG9yCi0jIDAgbWVhbnMgdHJlYXQgaXQgYXMgYSBub3JtYWwgY2hhcmFjdGVyCi1SRV9ORVdMSU5FX09SID0gMTYKLQotIyAwIG1lYW5zIHRoYXQgYSBzcGVjaWFsIGNoYXJhY3RlcnMgKHN1Y2ggYXMgKiwgXiwgYW5kICQpIGFsd2F5cyBoYXZlCi0jICAgdGhlaXIgc3BlY2lhbCBtZWFuaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuCi0jIDEgbWVhbnMgdGhhdCBzcGVjaWFsIGNoYXJhY3RlcnMgbWF5IGFjdCBhcyBub3JtYWwgY2hhcmFjdGVycyBpbiBzb21lCi0jICAgY29udGV4dHMuICBTcGVjaWZpY2FsbHksIHRoaXMgYXBwbGllcyB0bzoKLSMgICAgICAgXiAtIG9ubHkgc3BlY2lhbCBhdCB0aGUgYmVnaW5uaW5nLCBvciBhZnRlciAoIG9yIHwKLSMgICAgICAgJCAtIG9ubHkgc3BlY2lhbCBhdCB0aGUgZW5kLCBvciBiZWZvcmUgKSBvciB8Ci0jICAgICAgICosICssID8gLSBvbmx5IHNwZWNpYWwgd2hlbiBub3QgYWZ0ZXIgdGhlIGJlZ2lubmluZywgKCwgb3IgfAotUkVfQ09OVEVYVF9JTkRFUF9PUFMgPSAzMgotCi0jIEFOU0kgc2VxdWVuY2VzIChcbiBldGMpIGFuZCBceGhoCi1SRV9BTlNJX0hFWCA9IDY0Ci0KLSMgTm8gR05VIGV4dGVuc2lvbnMKLVJFX05PX0dOVV9FWFRFTlNJT05TID0gMTI4Ci0KLSMgTm93IGRlZmluZSBjb21iaW5hdGlvbnMgb2YgYml0cyBmb3IgdGhlIHN0YW5kYXJkIHBvc3NpYmlsaXRpZXMuCi1SRV9TWU5UQVhfQVdLID0gKFJFX05PX0JLX1BBUkVOUyB8IFJFX05PX0JLX1ZCQVIgfCBSRV9DT05URVhUX0lOREVQX09QUykKLVJFX1NZTlRBWF9FR1JFUCA9IChSRV9TWU5UQVhfQVdLIHwgUkVfTkVXTElORV9PUikKLVJFX1NZTlRBWF9HUkVQID0gKFJFX0JLX1BMVVNfUU0gfCBSRV9ORVdMSU5FX09SKQotUkVfU1lOVEFYX0VNQUNTID0gMAotCi0jIChQeXRob24ncyBvYnNvbGV0ZSAicmVnZXhwIiBtb2R1bGUgdXNlZCBhIHN5bnRheCBzaW1pbGFyIHRvIGF3ay4pCmRpZmYgLS1naXQgYS9MaWIvcmVnc3ViLnB5IGIvTGliL3JlZ3N1Yi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMTBhNS4uMDAwMDAwMAotLS0gYS9MaWIvcmVnc3ViLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLSIiIlJlZ2V4cC1iYXNlZCBzcGxpdCBhbmQgcmVwbGFjZSB1c2luZyB0aGUgb2Jzb2xldGUgcmVnZXggbW9kdWxlLgotCi1UaGlzIG1vZHVsZSBpcyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgVGhlc2Ugb3BlcmF0aW9ucwotYXJlIG5vdyBwcm92aWRlZCBieSB0aGUgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2R1bGUsICJyZSIuCi0KLXN1YihwYXQsIHJlcGwsIHN0cik6ICAgICAgICByZXBsYWNlIGZpcnN0IG9jY3VycmVuY2Ugb2YgcGF0dGVybiBpbiBzdHJpbmcKLWdzdWIocGF0LCByZXBsLCBzdHIpOiAgICAgICByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIGluIHN0cmluZwotc3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0KTogIHNwbGl0IHN0cmluZyB1c2luZyBwYXR0ZXJuIGFzIGRlbGltaXRlcgotc3BsaXR4KHN0ciwgcGF0LCBtYXhzcGxpdCk6IHNwbGl0IHN0cmluZyB1c2luZyBwYXR0ZXJuIGFzIGRlbGltaXRlciBwbHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGltaXRlcnMKLSIiIgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oInRoZSByZWdzdWIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgcmUuc3ViKCkiLAotICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCi0KLSMgSWdub3JlIGZ1cnRoZXIgZGVwcmVjYXRpb24gd2FybmluZ3MgYWJvdXQgdGhpcyBtb2R1bGUKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKLQotaW1wb3J0IHJlZ2V4Ci0KLV9fYWxsX18gPSBbInN1YiIsImdzdWIiLCJzcGxpdCIsInNwbGl0eCIsImNhcHdvcmRzIl0KLQotIyBSZXBsYWNlIGZpcnN0IG9jY3VycmVuY2Ugb2YgcGF0dGVybiBwYXQgaW4gc3RyaW5nIHN0ciBieSByZXBsYWNlbWVudAotIyByZXBsLiAgSWYgdGhlIHBhdHRlcm4gaXNuJ3QgZm91bmQsIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotIyBUaGUgcmVwbGFjZW1lbnQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyBcZGlnaXQgdG8gc3VicGF0dGVybnMgYW5kCi0jIGVzY2FwZWQgYmFja3NsYXNoZXMuICBUaGUgcGF0dGVybiBtYXkgYmUgYSBzdHJpbmcgb3IgYW4gYWxyZWFkeQotIyBjb21waWxlZCBwYXR0ZXJuLgotCi1kZWYgc3ViKHBhdCwgcmVwbCwgc3RyKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgaWYgcHJvZy5zZWFyY2goc3RyKSA+PSAwOgotICAgICAgICByZWdzID0gcHJvZy5yZWdzCi0gICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIHN0ciA9IHN0cls6YV0gKyBleHBhbmQocmVwbCwgcmVncywgc3RyKSArIHN0cltiOl0KLSAgICByZXR1cm4gc3RyCi0KLQotIyBSZXBsYWNlIGFsbCAobm9uLW92ZXJsYXBwaW5nKSBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIHBhdCBpbiBzdHJpbmcKLSMgc3RyIGJ5IHJlcGxhY2VtZW50IHJlcGwuICBUaGUgc2FtZSBydWxlcyBhcyBmb3Igc3ViKCkgYXBwbHkuCi0jIEVtcHR5IG1hdGNoZXMgZm9yIHRoZSBwYXR0ZXJuIGFyZSByZXBsYWNlZCBvbmx5IHdoZW4gbm90IGFkamFjZW50IHRvCi0jIGEgcHJldmlvdXMgbWF0Y2gsIHNvIGUuZy4gZ3N1YignJywgJy0nLCAnYWJjJykgcmV0dXJucyAnLWEtYi1jLScuCi0KLWRlZiBnc3ViKHBhdCwgcmVwbCwgc3RyKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgbmV3ID0gJycKLSAgICBzdGFydCA9IDAKLSAgICBmaXJzdCA9IDEKLSAgICB3aGlsZSBwcm9nLnNlYXJjaChzdHIsIHN0YXJ0KSA+PSAwOgotICAgICAgICByZWdzID0gcHJvZy5yZWdzCi0gICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIGlmIGEgPT0gYiA9PSBzdGFydCBhbmQgbm90IGZpcnN0OgotICAgICAgICAgICAgaWYgc3RhcnQgPj0gbGVuKHN0cikgb3IgcHJvZy5zZWFyY2goc3RyLCBzdGFydCsxKSA8IDA6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgICAgIGEsIGIgPSByZWdzWzBdCi0gICAgICAgIG5ldyA9IG5ldyArIHN0cltzdGFydDphXSArIGV4cGFuZChyZXBsLCByZWdzLCBzdHIpCi0gICAgICAgIHN0YXJ0ID0gYgotICAgICAgICBmaXJzdCA9IDAKLSAgICBuZXcgPSBuZXcgKyBzdHJbc3RhcnQ6XQotICAgIHJldHVybiBuZXcKLQotCi0jIFNwbGl0IHN0cmluZyBzdHIgaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nIHBhdHRlcm4KLSMgcGF0LiAgT25seSBub24tZW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIGNvbnNpZGVyZWQsIHNvIGUuZy4KLSMgc3BsaXQoJ2FiYycsICcnKSByZXR1cm5zIFsnYWJjJ10uCi0jIFRoZSBvcHRpb25hbCAzcmQgYXJndW1lbnQgc2V0cyB0aGUgbnVtYmVyIG9mIHNwbGl0cyB0aGF0IGFyZSBwZXJmb3JtZWQuCi0KLWRlZiBzcGxpdChzdHIsIHBhdCwgbWF4c3BsaXQgPSAwKToKLSAgICByZXR1cm4gaW50c3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0LCAwKQotCi0jIFNwbGl0IHN0cmluZyBzdHIgaW4gZmllbGRzIHNlcGFyYXRlZCBieSBkZWxpbWl0ZXJzIG1hdGNoaW5nIHBhdHRlcm4KLSMgcGF0LiAgT25seSBub24tZW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIGNvbnNpZGVyZWQsIHNvIGUuZy4KLSMgc3BsaXQoJ2FiYycsICcnKSByZXR1cm5zIFsnYWJjJ10uIFRoZSBkZWxpbWl0ZXJzIGFyZSBhbHNvIGluY2x1ZGVkCi0jIGluIHRoZSBsaXN0LgotIyBUaGUgb3B0aW9uYWwgM3JkIGFyZ3VtZW50IHNldHMgdGhlIG51bWJlciBvZiBzcGxpdHMgdGhhdCBhcmUgcGVyZm9ybWVkLgotCi0KLWRlZiBzcGxpdHgoc3RyLCBwYXQsIG1heHNwbGl0ID0gMCk6Ci0gICAgcmV0dXJuIGludHNwbGl0KHN0ciwgcGF0LCBtYXhzcGxpdCwgMSkKLQotIyBJbnRlcm5hbCBmdW5jdGlvbiB1c2VkIHRvIGltcGxlbWVudCBzcGxpdCgpIGFuZCBzcGxpdHgoKS4KLQotZGVmIGludHNwbGl0KHN0ciwgcGF0LCBtYXhzcGxpdCwgcmV0YWluKToKLSAgICBwcm9nID0gY29tcGlsZShwYXQpCi0gICAgcmVzID0gW10KLSAgICBzdGFydCA9IG5leHQgPSAwCi0gICAgc3BsaXRjb3VudCA9IDAKLSAgICB3aGlsZSBwcm9nLnNlYXJjaChzdHIsIG5leHQpID49IDA6Ci0gICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgYSwgYiA9IHJlZ3NbMF0KLSAgICAgICAgaWYgYSA9PSBiOgotICAgICAgICAgICAgbmV4dCA9IG5leHQgKyAxCi0gICAgICAgICAgICBpZiBuZXh0ID49IGxlbihzdHIpOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXMuYXBwZW5kKHN0cltzdGFydDphXSkKLSAgICAgICAgICAgIGlmIHJldGFpbjoKLSAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHN0clthOmJdKQotICAgICAgICAgICAgc3RhcnQgPSBuZXh0ID0gYgotICAgICAgICAgICAgc3BsaXRjb3VudCA9IHNwbGl0Y291bnQgKyAxCi0gICAgICAgICAgICBpZiAobWF4c3BsaXQgYW5kIChzcGxpdGNvdW50ID49IG1heHNwbGl0KSk6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICByZXMuYXBwZW5kKHN0cltzdGFydDpdKQotICAgIHJldHVybiByZXMKLQotCi0jIENhcGl0YWxpemUgd29yZHMgc3BsaXQgdXNpbmcgYSBwYXR0ZXJuCi0KLWRlZiBjYXB3b3JkcyhzdHIsIHBhdD0nW15hLXpBLVowLTlfXSsnKToKLSAgICB3b3JkcyA9IHNwbGl0eChzdHIsIHBhdCkKLSAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKLSAgICAgICAgd29yZHNbaV0gPSB3b3Jkc1tpXS5jYXBpdGFsaXplKCkKLSAgICByZXR1cm4gIiIuam9pbih3b3JkcykKLQotCi0jIEludGVybmFsIHN1YnJvdXRpbmVzOgotIyBjb21waWxlKHBhdCk6IGNvbXBpbGUgYSBwYXR0ZXJuLCBjYWNoaW5nIGFscmVhZHkgY29tcGlsZWQgcGF0dGVybnMKLSMgZXhwYW5kKHJlcGwsIHJlZ3MsIHN0cik6IGV4cGFuZCBcZGlnaXQgZXNjYXBlcyBpbiByZXBsYWNlbWVudCBzdHJpbmcKLQotCi0jIE1hbmFnZSBhIGNhY2hlIG9mIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi0jCi0jIElmIHRoZSBwYXR0ZXJuIGlzIGEgc3RyaW5nIGEgY29tcGlsZWQgdmVyc2lvbiBvZiBpdCBpcyByZXR1cm5lZC4gIElmCi0jIHRoZSBwYXR0ZXJuIGhhcyBiZWVuIHVzZWQgYmVmb3JlIHdlIHJldHVybiBhbiBhbHJlYWR5IGNvbXBpbGVkCi0jIHZlcnNpb24gZnJvbSB0aGUgY2FjaGU7IG90aGVyd2lzZSB3ZSBjb21waWxlIGl0IG5vdyBhbmQgc2F2ZSB0aGUKLSMgY29tcGlsZWQgdmVyc2lvbiBpbiB0aGUgY2FjaGUsIGFsb25nIHdpdGggdGhlIHN5bnRheCBpdCB3YXMgY29tcGlsZWQKLSMgd2l0aC4gIEluc3RlYWQgb2YgYSBzdHJpbmcsIGEgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGNhbiBhbHNvCi0jIGJlIHBhc3NlZC4KLQotY2FjaGUgPSB7fQotCi1kZWYgY29tcGlsZShwYXQpOgotICAgIGlmIHR5cGUocGF0KSAhPSB0eXBlKCcnKToKLSAgICAgICAgcmV0dXJuIHBhdCAgICAgICAgICAgICAgIyBBc3N1bWUgaXQgaXMgYSBjb21waWxlZCByZWdleAotICAgIGtleSA9IChwYXQsIHJlZ2V4LmdldF9zeW50YXgoKSkKLSAgICBpZiBrZXkgaW4gY2FjaGU6Ci0gICAgICAgIHByb2cgPSBjYWNoZVtrZXldICAgICAgICMgR2V0IGl0IGZyb20gdGhlIGNhY2hlCi0gICAgZWxzZToKLSAgICAgICAgcHJvZyA9IGNhY2hlW2tleV0gPSByZWdleC5jb21waWxlKHBhdCkKLSAgICByZXR1cm4gcHJvZwotCi0KLWRlZiBjbGVhcl9jYWNoZSgpOgotICAgIGdsb2JhbCBjYWNoZQotICAgIGNhY2hlID0ge30KLQotCi0jIEV4cGFuZCBcZGlnaXQgaW4gdGhlIHJlcGxhY2VtZW50LgotIyBFYWNoIG9jY3VycmVuY2Ugb2YgXGRpZ2l0IGlzIHJlcGxhY2VkIGJ5IHRoZSBzdWJzdHJpbmcgb2Ygc3RyCi0jIGluZGljYXRlZCBieSByZWdzW2RpZ2l0XS4gIFRvIGluY2x1ZGUgYSBsaXRlcmFsIFwgaW4gdGhlCi0jIHJlcGxhY2VtZW50LCBkb3VibGUgaXQ7IG90aGVyIFwgZXNjYXBlcyBhcmUgbGVmdCB1bmNoYW5nZWQgKGkuZS4KLSMgdGhlIFwgYW5kIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGFyZSBib3RoIGNvcGllZCkuCi0KLWRlZiBleHBhbmQocmVwbCwgcmVncywgc3RyKToKLSAgICBpZiAnXFwnIG5vdCBpbiByZXBsOgotICAgICAgICByZXR1cm4gcmVwbAotICAgIG5ldyA9ICcnCi0gICAgaSA9IDAKLSAgICBvcmQwID0gb3JkKCcwJykKLSAgICB3aGlsZSBpIDwgbGVuKHJlcGwpOgotICAgICAgICBjID0gcmVwbFtpXTsgaSA9IGkrMQotICAgICAgICBpZiBjICE9ICdcXCcgb3IgaSA+PSBsZW4ocmVwbCk6Ci0gICAgICAgICAgICBuZXcgPSBuZXcgKyBjCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBjID0gcmVwbFtpXTsgaSA9IGkrMQotICAgICAgICAgICAgaWYgJzAnIDw9IGMgPD0gJzknOgotICAgICAgICAgICAgICAgIGEsIGIgPSByZWdzW29yZChjKS1vcmQwXQotICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArIHN0clthOmJdCi0gICAgICAgICAgICBlbGlmIGMgPT0gJ1xcJzoKLSAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBjCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArICdcXCcgKyBjCi0gICAgcmV0dXJuIG5ldwotCi0KLSMgVGVzdCBwcm9ncmFtLCByZWFkcyBzZXF1ZW5jZXMgInBhdCByZXBsIHN0ciIgZnJvbSBzdGRpbi4KLSMgT3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVzIHBhdHRlcm4gdXNlZCB0byBzcGxpdCBsaW5lcy4KLQotZGVmIHRlc3QoKToKLSAgICBpbXBvcnQgc3lzCi0gICAgaWYgc3lzLmFyZ3ZbMTpdOgotICAgICAgICBkZWxwYXQgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIGRlbHBhdCA9ICdbIFx0XG5dKycKLSAgICB3aGlsZSAxOgotICAgICAgICBpZiBzeXMuc3RkaW4uaXNhdHR5KCk6IHN5cy5zdGRlcnIud3JpdGUoJy0tPiAnKQotICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgIGlmIGxpbmVbLTFdID09ICdcbic6IGxpbmUgPSBsaW5lWzotMV0KLSAgICAgICAgZmllbGRzID0gc3BsaXQobGluZSwgZGVscGF0KQotICAgICAgICBpZiBsZW4oZmllbGRzKSAhPSAzOgotICAgICAgICAgICAgcHJpbnQgJ1NvcnJ5LCBub3QgdGhyZWUgZmllbGRzJwotICAgICAgICAgICAgcHJpbnQgJ3NwbGl0OicsIHJlcHIoZmllbGRzKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgW3BhdCwgcmVwbCwgc3RyXSA9IHNwbGl0KGxpbmUsIGRlbHBhdCkKLSAgICAgICAgcHJpbnQgJ3N1YiA6JywgcmVwcihzdWIocGF0LCByZXBsLCBzdHIpKQotICAgICAgICBwcmludCAnZ3N1YjonLCByZXByKGdzdWIocGF0LCByZXBsLCBzdHIpKQpkaWZmIC0tZ2l0IGEvTGliL3JleGVjLnB5IGIvTGliL3JleGVjLnB5CmluZGV4IGVkMDFkMjQuLjEwZTRiYzAgMTAwNjQ0Ci0tLSBhL0xpYi9yZXhlYy5weQorKysgYi9MaWIvcmV4ZWMucHkKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgIG9rX2J1aWx0aW5fbW9kdWxlcyA9ICgnYXVkaW9vcCcsICdhcnJheScsICdiaW5hc2NpaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbWF0aCcsICdlcnJubycsICdpbWFnZW9wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcnNoYWwnLCAnbWF0aCcsICdtZDUnLCAnb3BlcmF0b3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyc2VyJywgJ3JlZ2V4JywgJ3NlbGVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZXInLCAnc2VsZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYScsICdfc3JlJywgJ3N0cm9wJywgJ3N0cnVjdCcsICd0aW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ193ZWFrcmVmJykKIApkaWZmIC0tZ2l0IGEvTGliL3J1bnB5LnB5IGIvTGliL3J1bnB5LnB5CmluZGV4IGFmYjAwOTguLjgyOTBkZmUgMTAwNzU1Ci0tLSBhL0xpYi9ydW5weS5weQorKysgYi9MaWIvcnVucHkucHkKQEAgLTExLDM0OSArMTEsMTUgQEAKIAogaW1wb3J0IHN5cwogaW1wb3J0IGltcAordHJ5OgorICAgIGZyb20gaW1wIGltcG9ydCBnZXRfbG9hZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfbG9hZGVyCiAKIF9fYWxsX18gPSBbCiAgICAgInJ1bl9tb2R1bGUiLAogXQogCi10cnk6Ci0gICAgX2dldF9sb2FkZXIgPSBpbXAuZ2V0X2xvYWRlcgotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICMgZ2V0X2xvYWRlcigpIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgaW1wIG1vZHVsZSwgc28gZW11bGF0ZSBpdAotICAgICMgYXMgYmVzdCB3ZSBjYW4gdXNpbmcgdGhlIFBFUCAzMDIgaW1wb3J0IG1hY2hpbmVyeSBleHBvc2VkIHNpbmNlCi0gICAgIyBQeXRob24gMi4zLiBUaGUgZW11bGF0aW9uIGlzbid0IHBlcmZlY3QsIGJ1dCB0aGUgZGlmZmVyZW5jZXMKLSAgICAjIGluIHRoZSB3YXkgbmFtZXMgYXJlIHNoYWRvd2VkIHNob3VsZG4ndCBtYXR0ZXIgaW4gcHJhY3RpY2UuCi0gICAgaW1wb3J0IG9zLnBhdGgKLSAgICBpbXBvcnQgbWFyc2hhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIGNvbXBpbGVkIFB5dGhvbiBmaWxlcwotCi0gICAgIyBUaGlzIGhlbHBlciBpcyBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBQRVAgMzAyIGVtdWxhdGlvbiB0bwotICAgICMgY29ycmVjdGx5IGhhbmRsZSBjb21waWxlZCBmaWxlcwotICAgIGRlZiBfcmVhZF9jb21waWxlZF9maWxlKGNvbXBpbGVkX2ZpbGUpOgotICAgICAgICBtYWdpYyA9IGNvbXBpbGVkX2ZpbGUucmVhZCg0KQotICAgICAgICBpZiBtYWdpYyAhPSBpbXAuZ2V0X21hZ2ljKCk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb21waWxlZF9maWxlLnJlYWQoNCkgIyBTa2lwIHRpbWVzdGFtcAotICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWwubG9hZChjb21waWxlZF9maWxlKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGNsYXNzIF9BYnNvbHV0ZUltcG9ydGVyKG9iamVjdCk6Ci0gICAgICAgICIiIlBFUCAzMDIgaW1wb3J0ZXIgd3JhcHBlciBmb3IgdG9wIGxldmVsIGltcG9ydCBtYWNoaW5lcnkiIiIKLSAgICAgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIG1vZF9uYW1lLCBwYXRoPU5vbmUpOgotICAgICAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGZpbGUsIGZpbGVuYW1lLCBtb2RfaW5mbyA9IGltcC5maW5kX21vZHVsZShtb2RfbmFtZSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgc3VmZml4LCBtb2RlLCBtb2RfdHlwZSA9IG1vZF9pbmZvCi0gICAgICAgICAgICBpZiBtb2RfdHlwZSA9PSBpbXAuUFlfU09VUkNFOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Tb3VyY2VGaWxlTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLlBZX0NPTVBJTEVEOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Db21waWxlZEZpbGVMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5QS0dfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9QYWNrYWdlRGlyTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLkNfRVhURU5TSU9OOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9GaWxlU3lzdGVtTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX0Jhc2ljTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICByZXR1cm4gbG9hZGVyCi0KLQotICAgIGNsYXNzIF9GaWxlU3lzdGVtSW1wb3J0ZXIob2JqZWN0KToKLSAgICAgICAgIiIiUEVQIDMwMiBpbXBvcnRlciB3cmFwcGVyIGZvciBmaWxlc3lzdGVtIGJhc2VkIGltcG9ydHMiIiIKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGhfaXRlbT1Ob25lKToKLSAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBpZiBwYXRoX2l0ZW0gIT0gJycgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGhfaXRlbSk6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgcGF0aF9pdGVtKQotICAgICAgICAgICAgICAgIHNlbGYucGF0aF9kaXIgPSBwYXRoX2l0ZW0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkZpbGVzeXN0ZW0gaW1wb3J0ZXIgcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIGRpcmVjdG9yeSBuYW1lIikKLQotICAgICAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgbW9kX25hbWUsIHBhdGg9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICBwYXRoX2RpciA9IHNlbGYucGF0aF9kaXIKLSAgICAgICAgICAgIGlmIHBhdGhfZGlyID09ICcnOgotICAgICAgICAgICAgICAgIHBhdGhfZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICAgIHN1Yl9uYW1lID0gbW9kX25hbWUucnNwbGl0KCIuIiwgMSlbLTFdCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIG1vZF9pbmZvID0gaW1wLmZpbmRfbW9kdWxlKHN1Yl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0aF9kaXJdKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICBpZiBub3QgZmlsZW5hbWUuc3RhcnRzd2l0aChwYXRoX2Rpcik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIHN1ZmZpeCwgbW9kZSwgbW9kX3R5cGUgPSBtb2RfaW5mbwotICAgICAgICAgICAgaWYgbW9kX3R5cGUgPT0gaW1wLlBZX1NPVVJDRToKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfU291cmNlRmlsZUxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5QWV9DT01QSUxFRDoKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfQ29tcGlsZWRGaWxlTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfUGFja2FnZURpckxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5DX0VYVEVOU0lPTjoKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfRmlsZVN5c3RlbUxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9CYXNpY0xvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgotCi0KLSAgICBjbGFzcyBfQmFzaWNMb2FkZXIob2JqZWN0KToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgdG9wIGxldmVsIGltcG9ydCBtYWNoaW5lcnkiIiIKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZF9uYW1lLCBmaWxlLCBmaWxlbmFtZSwgbW9kX2luZm8pOgotICAgICAgICAgICAgc2VsZi5tb2RfbmFtZSA9IG1vZF9uYW1lCi0gICAgICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCi0gICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKLSAgICAgICAgICAgIHNlbGYubW9kX2luZm8gPSBtb2RfaW5mbwotCi0gICAgICAgIGRlZiBfZml4X25hbWUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgaWYgbW9kX25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYubW9kX25hbWUKLSAgICAgICAgICAgIGVsaWYgbW9kX25hbWUgIT0gc2VsZi5tb2RfbmFtZToKLSAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTG9hZGVyIGZvciBtb2R1bGUgJXMgY2Fubm90IGhhbmRsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSAlcyIgJSAoc2VsZi5tb2RfbmFtZSwgbW9kX25hbWUpKQotICAgICAgICAgICAgcmV0dXJuIG1vZF9uYW1lCi0KLSAgICAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIG1vZCA9IGltcC5sb2FkX21vZHVsZShtb2RfbmFtZSwgc2VsZi5maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHNlbGYubW9kX2luZm8pCi0gICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYgICMgZm9yIGludHJvc3BlY3Rpb24KLSAgICAgICAgICAgIHJldHVybiBtb2QKLQotICAgICAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBnZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuZmlsZToKLSAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQotCi0gICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0KLQotICAgIGNsYXNzIF9GaWxlU3lzdGVtTG9hZGVyKF9CYXNpY0xvYWRlcik6Ci0gICAgICAgICIiIlBFUCAzMDIgbG9hZGVyIHdyYXBwZXIgZm9yIGZpbGVzeXN0ZW0gYmFzZWQgaW1wb3J0cyIiIgotICAgICAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKG1vZF9uYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9jb2RlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBnZXRfZGF0YShzZWxmLCBwYXRobmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gb3BlbihwYXRobmFtZSwgInJiIikucmVhZCgpCi0KLSAgICAgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIG1vZF9uYW1lID0gc2VsZi5fZml4X25hbWUobW9kX25hbWUpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2ZpbGVuYW1lKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBnZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc291cmNlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9pc19wYWNrYWdlKG1vZF9uYW1lKQotCi0gICAgICAgIGRlZiBfZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICBkZWYgX2dldF9maWxlbmFtZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQotCi0gICAgICAgIGRlZiBfZ2V0X3NvdXJjZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBfaXNfcGFja2FnZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGNsYXNzIF9QYWNrYWdlRGlyTG9hZGVyKF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgUEtHX0RJUkVDVE9SWSBkaXJlY3RvcmllcyIiIgotICAgICAgICBkZWYgX2lzX3BhY2thZ2Uoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotCi0gICAgY2xhc3MgX1NvdXJjZUZpbGVMb2FkZXIoX0ZpbGVTeXN0ZW1Mb2FkZXIpOgotICAgICAgICAiIiJQRVAgMzAyIGxvYWRlciB3cmFwcGVyIGZvciBQWV9TT1VSQ0UgbW9kdWxlcyIiIgotICAgICAgICBkZWYgX2dldF9jb2RlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIHJldHVybiBjb21waWxlKHNlbGYuX2dldF9zb3VyY2UobW9kX25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgJ2V4ZWMnKQotCi0gICAgICAgIGRlZiBfZ2V0X3NvdXJjZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICBmID0gc2VsZi5maWxlCi0gICAgICAgICAgICBmLnNlZWsoMCkKLSAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQotCi0KLSAgICBjbGFzcyBfQ29tcGlsZWRGaWxlTG9hZGVyKF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgUFlfQ09NUElMRUQgbW9kdWxlcyIiIgotICAgICAgICBkZWYgX2dldF9jb2RlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIGYgPSBzZWxmLmZpbGUKLSAgICAgICAgICAgIGYuc2VlaygwKQotICAgICAgICAgICAgcmV0dXJuIF9yZWFkX2NvbXBpbGVkX2ZpbGUoZikKLQotCi0gICAgZGVmIF9nZXRfaW1wb3J0ZXIocGF0aF9pdGVtKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGltcG9ydGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBpdGVtCi0KLSAgICAgICAgVGhlIHJldHVybmVkIGltcG9ydGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQotICAgICAgICBpZiBpdCB3YXMgbmV3bHkgY3JlYXRlZCBieSBhIHBhdGggaG9vay4KLQotICAgICAgICBJZiB0aGVyZSBpcyBubyBpbXBvcnRlciwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYmFzaWMgaW1wb3J0Ci0gICAgICAgIG1hY2hpbmVyeSBpcyByZXR1cm5lZC4gVGhpcyB3cmFwcGVyIGlzIG5ldmVyIGluc2VydGVkIGludG8KLSAgICAgICAgdGhlIGltcG9ydGVyIGNhY2hlIChOb25lIGlzIGluc2VydGVkIGluc3RlYWQpLgotCi0gICAgICAgIFRoZSBjYWNoZSAob3IgcGFydCBvZiBpdCkgY2FuIGJlIGNsZWFyZWQgbWFudWFsbHkgaWYgYQotICAgICAgICByZXNjYW4gb2Ygc3lzLnBhdGhfaG9va3MgaXMgbmVjZXNzYXJ5LgotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaW1wb3J0ZXIgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2l0ZW1dCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIGZvciBwYXRoX2hvb2sgaW4gc3lzLnBhdGhfaG9va3M6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpbXBvcnRlciA9IHBhdGhfaG9vayhwYXRoX2l0ZW0pCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQotICAgICAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF9pdGVtXSA9IGltcG9ydGVyCi0gICAgICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBfRmlsZVN5c3RlbUltcG9ydGVyKHBhdGhfaXRlbSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHJldHVybiBpbXBvcnRlcgotCi0KLSAgICBkZWYgX2dldF9wYXRoX2xvYWRlcihtb2RfbmFtZSwgcGF0aD1Ob25lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGxvYWRlciB1c2luZyBhIHBhdGggaW1wb3J0ZXIiIiIKLSAgICAgICAgaWYgcGF0aCBpcyBOb25lOgotICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCi0gICAgICAgICAgICBhYnNvbHV0ZV9sb2FkZXIgPSBfQWJzb2x1dGVJbXBvcnRlcigpLmZpbmRfbW9kdWxlKG1vZF9uYW1lKQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhYnNvbHV0ZV9sb2FkZXIsIF9GaWxlU3lzdGVtTG9hZGVyKToKLSAgICAgICAgICAgICAgICAjIEZvdW5kIGluIGZpbGVzeXN0ZW0sIHNvIHNjYW4gcGF0aCBob29rcwotICAgICAgICAgICAgICAgICMgYmVmb3JlIGFjY2VwdGluZyB0aGlzIG9uZSBhcyB0aGUgcmlnaHQgb25lCi0gICAgICAgICAgICAgICAgbG9hZGVyID0gTm9uZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjIE5vdCBmb3VuZCBpbiBmaWxlc3lzdGVtLCBzbyB1c2UgdG9wLWxldmVsIGxvYWRlcgotICAgICAgICAgICAgICAgIGxvYWRlciA9IGFic29sdXRlX2xvYWRlcgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbG9hZGVyID0gYWJzb2x1dGVfbG9hZGVyID0gTm9uZQotICAgICAgICBpZiBsb2FkZXIgaXMgTm9uZToKLSAgICAgICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKLSAgICAgICAgICAgICAgICBpbXBvcnRlciA9IF9nZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQotICAgICAgICAgICAgICAgIGlmIGltcG9ydGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBhIGxvYWRlciBmb3Igb3VyIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBObyBwYXRoIGhvb2sgZm91bmQsIHNvIGFjY2VwdCB0aGUgdG9wIGxldmVsIGxvYWRlcgotICAgICAgICAgICAgICAgIGxvYWRlciA9IGFic29sdXRlX2xvYWRlcgotICAgICAgICByZXR1cm4gbG9hZGVyCi0KLSAgICBkZWYgX2dldF9wYWNrYWdlKHBrZ19uYW1lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBuYW1lZCBwYWNrYWdlIiIiCi0gICAgICAgIHBrZyA9IF9faW1wb3J0X18ocGtnX25hbWUpCi0gICAgICAgIHN1Yl9wa2dfbmFtZXMgPSBwa2dfbmFtZS5zcGxpdCgiLiIpCi0gICAgICAgIGZvciBzdWJfcGtnIGluIHN1Yl9wa2dfbmFtZXNbMTpdOgotICAgICAgICAgICAgcGtnID0gZ2V0YXR0cihwa2csIHN1Yl9wa2cpCi0gICAgICAgIHJldHVybiBwa2cKLQotICAgIGRlZiBfZ2V0X2xvYWRlcihtb2RfbmFtZSwgcGF0aD1Ob25lKToKLSAgICAgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGxvYWRlciBmb3IgdGhlIGdpdmVuIG1vZHVsZSBvciBwYWNrYWdlCi0KLSAgICAgICAgSWYgdGhlIG1vZHVsZSBvciBwYWNrYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBub3JtYWwgaW1wb3J0Ci0gICAgICAgIG1lY2hhbmlzbSwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGF0IG1hY2hpbmVyeQotICAgICAgICBpcyByZXR1cm5lZC4KLQotICAgICAgICBOb24gUEVQIDMwMiBtZWNoYW5pc21zIChlLmcuIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5KSB1c2VkIGJ5IHRoZQotICAgICAgICBzdGFuZGFyZCBpbXBvcnQgbWFjaGluZXJ5IHRvIGZpbmQgZmlsZXMgaW4gYWx0ZXJuYXRpdmUgbG9jYXRpb25zCi0gICAgICAgIGFyZSBwYXJ0aWFsbHkgc3VwcG9ydGVkLCBidXQgYXJlIHNlYXJjaGVkIEFGVEVSIHN5cy5wYXRoLiBOb3JtYWxseSwKLSAgICAgICAgdGhlc2UgbG9jYXRpb25zIGFyZSBzZWFyY2hlZCBCRUZPUkUgc3lzLnBhdGgsIHByZXZlbnRpbmcgc3lzLnBhdGgKLSAgICAgICAgZW50cmllcyBmcm9tIHNoYWRvd2luZyB0aGVtLgotICAgICAgICBGb3IgdGhpcyB0byBjYXVzZSBhIHZpc2libGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvdXIsIHRoZXJlIG11c3QKLSAgICAgICAgYmUgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lIHRoYXQgaXMgYWNjZXNzaWJsZSB2aWEgYm90aCBzeXMucGF0aAotICAgICAgICBhbmQgb25lIG9mIHRoZSBub24gUEVQIDMwMiBmaWxlIHN5c3RlbSBtZWNoYW5pc21zLiBJbiB0aGlzIGNhc2UsCi0gICAgICAgIHRoZSBlbXVsYXRpb24gd2lsbCBmaW5kIHRoZSBmb3JtZXIgdmVyc2lvbiwgd2hpbGUgdGhlIGJ1aWx0aW4KLSAgICAgICAgaW1wb3J0IG1lY2hhbmlzbSB3aWxsIGZpbmQgdGhlIGxhdHRlci4KLSAgICAgICAgSXRlbXMgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgdGhpcyBkaXNjcmVwYW5jeToKLSAgICAgICAgICAgIGltcC5DX0VYVEVOU0lPTgotICAgICAgICAgICAgaW1wLlBZX1NPVVJDRQotICAgICAgICAgICAgaW1wLlBZX0NPTVBJTEVECi0gICAgICAgICAgICBpbXAuUEtHX0RJUkVDVE9SWQotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbG9hZGVyID0gc3lzLm1vZHVsZXNbbW9kX25hbWVdLl9fbG9hZGVyX18KLSAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgQXR0cmlidXRlRXJyb3IpOgotICAgICAgICAgICAgbG9hZGVyID0gTm9uZQotICAgICAgICBpZiBsb2FkZXIgaXMgTm9uZToKLSAgICAgICAgICAgIGltcC5hY3F1aXJlX2xvY2soKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgTW9kdWxlIG5vdCBpbiBzeXMubW9kdWxlcywgb3IgdXNlcyBhbiB1bmhvb2tlZCBsb2FkZXIKLSAgICAgICAgICAgICAgICBwYXJ0cyA9IG1vZF9uYW1lLnJzcGxpdCgiLiIsIDEpCi0gICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyOgotICAgICAgICAgICAgICAgICAgICAjIFN1YiBwYWNrYWdlLCBzbyB1c2UgcGFyZW50IHBhY2thZ2UncyBwYXRoCi0gICAgICAgICAgICAgICAgICAgIHBrZ19uYW1lLCBzdWJfbmFtZSA9IHBhcnRzCi0gICAgICAgICAgICAgICAgICAgIGlmIHBrZ19uYW1lIGFuZCBwa2dfbmFtZVswXSAhPSAnLic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJQYXRoIGFyZ3VtZW50IG11c3QgYmUgTm9uZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgYSBkb3R0ZWQgbW9kdWxlIG5hbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gX2dldF9wYWNrYWdlKHBrZ19uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwa2cuX19wYXRoX18KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihwa2dfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgbm90IGEgcGFja2FnZSIpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiUmVsYXRpdmUgaW1wb3J0IHN5bnRheCBpcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBieSBfZ2V0X2xvYWRlcigpIikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIFRvcCBsZXZlbCBtb2R1bGUsIHNvIHN0aWNrIHdpdGggZGVmYXVsdCBwYXRoCi0gICAgICAgICAgICAgICAgICAgIHN1Yl9uYW1lID0gbW9kX25hbWUKLQotICAgICAgICAgICAgICAgIGZvciBpbXBvcnRlciBpbiBzeXMubWV0YV9wYXRoOgotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RfbmFtZSwgcGF0aCkKLSAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBhIG1ldGFob29rIHRvIGhhbmRsZSB0aGUgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgSGFuZGxpbmcgdmlhIHRoZSBzdGFuZGFyZCBwYXRoIG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBfZ2V0X3BhdGhfbG9hZGVyKG1vZF9uYW1lLCBwYXRoKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKLSAgICAgICAgcmV0dXJuIGxvYWRlcgotCi0KLSMgVGhpcyBoZWxwZXIgaXMgbmVlZGVkIGR1ZSB0byBhIG1pc3NpbmcgY29tcG9uZW50IGluIHRoZSBQRVAgMzAyCi0jIGxvYWRlciBwcm90b2NvbCAoc3BlY2lmaWNhbGx5LCAiZ2V0X2ZpbGVuYW1lIiBpcyBub24tc3RhbmRhcmQpCi1kZWYgX2dldF9maWxlbmFtZShsb2FkZXIsIG1vZF9uYW1lKToKLSAgICB0cnk6Ci0gICAgICAgIGdldF9maWxlbmFtZSA9IGxvYWRlci5nZXRfZmlsZW5hbWUKLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIGdldF9maWxlbmFtZShtb2RfbmFtZSkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRG9uZSB3aXRoIHRoZSBpbXBvcnQgbWFjaGluZXJ5IGVtdWxhdGlvbiwgb24gd2l0aCB0aGUgY29kZSEKIAogZGVmIF9ydW5fY29kZShjb2RlLCBydW5fZ2xvYmFscywgaW5pdF9nbG9iYWxzLAogICAgICAgICAgICAgICBtb2RfbmFtZSwgbW9kX2ZuYW1lLCBtb2RfbG9hZGVyKToKQEAgLTM3OSwyMSArNDUsMTcgQEAKICAgICAgICAgcmVzdG9yZV9tb2R1bGUgPSBtb2RfbmFtZSBpbiBzeXMubW9kdWxlcwogICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKICAgICAgICAgICAgIHNhdmVkX21vZHVsZSA9IHN5cy5tb2R1bGVzW21vZF9uYW1lXQotICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBtb2RfZm5hbWUKKyAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gdGVtcF9tb2R1bGUKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBtb2RfZm5hbWUKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW21vZF9uYW1lXSA9IHRlbXBfbW9kdWxlCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgX3J1bl9jb2RlKGNvZGUsIG1vZF9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZF9uYW1lLCBtb2RfZm5hbWUsIG1vZF9sb2FkZXIpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2F2ZWRfYXJndjAKLSAgICAgICAgICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gc2F2ZWRfbW9kdWxlCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQorICAgICAgICAgICAgX3J1bl9jb2RlKGNvZGUsIG1vZF9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlcikKICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBzYXZlZF9hcmd2MAorICAgICAgICBpZiByZXN0b3JlX21vZHVsZToKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW21vZF9uYW1lXSA9IHNhdmVkX21vZHVsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZF9uYW1lXQogICAgICAgICAjIENvcHkgdGhlIGdsb2JhbHMgb2YgdGhlIHRlbXBvcmFyeSBtb2R1bGUsIGFzIHRoZXkKICAgICAgICAgIyBtYXkgYmUgY2xlYXJlZCB3aGVuIHRoZSB0ZW1wb3JhcnkgbW9kdWxlIGdvZXMgYXdheQogICAgICAgICByZXR1cm4gbW9kX2dsb2JhbHMuY29weSgpCkBAIC00MDMsMTMgKzY1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlcikKIAogCisjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBkdWUgdG8gYSBtaXNzaW5nIGNvbXBvbmVudCBpbiB0aGUgUEVQIDMwMgorIyBsb2FkZXIgcHJvdG9jb2wgKHNwZWNpZmljYWxseSwgImdldF9maWxlbmFtZSIgaXMgbm9uLXN0YW5kYXJkKQorZGVmIF9nZXRfZmlsZW5hbWUobG9hZGVyLCBtb2RfbmFtZSk6CisgICAgdHJ5OgorICAgICAgICBnZXRfZmlsZW5hbWUgPSBsb2FkZXIuZ2V0X2ZpbGVuYW1lCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBnZXRfZmlsZW5hbWUobW9kX25hbWUpCisKKwogZGVmIHJ1bl9tb2R1bGUobW9kX25hbWUsIGluaXRfZ2xvYmFscz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9uYW1lPU5vbmUsIGFsdGVyX3N5cz1GYWxzZSk6CiAgICAgIiIiRXhlY3V0ZSBhIG1vZHVsZSdzIGNvZGUgd2l0aG91dCBpbXBvcnRpbmcgaXQKIAogICAgICAgIFJldHVybnMgdGhlIHJlc3VsdGluZyB0b3AgbGV2ZWwgbmFtZXNwYWNlIGRpY3Rpb25hcnkKICAgICAiIiIKLSAgICBsb2FkZXIgPSBfZ2V0X2xvYWRlcihtb2RfbmFtZSkKKyAgICBsb2FkZXIgPSBnZXRfbG9hZGVyKG1vZF9uYW1lKQogICAgIGlmIGxvYWRlciBpcyBOb25lOgogICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTm8gbW9kdWxlIG5hbWVkICIgKyBtb2RfbmFtZSkKICAgICBjb2RlID0gbG9hZGVyLmdldF9jb2RlKG1vZF9uYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vUEtHLUlORk8gYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVjMWExCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vUEtHLUlORk8KQEAgLTAsMCArMSw4OSBAQAorTWV0YWRhdGEtVmVyc2lvbjogMS4wCitOYW1lOiBzZXR1cHRvb2xzCitWZXJzaW9uOiAwLjdhMWRldi1yNDU1MzYKK1N1bW1hcnk6IERvd25sb2FkLCBidWlsZCwgaW5zdGFsbCwgdXBncmFkZSwgYW5kIHVuaW5zdGFsbCBQeXRob24gcGFja2FnZXMgLS0gZWFzaWx5IQorSG9tZS1wYWdlOiBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvc2V0dXB0b29scworQXV0aG9yOiBQaGlsbGlwIEouIEVieQorQXV0aG9yLWVtYWlsOiBwZWFrQGVieS1zYXJuYS5jb20KK0xpY2Vuc2U6IFBTRiBvciBaUEwKK0Rlc2NyaXB0aW9uOiBgYHNldHVwdG9vbHNgYCBpcyBhIGNvbGxlY3Rpb24gb2YgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gYGBkaXN0dXRpbHNgYAorICAgICAgICAoZm9yIFB5dGhvbiAyLjMuNSBhbmQgdXAgb24gbW9zdCBwbGF0Zm9ybXM7IDY0LWJpdCBwbGF0Zm9ybXMgcmVxdWlyZSBhIG1pbmltdW0KKyAgICAgICAgb2YgUHl0aG9uIDIuNCkgdGhhdCBhbGxvdyB5b3UgdG8gbW9yZSBlYXNpbHkgYnVpbGQgYW5kIGRpc3RyaWJ1dGUgUHl0aG9uCisgICAgICAgIHBhY2thZ2VzLCBlc3BlY2lhbGx5IG9uZXMgdGhhdCBoYXZlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBwYWNrYWdlcy4KKyAgICAgICAgCisgICAgICAgIFBhY2thZ2VzIGJ1aWx0IGFuZCBkaXN0cmlidXRlZCB1c2luZyBgYHNldHVwdG9vbHNgYCBsb29rIHRvIHRoZSB1c2VyIGxpa2UKKyAgICAgICAgb3JkaW5hcnkgUHl0aG9uIHBhY2thZ2VzIGJhc2VkIG9uIHRoZSBgYGRpc3R1dGlsc2BgLiAgWW91ciB1c2VycyBkb24ndCBuZWVkIHRvCisgICAgICAgIGluc3RhbGwgb3IgZXZlbiBrbm93IGFib3V0IHNldHVwdG9vbHMgaW4gb3JkZXIgdG8gdXNlIHRoZW0sIGFuZCB5b3UgZG9uJ3QKKyAgICAgICAgaGF2ZSB0byBpbmNsdWRlIHRoZSBlbnRpcmUgc2V0dXB0b29scyBwYWNrYWdlIGluIHlvdXIgZGlzdHJpYnV0aW9ucy4gIEJ5CisgICAgICAgIGluY2x1ZGluZyBqdXN0IGEgc2luZ2xlIGBib290c3RyYXAgbW9kdWxlYF8gKGFuIDhLIC5weSBmaWxlKSwgeW91ciBwYWNrYWdlIHdpbGwKKyAgICAgICAgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgaW5zdGFsbCBgYHNldHVwdG9vbHNgYCBpZiB0aGUgdXNlciBpcyBidWlsZGluZyB5b3VyCisgICAgICAgIHBhY2thZ2UgZnJvbSBzb3VyY2UgYW5kIGRvZXNuJ3QgaGF2ZSBhIHN1aXRhYmxlIHZlcnNpb24gYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICAgIAorICAgICAgICAuLiBfYm9vdHN0cmFwIG1vZHVsZTogaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vZGlzdC9lel9zZXR1cC5weQorICAgICAgICAKKyAgICAgICAgRmVhdHVyZSBIaWdobGlnaHRzOgorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGZpbmQvZG93bmxvYWQvaW5zdGFsbC91cGdyYWRlIGRlcGVuZGVuY2llcyBhdCBidWlsZCB0aW1lIHVzaW5nCisgICAgICAgIHRoZSBgRWFzeUluc3RhbGwgdG9vbCA8aHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsPmBfLAorICAgICAgICB3aGljaCBzdXBwb3J0cyBkb3dubG9hZGluZyB2aWEgSFRUUCwgRlRQLCBTdWJ2ZXJzaW9uLCBhbmQgU291cmNlRm9yZ2UsIGFuZAorICAgICAgICBhdXRvbWF0aWNhbGx5IHNjYW5zIHdlYiBwYWdlcyBsaW5rZWQgZnJvbSBQeVBJIHRvIGZpbmQgZG93bmxvYWQgbGlua3MuICAoSXQncworICAgICAgICB0aGUgY2xvc2VzdCB0aGluZyB0byBDUEFOIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIFB5dGhvbi4pCisgICAgICAgIAorICAgICAgICAqIENyZWF0ZSBgUHl0aG9uIEVnZ3MgPGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9QeXRob25FZ2dzPmBfIC0KKyAgICAgICAgYSBzaW5nbGUtZmlsZSBpbXBvcnRhYmxlIGRpc3RyaWJ1dGlvbiBmb3JtYXQKKyAgICAgICAgCisgICAgICAgICogSW5jbHVkZSBkYXRhIGZpbGVzIGluc2lkZSB5b3VyIHBhY2thZ2UgZGlyZWN0b3JpZXMsIHdoZXJlIHlvdXIgY29kZSBjYW4KKyAgICAgICAgYWN0dWFsbHkgdXNlIHRoZW0uICAoUHl0aG9uIDIuNCBkaXN0dXRpbHMgYWxzbyBzdXBwb3J0cyB0aGlzIGZlYXR1cmUsIGJ1dAorICAgICAgICBzZXR1cHRvb2xzIHByb3ZpZGVzIHRoZSBmZWF0dXJlIGZvciBQeXRob24gMi4zIHBhY2thZ2VzIGFsc28sIGFuZCBzdXBwb3J0cworICAgICAgICBhY2Nlc3NpbmcgZGF0YSBmaWxlcyBpbiB6aXBwZWQgcGFja2FnZXMgdG9vLikKKyAgICAgICAgCisgICAgICAgICogQXV0b21hdGljYWxseSBpbmNsdWRlIGFsbCBwYWNrYWdlcyBpbiB5b3VyIHNvdXJjZSB0cmVlLCB3aXRob3V0IGxpc3RpbmcgdGhlbQorICAgICAgICBpbmRpdmlkdWFsbHkgaW4gc2V0dXAucHkKKyAgICAgICAgCisgICAgICAgICogQXV0b21hdGljYWxseSBpbmNsdWRlIGFsbCByZWxldmFudCBmaWxlcyBpbiB5b3VyIHNvdXJjZSBkaXN0cmlidXRpb25zLAorICAgICAgICB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgYGBNQU5JRkVTVC5pbmBgIGZpbGUsIGFuZCB3aXRob3V0IGhhdmluZyB0byBmb3JjZQorICAgICAgICByZWdlbmVyYXRpb24gb2YgdGhlIGBgTUFOSUZFU1RgYCBmaWxlIHdoZW4geW91ciBzb3VyY2UgdHJlZSBjaGFuZ2VzLgorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHdyYXBwZXIgc2NyaXB0cyBvciBXaW5kb3dzIChjb25zb2xlIGFuZCBHVUkpIC5leGUKKyAgICAgICAgZmlsZXMgZm9yIGFueSBudW1iZXIgb2YgIm1haW4iIGZ1bmN0aW9ucyBpbiB5b3VyIHByb2plY3QuICAoTm90ZTogdGhpcyBpcyBub3QKKyAgICAgICAgYSBweTJleGUgcmVwbGFjZW1lbnQ7IHRoZSAuZXhlIGZpbGVzIHJlbHkgb24gdGhlIGxvY2FsIFB5dGhvbiBpbnN0YWxsYXRpb24uKQorICAgICAgICAKKyAgICAgICAgKiBUcmFuc3BhcmVudCBQeXJleCBzdXBwb3J0LCBzbyB0aGF0IHlvdXIgc2V0dXAucHkgY2FuIGxpc3QgYGAucHl4YGAgZmlsZXMgYW5kCisgICAgICAgIHN0aWxsIHdvcmsgZXZlbiB3aGVuIHRoZSBlbmQtdXNlciBkb2Vzbid0IGhhdmUgUHlyZXggaW5zdGFsbGVkIChhcyBsb25nIGFzCisgICAgICAgIHlvdSBpbmNsdWRlIHRoZSBQeXJleC1nZW5lcmF0ZWQgQyBpbiB5b3VyIHNvdXJjZSBkaXN0cmlidXRpb24pCisgICAgICAgIAorICAgICAgICAqIENvbW1hbmQgYWxpYXNlcyAtIGNyZWF0ZSBwcm9qZWN0LXNwZWNpZmljLCBwZXItdXNlciwgb3Igc2l0ZS13aWRlIHNob3J0Y3V0CisgICAgICAgIG5hbWVzIGZvciBjb21tb25seSB1c2VkIGNvbW1hbmRzIGFuZCBvcHRpb25zCisgICAgICAgIAorICAgICAgICAqIFB5UEkgdXBsb2FkIHN1cHBvcnQgLSB1cGxvYWQgeW91ciBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgZWdncyB0byBQeVBJCisgICAgICAgIAorICAgICAgICAqIERlcGxveSB5b3VyIHByb2plY3QgaW4gImRldmVsb3BtZW50IG1vZGUiLCBzdWNoIHRoYXQgaXQncyBhdmFpbGFibGUgb24KKyAgICAgICAgYGBzeXMucGF0aGBgLCB5ZXQgY2FuIHN0aWxsIGJlIGVkaXRlZCBkaXJlY3RseSBmcm9tIGl0cyBzb3VyY2UgY2hlY2tvdXQuCisgICAgICAgIAorICAgICAgICAqIEVhc2lseSBleHRlbmQgdGhlIGRpc3R1dGlscyB3aXRoIG5ldyBjb21tYW5kcyBvciBgYHNldHVwKClgYCBhcmd1bWVudHMsIGFuZAorICAgICAgICBkaXN0cmlidXRlL3JldXNlIHlvdXIgZXh0ZW5zaW9ucyBmb3IgbXVsdGlwbGUgcHJvamVjdHMsIHdpdGhvdXQgY29weWluZyBjb2RlLgorICAgICAgICAKKyAgICAgICAgKiBDcmVhdGUgZXh0ZW5zaWJsZSBhcHBsaWNhdGlvbnMgYW5kIGZyYW1ld29ya3MgdGhhdCBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyCisgICAgICAgIGV4dGVuc2lvbnMsIHVzaW5nIHNpbXBsZSAiZW50cnkgcG9pbnRzIiBkZWNsYXJlZCBpbiBhIHByb2plY3QncyBzZXR1cCBzY3JpcHQuCisgICAgICAgIAorICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgUHlQSSBkb3dubG9hZHMsIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIGBgc2V0dXB0b29sc2BgCisgICAgICAgIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBgUHl0aG9uIFNWTiBzYW5kYm94YF8sIGFuZCBpbi1kZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiB0aGUKKyAgICAgICAgYDAuNiBicmFuY2hgXyBhcmUgYXZhaWxhYmxlIGFzIHdlbGwuCisgICAgICAgIAorICAgICAgICAuLiBfMC42IGJyYW5jaDogaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL3NhbmRib3gvYnJhbmNoZXMvc2V0dXB0b29scy0wLjYvI2VnZz1zZXR1cHRvb2xzLWRldjA2CisgICAgICAgIAorICAgICAgICAuLiBfUHl0aG9uIFNWTiBzYW5kYm94OiBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvc2FuZGJveC90cnVuay9zZXR1cHRvb2xzLyNlZ2c9c2V0dXB0b29scy1kZXYKKyAgICAgICAgCisgICAgICAgIAorS2V5d29yZHM6IENQQU4gUHlQSSBkaXN0dXRpbHMgZWdncyBwYWNrYWdlIG1hbmFnZW1lbnQKK1BsYXRmb3JtOiBVTktOT1dOCitDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogMyAtIEFscGhhCitDbGFzc2lmaWVyOiBJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzCitDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCitDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBab3BlIFB1YmxpYyBMaWNlbnNlCitDbGFzc2lmaWVyOiBPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50CitDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24KK0NsYXNzaWZpZXI6IFRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcyA6OiBQeXRob24gTW9kdWxlcworQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmcKK0NsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBTeXN0ZW1zIEFkbWluaXN0cmF0aW9uCitDbGFzc2lmaWVyOiBUb3BpYyA6OiBVdGlsaXRpZXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL2VudHJ5X3BvaW50cy50eHQgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhZmUyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0CkBAIC0wLDAgKzEsNTEgQEAKK1tkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHNdCitkZXBlbmRlbmN5X2xpbmtzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAorZW50cnlfcG9pbnRzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cworZXh0cmFzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzCitwYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCitpbnN0YWxsX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cworaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X2Jvb2wKK2V4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQorbmFtZXNwYWNlX3BhY2thZ2VzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX25zcAordGVzdF9zdWl0ZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlCitlYWdlcl9yZXNvdXJjZXMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0Cit6aXBfc2FmZSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAordGVzdF9sb2FkZXIgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfaW1wb3J0YWJsZQordGVzdHNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMKKworW3NldHVwdG9vbHMuZmlsZV9maW5kZXJzXQorc3ZuX2N2cyA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpfZGVmYXVsdF9yZXZjdHJsCisKK1tlZ2dfaW5mby53cml0ZXJzXQorZGVwZW5kZW5jeV9saW5rcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZworcmVxdWlyZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cworUEtHLUlORk8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8KK2VhZ2VyX3Jlc291cmNlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwordG9wX2xldmVsLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcworbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCitlbnRyeV9wb2ludHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMKK2RlcGVuZHMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZQorCitbY29uc29sZV9zY3JpcHRzXQorZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCitlYXN5X2luc3RhbGwtMi41ID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCisKK1tkaXN0dXRpbHMuY29tbWFuZHNdCitiZGlzdF9ycG0gPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfcnBtOmJkaXN0X3JwbQorcm90YXRlID0gc2V0dXB0b29scy5jb21tYW5kLnJvdGF0ZTpyb3RhdGUKK2RldmVsb3AgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wCitzZXRvcHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdAorYnVpbGRfcHkgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfcHk6YnVpbGRfcHkKK3NhdmVvcHRzID0gc2V0dXB0b29scy5jb21tYW5kLnNhdmVvcHRzOnNhdmVvcHRzCitlZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbworaW5zdGFsbF9lZ2dfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvOmluc3RhbGxfZWdnX2luZm8KK2FsaWFzID0gc2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzCitlYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmVhc3lfaW5zdGFsbAoraW5zdGFsbF9zY3JpcHRzID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMKK2JkaXN0X2VnZyA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnCitpbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGw6aW5zdGFsbAordGVzdCA9IHNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QKK2luc3RhbGxfbGliID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliCitidWlsZF9leHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfZXh0OmJ1aWxkX2V4dAorc2Rpc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3Q6c2Rpc3QKKwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vdG9wX2xldmVsLnR4dCBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3RvcF9sZXZlbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3N2M2YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3RvcF9sZXZlbC50eHQKQEAgLTAsMCArMSwzIEBACitlYXN5X2luc3RhbGwKK3BrZ19yZXNvdXJjZXMKK3NldHVwdG9vbHMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3ppcC1zYWZlIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3ppcC1zYWZlCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjFjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDY0IEBACisiIiJFeHRlbnNpb25zIHRvIHRoZSAnZGlzdHV0aWxzJyBmb3IgbGFyZ2Ugb3IgY29tcGxleCBkaXN0cmlidXRpb25zIiIiCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24sIExpYnJhcnkKK2Zyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24sIEZlYXR1cmUsIF9nZXRfdW5wYXRjaGVkCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUsIHNldHVwdG9vbHMuY29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQgYXMgX0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoraW1wb3J0IG9zLnBhdGgKKworX192ZXJzaW9uX18gPSAnMC43YTEnCitfX2FsbF9fID0gWworICAgICdzZXR1cCcsICdEaXN0cmlidXRpb24nLCAnRmVhdHVyZScsICdDb21tYW5kJywgJ0V4dGVuc2lvbicsICdSZXF1aXJlJywKKyAgICAnZmluZF9wYWNrYWdlcycKK10KKworYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKKworZGVmIGZpbmRfcGFja2FnZXMod2hlcmU9Jy4nLCBleGNsdWRlPSgpKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IGFsbCBQeXRob24gcGFja2FnZXMgZm91bmQgd2l0aGluIGRpcmVjdG9yeSAnd2hlcmUnCisKKyAgICAnd2hlcmUnIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhICJjcm9zcy1wbGF0Zm9ybSIgKGkuZS4gVVJMLXN0eWxlKSBwYXRoOyBpdAorICAgIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbCBwYXRoIHN5bnRheC4gICdleGNsdWRlJyBpcyBhCisgICAgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlOyAnKicgY2FuIGJlIHVzZWQgYXMgYSB3aWxkY2FyZCBpbiB0aGUKKyAgICBuYW1lcywgc3VjaCB0aGF0ICdmb28uKicgd2lsbCBleGNsdWRlIGFsbCBzdWJwYWNrYWdlcyBvZiAnZm9vJyAoYnV0IG5vdAorICAgICdmb28nIGl0c2VsZikuCisgICAgIiIiCisgICAgb3V0ID0gW10KKyAgICBzdGFjaz1bKGNvbnZlcnRfcGF0aCh3aGVyZSksICcnKV0KKyAgICB3aGlsZSBzdGFjazoKKyAgICAgICAgd2hlcmUscHJlZml4ID0gc3RhY2sucG9wKDApCisgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIod2hlcmUpOgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4od2hlcmUsbmFtZSkKKyAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKGZuKSBhbmQKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZm4sJ19faW5pdF9fLnB5JykpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocHJlZml4K25hbWUpOyBzdGFjay5hcHBlbmQoKGZuLHByZWZpeCtuYW1lKycuJykpCisgICAgZm9yIHBhdCBpbiBleGNsdWRlOgorICAgICAgICBmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2hjYXNlCisgICAgICAgIG91dCA9IFtpdGVtIGZvciBpdGVtIGluIG91dCBpZiBub3QgZm5tYXRjaGNhc2UoaXRlbSxwYXQpXQorICAgIHJldHVybiBvdXQKKworc2V0dXAgPSBkaXN0dXRpbHMuY29yZS5zZXR1cAorCitfQ29tbWFuZCA9IF9nZXRfdW5wYXRjaGVkKF9Db21tYW5kKQorCitjbGFzcyBDb21tYW5kKF9Db21tYW5kKToKKyAgICBfX2RvY19fID0gX0NvbW1hbmQuX19kb2NfXworCisgICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QsICoqa3cpOgorICAgICAgICAjIEFkZCBzdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBfQ29tbWFuZC5fX2luaXRfXyhzZWxmLGRpc3QpCisgICAgICAgIGZvciBrLHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixrLHYpCisKKyAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTAsICoqa3cpOgorICAgICAgICBjbWQgPSBfQ29tbWFuZC5yZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCisgICAgICAgIGZvciBrLHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoY21kLGssdikgICAgIyB1cGRhdGUgY29tbWFuZCB3aXRoIGtleXdvcmRzCisgICAgICAgIHJldHVybiBjbWQKKworaW1wb3J0IGRpc3R1dGlscy5jb3JlCitkaXN0dXRpbHMuY29yZS5Db21tYW5kID0gQ29tbWFuZCAgICAjIHdlIGNhbid0IHBhdGNoIGRpc3R1dGlscy5jbWQsIGFsYXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weSBiL0xpYi9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDljNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5CkBAIC0wLDAgKzEsMjAwIEBACisiIiJVdGlsaXRpZXMgZm9yIGV4dHJhY3RpbmcgY29tbW9uIGFyY2hpdmUgZm9ybWF0cyIiIgorCisKK19fYWxsX18gPSBbCisgICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKKyAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKK10KKworaW1wb3J0IHppcGZpbGUsIHRhcmZpbGUsIG9zLCBzaHV0aWwKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgorCitjbGFzcyBVbnJlY29nbml6ZWRGb3JtYXQoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCisKK2RlZiBkZWZhdWx0X2ZpbHRlcihzcmMsZHN0KToKKyAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCisgICAgcmV0dXJuIGRzdAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlciwKKyAgICBkcml2ZXJzPU5vbmUKKyk6CisgICAgIiIiVW5wYWNrIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYCwgb3IgcmFpc2UgYGBVbnJlY29nbml6ZWRGb3JtYXRgYAorCisgICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAorICAgIGludGVybmFsIHRvIHRoZSBhcmNoaXZlICgnLyctc2VwYXJhdGVkKSwgYW5kIGEgZmlsZXN5c3RlbSBwYXRoIHdoZXJlIGl0CisgICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCisgICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAorICAgIHRoYXQgZmlsZSBvciBkaXJlY3RvcnkuICBUaGUgY2FsbGJhY2sgY2FuIHRodXMgYmUgdXNlZCB0byByZXBvcnQgb24gdGhlCisgICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKKyAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgorCisgICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKKyAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQorICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSBkZXNpZ25hdGVkCisgICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKKyAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKKyAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlzIHJhaXNlZCkuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHNlcXVlbmNlIG9mCisgICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAorICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAorICAgIG9yZGVyLgorICAgICIiIgorICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKKyAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCisgICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCisgICAgICAgICkKKworCisKKworCisKKworZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgorICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCisKKyAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQorICAgICIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgKGZpbGVuYW1lLCkpCisKKyAgICBwYXRocyA9IHtmaWxlbmFtZTooJycsZXh0cmFjdF9kaXIpfQorICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKKyAgICAgICAgc3JjLGRzdCA9IHBhdGhzW2Jhc2VdCisgICAgICAgIGZvciBkIGluIGRpcnM6CisgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSxkKV0gPSBzcmMrZCsnLycsIG9zLnBhdGguam9pbihkc3QsZCkKKyAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICBuYW1lID0gc3JjK2YKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsZikKKyAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMrZiwgdGFyZ2V0KQorICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIHNraXAgbm9uLWZpbGVzCisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oYmFzZSxmKQorICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGYsIHRhcmdldCkKKyAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgorICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCisKKyAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHppcGZpbGUgKGFzIGRldGVybWluZWQKKyAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgorICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KKyAgICAiIiIKKworICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgorICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIChmaWxlbmFtZSwpKQorCisgICAgeiA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkKKyAgICB0cnk6CisgICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKKyAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCisKKyAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKKyAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCB0YXJnZXQpCisgICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBmaWxlCisgICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCisgICAgICAgICAgICAgICAgZGF0YSA9IHoucmVhZChpbmZvLmZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwnd2InKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQorICAgIGZpbmFsbHk6CisgICAgICAgIHouY2xvc2UoKQorCisKK2RlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CisgICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKKworICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAorICAgIGJ5IGBgdGFyZmlsZS5vcGVuKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCisgICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCisgICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6CisgICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKKyAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSAoZmlsZW5hbWUsKQorICAgICAgICApCisKKyAgICB0cnk6CisgICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZSAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQorICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKKyAgICAgICAgICAgIGlmIG1lbWJlci5pc2ZpbGUoKSBvciBtZW1iZXIuaXNkaXIoKToKKyAgICAgICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWU6CisgICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKKyAgICAgICAgICAgICAgICAgICAgZHN0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIGRzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZHN0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKG9zLnNlcCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ID0gZHN0WzotMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLGRzdCkgICMgWFhYIFVnaAorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGZpbmFsbHk6CisgICAgICAgIHRhcm9iai5jbG9zZSgpCisKKworCisKK2V4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY2xpLmV4ZSBiL0xpYi9zZXR1cHRvb2xzL2NsaS5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmM4MzMzOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NsaS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNTNlNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkKQEAgLTAsMCArMSwxOSBAQAorX19hbGxfXyA9IFsKKyAgICAnYWxpYXMnLCAnYmRpc3RfZWdnJywgJ2JkaXN0X3JwbScsICdidWlsZF9leHQnLCAnYnVpbGRfcHknLCAnZGV2ZWxvcCcsCisgICAgJ2Vhc3lfaW5zdGFsbCcsICdlZ2dfaW5mbycsICdpbnN0YWxsJywgJ2luc3RhbGxfbGliJywgJ3JvdGF0ZScsICdzYXZlb3B0cycsCisgICAgJ3NkaXN0JywgJ3NldG9wdCcsICd0ZXN0JywgJ3VwbG9hZCcsICdpbnN0YWxsX2VnZ19pbmZvJywgJ2luc3RhbGxfc2NyaXB0cycsCitdCisKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uPj0nMi41JzoKKyAgICAjIEluIFB5dGhvbiAyLjUgYW5kIGFib3ZlLCBkaXN0dXRpbHMgaW5jbHVkZXMgaXRzIG93biB1cGxvYWQgY29tbWFuZAorICAgIF9fYWxsX18ucmVtb3ZlKCd1cGxvYWQnKQorCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3QgaW1wb3J0IGJkaXN0CisKK2lmICdlZ2cnIG5vdCBpbiBiZGlzdC5mb3JtYXRfY29tbWFuZHM6CisgICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRbJ2VnZyddID0gKCdiZGlzdF9lZ2cnLCAiUHl0aG9uIC5lZ2cgZmlsZSIpCisgICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRzLmFwcGVuZCgnZWdnJykKKworZGVsIGJkaXN0LCBzeXMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkZjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5CkBAIC0wLDAgKzEsNzkgQEAKK2ltcG9ydCBkaXN0dXRpbHMsIG9zCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKKworZGVmIHNocXVvdGUoYXJnKToKKyAgICAiIiJRdW90ZSBhbiBhcmd1bWVudCBmb3IgbGF0ZXIgcGFyc2luZyBieSBzaGxleC5zcGxpdCgpIiIiCisgICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKKyAgICAgICAgaWYgYyBpbiBhcmc6IHJldHVybiByZXByKGFyZykKKyAgICBpZiBhcmcuc3BsaXQoKTw+W2FyZ106CisgICAgICAgIHJldHVybiByZXByKGFyZykKKyAgICByZXR1cm4gYXJnCisKKworY2xhc3MgYWxpYXMob3B0aW9uX2Jhc2UpOgorICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgorCisgICAgZGVzY3JpcHRpb24gPSAiZGVmaW5lIGEgc2hvcnRjdXQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGNvbW1hbmRzIgorICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3JlbW92ZScsICAgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIGFsaWFzJyksCisgICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucworCisgICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuYXJncyA9IE5vbmUKKyAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLnJlbW92ZSBhbmQgbGVuKHNlbGYuYXJncyk8PjE6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgYWxpYXMgbmFtZSkgd2hlbiAiCisgICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgorICAgICAgICAgICAgKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCisKKyAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKKyAgICAgICAgICAgIHByaW50ICJDb21tYW5kIEFsaWFzZXMiCisgICAgICAgICAgICBwcmludCAiLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6CisgICAgICAgICAgICAgICAgcHJpbnQgInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKT09MToKKyAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncworICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKKyAgICAgICAgICAgICAgICBwcmludCAic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxpYXMgPSBzZWxmLmFyZ3NbMF0KKyAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSxzZWxmLmFyZ3NbMTpdKSkKKworICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6Y29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCisKKworZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKKyAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCisgICAgaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdnbG9iYWwnKToKKyAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCisgICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKKyAgICAgICAgc291cmNlID0gJy0tdXNlci1jb25maWcgJworICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgorICAgICAgICBzb3VyY2UgPSAnJworICAgIGVsc2U6CisgICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQorICAgIHJldHVybiBzb3VyY2UrbmFtZSsnICcrY29tbWFuZApkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdkODhkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkKQEAgLTAsMCArMSw0NDkgQEAKKyIiInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2cKKworQnVpbGQgLmVnZyBkaXN0cmlidXRpb25zIiIiCisKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMKK2ltcG9ydCBzeXMsIG9zLCBtYXJzaGFsCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZSwgbWtwYXRoCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbiwgZ2V0X3B5dGhvbl9saWIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZ2V0X2J1aWxkX3BsYXRmb3JtLCBEaXN0cmlidXRpb24KK2Zyb20gdHlwZXMgaW1wb3J0IENvZGVUeXBlCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CisKK2RlZiB3cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpOgorICAgIGYgPSBvcGVuKHB5ZmlsZSwndycpCisgICAgZi53cml0ZSgnXG4nLmpvaW4oWworICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAorICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18sIF9fZmlsZV9fIiwKKyAgICAgICAgIiAgIGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMsIGltcCIsCisgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sJXIpIgorICAgICAgICAgICAgJSByZXNvdXJjZSwKKyAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fIiwKKyAgICAgICAgIiAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKKyAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCisgICAgICAgICIiICMgdGVybWluYWwgXG4KKyAgICBdKSkKKyAgICBmLmNsb3NlKCkKKworIyBzdHViIF9faW5pdF9fLnB5IGZvciBwYWNrYWdlcyBkaXN0cmlidXRlZCB3aXRob3V0IG9uZQorTlNfUEtHX1NUVUIgPSAnX19pbXBvcnRfXygicGtnX3Jlc291cmNlcyIpLmRlY2xhcmVfbmFtZXNwYWNlKF9fbmFtZV9fKScKKworCisKKworCisKKworCisKKworY2xhc3MgYmRpc3RfZWdnKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGFuIFwiZWdnXCIgZGlzdHJpYnV0aW9uIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2JkaXN0LWRpcj0nLCAnYicsCisgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCisgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9idWlsZF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgKCdleGNsdWRlLXNvdXJjZS1maWxlcycsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlIGFsbCAucHkgZmlsZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIGVnZyIpLAorICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICAgICAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAorICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKKyAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ2tlZXAtdGVtcCcsICdza2lwLWJ1aWxkJywgJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJworICAgIF0KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKKyAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gTm9uZQorICAgICAgICBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzID0gTm9uZQorCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVpX2NtZC5lZ2dfaW5mbworCisgICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQorICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2VnZycpCisKKyAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKKworICAgICAgICBpZiBzZWxmLmVnZ19vdXRwdXQgaXMgTm9uZToKKworICAgICAgICAgICAgIyBDb21wdXRlIGZpbGVuYW1lIG9mIHRoZSBvdXRwdXQgZWdnCisgICAgICAgICAgICBiYXNlbmFtZSA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICBnZXRfcHl0aG9uX3ZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBhbmQgc2VsZi5wbGF0X25hbWUKKyAgICAgICAgICAgICkuZWdnX25hbWUoKQorCisgICAgICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZW5hbWUrJy5lZ2cnKQorCisKKworCisKKworCisKKyAgICBkZWYgZG9faW5zdGFsbF9kYXRhKHNlbGYpOgorICAgICAgICAjIEhhY2sgZm9yIHBhY2thZ2VzIHRoYXQgaW5zdGFsbCBkYXRhIHRvIGluc3RhbGwncyAtLWluc3RhbGwtbGliCisgICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuaW5zdGFsbF9saWIgPSBzZWxmLmJkaXN0X2RpcgorCisgICAgICAgIHNpdGVfcGFja2FnZXMgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZ2V0X3B5dGhvbl9saWIoKSkpCisgICAgICAgIG9sZCwgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMsW10KKworICAgICAgICBmb3IgaXRlbSBpbiBvbGQ6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sdHVwbGUpIGFuZCBsZW4oaXRlbSk9PTI6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2FicyhpdGVtWzBdKToKKyAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGl0ZW1bMF0pCisgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBvcy5wYXRoLm5vcm1jYXNlKHJlYWxwYXRoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3JtYWxpemVkPT1zaXRlX3BhY2thZ2VzIG9yIG5vcm1hbGl6ZWQuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfcGFja2FnZXMrb3Muc2VwCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVhbHBhdGhbbGVuKHNpdGVfcGFja2FnZXMpKzE6XSwgaXRlbVsxXQorICAgICAgICAgICAgICAgICAgICAjIFhYWCBlbHNlOiByYWlzZSA/Pz8KKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMuYXBwZW5kKGl0ZW0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgcGFja2FnZSBkYXRhIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfZGF0YScsIGZvcmNlPTAsIHJvb3Q9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBvbGQKKworCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYuZWdnX291dHB1dF0KKworCisgICAgZGVmIGNhbGxfY29tbWFuZChzZWxmLGNtZG5hbWUsKiprdyk6CisgICAgICAgICIiIkludm9rZSByZWluaXRpYWxpemVkIGNvbW1hbmQgYGNtZG5hbWVgIHdpdGgga2V5d29yZCBhcmdzIiIiCisgICAgICAgIGZvciBkaXJuYW1lIGluIElOU1RBTExfRElSRUNUT1JZX0FUVFJTOgorICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChkaXJuYW1lLHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBrdy5zZXRkZWZhdWx0KCdza2lwX2J1aWxkJyxzZWxmLnNraXBfYnVpbGQpCisgICAgICAgIGt3LnNldGRlZmF1bHQoJ2RyeV9ydW4nLCBzZWxmLmRyeV9ydW4pCisgICAgICAgIGNtZCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoY21kbmFtZSwgKiprdykKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRuYW1lKQorICAgICAgICByZXR1cm4gY21kCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgR2VuZXJhdGUgbWV0YWRhdGEgZmlyc3QKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQorCisgICAgICAgICMgV2UgcnVuIGluc3RhbGxfbGliIGJlZm9yZSBpbnN0YWxsX2RhdGEsIGJlY2F1c2Ugc29tZSBkYXRhIGhhY2tzCisgICAgICAgICMgcHVsbCB0aGVpciBkYXRhIHBhdGggZnJvbSB0aGUgaW5zdGFsbF9saWIgY29tbWFuZC4KKyAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgbGlicmFyeSBjb2RlIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBpbnN0Y21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQorICAgICAgICBvbGRfcm9vdCA9IGluc3RjbWQucm9vdDsgaW5zdGNtZC5yb290ID0gTm9uZQorICAgICAgICBjbWQgPSBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9saWInLCB3YXJuX2Rpcj0wKQorICAgICAgICBpbnN0Y21kLnJvb3QgPSBvbGRfcm9vdAorCisgICAgICAgIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cyA9IHNlbGYuZ2V0X2V4dF9vdXRwdXRzKCkKKyAgICAgICAgc2VsZi5zdHVicyA9IFtdCisgICAgICAgIHRvX2NvbXBpbGUgPSBbXQorICAgICAgICBmb3IgKHAsZXh0X25hbWUpIGluIGVudW1lcmF0ZShleHRfb3V0cHV0cyk6CisgICAgICAgICAgICBmaWxlbmFtZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4dF9uYW1lKQorICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBmaWxlbmFtZSArICcucHknKQorICAgICAgICAgICAgc2VsZi5zdHVicy5hcHBlbmQocHlmaWxlKQorICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyIgJSBleHRfbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgd3JpdGVfc3R1Yihvcy5wYXRoLmJhc2VuYW1lKGV4dF9uYW1lKSwgcHlmaWxlKQorICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQorICAgICAgICAgICAgZXh0X291dHB1dHNbcF0gPSBleHRfbmFtZS5yZXBsYWNlKG9zLnNlcCwnLycpCisKKyAgICAgICAgdG9fY29tcGlsZS5leHRlbmQoc2VsZi5tYWtlX2luaXRfZmlsZXMoKSkKKyAgICAgICAgaWYgdG9fY29tcGlsZToKKyAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5kb19pbnN0YWxsX2RhdGEoKQorCisgICAgICAgICMgTWFrZSB0aGUgRUdHLUlORk8gZGlyZWN0b3J5CisgICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGVnZ19pbmZvID0gb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwnRUdHLUlORk8nKQorICAgICAgICBzZWxmLm1rcGF0aChlZ2dfaW5mbykKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdzY3JpcHRzJykKKyAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHNjcmlwdHMgdG8gJXMiICUgc2NyaXB0X2RpcikKKyAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX3NjcmlwdHMnLGluc3RhbGxfZGlyPXNjcmlwdF9kaXIsbm9fZXA9MSkKKworICAgICAgICBuYXRpdmVfbGlicyA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCJuYXRpdmVfbGlicy50eHQiKQorICAgICAgICBpZiBhbGxfb3V0cHV0czoKKyAgICAgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiAlIG5hdGl2ZV9saWJzKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBsaWJzX2ZpbGUgPSBvcGVuKG5hdGl2ZV9saWJzLCAnd3QnKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nLmpvaW4oYWxsX291dHB1dHMpKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgIGxpYnNfZmlsZS5jbG9zZSgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmF0aXZlX2xpYnMpOgorICAgICAgICAgICAgbG9nLmluZm8oInJlbW92aW5nICVzIiAlIG5hdGl2ZV9saWJzKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmF0aXZlX2xpYnMpCisKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi5lZ2dfaW5mbyk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShwYXRoLG9zLnBhdGguam9pbihlZ2dfaW5mbyxmaWxlbmFtZSkpCisKKyAgICAgICAgd3JpdGVfc2FmZXR5X2ZsYWcoCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCdFR0ctSU5GTycpLCBzZWxmLnppcF9zYWZlKCkKKyAgICAgICAgKQorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCdkZXBlbmRzLnR4dCcpKToKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIHdpbGwgbm90IGJlIHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCisgICAgICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlczoKKyAgICAgICAgICAgIHNlbGYuemFwX3B5ZmlsZXMoKQorCisgICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQorICAgICAgICBtYWtlX3ppcGZpbGUoc2VsZi5lZ2dfb3V0cHV0LCBhcmNoaXZlX3Jvb3QsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgICAgICMgQWRkIHRvICdEaXN0cmlidXRpb24uZGlzdF9maWxlcycgc28gdGhhdCB0aGUgInVwbG9hZCIgY29tbWFuZCB3b3JrcworICAgICAgICBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCdkaXN0X2ZpbGVzJyxbXSkuYXBwZW5kKAorICAgICAgICAgICAgKCdiZGlzdF9lZ2cnLGdldF9weXRob25fdmVyc2lvbigpLHNlbGYuZWdnX291dHB1dCkpCisKKyAgICBkZWYgemFwX3B5ZmlsZXMoc2VsZik6CisgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAucHkgZmlsZXMgZnJvbSB0ZW1wb3JhcnkgZGlyZWN0b3J5IikKKyAgICAgICAgZm9yIGJhc2UsZGlycyxmaWxlcyBpbiB3YWxrX2VnZyhzZWxmLmJkaXN0X2Rpcik6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgJXMiLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiB6aXBfc2FmZShzZWxmKToKKyAgICAgICAgc2FmZSA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ3ppcF9zYWZlJyxOb25lKQorICAgICAgICBpZiBzYWZlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNhZmUKKyAgICAgICAgbG9nLndhcm4oInppcF9zYWZlIGZsYWcgbm90IHNldDsgYW5hbHl6aW5nIGFyY2hpdmUgY29udGVudHMuLi4iKQorICAgICAgICByZXR1cm4gYW5hbHl6ZV9lZ2coc2VsZi5iZGlzdF9kaXIsIHNlbGYuc3R1YnMpCisKKyAgICBkZWYgbWFrZV9pbml0X2ZpbGVzKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgbWlzc2luZyBwYWNrYWdlIF9faW5pdF9fIGZpbGVzIiIiCisgICAgICAgIGluaXRfZmlsZXMgPSBbXQorICAgICAgICBmb3IgYmFzZSxkaXJzLGZpbGVzIGluIHdhbGtfZWdnKHNlbGYuYmRpc3RfZGlyKToKKyAgICAgICAgICAgIGlmIGJhc2U9PXNlbGYuYmRpc3RfZGlyOgorICAgICAgICAgICAgICAgICMgZG9uJ3QgcHV0IGFuIF9faW5pdF9fIGluIHRoZSByb290CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgICAgICBpZiAnX19pbml0X18ucHknIG5vdCBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9IGJhc2VbbGVuKHNlbGYuYmRpc3RfZGlyKSsxOl0ucmVwbGFjZShvcy5zZXAsJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NvbnRlbnRzX2Zvcihwa2cpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDcmVhdGluZyBtaXNzaW5nIF9faW5pdF9fLnB5IGZvciAlcyIscGtnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsJ19faW5pdF9fLnB5JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwndycpOyBmLndyaXRlKE5TX1BLR19TVFVCKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZpbGVzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBub3QgYSBwYWNrYWdlLCBkb24ndCB0cmF2ZXJzZSB0byBzdWJkaXJlY3RvcmllcworICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorCisgICAgICAgIHJldHVybiBpbml0X2ZpbGVzCisKKyAgICBkZWYgZ2V0X2V4dF9vdXRwdXRzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIHJlbGF0aXZlIHBhdGhzIHRvIEMgZXh0ZW5zaW9ucyBpbiB0aGUgb3V0cHV0IGRpc3RybyIiIgorCisgICAgICAgIGFsbF9vdXRwdXRzID0gW10KKyAgICAgICAgZXh0X291dHB1dHMgPSBbXQorCisgICAgICAgIHBhdGhzID0ge3NlbGYuYmRpc3RfZGlyOicnfQorICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzZWxmLmJkaXN0X2Rpcik6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMV0ubG93ZXIoKSBpbiBOQVRJVkVfRVhURU5TSU9OUzoKKyAgICAgICAgICAgICAgICAgICAgYWxsX291dHB1dHMuYXBwZW5kKHBhdGhzW2Jhc2VdK2ZpbGVuYW1lKQorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcnM6CisgICAgICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsZmlsZW5hbWUpXSA9IHBhdGhzW2Jhc2VdK2ZpbGVuYW1lKycvJworCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisgICAgICAgICAgICBmb3IgZXh0IGluIGJ1aWxkX2NtZC5leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkuc3RhcnRzd2l0aCgnZGwtJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpcixmaWxlbmFtZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0X291dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQorCisgICAgICAgIHJldHVybiBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMKKworCitOQVRJVkVfRVhURU5TSU9OUyA9IGRpY3QuZnJvbWtleXMoJy5kbGwgLnNvIC5keWxpYiAucHlkJy5zcGxpdCgpKQorCisKKworCisKKworCisKKworCisKKworZGVmIHdhbGtfZWdnKGVnZ19kaXIpOgorICAgICIiIldhbGsgYW4gdW5wYWNrZWQgZWdnJ3MgY29udGVudHMsIHNraXBwaW5nIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkiIiIKKyAgICB3YWxrZXIgPSBvcy53YWxrKGVnZ19kaXIpCisgICAgYmFzZSxkaXJzLGZpbGVzID0gd2Fsa2VyLm5leHQoKQorICAgIGlmICdFR0ctSU5GTycgaW4gZGlyczoKKyAgICAgICAgZGlycy5yZW1vdmUoJ0VHRy1JTkZPJykKKyAgICB5aWVsZCBiYXNlLGRpcnMsZmlsZXMKKyAgICBmb3IgYmRmIGluIHdhbGtlcjoKKyAgICAgICAgeWllbGQgYmRmCisKK2RlZiBhbmFseXplX2VnZyhlZ2dfZGlyLCBzdHVicyk6CisgICAgIyBjaGVjayBmb3IgZXhpc3RpbmcgZmxhZyBpbiBFR0ctSU5GTworICAgIGZvciBmbGFnLGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZWdnX2RpciwnRUdHLUlORk8nLGZuKSk6CisgICAgICAgICAgICByZXR1cm4gZmxhZworCisgICAgc2FmZSA9IFRydWUKKyAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gd2Fsa19lZ2coZWdnX2Rpcik6CisgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5dycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIG5hbWUuZW5kc3dpdGgoJy5weWMnKSBvciBuYW1lLmVuZHN3aXRoKCcucHlvJyk6CisgICAgICAgICAgICAgICAgIyBhbHdheXMgc2NhbiwgZXZlbiBpZiB3ZSBhbHJlYWR5IGtub3cgd2UncmUgbm90IHNhZmUKKyAgICAgICAgICAgICAgICBzYWZlID0gc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpIGFuZCBzYWZlCisgICAgcmV0dXJuIHNhZmUKKworZGVmIHdyaXRlX3NhZmV0eV9mbGFnKGVnZ19kaXIsIHNhZmUpOgorICAgICMgV3JpdGUgb3IgcmVtb3ZlIHppcCBzYWZldHkgZmxhZyBmaWxlKHMpCisgICAgZm9yIGZsYWcsZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGVnZ19kaXIsIGZuKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CisgICAgICAgICAgICBpZiBzYWZlIGlzIE5vbmUgb3IgYm9vbChzYWZlKTw+ZmxhZzoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCisgICAgICAgIGVsaWYgc2FmZSBpcyBub3QgTm9uZSBhbmQgYm9vbChzYWZlKT09ZmxhZzoKKyAgICAgICAgICAgIG9wZW4oZm4sJ3cnKS5jbG9zZSgpCisKK3NhZmV0eV9mbGFncyA9IHsKKyAgICBUcnVlOiAnemlwLXNhZmUnLAorICAgIEZhbHNlOiAnbm90LXppcC1zYWZlJywKK30KKworZGVmIHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKToKKyAgICAiIiJDaGVjayB3aGV0aGVyIG1vZHVsZSBwb3NzaWJseSB1c2VzIHVuc2FmZS1mb3ItemlwZmlsZSBzdHVmZiIiIgorCisgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSxuYW1lKQorICAgIGlmIGZpbGVuYW1lWzotMV0gaW4gc3R1YnM6CisgICAgICAgIHJldHVybiBUcnVlICAgICAjIEV4dGVuc2lvbiBtb2R1bGUKKyAgICBwa2cgPSBiYXNlW2xlbihlZ2dfZGlyKSsxOl0ucmVwbGFjZShvcy5zZXAsJy4nKQorICAgIG1vZHVsZSA9IHBrZysocGtnIGFuZCAnLicgb3IgJycpK29zLnBhdGguc3BsaXRleHQobmFtZSlbMF0KKyAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKTsgZi5yZWFkKDgpICAgIyBza2lwIG1hZ2ljICYgZGF0ZQorICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZik7ICBmLmNsb3NlKCkKKyAgICBzYWZlID0gVHJ1ZQorICAgIHN5bWJvbHMgPSBkaWN0LmZyb21rZXlzKGl0ZXJfc3ltYm9scyhjb2RlKSkKKyAgICBmb3IgYmFkIGluIFsnX19maWxlX18nLCAnX19wYXRoX18nXToKKyAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CisgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSByZWZlcmVuY2VzICVzIiwgbW9kdWxlLCBiYWQpCisgICAgICAgICAgICBzYWZlID0gRmFsc2UKKyAgICBpZiAnaW5zcGVjdCcgaW4gc3ltYm9sczoKKyAgICAgICAgZm9yIGJhZCBpbiBbCisgICAgICAgICAgICAnZ2V0c291cmNlJywgJ2dldGFic2ZpbGUnLCAnZ2V0c291cmNlZmlsZScsICdnZXRmaWxlJworICAgICAgICAgICAgJ2dldHNvdXJjZWxpbmVzJywgJ2ZpbmRzb3VyY2UnLCAnZ2V0Y29tbWVudHMnLCAnZ2V0ZnJhbWVpbmZvJywKKyAgICAgICAgICAgICdnZXRpbm5lcmZyYW1lcycsICdnZXRvdXRlcmZyYW1lcycsICdzdGFjaycsICd0cmFjZScKKyAgICAgICAgXToKKyAgICAgICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIE1BWSBiZSB1c2luZyBpbnNwZWN0LiVzIiwgbW9kdWxlLCBiYWQpCisgICAgICAgICAgICAgICAgc2FmZSA9IEZhbHNlCisgICAgaWYgJ19fbmFtZV9fJyBpbiBzeW1ib2xzIGFuZCAnX19tYWluX18nIGluIHN5bWJvbHMgYW5kICcuJyBub3QgaW4gbW9kdWxlOgorICAgICAgICBpZiBnZXRfcHl0aG9uX3ZlcnNpb24oKT49IjIuNCI6CisgICAgICAgICAgICBsb2cud2FybigiJXM6IHRvcC1sZXZlbCBtb2R1bGUgbWF5IGJlICdweXRob24gLW0nIHNjcmlwdCIsIG1vZHVsZSkKKyAgICAgICAgICAgIHNhZmUgPSBGYWxzZQorICAgIHJldHVybiBzYWZlCisKK2RlZiBpdGVyX3N5bWJvbHMoY29kZSk6CisgICAgIiIiWWllbGQgbmFtZXMgYW5kIHN0cmluZ3MgdXNlZCBieSBgY29kZWAgYW5kIGl0cyBuZXN0ZWQgY29kZSBvYmplY3RzIiIiCisgICAgZm9yIG5hbWUgaW4gY29kZS5jb19uYW1lczogeWllbGQgbmFtZQorICAgIGZvciBjb25zdCBpbiBjb2RlLmNvX2NvbnN0czoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjb25zdCxiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHlpZWxkIGNvbnN0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb25zdCxDb2RlVHlwZSk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBpdGVyX3N5bWJvbHMoY29uc3QpOgorICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKKworIyBBdHRyaWJ1dGUgbmFtZXMgb2Ygb3B0aW9ucyBmb3IgY29tbWFuZHMgdGhhdCBtaWdodCBuZWVkIHRvIGJlIGNvbnZpbmNlZCB0bworIyBpbnN0YWxsIHRvIHRoZSBlZ2cgYnVpbGQgZGlyZWN0b3J5CisKK0lOU1RBTExfRElSRUNUT1JZX0FUVFJTID0gWworICAgICdpbnN0YWxsX2xpYicsICdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9iYXNlJworXQorCitkZWYgbWFrZV96aXBmaWxlICh6aXBfZmlsZW5hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgY29tcHJlc3M9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuICBUaGUgb3V0cHV0CisgICAgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9kaXInICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlICJ6aXBmaWxlIgorICAgIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eSAoaWYgaW5zdGFsbGVkCisgICAgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcyBhdmFpbGFibGUsCisgICAgcmFpc2VzIERpc3R1dGlsc0V4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAgZmlsZS4KKyAgICAiIiIKKyAgICBpbXBvcnQgemlwZmlsZQorICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoemlwX2ZpbGVuYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGxvZy5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCisKKyAgICBkZWYgdmlzaXQgKHosIGRpcm5hbWUsIG5hbWVzKToKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICBwID0gcGF0aFtsZW4oYmFzZV9kaXIpKzE6XQorICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICB6LndyaXRlKHBhdGgsIHApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGRpbmcgJyVzJyIgJSBwKQorCisgICAgaWYgY29tcHJlc3MgaXMgTm9uZToKKyAgICAgICAgY29tcHJlc3MgPSAoc3lzLnZlcnNpb24+PSIyLjQiKSAjIGF2b2lkIDIuMyB6aXBpbXBvcnQgYnVnIHdoZW4gNjQgYml0cworCisgICAgY29tcHJlc3Npb24gPSBbemlwZmlsZS5aSVBfU1RPUkVELCB6aXBmaWxlLlpJUF9ERUZMQVRFRF1bYm9vbChjb21wcmVzcyldCisgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsIGNvbXByZXNzaW9uPWNvbXByZXNzaW9uKQorICAgICAgICBvcy5wYXRoLndhbGsoYmFzZV9kaXIsIHZpc2l0LCB6KQorICAgICAgICB6LmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICBvcy5wYXRoLndhbGsoYmFzZV9kaXIsIHZpc2l0LCBOb25lKQorCisgICAgcmV0dXJuIHppcF9maWxlbmFtZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMGUwN2FjCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyBUaGlzIGlzIGp1c3QgYSBrbHVkZ2Ugc28gdGhhdCBiZGlzdF9ycG0gZG9lc24ndCBndWVzcyB3cm9uZyBhYm91dCB0aGUKKyMgZGlzdHJpYnV0aW9uIG5hbWUgYW5kIHZlcnNpb24sIGlmIHRoZSBlZ2dfaW5mbyBjb21tYW5kIGlzIGdvaW5nIHRvIGFsdGVyCisjIHRoZW0sIGFuZCBhbm90aGVyIGtsdWRnZSB0byBhbGxvdyB5b3UgdG8gYnVpbGQgb2xkLXN0eWxlIG5vbi1lZ2cgUlBNcworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtIGFzIF9iZGlzdF9ycG0KKworY2xhc3MgYmRpc3RfcnBtKF9iZGlzdF9ycG0pOgorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgX2JkaXN0X3JwbS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5ub19lZ2cgPSBOb25lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpICAgICMgZW5zdXJlIGRpc3RybyBuYW1lIGlzIHVwLXRvLWRhdGUKKyAgICAgICAgX2JkaXN0X3JwbS5ydW4oc2VsZikKKworICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CisgICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCisgICAgICAgIHJwbXZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJy0nLCdfJykKKyAgICAgICAgc3BlYyA9IF9iZGlzdF9ycG0uX21ha2Vfc3BlY19maWxlKHNlbGYpCisgICAgICAgIGxpbmUyMyA9ICclZGVmaW5lIHZlcnNpb24gJyt2ZXJzaW9uCisgICAgICAgIGxpbmUyNCA9ICclZGVmaW5lIHZlcnNpb24gJytycG12ZXJzaW9uCisgICAgICAgIHNwZWMgID0gWworICAgICAgICAgICAgbGluZS5yZXBsYWNlKAorICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dmVyc2lvbn0udGFyIiwKKyAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIiCisgICAgICAgICAgICApLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgInNldHVwLnB5IGluc3RhbGwgIiwKKyAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCAiCisgICAgICAgICAgICApLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgIiVzZXR1cCIsCisgICAgICAgICAgICAgICAgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IgorICAgICAgICAgICAgKS5yZXBsYWNlKGxpbmUyMyxsaW5lMjQpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzcGVjCisgICAgICAgIF0KKyAgICAgICAgc3BlYy5pbnNlcnQoc3BlYy5pbmRleChsaW5lMjQpKzEsICIlZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICIrdmVyc2lvbikKKyAgICAgICAgcmV0dXJuIHNwZWMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1NTFmYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC0wLDAgKzEsMjg1IEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKK3RyeToKKyAgICAjIEF0dGVtcHQgdG8gdXNlIFB5cmV4IGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKKyAgICBmcm9tIFB5cmV4LkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKKworaW1wb3J0IG9zLCBzeXMKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCitmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5Citmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCitnZXRfY29uZmlnX3ZhcigiTERTSEFSRUQiKSAgIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IF9jb25maWdfdmFycworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCisKK2hhdmVfcnRsZCA9IEZhbHNlCit1c2Vfc3R1YnMgPSBGYWxzZQorbGlidHlwZSA9ICdzaGFyZWQnCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICB1c2Vfc3R1YnMgPSBUcnVlCitlbGlmIG9zLm5hbWUgIT0gJ250JzoKKyAgICB0cnk6CisgICAgICAgIGZyb20gZGwgaW1wb3J0IFJUTERfTk9XCisgICAgICAgIGhhdmVfcnRsZCA9IFRydWUKKyAgICAgICAgdXNlX3N0dWJzID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworCitkZWYgaWZfZGwocyk6CisgICAgaWYgaGF2ZV9ydGxkOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiAnJworCisKKworCisKKworY2xhc3MgYnVpbGRfZXh0KF9idWlsZF9leHQpOgorICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCisgICAgICAgIG9sZF9pbnBsYWNlLCBzZWxmLmlucGxhY2UgPSBzZWxmLmlucGxhY2UsIDAKKyAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKKyAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKKyAgICAgICAgaWYgb2xkX2lucGxhY2U6CisgICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQorCisgICAgZGVmIGNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2Uoc2VsZik6CisgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKKyAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzotMV0pCisgICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIHNyY19maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYixmaWxlbmFtZSkKKworICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCisgICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKKyAgICAgICAgICAgICMgdXNlZC4KKyAgICAgICAgICAgIGNvcHlfZmlsZSgKKyAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAorICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuCisgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKHBhY2thZ2VfZGlyIG9yIG9zLmN1cmRpciwgZXh0LCBUcnVlKQorCisKKyAgICBpZiBfYnVpbGRfZXh0IGlzIG5vdCBfZHVfYnVpbGRfZXh0OgorICAgICAgICAjIFdvcmthcm91bmQgZm9yIHByb2JsZW1zIHVzaW5nIHNvbWUgUHlyZXggdmVyc2lvbnMgdy9TV0lHIGFuZC9vciAyLjQKKyAgICAgICAgZGVmIHN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKToKKyAgICAgICAgICAgICMgZmlyc3QgZG8gYW55IFB5cmV4IHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHNvdXJjZXMgPSBfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzKSBvciBzb3VyY2VzCisgICAgICAgICAgICAjIFRoZW4gZG8gYW55IGFjdHVhbCBTV0lHIHN0dWZmIG9uIHRoZSByZW1haW5kZXIKKyAgICAgICAgICAgIHJldHVybiBfZHVfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKQorCisKKworICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZixmdWxsbmFtZSkKKyAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbixsaWJ0eXBlKQorICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgorICAgICAgICAgICAgZCxmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsJ2RsLScrZm4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCisgICAgICAgIHNlbGYuc2hsaWJzID0gW10KKyAgICAgICAgc2VsZi5leHRfbWFwID0ge30KKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKyAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KV0KKyAgICAgICAgaWYgc2VsZi5zaGxpYnM6CisgICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQorICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAorICAgICAgICAgICAgbHRkID0gZXh0Ll9saW5rc190b19keW5hbWljID0gXAorICAgICAgICAgICAgICAgIHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQorICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KQorICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsZmlsZW5hbWUpKQorICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQorICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQorCisKKworICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKKyAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAorICAgICAgICAgICAgY29tcGlsZXI9c2VsZi5jb21waWxlciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPXNlbGYuZm9yY2UKKyAgICAgICAgKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICB0bXAgPSBfY29uZmlnX3ZhcnMuY29weSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBYWFggSGVscCEgIEkgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGV0aGVyIHRoZXNlIGFyZSByaWdodC4uLgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snTERTSEFSRUQnXSA9ICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydDQ1NIQVJFRCddID0gIiAtZHluYW1pY2xpYiIKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ1NPJ10gPSAiLmR5bGliIgorICAgICAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMudXBkYXRlKHRtcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKKworICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCisgICAgICAgIGlmIHNlbGYuZGVmaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKKyAgICAgICAgICAgIGZvciAobmFtZSx2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CisgICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQorICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CisgICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyeV9kaXJzKHNlbGYubGlicmFyeV9kaXJzKQorICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCisgICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKKworICAgICAgICAjIGhhY2sgc28gZGlzdHV0aWxzJyBidWlsZF9leHRlbnNpb24oKSBidWlsZHMgYSBsaWJyYXJ5IGluc3RlYWQKKyAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCisKKworCisgICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKKyAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsZXh0KQorCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgorICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyCisgICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLGV4dCkKKyAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYiwgZXh0CisgICAgICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IF9jb21waWxlcgorCisgICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4dCcgbGlua3MgdG8gYSBkeW5hbWljIGxpYiBpbiB0aGUgc2FtZSBwYWNrYWdlIiIiCisgICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0CisgICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCisgICAgICAgICMgWFhYIHN0YXRpYy1jb21waWxlZCB2ZXJzaW9uCisgICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCisgICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXStbJyddKQorICAgICAgICBmb3IgbGlibmFtZSBpbiBleHQubGlicmFyaWVzOgorICAgICAgICAgICAgaWYgcGtnK2xpYm5hbWUgaW4gbGlibmFtZXM6IHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzID0gX2J1aWxkX2V4dC5nZXRfb3V0cHV0cyhzZWxmKQorICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLm9wdGltaXplCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgorICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQorICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weScpCisgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5YycpCisgICAgICAgICAgICAgICAgaWYgb3B0aW1pemU6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weW8nKQorICAgICAgICByZXR1cm4gb3V0cHV0cworCisgICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKKyAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIixleHQuX2Z1bGxfbmFtZSwgb3V0cHV0X2RpcikKKyAgICAgICAgc3R1Yl9maWxlID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSsnLnB5JworICAgICAgICBpZiBjb21waWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlKyIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwndycpCisgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihbCisgICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKKyAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKKyAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIraWZfZGwoIiwgZGwiKSwKKyAgICAgICAgICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCVyKSIKKyAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAorICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCisgICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKKyAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKKyAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKKyAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKKyAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCisgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKKyAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCisgICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKKyAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAorICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKKyAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKKyAgICAgICAgICAgICAgICAiIiAjIHRlcm1pbmFsIFxuCisgICAgICAgICAgICBdKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiBjb21waWxlOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCisgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCisgICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT1vcHRpbWl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzdHViX2ZpbGUpCisKKworaWYgdXNlX3N0dWJzIG9yIG9zLm5hbWU9PSdudCc6CisgICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCisgICAgIworICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQorICAgICk6ICBzZWxmLmxpbmsoCisgICAgICAgICAgICBzZWxmLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwKKyAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCisgICAgICAgICAgICBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZworICAgICAgICApCitlbHNlOgorICAgICMgQnVpbGQgc3RhdGljIGxpYnJhcmllcyBldmVyeXdoZXJlIGVsc2UKKyAgICBsaWJ0eXBlID0gJ3N0YXRpYycKKworICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQorICAgICk6CisgICAgICAgICMgWFhYIHdlIG5lZWQgdG8gZWl0aGVyIGRpc2FsbG93IHRoZXNlIGF0dHJzIG9uIExpYnJhcnkgaW5zdGFuY2VzLAorICAgICAgICAjICAgICBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KKyAgICAgICAgI2xpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgI2V4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgI2J1aWxkX3RlbXA9Tm9uZQorCisgICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKKyAgICAgICAgb3V0cHV0X2RpcixmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCisgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKKyAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKKyAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgcHJlZml4CisgICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQorCisgICAgICAgIHNlbGYuY3JlYXRlX3N0YXRpY19saWIoCisgICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5CkBAIC0wLDAgKzEsMTkyIEBACitpbXBvcnQgb3MucGF0aCwgc3lzLCBmbm1hdGNoCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weSBhcyBfYnVpbGRfcHkKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBnbG9iIGltcG9ydCBnbG9iCisKK2NsYXNzIGJ1aWxkX3B5KF9idWlsZF9weSk6CisgICAgIiIiRW5oYW5jZWQgJ2J1aWxkX3B5JyBjb21tYW5kIHRoYXQgaW5jbHVkZXMgZGF0YSBmaWxlcyB3aXRoIHBhY2thZ2VzCisKKyAgICBUaGUgZGF0YSBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBhICdwYWNrYWdlX2RhdGEnIGFyZ3VtZW50IHRvICdzZXR1cCgpJy4KKyAgICBTZWUgJ3NldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24nIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBBbHNvLCB0aGlzIHZlcnNpb24gb2YgdGhlICdidWlsZF9weScgY29tbWFuZCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYm90aAorICAgICdweV9tb2R1bGVzJyBhbmQgJ3BhY2thZ2VzJyBpbiB0aGUgc2FtZSBzZXR1cCBvcGVyYXRpb24uCisgICAgIiIiCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCisgICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5leGNsdWRlX3BhY2thZ2VfZGF0YSBvciB7fQorICAgICAgICBpZiAnZGF0YV9maWxlcycgaW4gc2VsZi5fX2RpY3RfXzogZGVsIHNlbGYuX19kaWN0X19bJ2RhdGFfZmlsZXMnXQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiQnVpbGQgbW9kdWxlcywgcGFja2FnZXMsIGFuZCBjb3B5IGRhdGEgZmlsZXMgdG8gYnVpbGQgZGlyZWN0b3J5IiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnB5X21vZHVsZXMgYW5kIG5vdCBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKKworICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCisKKyAgICAgICAgIyBPbmx5IGNvbXBpbGUgYWN0dWFsIC5weSBmaWxlcywgdXNpbmcgb3VyIGJhc2UgY2xhc3MnIGlkZWEgb2Ygd2hhdCBvdXIKKyAgICAgICAgIyBvdXRwdXQgZmlsZXMgYXJlLgorICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShfYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZT0wKSkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLGF0dHIpOgorICAgICAgICBpZiBhdHRyPT0nZGF0YV9maWxlcyc6ICAjIGxhemlseSBjb21wdXRlIGRhdGEgZmlsZXMKKyAgICAgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IGZpbGVzID0gc2VsZi5fZ2V0X2RhdGFfZmlsZXMoKTsgcmV0dXJuIGZpbGVzCisgICAgICAgIHJldHVybiBfYnVpbGRfcHkuX19nZXRhdHRyX18oc2VsZixhdHRyKQorCisgICAgZGVmIF9nZXRfZGF0YV9maWxlcyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUgbGlzdCBvZiAnKHBhY2thZ2Usc3JjX2RpcixidWlsZF9kaXIsZmlsZW5hbWVzKScgdHVwbGVzIiIiCisgICAgICAgIHNlbGYuYW5hbHl6ZV9tYW5pZmVzdCgpCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgorICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgICAgICBzcmNfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKKworICAgICAgICAgICAgIyBDb21wdXRlIHBhY2thZ2UgYnVpbGQgZGlyZWN0b3J5CisgICAgICAgICAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4oKihbc2VsZi5idWlsZF9saWJdICsgcGFja2FnZS5zcGxpdCgnLicpKSkKKworICAgICAgICAgICAgIyBMZW5ndGggb2YgcGF0aCB0byBzdHJpcCBmcm9tIGZvdW5kIGZpbGVzCisgICAgICAgICAgICBwbGVuID0gbGVuKHNyY19kaXIpKzEKKworICAgICAgICAgICAgIyBTdHJpcCBkaXJlY3RvcnkgZnJvbSBnbG9iYmVkIGZpbGVuYW1lcworICAgICAgICAgICAgZmlsZW5hbWVzID0gWworICAgICAgICAgICAgICAgIGZpbGVbcGxlbjpdIGZvciBmaWxlIGluIHNlbGYuZmluZF9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIpCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgZGF0YS5hcHBlbmQoIChwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcykgKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKKyAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCisgICAgICAgIGdsb2JzID0gKHNlbGYucGFja2FnZV9kYXRhLmdldCgnJywgW10pCisgICAgICAgICAgICAgICAgICsgc2VsZi5wYWNrYWdlX2RhdGEuZ2V0KHBhY2thZ2UsIFtdKSkKKyAgICAgICAgZmlsZXMgPSBzZWxmLm1hbmlmZXN0X2ZpbGVzLmdldChwYWNrYWdlLCBbXSlbOl0KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gZ2xvYnM6CisgICAgICAgICAgICAjIEVhY2ggcGF0dGVybiBoYXMgdG8gYmUgY29udmVydGVkIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aAorICAgICAgICAgICAgZmlsZXMuZXh0ZW5kKGdsb2Iob3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkpKQorICAgICAgICByZXR1cm4gc2VsZi5leGNsdWRlX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpciwgZmlsZXMpCisKKyAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgorICAgICAgICAiIiJDb3B5IGRhdGEgZmlsZXMgaW50byBidWlsZCBkaXJlY3RvcnkiIiIKKyAgICAgICAgbGFzdGRpciA9IE5vbmUKKyAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSwgdGFyZ2V0KQorCisKKyAgICBkZWYgYW5hbHl6ZV9tYW5pZmVzdChzZWxmKToKKyAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcyA9IG1mID0ge30KKyAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfcGFja2FnZV9kYXRhOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNyY19kaXJzID0ge30KKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKKyAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQorICAgICAgICAgICAgc3JjX2RpcnNbYXNzZXJ0X3JlbGF0aXZlKHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpKV0gPSBwYWNrYWdlCisKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQorICAgICAgICBmb3IgcGF0aCBpbiBlaV9jbWQuZmlsZWxpc3QuZmlsZXM6CisgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZCxmID0gb3MucGF0aC5zcGxpdChhc3NlcnRfcmVsYXRpdmUocGF0aCkpCisgICAgICAgICAgICBwcmV2ID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgZCBhbmQgZCE9cHJldiBhbmQgZCBub3QgaW4gc3JjX2RpcnM6CisgICAgICAgICAgICAgICAgcHJldiA9IGQKKyAgICAgICAgICAgICAgICBkLCBkZiA9IG9zLnBhdGguc3BsaXQoZCkKKyAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRmLCBmKQorICAgICAgICAgICAgaWYgZCBpbiBzcmNfZGlyczoKKyAgICAgICAgICAgICAgICBtZi5zZXRkZWZhdWx0KHNyY19kaXJzW2RdLFtdKS5hcHBlbmQocGF0aCkKKworCisgICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOiBwYXNzICAjIGtsdWRnZSAyLjQgZm9yIGxhenkgY29tcHV0YXRpb24KKworICAgIGlmIHN5cy52ZXJzaW9uPCIyLjQiOiAgICAjIFB5dGhvbiAyLjQgYWxyZWFkeSBoYXMgdGhpcyBjb2RlCisgICAgICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTEpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGNvbXBsZXRlIGxpc3Qgb2YgZmlsZXMgY29waWVkIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkKKworICAgICAgICAgICAgVGhpcyBpbmNsdWRlcyBib3RoICcucHknIGZpbGVzIGFuZCBkYXRhIGZpbGVzLCBhcyB3ZWxsIGFzICcucHljJworICAgICAgICAgICAgYW5kICcucHlvJyBmaWxlcyBpZiAnaW5jbHVkZV9ieXRlY29kZScgaXMgdHJ1ZS4gIChUaGlzIG1ldGhvZCBpcworICAgICAgICAgICAgbmVlZGVkIGZvciB0aGUgJ2luc3RhbGxfbGliJyBjb21tYW5kIHRvIGRvIGl0cyBqb2IgcHJvcGVybHksIGFuZCB0bworICAgICAgICAgICAgZ2VuZXJhdGUgYSBjb3JyZWN0IGluc3RhbGxhdGlvbiBtYW5pZmVzdC4pCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBfYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZSkgKyBbCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpcixmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzCisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lcworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBjaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKKyAgICAgICAgIiIiQ2hlY2sgbmFtZXNwYWNlIHBhY2thZ2VzJyBfX2luaXRfXyBmb3IgZGVjbGFyZV9uYW1lc3BhY2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaW5pdF9weSA9IF9idWlsZF9weS5jaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKQorICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0gPSBpbml0X3B5CisKKyAgICAgICAgaWYgbm90IGluaXRfcHkgb3Igbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKKyAgICAgICAgICAgIHJldHVybiBpbml0X3B5CisKKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CisgICAgICAgICAgICBpZiBwa2c9PXBhY2thZ2Ugb3IgcGtnLnN0YXJ0c3dpdGgocGFja2FnZSsnLicpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5pdF9weQorCisgICAgICAgIGYgPSBvcGVuKGluaXRfcHksJ3JVJykKKyAgICAgICAgaWYgJ2RlY2xhcmVfbmFtZXNwYWNlJyBub3QgaW4gZi5yZWFkKCk6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgIk5hbWVzcGFjZSBwYWNrYWdlIHByb2JsZW06ICVzIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGJ1dCBpdHNcbiIKKyAgICAgICAgICAgICAgIl9faW5pdF9fLnB5IGRvZXMgbm90IGNhbGwgZGVjbGFyZV9uYW1lc3BhY2UoKSEgUGxlYXNlIGZpeCBpdC5cbiIKKyAgICAgICAgICAgICAgJyhTZWUgdGhlIHNldHVwdG9vbHMgbWFudWFsIHVuZGVyICJOYW1lc3BhY2UgUGFja2FnZXMiIGZvciAnCisgICAgICAgICAgICAgICJkZXRhaWxzLilcbiIgJSAocGFja2FnZSwpCisgICAgICAgICAgICApCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gaW5pdF9weQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkPXt9CisgICAgICAgIF9idWlsZF9weS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKworCisKKworCisKKworICAgIGRlZiBleGNsdWRlX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2RpciwgZmlsZXMpOgorICAgICAgICAiIiJGaWx0ZXIgZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKKyAgICAgICAgZ2xvYnMgPSAoc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YS5nZXQoJycsIFtdKQorICAgICAgICAgICAgICAgICArIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEuZ2V0KHBhY2thZ2UsIFtdKSkKKyAgICAgICAgYmFkID0gW10KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gZ2xvYnM6CisgICAgICAgICAgICBiYWQuZXh0ZW5kKAorICAgICAgICAgICAgICAgIGZubWF0Y2guZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICBmaWxlcywgb3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgIGJhZCA9IGRpY3QuZnJvbWtleXMoYmFkKQorICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gZmlsZXMgaWYgZiBub3QgaW4gYmFkXQorCisKK2RlZiBhc3NlcnRfcmVsYXRpdmUocGF0aCk6CisgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCisgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyIiIkVycm9yOiBzZXR1cCBzY3JpcHQgc3BlY2lmaWVzIGFuIGFic29sdXRlIHBhdGg6CisKKyAgICAlcworCitzZXR1cCgpIGFyZ3VtZW50cyBtdXN0ICphbHdheXMqIGJlIC8tc2VwYXJhdGVkIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQorc2V0dXAucHkgZGlyZWN0b3J5LCAqbmV2ZXIqIGFic29sdXRlIHBhdGhzLgorIiIiICUgcGF0aAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YWI1YjIzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5CkBAIC0wLDAgKzEsMTE2IEBACitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBub3JtYWxpemVfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitpbXBvcnQgc3lzLCBvcworCitjbGFzcyBkZXZlbG9wKGVhc3lfaW5zdGFsbCk6CisgICAgIiIiU2V0IHVwIHBhY2thZ2UgZm9yIGRldmVsb3BtZW50IiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIHBhY2thZ2UgaW4gJ2RldmVsb3BtZW50IG1vZGUnIgorCisgICAgdXNlcl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKKyAgICAgICAgKCJ1bmluc3RhbGwiLCAidSIsICJVbmluc3RhbGwgdGhpcyBzb3VyY2UgcGFja2FnZSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IGVhc3lfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbJ3VuaW5zdGFsbCddCisKKyAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlICAjIG92ZXJyaWRlIGJhc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudW5pbnN0YWxsOgorICAgICAgICAgICAgc2VsZi5tdWx0aV92ZXJzaW9uID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbGluaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfZm9yX2RldmVsb3BtZW50KCkKKyAgICAgICAgc2VsZi53YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucygpCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnVuaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgZWFzeV9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorCisKKworCisKKworCisKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGVpID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgaWYgZWkuYnJva2VuX2VnZ19pbmZvOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAiUGxlYXNlIHJlbmFtZSAlciB0byAlciBiZWZvcmUgdXNpbmcgJ2RldmVsb3AnIgorICAgICAgICAgICAgJSAoZWkuZWdnX2luZm8sIGVpLmJyb2tlbl9lZ2dfaW5mbykKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hcmdzID0gW2VpLmVnZ19uYW1lXQorICAgICAgICBlYXN5X2luc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmVnZ19saW5rID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGVpLmVnZ19uYW1lKycuZWdnLWxpbmsnKQorICAgICAgICBzZWxmLmVnZ19iYXNlID0gZWkuZWdnX2Jhc2UKKyAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfYmFzZSkKKworICAgICAgICAjIE1ha2UgYSBkaXN0cmlidXRpb24gZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlCisgICAgICAgIHNlbGYuZGlzdCA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgIG5vcm1hbGl6ZV9wYXRoKHNlbGYuZWdnX3BhdGgpLAorICAgICAgICAgICAgUGF0aE1ldGFkYXRhKHNlbGYuZWdnX3BhdGgsIG9zLnBhdGguYWJzcGF0aChlaS5lZ2dfaW5mbykpLAorICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gZWkuZWdnX25hbWUKKyAgICAgICAgKQorCisgICAgZGVmIGluc3RhbGxfZm9yX2RldmVsb3BtZW50KHNlbGYpOgorICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKKworICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKKyAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQorCisgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkgICMgZW5zdXJlIHRoYXQgdGFyZ2V0IGRpciBpcyBzaXRlLXNhZmUKKworICAgICAgICAjIGNyZWF0ZSBhbiAuZWdnLWxpbmsgaW4gdGhlIGluc3RhbGxhdGlvbiBkaXIsIHBvaW50aW5nIHRvIG91ciBlZ2cKKyAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3BlbihzZWxmLmVnZ19saW5rLCJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5lZ2dfcGF0aCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgcG9zdHByb2Nlc3MgdGhlIGluc3RhbGxlZCBkaXN0cm8sIGZpeGluZyB1cCAucHRoLCBpbnN0YWxsaW5nIHNjcmlwdHMsCisgICAgICAgICMgYW5kIGhhbmRsaW5nIHJlcXVpcmVtZW50cworICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKE5vbmUsIHNlbGYuZGlzdCkKKworICAgIGRlZiB1bmluc3RhbGxfbGluayhzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5lZ2dfbGluayk6CisgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKKyAgICAgICAgICAgIGNvbnRlbnRzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZmlsZShzZWxmLmVnZ19saW5rKV0KKyAgICAgICAgICAgIGlmIGNvbnRlbnRzICE9IFtzZWxmLmVnZ19wYXRoXToKKyAgICAgICAgICAgICAgICBsb2cud2FybigiTGluayBwb2ludHMgdG8gJXM6IHVuaW5zdGFsbCBhYm9ydGVkIiwgY29udGVudHMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmVnZ19saW5rKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfcHRoKHNlbGYuZGlzdCkgICMgcmVtb3ZlIGFueSAucHRoIGxpbmsgdG8gdXMKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgICMgWFhYIHNob3VsZCBhbHNvIGNoZWNrIGZvciBlbnRyeSBwb2ludCBzY3JpcHRzIQorICAgICAgICAgICAgbG9nLndhcm4oIk5vdGU6IHlvdSBtdXN0IHVuaW5zdGFsbCBvciByZXBsYWNlIHNjcmlwdHMgbWFudWFsbHkhIikKKworCisgICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CisgICAgICAgIGlmIGRpc3QgaXMgbm90IHNlbGYuZGlzdDoKKyAgICAgICAgICAgICMgSW5zdGFsbGluZyBhIGRlcGVuZGVuY3ksIHNvIGZhbGwgYmFjayB0byBub3JtYWwgYmVoYXZpb3IKKyAgICAgICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLGRpc3QpCisKKyAgICAgICAgIyBjcmVhdGUgd3JhcHBlciBzY3JpcHRzIGluIHRoZSBzY3JpcHQgZGlyLCBwb2ludGluZyB0byBkaXN0LnNjcmlwdHMKKworICAgICAgICAjIG5ldy1zdHlsZS4uLgorICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCisKKyAgICAgICAgIyAuLi5hbmQgb2xkLXN0eWxlCisgICAgICAgIGZvciBzY3JpcHRfbmFtZSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzIG9yIFtdOgorICAgICAgICAgICAgc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoY29udmVydF9wYXRoKHNjcmlwdF9uYW1lKSkKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShzY3JpcHRfcGF0aCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHNjcmlwdF9wYXRoLCdyVScpCisgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQoZGlzdCwgc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0LCBzY3JpcHRfcGF0aCkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2RkY2VjNAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWFzeV9pbnN0YWxsLnB5CkBAIC0wLDAgKzEsMTU1NSBAQAorIyFweXRob24KKyIiIlwKK0Vhc3kgSW5zdGFsbAorLS0tLS0tLS0tLS0tCisKK0EgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgorcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0CitmaWxlLCBvciB2aXNpdCB0aGUgYEVhc3lJbnN0YWxsIGhvbWUgcGFnZWBfXy4KKworX18gaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsCisiIiIKK2ltcG9ydCBzeXMsIG9zLnBhdGgsIHppcGltcG9ydCwgc2h1dGlsLCB0ZW1wZmlsZSwgemlwZmlsZSwgcmUsIHN0YXQsIHJhbmRvbQorZnJvbSBnbG9iIGltcG9ydCBnbG9iCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBydW5fc2V0dXAKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgIERpc3R1dGlsc0Vycm9yCitmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQorZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFBhY2thZ2VJbmRleCwgcGFyc2VfYmRpc3Rfd2luaW5zdAorZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFVSTF9TQ0hFTUUKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2csIGVnZ19pbmZvCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKK3N5c19leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKKworX19hbGxfXyA9IFsKKyAgICAnc2FtZWZpbGUnLCAnZWFzeV9pbnN0YWxsJywgJ1B0aERpc3RyaWJ1dGlvbnMnLCAnZXh0cmFjdF93aW5pbnN0X2NmZycsCisgICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCitdCisKK2RlZiBzYW1lZmlsZShwMSxwMik6CisgICAgaWYgaGFzYXR0cihvcy5wYXRoLCdzYW1lZmlsZScpIGFuZCAoCisgICAgICAgIG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCisgICAgKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEscDIpCisgICAgcmV0dXJuICgKKyAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkgPT0KKyAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKKyAgICApCisKK2NsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKKyAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKKyAgICBkZXNjcmlwdGlvbiA9ICJGaW5kL2dldC9pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIKKyAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKKyAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCisgICAgICAgICgibXVsdGktdmVyc2lvbiIsICJtIiwgIm1ha2UgYXBwcyBoYXZlIHRvIHJlcXVpcmUoKSBhIHZlcnNpb24iKSwKKyAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAorICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKKyAgICAgICAgKCJzY3JpcHQtZGlyPSIsICJzIiwgImluc3RhbGwgc2NyaXB0cyB0byBESVIiKSwKKyAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKKyAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAorICAgICAgICAoImluZGV4LXVybD0iLCAiaSIsICJiYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCIpLAorICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAorICAgICAgICAoImRlbGV0ZS1jb25mbGljdGluZyIsICJEIiwgIm5vIGxvbmdlciBuZWVkZWQ7IGRvbid0IHVzZSB0aGlzIiksCisgICAgICAgICgiaWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIiwgTm9uZSwKKyAgICAgICAgICAgICJubyBsb25nZXIgbmVlZGVkOyBkb24ndCB1c2UgdGhpcyIpLAorICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCisgICAgICAgICAgICAiZG93bmxvYWQvZXh0cmFjdC9idWlsZCBpbiBESVI7IGtlZXAgdGhlIHJlc3VsdHMiKSwKKyAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCisgICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKKyAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKKyAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKKyAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKKyAgICAgICAgKCdhbHdheXMtdW56aXAnLCAnWicsICJkb24ndCBpbnN0YWxsIGFzIGEgemlwZmlsZSwgbm8gbWF0dGVyIHdoYXQiKSwKKyAgICAgICAgKCdzaXRlLWRpcnM9JywnUycsImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCisgICAgICAgICgnZWRpdGFibGUnLCAnZScsICJJbnN0YWxsIHNwZWNpZmllZCBwYWNrYWdlcyBpbiBlZGl0YWJsZSBmb3JtIiksCisgICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCisgICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCisgICAgXQorICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ3ppcC1vaycsICdtdWx0aS12ZXJzaW9uJywgJ2V4Y2x1ZGUtc2NyaXB0cycsICd1cGdyYWRlJywgJ2Fsd2F5cy1jb3B5JywKKyAgICAgICAgJ2RlbGV0ZS1jb25mbGljdGluZycsICdpZ25vcmUtY29uZmxpY3RzLWF0LW15LXJpc2snLCAnZWRpdGFibGUnLAorICAgICAgICAnbm8tZGVwcycsCisgICAgXQorICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9CisgICAgY3JlYXRlX2luZGV4ID0gUGFja2FnZUluZGV4CisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuemlwX29rID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gTm9uZQorICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQorICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCisgICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKKyAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5lZGl0YWJsZSA9IHNlbGYubm9fZGVwcyA9IHNlbGYuYWxsb3dfaG9zdHMgPSBOb25lCisgICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCisKKyAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCisgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IE5vbmUKKyAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrID0gTm9uZQorICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQorICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBGYWxzZQorICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCisgICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKKyAgICAgICAgIyBhbHdheXMgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUocyknICJlYXN5X2luc3RhbGwiCisgICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCisgICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgorICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAorICAgICAgICAgICAgc2VsZiwgc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQorICAgICAgICApCisKKyAgICBkZWYgZGVsZXRlX2Jsb2NrZXJzKHNlbGYsIGJsb2NrZXJzKToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzOgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtdHJlZShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLl9leHBhbmQoJ2luc3RhbGxfZGlyJywnc2NyaXB0X2RpcicsJ2J1aWxkX2RpcmVjdG9yeScsJ3NpdGVfZGlycycpCisgICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCisgICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeSB0byBtYXRjaCBpdC4KKyAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCisKKyAgICAgICAgIyBMZXQgaW5zdGFsbF9kaXIgZ2V0IHNldCBieSBpbnN0YWxsX2xpYiBjb21tYW5kLCB3aGljaCBpbiB0dXJuCisgICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKKyAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLAorICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykKKyAgICAgICAgKQorICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfc2NyaXB0cycsCisgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQorICAgICAgICApCisgICAgICAgICMgZGVmYXVsdCAtLXJlY29yZCBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKKyAgICAgICAgbm9ybXBhdGggPSBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKQorICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKKyAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzaXRlX2RpcnMgPSBbCisgICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4gc2VsZi5zaXRlX2RpcnMuc3BsaXQoJywnKQorICAgICAgICAgICAgXQorICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGQpOgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCisgICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgZCsiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKKyAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gc2VsZi5pbmRleF91cmwgb3IgImh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpIgorICAgICAgICBzZWxmLnNoYWRvd19wYXRoID0gc2VsZi5hbGxfc2l0ZV9kaXJzWzpdCisgICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKKyAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKKyAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmluc2VydCgwLCBwYXRoX2l0ZW0pCisKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGhvc3RzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzZWxmLmFsbG93X2hvc3RzLnNwbGl0KCcsJyldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBob3N0cyA9IFsnKiddCisKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBzZWxmLmNyZWF0ZV9pbmRleCgKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGggPSBzZWxmLnNoYWRvd19wYXRoLCBob3N0cz1ob3N0cworICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCkKKworICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gc2VsZi5maW5kX2xpbmtzLnNwbGl0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCisKKyAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywgKCdvcHRpbWl6ZScsJ29wdGltaXplJykpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsaW50KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCisgICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6IHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCisKKyAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgYW5kIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBib3RoIC0tZGVsZXRlLWNvbmZsaWN0aW5nIGFuZCAiCisgICAgICAgICAgICAgICAgIi0taWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIGF0IHRoZSBzYW1lIHRpbWUiCisgICAgICAgICAgICApCisgICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCisgICAgICAgICAgICApCisgICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKKyAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCisKKyAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYudmVyYm9zZTw+c2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgorICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCisgICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKKyAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgICAgICAgICAgICAgICMgc3RyaXAgYW55IHBhY2thZ2UgcHJlZml4CisgICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4geHJhbmdlKGxlbihvdXRwdXRzKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCisgICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCisgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UpCisKKyAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8tdGVtcG5hbWUgYmFzZSBpbiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCisgICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KKyAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwaWQgPSByYW5kb20ucmFuZGludCgwLHN5cy5tYXhpbnQpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKKworICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3Rpbmcgb3Igc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAiTm90ZTogVGhlIC1ELCAtLWRlbGV0ZS1jb25mbGljdGluZyBhbmQiCisgICAgICAgICAgICAgICAgIiAtLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBubyBsb25nZXIgaGF2ZSBhbnkgcHVycG9zZSIKKyAgICAgICAgICAgICAgICAiIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIgorICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgorCisgICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCdlYXN5LWluc3RhbGwucHRoJykKKworICAgICAgICAjIElzIGl0IGEgY29uZmlndXJlZCwgUFlUSE9OUEFUSCwgaW1wbGljaXQsIG9yIGV4cGxpY2l0IHNpdGUgZGlyPworICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCisKKyAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyOgorICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgorICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpKycud3JpdGUtdGVzdCcKKyAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9leGlzdHM6IG9zLnVubGluayh0ZXN0ZmlsZSkKKyAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCd3JykuY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKKworICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CisgICAgICAgICAgICAjIENhbid0IGluc3RhbGwgbm9uLW11bHRpIHRvIG5vbi1zaXRlIGRpcgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCisKKyAgICAgICAgaWYgaXNfc2l0ZV9kaXI6CisgICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQorCisgICAgICAgIFBZVEhPTlBBVEggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsJycpLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgZmlsdGVyKE5vbmUsUFlUSE9OUEFUSCkpOgorICAgICAgICAgICAgIyBvbmx5IFBZVEhPTlBBVEggZGlycyBuZWVkIGEgc2l0ZS5weSwgc28gcHJldGVuZCBpdCdzIHRoZXJlCisgICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKKworCisgICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgorICAgICAgICBtc2cgPSAiIiJjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5CisKK1RoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5OgorCisgICAgJXMKKworVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgordGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKKworICAgICVzCisiIiIgICAgICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKKworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsX2Rpcik6CisgICAgICAgICAgICBtc2cgKz0gIiIiCitUaGlzIGRpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuICBQbGVhc2UgY3JlYXRlIGl0IGFuZCB0cnkgYWdhaW4sIG9yCitjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKK29wdGlvbikuCisiIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyArPSAiIiIKK1BlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgSWYgdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KK2FzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCithY2Nlc3MgdG8gdGhpcyBtYWNoaW5lLCB5b3UgbWF5IHdpc2ggdG8gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbgorZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorCitGb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCitkb2N1bWVudGF0aW9uIGF0OgorCisgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0Vhc3lJbnN0YWxsLmh0bWwKKworUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uCisiIiIKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQorCisKKworCisgICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgorICAgICAgICAiIiJFbXBpcmljYWxseSB2ZXJpZnkgd2hldGhlciAucHRoIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gaW5zdC4gZGlyIiIiCisgICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCisgICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCisgICAgICAgIHB0aF9maWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSsiLnB0aCIKKyAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlKycub2snCisgICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG9rX2V4aXN0czogb3MudW5saW5rKG9rX2ZpbGUpCisgICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwndycpCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKKyAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYud3JpdGUoImltcG9ydCBvcztvcGVuKCVyLCd3Jykud3JpdGUoJ09LJylcbiIgJSAob2tfZmlsZSwpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKTsgZj1Ob25lCisgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgICAgICAgICAgaWYgb3MubmFtZT09J250JzoKKyAgICAgICAgICAgICAgICAgICAgZGlybmFtZSxiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsJ3B5dGhvbncuZXhlJykKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUubG93ZXIoKT09J3B5dGhvbi5leGUnIGFuZCBvcy5wYXRoLmV4aXN0cyhhbHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgcHl0aG9udy5leGUgdG8gYXZvaWQgb3BlbmluZyBhIGNvbnNvbGUgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0CisgICAgICAgICAgICAgICAgICAgIGlmICcgJyBpbiBleGVjdXRhYmxlOiBleGVjdXRhYmxlPSciJXMiJyAlIGV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KKyAgICAgICAgICAgICAgICBzcGF3bihbZXhlY3V0YWJsZSwnLUUnLCctYycsJ3Bhc3MnXSwwKQorCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEOiAlcyBhcHBlYXJzIHRvIHN1cHBvcnQgLnB0aCBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6IG9zLnVubGluayhva19maWxlKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKTogb3MudW5saW5rKHB0aF9maWxlKQorICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgorICAgICAgICAgICAgbG9nLndhcm4oIlRFU1QgRkFJTEVEOiAlcyBkb2VzIE5PVCBzdXBwb3J0IC5wdGggZmlsZXMiLCBpbnN0ZGlyKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgorICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCisKKyAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQorICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBvciBub3QgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKKyAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKKyAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nK3NjcmlwdF9uYW1lKS5yZXBsYWNlKCdccicsJ1xuJykKKyAgICAgICAgICAgICkKKworICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLGZpbGVuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQocGF0aCkKKworICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6CisgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCisgICAgICAgICAgICAgICAgIndpdGggLS1lZGl0YWJsZSAoZXhjZXB0IHZpYSB0aGUgLS1maW5kLWxpbmtzIG9wdGlvbikuIgorICAgICAgICAgICAgICAgICUgKHNwZWMsKQorICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsc3BlYyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCisgICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBjYW4ndCBkbyBhIGNoZWNrb3V0IHRoZXJlIiAlCisgICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKKyAgICAgICAgICAgICkKKworCisKKyAgICBkZWYgZWFzeV9pbnN0YWxsKHNlbGYsIHNwZWMsIGRlcHM9RmFsc2UpOgorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iZWFzeV9pbnN0YWxsLSIpCisgICAgICAgIGRvd25sb2FkID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYyxSZXF1aXJlbWVudCk6CisgICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKKyAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKKyAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgVHJ1ZSkKKworICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CisgICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKKworICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQorICAgICAgICAgICAgZGlzdCA9IHNlbGYucGFja2FnZV9pbmRleC5mZXRjaF9kaXN0cmlidXRpb24oCisgICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsIG5vdCBzZWxmLmFsd2F5c19jb3B5CisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCisgICAgICAgICAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgICAgICAgICAgbXNnKz0iICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQorICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2U9PURFVkVMT1BfRElTVDoKKyAgICAgICAgICAgICAgICAjIC5lZ2ctaW5mbyBkaXN0cyBkb24ndCBuZWVkIGluc3RhbGxpbmcsIGp1c3QgcHJvY2VzcyBkZXBzCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQorICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcGRpcik6CisgICAgICAgICAgICAgICAgcm10cmVlKHRtcGRpcikKKworICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgorCisgICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKKyAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgorICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG5vdCBkb3dubG9hZC5lbmRzd2l0aCgnLmVnZycpCisKKyAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKKworICAgICAgICBpZiBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5OgorICAgICAgICAgICAgZGlzdHMgPSBzZWxmLmluc3RhbGxfZWdncyhzcGVjLCBkb3dubG9hZCwgdG1wZGlyKQorICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5jaGVja19jb25mbGljdHMoc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKSldCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3RzWzBdLCBkZXBzLCAiVXNpbmciKQorCisgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKKyAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKKyAgICAgICAgc2VsZi51cGRhdGVfcHRoKGRpc3QpCisgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKKyAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5hZGQoZGlzdCkKKyAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCisgICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKKyAgICAgICAgbG9nLndhcm4oc2VsZi5pbnN0YWxsYXRpb25fcmVwb3J0KHJlcXVpcmVtZW50LCBkaXN0LCAqaW5mbykpCisgICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6CisgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCisgICAgICAgICAgICByZXR1cm4gICMgWFhYIHRoaXMgaXMgbm90IHRoZSBkaXN0cmlidXRpb24gd2Ugd2VyZSBsb29raW5nIGZvcgorICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6CisgICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAorICAgICAgICAgICAgZGlzdHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQorICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudCBvciBkaXN0cmVxCisgICAgICAgICAgICByZXF1aXJlbWVudCA9IFJlcXVpcmVtZW50KAorICAgICAgICAgICAgICAgIGRpc3RyZXEucHJvamVjdF9uYW1lLCBkaXN0cmVxLnNwZWNzLCByZXF1aXJlbWVudC5leHRyYXMKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCisgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKKyAgICAgICAgICAgICkKKyAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXN0cm9zID0gV29ya2luZ1NldChbXSkucmVzb2x2ZSgKKyAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQsIGU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgZGlzdHJpYnV0aW9uICVzIiAlIGUuYXJncworICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0LCBlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIkluc3RhbGxlZCBkaXN0cmlidXRpb24gJXMgY29uZmxpY3RzIHdpdGggcmVxdWlyZW1lbnQgJXMiCisgICAgICAgICAgICAgICAgJSBlLmFyZ3MKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKKyAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKKyAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6CisgICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCisKKyAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgorICAgICAgICBpZiBzZWxmLnppcF9vayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKKyAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIsCisgICAgICAgICAgICAgICBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGRpc3RfZmlsZW5hbWUpPT1zZXR1cF9iYXNlOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgICMgZ2V0IGl0IG91dCBvZiB0aGUgdG1wIGRpcgorICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCisgICAgICAgICAgICBpZiBsZW4oY29udGVudHMpPT0xOgorICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSxjb250ZW50c1swXSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKKyAgICAgICAgICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKKyAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpOyBzaHV0aWwubW92ZShzZXR1cF9iYXNlLCBkc3QpCisgICAgICAgIHJldHVybiBkc3QKKworICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKKyAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzOgorICAgICAgICAgICAgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQorCisKKworCisKKworICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgorICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKKworICAgICAgICBpZiBkZXZfcGF0aDoKKyAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gZ2V0X3NjcmlwdF9oZWFkZXIoc2NyaXB0X3RleHQpICsgKAorICAgICAgICAgICAgICAgICIjIEVBU1ktSU5TVEFMTC1ERVYtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXJcbiIKKyAgICAgICAgICAgICAgICAiX19yZXF1aXJlc19fID0gJShzcGVjKXJcbiIKKyAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCByZXF1aXJlOyByZXF1aXJlKCUoc3BlYylyKVxuIgorICAgICAgICAgICAgICAgICJkZWwgcmVxdWlyZVxuIgorICAgICAgICAgICAgICAgICJfX2ZpbGVfXyA9ICUoZGV2X3BhdGgpclxuIgorICAgICAgICAgICAgICAgICJleGVjZmlsZShfX2ZpbGVfXylcbiIKKyAgICAgICAgICAgICkgJSBsb2NhbHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyAoCisgICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyXG4iCisgICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCisgICAgICAgICAgICAgICAgImltcG9ydCBwa2dfcmVzb3VyY2VzXG4iCisgICAgICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKVxuIgorICAgICAgICAgICAgKSAlIGxvY2FscygpCisKKyAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0KQorCisgICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCBibG9ja2Vycz0oKSk6CisgICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKKyAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAgIyBjbGVhbiB1cCBvbGQgLnB5Ly5weXcgdy9vIGEgc2NyaXB0CisgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpcix4KSBmb3IgeCBpbiBibG9ja2Vyc10pCisgICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCisgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQorICAgICAgICBzZWxmLmFkZF9vdXRwdXQodGFyZ2V0KQorCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwidyIrbW9kZSkKKyAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXQsMDc1NSkKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIG9zLmVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CisgICAgICAgICMgLmVnZyBkaXJzIG9yIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBzbyBqdXN0IHJldHVybiB0aGVtCisgICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCisgICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CisgICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KKworICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAorICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRpc3RfZmlsZW5hbWUpIGFuZCBub3QgZGlzdF9maWxlbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CisgICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAgIyBzb21ldGhpbmcgd2UgZG93bmxvYWRlZAorICAgICAgICAgICAgYW5kIHNlbGYuYnVpbGRfZGlyZWN0b3J5IGFuZCBzcGVjIGlzIG5vdCBOb25lCisgICAgICAgICk6CisgICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCisKKyAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCisgICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQorCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgorICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKKyAgICAgICAgICAgIGlmIG5vdCBzZXR1cHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlIGRpc3RfZmlsZW5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBsZW4oc2V0dXBzKT4xOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2V0dXAgc2NyaXB0cyBpbiAlcyIgJSBkaXN0X2ZpbGVuYW1lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCisKKyAgICAgICAgIyBOb3cgcnVuIGl0LCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKKyAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKKyAgICAgICAgICAgIGxvZy53YXJuKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKKworICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CisgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCxvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCisgICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCxtZXRhZGF0YT1tZXRhZGF0YSkKKworICAgIGRlZiBpbnN0YWxsX2VnZyhzZWxmLCBlZ2dfcGF0aCwgdG1wZGlyKToKKyAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSkKKyAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQorCisgICAgICAgIGRpc3QgPSBzZWxmLmVnZ19kaXN0cmlidXRpb24oZWdnX3BhdGgpCisgICAgICAgIHNlbGYuY2hlY2tfY29uZmxpY3RzKGRpc3QpCisgICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CisgICAgICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6CisgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoZGVzdGluYXRpb24sKSwiUmVtb3ZpbmcgIitkZXN0aW5hdGlvbikKKyAgICAgICAgICAgIHVuY2FjaGVfemlwZGlyKGRlc3RpbmF0aW9uKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgorICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwuY29weXRyZWUsICJDb3B5aW5nIgorICAgICAgICAgICAgZWxpZiBzZWxmLnNob3VsZF91bnppcChkaXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkZXN0aW5hdGlvbikKKyAgICAgICAgICAgICAgICBmLG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCisgICAgICAgICAgICBlbGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKKyAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZixtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKKworICAgICAgICAgICAgc2VsZi5leGVjdXRlKGYsIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAorICAgICAgICAgICAgICAgIChtKyIgJXMgdG8gJXMiKSAlCisgICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikpKQorCisgICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKKyAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKKworICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgorICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQorICAgICAgICBjZmcgPSBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpCisgICAgICAgIGlmIGNmZyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIGRpc3R1dGlscyBXaW5kb3dzIC5leGUiICUgZGlzdF9maWxlbmFtZQorICAgICAgICAgICAgKQorICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oTm9uZSwKKyAgICAgICAgICAgIHByb2plY3RfbmFtZT1jZmcuZ2V0KCdtZXRhZGF0YScsJ25hbWUnKSwKKyAgICAgICAgICAgIHZlcnNpb249Y2ZnLmdldCgnbWV0YWRhdGEnLCd2ZXJzaW9uJyksIHBsYXRmb3JtPSJ3aW4zMiIKKyAgICAgICAgKQorCisgICAgICAgICMgQ29udmVydCB0aGUgLmV4ZSB0byBhbiB1bnBhY2tlZCBlZ2cKKyAgICAgICAgZWdnX3BhdGggPSBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpKycuZWdnJykKKyAgICAgICAgZWdnX3RtcCAgPSBlZ2dfcGF0aCsnLnRtcCcKKyAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJykKKyAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykKKyAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKKyAgICAgICAgZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoZWdnX3RtcCwgZWdnX2luZm8pICAgICMgWFhYCisgICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQorCisgICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGtnX2luZiwndycpCisgICAgICAgICAgICBmLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjBcbicpCisgICAgICAgICAgICBmb3Igayx2IGluIGNmZy5pdGVtcygnbWV0YWRhdGEnKToKKyAgICAgICAgICAgICAgICBpZiBrPD4ndGFyZ2V0X3ZlcnNpb24nOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoay5yZXBsYWNlKCdfJywnLScpLnRpdGxlKCksIHYpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sJ3NjcmlwdHMnKQorICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICAjIGRlbGV0ZSBlbnRyeS1wb2ludCBzY3JpcHRzIHRvIGF2b2lkIGR1cGluZworICAgICAgICAgICAgW29zLnBhdGguam9pbihzY3JpcHRfZGlyLGFyZ3NbMF0pIGZvciBhcmdzIGluIGdldF9zY3JpcHRfYXJncyhkaXN0KV0KKyAgICAgICAgKQorICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgorICAgICAgICBiZGlzdF9lZ2cubWFrZV96aXBmaWxlKAorICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bgorICAgICAgICApCisgICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZworICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2VnZyhlZ2dfcGF0aCwgdG1wZGlyKQorCisgICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6CisgICAgICAgICIiIkV4dHJhY3QgYSBiZGlzdF93aW5pbnN0IHRvIHRoZSBkaXJlY3RvcmllcyBhbiBlZ2cgd291bGQgdXNlIiIiCisgICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKKyAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCisgICAgICAgIHRvX2NvbXBpbGUgPSBbXQorICAgICAgICBuYXRpdmVfbGlicyA9IFtdCisgICAgICAgIHRvcF9sZXZlbCA9IHt9CisKKyAgICAgICAgZGVmIHByb2Nlc3Moc3JjLGRzdCk6CisgICAgICAgICAgICBmb3Igb2xkLG5ldyBpbiBwcmVmaXhlczoKKyAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChvbGQpOgorICAgICAgICAgICAgICAgICAgICBzcmMgPSBuZXcrc3JjW2xlbihvbGQpOl0KKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQorICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfbGlicy5hcHBlbmQoc3JjKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkIT0nU0NSSVBUUy8nOgorICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAorICAgICAgICAgICAgaWYgbm90IHNyYy5lbmRzd2l0aCgnLnB0aCcpOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCisgICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCisgICAgICAgIHN0dWJzID0gW10KKyAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKKyAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAgICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgcmVzb3VyY2UsIHBhcnRzWy0xXSA9IHBhcnRzWy0xXSwgcGFydHNbLTFdWzotMV0KKyAgICAgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQorICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSk7IHN0dWJzLmFwcGVuZChweWZpbGUpCisgICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKKworICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgICMgY29tcGlsZSAucHkncworICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcob3MucGF0aC5qb2luKGVnZ190bXAsJ0VHRy1JTkZPJyksCisgICAgICAgICAgICBiZGlzdF9lZ2cuYW5hbHl6ZV9lZ2coZWdnX3RtcCwgc3R1YnMpKSAgIyB3cml0ZSB6aXAtc2FmZXR5IGZsYWcKKworICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywnbmF0aXZlX2xpYnMnOgorICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06CisgICAgICAgICAgICAgICAgdHh0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycsIG5hbWUrJy50eHQnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgorICAgICAgICAgICAgICAgICAgICBvcGVuKHR4dCwndycpLndyaXRlKCdcbicuam9pbihsb2NhbHMoKVtuYW1lXSkrJ1xuJykKKworICAgIGRlZiBjaGVja19jb25mbGljdHMoc2VsZiwgZGlzdCk6CisgICAgICAgICIiIlZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdGluZyAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgorCisgICAgICAgIHJldHVybiBkaXN0ICAgICAjIFhYWCB0ZW1wb3JhcmlseSBkaXNhYmxlIHVudGlsIG5ldyBzdHJhdGVneSBpcyBzdGFibGUKKyAgICAgICAgZnJvbSBpbXAgaW1wb3J0IGZpbmRfbW9kdWxlLCBnZXRfc3VmZml4ZXMKKyAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCisKKyAgICAgICAgYmxvY2tlcnMgPSBbXQorICAgICAgICBuYW1lcyA9IGRpY3QuZnJvbWtleXMoZGlzdC5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0JykpICMgWFhYIHByaXZhdGUgYXR0cgorCisgICAgICAgIGV4dHMgPSB7Jy5weWMnOjEsICcucHlvJzoxfSAgICAgIyBnZXRfc3VmZml4ZXMoKSBtaWdodCBsZWF2ZSBvbmUgb3V0CisgICAgICAgIGZvciBleHQsbW9kZSx0eXAgaW4gZ2V0X3N1ZmZpeGVzKCk6CisgICAgICAgICAgICBleHRzW2V4dF0gPSAxCisKKyAgICAgICAgZm9yIHBhdGgsZmlsZXMgaW4gZXhwYW5kX3BhdGhzKFtzZWxmLmluc3RhbGxfZGlyXStzZWxmLmFsbF9zaXRlX2RpcnMpOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGJhc2UsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBiYXNlIGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBleHRlbnNpb24sIGNoZWNrIGZvciBwYWNrYWdlCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgZmlsZW5hbWUsIGRlc2NyID0gZmluZF9tb2R1bGUoYmFzZSwgW3BhdGhdKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGY6IGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiBibG9ja2VyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlcnMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGV4dCBpbiBleHRzIGFuZCBiYXNlIT0nc2l0ZSc6ICAjIFhYWCB1Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrZXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aCxmaWxlbmFtZSkpCisgICAgICAgIGlmIGJsb2NrZXJzOgorICAgICAgICAgICAgc2VsZi5mb3VuZF9jb25mbGljdHMoZGlzdCwgYmxvY2tlcnMpCisKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgIGRlZiBmb3VuZF9jb25mbGljdHMoc2VsZiwgZGlzdCwgYmxvY2tlcnMpOgorICAgICAgICBpZiBzZWxmLmRlbGV0ZV9jb25mbGljdGluZzoKKyAgICAgICAgICAgIGxvZy53YXJuKCJBdHRlbXB0aW5nIHRvIGRlbGV0ZSBjb25mbGljdGluZyBwYWNrYWdlczoiKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKGJsb2NrZXJzKQorCisgICAgICAgIG1zZyA9ICIiIlwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NPTkZMSUNUIFdBUk5JTkc6CisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBvciBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIG1vZHVsZXMgb3IKK3BhY2thZ2VzIGJlaW5nIGluc3RhbGxlZCwgYW5kIHdpbGwgYmUgKmJlZm9yZSogdGhlIGluc3RhbGxlZCBwYWNrYWdlcyBpbgorUHl0aG9uJ3Mgc2VhcmNoIHBhdGguICBZb3UgTVVTVCByZW1vdmUgYWxsIG9mIHRoZSByZWxldmFudCBmaWxlcyBhbmQKK2RpcmVjdG9yaWVzIGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlCitpbnN0YWxsaW5nOgorCisgICAlcworCisiIiIgJSAnXG4gICAnLmpvaW4oYmxvY2tlcnMpCisKKyAgICAgICAgaWYgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICBtc2cgKz0gIiIiXAorKE5vdGU6IHlvdSBjYW4gcnVuIEVhc3lJbnN0YWxsIG9uICclcycgd2l0aCB0aGUKKy0tZGVsZXRlLWNvbmZsaWN0aW5nIG9wdGlvbiB0byBhdHRlbXB0IGRlbGV0aW9uIG9mIHRoZSBhYm92ZSBmaWxlcworYW5kL29yIGRpcmVjdG9yaWVzLikKKyIiIiAlIGRpc3QucHJvamVjdF9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgKz0gIiIiXAorTm90ZTogeW91IGNhbiBhdHRlbXB0IHRoaXMgaW5zdGFsbGF0aW9uIGFnYWluIHdpdGggRWFzeUluc3RhbGwsIGFuZCB1c2UKK2VpdGhlciB0aGUgLS1kZWxldGUtY29uZmxpY3RpbmcgKC1EKSBvcHRpb24gb3IgdGhlCistLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBvcHRpb24sIHRvIGVpdGhlciBkZWxldGUgdGhlIGFib3ZlIGZpbGVzCithbmQgZGlyZWN0b3JpZXMsIG9yIHRvIGlnbm9yZSB0aGUgY29uZmxpY3RzLCByZXNwZWN0aXZlbHkuICBOb3RlIHRoYXQgaWYKK3lvdSBpZ25vcmUgdGhlIGNvbmZsaWN0cywgdGhlIGluc3RhbGxlZCBwYWNrYWdlKHMpIG1heSBub3Qgd29yay4KKyIiIgorICAgICAgICBtc2cgKz0gIiIiXAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiIiCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQorICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkluc3RhbGxhdGlvbiBhYm9ydGVkIGR1ZSB0byBjb25mbGljdHMiKQorCisgICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKKyAgICAgICAgIiIiSGVscGZ1bCBpbnN0YWxsYXRpb24gbWVzc2FnZSBmb3IgZGlzcGxheSB0byBwYWNrYWdlIHVzZXJzIiIiCisgICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgorICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKKyAgICAgICAgICAgIG1zZyArPSAiIiIKKworQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiBvciAtLWluc3RhbGwtZGlyLAorYmVmb3JlIHlvdSBjYW4gaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdQord2lsbCBuZWVkIHRvICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbAorc2ltaWxhciB0byBvbmUgb2YgdGhlc2UgZXhhbXBsZXMsIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCB2ZXJzaW9uOgorCisgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcyIpICAjIGxhdGVzdCBpbnN0YWxsZWQgdmVyc2lvbgorICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCisgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCisiIiIKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCxzeXMucGF0aCk6CisgICAgICAgICAgICAgICAgbXNnICs9ICIiIgorCitOb3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCit0aGlzIHRvIHdvcmsuICAoZS5nLiBieSBiZWluZyB0aGUgYXBwbGljYXRpb24ncyBzY3JpcHQgZGlyZWN0b3J5LCBieSBiZWluZyBvbgorUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKKyIiIgorICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCisgICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQorICAgICAgICB2ZXJzaW9uID0gZGlzdC52ZXJzaW9uCisgICAgICAgIGV4dHJhcyA9ICcnICMgVE9ETzogc2VsZi5yZXBvcnRfZXh0cmFzKHJlcSwgZGlzdCkKKyAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCisKKyAgICBkZWYgcmVwb3J0X2VkaXRhYmxlKHNlbGYsIHNwZWMsIHNldHVwX3NjcmlwdCk6CisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQorICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICByZXR1cm4gIiIiXG5FeHRyYWN0ZWQgZWRpdGFibGUgdmVyc2lvbiBvZiAlKHNwZWMpcyB0byAlKGRpcm5hbWUpcworCitJZiBpdCB1c2VzIHNldHVwdG9vbHMgaW4gaXRzIHNldHVwIHNjcmlwdCwgeW91IGNhbiBhY3RpdmF0ZSBpdCBpbgorImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKKworICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAorCitTZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCisiIiIgJSBsb2NhbHMoKQorCisgICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgorICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9lZ2cnLCBiZGlzdF9lZ2cpCisgICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCisKKyAgICAgICAgYXJncyA9IGxpc3QoYXJncykKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlPjI6CisgICAgICAgICAgICB2ID0gJ3YnICogKHNlbGYudmVyYm9zZSAtIDEpCisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCctJyt2KQorICAgICAgICBlbGlmIHNlbGYudmVyYm9zZTwyOgorICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwnLXEnKQorICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCctbicpCisgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgIlJ1bm5pbmcgJXMgJXMiLCBzZXR1cF9zY3JpcHRbbGVuKHNldHVwX2Jhc2UpKzE6XSwgJyAnLmpvaW4oYXJncykKKyAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgdjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQorCisgICAgZGVmIGJ1aWxkX2FuZF9pbnN0YWxsKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSk6CisgICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KKyAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAorICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCisgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCisgICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCisgICAgICAgICAgICBhbGxfZWdncyA9IEVudmlyb25tZW50KFtkaXN0X2Rpcl0pCisgICAgICAgICAgICBlZ2dzID0gW10KKyAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6CisgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gYWxsX2VnZ3Nba2V5XToKKyAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKKyAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBlZ2dzIGZvdW5kIGluICVzIChzZXR1cCBzY3JpcHQgcHJvYmxlbT8pIiwKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCisgICAgICAgICAgICByZXR1cm4gZWdncworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQorICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKKworICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsZGlzdCk6CisgICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgICAjIGRyb3Agb2xkIGVudHJpZXMKKyAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKKyAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLnJlbW92ZShkKQorICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKKworICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgorICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKAorICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCisgICAgICAgICAgICAgICAgICAgIGRpc3QKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKKyAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAjIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmFwcGVuZChkaXN0LmxvY2F0aW9uKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisKKyAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCisKKyAgICAgICAgICAgIGlmIGRpc3Qua2V5PT0nc2V0dXB0b29scyc6CisgICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQorICAgICAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGNoZWNrIGZvciBsYXRlc3QgdmVyc2lvbj8KKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCdzZXR1cHRvb2xzLnB0aCcpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOiBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3dCcpCisgICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikrJ1xuJykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgorICAgICAgICAjIFByb2dyZXNzIGZpbHRlciBmb3IgdW5wYWNraW5nCisgICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCisgICAgICAgIHJldHVybiBkc3QgICAgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KKworICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKKyAgICAgICAgdG9fY29tcGlsZSA9IFtdCisKKyAgICAgICAgZGVmIHBmKHNyYyxkc3QpOgorICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKCcucHknKSBhbmQgbm90IHNyYy5zdGFydHN3aXRoKCdFR0ctSU5GTy8nKToKKyAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCisgICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsZHN0KQorICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCisKKyAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKKyAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKKworCisgICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCisgICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UgLSAxKQorCisgICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplOgorICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKKyAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKKyAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAgICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5CisKKworCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBub19kZWZhdWx0X3ZlcnNpb25fbXNnKHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiYmFkIGluc3RhbGwgZGlyZWN0b3J5IG9yIFBZVEhPTlBBVEgKKworWW91IGFyZSBhdHRlbXB0aW5nIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90CitvbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQoraW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCit0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgorCisgICAgJXMKKworYW5kIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjdXJyZW50bHkgY29udGFpbnM6CisKKyAgICAlcgorCitIZXJlIGFyZSBzb21lIG9mIHlvdXIgb3B0aW9ucyBmb3IgY29ycmVjdGluZyB0aGUgcHJvYmxlbToKKworKiBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBpLmUuLCBvbmUgdGhhdCBpcworICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKKworKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAorICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KKyAgUHl0aG9uIGFuZCB3YW50IHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlIGluc3RhbGxpbmcuKQorCisqIFlvdSBjYW4gc2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHN1cHBvcnQgIi5wdGgiIGZpbGVzIGJ5CisgIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKKworICBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9FYXN5SW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCisKK1BsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIiAlICgKKyAgICAgICAgc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCcnKQorICAgICkKKworCisKKworCisKKworCisKKworICAgIGRlZiBpbnN0YWxsX3NpdGVfcHkoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCisKKyAgICAgICAgaWYgc2VsZi5zaXRlcHlfaW5zdGFsbGVkOgorICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCisKKyAgICAgICAgc2l0ZXB5ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJzaXRlLnB5IikKKyAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQorICAgICAgICBjdXJyZW50ID0gIiIKKworICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaXRlcHkpOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgICAgIGN1cnJlbnQgPSBvcGVuKHNpdGVweSwncmInKS5yZWFkKCkKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKKyAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQorICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKKyAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyIsIHNpdGVweSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2l0ZXB5LCd3YicpCisgICAgICAgICAgICAgICAgZi53cml0ZShzb3VyY2UpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShbc2l0ZXB5XSkKKworICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCisKKworCisKKworCisKKworCisKKworCisgICAgSU5TVEFMTF9TQ0hFTUVTID0gZGljdCgKKyAgICAgICAgcG9zaXggPSBkaWN0KAorICAgICAgICAgICAgaW5zdGFsbF9kaXIgPSAnJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvYmluJywKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCisgICAgICAgIGluc3RhbGxfZGlyID0gJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvU2NyaXB0cycsCisgICAgKQorCisgICAgZGVmIF9leHBhbmQoc2VsZiwgKmF0dHJzKToKKyAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCisKKyAgICAgICAgaWYgc2VsZi5wcmVmaXg6CisgICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAorICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKKyAgICAgICAgICAgIGNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLnByZWZpeAorICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsc2VsZi5ERUZBVUxUX1NDSEVNRSkKKyAgICAgICAgICAgIGZvciBhdHRyLHZhbCBpbiBzY2hlbWUuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsYXR0cixOb25lKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsYXR0cix2YWwpCisKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3Vic3RfdmFycworICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgY29uZmlnX3ZhcnMpCisgICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQorCisKKworCisKKworCisKKworZGVmIGdldF9zaXRlX2RpcnMoKToKKyAgICAjIHJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKKyAgICBzaXRlZGlycyA9IGZpbHRlcihOb25lLG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywnJykuc3BsaXQob3MucGF0aHNlcCkpCisgICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KKyAgICBpZiBzeXMuZXhlY19wcmVmaXggIT0gc3lzLnByZWZpeDoKKyAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKKyAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgorICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6CisgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgorICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbb3MucGF0aC5qb2luKHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZCgKKyAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCwgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIildCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKKyAgICAgICAgICAgICAgICAjIGxvY2F0aW9ucy4gQ3VycmVudGx5IG9ubHkgcGVyLXVzZXIsIGJ1dCAvTGlicmFyeSBhbmQKKyAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCisgICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb24uZ2V0KCdIT01FJykKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaG9tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpKQorICAgIGZvciBwbGF0X3NwZWNpZmljIGluICgwLDEpOgorICAgICAgICBzaXRlX2xpYiA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWMpCisgICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczogc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQorCisgICAgc2l0ZWRpcnMgPSBtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKQorICAgIHJldHVybiBzaXRlZGlycworCisKK2RlZiBleHBhbmRfcGF0aHMoaW5wdXRzKToKKyAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKKworICAgIHNlZW4gPSB7fQorCisgICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgorICAgICAgICBkaXJuYW1lID0gbm9ybWFsaXplX3BhdGgoZGlybmFtZSkKKyAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgICAgIHlpZWxkIGRpcm5hbWUsIGZpbGVzCisKKyAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgorICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gKCdlYXN5LWluc3RhbGwucHRoJywnc2V0dXB0b29scy5wdGgnKToKKyAgICAgICAgICAgICAgICAjIElnbm9yZSAucHRoIGZpbGVzIHRoYXQgd2UgY29udHJvbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgUmVhZCB0aGUgLnB0aCBmaWxlCisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSxuYW1lKSkKKyAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCJpbXBvcnQiKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2xpbmVdID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUsIG9zLmxpc3RkaXIobGluZSkKKworCitkZWYgZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKToKKyAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCisKKyAgICBSZXR1cm5zIGEgQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlciwgb3IgTm9uZQorICAgICIiIgorICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsJ3JiJykKKyAgICB0cnk6CisgICAgICAgIGVuZHJlYyA9IHppcGZpbGUuX0VuZFJlY0RhdGEoZikKKyAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCisgICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0xMikKKworICAgICAgICBpbXBvcnQgc3RydWN0LCBTdHJpbmdJTywgQ29uZmlnUGFyc2VyCisgICAgICAgIHRhZywgY2ZnbGVuLCBibWxlbiA9IHN0cnVjdC51bnBhY2soIjxpaWkiLGYucmVhZCgxMikpCisgICAgICAgIGlmIHRhZyBub3QgaW4gKDB4MTIzNDU2N0EsIDB4MTIzNDU2N0IpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUgICAgICMgbm90IGEgdmFsaWQgdGFnCisKKyAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0oMTIrY2ZnbGVuK2JtbGVuKSkKKyAgICAgICAgY2ZnID0gQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlcih7J3ZlcnNpb24nOicnLCd0YXJnZXRfdmVyc2lvbic6Jyd9KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjZmcucmVhZGZwKFN0cmluZ0lPLlN0cmluZ0lPKGYucmVhZChjZmdsZW4pLnNwbGl0KGNocigwKSwxKVswXSkpCisgICAgICAgIGV4Y2VwdCBDb25maWdQYXJzZXIuRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gY2ZnCisKKyAgICBmaW5hbGx5OgorICAgICAgICBmLmNsb3NlKCkKKworCisKKworCisKKworCitkZWYgZ2V0X2V4ZV9wcmVmaXhlcyhleGVfZmlsZW5hbWUpOgorICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKKworICAgIHByZWZpeGVzID0gWworICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAorICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAorICAgICAgICAoJ1NDUklQVFMvJywgJ0VHRy1JTkZPL3NjcmlwdHMvJykKKyAgICBdCisgICAgeiA9IHppcGZpbGUuWmlwRmlsZShleGVfZmlsZW5hbWUpCisgICAgdHJ5OgorICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6CisgICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQorICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk9PTMgYW5kIHBhcnRzWzJdPT0nUEtHLUlORk8nOgorICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuaW5zZXJ0KDAsKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk8PjIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBwYXJ0c1swXSBpbiAoJ1BVUkVMSUInLCdQTEFUTElCJyk6CisgICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyh6LnJlYWQobmFtZSkpOgorICAgICAgICAgICAgICAgICAgICBwdGggPSBwdGguc3RyaXAoKS5yZXBsYWNlKCdcXCcsJy8nKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHRoLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0scHRoKSksICcnKSkKKyAgICBmaW5hbGx5OgorICAgICAgICB6LmNsb3NlKCkKKworICAgIHByZWZpeGVzLnNvcnQoKTsgcHJlZml4ZXMucmV2ZXJzZSgpCisgICAgcmV0dXJuIHByZWZpeGVzCisKKworZGVmIHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlIChzcGVjLCkKKyAgICAgICAgKQorCitjbGFzcyBQdGhEaXN0cmlidXRpb25zKEVudmlyb25tZW50KToKKyAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgorCisgICAgZGlydHkgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuYmFzZWRpciA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5fbG9hZCgpOyBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCBbXSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6CisgICAgICAgICAgICBtYXAoc2VsZi5hZGQsIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoLCBUcnVlKSkKKworICAgIGRlZiBfbG9hZChzZWxmKToKKyAgICAgICAgc2VsZi5wYXRocyA9IFtdCisgICAgICAgIHNhd19pbXBvcnQgPSBGYWxzZQorICAgICAgICBzZWVuID0ge30KKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBvcGVuKHNlbGYuZmlsZW5hbWUsJ3J0Jyk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKKyAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCisgICAgICAgICAgICAgICAgaWYgbm90IHBhdGguc3RyaXAoKSBvciBwYXRoLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAjIG1hbnVhbGx5LCBhbmQgZHVwbGljYXRlIHBhdGhzIGFzIHdlbGwKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpcixwYXRoKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3IgcGF0aCBpbiBzZWVuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAgICMgc2tpcCBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKKworICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKKyAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycworICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKKyAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkKKworICAgIGRlZiBzYXZlKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBjaGFuZ2VkIC5wdGggZmlsZSBiYWNrIHRvIGRpc2siIiIKKyAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkYXRhID0gJ1xuJy5qb2luKG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsc2VsZi5wYXRocykpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBsb2cuZGVidWcoIlNhdmluZyAlcyIsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgICAgICBkYXRhID0gKAorICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuX19wbGVuID0gbGVuKHN5cy5wYXRoKVxuIgorICAgICAgICAgICAgICAgICIlc1xuIgorICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBuZXc9c3lzLnBhdGhbc3lzLl9fcGxlbjpdOyIKKyAgICAgICAgICAgICAgICAiIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl07IgorICAgICAgICAgICAgICAgICIgcD1nZXRhdHRyKHN5cywnX19lZ2dpbnNlcnQnLDApOyBzeXMucGF0aFtwOnBdPW5ldzsiCisgICAgICAgICAgICAgICAgIiBzeXMuX19lZ2dpbnNlcnQgPSBwK2xlbihuZXcpXG4iCisgICAgICAgICAgICApICUgZGF0YQorCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSk7IGYuY2xvc2UoKQorCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQorCisgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQorCisgICAgZGVmIGFkZChzZWxmLGRpc3QpOgorICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCisgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHM6CisgICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChkaXN0LmxvY2F0aW9uKTsgc2VsZi5kaXJ0eSA9IFRydWUKKyAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsZGlzdCkKKworICAgIGRlZiByZW1vdmUoc2VsZixkaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCisgICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKKyAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pOyBzZWxmLmRpcnR5ID0gVHJ1ZQorICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZixkaXN0KQorCisKKyAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLHBhdGgpOgorICAgICAgICBpZiBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUocGF0aCkpPT1zZWxmLmJhc2VkaXI6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgICAgICByZXR1cm4gcGF0aAorCisKK2RlZiBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1zeXNfZXhlY3V0YWJsZSk6CisgICAgIiIiQ3JlYXRlIGEgIyEgbGluZSwgZ2V0dGluZyBvcHRpb25zIChpZiBhbnkpIGZyb20gc2NyaXB0X3RleHQiIiIKKyAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKKyAgICBmaXJzdCwgcmVzdCA9IChzY3JpcHRfdGV4dCsnXG4nKS5zcGxpdCgnXG4nLDEpCisgICAgbWF0Y2ggPSBmaXJzdF9saW5lX3JlLm1hdGNoKGZpcnN0KQorICAgIG9wdGlvbnMgPSAnJworICAgIGlmIG1hdGNoOgorICAgICAgICBzY3JpcHRfdGV4dCA9IHJlc3QKKyAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnCisgICAgICAgIGlmIG9wdGlvbnM6CisgICAgICAgICAgICBvcHRpb25zID0gJyAnK29wdGlvbnMKKyAgICByZXR1cm4gIiMhJShleGVjdXRhYmxlKXMlKG9wdGlvbnMpc1xuIiAlIGxvY2FscygpCisKKworZGVmIGF1dG9fY2htb2QoZnVuYywgYXJnLCBleGMpOgorICAgIGlmIGZ1bmMgaXMgb3MucmVtb3ZlIGFuZCBvcy5uYW1lPT0nbnQnOgorICAgICAgICBvcy5jaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCisgICAgICAgIHJldHVybiBmdW5jKGFyZykKKyAgICBleGMgPSBzeXMuZXhjX2luZm8oKQorICAgIHJhaXNlIGV4Y1swXSwgKGV4Y1sxXVswXSwgZXhjWzFdWzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsYXJnKSkpCisKKworZGVmIHVuY2FjaGVfemlwZGlyKHBhdGgpOgorICAgICIiIkVuc3VyZSB0aGF0IHRoZSB6aXAgZGlyZWN0b3J5IGNhY2hlIGRvZXNuJ3QgaGF2ZSBzdGFsZSBpbmZvIGZvciBwYXRoIiIiCisgICAgZnJvbSB6aXBpbXBvcnQgaW1wb3J0IF96aXBfZGlyZWN0b3J5X2NhY2hlIGFzIHpkYworICAgIGlmIHBhdGggaW4gemRjOgorICAgICAgICBkZWwgemRjW3BhdGhdCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKHBhdGgpCisgICAgICAgIGZvciBwIGluIHpkYzoKKyAgICAgICAgICAgIGlmIG5vcm1hbGl6ZV9wYXRoKHApPT1wYXRoOgorICAgICAgICAgICAgICAgIGRlbCB6ZGNbcF0KKyAgICAgICAgICAgICAgICByZXR1cm4KKworCitkZWYgZ2V0X3NjcmlwdF9hcmdzKGRpc3QsIGV4ZWN1dGFibGU9c3lzX2V4ZWN1dGFibGUpOgorICAgICIiIllpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncyBlbnRyeXBvaW50cyIiIgorICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQorICAgIGhlYWRlciA9IGdldF9zY3JpcHRfaGVhZGVyKCIiLCBleGVjdXRhYmxlKQorICAgIGZvciBncm91cCBpbiAnY29uc29sZV9zY3JpcHRzJywgJ2d1aV9zY3JpcHRzJzoKKyAgICAgICAgZm9yIG5hbWUsZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgorICAgICAgICAgICAgc2NyaXB0X3RleHQgPSAoCisgICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLUVOVFJZLVNDUklQVDogJShzcGVjKXIsJShncm91cClyLCUobmFtZSlyXG4iCisgICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCisgICAgICAgICAgICAgICAgImltcG9ydCBzeXNcbiIKKyAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBsb2FkX2VudHJ5X3BvaW50XG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICJzeXMuZXhpdChcbiIKKyAgICAgICAgICAgICAgICAiICAgbG9hZF9lbnRyeV9wb2ludCglKHNwZWMpciwgJShncm91cClyLCAlKG5hbWUpcikoKVxuIgorICAgICAgICAgICAgICAgICIpXG4iCisgICAgICAgICAgICApICUgbG9jYWxzKCkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybT09J3dpbjMyJzoKKyAgICAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24gYW5kIGFuIC5leGUgbGF1bmNoZXIKKyAgICAgICAgICAgICAgICBpZiBncm91cD09J2d1aV9zY3JpcHRzJzoKKyAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5dycsICdndWkuZXhlJworICAgICAgICAgICAgICAgICAgICBvbGQgPSBbJy5weXcnXQorICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9uLmV4ZScsJ3B5dGhvbncuZXhlJyxoZWFkZXIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5JywgJ2NsaS5leGUnCisgICAgICAgICAgICAgICAgICAgIG9sZCA9IFsnLnB5JywnLnB5YycsJy5weW8nXQorICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9udy5leGUnLCdweXRob253LmV4ZScsaGVhZGVyKQorCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2hlYWRlclsyOi0xXSk6CisgICAgICAgICAgICAgICAgICAgIGhkciA9IG5ld19oZWFkZXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoZHIgPSBoZWFkZXIKKyAgICAgICAgICAgICAgICB5aWVsZCAobmFtZStleHQsIGhkcitzY3JpcHRfdGV4dCwgJ3QnLCBbbmFtZSt4IGZvciB4IGluIG9sZF0pCisgICAgICAgICAgICAgICAgeWllbGQgKAorICAgICAgICAgICAgICAgICAgICBuYW1lKycuZXhlJywgcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXIpLAorICAgICAgICAgICAgICAgICAgICAnYicgIyB3cml0ZSBpbiBiaW5hcnkgbW9kZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBPbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGFzc3VtZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMgdG8KKyAgICAgICAgICAgICAgICAjIGp1c3Qgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCisgICAgICAgICAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlcitzY3JpcHRfdGV4dCkKKworZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPWF1dG9fY2htb2QpOgorICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgorCisgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFB5dGhvbiAyLjQgdmVyc2lvbiBvZiAnc2h1dGlsJywgYmVjYXVzZQorICAgIHRoZSAyLjMgdmVyc2lvbiBkb2Vzbid0IHJlYWxseSB3b3JrIHJpZ2h0LgorICAgICIiIgorICAgIGlmIGlnbm9yZV9lcnJvcnM6CisgICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbGlmIG9uZXJyb3IgaXMgTm9uZToKKyAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgorICAgICAgICAgICAgcmFpc2UKKyAgICBuYW1lcyA9IFtdCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kZSA9IG9zLmxzdGF0KGZ1bGxuYW1lKS5zdF9tb2RlCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIG1vZGUgPSAwCisgICAgICAgIGlmIHN0YXQuU19JU0RJUihtb2RlKToKKyAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIG9uZXJyb3Iob3Mucm1kaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQorCisKKworCisKKworCitkZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgorICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKKyAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCisgICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCisKKyAgICBVU0FHRSA9ICIiIlwKK3VzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCisgICBvcjogJShzY3JpcHQpcyAtLWhlbHAKKyIiIgorCisgICAgZGVmIGdlbl91c2FnZSAoc2NyaXB0X25hbWUpOgorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKQorICAgICAgICByZXR1cm4gVVNBR0UgJSB2YXJzKCkKKworICAgIGRlZiB3aXRoX2VpX3VzYWdlKGYpOgorICAgICAgICBvbGRfZ2VuX3VzYWdlID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQorICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gb2xkX2dlbl91c2FnZQorCisgICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgorICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgd2l0aF9laV91c2FnZShsYW1iZGE6IERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsKmFyZ3MsKiprdykpCisKKyAgICBpZiBhcmd2IGlzIE5vbmU6CisgICAgICAgIGFyZ3YgPSBzeXMuYXJndlsxOl0KKworICAgIHdpdGhfZWlfdXNhZ2UobGFtYmRhOgorICAgICAgICBzZXR1cCgKKyAgICAgICAgICAgIHNjcmlwdF9hcmdzID0gWyctcScsJ2Vhc3lfaW5zdGFsbCcsICctdiddK2FyZ3YsCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAorICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsICoqa3cKKyAgICAgICAgKQorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2OGZiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5CkBAIC0wLDAgKzEsMzY1IEBACisiIiJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm8KKworQ3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSBhbmQgY29udGVudHMiIiIKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMworaW1wb3J0IG9zLCByZQorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgcGFyc2VfcmVxdWlyZW1lbnRzLCBzYWZlX25hbWUsIHBhcnNlX3ZlcnNpb24sIFwKKyAgICBzYWZlX3ZlcnNpb24sIHlpZWxkX2xpbmVzLCBFbnRyeVBvaW50LCBpdGVyX2VudHJ5X3BvaW50cywgdG9fZmlsZW5hbWUKK2Zyb20gc2Rpc3QgaW1wb3J0IHdhbGtfcmV2Y3RybAorCitjbGFzcyBlZ2dfaW5mbyhDb21tYW5kKToKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCisgICAgICAgICgndGFnLXN2bi1yZXZpc2lvbicsICdyJywKKyAgICAgICAgICAgICJBZGQgc3VidmVyc2lvbiByZXZpc2lvbiBJRCB0byB2ZXJzaW9uIG51bWJlciIpLAorICAgICAgICAoJ3RhZy1kYXRlJywgJ2QnLCAiQWRkIGRhdGUgc3RhbXAgKGUuZy4gMjAwNTA1MjgpIHRvIHZlcnNpb24gbnVtYmVyIiksCisgICAgICAgICgndGFnLWJ1aWxkPScsICdiJywgIlNwZWNpZnkgZXhwbGljaXQgdGFnIHRvIGFkZCB0byB2ZXJzaW9uIG51bWJlciIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndGFnLWRhdGUnLCd0YWctc3ZuLXJldmlzaW9uJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmVnZ19uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLmVnZ19iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmVnZ19pbmZvID0gTm9uZQorICAgICAgICBzZWxmLnRhZ19idWlsZCA9IE5vbmUKKyAgICAgICAgc2VsZi50YWdfc3ZuX3JldmlzaW9uID0gMAorICAgICAgICBzZWxmLnRhZ19kYXRlID0gMAorICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IEZhbHNlCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuZWdnX25hbWUgPSBzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkKKyAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IHNlbGYudGFnZ2VkX3ZlcnNpb24oKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3QoCisgICAgICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKCclcz09JXMnICUgKHNlbGYuZWdnX25hbWUsc2VsZi5lZ2dfdmVyc2lvbikpCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIkludmFsaWQgZGlzdHJpYnV0aW9uIG5hbWUgb3IgdmVyc2lvbiBzeW50YXg6ICVzLSVzIiAlCisgICAgICAgICAgICAgICAgKHNlbGYuZWdnX25hbWUsc2VsZi5lZ2dfdmVyc2lvbikKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlIGlzIE5vbmU6CisgICAgICAgICAgICBkaXJzID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIKKyAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSAoZGlycyBvciB7fSkuZ2V0KCcnLG9zLmN1cmRpcikKKworICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCdlZ2dfYmFzZScpCisgICAgICAgIHNlbGYuZWdnX2luZm8gPSB0b19maWxlbmFtZShzZWxmLmVnZ19uYW1lKSsnLmVnZy1pbmZvJworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKKyAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgc2VsZi5lZ2dfaW5mbykKKyAgICAgICAgaWYgJy0nIGluIHNlbGYuZWdnX25hbWU6IHNlbGYuY2hlY2tfYnJva2VuX2VnZ19pbmZvKCkKKworICAgICAgICAjIFNldCBwYWNrYWdlIHZlcnNpb24gZm9yIHRoZSBiZW5lZml0IG9mIGR1bWJlciBjb21tYW5kcworICAgICAgICAjIChlLmcuIHNkaXN0LCBiZGlzdF93aW5pbnN0LCBldGMuKQorICAgICAgICAjCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLnZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCisKKyAgICAgICAgIyBJZiB3ZSBib290c3RyYXBwZWQgYXJvdW5kIHRoZSBsYWNrIG9mIGEgUEtHLUlORk8sIGFzIG1pZ2h0IGJlIHRoZQorICAgICAgICAjIGNhc2UgaW4gYSBmcmVzaCBjaGVja291dCwgbWFrZSBzdXJlIHRoYXQgYW55IHNwZWNpYWwgdGFncyBnZXQgYWRkZWQKKyAgICAgICAgIyB0byB0aGUgdmVyc2lvbiBpbmZvCisgICAgICAgICMKKyAgICAgICAgcGQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0CisgICAgICAgIGlmIHBkIGlzIG5vdCBOb25lIGFuZCBwZC5rZXk9PXNlbGYuZWdnX25hbWUubG93ZXIoKToKKyAgICAgICAgICAgIHBkLl92ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgorICAgICAgICAgICAgcGQuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdCA9IE5vbmUKKworCisKKyAgICBkZWYgd3JpdGVfb3JfZGVsZXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgb3IgZGVsZXRlIGlmIGVtcHR5CisKKyAgICAgICAgSWYgYGRhdGFgIGlzIG5vbi1lbXB0eSwgdGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGBgd3JpdGVfZmlsZSgpYGAuCisgICAgICAgIElmIGBkYXRhYCBpcyBlbXB0eSBidXQgbm90IGBgTm9uZWBgLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKKyAgICAgICAgYGBkZWxldGVfZmlsZShmaWxlbmFtZSlgLiAgSWYgYGRhdGFgIGlzIGBgTm9uZWBgLCB0aGVuIHRoaXMgaXMgYSBuby1vcAorICAgICAgICB1bmxlc3MgYGZpbGVuYW1lYCBleGlzdHMsIGluIHdoaWNoIGNhc2UgYSB3YXJuaW5nIGlzIGlzc3VlZCBhYm91dCB0aGUKKyAgICAgICAgb3JwaGFuZWQgZmlsZSAoaWYgYGZvcmNlYCBpcyBmYWxzZSksIG9yIGRlbGV0ZWQgKGlmIGBmb3JjZWAgaXMgdHJ1ZSkuCisgICAgICAgICIiIgorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKHdoYXQsIGZpbGVuYW1lLCBkYXRhKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZSBhbmQgbm90IGZvcmNlOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICAgICAiJXMgbm90IHNldCBpbiBzZXR1cCgpLCBidXQgJXMgZXhpc3RzIiwgd2hhdCwgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUoZmlsZW5hbWUpCisKKyAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSk6CisgICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0CisKKyAgICAgICAgYHdoYXRgIGlzIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSB0byBpZGVudGlmeSB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4KKyAgICAgICAgdG8gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyB0byAlcyIsIHdoYXQsIGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3YicpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBkZWxldGVfZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0IiIiCisgICAgICAgIGxvZy5pbmZvKCJkZWxldGluZyAlcyIsIGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisKKworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5lZ2dfaW5mbykKKyAgICAgICAgaW5zdGFsbGVyID0gc2VsZi5kaXN0cmlidXRpb24uZmV0Y2hfYnVpbGRfZWdnCisgICAgICAgIGZvciBlcCBpbiBpdGVyX2VudHJ5X3BvaW50cygnZWdnX2luZm8ud3JpdGVycycpOgorICAgICAgICAgICAgd3JpdGVyID0gZXAubG9hZChpbnN0YWxsZXI9aW5zdGFsbGVyKQorICAgICAgICAgICAgd3JpdGVyKHNlbGYsIGVwLm5hbWUsIG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLGVwLm5hbWUpKQorICAgICAgICBzZWxmLmZpbmRfc291cmNlcygpCisKKyAgICBkZWYgdGFnZ2VkX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCisgICAgICAgIGlmIHNlbGYudGFnX2J1aWxkOgorICAgICAgICAgICAgdmVyc2lvbis9c2VsZi50YWdfYnVpbGQKKyAgICAgICAgaWYgc2VsZi50YWdfc3ZuX3JldmlzaW9uIGFuZCAoCisgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cygnLnN2bicpIG9yIG9zLnBhdGguZXhpc3RzKCdQS0ctSU5GTycpCisgICAgICAgICk6ICB2ZXJzaW9uICs9ICctciVzJyAlIHNlbGYuZ2V0X3N2bl9yZXZpc2lvbigpCisgICAgICAgIGlmIHNlbGYudGFnX2RhdGU6CisgICAgICAgICAgICBpbXBvcnQgdGltZTsgdmVyc2lvbiArPSB0aW1lLnN0cmZ0aW1lKCItJVklbSVkIikKKyAgICAgICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKQorCisgICAgZGVmIGdldF9zdm5fcmV2aXNpb24oc2VsZik6CisgICAgICAgIHJldmlzaW9uID0gMAorICAgICAgICB1cmxyZSA9IHJlLmNvbXBpbGUoJ3VybD0iKFteIl0rKSInKQorICAgICAgICByZXZyZSA9IHJlLmNvbXBpbGUoJ2NvbW1pdHRlZC1yZXY9IihcZCspIicpCisgICAgICAgIGZvciBiYXNlLGRpcnMsZmlsZXMgaW4gb3Mud2Fsayhvcy5jdXJkaXIpOgorICAgICAgICAgICAgaWYgJy5zdm4nIG5vdCBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm8gc2Vuc2Ugd2Fsa2luZyB1bmNvbnRyb2xsZWQgc3ViZGlycworICAgICAgICAgICAgZGlycy5yZW1vdmUoJy5zdm4nKQorICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGJhc2UsJy5zdm4nLCdlbnRyaWVzJykpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZGlydXJsID0gdXJscmUuc2VhcmNoKGRhdGEpLmdyb3VwKDEpICAgICMgZ2V0IHJlcG9zaXRvcnkgVVJMCisgICAgICAgICAgICBpZiBiYXNlPT1vcy5jdXJkaXI6CisgICAgICAgICAgICAgICAgYmFzZV91cmwgPSBkaXJ1cmwrJy8nICAgIyBzYXZlIHRoZSByb290IHVybAorICAgICAgICAgICAgZWxpZiBub3QgZGlydXJsLnN0YXJ0c3dpdGgoYmFzZV91cmwpOgorICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm90IHBhcnQgb2YgdGhlIHNhbWUgc3ZuIHRyZWUsIHNraXAgaXQKKyAgICAgICAgICAgIGZvciBtYXRjaCBpbiByZXZyZS5maW5kaXRlcihkYXRhKToKKyAgICAgICAgICAgICAgICByZXZpc2lvbiA9IG1heChyZXZpc2lvbiwgaW50KG1hdGNoLmdyb3VwKDEpKSkKKyAgICAgICAgcmV0dXJuIHN0cihyZXZpc2lvbiBvciBnZXRfcGtnX2luZm9fcmV2aXNpb24oKSkKKworICAgIGRlZiBmaW5kX3NvdXJjZXMoc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIFNPVVJDRVMudHh0IG1hbmlmZXN0IGZpbGUiIiIKKyAgICAgICAgbWFuaWZlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywiU09VUkNFUy50eHQiKQorICAgICAgICBtbSA9IG1hbmlmZXN0X21ha2VyKHNlbGYuZGlzdHJpYnV0aW9uKQorICAgICAgICBtbS5tYW5pZmVzdCA9IG1hbmlmZXN0X2ZpbGVuYW1lCisgICAgICAgIG1tLnJ1bigpCisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBtbS5maWxlbGlzdAorCisgICAgZGVmIGNoZWNrX2Jyb2tlbl9lZ2dfaW5mbyhzZWxmKToKKyAgICAgICAgYmVpID0gc2VsZi5lZ2dfbmFtZSsnLmVnZy1pbmZvJworICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKKyAgICAgICAgICAgIGJlaSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBiZWkpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGJlaSk6CisgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAiLSIqNzgrJ1xuJworICAgICAgICAgICAgICAgICJOb3RlOiBZb3VyIGN1cnJlbnQgLmVnZy1pbmZvIGRpcmVjdG9yeSBoYXMgYSAnLScgaW4gaXRzIG5hbWU7IgorICAgICAgICAgICAgICAgICdcbnRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCAic2V0dXAucHkgZGV2ZWxvcCIuXG5cbicKKyAgICAgICAgICAgICAgICAnUGxlYXNlIHJlbmFtZSAlcyB0byAlcyB0byBjb3JyZWN0IHRoaXMgcHJvYmxlbS5cbicrJy0nKjc4LAorICAgICAgICAgICAgICAgIGJlaSwgc2VsZi5lZ2dfaW5mbworICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvCisgICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gYmVpICAgICAjIG1ha2UgaXQgd29yayBmb3Igbm93CisKK2NsYXNzIEZpbGVMaXN0KEZpbGVMaXN0KToKKyAgICAiIiJGaWxlIGxpc3QgdGhhdCBhY2NlcHRzIG9ubHkgZXhpc3RpbmcsIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGhzIiIiCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICBwYXRoID0gY29udmVydF9wYXRoKGl0ZW0pCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQocGF0aCkKKworCisKKworCisKKworCisKKworCitjbGFzcyBtYW5pZmVzdF9tYWtlcihzZGlzdCk6CisKKyAgICB0ZW1wbGF0ZSA9ICJNQU5JRkVTVC5pbiIKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnVzZV9kZWZhdWx0cyA9IDEKKyAgICAgICAgc2VsZi5wcnVuZSA9IDEKKyAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMQorICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKSAgICMgaXQgbXVzdCBleGlzdCBzbyBpdCdsbCBnZXQgaW4gdGhlIGxpc3QKKyAgICAgICAgc2VsZi5maWxlbGlzdC5maW5kYWxsKCkKKyAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRlbXBsYXRlKToKKyAgICAgICAgICAgIHNlbGYucmVhZF90ZW1wbGF0ZSgpCisgICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCisgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQorCisgICAgZGVmIHdyaXRlX21hbmlmZXN0IChzZWxmKToKKyAgICAgICAgIiIiV3JpdGUgdGhlIGZpbGUgbGlzdCBpbiAnc2VsZi5maWxlbGlzdCcgKHByZXN1bWFibHkgYXMgZmlsbGVkIGluCisgICAgICAgIGJ5ICdhZGRfZGVmYXVsdHMoKScgYW5kICdyZWFkX3RlbXBsYXRlKCknKSB0byB0aGUgbWFuaWZlc3QgZmlsZQorICAgICAgICBuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcuCisgICAgICAgICIiIgorICAgICAgICBmaWxlcyA9IHNlbGYuZmlsZWxpc3QuZmlsZXMKKyAgICAgICAgaWYgb3Muc2VwIT0nLyc6CisgICAgICAgICAgICBmaWxlcyA9IFtmLnJlcGxhY2Uob3Muc2VwLCcvJykgZm9yIGYgaW4gZmlsZXNdCisgICAgICAgIHNlbGYuZXhlY3V0ZShmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGZpbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0KQorCisKKworCisKKyAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZGlzdC5hZGRfZGVmYXVsdHMoc2VsZikKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi50ZW1wbGF0ZSkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi5tYW5pZmVzdCkKKyAgICAgICAgcmNmaWxlcyA9IGxpc3Qod2Fsa19yZXZjdHJsKCkpCisgICAgICAgIGlmIHJjZmlsZXM6CisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChyY2ZpbGVzKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgorICAgICAgICAgICAgc2VsZi5yZWFkX21hbmlmZXN0KCkKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKKyAgICAgICAgc2VsZi5maWxlbGlzdC5pbmNsdWRlX3BhdHRlcm4oIioiLCBwcmVmaXg9ZWlfY21kLmVnZ19pbmZvKQorCisgICAgZGVmIHBydW5lX2ZpbGVfbGlzdCAoc2VsZik6CisgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9YnVpbGQuYnVpbGRfYmFzZSkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWJhc2VfZGlyKQorICAgICAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihzZXArcicoUkNTfENWU3xcLnN2biknK3NlcCwgaXNfcmVnZXg9MSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIHdyaXRlX3BrZ19pbmZvKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBsb2cuaW5mbygid3JpdGluZyAlcyIsIGZpbGVuYW1lKQorICAgIGlmIG5vdCBjbWQuZHJ5X3J1bjoKKyAgICAgICAgbWV0YWRhdGEgPSBjbWQuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCisgICAgICAgIG1ldGFkYXRhLnZlcnNpb24sIG9sZHZlciA9IGNtZC5lZ2dfdmVyc2lvbiwgbWV0YWRhdGEudmVyc2lvbgorICAgICAgICBtZXRhZGF0YS5uYW1lLCBvbGRuYW1lICAgPSBjbWQuZWdnX25hbWUsIG1ldGFkYXRhLm5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB3cml0ZSB1bmVzY2FwZWQgZGF0YSB0byBQS0ctSU5GTywgc28gb2xkZXIgcGtnX3Jlc291cmNlcworICAgICAgICAgICAgIyBjYW4gc3RpbGwgcGFyc2UgaXQKKyAgICAgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGNtZC5lZ2dfaW5mbykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLnZlcnNpb24gPSBvbGRuYW1lLCBvbGR2ZXIKKworICAgICAgICBzYWZlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCd6aXBfc2FmZScsTm9uZSkKKyAgICAgICAgaW1wb3J0IGJkaXN0X2VnZzsgYmRpc3RfZWdnLndyaXRlX3NhZmV0eV9mbGFnKGNtZC5lZ2dfaW5mbywgc2FmZSkKKworZGVmIHdhcm5fZGVwZW5kc19vYnNvbGV0ZShjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CisgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICJXQVJOSU5HOiAnZGVwZW5kcy50eHQnIGlzIG5vdCB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgorICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCisgICAgICAgICkKKworCitkZWYgd3JpdGVfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBkaXN0ID0gY21kLmRpc3RyaWJ1dGlvbgorICAgIGRhdGEgPSBbJ1xuJy5qb2luKHlpZWxkX2xpbmVzKGRpc3QuaW5zdGFsbF9yZXF1aXJlcyBvciAoKSkpXQorICAgIGZvciBleHRyYSxyZXFzIGluIChkaXN0LmV4dHJhc19yZXF1aXJlIG9yIHt9KS5pdGVtcygpOgorICAgICAgICBkYXRhLmFwcGVuZCgnXG5cblslc11cbiVzJyAlIChleHRyYSwgJ1xuJy5qb2luKHlpZWxkX2xpbmVzKHJlcXMpKSkpCisgICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJyZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgJycuam9pbihkYXRhKSkKKworZGVmIHdyaXRlX3RvcGxldmVsX25hbWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBwa2dzID0gZGljdC5mcm9ta2V5cygKKyAgICAgICAgW2suc3BsaXQoJy4nLDEpWzBdCisgICAgICAgICAgICBmb3IgayBpbiBjbWQuZGlzdHJpYnV0aW9uLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCkKKyAgICAgICAgXQorICAgICkKKyAgICBjbWQud3JpdGVfZmlsZSgidG9wLWxldmVsIG5hbWVzIiwgZmlsZW5hbWUsICdcbicuam9pbihwa2dzKSsnXG4nKQorCisKKworZGVmIG92ZXJ3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgorICAgIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgVHJ1ZSkKKworZGVmIHdyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSwgZm9yY2U9RmFsc2UpOgorICAgIGFyZ25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQorICAgIHZhbHVlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCBhcmduYW1lLCBOb25lKQorICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICB2YWx1ZSA9ICdcbicuam9pbih2YWx1ZSkrJ1xuJworICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZShhcmduYW1lLCBmaWxlbmFtZSwgdmFsdWUsIGZvcmNlKQorCitkZWYgd3JpdGVfZW50cmllcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CisgICAgZXAgPSBjbWQuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cworCisgICAgaWYgaXNpbnN0YW5jZShlcCxiYXNlc3RyaW5nKSBvciBlcCBpcyBOb25lOgorICAgICAgICBkYXRhID0gZXAKKyAgICBlbGlmIGVwIGlzIG5vdCBOb25lOgorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgZm9yIHNlY3Rpb24sIGNvbnRlbnRzIGluIGVwLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50cyxiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IEVudHJ5UG9pbnQucGFyc2VfZ3JvdXAoc2VjdGlvbiwgY29udGVudHMpCisgICAgICAgICAgICAgICAgY29udGVudHMgPSAnXG4nLmpvaW4obWFwKHN0cixjb250ZW50cy52YWx1ZXMoKSkpCisgICAgICAgICAgICBkYXRhLmFwcGVuZCgnWyVzXVxuJXNcblxuJyAlIChzZWN0aW9uLGNvbnRlbnRzKSkKKyAgICAgICAgZGF0YSA9ICcnLmpvaW4oZGF0YSkKKworICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgnZW50cnkgcG9pbnRzJywgZmlsZW5hbWUsIGRhdGEsIFRydWUpCisKK2RlZiBnZXRfcGtnX2luZm9fcmV2aXNpb24oKToKKyAgICAjIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgLXIjIyMgb2ZmIG9mIFBLRy1JTkZPLCBpbiBjYXNlIHRoaXMgaXMgYW4gc2Rpc3Qgb2YKKyAgICAjIGEgc3VidmVyc2lvbiByZXZpc2lvbgorICAgICMKKyAgICBpZiBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKToKKyAgICAgICAgZiA9IG9wZW4oJ1BLRy1JTkZPJywnclUnKQorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyIlZlcnNpb246LiotcihcZCspXHMqJCIsIGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiOWFmNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMCwwICsxLDEwMSBAQAoraW1wb3J0IHNldHVwdG9vbHMsIHN5cworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsIGFzIF9pbnN0YWxsCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yCisKK2NsYXNzIGluc3RhbGwoX2luc3RhbGwpOgorICAgICIiIlVzZSBlYXN5X2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdy9kZXBlbmRlbmNpZXMiIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IF9pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKKyAgICAgICAgKCdvbGQtYW5kLXVubWFuYWdlYWJsZScsIE5vbmUsICJUcnkgbm90IHRvIHVzZSB0aGlzISIpLAorICAgICAgICAoJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsIE5vbmUsCisgICAgICAgICAgICAidXNlZCBieSBzeXN0ZW0gcGFja2FnZSBidWlsZGVycyB0byBjcmVhdGUgJ2ZsYXQnIGVnZ3MiKSwKKyAgICBdCisgICAgYm9vbGVhbl9vcHRpb25zID0gX2luc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWworICAgICAgICAnb2xkLWFuZC11bm1hbmFnZWFibGUnLCAnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywKKyAgICBdCisgICAgbmV3X2NvbW1hbmRzID0gWworICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjogVHJ1ZSksCisgICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgIGxhbWJkYSBzZWxmOiBUcnVlKSwKKyAgICBdCisgICAgX25jID0gZGljdChuZXdfY29tbWFuZHMpCisgICAgc3ViX2NvbW1hbmRzID0gWworICAgICAgICBjbWQgZm9yIGNtZCBpbiBfaW5zdGFsbC5zdWJfY29tbWFuZHMgaWYgY21kWzBdIG5vdCBpbiBfbmMKKyAgICBdICsgbmV3X2NvbW1hbmRzCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBOb25lCisgICAgICAgIHNlbGYubm9fY29tcGlsZSA9IE5vbmUgICMgbWFrZSBESVNUVVRJTFNfREVCVUcgd29yayByaWdodCEKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIGlmIHNlbGYucm9vdDoKKyAgICAgICAgICAgIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkID0gVHJ1ZQorICAgICAgICBlbGlmIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucm9vdCBhbmQgbm90IHNlbGYucmVjb3JkOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSAtLXJlY29yZCBvciAtLXJvb3Qgd2hlbiBidWlsZGluZyBzeXN0ZW0iCisgICAgICAgICAgICAgICAgICAgICIgcGFja2FnZXMiCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgorICAgICAgICAjIFdlIGFsd2F5cyBpZ25vcmUgZXh0cmFfcGF0aCwgYmVjYXVzZSB3ZSBpbnN0YWxsIGFzIC5lZ2cgb3IgLmVnZy1pbmZvCisgICAgICAgIHNlbGYucGF0aF9maWxlID0gTm9uZQorICAgICAgICBzZWxmLmV4dHJhX2RpcnMgPSAnJworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBFeHBsaWNpdCByZXF1ZXN0IGZvciBvbGQtc3R5bGUgaW5zdGFsbD8gIEp1c3QgZG8gaXQKKyAgICAgICAgaWYgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKKyAgICAgICAgICAgIHJldHVybiBfaW5zdGFsbC5ydW4oc2VsZikKKworICAgICAgICAjIEF0dGVtcHQgdG8gZGV0ZWN0IHdoZXRoZXIgd2Ugd2VyZSBjYWxsZWQgZnJvbSBzZXR1cCgpIG9yIGJ5IGFub3RoZXIKKyAgICAgICAgIyBjb21tYW5kLiAgSWYgd2Ugd2VyZSBjYWxsZWQgYnkgc2V0dXAoKSwgb3VyIGNhbGxlciB3aWxsIGJlIHRoZQorICAgICAgICAjICdydW5fY29tbWFuZCcgbWV0aG9kIGluICdkaXN0dXRpbHMuZGlzdCcsIGFuZCAqaXRzKiBjYWxsZXIgd2lsbCBiZQorICAgICAgICAjIHRoZSAncnVuX2NvbW1hbmRzJyBtZXRob2QuICBJZiB3ZSB3ZXJlIGNhbGxlZCBhbnkgb3RoZXIgd2F5LCBvdXIKKyAgICAgICAgIyBpbW1lZGlhdGUgY2FsbGVyICptaWdodCogYmUgJ3J1bl9jb21tYW5kJywgYnV0IGl0IHdvbid0IGhhdmUgYmVlbgorICAgICAgICAjIGNhbGxlZCBieSAncnVuX2NvbW1hbmRzJy4gIFRoaXMgaXMgc2xpZ2h0bHkga2x1ZGd5LCBidXQgc2VlbXMgdG8KKyAgICAgICAgIyB3b3JrLgorICAgICAgICAjCisgICAgICAgIGNhbGxlciA9IHN5cy5fZ2V0ZnJhbWUoMikKKyAgICAgICAgY2FsbGVyX21vZHVsZSA9IGNhbGxlci5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsJycpCisgICAgICAgIGNhbGxlcl9uYW1lID0gY2FsbGVyLmZfY29kZS5jb19uYW1lCisKKyAgICAgICAgaWYgY2FsbGVyX21vZHVsZSAhPSAnZGlzdHV0aWxzLmRpc3QnIG9yIGNhbGxlcl9uYW1lIT0ncnVuX2NvbW1hbmRzJzoKKyAgICAgICAgICAgICMgV2Ugd2VyZW4ndCBjYWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHNldHVwKCksIHNvIHdlCisgICAgICAgICAgICAjIHNob3VsZCBydW4gaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSBtb2RlIHRvIHN1cHBvcnQgYmRpc3RfKgorICAgICAgICAgICAgIyBjb21tYW5kcy4KKyAgICAgICAgICAgIF9pbnN0YWxsLnJ1bihzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb19lZ2dfaW5zdGFsbCgpCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIGRvX2VnZ19pbnN0YWxsKHNlbGYpOgorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCisKKyAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24sIGFyZ3M9IngiLCByb290PXNlbGYucm9vdCwgcmVjb3JkPXNlbGYucmVjb3JkLAorICAgICAgICApCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkgICMgZmluYWxpemUgYmVmb3JlIGJkaXN0X2VnZyBtdW5nZXMgaW5zdGFsbCBjbWQKKworICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdiZGlzdF9lZ2cnKQorICAgICAgICBhcmdzID0gW3NlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3RfZWdnJykuZWdnX291dHB1dF0KKworICAgICAgICBpZiBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb206CisgICAgICAgICAgICAjIEJvb3RzdHJhcCBzZWxmLWluc3RhbGxhdGlvbiBvZiBzZXR1cHRvb2xzCisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCisKKyAgICAgICAgY21kLmFyZ3MgPSBhcmdzCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTkzZTkxYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpAQCAtMCwwICsxLDgxIEBACitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAoraW1wb3J0IG9zLCBzaHV0aWwsIHBrZ19yZXNvdXJjZXMKKworY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhDb21tYW5kKToKKyAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCisgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCgnaW5zdGFsbF9kaXInLCdpbnN0YWxsX2RpcicpKQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KKyAgICAgICAgKS5lZ2dfbmFtZSgpKycuZWdnLWluZm8nCisgICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCisgICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQorICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIHRhcmdldCA9IHNlbGYudGFyZ2V0CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgorICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssKHNlbGYudGFyZ2V0LCksIlJlbW92aW5nICIrc2VsZi50YXJnZXQpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCisgICAgICAgIHNlbGYuZXhlY3V0ZShzZWxmLmNvcHl0cmVlLCAoKSwKKyAgICAgICAgICAgICJDb3B5aW5nICVzIHRvICVzIiAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCisKKyAgICBkZWYgY29weXRyZWUoc2VsZik6CisgICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcworICAgICAgICBkZWYgc2tpbW1lcihzcmMsZHN0KToKKyAgICAgICAgICAgICMgZmlsdGVyIG91dCBzb3VyY2UtY29udHJvbCBkaXJlY3Rvcmllczsgbm90ZSB0aGF0ICdzcmMnIGlzIGFsd2F5cworICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKKyAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KKyAgICAgICAgICAgIGZvciBza2lwIGluICcuc3ZuLycsJ0NWUy8nOgorICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKHNraXApIG9yICcvJytza2lwIGluIHNyYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZHN0KQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCisgICAgICAgICAgICByZXR1cm4gZHN0CisgICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKKworICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6CisgICAgICAgIG5zcCA9IChzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10pWzpdCisgICAgICAgIGlmIG5vdCBuc3A6IHJldHVybgorICAgICAgICBuc3Auc29ydCgpICAjIHNldCB1cCBzaG9ydGVyIG5hbWVzIGZpcnN0CisgICAgICAgIGZpbGVuYW1lLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi50YXJnZXQpCisgICAgICAgIGZpbGVuYW1lICs9ICctbnNwa2cucHRoJzsgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIGZvciBwa2cgaW4gbnNwOgorICAgICAgICAgICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQorICAgICAgICAgICAgICAgIGYud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzLG5ldyxvczsgIgorICAgICAgICAgICAgICAgICAgICAicCA9IG9zLnBhdGguam9pbihzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzWydzaXRlZGlyJ10sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIqJShwdGgpcik7ICIKKyAgICAgICAgICAgICAgICAgICAgImllID0gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHAsJ19faW5pdF9fLnB5JykpOyAiCisgICAgICAgICAgICAgICAgICAgICJtID0gbm90IGllIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLG5ldy5tb2R1bGUoJShwa2cpcikpOyAiCisgICAgICAgICAgICAgICAgICAgICJtcCA9IChtIG9yIFtdKSBhbmQgbS5fX2RpY3RfXy5zZXRkZWZhdWx0KCdfX3BhdGhfXycsW10pOyAiCisgICAgICAgICAgICAgICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocClcbiIKKyAgICAgICAgICAgICAgICAgICAgJSBsb2NhbHMoKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOGRmZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkKQEAgLTAsMCArMSw3NiBAQAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBpbXBvcnQgaW5zdGFsbF9saWIgYXMgX2luc3RhbGxfbGliCitpbXBvcnQgb3MKKworY2xhc3MgaW5zdGFsbF9saWIoX2luc3RhbGxfbGliKToKKyAgICAiIiJEb24ndCBhZGQgY29tcGlsZWQgZmxhZ3MgdG8gZmlsZW5hbWVzIG9mIG5vbi1QeXRob24gZmlsZXMiIiIKKworICAgIGRlZiBfYnl0ZWNvZGVfZmlsZW5hbWVzIChzZWxmLCBweV9maWxlbmFtZXMpOgorICAgICAgICBieXRlY29kZV9maWxlcyA9IFtdCisgICAgICAgIGZvciBweV9maWxlIGluIHB5X2ZpbGVuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBweV9maWxlLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc2VsZi5jb21waWxlOgorICAgICAgICAgICAgICAgIGJ5dGVjb2RlX2ZpbGVzLmFwcGVuZChweV9maWxlICsgImMiKQorICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICAgICAgYnl0ZWNvZGVfZmlsZXMuYXBwZW5kKHB5X2ZpbGUgKyAibyIpCisKKyAgICAgICAgcmV0dXJuIGJ5dGVjb2RlX2ZpbGVzCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkKCkKKyAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmluc3RhbGwoKQorICAgICAgICBpZiBvdXRmaWxlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgYWx3YXlzIGNvbXBpbGUsIGluIGNhc2Ugd2UgaGF2ZSBhbnkgZXh0ZW5zaW9uIHN0dWJzIHRvIGRlYWwgd2l0aAorICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCisKKyAgICBkZWYgZ2V0X2V4Y2x1c2lvbnMoc2VsZik6CisgICAgICAgIGV4Y2x1ZGUgPSB7fQorICAgICAgICBuc3AgPSBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMKKworICAgICAgICBpZiAobnNwIGFuZCBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCisgICAgICAgICAgICAgICAuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkCisgICAgICAgICk6CisgICAgICAgICAgICBmb3IgcGtnIGluIG5zcDoKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpCisgICAgICAgICAgICAgICAgd2hpbGUgcGFydHM6CisgICAgICAgICAgICAgICAgICAgIHBrZ2RpciA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAqcGFydHMpCisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluICdfX2luaXRfXy5weScsICdfX2luaXRfXy5weWMnLCAnX19pbml0X18ucHlvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVbb3MucGF0aC5qb2luKHBrZ2RpcixmKV0gPSAxCisgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCisgICAgICAgIHJldHVybiBleGNsdWRlCisKKyAgICBkZWYgY29weV90cmVlKAorICAgICAgICBzZWxmLCBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgIHByZXNlcnZlX21vZGU9MSwgcHJlc2VydmVfdGltZXM9MSwgcHJlc2VydmVfc3ltbGlua3M9MCwgbGV2ZWw9MQorICAgICk6CisgICAgICAgIGFzc2VydCBwcmVzZXJ2ZV9tb2RlIGFuZCBwcmVzZXJ2ZV90aW1lcyBhbmQgbm90IHByZXNlcnZlX3N5bWxpbmtzCisgICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKKworICAgICAgICBpZiBub3QgZXhjbHVkZToKKyAgICAgICAgICAgIHJldHVybiBfaW5zdGFsbF9saWIuY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSkKKworICAgICAgICAjIEV4Y2x1ZGUgbmFtZXNwYWNlIHBhY2thZ2UgX19pbml0X18ucHkqIGZpbGVzIGZyb20gdGhlIG91dHB1dAorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19kaXJlY3RvcnkKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCisgICAgICAgIG91dGZpbGVzID0gW10KKworICAgICAgICBkZWYgcGYoc3JjLCBkc3QpOgorICAgICAgICAgICAgaWYgZHN0IGluIGV4Y2x1ZGU6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGluc3RhbGxhdGlvbiBvZiAlcyAobmFtZXNwYWNlIHBhY2thZ2UpIixkc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nICVzIC0+ICVzIiwgc3JjLCBvcy5wYXRoLmRpcm5hbWUoZHN0KSkKKyAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChkc3QpCisgICAgICAgICAgICByZXR1cm4gZHN0CisKKyAgICAgICAgdW5wYWNrX2RpcmVjdG9yeShpbmZpbGUsIG91dGZpbGUsIHBmKQorICAgICAgICByZXR1cm4gb3V0ZmlsZXMKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0cyA9IF9pbnN0YWxsX2xpYi5nZXRfb3V0cHV0cyhzZWxmKQorICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCisgICAgICAgIGlmIGV4Y2x1ZGU6CisgICAgICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gb3V0cHV0cyBpZiBmIG5vdCBpbiBleGNsdWRlXQorICAgICAgICByZXR1cm4gb3V0cHV0cwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTU1OGJmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKQEAgLTAsMCArMSw1NiBAQAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMgaW1wb3J0IGluc3RhbGxfc2NyaXB0cyBcCisgICAgIGFzIF9pbnN0YWxsX3NjcmlwdHMKK2Zyb20gZWFzeV9pbnN0YWxsIGltcG9ydCBnZXRfc2NyaXB0X2FyZ3MsIHN5c19leGVjdXRhYmxlCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUGF0aE1ldGFkYXRhLCBlbnN1cmVfZGlyZWN0b3J5CitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgaW5zdGFsbF9zY3JpcHRzKF9pbnN0YWxsX3NjcmlwdHMpOgorICAgICIiIkRvIG5vcm1hbCBzY3JpcHQgaW5zdGFsbCwgcGx1cyBhbnkgZWdnX2luZm8gd3JhcHBlciBzY3JpcHRzIiIiCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfaW5zdGFsbF9zY3JpcHRzLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLm5vX2VwID0gRmFsc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgIF9pbnN0YWxsX3NjcmlwdHMucnVuKHNlbGYpICAjIHJ1biBmaXJzdCB0byBzZXQgdXAgc2VsZi5vdXRmaWxlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCisgICAgICAgIGlmIHNlbGYubm9fZXA6CisgICAgICAgICAgICAjIGRvbid0IGluc3RhbGwgZW50cnkgcG9pbnQgc2NyaXB0cyBpbnRvIC5lZ2cgZmlsZSEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICBlaV9jbWQuZWdnX2Jhc2UsIFBhdGhNZXRhZGF0YShlaV9jbWQuZWdnX2Jhc2UsIGVpX2NtZC5lZ2dfaW5mbyksCisgICAgICAgICAgICBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKKyAgICAgICAgKQorICAgICAgICBic19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCisgICAgICAgIGV4ZWN1dGFibGUgPSBnZXRhdHRyKGJzX2NtZCwnZXhlY3V0YWJsZScsc3lzX2V4ZWN1dGFibGUpCisKKyAgICAgICAgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QsIGV4ZWN1dGFibGUpOgorICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCisKKworCisKKworCisKKyAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsICppZ25vcmVkKToKKyAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgorICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIHNjcmlwdF9uYW1lKQorICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZCh0YXJnZXQpCisKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQorICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCJ3Iittb2RlKQorICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwwNzU1KQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgb3MuZXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFhYjMxMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5CkBAIC0wLDAgKzEsNTcgQEAKK2ltcG9ydCBkaXN0dXRpbHMsIG9zCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCisKK2NsYXNzIHJvdGF0ZShDb21tYW5kKToKKyAgICAiIiJEZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucyIiIgorCisgICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ21hdGNoPScsICAgICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKKyAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCisgICAgICAgICgna2VlcD0nLCAgICAgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQorICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmtlZXAgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCisgICAgICAgICAgICAgICAgIihlLmcuICcuemlwJyBvciAnLmVnZycpIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYubWF0Y2ggPSBbCisgICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5tYXRjaDoKKyAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKycqJytwYXR0ZXJuCisgICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIscGF0dGVybikpCisgICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSxmKSBmb3IgZiBpbiBmaWxlc10KKyAgICAgICAgICAgIGZpbGVzLnNvcnQoKQorICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCisKKyAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKKyAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KKyAgICAgICAgICAgIGZvciAodCxmKSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM1OGQ3MgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHkKQEAgLTAsMCArMSwyNCBAQAoraW1wb3J0IGRpc3R1dGlscywgb3MKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UKKworY2xhc3Mgc2F2ZW9wdHMob3B0aW9uX2Jhc2UpOgorICAgICIiIlNhdmUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gYSBmaWxlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJzYXZlIHN1cHBsaWVkIG9wdGlvbnMgdG8gc2V0dXAuY2ZnIG9yIG90aGVyIGNvbmZpZyBmaWxlIgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uCisgICAgICAgIGNvbW1hbmRzID0gZGlzdC5jb21tYW5kX29wdGlvbnMua2V5cygpCisgICAgICAgIHNldHRpbmdzID0ge30KKworICAgICAgICBmb3IgY21kIGluIGNvbW1hbmRzOgorCisgICAgICAgICAgICBpZiBjbWQ9PSdzYXZlb3B0cyc6CisgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBkb24ndCBzYXZlIG91ciBvd24gb3B0aW9ucyEKKworICAgICAgICAgICAgZm9yIG9wdCwoc3JjLHZhbCkgaW4gZGlzdC5nZXRfb3B0aW9uX2RpY3QoY21kKS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHNyYz09ImNvbW1hbmQgbGluZSI6CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldGRlZmF1bHQoY21kLHt9KVtvcHRdID0gdmFsCisKKyAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgc2V0dGluZ3MsIHNlbGYuZHJ5X3J1bikKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyOWNkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5CkBAIC0wLDAgKzEsMTYzIEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdCBhcyBfc2Rpc3QKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAoraW1wb3J0IG9zLCByZSwgc3lzLCBwa2dfcmVzb3VyY2VzCisKK2VudGl0aWVzID0gWworICAgICgiJmx0OyIsIjwiKSwgKCImZ3Q7IiwgIj4iKSwgKCImcXVvdDsiLCAnIicpLCAoIiZhcG9zOyIsICInIiksCisgICAgKCImYW1wOyIsICImIikKK10KKworZGVmIHVuZXNjYXBlKGRhdGEpOgorICAgIGZvciBvbGQsbmV3IGluIGVudGl0aWVzOgorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKG9sZCxuZXcpCisgICAgcmV0dXJuIGRhdGEKKworZGVmIHJlX2ZpbmRlcihwYXR0ZXJuLCBwb3N0cHJvYz1Ob25lKToKKyAgICBkZWYgZmluZChkaXJuYW1lLCBmaWxlbmFtZSk6CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyVScpCisgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZm9yIG1hdGNoIGluIHBhdHRlcm4uZmluZGl0ZXIoZGF0YSk6CisgICAgICAgICAgICBwYXRoID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHBvc3Rwcm9jOgorICAgICAgICAgICAgICAgIHBhdGggPSBwb3N0cHJvYyhwYXRoKQorICAgICAgICAgICAgeWllbGQgam9pbnBhdGgoZGlybmFtZSxwYXRoKQorICAgIHJldHVybiBmaW5kCisKK2RlZiBqb2lucGF0aChwcmVmaXgsc3VmZml4KToKKyAgICBpZiBub3QgcHJlZml4OgorICAgICAgICByZXR1cm4gc3VmZml4CisgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsc3VmZml4KQorCisKKworCisKKworCisKKworCisKK2RlZiB3YWxrX3JldmN0cmwoZGlybmFtZT0nJyk6CisgICAgIiIiRmluZCBhbGwgZmlsZXMgdW5kZXIgcmV2aXNpb24gY29udHJvbCIiIgorICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdzZXR1cHRvb2xzLmZpbGVfZmluZGVycycpOgorICAgICAgICBmb3IgaXRlbSBpbiBlcC5sb2FkKCkoZGlybmFtZSk6CisgICAgICAgICAgICB5aWVsZCBpdGVtCisKK2RlZiBfZGVmYXVsdF9yZXZjdHJsKGRpcm5hbWU9JycpOgorICAgIGZvciBwYXRoLCBmaW5kZXIgaW4gZmluZGVyczoKKyAgICAgICAgcGF0aCA9IGpvaW5wYXRoKGRpcm5hbWUscGF0aCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiBmaW5kZXIoZGlybmFtZSxwYXRoKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcGF0aAorICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gX2RlZmF1bHRfcmV2Y3RybChwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworZGVmIGV4dGVybmFsc19maW5kZXIoZGlybmFtZSwgZmlsZW5hbWUpOgorICAgICIiIkZpbmQgYW55ICdzdm46ZXh0ZXJuYWxzJyBkaXJlY3RvcmllcyIiIgorICAgIGZvdW5kID0gRmFsc2UKKyAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKQorICAgIGZvciBsaW5lIGluIGl0ZXIoZi5yZWFkbGluZSwgJycpOiAgICAjIGNhbid0IHVzZSBkaXJlY3QgaXRlciEKKyAgICAgICAgcGFydHMgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKHBhcnRzKT09MjoKKyAgICAgICAgICAgIGtpbmQsbGVuZ3RoID0gcGFydHMKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoaW50KGxlbmd0aCkpCisgICAgICAgICAgICBpZiBraW5kPT0nSycgYW5kIGRhdGE9PSdzdm46ZXh0ZXJuYWxzJzoKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgIGVsaWYga2luZD09J1YnIGFuZCBmb3VuZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4KKworICAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpOgorICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBwYXJ0czoKKyAgICAgICAgICAgIHlpZWxkIGpvaW5wYXRoKGRpcm5hbWUsIHBhcnRzWzBdKQorCisKK2ZpbmRlcnMgPSBbCisgICAgKGNvbnZlcnRfcGF0aCgnQ1ZTL0VudHJpZXMnKSwKKyAgICAgICAgcmVfZmluZGVyKHJlLmNvbXBpbGUociJeXHc/LyhbXi9dKykvIiwgcmUuTSkpKSwKKyAgICAoY29udmVydF9wYXRoKCcuc3ZuL2VudHJpZXMnKSwKKyAgICAgICAgcmVfZmluZGVyKAorICAgICAgICAgICAgcmUuY29tcGlsZShyJ25hbWU9IihbXiJdKykiKD8hW14+XStkZWxldGVkPSJ0cnVlIiknLCByZS5JKSwKKyAgICAgICAgICAgIHVuZXNjYXBlCisgICAgICAgICkKKyAgICApLAorICAgIChjb252ZXJ0X3BhdGgoJy5zdm4vZGlyLXByb3BzJyksIGV4dGVybmFsc19maW5kZXIpLAorXQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3Mgc2Rpc3QoX3NkaXN0KToKKyAgICAiIiJTbWFydCBzZGlzdCB0aGF0IGZpbmRzIGFueXRoaW5nIHN1cHBvcnRlZCBieSByZXZpc2lvbiBjb250cm9sIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnZm9ybWF0cz0nLCBOb25lLAorICAgICAgICAgImZvcm1hdHMgZm9yIHNvdXJjZSBkaXN0cmlidXRpb24gKGNvbW1hLXNlcGFyYXRlZCBsaXN0KSIpLAorICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICJrZWVwIHRoZSBkaXN0cmlidXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgY3JlYXRpbmcgIiArCisgICAgICAgICAiYXJjaGl2ZSBmaWxlKHMpIiksCisgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYXJjaGl2ZShzKSBpbiAiCisgICAgICAgICAiW2RlZmF1bHQ6IGRpc3RdIiksCisgICAgICAgIF0KKworICAgIG5lZ2F0aXZlX29wdCA9IHt9CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBlaV9jbWQuZmlsZWxpc3QKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKGVpX2NtZC5lZ2dfaW5mbywnU09VUkNFUy50eHQnKSkKKworICAgICAgICBzZWxmLmNoZWNrX21ldGFkYXRhKCkKKyAgICAgICAgc2VsZi5tYWtlX2Rpc3RyaWJ1dGlvbigpCisKKyAgICAgICAgZGlzdF9maWxlcyA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ2Rpc3RfZmlsZXMnLFtdKQorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmFyY2hpdmVfZmlsZXM6CisgICAgICAgICAgICBkYXRhID0gKCdzZGlzdCcsICcnLCBmaWxlKQorICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZGlzdF9maWxlczoKKyAgICAgICAgICAgICAgICBkaXN0X2ZpbGVzLmFwcGVuZChkYXRhKQorCisgICAgZGVmIHJlYWRfdGVtcGxhdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zZGlzdC5yZWFkX3RlbXBsYXRlKHNlbGYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgZ3JvZHkgaGFjayB0byBjbG9zZSB0aGUgdGVtcGxhdGUgZmlsZSAoTUFOSUZFU1QuaW4pCisgICAgICAgICAgICAjIHRoaXMgcHJldmVudHMgZWFzeV9pbnN0YWxsJ3MgYXR0ZW1wdCBhdCBkZWxldGluZyB0aGUgZmlsZSBmcm9tCisgICAgICAgICAgICAjIGR5aW5nIGFuZCB0aHVzIG1hc2tpbmcgdGhlIHJlYWwgZXJyb3IKKyAgICAgICAgICAgIHN5cy5leGNfaW5mbygpWzJdLnRiX25leHQudGJfZnJhbWUuZl9sb2NhbHNbJ3RlbXBsYXRlJ10uY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjMTA1OAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2V0b3B0LnB5CkBAIC0wLDAgKzEsMTU4IEBACitpbXBvcnQgZGlzdHV0aWxzLCBvcworZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorCitfX2FsbF9fID0gWydjb25maWdfZmlsZScsICdlZGl0X2NvbmZpZycsICdvcHRpb25fYmFzZScsICdzZXRvcHQnXQorCisKK2RlZiBjb25maWdfZmlsZShraW5kPSJsb2NhbCIpOgorICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCisKKyAgICBga2luZGAgbXVzdCBiZSBvbmUgb2YgImxvY2FsIiwgImdsb2JhbCIsIG9yICJ1c2VyIgorICAgICIiIgorICAgIGlmIGtpbmQ9PSdsb2NhbCc6CisgICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJworICAgIGlmIGtpbmQ9PSdnbG9iYWwnOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksJ2Rpc3R1dGlscy5jZmcnCisgICAgICAgICkKKyAgICBpZiBraW5kPT0ndXNlcic6CisgICAgICAgIGRvdCA9IG9zLm5hbWU9PSdwb3NpeCcgYW5kICcuJyBvciAnJworICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQorICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICJjb25maWdfZmlsZSgpIHR5cGUgbXVzdCBiZSAnbG9jYWwnLCAnZ2xvYmFsJywgb3IgJ3VzZXInIiwga2luZAorICAgICkKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgc2V0dGluZ3MsIGRyeV9ydW49RmFsc2UpOgorICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCisKKyAgICBgc2V0dGluZ3NgIGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb3IgYGBOb25lYGAgdmFsdWVzLCBrZXllZCBieQorICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAorICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgorICAgIEEgc2V0dGluZyBvZiBgYE5vbmVgYCBtZWFucyB0byBkZWxldGUgdGhhdCBzZXR0aW5nLgorICAgICIiIgorICAgIGZyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBSYXdDb25maWdQYXJzZXIKKyAgICBsb2cuZGVidWcoIlJlYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICVzIiwgZmlsZW5hbWUpCisgICAgb3B0cyA9IFJhd0NvbmZpZ1BhcnNlcigpCisgICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCisgICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKKyAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCisgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgb3B0cy5hZGRfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICAgICAgZm9yIG9wdGlvbix2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbixvcHRpb24pCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbixvcHRpb24sdmFsdWUpCisKKyAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQorICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwndycpOyBvcHRzLndyaXRlKGYpOyBmLmNsb3NlKCkKKworY2xhc3Mgb3B0aW9uX2Jhc2UoQ29tbWFuZCk6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKKyAgICAgICAgICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAorICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAorICAgICAgICAgICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAorICAgICAgICAoJ2ZpbGVuYW1lPScsICdmJywKKyAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UgKGRlZmF1bHQ9c2V0dXAuY2ZnKSIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKKyAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAorICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKKyAgICAgICAgc2VsZi51c2VyX2NvbmZpZyAgID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGZpbGVuYW1lcyA9IFtdCisgICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKKyAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQorICAgICAgICBpZiBzZWxmLnVzZXJfY29uZmlnOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQorICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChzZWxmLmZpbGVuYW1lKQorICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKKyAgICAgICAgaWYgbGVuKGZpbGVuYW1lcyk+MToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25seSBvbmUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWVzCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmlsZW5hbWUsID0gZmlsZW5hbWVzCisKKworCisKK2NsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6CisgICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKKworICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCisgICAgICAgICgnb3B0aW9uPScsICAnbycsICAnb3B0aW9uIHRvIHNldCcpLAorICAgICAgICAoJ3NldC12YWx1ZT0nLCAgICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKKyAgICAgICAgKCdyZW1vdmUnLCAgICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAorICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYub3B0aW9uID0gTm9uZQorICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLmNvbW1hbmQgaXMgTm9uZSBvciBzZWxmLm9wdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQorICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tc2V0LXZhbHVlIG9yIC0tcmVtb3ZlIikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGVkaXRfY29uZmlnKAorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgeworICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCdfJyk6c2VsZi5zZXRfdmFsdWV9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc2VsZi5kcnlfcnVuCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5CkBAIC0wLDAgKzEsMTE5IEBACitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2ltcG9ydCBzeXMKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdExvYWRlciwgbWFpbgorCitjbGFzcyBTY2FubmluZ0xvYWRlcihUZXN0TG9hZGVyKToKKworICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZQorCisgICAgICAgIElmIHRoZSBtb2R1bGUgaXMgYSBwYWNrYWdlLCBsb2FkIHRlc3RzIGZyb20gYWxsIHRoZSBtb2R1bGVzIGluIGl0LgorICAgICAgICBJZiB0aGUgbW9kdWxlIGhhcyBhbiBgYGFkZGl0aW9uYWxfdGVzdHNgYCBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgYWRkCisgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIHRlc3RzLgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdHMgPSBbXQorICAgICAgICBpZiBtb2R1bGUuX19uYW1lX18hPSdzZXR1cHRvb2xzLnRlc3RzLmRvY3Rlc3QnOiAgIyB1Z2gKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZixtb2R1bGUpKQorCisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAiYWRkaXRpb25hbF90ZXN0cyIpOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZHVsZS5hZGRpdGlvbmFsX3Rlc3RzKCkpCisKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gcmVzb3VyY2VfbGlzdGRpcihtb2R1bGUuX19uYW1lX18sICcnKToKKyAgICAgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZSE9J19faW5pdF9fLnB5JzoKKyAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fKycuJytmaWxlWzotM10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiByZXNvdXJjZV9leGlzdHMoCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuX19uYW1lX18sIGZpbGUrJy9fX2luaXRfXy5weScKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXysnLicrZmlsZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShzdWJtb2R1bGUpKQorCisgICAgICAgIGlmIGxlbih0ZXN0cykhPTE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHRlc3RzWzBdICMgZG9uJ3QgY3JlYXRlIGEgbmVzdGVkIHN1aXRlIGZvciBvbmx5IG9uZSByZXR1cm4KKworCitjbGFzcyB0ZXN0KENvbW1hbmQpOgorCisgICAgIiIiQ29tbWFuZCB0byBydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIiIgorCisgICAgZGVzY3JpcHRpb24gPSAicnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgndGVzdC1tb2R1bGU9JywnbScsICJSdW4gJ3Rlc3Rfc3VpdGUnIGluIHNwZWNpZmllZCBtb2R1bGUiKSwKKyAgICAgICAgKCd0ZXN0LXN1aXRlPScsJ3MnLAorICAgICAgICAgICAgIlRlc3Qgc3VpdGUgdG8gcnVuIChlLmcuICdzb21lX21vZHVsZS50ZXN0X3N1aXRlJykiKSwKKyAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBOb25lCisgICAgICAgIHNlbGYudGVzdF9tb2R1bGUgPSBOb25lCisgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBOb25lCisKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi50ZXN0X21vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnRlc3Rfc3VpdGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi50ZXN0X21vZHVsZSsiLnRlc3Rfc3VpdGUiCisgICAgICAgIGVsaWYgc2VsZi50ZXN0X21vZHVsZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJZb3UgbWF5IHNwZWNpZnkgYSBtb2R1bGUgb3IgYSBzdWl0ZSwgYnV0IG5vdCBib3RoIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYudGVzdF9hcmdzID0gW3NlbGYudGVzdF9zdWl0ZV0KKworICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnRlc3RfYXJncy5pbnNlcnQoMCwnLS12ZXJib3NlJykKKyAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ3Rlc3RfbG9hZGVyJyxOb25lKQorICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OlNjYW5uaW5nTG9hZGVyIgorCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQorCisgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQorICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udGVzdHNfcmVxdWlyZToKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZ3Moc2VsZi5kaXN0cmlidXRpb24udGVzdHNfcmVxdWlyZSkKKworICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGU6CisgICAgICAgICAgICBjbWQgPSAnICcuam9pbihzZWxmLnRlc3RfYXJncykKKyAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdza2lwcGluZyAidW5pdHRlc3QgJXMiIChkcnkgcnVuKScgJSBjbWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ3J1bm5pbmcgInVuaXR0ZXN0ICVzIicgJSBjbWQpCisgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgorICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICAgICAgb2xkX3BhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBwYXRoX2l0ZW0gPSBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2Jhc2UpCisgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKAorICAgICAgICAgICAgcGF0aF9pdGVtLCBub3JtYWxpemVfcGF0aChlaV9jbWQuZWdnX2luZm8pCisgICAgICAgICkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihwYXRoX2l0ZW0sIG1ldGFkYXRhLCBwcm9qZWN0X25hbWU9ZWlfY21kLmVnZ19uYW1lKQorICAgICAgICB3b3JraW5nX3NldC5hZGQoZGlzdCkKKyAgICAgICAgcmVxdWlyZShzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKSkKKyAgICAgICAgbG9hZGVyX2VwID0gRW50cnlQb2ludC5wYXJzZSgieD0iK3NlbGYudGVzdF9sb2FkZXIpCisgICAgICAgIGxvYWRlcl9jbGFzcyA9IGxvYWRlcl9lcC5sb2FkKHJlcXVpcmU9RmFsc2UpCisgICAgICAgIHVuaXR0ZXN0Lm1haW4oCisgICAgICAgICAgICBOb25lLCBOb25lLCBbdW5pdHRlc3QuX19maWxlX19dK3NlbGYudGVzdF9hcmdzLAorICAgICAgICAgICAgdGVzdExvYWRlciA9IGxvYWRlcl9jbGFzcygpCisgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ0YzQwMAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0wLDAgKzEsMTc4IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICd1cGxvYWQnIHN1YmNvbW1hbmQgKHVwbG9hZCBwYWNrYWdlIHRvIFB5UEkpLiIiIgorCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBtZDUgaW1wb3J0IG1kNQoraW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBDb25maWdQYXJzZXIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCBjU3RyaW5nSU8gYXMgU3RyaW5nSU8KKworY2xhc3MgdXBsb2FkKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAidXBsb2FkIGJpbmFyeSBwYWNrYWdlIHRvIFB5UEkiCisKKyAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cDovL3d3dy5weXRob24ub3JnL3B5cGknCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgncmVwb3NpdG9yeT0nLCAncicsCisgICAgICAgICAidXJsIG9mIHJlcG9zaXRvcnkgW2RlZmF1bHQ6ICVzXSIgJSBERUZBVUxUX1JFUE9TSVRPUlkpLAorICAgICAgICAoJ3Nob3ctcmVzcG9uc2UnLCBOb25lLAorICAgICAgICAgJ2Rpc3BsYXkgZnVsbCByZXNwb25zZSB0ZXh0IGZyb20gc2VydmVyJyksCisgICAgICAgICgnc2lnbicsICdzJywKKyAgICAgICAgICdzaWduIGZpbGVzIHRvIHVwbG9hZCB1c2luZyBncGcnKSwKKyAgICAgICAgKCdpZGVudGl0eT0nLCAnaScsICdHUEcgaWRlbnRpdHkgdXNlZCB0byBzaWduIGZpbGVzJyksCisgICAgICAgIF0KKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ3Nob3ctcmVzcG9uc2UnLCAnc2lnbiddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnVzZXJuYW1lID0gJycKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9ICcnCisgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9ICcnCisgICAgICAgIHNlbGYuc2hvd19yZXNwb25zZSA9IDAKKyAgICAgICAgc2VsZi5zaWduID0gRmFsc2UKKyAgICAgICAgc2VsZi5pZGVudGl0eSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlkZW50aXR5IGFuZCBub3Qgc2VsZi5zaWduOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3QgdXNlIC0tc2lnbiBmb3IgLS1pZGVudGl0eSB0byBoYXZlIG1lYW5pbmciCisgICAgICAgICAgICApCisgICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgnSE9NRScpOgorICAgICAgICAgICAgcmMgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSE9NRSddLCAnLnB5cGlyYycpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyYyk6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgUHlQSSBsb2dpbiBmcm9tICVzJyAlIHJjKQorICAgICAgICAgICAgICAgIGNvbmZpZyA9IENvbmZpZ1BhcnNlci5Db25maWdQYXJzZXIoeworICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJuYW1lJzonJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCc6JycsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3NpdG9yeSc6Jyd9KQorICAgICAgICAgICAgICAgIGNvbmZpZy5yZWFkKHJjKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlcG9zaXRvcnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICdyZXBvc2l0b3J5JykKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51c2VybmFtZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICd1c2VybmFtZScpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPSBjb25maWcuZ2V0KCdzZXJ2ZXItbG9naW4nLCAncGFzc3dvcmQnKQorICAgICAgICBpZiBub3Qgc2VsZi5yZXBvc2l0b3J5OgorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gc2VsZi5ERUZBVUxUX1JFUE9TSVRPUlkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk5vIGRpc3QgZmlsZSBjcmVhdGVkIGluIGVhcmxpZXIgY29tbWFuZCIpCisgICAgICAgIGZvciBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6CisgICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUpCisKKyAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSk6CisgICAgICAgICMgU2lnbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgc2VsZi5zaWduOgorICAgICAgICAgICAgZ3BnX2FyZ3MgPSBbImdwZyIsICItLWRldGFjaC1zaWduIiwgIi1hIiwgZmlsZW5hbWVdCisgICAgICAgICAgICBpZiBzZWxmLmlkZW50aXR5OgorICAgICAgICAgICAgICAgIGdwZ19hcmdzWzI6Ml0gPSBbIi0tbG9jYWwtdXNlciIsIHNlbGYuaWRlbnRpdHldCisgICAgICAgICAgICBzcGF3bihncGdfYXJncywKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgICAgICMgRmlsbCBpbiB0aGUgZGF0YQorICAgICAgICBjb250ZW50ID0gb3BlbihmaWxlbmFtZSwncmInKS5yZWFkKCkKKyAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICBjb21tZW50ID0gJycKKyAgICAgICAgaWYgY29tbWFuZD09J2JkaXN0X2VnZycgYW5kIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgY29tbWVudCA9ICJidWlsdCBvbiAlcyIgJSBwbGF0Zm9ybS5wbGF0Zm9ybSh0ZXJzZT0xKQorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgJzphY3Rpb24nOidmaWxlX3VwbG9hZCcsCisgICAgICAgICAgICAncHJvdGNvbF92ZXJzaW9uJzonMScsCisgICAgICAgICAgICAnbmFtZSc6c2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzpzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgJ2NvbnRlbnQnOihiYXNlbmFtZSxjb250ZW50KSwKKyAgICAgICAgICAgICdmaWxldHlwZSc6Y29tbWFuZCwKKyAgICAgICAgICAgICdweXZlcnNpb24nOnB5dmVyc2lvbiwKKyAgICAgICAgICAgICdtZDVfZGlnZXN0JzptZDUoY29udGVudCkuaGV4ZGlnZXN0KCksCisgICAgICAgICAgICB9CisgICAgICAgIGlmIGNvbW1hbmQgPT0gJ2JkaXN0X3JwbSc6CisgICAgICAgICAgICBkaXN0LCB2ZXJzaW9uLCBpZCA9IHBsYXRmb3JtLmRpc3QoKQorICAgICAgICAgICAgaWYgZGlzdDoKKyAgICAgICAgICAgICAgICBjb21tZW50ID0gJ2J1aWx0IGZvciAlcyAlcycgJSAoZGlzdCwgdmVyc2lvbikKKyAgICAgICAgZWxpZiBjb21tYW5kID09ICdiZGlzdF9kdW1iJzoKKyAgICAgICAgICAgIGNvbW1lbnQgPSAnYnVpbHQgZm9yICVzJyAlIHBsYXRmb3JtLnBsYXRmb3JtKHRlcnNlPTEpCisgICAgICAgIGRhdGFbJ2NvbW1lbnQnXSA9IGNvbW1lbnQKKworICAgICAgICBpZiBzZWxmLnNpZ246CisgICAgICAgICAgICBkYXRhWydncGdfc2lnbmF0dXJlJ10gPSAob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkgKyAiLmFzYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbihmaWxlbmFtZSsiLmFzYyIpLnJlYWQoKSkKKworICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgYXV0aCA9ICJCYXNpYyAiICsgYmFzZTY0LmVuY29kZXN0cmluZyhzZWxmLnVzZXJuYW1lICsgIjoiICsgc2VsZi5wYXNzd29yZCkuc3RyaXAoKQorCisgICAgICAgICMgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQorICAgICAgICBib3VuZGFyeSA9ICctLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCisgICAgICAgIHNlcF9ib3VuZGFyeSA9ICdcbi0tJyArIGJvdW5kYXJ5CisgICAgICAgIGVuZF9ib3VuZGFyeSA9IHNlcF9ib3VuZGFyeSArICctLScKKyAgICAgICAgYm9keSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgIyBoYW5kbGUgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgIT0gdHlwZShbXSk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgdHVwbGU6CisgICAgICAgICAgICAgICAgICAgIGZuID0gJztmaWxlbmFtZT0iJXMiJyAlIHZhbHVlWzBdCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmbiA9ICIiCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHIodmFsdWUpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZShzZXBfYm91bmRhcnkpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicla2V5KQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoZm4pCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgiXG5cbiIpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTFdID09ICdccic6CisgICAgICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoJ1xuJykgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKKyAgICAgICAgYm9keS53cml0ZShlbmRfYm91bmRhcnkpCisgICAgICAgIGJvZHkud3JpdGUoIlxuIikKKyAgICAgICAgYm9keSA9IGJvZHkuZ2V0dmFsdWUoKQorCisgICAgICAgIHNlbGYuYW5ub3VuY2UoIlN1Ym1pdHRpbmcgJXMgdG8gJXMiICUgKGZpbGVuYW1lLCBzZWxmLnJlcG9zaXRvcnkpLCBsb2cuSU5GTykKKworICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CisgICAgICAgICMgV2UgY2FuJ3QgdXNlIHVybGxpYjIgc2luY2Ugd2UgbmVlZCB0byBzZW5kIHRoZSBCYXNpYworICAgICAgICAjIGF1dGggcmlnaHQgd2l0aCB0aGUgZmlyc3QgcmVxdWVzdAorICAgICAgICBzY2hlbWEsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudHMgPSBcCisgICAgICAgICAgICB1cmxwYXJzZS51cmxwYXJzZShzZWxmLnJlcG9zaXRvcnkpCisgICAgICAgIGFzc2VydCBub3QgcGFyYW1zIGFuZCBub3QgcXVlcnkgYW5kIG5vdCBmcmFnbWVudHMKKyAgICAgICAgaWYgc2NoZW1hID09ICdodHRwJzoKKyAgICAgICAgICAgIGh0dHAgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKG5ldGxvYykKKyAgICAgICAgZWxpZiBzY2hlbWEgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgIGh0dHAgPSBodHRwbGliLkhUVFBTQ29ubmVjdGlvbihuZXRsb2MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInVuc3VwcG9ydGVkIHNjaGVtYSAiK3NjaGVtYQorCisgICAgICAgIGRhdGEgPSAnJworICAgICAgICBsb2dsZXZlbCA9IGxvZy5JTkZPCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGh0dHAuY29ubmVjdCgpCisgICAgICAgICAgICBodHRwLnB1dHJlcXVlc3QoIlBPU1QiLCB1cmwpCisgICAgICAgICAgICBodHRwLnB1dGhlYWRlcignQ29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lcyclYm91bmRhcnkpCisgICAgICAgICAgICBodHRwLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCBzdHIobGVuKGJvZHkpKSkKKyAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgYXV0aCkKKyAgICAgICAgICAgIGh0dHAuZW5kaGVhZGVycygpCisgICAgICAgICAgICBodHRwLnNlbmQoYm9keSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoZS5tc2csIGxvZy5FUlJPUikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHIgPSBodHRwLmdldHJlc3BvbnNlKCkKKyAgICAgICAgaWYgci5zdGF0dXMgPT0gMjAwOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5FUlJPUikKKyAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgorICAgICAgICAgICAgcHJpbnQgJy0nKjc1LCByLnJlYWQoKSwgJy0nKjc1CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9kZXBlbmRzLnB5IGIvTGliL3NldHVwdG9vbHMvZGVwZW5kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ4MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZGVwZW5kcy5weQpAQCAtMCwwICsxLDIzOSBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCitpbXBvcnQgc3lzLCBpbXAsIG1hcnNoYWwKK2Zyb20gaW1wIGltcG9ydCBQS0dfRElSRUNUT1JZLCBQWV9DT01QSUxFRCwgUFlfU09VUkNFLCBQWV9GUk9aRU4KK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24sIExvb3NlVmVyc2lvbgorCitfX2FsbF9fID0gWworICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKK10KKworY2xhc3MgUmVxdWlyZToKKyAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLHJlcXVlc3RlZF92ZXJzaW9uLG1vZHVsZSxob21lcGFnZT0nJywKKyAgICAgICAgYXR0cmlidXRlPU5vbmUsZm9ybWF0PU5vbmUKKyAgICApOgorCisgICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KKworICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKKworICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShsb2NhbHMoKSkKKyAgICAgICAgZGVsIHNlbGYuc2VsZgorCisKKyAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gZnVsbCBwYWNrYWdlL2Rpc3RyaWJ1dGlvbiBuYW1lLCB3L3ZlcnNpb24iIiIKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSxzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKworICAgIGRlZiB2ZXJzaW9uX29rKHNlbGYsdmVyc2lvbik6CisgICAgICAgICIiIklzICd2ZXJzaW9uJyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZT8iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCisgICAgICAgICAgICBzdHIodmVyc2lvbik8PiJ1bmtub3duIiBhbmQgdmVyc2lvbiA+PSBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uCisKKworICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6CisKKyAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCisKKyAgICAgICAgU2VhcmNoICdwYXRocycgZm9yIG1vZHVsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJuICdOb25lJy4gIElmIGZvdW5kLAorICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KKyAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0CisgICAgICAgIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhlIHZlcnNpb24gaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKKyAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYscCxpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUscGF0aHMpCisgICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLHNlbGYuYXR0cmlidXRlLGRlZmF1bHQscGF0aHMpCisKKyAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKKworICAgICAgICByZXR1cm4gdgorCisKKyAgICBkZWYgaXNfcHJlc2VudChzZWxmLHBhdGhzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmVyc2lvbihwYXRocykgaXMgbm90IE5vbmUKKworCisgICAgZGVmIGlzX2N1cnJlbnQoc2VsZixwYXRocz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKKyAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCisgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCisKKworZGVmIF9pdGVyX2NvZGUoY29kZSk6CisKKyAgICAiIiJZaWVsZCAnKG9wLGFyZyknIHBhaXIgZm9yIGVhY2ggb3BlcmF0aW9uIGluIGNvZGUgb2JqZWN0ICdjb2RlJyIiIgorCisgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICBmcm9tIGRpcyBpbXBvcnQgSEFWRV9BUkdVTUVOVCwgRVhURU5ERURfQVJHCisKKyAgICBieXRlcyA9IGFycmF5KCdiJyxjb2RlLmNvX2NvZGUpCisgICAgZW9mID0gbGVuKGNvZGUuY29fY29kZSkKKworICAgIHB0ciA9IDAKKyAgICBleHRlbmRlZF9hcmcgPSAwCisKKyAgICB3aGlsZSBwdHI8ZW9mOgorCisgICAgICAgIG9wID0gYnl0ZXNbcHRyXQorCisgICAgICAgIGlmIG9wPj1IQVZFX0FSR1VNRU5UOgorCisgICAgICAgICAgICBhcmcgPSBieXRlc1twdHIrMV0gKyBieXRlc1twdHIrMl0qMjU2ICsgZXh0ZW5kZWRfYXJnCisgICAgICAgICAgICBwdHIgKz0gMworCisgICAgICAgICAgICBpZiBvcD09RVhURU5ERURfQVJHOgorICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIDY1NTM2TAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgICAgIHB0ciArPSAxCisKKyAgICAgICAgeWllbGQgb3AsYXJnCisKKworCisKKworCisKKworCisKK2RlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgorICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKKworICAgIHBhcnRzID0gbW9kdWxlLnNwbGl0KCcuJykKKworICAgIHdoaWxlIHBhcnRzOgorICAgICAgICBwYXJ0ID0gcGFydHMucG9wKDApCisgICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCisKKyAgICAgICAgaWYga2luZD09UEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIHBhcnRzID0gcGFydHMgb3IgWydfX2luaXRfXyddCisgICAgICAgICAgICBwYXRocyA9IFtwYXRoXQorCisgICAgICAgIGVsaWYgcGFydHM6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsbW9kdWxlKSkKKworICAgIHJldHVybiBpbmZvCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6CisKKyAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJworCisgICAgUmV0dXJuICdOb25lJyBpZiAnbW9kdWxlJyBkb2VzIG5vdCBleGlzdCBvbiAncGF0aHMnLCBvciBpdCBkb2VzIG5vdCBkZWZpbmUKKyAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCisgICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCisKKyAgICB0cnk6CisgICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGZpbmRfbW9kdWxlKG1vZHVsZSxwYXRocykKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHRyeToKKyAgICAgICAgaWYga2luZD09UFlfQ09NUElMRUQ6CisgICAgICAgICAgICBmLnJlYWQoOCkgICAjIHNraXAgbWFnaWMgJiBkYXRlCisgICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCisgICAgICAgIGVsaWYga2luZD09UFlfRlJPWkVOOgorICAgICAgICAgICAgY29kZSA9IGltcC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUpCisgICAgICAgIGVsaWYga2luZD09UFlfU09VUkNFOgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKKyAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSxmLHBhdGgsKHN1ZmZpeCxtb2RlLGtpbmQpKQorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kdWxlXSxzeW1ib2wsTm9uZSkKKworICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsc3ltYm9sLGRlZmF1bHQpCisKKworCisKKworCisKKworZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSxzeW1ib2wsZGVmYXVsdD0tMSk6CisKKyAgICAiIiJFeHRyYWN0IHRoZSBjb25zdGFudCB2YWx1ZSBvZiAnc3ltYm9sJyBmcm9tICdjb2RlJworCisgICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKKyAgICBvYmplY3QgJ2NvZGUnLCByZXR1cm4gdGhhdCB2YWx1ZS4gIElmICdzeW1ib2wnIGlzIGJvdW5kIHRvIGFuIGV4cHJlc3Npb24sCisgICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KKworICAgIFJldHVybiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgZmlyc3QgYXNzaWdubWVudCB0byAnc3ltYm9sJy4gICdzeW1ib2wnIG11c3QKKyAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKKyAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCisgICAgbXVzdCBiZSBwcmVzZW50IGluICdjb2RlLmNvX25hbWVzJy4KKyAgICAiIiIKKworICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKKyAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ21lbnQKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCisKKyAgICBTVE9SRV9OQU1FID0gOTAKKyAgICBTVE9SRV9HTE9CQUwgPSA5NworICAgIExPQURfQ09OU1QgPSAxMDAKKworICAgIGNvbnN0ID0gZGVmYXVsdAorCisgICAgZm9yIG9wLCBhcmcgaW4gX2l0ZXJfY29kZShjb2RlKToKKworICAgICAgICBpZiBvcD09TE9BRF9DT05TVDoKKyAgICAgICAgICAgIGNvbnN0ID0gY29kZS5jb19jb25zdHNbYXJnXQorICAgICAgICBlbGlmIGFyZz09bmFtZV9pZHggYW5kIChvcD09U1RPUkVfTkFNRSBvciBvcD09U1RPUkVfR0xPQkFMKToKKyAgICAgICAgICAgIHJldHVybiBjb25zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9kaXN0LnB5IGIvTGliL3NldHVwdG9vbHMvZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQxN2MxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZGlzdC5weQpAQCAtMCwwICsxLDc5OCBAQAorX19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJ10KKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uIGFzIF9EaXN0cmlidXRpb24KK2Zyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBSZXF1aXJlCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliIGltcG9ydCBpbnN0YWxsX2xpYgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCitpbXBvcnQgc2V0dXB0b29scywgcGtnX3Jlc291cmNlcywgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY21kCitpbXBvcnQgb3MKKworZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CisgICAgIiIiUHJvdGVjdCBhZ2FpbnN0IHJlLXBhdGNoaW5nIHRoZSBkaXN0dXRpbHMgaWYgcmVsb2FkZWQKKworICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCisgICAgZmlyc3QuCisgICAgIiIiCisgICAgd2hpbGUgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnc2V0dXB0b29scycpOgorICAgICAgICBjbHMsID0gY2xzLl9fYmFzZXNfXworICAgIGlmIG5vdCBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdkaXN0dXRpbHMnKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAiZGlzdHV0aWxzIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCBieSAlciIgJSBjbHMKKyAgICAgICAgKQorICAgIHJldHVybiBjbHMKKworX0Rpc3RyaWJ1dGlvbiA9IF9nZXRfdW5wYXRjaGVkKF9EaXN0cmlidXRpb24pCisKK3NlcXVlbmNlID0gdHVwbGUsIGxpc3QKKworZGVmIGNoZWNrX2ltcG9ydGFibGUoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgIHRyeToKKyAgICAgICAgZXAgPSBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2UoJ3g9Jyt2YWx1ZSkKKyAgICAgICAgYXNzZXJ0IG5vdCBlcC5leHRyYXMKKyAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yLEF0dHJpYnV0ZUVycm9yLEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICIlciBtdXN0IGJlIGltcG9ydGFibGUgJ21vZHVsZTphdHRycycgc3RyaW5nIChnb3QgJXIpIgorICAgICAgICAgICAgJSAoYXR0cix2YWx1ZSkKKyAgICAgICAgKQorCisKK2RlZiBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgc3RyaW5nIGxpc3Qgb3IgTm9uZSIiIgorICAgIHRyeToKKyAgICAgICAgYXNzZXJ0ICcnLmpvaW4odmFsdWUpIT12YWx1ZQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IsQXR0cmlidXRlRXJyb3IsQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiICUgKGF0dHIsdmFsdWUpCisgICAgICAgICkKKworZGVmIGNoZWNrX25zcChkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgbmFtZXNwYWNlIHBhY2thZ2VzIGFyZSB2YWxpZCIiIgorICAgIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LGF0dHIsdmFsdWUpCisKKyAgICBmb3IgbnNwIGluIHZhbHVlOgorICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKG5zcCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICJEaXN0cmlidXRpb24gY29udGFpbnMgbm8gbW9kdWxlcyBvciBwYWNrYWdlcyBmb3IgIiArCisgICAgICAgICAgICAgICAgIm5hbWVzcGFjZSBwYWNrYWdlICVyIiAlIG5zcAorICAgICAgICAgICAgKQorCitkZWYgY2hlY2tfZXh0cmFzKGRpc3QsIGF0dHIsIHZhbHVlKToKKyAgICAiIiJWZXJpZnkgdGhhdCBleHRyYXNfcmVxdWlyZSBtYXBwaW5nIGlzIHZhbGlkIiIiCisgICAgdHJ5OgorICAgICAgICBmb3Igayx2IGluIHZhbHVlLml0ZW1zKCk6CisgICAgICAgICAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHYpKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IsQXR0cmlidXRlRXJyb3IpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgIidleHRyYXNfcmVxdWlyZScgbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgdmFsdWVzIGFyZSAiCisgICAgICAgICAgICAic3RyaW5ncyBvciBsaXN0cyBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uICIKKyAgICAgICAgICAgICJyZXF1aXJlbWVudCBzcGVjaWZpZXJzLiIKKyAgICAgICAgKQorCitkZWYgYXNzZXJ0X2Jvb2woZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIFRydWUsIEZhbHNlLCAwLCBvciAxIiIiCisgICAgaWYgYm9vbCh2YWx1ZSkgIT0gdmFsdWU6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUgKGdvdCAlcikiICUgKGF0dHIsdmFsdWUpCisgICAgICAgICkKKworCisKK2RlZiBjaGVja19yZXF1aXJlbWVudHMoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IGluc3RhbGxfcmVxdWlyZXMgaXMgYSB2YWxpZCByZXF1aXJlbWVudHMgbGlzdCIiIgorICAgIHRyeToKKyAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2YWx1ZSkpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsVmFsdWVFcnJvcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJXIgbXVzdCBiZSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgIgorICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllcnMiICUgKGF0dHIsKQorICAgICAgICApCisKK2RlZiBjaGVja19lbnRyeV9wb2ludHMoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IGVudHJ5X3BvaW50cyBtYXAgaXMgcGFyc2VhYmxlIiIiCisgICAgdHJ5OgorICAgICAgICBwa2dfcmVzb3VyY2VzLkVudHJ5UG9pbnQucGFyc2VfbWFwKHZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKGUpCisKKworZGVmIGNoZWNrX3Rlc3Rfc3VpdGUoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLGJhc2VzdHJpbmcpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCJ0ZXN0X3N1aXRlIG11c3QgYmUgYSBzdHJpbmciKQorCisKK2RlZiBjaGVja19wYWNrYWdlX2RhdGEoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgZGljdGlvbmFyeSBvZiBwYWNrYWdlIG5hbWVzIHRvIGdsb2IgbGlzdHMiIiIKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLGRpY3QpOgorICAgICAgICBmb3Igayx2IGluIHZhbHVlLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrLHN0cik6IGJyZWFrCisgICAgICAgICAgICB0cnk6IGl0ZXIodikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgIGF0dHIrIiBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgIgorICAgICAgICAid2lsZGNhcmQgcGF0dGVybnMiCisgICAgKQorCisKKworCitjbGFzcyBEaXN0cmlidXRpb24oX0Rpc3RyaWJ1dGlvbik6CisgICAgIiIiRGlzdHJpYnV0aW9uIHdpdGggc3VwcG9ydCBmb3IgZmVhdHVyZXMsIHRlc3RzLCBhbmQgcGFja2FnZSBkYXRhCisKKyAgICBUaGlzIGlzIGFuIGVuaGFuY2VkIHZlcnNpb24gb2YgJ2Rpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbicgdGhhdAorICAgIGVmZmVjdGl2ZWx5IGFkZHMgdGhlIGZvbGxvd2luZyBuZXcgb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknOgorCisgICAgICdpbnN0YWxsX3JlcXVpcmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgcHJvamVjdAorICAgICAgICB2ZXJzaW9ucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVxdWlyZXMgd2hlbiBpbnN0YWxsZWQsIGluIHRoZSBmb3JtYXQKKyAgICAgICAgdXNlZCBieSAncGtnX3Jlc291cmNlcy5yZXF1aXJlKCknLiAgVGhleSB3aWxsIGJlIGluc3RhbGxlZAorICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLiAgSWYgeW91IHdpc2ggdG8gdXNlCisgICAgICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgaW4gUHlQSSwgb3Igd2FudCB0byBnaXZlIHlvdXIgdXNlcnMgYW4KKyAgICAgICAgYWx0ZXJuYXRlIGRvd25sb2FkIGxvY2F0aW9uLCB5b3UgY2FuIGFkZCBhICdmaW5kX2xpbmtzJyBvcHRpb24gdG8gdGhlCisgICAgICAgICdbZWFzeV9pbnN0YWxsXScgc2VjdGlvbiBvZiB5b3VyIHByb2plY3QncyAnc2V0dXAuY2ZnJyBmaWxlLCBhbmQgdGhlbgorICAgICAgICBzZXR1cHRvb2xzIHdpbGwgc2NhbiB0aGUgbGlzdGVkIHdlYiBwYWdlcyBmb3IgbGlua3MgdGhhdCBzYXRpc2Z5IHRoZQorICAgICAgICByZXF1aXJlbWVudHMuCisKKyAgICAgJ2V4dHJhc19yZXF1aXJlJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBvcHRpb25hbCAiZXh0cmFzIiB0byB0aGUKKyAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudChzKSB0aGF0IHVzaW5nIHRob3NlIGV4dHJhcyBpbmN1cnMuIEZvciBleGFtcGxlLAorICAgICAgICB0aGlzOjoKKworICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSBkaWN0KHJlU1QgPSBbImRvY3V0aWxzPj0wLjMiLCAicmVTVGVkaXQiXSkKKworICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZXh0cmEKKyAgICAgICAgY2FwYWJpbGl0eSBjYWxsZWQgInJlU1QiLCBidXQgaXQgY2FuIG9ubHkgYmUgdXNlZCBpZiBkb2N1dGlscyBhbmQKKyAgICAgICAgcmVTVGVkaXQgYXJlIGluc3RhbGxlZC4gIElmIHRoZSB1c2VyIGluc3RhbGxzIHlvdXIgcGFja2FnZSB1c2luZworICAgICAgICBFYXN5SW5zdGFsbCBhbmQgcmVxdWVzdHMgb25lIG9mIHlvdXIgZXh0cmFzLCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB3aWxsIGJlIGluc3RhbGxlZCBpZiBuZWVkZWQuCisKKyAgICAgJ2ZlYXR1cmVzJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gbmFtZXMgdG8gJ3NldHVwdG9vbHMuRmVhdHVyZScKKyAgICAgICAgb2JqZWN0cy4gIEZlYXR1cmVzIGFyZSBhIHBvcnRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZQorICAgICAgICBpbmNsdWRlZCBvciBleGNsdWRlZCBiYXNlZCBvbiB1c2VyIG9wdGlvbnMsIGludGVyLWZlYXR1cmUgZGVwZW5kZW5jaWVzLAorICAgICAgICBhbmQgYXZhaWxhYmlsaXR5IG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIEV4Y2x1ZGVkIGZlYXR1cmVzIGFyZSBvbWl0dGVkCisgICAgICAgIGZyb20gYWxsIHNldHVwIGNvbW1hbmRzLCBpbmNsdWRpbmcgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucywgc28KKyAgICAgICAgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmcm9tIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgorICAgICAgICBGZWF0dXJlIG5hbWVzIHNob3VsZCBiZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMsIGV4Y2VwdCB0aGF0IHRoZXkgbWF5CisgICAgICAgIGNvbnRhaW4gdGhlICctJyAobWludXMpIHNpZ24uICBGZWF0dXJlcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKKyAgICAgICAgdmlhIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAnLS13aXRoLVgnIGFuZCAnLS13aXRob3V0LVgnLCB3aGVyZSAnWCcgaXMKKyAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUuICBXaGV0aGVyIGEgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LCBhbmQKKyAgICAgICAgd2hldGhlciB5b3UgYXJlIGFsbG93ZWQgdG8gY29udHJvbCB0aGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXMKKyAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgRmVhdHVyZSBvYmplY3QuICBTZWUgdGhlICdGZWF0dXJlJyBjbGFzcyBmb3IgbW9yZQorICAgICAgICBpbmZvcm1hdGlvbi4KKworICAgICAndGVzdF9zdWl0ZScgLS0gdGhlIG5hbWUgb2YgYSB0ZXN0IHN1aXRlIHRvIHJ1biBmb3IgdGhlICd0ZXN0JyBjb21tYW5kLgorICAgICAgICBJZiB0aGUgdXNlciBydW5zICdweXRob24gc2V0dXAucHkgdGVzdCcsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkLAorICAgICAgICBhbmQgdGhlIG5hbWVkIHRlc3Qgc3VpdGUgd2lsbCBiZSBydW4uICBUaGUgZm9ybWF0IGlzIHRoZSBzYW1lIGFzCisgICAgICAgIHdvdWxkIGJlIHVzZWQgb24gYSAndW5pdHRlc3QucHknIGNvbW1hbmQgbGluZS4gIFRoYXQgaXMsIGl0IGlzIHRoZQorICAgICAgICBkb3R0ZWQgbmFtZSBvZiBhbiBvYmplY3QgdG8gaW1wb3J0IGFuZCBjYWxsIHRvIGdlbmVyYXRlIGEgdGVzdCBzdWl0ZS4KKworICAgICAncGFja2FnZV9kYXRhJyAtLSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mIGZpbGVuYW1lcworICAgICAgICBvciBnbG9icyB0byB1c2UgdG8gZmluZCBkYXRhIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgbmFtZWQgcGFja2FnZXMuCisgICAgICAgIElmIHRoZSBkaWN0aW9uYXJ5IGhhcyBmaWxlbmFtZXMgb3IgZ2xvYnMgbGlzdGVkIHVuZGVyICciIicgKHRoZSBlbXB0eQorICAgICAgICBzdHJpbmcpLCB0aG9zZSBuYW1lcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBldmVyeSBwYWNrYWdlLCBpbiBhZGRpdGlvbgorICAgICAgICB0byBhbnkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpYyBwYWNrYWdlLiAgRGF0YSBmaWxlcyBmb3VuZCB1c2luZyB0aGVzZQorICAgICAgICBuYW1lcy9nbG9icyB3aWxsIGJlIGluc3RhbGxlZCBhbG9uZyB3aXRoIHRoZSBwYWNrYWdlLCBpbiB0aGUgc2FtZQorICAgICAgICBsb2NhdGlvbiBhcyB0aGUgcGFja2FnZS4gIE5vdGUgdGhhdCBnbG9icyBhcmUgYWxsb3dlZCB0byByZWZlcmVuY2UKKyAgICAgICAgdGhlIGNvbnRlbnRzIG9mIG5vbi1wYWNrYWdlIHN1YmRpcmVjdG9yaWVzLCBhcyBsb25nIGFzIHlvdSB1c2UgJy8nIGFzCisgICAgICAgIGEgcGF0aCBzZXBhcmF0b3IuICAoR2xvYnMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvCisgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHBhdGhzIGF0IHJ1bnRpbWUuKQorCisgICAgSW4gYWRkaXRpb24gdG8gdGhlc2UgbmV3IGtleXdvcmRzLCB0aGlzIGNsYXNzIGFsc28gaGFzIHNldmVyYWwgbmV3IG1ldGhvZHMKKyAgICBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkaXN0cmlidXRpb24ncyBjb250ZW50cy4gIEZvciBleGFtcGxlLCB0aGUgJ2luY2x1ZGUoKScKKyAgICBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBpbi1wbGFjZSBhZGQgYW5kIHN1YnRyYWN0CisgICAgY29tbWFuZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBleHRlbnNpb25zLCBhbmQgc28gb24gZnJvbQorICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGV5IGFyZSB1c2VkIGJ5IHRoZSBmZWF0dXJlIHN1YnN5c3RlbSB0byBjb25maWd1cmUgdGhlCisgICAgZGlzdHJpYnV0aW9uIGZvciB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGZlYXR1cmVzLgorICAgICIiIgorCisgICAgX3BhdGNoZWRfZGlzdCA9IE5vbmUKKworICAgIGRlZiBwYXRjaF9taXNzaW5nX3BrZ19pbmZvKHNlbGYsIGF0dHJzKToKKyAgICAgICAgIyBGYWtlIHVwIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkYXRhIHRoYXQgd291bGQgbm9ybWFsbHkgY29tZSBmcm9tCisgICAgICAgICMgUEtHLUlORk8sIGJ1dCB3aGljaCBtaWdodCBub3QgeWV0IGJlIGJ1aWx0IGlmIHRoaXMgaXMgYSBmcmVzaAorICAgICAgICAjIGNoZWNrb3V0LgorICAgICAgICAjCisgICAgICAgIGlmIG5vdCBhdHRycyBvciAnbmFtZScgbm90IGluIGF0dHJzIG9yICd2ZXJzaW9uJyBub3QgaW4gYXR0cnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAga2V5ID0gcGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc3RyKGF0dHJzWyduYW1lJ10pKS5sb3dlcigpCisgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmJ5X2tleS5nZXQoa2V5KQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CisgICAgICAgICAgICBkaXN0Ll92ZXJzaW9uID0gcGtnX3Jlc291cmNlcy5zYWZlX3ZlcnNpb24oc3RyKGF0dHJzWyd2ZXJzaW9uJ10pKQorICAgICAgICAgICAgc2VsZi5fcGF0Y2hlZF9kaXN0ID0gZGlzdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgaGF2ZV9wYWNrYWdlX2RhdGEgPSBoYXNhdHRyKHNlbGYsICJwYWNrYWdlX2RhdGEiKQorICAgICAgICBpZiBub3QgaGF2ZV9wYWNrYWdlX2RhdGE6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHt9CisgICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFtdCisgICAgICAgIHNlbGYuZmVhdHVyZXMgPSB7fQorICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQorICAgICAgICBzZWxmLnBhdGNoX21pc3NpbmdfcGtnX2luZm8oYXR0cnMpCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW55IGVnZ3MgbmVlZGVkIHRvIGludGVycHJldCAnYXR0cnMnCisgICAgICAgIGlmIGF0dHJzIGFuZCAnZGVwZW5kZW5jeV9saW5rcycgaW4gYXR0cnM6CisgICAgICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBhdHRycy5wb3AoJ2RlcGVuZGVuY3lfbGlua3MnKQorICAgICAgICAgICAgYXNzZXJ0X3N0cmluZ19saXN0KHNlbGYsJ2RlcGVuZGVuY3lfbGlua3MnLHNlbGYuZGVwZW5kZW5jeV9saW5rcykKKyAgICAgICAgaWYgYXR0cnMgYW5kICdzZXR1cF9yZXF1aXJlcycgaW4gYXR0cnM6CisgICAgICAgICAgICBzZWxmLmZldGNoX2J1aWxkX2VnZ3MoYXR0cnMucG9wKCdzZXR1cF9yZXF1aXJlcycpKQorICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLGVwLm5hbWUpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZixlcC5uYW1lLE5vbmUpCisgICAgICAgIF9EaXN0cmlidXRpb24uX19pbml0X18oc2VsZixhdHRycykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1ldGFkYXRhLnZlcnNpb24sIChpbnQsbG9uZyxmbG9hdCkpOgorICAgICAgICAgICAgIyBTb21lIHBlb3BsZSBhcHBhcmVudGx5IHRha2UgInZlcnNpb24gbnVtYmVyIiB0b28gbGl0ZXJhbGx5IDopCisgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBzdHIoc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQorCisgICAgZGVmIHBhcnNlX2NvbW1hbmRfbGluZShzZWxmKToKKyAgICAgICAgIiIiUHJvY2VzcyBmZWF0dXJlcyBhZnRlciBwYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCisgICAgICAgIHJlc3VsdCA9IF9EaXN0cmlidXRpb24ucGFyc2VfY29tbWFuZF9saW5lKHNlbGYpCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLl9maW5hbGl6ZV9mZWF0dXJlcygpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfZmVhdHVyZV9hdHRybmFtZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJDb252ZXJ0IGZlYXR1cmUgbmFtZSB0byBjb3JyZXNwb25kaW5nIG9wdGlvbiBhdHRyaWJ1dGUgbmFtZSIiIgorICAgICAgICByZXR1cm4gJ3dpdGhfJytuYW1lLnJlcGxhY2UoJy0nLCdfJykKKworICAgIGRlZiBmZXRjaF9idWlsZF9lZ2dzKHNlbGYsIHJlcXVpcmVzKToKKyAgICAgICAgIiIiUmVzb2x2ZSBwcmUtc2V0dXAgcmVxdWlyZW1lbnRzIiIiCisgICAgICAgIGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgd29ya2luZ19zZXQsIHBhcnNlX3JlcXVpcmVtZW50cworICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldC5yZXNvbHZlKAorICAgICAgICAgICAgcGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKSwgaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnCisgICAgICAgICk6CisgICAgICAgICAgICB3b3JraW5nX3NldC5hZGQoZGlzdCkKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfRGlzdHJpYnV0aW9uLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKCkKKworICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZixlcC5uYW1lLE5vbmUpCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKKyAgICAgICAgICAgICAgICBlcC5sb2FkKCkoc2VsZiwgZXAubmFtZSwgdmFsdWUpCisKKyAgICBkZWYgZmV0Y2hfYnVpbGRfZWdnKHNlbGYsIHJlcSk6CisgICAgICAgICIiIkZldGNoIGFuIGVnZyBuZWVkZWQgZm9yIGJ1aWxkaW5nIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZCA9IHNlbGYuX2VnZ19mZXRjaGVyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCisgICAgICAgICAgICBkaXN0ID0gc2VsZi5fX2NsYXNzX18oeydzY3JpcHRfYXJncyc6WydlYXN5X2luc3RhbGwnXX0pCisgICAgICAgICAgICBkaXN0LnBhcnNlX2NvbmZpZ19maWxlcygpCisgICAgICAgICAgICBvcHRzID0gZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCisgICAgICAgICAgICBrZWVwID0gKAorICAgICAgICAgICAgICAgICdmaW5kX2xpbmtzJywgJ3NpdGVfZGlycycsICdpbmRleF91cmwnLCAnb3B0aW1pemUnLAorICAgICAgICAgICAgICAgICdzaXRlX2RpcnMnLCAnYWxsb3dfaG9zdHMnCisgICAgICAgICAgICApCisgICAgICAgICAgICBmb3Iga2V5IGluIG9wdHMua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4ga2VlcDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIG9wdHNba2V5XSAgICMgZG9uJ3QgdXNlIGFueSBvdGhlciBzZXR0aW5ncworICAgICAgICAgICAgaWYgc2VsZi5kZXBlbmRlbmN5X2xpbmtzOgorICAgICAgICAgICAgICAgIGxpbmtzID0gc2VsZi5kZXBlbmRlbmN5X2xpbmtzWzpdCisgICAgICAgICAgICAgICAgaWYgJ2ZpbmRfbGlua3MnIGluIG9wdHM6CisgICAgICAgICAgICAgICAgICAgIGxpbmtzID0gb3B0c1snZmluZF9saW5rcyddWzFdLnNwbGl0KCkgKyBsaW5rcworICAgICAgICAgICAgICAgIG9wdHNbJ2ZpbmRfbGlua3MnXSA9ICgnc2V0dXAnLCBsaW5rcykKKyAgICAgICAgICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKKyAgICAgICAgICAgICAgICBkaXN0LCBhcmdzPVsieCJdLCBpbnN0YWxsX2Rpcj1vcy5jdXJkaXIsIGV4Y2x1ZGVfc2NyaXB0cz1UcnVlLAorICAgICAgICAgICAgICAgIGFsd2F5c19jb3B5PUZhbHNlLCBidWlsZF9kaXJlY3Rvcnk9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgdXBncmFkZT1GYWxzZSwgbXVsdGlfdmVyc2lvbj1UcnVlLCBub19yZXBvcnQgPSBUcnVlCisgICAgICAgICAgICApCisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgICAgICBzZWxmLl9lZ2dfZmV0Y2hlciA9IGNtZAorICAgICAgICByZXR1cm4gY21kLmVhc3lfaW5zdGFsbChyZXEpCisKKyAgICBkZWYgX3NldF9nbG9iYWxfb3B0c19mcm9tX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJBZGQgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyBiYXNlZCBvbiBvcHRpb25hbCBmZWF0dXJlcyIiIgorCisgICAgICAgIGdvID0gW10KKyAgICAgICAgbm8gPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKKworICAgICAgICBmb3IgbmFtZSxmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsTm9uZSkKKyAgICAgICAgICAgIGZlYXR1cmUudmFsaWRhdGUoc2VsZikKKworICAgICAgICAgICAgaWYgZmVhdHVyZS5vcHRpb25hbDoKKyAgICAgICAgICAgICAgICBkZXNjciA9IGZlYXR1cmUuZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICBpbmNkZWYgPSAnIChkZWZhdWx0KScKKyAgICAgICAgICAgICAgICBleGNkZWY9JycKKyAgICAgICAgICAgICAgICBpZiBub3QgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKToKKyAgICAgICAgICAgICAgICAgICAgZXhjZGVmLCBpbmNkZWYgPSBpbmNkZWYsIGV4Y2RlZgorCisgICAgICAgICAgICAgICAgZ28uYXBwZW5kKCgnd2l0aC0nK25hbWUsIE5vbmUsICdpbmNsdWRlICcrZGVzY3IraW5jZGVmKSkKKyAgICAgICAgICAgICAgICBnby5hcHBlbmQoKCd3aXRob3V0LScrbmFtZSwgTm9uZSwgJ2V4Y2x1ZGUgJytkZXNjcitleGNkZWYpKQorICAgICAgICAgICAgICAgIG5vWyd3aXRob3V0LScrbmFtZV0gPSAnd2l0aC0nK25hbWUKKworICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5mZWF0dXJlX29wdGlvbnMgPSBnbyArIHNlbGYuZ2xvYmFsX29wdGlvbnMKKyAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLmZlYXR1cmVfbmVnb3B0ID0gbm8KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX2ZpbmFsaXplX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICAiIiJBZGQvcmVtb3ZlIGZlYXR1cmVzIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW0iIiIKKworICAgICAgICAjIEZpcnN0LCBmbGFnIGFsbCB0aGUgZW5hYmxlZCBpdGVtcyAoYW5kIHRodXMgdGhlaXIgZGVwZW5kZW5jaWVzKQorICAgICAgICBmb3IgbmFtZSxmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGVuYWJsZWQgPSBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSkKKyAgICAgICAgICAgIGlmIGVuYWJsZWQgb3IgKGVuYWJsZWQgaXMgTm9uZSBhbmQgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKSk6CisgICAgICAgICAgICAgICAgZmVhdHVyZS5pbmNsdWRlX2luKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwxKQorCisgICAgICAgICMgVGhlbiBkaXNhYmxlIHRoZSByZXN0LCBzbyB0aGF0IG9mZi1ieS1kZWZhdWx0IGZlYXR1cmVzIGRvbid0CisgICAgICAgICMgZ2V0IGZsYWdnZWQgYXMgZXJyb3JzIHdoZW4gdGhleSdyZSByZXF1aXJlZCBieSBhbiBlbmFibGVkIGZlYXR1cmUKKyAgICAgICAgZm9yIG5hbWUsZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpOgorICAgICAgICAgICAgICAgIGZlYXR1cmUuZXhjbHVkZV9mcm9tKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwwKQorCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIlBsdWdnYWJsZSB2ZXJzaW9uIG9mIGdldF9jb21tYW5kX2NsYXNzKCkiIiIKKyAgICAgICAgaWYgY29tbWFuZCBpbiBzZWxmLmNtZGNsYXNzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21kY2xhc3NbY29tbWFuZF0KKworICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyxjb21tYW5kKToKKyAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQorICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tjb21tYW5kXSA9IGNtZGNsYXNzID0gZXAubG9hZCgpCisgICAgICAgICAgICByZXR1cm4gY21kY2xhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpCisKKyAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CisgICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKKyAgICAgICAgICAgIGlmIGVwLm5hbWUgbm90IGluIHNlbGYuY21kY2xhc3M6CisgICAgICAgICAgICAgICAgY21kY2xhc3MgPSBlcC5sb2FkKEZhbHNlKSAjIGRvbid0IHJlcXVpcmUgZXh0cmFzLCB3ZSdyZSBub3QgcnVubmluZworICAgICAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbZXAubmFtZV0gPSBjbWRjbGFzcworICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5wcmludF9jb21tYW5kcyhzZWxmKQorCisKKworCisKKyAgICBkZWYgX3NldF9mZWF0dXJlKHNlbGYsbmFtZSxzdGF0dXMpOgorICAgICAgICAiIiJTZXQgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMiIiIKKyAgICAgICAgc2V0YXR0cihzZWxmLHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSksc3RhdHVzKQorCisgICAgZGVmIGZlYXR1cmVfaXNfaW5jbHVkZWQoc2VsZixuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIDEgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCwgMCBpZiBleGNsdWRlZCwgJ05vbmUnIGlmIHVua25vd24iIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZixzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpKQorCisgICAgZGVmIGluY2x1ZGVfZmVhdHVyZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJSZXF1ZXN0IGluY2x1c2lvbiBvZiBmZWF0dXJlIG5hbWVkICduYW1lJyIiIgorCisgICAgICAgIGlmIHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKT09MDoKKyAgICAgICAgICAgIGRlc2NyID0gc2VsZi5mZWF0dXJlc1tuYW1lXS5kZXNjcmlwdGlvbgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICBkZXNjciArICIgaXMgcmVxdWlyZWQsIGJ1dCB3YXMgZXhjbHVkZWQgb3IgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgKQorICAgICAgICBzZWxmLmZlYXR1cmVzW25hbWVdLmluY2x1ZGVfaW4oc2VsZikKKyAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwxKQorCisgICAgZGVmIGluY2x1ZGUoc2VsZiwqKmF0dHJzKToKKyAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCBhZGQgJ3gnIHRvCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLCBpZiBpdCB3YXMgbm90IGFscmVhZHkKKyAgICAgICAgdGhlcmUuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGluY2x1c2lvbiBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZQorICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgYWRkaW5nIHRvIG90aGVyCisgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2luY2x1ZGVfWCcgbWV0aG9kLAorICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdpbmNsdWRlKCknLiAgU28sICdkaXN0LmluY2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJworICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9pbmNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCisgICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGluY2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBmb3Igayx2IGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBpbmNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2luY2x1ZGVfJytrLCBOb25lKQorICAgICAgICAgICAgaWYgaW5jbHVkZToKKyAgICAgICAgICAgICAgICBpbmNsdWRlKHYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2luY2x1ZGVfbWlzYyhrLHYpCisKKyAgICBkZWYgZXhjbHVkZV9wYWNrYWdlKHNlbGYscGFja2FnZSk6CisgICAgICAgICIiIlJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgaW4gbmFtZWQgcGFja2FnZSIiIgorCisgICAgICAgIHBmeCA9IHBhY2thZ2UrJy4nCisgICAgICAgIGlmIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gWworICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5wYWNrYWdlcworICAgICAgICAgICAgICAgICAgICBpZiBwPD5wYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKKyAgICAgICAgICAgIF0KKworICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBbCisgICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnB5X21vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgcDw+cGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCisgICAgICAgICAgICBdCisKKyAgICAgICAgaWYgc2VsZi5leHRfbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBbCisgICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLmV4dF9tb2R1bGVzCisgICAgICAgICAgICAgICAgICAgIGlmIHAubmFtZTw+cGFja2FnZSBhbmQgbm90IHAubmFtZS5zdGFydHN3aXRoKHBmeCkKKyAgICAgICAgICAgIF0KKworCisgICAgZGVmIGhhc19jb250ZW50c19mb3Ioc2VsZixwYWNrYWdlKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4Y2x1ZGVfcGFja2FnZShwYWNrYWdlKScgd291bGQgZG8gc29tZXRoaW5nIiIiCisKKyAgICAgICAgcGZ4ID0gcGFja2FnZSsnLicKKworICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKCk6CisgICAgICAgICAgICBpZiBwPT1wYWNrYWdlIG9yIHAuc3RhcnRzd2l0aChwZngpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX2V4Y2x1ZGVfbWlzYyhzZWxmLG5hbWUsdmFsdWUpOgorICAgICAgICAiIiJIYW5kbGUgJ2V4Y2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSxzZXF1ZW5jZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShvbGQsc2VxdWVuY2UpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICBuYW1lKyI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgorICAgICAgICAgICAgKQorICAgICAgICBlbGlmIG9sZDoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixuYW1lLFtpdGVtIGZvciBpdGVtIGluIG9sZCBpZiBpdGVtIG5vdCBpbiB2YWx1ZV0pCisKKyAgICBkZWYgX2luY2x1ZGVfbWlzYyhzZWxmLG5hbWUsdmFsdWUpOgorICAgICAgICAiIiJIYW5kbGUgJ2luY2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0ICglcikiICUgKG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsbmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQorICAgICAgICAgICAgKQorICAgICAgICBpZiBvbGQgaXMgTm9uZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixuYW1lLHZhbHVlKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9sZCxzZXF1ZW5jZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgIG5hbWUrIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsbmFtZSxvbGQrW2l0ZW0gZm9yIGl0ZW0gaW4gdmFsdWUgaWYgaXRlbSBub3QgaW4gb2xkXSkKKworICAgIGRlZiBleGNsdWRlKHNlbGYsKiphdHRycyk6CisgICAgICAgICIiIlJlbW92ZSBpdGVtcyBmcm9tIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgIEZvciBleGFtcGxlLCAnZGlzdC5leGNsdWRlKHB5X21vZHVsZXM9WyJ4Il0pJyB3b3VsZCByZW1vdmUgJ3gnIGZyb20KKyAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUuICBFeGNsdWRpbmcgcGFja2FnZXMgdXNlcworICAgICAgICB0aGUgJ2V4Y2x1ZGVfcGFja2FnZSgpJyBtZXRob2QsIHNvIGFsbCBvZiB0aGUgcGFja2FnZSdzIGNvbnRhaW5lZAorICAgICAgICBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbnMgYXJlIGFsc28gZXhjbHVkZWQuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGV4Y2x1c2lvbiBmcm9tIGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGV4Y2x1ZGluZyBmcm9tIG90aGVyCisgICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2V4Y2x1ZGVfWCcgbWV0aG9kLAorICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgdmFsdWUgcGFzc2VkIHRvICdleGNsdWRlKCknLiAgU28sICdkaXN0LmV4Y2x1ZGUoZm9vPXsiYmFyIjoiYmF6In0pJworICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9leGNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCisgICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGV4Y2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBmb3Igayx2IGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBleGNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2V4Y2x1ZGVfJytrLCBOb25lKQorICAgICAgICAgICAgaWYgZXhjbHVkZToKKyAgICAgICAgICAgICAgICBleGNsdWRlKHYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVfbWlzYyhrLHYpCisKKyAgICBkZWYgX2V4Y2x1ZGVfcGFja2FnZXMoc2VsZixwYWNrYWdlcyk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhY2thZ2VzLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgInBhY2thZ2VzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKHBhY2thZ2VzLCkKKyAgICAgICAgICAgICkKKyAgICAgICAgbWFwKHNlbGYuZXhjbHVkZV9wYWNrYWdlLCBwYWNrYWdlcykKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpOgorICAgICAgICAjIFJlbW92ZSAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIHdoZW4gcHJvY2Vzc2luZyBjb21tYW5kIGFyZ3MKKyAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuX19jbGFzc19fLmdsb2JhbF9vcHRpb25zCisgICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5fX2NsYXNzX18ubmVnYXRpdmVfb3B0CisKKyAgICAgICAgIyBGaXJzdCwgZXhwYW5kIGFueSBhbGlhc2VzCisgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCisgICAgICAgIGFsaWFzZXMgPSBzZWxmLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCisgICAgICAgIHdoaWxlIGNvbW1hbmQgaW4gYWxpYXNlczoKKyAgICAgICAgICAgIHNyYyxhbGlhcyA9IGFsaWFzZXNbY29tbWFuZF0KKyAgICAgICAgICAgIGRlbCBhbGlhc2VzW2NvbW1hbmRdICAgICMgZW5zdXJlIGVhY2ggYWxpYXMgY2FuIGV4cGFuZCBvbmx5IG9uY2UhCisgICAgICAgICAgICBpbXBvcnQgc2hsZXgKKyAgICAgICAgICAgIGFyZ3NbOjFdID0gc2hsZXguc3BsaXQoYWxpYXMsVHJ1ZSkKKyAgICAgICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCisKKyAgICAgICAgbmFyZ3MgPSBfRGlzdHJpYnV0aW9uLl9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKQorCisgICAgICAgICMgSGFuZGxlIGNvbW1hbmRzIHRoYXQgd2FudCB0byBjb25zdW1lIGFsbCByZW1haW5pbmcgYXJndW1lbnRzCisgICAgICAgIGNtZF9jbGFzcyA9IHNlbGYuZ2V0X2NvbW1hbmRfY2xhc3MoY29tbWFuZCkKKyAgICAgICAgaWYgZ2V0YXR0cihjbWRfY2xhc3MsJ2NvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzJyxOb25lKToKKyAgICAgICAgICAgIHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpWydhcmdzJ10gPSAoImNvbW1hbmQgbGluZSIsIG5hcmdzKQorICAgICAgICAgICAgaWYgbmFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgcmV0dXJuIG5hcmdzCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgZ2V0X2NtZGxpbmVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgJ3tjbWQ6IHtvcHQ6dmFsfX0nIG1hcCBvZiBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMKKworICAgICAgICBPcHRpb24gbmFtZXMgYXJlIGFsbCBsb25nLCBidXQgZG8gbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgJy0tJywgYW5kCisgICAgICAgIGNvbnRhaW4gZGFzaGVzIHJhdGhlciB0aGFuIHVuZGVyc2NvcmVzLiAgSWYgdGhlIG9wdGlvbiBkb2Vzbid0IHRha2UKKyAgICAgICAgYW4gYXJndW1lbnQgKGUuZy4gJy0tcXVpZXQnKSwgdGhlICd2YWwnIGlzICdOb25lJy4KKworICAgICAgICBOb3RlIHRoYXQgb3B0aW9ucyBwcm92aWRlZCBieSBjb25maWcgZmlsZXMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQuCisgICAgICAgICIiIgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBjbWQsb3B0cyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9ucy5pdGVtcygpOgorCisgICAgICAgICAgICBmb3Igb3B0LChzcmMsdmFsKSBpbiBvcHRzLml0ZW1zKCk6CisKKyAgICAgICAgICAgICAgICBpZiBzcmMgIT0gImNvbW1hbmQgbGluZSI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnXycsJy0nKQorCisgICAgICAgICAgICAgICAgaWYgdmFsPT0wOgorICAgICAgICAgICAgICAgICAgICBjbWRvYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjbWQpCisgICAgICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKKyAgICAgICAgICAgICAgICAgICAgbmVnX29wdC51cGRhdGUoZ2V0YXR0cihjbWRvYmosJ25lZ2F0aXZlX29wdCcse30pKQorICAgICAgICAgICAgICAgICAgICBmb3IgbmVnLHBvcyBpbiBuZWdfb3B0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3M9PW9wdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQ9bmVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsPU5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlIikKKworICAgICAgICAgICAgICAgIGVsaWYgdmFsPT0xOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSBOb25lCisKKyAgICAgICAgICAgICAgICBkLnNldGRlZmF1bHQoY21kLHt9KVtvcHRdID0gdmFsCisKKyAgICAgICAgcmV0dXJuIGQKKworCisgICAgZGVmIGl0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJZaWVsZCBhbGwgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb24gbmFtZXMgaW4gZGlzdHJpYnV0aW9uIiIiCisKKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgorICAgICAgICAgICAgeWllbGQgcGtnCisKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLnB5X21vZHVsZXMgb3IgKCk6CisgICAgICAgICAgICB5aWVsZCBtb2R1bGUKKworICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0X21vZHVsZXMgb3IgKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCx0dXBsZSk6CisgICAgICAgICAgICAgICAgbmFtZSxidWlsZGluZm8gPSBleHQKKyAgICAgICAgICAgICAgICB5aWVsZCBuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGV4dC5uYW1lCisKKyMgSW5zdGFsbCBpdCB0aHJvdWdob3V0IHRoZSBkaXN0dXRpbHMKK2ZvciBtb2R1bGUgaW4gZGlzdHV0aWxzLmRpc3QsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuY21kOgorICAgIG1vZHVsZS5EaXN0cmlidXRpb24gPSBEaXN0cmlidXRpb24KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgRmVhdHVyZToKKyAgICAiIiJBIHN1YnNldCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIGV4Y2x1ZGVkIGlmIHVubmVlZGVkL3dhbnRlZAorCisgICAgRmVhdHVyZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlc2Uga2V5d29yZCBhcmd1bWVudHM6CisKKyAgICAgICdkZXNjcmlwdGlvbicgLS0gYSBzaG9ydCwgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUsIHRvCisgICAgICAgICBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLCBhbmQgb3B0aW9uIGhlbHAgbWVzc2FnZXMuCisKKyAgICAgICdzdGFuZGFyZCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBpZiBpdCBpcworICAgICAgICAgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIE90aGVyd2lzZSwgdGhlIGZlYXR1cmUgaXMgb25seQorICAgICAgICAgaW5jbHVkZWQgaWYgcmVxdWVzdGVkIHZpYSBhIGNvbW1hbmQgbGluZSAnLS13aXRoLVgnIG9wdGlvbiwgb3IgaWYKKyAgICAgICAgIGFub3RoZXIgaW5jbHVkZWQgZmVhdHVyZSByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ0ZhbHNlJy4KKworICAgICAgJ2F2YWlsYWJsZScgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGZvciBpbnN0YWxsYXRpb24gb24gdGhlCisgICAgICAgICBjdXJyZW50IHN5c3RlbS4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgorCisgICAgICAnb3B0aW9uYWwnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIGNhbiBiZSBjb250cm9sbGVkIGZyb20gdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUsIHVzaW5nIHRoZSAnLS13aXRoLVgnIG9yICctLXdpdGhvdXQtWCcgb3B0aW9ucy4gIElmCisgICAgICAgICBmYWxzZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKKyAgICAgICAgIGJhc2VkIG9uICdhdmFpbGFiaWxlJywgJ3N0YW5kYXJkJywgYW5kIHdoZXRoZXIgYW55IG90aGVyIGZlYXR1cmUKKyAgICAgICAgIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCisKKyAgICAgICdyZXF1aXJlX2ZlYXR1cmVzJyAtLSBhIHN0cmluZyBvciBzZXF1ZW5jZSBvZiBzdHJpbmdzIG5hbWluZyBmZWF0dXJlcworICAgICAgICAgdGhhdCBzaG91bGQgYWxzbyBiZSBpbmNsdWRlZCBpZiB0aGlzIGZlYXR1cmUgaXMgaW5jbHVkZWQuICBEZWZhdWx0cyB0bworICAgICAgICAgZW1wdHkgbGlzdC4gIE1heSBhbHNvIGNvbnRhaW4gJ1JlcXVpcmUnIG9iamVjdHMgdGhhdCBzaG91bGQgYmUKKyAgICAgICAgIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgICAncmVtb3ZlJyAtLSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIHBhY2thZ2VzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgKm5vdCogaW5jbHVkZWQuICBJZiB0aGUKKyAgICAgICAgIGZlYXR1cmUgKmlzKiBpbmNsdWRlZCwgdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhpcyBhcmd1bWVudCBleGlzdHMKKyAgICAgICAgIHRvIHN1cHBvcnQgcmVtb3ZpbmcgZmVhdHVyZXMgdGhhdCAiY3Jvc3NjdXQiIGEgZGlzdHJpYnV0aW9uLCBzdWNoIGFzCisgICAgICAgICBkZWZpbmluZyBhICd0ZXN0cycgZmVhdHVyZSB0aGF0IHJlbW92ZXMgYWxsIHRoZSAndGVzdHMnIHN1YnBhY2thZ2VzCisgICAgICAgICBwcm92aWRlZCBieSBvdGhlciBmZWF0dXJlcy4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGFyZ3VtZW50IGlzIGFuIGVtcHR5CisgICAgICAgICBsaXN0LiAgKE5vdGU6IHRoZSBuYW1lZCBwYWNrYWdlKHMpIG9yIG1vZHVsZXMgbXVzdCBleGlzdCBpbiB0aGUgYmFzZQorICAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyBpbml0aWFsbHkgY2FsbGVkLikKKworICAgICAgb3RoZXIga2V5d29yZHMgLS0gYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzYXZlZCwgYW5kIHBhc3NlZCB0bworICAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdpbmNsdWRlKCknIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIHdoZW4gdGhlCisgICAgICAgICBmZWF0dXJlIGlzIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLCByZXNwZWN0aXZlbHkuICBTbywgZm9yIGV4YW1wbGUsIHlvdQorICAgICAgICAgY291bGQgcGFzcyAncGFja2FnZXM9WyJhIiwiYiJdJyB0byBjYXVzZSBwYWNrYWdlcyAnYScgYW5kICdiJyB0byBiZQorICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24gYXMgYXBwcm9wcmlhdGUuCisKKyAgICBBIGZlYXR1cmUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSAncmVxdWlyZXMnLCAncmVtb3ZlJywgb3Igb3RoZXIKKyAgICBrZXl3b3JkIGFyZ3VtZW50LiAgT3RoZXJ3aXNlLCBpdCBjYW4ndCBhZmZlY3QgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhbnkgd2F5LgorICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc3ViY2xhc3MgJ0ZlYXR1cmUnIHRvIGNyZWF0ZSB5b3VyIG93biBzcGVjaWFsaXplZAorICAgIGZlYXR1cmUgdHlwZXMgdGhhdCBtb2RpZnkgdGhlIGRpc3RyaWJ1dGlvbiBpbiBvdGhlciB3YXlzIHdoZW4gaW5jbHVkZWQgb3IKKyAgICBleGNsdWRlZC4gIFNlZSB0aGUgZG9jc3RyaW5ncyBmb3IgdGhlIHZhcmlvdXMgbWV0aG9kcyBoZXJlIGZvciBtb3JlIGRldGFpbC4KKyAgICBBc2lkZSBmcm9tIHRoZSBtZXRob2RzLCB0aGUgb25seSBmZWF0dXJlIGF0dHJpYnV0ZXMgdGhhdCBkaXN0cmlidXRpb25zIGxvb2sKKyAgICBhdCBhcmUgJ2Rlc2NyaXB0aW9uJyBhbmQgJ29wdGlvbmFsJy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzY3JpcHRpb24sIHN0YW5kYXJkPUZhbHNlLCBhdmFpbGFibGU9VHJ1ZSwKKyAgICAgICAgb3B0aW9uYWw9VHJ1ZSwgcmVxdWlyZV9mZWF0dXJlcz0oKSwgcmVtb3ZlPSgpLCAqKmV4dHJhcworICAgICk6CisKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisgICAgICAgIHNlbGYuc3RhbmRhcmQgPSBzdGFuZGFyZAorICAgICAgICBzZWxmLmF2YWlsYWJsZSA9IGF2YWlsYWJsZQorICAgICAgICBzZWxmLm9wdGlvbmFsID0gb3B0aW9uYWwKKyAgICAgICAgaWYgaXNpbnN0YW5jZShyZXF1aXJlX2ZlYXR1cmVzLChzdHIsUmVxdWlyZSkpOgorICAgICAgICAgICAgcmVxdWlyZV9mZWF0dXJlcyA9IHJlcXVpcmVfZmVhdHVyZXMsCisKKyAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gWworICAgICAgICAgICAgciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIGlzaW5zdGFuY2UocixzdHIpCisgICAgICAgIF0KKyAgICAgICAgZXIgPSBbciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIG5vdCBpc2luc3RhbmNlKHIsc3RyKV0KKyAgICAgICAgaWYgZXI6IGV4dHJhc1sncmVxdWlyZV9mZWF0dXJlcyddID0gZXIKKworICAgICAgICBpZiBpc2luc3RhbmNlKHJlbW92ZSxzdHIpOgorICAgICAgICAgICAgcmVtb3ZlID0gcmVtb3ZlLAorICAgICAgICBzZWxmLnJlbW92ZSA9IHJlbW92ZQorICAgICAgICBzZWxmLmV4dHJhcyA9IGV4dHJhcworCisgICAgICAgIGlmIG5vdCByZW1vdmUgYW5kIG5vdCByZXF1aXJlX2ZlYXR1cmVzIGFuZCBub3QgZXh0cmFzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiRmVhdHVyZSAlczogbXVzdCBkZWZpbmUgJ3JlcXVpcmVfZmVhdHVyZXMnLCAncmVtb3ZlJywgb3IgYXQgbGVhc3Qgb25lIgorICAgICAgICAgICAgICAgICIgb2YgJ3BhY2thZ2VzJywgJ3B5X21vZHVsZXMnLCBldGMuIgorICAgICAgICAgICAgKQorCisgICAgZGVmIGluY2x1ZGVfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgIiIiU2hvdWxkIHRoaXMgZmVhdHVyZSBiZSBpbmNsdWRlZCBieSBkZWZhdWx0PyIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdmFpbGFibGUgYW5kIHNlbGYuc3RhbmRhcmQKKworICAgIGRlZiBpbmNsdWRlX2luKHNlbGYsZGlzdCk6CisKKyAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgYW5kIGl0cyByZXF1aXJlbWVudHMgYXJlIGluY2x1ZGVkIGluIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgICAgICBwZXIgZmVhdHVyZSwgYW5kIHNvIHNob3VsZCBiZSBpZGVtcG90ZW50LgorCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCBzZWxmLmF2YWlsYWJsZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbisiIGlzIHJlcXVpcmVkLCIKKyAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKKyAgICAgICAgICAgICkKKworICAgICAgICBkaXN0LmluY2x1ZGUoKipzZWxmLmV4dHJhcykKKworICAgICAgICBmb3IgZiBpbiBzZWxmLnJlcXVpcmVfZmVhdHVyZXM6CisgICAgICAgICAgICBkaXN0LmluY2x1ZGVfZmVhdHVyZShmKQorCisKKworICAgIGRlZiBleGNsdWRlX2Zyb20oc2VsZixkaXN0KToKKworICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBpcyBleGNsdWRlZCBmcm9tIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCisgICAgICAgIHRoZSBkaXN0cmlidXRpb24uICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCisgICAgICAgIGZlYXR1cmUsIGFuZCBvbmx5IGFmdGVyIGFsbCBpbmNsdWRlZCBmZWF0dXJlcyBoYXZlIGJlZW4gYXNrZWQgdG8KKyAgICAgICAgaW5jbHVkZSB0aGVtc2VsdmVzLgorICAgICAgICAiIiIKKworICAgICAgICBkaXN0LmV4Y2x1ZGUoKipzZWxmLmV4dHJhcykKKworICAgICAgICBpZiBzZWxmLnJlbW92ZToKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgorICAgICAgICAgICAgICAgIGRpc3QuZXhjbHVkZV9wYWNrYWdlKGl0ZW0pCisKKworCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsZGlzdCk6CisKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgZmVhdHVyZSBtYWtlcyBzZW5zZSBpbiBjb250ZXh0IG9mIGRpc3RyaWJ1dGlvbgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGlzdHJpYnV0aW9uIGp1c3QgYmVmb3JlIGl0IHBhcnNlcyBpdHMKKyAgICAgICAgY29tbWFuZCBsaW5lLiAgSXQgY2hlY2tzIHRvIGVuc3VyZSB0aGF0IHRoZSAncmVtb3ZlJyBhdHRyaWJ1dGUsIGlmIGFueSwKKyAgICAgICAgY29udGFpbnMgb25seSB2YWxpZCBwYWNrYWdlL21vZHVsZSBuYW1lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBiYXNlCisgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuICdzZXR1cCgpJyBpcyBjYWxsZWQuICBZb3UgbWF5IG92ZXJyaWRlIGl0IGluIGEKKyAgICAgICAgc3ViY2xhc3MgdG8gcGVyZm9ybSBhbnkgb3RoZXIgcmVxdWlyZWQgdmFsaWRhdGlvbiBvZiB0aGUgZmVhdHVyZQorICAgICAgICBhZ2FpbnN0IGEgdGFyZ2V0IGRpc3RyaWJ1dGlvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CisgICAgICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKGl0ZW0pOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICIlcyB3YW50cyB0byBiZSBhYmxlIHRvIHJlbW92ZSAlcywgYnV0IHRoZSBkaXN0cmlidXRpb24iCisgICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBjb250YWluIGFueSBwYWNrYWdlcyBvciBtb2R1bGVzIHVuZGVyICVzIgorICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBpdGVtLCBpdGVtKQorICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weSBiL0xpYi9zZXR1cHRvb2xzL2V4dGVuc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNmNTViCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5CkBAIC0wLDAgKzEsMzUgQEAKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IEV4dGVuc2lvbiBhcyBfRXh0ZW5zaW9uCitmcm9tIGRpc3QgaW1wb3J0IF9nZXRfdW5wYXRjaGVkCitfRXh0ZW5zaW9uID0gX2dldF91bnBhdGNoZWQoX0V4dGVuc2lvbikKKwordHJ5OgorICAgIGZyb20gUHlyZXguRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV9weXJleCA9IEZhbHNlCitlbHNlOgorICAgIGhhdmVfcHlyZXggPSBUcnVlCisKKworY2xhc3MgRXh0ZW5zaW9uKF9FeHRlbnNpb24pOgorICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKKworICAgIGlmIG5vdCBoYXZlX3B5cmV4OgorICAgICAgICAjIGNvbnZlcnQgLnB5eCBleHRlbnNpb25zIHRvIC5jCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpCisgICAgICAgICAgICBzb3VyY2VzID0gW10KKyAgICAgICAgICAgIGZvciBzIGluIHNlbGYuc291cmNlczoKKyAgICAgICAgICAgICAgICBpZiBzLmVuZHN3aXRoKCcucHl4Jyk6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKHNbOi0zXSsnYycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hcHBlbmQocykKKyAgICAgICAgICAgIHNlbGYuc291cmNlcyA9IHNvdXJjZXMKKworY2xhc3MgTGlicmFyeShFeHRlbnNpb24pOgorICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKKworaW1wb3J0IHN5cywgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5leHRlbnNpb24KK2Rpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgorZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBFeHRlbnNpb24KK2lmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgorICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSBFeHRlbnNpb24KZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2d1aS5leGUgYi9MaWIvc2V0dXB0b29scy9ndWkuZXhlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZmYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9ndWkuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkgYi9MaWIvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwN2UyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5CkBAIC0wLDAgKzEsNjc0IEBACisiIiJQeVBJIGFuZCBkaXJlY3QgcGFja2FnZSBkb3dubG9hZGluZyIiIgorCitpbXBvcnQgc3lzLCBvcy5wYXRoLCByZSwgdXJscGFyc2UsIHVybGxpYjIsIHNodXRpbCwgcmFuZG9tLCBzb2NrZXQKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgorZnJvbSBtZDUgaW1wb3J0IG1kNQorZnJvbSBmbm1hdGNoIGltcG9ydCB0cmFuc2xhdGUKKworRUdHX0ZSQUdNRU5UID0gcmUuY29tcGlsZShyJ15lZ2c9KFstQS1aYS16MC05Xy5dKykkJykKK0hSRUYgPSByZS5jb21waWxlKCIiImhyZWZcXHMqPVxccypbJyJdPyhbXiciPiBdKykiIiIsIHJlLkkpCisjIHRoaXMgaXMgaGVyZSB0byBmaXggZW1hY3MnIGNydWRkeSBicm9rZW4gc3ludGF4IGhpZ2hsaWdodGluZworUFlQSV9NRDUgPSByZS5jb21waWxlKAorICAgICc8YSBocmVmPSIoW14iI10rKSI+KFtePF0rKTwvYT5cblxzK1xcKDxhIGhyZWY9IlteP10rXD86YWN0aW9uPXNob3dfbWQ1JworICAgICcmYW1wO2RpZ2VzdD0oWzAtOWEtZl17MzJ9KSI+bWQ1PC9hPlxcKScKKykKKworVVJMX1NDSEVNRSA9IHJlLmNvbXBpbGUoJyhbLSsuYS16MC05XXsyLH0pOicscmUuSSkubWF0Y2gKK0VYVEVOU0lPTlMgPSAiLnRhci5neiAudGFyLmJ6MiAudGFyIC56aXAgLnRneiIuc3BsaXQoKQorCitfX2FsbF9fID0gWworICAgICdQYWNrYWdlSW5kZXgnLCAnZGlzdHJvc19mb3JfdXJsJywgJ3BhcnNlX2JkaXN0X3dpbmluc3QnLAorICAgICdpbnRlcnByZXRfZGlzdHJvX25hbWUnLAorXQorCisKK2RlZiBwYXJzZV9iZGlzdF93aW5pbnN0KG5hbWUpOgorICAgICIiIlJldHVybiAoYmFzZSxweXZlcnNpb24pIG9yIChOb25lLE5vbmUpIGZvciBwb3NzaWJsZSAuZXhlIG5hbWUiIiIKKworICAgIGxvd2VyID0gbmFtZS5sb3dlcigpCisgICAgYmFzZSwgcHlfdmVyID0gTm9uZSwgTm9uZQorCisgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5leGUnKToKKyAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4zMi5leGUnKToKKyAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTBdCisgICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbjMyLXB5JywtMTYpOgorICAgICAgICAgICAgcHlfdmVyID0gbmFtZVstNzotNF0KKyAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTZdCisKKyAgICByZXR1cm4gYmFzZSxweV92ZXIKKworZGVmIGVnZ19pbmZvX2Zvcl91cmwodXJsKToKKyAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgIGJhc2UgPSB1cmxsaWIyLnVucXVvdGUocGF0aC5zcGxpdCgnLycpWy0xXSkKKyAgICBpZiAnIycgaW4gYmFzZTogYmFzZSwgZnJhZ21lbnQgPSBiYXNlLnNwbGl0KCcjJywxKQorICAgIHJldHVybiBiYXNlLGZyYWdtZW50CisKK2RlZiBkaXN0cm9zX2Zvcl91cmwodXJsLCBtZXRhZGF0YT1Ob25lKToKKyAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIHRoYXQgbWlnaHQgYmUgZm91bmQgYXQgYSBVUkwiIiIKKyAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQorICAgIGRpc3RzID0gZGlzdHJvc19mb3JfbG9jYXRpb24odXJsLCBiYXNlLCBtZXRhZGF0YSkKKyAgICBpZiBmcmFnbWVudCBhbmQgbm90IGRpc3RzOgorICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAorICAgICAgICAgICAgICAgIHVybCwgbWF0Y2guZ3JvdXAoMSksIG1ldGFkYXRhLCBwcmVjZWRlbmNlID0gQ0hFQ0tPVVRfRElTVAorICAgICAgICAgICAgKQorICAgIHJldHVybiBkaXN0cworCitkZWYgZGlzdHJvc19mb3JfbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lKToKKyAgICAiIiJZaWVsZCBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGJhc2VuYW1lIiIiCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CisgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi00XSAgICAjIHN0cmlwIHRoZSAuemlwCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cnKTogICAjIG9ubHkgb25lLCB1bmFtYmlndW91cyBpbnRlcnByZXRhdGlvbgorICAgICAgICByZXR1cm4gW0Rpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpXQorCisgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5leGUnKToKKyAgICAgICAgd2luX2Jhc2UsIHB5X3ZlciA9IHBhcnNlX2JkaXN0X3dpbmluc3QoYmFzZW5hbWUpCisgICAgICAgIGlmIHdpbl9iYXNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZSgKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiwgd2luX2Jhc2UsIG1ldGFkYXRhLCBweV92ZXIsIEJJTkFSWV9ESVNULCAid2luMzIiCisgICAgICAgICAgICApCisKKyAgICAjIFRyeSBzb3VyY2UgZGlzdHJvIGV4dGVuc2lvbnMgKC56aXAsIC50Z3osIGV0Yy4pCisgICAgIworICAgIGZvciBleHQgaW4gRVhURU5TSU9OUzoKKyAgICAgICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoZXh0KToKKyAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi1sZW4oZXh0KV0KKyAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUobG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSkKKyAgICByZXR1cm4gW10gICMgbm8gZXh0ZW5zaW9uIG1hdGNoZWQKKworCitkZWYgZGlzdHJvc19mb3JfZmlsZW5hbWUoZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgorICAgICIiIllpZWxkIHBvc3NpYmxlIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYSBmaWxlbmFtZSIiIgorICAgIHJldHVybiBkaXN0cm9zX2Zvcl9sb2NhdGlvbigKKyAgICAgICAgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEKKyAgICApCisKKworZGVmIGludGVycHJldF9kaXN0cm9fbmFtZShsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhLAorICAgIHB5X3ZlcnNpb249Tm9uZSwgcHJlY2VkZW5jZT1TT1VSQ0VfRElTVCwgcGxhdGZvcm09Tm9uZQorKToKKyAgICAiIiJHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKKworICAgIE5vdGU6IGlmIGBsb2NhdGlvbmAgaXMgYSBmaWxlc3lzdGVtIGZpbGVuYW1lLCB5b3Ugc2hvdWxkIGNhbGwKKyAgICBgYHBrZ19yZXNvdXJjZXMubm9ybWFsaXplX3BhdGgoKWBgIG9uIGl0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMKKyAgICByb3V0aW5lIQorICAgICIiIgorCisgICAgIyBHZW5lcmF0ZSBhbHRlcm5hdGl2ZSBpbnRlcnByZXRhdGlvbnMgb2YgYSBzb3VyY2UgZGlzdHJvIG5hbWUKKyAgICAjIEJlY2F1c2Ugc29tZSBwYWNrYWdlcyBhcmUgYW1iaWd1b3VzIGFzIHRvIG5hbWUvdmVyc2lvbnMgc3BsaXQKKyAgICAjIGUuZy4gImFkbnMtcHl0aG9uLTEuMS4wIiwgImVnZW5peC1teC1jb21tZXJjaWFsIiwgZXRjLgorICAgICMgU28sIHdlIGdlbmVyYXRlIGVhY2ggcG9zc2libGUgaW50ZXJlcHJldGF0aW9uIChlLmcuICJhZG5zLCBweXRob24tMS4xLjAiCisgICAgIyAiYWRucy1weXRob24sIDEuMS4wIiwgYW5kICJhZG5zLXB5dGhvbi0xLjEuMCwgbm8gdmVyc2lvbiIpLiAgSW4gcHJhY3RpY2UsCisgICAgIyB0aGUgc3B1cmlvdXMgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpZ25vcmVkLCBiZWNhdXNlIGluIHRoZSBldmVudAorICAgICMgdGhlcmUncyBhbHNvIGFuICJhZG5zIiBwYWNrYWdlLCB0aGUgc3B1cmlvdXMgInB5dGhvbi0xLjEuMCIgdmVyc2lvbiB3aWxsCisgICAgIyBjb21wYXJlIGxvd2VyIHRoYW4gYW55IG51bWVyaWMgdmVyc2lvbiBudW1iZXIsIGFuZCBpcyB0aGVyZWZvcmUgdW5saWtlbHkKKyAgICAjIHRvIG1hdGNoIGEgcmVxdWVzdCBmb3IgaXQuICBJdCdzIHN0aWxsIGEgcG90ZW50aWFsIHByb2JsZW0sIHRob3VnaCwgYW5kCisgICAgIyBpbiB0aGUgbG9uZyBydW4gUHlQSSBhbmQgdGhlIGRpc3R1dGlscyBzaG91bGQgZ28gZm9yICJzYWZlIiBuYW1lcyBhbmQKKyAgICAjIHZlcnNpb25zIGluIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIG5hbWVzIChzZGlzdCBhbmQgYmRpc3QpLgorCisgICAgcGFydHMgPSBiYXNlbmFtZS5zcGxpdCgnLScpCisgICAgZm9yIHAgaW4gcmFuZ2UoMSxsZW4ocGFydHMpKzEpOgorICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24oCisgICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsICctJy5qb2luKHBhcnRzWzpwXSksICctJy5qb2luKHBhcnRzW3A6XSksCisgICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlLAorICAgICAgICAgICAgcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICApCisKKworCisKKworY2xhc3MgUGFja2FnZUluZGV4KEVudmlyb25tZW50KToKKyAgICAiIiJBIGRpc3RyaWJ1dGlvbiBpbmRleCB0aGF0IHNjYW5zIHdlYiBwYWdlcyBmb3IgZG93bmxvYWQgVVJMcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsaW5kZXhfdXJsPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaSIsaG9zdHM9KCcqJywpLCphcmdzLCoqa3cpOgorICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpCisgICAgICAgIHNlbGYuaW5kZXhfdXJsID0gaW5kZXhfdXJsICsgIi8iWzpub3QgaW5kZXhfdXJsLmVuZHN3aXRoKCcvJyldCisgICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzID0ge30KKyAgICAgICAgc2VsZi5mZXRjaGVkX3VybHMgPSB7fQorICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMgPSB7fQorICAgICAgICBzZWxmLmFsbG93cyA9IHJlLmNvbXBpbGUoJ3wnLmpvaW4obWFwKHRyYW5zbGF0ZSxob3N0cykpKS5tYXRjaAorICAgICAgICBzZWxmLnRvX3NjYW4gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfdXJsKHNlbGYsIHVybCwgcmV0cmlldmU9RmFsc2UpOgorICAgICAgICAiIiJFdmFsdWF0ZSBhIFVSTCBhcyBhIHBvc3NpYmxlIGRvd25sb2FkLCBhbmQgbWF5YmUgcmV0cmlldmUgaXQiIiIKKyAgICAgICAgdXJsID0gZml4X3NmX3VybCh1cmwpCisgICAgICAgIGlmIHVybCBpbiBzZWxmLnNjYW5uZWRfdXJscyBhbmQgbm90IHJldHJpZXZlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzW3VybF0gPSBUcnVlCisgICAgICAgIGlmIG5vdCBVUkxfU0NIRU1FKHVybCk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUodXJsKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXN0cyA9IGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpCisgICAgICAgICAgICBpZiBkaXN0czoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQgbGluazogJXMiLCB1cmwpCisKKyAgICAgICAgaWYgZGlzdHMgb3Igbm90IHJldHJpZXZlIG9yIHVybCBpbiBzZWxmLmZldGNoZWRfdXJsczoKKyAgICAgICAgICAgIG1hcChzZWxmLmFkZCwgZGlzdHMpCisgICAgICAgICAgICByZXR1cm4gICMgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIHBhZ2UKKworICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKKyAgICAgICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBUcnVlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmluZm8oIlJlYWRpbmcgJXMiLCB1cmwpCisgICAgICAgIGYgPSBzZWxmLm9wZW5fdXJsKHVybCkKKyAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IHNlbGYuZmV0Y2hlZF91cmxzW2YudXJsXSA9IFRydWUKKworCisgICAgICAgIGlmICdodG1sJyBub3QgaW4gZi5oZWFkZXJzWydjb250ZW50LXR5cGUnXS5sb3dlcigpOgorICAgICAgICAgICAgZi5jbG9zZSgpICAgIyBub3QgaHRtbCwgd2UgY2FuJ3QgcHJvY2VzcyBpdAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYmFzZSA9IGYudXJsICAgICAjIGhhbmRsZSByZWRpcmVjdHMKKyAgICAgICAgcGFnZSA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CisgICAgICAgICAgICBwYWdlID0gc2VsZi5wcm9jZXNzX2luZGV4KHVybCwgcGFnZSkKKworICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKKyAgICAgICAgICAgIGxpbmsgPSB1cmxwYXJzZS51cmxqb2luKGJhc2UsIG1hdGNoLmdyb3VwKDEpKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3VybChsaW5rKQorCisgICAgZGVmIHByb2Nlc3NfZmlsZW5hbWUoc2VsZiwgZm4sIG5lc3RlZD1GYWxzZSk6CisgICAgICAgICMgcHJvY2VzcyBmaWxlbmFtZXMgb3IgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgIHNlbGYud2FybigiTm90IGZvdW5kOiAlcyIsIHVybCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm4pIGFuZCBub3QgbmVzdGVkOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoZm4pCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZShvcy5wYXRoLmpvaW4ocGF0aCxpdGVtKSwgVHJ1ZSkKKworICAgICAgICBkaXN0cyA9IGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZuKQorICAgICAgICBpZiBkaXN0czoKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kOiAlcyIsIGZuKQorICAgICAgICAgICAgbWFwKHNlbGYuYWRkLCBkaXN0cykKKworICAgIGRlZiB1cmxfb2soc2VsZiwgdXJsLCBmYXRhbD1GYWxzZSk6CisgICAgICAgIGlmIHNlbGYuYWxsb3dzKHVybHBhcnNlLnVybHBhcnNlKHVybClbMV0pOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgbXNnID0gIlxuTGluayB0byAlIHMgKioqQkxPQ0tFRCoqKiBieSAtLWFsbG93LWhvc3RzXG4iCisgICAgICAgIGlmIGZhdGFsOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnICUgdXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgdXJsKQorCisKKworICAgIGRlZiBwcm9jZXNzX2luZGV4KHNlbGYsdXJsLHBhZ2UpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIFB5UEkgcGFnZSIiIgorICAgICAgICBkZWYgc2NhbihsaW5rKToKKyAgICAgICAgICAgICMgUHJvY2VzcyBhIFVSTCB0byBzZWUgaWYgaXQncyBmb3IgYSBwYWNrYWdlIHBhZ2UKKyAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCk6CisgICAgICAgICAgICAgICAgcGFydHMgPSBtYXAoCisgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudW5xdW90ZSwgbGlua1tsZW4oc2VsZi5pbmRleF91cmwpOl0uc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpPT0yOgorICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBwYWNrYWdlIHBhZ2UsIHNhbml0aXplIGFuZCBpbmRleCBpdAorICAgICAgICAgICAgICAgICAgICBwa2cgPSBzYWZlX25hbWUocGFydHNbMF0pCisgICAgICAgICAgICAgICAgICAgIHZlciA9IHNhZmVfdmVyc2lvbihwYXJ0c1sxXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzLnNldGRlZmF1bHQocGtnLmxvd2VyKCkse30pW2xpbmtdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9fZmlsZW5hbWUocGtnKSwgdG9fZmlsZW5hbWUodmVyKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgICAgICBpZiB1cmw9PXNlbGYuaW5kZXhfdXJsIG9yICdJbmRleCBvZiBQYWNrYWdlczwvdGl0bGU+JyBpbiBwYWdlOgorICAgICAgICAgICAgIyBwcm9jZXNzIGFuIGluZGV4IHBhZ2UgaW50byB0aGUgcGFja2FnZS1wYWdlIGluZGV4CisgICAgICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKKyAgICAgICAgICAgICAgICBzY2FuKCB1cmxwYXJzZS51cmxqb2luKHVybCwgbWF0Y2guZ3JvdXAoMSkpICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBrZyx2ZXIgPSBzY2FuKHVybCkgICAjIGVuc3VyZSB0aGlzIHBhZ2UgaXMgaW4gdGhlIHBhZ2UgaW5kZXgKKyAgICAgICAgICAgICMgcHJvY2VzcyBpbmRpdmlkdWFsIHBhY2thZ2UgcGFnZQorICAgICAgICAgICAgZm9yIHRhZyBpbiAoIjx0aD5Ib21lIFBhZ2UiLCAiPHRoPkRvd25sb2FkIFVSTCIpOgorICAgICAgICAgICAgICAgIHBvcyA9IHBhZ2UuZmluZCh0YWcpCisgICAgICAgICAgICAgICAgaWYgcG9zIT0tMToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBIUkVGLnNlYXJjaChwYWdlLHBvcykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGZvdW5kIFVSTAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCA9IHVybHBhcnNlLnVybGpvaW4odXJsLCBtYXRjaC5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIGZyYWcgPSBlZ2dfaW5mb19mb3JfdXJsKG5ld191cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKSBhbmQgbm90IGZyYWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGtnIGFuZCB2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld191cmwrPScjZWdnPSVzLSVzJyAlIChwa2csdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmVlZF92ZXJzaW9uX2luZm8odXJsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybChuZXdfdXJsKQorICAgICAgICByZXR1cm4gUFlQSV9NRDUuc3ViKAorICAgICAgICAgICAgbGFtYmRhIG06ICc8YSBocmVmPSIlcyNtZDU9JXMiPiVzPC9hPicgJSBtLmdyb3VwKDEsMywyKSwgcGFnZQorICAgICAgICApCisKKyAgICBkZWYgbmVlZF92ZXJzaW9uX2luZm8oc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi5zY2FuX2FsbCgKKyAgICAgICAgICAgICJQYWdlIGF0ICVzIGxpbmtzIHRvIC5weSBmaWxlKHMpIHdpdGhvdXQgdmVyc2lvbiBpbmZvOyBhbiBpbmRleCAiCisgICAgICAgICAgICAic2NhbiBpcyByZXF1aXJlZC4iLCB1cmwKKyAgICAgICAgKQorCisgICAgZGVmIHNjYW5fYWxsKHNlbGYsIG1zZz1Ob25lLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuaW5kZXhfdXJsIG5vdCBpbiBzZWxmLmZldGNoZWRfdXJsczoKKyAgICAgICAgICAgIGlmIG1zZzogc2VsZi53YXJuKG1zZywqYXJncykKKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiU2Nhbm5pbmcgaW5kZXggb2YgYWxsIHBhY2thZ2VzICh0aGlzIG1heSB0YWtlIGEgd2hpbGUpIgorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsKQorCisgICAgZGVmIGZpbmRfcGFja2FnZXMoc2VsZiwgcmVxdWlyZW1lbnQpOgorICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUrJy8nKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CisgICAgICAgICAgICAjIEZhbGwgYmFjayB0byBzYWZlIHZlcnNpb24gb2YgdGhlIG5hbWUKKyAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUrJy8nKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSk6CisgICAgICAgICAgICAjIFdlIGNvdWxkbid0IGZpbmQgdGhlIHRhcmdldCBwYWNrYWdlLCBzbyBzZWFyY2ggdGhlIGluZGV4IHBhZ2UgdG9vCisgICAgICAgICAgICBzZWxmLndhcm4oCisgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgaW5kZXggcGFnZSBmb3IgJXIgKG1heWJlIG1pc3NwZWxsZWQ/KSIsCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuc2Nhbl9hbGwoKQorCisgICAgICAgIGZvciB1cmwgaW4gc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXksKCkpOgorICAgICAgICAgICAgIyBzY2FuIGVhY2ggcGFnZSB0aGF0IG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGRlc2lyZWQgcGFja2FnZQorICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCisKKyAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgIHNlbGYucHJlc2NhbigpOyBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCisgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxdWlyZW1lbnQua2V5XToKKyAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxdWlyZW1lbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIiVzIGRvZXMgbm90IG1hdGNoICVzIiwgcmVxdWlyZW1lbnQsIGRpc3QpCisgICAgICAgIHJldHVybiBzdXBlcihQYWNrYWdlSW5kZXgsIHNlbGYpLm9idGFpbihyZXF1aXJlbWVudCxpbnN0YWxsZXIpCisKKyAgICBkZWYgY2hlY2tfbWQ1KHNlbGYsIGNzLCBpbmZvLCBmaWxlbmFtZSwgdGZwKToKKyAgICAgICAgaWYgcmUubWF0Y2goJ21kNT1bMC05YS1mXXszMn0kJywgaW5mbyk6CisgICAgICAgICAgICBzZWxmLmRlYnVnKCJWYWxpZGF0aW5nIG1kNSBjaGVja3N1bSBmb3IgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGNzLmhleGRpZ2VzdCgpPD5pbmZvWzQ6XToKKyAgICAgICAgICAgICAgICB0ZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk1ENSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgIitvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSsKKyAgICAgICAgICAgICAgICAgICAgIjsgcG9zc2libGUgZG93bmxvYWQgcHJvYmxlbT8iCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGFkZF9maW5kX2xpbmtzKHNlbGYsIHVybHMpOgorICAgICAgICAiIiJBZGQgYHVybHNgIHRvIHRoZSBsaXN0IHRoYXQgd2lsbCBiZSBwcmVzY2FubmVkIGZvciBzZWFyY2hlcyIiIgorICAgICAgICBmb3IgdXJsIGluIHVybHM6CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgc2VsZi50b19zY2FuIGlzIE5vbmUgICAgICAgICMgaWYgd2UgaGF2ZSBhbHJlYWR5ICJnb25lIG9ubGluZSIKKyAgICAgICAgICAgICAgICBvciBub3QgVVJMX1NDSEVNRSh1cmwpICAgICAgIyBvciBpdCdzIGEgbG9jYWwgZmlsZS9kaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBvciB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKQorICAgICAgICAgICAgICAgIG9yIGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpICAgIyBvciBhIGRpcmVjdCBwYWNrYWdlIGxpbmsKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyB0aGVuIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGl0IG5vdworICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgZGVmZXIgcmV0cmlldmFsIHRpbGwgbGF0ZXIKKyAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4uYXBwZW5kKHVybCkKKworICAgIGRlZiBwcmVzY2FuKHNlbGYpOgorICAgICAgICAiIiJTY2FuIHVybHMgc2NoZWR1bGVkIGZvciBwcmVzY2FubmluZyAoZS5nLiAtLWZpbmQtbGlua3MpIiIiCisgICAgICAgIGlmIHNlbGYudG9fc2NhbjoKKyAgICAgICAgICAgIG1hcChzZWxmLnNjYW5fdXJsLCBzZWxmLnRvX3NjYW4pCisgICAgICAgIHNlbGYudG9fc2NhbiA9IE5vbmUgICAgICMgZnJvbSBub3cgb24sIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGltbWVkaWF0ZWx5CisKKworCisKKworCisKKworCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgc3BlYywgdG1wZGlyKToKKyAgICAgICAgIiIiTG9jYXRlIGFuZC9vciBkb3dubG9hZCBgc3BlY2AgdG8gYHRtcGRpcmAsIHJldHVybmluZyBhIGxvY2FsIHBhdGgKKworICAgICAgICBgc3BlY2AgbWF5IGJlIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCwgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCwKKyAgICAgICAgYW4gZXhpc3RpbmcgbG9jYWwgZmlsZW5hbWUsIG9yIGEgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMKKyAgICAgICAgKGkuZS4gdGhlIHN0cmluZyBmb3JtIG9mIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCkuICBJZiBpdCBpcyB0aGUgVVJMCisgICAgICAgIG9mIGEgLnB5IGZpbGUgd2l0aCBhbiB1bmFtYmlndW91cyBgYCNlZ2c9bmFtZS12ZXJzaW9uYGAgdGFnIChpLmUuLCBvbmUKKyAgICAgICAgdGhhdCBlc2NhcGVzIGBgLWBgIGFzIGBgX2BgIHRocm91Z2hvdXQpLCBhIHRyaXZpYWwgYGBzZXR1cC5weWBgIGlzCisgICAgICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbG9uZ3NpZGUgdGhlIGRvd25sb2FkZWQgZmlsZS4KKworICAgICAgICBJZiBgc3BlY2AgaXMgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0IG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQorICAgICAgICBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbG9jYXRpb24gb2YKKyAgICAgICAgYSBtYXRjaGluZyBkaXN0cmlidXRpb24gKHBvc3NpYmx5IGFmdGVyIGRvd25sb2FkaW5nIGl0IHRvIGB0bXBkaXJgKS4KKyAgICAgICAgSWYgYHNwZWNgIGlzIGEgbG9jYWxseSBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLCBpdCBpcyBzaW1wbHkKKyAgICAgICAgcmV0dXJuZWQgdW5jaGFuZ2VkLiAgSWYgYHNwZWNgIGlzIGEgVVJMLCBpdCBpcyBkb3dubG9hZGVkIHRvIGEgc3VicGF0aAorICAgICAgICBvZiBgdG1wZGlyYCwgYW5kIHRoZSBsb2NhbCBmaWxlbmFtZSBpcyByZXR1cm5lZC4gIFZhcmlvdXMgZXJyb3JzIG1heSBiZQorICAgICAgICByYWlzZWQgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgZG93bmxvYWRpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLFJlcXVpcmVtZW50KToKKyAgICAgICAgICAgIHNjaGVtZSA9IFVSTF9TQ0hFTUUoc3BlYykKKyAgICAgICAgICAgIGlmIHNjaGVtZToKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpcgorICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZG93bmxvYWRfdXJsKHNjaGVtZS5ncm91cCgxKSwgc3BlYywgdG1wZGlyKQorICAgICAgICAgICAgICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybChzcGVjKQorICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZ2VuX3NldHVwKGZvdW5kLGZyYWdtZW50LHRtcGRpcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6CisgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCByZXR1cm4gaXQKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNwZWMgPSBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoc3BlYywpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5mZXRjaF9kaXN0cmlidXRpb24oc3BlYywgdG1wZGlyKSwnbG9jYXRpb24nLE5vbmUpCisKKworICAgIGRlZiBmZXRjaF9kaXN0cmlidXRpb24oc2VsZiwKKyAgICAgICAgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlLCBkZXZlbG9wX29rPUZhbHNlCisgICAgKToKKyAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKKworICAgICAgICBgcmVxdWlyZW1lbnRgIG11c3QgYmUgYSBgYHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnRgYCBpbnN0YW5jZS4KKyAgICAgICAgSWYgbmVjZXNzYXJ5LCBvciBpZiB0aGUgYGZvcmNlX3NjYW5gIGZsYWcgaXMgc2V0LCB0aGUgcmVxdWlyZW1lbnQgaXMKKyAgICAgICAgc2VhcmNoZWQgZm9yIGluIHRoZSAob25saW5lKSBwYWNrYWdlIGluZGV4IGFzIHdlbGwgYXMgdGhlIGxvY2FsbHkKKyAgICAgICAgaW5zdGFsbGVkIHBhY2thZ2VzLiAgSWYgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYHJlcXVpcmVtZW50YCBpcyBmb3VuZCwKKyAgICAgICAgdGhlIHJldHVybmVkIGRpc3RyaWJ1dGlvbidzIGBgbG9jYXRpb25gYCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIGhhdmUKKyAgICAgICAgZ290dGVuIGZyb20gY2FsbGluZyB0aGUgYGBkb3dubG9hZCgpYGAgbWV0aG9kIHdpdGggdGhlIG1hdGNoaW5nCisgICAgICAgIGRpc3RyaWJ1dGlvbidzIFVSTCBvciBmaWxlbmFtZS4gIElmIG5vIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCwKKyAgICAgICAgYGBOb25lYGAgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgSWYgdGhlIGBzb3VyY2VgIGZsYWcgaXMgc2V0LCBvbmx5IHNvdXJjZSBkaXN0cmlidXRpb25zIGFuZCBzb3VyY2UKKyAgICAgICAgY2hlY2tvdXQgbGlua3Mgd2lsbCBiZSBjb25zaWRlcmVkLiAgVW5sZXNzIHRoZSBgZGV2ZWxvcF9va2AgZmxhZyBpcworICAgICAgICBzZXQsIGRldmVsb3BtZW50IGFuZCBzeXN0ZW0gZWdncyAoaS5lLiwgdGhvc2UgdXNpbmcgdGhlIGBgLmVnZy1pbmZvYGAKKyAgICAgICAgZm9ybWF0KSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICIiIgorCisgICAgICAgICMgcHJvY2VzcyBhIFJlcXVpcmVtZW50CisgICAgICAgIHNlbGYuaW5mbygiU2VhcmNoaW5nIGZvciAlcyIsIHJlcXVpcmVtZW50KQorICAgICAgICBza2lwcGVkID0ge30KKworICAgICAgICBkZWYgZmluZChyZXEpOgorICAgICAgICAgICAgIyBGaW5kIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCisKKyAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGZbcmVxLmtleV06CisKKyAgICAgICAgICAgICAgICBpZiBkaXN0LnByZWNlZGVuY2U9PURFVkVMT1BfRElTVCBhbmQgbm90IGRldmVsb3Bfb2s6CisgICAgICAgICAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHNraXBwZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oIlNraXBwaW5nIGRldmVsb3BtZW50IG9yIHN5c3RlbSBlZ2c6ICVzIixkaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFtkaXN0XSA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxIGFuZCAoZGlzdC5wcmVjZWRlbmNlPD1TT1VSQ0VfRElTVCBvciBub3Qgc291cmNlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmZvKCJCZXN0IG1hdGNoOiAlcyIsIGRpc3QpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0LmNsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249c2VsZi5kb3dubG9hZChkaXN0LmxvY2F0aW9uLCB0bXBkaXIpCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBmb3JjZV9zY2FuOgorICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKKyAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKKworICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKKyAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBzZWxmLnRvX3NjYW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQorICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCisKKyAgICAgICAgaWYgZGlzdCBpcyBOb25lIGFuZCBub3QgZm9yY2Vfc2NhbjoKKyAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKKyAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQorCisgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiTm8gbG9jYWwgcGFja2FnZXMgb3IgZG93bmxvYWQgbGlua3MgZm91bmQgZm9yICVzJXMiLAorICAgICAgICAgICAgICAgIChzb3VyY2UgYW5kICJhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgIiBvciAiIiksCisgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQsCisgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBkaXN0CisKKyAgICBkZWYgZmV0Y2goc2VsZiwgcmVxdWlyZW1lbnQsIHRtcGRpciwgZm9yY2Vfc2Nhbj1GYWxzZSwgc291cmNlPUZhbHNlKToKKyAgICAgICAgIiIiT2J0YWluIGEgZmlsZSBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCisKKyAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBgYGZldGNoX2Rpc3RyaWJ1dGlvbigpYGAgbWV0aG9kIG5vdyBpbnN0ZWFkLiAgRm9yCisgICAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgYnV0IHJldHVybnMgdGhlCisgICAgICAgIGBgbG9jYXRpb25gYCBvZiB0aGUgZG93bmxvYWRlZCBkaXN0cmlidXRpb24gaW5zdGVhZCBvZiBhIGRpc3RyaWJ1dGlvbgorICAgICAgICBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBkaXN0ID0gc2VsZi5mZXRjaF9kaXN0cmlidXRpb24ocmVxdWlyZW1lbnQsdG1wZGlyLGZvcmNlX3NjYW4sc291cmNlKQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGRpc3QubG9jYXRpb24KKyAgICAgICAgcmV0dXJuIE5vbmUKKworCisKKworCisKKworCisgICAgZGVmIGdlbl9zZXR1cChzZWxmLCBmaWxlbmFtZSwgZnJhZ21lbnQsIHRtcGRpcik6CisgICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KTsgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgICBkaXN0cyA9IG1hdGNoIGFuZCBbZCBmb3IgZCBpbgorICAgICAgICAgICAgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGZpbGVuYW1lLCBtYXRjaC5ncm91cCgxKSwgTm9uZSkgaWYgZC52ZXJzaW9uCisgICAgICAgIF0gb3IgW10KKworICAgICAgICBpZiBsZW4oZGlzdHMpPT0xOiAgICMgdW5hbWJpZ3VvdXMgYGAjZWdnYGAgZnJhZ21lbnQKKyAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKworICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZCB0byB0aGUgdGVtcCBkaXIuCisgICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpICE9IHRtcGRpcjoKKyAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IHNhbWVmaWxlCisgICAgICAgICAgICAgICAgaWYgbm90IHNhbWVmaWxlKGZpbGVuYW1lLCBkc3QpOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoZmlsZW5hbWUsIGRzdCkKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9ZHN0CisKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbih0bXBkaXIsICdzZXR1cC5weScpLCAndycpCisgICAgICAgICAgICBmaWxlLndyaXRlKAorICAgICAgICAgICAgICAgICJmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwXG4iCisgICAgICAgICAgICAgICAgInNldHVwKG5hbWU9JXIsIHZlcnNpb249JXIsIHB5X21vZHVsZXM9WyVyXSlcbiIKKyAgICAgICAgICAgICAgICAlICgKKyAgICAgICAgICAgICAgICAgICAgZGlzdHNbMF0ucHJvamVjdF9uYW1lLCBkaXN0c1swXS52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICAgICAgZWxpZiBtYXRjaDoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCB1bmFtYmlndW91c2x5IGludGVycHJldCBwcm9qZWN0L3ZlcnNpb24gaWRlbnRpZmllciAlcjsgIgorICAgICAgICAgICAgICAgICJhbnkgZGFzaGVzIGluIHRoZSBuYW1lIG9yIHZlcnNpb24gc2hvdWxkIGJlIGVzY2FwZWQgdXNpbmcgIgorICAgICAgICAgICAgICAgICJ1bmRlcnNjb3Jlcy4gJXIiICUgKGZyYWdtZW50LGRpc3RzKQorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHByb2Nlc3MgcGxhaW4gLnB5IGZpbGVzIHdpdGhvdXQgYW4gJyNlZ2c9bmFtZS12ZXJzaW9uJyIKKyAgICAgICAgICAgICAgICAiIHN1ZmZpeCB0byBlbmFibGUgYXV0b21hdGljIHNldHVwIHNjcmlwdCBnZW5lcmF0aW9uLiIKKyAgICAgICAgICAgICkKKworICAgIGRsX2Jsb2Nrc2l6ZSA9IDgxOTIKKyAgICBkZWYgX2Rvd25sb2FkX3RvKHNlbGYsIHVybCwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLnVybF9vayh1cmwsVHJ1ZSkgICAjIHJhaXNlcyBlcnJvciBpZiBub3QgYWxsb3dlZAorICAgICAgICBzZWxmLmluZm8oIkRvd25sb2FkaW5nICVzIiwgdXJsKQorICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCisgICAgICAgIGZwLCB0ZnAsIGluZm8gPSBOb25lLCBOb25lLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmICcjJyBpbiB1cmw6CisgICAgICAgICAgICAgICAgdXJsLCBpbmZvID0gdXJsLnNwbGl0KCcjJywgMSkKKyAgICAgICAgICAgIGZwID0gc2VsZi5vcGVuX3VybCh1cmwpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZwLCB1cmxsaWIyLkhUVFBFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkb3dubG9hZCAlczogJXMgJXMiICUgKHVybCwgZnAuY29kZSxmcC5tc2cpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgY3MgPSBtZDUoKQorICAgICAgICAgICAgaGVhZGVycyA9IGZwLmluZm8oKQorICAgICAgICAgICAgYmxvY2tudW0gPSAwCisgICAgICAgICAgICBicyA9IHNlbGYuZGxfYmxvY2tzaXplCisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBzaXplID0gaW50KGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKKyAgICAgICAgICAgIHRmcCA9IG9wZW4oZmlsZW5hbWUsJ3diJykKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYmxvY2sgPSBmcC5yZWFkKGJzKQorICAgICAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAgICAgICAgICBjcy51cGRhdGUoYmxvY2spCisgICAgICAgICAgICAgICAgICAgIHRmcC53cml0ZShibG9jaykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBpbmZvOiBzZWxmLmNoZWNrX21kNShjcywgaW5mbywgZmlsZW5hbWUsIHRmcCkKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBmcDogZnAuY2xvc2UoKQorICAgICAgICAgICAgaWYgdGZwOiB0ZnAuY2xvc2UoKQorCisgICAgZGVmIHJlcG9ydGhvb2soc2VsZiwgdXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJsa3NpemUsIHNpemUpOgorICAgICAgICBwYXNzICAgICMgbm8tb3AKKworICAgIGRlZiByZXRyeV9zZl9kb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbSwgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgICAgICBpZiBzZXJ2ZXIhPSdkbC5zb3VyY2Vmb3JnZS5uZXQnOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgbWlycm9yID0gZ2V0X3NmX2lwKCkKKworICAgICAgICB3aGlsZSBfc2ZfbWlycm9yczoKKyAgICAgICAgICAgIHNlbGYud2FybigiRG93bmxvYWQgZmFpbGVkOiAlcyIsIHN5cy5leGNfaW5mbygpWzFdKQorICAgICAgICAgICAgdXJsID0gdXJscGFyc2UudXJsdW5wYXJzZSgoc2NoZW1lLCBtaXJyb3IsIHBhdGgsIHBhcmFtLCAnJywgZnJhZykpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgX3NmX21pcnJvcnMucmVtb3ZlKG1pcnJvcikgICMgZG9uJ3QgcmV0cnkgdGhlIHNhbWUgbWlycm9yCisgICAgICAgICAgICAgICAgbWlycm9yID0gZ2V0X3NmX2lwKCkKKworICAgICAgICByYWlzZSAgICMgZmFpbCBpZiBubyBtaXJyb3Igd29ya3MKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgb3Blbl91cmwoc2VsZiwgdXJsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHVybGxpYjIudXJsb3Blbih1cmwpCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgdjoKKyAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yLCB2OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yOiAlcyIgJSB2LnJlYXNvbikKKworCisgICAgZGVmIF9kb3dubG9hZF91cmwoc2VsZiwgc2NoZW1lLCB1cmwsIHRtcGRpcik6CisKKyAgICAgICAgIyBEZXRlcm1pbmUgZG93bmxvYWQgZmlsZW5hbWUKKyAgICAgICAgIworICAgICAgICBuYW1lID0gZmlsdGVyKE5vbmUsdXJscGFyc2UudXJscGFyc2UodXJsKVsyXS5zcGxpdCgnLycpKQorICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbLTFdCisgICAgICAgICAgICB3aGlsZSAnLi4nIGluIG5hbWU6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLi4nLCcuJykucmVwbGFjZSgnXFwnLCdfJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAiX19kb3dubG9hZGVkX18iICAgICMgZGVmYXVsdCBpZiBVUkwgaGFzIG5vIHBhdGggY29udGVudHMKKworICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi00XSAgICAjIHN0cmlwIHRoZSBleHRyYSAuemlwIGJlZm9yZSBkb3dubG9hZAorCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcixuYW1lKQorCisgICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKKyAgICAgICAgIworICAgICAgICBpZiBzY2hlbWU9PSdzdm4nIG9yIHNjaGVtZS5zdGFydHN3aXRoKCdzdm4rJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5yZXRyeV9zZl9kb3dubG9hZCh1cmwsIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgJ2h0bWwnIGluIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2h0bWwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSwgdG1wZGlyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBzY2FuX3VybChzZWxmLCB1cmwpOgorICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKHVybCwgVHJ1ZSkKKworCisgICAgZGVmIF9kb3dubG9hZF9odG1sKHNlbGYsIHVybCwgaGVhZGVycywgZmlsZW5hbWUsIHRtcGRpcik6CisgICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICBmb3IgbGluZSBpbiBmaWxlOgorICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlCisgICAgICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHInPHRpdGxlPlJldmlzaW9uIFxkKzonLCBsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlOgorICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgYnJlYWsgICAjIG5vdCBhbiBpbmRleCBwYWdlCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJVbmV4cGVjdGVkIEhUTUwgcGFnZSBmb3VuZCBhdCAiK3VybCkKKworICAgIGRlZiBfZG93bmxvYWRfc3ZuKHNlbGYsIHVybCwgZmlsZW5hbWUpOgorICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLDEpWzBdICAgIyByZW1vdmUgYW55IGZyYWdtZW50IGZvciBzdm4ncyBzYWtlCisgICAgICAgIHNlbGYuaW5mbygiRG9pbmcgc3VidmVyc2lvbiBjaGVja291dCBmcm9tICVzIHRvICVzIiwgdXJsLCBmaWxlbmFtZSkKKyAgICAgICAgb3Muc3lzdGVtKCJzdm4gY2hlY2tvdXQgLXEgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCisKKyAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKKworICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBsb2cud2Fybihtc2csICphcmdzKQorCisKKworCisKKworCisKKworCisKKworZGVmIGZpeF9zZl91cmwodXJsKToKKyAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW0sIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgIGlmIHNlcnZlciE9J3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldCc6CisgICAgICAgIHJldHVybiB1cmwKKyAgICByZXR1cm4gdXJscGFyc2UudXJsdW5wYXJzZSgKKyAgICAgICAgKHNjaGVtZSwgJ2RsLnNvdXJjZWZvcmdlLm5ldCcsICdzb3VyY2Vmb3JnZScrcGF0aCwgcGFyYW0sICcnLCBmcmFnKQorICAgICkKKworX3NmX21pcnJvcnMgPSBbXQorCitkZWYgZ2V0X3NmX2lwKCk6CisgICAgaWYgbm90IF9zZl9taXJyb3JzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfc2ZfbWlycm9yc1s6XSA9IHNvY2tldC5nZXRob3N0YnluYW1lX2V4KCdkbC5zb3VyY2Vmb3JnZS5uZXQnKVstMV0KKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICMgRE5TLWJsMGNrMW45IGYxcjN3NGxseiBzVXgwcnMhCisgICAgICAgICAgICBfc2ZfbWlycm9yc1s6XSA9IFsnZGwuc291cmNlZm9yZ2UubmV0J10KKyAgICByZXR1cm4gcmFuZG9tLmNob2ljZShfc2ZfbWlycm9ycykKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3NhbmRib3gucHkgYi9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwNjk0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5CkBAIC0wLDAgKzEsMjAzIEBACitpbXBvcnQgb3MsIHN5cywgX19idWlsdGluX18sIHRlbXBmaWxlCitfb3MgPSBzeXMubW9kdWxlc1tvcy5uYW1lXQorX29wZW4gPSBvcGVuCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCitfX2FsbF9fID0gWworICAgICJBYnN0cmFjdFNhbmRib3giLCAiRGlyZWN0b3J5U2FuZGJveCIsICJTYW5kYm94VmlvbGF0aW9uIiwgInJ1bl9zZXR1cCIsCitdCisKK2RlZiBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKToKKyAgICAiIiJSdW4gYSBkaXN0dXRpbHMgc2V0dXAgc2NyaXB0LCBzYW5kYm94ZWQgaW4gaXRzIGRpcmVjdG9yeSIiIgorCisgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3ZbOl0KKyAgICBzYXZlX3BhdGggPSBzeXMucGF0aFs6XQorICAgIHNldHVwX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KSkKKyAgICB0ZW1wX2RpciA9IG9zLnBhdGguam9pbihzZXR1cF9kaXIsJ3RlbXAnKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHRlbXBfZGlyKTogb3MubWFrZWRpcnModGVtcF9kaXIpCisgICAgc2F2ZV90bXAgPSB0ZW1wZmlsZS50ZW1wZGlyCisKKyAgICB0cnk6CisgICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSB0ZW1wX2RpcgorICAgICAgICBvcy5jaGRpcihzZXR1cF9kaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gW3NldHVwX3NjcmlwdF0rbGlzdChhcmdzKQorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNldHVwX2RpcikKKyAgICAgICAgICAgIERpcmVjdG9yeVNhbmRib3goc2V0dXBfZGlyKS5ydW4oCisgICAgICAgICAgICAgICAgbGFtYmRhOiBleGVjZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgInNldHVwLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgeydfX2ZpbGVfXyc6c2V0dXBfc2NyaXB0LCAnX19uYW1lX18nOidfX21haW5fXyd9CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgdjoKKyAgICAgICAgICAgIGlmIHYuYXJncyBhbmQgdi5hcmdzWzBdOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjIE5vcm1hbCBleGl0LCBqdXN0IHJldHVybgorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZV9wYXRoCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZV9hcmd2CisgICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSBzYXZlX3RtcAorCitjbGFzcyBBYnN0cmFjdFNhbmRib3g6CisgICAgIiIiV3JhcCAnb3MnIG1vZHVsZSBhbmQgJ29wZW4oKScgYnVpbHRpbiBmb3IgdmlydHVhbGl6aW5nIHNldHVwIHNjcmlwdHMiIiIKKworICAgIF9hY3RpdmUgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9hdHRycyA9IFsKKyAgICAgICAgICAgIG5hbWUgZm9yIG5hbWUgaW4gZGlyKF9vcykKKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykgYW5kIGhhc2F0dHIoc2VsZixuYW1lKQorICAgICAgICBdCisKKyAgICBkZWYgX2NvcHkoc2VsZiwgc291cmNlKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fYXR0cnM6CisgICAgICAgICAgICBzZXRhdHRyKG9zLCBuYW1lLCBnZXRhdHRyKHNvdXJjZSxuYW1lKSkKKworICAgIGRlZiBydW4oc2VsZiwgZnVuYyk6CisgICAgICAgICIiIlJ1biAnZnVuYycgdW5kZXIgb3Mgc2FuZGJveGluZyIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jb3B5KHNlbGYpCisgICAgICAgICAgICBfX2J1aWx0aW5fXy5vcGVuID0gX19idWlsdGluX18uZmlsZSA9IHNlbGYuX29wZW4KKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBfX2J1aWx0aW5fXy5vcGVuID0gX19idWlsdGluX18uZmlsZSA9IF9vcGVuCisgICAgICAgICAgICBzZWxmLl9jb3B5KF9vcykKKworCisgICAgZGVmIF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKToKKyAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLHNyYyxkc3QsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgc3JjLGRzdCA9IHNlbGYuX3JlbWFwX3BhaXIobmFtZSxzcmMsZHN0LCphcmdzLCoqa3cpCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwoc3JjLGRzdCwqYXJncywqKmt3KQorICAgICAgICByZXR1cm4gd3JhcAorCisKKyAgICBmb3IgbmFtZSBpbiBbInJlbmFtZSIsICJsaW5rIiwgInN5bWxpbmsiXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpCisKKworICAgIGRlZiBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lLCBvcmlnaW5hbD1Ob25lKToKKyAgICAgICAgb3JpZ2luYWwgPSBvcmlnaW5hbCBvciBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUscGF0aCwqYXJncywqKmt3KQorICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsKmFyZ3MsKiprdykKKyAgICAgICAgcmV0dXJuIHdyYXAKKworICAgIF9vcGVuID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ2ZpbGUnLCBfb3BlbikKKyAgICBmb3IgbmFtZSBpbiBbCisgICAgICAgICJzdGF0IiwgImxpc3RkaXIiLCAiY2hkaXIiLCAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsCisgICAgICAgICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibHN0YXQiLAorICAgICAgICAic3RhcnRmaWxlIiwgIm1rZmlmbyIsICJta25vZCIsICJwYXRoY29uZiIsICJhY2Nlc3MiCisgICAgXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIobmFtZSkKKworCisgICAgZGVmIF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSk6CisgICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsbmFtZSkKKyAgICAgICAgZGVmIHdyYXAoc2VsZixwYXRoLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZlOgorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLHBhdGgsKmFyZ3MsKiprdykKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIG9yaWdpbmFsKHBhdGgsKmFyZ3MsKiprdykpCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KQorICAgICAgICByZXR1cm4gd3JhcAorCisgICAgZm9yIG5hbWUgaW4gWydyZWFkbGluaycsICd0ZW1wbmFtJ106CisgICAgICAgIGlmIGhhc2F0dHIoX29zLG5hbWUpOiBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSkKKworICAgIGRlZiBfbWtfcXVlcnkobmFtZSk6CisgICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsbmFtZSkKKyAgICAgICAgZGVmIHdyYXAoc2VsZiwqYXJncywqKmt3KToKKyAgICAgICAgICAgIHJldHZhbCA9IG9yaWdpbmFsKCphcmdzLCoqa3cpCisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlbWFwX291dHB1dChuYW1lLCByZXR2YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0dmFsCisgICAgICAgIHJldHVybiB3cmFwCisKKyAgICBmb3IgbmFtZSBpbiBbJ2dldGN3ZCcsICd0bXBuYW0nXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3F1ZXJ5KG5hbWUpCisKKyAgICBkZWYgX3ZhbGlkYXRlX3BhdGgoc2VsZixwYXRoKToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIHJlbWFwIG9yIHZhbGlkYXRlIGFueSBwYXRoLCB3aGV0aGVyIGlucHV0IG9yIG91dHB1dCIiIgorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLG9wZXJhdGlvbixwYXRoLCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCisgICAgICAgIHJldHVybiBzZWxmLl92YWxpZGF0ZV9wYXRoKHBhdGgpCisKKyAgICBkZWYgX3JlbWFwX291dHB1dChzZWxmLG9wZXJhdGlvbixwYXRoKToKKyAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIG91dHB1dHMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKKworICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLG9wZXJhdGlvbixzcmMsZHN0LCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbisnLWZyb20nLHNyYywqYXJncywqKmt3KSwKKyAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbisnLXRvJyxkc3QsKmFyZ3MsKiprdykKKyAgICAgICAgKQorCisKK2NsYXNzIERpcmVjdG9yeVNhbmRib3goQWJzdHJhY3RTYW5kYm94KToKKyAgICAiIiJSZXN0cmljdCBvcGVyYXRpb25zIHRvIGEgc2luZ2xlIHN1YmRpcmVjdG9yeSAtIHBzZXVkby1jaHJvb3QiIiIKKworICAgIHdyaXRlX29wcyA9IGRpY3QuZnJvbWtleXMoWworICAgICAgICAib3BlbiIsICJjaG1vZCIsICJjaG93biIsICJta2RpciIsICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwKKyAgICAgICAgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibWtmaWZvIiwgIm1rbm9kIiwgInRlbXBuYW0iLAorICAgIF0pCisKKyAgICBkZWYgX19pbml0X18oc2VsZixzYW5kYm94KToKKyAgICAgICAgc2VsZi5fc2FuZGJveCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChzYW5kYm94KSkKKyAgICAgICAgc2VsZi5fcHJlZml4ID0gb3MucGF0aC5qb2luKHNlbGYuX3NhbmRib3gsJycpCisgICAgICAgIEFic3RyYWN0U2FuZGJveC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIF92aW9sYXRpb24oc2VsZiwgb3BlcmF0aW9uLCAqYXJncywgKiprdyk6CisgICAgICAgIHJhaXNlIFNhbmRib3hWaW9sYXRpb24ob3BlcmF0aW9uLCBhcmdzLCBrdykKKworICAgIGRlZiBfb3BlbihzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnKSBhbmQgbm90IHNlbGYuX29rKHBhdGgpOgorICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcGVuIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiBfb3BlbihwYXRoLG1vZGUsKmFyZ3MsKiprdykKKworICAgIGRlZiB0bXBuYW0oc2VsZik6CisgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigidG1wbmFtIikKKworICAgIGRlZiBfb2soc2VsZixwYXRoKToKKyAgICAgICAgYWN0aXZlID0gc2VsZi5fYWN0aXZlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2FjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKKyAgICAgICAgICAgIGlmIHJlYWxwYXRoPT1zZWxmLl9zYW5kYm94IG9yIHJlYWxwYXRoLnN0YXJ0c3dpdGgoc2VsZi5fcHJlZml4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gYWN0aXZlCisKKyAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKKyAgICAgICAgaWYgb3BlcmF0aW9uIGluIHNlbGYud3JpdGVfb3BzIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CisgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpLCAqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBfcmVtYXBfcGFpcihzZWxmLG9wZXJhdGlvbixzcmMsZHN0LCphcmdzLCoqa3cpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX29rKHNyYykgb3Igbm90IHNlbGYuX29rKGRzdCk6CisgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24ob3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiAoc3JjLGRzdCkKKworCitjbGFzcyBTYW5kYm94VmlvbGF0aW9uKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJBIHNldHVwIHNjcmlwdCBhdHRlbXB0ZWQgdG8gbW9kaWZ5IHRoZSBmaWxlc3lzdGVtIG91dHNpZGUgdGhlIHNhbmRib3giIiIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiIiU2FuZGJveFZpb2xhdGlvbjogJXMlciAlcworCitUaGUgcGFja2FnZSBzZXR1cCBzY3JpcHQgaGFzIGF0dGVtcHRlZCB0byBtb2RpZnkgZmlsZXMgb24geW91ciBzeXN0ZW0KK3RoYXQgYXJlIG5vdCB3aXRoaW4gdGhlIEVhc3lJbnN0YWxsIGJ1aWxkIGFyZWEsIGFuZCBoYXMgYmVlbiBhYm9ydGVkLgorCitUaGlzIHBhY2thZ2UgY2Fubm90IGJlIHNhZmVseSBpbnN0YWxsZWQgYnkgRWFzeUluc3RhbGwsIGFuZCBtYXkgbm90CitzdXBwb3J0IGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zIGV2ZW4gaWYgeW91IHJ1biBpdHMgc2V0dXAKK3NjcmlwdCBieSBoYW5kLiAgUGxlYXNlIGluZm9ybSB0aGUgcGFja2FnZSdzIGF1dGhvciBhbmQgdGhlIEVhc3lJbnN0YWxsCittYWludGFpbmVycyB0byBmaW5kIG91dCBpZiBhIGZpeCBvciB3b3JrYXJvdW5kIGlzIGF2YWlsYWJsZS4iIiIgJSBzZWxmLmFyZ3MKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHkgYi9MaWIvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxYjI3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2RlZiBfX2Jvb3QoKToKKyAgICBpbXBvcnQgc3lzLCBpbXAsIG9zLCBvcy5wYXRoCisgICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKKyAgICBpZiBQWVRIT05QQVRIIGlzIE5vbmUgb3IgKHN5cy5wbGF0Zm9ybT09J3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgorICAgICAgICBQWVRIT05QQVRIID0gW10KKyAgICBlbHNlOgorICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgcGljID0gZ2V0YXR0cihzeXMsJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLHt9KQorICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQorICAgIG15ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorICAgICNwcmludCAic2VhcmNoaW5nIixzdGRwYXRoLHN5cy5wYXRoCisKKyAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgorICAgICAgICBpZiBpdGVtPT1teWRpciBvciBub3QgaXRlbToKKyAgICAgICAgICAgIGNvbnRpbnVlICAgICMgc2tpcCBpZiBjdXJyZW50IGRpci4gb24gV2luZG93cywgb3IgbXkgb3duIGRpcmVjdG9yeQorICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKKyAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZSgnc2l0ZScpCisgICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCisgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKCdzaXRlJykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLFtpdGVtXSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKKyAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLHN0cmVhbSxwYXRoLGRlc2NyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKKworICAgICNwcmludCAibG9hZGVkIiwgX19maWxlX18KKworICAgIGtub3duX3BhdGhzID0gZGljdChbKG1ha2VwYXRoKGl0ZW0pWzFdLDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgIyAyLjIgY29tcAorCisgICAgb2xkcG9zID0gZ2V0YXR0cihzeXMsJ19fZWdnaW5zZXJ0JywwKSAgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCisgICAgc3lzLl9fZWdnaW5zZXJ0ID0gMCAgICAgICAgICAgICAgICAgICAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQorCisgICAgZm9yIGl0ZW0gaW4gUFlUSE9OUEFUSDoKKyAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQorCisgICAgc3lzLl9fZWdnaW5zZXJ0ICs9IG9sZHBvcyAgICAgICAgICAgIyByZXN0b3JlIGVmZmVjdGl2ZSBvbGQgcG9zaXRpb24KKworICAgIGQsbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQorICAgIGluc2VydF9hdCA9IE5vbmUKKyAgICBuZXdfcGF0aCA9IFtdCisKKyAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKKyAgICAgICAgcCxucCA9IG1ha2VwYXRoKGl0ZW0pCisKKyAgICAgICAgaWYgbnA9PW5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKKyAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBmaXJzdCAnc3lzdGVtJyBwYXRoIGVudHJ5LCBzbyBhZGRlZCBlbnRyaWVzIGdvIGhlcmUKKyAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKKworICAgICAgICBpZiBucCBpbiBrbm93bl9wYXRocyBvciBpbnNlcnRfYXQgaXMgTm9uZToKKyAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBuZXcgcGF0aCBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LCBiYWNrLWluc2VydCBpdAorICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKKyAgICAgICAgICAgIGluc2VydF9hdCArPSAxCisKKyAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCisKK2lmIF9fbmFtZV9fPT0nc2l0ZSc6CisgICAgX19ib290KCkKKyAgICBkZWwgX19ib290CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy90ZXN0cy9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzY3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDM2NCBAQAorIiIiVGVzdHMgZm9yIHRoZSAnc2V0dXB0b29scycgcGFja2FnZSIiIgorCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0U3VpdGUsIFRlc3RDYXNlLCBtYWtlU3VpdGUsIGRlZmF1bHRUZXN0TG9hZGVyCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5jbWQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgoraW1wb3J0IHNldHVwdG9vbHMsIHNldHVwdG9vbHMuZGlzdAorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBGZWF0dXJlCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24KK2Zyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBleHRyYWN0X2NvbnN0YW50LCBnZXRfbW9kdWxlX2NvbnN0YW50Citmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgZmluZF9tb2R1bGUsIFJlcXVpcmUKK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24sIExvb3NlVmVyc2lvbgorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitpbXBvcnQgc3lzLCBvcy5wYXRoCisKK2RlZiBhZGRpdGlvbmFsX3Rlc3RzKCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICByZXR1cm4gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoCisgICAgICAgICdhcGlfdGVzdHMudHh0Jywgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5FTExJUFNJUywgcGFja2FnZT1fX25hbWVfXywKKyAgICApCisKKworZGVmIG1ha2VTZXR1cCgqKmFyZ3MpOgorICAgICIiIlJldHVybiBkaXN0cmlidXRpb24gZnJvbSAnc2V0dXAoKiphcmdzKScsIHdpdGhvdXQgZXhlY3V0aW5nIGNvbW1hbmRzIiIiCisKKyAgICBkaXN0dXRpbHMuY29yZS5fc2V0dXBfc3RvcF9hZnRlciA9ICJjb21tYW5kbGluZSIKKworICAgICMgRG9uJ3QgbGV0IHN5c3RlbSBjb21tYW5kIGxpbmUgbGVhayBpbnRvIHRlc3RzIQorICAgIGFyZ3Muc2V0ZGVmYXVsdCgnc2NyaXB0X2FyZ3MnLFsnaW5zdGFsbCddKQorCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc2V0dXB0b29scy5zZXR1cCgqKmFyZ3MpCisgICAgZmluYWxseToKKyAgICAgICAgZGlzdHV0aWxzLmNvcmVfc2V0dXBfc3RvcF9hZnRlciA9IE5vbmUKKworCisKKworCisKKworY2xhc3MgRGVwZW5kc1Rlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0RXh0cmFjdENvbnN0KHNlbGYpOgorCisgICAgICAgIGZyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBleHRyYWN0X2NvbnN0YW50CisKKyAgICAgICAgZGVmIGYxKCk6CisgICAgICAgICAgICBnbG9iYWwgeCx5LHoKKyAgICAgICAgICAgIHggPSAidGVzdCIKKyAgICAgICAgICAgIHkgPSB6CisKKyAgICAgICAgIyB1bnJlY29nbml6ZWQgbmFtZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCdxJywgLTEpLCBOb25lKQorCisgICAgICAgICMgY29uc3RhbnQgYXNzaWduZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0X2NvbnN0YW50KGYxLmZ1bmNfY29kZSwneCcsIC0xKSwgInRlc3QiKQorCisgICAgICAgICMgZXhwcmVzc2lvbiBhc3NpZ25lZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCd5JywgLTEpLCAtMSkKKworICAgICAgICAjIHJlY29nbml6ZWQgbmFtZSwgbm90IGFzc2lnbmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdF9jb25zdGFudChmMS5mdW5jX2NvZGUsJ3onLCAtMSksIE5vbmUpCisKKworICAgIGRlZiB0ZXN0RmluZE1vZHVsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIGZpbmRfbW9kdWxlLCAnbm8tc3VjaC4tdGhpbmcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgZmluZF9tb2R1bGUsICdzZXR1cHRvb2xzLm5vbi1leGlzdGVudCcpCisgICAgICAgIGYscCxpID0gZmluZF9tb2R1bGUoJ3NldHVwdG9vbHMudGVzdHMnKTsgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdE1vZHVsZUV4dHJhY3Qoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBfX3ZlcnNpb25fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25zdGFudCgnZGlzdHV0aWxzJywnX192ZXJzaW9uX18nKSwgX192ZXJzaW9uX18KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25zdGFudCgnc3lzJywndmVyc2lvbicpLCBzeXMudmVyc2lvbgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRfbW9kdWxlX2NvbnN0YW50KCdzZXR1cHRvb2xzLnRlc3RzJywnX19kb2NfXycpLF9fZG9jX18KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RSZXF1aXJlKHNlbGYpOgorCisgICAgICAgIHJlcSA9IFJlcXVpcmUoJ0Rpc3R1dGlscycsJzEuMC4zJywnZGlzdHV0aWxzJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5uYW1lLCAnRGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEubW9kdWxlLCAnZGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEucmVxdWVzdGVkX3ZlcnNpb24sICcxLjAuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmF0dHJpYnV0ZSwgJ19fdmVyc2lvbl9fJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZnVsbF9uYW1lKCksICdEaXN0dXRpbHMtMS4wLjMnKQorCisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBfX3ZlcnNpb25fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfdmVyc2lvbigpLCBfX3ZlcnNpb25fXykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS52ZXJzaW9uX29rKCcxLjAuOScpKQorICAgICAgICBzZWxmLmZhaWxJZihyZXEudmVyc2lvbl9vaygnMC45LjEnKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLnZlcnNpb25fb2soJ3Vua25vd24nKSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX3ByZXNlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19jdXJyZW50KCkpCisKKyAgICAgICAgcmVxID0gUmVxdWlyZSgnRGlzdHV0aWxzIDMwMDAnLCcwMzAwMCcsJ2Rpc3R1dGlscycsZm9ybWF0PUxvb3NlVmVyc2lvbikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19wcmVzZW50KCkpCisgICAgICAgIHNlbGYuZmFpbElmKHJlcS5pc19jdXJyZW50KCkpCisgICAgICAgIHNlbGYuZmFpbElmKHJlcS52ZXJzaW9uX29rKCd1bmtub3duJykpCisKKyAgICAgICAgcmVxID0gUmVxdWlyZSgnRG8td2hhdC1JLW1lYW4nLCcxLjAnLCdkLXctaS1tJykKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLmlzX3ByZXNlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLmlzX2N1cnJlbnQoKSkKKworICAgICAgICByZXEgPSBSZXF1aXJlKCdUZXN0cycsIE5vbmUsICd0ZXN0cycsIGhvbWVwYWdlPSJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5mb3JtYXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmF0dHJpYnV0ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEucmVxdWVzdGVkX3ZlcnNpb24sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmZ1bGxfbmFtZSgpLCAnVGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5ob21lcGFnZSwgJ2h0dHA6Ly9leGFtcGxlLmNvbScpCisKKyAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5kaXJuYW1lKHApIGZvciBwIGluIF9fcGF0aF9fXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX3ByZXNlbnQocGF0aHMpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX2N1cnJlbnQocGF0aHMpKQorCisKKworY2xhc3MgRGlzdHJvVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmUxID0gRXh0ZW5zaW9uKCdiYXIuZXh0JyxbJ2Jhci5jJ10pCisgICAgICAgIHNlbGYuZTIgPSBFeHRlbnNpb24oJ2MueScsIFsneS5jJ10pCisKKyAgICAgICAgc2VsZi5kaXN0ID0gbWFrZVNldHVwKAorICAgICAgICAgICAgcGFja2FnZXM9WydhJywgJ2EuYicsICdhLmIuYycsICdiJywgJ2MnXSwKKyAgICAgICAgICAgIHB5X21vZHVsZXM9WydiLmQnLCd4J10sCisgICAgICAgICAgICBleHRfbW9kdWxlcyA9IChzZWxmLmUxLCBzZWxmLmUyKSwKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyID0ge30sCisgICAgICAgICkKKworCisgICAgZGVmIHRlc3REaXN0cm9UeXBlKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLmRpc3Qsc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbikpCisKKworICAgIGRlZiB0ZXN0RXhjbHVkZVBhY2thZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgWydiJywnYyddKQorCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgWydjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnB5X21vZHVsZXMsIFsneCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTEsIHNlbGYuZTJdKQorCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnB5X21vZHVsZXMsIFsneCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTFdKQorCisgICAgICAgICMgdGVzdCByZW1vdmFscyBmcm9tIHVuc3BlY2lmaWVkIG9wdGlvbnMKKyAgICAgICAgbWFrZVNldHVwKCkuZXhjbHVkZV9wYWNrYWdlKCd4JykKKworCisKKworCisKKworICAgIGRlZiB0ZXN0SW5jbHVkZUV4Y2x1ZGUoc2VsZik6CisgICAgICAgICMgcmVtb3ZlIGFuIGV4dGVuc2lvbgorICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZShleHRfbW9kdWxlcz1bc2VsZi5lMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMl0pCisKKyAgICAgICAgIyBhZGQgaXQgYmFjayBpbgorICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZShleHRfbW9kdWxlcz1bc2VsZi5lMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMiwgc2VsZi5lMV0pCisKKyAgICAgICAgIyBzaG91bGQgbm90IGFkZCBkdXBsaWNhdGUKKyAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUoZXh0X21vZHVsZXM9W3NlbGYuZTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTIsIHNlbGYuZTFdKQorCisgICAgZGVmIHRlc3RFeGNsdWRlUGFja2FnZXMoc2VsZik6CisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlKHBhY2thZ2VzPVsnYycsJ2InLCdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnBhY2thZ2VzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucHlfbW9kdWxlcywgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMV0pCisKKyAgICBkZWYgdGVzdEVtcHR5KHNlbGYpOgorICAgICAgICBkaXN0ID0gbWFrZVNldHVwKCkKKyAgICAgICAgZGlzdC5pbmNsdWRlKHBhY2thZ2VzPVsnYSddLCBweV9tb2R1bGVzPVsnYiddLCBleHRfbW9kdWxlcz1bc2VsZi5lMl0pCisgICAgICAgIGRpc3QgPSBtYWtlU2V0dXAoKQorICAgICAgICBkaXN0LmV4Y2x1ZGUocGFja2FnZXM9WydhJ10sIHB5X21vZHVsZXM9WydiJ10sIGV4dF9tb2R1bGVzPVtzZWxmLmUyXSkKKworICAgIGRlZiB0ZXN0Q29udGVudHMoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYScpKQorICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdhJykKKyAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2EnKSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2InKSkKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYicpCisgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdiJykpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdjJykpCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2MnKQorICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYycpKQorCisKKworCisgICAgZGVmIHRlc3RJbnZhbGlkSW5jbHVkZUV4Y2x1ZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgbm9uZXhpc3RlbnRfb3B0aW9uPSd4JworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgbm9uZXhpc3RlbnRfb3B0aW9uPSd4JworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgcGFja2FnZXM9eyd4JzoneSd9CisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBwYWNrYWdlcz17J3gnOid5J30KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIGV4dF9tb2R1bGVzPXsneCc6J3knfQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgZXh0X21vZHVsZXM9eyd4JzoneSd9CisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIHBhY2thZ2VfZGlyPVsncSddCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBwYWNrYWdlX2Rpcj1bJ3EnXQorICAgICAgICApCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBGZWF0dXJlVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmUoJ0Rpc3R1dGlscycsJzEuMC4zJywnZGlzdHV0aWxzJykKKyAgICAgICAgc2VsZi5kaXN0ID0gbWFrZVNldHVwKAorICAgICAgICAgICAgZmVhdHVyZXM9eworICAgICAgICAgICAgICAgICdmb28nOiBGZWF0dXJlKCJmb28iLHN0YW5kYXJkPVRydWUscmVxdWlyZV9mZWF0dXJlcz1bJ2Jheicsc2VsZi5yZXFdKSwKKyAgICAgICAgICAgICAgICAnYmFyJzogRmVhdHVyZSgiYmFyIiwgIHN0YW5kYXJkPVRydWUsIHBhY2thZ2VzPVsncGtnLmJhciddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X21vZHVsZXM9WydiYXJfZXQnXSwgcmVtb3ZlPVsnYmFyLmV4dCddLAorICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICdiYXonOiBGZWF0dXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgImJheiIsIG9wdGlvbmFsPUZhbHNlLCBwYWNrYWdlcz1bJ3BrZy5iYXonXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMgPSBbJ3NjcmlwdHMvYmF6X2l0J10sCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9WygnbGliZm9vJywnZm9vL2Zvb2Zvby5jJyldCisgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgJ2R3aW0nOiBGZWF0dXJlKCJEV0lNIiwgYXZhaWxhYmxlPUZhbHNlLCByZW1vdmU9J2JhemlzaCcpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsnLS13aXRob3V0LWJhcicsICdpbnN0YWxsJ10sCisgICAgICAgICAgICBwYWNrYWdlcyA9IFsncGtnLmJhcicsICdwa2cuZm9vJ10sCisgICAgICAgICAgICBweV9tb2R1bGVzID0gWydiYXJfZXQnLCAnYmF6aXNoJ10sCisgICAgICAgICAgICBleHRfbW9kdWxlcyA9IFtFeHRlbnNpb24oJ2Jhci5leHQnLFsnYmFyLmMnXSldCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbElmKAorICAgICAgICAgICAgRmVhdHVyZSgKKyAgICAgICAgICAgICAgICAidGVzdCIsc3RhbmRhcmQ9VHJ1ZSxyZW1vdmU9J3gnLGF2YWlsYWJsZT1GYWxzZQorICAgICAgICAgICAgKS5pbmNsdWRlX2J5X2RlZmF1bHQoKQorICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgIEZlYXR1cmUoInRlc3QiLHN0YW5kYXJkPVRydWUscmVtb3ZlPSd4JykuaW5jbHVkZV9ieV9kZWZhdWx0KCkKKyAgICAgICAgKQorICAgICAgICAjIEZlYXR1cmUgbXVzdCBoYXZlIGVpdGhlciBrd2FyZ3MsIHJlbW92ZXMsIG9yIHJlcXVpcmVfZmVhdHVyZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgRmVhdHVyZSwgInRlc3QiKQorCisgICAgZGVmIHRlc3RBdmFpbGFiaWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5mZWF0dXJlc1snZHdpbSddLmluY2x1ZGVfaW4sIHNlbGYuZGlzdAorICAgICAgICApCisKKyAgICBkZWYgdGVzdEZlYXR1cmVPcHRpb25zKHNlbGYpOgorICAgICAgICBkaXN0ID0gc2VsZi5kaXN0CisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aC1kd2ltJyxOb25lLCdpbmNsdWRlIERXSU0nKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aG91dC1kd2ltJyxOb25lLCdleGNsdWRlIERXSU0gKGRlZmF1bHQpJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKKyAgICAgICAgKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCisgICAgICAgICAgICAoJ3dpdGgtYmFyJyxOb25lLCdpbmNsdWRlIGJhciAoZGVmYXVsdCknKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aG91dC1iYXInLE5vbmUsJ2V4Y2x1ZGUgYmFyJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZmVhdHVyZV9uZWdvcHRbJ3dpdGhvdXQtZm9vJ10sJ3dpdGgtZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmZlYXR1cmVfbmVnb3B0Wyd3aXRob3V0LWJhciddLCd3aXRoLWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5mZWF0dXJlX25lZ29wdFsnd2l0aG91dC1kd2ltJ10sJ3dpdGgtZHdpbScpCisgICAgICAgIHNlbGYuZmFpbElmKCd3aXRob3V0LWJheicgaW4gZGlzdC5mZWF0dXJlX25lZ29wdCkKKworICAgIGRlZiB0ZXN0VXNlRmVhdHVyZXMoc2VsZik6CisgICAgICAgIGRpc3QgPSBzZWxmLmRpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LndpdGhfZm9vLDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC53aXRoX2JhciwwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3Qud2l0aF9iYXosMSkKKyAgICAgICAgc2VsZi5mYWlsSWYoJ2Jhcl9ldCcgaW4gZGlzdC5weV9tb2R1bGVzKQorICAgICAgICBzZWxmLmZhaWxJZigncGtnLmJhcicgaW4gZGlzdC5wYWNrYWdlcykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdwa2cuYmF6JyBpbiBkaXN0LnBhY2thZ2VzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3NjcmlwdHMvYmF6X2l0JyBpbiBkaXN0LnNjcmlwdHMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygoJ2xpYmZvbycsJ2Zvby9mb29mb28uYycpIGluIGRpc3QubGlicmFyaWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZXh0X21vZHVsZXMsW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5yZXF1aXJlX2ZlYXR1cmVzLCBbc2VsZi5yZXFdKQorCisgICAgICAgICMgSWYgd2UgYXNrIGZvciBiYXIsIGl0IHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgZXhwbGljaXRseSBkaXNhYmxlZAorICAgICAgICAjIGl0IG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGRpc3QuaW5jbHVkZV9mZWF0dXJlLCAnYmFyJykKKworICAgIGRlZiB0ZXN0RmVhdHVyZVdpdGhJbnZhbGlkUmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFN5c3RlbUV4aXQsIG1ha2VTZXR1cCwgZmVhdHVyZXMgPSB7J3gnOkZlYXR1cmUoJ3gnLCByZW1vdmU9J3knKX0KKyAgICAgICAgKQorCitjbGFzcyBUZXN0Q29tbWFuZFRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0VGVzdElzQ29tbWFuZChzZWxmKToKKyAgICAgICAgdGVzdF9jbWQgPSBtYWtlU2V0dXAoKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh0ZXN0X2NtZCwgZGlzdHV0aWxzLmNtZC5Db21tYW5kKSkKKworICAgIGRlZiB0ZXN0TG9uZ09wdFN1aXRlV05vRGVmYXVsdChzZWxmKToKKyAgICAgICAgdHMxID0gbWFrZVNldHVwKHNjcmlwdF9hcmdzPVsndGVzdCcsJy0tdGVzdC1zdWl0ZT1mb28udGVzdHMuc3VpdGUnXSkKKyAgICAgICAgdHMxID0gdHMxLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMS5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czEudGVzdF9zdWl0ZSwgJ2Zvby50ZXN0cy5zdWl0ZScpCisKKyAgICBkZWYgdGVzdERlZmF1bHRTdWl0ZShzZWxmKToKKyAgICAgICAgdHMyID0gbWFrZVNldHVwKHRlc3Rfc3VpdGU9J2Jhci50ZXN0cy5zdWl0ZScpLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMi5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czIudGVzdF9zdWl0ZSwgJ2Jhci50ZXN0cy5zdWl0ZScpCisKKyAgICBkZWYgdGVzdERlZmF1bHRXTW9kdWxlT25DbWRMaW5lKHNlbGYpOgorICAgICAgICB0czMgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICB0ZXN0X3N1aXRlPSdiYXIudGVzdHMnLAorICAgICAgICAgICAgc2NyaXB0X2FyZ3M9Wyd0ZXN0JywnLW0nLCdmb28udGVzdHMnXQorICAgICAgICApLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzMy5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czMudGVzdF9tb2R1bGUsICdmb28udGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMy50ZXN0X3N1aXRlLCAgJ2Zvby50ZXN0cy50ZXN0X3N1aXRlJykKKworICAgIGRlZiB0ZXN0Q29uZmxpY3RpbmdPcHRpb25zKHNlbGYpOgorICAgICAgICB0czQgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICBzY3JpcHRfYXJncz1bJ3Rlc3QnLCctbScsJ2Jhci50ZXN0cycsICctcycsJ2Zvby50ZXN0cy5zdWl0ZSddCisgICAgICAgICkuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIHRzNC5lbnN1cmVfZmluYWxpemVkKQorCisgICAgZGVmIHRlc3ROb1N1aXRlKHNlbGYpOgorICAgICAgICB0czUgPSBtYWtlU2V0dXAoKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQorICAgICAgICB0czUuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHM1LnRlc3Rfc3VpdGUsIE5vbmUpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy90ZXN0cy9hcGlfdGVzdHMudHh0IGIvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MzVhZDhkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dApAQCAtMCwwICsxLDMzMCBAQAorUGx1Z2dhYmxlIERpc3RyaWJ1dGlvbnMgb2YgUHl0aG9uIFNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGlzdHJpYnV0aW9ucworLS0tLS0tLS0tLS0tLQorCitBICJEaXN0cmlidXRpb24iIGlzIGEgY29sbGVjdGlvbiBvZiBmaWxlcyB0aGF0IHJlcHJlc2VudCBhICJSZWxlYXNlIiBvZiBhCisiUHJvamVjdCIgYXMgb2YgYSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUsIGRlbm90ZWQgYnkgYQorIlZlcnNpb24iOjoKKworICAgID4+PiBpbXBvcnQgc3lzLCBwa2dfcmVzb3VyY2VzCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uCisgICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuMiIpCisgICAgRm9vIDEuMgorCitEaXN0cmlidXRpb25zIGhhdmUgYSBsb2NhdGlvbiwgd2hpY2ggY2FuIGJlIGEgZmlsZW5hbWUsIFVSTCwgb3IgcmVhbGx5IGFueXRoaW5nCitlbHNlIHlvdSBjYXJlIHRvIHVzZTo6CisKKyAgICA+Pj4gZGlzdCA9IERpc3RyaWJ1dGlvbigKKyAgICAuLi4gICAgIGxvY2F0aW9uPSJodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nIiwKKyAgICAuLi4gICAgIHByb2plY3RfbmFtZT0iQmFyIiwgdmVyc2lvbj0iMC45IgorICAgIC4uLiApCisKKyAgICA+Pj4gZGlzdAorICAgIEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpCisKKworRGlzdHJpYnV0aW9ucyBoYXZlIHZhcmlvdXMgaW50cm9zcGVjdGFibGUgYXR0cmlidXRlczo6CisKKyAgICA+Pj4gZGlzdC5sb2NhdGlvbgorICAgICdodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nJworCisgICAgPj4+IGRpc3QucHJvamVjdF9uYW1lCisgICAgJ0JhcicKKworICAgID4+PiBkaXN0LnZlcnNpb24KKyAgICAnMC45JworCisgICAgPj4+IGRpc3QucHlfdmVyc2lvbiA9PSBzeXMudmVyc2lvbls6M10KKyAgICBUcnVlCisKKyAgICA+Pj4gcHJpbnQgZGlzdC5wbGF0Zm9ybQorICAgIE5vbmUKKworSW5jbHVkaW5nIHZhcmlvdXMgY29tcHV0ZWQgYXR0cmlidXRlczo6CisKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV92ZXJzaW9uCisgICAgPj4+IGRpc3QucGFyc2VkX3ZlcnNpb24gPT0gcGFyc2VfdmVyc2lvbihkaXN0LnZlcnNpb24pCisgICAgVHJ1ZQorCisgICAgPj4+IGRpc3Qua2V5ICAgICMgY2FzZS1pbnNlbnNpdGl2ZSBmb3JtIG9mIHRoZSBwcm9qZWN0IG5hbWUKKyAgICAnYmFyJworCitEaXN0cmlidXRpb25zIGFyZSBjb21wYXJlZCAoYW5kIGhhc2hlZCkgYnkgdmVyc2lvbiBmaXJzdDo6CisKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpID09IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjAnKQorICAgIFRydWUKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpID09IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjEnKQorICAgIEZhbHNlCisgICAgPj4+IERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjAnKSA8ICBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4xJykKKyAgICBUcnVlCisKK2J1dCBhbHNvIGJ5IHByb2plY3QgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSksIHBsYXRmb3JtLCBQeXRob24gdmVyc2lvbiwKK2xvY2F0aW9uLCBldGMuOjoKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iZm9vIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIix2ZXJzaW9uPSIxLjEiKQorICAgIEZhbHNlCisKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIixweV92ZXJzaW9uPSIyLjMiLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIixweV92ZXJzaW9uPSIyLjQiLHZlcnNpb249IjEuMCIpCisgICAgRmFsc2UKKworICAgID4+PiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKGxvY2F0aW9uPSJzcGFtIix2ZXJzaW9uPSIxLjAiKQorICAgIFRydWUKKworICAgID4+PiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpID09IFwKKyAgICAuLi4gRGlzdHJpYnV0aW9uKGxvY2F0aW9uPSJiYXoiLHZlcnNpb249IjEuMCIpCisgICAgRmFsc2UKKworCisKK0hhc2ggYW5kIGNvbXBhcmUgZGlzdHJpYnV0aW9uIGJ5IHByaW8vcGxhdAorCitHZXQgdmVyc2lvbiBmcm9tIG1ldGFkYXRhCitwcm92aWRlciBjYXBhYmlsaXRpZXMKK2VnZ19uYW1lKCkKK2FzX3JlcXVpcmVtZW50KCkKK2Zyb21fbG9jYXRpb24sIGZyb21fZmlsZW5hbWUgKHcvcGF0aCBub3JtYWxpemF0aW9uKQorCitSZWxlYXNlcyBtYXkgaGF2ZSB6ZXJvIG9yIG1vcmUgIlJlcXVpcmVtZW50cyIsIHdoaWNoIGluZGljYXRlCit3aGF0IHJlbGVhc2VzIG9mIGFub3RoZXIgcHJvamVjdCB0aGUgcmVsZWFzZSByZXF1aXJlcyBpbiBvcmRlciB0bworZnVuY3Rpb24uICBBIFJlcXVpcmVtZW50IG5hbWVzIHRoZSBvdGhlciBwcm9qZWN0LCBleHByZXNzZXMgc29tZSBjcml0ZXJpYQorYXMgdG8gd2hhdCByZWxlYXNlcyBvZiB0aGF0IHByb2plY3QgYXJlIGFjY2VwdGFibGUsIGFuZCBsaXN0cyBhbnkgIkV4dHJhcyIKK3RoYXQgdGhlIHJlcXVpcmluZyByZWxlYXNlIG1heSBuZWVkIGZyb20gdGhhdCBwcm9qZWN0LiAgKEFuIEV4dHJhIGlzIGFuCitvcHRpb25hbCBmZWF0dXJlIG9mIGEgUmVsZWFzZSwgdGhhdCBjYW4gb25seSBiZSB1c2VkIGlmIGl0cyBhZGRpdGlvbmFsCitSZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZC4pCisKKworCitUaGUgV29ya2luZyBTZXQKKy0tLS0tLS0tLS0tLS0tLQorCitBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgaXMgY2FsbGVkIGEgV29ya2luZyBTZXQuICBOb3RlIHRoYXQgYQorV29ya2luZyBTZXQgY2FuIGNvbnRhaW4gYW55IGltcG9ydGFibGUgZGlzdHJpYnV0aW9uLCBub3QganVzdCBwbHVnZ2FibGUgb25lcy4KK0ZvciBleGFtcGxlLCB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkgaXMgYW4gaW1wb3J0YWJsZSBkaXN0cmlidXRpb24gdGhhdAord2lsbCB1c3VhbGx5IGJlIHBhcnQgb2YgdGhlIFdvcmtpbmcgU2V0LCBldmVuIHRob3VnaCBpdCBpcyBub3QgcGx1Z2dhYmxlLgorU2ltaWxhcmx5LCB3aGVuIHlvdSBhcmUgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBvbiBhIHByb2plY3QsIHRoZSBmaWxlcyB5b3UgYXJlCitlZGl0aW5nIGFyZSBhbHNvIGEgRGlzdHJpYnV0aW9uLiAgKEFuZCwgd2l0aCBhIGxpdHRsZSBhdHRlbnRpb24gdG8gdGhlCitkaXJlY3RvcnkgbmFtZXMgdXNlZCwgIGFuZCBpbmNsdWRpbmcgc29tZSBhZGRpdGlvbmFsIG1ldGFkYXRhLCBzdWNoIGEKKyJkZXZlbG9wbWVudCBkaXN0cmlidXRpb24iIGNhbiBiZSBtYWRlIHBsdWdnYWJsZSBhcyB3ZWxsLikKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IFdvcmtpbmdTZXQKKworQSB3b3JraW5nIHNldCdzIGVudHJpZXMgYXJlIHRoZSBzeXMucGF0aCBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYWN0aXZlCitkaXN0cmlidXRpb25zLiAgQnkgZGVmYXVsdCwgdGhlIHdvcmtpbmcgc2V0J3MgZW50cmllcyBhcmUgdGhlIGl0ZW1zIG9uCitgYHN5cy5wYXRoYGA6OgorCisgICAgPj4+IHdzID0gV29ya2luZ1NldCgpCisgICAgPj4+IHdzLmVudHJpZXMgPT0gc3lzLnBhdGgKKyAgICBUcnVlCisKK0J1dCB5b3UgY2FuIGFsc28gY3JlYXRlIGFuIGVtcHR5IHdvcmtpbmcgc2V0IGV4cGxpY2l0bHksIGFuZCBhZGQgZGlzdHJpYnV0aW9ucwordG8gaXQ6OgorCisgICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKKyAgICA+Pj4gd3MuYWRkKGRpc3QpCisgICAgPj4+IHdzLmVudHJpZXMKKyAgICBbJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnXQorICAgID4+PiBkaXN0IGluIHdzCisgICAgVHJ1ZQorICAgID4+PiBEaXN0cmlidXRpb24oJ2ZvbycsdmVyc2lvbj0iIikgaW4gd3MKKyAgICBGYWxzZQorCitBbmQgeW91IGNhbiBpdGVyYXRlIG92ZXIgaXRzIGRpc3RyaWJ1dGlvbnM6OgorCisgICAgPj4+IGxpc3Qod3MpCisgICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQorCitBZGRpbmcgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3A6OgorCisgICAgPj4+IHdzLmFkZChkaXN0KQorICAgID4+PiBsaXN0KHdzKQorICAgIFtCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKV0KKworRm9yIHRoYXQgbWF0dGVyLCBhZGRpbmcgbXVsdGlwbGUgZGlzdHJpYnV0aW9ucyBmb3IgdGhlIHNhbWUgcHJvamVjdCBhbHNvIGRvZXMKK25vdGhpbmcsIGJlY2F1c2UgYSB3b3JraW5nIHNldCBjYW4gb25seSBob2xkIG9uZSBhY3RpdmUgZGlzdHJpYnV0aW9uIHBlcgorcHJvamVjdCAtLSB0aGUgZmlyc3Qgb25lIGFkZGVkIHRvIGl0OjoKKworICAgID4+PiB3cy5hZGQoCisgICAgLi4uICAgICBEaXN0cmlidXRpb24oCisgICAgLi4uICAgICAgICAgJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnLCBwcm9qZWN0X25hbWU9IkJhciIsCisgICAgLi4uICAgICAgICAgdmVyc2lvbj0iNy4yIgorICAgIC4uLiAgICAgKQorICAgIC4uLiApCisgICAgPj4+IGxpc3Qod3MpCisgICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQorCitZb3UgY2FuIGFwcGVuZCBhIHBhdGggZW50cnkgdG8gYSB3b3JraW5nIHNldCB1c2luZyBgYGFkZF9lbnRyeSgpYGA6OgorCisgICAgPj4+IHdzLmVudHJpZXMKKyAgICBbJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnXQorICAgID4+PiB3cy5hZGRfZW50cnkocGtnX3Jlc291cmNlcy5fX2ZpbGVfXykKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZycsICcuLi5wa2dfcmVzb3VyY2VzLnB5Li4uJ10KKworTXVsdGlwbGUgYWRkaXRpb25zIHJlc3VsdCBpbiBtdWx0aXBsZSBlbnRyaWVzLCBldmVuIGlmIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGluCit0aGUgd29ya2luZyBzZXQgKGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIGVudHJ5IG1vcmUgdGhhbgorb25jZSk6OgorCisgICAgPj4+IHdzLmFkZF9lbnRyeShwa2dfcmVzb3VyY2VzLl9fZmlsZV9fKQorICAgID4+PiB3cy5lbnRyaWVzCisgICAgWycuLi5leGFtcGxlLmNvbS4uLicsICcuLi5wa2dfcmVzb3VyY2VzLi4uJywgJy4uLnBrZ19yZXNvdXJjZXMuLi4nXQorCitBbmQgeW91IGNhbiBzcGVjaWZ5IHRoZSBwYXRoIGVudHJ5IGEgZGlzdHJpYnV0aW9uIHdhcyBmb3VuZCB1bmRlciwgdXNpbmcgdGhlCitvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIHRvIGBgYWRkKClgYDo6CisKKyAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KFtdKQorICAgID4+PiB3cy5hZGQoZGlzdCwiZm9vIikKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnZm9vJ10KKworQnV0IGV2ZW4gaWYgYSBkaXN0cmlidXRpb24gaXMgZm91bmQgdW5kZXIgbXVsdGlwbGUgcGF0aCBlbnRyaWVzLCBpdCBzdGlsbCBvbmx5CitzaG93cyB1cCBvbmNlIHdoZW4gaXRlcmF0aW5nIHRoZSB3b3JraW5nIHNldDoKKworICAgID4+PiB3cy5hZGRfZW50cnkod3MuZW50cmllc1swXSkKKyAgICA+Pj4gbGlzdCh3cykKKyAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCisKK1lvdSBjYW4gYXNrIGEgV29ya2luZ1NldCB0byBgYGZpbmQoKWBgIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGEgcmVxdWlyZW1lbnQ6OgorCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgUmVxdWlyZW1lbnQKKyAgICA+Pj4gcHJpbnQgd3MuZmluZChSZXF1aXJlbWVudC5wYXJzZSgiRm9vPT0xLjAiKSkgICAgIyBubyBtYXRjaCwgcmV0dXJuIE5vbmUKKyAgICBOb25lCisKKyAgICA+Pj4gd3MuZmluZChSZXF1aXJlbWVudC5wYXJzZSgiQmFyPT0wLjkiKSkgICMgbWF0Y2gsIHJldHVybiBkaXN0cmlidXRpb24KKyAgICBCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKQorCitOb3RlIHRoYXQgYXNraW5nIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24gb2YgYSBkaXN0cmlidXRpb24gYWxyZWFkeSBpbiBhCit3b3JraW5nIHNldCB0cmlnZ2VycyBhIGBgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3RgYCBlcnJvcjoKKworICAgID4+PiB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJCYXI9PTEuMCIpKSAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFZlcnNpb25Db25mbGljdDogKEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpLAorICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50LnBhcnNlKCdCYXI9PTEuMCcpKQorCitZb3UgY2FuIHN1YnNjcmliZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuZXZlciBhIG5ldworZGlzdHJpYnV0aW9uIGlzIGFkZGVkIHRvIGEgd29ya2luZyBzZXQuICBUaGUgY2FsbGJhY2sgaXMgaW1tZWRpYXRlbHkgaW52b2tlZAorb25jZSBmb3IgZWFjaCBleGlzdGluZyBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LCBhbmQgdGhlbiBpcyBjYWxsZWQKK2FnYWluIGZvciBuZXcgZGlzdHJpYnV0aW9ucyBhZGRlZCB0aGVyZWFmdGVyOjoKKworICAgID4+PiBkZWYgYWRkZWQoZGlzdCk6IHByaW50ICJBZGRlZCIsIGRpc3QKKyAgICA+Pj4gd3Muc3Vic2NyaWJlKGFkZGVkKQorICAgIEFkZGVkIEJhciAwLjkKKyAgICA+Pj4gZm9vMTIgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLCB2ZXJzaW9uPSIxLjIiLCBsb2NhdGlvbj0iZjEyIikgCisgICAgPj4+IHdzLmFkZChmb28xMikKKyAgICBBZGRlZCBGb28gMS4yCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgb25seSB0aGUgZmlyc3QgZGlzdHJpYnV0aW9uIGFkZGVkIGZvciBhIGdpdmVuIHByb2plY3QgbmFtZQord2lsbCB0cmlnZ2VyIGEgY2FsbGJhY2ssIGV2ZW4gZHVyaW5nIHRoZSBpbml0aWFsIGBgc3Vic2NyaWJlKClgYCBjYWxsYmFjazo6CisKKyAgICA+Pj4gZm9vMTQgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLCB2ZXJzaW9uPSIxLjQiLCBsb2NhdGlvbj0iZjE0IikgCisgICAgPj4+IHdzLmFkZChmb28xNCkgICAjIG5vIGNhbGxiYWNrLCBiZWNhdXNlIEZvbyAxLjIgaXMgYWxyZWFkeSBhY3RpdmUKKworICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgPj4+IHdzLmFkZChmb28xMikKKyAgICA+Pj4gd3MuYWRkKGZvbzE0KQorICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpCisgICAgQWRkZWQgRm9vIDEuMgorICAgIAorQW5kIGFkZGluZyBhIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlIGhhcyBubyBlZmZlY3QsIGVpdGhlcjo6CisKKyAgICA+Pj4gd3Muc3Vic2NyaWJlKGFkZGVkKSAgICAgIyBubyBjYWxsYmFja3MKKworICAgICMgYW5kIG5vIGRvdWJsZS1jYWxsYmFja3Mgb24gc3Vic2VxdWVudCBhZGRpdGlvbnMsIGVpdGhlcgorICAgID4+PiBqdXN0X2FfdGVzdCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9Ikp1c3RBVGVzdCIsIHZlcnNpb249IjAuOTkiKQorICAgID4+PiB3cy5hZGQoanVzdF9hX3Rlc3QpCisgICAgQWRkZWQgSnVzdEFUZXN0IDAuOTkKKworCitGaW5kaW5nIFBsdWdpbnMKKy0tLS0tLS0tLS0tLS0tLQorCitgYFdvcmtpbmdTZXRgYCBvYmplY3RzIGNhbiBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hhdCBwbHVnaW5zIGluIGFuCitgYEVudmlyb25tZW50YGAgY2FuIGJlIGxvYWRlZCB3aXRob3V0IGFueSByZXNvbHV0aW9uIGVycm9yczo6CisKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBFbnZpcm9ubWVudAorCisgICAgPj4+IHBsdWdpbnMgPSBFbnZpcm9ubWVudChbXSkgICAjIG5vcm1hbGx5LCBhIGxpc3Qgb2YgcGx1Z2luIGRpcmVjdG9yaWVzCisgICAgPj4+IHBsdWdpbnMuYWRkKGZvbzEyKQorICAgID4+PiBwbHVnaW5zLmFkZChmb28xNCkKKyAgICA+Pj4gcGx1Z2lucy5hZGQoanVzdF9hX3Rlc3QpCisgICAgCitJbiB0aGUgc2ltcGxlc3QgY2FzZSwgd2UganVzdCBnZXQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIGVhY2ggZGlzdHJpYnV0aW9uIGluCit0aGUgcGx1Z2luIGVudmlyb25tZW50OjoKKworICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zKQorICAgIChbSnVzdEFUZXN0IDAuOTksIEZvbyAxLjQgKGYxNCldLCB7fSkKKworQnV0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggYSB2ZXJzaW9uIGNvbmZsaWN0IG9yIG1pc3NpbmcgcmVxdWlyZW1lbnRzLCB0aGUKK21ldGhvZCBmYWxscyBiYWNrIHRvIG9sZGVyIHZlcnNpb25zLCBhbmQgdGhlIGVycm9yIGluZm8gZGljdCB3aWxsIGNvbnRhaW4gYW4KK2V4Y2VwdGlvbiBpbnN0YW5jZSBmb3IgZWFjaCB1bmxvYWRhYmxlIHBsdWdpbjo6CisKKyAgICA+Pj4gd3MuYWRkKGZvbzEyKSAgICMgdGhpcyB3aWxsIGNvbmZsaWN0IHdpdGggRm9vIDEuNAorICAgID4+PiB3cy5maW5kX3BsdWdpbnMocGx1Z2lucykKKyAgICAoW0p1c3RBVGVzdCAwLjk5LCBGb28gMS4yIChmMTIpXSwge0ZvbyAxLjQgKGYxNCk6IFZlcnNpb25Db25mbGljdCguLi4pfSkKKworQnV0IGlmIHlvdSBkaXNhbGxvdyBmYWxsYmFja3MsIHRoZSBmYWlsZWQgcGx1Z2luIHdpbGwgYmUgc2tpcHBlZCBpbnN0ZWFkIG9mCit0cnlpbmcgb2xkZXIgdmVyc2lvbnM6OgorCisgICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAoW0p1c3RBVGVzdCAwLjk5XSwge0ZvbyAxLjQgKGYxNCk6IFZlcnNpb25Db25mbGljdCguLi4pfSkKKworCisKK1BsYXRmb3JtIENvbXBhdGliaWxpdHkgUnVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT24gdGhlIE1hYywgdGhlcmUgYXJlIHBvdGVudGlhbCBjb21wYXRpYmlsaXR5IGlzc3VlcyBmb3IgbW9kdWxlcyBjb21waWxlZAorb24gbmV3ZXIgdmVyc2lvbnMgb2YgTWFjIE9TIFggdGhhbiB3aGF0IHRoZSB1c2VyIGlzIHJ1bm5pbmcuIEFkZGl0aW9uYWxseSwKK01hYyBPUyBYIHdpbGwgc29vbiBoYXZlIHR3byBwbGF0Zm9ybXMgdG8gY29udGVuZCB3aXRoOiBJbnRlbCBhbmQgUG93ZXJQQy4KKworQmFzaWMgZXF1YWxpdHkgd29ya3MgYXMgb24gb3RoZXIgcGxhdGZvcm1zOjoKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGNvbXBhdGlibGVfcGxhdGZvcm1zIGFzIGNwCisgICAgPj4+IHJlcWQgPSAnbWFjb3N4LTEwLjQtcHBjJworICAgID4+PiBjcChyZXFkLCByZXFkKQorICAgIFRydWUKKyAgICA+Pj4gY3AoIndpbjMyIiwgcmVxZCkKKyAgICBGYWxzZQorCitEaXN0cmlidXRpb25zIG1hZGUgb24gb3RoZXIgbWFjaGluZSB0eXBlcyBhcmUgbm90IGNvbXBhdGlibGU6OgorCisgICAgPj4+IGNwKCJtYWNvc3gtMTAuNC1pMzg2IiwgcmVxZCkKKyAgICBGYWxzZQorCitEaXN0cmlidXRpb25zIG1hZGUgb24gZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgT1MgYXJlIGNvbXBhdGlibGUsIGFzCitsb25nIGFzIHRoZXkgYXJlIGZyb20gdGhlIHNhbWUgdG9wLWxldmVsIHZlcnNpb24uIFRoZSBwYXRjaGxldmVsIHZlcnNpb24KK251bWJlciBkb2VzIG5vdCBtYXR0ZXI6OgorCisgICAgPj4+IGNwKCJtYWNvc3gtMTAuNC1wcGMiLCByZXFkKQorICAgIFRydWUKKyAgICA+Pj4gY3AoIm1hY29zeC0xMC4zLXBwYyIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgibWFjb3N4LTEwLjUtcHBjIiwgcmVxZCkKKyAgICBGYWxzZQorICAgID4+PiBjcCgibWFjb3N4LTkuNS1wcGMiLCByZXFkKQorICAgIEZhbHNlCisKK0JhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBwYWNrYWdlcyBtYWRlIHZpYSBlYXJsaWVyIHZlcnNpb25zIG9mIAorc2V0dXB0b29scyBpcyBwcm92aWRlZCBhcyB3ZWxsOjoKKworICAgID4+PiBjcCgiZGFyd2luLTguMi4wLVBvd2VyX01hY2ludG9zaCIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgiZGFyd2luLTcuMi4wLVBvd2VyX01hY2ludG9zaCIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgiZGFyd2luLTguMi4wLVBvd2VyX01hY2ludG9zaCIsICJtYWNvc3gtMTAuMy1wcGMiKQorICAgIEZhbHNlCisKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL3Rlc3RfcmVzb3VyY2VzLnB5IGIvTGliL3NldHVwdG9vbHMvdGVzdHMvdGVzdF9yZXNvdXJjZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYzcyZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL3Rlc3RfcmVzb3VyY2VzLnB5CkBAIC0wLDAgKzEsNDgzIEBACitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgbWFrZVN1aXRlCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKK2ltcG9ydCBwa2dfcmVzb3VyY2VzLCBzeXMKK2Zyb20gc2V0cyBpbXBvcnQgSW1tdXRhYmxlU2V0CisKK2NsYXNzIE1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgorICAgICIiIk1vY2sgb2JqZWN0IHRvIHJldHVybiBtZXRhZGF0YSBhcyBpZiBmcm9tIGFuIG9uLWRpc2sgZGlzdHJpYnV0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwqcGFpcnMpOgorICAgICAgICBzZWxmLm1ldGFkYXRhID0gZGljdChwYWlycykKKworICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZixuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5tZXRhZGF0YQorCisgICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YVtuYW1lXQorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCisKKworY2xhc3MgRGlzdHJvVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RDb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIGVtcHR5IHBhdGggc2hvdWxkIHByb2R1Y2Ugbm8gZGlzdHJpYnV0aW9ucworICAgICAgICBhZCA9IEVudmlyb25tZW50KFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRbJ0Zvb1BrZyddLFtdKQorCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuM18xLmVnZyIpKQorICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjQtcHkyLjQtd2luMzIuZWdnIikpCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKSkKKworICAgICAgICAjIE5hbWUgaXMgaW4gdGhlcmUgbm93CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhZFsnRm9vUGtnJ10pCisKKyAgICAgICAgIyBCdXQgb25seSAxIHBhY2thZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgWydmb29wa2cnXSkKKworCisKKyAgICAgICAgIyBEaXN0cmlidXRpb25zIHNvcnQgYnkgdmVyc2lvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMy0xJywnMS4yJ10KKyAgICAgICAgKQorICAgICAgICAjIFJlbW92aW5nIGEgZGlzdHJpYnV0aW9uIGxlYXZlcyBzZXF1ZW5jZSBhbG9uZQorICAgICAgICBhZC5yZW1vdmUoYWRbJ0Zvb1BrZyddWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMiddCisgICAgICAgICkKKyAgICAgICAgIyBBbmQgaW5zZXJ0aW5nIGFkZHMgdGhlbSBpbiBvcmRlcgorICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjkuZWdnIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbZGlzdC52ZXJzaW9uIGZvciBkaXN0IGluIGFkWydGb29Qa2cnXV0sIFsnMS45JywnMS40JywnMS4yJ10KKyAgICAgICAgKQorCisgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKKyAgICAgICAgZm9vMTIgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKQorICAgICAgICBmb28xNCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS40LXB5Mi40LXdpbjMyLmVnZyIpCisgICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvb1BrZz49MS4zIikKKworICAgICAgICAjIE5vbWluYWwgY2FzZTogbm8gZGlzdHJvcyBvbiBwYXRoLCBzaG91bGQgeWllbGQgYWxsIGFwcGxpY2FibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZC5iZXN0X21hdGNoKHJlcSx3cykudmVyc2lvbiwgJzEuOScpCisgICAgICAgICMgSWYgYSBtYXRjaGluZyBkaXN0cm8gaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHNob3VsZCByZXR1cm4gb25seSB0aGF0CisgICAgICAgIHdzLmFkZChmb28xNCk7IHNlbGYuYXNzZXJ0RXF1YWwoYWQuYmVzdF9tYXRjaChyZXEsd3MpLnZlcnNpb24sICcxLjQnKQorCisgICAgICAgICMgSWYgdGhlIGZpcnN0IG1hdGNoaW5nIGRpc3RybyBpcyB1bnN1aXRhYmxlLCBpdCdzIGEgdmVyc2lvbiBjb25mbGljdAorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZlcnNpb25Db25mbGljdCwgYWQuYmVzdF9tYXRjaCwgcmVxLCB3cykKKworICAgICAgICAjIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggb24gdGhlIHBhdGgsIHRoZSBmaXJzdCBvbmUgdGFrZXMgcHJlY2VkZW5jZQorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTQpOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkLmJlc3RfbWF0Y2gocmVxLHdzKS52ZXJzaW9uLCAnMS40JykKKworICAgIGRlZiBjaGVja0Zvb1BrZyhzZWxmLGQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHJvamVjdF9uYW1lLCAiRm9vUGtnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleSwgImZvb3BrZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52ZXJzaW9uLCAiMS4zLTEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHlfdmVyc2lvbiwgIjIuNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wbGF0Zm9ybSwgIndpbjMyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBhcnNlZF92ZXJzaW9uLCBwYXJzZV92ZXJzaW9uKCIxLjMtMSIpKQorCisgICAgZGVmIHRlc3REaXN0cm9CYXNpY3Moc2VsZik6CisgICAgICAgIGQgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICAiL3NvbWUvcGF0aCIsCisgICAgICAgICAgICBwcm9qZWN0X25hbWU9IkZvb1BrZyIsdmVyc2lvbj0iMS4zLTEiLHB5X3ZlcnNpb249IjIuNCIscGxhdGZvcm09IndpbjMyIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKKworICAgICAgICBkID0gRGlzdHJpYnV0aW9uKCIvc29tZS9wYXRoIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnB5X3ZlcnNpb24sIHN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBsYXRmb3JtLCBOb25lKQorCisgICAgZGVmIHRlc3REaXN0cm9QYXJzZShzZWxmKToKKyAgICAgICAgZCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEtcHkyLjQtd2luMzIuZWdnIikKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorICAgICAgICBkID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjNfMS1weTIuNC13aW4zMi5lZ2ctaW5mbyIpCisgICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKKworICAgIGRlZiB0ZXN0RGlzdHJvTWV0YWRhdGEoc2VsZik6CisgICAgICAgIGQgPSBEaXN0cmlidXRpb24oCisgICAgICAgICAgICAiL3NvbWUvcGF0aCIsIHByb2plY3RfbmFtZT0iRm9vUGtnIiwgcHlfdmVyc2lvbj0iMi40IiwgcGxhdGZvcm09IndpbjMyIiwKKyAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgKCdQS0ctSU5GTycsIk1ldGFkYXRhLVZlcnNpb246IDEuMFxuVmVyc2lvbjogMS4zLTFcbiIpCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorCisKKyAgICBkZWYgZGlzdFJlcXVpcmVzKHNlbGYsIHR4dCk6CisgICAgICAgIHJldHVybiBEaXN0cmlidXRpb24oIi9mb28iLCBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgdHh0KSkpCisKKyAgICBkZWYgY2hlY2tSZXF1aXJlcyhzZWxmLCBkaXN0LCB0eHQsIGV4dHJhcz0oKSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBsaXN0KGRpc3QucmVxdWlyZXMoZXh0cmFzKSksCisgICAgICAgICAgICBsaXN0KHBhcnNlX3JlcXVpcmVtZW50cyh0eHQpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdERpc3Ryb0RlcGVuZHNTaW1wbGUoc2VsZik6CisgICAgICAgIGZvciB2IGluICJUd2lzdGVkPj0xLjUiLCAiVHdpc3RlZD49MS41XG5aQ29uZmlnPj0yLjAiOgorICAgICAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKHNlbGYuZGlzdFJlcXVpcmVzKHYpLCB2KQorCisKKyAgICBkZWYgdGVzdFJlc29sdmUoc2VsZik6CisgICAgICAgIGFkID0gRW52aXJvbm1lbnQoW10pOyB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgICAgICMgUmVzb2x2aW5nIG5vIHJlcXVpcmVtZW50cyAtPiBub3RoaW5nIHRvIGluc3RhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggbGlzdCh3cy5yZXNvbHZlKFtdLGFkKSksIFtdICkKKyAgICAgICAgIyBSZXF1ZXN0IHNvbWV0aGluZyBub3QgaW4gdGhlIGNvbGxlY3Rpb24gLT4gRGlzdHJpYnV0aW9uTm90Rm91bmQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgd3MucmVzb2x2ZSwgcGFyc2VfcmVxdWlyZW1lbnRzKCJGb28iKSwgYWQKKyAgICAgICAgKQorICAgICAgICBGb28gPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICIvZm9vX2Rpci9Gb28tMS4yLmVnZyIsCisgICAgICAgICAgICBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgIltiYXJdXG5CYXo+PTIuMCIpKQorICAgICAgICApCisgICAgICAgIGFkLmFkZChGb28pOyBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvby0wLjkuZWdnIikpCisKKyAgICAgICAgIyBSZXF1ZXN0IHRoaW5nKHMpIHRoYXQgYXJlIGF2YWlsYWJsZSAtPiBsaXN0IHRvIGFjdGl2YXRlCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgdGFyZ2V0cyA9IGxpc3Qod3MucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMoIkZvbyIpLCBhZCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIFtGb29dKQorICAgICAgICAgICAgbWFwKHdzLmFkZCx0YXJnZXRzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWZXJzaW9uQ29uZmxpY3QsIHdzLnJlc29sdmUsCisgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz09MC45IiksIGFkKQorICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pICMgcmVzZXQKKworICAgICAgICAjIFJlcXVlc3QgYW4gZXh0cmEgdGhhdCBjYXVzZXMgYW4gdW5yZXNvbHZlZCBkZXBlbmRlbmN5IGZvciAiQmF6IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCB3cy5yZXNvbHZlLHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQKKyAgICAgICAgKQorICAgICAgICBCYXogPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICIvZm9vX2Rpci9CYXotMi4xLmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgnZGVwZW5kcy50eHQnLCAiRm9vIikpCisgICAgICAgICkKKyAgICAgICAgYWQuYWRkKEJheikKKworICAgICAgICAjIEFjdGl2YXRpb24gbGlzdCBub3cgaW5jbHVkZXMgcmVzb2x2ZWQgZGVwZW5kZW5jeQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbGlzdCh3cy5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQpKSwgW0ZvbyxCYXpdCisgICAgICAgICkKKyAgICAgICAgIyBSZXF1ZXN0cyBmb3IgY29uZmxpY3RpbmcgdmVyc2lvbnMgcHJvZHVjZSBWZXJzaW9uQ29uZmxpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoIFZlcnNpb25Db25mbGljdCwKKyAgICAgICAgICAgIHdzLnJlc29sdmUsIHBhcnNlX3JlcXVpcmVtZW50cygiRm9vPT0xLjJcbkZvbyE9MS4yIiksIGFkCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RGlzdHJvRGVwZW5kc09wdGlvbnMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmRpc3RSZXF1aXJlcygiIiIKKyAgICAgICAgICAgIFR3aXN0ZWQ+PTEuNQorICAgICAgICAgICAgW2RvY2dlbl0KKyAgICAgICAgICAgIFpDb25maWc+PTIuMAorICAgICAgICAgICAgZG9jdXRpbHM+PTAuMworICAgICAgICAgICAgW2Zhc3RjZ2ldCisgICAgICAgICAgICBmY2dpYXBwPj0wLjEiIiIpCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcyhkLCJUd2lzdGVkPj0xLjUiKQorICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCisgICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksIFsiZG9jZ2VuIl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCisgICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgZmNnaWFwcD49MC4xIi5zcGxpdCgpLCBbImZhc3RjZ2kiXQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBaQ29uZmlnPj0yLjAgZG9jdXRpbHM+PTAuMyBmY2dpYXBwPj0wLjEiLnNwbGl0KCksCisgICAgICAgICAgICBbImRvY2dlbiIsImZhc3RjZ2kiXQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBmY2dpYXBwPj0wLjEgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksCisgICAgICAgICAgICBbImZhc3RjZ2kiLCAiZG9jZ2VuIl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmtub3duRXh0cmEsIGQucmVxdWlyZXMsIFsiZm9vIl0pCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgRW50cnlQb2ludFRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRmaWVsZHMoc2VsZiwgZXApOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsInNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmF0dHJzLCAoIkVudHJ5UG9pbnRUZXN0cyIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5leHRyYXMsICgieCIsKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVwLmxvYWQoKSBpcyBFbnRyeVBvaW50VGVzdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzdHIoZXApLAorICAgICAgICAgICAgImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKKyAgICAgICAgKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKKyAgICAgICAgICAgICJGb29Qa2ctMS4yLXB5Mi40LmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgncmVxdWlyZXMudHh0JywnW3hdJykpKQorCisgICAgZGVmIHRlc3RCYXNpY3Moc2VsZik6CisgICAgICAgIGVwID0gRW50cnlQb2ludCgKKyAgICAgICAgICAgICJmb28iLCAic2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlcyIsIFsiRW50cnlQb2ludFRlc3RzIl0sCisgICAgICAgICAgICBbIngiXSwgc2VsZi5kaXN0CisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCisKKyAgICBkZWYgdGVzdFBhcnNlKHNlbGYpOgorICAgICAgICBzID0gImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKHMsIHNlbGYuZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCisKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKCJiYXIgYmF6PSAgc3BhbW1pdHlbUElOR10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImJhciBiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm1vZHVsZV9uYW1lLCJzcGFtbWl0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuYXR0cnMsICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmV4dHJhcywgKCJwaW5nIiwpKQorCisgICAgICAgIGVwID0gRW50cnlQb2ludC5wYXJzZSgiIGZpenpseSA9ICB3b2NrYTpmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZpenpseSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsIndvY2thIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5hdHRycywgKCJmb28iLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuZXh0cmFzLCAoKSkKKworICAgIGRlZiB0ZXN0UmVqZWN0cyhzZWxmKToKKyAgICAgICAgZm9yIGVwIGluIFsKKyAgICAgICAgICAgICJmb28iLCAieD0xPTIiLCAieD1hOmI6YyIsICJxPXgvbmEiLCAiZmV6PXBpc2g6dHVzaC16IiwgIng9ZlthXT4yIiwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHRyeTogRW50cnlQb2ludC5wYXJzZShlcCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgICAgICBlbHNlOiByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkJ3ZlIGJlZW4gYmFkIiwgZXApCisKKyAgICBkZWYgY2hlY2tTdWJNYXAoc2VsZiwgbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG0pLAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAiJ2ZlYXR1cmUyJzogRW50cnlQb2ludC5wYXJzZSgiCisgICAgICAgICAgICAgICAgIidmZWF0dXJlMiA9IGFub3RoZXIubW9kdWxlOlNvbWVDbGFzcyBbZXh0cmExLGV4dHJhMl0nKSwgIgorICAgICAgICAgICAgIidmZWF0dXJlMSc6IEVudHJ5UG9pbnQucGFyc2UoIgorICAgICAgICAgICAgICAgICInZmVhdHVyZTEgPSBzb21lbW9kdWxlOnNvbWVmdW5jdGlvbicpIgorICAgICAgICAgICAgIn0iCisgICAgICAgICkKKworICAgIHN1Ym1hcF9zdHIgPSAiIiIKKyAgICAgICAgICAgICMgZGVmaW5lIGZlYXR1cmVzIGZvciBibGFoIGJsYWgKKyAgICAgICAgICAgIGZlYXR1cmUxID0gc29tZW1vZHVsZTpzb21lZnVuY3Rpb24KKyAgICAgICAgICAgIGZlYXR1cmUyID0gYW5vdGhlci5tb2R1bGU6U29tZUNsYXNzIFtleHRyYTEsZXh0cmEyXQorICAgICIiIgorCisgICAgZGVmIHRlc3RQYXJzZUxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTdWJNYXAoRW50cnlQb2ludC5wYXJzZV9ncm91cCgieHl6Iiwgc2VsZi5zdWJtYXBfc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgInggYSIsICJmb289YmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgIngiLAorICAgICAgICAgICAgWyJmb289YmF6IiwgImZvbz1iYXIiXSkKKworICAgIGRlZiB0ZXN0UGFyc2VNYXAoc2VsZik6CisgICAgICAgIG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcCh7J3h5eic6c2VsZi5zdWJtYXBfc3RyfSkKKyAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQorICAgICAgICBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoIlt4eXpdXG4iK3NlbGYuc3VibWFwX3N0cikKKyAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgWyJbeHl6XSIsICJbeHl6XSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgc2VsZi5zdWJtYXBfc3RyKQorCisKK2NsYXNzIFJlcXVpcmVtZW50c1Rlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QmFzaWNzKHNlbGYpOgorICAgICAgICByID0gUmVxdWlyZW1lbnQucGFyc2UoIlR3aXN0ZWQ+PTEuMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIpLCJUd2lzdGVkPj0xLjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIociksIlJlcXVpcmVtZW50LnBhcnNlKCdUd2lzdGVkPj0xLjInKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFJlcXVpcmVtZW50KCJ0d2lzVGVkIiwgWygnPj0nLCcxLjInKV0sICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz49JywnMi4wJyldLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwociwgUmVxdWlyZW1lbnQoIlpvcGUiLCBbKCc+PScsJzEuMicpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHIsIFJlcXVpcmVtZW50KCJab3BlIiwgWygnPj0nLCczLjAnKV0sICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtleHRyYXNdPj0xLjIiKSkKKworICAgIGRlZiB0ZXN0T3JkZXJpbmcoc2VsZik6CisgICAgICAgIHIxID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc9PScsJzEuMmMxJyksKCc+PScsJzEuMicpXSwgKCkpCisgICAgICAgIHIyID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpLCgnPT0nLCcxLjJjMScpXSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEscjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIxKSxzdHIocjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihyMiksIlR3aXN0ZWQ9PTEuMmMxLD49MS4yIikKKworICAgIGRlZiB0ZXN0QmFzaWNDb250YWlucyhzZWxmKToKKyAgICAgICAgciA9IFJlcXVpcmVtZW50KCJUd2lzdGVkIiwgWygnPj0nLCcxLjInKV0sICgpKQorICAgICAgICBmb29fZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEuZWdnIikKKyAgICAgICAgdHdpc3QxMSAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjEuZWdnIikKKyAgICAgICAgdHdpc3QxMiAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjIuZWdnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhcnNlX3ZlcnNpb24oJzEuMicpIGluIHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwYXJzZV92ZXJzaW9uKCcxLjEnKSBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCcxLjInIGluIHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnMS4xJyBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvb19kaXN0IG5vdCBpbiByKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHdpc3QxMSBub3QgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR3aXN0MTIgaW4gcikKKworICAgIGRlZiB0ZXN0QWR2YW5jZWRDb250YWlucyhzZWxmKToKKyAgICAgICAgciwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz49MS4yLDw9MS4zLD09MS45LD4yLjAsIT0yLjUsPDMuMCw9PTQuNSIpCisgICAgICAgIGZvciB2IGluICgnMS4yJywnMS4yLjInLCcxLjMnLCcxLjknLCcyLjAuMScsJzIuMycsJzIuNicsJzMuMGMxJywnNC41Jyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModiBpbiByLCAodixyKSkKKyAgICAgICAgZm9yIHYgaW4gKCcxLjJjMScsJzEuMy4xJywnMS41JywnMS45LjEnLCcyLjAnLCcyLjUnLCczLjAnLCc0LjAnKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IG5vdCBpbiByLCAodixyKSkKKworCisgICAgZGVmIHRlc3RPcHRpb25zQW5kSGFzaGluZyhzZWxmKToKKyAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtmb28sYmFyXT49MS4yIikKKyAgICAgICAgcjIgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtiYXIsRk9PXT49MS4yIikKKyAgICAgICAgcjMgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtCQVIsRk9PXT49MS4yLjAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLmV4dHJhcywgKCJmb28iLCJiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMi5leHRyYXMsICgiYmFyIiwiZm9vIikpICAjIGV4dHJhcyBhcmUgbm9ybWFsaXplZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocjEpLCBoYXNoKHIyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGhhc2gocjEpLCBoYXNoKCgidHdpc3RlZCIsICgoIj49IixwYXJzZV92ZXJzaW9uKCIxLjIiKSksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQoWyJmb28iLCJiYXIiXSkpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdFZlcnNpb25FcXVhbGl0eShzZWxmKToKKyAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgic2V0dXB0b29scz09MC4zYTIiKQorICAgICAgICByMiA9IFJlcXVpcmVtZW50LnBhcnNlKCJzZXR1cHRvb2xzIT0wLjNhNCIpCisgICAgICAgIGQgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZQorCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTEuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjIpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTIuZWdnIikgaW4gcjEpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkKCJzZXR1cHRvb2xzLTAuM2EyLmVnZyIpIGluIHIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZCgic2V0dXB0b29scy0wLjNhMy5lZ2ciKSBpbiByMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTUuZWdnIikgaW4gcjIpCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgUGFyc2VUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEVtcHR5UGFyc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwYXJzZV9yZXF1aXJlbWVudHMoJycpKSwgW10pCisKKyAgICBkZWYgdGVzdFlpZWxkaW5nKHNlbGYpOgorICAgICAgICBmb3IgaW5wLG91dCBpbiBbCisgICAgICAgICAgICAoW10sIFtdKSwgKCd4JyxbJ3gnXSksIChbW11dLFtdKSwgKCcgeFxuIHknLCBbJ3gnLCd5J10pLAorICAgICAgICAgICAgKFsneFxuXG4nLCd5J10sIFsneCcsJ3knXSksCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGtnX3Jlc291cmNlcy55aWVsZF9saW5lcyhpbnApKSxvdXQpCisKKyAgICBkZWYgdGVzdFNwbGl0dGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QoCisgICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiIiIKKyAgICAgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgICAgICAgICBbWV0KKyAgICAgICAgICAgICAgICAgICAgegorCisgICAgICAgICAgICAgICAgICAgIGEKKyAgICAgICAgICAgICAgICAgICAgW2IgXQorICAgICAgICAgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgICAgICAgICBjCisgICAgICAgICAgICAgICAgICAgIFsgZF0KKyAgICAgICAgICAgICAgICAgICAgW3FdCisgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIFsoTm9uZSxbIngiXSksICgiWSIsWyJ6IiwiYSJdKSwgKCJiIixbImMiXSksICgiZCIsW10pLCAoInEiLFsidiJdKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLGxpc3QscGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiW2ZvbyIpKQorCisgICAgZGVmIHRlc3RTYWZlTmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoImFkbnMtcHl0aG9uIiksICJhZG5zLXB5dGhvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJIFV0aWxzIiksICAiV1NHSS1VdGlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJICBVdGlscyIpLCAiV1NHSS1VdGlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJNb25leSQkJE1ha2VyIiksICJNb25leS1NYWtlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2FmZV9uYW1lKCJwZWFrLndlYiIpLCAicGVhay13ZWIiKQorCisgICAgZGVmIHRlc3RTYWZlVmVyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIjEuMi0xIiksICIxLjItMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV92ZXJzaW9uKCIxLjIgYWxwaGEiKSwgICIxLjIuYWxwaGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigiMi4zLjQgMjAwNTA1MjEiKSwgIjIuMy40LjIwMDUwNTIxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIk1vbmV5JCQkTWFrZXIiKSwgIk1vbmV5LU1ha2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oInBlYWsud2ViIiksICJwZWFrLndlYiIpCisKKyAgICBkZWYgdGVzdFNpbXBsZVJlcXVpcmVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzLVRlZD49MS4yLTEnKSksCisgICAgICAgICAgICBbUmVxdWlyZW1lbnQoJ1R3aXMtVGVkJyxbKCc+PScsJzEuMi0xJyldLCAoKSldCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzdGVkID49MS4yLCBcICMgbW9yZVxuPDIuMCcpKSwKKyAgICAgICAgICAgIFtSZXF1aXJlbWVudCgnVHdpc3RlZCcsWygnPj0nLCcxLjInKSwoJzwnLCcyLjAnKV0sICgpKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgUmVxdWlyZW1lbnQucGFyc2UoIkZvb0Jhcj09MS45OWEzIiksCisgICAgICAgICAgICBSZXF1aXJlbWVudCgiRm9vQmFyIiwgWygnPT0nLCcxLjk5YTMnKV0sICgpKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIj49Mi4zIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieFxcIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieD09MiBxIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwiWD09MVxuWT09MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIiMiKQorCisgICAgZGVmIHRlc3RWZXJzaW9uRXF1YWxpdHkoc2VsZik6CisgICAgICAgIGRlZiBjKHMxLHMyKToKKyAgICAgICAgICAgIHAxLCBwMiA9IHBhcnNlX3ZlcnNpb24oczEpLHBhcnNlX3ZlcnNpb24oczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLHAyLCAoczEsczIscDEscDIpKQorCisgICAgICAgIGMoJzEuMi1yYzEnLCAnMS4ycmMxJykKKyAgICAgICAgYygnMC40JywgJzAuNC4wJykKKyAgICAgICAgYygnMC40LjAuMCcsICcwLjQuMCcpCisgICAgICAgIGMoJzAuNC4wLTAnLCAnMC40LTAnKQorICAgICAgICBjKCcwcGwxJywgJzAuMHBsMScpCisgICAgICAgIGMoJzBwcmUxJywgJzAuMGMxJykKKyAgICAgICAgYygnMC4wLjBwcmV2aWV3MScsICcwYzEnKQorICAgICAgICBjKCcwLjBjMScsICcwLXJjMScpCisgICAgICAgIGMoJzEuMmExJywgJzEuMi5hLjEnKTsgYygnMS4yLi4uYScsICcxLjJhJykKKworICAgIGRlZiB0ZXN0VmVyc2lvbk9yZGVyaW5nKHNlbGYpOgorICAgICAgICBkZWYgYyhzMSxzMik6CisgICAgICAgICAgICBwMSwgcDIgPSBwYXJzZV92ZXJzaW9uKHMxKSxwYXJzZV92ZXJzaW9uKHMyKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHAxPHAyLCAoczEsczIscDEscDIpKQorCisgICAgICAgIGMoJzIuMScsJzIuMS4xJykKKyAgICAgICAgYygnMmExJywnMmIwJykKKyAgICAgICAgYygnMmExJywnMi4xJykKKyAgICAgICAgYygnMi4zYTEnLCAnMi4zJykKKyAgICAgICAgYygnMi4xLTEnLCAnMi4xLTInKQorICAgICAgICBjKCcyLjEtMScsICcyLjEuMScpCisgICAgICAgIGMoJzIuMScsICcyLjFwbDQnKQorICAgICAgICBjKCcyLjFhMC0yMDA0MDUwMScsICcyLjEnKQorICAgICAgICBjKCcxLjEnLCAnMDIuMScpCisgICAgICAgIGMoJ0E1NicsJ0IyNycpCisgICAgICAgIGMoJzMuMicsICczLjIucGwwJykKKyAgICAgICAgYygnMy4yLTEnLCAnMy4ycGwxJykKKyAgICAgICAgYygnMy4ycGwxJywgJzMuMnBsMS0xJykKKyAgICAgICAgYygnMC40JywgJzQuMCcpCisgICAgICAgIGMoJzAuMC40JywgJzAuNC4wJykKKyAgICAgICAgYygnMHBsMScsICcwLjRwbDEnKQorICAgICAgICBjKCcyLjEuMC1yYzEnLCcyLjEuMCcpCisKKyAgICAgICAgdG9ydHVyZSA9IiIiCisgICAgICAgIDAuODAuMS0zIDAuODAuMS0yIDAuODAuMS0xIDAuNzkuOTk5OSswLjgwLjBwcmU0LTEKKyAgICAgICAgMC43OS45OTk5KzAuODAuMHByZTItMyAwLjc5Ljk5OTkrMC44MC4wcHJlMi0yCisgICAgICAgIDAuNzcuMi0xIDAuNzcuMS0xIDAuNzcuMC0xCisgICAgICAgICIiIi5zcGxpdCgpCisKKyAgICAgICAgZm9yIHAsdjEgaW4gZW51bWVyYXRlKHRvcnR1cmUpOgorICAgICAgICAgICAgZm9yIHYyIGluIHRvcnR1cmVbcCsxOl06CisgICAgICAgICAgICAgICAgYyh2Mix2MSkKZGlmZiAtLWdpdCBhL0xpYi9zZ21sbGliLnB5IGIvTGliL3NnbWxsaWIucHkKaW5kZXggMDhlMzY1Yi4uM2U4NWE5MSAxMDA2NDQKLS0tIGEvTGliL3NnbWxsaWIucHkKKysrIGIvTGliL3NnbWxsaWIucHkKQEAgLTI2OSw5ICsyNjksMzcgQEAKICAgICAgICAgICAgIGF0dHJuYW1lLCByZXN0LCBhdHRydmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQogICAgICAgICAgICAgaWYgbm90IHJlc3Q6CiAgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cm5hbWUKLSAgICAgICAgICAgIGVsaWYgYXR0cnZhbHVlWzoxXSA9PSAnXCcnID09IGF0dHJ2YWx1ZVstMTpdIG9yIFwKLSAgICAgICAgICAgICAgICAgYXR0cnZhbHVlWzoxXSA9PSAnIicgPT0gYXR0cnZhbHVlWy0xOl06Ci0gICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIChhdHRydmFsdWVbOjFdID09ICInIiA9PSBhdHRydmFsdWVbLTE6XSBvcgorICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XSk6CisgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgcXVvdGVzCisgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgICAgIGwgPSAwCisgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSA9ICcnCisgICAgICAgICAgICAgICAgd2hpbGUgbCA8IGxlbihhdHRydmFsdWUpOgorICAgICAgICAgICAgICAgICAgICBhdl9tYXRjaCA9IGVudGl0eXJlZi5tYXRjaChhdHRydmFsdWUsIGwpCisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9tYXRjaCBhbmQgYXZfbWF0Y2guZ3JvdXAoMSkgaW4gc2VsZi5lbnRpdHlkZWZzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlW2F2X21hdGNoLmVuZCgxKV0gPT0gJzsnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBzdWJzdGl0dXRlIGVudGl0eXJlZnMgZW5kaW5nIGluICc7JyBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugd2UgbWF5IGJyZWFrIDxhIGhyZWY9Jz9wPXgmcT15Jz4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgdmVyeSBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gc2VsZi5lbnRpdHlkZWZzW2F2X21hdGNoLmdyb3VwKDEpXQorICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGF2X21hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgY2hfbWF0Y2ggPSBjaGFycmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hfbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IGNocihpbnQoY2hfbWF0Y2guZ3JvdXAoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBjaF9tYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnZhbGlkIGNoYXJhY3RlciByZWZlcmVuY2UsIGRvbid0IHN1YnN0aXR1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICMgYWxsIG90aGVyIGNhc2VzCisgICAgICAgICAgICAgICAgICAgIG5ld19hdHRydmFsdWUgKz0gYXR0cnZhbHVlW2xdCisgICAgICAgICAgICAgICAgICAgIGwgKz0gMQorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IG5ld19hdHRydmFsdWUKICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgoYXR0cm5hbWUubG93ZXIoKSwgYXR0cnZhbHVlKSkKICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CmRpZmYgLS1naXQgYS9MaWIvc2l0ZS5weSBiL0xpYi9zaXRlLnB5CmluZGV4IDVlN2ZmN2IuLjQ3ZWRhMjQgMTAwNjQ0Ci0tLSBhL0xpYi9zaXRlLnB5CisrKyBiL0xpYi9zaXRlLnB5CkBAIC02OSw2ICs2OSw4IEBACiBkZWYgYWJzX19maWxlX18oKToKICAgICAiIiJTZXQgYWxsIG1vZHVsZScgX19maWxlX18gYXR0cmlidXRlIHRvIGFuIGFic29sdXRlIHBhdGgiIiIKICAgICBmb3IgbSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtLCAnX19sb2FkZXJfXycpOgorICAgICAgICAgICAgY29udGludWUgICAjIGRvbid0IG1lc3Mgd2l0aCBhIFBFUCAzMDItc3VwcGxpZWQgX19maWxlX18KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtLl9fZmlsZV9fKQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvc210cGxpYi5weSBiL0xpYi9zbXRwbGliLnB5CmluZGV4IDcxZDI1ZmQuLjA3OTE2Y2MgMTAwNzU1Ci0tLSBhL0xpYi9zbXRwbGliLnB5CisrKyBiL0xpYi9zbXRwbGliLnB5CkBAIC0yNTUsNyArMjU1LDExIEBACiAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbF9ob3N0bmFtZSA9IGZxZG4KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBXZSBjYW4ndCBmaW5kIGFuIGZxZG4gaG9zdG5hbWUsIHNvIHVzZSBhIGRvbWFpbiBsaXRlcmFsCi0gICAgICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICAgICAgICAgIGFkZHIgPSAnMTI3LjAuMC4xJworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gJ1slc10nICUgYWRkcgogCiAgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGRlYnVnbGV2ZWwpOgpkaWZmIC0tZ2l0IGEvTGliL3NvY2tldC5weSBiL0xpYi9zb2NrZXQucHkKaW5kZXggZWUyNDU3Zi4uMzJhOTJiNCAxMDA2NDQKLS0tIGEvTGliL3NvY2tldC5weQorKysgYi9MaWIvc29ja2V0LnB5CkBAIC0xMjEsMTQgKzEyMSw2IEBACiAgICAgcmV0dXJuIG5hbWUKIAogCi0jCi0jIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgYnkgdGhlIHNvY2tldCgpIGRlZmluZWQgb24gV2luZG93cyBhbmQgQmVPUwotIyBwbGF0Zm9ybXMgdG8gcHJvdmlkZSBhIGJlc3QtZWZmb3J0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGVhbnVwCi0jIHNlbWFudGljcyBuZWVkZWQgd2hlbiBzb2NrZXRzIGNhbid0IGJlIGR1cCgpZWQuCi0jCi0jIFRoZXNlIGFyZSBub3QgYWN0dWFsbHkgdXNlZCBvbiBvdGhlciBwbGF0Zm9ybXMuCi0jCi0KIF9zb2NrZXRtZXRob2RzID0gKAogICAgICdiaW5kJywgJ2Nvbm5lY3QnLCAnY29ubmVjdF9leCcsICdmaWxlbm8nLCAnbGlzdGVuJywKICAgICAnZ2V0cGVlcm5hbWUnLCAnZ2V0c29ja25hbWUnLCAnZ2V0c29ja29wdCcsICdzZXRzb2Nrb3B0JywKQEAgLTE4Myw2ICsxNzUsMTAgQEAKICAgICAgICAgYW5kIGJ1ZnNpemUgYXJndW1lbnRzIGFyZSBhcyBmb3IgdGhlIGJ1aWx0LWluIG9wZW4oKSBmdW5jdGlvbi4iIiIKICAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYuX3NvY2ssIG1vZGUsIGJ1ZnNpemUpCiAKKyAgICBmYW1pbHkgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay5mYW1pbHksIGRvYz0idGhlIHNvY2tldCBmYW1pbHkiKQorICAgIHR5cGUgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay50eXBlLCBkb2M9InRoZSBzb2NrZXQgdHlwZSIpCisgICAgcHJvdG8gPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fc29jay5wcm90bywgZG9jPSJ0aGUgc29ja2V0IHByb3RvY29sIikKKwogICAgIF9zID0gKCJkZWYgJXMoc2VsZiwgKmFyZ3MpOiByZXR1cm4gc2VsZi5fc29jay4lcygqYXJncylcblxuIgogICAgICAgICAgICIlcy5fX2RvY19fID0gX3JlYWxzb2NrZXQuJXMuX19kb2NfX1xuIikKICAgICBmb3IgX20gaW4gX3NvY2tldG1ldGhvZHM6CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy9fX2luaXRfXy5weSBiL0xpYi9zcWxpdGUzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWYyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDI0IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL19faW5pdF9fLnB5OiB0aGUgcHlzcWxpdGUyIHBhY2thZ2UuCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworZnJvbSBkYmFwaTIgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL2RiYXBpMi5weSBiL0xpYi9zcWxpdGUzL2RiYXBpMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGM4YTg0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvZGJhcGkyLnB5CkBAIC0wLDAgKzEsODQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvZGJhcGkyLnB5OiB0aGUgREItQVBJIDIuMCBpbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBkYXRldGltZQorCitwYXJhbXN0eWxlID0gInFtYXJrIgorCit0aHJlYWRzYWZldHkgPSAxCisKK2FwaWxldmVsID0gIjIuMCIKKworZnJvbSBfc3FsaXRlMyBpbXBvcnQgKgorCitpbXBvcnQgZGF0ZXRpbWUsIHRpbWUKKworRGF0ZSA9IGRhdGV0aW1lLmRhdGUKKworVGltZSA9IGRhdGV0aW1lLnRpbWUKKworVGltZXN0YW1wID0gZGF0ZXRpbWUuZGF0ZXRpbWUKKworZGVmIERhdGVGcm9tVGlja3ModGlja3MpOgorICAgIHJldHVybiBhcHBseShEYXRlLHRpbWUubG9jYWx0aW1lKHRpY2tzKVs6M10pCisKK2RlZiBUaW1lRnJvbVRpY2tzKHRpY2tzKToKKyAgICByZXR1cm4gYXBwbHkoVGltZSx0aW1lLmxvY2FsdGltZSh0aWNrcylbMzo2XSkKKworZGVmIFRpbWVzdGFtcEZyb21UaWNrcyh0aWNrcyk6CisgICAgcmV0dXJuIGFwcGx5KFRpbWVzdGFtcCx0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQorCitfbWFqb3IsIF9taW5vciwgX21pY3JvID0gdmVyc2lvbi5zcGxpdCgiLiIpCit2ZXJzaW9uX2luZm8gPSAoaW50KF9tYWpvciksIGludChfbWlub3IpLCBfbWljcm8pCitfbWFqb3IsIF9taW5vciwgX21pY3JvID0gc3FsaXRlX3ZlcnNpb24uc3BsaXQoIi4iKQorc3FsaXRlX3ZlcnNpb25faW5mbyA9IChpbnQoX21ham9yKSwgaW50KF9taW5vciksIF9taWNybykKKworQmluYXJ5ID0gYnVmZmVyCisKK2RlZiBhZGFwdF9kYXRlKHZhbCk6CisgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoKQorCitkZWYgYWRhcHRfZGF0ZXRpbWUodmFsKToKKyAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgiICIpCisKK2RlZiBjb252ZXJ0X2RhdGUodmFsKToKKyAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KCItIikpKQorCitkZWYgY29udmVydF90aW1lc3RhbXAodmFsKToKKyAgICBkYXRlcGFydCwgdGltZXBhcnQgPSB2YWwuc3BsaXQoIiAiKQorICAgIHllYXIsIG1vbnRoLCBkYXkgPSBtYXAoaW50LCBkYXRlcGFydC5zcGxpdCgiLSIpKQorICAgIHRpbWVwYXJ0X2Z1bGwgPSB0aW1lcGFydC5zcGxpdCgiLiIpCisgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgPSBtYXAoaW50LCB0aW1lcGFydF9mdWxsWzBdLnNwbGl0KCI6IikpCisgICAgaWYgbGVuKHRpbWVwYXJ0X2Z1bGwpID09IDI6CisgICAgICAgIG1pY3Jvc2Vjb25kcyA9IGludChmbG9hdCgiMC4iICsgdGltZXBhcnRfZnVsbFsxXSkgKiAxMDAwMDAwKQorICAgIGVsc2U6CisgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKKworICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCisgICAgcmV0dXJuIHZhbAorCisKK3JlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKK3JlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQorcmVnaXN0ZXJfY29udmVydGVyKCJkYXRlIiwgY29udmVydF9kYXRlKQorcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhkYTljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMCwwICsxLDczMiBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2RiYXBpLnB5OiB0ZXN0cyBmb3IgREItQVBJIGNvbXBsaWFuY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIE1vZHVsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tBUElMZXZlbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUuYXBpbGV2ZWwsICIyLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcGlsZXZlbCBpcyAlcywgc2hvdWxkIGJlIDIuMCIgJSBzcWxpdGUuYXBpbGV2ZWwpCisKKyAgICBkZWYgQ2hlY2tUaHJlYWRTYWZldHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnRocmVhZHNhZmV0eSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkc2FmZXR5IGlzICVkLCBzaG91bGQgYmUgMSIgJSBzcWxpdGUudGhyZWFkc2FmZXR5KQorCisgICAgZGVmIENoZWNrUGFyYW1TdHlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUucGFyYW1zdHlsZSwgInFtYXJrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1zdHlsZSBpcyAnJXMnLCBzaG91bGQgYmUgJ3FtYXJrJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5wYXJhbXN0eWxlKQorCisgICAgZGVmIENoZWNrV2FybmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc3FsaXRlLldhcm5pbmcsIFN0YW5kYXJkRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgU3RhbmRhcmRFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkVycm9yLCBTdGFuZGFyZEVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZEVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVyZmFjZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQorCisgICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tEYXRhRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlZ3JpdHlFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkludGVncml0eUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlcm5hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW1taW5nRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tOb3RTdXBwb3J0ZWRFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKK2NsYXNzIENvbm5lY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQorICAgICAgICBjdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKworICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBjb21taXQgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2tBZnRlck5vQ2hhbmdlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKKworICAgIGRlZiBDaGVja0N1cnNvcihzZWxmKToKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tGYWlsZWRPcGVuKHNlbGYpOgorICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoWU9VX0NBTk5PVF9PUEVOX1RISVMpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5XYXJuaW5nLCBzcWxpdGUuV2FybmluZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkludGVyZmFjZUVycm9yLCBzcWxpdGUuSW50ZXJmYWNlRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guRGF0YWJhc2VFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4Lk9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkludGVncml0eUVycm9yLCBzcWxpdGUuSW50ZWdyaXR5RXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guTm90U3VwcG9ydGVkRXJyb3IsIHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvcikKKworY2xhc3MgQ3Vyc29yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jeCA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCBpbmNvbWUgbnVtYmVyKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3UuY2xvc2UoKQorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVOb0FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlSWxsZWdhbFNxbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgYXNkZiIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyBzZWxlY3QgNCs1IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgV2FybmluZyIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuV2FybmluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwyKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IC0tIGZvbyBiYXIiKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBzZWxlY3QgNSs0OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgZm9vCisgICAgICAgICAgICAqLworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nU3FsQXJnKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoNDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdJbnQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg0MiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgKDI1MDAuMzIsKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdTdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdWdvIiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MxKHNlbGYpOgorICAgICAgICAjIHRvbyBtYW55IHBhcmFtZXRlcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDE3LCAiRWdvbiIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMihzZWxmKToKKyAgICAgICAgIyB0b28gbGl0dGxlIHBhcmFtZXRlcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczMoc2VsZik6CisgICAgICAgICMgbm8gcGFyYW1ldGVycywgcGFyYW1ldGVycyBhcmUgbmVlZGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1Rvb0xpdHRsZUFyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUgYW5kIGlkPTppZCIsIHsibmFtZSI6ICJmb28ifSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdOb0FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1VubmFtZWQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIHsibmFtZSI6ICJmb28ifSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IG5hbWU9J2JhciciKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQorCisgICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlbWFueShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgWygxLCksICgyLCksICgzLCldKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQorCisgICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBpZiBzZWxmLmN4LnRvdGFsX2NoYW5nZXMgPCAyOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0b3RhbCBjaGFuZ2VzIHJlcG9ydGVkIHdyb25nIHZhbHVlIikKKworICAgICMgQ2hlY2tzIGZvciBleGVjdXRlbWFueToKKyAgICAjIFNlcXVlbmNlcyBhcmUgcmVxdWlyZWQgYnkgdGhlIERCLUFQSSwgaXRlcmF0b3JzCisgICAgIyBlbmhhbmNlbWVudHMgaW4gcHlzcWxpdGUuCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlcXVlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIFsoeCwpIGZvciB4IGluIHJhbmdlKDEwMCwgMTEwKV0pCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUl0ZXJhdG9yKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUl0ZXI6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IDUKKworICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAxMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgKz0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmFsdWUsKQorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgTXlJdGVyKCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZGVmIG15Z2VuKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICB5aWVsZCAoaSwpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBteWdlbigpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlXcm9uZ1NxbEFyZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSg0MiwgWygzLCldKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlbGVjdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgic2VsZWN0ID8iLCBbKDMsKV0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueU5vdEl0ZXJhYmxlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAicmFpc2VkIiwgZS5fX2NsYXNzX18KKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIENoZWNrRmV0Y2hJdGVyKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg1LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg2LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IGlkIGZyb20gdGVzdCBvcmRlciBieSBpZCIpCisgICAgICAgIGxzdCA9IFtdCisgICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKKyAgICAgICAgICAgIGxzdC5hcHBlbmQocm93WzBdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsc3RbMF0sIDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxzdFsxXSwgNikKKworICAgIGRlZiBDaGVja0ZldGNob25lKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93LCBOb25lKQorCisgICAgZGVmIENoZWNrRmV0Y2hvbmVOb1N0YXRlbWVudChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoKQorICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3csIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBcnJheVNpemUoc2VsZik6CisgICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5hcnJheXNpemUsIDEpCisKKyAgICAgICAgIyBub3cgc2V0IHRvIDIKKyAgICAgICAgc2VsZi5jdS5hcnJheXNpemUgPSAyCisKKyAgICAgICAgIyBub3cgbWFrZSB0aGUgcXVlcnkgcmV0dXJuIDMgcm93cworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQScpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0InKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdDJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMikKKworICAgIGRlZiBDaGVja0ZldGNobWFueShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgW10pCisKKyAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIFtdKQorCisgICAgZGVmIENoZWNrU2V0aW5wdXRzaXplcyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5zZXRpbnB1dHNpemVzKFszLCA0LCA1XSkKKworICAgIGRlZiBDaGVja1NldG91dHB1dHNpemUoc2VsZik6CisgICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg1LCAwKQorCisgICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZU5vQ29sdW1uKHNlbGYpOgorICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNDIpCisKKyAgICBkZWYgQ2hlY2tDdXJzb3JDb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKKworICAgIGRlZiBDaGVja1dyb25nQ3Vyc29yQ2FsbGFibGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKGYpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKworICAgIGRlZiBDaGVja0N1cnNvcldyb25nQ2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEZvbzogcGFzcworICAgICAgICBmb28gPSBGb28oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGJpbiBiaW5hcnksIHJhdGlvIG51bWJlciwgdHMgdGltZXN0YW1wKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ29uQ3Vyc29yKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNvbW1pdChzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckl0ZXJOZXh0KHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKK2NsYXNzIENvbnN0cnVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja0RhdGUoc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZSgyMDA0LCAxMCwgMjgpCisKKyAgICBkZWYgQ2hlY2tUaW1lKHNlbGYpOgorICAgICAgICB0ID0gc3FsaXRlLlRpbWUoMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcChzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDEwLCAyOCwgMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja0RhdGVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIHQgPSBzcWxpdGUuVGltZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcEZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrQmluYXJ5KHNlbGYpOgorICAgICAgICBiID0gc3FsaXRlLkJpbmFyeShjaHIoMCkgKyAiJyIpCisKK2NsYXNzIEV4dGVuc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdTcWwoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiIiIKKyAgICAgICAgICAgIC0tIGJsYSBibGEKKyAgICAgICAgICAgIC8qIGEgc3R1cGlkIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBhKGkpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOworICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKKyAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCA1KQorCisgICAgZGVmIENoZWNrU2NyaXB0U3RyaW5nVW5pY29kZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KHUiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBhKGkpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOworICAgICAgICAgICAgc2VsZWN0IGkgZnJvbSBhOworICAgICAgICAgICAgZGVsZXRlIGZyb20gYTsKKyAgICAgICAgICAgIGluc2VydCBpbnRvIGEoaSkgdmFsdWVzICg2KTsKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gYSIpCisgICAgICAgIHJlcyA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgNikKKworICAgIGRlZiBDaGVja1NjcmlwdEVycm9ySW5jb21wbGV0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvck5vcm1hbChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCA1IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZSIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZW1hbnkoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChmb28pIikKKyAgICAgICAgY29uLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpXSkKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IG9yZGVyIGJ5IGZvbyIpLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0WzFdWzBdLCA0LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlc2NyaXB0KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCisKK2NsYXNzIENsb3NlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ2xvc2VkQ29uQ3Vyc29yKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENvbkNvbW1pdChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDb25Sb2xsYmFjayhzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZEN1ckV4ZWN1dGUoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCitkZWYgc3VpdGUoKToKKyAgICBtb2R1bGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoTW9kdWxlVGVzdHMsICJDaGVjayIpCisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvclRlc3RzLCAiQ2hlY2siKQorICAgIHRocmVhZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRUZXN0cywgIkNoZWNrIikKKyAgICBjb25zdHJ1Y3Rvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25zdHJ1Y3RvclRlc3RzLCAiQ2hlY2siKQorICAgIGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShFeHRlbnNpb25UZXN0cywgIkNoZWNrIikKKyAgICBjbG9zZWRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ2xvc2VkVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgobW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzgwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKQEAgLTAsMCArMSwxNjQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9mYWN0b3J5LnB5OiB0ZXN0cyBmb3IgdGhlIHZhcmlvdXMgZmFjdG9yaWVzIGluIHB5c3FsaXRlCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCitkZWYgZGljdF9mYWN0b3J5KGN1cnNvciwgcm93KToKKyAgICBkID0ge30KKyAgICBmb3IgaWR4LCBjb2wgaW4gZW51bWVyYXRlKGN1cnNvci5kZXNjcmlwdGlvbik6CisgICAgICAgIGRbY29sWzBdXSA9IHJvd1tpZHhdCisgICAgcmV0dXJuIGQKKworY2xhc3MgTXlDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNxbGl0ZS5DdXJzb3IuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLnJvd19mYWN0b3J5ID0gZGljdF9mYWN0b3J5CisKK2NsYXNzIENvbm5lY3Rpb25GYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDb25uZWN0aW9uIikKKworY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDdXJzb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvciBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDdXJzb3IiKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IGFzIGZvbyIpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBkaWN0IikKKyAgICAgICAgY3VyLmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tRmFjdG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBsYW1iZGEgY3VyLCByb3c6IGxpc3Qocm93KQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uocm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQorCisgICAgZGVmIENoZWNrU3FsaXRlUm93KHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5Sb3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2Ygc3FsaXRlLlJvdyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siYSJdLCByb3dbImIiXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siQSJdLCByb3dbIkIiXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdCJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1swXSwgcm93WzFdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wxID09IDEsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMCIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wyID09IDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworY2xhc3MgVGV4dEZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3RyCisgICAgICAgIGF1c3RyaWEgPSB1bmljb2RlKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgc3RyIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogdW5pY29kZSh4LCAidXRmLTgiLCAiaWdub3JlIikKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYS5lbmNvZGUoImxhdGluMSIpLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXS5lbmRzd2l0aCh1InJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQorCisgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgZ2VybWFueSA9IHVuaWNvZGUoIkRldXRjaGxhbmQiKQorICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBkX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGdlcm1hbnksKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShhX3Jvd1swXSkgPT0gdW5pY29kZSwgInR5cGUgb2Ygbm9uLUFTQ0lJIHJvdyBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uRmFjdG9yeVRlc3RzLCAiQ2hlY2siKQorICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgcm93X3N1aXRlX2NvbXBhdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQsICJDaGVjayIpCisgICAgcm93X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCByb3dfc3VpdGVfY29tcGF0LCByb3dfc3VpdGUsIHRleHRfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY3Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtMCwwICsxLDExNSBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2hvb2tzLnB5OiB0ZXN0cyBmb3IgdmFyaW91cyBTUUxpdGUtc3BlY2lmaWMgaG9va3MKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgcHlzcWxpdGUyLmRiYXBpMiBhcyBzcWxpdGUKKworY2xhc3MgQ29sbGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RDYWxsYWJsZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIlgiLCA0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInBhcmFtZXRlciBtdXN0IGJlIGNhbGxhYmxlIikKKworICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBjbXApCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CisgICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CisgICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKKyAgICAgICAgc3FsID0gIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKKyAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAorICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgIGlmIHJlc3VsdFswXVswXSAhPSAiYyIgb3IgcmVzdWx0WzFdWzBdICE9ICJiIiBvciByZXN1bHRbMl1bMF0gIT0gImEiOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCisKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQorCisgICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlZ2lzdGVyIHR3byBkaWZmZXJlbnQgY29sbGF0aW9uIGZ1bmN0aW9ucyB1bmRlciB0aGUgc2FtZSBuYW1lLgorICAgICAgICBWZXJpZnkgdGhhdCB0aGUgbGFzdCBvbmUgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBjbXApCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogLWNtcCh4LCB5KSkKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tIChzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4KSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIpLmZldGNoYWxsKCkKKyAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICdiJyBvciByZXN1bHRbMV1bMF0gIT0gJ2EnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBjb2xsYXRpb24gZnVuY3Rpb24gaXMgdXNlZCIpCisKKyAgICBkZWYgQ2hlY2tEZXJlZ2lzdGVyQ29sbGF0aW9uKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVnaXN0ZXIgYSBjb2xsYXRpb24sIHRoZW4gZGVyZWdpc3RlciBpdC4gTWFrZSBzdXJlIGFuIGVycm9yIGlzIHJhaXNlZCBpZiB3ZSB0cnkKKyAgICAgICAgdG8gdXNlIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGNtcCkKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgJ2EnIGFzIHggdW5pb24gc2VsZWN0ICdiJyBhcyB4IG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uc3RhcnRzd2l0aCgibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2UiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIE9wZXJhdGlvbmFsRXJyb3IgcmFpc2VkIikKKworZGVmIHN1aXRlKCk6CisgICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4YWRhNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpAQCAtMCwwICsxLDQ4IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHB5c3FsaXRlMi5kYmFwaTIgYXMgc3FsaXRlCisKK2NsYXNzIFJlZ3Jlc3Npb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1ByYWdtYVVzZXJWZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCBweXNxbGl0ZSBiZWNhdXNlIHRoaXMgcHJhZ21hIGNvbW1hbmQgcmV0dXJucyBOVUxMIGZvciB0aGUgY29sdW1uIG5hbWUKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInByYWdtYSB1c2VyX3ZlcnNpb24iKQorCitkZWYgc3VpdGUoKToKKyAgICByZWdyZXNzaW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ3Jlc3Npb25UZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChyZWdyZXNzaW9uX3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwYjE5YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CkBAIC0wLDAgKzEsMTU2IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHJhbnNhY3Rpb25zLnB5OiB0ZXN0cyB0cmFuc2FjdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGdldF9kYl9wYXRoKCk6CisgICAgcmV0dXJuICJzcWxpdGVfdGVzdGRiIgorCitjbGFzcyBUcmFuc2FjdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShnZXRfZGJfcGF0aCgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5jb24xID0gc3FsaXRlLmNvbm5lY3QoZ2V0X2RiX3BhdGgoKSwgdGltZW91dD0wLjEpCisgICAgICAgIHNlbGYuY3VyMSA9IHNlbGYuY29uMS5jdXJzb3IoKQorCisgICAgICAgIHNlbGYuY29uMiA9IHNxbGl0ZS5jb25uZWN0KGdldF9kYl9wYXRoKCksIHRpbWVvdXQ9MC4xKQorICAgICAgICBzZWxmLmN1cjIgPSBzZWxmLmNvbjIuY3Vyc29yKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24xLmNsb3NlKCkKKworICAgICAgICBzZWxmLmN1cjIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbjIuY2xvc2UoKQorCisgICAgICAgIG9zLnVubGluayhnZXRfZGJfcGF0aCgpKQorCisgICAgZGVmIENoZWNrRE1MZG9lc0F1dG9Db21taXRCZWZvcmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QyKGopIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrSW5zZXJ0U3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDApCisKKyAgICBkZWYgQ2hlY2tVcGRhdGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IGk9NiIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIDUpCisKKyAgICBkZWYgQ2hlY2tEZWxldGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja1JlcGxhY2VTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgicmVwbGFjZSBpbnRvIHRlc3QoaSkgdmFsdWVzICg2KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdWzBdLCA1KQorCisgICAgZGVmIENoZWNrVG9nZ2xlQXV0b0NvbW1pdChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgPSBOb25lCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwsIE5vbmUpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gIkRFRkVSUkVEIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsICwgIkRFRkVSUkVEIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja1JhaXNlVGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisKK2NsYXNzIFNwZWNpYWxDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tWYWN1dW0oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgidmFjdXVtIikKKworICAgIGRlZiBDaGVja0Ryb3BUYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkcm9wIHRhYmxlIHRlc3QiKQorCisgICAgZGVmIENoZWNrUHJhZ21hKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInByYWdtYSBjb3VudF9jaGFuZ2VzPTEiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgZGVmYXVsdF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUcmFuc2FjdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcGVjaWFsQ29tbWFuZFRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGRlZmF1bHRfc3VpdGUsIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0wLDAgKzEsMzM5IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHlwZXMucHk6IHRlc3RzIGZvciB0eXBlIGNvbnZlcnNpb24gYW5kIGRldGVjdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgU3FsaXRlVHlwZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludGVnZXIsIHMgdmFyY2hhciwgZiBudW1iZXIsIGIgYmxvYikiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKHUi1nN0ZXJyZWljaCIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHMgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCisKKyAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICBudW0gPSAyKio0MAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBudW0pCisKKyAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKKyAgICAgICAgdmFsID0gMy4xNAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrVW5pY29kZUV4ZWN1dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUodSJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCisKK2NsYXNzIERlY2xUeXBlc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBjbGFzcyBGb286CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdmFsKToKKyAgICAgICAgICAgIHNlbGYudmFsID0gX3ZhbAorCisgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBEZWNsVHlwZXNUZXN0cy5Gb28pOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGlmIHNlbGYudmFsID09IG90aGVyLnZhbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgICAgICBpZiBwcm90b2NvbCBpcyBzcWxpdGUuUHJlcGFyZVByb3RvY29sOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIHNlbGYudmFsCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IpIikKKworICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZsb2F0Il0gPSBsYW1iZGEgeDogNDcuMgorCisgICAgICAgICMgYW5kIGltcGxlbWVudCB0d28gY3VzdG9tIG9uZXMKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXSA9IGxhbWJkYSB4OiBib29sKGludCh4KSkKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJvb2wiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImZvbyJdCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgbnVtID0gMioqNDAKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgbnVtKQorCisgICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CisgICAgICAgICMgY3VzdG9tCisgICAgICAgIHZhbCA9IDMuMTQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgNDcuMikKKworICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CisgICAgICAgICMgY3VzdG9tCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChGYWxzZSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChUcnVlLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBUcnVlKQorCisgICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0CisgICAgICAgIHZhbCA9IHUiXHhkNnN0ZXJyZWljaCIKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh1KSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrRm9vKHNlbGYpOgorICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZFNlcShzZWxmKToKKyAgICAgICAgY2xhc3MgQmFyOiBwYXNzCisgICAgICAgIHZhbCA9IEJhcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorCisgICAgZGVmIENoZWNrVW5zdXBwb3J0ZWREaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBCYXI6IHBhc3MKKyAgICAgICAgdmFsID0gQmFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKDp2YWwpIiwgeyJ2YWwiOiB2YWx9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgdmFsID0gYnVmZmVyKCJHdWdsaHVwZiIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmluKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKK2NsYXNzIENvbE5hbWVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0NPTE5BTUVTfHNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoeCBmb28pIikKKworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYmFyIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZXhjIl0gPSBsYW1iZGEgeDogNS8wCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJiYXIiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImV4YyJdCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrRGVjbFR5cGUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgIlt4eHhdIikKKworICAgIGRlZiBDaGVja05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIChOb25lLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrRXhjKHNlbGYpOgorICAgICAgICAjIEV4Y2VwdGlvbnMgaW4gdHlwZSBjb252ZXJ0ZXJzIHJlc3VsdCBpbiByZXR1cm5lZCBOb25lcworICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgNSBhcyAieCBbZXhjXSInKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgeCBhcyAieCBbYmFyXSIgZnJvbSB0ZXN0JykKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICI8eHh4PiIpCisKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaXBwaW5nIG9mIGNvbG5hbWVzIHdvcmtzLiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdAorICAgICAgICAjIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25Ob1JvdyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGN1cnNvci5kZXNjcmlwdGlvbiBzaG91bGQgYXQgbGVhc3QgcHJvdmlkZSB0aGUgY29sdW1uIG5hbWUocyksIGV2ZW4gaWYKKyAgICAgICAgbm8gcm93IHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIDAgPSAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdID09ICJ4IikKKworY2xhc3MgT2JqZWN0QWRhcHRhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2FzdChvYmopOgorICAgICAgICByZXR1cm4gZmxvYXQob2JqKQorICAgIGNhc3QgPSBzdGF0aWNtZXRob2QoY2FzdCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzW2ludF0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzcWxpdGUucmVnaXN0ZXJfYWRhcHRlcihpbnQsIE9iamVjdEFkYXB0YXRpb25UZXN0cy5jYXN0KQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbKGludCwgc3FsaXRlLlByZXBhcmVQcm90b2NvbCldCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICg0LCkpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKworY2xhc3MgRGF0ZVRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGQgZGF0ZSwgdHMgdGltZXN0YW1wKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3FsaXRlRGF0ZShzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDIsIDE0KQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGQpIHZhbHVlcyAoPykiLCAoZCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZCBmcm9tIHRlc3QiKQorICAgICAgICBkMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZCwgZDIpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVUaW1lc3RhbXAoc2VsZik6CisgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDApCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKworICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBUaGUgZGF0ZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9uIDMuMSBvciBsYXRlcgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgU1FMaXRlJ3MgY3VycmVudF90aW1lc3RhbXAgdXNlcyBVVEMgdGltZSwgd2hpbGUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgdXNlcyBsb2NhbCB0aW1lLgorICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh0cyksIGRhdGV0aW1lLmRhdGV0aW1lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cy55ZWFyLCBub3cueWVhcikKKworICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCwgNTAwMDAwKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRzLCB0czIpCisKK2RlZiBzdWl0ZSgpOgorICAgIHNxbGl0ZV90eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZVR5cGVUZXN0cywgIkNoZWNrIikKKyAgICBkZWNsdHlwZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEZWNsVHlwZXNUZXN0cywgIkNoZWNrIikKKyAgICBjb2xuYW1lc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbE5hbWVzVGVzdHMsICJDaGVjayIpCisgICAgYWRhcHRhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShPYmplY3RBZGFwdGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgZGF0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEYXRlVGltZVRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHNxbGl0ZV90eXBlX3N1aXRlLCBkZWNsdHlwZXNfdHlwZV9zdWl0ZSwgY29sbmFtZXNfdHlwZV9zdWl0ZSwgYWRhcHRhdGlvbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdkYjljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsMzMwIEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXMuCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgorICAgIHJldHVybiAiZm9vIgorZGVmIGZ1bmNfcmV0dXJudW5pY29kZSgpOgorICAgIHJldHVybiB1ImJhciIKK2RlZiBmdW5jX3JldHVybmludCgpOgorICAgIHJldHVybiA0MgorZGVmIGZ1bmNfcmV0dXJuZmxvYXQoKToKKyAgICByZXR1cm4gMy4xNAorZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgorICAgIHJldHVybiBOb25lCitkZWYgZnVuY19yZXR1cm5ibG9iKCk6CisgICAgcmV0dXJuIGJ1ZmZlcigiYmxvYiIpCitkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgorICAgIDUvMAorCitkZWYgZnVuY19pc3N0cmluZyh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB1bmljb2RlCitkZWYgZnVuY19pc2ludCh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyBpbnQKK2RlZiBmdW5jX2lzZmxvYXQodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgZmxvYXQKK2RlZiBmdW5jX2lzbm9uZSh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB0eXBlKE5vbmUpCitkZWYgZnVuY19pc2Jsb2Iodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgYnVmZmVyCisKK2NsYXNzIEFnZ3JOb1N0ZXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEFnZ3JOb0ZpbmFsaXplOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworY2xhc3MgQWdnckV4Y2VwdGlvbkluSW5pdDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIDUvMAorCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5TdGVwOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIDUvMAorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKworY2xhc3MgQWdnckV4Y2VwdGlvbkluRmluYWxpemU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICA1LzAKKworY2xhc3MgQWdnckNoZWNrVHlwZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsID0gTm9uZQorCisgICAgZGVmIHN0ZXAoc2VsZiwgd2hpY2hUeXBlLCB2YWwpOgorICAgICAgICB0aGVUeXBlID0geyJzdHIiOiB1bmljb2RlLCAiaW50IjogaW50LCAiZmxvYXQiOiBmbG9hdCwgIk5vbmUiOiB0eXBlKE5vbmUpLCAiYmxvYiI6IGJ1ZmZlcn0KKyAgICAgICAgc2VsZi52YWwgPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKK2NsYXNzIEFnZ3JTdW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbCA9IDAuMAorCisgICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgKz0gdmFsCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbAorCitjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnRleHQiLCAwLCBmdW5jX3JldHVybnRleHQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudW5pY29kZSIsIDAsIGZ1bmNfcmV0dXJudW5pY29kZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5mbG9hdCIsIDAsIGZ1bmNfcmV0dXJuZmxvYXQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJubnVsbCIsIDAsIGZ1bmNfcmV0dXJubnVsbCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJhaXNlZXhjZXB0aW9uIiwgMCwgZnVuY19yYWlzZWV4Y2VwdGlvbikKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2ludCIsIDEsIGZ1bmNfaXNpbnQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNmbG9hdCIsIDEsIGZ1bmNfaXNmbG9hdCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgorICAgICAgICBkZWYgZ2V0ZnVuYygpOgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBnZXRmdW5jKCkpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmVmdGVzdCgpIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5UZXh0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiZm9vIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Vbmljb2RlKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCB1ImJhciIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBpbnQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgZmxvYXQpCisgICAgICAgIGlmIHZhbCA8IDMuMTM5IG9yIHZhbCA+IDMuMTQxOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuTnVsbChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgYnVmZmVyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGJ1ZmZlcigiYmxvYiIpKQorCisgICAgZGVmIENoZWNrRnVuY0V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1Ob25lKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja1BhcmFtQmxvYihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Jsb2IoPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCitjbGFzcyBBZ2dyZWdhdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCisgICAgICAgICAgICAgICAgdCB0ZXh0LAorICAgICAgICAgICAgICAgIGkgaW50ZWdlciwKKyAgICAgICAgICAgICAgICBmIGZsb2F0LAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgYiBibG9iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0LCBpLCBmLCBuLCBiKSB2YWx1ZXMgKD8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgYnVmZmVyKCJibG9iIiksKSkKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub3N0ZXAiLCAxLCBBZ2dyTm9TdGVwKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub2ZpbmFsaXplIiwgMSwgQWdnck5vRmluYWxpemUpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0luaXQiLCAxLCBBZ2dyRXhjZXB0aW9uSW5Jbml0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNTdGVwIiwgMSwgQWdnckV4Y2VwdGlvbkluU3RlcCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjRmluYWxpemUiLCAxLCBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlIiwgMiwgQWdnckNoZWNrVHlwZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibXlzdW0iLCAxLCBBZ2dyU3VtKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICAjc2VsZi5jb24uY2xvc2UoKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tBZ2dyTm9TdGVwKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vc3RlcCh0KSBmcm9tIHRlc3QiKQorCisgICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5Jbml0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0luaXQodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNTdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNGaW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnaW50JywgPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Zsb2F0JywgPykiLCAoMy4xNCwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdibG9iJywgPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrQWdnclN1bShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBjdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIFsoMTAsKSwgKDIwLCksICgzMCwpXSkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDYwKQorCitkZWYgc3VpdGUoKToKKyAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGFnZ3JlZ2F0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBZ2dyZWdhdGVUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChmdW5jdGlvbl9zdWl0ZSwgYWdncmVnYXRlX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NyZS5weSBiL0xpYi9zcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwMDk0YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcmUucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBmaWxlIGlzIG9ubHkgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBzcmUgd2FzIG1vdmVkIHRvIHJlIGluIHZlcnNpb24gMi41LgorIiIiCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigiVGhlIHNyZSBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIGltcG9ydCByZS4iLAorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2Zyb20gcmUgaW1wb3J0ICoKK2Zyb20gcmUgaW1wb3J0IF9fYWxsX18KZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggNjgyNzI0NC4uM2NkMGRmNSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTQxNCw3ICs0MTQsMTMgQEAKIAogZGVmIF9jbGVhbnVwKCk6CiAgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKLSAgICAgICAgaW5zdC5wb2xsKCkKKyAgICAgICAgaWYgaW5zdC5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkgPj0gMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShpbnN0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaWYgdHdvIHRocmVhZHMgY3JlYXRlIGEgbmV3IFBvcGVuIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICMgSXQncyBoYXJtbGVzcyB0aGF0IGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQsIHNvIGlnbm9yZS4KKyAgICAgICAgICAgICAgICBwYXNzCiAKIFBJUEUgPSAtMQogU1RET1VUID0gLTIKQEAgLTUyNyw2ICs1MzMsNyBAQAogICAgICAgICAiIiJDcmVhdGUgbmV3IFBvcGVuIGluc3RhbmNlLiIiIgogICAgICAgICBfY2xlYW51cCgpCiAKKyAgICAgICAgc2VsZi5fY2hpbGRfY3JlYXRlZCA9IEZhbHNlCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1ZnNpemUsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYnVmc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKQogCkBAIC01OTIsMTQgKzU5OSwyNCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyciA9IG9zLmZkb3BlbihlcnJyZWFkLCAncmInLCBidWZzaXplKQogCi0gICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCi0KIAogICAgIGRlZiBfdHJhbnNsYXRlX25ld2xpbmVzKHNlbGYsIGRhdGEpOgogICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcclxuIiwgIlxuIikKICAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHIiLCAiXG4iKQogICAgICAgICByZXR1cm4gZGF0YQogCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2NoaWxkX2NyZWF0ZWQ6CisgICAgICAgICAgICAjIFdlIGRpZG4ndCBnZXQgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBJbiBjYXNlIHRoZSBjaGlsZCBoYXNuJ3QgYmVlbiB3YWl0ZWQgb24sIGNoZWNrIGlmIGl0J3MgZG9uZS4KKyAgICAgICAgc2VsZi5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCisgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisKICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CiAgICAgICAgICIiIkludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20KICAgICAgICAgc3Rkb3V0IGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvcgpAQCAtNzc3LDYgKzc5NCw3IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKCplLmFyZ3MpCiAKICAgICAgICAgICAgICMgUmV0YWluIHRoZSBwcm9jZXNzIGhhbmRsZSwgYnV0IGNsb3NlIHRoZSB0aHJlYWQgaGFuZGxlCisgICAgICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gVHJ1ZQogICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gaHAKICAgICAgICAgICAgIHNlbGYucGlkID0gcGlkCiAgICAgICAgICAgICBodC5DbG9zZSgpCkBAIC03OTUsMTMgKzgxMywxMiBAQAogICAgICAgICAgICAgICAgIGVycndyaXRlLkNsb3NlKCkKIAogCi0gICAgICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICBkZWYgcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUpOgogICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQogICAgICAgICAgICAgYXR0cmlidXRlLiIiIgogICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgaWYgV2FpdEZvclNpbmdsZU9iamVjdChzZWxmLl9oYW5kbGUsIDApID09IFdBSVRfT0JKRUNUXzA6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IEdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCi0gICAgICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCiAKIApAQCAtODExLDcgKzgyOCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKICAgICAgICAgICAgICAgICBvYmogPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYuX2hhbmRsZSwgSU5GSU5JVEUpCiAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gR2V0RXhpdENvZGVQcm9jZXNzKHNlbGYuX2hhbmRsZSkKLSAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQogCiAKQEAgLTk1OCw2ICs5NzQsNyBAQAogICAgICAgICAgICAgc2VsZi5fc2V0X2Nsb2V4ZWNfZmxhZyhlcnJwaXBlX3dyaXRlKQogCiAgICAgICAgICAgICBzZWxmLnBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgc2VsZi5fY2hpbGRfY3JlYXRlZCA9IFRydWUKICAgICAgICAgICAgIGlmIHNlbGYucGlkID09IDA6CiAgICAgICAgICAgICAgICAgIyBDaGlsZAogICAgICAgICAgICAgICAgIHRyeToKQEAgLTEwNDIsMTAgKzEwNTksOCBAQAogICAgICAgICAgICAgICAgICMgU2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVW5rbm93biBjaGlsZCBleGl0IHN0YXR1cyEiKQogCi0gICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQogCi0KLSAgICAgICAgZGVmIHBvbGwoc2VsZik6CisgICAgICAgIGRlZiBwb2xsKHNlbGYsIF9kZWFkc3RhdGU9Tm9uZSk6CiAgICAgICAgICAgICAiIiJDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCiAgICAgICAgICAgICBhdHRyaWJ1dGUuIiIiCiAgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKQEAgLTEwNTQsNyArMTA2OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKICAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgaWYgX2RlYWRzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IF9kZWFkc3RhdGUKICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVsbmV0bGliLnB5IGIvTGliL3RlbG5ldGxpYi5weQppbmRleCA4YTI1MTNiLi4zNTIzMDM3IDEwMDY0NAotLS0gYS9MaWIvdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZWxuZXRsaWIucHkKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pYWNzZXEgKz0gYwogICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaWFjc2VxKSA9PSAxOgotICAgICAgICAgICAgICAgICAgICAnSUFDOiBJQUMgQ01EIFtPUFRJT04gb25seSBmb3IgV0lMTC9XT05UL0RPL0RPTlRdJworICAgICAgICAgICAgICAgICAgICAjICdJQUM6IElBQyBDTUQgW09QVElPTiBvbmx5IGZvciBXSUxML1dPTlQvRE8vRE9OVF0nCiAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gKERPLCBET05ULCBXSUxMLCBXT05UKToKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWFjc2VxICs9IGMKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jaGVja19zb3VuZGNhcmQudmJzIGIvTGliL3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxODUyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpAQCAtMCwwICsxLDEzIEBACityZW0gQ2hlY2sgZm9yIGEgd29ya2luZyBzb3VuZC1jYXJkIC0gZXhpdCB3aXRoIDAgaWYgT0ssIDEgb3RoZXJ3aXNlLgorc2V0IHdtaSA9IEdldE9iamVjdCgid2lubWdtdHM6IikKK3NldCBzY3MgPSB3bWkuSW5zdGFuY2VzT2YoIndpbjMyX3NvdW5kZGV2aWNlIikKK2ZvciBlYWNoIHNjIGluIHNjcworICAgc2V0IHN0YXR1cyA9IHNjLlByb3BlcnRpZXNfKCJTdGF0dXMiKQorICAgd3NjcmlwdC5FY2hvKHNjLlByb3BlcnRpZXNfKCJOYW1lIikgKyAiLyIgKyBzdGF0dXMpCisgICBpZiBzdGF0dXMgPSAiT0siIHRoZW4KKyAgICAgICB3c2NyaXB0LlF1aXQgMCByZW0gbm9ybWFsIGV4aXQKKyAgIGVuZCBpZgorbmV4dAorcmVtIE5vIHNvdW5kIGNhcmQgZm91bmQgLSBleGl0IHdpdGggc3RhdHVzIGNvZGUgb2YgMQord3NjcmlwdC5RdWl0IDEKKwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvUkVBRE1FIGIvTGliL3Rlc3QvY3Jhc2hlcnMvUkVBRE1FCmluZGV4IDkzNjkyODIuLjA3MGMzZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL1JFQURNRQorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9SRUFETUUKQEAgLTEzLDMgKzEzLDggQEAKIFB1dCBhcyBtdWNoIGluZm8gaW50byBhIGRvY3N0cmluZyBvciBjb21tZW50cyB0byBoZWxwIGRldGVybWluZQogdGhlIGNhdXNlIG9mIHRoZSBmYWlsdXJlLiAgUGFydGljdWxhcmx5IG5vdGUgaWYgdGhlIGNhdXNlIGlzCiBzeXN0ZW0gb3IgZW52aXJvbm1lbnQgZGVwZW5kZW50IGFuZCB3aGF0IHRoZSB2YXJpYWJsZXMgYXJlLgorCitPbmNlIHRoZSBjcmFzaCBpcyBmaXhlZCwgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBhcHByb3ByaWF0ZQordGVzdCAoZXZlbiBpZiBpdCB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSB0ZXN0IHN1aXRlKS4gIFRoaXMgZW5zdXJlcyB0aGUKK3JlZ3Jlc3Npb24gZG9lc24ndCBoYXBwZW4gYWdhaW4uICBBbmQgaWYgaXQgZG9lcywgaXQgc2hvdWxkIGJlIGVhc2llcgordG8gdHJhY2sgZG93bi4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2RpY3RyZXNpemVfYXR0YWNrLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvZGljdHJlc2l6ZV9hdHRhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5NTc5MQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL2RpY3RyZXNpemVfYXR0YWNrLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE0NTYyMDkKKworIyBBIGRpY3RyZXNpemUoKSBhdHRhY2suICBJZiBvbGR0YWJsZSA9PSBtcC0+bWFfc21hbGx0YWJsZSB0aGVuIHB1cmUKKyMgUHl0aG9uIGNvZGUgY2FuIG1hbmdsZSB3aXRoIG1wLT5tYV9zbWFsbHRhYmxlIHdoaWxlIGl0IGlzIGJlaW5nIHdhbGtlZAorIyBvdmVyLgorCitjbGFzcyBYKG9iamVjdCk6CisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiA1CisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgcmVzaXppbmc6CisgICAgICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZCA9IHt9CisKK3Jlc2l6aW5nID0gRmFsc2UKKworZFtYKCldID0gMQorZFtYKCldID0gMgorZFtYKCldID0gMworZFtYKCldID0gNAorZFtYKCldID0gNQorCisjIG5vdyB0cmlnZ2VyIGEgcmVzaXplCityZXNpemluZyA9IFRydWUKK2RbOV0gPSA2CisKKyMgXl5eIEkgZ2V0IFNlZ21lbnRhdGlvbiBmYXVsdCBvciBJbGxlZ2FsIGluc3RydWN0aW9uIGhlcmUuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9uYXN0eV9lcV92c19kaWN0LnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvbmFzdHlfZXFfdnNfZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMwODNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvbmFzdHlfZXFfdnNfZGljdC5weQpAQCAtMCwwICsxLDQ3IEBACisjIGZyb20gaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDAxLUp1bmUvMDE1MjM5Lmh0bWwKKworIyBpZiB5b3Uga2VlcCBjaGFuZ2luZyBhIGRpY3Rpb25hcnkgd2hpbGUgbG9va2luZyB1cCBhIGtleSwgeW91IGNhbgorIyBwcm92b2tlIGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDCisKKyMgQXQgdGhlIHRpbWUgbmVpdGhlciBUaW0gbm9yIE1pY2hhZWwgY291bGQgYmUgYm90aGVyZWQgdG8gdGhpbmsgb2YgYQorIyB3YXkgdG8gZml4IGl0LgorCitjbGFzcyBZdWNrOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pID0gMAorCisgICAgZGVmIG1ha2VfZGFuZ2Vyb3VzKHNlbGYpOgorICAgICAgICBzZWxmLmkgPSAxCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICMgZGlyZWN0IHRvIHNsb3QgNCBpbiB0YWJsZSBvZiBzaXplIDg7IHNsb3QgMTIgd2hlbiBzaXplIDE2CisgICAgICAgIHJldHVybiA0ICsgOAorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuaSA9PSAwOgorICAgICAgICAgICAgIyBsZWF2ZSBkaWN0IGFsb25lCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgc2VsZi5pID09IDE6CisgICAgICAgICAgICAjIGZpZGRsZSB0byAxNiBzbG90cworICAgICAgICAgICAgc2VsZi5fX2ZpbGxfZGljdCg2KQorICAgICAgICAgICAgc2VsZi5pID0gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmaWRkbGUgdG8gOCBzbG90cworICAgICAgICAgICAgc2VsZi5fX2ZpbGxfZGljdCg0KQorICAgICAgICAgICAgc2VsZi5pID0gMQorCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX19maWxsX2RpY3Qoc2VsZiwgbik6CisgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgZGljdC5jbGVhcigpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgZGljdFtpXSA9IGkKKyAgICAgICAgZGljdFtzZWxmXSA9ICJPSyEiCisKK3kgPSBZdWNrKCkKK2RpY3QgPSB7eTogIk9LISJ9CisKK3ogPSBZdWNrKCkKK3kubWFrZV9kYW5nZXJvdXMoKQorcHJpbnQgZGljdFt6XQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZW1wdHkudmJzIGIvTGliL3Rlc3QvZW1wdHkudmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9lbXB0eS52YnMKQEAgLTAsMCArMSBAQAorJ0VtcHR5IFZCUyBmaWxlLCBkb2VzIG5vdGhpbmcuICBIZWxwZXIgZm9yIExpYlx0ZXN0XHRlc3Rfc3RhcnRmaWxlLnB5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2Zvcmtfd2FpdC5weSBiL0xpYi90ZXN0L2Zvcmtfd2FpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjAwYmRiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvZm9ya193YWl0LnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIlRoaXMgdGVzdCBjYXNlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNoZWNraW5nIGZvcmtpbmcgYW5kIHdhaXQgYmVoYXZpb3IuCisKK1RvIHRlc3QgZGlmZmVyZW50IHdhaXQgYmVoYXZpb3IsIG92ZXJyaXNlIHRoZSB3YWl0X2ltcGwgbWV0aG9kLgorCitXZSB3YW50IGZvcmsxKCkgc2VtYW50aWNzIC0tIG9ubHkgdGhlIGZvcmtpbmcgdGhyZWFkIHN1cnZpdmVzIGluIHRoZQorY2hpbGQgYWZ0ZXIgYSBmb3JrKCkuCisKK09uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzIHdpdGhvdXQgcG9zaXggdGhyZWFkcykgd2UgZmluZCB0aGF0IGFsbAorYWN0aXZlIHRocmVhZHMgc3Vydml2ZSBpbiB0aGUgY2hpbGQgYWZ0ZXIgYSBmb3JrKCk7IHRoaXMgaXMgYW4gZXJyb3IuCisKK1doaWxlIEJlT1MgZG9lc24ndCBvZmZpY2lhbGx5IHN1cHBvcnQgZm9yayBhbmQgbmF0aXZlIHRocmVhZGluZyBpbgordGhlIHNhbWUgYXBwbGljYXRpb24sIHRoZSBwcmVzZW50IGV4YW1wbGUgc2hvdWxkIHdvcmsganVzdCBmaW5lLiAgREMKKyIiIgorCitpbXBvcnQgb3MsIHN5cywgdGltZSwgdGhyZWFkLCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQKKworTE9OR1NMRUVQID0gMgorU0hPUlRTTEVFUCA9IDAuNQorTlVNX1RIUkVBRFMgPSA0CisKK2NsYXNzIEZvcmtXYWl0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5hbGl2ZSA9IHt9CisgICAgICAgIHNlbGYuc3RvcCA9IDAKKworICAgIGRlZiBmKHNlbGYsIGlkKToKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuc3RvcDoKKyAgICAgICAgICAgIHNlbGYuYWxpdmVbaWRdID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKFNIT1JUU0xFRVApCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3KHNlbGYuZiwgKGksKSkKKworICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKKworICAgICAgICBhID0gc2VsZi5hbGl2ZS5rZXlzKCkKKyAgICAgICAgYS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYSwgcmFuZ2UoTlVNX1RIUkVBRFMpKQorCisgICAgICAgIHByZWZvcmtfbGl2ZXMgPSBzZWxmLmFsaXZlLmNvcHkoKQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ3VuaXh3YXJlNyddOgorICAgICAgICAgICAgY3BpZCA9IG9zLmZvcmsxKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNwaWQgPSBvcy5mb3JrKCkKKworICAgICAgICBpZiBjcGlkID09IDA6CisgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKKyAgICAgICAgICAgIG4gPSAwCisgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuYWxpdmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hbGl2ZVtrZXldICE9IHByZWZvcmtfbGl2ZXNba2V5XToKKyAgICAgICAgICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICBvcy5fZXhpdChuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJlbnQKKyAgICAgICAgICAgIHNlbGYud2FpdF9pbXBsKGNwaWQpCisgICAgICAgICAgICAjIFRlbGwgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgICAgIHNlbGYuc3RvcCA9IDEKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMipTSE9SVFNMRUVQKSAjIFdhaXQgZm9yIHRocmVhZHMgdG8gZGllCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL1JFQURNRS50eHQgYi9MaWIvdGVzdC9sZWFrZXJzL1JFQURNRS50eHQKaW5kZXggNjllZTM1YS4uYmVlZWUwZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbGVha2Vycy9SRUFETUUudHh0CisrKyBiL0xpYi90ZXN0L2xlYWtlcnMvUkVBRE1FLnR4dApAQCAtNSw2ICs1LDE1IEBACiBkb2Vzbid0IGluY3JlYXNlLCB0aGUgYnVnIGhhcyBiZWVuIGZpeGVkIGFuZCB0aGUgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZAogZnJvbSB0aGUgcmVwb3NpdG9yeS4KIAorTm90ZTogIGJlIGNhcmVmdWwgdG8gY2hlY2sgZm9yIGN5Y2xpYyBnYXJiYWdlLiAgU29tZXRpbWVzIGl0IG1heSBiZSBoZWxwZnVsCit0byBkZWZpbmUgdGhlIGxlYWsgZnVuY3Rpb24gbGlrZToKKworZGVmIGxlYWsoKToKKyAgICBkZWYgaW5uZXJfbGVhaygpOgorICAgICAgICAjIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgbGVha3MsIGJ1dCBhbHNvIGNyZWF0ZXMgY3ljbGVzCisgICAgaW5uZXJfbGVhaygpCisgICAgZ2MuY29sbGVjdCgpIDsgZ2MuY29sbGVjdCgpIDsgZ2MuY29sbGVjdCgpCisKIEhlcmUncyBhbiBleGFtcGxlIGludGVycHJldGVyIHNlc3Npb24gZm9yIHRlc3RfZ2VzdGFsdCB3aGljaCBzdGlsbCBsZWFrczoKIAogPj4+IGZyb20gdGVzdC5sZWFrZXJzLnRlc3RfZ2VzdGFsdCBpbXBvcnQgbGVhawpAQCAtMTcsMyArMjYsNyBAQAogWzI4OTQwIHJlZnNdCiA+Pj4gCiAKK09uY2UgdGhlIGxlYWsgaXMgZml4ZWQsIHRoZSB0ZXN0IGNhc2Ugc2hvdWxkIGJlIG1vdmVkIGludG8gYW4gYXBwcm9wcmlhdGUKK3Rlc3QgKGV2ZW4gaWYgaXQgd2FzIG9yaWdpbmFsbHkgZnJvbSB0aGUgdGVzdCBzdWl0ZSkuICBUaGlzIGVuc3VyZXMgdGhlCityZWdyZXNzaW9uIGRvZXNuJ3QgaGFwcGVuIGFnYWluLiAgQW5kIGlmIGl0IGRvZXMsIGl0IHNob3VsZCBiZSBlYXNpZXIKK3RvIHRyYWNrIGRvd24uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfY3R5cGVzLnB5IGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlhMmNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X2N0eXBlcy5weQpAQCAtMCwwICsxLDE2IEBACisKKyMgVGFrZW4gZnJvbSBMaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSwgUG9pbnRlclRvU3RydWN0dXJlLnRlc3QoKS4KKyMgV2hlbiB0aGlzIGxlYWsgaXMgZml4ZWQsIHJlbWVtYmVyIHRvIHJlbW92ZSBmcm9tIE1pc2MvYnVpbGQuc2ggTEVBS1lfVEVTVFMuCisKK2Zyb20gY3R5cGVzIGltcG9ydCBTdHJ1Y3R1cmUsIGNfaW50LCBQT0lOVEVSCitpbXBvcnQgZ2MKKworZGVmIGxlYWtfaW5uZXIoKToKKyAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCldCisgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBQT0lOVEVSKFBPSU5UKSldCisKK2RlZiBsZWFrKCk6CisgICAgbGVha19pbm5lcigpCisgICAgZ2MuY29sbGVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3Rfc2VsZnR5cGUucHkgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3Rfc2VsZnR5cGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwN2MzMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9zZWxmdHlwZS5weQpAQCAtMCwwICsxLDEzIEBACisjIFJlZmVyZW5jZSBjeWNsZXMgaW52b2x2aW5nIG9ubHkgdGhlIG9iX3R5cGUgZmllbGQgYXJlIHJhdGhlciB1bmNvbW1vbgorIyBidXQgcG9zc2libGUuICBJbnNwaXJlZCBieSBTRiBidWcgMTQ2OTYyOS4KKworaW1wb3J0IGdjCisKK2RlZiBsZWFrKCk6CisgICAgY2xhc3MgVCh0eXBlKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzIFUodHlwZSk6CisgICAgICAgIF9fbWV0YWNsYXNzX18gPSBUCisgICAgVS5fX2NsYXNzX18gPSBVCisgICAgZGVsIFUKKyAgICBnYy5jb2xsZWN0KCk7IGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfdGVlLnB5IGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X3RlZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMjRjYS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfdGVlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCi0jIFRlc3QgY2FzZSB0YWtlbiBmcm9tIHRlc3RfaXRlcnRvb2xzCi0jIFNlZSBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDUtTm92ZW1iZXIvMDU4MzM5Lmh0bWwKLQotZnJvbSBpdGVydG9vbHMgaW1wb3J0IHRlZQotCi1kZWYgbGVhaygpOgotICAgIGRlZiBmaWIoKToKLSAgICAgICAgZGVmIHlpZWxkX2lkZW50aXR5X2ZvcmV2ZXIoZyk6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIHlpZWxkIGcKLSAgICAgICAgZGVmIF9maWIoKToKLSAgICAgICAgICAgIGZvciBpIGluIHlpZWxkX2lkZW50aXR5X2ZvcmV2ZXIoaGVhZCk6Ci0gICAgICAgICAgICAgICAgeWllbGQgaQotICAgICAgICBoZWFkLCB0YWlsLCByZXN1bHQgPSB0ZWUoX2ZpYigpLCAzKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICB4ID0gZmliKCkKLSAgICB4Lm5leHQoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfYXVnYXNzaWduIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfYXVnYXNzaWduCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZiN2U1Li4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2F1Z2Fzc2lnbgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLXRlc3RfYXVnYXNzaWduCi02LjAKLTYKLVs2LjBdCi02Ci02LjAKLTYKLVsxLCAyLCAzLCA0LCAxLCAyLCAzLCA0XQotWzEsIDIsIDEsIDIsIDNdCi1UcnVlCi1UcnVlCi1UcnVlCi0xMQotVHJ1ZQotMTIKLVRydWUKLVRydWUKLTEzCi1fX2FkZF9fIGNhbGxlZAotX19yYWRkX18gY2FsbGVkCi1fX2lhZGRfXyBjYWxsZWQKLV9fc3ViX18gY2FsbGVkCi1fX3JzdWJfXyBjYWxsZWQKLV9faXN1Yl9fIGNhbGxlZAotX19tdWxfXyBjYWxsZWQKLV9fcm11bF9fIGNhbGxlZAotX19pbXVsX18gY2FsbGVkCi1fX3RydWVkaXZfXyBjYWxsZWQKLV9fcnRydWVkaXZfXyBjYWxsZWQKLV9faXRydWVkaXZfXyBjYWxsZWQKLV9fZmxvb3JkaXZfXyBjYWxsZWQKLV9fcmZsb29yZGl2X18gY2FsbGVkCi1fX2lmbG9vcmRpdl9fIGNhbGxlZAotX19tb2RfXyBjYWxsZWQKLV9fcm1vZF9fIGNhbGxlZAotX19pbW9kX18gY2FsbGVkCi1fX3Bvd19fIGNhbGxlZAotX19ycG93X18gY2FsbGVkCi1fX2lwb3dfXyBjYWxsZWQKLV9fb3JfXyBjYWxsZWQKLV9fcm9yX18gY2FsbGVkCi1fX2lvcl9fIGNhbGxlZAotX19hbmRfXyBjYWxsZWQKLV9fcmFuZF9fIGNhbGxlZAotX19pYW5kX18gY2FsbGVkCi1fX3hvcl9fIGNhbGxlZAotX19yeG9yX18gY2FsbGVkCi1fX2l4b3JfXyBjYWxsZWQKLV9fcnNoaWZ0X18gY2FsbGVkCi1fX3Jyc2hpZnRfXyBjYWxsZWQKLV9faXJzaGlmdF9fIGNhbGxlZAotX19sc2hpZnRfXyBjYWxsZWQKLV9fcmxzaGlmdF9fIGNhbGxlZAotX19pbHNoaWZ0X18gY2FsbGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb2VyY2lvbiBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvZXJjaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM1YjYwLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvZXJjaW9uCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NCArMCwwIEBACi10ZXN0X2NvZXJjaW9uCi0yICsgMiA9IDQKLTIgKz0gMiA9PiA0Ci0yIC0gMiA9IDAKLTIgLT0gMiA9PiAwCi0yICogMiA9IDQKLTIgKj0gMiA9PiA0Ci0yIC8gMiA9IDEKLTIgLz0gMiA9PiAxCi0yICoqIDIgPSA0Ci0yICoqPSAyID0+IDQKLTIgJSAyID0gMAotMiAlPSAyID0+IDAKLTIgKyA0LjAgPSA2LjAKLTIgKz0gNC4wID0+IDYuMAotMiAtIDQuMCA9IC0yLjAKLTIgLT0gNC4wID0+IC0yLjAKLTIgKiA0LjAgPSA4LjAKLTIgKj0gNC4wID0+IDguMAotMiAvIDQuMCA9IDAuNQotMiAvPSA0LjAgPT4gMC41Ci0yICoqIDQuMCA9IDE2LjAKLTIgKio9IDQuMCA9PiAxNi4wCi0yICUgNC4wID0gMi4wCi0yICU9IDQuMCA9PiAyLjAKLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC0gKDIrMGopID0gKDAuMCArIDAuMGopCi0yIC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKiAoMiswaikgPSAoNC4wICsgMC4waikKLTIgKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotMiAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0yICoqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotMiAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0yICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogWzFdID0gWzEsIDFdCi0yICo9IFsxXSA9PiBbMSwgMV0KLTIgLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiAoMiwpID0gKDIsIDIpCi0yICo9ICgyLCkgPT4gKDIsIDIpCi0yIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAtIDxNZXRob2ROdW1iZXIgMj4gPSAwCi0yIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotMiAqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAvIDxNZXRob2ROdW1iZXIgMj4gPSAxCi0yIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMQotMiAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotMiAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yICUgPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICsgPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKz0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC0gPENvZXJjZU51bWJlciAyPiA9IDAKLTIgLT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi0yICogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC8gPENvZXJjZU51bWJlciAyPiA9IDEKLTIgLz0gPENvZXJjZU51bWJlciAyPiA9PiAxCi0yICoqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci0yICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgJSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAlPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTQuMCArIDIgPSA2LjAKLTQuMCArPSAyID0+IDYuMAotNC4wIC0gMiA9IDIuMAotNC4wIC09IDIgPT4gMi4wCi00LjAgKiAyID0gOC4wCi00LjAgKj0gMiA9PiA4LjAKLTQuMCAvIDIgPSAyLjAKLTQuMCAvPSAyID0+IDIuMAotNC4wICoqIDIgPSAxNi4wCi00LjAgKio9IDIgPT4gMTYuMAotNC4wICUgMiA9IDAuMAotNC4wICU9IDIgPT4gMC4wCi00LjAgKyA0LjAgPSA4LjAKLTQuMCArPSA0LjAgPT4gOC4wCi00LjAgLSA0LjAgPSAwLjAKLTQuMCAtPSA0LjAgPT4gMC4wCi00LjAgKiA0LjAgPSAxNi4wCi00LjAgKj0gNC4wID0+IDE2LjAKLTQuMCAvIDQuMCA9IDEuMAotNC4wIC89IDQuMCA9PiAxLjAKLTQuMCAqKiA0LjAgPSAyNTYuMAotNC4wICoqPSA0LjAgPT4gMjU2LjAKLTQuMCAlIDQuMCA9IDAuMAotNC4wICU9IDQuMCA9PiAwLjAKLTQuMCArIDIgPSA2LjAKLTQuMCArPSAyID0+IDYuMAotNC4wIC0gMiA9IDIuMAotNC4wIC09IDIgPT4gMi4wCi00LjAgKiAyID0gOC4wCi00LjAgKj0gMiA9PiA4LjAKLTQuMCAvIDIgPSAyLjAKLTQuMCAvPSAyID0+IDIuMAotNC4wICoqIDIgPSAxNi4wCi00LjAgKio9IDIgPT4gMTYuMAotNC4wICUgMiA9IDAuMAotNC4wICU9IDIgPT4gMC4wCi00LjAgKyAoMiswaikgPSAoNi4wICsgMC4waikKLTQuMCArPSAoMiswaikgPT4gKDYuMCArIDAuMGopCi00LjAgLSAoMiswaikgPSAoMi4wICsgMC4waikKLTQuMCAtPSAoMiswaikgPT4gKDIuMCArIDAuMGopCi00LjAgKiAoMiswaikgPSAoOC4wICsgMC4waikKLTQuMCAqPSAoMiswaikgPT4gKDguMCArIDAuMGopCi00LjAgLyAoMiswaikgPSAoMi4wICsgMC4waikKLTQuMCAvPSAoMiswaikgPT4gKDIuMCArIDAuMGopCi00LjAgKiogKDIrMGopID0gKDE2LjAgKyAwLjBqKQotNC4wICoqPSAoMiswaikgPT4gKDE2LjAgKyAwLjBqKQotNC4wICUgKDIrMGopID0gKDAuMCArIDAuMGopCi00LjAgJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotNC4wICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICsgPE1ldGhvZE51bWJlciAyPiA9IDYuMAotNC4wICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNi4wCi00LjAgLSA8TWV0aG9kTnVtYmVyIDI+ID0gMi4wCi00LjAgLT0gPE1ldGhvZE51bWJlciAyPiA9PiAyLjAKLTQuMCAqIDxNZXRob2ROdW1iZXIgMj4gPSA4LjAKLTQuMCAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDguMAotNC4wIC8gPE1ldGhvZE51bWJlciAyPiA9IDIuMAotNC4wIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMi4wCi00LjAgKiogPE1ldGhvZE51bWJlciAyPiA9IDE2LjAKLTQuMCAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiAxNi4wCi00LjAgJSA8TWV0aG9kTnVtYmVyIDI+ID0gMC4wCi00LjAgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwLjAKLTQuMCArIDxDb2VyY2VOdW1iZXIgMj4gPSA2LjAKLTQuMCArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDYuMAotNC4wIC0gPENvZXJjZU51bWJlciAyPiA9IDIuMAotNC4wIC09IDxDb2VyY2VOdW1iZXIgMj4gPT4gMi4wCi00LjAgKiA8Q29lcmNlTnVtYmVyIDI+ID0gOC4wCi00LjAgKj0gPENvZXJjZU51bWJlciAyPiA9PiA4LjAKLTQuMCAvIDxDb2VyY2VOdW1iZXIgMj4gPSAyLjAKLTQuMCAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDIuMAotNC4wICoqIDxDb2VyY2VOdW1iZXIgMj4gPSAxNi4wCi00LjAgKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMTYuMAotNC4wICUgPENvZXJjZU51bWJlciAyPiA9IDAuMAotNC4wICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMC4wCi0yICsgMiA9IDQKLTIgKz0gMiA9PiA0Ci0yIC0gMiA9IDAKLTIgLT0gMiA9PiAwCi0yICogMiA9IDQKLTIgKj0gMiA9PiA0Ci0yIC8gMiA9IDEKLTIgLz0gMiA9PiAxCi0yICoqIDIgPSA0Ci0yICoqPSAyID0+IDQKLTIgJSAyID0gMAotMiAlPSAyID0+IDAKLTIgKyA0LjAgPSA2LjAKLTIgKz0gNC4wID0+IDYuMAotMiAtIDQuMCA9IC0yLjAKLTIgLT0gNC4wID0+IC0yLjAKLTIgKiA0LjAgPSA4LjAKLTIgKj0gNC4wID0+IDguMAotMiAvIDQuMCA9IDAuNQotMiAvPSA0LjAgPT4gMC41Ci0yICoqIDQuMCA9IDE2LjAKLTIgKio9IDQuMCA9PiAxNi4wCi0yICUgNC4wID0gMi4wCi0yICU9IDQuMCA9PiAyLjAKLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC0gKDIrMGopID0gKDAuMCArIDAuMGopCi0yIC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKiAoMiswaikgPSAoNC4wICsgMC4waikKLTIgKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotMiAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0yICoqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotMiAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotMiAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0yICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogWzFdID0gWzEsIDFdCi0yICo9IFsxXSA9PiBbMSwgMV0KLTIgLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiAoMiwpID0gKDIsIDIpCi0yICo9ICgyLCkgPT4gKDIsIDIpCi0yIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAtIDxNZXRob2ROdW1iZXIgMj4gPSAwCi0yIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotMiAqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotMiAvIDxNZXRob2ROdW1iZXIgMj4gPSAxCi0yIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMQotMiAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotMiAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yICUgPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICsgPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKz0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC0gPENvZXJjZU51bWJlciAyPiA9IDAKLTIgLT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi0yICogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci0yIC8gPENvZXJjZU51bWJlciAyPiA9IDEKLTIgLz0gPENvZXJjZU51bWJlciAyPiA9PiAxCi0yICoqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci0yICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgJSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAlPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLSgyKzBqKSArIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC0gMiA9ICgwLjAgKyAwLjBqKQotKDIrMGopIC09IDIgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiAyID0gKDQuMCArIDAuMGopCi0oMiswaikgKj0gMiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAvIDIgPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSAyID0+ICgxLjAgKyAwLjBqKQotKDIrMGopICoqIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqKj0gMiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlIDIgPSAoMC4wICsgMC4waikKLSgyKzBqKSAlPSAyID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICsgNC4wID0gKDYuMCArIDAuMGopCi0oMiswaikgKz0gNC4wID0+ICg2LjAgKyAwLjBqKQotKDIrMGopIC0gNC4wID0gKC0yLjAgKyAwLjBqKQotKDIrMGopIC09IDQuMCA9PiAoLTIuMCArIDAuMGopCi0oMiswaikgKiA0LjAgPSAoOC4wICsgMC4waikKLSgyKzBqKSAqPSA0LjAgPT4gKDguMCArIDAuMGopCi0oMiswaikgLyA0LjAgPSAoMC41ICsgMC4waikKLSgyKzBqKSAvPSA0LjAgPT4gKDAuNSArIDAuMGopCi0oMiswaikgKiogNC4wID0gKDE2LjAgKyAwLjBqKQotKDIrMGopICoqPSA0LjAgPT4gKDE2LjAgKyAwLjBqKQotKDIrMGopICUgNC4wID0gKDIuMCArIDAuMGopCi0oMiswaikgJT0gNC4wID0+ICgyLjAgKyAwLjBqKQotKDIrMGopICsgMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDIgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSAyID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gMiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gMiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDIgPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgMiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDIgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKyAoMiswaikgPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSAoMiswaikgPSAoMC4wICsgMC4waikKLSgyKzBqKSAtPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiAoMiswaikgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLyAoMiswaikgPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogKDIrMGopID0gKDQuMCArIDAuMGopCi0oMiswaikgKio9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLSgyKzBqKSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICo9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArIDxNZXRob2ROdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSArPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC0gPE1ldGhvZE51bWJlciAyPiA9ICgwLjAgKyAwLjBqKQotKDIrMGopIC09IDxNZXRob2ROdW1iZXIgMj4gPT4gKDAuMCArIDAuMGopCi0oMiswaikgKiA8TWV0aG9kTnVtYmVyIDI+ID0gKDQuMCArIDAuMGopCi0oMiswaikgKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAvIDxNZXRob2ROdW1iZXIgMj4gPSAoMS4wICsgMC4waikKLSgyKzBqKSAvPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICgxLjAgKyAwLjBqKQotKDIrMGopICoqIDxNZXRob2ROdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAlIDxNZXRob2ROdW1iZXIgMj4gPSAoMC4wICsgMC4waikKLSgyKzBqKSAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICsgPENvZXJjZU51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSA8Q29lcmNlTnVtYmVyIDI+ID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gPENvZXJjZU51bWJlciAyPiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDxDb2VyY2VOdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gPENvZXJjZU51bWJlciAyPiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogPENvZXJjZU51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgPENvZXJjZU51bWJlciAyPiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDAuMCArIDAuMGopCi1bMV0gKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAyID0gWzEsIDFdCi1bMV0gKj0gMiA9PiBbMSwgMV0KLVsxXSAvIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAyID0gWzEsIDFdCi1bMV0gKj0gMiA9PiBbMSwgMV0KLVsxXSAvIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyBbMV0gPSBbMSwgMV0KLVsxXSArPSBbMV0gPT4gWzEsIDFdCi1bMV0gLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICo9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArPSAoMiwpID0+IFsxLCAyXQotWzFdIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDxNZXRob2ROdW1iZXIgMj4gPSBbMSwgMV0KLVsxXSAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IFsxLCAxXQotWzFdIC8gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiA8Q29lcmNlTnVtYmVyIDI+ID0gWzEsIDFdCi1bMV0gKj0gPENvZXJjZU51bWJlciAyPiA9PiBbMSwgMV0KLVsxXSAvIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAyID0gKDIsIDIpCi0oMiwpICo9IDIgPT4gKDIsIDIpCi0oMiwpIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICo9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAyID0gKDIsIDIpCi0oMiwpICo9IDIgPT4gKDIsIDIpCi0oMiwpIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICo9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgKDIsKSA9ICgyLCAyKQotKDIsKSArPSAoMiwpID0+ICgyLCAyKQotKDIsKSAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDxNZXRob2ROdW1iZXIgMj4gPSAoMiwgMikKLSgyLCkgKj0gPE1ldGhvZE51bWJlciAyPiA9PiAoMiwgMikKLSgyLCkgLyA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICs9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiA8Q29lcmNlTnVtYmVyIDI+ID0gKDIsIDIpCi0oMiwpICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDIsIDIpCi0oMiwpIC8gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKyAyID0gNAotPE1ldGhvZE51bWJlciAyPiArPSAyID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLSAyID0gMAotPE1ldGhvZE51bWJlciAyPiAtPSAyID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKiAyID0gNAotPE1ldGhvZE51bWJlciAyPiAqPSAyID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLyAyID0gMQotPE1ldGhvZE51bWJlciAyPiAvPSAyID0+IDEKLTxNZXRob2ROdW1iZXIgMj4gKiogMiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKio9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAlIDIgPSAwCi08TWV0aG9kTnVtYmVyIDI+ICU9IDIgPT4gMAotPE1ldGhvZE51bWJlciAyPiArIDQuMCA9IDYuMAotPE1ldGhvZE51bWJlciAyPiArPSA0LjAgPT4gNi4wCi08TWV0aG9kTnVtYmVyIDI+IC0gNC4wID0gLTIuMAotPE1ldGhvZE51bWJlciAyPiAtPSA0LjAgPT4gLTIuMAotPE1ldGhvZE51bWJlciAyPiAqIDQuMCA9IDguMAotPE1ldGhvZE51bWJlciAyPiAqPSA0LjAgPT4gOC4wCi08TWV0aG9kTnVtYmVyIDI+IC8gNC4wID0gMC41Ci08TWV0aG9kTnVtYmVyIDI+IC89IDQuMCA9PiAwLjUKLTxNZXRob2ROdW1iZXIgMj4gKiogNC4wID0gMTYuMAotPE1ldGhvZE51bWJlciAyPiAqKj0gNC4wID0+IDE2LjAKLTxNZXRob2ROdW1iZXIgMj4gJSA0LjAgPSAyLjAKLTxNZXRob2ROdW1iZXIgMj4gJT0gNC4wID0+IDIuMAotPE1ldGhvZE51bWJlciAyPiArIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICs9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAtIDIgPSAwCi08TWV0aG9kTnVtYmVyIDI+IC09IDIgPT4gMAotPE1ldGhvZE51bWJlciAyPiAqIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICo9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAvIDIgPSAxCi08TWV0aG9kTnVtYmVyIDI+IC89IDIgPT4gMQotPE1ldGhvZE51bWJlciAyPiAqKiAyID0gNAotPE1ldGhvZE51bWJlciAyPiAqKj0gMiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+ICUgMiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gJT0gMiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICsgKDIrMGopID0gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICs9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLSAoMiswaikgPSAoMC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+IC8gKDIrMGopID0gKDEuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+IC89ICgyKzBqKSA9PiAoMS4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKiogKDIrMGopID0gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICoqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICUgKDIrMGopID0gKDAuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC09IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKiBbMV0gPSBbMSwgMV0KLTxNZXRob2ROdW1iZXIgMj4gKj0gWzFdID0+IFsxLCAxXQotPE1ldGhvZE51bWJlciAyPiAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqICgyLCkgPSAoMiwgMikKLTxNZXRob2ROdW1iZXIgMj4gKj0gKDIsKSA9PiAoMiwgMikKLTxNZXRob2ROdW1iZXIgMj4gLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICsgPE1ldGhvZE51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKz0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC0gPE1ldGhvZE51bWJlciAyPiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gLT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICogPE1ldGhvZE51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC8gPE1ldGhvZE51bWJlciAyPiA9IDEKLTxNZXRob2ROdW1iZXIgMj4gLz0gPE1ldGhvZE51bWJlciAyPiA9PiAxCi08TWV0aG9kTnVtYmVyIDI+ICoqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gJSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotPE1ldGhvZE51bWJlciAyPiAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKyA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotPE1ldGhvZE51bWJlciAyPiAtPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLyA8Q29lcmNlTnVtYmVyIDI+ID0gMQotPE1ldGhvZE51bWJlciAyPiAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDEKLTxNZXRob2ROdW1iZXIgMj4gKiogPENvZXJjZU51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPE1ldGhvZE51bWJlciAyPiAlIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi08TWV0aG9kTnVtYmVyIDI+ICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiArIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICs9IDIgPT4gNAotPENvZXJjZU51bWJlciAyPiAtIDIgPSAwCi08Q29lcmNlTnVtYmVyIDI+IC09IDIgPT4gMAotPENvZXJjZU51bWJlciAyPiAqIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICo9IDIgPT4gNAotPENvZXJjZU51bWJlciAyPiAvIDIgPSAxCi08Q29lcmNlTnVtYmVyIDI+IC89IDIgPT4gMQotPENvZXJjZU51bWJlciAyPiAqKiAyID0gNAotPENvZXJjZU51bWJlciAyPiAqKj0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+ICUgMiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gJT0gMiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICsgNC4wID0gNi4wCi08Q29lcmNlTnVtYmVyIDI+ICs9IDQuMCA9PiA2LjAKLTxDb2VyY2VOdW1iZXIgMj4gLSA0LjAgPSAtMi4wCi08Q29lcmNlTnVtYmVyIDI+IC09IDQuMCA9PiAtMi4wCi08Q29lcmNlTnVtYmVyIDI+ICogNC4wID0gOC4wCi08Q29lcmNlTnVtYmVyIDI+ICo9IDQuMCA9PiA4LjAKLTxDb2VyY2VOdW1iZXIgMj4gLyA0LjAgPSAwLjUKLTxDb2VyY2VOdW1iZXIgMj4gLz0gNC4wID0+IDAuNQotPENvZXJjZU51bWJlciAyPiAqKiA0LjAgPSAxNi4wCi08Q29lcmNlTnVtYmVyIDI+ICoqPSA0LjAgPT4gMTYuMAotPENvZXJjZU51bWJlciAyPiAlIDQuMCA9IDIuMAotPENvZXJjZU51bWJlciAyPiAlPSA0LjAgPT4gMi4wCi08Q29lcmNlTnVtYmVyIDI+ICsgMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKz0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC0gMiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gLT0gMiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICogMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKj0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC8gMiA9IDEKLTxDb2VyY2VOdW1iZXIgMj4gLz0gMiA9PiAxCi08Q29lcmNlTnVtYmVyIDI+ICoqIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICoqPSAyID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gJSAyID0gMAotPENvZXJjZU51bWJlciAyPiAlPSAyID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKyAoMiswaikgPSAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKz0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAtICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAtPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICogKDIrMGopID0gKDQuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICo9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gLyAoMiswaikgPSAoMS4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gLz0gKDIrMGopID0+ICgxLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAqKiAoMiswaikgPSAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKio9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gJSAoMiswaikgPSAoMC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqIFsxXSA9IFsxLCAxXQotPENvZXJjZU51bWJlciAyPiAqPSBbMV0gPT4gWzEsIDFdCi08Q29lcmNlTnVtYmVyIDI+IC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICogKDIsKSA9ICgyLCAyKQotPENvZXJjZU51bWJlciAyPiAqPSAoMiwpID0+ICgyLCAyKQotPENvZXJjZU51bWJlciAyPiAvICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICoqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICsgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC8gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKio9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKyA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiArPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotPENvZXJjZU51bWJlciAyPiAtPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLyA8TWV0aG9kTnVtYmVyIDI+ID0gMQotPENvZXJjZU51bWJlciAyPiAvPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDEKLTxDb2VyY2VOdW1iZXIgMj4gKiogPE1ldGhvZE51bWJlciAyPiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKio9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAlIDxNZXRob2ROdW1iZXIgMj4gPSAwCi08Q29lcmNlTnVtYmVyIDI+ICU9IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiArIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAtIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi08Q29lcmNlTnVtYmVyIDI+IC09IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiAqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAvIDxDb2VyY2VOdW1iZXIgMj4gPSAxCi08Q29lcmNlTnVtYmVyIDI+IC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gMQotPENvZXJjZU51bWJlciAyPiAqKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiAqKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+ICUgPENvZXJjZU51bWJlciAyPiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gJT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi1kaXZtb2QoMiwgMikgPSAoMSwgMCkKLWRpdm1vZCgyLCA0LjApID0gKDAuMCwgMi4wKQotZGl2bW9kKDIsIDIpID0gKDFMLCAwTCkKLWRpdm1vZCgyLCAoMiswaikpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoMiwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgyLCA8Q29lcmNlTnVtYmVyIDI+KSA9ICgxLCAwKQotZGl2bW9kKDQuMCwgMikgPSAoMi4wLCAwLjApCi1kaXZtb2QoNC4wLCA0LjApID0gKDEuMCwgMC4wKQotZGl2bW9kKDQuMCwgMikgPSAoMi4wLCAwLjApCi1kaXZtb2QoNC4wLCAoMiswaikpID0gKCgyKzBqKSwgMGopCi1kaXZtb2QoNC4wLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDQuMCwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoNC4wLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg0LjAsIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDQuMCwgPENvZXJjZU51bWJlciAyPikgPSAoMi4wLCAwLjApCi1kaXZtb2QoMiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDIsIDQuMCkgPSAoMC4wLCAyLjApCi1kaXZtb2QoMiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDIsICgyKzBqKSkgPSAoKDErMGopLCAwaikKLWRpdm1vZCgyLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxDb2VyY2VOdW1iZXIgMj4pID0gKDFMLCAwTCkKLWRpdm1vZCgoMiswaiksIDIpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoKDIrMGopLCA0LjApID0gKDBqLCAoMiswaikpCi1kaXZtb2QoKDIrMGopLCAyKSA9ICgoMSswaiksIDBqKQotZGl2bW9kKCgyKzBqKSwgKDIrMGopKSA9ICgoMSswaiksIDBqKQotZGl2bW9kKCgyKzBqKSwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiswaiksICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyKzBqKSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIrMGopLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiswaiksIDxDb2VyY2VOdW1iZXIgMj4pID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoWzFdLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIDQuMCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sICgyKzBqKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyLCksIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKE5vbmUsIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgMikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAoMiswaikpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxNZXRob2ROdW1iZXIgMj4sIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgPENvZXJjZU51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPENvZXJjZU51bWJlciAyPiwgMikgPSAoMSwgMCkKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA0LjApID0gKDAuMCwgMi4wKQotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIDIpID0gKDFMLCAwTCkKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCAoMiswaikpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoPENvZXJjZU51bWJlciAyPiwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCA8Q29lcmNlTnVtYmVyIDI+KSA9ICgxLCAwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29tcGFyZSBiL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvbXBhcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGJkOTcuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29tcGFyZQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi10ZXN0X2NvbXBhcmUKLTIgPT0gMgotMiA9PSAyLjAKLTIgPT0gMgotMiA9PSAoMiswaikKLTIgIT0gWzFdCi0yICE9ICgzLCkKLTIgIT0gTm9uZQotMiAhPSA8RW1wdHk+Ci0yID09IDxDb2VyY2UgMj4KLTIgPT0gPENtcCAyLjA+Ci0yLjAgPT0gMgotMi4wID09IDIuMAotMi4wID09IDIKLTIuMCA9PSAoMiswaikKLTIuMCAhPSBbMV0KLTIuMCAhPSAoMywpCi0yLjAgIT0gTm9uZQotMi4wICE9IDxFbXB0eT4KLTIuMCA9PSA8Q29lcmNlIDI+Ci0yLjAgPT0gPENtcCAyLjA+Ci0yID09IDIKLTIgPT0gMi4wCi0yID09IDIKLTIgPT0gKDIrMGopCi0yICE9IFsxXQotMiAhPSAoMywpCi0yICE9IE5vbmUKLTIgIT0gPEVtcHR5PgotMiA9PSA8Q29lcmNlIDI+Ci0yID09IDxDbXAgMi4wPgotKDIrMGopID09IDIKLSgyKzBqKSA9PSAyLjAKLSgyKzBqKSA9PSAyCi0oMiswaikgPT0gKDIrMGopCi0oMiswaikgIT0gWzFdCi0oMiswaikgIT0gKDMsKQotKDIrMGopICE9IE5vbmUKLSgyKzBqKSAhPSA8RW1wdHk+Ci0oMiswaikgPT0gPENvZXJjZSAyPgotKDIrMGopID09IDxDbXAgMi4wPgotWzFdICE9IDIKLVsxXSAhPSAyLjAKLVsxXSAhPSAyCi1bMV0gIT0gKDIrMGopCi1bMV0gPT0gWzFdCi1bMV0gIT0gKDMsKQotWzFdICE9IE5vbmUKLVsxXSAhPSA8RW1wdHk+Ci1bMV0gIT0gPENvZXJjZSAyPgotWzFdICE9IDxDbXAgMi4wPgotKDMsKSAhPSAyCi0oMywpICE9IDIuMAotKDMsKSAhPSAyCi0oMywpICE9ICgyKzBqKQotKDMsKSAhPSBbMV0KLSgzLCkgPT0gKDMsKQotKDMsKSAhPSBOb25lCi0oMywpICE9IDxFbXB0eT4KLSgzLCkgIT0gPENvZXJjZSAyPgotKDMsKSAhPSA8Q21wIDIuMD4KLU5vbmUgIT0gMgotTm9uZSAhPSAyLjAKLU5vbmUgIT0gMgotTm9uZSAhPSAoMiswaikKLU5vbmUgIT0gWzFdCi1Ob25lICE9ICgzLCkKLU5vbmUgPT0gTm9uZQotTm9uZSAhPSA8RW1wdHk+Ci1Ob25lICE9IDxDb2VyY2UgMj4KLU5vbmUgIT0gPENtcCAyLjA+Ci08RW1wdHk+ICE9IDIKLTxFbXB0eT4gIT0gMi4wCi08RW1wdHk+ICE9IDIKLTxFbXB0eT4gIT0gKDIrMGopCi08RW1wdHk+ICE9IFsxXQotPEVtcHR5PiAhPSAoMywpCi08RW1wdHk+ICE9IE5vbmUKLTxFbXB0eT4gPT0gPEVtcHR5PgotPEVtcHR5PiAhPSA8Q29lcmNlIDI+Ci08RW1wdHk+ICE9IDxDbXAgMi4wPgotPENvZXJjZSAyPiA9PSAyCi08Q29lcmNlIDI+ID09IDIuMAotPENvZXJjZSAyPiA9PSAyCi08Q29lcmNlIDI+ID09ICgyKzBqKQotPENvZXJjZSAyPiAhPSBbMV0KLTxDb2VyY2UgMj4gIT0gKDMsKQotPENvZXJjZSAyPiAhPSBOb25lCi08Q29lcmNlIDI+ICE9IDxFbXB0eT4KLTxDb2VyY2UgMj4gPT0gPENvZXJjZSAyPgotPENvZXJjZSAyPiA9PSA8Q21wIDIuMD4KLTxDbXAgMi4wPiA9PSAyCi08Q21wIDIuMD4gPT0gMi4wCi08Q21wIDIuMD4gPT0gMgotPENtcCAyLjA+ID09ICgyKzBqKQotPENtcCAyLjA+ICE9IFsxXQotPENtcCAyLjA+ICE9ICgzLCkKLTxDbXAgMi4wPiAhPSBOb25lCi08Q21wIDIuMD4gIT0gPEVtcHR5PgotPENtcCAyLjA+ID09IDxDb2VyY2UgMj4KLTxDbXAgMi4wPiA9PSA8Q21wIDIuMD4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKaW5kZXggODVmNTdhNi4uNTY2ZTU0YiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvcmVncnRlc3QucHkKQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICAgICAgICAgIGltcG9ydCBnYwogICAgICAgICAgICAgICAgIGRlZiBjbGVhbnVwKCk6CiAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZSwgd2FybmluZ3MsIGRpcmNhY2hlCi0gICAgICAgICAgICAgICAgICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyCisgICAgICAgICAgICAgICAgICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyLCBtaW1ldHlwZXMsIGRvY3Rlc3QKICAgICAgICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKICAgICAgICAgICAgICAgICAgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCiAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBmcwpAQCAtNTM2LDYgKzUzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCiAgICAgICAgICAgICAgICAgICAgIGRpcmNhY2hlLnJlc2V0KCkKICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCisgICAgICAgICAgICAgICAgICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQogICAgICAgICAgICAgICAgIGlmIGluZGlyZWN0X3Rlc3Q6CiAgICAgICAgICAgICAgICAgICAgIGRlZiBydW5fdGhlX3Rlc3QoKToKICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0X3Rlc3QoKQpAQCAtNTQ3LDYgKzU0OSw3IEBACiAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiCiAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgXAogICAgICAgICAgICAgICAgICAgICAgICgiMTIzNDU2Nzg5MCIqKHJlcGNvdW50Ly8xMCArIDEpKVs6cmVwY291bnRdCisgICAgICAgICAgICAgICAgY2xlYW51cCgpCiAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocmVwY291bnQpOgogICAgICAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKICAgICAgICAgICAgICAgICAgICAgcnVuX3RoZV90ZXN0KCkKQEAgLTc0NCw2ICs3NDcsOCBAQAogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfdGhyZWFkc2lnbmFscwogICAgICAgICB0ZXN0X3RpbWluZworICAgICAgICB0ZXN0X3dhaXQzCisgICAgICAgIHRlc3Rfd2FpdDQKICAgICAgICAgIiIiLAogICAgICdsaW51eDInOgogICAgICAgICAiIiIKQEAgLTc2MSw2ICs3NjYsOCBAQAogICAgICAgICB0ZXN0X25pcwogICAgICAgICB0ZXN0X250cGF0aAogICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgIiIiLAogICAgJ21hYyc6CkBAIC04MDAsNiArODA3LDggQEAKICAgICAgICAgdGVzdF9wd2QKICAgICAgICAgdGVzdF9yZXNvdXJjZQogICAgICAgICB0ZXN0X3NpZ25hbAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGFyZmlsZQpAQCAtODI0LDYgKzgzMyw4IEBACiAgICAgICAgIHRlc3Rfb3BlbnB0eQogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKKyAgICAgICAgdGVzdF9zcWxpdGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3N1bmRyeQogICAgICAgICAiIiIsCkBAIC04NDYsNiArODU3LDggQEAKICAgICAgICAgdGVzdF9vcGVucHR5CiAgICAgICAgIHRlc3RfcHlleHBhdAogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgICIiIiwKQEAgLTg3Myw2ICs4ODYsOCBAQAogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9xdWV1ZQogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGhyZWFkCkBAIC05MTMsNiArOTI4LDggQEAKICAgICAgICAgdGVzdF9wdHkKICAgICAgICAgdGVzdF9wd2QKICAgICAgICAgdGVzdF9zdHJvcAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgIHRlc3RfdGhyZWFkCkBAIC05MzAsNyArOTQ3LDYgQEAKICAgICAgICAgdGVzdF9jZAogICAgICAgICB0ZXN0X2NsCiAgICAgICAgIHRlc3RfY3Vyc2VzCi0gICAgICAgIHRlc3RfZGwKICAgICAgICAgdGVzdF9nZGJtCiAgICAgICAgIHRlc3RfZ2wKICAgICAgICAgdGVzdF9pbWdmaWxlCkBAIC05NDIsNiArOTU4LDggQEAKICAgICAgICAgdGVzdF9udHBhdGgKICAgICAgICAgdGVzdF9vc3NhdWRpb2RldgogICAgICAgICB0ZXN0X3BvbGwKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAgJ3N1bm9zNSc6CkBAIC05NjAsNiArOTc4LDggQEAKICAgICAgICAgdGVzdF9pbWdmaWxlCiAgICAgICAgIHRlc3RfbGludXhhdWRpb2RldgogICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF96aXBmaWxlCiAgICAgICAgIHRlc3RfemxpYgogICAgICAgICAiIiIsCkBAIC05ODYsNiArMTAwNiw4IEBACiAgICAgICAgIHRlc3Rfb3BlbnB0eQogICAgICAgICB0ZXN0X3B5ZXhwYXQKICAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3ppcGZpbGUKICAgICAgICAgdGVzdF96bGliCkBAIC0xMDExLDYgKzEwMzMsOCBAQAogICAgICAgICB0ZXN0X3BvbGwKICAgICAgICAgdGVzdF9wb3BlbjIKICAgICAgICAgdGVzdF9yZXNvdXJjZQorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgICIiIiwKICAgICAnY3lnd2luJzoKQEAgLTEwMzIsNiArMTA1Niw3IEBACiAgICAgICAgIHRlc3RfbmlzCiAgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKICAgICAgICAgdGVzdF9zb2NrZXRzZXJ2ZXIKKyAgICAgICAgdGVzdF9zcWxpdGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAgJ29zMmVteCc6CkBAIC0xMDU4LDYgKzEwODMsOCBAQAogICAgICAgICB0ZXN0X3B0eQogICAgICAgICB0ZXN0X3Jlc291cmNlCiAgICAgICAgIHRlc3Rfc2lnbmFsCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgIiIiLAogICAgICdmcmVlYnNkNCc6CkBAIC0xMDg0LDYgKzExMTEsOCBAQAogICAgICAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzCiAgICAgICAgIHRlc3Rfc29ja2V0X3NzbAogICAgICAgICB0ZXN0X3NvY2tldHNlcnZlcgorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfdGNsCiAgICAgICAgIHRlc3RfdGltZW91dApAQCAtMTExMyw2ICsxMTQyLDggQEAKICAgICAgICAgdGVzdF9tYWNvc3Rvb2xzCiAgICAgICAgIHRlc3RfbmlzCiAgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICB0ZXN0X3RjbAogICAgICAgICB0ZXN0X3dpbnJlZwpAQCAtMTEyMCw2ICsxMTUxLDM4IEBACiAgICAgICAgIHRlc3RfemlwaW1wb3J0CiAgICAgICAgIHRlc3RfemxpYgogICAgICAgICAiIiIsCisgICAgJ29wZW5ic2QzJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYWVwYWNrCisgICAgICAgIHRlc3RfYWwKKyAgICAgICAgdGVzdF9hcHBsZXNpbmdsZQorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY2QKKyAgICAgICAgdGVzdF9jbAorICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dsCisgICAgICAgIHRlc3RfaW1nZmlsZQorICAgICAgICB0ZXN0X2xpbnV4YXVkaW9kZXYKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9tYWNmcworICAgICAgICB0ZXN0X21hY29zdG9vbHMKKyAgICAgICAgdGVzdF9uaXMKKyAgICAgICAgdGVzdF9ub3JtYWxpemF0aW9uCisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9wZXAyNzcKKyAgICAgICAgdGVzdF9wbGlzdGxpYgorICAgICAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzCisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCisgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKKyAgICAgICAgdGVzdF91bmljb2RlX2ZpbGUKKyAgICAgICAgdGVzdF93aW5yZWcKKyAgICAgICAgdGVzdF93aW5zb3VuZAorICAgICAgICAiIiIsCiB9CiBfZXhwZWN0YXRpb25zWydmcmVlYnNkNSddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQogX2V4cGVjdGF0aW9uc1snZnJlZWJzZDYnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weSBiL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQppbmRleCAwYjJlN2RhLi5jNDVlMTM5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CkBAIC01LDggKzUsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiAKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiogcmVnc3ViIC4qIiwgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgcidecmVnc3ViJCcpCiB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZ29waGVybGliIG1vZHVsZSBpcyBkZXByZWNhdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKQEAgLTEyOCw4ICsxMjYsNiBAQAogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicXVvcHJpIikKICAgICAgICAgc2VsZi5jaGVja19hbGwoInJhbmRvbSIpCiAgICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZSIpCi0gICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZWNvbnZlcnQiKQotICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmVnc3ViIikKICAgICAgICAgc2VsZi5jaGVja19hbGwoInJlcHIiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmV4ZWMiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmZjODIyIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkgYi9MaWIvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5CmluZGV4IDJhMmQ2MGEuLmQ1MzNmMWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weQpAQCAtMTUsOCArMTUsOCBAQAogZGF0YWZvcmtkYXRhID0gJ2hlbGxvXHJcMHdvcmxkXG4nCiByZXNvdXJjZWZvcmtkYXRhID0gJ2dvb2RieWVcbmNydWVsXDB3b3JsZFxyJwogCi1hcHBsZXNpbmdsZWRhdGEgPSBzdHJ1Y3QucGFjaygibGwxNnNoIiwgQVNfTUFHSUMsIEFTX1ZFUlNJT04sICJmb28iLCAyKSArIFwKLSAgICBzdHJ1Y3QucGFjaygibGxsbGxsIiwgMSwgNTAsIGxlbihkYXRhZm9ya2RhdGEpLAorYXBwbGVzaW5nbGVkYXRhID0gc3RydWN0LnBhY2soIj5sbDE2c2giLCBBU19NQUdJQywgQVNfVkVSU0lPTiwgImZvbyIsIDIpICsgXAorICAgIHN0cnVjdC5wYWNrKCI+bGxsbGxsIiwgMSwgNTAsIGxlbihkYXRhZm9ya2RhdGEpLAogICAgICAgICAyLCA1MCtsZW4oZGF0YWZvcmtkYXRhKSwgbGVuKHJlc291cmNlZm9ya2RhdGEpKSArIFwKICAgICBkYXRhZm9ya2RhdGEgKyBcCiAgICAgcmVzb3VyY2Vmb3JrZGF0YQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggODdkMzk1ZC4uNjIzNjFmYyAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgIGJpID0gYS5idWZmZXJfaW5mbygpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJpKSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmlbMF0sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpWzBdLCAoaW50LCBsb25nKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJpWzFdLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpWzFdLCBsZW4oYSkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggYjQyY2FhMy4uYzY0YWQyOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTExOSw3ICsxMTksOCBAQAogIyBleGNlcHRoYW5kbGVyLCBhcmd1bWVudHMsIGtleXdvcmRzLCBhbGlhcwogCiBpZiBfX25hbWVfXz09J19fbWFpbl9fJyBhbmQgc3lzLmFyZ3ZbMTpdID09IFsnLWcnXToKLSAgICBmb3Igc3RhdGVtZW50cywga2luZCBpbiAoKGV4ZWNfdGVzdHMsICJleGVjIiksIChzaW5nbGVfdGVzdHMsICJzaW5nbGUiKSwgKGV2YWxfdGVzdHMsICJldmFsIikpOgorICAgIGZvciBzdGF0ZW1lbnRzLCBraW5kIGluICgoZXhlY190ZXN0cywgImV4ZWMiKSwgKHNpbmdsZV90ZXN0cywgInNpbmdsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgImV2YWwiKSk6CiAgICAgICAgIHByaW50IGtpbmQrIl9yZXN1bHRzID0gWyIKICAgICAgICAgZm9yIHMgaW4gc3RhdGVtZW50czoKICAgICAgICAgICAgIHByaW50IHJlcHIodG9fdHVwbGUoY29tcGlsZShzLCAiPyIsIGtpbmQsIDB4NDAwKSkpKyIsIgpAQCAtMTMxLDcgKzEzMiw3IEBACiAKICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3Rfbm9kZSwgX2FzdC5BU1QpIG9yIGFzdF9ub2RlLl9maWVsZHMgPT0gTm9uZToKICAgICAgICAgcmV0dXJuCi0gICAgaWYgaXNpbnN0YW5jZShhc3Rfbm9kZSwgKF9hc3QuZXhwciwgX2FzdC5zdG10KSk6CisgICAgaWYgaXNpbnN0YW5jZShhc3Rfbm9kZSwgKF9hc3QuZXhwciwgX2FzdC5zdG10LCBfYXN0LmV4Y2VwdGhhbmRsZXIpKToKICAgICAgICAgbm9kZV9wb3MgPSAoYXN0X25vZGUubGluZW5vLCBhc3Rfbm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICBhc3NlcnQgbm9kZV9wb3MgPj0gcGFyZW50X3BvcywgKG5vZGVfcG9zLCBwYXJlbnRfcG9zKQogICAgICAgICBwYXJlbnRfcG9zID0gKGFzdF9ub2RlLmxpbmVubywgYXN0X25vZGUuY29sX29mZnNldCkKQEAgLTE0NSw4ICsxNDYsOCBAQAogCiBkZWYgcnVuX3Rlc3RzKCk6CiAgICAgZm9yIGlucHV0LCBvdXRwdXQsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCBleGVjX3Jlc3VsdHMsICJleGVjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZV90ZXN0cywgc2luZ2xlX3Jlc3VsdHMsICJzaW5nbGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgZXZhbF9yZXN1bHRzLCAiZXZhbCIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZV90ZXN0cywgc2luZ2xlX3Jlc3VsdHMsICJzaW5nbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2YWxfdGVzdHMsIGV2YWxfcmVzdWx0cywgImV2YWwiKSk6CiAgICAgICAgIGZvciBpLCBvIGluIGl0ZXJ0b29scy5pemlwKGlucHV0LCBvdXRwdXQpOgogICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgMHg0MDApCiAgICAgICAgICAgICBhc3NlcnQgdG9fdHVwbGUoYXN0X3RyZWUpID09IG8KQEAgLTE2NSw3ICsxNjYsNyBAQAogKCdNb2R1bGUnLCBbKCdXaGlsZScsICgxLCAwKSwgKCdOYW1lJywgKDEsIDYpLCAndicsICgnTG9hZCcsKSksIFsoJ1Bhc3MnLCAoMSwgOCkpXSwgW10pXSksCiAoJ01vZHVsZScsIFsoJ0lmJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMyksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA1KSldLCBbXSldKSwKICgnTW9kdWxlJywgWygnUmFpc2UnLCAoMSwgMCksICgnTmFtZScsICgxLCA2KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksICgnU3RyJywgKDEsIDE3KSwgJ3N0cmluZycpLCBOb25lKV0pLAotKCdNb2R1bGUnLCBbKCdUcnlFeGNlcHQnLCAoMSwgMCksIFsoJ1Bhc3MnLCAoMiwgMikpXSwgWygnZXhjZXB0aGFuZGxlcicsICgnTmFtZScsICgzLCA3KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksIE5vbmUsIFsoJ1Bhc3MnLCAoNCwgMikpXSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnVHJ5RXhjZXB0JywgKDEsIDApLCBbKCdQYXNzJywgKDIsIDIpKV0sIFsoJ2V4Y2VwdGhhbmRsZXInLCAoMywgMCksICgnTmFtZScsICgzLCA3KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksIE5vbmUsIFsoJ1Bhc3MnLCAoNCwgMikpXSwgMywgMCldLCBbXSldKSwKICgnTW9kdWxlJywgWygnVHJ5RmluYWxseScsICgxLCAwKSwgWygnUGFzcycsICgyLCAyKSldLCBbKCdQYXNzJywgKDQsIDIpKV0pXSksCiAoJ01vZHVsZScsIFsoJ0Fzc2VydCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDcpLCAndicsICgnTG9hZCcsKSksIE5vbmUpXSksCiAoJ01vZHVsZScsIFsoJ0ltcG9ydCcsICgxLCAwKSwgWygnYWxpYXMnLCAnc3lzJywgTm9uZSldKV0pLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5CmluZGV4IDQ0MGFkYWIuLmY1ODU3MzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXVkaW9vcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2F1ZGlvb3AucHkKQEAgLTEzNiwxMiArMTM2LDMwIEBACiAgICAgICAgIHJldHVybiAwCiAgICAgcmV0dXJuIDEKIAorZGVmIHRlc3RsaW4yYWxhdyhkYXRhKToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnbGluMmFsYXcnCisgICAgaWYgYXVkaW9vcC5saW4yYWxhdyhkYXRhWzBdLCAxKSAhPSAnXHhkNVx4YzVceGY1JyBvciBcCisgICAgICAgICAgICAgIGF1ZGlvb3AubGluMmFsYXcoZGF0YVsxXSwgMikgIT0gJ1x4ZDVceGQ1XHhkNScgb3IgXAorICAgICAgICAgICAgICBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMl0sIDQpICE9ICdceGQ1XHhkNVx4ZDUnOgorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKK2RlZiB0ZXN0YWxhdzJsaW4oZGF0YSk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2FsYXcybGluJworICAgICMgQ3Vyc29yeQorICAgIGQgPSBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMF0sIDEpCisgICAgaWYgYXVkaW9vcC5hbGF3MmxpbihkLCAxKSAhPSBkYXRhWzBdOgorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKIGRlZiB0ZXN0bGluMnVsYXcoZGF0YSk6CiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ2xpbjJ1bGF3JwotICAgIGlmIGF1ZGlvb3AubGluMnVsYXcoZGF0YVswXSwgMSkgIT0gJ1wzNzdcMzQ3XDMzMycgb3IgXAotICAgICAgICAgICAgICBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMV0sIDIpICE9ICdcMzc3XDM3N1wzNzcnIG9yIFwKLSAgICAgICAgICAgICAgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzJdLCA0KSAhPSAnXDM3N1wzNzdcMzc3JzoKKyAgICBpZiBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMF0sIDEpICE9ICdceGZmXHhlN1x4ZGInIG9yIFwKKyAgICAgICAgICAgICAgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzFdLCAyKSAhPSAnXHhmZlx4ZmZceGZmJyBvciBcCisgICAgICAgICAgICAgIGF1ZGlvb3AubGluMnVsYXcoZGF0YVsyXSwgNCkgIT0gJ1x4ZmZceGZmXHhmZic6CiAgICAgICAgIHJldHVybiAwCiAgICAgcmV0dXJuIDEKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQppbmRleCAyMmNjYTQ0Li4wMzA5ZDZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQpAQCAtMSwyNTggKzEsMzEyIEBACiAjIEF1Z21lbnRlZCBhc3NpZ25tZW50IHRlc3QuCiAKLXggPSAyCi14ICs9IDEKLXggKj0gMgoteCAqKj0gMgoteCAtPSA4Ci14ICU9IDEyCi14ID4+PSAxCi14ICY9IDIKLXggfD0gNQoteCBePSAxCi14IDw8PSAyCi14IC89IDIKLXggLy89IDIKLQotcHJpbnQgeAotcHJpbnQgaW50KHgpCi0KLXggPSBbMl0KLXhbMF0gKz0gMQoteFswXSAqPSAyCi14WzBdICoqPSAyCi14WzBdIC09IDgKLXhbMF0gJT0gMTIKLXhbMF0gPj49IDEKLXhbMF0gJj0gMgoteFswXSB8PSA1Ci14WzBdIF49IDEKLXhbMF0gPDw9IDIKLXhbMF0gLz0gMgoteFswXSAvLz0gMgotCi1wcmludCB4Ci1wcmludCBpbnQoeFswXSkKLQoteCA9IHswOiAyfQoteFswXSArPSAxCi14WzBdICo9IDIKLXhbMF0gKio9IDIKLXhbMF0gLT0gOAoteFswXSAlPSAxMgoteFswXSA+Pj0gMQoteFswXSAmPSAyCi14WzBdIHw9IDUKLXhbMF0gXj0gMQoteFswXSA8PD0gMgoteFswXSAvPSAyCi14WzBdIC8vPSAyCi0KLXByaW50IHhbMF0KLXByaW50IGludCh4WzBdKQotCi14ID0gWzEsMl0KLXggKz0gWzMsNF0KLXggKj0gMgotCi1wcmludCB4Ci0KLXggPSBbMSwgMiwgM10KLXkgPSB4Ci14WzE6Ml0gKj0gMgoteVsxOjJdICs9IFsxXQotCi1wcmludCB4Ci1wcmludCB4IGlzIHkKLQotY2xhc3MgYXVnX3Rlc3Q6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKLSAgICAgICAgc2VsZi52YWwgPSB2YWx1ZQotICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICByZXR1cm4gc2VsZi52YWwgKyB2YWwKLSAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICByZXR1cm4gYXVnX3Rlc3Qoc2VsZi52YWwgKyB2YWwpCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiAKLWNsYXNzIGF1Z190ZXN0MihhdWdfdGVzdCk6Ci0gICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKyB2YWwKLSAgICAgICAgcmV0dXJuIHNlbGYKK2NsYXNzIEF1Z0Fzc2lnblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CisgICAgICAgIHggPSAyCisgICAgICAgIHggKz0gMQorICAgICAgICB4ICo9IDIKKyAgICAgICAgeCAqKj0gMgorICAgICAgICB4IC09IDgKKyAgICAgICAgeCAvLz0gNQorICAgICAgICB4ICU9IDMKKyAgICAgICAgeCAmPSAyCisgICAgICAgIHggfD0gNQorICAgICAgICB4IF49IDEKKyAgICAgICAgeCAvPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDMuMCkKIAotY2xhc3MgYXVnX3Rlc3QzKGF1Z190ZXN0KToKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcmV0dXJuIGF1Z190ZXN0MyhzZWxmLnZhbCArIHZhbCkKKyAgICBkZWYgdGVzdEluTGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsyXQorICAgICAgICB4WzBdICs9IDEKKyAgICAgICAgeFswXSAqPSAyCisgICAgICAgIHhbMF0gKio9IDIKKyAgICAgICAgeFswXSAtPSA4CisgICAgICAgIHhbMF0gLy89IDUKKyAgICAgICAgeFswXSAlPSAzCisgICAgICAgIHhbMF0gJj0gMgorICAgICAgICB4WzBdIHw9IDUKKyAgICAgICAgeFswXSBePSAxCisgICAgICAgIHhbMF0gLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4WzBdLCAzLjApCiAKLXggPSBhdWdfdGVzdCgxKQoteSA9IHgKLXggKz0gMTAKKyAgICBkZWYgdGVzdEluRGljdChzZWxmKToKKyAgICAgICAgeCA9IHswOiAyfQorICAgICAgICB4WzBdICs9IDEKKyAgICAgICAgeFswXSAqPSAyCisgICAgICAgIHhbMF0gKio9IDIKKyAgICAgICAgeFswXSAtPSA4CisgICAgICAgIHhbMF0gLy89IDUKKyAgICAgICAgeFswXSAlPSAzCisgICAgICAgIHhbMF0gJj0gMgorICAgICAgICB4WzBdIHw9IDUKKyAgICAgICAgeFswXSBePSAxCisgICAgICAgIHhbMF0gLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4WzBdLCAzLjApCiAKLXByaW50IGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpCi1wcmludCB5IGlzIG5vdCB4Ci1wcmludCB4LnZhbAorICAgIGRlZiB0ZXN0U2VxdWVuY2VzKHNlbGYpOgorICAgICAgICB4ID0gWzEsMl0KKyAgICAgICAgeCArPSBbMyw0XQorICAgICAgICB4ICo9IDIKIAoteCA9IGF1Z190ZXN0MigyKQoteSA9IHgKLXggKz0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgWzEsIDIsIDMsIDQsIDEsIDIsIDMsIDRdKQogCi1wcmludCB5IGlzIHgKLXByaW50IHgudmFsCisgICAgICAgIHggPSBbMSwgMiwgM10KKyAgICAgICAgeSA9IHgKKyAgICAgICAgeFsxOjJdICo9IDIKKyAgICAgICAgeVsxOjJdICs9IFsxXQogCi14ID0gYXVnX3Rlc3QzKDMpCi15ID0geAoteCArPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCBbMSwgMiwgMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIHkpCiAKLXByaW50IGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKQotcHJpbnQgeSBpcyBub3QgeAotcHJpbnQgeC52YWwKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMxKHNlbGYpOgogCi1jbGFzcyB0ZXN0YWxsOgorICAgICAgICBjbGFzcyBhdWdfdGVzdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWwgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsICsgdmFsCisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHJldHVybiBhdWdfdGVzdChzZWxmLnZhbCArIHZhbCkKIAotICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2FkZF9fIGNhbGxlZCIKLSAgICBkZWYgX19yYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmFkZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWFkZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgY2xhc3MgYXVnX3Rlc3QyKGF1Z190ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKyB2YWwKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgZGVmIF9fc3ViX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fc3ViX18gY2FsbGVkIgotICAgIGRlZiBfX3JzdWJfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yc3ViX18gY2FsbGVkIgotICAgIGRlZiBfX2lzdWJfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pc3ViX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjbGFzcyBhdWdfdGVzdDMoYXVnX3Rlc3QpOgorICAgICAgICAgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF1Z190ZXN0MyhzZWxmLnZhbCArIHZhbCkKIAotICAgIGRlZiBfX211bF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX211bF9fIGNhbGxlZCIKLSAgICBkZWYgX19ybXVsX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm11bF9fIGNhbGxlZCIKLSAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faW11bF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgeCA9IGF1Z190ZXN0KDEpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fZmxvb3JkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWZsb29yZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3JmbG9vcmRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQorICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDExKQogCi0gICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3RydWVkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9faXRydWVkaXZfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pdHJ1ZWRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKLSAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3J0cnVlZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICB4ID0gYXVnX3Rlc3QyKDIpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX21vZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX21vZF9fIGNhbGxlZCIKLSAgICBkZWYgX19ybW9kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm1vZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pbW9kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faW1vZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDEyKQogCi0gICAgZGVmIF9fcG93X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcG93X18gY2FsbGVkIgotICAgIGRlZiBfX3Jwb3dfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19ycG93X18gY2FsbGVkIgotICAgIGRlZiBfX2lwb3dfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pcG93X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICB4ID0gYXVnX3Rlc3QzKDMpCisgICAgICAgIHkgPSB4CisgICAgICAgIHggKz0gMTAKIAotICAgIGRlZiBfX29yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fb3JfXyBjYWxsZWQiCi0gICAgZGVmIF9fcm9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcm9yX18gY2FsbGVkIgotICAgIGRlZiBfX2lvcl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lvcl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMykKIAotICAgIGRlZiBfX2FuZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2FuZF9fIGNhbGxlZCIKLSAgICBkZWYgX19yYW5kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmFuZF9fIGNhbGxlZCIKLSAgICBkZWYgX19pYW5kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWFuZF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKIAotICAgIGRlZiBfX3hvcl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3hvcl9fIGNhbGxlZCIKLSAgICBkZWYgX19yeG9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcnhvcl9fIGNhbGxlZCIKLSAgICBkZWYgX19peG9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faXhvcl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMyKHRlc3Rfc2VsZik6CisgICAgICAgIG91dHB1dCA9IFtdCiAKLSAgICBkZWYgX19yc2hpZnRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3Jyc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9faXJzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lyc2hpZnRfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNsYXNzIHRlc3RhbGw6CisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fYWRkX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmFkZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lhZGRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLSAgICBkZWYgX19sc2hpZnRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19sc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3Jsc2hpZnRfXyBjYWxsZWQiCi0gICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lsc2hpZnRfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19zdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fc3ViX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JzdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnN1Yl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pc3ViX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lzdWJfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggPSB0ZXN0YWxsKCkKLXggKyAxCi0xICsgeAoteCArPSAxCisgICAgICAgICAgICBkZWYgX19tdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fbXVsX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JtdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcm11bF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2ltdWxfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggLSAxCi0xIC0geAoteCAtPSAxCisgICAgICAgICAgICBkZWYgX19kaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggKiAxCi0xICogeAoteCAqPSAxCisgICAgICAgICAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19mbG9vcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2lmbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pZmxvb3JkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmZsb29yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IC8gMQotMSAvIHgKLXggLz0gMQorICAgICAgICAgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX190cnVlZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnRydWVkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19pdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pdHJ1ZWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAvLyAxCi0xIC8vIHgKLXggLy89IDEKKyAgICAgICAgICAgIGRlZiBfX21vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19tb2RfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm1vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybW9kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2ltb2RfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW1vZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAlIDEKLTEgJSB4Ci14ICU9IDEKKyAgICAgICAgICAgIGRlZiBfX3Bvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19wb3dfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ycG93X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lwb3dfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXBvd19fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAqKiAxCi0xICoqIHgKLXggKio9IDEKKyAgICAgICAgICAgIGRlZiBfX29yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX29yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3Jvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yb3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faW9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCB8IDEKLTEgfCB4Ci14IHw9IDEKKyAgICAgICAgICAgIGRlZiBfX2FuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19hbmRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmFuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yYW5kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lhbmRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWFuZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAmIDEKLTEgJiB4Ci14ICY9IDEKKyAgICAgICAgICAgIGRlZiBfX3hvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX194b3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnhvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yeG9yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2l4b3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXhvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCBeIDEKLTEgXiB4Ci14IF49IDEKKyAgICAgICAgICAgIGRlZiBfX3JzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ycnNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lyc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXJzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCA+PiAxCi0xID4+IHgKLXggPj49IDEKKyAgICAgICAgICAgIGRlZiBfX2xzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19sc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybHNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWxzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCA8PCAxCi0xIDw8IHgKLXggPDw9IDEKKyAgICAgICAgeCA9IHRlc3RhbGwoKQorICAgICAgICB4ICsgMQorICAgICAgICAxICsgeAorICAgICAgICB4ICs9IDEKKworICAgICAgICB4IC0gMQorICAgICAgICAxIC0geAorICAgICAgICB4IC09IDEKKworICAgICAgICB4ICogMQorICAgICAgICAxICogeAorICAgICAgICB4ICo9IDEKKworICAgICAgICB4IC8gMQorICAgICAgICAxIC8geAorICAgICAgICB4IC89IDEKKworICAgICAgICB4IC8vIDEKKyAgICAgICAgMSAvLyB4CisgICAgICAgIHggLy89IDEKKworICAgICAgICB4ICUgMQorICAgICAgICAxICUgeAorICAgICAgICB4ICU9IDEKKworICAgICAgICB4ICoqIDEKKyAgICAgICAgMSAqKiB4CisgICAgICAgIHggKio9IDEKKworICAgICAgICB4IHwgMQorICAgICAgICAxIHwgeAorICAgICAgICB4IHw9IDEKKworICAgICAgICB4ICYgMQorICAgICAgICAxICYgeAorICAgICAgICB4ICY9IDEKKworICAgICAgICB4IF4gMQorICAgICAgICAxIF4geAorICAgICAgICB4IF49IDEKKworICAgICAgICB4ID4+IDEKKyAgICAgICAgMSA+PiB4CisgICAgICAgIHggPj49IDEKKworICAgICAgICB4IDw8IDEKKyAgICAgICAgMSA8PCB4CisgICAgICAgIHggPDw9IDEKKworICAgICAgICB0ZXN0X3NlbGYuYXNzZXJ0RXF1YWxzKG91dHB1dCwgJycnXAorX19hZGRfXyBjYWxsZWQKK19fcmFkZF9fIGNhbGxlZAorX19pYWRkX18gY2FsbGVkCitfX3N1Yl9fIGNhbGxlZAorX19yc3ViX18gY2FsbGVkCitfX2lzdWJfXyBjYWxsZWQKK19fbXVsX18gY2FsbGVkCitfX3JtdWxfXyBjYWxsZWQKK19faW11bF9fIGNhbGxlZAorX190cnVlZGl2X18gY2FsbGVkCitfX3J0cnVlZGl2X18gY2FsbGVkCitfX2l0cnVlZGl2X18gY2FsbGVkCitfX2Zsb29yZGl2X18gY2FsbGVkCitfX3JmbG9vcmRpdl9fIGNhbGxlZAorX19pZmxvb3JkaXZfXyBjYWxsZWQKK19fbW9kX18gY2FsbGVkCitfX3Jtb2RfXyBjYWxsZWQKK19faW1vZF9fIGNhbGxlZAorX19wb3dfXyBjYWxsZWQKK19fcnBvd19fIGNhbGxlZAorX19pcG93X18gY2FsbGVkCitfX29yX18gY2FsbGVkCitfX3Jvcl9fIGNhbGxlZAorX19pb3JfXyBjYWxsZWQKK19fYW5kX18gY2FsbGVkCitfX3JhbmRfXyBjYWxsZWQKK19faWFuZF9fIGNhbGxlZAorX194b3JfXyBjYWxsZWQKK19fcnhvcl9fIGNhbGxlZAorX19peG9yX18gY2FsbGVkCitfX3JzaGlmdF9fIGNhbGxlZAorX19ycnNoaWZ0X18gY2FsbGVkCitfX2lyc2hpZnRfXyBjYWxsZWQKK19fbHNoaWZ0X18gY2FsbGVkCitfX3Jsc2hpZnRfXyBjYWxsZWQKK19faWxzaGlmdF9fIGNhbGxlZAorJycnLnNwbGl0bGluZXMoKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChBdWdBc3NpZ25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5IGIvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQppbmRleCAxZWM0ODAxLi41MTNlNTQxIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKQEAgLTExLDkgKzExLDEwIEBACiBmcm9tIHNldHMgaW1wb3J0IFNldAogCiBjbGFzcyBUZXN0QlNEREIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG9wZW5mbGFnID0gJ2MnCiAKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuZiA9IHNlbGYub3Blbm1ldGhvZFswXShzZWxmLmZuYW1lLCAnYycpCisgICAgICAgIHNlbGYuZiA9IHNlbGYub3Blbm1ldGhvZFswXShzZWxmLmZuYW1lLCBzZWxmLm9wZW5mbGFnLCBjYWNoZXNpemU9MzI3NjgpCiAgICAgICAgIHNlbGYuZCA9IGRpY3QocT0nR3VpZG8nLCB3PSd2YW4nLCBlPSdSb3NzdW0nLCByPSdpbnZlbnRlZCcsIHQ9J1B5dGhvbicsIHk9JycpCiAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZC5pdGVyaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYuZltrXSA9IHYKQEAgLTI2Nyw2ICsyNjgsMTEgQEAKICAgICBmbmFtZSA9IE5vbmUKICAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KIAorY2xhc3MgVGVzdEJUcmVlX0luTWVtb3J5X1RydW5jYXRlKFRlc3RCU0REQik6CisgICAgZm5hbWUgPSBOb25lCisgICAgb3BlbmZsYWcgPSAnbicKKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KKwogY2xhc3MgVGVzdEhhc2hUYWJsZShUZXN0QlNEREIpOgogICAgIGZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuaGFzaG9wZW5dCkBAIC0yODUsNiArMjkxLDcgQEAKICAgICAgICAgVGVzdEhhc2hUYWJsZSwKICAgICAgICAgVGVzdEJUcmVlX0luTWVtb3J5LAogICAgICAgICBUZXN0SGFzaFRhYmxlX0luTWVtb3J5LAorICAgICAgICBUZXN0QlRyZWVfSW5NZW1vcnlfVHJ1bmNhdGUsCiAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IDZmMTFmZGQuLmVmNGY0MDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTEwOCw2ICsxMDgsNyBAQAogICAgICAgICBfX2ltcG9ydF9fKCdzdHJpbmcnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgX19pbXBvcnRfXywgJ3NwYW1zcGFtJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfX2ltcG9ydF9fLCAxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfX2ltcG9ydF9fLCAnJykKIAogICAgIGRlZiB0ZXN0X2FicyhzZWxmKToKICAgICAgICAgIyBpbnQKQEAgLTEzMTcsNiArMTMxOCw5IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtOC4wLCAtMSksIC0xMC4wKQogCisgICAgICAgICMgdGVzdCBuZXcga3dhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQobnVtYmVyPS04LjAsIG5kaWdpdHM9LTEpLCAtMTAuMCkKKwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kKQogCiAgICAgZGVmIHRlc3Rfc2V0YXR0cihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CmluZGV4IDM0ZDM2NWIuLmU0MTQzMjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQpAQCAtNCw2ICs0LDIwMiBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogCityZXN1bHRfMjAwNF90ZXh0ID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwNAorCisgICAgICBKYW51YXJ5ICAgICAgICAgICAgICAgICAgIEZlYnJ1YXJ5ICAgICAgICAgICAgICAgICAgIE1hcmNoCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgMSAgMiAgMyAgNCAgNSAgNiAgNworIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA4ICA5IDEwIDExIDEyIDEzIDE0CisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTUgMTYgMTcgMTggMTkgMjAgMjEKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMiAyMyAyNCAyNSAyNiAyNyAyOAorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI5IDMwIDMxCisKKyAgICAgICBBcHJpbCAgICAgICAgICAgICAgICAgICAgICBNYXkgICAgICAgICAgICAgICAgICAgICAgIEp1bmUKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgIDEgIDIgIDMgIDQgICAgICAgICAgICAgICAgICAgICAgMSAgMiAgICAgICAgICAxICAyICAzICA0ICA1ICA2CisgNSAgNiAgNyAgOCAgOSAxMCAxMSAgICAgICAzICA0ICA1ICA2ICA3ICA4ICA5ICAgICAgIDcgIDggIDkgMTAgMTEgMTIgMTMKKzEyIDEzIDE0IDE1IDE2IDE3IDE4ICAgICAgMTAgMTEgMTIgMTMgMTQgMTUgMTYgICAgICAxNCAxNSAxNiAxNyAxOCAxOSAyMAorMTkgMjAgMjEgMjIgMjMgMjQgMjUgICAgICAxNyAxOCAxOSAyMCAyMSAyMiAyMyAgICAgIDIxIDIyIDIzIDI0IDI1IDI2IDI3CisyNiAyNyAyOCAyOSAzMCAgICAgICAgICAgIDI0IDI1IDI2IDI3IDI4IDI5IDMwICAgICAgMjggMjkgMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKworICAgICAgICBKdWx5ICAgICAgICAgICAgICAgICAgICAgQXVndXN0ICAgICAgICAgICAgICAgICAgU2VwdGVtYmVyCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgMSAgMiAgMyAgNCAgNQorIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA2ICA3ICA4ICA5IDEwIDExIDEyCisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTMgMTQgMTUgMTYgMTcgMTggMTkKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMCAyMSAyMiAyMyAyNCAyNSAyNgorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI3IDI4IDI5IDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMwIDMxCisKKyAgICAgIE9jdG9iZXIgICAgICAgICAgICAgICAgICAgTm92ZW1iZXIgICAgICAgICAgICAgICAgICBEZWNlbWJlcgorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgICAgMSAgMiAgMyAgICAgICAxICAyICAzICA0ICA1ICA2ICA3ICAgICAgICAgICAgIDEgIDIgIDMgIDQgIDUKKyA0ICA1ICA2ICA3ICA4ICA5IDEwICAgICAgIDggIDkgMTAgMTEgMTIgMTMgMTQgICAgICAgNiAgNyAgOCAgOSAxMCAxMSAxMgorMTEgMTIgMTMgMTQgMTUgMTYgMTcgICAgICAxNSAxNiAxNyAxOCAxOSAyMCAyMSAgICAgIDEzIDE0IDE1IDE2IDE3IDE4IDE5CisxOCAxOSAyMCAyMSAyMiAyMyAyNCAgICAgIDIyIDIzIDI0IDI1IDI2IDI3IDI4ICAgICAgMjAgMjEgMjIgMjMgMjQgMjUgMjYKKzI1IDI2IDI3IDI4IDI5IDMwIDMxICAgICAgMjkgMzAgICAgICAgICAgICAgICAgICAgICAyNyAyOCAyOSAzMCAzMQorIiIiCisKK3Jlc3VsdF8yMDA0X2h0bWwgPSAiIiIKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9ImFzY2lpIj8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9YXNjaWkiIC8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjYWxlbmRhci5jc3MiIC8+Cis8dGl0bGU+Q2FsZW5kYXIgZm9yIDIwMDQ8L3RpdGxlCis8L2hlYWQ+Cis8Ym9keT4KKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InllYXIiPgorPHRyPjx0aCBjb2xzcGFuPSIzIiBjbGFzcz0ieWVhciI+MjAwNDwvdGg+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5KYW51YXJ5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9InNhdCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+RmVicnVhcnk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InN1biI+MTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjM8L3RkPjx0ZCBjbGFzcz0id2VkIj40PC90ZD48dGQgY2xhc3M9InRodSI+NTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij43PC90ZD48dGQgY2xhc3M9InN1biI+ODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+OTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEwPC90ZD48dGQgY2xhc3M9IndlZCI+MTE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEzPC90ZD48dGQgY2xhc3M9InNhdCI+MTQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTY8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE4PC90ZD48dGQgY2xhc3M9InRodSI+MTk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIxPC90ZD48dGQgY2xhc3M9InN1biI+MjI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIzPC90ZD48dGQgY2xhc3M9InR1ZSI+MjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI2PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI5PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5NYXJjaDwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xPC90ZD48dGQgY2xhc3M9InR1ZSI+MjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij40PC90ZD48dGQgY2xhc3M9ImZyaSI+NTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj43PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj44PC90ZD48dGQgY2xhc3M9InR1ZSI+OTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEwPC90ZD48dGQgY2xhc3M9InRodSI+MTE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEzPC90ZD48dGQgY2xhc3M9InN1biI+MTQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE1PC90ZD48dGQgY2xhc3M9InR1ZSI+MTY8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE4PC90ZD48dGQgY2xhc3M9ImZyaSI+MTk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIxPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIzPC90ZD48dGQgY2xhc3M9IndlZCI+MjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI2PC90ZD48dGQgY2xhc3M9InNhdCI+Mjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkFwcmlsPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+TWF5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xPC90ZD48dGQgY2xhc3M9InN1biI+MjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj41PC90ZD48dGQgY2xhc3M9InRodSI+NjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij44PC90ZD48dGQgY2xhc3M9InN1biI+OTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTA8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEyPC90ZD48dGQgY2xhc3M9InRodSI+MTM8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE1PC90ZD48dGQgY2xhc3M9InN1biI+MTY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE3PC90ZD48dGQgY2xhc3M9InR1ZSI+MTg8L3RkPjx0ZCBjbGFzcz0id2VkIj4xOTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIwPC90ZD48dGQgY2xhc3M9ImZyaSI+MjE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIzPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI1PC90ZD48dGQgY2xhc3M9IndlZCI+MjY8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI4PC90ZD48dGQgY2xhc3M9InNhdCI+Mjk8L3RkPjx0ZCBjbGFzcz0ic3VuIj4zMDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkp1bmU8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0idHVlIj4xPC90ZD48dGQgY2xhc3M9IndlZCI+MjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjM8L3RkPjx0ZCBjbGFzcz0iZnJpIj40PC90ZD48dGQgY2xhc3M9InNhdCI+NTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjc8L3RkPjx0ZCBjbGFzcz0idHVlIj44PC90ZD48dGQgY2xhc3M9IndlZCI+OTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEwPC90ZD48dGQgY2xhc3M9ImZyaSI+MTE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEzPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE1PC90ZD48dGQgY2xhc3M9IndlZCI+MTY8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE4PC90ZD48dGQgY2xhc3M9InNhdCI+MTk8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIzPC90ZD48dGQgY2xhc3M9InRodSI+MjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI2PC90ZD48dGQgY2xhc3M9InN1biI+Mjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI4PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjk8L3RkPjx0ZCBjbGFzcz0id2VkIj4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5KdWx5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yPC90ZD48dGQgY2xhc3M9InNhdCI+MzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjU8L3RkPjx0ZCBjbGFzcz0idHVlIj42PC90ZD48dGQgY2xhc3M9IndlZCI+NzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj45PC90ZD48dGQgY2xhc3M9InNhdCI+MTA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTI8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE0PC90ZD48dGQgY2xhc3M9InRodSI+MTU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE3PC90ZD48dGQgY2xhc3M9InN1biI+MTg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE5PC90ZD48dGQgY2xhc3M9InR1ZSI+MjA8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIyPC90ZD48dGQgY2xhc3M9ImZyaSI+MjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI3PC90ZD48dGQgY2xhc3M9IndlZCI+Mjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMwPC90ZD48dGQgY2xhc3M9InNhdCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+QXVndXN0PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI8L3RkPjx0ZCBjbGFzcz0idHVlIj4zPC90ZD48dGQgY2xhc3M9IndlZCI+NDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjU8L3RkPjx0ZCBjbGFzcz0iZnJpIj42PC90ZD48dGQgY2xhc3M9InNhdCI+NzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjExPC90ZD48dGQgY2xhc3M9InRodSI+MTI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE0PC90ZD48dGQgY2xhc3M9InN1biI+MTU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE2PC90ZD48dGQgY2xhc3M9InR1ZSI+MTc8L3RkPjx0ZCBjbGFzcz0id2VkIj4xODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE5PC90ZD48dGQgY2xhc3M9ImZyaSI+MjA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI0PC90ZD48dGQgY2xhc3M9IndlZCI+MjU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI3PC90ZD48dGQgY2xhc3M9InNhdCI+Mjg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yOTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MzA8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPlNlcHRlbWJlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9IndlZCI+MTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zPC90ZD48dGQgY2xhc3M9InNhdCI+NDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjY8L3RkPjx0ZCBjbGFzcz0idHVlIj43PC90ZD48dGQgY2xhc3M9IndlZCI+ODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjExPC90ZD48dGQgY2xhc3M9InN1biI+MTI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEzPC90ZD48dGQgY2xhc3M9InR1ZSI+MTQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE2PC90ZD48dGQgY2xhc3M9ImZyaSI+MTc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE5PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIxPC90ZD48dGQgY2xhc3M9IndlZCI+MjI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI0PC90ZD48dGQgY2xhc3M9InNhdCI+MjU8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjc8L3RkPjx0ZCBjbGFzcz0idHVlIj4yODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI5PC90ZD48dGQgY2xhc3M9InRodSI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk9jdG9iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xPC90ZD48dGQgY2xhc3M9InNhdCI+MjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjQ8L3RkPjx0ZCBjbGFzcz0idHVlIj41PC90ZD48dGQgY2xhc3M9IndlZCI+NjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjc8L3RkPjx0ZCBjbGFzcz0iZnJpIj44PC90ZD48dGQgY2xhc3M9InNhdCI+OTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEyPC90ZD48dGQgY2xhc3M9IndlZCI+MTM8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE1PC90ZD48dGQgY2xhc3M9InNhdCI+MTY8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTg8L3RkPjx0ZCBjbGFzcz0idHVlIj4xOTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIwPC90ZD48dGQgY2xhc3M9InRodSI+MjE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIzPC90ZD48dGQgY2xhc3M9InN1biI+MjQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI1PC90ZD48dGQgY2xhc3M9InR1ZSI+MjY8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI4PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjMxPC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5Ob3ZlbWJlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xPC90ZD48dGQgY2xhc3M9InR1ZSI+MjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij40PC90ZD48dGQgY2xhc3M9ImZyaSI+NTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj43PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj44PC90ZD48dGQgY2xhc3M9InR1ZSI+OTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEwPC90ZD48dGQgY2xhc3M9InRodSI+MTE8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEzPC90ZD48dGQgY2xhc3M9InN1biI+MTQ8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE1PC90ZD48dGQgY2xhc3M9InR1ZSI+MTY8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE4PC90ZD48dGQgY2xhc3M9ImZyaSI+MTk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIxPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIzPC90ZD48dGQgY2xhc3M9IndlZCI+MjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI2PC90ZD48dGQgY2xhc3M9InNhdCI+Mjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkRlY2VtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0id2VkIj4xPC90ZD48dGQgY2xhc3M9InRodSI+MjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij40PC90ZD48dGQgY2xhc3M9InN1biI+NTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjc8L3RkPjx0ZCBjbGFzcz0id2VkIj44PC90ZD48dGQgY2xhc3M9InRodSI+OTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEwPC90ZD48dGQgY2xhc3M9InNhdCI+MTE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTM8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE1PC90ZD48dGQgY2xhc3M9InRodSI+MTY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE4PC90ZD48dGQgY2xhc3M9InN1biI+MTk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIwPC90ZD48dGQgY2xhc3M9InR1ZSI+MjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIzPC90ZD48dGQgY2xhc3M9ImZyaSI+MjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI2PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI4PC90ZD48dGQgY2xhc3M9IndlZCI+Mjk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4zMDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PC90YWJsZT48L2JvZHk+Cis8L2h0bWw+CisiIiIKKworCitjbGFzcyBPdXRwdXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5vcm1hbGl6ZV9jYWxlbmRhcihzZWxmLCBzKToKKyAgICAgICAgIyBGaWx0ZXJzIG91dCBsb2NhbGUgZGVwZW5kYW50IHN0cmluZ3MKKyAgICAgICAgZGVmIG5laXRoZXJzcGFjZW5vcmRpZ2l0KGMpOgorICAgICAgICAgICAgcmV0dXJuIG5vdCBjLmlzc3BhY2UoKSBhbmQgbm90IGMuaXNkaWdpdCgpCisKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzLnNwbGl0bGluZXMoRmFsc2UpOgorICAgICAgICAgICAgIyBEcm9wIHRleHRzLCBhcyB0aGV5IGFyZSBsb2NhbGUgZGVwZW5kZW50CisgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3QgZmlsdGVyKG5laXRoZXJzcGFjZW5vcmRpZ2l0LCBsaW5lKToKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgdGVzdF9vdXRwdXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZV9jYWxlbmRhcihjYWxlbmRhci5jYWxlbmRhcigyMDA0KSksCisgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZV9jYWxlbmRhcihyZXN1bHRfMjAwNF90ZXh0KQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9vdXRwdXRfdGV4dGNhbGVuZGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2FsZW5kYXIuVGV4dENhbGVuZGFyKCkuZm9ybWF0eWVhcigyMDA0KS5zdHJpcCgpLAorICAgICAgICAgICAgcmVzdWx0XzIwMDRfdGV4dC5zdHJpcCgpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X291dHB1dF9odG1sY2FsZW5kYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjYWxlbmRhci5IVE1MQ2FsZW5kYXIoKS5mb3JtYXR5ZWFycGFnZSgyMDA0KS5zdHJpcCgpLAorICAgICAgICAgICAgcmVzdWx0XzIwMDRfaHRtbC5zdHJpcCgpCisgICAgICAgICkKKworCiBjbGFzcyBDYWxlbmRhclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pc2xlYXAoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIHJldHVybiBpcyByaWdodCBmb3IgYSBmZXcgeWVhcnMsIGFuZApAQCAtNzIsNTcgKzI2OCw1NyBAQAogICAgIGZpcnN0d2Vla2RheSA9IGNhbGVuZGFyLk1PTkRBWQogCiAgICAgZGVmIHRlc3RfZmVicnVhcnkoc2VsZik6Ci0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgdHVlc2RheSAoNis3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNSwgMiwgKDYsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2Ygc3VuZGF5ICgxKzcrNys3KzYgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODcsIDIsICgxLCA3LCA3LCA3LCA2KSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIG1vbmRheSAoNys3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg4LCAyLCAoNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiB0dWVzZGF5ICg2KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzIgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTcyLCAyLCAoNiwgNywgNywgNywgMikpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDErNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDEsIDcsIDcsIDcsIDcpKQogCiAgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6Ci0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MzUsIDQsICg3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIHR1ZXNkYXkgKDYrNys3KzcrMyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrMyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NzUsIDQsICg2LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIHN1bmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk0NSwgNCwgKDEsIDcsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgyKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk1LCA0LCAoMiwgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBmcmlkYXkgKDMrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMys3KzcrNys2IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5NCwgNCwgKDMsIDcsIDcsIDcsIDYpKQogCiAgICAgZGVmIHRlc3RfZGVjZW1iZXIoc2VsZik6Ci0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3KzMgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODAsIDEyLCAoNywgNywgNywgNywgMykpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiB0dWVzZGF5ICg2KzcrNys3KzQgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzQgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg3LCAxMiwgKDYsIDcsIDcsIDcsIDQpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2Ygc3VuZGF5ICgxKzcrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3KzIgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTY4LCAxMiwgKDEsIDcsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDQrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICg0KzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg4LCAxMiwgKDQsIDcsIDcsIDcsIDYpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgZnJpZGF5ICgzKzcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBmcmlkYXkgKDMrNys3KzcrNyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMTcsIDEyLCAoMywgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzYXR1cmRheSAoMis3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzYXR1cmRheSAoMis3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDY4LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQogCiAKQEAgLTEzMCw2MiArMzI2LDYzIEBACiAgICAgZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuU1VOREFZCiAKICAgICBkZWYgdGVzdF9mZWJydWFyeShzZWxmKToKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA5LCAyLCAoNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBtb25kYXkgKDYrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDYsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDErNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk3LCAyLCAoMSwgNywgNywgNywgNikpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNysxIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDcsIDcsIDcsIDcsIDEpKQogCi0gICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgbW9uZGF5ICg2KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjAsIDIsICg2LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHNhdHVyZGF5ICgxKzcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2NCwgMiwgKDEsIDcsIDcsIDcsIDcpKQogCiAgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6Ci0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2Ygc3VuZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MjMsIDQsICg3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIG1vbmRheSAoNis3KzcrNyszIGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzMgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTE4LCA0LCAoNiwgNywgNywgNywgMykpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBzYXR1cmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTUwLCA0LCAoMSwgNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBmcmlkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2MCwgNCwgKDIsIDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDMrNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICgzKzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTA5LCA0LCAoMywgNywgNywgNywgNikpCiAKICAgICBkZWYgdGVzdF9kZWNlbWJlcihzZWxmKToKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcrMyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNyszIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjA4MCwgMTIsICg3LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIG1vbmRheSAoNis3KzcrNys0IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzQgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQxLCAxMiwgKDYsIDcsIDcsIDcsIDQpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDErNys3KzcrNysyIGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDErNys3KzcrNysyIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkyMywgMTIsICgxLCA3LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIHdlZG5lc2RheSAoNCs3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gd2VkbmVzZGF5ICg0KzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQ4LCAxMiwgKDQsIDcsIDcsIDcsIDYpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgdGh1cnNkYXkgKDMrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICgzKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTI3LCAxMiwgKDMsIDcsIDcsIDcsIDcpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgZnJpZGF5ICgyKzcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk1LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBPdXRwdXRUZXN0Q2FzZSwKICAgICAgICAgQ2FsZW5kYXJUZXN0Q2FzZSwKICAgICAgICAgTW9uZGF5VGVzdENhc2UsCiAgICAgICAgIFN1bmRheVRlc3RDYXNlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKaW5kZXggMWRkMjQ2MS4uY2RkODRiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQpAQCAtNSw0NCArNSw1MSBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBfdGVzdGNhcGkKIAotZm9yIG5hbWUgaW4gZGlyKF90ZXN0Y2FwaSk6Ci0gICAgaWYgbmFtZS5zdGFydHN3aXRoKCd0ZXN0XycpOgotICAgICAgICB0ZXN0ID0gZ2V0YXR0cihfdGVzdGNhcGksIG5hbWUpCitkZWYgdGVzdF9tYWluKCk6CisKKyAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd0ZXN0XycpOgorICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgImludGVybmFsIiwgbmFtZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3QoKQorICAgICAgICAgICAgZXhjZXB0IF90ZXN0Y2FwaS5lcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgc3lzLmV4Y19pbmZvKClbMV0KKworICAgICMgc29tZSBleHRyYSB0aHJlYWQtc3RhdGUgdGVzdHMgZHJpdmVuIHZpYSBfdGVzdGNhcGkKKyAgICBkZWYgVGVzdFRocmVhZFN0YXRlKCk6CisgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICAgICAgaW1wb3J0IHRpbWUKKwogICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICJpbnRlcm5hbCIsIG5hbWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdCgpCi0gICAgICAgIGV4Y2VwdCBfdGVzdGNhcGkuZXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIHByaW50ICJhdXRvLXRocmVhZC1zdGF0ZSIKIAotIyBzb21lIGV4dHJhIHRocmVhZC1zdGF0ZSB0ZXN0cyBkcml2ZW4gdmlhIF90ZXN0Y2FwaQotZGVmIFRlc3RUaHJlYWRTdGF0ZSgpOgotICAgIGltcG9ydCB0aHJlYWQKLSAgICBpbXBvcnQgdGltZQorICAgICAgICBpZGVudHMgPSBbXQogCi0gICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJhdXRvLXRocmVhZC1zdGF0ZSIKKyAgICAgICAgZGVmIGNhbGxiYWNrKCk6CisgICAgICAgICAgICBpZGVudHMuYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKIAotICAgIGlkZW50cyA9IFtdCisgICAgICAgIF90ZXN0Y2FwaS5fdGVzdF90aHJlYWRfc3RhdGUoY2FsbGJhY2spCisgICAgICAgIGEgPSBiID0gY2FsbGJhY2sKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAjIENoZWNrIG91ciBtYWluIHRocmVhZCBpcyBpbiB0aGUgbGlzdCBleGFjdGx5IDMgdGltZXMuCisgICAgICAgIGlmIGlkZW50cy5jb3VudCh0aHJlYWQuZ2V0X2lkZW50KCkpICE9IDM6CisgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgXAorICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbWFpbiB0aHJlYWQgY29ycmVjdGx5IGluIHRoZSBsaXN0IgogCi0gICAgZGVmIGNhbGxiYWNrKCk6Ci0gICAgICAgIGlkZW50cy5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQorICAgIHRyeToKKyAgICAgICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZQorICAgICAgICBoYXZlX3RocmVhZF9zdGF0ZSA9IFRydWUKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gRmFsc2UKIAotICAgIF90ZXN0Y2FwaS5fdGVzdF90aHJlYWRfc3RhdGUoY2FsbGJhY2spCi0gICAgdGltZS5zbGVlcCgxKQotICAgICMgQ2hlY2sgb3VyIG1haW4gdGhyZWFkIGlzIGluIHRoZSBsaXN0IGV4YWN0bHkgMyB0aW1lcy4KLSAgICBpZiBpZGVudHMuY291bnQodGhyZWFkLmdldF9pZGVudCgpKSAhPSAzOgotICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgXAotICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBtYWluIHRocmVhZCBjb3JyZWN0bHkgaW4gdGhlIGxpc3QiCisgICAgaWYgaGF2ZV90aHJlYWRfc3RhdGU6CisgICAgICAgIFRlc3RUaHJlYWRTdGF0ZSgpCisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgdD10aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UZXN0VGhyZWFkU3RhdGUpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQogCi10cnk6Ci0gICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZQotICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gVHJ1ZQotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gRmFsc2UKLQotaWYgaGF2ZV90aHJlYWRfc3RhdGU6Ci0gICAgVGVzdFRocmVhZFN0YXRlKCkKLSAgICBpbXBvcnQgdGhyZWFkaW5nCi0gICAgdD10aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1UZXN0VGhyZWFkU3RhdGUpCi0gICAgdC5zdGFydCgpCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCBhNGE2NTZkLi4wMThiZWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTEwLDYgKzEwLDkgQEAKICAgICAgICAgaW5mcC5jbG9zZSgpCiAgICAgICAgIGRhdGEgPSBvdXRmcC5yZWFkKCkKICAgICAgICAgb3V0ZnAuY2xvc2UoKQorICAgICAgICAjIHRyeSB0byBjbGVhbnVwIHRoZSBjaGlsZCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8gbGVhayB3aGVuIHJ1bm5pbmcKKyAgICAgICAgIyB3aXRoIHJlZ3J0ZXN0IC1SLiAgVGhpcyBzaG91bGQgYmUgYSBuby1vcCBvbiBXaW5kb3dzLgorICAgICAgICBwb3BlbjIuX2NsZWFudXAoKQogICAgICAgICByZXR1cm4gZGF0YQogCiAgICAgZGVmIGV4aXRfY29kZShzZWxmLCBjbWRfbGluZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDkxM2FhOTEuLjZlYTQ5Y2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0xLDcgKzEsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGNvZGVjcwotaW1wb3J0IHN5cywgU3RyaW5nSU8KK2ltcG9ydCBzeXMsIFN0cmluZ0lPLCBfdGVzdGNhcGkKIAogY2xhc3MgUXVldWUob2JqZWN0KToKICAgICAiIiIKQEAgLTc4MSw5ICs3ODEsMTggQEAKICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKIAotY2xhc3MgQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgdGVzdF9idWlsdGluKHNlbGYpOgorY2xhc3MgSUROQUNvZGVjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVpbHRpbl9kZWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInB5dGhvbi5vcmciLCAiaWRuYSIpLCB1InB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmljb2RlKCJweXRob24ub3JnLiIsICJpZG5hIiksIHUicHl0aG9uLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmljb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZyIsICJpZG5hIiksIHUicHl0aFx4ZjZuLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInhuLS1weXRobi1tdWEub3JnLiIsICJpZG5hIiksIHUicHl0aFx4ZjZuLm9yZy4iKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHUicHl0aG9uLm9yZyIuZW5jb2RlKCJpZG5hIiksICJweXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoInB5dGhvbi5vcmcuIi5lbmNvZGUoImlkbmEiKSwgInB5dGhvbi5vcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModSJweXRoXHhmNm4ub3JnIi5lbmNvZGUoImlkbmEiKSwgInhuLS1weXRobi1tdWEub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModSJweXRoXHhmNm4ub3JnLiIuZW5jb2RlKCJpZG5hIiksICJ4bi0tcHl0aG4tbXVhLm9yZy4iKQogCiAgICAgZGVmIHRlc3Rfc3RyZWFtKHNlbGYpOgogICAgICAgICBpbXBvcnQgU3RyaW5nSU8KQEAgLTc5MSw2ICs4MDAsNjQgQEAKICAgICAgICAgci5yZWFkKDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCB1IiIpCiAKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRob24ub3JnIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgicHl0aG9uLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aG9uLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKworICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcigiaWRuYSIpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInhuLS14YW0iLCApLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUodSJyZyIpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKHUiIiwgVHJ1ZSksIHUib3JnIikKKworICAgICAgICBkZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInhuLS14YW0iLCApLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInJnLiIpLCB1Im9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSksIHUiIikKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsX2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgInB5dGhvbi5vcmciCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aG9uLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgICJweXRob24ub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCJpZG5hIikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbmNvZGVyLmVuY29kZSh1Ilx4ZTR4IiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbmNvZGVyLmVuY29kZSh1ImFtcGxlLm9yZyIpLCAieG4tLXhhbXBsZS05dGEuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKSwgIm9yZyIpCisKKyAgICAgICAgZW5jb2Rlci5yZXNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiXHhlNHgiKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiYW1wbGUub3JnLiIpLCAieG4tLXhhbXBsZS05dGEub3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiIiwgVHJ1ZSksICIiKQorCiBjbGFzcyBDb2RlY3NNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKQEAgLTEwMzIsOSArMTA5OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IHJlYWRlci5yZWFkKCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCiAKLSAgICAgICAgICAgICAgICAjIGNoZWNrIGluY3JlbWVudGFsIGRlY29kZXIvZW5jb2RlciBhbmQgaXRlcmVuY29kZSgpL2l0ZXJkZWNvZGUoKQorICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIChmZXRjaGVkIHZpYSB0aGUgUHl0aG9uCisgICAgICAgICAgICAgICAgIyBhbmQgQyBBUEkpIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoKQorICAgICAgICAgICAgICAgICAgICBjZW5jb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTEwNDIsMTAgKzExMTEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiCiAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGVuY29kZXIuZW5jb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgKz0gZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykoKQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiCiAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGVuY29kZWRyZXN1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IGRlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIEMgQVBJCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKCIiLCBUcnVlKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCiAKICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCkBAIC0xMTQyLDcgKzEyMjUsNyBAQAogICAgICAgICBQdW55Y29kZVRlc3QsCiAgICAgICAgIFVuaWNvZGVJbnRlcm5hbFRlc3QsCiAgICAgICAgIE5hbWVwcmVwVGVzdCwKLSAgICAgICAgQ29kZWNUZXN0LAorICAgICAgICBJRE5BQ29kZWNUZXN0LAogICAgICAgICBDb2RlY3NNb2R1bGVUZXN0LAogICAgICAgICBTdHJlYW1SZWFkZXJUZXN0LAogICAgICAgICBTdHIyU3RyVGVzdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CmluZGV4IGUxMmVmMGQuLjk2NGYxNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQpAQCAtMSw2ICsxLDggQEAKIGltcG9ydCBjb3B5CiBpbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKICMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBtZXRob2RzIHRocm91Z2ggX19jb2VyY2VfXwogY2xhc3MgQ29lcmNlTnVtYmVyOgpAQCAtMTYsMTAgKzE4LDE5IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gKHNlbGYuYXJnLCBvdGhlcikKIAorIyBOZXctc3R5bGUgY2xhc3MgdmVyc2lvbiBvZiBDb2VyY2VOdW1iZXIKK2NsYXNzIENvZXJjZVRvKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDb2VyY2VUbyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlcgorCiAKICMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBvcHMgdGhyb3VnaCBtZXRob2RzLgogY2xhc3MgTWV0aG9kTnVtYmVyOgotCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsYXJnKToKICAgICAgICAgc2VsZi5hcmcgPSBhcmcKIApAQCAtNTAsNiArNjEsMTggQEAKICAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgogICAgICAgICByZXR1cm4gb3RoZXIgLyBzZWxmLmFyZwogCisgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLyBvdGhlcgorCisgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyIC8gc2VsZi5hcmcKKworICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAvLyBvdGhlcgorCisgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAvLyBzZWxmLmFyZworCiAgICAgZGVmIF9fcG93X18oc2VsZixvdGhlcik6CiAgICAgICAgIHJldHVybiBzZWxmLmFyZyAqKiBvdGhlcgogCkBAIC02NiwxMSArODksMTU3IEBACiAgICAgICAgIHJldHVybiBjbXAoc2VsZi5hcmcsIG90aGVyKQogCiAKLWNhbmRpZGF0ZXMgPSBbIDIsIDQuMCwgMkwsIDIrMGosIFsxXSwgKDIsKSwgTm9uZSwKLSAgICAgICAgICAgICAgIE1ldGhvZE51bWJlcigyKSwgQ29lcmNlTnVtYmVyKDIpXQorY2FuZGlkYXRlcyA9IFsyLCAyTCwgNC4wLCAyKzBqLCBbMV0sICgyLCksIE5vbmUsCisgICAgICAgICAgICAgIE1ldGhvZE51bWJlcigyKSwgQ29lcmNlTnVtYmVyKDIpXQogCi1pbmZpeF9iaW5vcHMgPSBbICcrJywgJy0nLCAnKicsICcvJywgJyoqJywgJyUnIF0KK2luZml4X2Jpbm9wcyA9IFsgJysnLCAnLScsICcqJywgJyoqJywgJyUnLCAnLy8nLCAnLycgXQorCitURSA9IFR5cGVFcnJvcgorIyBiID0gYm90aCBub3JtYWwgYW5kIGF1Z21lbnRlZCBnaXZlIHNhbWUgcmVzdWx0IGxpc3QKKyMgcyA9IHNpbmdsZSByZXN1bHQgbGlzdHMgZm9yIG5vcm1hbCBhbmQgYXVnbWVudGVkCisjIGUgPSBlcXVhbHMgb3RoZXIgcmVzdWx0cworIyByZXN1bHQgbGlzdHM6IFsnKycsICctJywgJyonLCAnKionLCAnJScsICcvLycsICgnY2xhc3NpYyAvJywgJ25ldyAvJyldCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi10dXBsZSBpZiByZXN1bHRzIGRpZmZlcgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG9ubHkgb25lIHZhbHVlCitpbmZpeF9yZXN1bHRzID0geworICAgICMgMgorICAgICgwLDApOiAoJ2InLCBbNCwgMCwgNCwgNCwgMCwgMSwgKDEsIDEuMCldKSwKKyAgICAoMCwxKTogKCdlJywgKDAsMCkpLAorICAgICgwLDIpOiAoJ2InLCBbNi4wLCAtMi4wLCA4LjAsIDE2LjAsIDIuMCwgMC4wLCAwLjVdKSwKKyAgICAoMCwzKTogKCdiJywgWzQrMGosIDArMGosIDQrMGosIDQrMGosIDArMGosIDErMGosIDErMGpdKSwKKyAgICAoMCw0KTogKCdiJywgW1RFLCBURSwgWzEsIDFdLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDUpOiAoJ2InLCBbVEUsIFRFLCAoMiwgMiksIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDAsNik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDcpOiAoJ2UnLCAoMCwwKSksCisgICAgKDAsOCk6ICgnZScsICgwLDApKSwKKworICAgICMgMkwKKyAgICAoMSwwKTogKCdlJywgKDAsMCkpLAorICAgICgxLDEpOiAoJ2UnLCAoMCwxKSksCisgICAgKDEsMik6ICgnZScsICgwLDIpKSwKKyAgICAoMSwzKTogKCdlJywgKDAsMykpLAorICAgICgxLDQpOiAoJ2UnLCAoMCw0KSksCisgICAgKDEsNSk6ICgnZScsICgwLDUpKSwKKyAgICAoMSw2KTogKCdlJywgKDAsNikpLAorICAgICgxLDcpOiAoJ2UnLCAoMCw3KSksCisgICAgKDEsOCk6ICgnZScsICgwLDgpKSwKKworICAgICMgNC4wCisgICAgKDIsMCk6ICgnYicsIFs2LjAsIDIuMCwgOC4wLCAxNi4wLCAwLjAsIDIuMCwgMi4wXSksCisgICAgKDIsMSk6ICgnZScsICgyLDApKSwKKyAgICAoMiwyKTogKCdiJywgWzguMCwgMC4wLCAxNi4wLCAyNTYuMCwgMC4wLCAxLjAsIDEuMF0pLAorICAgICgyLDMpOiAoJ2InLCBbNiswaiwgMiswaiwgOCswaiwgMTYrMGosIDArMGosIDIrMGosIDIrMGpdKSwKKyAgICAoMiw0KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDIsNSk6ICgnZScsICgyLDQpKSwKKyAgICAoMiw2KTogKCdlJywgKDIsNCkpLAorICAgICgyLDcpOiAoJ2UnLCAoMiwwKSksCisgICAgKDIsOCk6ICgnZScsICgyLDApKSwKKworICAgICMgKDIrMGopCisgICAgKDMsMCk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsMSk6ICgnZScsICgzLDApKSwKKyAgICAoMywyKTogKCdiJywgWzYrMGosIC0yKzBqLCA4KzBqLCAxNiswaiwgMiswaiwgMCswaiwgMC41KzBqXSksCisgICAgKDMsMyk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsNCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgzLDUpOiAoJ2UnLCAoMyw0KSksCisgICAgKDMsNik6ICgnZScsICgzLDQpKSwKKyAgICAoMyw3KTogKCdlJywgKDMsMCkpLAorICAgICgzLDgpOiAoJ2UnLCAoMywwKSksCisKKyAgICAjIFsxXQorICAgICg0LDApOiAoJ2InLCBbVEUsIFRFLCBbMSwgMV0sIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMSk6ICgnZScsICg0LDApKSwKKyAgICAoNCwyKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMyk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDQpOiAoJ2InLCBbWzEsIDFdLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNSk6ICgncycsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sIFtbMSwgMl0sIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNyk6ICgnZScsICg0LDApKSwKKyAgICAoNCw4KTogKCdlJywgKDQsMCkpLAorCisgICAgIyAoMiwpCisgICAgKDUsMCk6ICgnYicsIFtURSwgVEUsICgyLCAyKSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwxKTogKCdlJywgKDUsMCkpLAorICAgICg1LDIpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwzKTogKCdlJywgKDUsMikpLAorICAgICg1LDQpOiAoJ2UnLCAoNSwyKSksCisgICAgKDUsNSk6ICgnYicsIFsoMiwgMiksIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsNyk6ICgnZScsICg1LDApKSwKKyAgICAoNSw4KTogKCdlJywgKDUsMCkpLAorCisgICAgIyBOb25lCisgICAgKDYsMCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg2LDEpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsMik6ICgnZScsICg2LDApKSwKKyAgICAoNiwzKTogKCdlJywgKDYsMCkpLAorICAgICg2LDQpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNSk6ICgnZScsICg2LDApKSwKKyAgICAoNiw2KTogKCdlJywgKDYsMCkpLAorICAgICg2LDcpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsOCk6ICgnZScsICg2LDApKSwKKworICAgICMgTWV0aG9kTnVtYmVyKDIpCisgICAgKDcsMCk6ICgnZScsICgwLDApKSwKKyAgICAoNywxKTogKCdlJywgKDAsMSkpLAorICAgICg3LDIpOiAoJ2UnLCAoMCwyKSksCisgICAgKDcsMyk6ICgnZScsICgwLDMpKSwKKyAgICAoNyw0KTogKCdlJywgKDAsNCkpLAorICAgICg3LDUpOiAoJ2UnLCAoMCw1KSksCisgICAgKDcsNik6ICgnZScsICgwLDYpKSwKKyAgICAoNyw3KTogKCdlJywgKDAsNykpLAorICAgICg3LDgpOiAoJ2UnLCAoMCw4KSksCisKKyAgICAjIENvZXJjZU51bWJlcigyKQorICAgICg4LDApOiAoJ2UnLCAoMCwwKSksCisgICAgKDgsMSk6ICgnZScsICgwLDEpKSwKKyAgICAoOCwyKTogKCdlJywgKDAsMikpLAorICAgICg4LDMpOiAoJ2UnLCAoMCwzKSksCisgICAgKDgsNCk6ICgnZScsICgwLDQpKSwKKyAgICAoOCw1KTogKCdlJywgKDAsNSkpLAorICAgICg4LDYpOiAoJ2UnLCAoMCw2KSksCisgICAgKDgsNyk6ICgnZScsICgwLDcpKSwKKyAgICAoOCw4KTogKCdlJywgKDAsOCkpLAorfQorCitkZWYgcHJvY2Vzc19pbmZpeF9yZXN1bHRzKCk6CisgICAgZm9yIGtleSBpbiBzb3J0ZWQoaW5maXhfcmVzdWx0cyk6CisgICAgICAgIHZhbCA9IGluZml4X3Jlc3VsdHNba2V5XQorICAgICAgICBpZiB2YWxbMF0gPT0gJ2UnOgorICAgICAgICAgICAgaW5maXhfcmVzdWx0c1trZXldID0gaW5maXhfcmVzdWx0c1t2YWxbMV1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2YWxbMF0gPT0gJ3MnOgorICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxbMV0sIHZhbFsyXSkKKyAgICAgICAgICAgIGVsaWYgdmFsWzBdID09ICdiJzoKKyAgICAgICAgICAgICAgICByZXMgPSAodmFsWzFdLCB2YWxbMV0pCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc1tpXVs2XSwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIGNsYXNzaWMgKGZsb29yKSBkaXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzBdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCAtUW5ldworICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzFdCisgICAgICAgICAgICBpbmZpeF9yZXN1bHRzW2tleV0gPSByZXMKKworCisKK3Byb2Nlc3NfaW5maXhfcmVzdWx0cygpCisjIG5vdyBpbmZpeF9yZXN1bHRzIGhhcyB0d28gbGlzdHMgb2YgcmVzdWx0cyBmb3IgZXZlcnkgcGFpcmluZy4KKwogcHJlZml4X2Jpbm9wcyA9IFsgJ2Rpdm1vZCcgXQorcHJlZml4X3Jlc3VsdHMgPSBbCisgICAgWygxLDApLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDEsMCldLAorICAgIFsoMUwsMEwpLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDFMLDBMKV0sCisgICAgWygyLjAsMC4wKSwgKDIuMCwwLjApLCAoMS4wLDAuMCksICgoMiswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDIuMCwwLjApXSwKKyAgICBbKCgxKzBqKSwwaiksICgoMSswaiksMGopLCAoMGosKDIrMGopKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoKDErMGopLDBqKV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFsoMSwwKSwgKDFMLDBMKSwgKDAuMCwyLjApLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgxLDApXQorXQogCiBkZWYgZm9ybWF0X2Zsb2F0KHZhbHVlKToKICAgICBpZiBhYnModmFsdWUpIDwgMC4wMToKQEAgLTg3LDgzICsyNTYsNzQgQEAKICAgICAgICAgcmV0dXJuIGZvcm1hdF9mbG9hdCh2YWx1ZSkKICAgICByZXR1cm4gc3RyKHZhbHVlKQogCi1kZWYgZG9faW5maXhfYmlub3BzKCk6Ci0gICAgZm9yIGEgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgZm9yIGIgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgICAgIGZvciBvcCBpbiBpbmZpeF9iaW5vcHM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyVzICVzICVzJyAlIChhLCBvcCwgYiksCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbCgnYSAlcyBiJyAlIG9wKQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJy4uLiAlcy4lcycgJSAoZXJyb3JbMF0uX19tb2R1bGVfXywgZXJyb3JbMF0uX19uYW1lX18pCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz0nLCBmb3JtYXRfcmVzdWx0KHgpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB6ID0gY29weS5jb3B5KGEpCi0gICAgICAgICAgICAgICAgZXhjZXB0IGNvcHkuRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHogPSBhICMgYXNzdW1lIGl0IGhhcyBubyBpbnBsYWNlIG9wcwotICAgICAgICAgICAgICAgIHByaW50ICclcyAlcz0gJXMnICUgKGEsIG9wLCBiKSwKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWMoJ3ogJXM9IGInICUgb3ApCi0gICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHN5cy5leGNfaW5mbygpWzoyXQotICAgICAgICAgICAgICAgICAgICBwcmludCAnLi4uICVzLiVzJyAlIChlcnJvclswXS5fX21vZHVsZV9fLCBlcnJvclswXS5fX25hbWVfXykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnPT4nLCBmb3JtYXRfcmVzdWx0KHopCitjbGFzcyBDb2VyY2lvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2luZml4X2Jpbm9wcyhzZWxmKToKKyAgICAgICAgZm9yIGlhLCBhIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgIGZvciBpYiwgYiBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGluZml4X3Jlc3VsdHNbKGlhLCBpYildCisgICAgICAgICAgICAgICAgZm9yIG9wLCByZXMsIGlyZXMgaW4gemlwKGluZml4X2Jpbm9wcywgcmVzdWx0c1swXSwgcmVzdWx0c1sxXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhICVzIGInICUgb3AsIHsnYSc6IGEsICdiJzogYn0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmb3JtYXRfcmVzdWx0KHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfcmVzdWx0KGV2YWwoJ2EgJXMgYicgJSBvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzICVzICVzID09ICVzIGZhaWxlZCcgJSAoYSwgb3AsIGIsIHJlcykpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBjb3B5LmNvcHkoYSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGNvcHkuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYSAjIGFzc3VtZSBpdCBoYXMgbm8gaW5wbGFjZSBvcHMKKyAgICAgICAgICAgICAgICAgICAgaWYgaXJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjICd6ICVzPSBiJyAlIG9wCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3Igbm90IHJhaXNlZCIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCd6ICVzPSBiJyAlIG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaXJlcywgeikKIAotZGVmIGRvX3ByZWZpeF9iaW5vcHMoKToKLSAgICBmb3IgYSBpbiBjYW5kaWRhdGVzOgotICAgICAgICBmb3IgYiBpbiBjYW5kaWRhdGVzOgotICAgICAgICAgICAgZm9yIG9wIGluIHByZWZpeF9iaW5vcHM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyVzKCVzLCAlcyknICUgKG9wLCBhLCBiKSwKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHggPSBldmFsKCclcyhhLCBiKScgJSBvcCkKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gc3lzLmV4Y19pbmZvKClbOjJdCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICcuLi4gJXMuJXMnICUgKGVycm9yWzBdLl9fbW9kdWxlX18sIGVycm9yWzBdLl9fbmFtZV9fKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICc9JywgZm9ybWF0X3Jlc3VsdCh4KQorICAgIGRlZiB0ZXN0X3ByZWZpeF9iaW5vcHMoc2VsZik6CisgICAgICAgIGZvciBpYSwgYSBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICBmb3IgaWIsIGIgaW4gZW51bWVyYXRlKGNhbmRpZGF0ZXMpOgorICAgICAgICAgICAgICAgIGZvciBvcCBpbiBwcmVmaXhfYmlub3BzOgorICAgICAgICAgICAgICAgICAgICByZXMgPSBwcmVmaXhfcmVzdWx0c1tpYV1baWJdCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyhhLCBiKScgJSBvcCwgeydhJzogYSwgJ2InOiBifSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZvcm1hdF9yZXN1bHQocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9yZXN1bHQoZXZhbCgnJXMoYSwgYiknICUgb3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyglcywgJXMpID09ICVzIGZhaWxlZCcgJSAob3AsIGEsIGIsIHJlcykpCiAKLSMgTmV3LXN0eWxlIGNsYXNzIHZlcnNpb24gb2YgQ29lcmNlTnVtYmVyCi1jbGFzcyBDb2VyY2VUbyhvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgotICAgICAgICBzZWxmLmFyZyA9IGFyZwotICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQ29lcmNlVG8pOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlci5hcmcKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIKKyAgICBkZWYgdGVzdF9jbXB0eXBlcyhzZWxmKToKKyAgICAgICAgIyBCdWlsdC1pbiB0cF9jb21wYXJlIHNsb3RzIGV4cGVjdCB0aGVpciBhcmd1bWVudHMgdG8gaGF2ZSB0aGUKKyAgICAgICAgIyBzYW1lIHR5cGUsIGJ1dCBhIHVzZXItZGVmaW5lZCBfX2NvZXJjZV9fIGRvZXNuJ3QgaGF2ZSB0byBvYmV5LgorICAgICAgICAjIFNGICM5ODAzNTIKKyAgICAgICAgZXZpbF9jb2VyY2VyID0gQ29lcmNlVG8oNDIpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZXNlIGRvbid0IGNyYXNoIGFueSBtb3JlCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGNtcCh1J2Zpc2gnLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhjbXAoc2xpY2UoMSksIGV2aWxfY29lcmNlciksIDApCisgICAgICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcworICAgICAgICBjbGFzcyBXYWNreUNvbXBhcmVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbXAoV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICAjIC4uLmFuZCBjbGFzc2ljIGNsYXNzZXMgdG9vLCBzaW5jZSB0aGF0IGNvZGUgcGF0aCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKKyAgICAgICAgY2xhc3MgQ2xhc3NpY1dhY2t5Q29tcGFyZXI6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbXAoQ2xhc3NpY1dhY2t5Q29tcGFyZXIoKSwgZXZpbF9jb2VyY2VyKSwgMCkKIAotZGVmIGFzc2VydF8oZXhwciwgbXNnPU5vbmUpOgotICAgIGlmIG5vdCBleHByOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgbXNnCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidjb21wbGV4IGRpdm1vZFwoXCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcid0ZXN0LnRlc3RfY29lcmNpb24kJykKKyAgICBydW5fdW5pdHRlc3QoQ29lcmNpb25UZXN0KQogCi1kZWYgZG9fY21wdHlwZXMoKToKLSAgICAjIEJ1aWx0LWluIHRwX2NvbXBhcmUgc2xvdHMgZXhwZWN0IHRoZWlyIGFyZ3VtZW50cyB0byBoYXZlIHRoZQotICAgICMgc2FtZSB0eXBlLCBidXQgYSB1c2VyLWRlZmluZWQgX19jb2VyY2VfXyBkb2Vzbid0IGhhdmUgdG8gb2JleS4KLSAgICAjIFNGICM5ODAzNTIKLSAgICBldmlsX2NvZXJjZXIgPSBDb2VyY2VUbyg0MikKLSAgICAjIE1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjcmFzaCBhbnkgbW9yZQotICAgIGFzc2VydF8oY21wKHUnZmlzaCcsIGV2aWxfY29lcmNlcikgIT0gMCkKLSAgICBhc3NlcnRfKGNtcChzbGljZSgxKSwgZXZpbF9jb2VyY2VyKSAhPSAwKQotICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcwotICAgIGNsYXNzIFdhY2t5Q29tcGFyZXIob2JqZWN0KToKLSAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICBhc3NlcnRfKGNtcChXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlcikgPT0gMCkKLSAgICAjIC4uLmFuZCBjbGFzc2ljIGNsYXNzZXMgdG9vLCBzaW5jZSB0aGF0IGNvZGUgcGF0aCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKLSAgICBjbGFzcyBDbGFzc2ljV2Fja3lDb21wYXJlcjoKLSAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICBhc3NlcnRfKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpID09IDApCi0KLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcidjb21wbGV4IGRpdm1vZFwoXCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkJywKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHIndGVzdC50ZXN0X2NvZXJjaW9uJCcpCi1kb19pbmZpeF9iaW5vcHMoKQotZG9fcHJlZml4X2Jpbm9wcygpCi1kb19jbXB0eXBlcygpCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBhcmUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBhcmUucHkKaW5kZXggNjg5OTkyNi4uMmZkZTYxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21wYXJlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGFyZS5weQpAQCAtMSw0ICsxLDYgQEAKIGltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogY2xhc3MgRW1wdHk6CiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtMjcsMjggKzI5LDMxIEBACiAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgogICAgICAgICByZXR1cm4gY21wKHNlbGYuYXJnLCBvdGhlcikKIAorY2xhc3MgQ29tcGFyaXNvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNldDEgPSBbMiwgMi4wLCAyTCwgMiswaiwgQ29lcmNlKDIpLCBDbXAoMi4wKV0KKyAgICBzZXQyID0gW1sxXSwgKDMsKSwgTm9uZSwgRW1wdHkoKV0KKyAgICBjYW5kaWRhdGVzID0gc2V0MSArIHNldDIKIAotY2FuZGlkYXRlcyA9IFsyLCAyLjAsIDJMLCAyKzBqLCBbMV0sICgzLCksIE5vbmUsIEVtcHR5KCksIENvZXJjZSgyKSwgQ21wKDIuMCldCi0KLWRlZiB0ZXN0KCk6Ci0gICAgZm9yIGEgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgZm9yIGIgaW4gY2FuZGlkYXRlczoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB4ID0gYSA9PSBiCi0gICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ2NtcCglcywgJXMpID0+ICVzJyAlIChhLCBiLCBzeXMuZXhjX2luZm8oKVswXSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgeDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzID09ICVzIiAlIChhLCBiKQorICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBmb3IgYSBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICAgICAgaWYgKChhIGluIHNlbGYuc2V0MSkgYW5kIChiIGluIHNlbGYuc2V0MSkpIG9yIGEgaXMgYjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICIlcyAhPSAlcyIgJSAoYSwgYikKLSAgICAjIEVuc3VyZSBkZWZhdWx0IGNvbXBhcmlzb24gY29tcGFyZXMgaWQoKSBvZiBhcmdzCi0gICAgTCA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICBMLmluc2VydChsZW4oTCkvLzIsIEVtcHR5KCkpCi0gICAgZm9yIGEgaW4gTDoKLSAgICAgICAgZm9yIGIgaW4gTDoKLSAgICAgICAgICAgIGlmIGNtcChhLCBiKSAhPSBjbXAoaWQoYSksIGlkKGIpKToKLSAgICAgICAgICAgICAgICBwcmludCAiRVJST1I6IiwgY21wKGEsIGIpLCBjbXAoaWQoYSksIGlkKGIpKSwgaWQoYSksIGlkKGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKIAotdGVzdCgpCisgICAgZGVmIHRlc3RfaWRfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIGRlZmF1bHQgY29tcGFyaXNvbiBjb21wYXJlcyBpZCgpIG9mIGFyZ3MKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIEwuaW5zZXJ0KGxlbihMKS8vMiwgRW1wdHkoKSkKKyAgICAgICAgZm9yIGEgaW4gTDoKKyAgICAgICAgICAgIGZvciBiIGluIEw6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoYSwgYiksIGNtcChpZChhKSwgaWQoYikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E9JXIsIGI9JXInICUgKGEsIGIpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21wYXJpc29uVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDFkNDdmOTEuLjcyYzRmN2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTI4NCw2ICsyODQsMTAgQEAKICAgICAgICAgZjEsIGYyID0gZigpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZjEuZnVuY19jb2RlKSwgaWQoZjIuZnVuY19jb2RlKSkKIAorICAgIGRlZiB0ZXN0X3VuaWNvZGVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGNvZGUgPSB1IiMgLSotIGNvZGluZzogdXRmLTggLSotXG5wYXNzXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBjb2RlLCAidG1wIiwgImV4ZWMiKQorCiAgICAgZGVmIHRlc3Rfc3Vic2NyaXB0cyhzZWxmKToKICAgICAgICAgIyBTRiBidWcgMTQ0ODgwNAogICAgICAgICAjIENsYXNzIHRvIG1ha2UgdGVzdGluZyBzdWJzY3JpcHQgcmVzdWx0cyBlYXN5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCA1ZTdiMTVjLi5hNTlkNmFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTEsMTAgKzEsMTIgQEAKIGltcG9ydCBjb21waWxlcgogZnJvbSBjb21waWxlci5hc3QgaW1wb3J0IGZsYXR0ZW4KLWltcG9ydCBvcworaW1wb3J0IG9zLCBzeXMsIHRpbWUsIHVuaXR0ZXN0CiBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdAogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQogCisjIEhvdyBtdWNoIHRpbWUgaW4gc2Vjb25kcyBjYW4gcGFzcyBiZWZvcmUgd2UgcHJpbnQgYSAnU3RpbGwgd29ya2luZycgbWVzc2FnZS4KK19QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDUgKiA2MAorCiBjbGFzcyBDb21waWxlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RDb21waWxlTGlicmFyeShzZWxmKToKQEAgLTEzLDExICsxNSwxOCBAQAogICAgICAgICAjIHRoYXQgYW55IG9mIHRoZSBjb2RlIGlzIGNvcnJlY3QsIG1lcmVseSB0aGUgY29tcGlsZXIgaXMgYWJsZQogICAgICAgICAjIHRvIGdlbmVyYXRlIHNvbWUga2luZCBvZiBjb2RlIGZvciBpdC4KIAorICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAogICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUodW5pdHRlc3QuX19maWxlX18pCiAgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGVzdC50ZXN0X3N1cHBvcnQuX19maWxlX18pCiAKICAgICAgICAgZm9yIGRpciBpbiBbbGliZGlyLCB0ZXN0ZGlyXToKICAgICAgICAgICAgIGZvciBiYXNlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcik6CisgICAgICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAnICB0ZXN0Q29tcGlsZUxpYnJhcnkgc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLicKKwogICAgICAgICAgICAgICAgIGlmIG5vdCBiYXNlbmFtZS5lbmRzd2l0aCgiLnB5Iik6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgaWYgbm90IFRFU1RfQUxMIGFuZCByYW5kb20oKSA8IDAuOTg6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggZjhkYjg4Yy4uOTc0NzBjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMiwxMiArMiwxNCBAQAogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CiAKK2ltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IGRlY2ltYWwKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGhyZWFkaW5nCiBmcm9tIGNvbnRleHRsaWIgaW1wb3J0ICogICMgVGVzdHMgX19hbGxfXworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3N1aXRlCiAKIGNsYXNzIENvbnRleHRNYW5hZ2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC00NSw2ICs0NywyOCBAQAogICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBaZXJvRGl2aXNpb25FcnJvciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxLCA0MiwgOTk5XSkKIAorICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX25vX3JlcmFpc2Uoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgd2hlZSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgY3R4ID0gd2hlZSgpLl9fY29udGV4dF9fKCkKKyAgICAgICAgY3R4Ll9fZW50ZXJfXygpCisgICAgICAgICMgQ2FsbGluZyBfX2V4aXRfXyBzaG91bGQgbm90IHJlc3VsdCBpbiBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5mYWlsSWYoY3R4Ll9fZXhpdF9fKFR5cGVFcnJvciwgVHlwZUVycm9yKCJmb28iKSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl90cmFwX3lpZWxkX2FmdGVyX3Rocm93KHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdob28oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGN0eCA9IHdob28oKS5fX2NvbnRleHRfXygpCisgICAgICAgIGN0eC5fX2VudGVyX18oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwgY3R4Ll9fZXhpdF9fLCBUeXBlRXJyb3IsIFR5cGVFcnJvcigiZm9vIiksIE5vbmUKKyAgICAgICAgKQorCiAgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfZXhjZXB0KHNlbGYpOgogICAgICAgICBzdGF0ZSA9IFtdCiAgICAgICAgIEBjb250ZXh0bWFuYWdlcgpAQCAtNjIsNiArODYsMjEgQEAKICAgICAgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yKDk5OSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQyLCA5OTldKQogCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfYXR0cmlicyhzZWxmKToKKyAgICAgICAgZGVmIGF0dHJpYnMoKiprdyk6CisgICAgICAgICAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGZ1bmMsayx2KQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGUKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIEBhdHRyaWJzKGZvbz0nYmFyJykKKyAgICAgICAgZGVmIGJheihzcGFtKToKKyAgICAgICAgICAgICIiIldoZWUhIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6Ll9fbmFtZV9fLCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhei5mb28sICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhei5fX2RvY19fLCAiV2hlZSEiKQorCiBjbGFzcyBOZXN0ZWRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICAjIFhYWCBUaGlzIG5lZWRzIG1vcmUgd29yawpAQCAtMjc0LDIxICszMTMsMzEgQEAKIAogICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CiAgICAgICAgIGN0eCA9IGRlY2ltYWwuZ2V0Y29udGV4dCgpCi0gICAgICAgIGN0eC5wcmVjID0gc2F2ZV9wcmVjID0gZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYyArIDUKLSAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCisgICAgICAgIG9yaWdfY29udGV4dCA9IGN0eC5jb3B5KCkKICAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3R4LnByZWMgPSBzYXZlX3ByZWMgPSBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjICsgNQogICAgICAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dDoKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjKQotICAgICAgICAgICAgICAgIDEvMAotICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsIHNhdmVfcHJlYykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKKyAgICAgICAgICAgICAgICAgICAgMS8wCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLCBzYXZlX3ByZWMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlY2ltYWwuc2V0Y29udGV4dChvcmlnX2NvbnRleHQpCiAKIAorIyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIHRoZSB0ZXN0IGFjdHVhbGx5IHJ1biB1bmRlciByZWdydGVzdC5weSEKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fc3VpdGUoCisgICAgICAgIHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc3lzLm1vZHVsZXNbX19uYW1lX19dKQorICAgICkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB1bml0dGVzdC5tYWluKCkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weSBiL0xpYi90ZXN0L3Rlc3RfY29weV9yZWcucHkKaW5kZXggYzQxOTQ2YS4uYzNkMzk2NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CkBAIC04LDYgKzgsMjIgQEAKICAgICBwYXNzCiAKIAorY2xhc3MgV2l0aG91dFNsb3RzKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBXaXRoV2Vha3JlZihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnX193ZWFrcmVmX18nLCkKKworY2xhc3MgV2l0aFByaXZhdGUob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ19fc3BhbScsKQorCitjbGFzcyBXaXRoU2luZ2xlU3RyaW5nKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ3NwYW0nCisKK2NsYXNzIFdpdGhJbmhlcml0ZWQoV2l0aFNpbmdsZVN0cmluZyk6CisgICAgX19zbG90c19fID0gKCdlZ2dzJywpCisKKwogY2xhc3MgQ29weVJlZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgpAQCAtODQsNiArMTAwLDE5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlKQogCisgICAgZGVmIHRlc3Rfc2xvdG5hbWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhvdXRTbG90cyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhXZWFrcmVmKSwgW10pCisgICAgICAgIGV4cGVjdGVkID0gWydfV2l0aFByaXZhdGVfX3NwYW0nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhQcml2YXRlKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFNpbmdsZVN0cmluZyksIFsnc3BhbSddKQorICAgICAgICBleHBlY3RlZCA9IFsnZWdncycsICdzcGFtJ10KKyAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisgICAgICAgIHJlc3VsdCA9IGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aEluaGVyaXRlZCkKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQsIGV4cGVjdGVkKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvcHlSZWdUZXN0Q2FzZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQppbmRleCBhNGE0NWE3Li5kYzJmMjBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQpAQCAtMjQsNiArMjQsOSBAQAogaWYgbm90IHRlcm0gb3IgdGVybSA9PSAndW5rbm93bic6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQsICIkVEVSTT0lciwgY2FsbGluZyBpbml0c2NyKCkgbWF5IGNhdXNlIGV4aXQiICUgdGVybQogCitpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgcmFpc2UgVGVzdFNraXBwZWQoImN5Z3dpbidzIGN1cnNlcyBtb3N0bHkganVzdCBoYW5ncyIpCisKIGRlZiB3aW5kb3dfZnVuY3Moc3Rkc2NyKToKICAgICAiVGVzdCB0aGUgbWV0aG9kcyBvZiB3aW5kb3dzIgogICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4oMTAsMTApCkBAIC0yMDEsMTEgKzIwNCwxMyBAQAogICAgICAgICBjdXJzZXMuaGFzX2tleSgxMykKIAogICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnZ2V0bW91c2UnKToKLSAgICAgICAgY3Vyc2VzLm1vdXNlbWFzayhjdXJzZXMuQlVUVE9OMV9QUkVTU0VEKQotICAgICAgICBjdXJzZXMubW91c2VpbnRlcnZhbCgxMCkKLSAgICAgICAgIyBqdXN0IHZlcmlmeSB0aGVzZSBkb24ndCBjYXVzZSBlcnJvcnMKLSAgICAgICAgbSA9IGN1cnNlcy5nZXRtb3VzZSgpCi0gICAgICAgIGN1cnNlcy51bmdldG1vdXNlKCptKQorICAgICAgICAoYXZhaWxtYXNrLCBvbGRtYXNrKSA9IGN1cnNlcy5tb3VzZW1hc2soY3Vyc2VzLkJVVFRPTjFfUFJFU1NFRCkKKyAgICAgICAgIyBhdmFpbG1hc2sgaW5kaWNhdGVzIHRoYXQgbW91c2Ugc3R1ZmYgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgaWYgYXZhaWxtYXNrICE9IDA6CisgICAgICAgICAgICBjdXJzZXMubW91c2VpbnRlcnZhbCgxMCkKKyAgICAgICAgICAgICMganVzdCB2ZXJpZnkgdGhlc2UgZG9uJ3QgY2F1c2UgZXJyb3JzCisgICAgICAgICAgICBtID0gY3Vyc2VzLmdldG1vdXNlKCkKKyAgICAgICAgICAgIGN1cnNlcy51bmdldG1vdXNlKCptKQogCiBkZWYgdW5pdF90ZXN0cygpOgogICAgIGZyb20gY3Vyc2VzIGltcG9ydCBhc2NpaQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggMjdmNDJjNi4uMjUyOGI0YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC0xMTY4LDYgKzExNjgsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIgLSBkdDEsIHVzKQogICAgICAgICBzZWxmLmFzc2VydF8oZHQxIDwgZHQyKQogCisgICAgZGVmIHRlc3Rfc3RyZnRpbWVfd2l0aF9iYWRfdHpuYW1lX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IG9rIGlmIHR6aW5mby50em5hbWUoKS5yZXBsYWNlKCkgcmV0dXJucyBhIG5vbi1zdHJpbmcKKyAgICAgICAgY2xhc3MgTXlUekluZm8oRml4ZWRPZmZzZXQpOgorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgY2xhc3MgTXlTdHIoc3RyKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gTXlTdHIoJ25hbWUnKQorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDA1LCAzLCAyLCAwLCAwLCAwLCAwLCBNeVR6SW5mbygzLCAnbmFtZScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICclWicpCisKICAgICBkZWYgdGVzdF9iYWRfY29uc3RydWN0b3JfYXJndW1lbnRzKHNlbGYpOgogICAgICAgICAjIGJhZCB5ZWFycwogICAgICAgICBzZWxmLnRoZWNsYXNzKE1JTllFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IDFkMzNlYzQuLjM0MWFkNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTI5LDcgKzI5LDggQEAKIGltcG9ydCBvcywgc3lzCiBpbXBvcnQgcGlja2xlLCBjb3B5CiBmcm9tIGRlY2ltYWwgaW1wb3J0ICoKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJ1bl9kb2N0ZXN0LCBpc19yZXNvdXJjZV9lbmFibGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVzb3VyY2VfZW5hYmxlZCkKIGltcG9ydCByYW5kb20KIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCkBAIC0zOSwxMiArNDAsMTUgQEAKICMgVXNlZnVsIFRlc3QgQ29uc3RhbnQKIFNpZ25hbHMgPSBnZXRjb250ZXh0KCkuZmxhZ3Mua2V5cygpCiAKLSMgVGVzdHMgYXJlIGJ1aWx0IGFyb3VuZCB0aGVzZSBhc3N1bWVkIGNvbnRleHQgZGVmYXVsdHMKLURlZmF1bHRDb250ZXh0LnByZWM9OQotRGVmYXVsdENvbnRleHQucm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOCi1EZWZhdWx0Q29udGV4dC50cmFwcz1kaWN0LmZyb21rZXlzKFNpZ25hbHMsIDApCi1zZXRjb250ZXh0KERlZmF1bHRDb250ZXh0KQotCisjIFRlc3RzIGFyZSBidWlsdCBhcm91bmQgdGhlc2UgYXNzdW1lZCBjb250ZXh0IGRlZmF1bHRzLgorIyB0ZXN0X21haW4oKSByZXN0b3JlcyB0aGUgb3JpZ2luYWwgY29udGV4dC4KK2RlZiBpbml0KCk6CisgICAgZ2xvYmFsIE9SSUdJTkFMX0NPTlRFWFQKKyAgICBPUklHSU5BTF9DT05URVhUID0gZ2V0Y29udGV4dCgpLmNvcHkoKQorICAgIERlZmF1bHRDb250ZXh0LnByZWMgPSA5CisgICAgRGVmYXVsdENvbnRleHQucm91bmRpbmcgPSBST1VORF9IQUxGX0VWRU4KKyAgICBEZWZhdWx0Q29udGV4dC50cmFwcyA9IGRpY3QuZnJvbWtleXMoU2lnbmFscywgMCkKKyAgICBzZXRjb250ZXh0KERlZmF1bHRDb250ZXh0KQogCiBURVNUREFUQURJUiA9ICdkZWNpbWFsdGVzdGRhdGEnCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpAQCAtNTAzLDE2ICs1MDcsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdEZWNpbWFsKDEwKSAhPSBFKCknKSwgJ25lIDEwJykKIAogICAgICAgICAjIGluc2VydCBvcGVyYXRvciBtZXRob2RzIGFuZCB0aGVuIGV4ZXJjaXNlIHRoZW0KLSAgICAgICAgZm9yIHN5bSwgbG9wLCByb3AgaW4gKAotICAgICAgICAgICAgICAgICgnKycsICdfX2FkZF9fJywgJ19fcmFkZF9fJyksCi0gICAgICAgICAgICAgICAgKCctJywgJ19fc3ViX18nLCAnX19yc3ViX18nKSwKLSAgICAgICAgICAgICAgICAoJyonLCAnX19tdWxfXycsICdfX3JtdWxfXycpLAotICAgICAgICAgICAgICAgICgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKSwKLSAgICAgICAgICAgICAgICAoJyUnLCAnX19tb2RfXycsICdfX3Jtb2RfXycpLAotICAgICAgICAgICAgICAgICgnLy8nLCAnX19mbG9vcmRpdl9fJywgJ19fcmZsb29yZGl2X18nKSwKLSAgICAgICAgICAgICAgICAoJyoqJywgJ19fcG93X18nLCAnX19ycG93X18nKSwKLSAgICAgICAgICAgICk6CisgICAgICAgIG9wbGlzdCA9IFsKKyAgICAgICAgICAgICgnKycsICdfX2FkZF9fJywgJ19fcmFkZF9fJyksCisgICAgICAgICAgICAoJy0nLCAnX19zdWJfXycsICdfX3JzdWJfXycpLAorICAgICAgICAgICAgKCcqJywgJ19fbXVsX18nLCAnX19ybXVsX18nKSwKKyAgICAgICAgICAgICgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKQorICAgICAgICAgICAgKCclJywgJ19fbW9kX18nLCAnX19ybW9kX18nKSwKKyAgICAgICAgICAgICgnLy8nLCAnX19mbG9vcmRpdl9fJywgJ19fcmZsb29yZGl2X18nKSwKKyAgICAgICAgICAgICgnKionLCAnX19wb3dfXycsICdfX3Jwb3dfXycpCisgICAgICAgIF0KIAorICAgICAgICBmb3Igc3ltLCBsb3AsIHJvcCBpbiBvcGxpc3Q6CiAgICAgICAgICAgICBzZXRhdHRyKEUsIGxvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiAnc3RyJyArIGxvcCArIHN0cihvdGhlcikpCiAgICAgICAgICAgICBzZXRhdHRyKEUsIHJvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiBzdHIob3RoZXIpICsgcm9wICsgJ3N0cicpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0UoKScgKyBzeW0gKyAnRGVjaW1hbCgxMCknKSwKQEAgLTEwNTksNiArMTA2NCw3IEBACiAgICAgaXMgZW5hYmxlZCBpbiByZWdydGVzdC5weQogICAgICIiIgogCisgICAgaW5pdCgpCiAgICAgZ2xvYmFsIFRFU1RfQUxMCiAgICAgVEVTVF9BTEwgPSBhcml0aCBvciBpc19yZXNvdXJjZV9lbmFibGVkKCdkZWNpbWFsJykKIApAQCAtMTA3MywxMCArMTA3OSwxMiBAQAogICAgICAgICBEZWNpbWFsVGVzdCwKICAgICBdCiAKLSAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKLSAgICBpbXBvcnQgZGVjaW1hbCBhcyBEZWNpbWFsTW9kdWxlCi0gICAgcnVuX2RvY3Rlc3QoRGVjaW1hbE1vZHVsZSwgdmVyYm9zZSkKLQorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgIGltcG9ydCBkZWNpbWFsIGFzIERlY2ltYWxNb2R1bGUKKyAgICAgICAgcnVuX2RvY3Rlc3QoRGVjaW1hbE1vZHVsZSwgdmVyYm9zZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXRjb250ZXh0KE9SSUdJTkFMX0NPTlRFWFQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgIyBDYWxsaW5nIHdpdGggbm8gYXJndW1lbnRzIHJ1bnMgYWxsIHRlc3RzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggMTg1ZWRiMy4uODljZWJiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC0xNjM4LDcgKzE2MzgsOSBAQAogICAgIGMxID0gQygpCiAgICAgYzIgPSBDKCkKICAgICB2ZXJpZnkobm90IG5vdCBjMSkKLSAgICB2ZXJlcShoYXNoKGMxKSwgaWQoYzEpKQorICAgIHZlcmlmeShpZChjMSkgIT0gaWQoYzIpKQorICAgIGhhc2goYzEpCisgICAgaGFzaChjMikKICAgICB2ZXJlcShjbXAoYzEsIGMyKSwgY21wKGlkKGMxKSwgaWQoYzIpKSkKICAgICB2ZXJlcShjMSwgYzEpCiAgICAgdmVyaWZ5KGMxICE9IGMyKQpAQCAtMTY2MCw3ICsxNjYyLDkgQEAKICAgICBkMSA9IEQoKQogICAgIGQyID0gRCgpCiAgICAgdmVyaWZ5KG5vdCBub3QgZDEpCi0gICAgdmVyZXEoaGFzaChkMSksIGlkKGQxKSkKKyAgICB2ZXJpZnkoaWQoZDEpICE9IGlkKGQyKSkKKyAgICBoYXNoKGQxKQorICAgIGhhc2goZDIpCiAgICAgdmVyZXEoY21wKGQxLCBkMiksIGNtcChpZChkMSksIGlkKGQyKSkpCiAgICAgdmVyZXEoZDEsIGQxKQogICAgIHZlcmlmeShkMSAhPSBkMikKQEAgLTI5MTQsNyArMjkxOCw3IEBACiAgICAgY2xhc3MgRChCLCBDKToKICAgICAgICAgcGFzcwogICAgIGQgPSBEKCkKLSAgICB2ZXJlcShoYXNoKGQpLCBpZChkKSkKKyAgICBvcmlnX2hhc2ggPSBoYXNoKGQpICMgcmVsYXRlZCB0byBpZChkKSBpbiBwbGF0Zm9ybS1kZXBlbmRlbnQgd2F5cwogICAgIEEuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogNDIKICAgICB2ZXJlcShoYXNoKGQpLCA0MikKICAgICBDLl9faGFzaF9fID0gbGFtYmRhIHNlbGY6IDMxNApAQCAtMjkzMCw3ICsyOTM0LDcgQEAKICAgICBkZWwgQy5fX2hhc2hfXwogICAgIHZlcmVxKGhhc2goZCksIDQyKQogICAgIGRlbCBBLl9faGFzaF9fCi0gICAgdmVyZXEoaGFzaChkKSwgaWQoZCkpCisgICAgdmVyZXEoaGFzaChkKSwgb3JpZ19oYXNoKQogICAgIGQuZm9vID0gNDIKICAgICBkLmJhciA9IDQyCiAgICAgdmVyZXEoZC5mb28sIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CmluZGV4IDUyZmVlZjAuLjgzZmFkMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKQEAgLTE1Miw2ICsxNTIsMTAgQEAKICAgICAgICAgZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgb2xkLCBuZXcpLmdldF9vcGNvZGVzKCkKIAogCi1Eb2N0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKGRpZmZsaWIpCitkZWYgdGVzdF9tYWluKCk6CisgICAgZGlmZmxpYi5IdG1sRGlmZi5fZGVmYXVsdF9wcmVmaXggPSAwCisgICAgRG9jdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZShkaWZmbGliKQorICAgIHJ1bl91bml0dGVzdChUZXN0U0ZwYXRjaGVzLCBUZXN0U0ZidWdzLCBEb2N0ZXN0cykKIAotcnVuX3VuaXR0ZXN0KFRlc3RTRnBhdGNoZXMsIFRlc3RTRmJ1Z3MsIERvY3Rlc3RzKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGwucHkKaW5kZXggZDFmNzNiMi4uYjcwYTRjZiAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9kbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RsLnB5CkBAIC0xMCw2ICsxMCw3IEBACiAgICAgKCcvdXNyL2xpYi9saWJjLnNvJywgJ2dldHBpZCcpLAogICAgICgnL2xpYi9saWJjLnNvLjYnLCAnZ2V0cGlkJyksCiAgICAgKCcvdXNyL2Jpbi9jeWd3aW4xLmRsbCcsICdnZXRwaWQnKSwKKyAgICAoJy91c3IvbGliL2xpYmMuZHlsaWInLCAnZ2V0cGlkJyksCiAgICAgXQogCiBmb3IgcywgZnVuYyBpbiBzaGFyZWRsaWJzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IDFmODlhYzIuLmIxNzYwN2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTYwNCw4ICs2MDQsOCBAQAogICAgIC4uLiAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKToKICAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeCwKICAgICAuLi4gICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgID4+PiBbZS5saW5lbm8gZm9yIGUgaW4gdGVzdC5leGFtcGxlc10KQEAgLTY3OSw4ICs2NzksOCBAQAogICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgIC4uLiAgICAgPj4+IHByaW50IHgKICAgICAuLi4gICAgIDEyCi0gICAgLi4uICAgICA+Pj4geC8yCi0gICAgLi4uICAgICA2LjAKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KIApAQCAtNzAwLDggKzcwMCw4IEBACiAgICAgLi4uICAgICA+Pj4geCA9IDEyCiAgICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgIC4uLiAgICAgMTQKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1UcnVlKS5ydW4odGVzdCkKQEAgLTcyMyw5ICs3MjMsOSBAQAogICAgIEdvdDoKICAgICAgICAgMTIKICAgICBUcnlpbmc6Ci0gICAgICAgIHgvMgorICAgICAgICB4Ly8yCiAgICAgRXhwZWN0aW5nOgotICAgICAgICA2LjAKKyAgICAgICAgNgogICAgIG9rCiAgICAgKDEsIDMpCiAiIiIKQEAgLTczOCw4ICs3MzgsOCBAQAogICAgIC4uLiAgICAgPj4+IHggPSAxMgogICAgIC4uLiAgICAgPj4+IHByaW50IHgKICAgICAuLi4gICAgIDEyCi0gICAgLi4uICAgICA+Pj4geC8yCi0gICAgLi4uICAgICA2LjAKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KIApAQCAtNzU0LDkgKzc1NCw5IEBACiAgICAgICAgIDEyCiAgICAgb2sKICAgICBUcnlpbmc6Ci0gICAgICAgIHgvMgorICAgICAgICB4Ly8yCiAgICAgRXhwZWN0aW5nOgotICAgICAgICA2LjAKKyAgICAgICAgNgogICAgIG9rCiAgICAgKDAsIDMpCiAKQEAgLTc4NCw5ICs3ODQsOSBAQAogICAgICAgICAxMgogICAgIG9rCiAgICAgVHJ5aW5nOgotICAgICAgICB4LzIKKyAgICAgICAgeC8vMgogICAgIEV4cGVjdGluZzoKLSAgICAgICAgNi4wCisgICAgICAgIDYKICAgICBvawogICAgICgwLCAzKQogCkBAIC04MDYsOSArODA2LDkgQEAKICAgICA+Pj4gZGVmIGYoeCk6CiAgICAgLi4uICAgICAnJycKICAgICAuLi4gICAgID4+PiB4ID0gMTIKLSAgICAuLi4gICAgID4+PiBwcmludCB4LzAKKyAgICAuLi4gICAgID4+PiBwcmludCB4Ly8wCiAgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogZmxvYXQgZGl2aXNpb24KKyAgICAuLi4gICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQpAQCAtODIyLDEwICs4MjIsMTAgQEAKICAgICA+Pj4gZGVmIGYoeCk6CiAgICAgLi4uICAgICAnJycKICAgICAuLi4gICAgID4+PiB4ID0gMTIKLSAgICAuLi4gICAgID4+PiBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4LzAKKyAgICAuLi4gICAgID4+PiBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4Ly8wCiAgICAgLi4uICAgICBwcmUtZXhjZXB0aW9uIG91dHB1dAogICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgIC4uLiAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGZsb2F0IGRpdmlzaW9uCisgICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgIC4uLiAgICAgJycnCiAgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKQEAgLTgzMywxMCArODMzLDEwIEBACiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIEZpbGUgLi4uLCBsaW5lIDQsIGluIGYKICAgICBGYWlsZWQgZXhhbXBsZToKLSAgICAgICAgcHJpbnQgJ3ByZS1leGNlcHRpb24gb3V0cHV0JywgeC8wCisgICAgICAgIHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvLzAKICAgICBFeGNlcHRpb24gcmFpc2VkOgogICAgICAgICAuLi4KLSAgICAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGZsb2F0IGRpdmlzaW9uCisgICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgKDEsIDIpCiAKIEV4Y2VwdGlvbiBtZXNzYWdlcyBtYXkgY29udGFpbiBuZXdsaW5lczoKQEAgLTkyMCw3ICs5MjAsNyBAQAogCiAgICAgPj4+IGRlZiBmKHgpOgogICAgIC4uLiAgICAgcicnJwotICAgIC4uLiAgICAgPj4+IDEvMAorICAgIC4uLiAgICAgPj4+IDEvLzAKICAgICAuLi4gICAgIDAKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQpAQCAtOTI5LDExICs5MjksMTEgQEAKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgogICAgIEZhaWxlZCBleGFtcGxlOgotICAgICAgICAxLzAKKyAgICAgICAgMS8vMAogICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgLi4uCi0gICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBmbG9hdCBkaXZpc2lvbgorICAgICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybwogICAgICgxLCAxKQogIiIiCiAgICAgZGVmIG9wdGlvbmZsYWdzKCk6IHIiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2FmNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzCisKK2ltcG9ydCB1bml0dGVzdAorIyBUaGUgc3BlY2lmaWMgdGVzdHMgbm93IGxpdmUgaW4gTGliL2VtYWlsL3Rlc3QKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX3JlbmFtZWQgaW1wb3J0IHN1aXRlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fc3VpdGUKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl9zdWl0ZShzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggZmQ1NjcwYS4uYWIzZGE4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTAwLDEyICsxMDAsMTggQEAKICAgICBwcmludCAid3JpdGVsaW5lcyBhY2NlcHRlZCBzZXF1ZW5jZSBvZiBub24tc3RyaW5nIG9iamVjdHMiCiBmLmNsb3NlKCkKIAotdHJ5OgotICAgIHN5cy5zdGRpbi5zZWVrKC0xKQotZXhjZXB0IElPRXJyb3I6Ci0gICAgcGFzcworIyBUaGlzIGNhdXNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdCBvbiBPU0YxIHY1LjEuCitpZiBzeXMucGxhdGZvcm0gIT0gJ29zZjFWNSc6CisgICAgdHJ5OgorICAgICAgICBzeXMuc3RkaW4uc2VlaygtMSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHByaW50ICJzaG91bGQgbm90IGJlIGFibGUgdG8gc2VlayBvbiBzeXMuc3RkaW4iCiBlbHNlOgotICAgIHByaW50ICJzaG91bGQgbm90IGJlIGFibGUgdG8gc2VlayBvbiBzeXMuc3RkaW4iCisgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAnICBTa2lwcGluZyBzeXMuc3RkaW4uc2VlaygtMSksIGl0IG1heSBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuJworICAgICAgICAnIFRlc3QgbWFudWFsbHkuJykKIAogdHJ5OgogICAgIHN5cy5zdGRpbi50cnVuY2F0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IGYzYTc4NDEuLjMwMTc2OWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0xNjIsNyArMTYyLDEwIEBACiAgICAgcHJpbnQgIjE1LiBVbmljb2RlIGZpbGVuYW1lcyIKIHRyeToKICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQiJdKQotICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXVuaWNvZGUodDEsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkpCisgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICBlbmNvZGluZyA9ICdhc2NpaScKKyAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz11bmljb2RlKHQxLCBlbmNvZGluZykpCiAgICAgbGluZXMgPSBsaXN0KGZpKQogICAgIHZlcmlmeShsaW5lcyA9PSBbIkFcbiIsICJCIl0pCiBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JrMS5weSBiL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKaW5kZXggYWNhN2E4NC4uY2JhNWZjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CkBAIC0xLDc1ICsxLDIzIEBACiAiIiJUaGlzIHRlc3QgY2hlY2tzIGZvciBjb3JyZWN0IGZvcmsoKSBiZWhhdmlvci4KLQotV2Ugd2FudCBmb3JrMSgpIHNlbWFudGljcyAtLSBvbmx5IHRoZSBmb3JraW5nIHRocmVhZCBzdXJ2aXZlcyBpbiB0aGUKLWNoaWxkIGFmdGVyIGEgZm9yaygpLgotCi1PbiBzb21lIHN5c3RlbXMgKGUuZy4gU29sYXJpcyB3aXRob3V0IHBvc2l4IHRocmVhZHMpIHdlIGZpbmQgdGhhdCBhbGwKLWFjdGl2ZSB0aHJlYWRzIHN1cnZpdmUgaW4gdGhlIGNoaWxkIGFmdGVyIGEgZm9yaygpOyB0aGlzIGlzIGFuIGVycm9yLgotCi1XaGlsZSBCZU9TIGRvZXNuJ3Qgb2ZmaWNpYWxseSBzdXBwb3J0IGZvcmsgYW5kIG5hdGl2ZSB0aHJlYWRpbmcgaW4KLXRoZSBzYW1lIGFwcGxpY2F0aW9uLCB0aGUgcHJlc2VudCBleGFtcGxlIHNob3VsZCB3b3JrIGp1c3QgZmluZS4gIERDCiAiIiIKIAotaW1wb3J0IG9zLCBzeXMsIHRpbWUsIHRocmVhZAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlLCBUZXN0U2tpcHBlZAoraW1wb3J0IG9zCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAogCiB0cnk6CiAgICAgb3MuZm9yawogZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3MuZm9yayBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X2ZvcmsxIgogCi1MT05HU0xFRVAgPSAyCi0KLVNIT1JUU0xFRVAgPSAwLjUKLQotTlVNX1RIUkVBRFMgPSA0Ci0KLWFsaXZlID0ge30KLQotc3RvcCA9IDAKLQotZGVmIGYoaWQpOgotICAgIHdoaWxlIG5vdCBzdG9wOgotICAgICAgICBhbGl2ZVtpZF0gPSBvcy5nZXRwaWQoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0aW1lLnNsZWVwKFNIT1JUU0xFRVApCi0gICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgcGFzcwotCi1kZWYgbWFpbigpOgotICAgIGZvciBpIGluIHJhbmdlKE5VTV9USFJFQURTKToKLSAgICAgICAgdGhyZWFkLnN0YXJ0X25ldyhmLCAoaSwpKQotCi0gICAgdGltZS5zbGVlcChMT05HU0xFRVApCi0KLSAgICBhID0gYWxpdmUua2V5cygpCi0gICAgYS5zb3J0KCkKLSAgICB2ZXJpZnkoYSA9PSByYW5nZShOVU1fVEhSRUFEUykpCi0KLSAgICBwcmVmb3JrX2xpdmVzID0gYWxpdmUuY29weSgpCi0KLSAgICBpZiBzeXMucGxhdGZvcm0gaW4gWyd1bml4d2FyZTcnXToKLSAgICAgICAgY3BpZCA9IG9zLmZvcmsxKCkKLSAgICBlbHNlOgotICAgICAgICBjcGlkID0gb3MuZm9yaygpCi0KLSAgICBpZiBjcGlkID09IDA6Ci0gICAgICAgICMgQ2hpbGQKLSAgICAgICAgdGltZS5zbGVlcChMT05HU0xFRVApCi0gICAgICAgIG4gPSAwCi0gICAgICAgIGZvciBrZXkgaW4gYWxpdmUua2V5cygpOgotICAgICAgICAgICAgaWYgYWxpdmVba2V5XSAhPSBwcmVmb3JrX2xpdmVzW2tleV06Ci0gICAgICAgICAgICAgICAgbiA9IG4rMQotICAgICAgICBvcy5fZXhpdChuKQotICAgIGVsc2U6Ci0gICAgICAgICMgUGFyZW50CitjbGFzcyBGb3JrVGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCAwKQotICAgICAgICB2ZXJpZnkoc3BpZCA9PSBjcGlkKQotICAgICAgICB2ZXJpZnkoc3RhdHVzID09IDAsCi0gICAgICAgICAgICAgICAgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkgKQotICAgICAgICBnbG9iYWwgc3RvcAotICAgICAgICAjIFRlbGwgdGhyZWFkcyB0byBkaWUKLSAgICAgICAgc3RvcCA9IDEKLSAgICAgICAgdGltZS5zbGVlcCgyKlNIT1JUU0xFRVApICMgV2FpdCBmb3IgdGhyZWFkcyB0byBkaWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCiAKLW1haW4oKQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGb3JrVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IDRiZTFiNGMuLmE2MGE3NjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTQyMSw3ICs0MjEsNiBAQAogLi4uICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogLi4uICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAuLi4gICAgICAgICBzZWxmLmdlbmVyYXRvciA9IHNlbGYuZ2VuZXJhdGUoKQotLi4uICAgICAgICAgc2VsZi5jbG9zZSA9IHNlbGYuZ2VuZXJhdG9yLmNsb3NlCiAuLi4KIC4uLiAgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgogLi4uICAgICAgICAgd2hpbGUgbm90IHNlbGYucGFyZW50OgpAQCAtNDg0LDggKzQ4Myw2IEBACiBtZXJnZWQgQSBpbnRvIEcKIEEtPkcgQi0+RyBDLT5HIEQtPkcgRS0+RyBGLT5HIEctPkcgSC0+RyBJLT5HIEotPkcgSy0+RyBMLT5HIE0tPkcKIAotPj4+IGZvciBzIGluIHNldHM6IHMuY2xvc2UoKSAgICAjIGJyZWFrIGN5Y2xlcwotCiAiIiIKICMgRW1hY3MgdHVyZCAnCiAKQEAgLTU5Myw3ICs1OTAsNiBAQAogLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgZyk6CiAuLi4gICAgICAgICBzZWxmLnNvZmFyID0gW10KIC4uLiAgICAgICAgIHNlbGYuZmV0Y2ggPSBnLm5leHQKLS4uLiAgICAgICAgIHNlbGYuY2xvc2UgPSBnLmNsb3NlCiAuLi4KIC4uLiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgogLi4uICAgICAgICAgc29mYXIsIGZldGNoID0gc2VsZi5zb2Zhciwgc2VsZi5mZXRjaApAQCAtNjI0LDggKzYyMCw2IEBACiBbMjAwLCAyMTYsIDIyNSwgMjQwLCAyNDMsIDI1MCwgMjU2LCAyNzAsIDI4OCwgMzAwLCAzMjAsIDMyNCwgMzYwLCAzNzUsIDM4NF0KIFs0MDAsIDQwNSwgNDMyLCA0NTAsIDQ4MCwgNDg2LCA1MDAsIDUxMiwgNTQwLCA1NzYsIDYwMCwgNjI1LCA2NDAsIDY0OCwgNjc1XQogCi0+Pj4gbTIzNS5jbG9zZSgpCi0KIFllIG9sZGUgRmlib25hY2NpIGdlbmVyYXRvciwgTGF6eUxpc3Qgc3R5bGUuCiAKID4+PiBkZWYgZmliZ2VuKGEsIGIpOgpAQCAtNjQ4LDcgKzY0Miw2IEBACiA+Pj4gZmliID0gTGF6eUxpc3QoZmliZ2VuKDEsIDIpKQogPj4+IGZpcnN0bihpdGVyKGZpYiksIDE3KQogWzEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1LCA4OSwgMTQ0LCAyMzMsIDM3NywgNjEwLCA5ODcsIDE1OTcsIDI1ODRdCi0+Pj4gZmliLmNsb3NlKCkKIAogCiBSdW5uaW5nIGFmdGVyIHlvdXIgdGFpbCB3aXRoIGl0ZXJ0b29scy50ZWUgKG5ldyBpbiB2ZXJzaW9uIDIuNCkKQEAgLTY4NSw3ICs2NzgsOCBAQAogLi4uICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UodGltZXMoMywgbTMpLAogLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMoNSwgbTUpKSk6CiAuLi4gICAgICAgICAgICAgeWllbGQgbgotLi4uICAgICBtMiwgbTMsIG01LCBtUmVzID0gdGVlKF9tMjM1KCksIDQpCisuLi4gICAgIG0xID0gX20yMzUoKQorLi4uICAgICBtMiwgbTMsIG01LCBtUmVzID0gdGVlKG0xLCA0KQogLi4uICAgICByZXR1cm4gbVJlcwogCiA+Pj4gaXQgPSBtMjM1KCkKQEAgLTcwMiwxMCArNjk2LDkgQEAKIGl0ZXJhdG9ycywgd2hlcmV1cG9uIGl0IGlzIGRlbGV0ZWQuIFlvdSBjYW4gdGhlcmVmb3JlIHByaW50IHRoZSBoYW1taW5nCiBzZXF1ZW5jZSBkdXJpbmcgaG91cnMgd2l0aG91dCBpbmNyZWFzaW5nIG1lbW9yeSB1c2FnZSwgb3IgdmVyeSBsaXR0bGUuCiAKLVRoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCByZWN1cnNpdmUgcnVubmluZyBhZnRlciB0aGVpciB0YWlsIEZQIGFsZ29yaXRobXMKK1RoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCByZWN1cnNpdmUgcnVubmluZy1hZnRlci10aGVpci10YWlsIEZQIGFsZ29yaXRobXMKIGFyZSBxdWl0ZSBzdHJhaWdodGZvcndhcmRseSBleHByZXNzZWQgd2l0aCB0aGlzIFB5dGhvbiBpZGlvbS4KIAotCiBZZSBvbGRlIEZpYm9uYWNjaSBnZW5lcmF0b3IsIHRlZSBzdHlsZS4KIAogPj4+IGRlZiBmaWIoKToKQEAgLTcyMSw3ICs3MTQsOCBAQAogLi4uICAgICAgICAgZm9yIHJlcyBpbiBfaXN1bShmaWJIZWFkLCBmaWJUYWlsKToKIC4uLiAgICAgICAgICAgICB5aWVsZCByZXMKIC4uLgotLi4uICAgICBmaWJIZWFkLCBmaWJUYWlsLCBmaWJSZXMgPSB0ZWUoX2ZpYigpLCAzKQorLi4uICAgICByZWFsZmliID0gX2ZpYigpCisuLi4gICAgIGZpYkhlYWQsIGZpYlRhaWwsIGZpYlJlcyA9IHRlZShyZWFsZmliLCAzKQogLi4uICAgICByZXR1cm4gZmliUmVzCiAKID4+PiBmaXJzdG4oZmliKCksIDE3KQpAQCAtMTU0NSw2ICsxNTM5LDkgQEAKID4+PiBnLnRocm93KFZhbHVlRXJyb3IsIFR5cGVFcnJvcigxKSkgICMgbWlzbWF0Y2hlZCB0eXBlLCByZXdyYXBwZWQKIGNhdWdodCBWYWx1ZUVycm9yICgxKQogCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCBWYWx1ZUVycm9yKDEpLCBOb25lKSAgICMgZXhwbGljaXQgTm9uZSB0cmFjZWJhY2sKK2NhdWdodCBWYWx1ZUVycm9yICgxKQorCiA+Pj4gZy50aHJvdyhWYWx1ZUVycm9yKDEpLCAiZm9vIikgICAgICAgIyBiYWQgYXJncwogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KQEAgLTE1OTIsOCArMTU4OSw3IEBACiA+Pj4gZigpLnRocm93KCJhYmMiKSAgICAgIyB0aHJvdyBvbiBqdXN0LW9wZW5lZCBnZW5lcmF0b3IKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgLi4uCi1UeXBlRXJyb3I6IGV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCBzdHIKLQorYWJjCiAKIE5vdyBsZXQncyB0cnkgY2xvc2luZyBhIGdlbmVyYXRvcjoKIApAQCAtMTcxMSw2ICsxNzA3LDgxIEBACiAKICIiIgogCityZWZsZWFrc190ZXN0cyA9ICIiIgorUHJpb3IgdG8gYWRkaW5nIGN5Y2xlLUdDIHN1cHBvcnQgdG8gaXRlcnRvb2xzLnRlZSwgdGhpcyBjb2RlIHdvdWxkIGxlYWsKK3JlZmVyZW5jZXMuIFdlIGFkZCBpdCB0byB0aGUgc3RhbmRhcmQgc3VpdGUgc28gdGhlIHJvdXRpbmUgcmVmbGVhay10ZXN0cword291bGQgdHJpZ2dlciBpZiBpdCBzdGFydHMgYmVpbmcgdW5jbGVhbmFibGUgYWdhaW4uCisKKz4+PiBpbXBvcnQgaXRlcnRvb2xzCis+Pj4gZGVmIGxlYWsoKToKKy4uLiAgICAgY2xhc3MgZ2VuOgorLi4uICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorLi4uICAgICAgICAgICAgIHJldHVybiBzZWxmCisuLi4gICAgICAgICBkZWYgbmV4dChzZWxmKToKKy4uLiAgICAgICAgICAgICByZXR1cm4gc2VsZi5pdGVtCisuLi4gICAgIGcgPSBnZW4oKQorLi4uICAgICBoZWFkLCB0YWlsID0gaXRlcnRvb2xzLnRlZShnKQorLi4uICAgICBnLml0ZW0gPSBoZWFkCisuLi4gICAgIHJldHVybiBoZWFkCis+Pj4gaXQgPSBsZWFrKCkKKworTWFrZSBzdXJlIHRvIGFsc28gdGVzdCB0aGUgaW52b2x2ZW1lbnQgb2YgdGhlIHRlZS1pbnRlcm5hbCB0ZWVkYXRhb2JqZWN0LAord2hpY2ggc3RvcmVzIHJldHVybmVkIGl0ZW1zLgorCis+Pj4gaXRlbSA9IGl0Lm5leHQoKQorCisKKworVGhpcyB0ZXN0IGxlYWtlZCBhdCBvbmUgcG9pbnQgZHVlIHRvIGdlbmVyYXRvciBmaW5hbGl6YXRpb24vZGVzdHJ1Y3Rpb24uCitJdCB3YXMgY29waWVkIGZyb20gTGliL3Rlc3QvbGVha2Vycy90ZXN0X2dlbmVyYXRvcl9jeWNsZS5weSBiZWZvcmUgdGhlIGZpbGUKK3dhcyByZW1vdmVkLgorCis+Pj4gZGVmIGxlYWsoKToKKy4uLiAgICBkZWYgZ2VuKCk6CisuLi4gICAgICAgIHdoaWxlIFRydWU6CisuLi4gICAgICAgICAgICB5aWVsZCBnCisuLi4gICAgZyA9IGdlbigpCisKKz4+PiBsZWFrKCkKKworCisKK1RoaXMgdGVzdCBpc24ndCByZWFsbHkgZ2VuZXJhdG9yIHJlbGF0ZWQsIGJ1dCByYXRoZXIgZXhjZXB0aW9uLWluLWNsZWFudXAKK3JlbGF0ZWQuIFRoZSBjb3JvdXRpbmUgdGVzdHMgKGFib3ZlKSBqdXN0IGhhcHBlbiB0byBjYXVzZSBhbiBleGNlcHRpb24gaW4KK3RoZSBnZW5lcmF0b3IncyBfX2RlbF9fICh0cF9kZWwpIG1ldGhvZC4gV2UgY2FuIGFsc28gdGVzdCBmb3IgdGhpcworZXhwbGljaXRseSwgd2l0aG91dCBnZW5lcmF0b3JzLiBXZSBkbyBoYXZlIHRvIHJlZGlyZWN0IHN0ZGVyciB0byBhdm9pZAorcHJpbnRpbmcgd2FybmluZ3MgYW5kIHRvIGRvdWJsZWNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgdGVzdGVkIHdoYXQgd2Ugd2FudGVkCit0byB0ZXN0LgorCis+Pj4gaW1wb3J0IHN5cywgU3RyaW5nSU8KKz4+PiBvbGQgPSBzeXMuc3RkZXJyCis+Pj4gdHJ5OgorLi4uICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorLi4uICAgICBjbGFzcyBMZWFrZXI6CisuLi4gICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKy4uLiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKy4uLgorLi4uICAgICBsID0gTGVha2VyKCkKKy4uLiAgICAgZGVsIGwKKy4uLiAgICAgZXJyID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpLnN0cmlwKCkKKy4uLiAgICAgZXJyLnN0YXJ0c3dpdGgoCisuLi4gICAgICAgICAiRXhjZXB0aW9uIGV4Y2VwdGlvbnMuUnVudGltZUVycm9yOiBSdW50aW1lRXJyb3IoKSBpbiA8IgorLi4uICAgICApCisuLi4gICAgIGVyci5lbmRzd2l0aCgiPiBpZ25vcmVkIikKKy4uLiAgICAgbGVuKGVyci5zcGxpdGxpbmVzKCkpCisuLi4gZmluYWxseToKKy4uLiAgICAgc3lzLnN0ZGVyciA9IG9sZAorVHJ1ZQorVHJ1ZQorMQorCisKKworVGhlc2UgcmVmbGVhayB0ZXN0cyBzaG91bGQgcGVyaGFwcyBiZSBpbiBhIHRlc3RmaWxlIG9mIHRoZWlyIG93biwKK3Rlc3RfZ2VuZXJhdG9ycyBqdXN0IGhhcHBlbmVkIHRvIGJlIHRoZSB0ZXN0IHRoYXQgZHJldyB0aGVzZSBvdXQuCisKKyIiIgorCiBfX3Rlc3RfXyA9IHsidHV0IjogICAgICB0dXRvcmlhbF90ZXN0cywKICAgICAgICAgICAgICJwZXAiOiAgICAgIHBlcF90ZXN0cywKICAgICAgICAgICAgICJlbWFpbCI6ICAgIGVtYWlsX3Rlc3RzLApAQCAtMTcxOSw2ICsxNzkwLDcgQEAKICAgICAgICAgICAgICJjb25qb2luIjogIGNvbmpvaW5fdGVzdHMsCiAgICAgICAgICAgICAid2Vha3JlZiI6ICB3ZWFrcmVmX3Rlc3RzLAogICAgICAgICAgICAgImNvcm91dGluZSI6ICBjb3JvdXRpbmVfdGVzdHMsCisgICAgICAgICAgICAicmVmbGVha3MiOiByZWZsZWFrc190ZXN0cywKICAgICAgICAgICAgIH0KIAogIyBNYWdpYyB0ZXN0IG5hbWUgdGhhdCByZWdydGVzdC5weSBpbnZva2VzICphZnRlciogaW1wb3J0aW5nIHRoaXMgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CmluZGV4IDE1NTY2MDQuLmU0MTQ3NTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKQEAgLTEyOSw3ICsxMjksNyBAQAogVmVyaWZ5IHJlLXVzZSBvZiB0dXBsZXMgKGEgc2lkZSBiZW5lZml0IG9mIHVzaW5nIGdlbmV4cHMgb3ZlciBsaXN0Y29tcHMpCiAKICAgICA+Pj4gdHVwbGVpZHMgPSBtYXAoaWQsICgoaSxpKSBmb3IgaSBpbiB4cmFuZ2UoMTApKSkKLSAgICA+Pj4gbWF4KHR1cGxlaWRzKSAtIG1pbih0dXBsZWlkcykKKyAgICA+Pj4gaW50KG1heCh0dXBsZWlkcykgLSBtaW4odHVwbGVpZHMpKQogICAgIDAKIAogVmVyaWZ5IHRoYXQgc3ludGF4IGVycm9yJ3MgYXJlIHJhaXNlZCBmb3IgZ2VuZXhwcyB1c2VkIGFzIGx2YWx1ZXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IGQ0YzY4MWEuLjc0OGFkNDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtNDgsNyArNDgsNyBAQAogVkVSWV9MQVJHRSA9IDB4RkYwMDAwMTIxMjEyMTIxMjEyMTIxMjQyTAogCiBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgVUNIQVJfTUFYLCBVU0hSVF9NQVgsIFVJTlRfTUFYLCBVTE9OR19NQVgsIElOVF9NQVgsIFwKLSAgICAgSU5UX01JTiwgTE9OR19NSU4sIExPTkdfTUFYCisgICAgIElOVF9NSU4sIExPTkdfTUlOLCBMT05HX01BWCwgUFlfU1NJWkVfVF9NSU4sIFBZX1NTSVpFX1RfTUFYCiAKICMgZmFrZSwgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gUHl0aG9uJ3MgaGVhZGVyIGZpbGVzCiBMTE9OR19NQVggPSAyKio2My0xCkBAIC0xODIsNiArMTgyLDIzIEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2woNDJMKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBWRVJZX0xBUkdFKQogCisgICAgZGVmIHRlc3RfbihzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfbgorICAgICAgICAjIG4gcmV0dXJucyAnUHlfc3NpemVfdCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nCisgICAgICAgICMgKFBZX1NTSVpFX1RfTUlOIC4uLiBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19uKDMuMTQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19uKExvbmcoKSkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX24oSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgUFlfU1NJWkVfVF9NSU4tMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUFlfU1NJWkVfVF9NSU4sIGdldGFyZ3NfbihQWV9TU0laRV9UX01JTikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBZX1NTSVpFX1RfTUFYLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFBZX1NTSVpFX1RfTUFYKzEpCisKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3Nfbig0MikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX24oNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBWRVJZX0xBUkdFKQorCiAKIGNsYXNzIExvbmdMb25nX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9MKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nbG9iLnB5IGIvTGliL3Rlc3QvdGVzdF9nbG9iLnB5CmluZGV4IDhhNmVmN2YuLjVjZTA5ZjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2xvYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dsb2IucHkKQEAgLTgwLDYgKzgwLDE0IEBACiAgICAgICAgIGVxKHNlbGYuZ2xvYignP2E/JywgJypGJyksIG1hcChzZWxmLm5vcm0sIFtvcy5wYXRoLmpvaW4oJ2FhYScsICd6enpGJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oJ2FhYicsICdGJyldKSkKIAorICAgIGRlZiB0ZXN0X2dsb2JfZGlyZWN0b3J5X3dpdGhfdHJhaWxpbmdfc2xhc2goc2VsZik6CisgICAgICAgICMgV2UgYXJlIHZlcmlmeWluZyB0aGF0IHdoZW4gdGhlcmUgaXMgd2lsZGNhcmQgcGF0dGVybiB3aGljaAorICAgICAgICAjIGVuZHMgd2l0aCBvcy5zZXAgZG9lc24ndCBibG93IHVwLgorICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi50ZW1wZGlyICsgJyonICsgb3Muc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICAjIGVpdGhlciBvZiB0aGVzZSByZXN1bHRzIGFyZSByZWFzb25hYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNbMF0gaW4gW3NlbGYudGVtcGRpciwgc2VsZi50ZW1wZGlyICsgb3Muc2VwXSkKKwogICAgIGRlZiB0ZXN0X2dsb2JfYnJva2VuX3N5bWxpbmtzKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpOgogICAgICAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCA1YjIwYWIzLi40YmI0ZTQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC0yNTUsNiArMjU1LDEwIEBACiBkMjJ2KCooMSwgMiwgMywgNCkpCiBkMjJ2KDEsIDIsICooMywgNCwgNSkpCiBkMjJ2KDEsICooMiwgMyksICoqeydkJzogNH0pCitkZWYgZDMxdigoeCkpOiBwYXNzCitkMzF2KDEpCitkZWYgZDMydigoeCwpKTogcGFzcworZDMydigoMSwpKQogCiAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAogcHJpbnQgJ2xhbWJkZWYnCkBAIC04MTEsNiArODE1LDExIEBACiB4ID0gNTsgdCA9IFRydWU7CiB2ZXJpZnkoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0gPT0gbGlzdChnKSkKIAorIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQordmVyaWZ5KFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQordmVyaWZ5KCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKwogIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCiBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CiAgICAgImhlbHBlciB0byBjaGVjayB0aGF0IGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgaXMgZG9uZSBjb3JyZWN0bHkiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luZGV4LnB5IGIvTGliL3Rlc3QvdGVzdF9pbmRleC5weQppbmRleCBlNjlkZTI5Li40NWIzYjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKQEAgLTAsMCArMSwxMzcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcGVyYXRvcgorCitjbGFzcyBvbGRzdHlsZToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgbmV3c3R5bGUob2JqZWN0KToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubyA9IG9sZHN0eWxlKCkKKyAgICAgICAgc2VsZi5uID0gbmV3c3R5bGUoKQorICAgICAgICBzZWxmLm8yID0gb2xkc3R5bGUoKQorICAgICAgICBzZWxmLm4yID0gbmV3c3R5bGUoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAtMgorICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBhc3NlcnQoc2VsZi5zZXFbc2VsZi5uXSA9PSBzZWxmLnNlcVsyXSkKKyAgICAgICAgYXNzZXJ0KHNlbGYuc2VxW3NlbGYub10gPT0gc2VsZi5zZXFbLTJdKQorICAgICAgICBhc3NlcnQob3BlcmF0b3IuaW5kZXgoc2VsZi5vKSA9PSAtMikKKyAgICAgICAgYXNzZXJ0KG9wZXJhdG9yLmluZGV4KHNlbGYubikgPT0gMikKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gJ2R1bWInCisgICAgICAgIHNlbGYubi5pbmQgPSAnYmFkJworICAgICAgICBteWZ1bmMgPSBsYW1iZGEgeCwgb2JqOiBvYmouc2VxW3hdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm8pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm4pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG15ZnVuYywgc2VsZi5vLCBzZWxmKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBteWZ1bmMsIHNlbGYubiwgc2VsZikKKworICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMQorICAgICAgICBzZWxmLm8yLmluZCA9IDMKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2VsZi5uMi5pbmQgPSA0CisgICAgICAgIGFzc2VydChzZWxmLnNlcVtzZWxmLm86c2VsZi5vMl0gPT0gc2VsZi5zZXFbMTozXSkKKyAgICAgICAgYXNzZXJ0KHNlbGYuc2VxW3NlbGYubjpzZWxmLm4yXSA9PSBzZWxmLnNlcVsyOjRdKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMworICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBhc3NlcnQoc2VsZi5zZXEgKiBzZWxmLm8gPT0gc2VsZi5zZXEgKiAzKQorICAgICAgICBhc3NlcnQoc2VsZi5zZXEgKiBzZWxmLm4gPT0gc2VsZi5zZXEgKiAyKQorICAgICAgICBhc3NlcnQoc2VsZi5vICogc2VsZi5zZXEgPT0gc2VsZi5zZXEgKiAzKQorICAgICAgICBhc3NlcnQoc2VsZi5uICogc2VsZi5zZXEgPT0gc2VsZi5zZXEgKiAyKQorCisgICAgZGVmIHRlc3Rfd3JhcHBlcnMoc2VsZik6CisgICAgICAgIG4gPSBzZWxmLm4KKyAgICAgICAgbi5pbmQgPSA1CisgICAgICAgIGFzc2VydCBuLl9faW5kZXhfXygpID09IDUKKyAgICAgICAgYXNzZXJ0IDYgLl9faW5kZXhfXygpID09IDYKKyAgICAgICAgYXNzZXJ0IC03TC5fX2luZGV4X18oKSA9PSAtNworICAgICAgICBhc3NlcnQgc2VsZi5zZXEuX19nZXRpdGVtX18obikgPT0gc2VsZi5zZXFbNV0KKyAgICAgICAgYXNzZXJ0IHNlbGYuc2VxLl9fbXVsX18obikgPT0gc2VsZi5zZXEgKiA1CisgICAgICAgIGFzc2VydCBzZWxmLnNlcS5fX3JtdWxfXyhuKSA9PSBzZWxmLnNlcSAqIDUKKworICAgIGRlZiB0ZXN0X2luZmluaXRlX3JlY3VzaW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBUcmFwMShpbnQpOgorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjbGFzcyBUcmFwMihsb25nKToKKyAgICAgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgc2VsZi5zZXEsIFRyYXAxKCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHNlbGYuc2VxLCBUcmFwMigpKQorCisKK2NsYXNzIExpc3RUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9IFswLDEwLDIwLDMwLDQwLDUwXQorCisgICAgZGVmIHRlc3Rfc2V0ZGVsaXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IC0yCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIGxzdCA9IGxpc3QoJ2FiIWNkZWZnaGkhaicpCisgICAgICAgIGRlbCBsc3Rbc2VsZi5vXQorICAgICAgICBkZWwgbHN0W3NlbGYubl0KKyAgICAgICAgbHN0W3NlbGYub10gPSAnWCcKKyAgICAgICAgbHN0W3NlbGYubl0gPSAnWScKKyAgICAgICAgYXNzZXJ0IGxzdCA9PSBsaXN0KCdhYllkZWZnaFhqJykKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTAsIDExXQorICAgICAgICBsc3QuX19zZXRpdGVtX18oc2VsZi5uLCAiaGVyZSIpCisgICAgICAgIGFzc2VydCBsc3QgPT0gWzUsIDYsICJoZXJlIiwgOCwgOSwgMTAsIDExXQorICAgICAgICBsc3QuX19kZWxpdGVtX18oc2VsZi5uKQorICAgICAgICBhc3NlcnQgbHN0ID09IFs1LCA2LCA4LCA5LCAxMCwgMTFdCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3JlcGVhdChzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDIKKyAgICAgICAgc2VsZi5uLmluZCA9IDMKKyAgICAgICAgbHN0ID0gWzYsIDRdCisgICAgICAgIGxzdCAqPSBzZWxmLm8KKyAgICAgICAgYXNzZXJ0IGxzdCA9PSBbNiwgNCwgNiwgNF0KKyAgICAgICAgbHN0ICo9IHNlbGYubgorICAgICAgICBhc3NlcnQgbHN0ID09IFs2LCA0LCA2LCA0XSAqIDMKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTFdCisgICAgICAgIGwyID0gbHN0Ll9faW11bF9fKHNlbGYubikKKyAgICAgICAgYXNzZXJ0IGwyIGlzIGxzdAorICAgICAgICBhc3NlcnQgbHN0ID09IFs1LCA2LCA3LCA4LCA5LCAxMV0gKiAzCisKKworY2xhc3MgVHVwbGVUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9ICgwLDEwLDIwLDMwLDQwLDUwKQorCitjbGFzcyBTdHJpbmdUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIHNlcSA9ICJ0aGlzIGlzIGEgdGVzdCIKKworY2xhc3MgVW5pY29kZVRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgc2VxID0gdSJ0aGlzIGlzIGEgdGVzdCIKKworCitjbGFzcyBYUmFuZ2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF94cmFuZ2Uoc2VsZik6CisgICAgICAgIG4gPSBuZXdzdHlsZSgpCisgICAgICAgIG4uaW5kID0gNQorICAgICAgICBhc3NlcnQgeHJhbmdlKDEsIDIwKVtuXSA9PSA2CisgICAgICAgIGFzc2VydCB4cmFuZ2UoMSwgMjApLl9fZ2V0aXRlbV9fKG4pID09IDYKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgTGlzdFRlc3RDYXNlLAorICAgICAgICBUdXBsZVRlc3RDYXNlLAorICAgICAgICBTdHJpbmdUZXN0Q2FzZSwKKyAgICAgICAgVW5pY29kZVRlc3RDYXNlLAorICAgICAgICBYUmFuZ2VUZXN0Q2FzZSwKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCAwYmRmOTU5Li5kOWZkOTNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC0yOTUsMTAgKzI5NSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKIAogICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgotICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEKLQorICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28sKSk6IHJldHVybiAxCiAgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhzdWJsaXN0T2ZPbmUsIFtbJ2ZvbyddXSkKIAorICAgICAgICBkZWYgZmFrZVN1Ymxpc3RPZk9uZSgoZm9vKSk6IHJldHVybiAxCisgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhmYWtlU3VibGlzdE9mT25lLCBbJ2ZvbyddKQorCiAgICAgZGVmIHRlc3RfY2xhc3NpZnlfbmV3c3R5bGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCA1OTM5ZmY1Li44YzU4NGFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtOCw2ICs4LDcgQEAKICMgVGVsbCBpdCB3ZSBkb24ndCBrbm93IGFib3V0IGV4dGVybmFsIGZpbGVzOgogbWltZXR5cGVzLmtub3duZmlsZXMgPSBbXQogbWltZXR5cGVzLmluaXRlZCA9IEZhbHNlCittaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCiAKIAogY2xhc3MgTWltZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKaW5kZXggYWVmNzkzMS4uNGQwMmRlZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC03LDEzICs3LDExNCBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKLWltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcworaW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzLCBzeXMKKworY2xhc3MgVGVzdF9NdWx0aWJ5dGVDb2RlYyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9udWxsY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZSgnZ2IxODAzMCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnJywgJ2diMTgwMzAnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5lbmNvZGUoJ2diMTgwMzAnKSwgJycpCisKKyAgICBkZWYgdGVzdF9zdHJfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmNkJy5lbmNvZGUoJ2diMTgwMzAnKSwgJ2FiY2QnKQorCisgICAgZGVmIHRlc3RfZXJyb3JjYWxsYmFja19sb25naW5kZXgoc2VsZik6CisgICAgICAgIGRlYyA9IGNvZGVjcy5nZXRkZWNvZGVyKCdldWMta3InKQorICAgICAgICBteXJlcGxhY2UgID0gbGFtYmRhIGV4YzogKHUnJywgc3lzLm1heGludCsxKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoJ3Rlc3QuY2prdGVzdCcsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGVceDkyaGFtXHg5M3NwYW0nLCAndGVzdC5jamt0ZXN0JykKKworY2xhc3MgVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RhdGVsZXNzKHNlbGYpOgorICAgICAgICAjIGNwOTQ5IGVuY29kZXIgaXNuJ3Qgc3RhdGVmdWwgYXQgYWxsLgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdWQzMGNcdWM3NzRcdWMzNmMgXHViOWM4XHVjNzQ0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4YzZceGM0XHhjMFx4Y2NceGJkXHhlMyBceGI4XHhiNlx4YzBceGJiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTI2MDZcdTIyM2NcdTI2MDYnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHhhMVx4ZDlceGExXHhhZFx4YTFceGQ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBUcnVlKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBGYWxzZSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3N0YXRlZnVsKHNlbGYpOgorICAgICAgICAjIGppc3gwMjEzIGVuY29kZXIgaXMgc3RhdGVmdWwgZm9yIGEgZmV3IGNvZGVwb2ludHMuIGVnKQorICAgICAgICAjICAgVSswMEU2ID0+IEE5REMKKyAgICAgICAgIyAgIFUrMDBFNiBVKzAzMDAgPT4gQUJDNAorICAgICAgICAjICAgVSswMzAwID0+IEFCREMKKworICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignamlzeDAyMTMnKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTZcdTAzMDAnKSwgJ1x4YWJceGM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMCcpLCAnXHhhYlx4YzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JywgVHJ1ZSksICdceGE5XHhkYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKCcnLCBUcnVlKSwgJ1x4YTlceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSgnJywgVHJ1ZSksICcnKQorCisgICAgZGVmIHRlc3Rfc3RhdGVmdWxfa2VlcF9idWZmZXIoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdqaXN4MDIxMycpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwXHUwMGU2JyksICdceGFiXHhjNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZW5jb2Rlci5lbmNvZGUsIHUnXHUwMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnJywgVHJ1ZSksICdceGE5XHhkYycpCisKKworY2xhc3MgVGVzdF9JbmNyZW1lbnRhbERlY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGJjcyhzZWxmKToKKyAgICAgICAgIyBjcDk0OSBkZWNvZGVyIGlzIHNpbXBsZSB3aXRoIG9ubHkgMSBvciAyIGJ5dGVzIHNlcXVlbmNlcy4KKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2NwOTQ5JykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGM2XHhjNFx4YzBceGNjXHhiZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXHVkMzBjXHVjNzc0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhlMyBceGI4XHhiNlx4YzBceGJiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcdWMzNmMgXHViOWM4XHVjNzQ0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnJyksIHUnJykKKworICAgIGRlZiB0ZXN0X2RiY3Nfa2VlcF9idWZmZXIoc2VsZik6CisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCdjcDk0OScpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjNlx4YzRceGMwJyksIHUnXHVkMzBjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJycsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4Y2MnKSwgdSdcdWM3NzQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4YzZceGM0XHhjMCcpLCB1J1x1ZDMwYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2Rlci5kZWNvZGUsICdceGNjXHhiZCcsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4Y2MnKSwgdSdcdWM3NzQnKQorCisgICAgZGVmIHRlc3RfaXNvMjAyMihzZWxmKToKKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2lzbzIwMjItanAnKSgpCisgICAgICAgIEVTQyA9ICdceDFiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKEVTQyArICcoJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQicsIFRydWUpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJyQnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdCQCQnKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdAJEAnKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCckJywgVHJ1ZSksIHUnXHU0ZTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0AkJyksIHUnQCQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKEVTQyArICckJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJycsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0JAJCcpLCB1J1x1NGUxNicpCisKIAogY2xhc3MgVGVzdF9TdHJlYW1Xcml0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGlmIGxlbih1J1xVMDAwMTIzNDUnKSA9PSAyOiAjIFVDUzIKICAgICAgICAgZGVmIHRlc3RfZ2IxODAzMChzZWxmKToKICAgICAgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICAgICAgICAgIGMgPSBjb2RlY3MubG9va3VwKCdnYjE4MDMwJylbM10ocykKKyAgICAgICAgICAgIGMgPSBjb2RlY3MuZ2V0d3JpdGVyKCdnYjE4MDMwJykocykKICAgICAgICAgICAgIGMud3JpdGUodScxMjMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjMnKQogICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQpAQCAtMzAsMTUgKzEzMSwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCiAKLSAgICAgICAgIyBzdGFuZGFyZCB1dGYtOCBjb2RlY3MgaGFzIGJyb2tlbiBTdHJlYW1SZWFkZXIKLSAgICAgICAgaWYgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0Ll9fY2prY29kZWNzX186Ci0gICAgICAgICAgICBkZWYgdGVzdF91dGZfOChzZWxmKToKLSAgICAgICAgICAgICAgICBzPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgICAgICAgICAgYyA9IGNvZGVjcy5sb29rdXAoJ3V0Zi04JylbM10ocykKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCi0gICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCisgICAgICAgIGRlZiB0ZXN0X3V0Zl84KHNlbGYpOgorICAgICAgICAgICAgcz0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgYyA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykocykKKyAgICAgICAgICAgIGMud3JpdGUodScxMjMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjMnKQorICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceGYwXHg5Mlx4OGRceDg1JykKKworICAgICAgICAgICAgIyBQeXRob24gdXRmLTggY29kZWMgY2FuJ3QgYnVmZmVyIHN1cnJvZ2F0ZSBwYWlycyB5ZXQuCisgICAgICAgICAgICBpZiAwOgogICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1swXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4ZjBceDkyXHg4ZFx4ODUnKQogICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1sxXSArIHUnXFUwMDAxMjM0NScgKyB1J1x1YWMwMFx1MDBhYycpCkBAIC02MSwxNCArMTYzLDYgQEAKICAgICBlbHNlOiAjIFVDUzQKICAgICAgICAgcGFzcwogCi0gICAgZGVmIHRlc3RfbnVsbGNvZGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5kZWNvZGUoJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsICdnYjE4MDMwJyksIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKCdnYjE4MDMwJyksICcnKQotCi0gICAgZGVmIHRlc3Rfc3RyX2RlY29kZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjZCcuZW5jb2RlKCdnYjE4MDMwJyksICdhYmNkJykKLQogICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcl9zdHJ3cml0ZShzZWxmKToKICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgd3IgPSBjb2RlY3MuZ2V0d3JpdGVyKCdnYjE4MDMwJykocykKQEAgLTgzLDYgKzE3Nyw5IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9NdWx0aWJ5dGVDb2RlYykpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RfSW5jcmVtZW50YWxEZWNvZGVyKSkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X1N0cmVhbVdyaXRlcikpCiAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9JU08yMDIyKSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX3N1aXRlKHN1aXRlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CmluZGV4IDQ1YTYzZTcuLmJlYzMyZGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKQEAgLTMsMTUgKzMsMTIgQEAKICMgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CiAjICAgQ29tbW9uIFVuaXR0ZXN0IFJvdXRpbmVzIGZvciBDSksgY29kZWNzCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weSx2IDEuNiAyMDA0LzA2LzE5IDA2OjA5OjU1IHBlcmt5IEV4cCAkCiAKIGltcG9ydCBzeXMsIGNvZGVjcywgb3MucGF0aAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAotX19jamtjb2RlY3NfXyA9IDAgIyBkZWZpbmUgdGhpcyBhcyAwIGZvciBweXRob24KLQogY2xhc3MgVGVzdEJhc2U6CiAgICAgZW5jb2RpbmcgICAgICAgID0gJycgICAjIGNvZGVjIG5hbWUKICAgICBjb2RlYyAgICAgICAgICAgPSBOb25lICMgY29kZWMgdHVwbGUgKHdpdGggNCBlbGVtZW50cykKQEAgLTIxLDExICsxOCwxNyBAQAogICAgIHJvdW5kdHJpcHRlc3QgICA9IDEgICAgIyBzZXQgaWYgcm91bmR0cmlwIGlzIHBvc3NpYmxlIHdpdGggdW5pY29kZQogICAgIGhhc19pc28xMDY0NiAgICA9IDAgICAgIyBzZXQgaWYgdGhpcyBlbmNvZGluZyBjb250YWlucyB3aG9sZSBpc28xMDY0NiBtYXAKICAgICB4bWxjaGFybmFtZXRlc3QgPSBOb25lICMgc3RyaW5nIHRvIHRlc3QgeG1sY2hhcnJlZnJlcGxhY2UKKyAgICB1bm1hcHBlZHVuaWNvZGUgPSB1J1x1ZGVlZScgIyBhIHVuaWNvZGUgY29kZXBvaW50IHRoYXQgaXMgbm90IG1hcHBlZC4KIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgaWYgc2VsZi5jb2RlYyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5jb2RlYyA9IGNvZGVjcy5sb29rdXAoc2VsZi5lbmNvZGluZykKLSAgICAgICAgc2VsZi5lbmNvZGUsIHNlbGYuZGVjb2RlLCBzZWxmLnJlYWRlciwgc2VsZi53cml0ZXIgPSBzZWxmLmNvZGVjCisgICAgICAgIHNlbGYuZW5jb2RlID0gc2VsZi5jb2RlYy5lbmNvZGUKKyAgICAgICAgc2VsZi5kZWNvZGUgPSBzZWxmLmNvZGVjLmRlY29kZQorICAgICAgICBzZWxmLnJlYWRlciA9IHNlbGYuY29kZWMuc3RyZWFtcmVhZGVyCisgICAgICAgIHNlbGYud3JpdGVyID0gc2VsZi5jb2RlYy5zdHJlYW13cml0ZXIKKyAgICAgICAgc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIgPSBzZWxmLmNvZGVjLmluY3JlbWVudGFsZW5jb2RlcgorICAgICAgICBzZWxmLmluY3JlbWVudGFsZGVjb2RlciA9IHNlbGYuY29kZWMuaW5jcmVtZW50YWxkZWNvZGVyCiAKICAgICBkZWYgdGVzdF9jaHVua2NvZGluZyhzZWxmKToKICAgICAgICAgZm9yIG5hdGl2ZSwgdXRmOCBpbiB6aXAoKltTdHJpbmdJTyhmKS5yZWFkbGluZXMoKQpAQCAtNDcsNTEgKzUwLDE1NSBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGZ1bmMsIHNvdXJjZSwgc2NoZW1lKQogCi0gICAgaWYgc3lzLmhleHZlcnNpb24gPj0gMHgwMjAzMDAwMDoKLSAgICAgICAgZGVmIHRlc3RfeG1sY2hhcnJlZnJlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICBkZWYgdGVzdF94bWxjaGFycmVmcmVwbGFjZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNfaXNvMTA2NDY6CisgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAgICAgcyA9IHUiXHUwYjEzXHUwYjIzXHUwYjYwIG5kIGVnZ3MiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlKHMsICJ4bWxjaGFycmVmcmVwbGFjZSIpWzBdLAotICAgICAgICAgICAgICAgICImIzI4MzU7JiMyODUxOyYjMjkxMjsgbmQgZWdncyIKLSAgICAgICAgICAgICkKKyAgICAgICAgcyA9IHUiXHUwYjEzXHUwYjIzXHUwYjYwIG5kIGVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmVuY29kZShzLCAieG1sY2hhcnJlZnJlcGxhY2UiKVswXSwKKyAgICAgICAgICAgICImIzI4MzU7JiMyODUxOyYjMjkxMjsgbmQgZWdncyIKKyAgICAgICAgKQogCi0gICAgICAgIGRlZiB0ZXN0X2N1c3RvbXJlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKLSAgICAgICAgICAgICAgICByZXR1cm4KKyAgICBkZWYgdGVzdF9jdXN0b21yZXBsYWNlX2VuY29kZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNfaXNvMTA2NDY6CisgICAgICAgICAgICByZXR1cm4KIAotICAgICAgICAgICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCisgICAgICAgIGZyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGNvZGVwb2ludDJuYW1lCiAKLSAgICAgICAgICAgIG5hbWVzID0ge30KLSAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gaHRtbGVudGl0eWRlZnMuZW50aXR5ZGVmcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIGlmIGxlbih2YWx1ZSk9PTE6Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzW3ZhbHVlLmRlY29kZSgnbGF0aW4tMScpXSA9IHNlbGYuZGVjb2RlKGtleSlbMF0KKyAgICAgICAgZGVmIHhtbGNoYXJuYW1lcmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgIGwgPSBbXQorICAgICAgICAgICAgZm9yIGMgaW4gZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF06CisgICAgICAgICAgICAgICAgaWYgb3JkKGMpIGluIGNvZGVwb2ludDJuYW1lOgorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYlczsiICUgY29kZXBvaW50Mm5hbWVbb3JkKGMpXSkKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBuYW1lc1t1bmljaHIoaW50KHZhbHVlWzI6LTFdKSldID0gc2VsZi5kZWNvZGUoa2V5KVswXQorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYjJWQ7IiAlIG9yZChjKSkKKyAgICAgICAgICAgIHJldHVybiAodSIiLmpvaW4obCksIGV4Yy5lbmQpCiAKLSAgICAgICAgICAgIGRlZiB4bWxjaGFybmFtZXJlcGxhY2UoZXhjKToKLSAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKLSAgICAgICAgICAgICAgICBsID0gW10KLSAgICAgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQodSImJXM7IiAlIG5hbWVzW2NdKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYjJWQ7IiAlIG9yZChjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHUiIi5qb2luKGwpLCBleGMuZW5kKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiwgeG1sY2hhcm5hbWVyZXBsYWNlKQogCi0gICAgICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoCi0gICAgICAgICAgICAgICAgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiwgeG1sY2hhcm5hbWVyZXBsYWNlKQorICAgICAgICBpZiBzZWxmLnhtbGNoYXJuYW1ldGVzdDoKKyAgICAgICAgICAgIHNpbiwgc291dCA9IHNlbGYueG1sY2hhcm5hbWV0ZXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaW4gPSB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMzJhIgorICAgICAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUoc2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIilbMF0sIHNvdXQpCiAKLSAgICAgICAgICAgIGlmIHNlbGYueG1sY2hhcm5hbWV0ZXN0OgotICAgICAgICAgICAgICAgIHNpbiwgc291dCA9IHNlbGYueG1sY2hhcm5hbWV0ZXN0CisgICAgZGVmIHRlc3RfY2FsbGJhY2tfd3Jvbmdfb2JqZWN0cyhzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuIChyZXQsIGV4Yy5lbmQpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorCisgICAgICAgIGZvciByZXQgaW4gKFsxLCAyLCAzXSwgW10sIE5vbmUsIG9iamVjdCgpLCAnc3RyaW5nJywgJycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVuY29kZSwgc2VsZi51bm1hcHBlZHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2xvbmdfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSd4JywgbG9uZyhleGMuZW5kKSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUodSdhYmNkJyArIHNlbGYudW5tYXBwZWR1bmljb2RlICsgdSdlZmdoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JyksICgnYWJjZHhlZmdoJywgOSkpCisKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J3gnLCBzeXMubWF4aW50ICsgMSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19Ob25lX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUneCcsIE5vbmUpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19iYWNrd2FyZF9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbXlyZXBsYWNlLmxpbWl0ID4gMDoKKyAgICAgICAgICAgICAgICBteXJlcGxhY2UubGltaXQgLT0gMQorICAgICAgICAgICAgICAgIHJldHVybiAodSdSRVBMQUNFRCcsIDApCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNpbiA9IHUiXHhhYlx1MjExY1x4YmIgPSBcdTIzMjlcdTEyMzRcdTIzMmEiCi0gICAgICAgICAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmcmFuZzsiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHNpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKVswXSwgc291dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUnVEVSTUlOQUwnLCBleGMuZW5kKQorICAgICAgICBteXJlcGxhY2UubGltaXQgPSAzCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLAorICAgICAgICAgICAgICAgICgnYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFRFUk1JTkFMZWZnaCcsIDkpKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfZm9yd2FyZF9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J1JFUExBQ0VEJywgZXhjLmVuZCArIDIpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLCAoJ2FiY2RSRVBMQUNFRGdoJywgOSkpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbmRleF9vdXRvZmJvdW5kKHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnVEVSTScsIDEwMCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXIoc2VsZik6CisgICAgICAgIFVURjhSZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCisgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFVURjhSZWFkZXIoU3RyaW5nSU8oc2VsZi50c3RyaW5nWzFdKSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBTdHJpbmdJTygpCisgICAgICAgICAgICBlbmNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBzaXplaGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZChzaXplaGludCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGUgPSBlbmNvZGVyLmVuY29kZShkYXRhKQorICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1swXSkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZGVjb2RlcihzZWxmKToKKyAgICAgICAgVVRGOFdyaXRlciA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lLCAtMV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFN0cmluZ0lPKHNlbGYudHN0cmluZ1swXSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBVVEY4V3JpdGVyKFN0cmluZ0lPKCkpCisgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGRlY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKHNpemVoaW50KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHUgPSBkZWNvZGVyLmRlY29kZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKHUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBzZWxmLnRzdHJpbmdbMV0pCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXJfZXJyb3JfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGludiA9IHNlbGYudW5tYXBwZWR1bmljb2RlCisKKyAgICAgICAgZSA9IHNlbGYuaW5jcmVtZW50YWxlbmNvZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlLmVuY29kZSwgaW52LCBUcnVlKQorCisgICAgICAgIGUuZXJyb3JzID0gJ2lnbm9yZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVuY29kZShpbnYsIFRydWUpLCAnJykKKworICAgICAgICBlLnJlc2V0KCkKKyAgICAgICAgZGVmIHRlbXByZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnY2FsbGVkJywgZXhjLmVuZCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCd0ZXN0LmluY3JlbWVudGFsX2Vycm9yX2NhbGxiYWNrJywgdGVtcHJlcGxhY2UpCisgICAgICAgIGUuZXJyb3JzID0gJ3Rlc3QuaW5jcmVtZW50YWxfZXJyb3JfY2FsbGJhY2snCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJ2NhbGxlZCcpCisKKyAgICAgICAgIyBhZ2FpbgorICAgICAgICBlLmVycm9ycyA9ICdpZ25vcmUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJycpCiAKICAgICBkZWYgdGVzdF9zdHJlYW1yZWFkZXIoc2VsZik6CiAgICAgICAgIFVURjhXcml0ZXIgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpCkBAIC0xMTMsMTEgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1sxXSkKIAogICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcihzZWxmKToKLSAgICAgICAgaWYgX19jamtjb2RlY3NfXzoKLSAgICAgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsICdyZWFkbGluZScsICdyZWFkbGluZXMnKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBzdGFuZGFyZCB1dGY4IGNvZGVjIGhhcyBicm9rZW4gcmVhZGxpbmUgYW5kIHJlYWRsaW5lcy4KLSAgICAgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsKQorICAgICAgICByZWFkZnVuY3MgPSAoJ3JlYWQnLCAncmVhZGxpbmUnLCAncmVhZGxpbmVzJykKICAgICAgICAgVVRGOFJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICAgZm9yIG5hbWUgaW4gcmVhZGZ1bmNzOgogICAgICAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDMzKSArIFwKQEAgLTIxMSwxMCArMzE0LDUgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShjc2V0Y2gsIHNlbGYuZW5jb2RpbmcpLCB1bmljaCkKIAogZGVmIGxvYWRfdGVzdHN0cmluZyhlbmNvZGluZyk6Ci0gICAgaWYgX19jamtjb2RlY3NfXzoKLSAgICAgICAgZXR4dCA9IG9wZW4ob3MucGF0aC5qb2luKCdzYW1wbGV0ZXh0cycsIGVuY29kaW5nKSArICcudHh0JykucmVhZCgpCi0gICAgICAgIHV0eHQgPSBvcGVuKG9zLnBhdGguam9pbignc2FtcGxldGV4dHMnLCBlbmNvZGluZykgKyAnLnV0ZjgnKS5yZWFkKCkKLSAgICAgICAgcmV0dXJuIChldHh0LCB1dHh0KQotICAgIGVsc2U6Ci0gICAgICAgIGZyb20gdGVzdCBpbXBvcnQgY2prZW5jb2RpbmdzX3Rlc3QKLSAgICAgICAgcmV0dXJuIGNqa2VuY29kaW5nc190ZXN0LnRlc3RzdHJpbmdbZW5jb2RpbmddCisgICAgZnJvbSB0ZXN0IGltcG9ydCBjamtlbmNvZGluZ3NfdGVzdAorICAgIHJldHVybiBjamtlbmNvZGluZ3NfdGVzdC50ZXN0c3RyaW5nW2VuY29kaW5nXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggY2Y4M2Q3NS4uZjY1NmI5ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xMzgyLDggKzEzODIsMTUgQEAKIAogY2xhc3MgVGVzdEhlbHAoQmFzZVRlc3QpOgogICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vcmlnX2NvbHVtbnMgPSBvcy5lbnZpcm9uLmdldCgnQ09MVU1OUycpCiAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig4MCkKIAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vcmlnX2NvbHVtbnMgaXMgTm9uZToKKyAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWydDT0xVTU5TJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ0NPTFVNTlMnXSA9IHNlbGYub3JpZ19jb2x1bW5zCisKICAgICBkZWYgbWFrZV9wYXJzZXIoc2VsZiwgY29sdW1ucyk6CiAgICAgICAgIG9wdGlvbnMgPSBbCiAgICAgICAgICAgICBtYWtlX29wdGlvbigiLWEiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSdhJywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKaW5kZXggNzcxZmU5ZC4uOGFhMTY1NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkKQEAgLTUxLDYgKzUxLDEwIEBACiAgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiWzEsIDIsIDNdIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCldIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDNdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJbeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDIgaWYgeCAlIDNdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgqKjMgZm9yIHggaW4gcmFuZ2UoMjApKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxpc3QoeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDIgaWYgeCAlIDMpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKmFyZ3MpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKmFyZ3MsICoqa3cpIikKICAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oKiprdykiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weSBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKaW5kZXggMjAwZmJhNS4uMjIzMDdjZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC02Myw3ICs2MywxMiBAQAogICAgICAgICByZXMgPSBwbGF0Zm9ybS5kaXN0KCkKIAogICAgIGRlZiB0ZXN0X2xpYmNfdmVyKHNlbGYpOgotICAgICAgICByZXMgPSBwbGF0Zm9ybS5saWJjX3ZlcigpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBleGVjdXRhYmxlCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGV4ZWN1dGFibGUpIGFuZCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKycuZXhlJyk6CisgICAgICAgICAgICAjIEN5Z3dpbiBob3Jyb3IKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlICsgJy5leGUnCisgICAgICAgIHJlcyA9IHBsYXRmb3JtLmxpYmNfdmVyKGV4ZWN1dGFibGUpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQppbmRleCAxODE0MmVjLi40ZGIzY2QxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQpAQCAtMzUsNiArMzUsOSBAQAogICAgICMgc2FtZSB0ZXN0IGFzIHBvcGVuMi5fdGVzdCgpLCBidXQgdXNpbmcgdGhlIG9zLnBvcGVuKigpIEFQSQogICAgIHByaW50ICJUZXN0aW5nIG9zIG1vZHVsZToiCiAgICAgaW1wb3J0IHBvcGVuMgorICAgICMgV2hlbiB0aGUgdGVzdCBydW5zLCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IG9wZW4gcGlwZXMKKyAgICBwb3BlbjIuX2NsZWFudXAoKQorICAgIGFzc2VydCBub3QgcG9wZW4yLl9hY3RpdmUsICJBY3RpdmUgcGlwZXMgd2hlbiB0ZXN0IHN0YXJ0cyAiICsgcmVwcihbYy5jbWQgZm9yIGMgaW4gcG9wZW4yLl9hY3RpdmVdKQogICAgIGNtZCAgPSAiY2F0IgogICAgIHRlc3RzdHIgPSAiYWIgY2RcbiIKICAgICBpZiBvcy5uYW1lID09ICJudCI6CkBAIC02NSw2ICs2OCw3IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQgJXIgb24gc3RkZXJyIiAlIChnb3QsKSkKICAgICBmb3IgaW5zdCBpbiBwb3BlbjIuX2FjdGl2ZVs6XToKICAgICAgICAgaW5zdC53YWl0KCkKKyAgICBwb3BlbjIuX2NsZWFudXAoKQogICAgIGlmIHBvcGVuMi5fYWN0aXZlOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJfYWN0aXZlIG5vdCBlbXB0eSIpCiAgICAgcHJpbnQgIkFsbCBPSyIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CmluZGV4IDFjY2M2MmIuLmY5OGM3MjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtNzMsNiArNzMsMTEgQEAKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogCisgICAgZGVmIHRlc3RfY29uZnN0cihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2NvbmZzdHInKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvc2l4LmNvbmZzdHIsICJDU19nYXJiYWdlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvc2l4LmNvbmZzdHIoIkNTX1BBVEgiKSkgPiAwLCBUcnVlKQorCiAgICAgZGVmIHRlc3RfZHVwMihzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2R1cDInKToKICAgICAgICAgICAgIGZwMSA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKaW5kZXggZjhhZTQ3OS4uOTllMDFiNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKQEAgLTE4LDYgKzE4LDI3IEBACiAgICAgZGVmIGRlYnVnKG1zZyk6CiAgICAgICAgIHBhc3MKIAorZGVmIG5vcm1hbGl6ZV9vdXRwdXQoZGF0YSk6CisgICAgIyBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGRvIGNvbnZlcnNpb25zIG9uIG5ld2xpbmUuICBXZSBjb3VsZCBwb3NzaWJseQorICAgICMgZml4IHRoYXQgYnkgZG9pbmcgdGhlIGFwcHJvcHJpYXRlIHRlcm1pb3MudGNzZXRhdHRyKClzLiAgSSBjb3VsZG4ndAorICAgICMgZmlndXJlIG91dCB0aGUgcmlnaHQgY29tYm8gb24gVHJ1NjQgYW5kIEkgZG9uJ3QgaGF2ZSBhbiBJUklYIGJveC4KKyAgICAjIFNvIGp1c3Qgbm9ybWFsaXplIHRoZSBvdXRwdXQgYW5kIGRvYyB0aGUgcHJvYmxlbSBPL1NlcyBieSBhbGxvd2luZworICAgICMgY2VydGFpbiBjb21iaW5hdGlvbnMgZm9yIHNvbWUgcGxhdGZvcm1zLCBidXQgYXZvaWQgYWxsb3dpbmcgb3RoZXIKKyAgICAjIGRpZmZlcmVuY2VzIChsaWtlIGV4dHJhIHdoaXRlc3BhY2UsIHRyYWlsaW5nIGdhcmJhZ2UsIGV0Yy4pCisKKyAgICAjIFRoaXMgaXMgYWJvdXQgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgZ2V0dGluZyBzb21lIGZlZWRiYWNrCisgICAgIyBmcm9tIHNvbWVvbmUgbW9yZSBrbm93bGVkZ2FibGUuCisKKyAgICAjIE9TRi8xIChUcnU2NCkgYXBwYXJlbnRseSB0dXJucyBcbiBpbnRvIFxyXHJcbi4KKyAgICBpZiBkYXRhLmVuZHN3aXRoKCdcclxyXG4nKToKKyAgICAgICAgcmV0dXJuIGRhdGFbOi0zXSArICdcbicKKworICAgICMgSVJJWCBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcbi4KKyAgICBpZiBkYXRhLmVuZHN3aXRoKCdcclxuJyk6CisgICAgICAgIHJldHVybiBkYXRhWzotMl0gKyAnXG4nCisKKyAgICByZXR1cm4gZGF0YQorCiAjIE1hcmdpbmFsIHRlc3Rpbmcgb2YgcHR5IHN1aXRlLiBDYW5ub3QgZG8gZXh0ZW5zaXZlICdkbyBvciBmYWlsJyB0ZXN0aW5nCiAjIGJlY2F1c2UgcHR5IGNvZGUgaXMgbm90IHRvbyBwb3J0YWJsZS4KIApAQCAtMzYsMTkgKzU3LDE2IEBACiAgICAgaWYgbm90IG9zLmlzYXR0eShzbGF2ZV9mZCkgYW5kIHN5cy5wbGF0Zm9ybSBub3QgaW4gZmlja2xlX2lzYXR0eToKICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgInNsYXZlX2ZkIGlzIG5vdCBhIHR0eSIKIAotICAgICMgSVJJWCBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcbi4gQWxsb3cgdGhhdCwgYnV0IGF2b2lkIGFsbG93aW5nIG90aGVyCi0gICAgIyBkaWZmZXJlbmNlcyAobGlrZSBleHRyYSB3aGl0ZXNwYWNlLCB0cmFpbGluZyBnYXJiYWdlLCBldGMuKQotCiAgICAgZGVidWcoIldyaXRpbmcgdG8gc2xhdmVfZmQiKQogICAgIG9zLndyaXRlKHNsYXZlX2ZkLCBURVNUX1NUUklOR18xKQogICAgIHMxID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCi0gICAgc3lzLnN0ZG91dC53cml0ZShzMS5yZXBsYWNlKCJcclxuIiwgIlxuIikpCisgICAgc3lzLnN0ZG91dC53cml0ZShub3JtYWxpemVfb3V0cHV0KHMxKSkKIAogICAgIGRlYnVnKCJXcml0aW5nIGNodW5rZWQgb3V0cHV0IikKICAgICBvcy53cml0ZShzbGF2ZV9mZCwgVEVTVF9TVFJJTkdfMls6NV0pCiAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzJbNTpdKQogICAgIHMyID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCi0gICAgc3lzLnN0ZG91dC53cml0ZShzMi5yZXBsYWNlKCJcclxuIiwgIlxuIikpCisgICAgc3lzLnN0ZG91dC53cml0ZShub3JtYWxpemVfb3V0cHV0KHMyKSkKIAogICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQogICAgIG9zLmNsb3NlKG1hc3Rlcl9mZCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggMGViN2Q5MC4uMjQxMGIwMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShweV9pdGVtLCAoRnVuY3Rpb25UeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlKSkpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKSkKKyAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgY2xhc3NlcyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQorCiAgICAgICAgICAgICAgICAgcmVhbF9iYXNlcyA9IFtiYXNlLl9fbmFtZV9fIGZvciBiYXNlIGluIHB5X2l0ZW0uX19iYXNlc19fXQogICAgICAgICAgICAgICAgIHB5Y2xicl9iYXNlcyA9IFsgZ2V0YXR0cihiYXNlLCAnbmFtZScsIGJhc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiB2YWx1ZS5zdXBlciBdCkBAIC0xNzIsNyArMTc1LDcgQEAKICAgICAgICAgY20oJ3B5ZG9jJykKIAogICAgICAgICAjIFRlc3RzIGZvciBtb2R1bGVzIGluc2lkZSBwYWNrYWdlcwotICAgICAgICBjbSgnZW1haWwuUGFyc2VyJykKKyAgICAgICAgY20oJ2VtYWlsLnBhcnNlcicpCiAgICAgICAgIGNtKCd0ZXN0LnRlc3RfcHljbGJyJykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQppbmRleCBiNTVkZDAxLi42Njk3N2U2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTIyMSw3ICsyMjEsNTEgQEAKICAgICBfZG9CbG9ja2luZ1Rlc3QocS5nZXQsICgpLCBxLnB1dCwgKCdlbXB0eScsKSkKICAgICBfZG9CbG9ja2luZ1Rlc3QocS5nZXQsIChUcnVlLCAxMCksIHEucHV0LCAoJ2VtcHR5JywpKQogCitjdW0gPSAwCitjdW1sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCitkZWYgd29ya2VyKHEpOgorICAgIGdsb2JhbCBjdW0KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB4ID0gcS5nZXQoKQorICAgICAgICBpZiB4IGlzIE5vbmU6CisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY3VtbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VtICs9IHgKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1bWxvY2sucmVsZWFzZSgpCisgICAgICAgIHEudGFza19kb25lKCkKKworZGVmIFF1ZXVlSm9pblRlc3QocSk6CisgICAgZ2xvYmFsIGN1bQorICAgIGN1bSA9IDAKKyAgICBmb3IgaSBpbiAoMCwxKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d29ya2VyLCBhcmdzPShxLCkpLnN0YXJ0KCkKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgcS5wdXQoaSkKKyAgICBxLmpvaW4oKQorICAgIHZlcmlmeShjdW09PXN1bShyYW5nZSgxMDApKSwgInEuam9pbigpIGRpZCBub3QgYmxvY2sgdW50aWwgYWxsIHRhc2tzIHdlcmUgZG9uZSIpCisgICAgZm9yIGkgaW4gKDAsMSk6CisgICAgICAgIHEucHV0KE5vbmUpICAgICAgICAgIyBpbnN0cnVjdCB0aGUgdGhyZWFkcyB0byBjbG9zZQorICAgIHEuam9pbigpICAgICAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgeW91IGNhbiBqb2luIHR3aWNlCisKK2RlZiBRdWV1ZVRhc2tEb25lVGVzdChxKToKKyAgICB0cnk6CisgICAgICAgIHEudGFza19kb25lKCkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkRpZCBub3QgZGV0ZWN0IHRhc2sgY291bnQgZ29pbmcgbmVnYXRpdmUiKQorCiBkZWYgdGVzdCgpOgorICAgIHEgPSBRdWV1ZS5RdWV1ZSgpCisgICAgUXVldWVUYXNrRG9uZVRlc3QocSkKKyAgICBRdWV1ZUpvaW5UZXN0KHEpCisgICAgUXVldWVKb2luVGVzdChxKQorICAgIFF1ZXVlVGFza0RvbmVUZXN0KHEpCisKICAgICBxID0gUXVldWUuUXVldWUoUVVFVUVfU0laRSkKICAgICAjIERvIGl0IGEgY291cGxlIG9mIHRpbWVzIG9uIHRoZSBzYW1lIHF1ZXVlCiAgICAgU2ltcGxlUXVldWVUZXN0KHEpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weSBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CmluZGV4IGVkNjZkZmMuLjYzMWM5NzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5CkBAIC0xLDcgKzEsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCi1pbXBvcnQgc3lzLCBvcywgY1N0cmluZ0lPCitpbXBvcnQgc3lzLCBvcywgY1N0cmluZ0lPLCBzdWJwcm9jZXNzCiBpbXBvcnQgcXVvcHJpCiAKIApAQCAtMTc2LDE3ICsxNzYsMjAgQEAKIAogICAgIGRlZiB0ZXN0X3NjcmlwdGVuY29kZShzZWxmKToKICAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQotICAgICAgICAoY2luLCBjb3V0KSA9IG9zLnBvcGVuMigiJXMgLW1xdW9wcmkiICUgc3lzLmV4ZWN1dGFibGUpCi0gICAgICAgIGNpbi53cml0ZShwKQotICAgICAgICBjaW4uY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oY291dC5yZWFkKCkgPT0gZSkKKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLW1xdW9wcmkiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBjb3V0LCBjZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZShwKQorICAgICAgICAjIE9uIFdpbmRvd3MsIFB5dGhvbiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0IHRvIHN0ZG91dCB1c2luZworICAgICAgICAjIENSTEYsIGFzIHRoZSBtb2RlIG9mIHN0ZG91dCBpcyB0ZXh0IG1vZGUuIFRvIGNvbXBhcmUgdGhpcworICAgICAgICAjIHdpdGggdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UgbmVlZCB0byBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uLgorICAgICAgICBzZWxmLmFzc2VydF8oY291dC5zcGxpdGxpbmVzKCkgPT0gZS5zcGxpdGxpbmVzKCkpCiAKICAgICBkZWYgdGVzdF9zY3JpcHRkZWNvZGUoc2VsZik6CiAgICAgICAgIChwLCBlKSA9IHNlbGYuU1RSSU5HU1stMV0KLSAgICAgICAgKGNpbiwgY291dCkgPSBvcy5wb3BlbjIoIiVzIC1tcXVvcHJpIC1kIiAlIHN5cy5leGVjdXRhYmxlKQotICAgICAgICBjaW4ud3JpdGUoZSkKLSAgICAgICAgY2luLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvdXQucmVhZCgpID09IHApCisgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1tcXVvcHJpIiwgIi1kIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgY291dCwgY2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGNvdXQuc3BsaXRsaW5lcygpID09IHAuc3BsaXRsaW5lcygpKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChRdW9wcmlUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKaW5kZXggOWMyZTBkMC4uYmJhNGM3YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkKQEAgLTkzLDEwICs5MywyOSBAQAogICAgICAgICBzZWxmLmdlbi5zYW1wbGUoc2V0KHJhbmdlKDIwKSksIDIpCiAgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShyYW5nZSgyMCksIDIpCiAgICAgICAgIHNlbGYuZ2VuLnNhbXBsZSh4cmFuZ2UoMjApLCAyKQotICAgICAgICBzZWxmLmdlbi5zYW1wbGUoZGljdC5mcm9ta2V5cygnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHN0cignYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHR1cGxlKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQogCisgICAgZGVmIHRlc3Rfc2FtcGxlX29uX2RpY3RzKHNlbGYpOgorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoZGljdC5mcm9ta2V5cygnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKKworICAgICAgICAjIFNGIGJ1ZyAjMTQ2MDM0MCAtLSByYW5kb20uc2FtcGxlIGNhbiByYWlzZSBLZXlFcnJvcgorICAgICAgICBhID0gZGljdC5mcm9ta2V5cyhyYW5nZSgxMCkrcmFuZ2UoMTAsMTAwLDIpK3JhbmdlKDEwMCwxMTApKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoYSwgMykKKworICAgICAgICAjIEEgZm9sbG93dXAgdG8gYnVnICMxNDYwMzQwOiAgc2FtcGxpbmcgZnJvbSBhIGRpY3QgY291bGQgcmV0dXJuCisgICAgICAgICMgYSBzdWJzZXQgb2YgaXRzIGtleXMgb3Igb2YgaXRzIHZhbHVlcywgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mCisgICAgICAgICMgdGhlIHN1YnNldCByZXF1ZXN0ZWQuCisgICAgICAgIE4gPSAzMAorICAgICAgICBkID0gZGljdCgoaSwgY29tcGxleChpLCBpKSkgZm9yIGkgaW4geHJhbmdlKE4pKQorICAgICAgICBmb3IgayBpbiB4cmFuZ2UoTisxKToKKyAgICAgICAgICAgIHNhbXAgPSBzZWxmLmdlbi5zYW1wbGUoZCwgaykKKyAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgZ290IGludHMgYmFjayAoa2V5cyk7IHRoZSB2YWx1ZXMgYXJlIGNvbXBsZXguCisgICAgICAgICAgICBmb3IgeCBpbiBzYW1wOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHgpIGlzIGludCkKKyAgICAgICAgc2FtcC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wLCByYW5nZShOKSkKKwogICAgIGRlZiB0ZXN0X2dhdXNzKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzZWVkKCkgbWV0aG9kIGluaXRpYWxpemVzIGFsbCB0aGUgaGlkZGVuIHN0YXRlLiAgSW4KICAgICAgICAgIyBwYXJ0aWN1bGFyLCB0aHJvdWdoIDIuMi4xIGl0IGZhaWxlZCB0byByZXNldCBhIHBpZWNlIG9mIHN0YXRlIHVzZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVnZXgucHkgYi9MaWIvdGVzdC90ZXN0X3JlZ2V4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTJjOGY2NS4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlZ2V4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHNvcnRkaWN0Ci1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGhlIHJlZ2V4IG1vZHVsZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgX19uYW1lX18pCi1pbXBvcnQgcmVnZXgKLWZyb20gcmVnZXhfc3ludGF4IGltcG9ydCAqCi0KLXJlID0gJ2ErYitjKycKLXByaW50ICdubyBtYXRjaDonLCByZWdleC5tYXRjaChyZSwgJ2hlbGxvIGFhYWFiY2NjYyB3b3JsZCcpCi1wcmludCAnc3VjY2Vzc2Z1bCBzZWFyY2g6JywgcmVnZXguc2VhcmNoKHJlLCAnaGVsbG8gYWFhYWJjY2NjIHdvcmxkJykKLXRyeToKLSAgICBjcmUgPSByZWdleC5jb21waWxlKCdcKCcgKyByZSkKLWV4Y2VwdCByZWdleC5lcnJvcjoKLSAgICBwcmludCAnY2F1Z2h0IGV4cGVjdGVkIGV4Y2VwdGlvbicKLWVsc2U6Ci0gICAgcHJpbnQgJ2V4cGVjdGVkIHJlZ2V4LmVycm9yIG5vdCByYWlzZWQnCi0KLXByaW50ICdmYWlsZWQgYXdrIHN5bnRheDonLCByZWdleC5zZWFyY2goJyhhKyl8KGIrKScsICdjZGInKQotcHJldiA9IHJlZ2V4LnNldF9zeW50YXgoUkVfU1lOVEFYX0FXSykKLXByaW50ICdzdWNjZXNzZnVsIGF3ayBzeW50YXg6JywgcmVnZXguc2VhcmNoKCcoYSspfChiKyknLCAnY2RiJykKLXJlZ2V4LnNldF9zeW50YXgocHJldikKLXByaW50ICdmYWlsZWQgYXdrIHN5bnRheDonLCByZWdleC5zZWFyY2goJyhhKyl8KGIrKScsICdjZGInKQotCi1yZSA9ICdcKDxvbmU+WzAtOV0rXCkgKlwoPHR3bz5bMC05XStcKScKLXByaW50ICdtYXRjaGluZyB3aXRoIGdyb3VwIG5hbWVzIGFuZCBjb21waWxlKCknCi1jcmUgPSByZWdleC5jb21waWxlKHJlKQotcHJpbnQgY3JlLm1hdGNoKCc4MDEgOTk5JykKLXRyeToKLSAgICBwcmludCBjcmUuZ3JvdXAoJ29uZScpCi1leGNlcHQgcmVnZXguZXJyb3I6Ci0gICAgcHJpbnQgJ2NhdWdodCBleHBlY3RlZCBleGNlcHRpb24nCi1lbHNlOgotICAgIHByaW50ICdleHBlY3RlZCByZWdleC5lcnJvciBub3QgcmFpc2VkJwotCi1wcmludCAnbWF0Y2hpbmcgd2l0aCBncm91cCBuYW1lcyBhbmQgc3ltY29tcCgpJwotY3JlID0gcmVnZXguc3ltY29tcChyZSkKLXByaW50IGNyZS5tYXRjaCgnODAxIDk5OScpCi1wcmludCBjcmUuZ3JvdXAoMCkKLXByaW50IGNyZS5ncm91cCgnb25lJykKLXByaW50IGNyZS5ncm91cCgxLCAyKQotcHJpbnQgY3JlLmdyb3VwKCdvbmUnLCAndHdvJykKLXByaW50ICdyZWFscGF0OicsIGNyZS5yZWFscGF0Ci1wcmludCAnZ3JvdXBpbmRleDonLCBzb3J0ZGljdChjcmUuZ3JvdXBpbmRleCkKLQotcmUgPSAnd29ybGQnCi1jcmUgPSByZWdleC5jb21waWxlKHJlKQotcHJpbnQgJ25vdCBjYXNlIGZvbGRlZCBzZWFyY2g6JywgY3JlLnNlYXJjaCgnSEVMTE8gV09STEQnKQotY3JlID0gcmVnZXguY29tcGlsZShyZSwgcmVnZXguY2FzZWZvbGQpCi1wcmludCAnY2FzZSBmb2xkZWQgc2VhcmNoOicsIGNyZS5zZWFyY2goJ0hFTExPIFdPUkxEJykKLQotcHJpbnQgJ19fbWVtYmVyc19fOicsIGNyZS5fX21lbWJlcnNfXwotcHJpbnQgJ3JlZ3M6JywgY3JlLnJlZ3MKLXByaW50ICdsYXN0OicsIGNyZS5sYXN0Ci1wcmludCAndHJhbnNsYXRlOicsIGxlbihjcmUudHJhbnNsYXRlKQotcHJpbnQgJ2dpdmVucGF0OicsIGNyZS5naXZlbnBhdAotCi1wcmludCAnbWF0Y2ggd2l0aCBwb3M6JywgY3JlLm1hdGNoKCdoZWxsbyB3b3JsZCcsIDcpCi1wcmludCAnc2VhcmNoIHdpdGggcG9zOicsIGNyZS5zZWFyY2goJ2hlbGxvIHdvcmxkIHRoZXJlIHdvcmxkJywgNykKLXByaW50ICdib2d1cyBncm91cDonLCBjcmUuZ3JvdXAoMCwgMSwgMykKLXRyeToKLSAgICBwcmludCAnbm8gbmFtZTonLCBjcmUuZ3JvdXAoJ29uZScpCi1leGNlcHQgcmVnZXguZXJyb3I6Ci0gICAgcHJpbnQgJ2NhdWdodCBleHBlY3RlZCBleGNlcHRpb24nCi1lbHNlOgotICAgIHByaW50ICdleHBlY3RlZCByZWdleC5lcnJvciBub3QgcmFpc2VkJwotCi1mcm9tIHJlZ2V4X3Rlc3RzIGltcG9ydCAqCi1pZiB2ZXJib3NlOiBwcmludCAnUnVubmluZyByZWdleF90ZXN0cyB0ZXN0IHN1aXRlJwotCi1mb3IgdCBpbiB0ZXN0czoKLSAgICBwYXR0ZXJuPXM9b3V0Y29tZT1yZXBsPWV4cGVjdGVkPU5vbmUKLSAgICBpZiBsZW4odCk9PTU6Ci0gICAgICAgIHBhdHRlcm4sIHMsIG91dGNvbWUsIHJlcGwsIGV4cGVjdGVkID0gdAotICAgIGVsaWYgbGVuKHQpPT0zOgotICAgICAgICBwYXR0ZXJuLCBzLCBvdXRjb21lID0gdAotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICgnVGVzdCB0dXBsZXMgc2hvdWxkIGhhdmUgMyBvciA1IGZpZWxkcycsdCkKLQotICAgIHRyeToKLSAgICAgICAgb2JqPXJlZ2V4LmNvbXBpbGUocGF0dGVybikKLSAgICBleGNlcHQgcmVnZXguZXJyb3I6Ci0gICAgICAgIGlmIG91dGNvbWU9PVNZTlRBWF9FUlJPUjogcGFzcyAgICAjIEV4cGVjdGVkIGEgc3ludGF4IGVycm9yCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFJlZ2V4IHN5bnRheCBlcnJvcnMgYXJlbid0IHlldCByZXBvcnRlZCwgc28gZm9yCi0gICAgICAgICAgICAjIHRoZSBvZmZpY2lhbCB0ZXN0IHN1aXRlIHRoZXknbGwgYmUgcXVpZXRseSBpZ25vcmVkLgotICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgI3ByaW50ICc9PT0gU3ludGF4IGVycm9yOicsIHQKLSAgICBlbHNlOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXN1bHQ9b2JqLnNlYXJjaChzKQotICAgICAgICBleGNlcHQgcmVnZXguZXJyb3IsIG1zZzoKLSAgICAgICAgICAgIHByaW50ICc9PT0gVW5leHBlY3RlZCBleGNlcHRpb24nLCB0LCByZXByKG1zZykKLSAgICAgICAgaWYgb3V0Y29tZT09U1lOVEFYX0VSUk9SOgotICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gYSBzeW50YXggZXJyb3I7IGZvcmdldCBpdC4KLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxpZiBvdXRjb21lPT1GQUlMOgotICAgICAgICAgICAgaWYgcmVzdWx0PT0tMTogcGFzcyAgICMgTm8gbWF0Y2gsIGFzIGV4cGVjdGVkCi0gICAgICAgICAgICBlbHNlOiBwcmludCAnPT09IFN1Y2NlZWRlZCBpbmNvcnJlY3RseScsIHQKLSAgICAgICAgZWxpZiBvdXRjb21lPT1TVUNDRUVEOgotICAgICAgICAgICAgaWYgcmVzdWx0IT0tMToKLSAgICAgICAgICAgICAgICAjIE1hdGNoZWQsIGFzIGV4cGVjdGVkLCBzbyBub3cgd2UgY29tcHV0ZSB0aGUKLSAgICAgICAgICAgICAgICAjIHJlc3VsdCBzdHJpbmcgYW5kIGNvbXBhcmUgaXQgdG8gb3VyIGV4cGVjdGVkIHJlc3VsdC4KLSAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gb2JqLnJlZ3NbMF0KLSAgICAgICAgICAgICAgICBmb3VuZD1zW3N0YXJ0OmVuZF0KLSAgICAgICAgICAgICAgICBncm91cHM9b2JqLmdyb3VwKDEsMiwzLDQsNSw2LDcsOCw5LDEwKQotICAgICAgICAgICAgICAgIHZhcmRpY3Q9dmFycygpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGdyb3VwcykpOgotICAgICAgICAgICAgICAgICAgICB2YXJkaWN0WydnJytzdHIoaSsxKV09c3RyKGdyb3Vwc1tpXSkKLSAgICAgICAgICAgICAgICByZXBsPWV2YWwocmVwbCkKLSAgICAgICAgICAgICAgICBpZiByZXBsIT1leHBlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz09PSBncm91cGluZyBlcnJvcicsIHQsIHJlcHIocmVwbCkrJyBzaG91bGQgYmUgJytyZXByKGV4cGVjdGVkKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxlZCBpbmNvcnJlY3RseScsIHQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKaW5kZXggNmZmMTIxNS4uMDI2OGJlMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKQEAgLTIyNCw3ICsyMjQsNyBAQAogICAgICAgICAjIEJ1ZyAjMTI1NzczMQogICAgICAgICBjbGFzcyBIKHNlbGYudGhldHlwZSk6CiAgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkKHNlbGYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGludChpZChzZWxmKSAmIDB4N2ZmZmZmZmYpCiAgICAgICAgIHM9SCgpCiAgICAgICAgIGY9c2V0KCkKICAgICAgICAgZi5hZGQocykKQEAgLTQyMSw3ICs0MjEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSZWZlcmVuY2VFcnJvciwgc3RyLCBwKQogCiAgICAgIyBDIEFQSSB0ZXN0IG9ubHkgYXZhaWxhYmxlIGluIGEgZGVidWcgYnVpbGQKLSAgICBpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICBpZiBoYXNhdHRyKHNldCwgInRlc3RfY19hcGkiKToKICAgICAgICAgZGVmIHRlc3RfY19hcGkoc2VsZik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldCgnYWJjJykudGVzdF9jX2FwaSgpLCBUcnVlKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldHVwdG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X3NldHVwdG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4ODMwMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0dXB0b29scy5weQpAQCAtMCwwICsxLDE2IEBACisiIiJUZXN0cyBmb3Igc2V0dXB0b29scy4KKworVGhlIHRlc3RzIGZvciBzZXR1cHRvb2xzIGFyZSBkZWZpbmVkIGluIHRoZSBzZXR1cHRvb2xzLnRlc3RzIHBhY2thZ2U7Cit0aGlzIHJ1bnMgdGhlbSBmcm9tIHRoZXJlLgorIiIiCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQudGVzdCBpbXBvcnQgU2Nhbm5pbmdMb2FkZXIKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl9zdWl0ZSgKKyAgICAgICAgU2Nhbm5pbmdMb2FkZXIoKS5sb2FkVGVzdHNGcm9tTmFtZSgnc2V0dXB0b29scy50ZXN0cycpCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKaW5kZXggYmMyNWJkMC4uOGU4YjAyZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQpAQCAtMjE0LDYgKzIxNCwyMCBAQAogICAgICAgICAgICAgKCJzdGFydHRhZyIsICJlIiwgWygiYSIsICJyZ2IoMSwyLDMpIildKSwKICAgICAgICAgICAgIF0pCiAKKyAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlc19lbnRpdGllcyhzZWxmKToKKyAgICAgICAgIiIiU3Vic3RpdHV0aW9uIG9mIGVudGl0aWVzIGFuZCBjaGFycmVmcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCisgICAgICAgICMgU0YgYnVnICMxNDUyMjQ2CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9Jmx0OyBjPSZsdDsmZ3Q7IGQ9Jmx0LSZndDsgZT0nJmx0OyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY9IiZ4eHg7IiBnPScmIzMyOyYjMzM7JyBoPScmIzUwMDsnIGk9J3g/YT1iJmM9ZDsnPiIiIiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgIjw+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsICImbHQtPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCAiPCAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgIiZ4eHg7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsICIgISIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCAiJiM1MDA7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsICJ4P2E9YiZjPWQ7IiksIF0pXSkKKwogICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGEuYj0ndicgYzpkPXYgZS1mPXY+IiIiLCBbCiAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJhLmIiLCAidiIpLCAoImM6ZCIsICJ2IiksICgiZS1mIiwgInYiKV0pLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCAxODk5ZTc4Li42OTQzMDgwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMjY4LDkgKzI2OCw5IEBACiAgICAgICAgICAgICAjIFByb2JhYmx5IGEgc2ltaWxhciBwcm9ibGVtIGFzIGFib3ZlOyBza2lwIHRoaXMgdGVzdAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGFsbF9ob3N0X25hbWVzID0gW2hvc3RuYW1lLCBobmFtZV0gKyBhbGlhc2VzCi0gICAgICAgIGZxaG4gPSBzb2NrZXQuZ2V0ZnFkbigpCisgICAgICAgIGZxaG4gPSBzb2NrZXQuZ2V0ZnFkbihpcCkKICAgICAgICAgaWYgbm90IGZxaG4gaW4gYWxsX2hvc3RfbmFtZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRlc3RpbmcgaG9zdCByZXNvbHV0aW9uIG1lY2hhbmlzbXMuIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgdGVzdGluZyBob3N0IHJlc29sdXRpb24gbWVjaGFuaXNtcy4gKGZxZG46ICVzLCBhbGw6ICVzKSIgJSAoZnFobiwgcmVwcihhbGxfaG9zdF9uYW1lcykpKQogCiAgICAgZGVmIHRlc3RSZWZDb3VudEdldE5hbWVJbmZvKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgcmVmZXJlbmNlIGNvdW50IGZvciBnZXRuYW1laW5mbwpAQCAtNDY5LDYgKzQ2OSwxNCBAQAogICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzb2NrLnNlbmQsICJzcGFtIikKIAorICAgIGRlZiB0ZXN0TmV3QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIC5mYW1pbHksIC50eXBlIGFuZCAucHJvdG9jb2wKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrLmZhbWlseSwgc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay50eXBlLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay5wcm90bywgMCkKKyAgICAgICAgc29jay5jbG9zZSgpCisKIGNsYXNzIEJhc2ljVENQVGVzdChTb2NrZXRDb25uZWN0ZWRUZXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CkBAIC04MTcsNiArODI1LDMyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKHNvY2tldC5nYWllcnJvciwgc29ja2V0LmVycm9yKSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc29ja2V0LnRpbWVvdXQsIHNvY2tldC5lcnJvcikpCiAKK2NsYXNzIFRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIFVOSVhfUEFUSF9NQVggPSAxMDgKKworICAgIGRlZiB0ZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZShzZWxmKToKKyAgICAgICAgYWRkcmVzcyA9ICJceDAwcHl0aG9uLXRlc3QtaGVsbG9ceDAwXHhmZiIKKyAgICAgICAgczEgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMxLmJpbmQoYWRkcmVzcykKKyAgICAgICAgczEubGlzdGVuKDEpCisgICAgICAgIHMyID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzMi5jb25uZWN0KHMxLmdldHNvY2tuYW1lKCkpCisgICAgICAgIHMxLmFjY2VwdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEuZ2V0c29ja25hbWUoKSwgYWRkcmVzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMi5nZXRwZWVybmFtZSgpLCBhZGRyZXNzKQorCisgICAgZGVmIHRlc3RNYXhOYW1lKHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDAiICsgImgiICogKHNlbGYuVU5JWF9QQVRIX01BWCAtIDEpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMuYmluZChhZGRyZXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0c29ja25hbWUoKSwgYWRkcmVzcykKKworICAgIGRlZiB0ZXN0TmFtZU92ZXJmbG93KHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDAiICsgImgiICogc2VsZi5VTklYX1BBVEhfTUFYCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcy5iaW5kLCBhZGRyZXNzKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0cyA9IFtHZW5lcmFsTW9kdWxlVGVzdHMsIEJhc2ljVENQVGVzdCwgVENQVGltZW91dFRlc3QsIFRlc3RFeGNlcHRpb25zXQpAQCAtODMyLDYgKzg2Niw4IEBACiAgICAgXSkKICAgICBpZiBoYXNhdHRyKHNvY2tldCwgInNvY2tldHBhaXIiKToKICAgICAgICAgdGVzdHMuYXBwZW5kKEJhc2ljU29ja2V0UGFpclRlc3QpCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdsaW51eDInOgorICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UpCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKaW5kZXggOTg2ODBiOS4uMTA5MTM4MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQpAQCAtMSw1ICsxLDYgQEAKICMgVGVzdCBqdXN0IHRoZSBTU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0IG1vZHVsZSwgaW4gYSBtb2RlcmF0ZWx5IGJvZ3VzIHdheS4KIAoraW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGltcG9ydCBzb2NrZXQKIApAQCAtMTMsNiArMTQsOSBAQAogCiAgICAgaW1wb3J0IHVybGxpYgogCisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHByaW50ICJ0ZXN0X2Jhc2ljIC4uLiIKKwogICAgIHNvY2tldC5SQU5EX3N0YXR1cygpCiAgICAgdHJ5OgogICAgICAgICBzb2NrZXQuUkFORF9lZ2QoMSkKQEAgLTI2LDcgKzMwLDQxIEBACiAgICAgYnVmID0gZi5yZWFkKCkKICAgICBmLmNsb3NlKCkKIAorZGVmIHRlc3RfdGltZW91dCgpOgorICAgIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygnbmV0d29yaycpCisKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgcHJpbnQgInRlc3RfdGltZW91dCAuLi4iCisKKyAgICAjIEEgc2VydmljZSB3aGljaCBpc3N1ZXMgYSB3ZWxjb21lIGJhbm5lciAod2l0aG91dCBuZWVkIHRvIHdyaXRlCisgICAgIyBhbnl0aGluZykuCisgICAgIyBYWFggKCJnbWFpbC5vcmciLCA5OTUpIGhhcyBiZWVuIHVucmVsaWFibGUgc28gZmFyLCBmcm9tIHRpbWUgdG8gdGltZQorICAgICMgWFhYIG5vbi1yZXNwb25zaXZlIGZvciBob3VycyBvbiBlbmQgKCYgYWNyb3NzIGFsbCBidWlsZGJvdCBzbGF2ZXMsCisgICAgIyBYWFggc28gdGhhdCdzIG5vdCBqdXN0IGEgbG9jYWwgdGhpbmcpLgorICAgIEFERFIgPSAiZ21haWwub3JnIiwgOTk1CisKKyAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgcy5zZXR0aW1lb3V0KDMwLjApCisgICAgdHJ5OgorICAgICAgICBzLmNvbm5lY3QoQUREUikKKyAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICIiIlwKKyAgICBXQVJOSU5HOiAgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvICVyIHRpbWVkIG91dCwgaW4KKyAgICB0ZXN0X3RpbWVvdXQuICBUaGF0IG1heSBiZSBsZWdpdGltYXRlLCBidXQgaXMgbm90IHRoZSBvdXRjb21lIHdlIGhvcGVkCisgICAgZm9yLiAgSWYgdGhpcyBtZXNzYWdlIGlzIHNlZW4gb2Z0ZW4sIHRlc3RfdGltZW91dCBzaG91bGQgYmUgY2hhbmdlZCB0bworICAgIHVzZSBhIG1vcmUgcmVsaWFibGUgYWRkcmVzcy4iIiIgJSAoQUREUiwpCisgICAgICAgIHJldHVybgorCisgICAgc3MgPSBzb2NrZXQuc3NsKHMpCisgICAgIyBSZWFkIHBhcnQgb2YgcmV0dXJuIHdlbGNvbWUgYmFubmVyIHR3aWNlLgorICAgIHNzLnJlYWQoMSkKKyAgICBzcy5yZWFkKDEpCisgICAgcy5jbG9zZSgpCisKIGRlZiB0ZXN0X3J1ZGVfc2h1dGRvd24oKToKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgcHJpbnQgInRlc3RfcnVkZV9zaHV0ZG93biAuLi4iCisKICAgICB0cnk6CiAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CkBAIC03NCw2ICsxMTIsNyBAQAogICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdFNraXBwZWQoInNvY2tldCBtb2R1bGUgaGFzIG5vIHNzbCBzdXBwb3J0IikKICAgICB0ZXN0X3J1ZGVfc2h1dGRvd24oKQogICAgIHRlc3RfYmFzaWMoKQorICAgIHRlc3RfdGltZW91dCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zcWxpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxZDBlNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CkBAIC0wLDAgKzEsMTYgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVGVzdFNraXBwZWQKK2ltcG9ydCB1bml0dGVzdAorCit0cnk6CisgICAgaW1wb3J0IF9zcWxpdGUzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQoJ25vIHNxbGl0ZSBhdmFpbGFibGUnKQorZnJvbSBzcWxpdGUzLnRlc3QgaW1wb3J0IChkYmFwaSwgdHlwZXMsIHVzZXJmdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksIHRyYW5zYWN0aW9ucykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChkYmFwaS5zdWl0ZSgpLCB0eXBlcy5zdWl0ZSgpLCB1c2VyZnVuY3Rpb25zLnN1aXRlKCksCisgICAgICAgICAgICAgICAgIGZhY3Rvcnkuc3VpdGUoKSwgdHJhbnNhY3Rpb25zLnN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9zdGFydGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMTJkNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMgUmlkaWN1bG91c2x5IHNpbXBsZSB0ZXN0IG9mIHRoZSBvcy5zdGFydGZpbGUgZnVuY3Rpb24gZm9yIFdpbmRvd3MuCisjCisjIGVtcHR5LnZicyBpcyBhbiBlbXB0eSBmaWxlIChleGNlcHQgZm9yIGEgY29tbWVudCksIHdoaWNoIGRvZXMKKyMgbm90aGluZyB3aGVuIHJ1biB3aXRoIGNzY3JpcHQgb3Igd3NjcmlwdC4KKyMKKyMgQSBwb3NzaWJsZSBpbXByb3ZlbWVudCB3b3VsZCBiZSB0byBoYXZlIGVtcHR5LnZicyBkbyBzb21ldGhpbmcgdGhhdAorIyB3ZSBjYW4gZGV0ZWN0IGhlcmUsIHRvIG1ha2Ugc3VyZSB0aGF0IG5vdCBvbmx5IHRoZSBvcy5zdGFydGZpbGUoKQorIyBjYWxsIHN1Y2NlZWRlZCwgYnV0IGFsc28gdGhlIHRoZSBzY3JpcHQgYWN0dWFsbHkgaGFzIHJ1bi4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIHVzZSB0aGlzIGZvcm0gc28gdGhhdCB0aGUgdGVzdCBpcyBza2lwcGVkIHdoZW4gc3RhcnRmaWxlIGlzIG5vdCBhdmFpbGFibGU6Citmcm9tIG9zIGltcG9ydCBzdGFydGZpbGUsIHBhdGgKKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25vbmV4aXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzdGFydGZpbGUsICJub25leGlzdGluZy52YnMiKQorCisgICAgZGVmIHRlc3Rfbm9uZXhpc3RpbmdfdShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc3RhcnRmaWxlLCB1Im5vbmV4aXN0aW5nLnZicyIpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgZW1wdHkgPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImVtcHR5LnZicyIpCisgICAgICAgIHN0YXJ0ZmlsZShlbXB0eSkKKyAgICAgICAgc3RhcnRmaWxlKGVtcHR5LCAib3BlbiIpCisKKyAgICBkZWYgdGVzdF9lbXB0eV91KHNlbGYpOgorICAgICAgICBlbXB0eSA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZW1wdHkudmJzIikKKyAgICAgICAgc3RhcnRmaWxlKHVuaWNvZGUoZW1wdHksICJtYmNzIikpCisgICAgICAgIHN0YXJ0ZmlsZSh1bmljb2RlKGVtcHR5LCAibWJjcyIpLCAib3BlbiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RDYXNlKQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkgYi9MaWIvdGVzdC90ZXN0X3N1bmRyeS5weQppbmRleCBmZDEwYjY4Li5hZjEzNjg0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1bmRyeS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1bmRyeS5weQpAQCAtMTIsNzUgKzEyLDUwIEBACiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCiAKIGltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IERvY1hNTFJQQ1NlcnZlcgogaW1wb3J0IENHSUhUVFBTZXJ2ZXIKLWltcG9ydCBRdWV1ZQogaW1wb3J0IFNpbXBsZUhUVFBTZXJ2ZXIKLWltcG9ydCBTb2NrZXRTZXJ2ZXIKK2ltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIKIGltcG9ydCBhaWZjCi1pbXBvcnQgYW55ZGJtCiBpbXBvcnQgYXVkaW9kZXYKIGltcG9ydCBiZGIKK2ltcG9ydCBjZ2l0YgogaW1wb3J0IGNtZAogaW1wb3J0IGNvZGUKLWltcG9ydCBjb2Rlb3AKLWltcG9ydCBjb2xvcnN5cwotaW1wb3J0IGNvbW1hbmRzCiBpbXBvcnQgY29tcGlsZWFsbAotdHJ5OgotICAgIGltcG9ydCBjdXJzZXMgICAjIG5vdCBhdmFpbGFibGUgb24gV2luZG93cwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJza2lwcGluZyBjdXJzZXMiCi1pbXBvcnQgZGlyY2FjaGUKLWltcG9ydCBkaXMKLWltcG9ydCBkaXN0dXRpbHMKLWltcG9ydCBkb2N0ZXN0Ci1pbXBvcnQgZHVtYmRibQogaW1wb3J0IGVuY29kaW5ncwotaW1wb3J0IGZubWF0Y2gKIGltcG9ydCBmb3JtYXR0ZXIKLWltcG9ydCBmcGZvcm1hdAogaW1wb3J0IGZ0cGxpYgogaW1wb3J0IGdldHBhc3MKLWltcG9ydCBnbG9iCiBpbXBvcnQgZ29waGVybGliCiBpbXBvcnQgaHRtbGVudGl0eWRlZnMKLWltcG9ydCBodG1sbGliCi1pbXBvcnQgaHR0cGxpYgotaW1wb3J0IGltYXBsaWIKK2ltcG9ydCBpaG9va3MKIGltcG9ydCBpbWdoZHIKIGltcG9ydCBpbXB1dGlsCiBpbXBvcnQga2V5d29yZAotaW1wb3J0IG1hY3BhdGgKK2ltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBtYWN1cmwycGF0aAogaW1wb3J0IG1haWxjYXAKLWltcG9ydCBtaGxpYgotaW1wb3J0IG1pbWV0eXBlcwogaW1wb3J0IG1pbWlmeQotaW1wb3J0IG11bHRpZmlsZQogaW1wb3J0IG11dGV4CiBpbXBvcnQgbm50cGxpYgogaW1wb3J0IG50dXJsMnBhdGgKK2ltcG9ydCBvcGNvZGUKK2ltcG9ydCBvczJlbXhwYXRoCiBpbXBvcnQgcGRiCiBpbXBvcnQgcGlwZXMKICNpbXBvcnQgcG9wbGliCiBpbXBvcnQgcG9zaXhmaWxlCi1pbXBvcnQgcHJvZmlsZQogaW1wb3J0IHBzdGF0cwogaW1wb3J0IHB5X2NvbXBpbGUKLSNpbXBvcnQgcmVjb252ZXJ0Ci1pbXBvcnQgcmVwcgoraW1wb3J0IHB5ZG9jCitpbXBvcnQgcmV4ZWMKIHRyeToKICAgICBpbXBvcnQgcmxjb21wbGV0ZXIgICAjIG5vdCBhdmFpbGFibGUgb24gV2luZG93cwogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGlmIHZlcmJvc2U6CiAgICAgICAgIHByaW50ICJza2lwcGluZyBybGNvbXBsZXRlciIKLWltcG9ydCByb2JvdHBhcnNlcgogaW1wb3J0IHNjaGVkCi1pbXBvcnQgc2dtbGxpYgotaW1wb3J0IHNoZWx2ZQotaW1wb3J0IHNobGV4Ci1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgc210cGxpYgogaW1wb3J0IHNuZGhkcgogaW1wb3J0IHN0YXR2ZnMKQEAgLTkwLDEyICs2NSwxNyBAQAogaW1wb3J0IHN5bWJvbAogaW1wb3J0IHRhYm5hbm55CiBpbXBvcnQgdGVsbmV0bGliCi1pbXBvcnQgdGVzdAoraW1wb3J0IHRpbWVpdAogaW1wb3J0IHRvYWlmZgotaW1wb3J0IHVybGxpYjIKK2ltcG9ydCB0b2tlbgordHJ5OgorICAgIGltcG9ydCB0dHkgICAgICMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgInNraXBwaW5nIHR0eSIKKwogIyBDYW4ndCB0ZXN0IHRoZSAidXNlciIgbW9kdWxlIC0tIGlmIHRoZSB1c2VyIGhhcyBhIH4vLnB5dGhvbnJjLnB5LCBpdAogIyBjYW4gc2NyZXcgdXAgYWxsIHNvcnRzIG9mIHRoaW5ncyAoZXNwLiBpZiBpdCBwcmludHMhKS4KICNpbXBvcnQgdXNlcgogaW1wb3J0IHdlYmJyb3dzZXIKLWltcG9ydCB3aGljaGRiCiBpbXBvcnQgeG1sCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CmluZGV4IGI5OGM2NDguLmFlMmExYzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CkBAIC0yNjEsNiArMjYxLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2aVszXSBpbiAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpWzRdLCBpbnQpKQogCisgICAgZGVmIHRlc3RfNDM1ODEoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgdXNlIHN5cy5zdGRvdXQsIGFzIHRoaXMgaXMgYSBjU3RyaW5nSU8gb2JqZWN0IHdoZW4KKyAgICAgICAgIyB0aGUgdGVzdCBydW5zIHVuZGVyIHJlZ3J0ZXN0LgorICAgICAgICBzZWxmLmFzc2VydF8oc3lzLl9fc3Rkb3V0X18uZW5jb2RpbmcgPT0gc3lzLl9fc3RkZXJyX18uZW5jb2RpbmcpCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3lzTW9kdWxlVGVzdCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CmluZGV4IGNiMTlkOWUuLjQzMDllOGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKQEAgLTExMyw4ICsxMTMsOSBAQAogCiAgICAgICAgICMgSWYgd2UgYXJlIHRvbyBjbG9zZSB0byB3d3cucHl0aG9uLm9yZywgdGhpcyB0ZXN0IHdpbGwgZmFpbC4KICAgICAgICAgIyBQaWNrIGEgaG9zdCB0aGF0IHNob3VsZCBiZSBmYXJ0aGVyIGF3YXkuCi0gICAgICAgIGlmIHNvY2tldC5nZXRmcWRuKCkuc3BsaXQoJy4nKVstMjpdID09IFsncHl0aG9uJywgJ29yZyddOgotICAgICAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgncHl0aG9uLm5ldCcsIDgwKQorICAgICAgICBpZiAoc29ja2V0LmdldGZxZG4oKS5zcGxpdCgnLicpWy0yOl0gPT0gWydweXRob24nLCAnb3JnJ10gb3IKKyAgICAgICAgICAgIHNvY2tldC5nZXRmcWRuKCkuc3BsaXQoJy4nKVstMjotMV0gPT0gWyd4czRhbGwnXSk6CisgICAgICAgICAgICBzZWxmLmFkZHJfcmVtb3RlID0gKCd0dXQuZmknLCA4MCkKIAogICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2suY29ubmVjdCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CmluZGV4IGQzYzFjYzQuLmIwNjQ5NjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQpAQCAtMSw3MCArMSwzMCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgZmluZGZpbGUsIGlzX3Jlc291cmNlX2VuYWJsZWQsIFRlc3RGYWlsZWQKIGltcG9ydCBvcywgZ2xvYiwgcmFuZG9tCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh2ZXJib3NlLCBmaW5kZmlsZSwgaXNfcmVzb3VyY2VfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0RmFpbGVkKQogZnJvbSB0b2tlbml6ZSBpbXBvcnQgKHRva2VuaXplLCBnZW5lcmF0ZV90b2tlbnMsIHVudG9rZW5pemUsCiAgICAgICAgICAgICAgICAgICAgICAgTlVNQkVSLCBOQU1FLCBPUCwgU1RSSU5HKQogCi1pZiB2ZXJib3NlOgotICAgIHByaW50ICdzdGFydGluZy4uLicKLQotZiA9IGZpbGUoZmluZGZpbGUoJ3Rva2VuaXplX3Rlc3RzJyArIG9zLmV4dHNlcCArICd0eHQnKSkKLXRva2VuaXplKGYucmVhZGxpbmUpCi1mLmNsb3NlKCkKLQotCi0KLSMjIyMjIyBUZXN0IHJvdW5kdHJpcCBmb3IgdW50b2tlbml6ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCisjIFRlc3Qgcm91bmR0cmlwIGZvciBgdW50b2tlbml6ZWAuICBgZmAgaXMgYSBmaWxlIHBhdGguICBUaGUgc291cmNlIGNvZGUgaW4gZgorIyBpcyB0b2tlbml6ZWQsIGNvbnZlcnRlZCBiYWNrIHRvIHNvdXJjZSBjb2RlIHZpYSB0b2tlbml6ZS51bnRva2VuaXplKCksCisjIGFuZCB0b2tlbml6ZWQgYWdhaW4gZnJvbSB0aGUgbGF0dGVyLiAgVGhlIHRlc3QgZmFpbHMgaWYgdGhlIHNlY29uZAorIyB0b2tlbml6YXRpb24gZG9lc24ndCBtYXRjaCB0aGUgZmlyc3QuCiBkZWYgdGVzdF9yb3VuZHRyaXAoZik6CiAgICAgIyMgcHJpbnQgJ1Rlc3Rpbmc6JywgZgotICAgIGYgPSBmaWxlKGYpCisgICAgZm9iaiA9IG9wZW4oZikKICAgICB0cnk6Ci0gICAgICAgIGZ1bGx0b2sgPSBsaXN0KGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKSkKKyAgICAgICAgZnVsbHRvayA9IGxpc3QoZ2VuZXJhdGVfdG9rZW5zKGZvYmoucmVhZGxpbmUpKQogICAgIGZpbmFsbHk6Ci0gICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb2JqLmNsb3NlKCkKIAogICAgIHQxID0gW3Rva1s6Ml0gZm9yIHRvayBpbiBmdWxsdG9rXQogICAgIG5ld3RleHQgPSB1bnRva2VuaXplKHQxKQogICAgIHJlYWRsaW5lID0gaXRlcihuZXd0ZXh0LnNwbGl0bGluZXMoMSkpLm5leHQKICAgICB0MiA9IFt0b2tbOjJdIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKV0KLSAgICBhc3NlcnQgdDEgPT0gdDIKKyAgICBpZiB0MSAhPSB0MjoKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidW50b2tlbml6ZSgpIHJvdW5kdHJpcCBmYWlsZWQgZm9yICVyIiAlIGYpCiAKLQotZiA9IGZpbmRmaWxlKCd0b2tlbml6ZV90ZXN0cycgKyBvcy5leHRzZXAgKyAndHh0JykKLXRlc3Rfcm91bmR0cmlwKGYpCi0KLXRlc3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZikgb3Igb3MuY3VyZGlyCi10ZXN0ZmlsZXMgPSBnbG9iLmdsb2IodGVzdGRpciArIG9zLnNlcCArICd0ZXN0Ki5weScpCi1pZiBub3QgaXNfcmVzb3VyY2VfZW5hYmxlZCgnY29tcGlsZXInKToKLSAgICB0ZXN0ZmlsZXMgPSByYW5kb20uc2FtcGxlKHRlc3RmaWxlcywgMTApCi0KLWZvciBmIGluIHRlc3RmaWxlczoKLSAgICB0ZXN0X3JvdW5kdHJpcChmKQotCi0KLSMjIyMjIyBUZXN0IGRldGVjdG9uIG9mIEluZGVudGF0aW9uRXJyb3IgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLQotc2FtcGxlQmFkVGV4dCA9ICIiIgotZGVmIGZvbygpOgotICAgIGJhcgotICBiYXoKLSIiIgotCi10cnk6Ci0gICAgZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8oc2FtcGxlQmFkVGV4dCkucmVhZGxpbmUpOgotICAgICAgICBwYXNzCi1leGNlcHQgSW5kZW50YXRpb25FcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIHJhaXNlIFRlc3RGYWlsZWQoIkRpZCBub3QgZGV0ZWN0IEluZGVudGF0aW9uRXJyb3I6IikKLQotCi0jIyMjIyMgVGVzdCBleGFtcGxlIGluIHRoZSBkb2NzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLQorIyBUaGlzIGlzIGFuIGV4YW1wbGUgZnJvbSB0aGUgZG9jcywgc2V0IHVwIGFzIGEgZG9jdGVzdC4KIGRlZiBkZWNpc3RtdChzKToKICAgICAiIiJTdWJzdGl0dXRlIERlY2ltYWxzIGZvciBmbG9hdHMgaW4gYSBzdHJpbmcgb2Ygc3RhdGVtZW50cy4KIApAQCAtNzMsMTIgKzMzLDIxIEBACiAgICAgPj4+IGRlY2lzdG10KHMpCiAgICAgInByaW50ICtEZWNpbWFsICgnMjEuM2UtNScpKi1EZWNpbWFsICgnLjEyMzQnKS9EZWNpbWFsICgnODEuNycpIgogCi0gICAgPj4+IGV4ZWMocykKLSAgICAtMy4yMTcxNjAzNDI3MmUtMDA3CisgICAgVGhlIGZvcm1hdCBvZiB0aGUgZXhwb25lbnQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHBsYXRmb3JtIEMgbGlicmFyeS4KKyAgICBLbm93biBjYXNlcyBhcmUgImUtMDA3IiAoV2luZG93cykgYW5kICJlLTA3IiAobm90IFdpbmRvd3MpLiAgU2luY2UKKyAgICB3ZSdyZSBvbmx5IHNob3dpbmcgMTIgZGlnaXRzLCBhbmQgdGhlIDEzdGggaXNuJ3QgY2xvc2UgdG8gNSwgdGhlCisgICAgcmVzdCBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBwbGF0Zm9ybS1pbmRlcGVuZGVudC4KKworICAgID4+PiBleGVjKHMpICNkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAtMy4yMTcxNjAzNDI3MmUtMC4uLjcKKworICAgIE91dHB1dCBmcm9tIGNhbGN1bGF0aW9ucyB3aXRoIERlY2ltYWwgc2hvdWxkIGJlIGlkZW50aWNhbCBhY3Jvc3MgYWxsCisgICAgcGxhdGZvcm1zLgorCiAgICAgPj4+IGV4ZWMoZGVjaXN0bXQocykpCiAgICAgLTMuMjE3MTYwMzQyNzE3MjU4MjYxOTMzOTA0NTI5RS03Ci0KICAgICAiIiIKKwogICAgIHJlc3VsdCA9IFtdCiAgICAgZyA9IGdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTyhzKS5yZWFkbGluZSkgICAjIHRva2VuaXplIHRoZSBzdHJpbmcKICAgICBmb3IgdG9rbnVtLCB0b2t2YWwsIF8sIF8sIF8gIGluIGc6CkBAIC05Myw4ICs2Miw1MyBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgodG9rbnVtLCB0b2t2YWwpKQogICAgIHJldHVybiB1bnRva2VuaXplKHJlc3VsdCkKIAotaW1wb3J0IGRvY3Rlc3QKLWRvY3Rlc3QudGVzdG1vZCgpCitkZWYgdGVzdF9tYWluKCk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3N0YXJ0aW5nLi4uJwogCi1pZiB2ZXJib3NlOgotICAgIHByaW50ICdmaW5pc2hlZCcKKyAgICAjIFRoaXMgZGlzcGxheXMgdGhlIHRva2VuaXphdGlvbiBvZiB0b2tlbml6ZV90ZXN0cy5weSB0byBzdGRvdXQsIGFuZAorICAgICMgcmVncnRlc3QucHkgY2hlY2tzIHRoYXQgdGhpcyBlcXVhbHMgdGhlIGV4cGVjdGVkIG91dHB1dCAoaW4gdGhlCisgICAgIyB0ZXN0L291dHB1dC8gZGlyZWN0b3J5KS4KKyAgICBmID0gb3BlbihmaW5kZmlsZSgndG9rZW5pemVfdGVzdHMnICsgb3MuZXh0c2VwICsgJ3R4dCcpKQorICAgIHRva2VuaXplKGYucmVhZGxpbmUpCisgICAgZi5jbG9zZSgpCisKKyAgICAjIE5vdyBydW4gdGVzdF9yb3VuZHRyaXAoKSBvdmVyIHRva2VuaXplX3Rlc3QucHkgdG9vLCBhbmQgb3ZlciBhbGwKKyAgICAjIChpZiB0aGUgImNvbXBpbGVyIiByZXNvdXJjZSBpcyBlbmFibGVkKSBvciBhIHNtYWxsIHJhbmRvbSBzYW1wbGUgKGlmCisgICAgIyAiY29tcGlsZXIiIGlzIG5vdCBlbmFibGVkKSBvZiB0aGUgdGVzdCoucHkgZmlsZXMuCisgICAgZiA9IGZpbmRmaWxlKCd0b2tlbml6ZV90ZXN0cycgKyBvcy5leHRzZXAgKyAndHh0JykKKyAgICB0ZXN0X3JvdW5kdHJpcChmKQorCisgICAgdGVzdGRpciA9IG9zLnBhdGguZGlybmFtZShmKSBvciBvcy5jdXJkaXIKKyAgICB0ZXN0ZmlsZXMgPSBnbG9iLmdsb2IodGVzdGRpciArIG9zLnNlcCArICd0ZXN0Ki5weScpCisgICAgaWYgbm90IGlzX3Jlc291cmNlX2VuYWJsZWQoJ2NvbXBpbGVyJyk6CisgICAgICAgIHRlc3RmaWxlcyA9IHJhbmRvbS5zYW1wbGUodGVzdGZpbGVzLCAxMCkKKworICAgIGZvciBmIGluIHRlc3RmaWxlczoKKyAgICAgICAgdGVzdF9yb3VuZHRyaXAoZikKKworICAgICMgVGVzdCBkZXRlY3RvbiBvZiBJbmRlbnRhdGlvbkVycm9yLgorICAgIHNhbXBsZUJhZFRleHQgPSAiIiJcCitkZWYgZm9vKCk6CisgICAgYmFyCisgIGJhegorIiIiCisKKyAgICB0cnk6CisgICAgICAgIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPKHNhbXBsZUJhZFRleHQpLnJlYWRsaW5lKToKKyAgICAgICAgICAgIHBhc3MKKyAgICBleGNlcHQgSW5kZW50YXRpb25FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIkRpZCBub3QgZGV0ZWN0IEluZGVudGF0aW9uRXJyb3I6IikKKworICAgICMgUnVuIHRoZSBkb2N0ZXN0cyBpbiB0aGlzIG1vZHVsZS4KKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdG9rZW5pemUgICMgaS5lLiwgdGhpcyBtb2R1bGUKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fZG9jdGVzdAorICAgIHJ1bl9kb2N0ZXN0KHRlc3RfdG9rZW5pemUpCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZmluaXNoZWQnCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CmluZGV4IDk0NGZmOWEuLjRmOTQ2ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQpAQCAtMTMsNyArMTMsMTUgQEAKICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicpXQogCi0jIEFybWluIFJpZ28ncyBmYWlsaW5nIGV4YW1wbGU6CisjIE1hbnkgb2YgdGhlIHRlc3RzIGJlbG93IGFyZSB0cmlja3kgYmVjYXVzZSB0aGV5IGludm9sdmUgcGFzcyBzdGF0ZW1lbnRzLgorIyBJZiB0aGVyZSBpcyBpbXBsaWNpdCBjb250cm9sIGZsb3cgYXJvdW5kIGEgcGFzcyBzdGF0ZW1lbnQgKGluIGFuIGV4Y2VwdAorIyBjbGF1c2Ugb3IgZWxzZSBjYWx1c2UpIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBkbyB5b3Ugc2V0IGEgbGluZSBudW1iZXIKKyMgZm9sbG93aW5nIHRoYXQgY2xhdXNlPworCisKKyMgVGhlIGVudGlyZSAid2hpbGUgMDoiIHN0YXRlbWVudCBpcyBvcHRpbWl6ZWQgYXdheS4gIE5vIGNvZGUKKyMgZXhpc3RzIGZvciBpdCwgc28gdGhlIGxpbmUgbnVtYmVycyBza2lwIGRpcmVjdGx5IGZyb20gImRlbCB4IgorIyB0byAieCA9IDEiLgogZGVmIGFyaWdvX2V4YW1wbGUoKToKICAgICB4ID0gMQogICAgIGRlbCB4CkBAIC0yNCw3ICszMiw2IEBACiBhcmlnb19leGFtcGxlLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdyZXR1cm4nKV0KIApAQCAtNjAsMTQgKzY3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nKV0KIAogZGVmIG5vX3BvcF9ibG9ja3MoKToKLSAgICB3aGlsZSAwOgorICAgIHkgPSAxCisgICAgd2hpbGUgbm90IHk6CiAgICAgICAgIGJsYQogICAgIHggPSAxCiAKIG5vX3BvcF9ibG9ja3MuZXZlbnRzID0gWygwLCAnY2FsbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgzLCAncmV0dXJuJyldCisgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nKV0KIAogZGVmIGNhbGxlZCgpOiAjIGxpbmUgLTMKICAgICB4ID0gMQpAQCAtMTI3LDYgKzEzNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicpXQogCiAjIGltcGxpY2l0IHJldHVybiBleGFtcGxlCisjIFRoaXMgdGVzdCBpcyBpbnRlcmVzdGluZyBiZWNhdXNlIG9mIHRoZSBlbHNlOiBwYXNzCisjIHBhcnQgb2YgdGhlIGNvZGUuICBUaGUgY29kZSBnZW5lcmF0ZSBmb3IgdGhlIHRydWUKKyMgcGFydCBvZiB0aGUgaWYgY29udGFpbnMgYSBqdW1wIHBhc3QgdGhlIGVsc2UgYnJhbmNoLgorIyBUaGUgY29tcGlsZXIgdGhlbiBnZW5lcmF0ZXMgYW4gaW1wbGljaXQgInJldHVybiBOb25lIgorIyBJbnRlcm5hbGx5LCB0aGUgY29tcGlsZXIgdmlzaXRzIHRoZSBwYXNzIHN0YXRlbWVudAorIyBhbmQgc3RvcmVzIGl0cyBsaW5lIG51bWJlciBmb3IgdXNlIG9uIHRoZSBuZXh0IGluc3RydWN0aW9uLgorIyBUaGUgbmV4dCBpbnN0cnVjdGlvbiBpcyB0aGUgaW1wbGljaXQgcmV0dXJuIE5vbmUuCiBkZWYgaXJldHVybl9leGFtcGxlKCk6CiAgICAgYSA9IDUKICAgICBiID0gNQpAQCAtMTQwLDcgKzE1Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICg2LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNiwgJ3JldHVybicpXQogCiAjIFRpZ2h0IGxvb3Agd2l0aCB3aGlsZSgxKSBleGFtcGxlIChTRiAjNzY1NjI0KQogZGVmIHRpZ2h0bG9vcF9leGFtcGxlKCk6CkBAIC0yMjEsMTQgKzIzOCwxMiBAQAogCiAgICAgZGVmIHRlc3RfMDFfYmFzaWMoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3QoYmFzaWMpCi0jIyBYWFg6IFRoZXNlIHRlc3RzIGZhaWwgd2l0aCB0aGUgbmV3IGFzdCBjb21waWxlci4gIFRoZXkgbXVzdAotIyMgYmUgZml4ZWQgYmVmb3JlIGEgcmVsZWFzZS4KLSMjICAgIGRlZiB0ZXN0XzAyX2FyaWdvKHNlbGYpOgotIyMgICAgICAgIHNlbGYucnVuX3Rlc3QoYXJpZ29fZXhhbXBsZSkKKyAgICBkZWYgdGVzdF8wMl9hcmlnbyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChhcmlnb19leGFtcGxlKQogICAgIGRlZiB0ZXN0XzAzX29uZV9pbnN0cihzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdChvbmVfaW5zdHJfbGluZSkKLSMjICAgIGRlZiB0ZXN0XzA0X25vX3BvcF9ibG9ja3Moc2VsZik6Ci0jIyAgICAgICAgc2VsZi5ydW5fdGVzdChub19wb3BfYmxvY2tzKQorICAgIGRlZiB0ZXN0XzA0X25vX3BvcF9ibG9ja3Moc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX2Jsb2NrcykKICMjICAgIGRlZiB0ZXN0XzA1X25vX3BvcF90b3BzKHNlbGYpOgogIyMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX3RvcHMpCiAgICAgZGVmIHRlc3RfMDZfY2FsbChzZWxmKToKQEAgLTI0MCw4ICsyNTUsOCBAQAogICAgICAgICBzZWxmLnJ1bl90ZXN0MihzZXR0cmFjZV9hbmRfcmV0dXJuKQogICAgIGRlZiB0ZXN0XzA5X3NldHRyYWNlX2FuZF9yYWlzZShzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdDIoc2V0dHJhY2VfYW5kX3JhaXNlKQotIyMgICAgZGVmIHRlc3RfMTBfaXJldHVybihzZWxmKToKLSMjICAgICAgICBzZWxmLnJ1bl90ZXN0KGlyZXR1cm5fZXhhbXBsZSkKKyAgICBkZWYgdGVzdF8xMF9pcmV0dXJuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGlyZXR1cm5fZXhhbXBsZSkKICAgICBkZWYgdGVzdF8xMV90aWdodGxvb3Aoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3QodGlnaHRsb29wX2V4YW1wbGUpCiAgICAgZGVmIHRlc3RfMTJfdGlnaHRlcmxvb3Aoc2VsZik6CkBAIC01NzksMTcgKzU5NCwxNCBAQAogICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9vX2Zhcl9mb3J3YXJkcykKICAgICBkZWYgdGVzdF8wOV9ub19qdW1wX3Rvb19mYXJfYmFja3dhcmRzKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMpCi0jIFhYWDogVGhlc2UgdGVzdHMgY2F1c2UgdGhlIGludGVycHJldGVyIHRvIGNyYXNoLiAgVGhlIGZyYW1lX3NldGxpbmVubygpCi0jIGZ1bmN0aW9uIG5vIGxvbmdlciB3b3JrcyBjb3JyZWN0bHkgYmVjYXVzZSB0aGUgbGluZW5vIHRhYmxlIGdlbmVyYXRlZCBieQotIyB0aGUgQVNUIGNvbXBpbGVyIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIHdpdGggdGhlIG9sZCBjb21waWxlci4KLSMgICAgZGVmIHRlc3RfMTBfbm9fanVtcF90b19leGNlcHRfMShzZWxmKToKLSMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMSkKLSMgICAgZGVmIHRlc3RfMTFfbm9fanVtcF90b19leGNlcHRfMihzZWxmKToKLSMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMikKLSMgICAgZGVmIHRlc3RfMTJfbm9fanVtcF90b19leGNlcHRfMyhzZWxmKToKLSMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMykKLSMgICAgZGVmIHRlc3RfMTNfbm9fanVtcF90b19leGNlcHRfNChzZWxmKToKLSMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfNCkKKyAgICBkZWYgdGVzdF8xMF9ub19qdW1wX3RvX2V4Y2VwdF8xKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzEpCisgICAgZGVmIHRlc3RfMTFfbm9fanVtcF90b19leGNlcHRfMihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8yKQorICAgIGRlZiB0ZXN0XzEyX25vX2p1bXBfdG9fZXhjZXB0XzMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMykKKyAgICBkZWYgdGVzdF8xM19ub19qdW1wX3RvX2V4Y2VwdF80KHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzQpCiAgICAgZGVmIHRlc3RfMTRfbm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfZm9yd2FyZHNfaW50b19ibG9jaykKICAgICBkZWYgdGVzdF8xNV9ub19qdW1wX2JhY2t3YXJkc19pbnRvX2Jsb2NrKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCAyOWExMjBmLi4yMmMwNDU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMjQsNiArMjQsOSBAQAogICAgICAgICAjIFhYWCB3aHkgZG9lc24ndCBjb21waWxlIHJhaXNlIHRoZSBzYW1lIHRyYWNlYmFjaz8KICAgICAgICAgaW1wb3J0IHRlc3QuYmFkc3ludGF4X25vY2FyZXQKIAorICAgIGRlZiBzeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uKHNlbGYpOgorICAgICAgICBjb21waWxlKCJkZWYgc3BhbSgpOlxuICBwcmludCAxXG4gcHJpbnQgMiIsICI/IiwgImV4ZWMiKQorCiAgICAgZGVmIHRlc3RfY2FyZXQoc2VsZik6CiAgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aF9jYXJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhFcnJvcikKQEAgLTQwLDYgKzQzLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSAzKQogICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gIlt4IGZvciB4IGluIHhdID0geCIpCiAKKyAgICBkZWYgdGVzdF9iYWRfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJwcmludCAyIikKKwogICAgIGRlZiB0ZXN0X2J1ZzczNzQ3MyhzZWxmKToKICAgICAgICAgaW1wb3J0IHN5cywgb3MsIHRlbXBmaWxlLCB0aW1lCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA0OWVmMjlkLi5jNzExM2I1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC04MTAsNiArODEwLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzkoImZvbyIpKSwgInN0cmluZyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb285KCJmb28iKSksIHUibm90IHVuaWNvZGUiKQogCisgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByKHNlbGYpOgorICAgICAgICBjbGFzcyBzMToKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xcbicKKworICAgICAgICBjbGFzcyBzMjoKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSdcXG4nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHMxKCkpLCAnXFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHMyKCkpLCAnXFxuJykKKworCisKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVbmljb2RlVGVzdCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CmluZGV4IDI4NDMxMzguLjY0YTJlZTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTEzLDggKzEzLDcgQEAKICMgcGFyc2Vfa2Vxdl9saXN0LCBwYXJzZV9odHRwX2xpc3QgKEknbSBsZWF2aW5nIHRoaXMgZm9yIEFudGhvbnkgQmF4dGVyCiAjICBhbmQgR3JlZyBTdGVpbiwgc2luY2UgdGhleSdyZSBkb2luZyBEaWdlc3QgQXV0aGVudGljYXRpb24pCiAjIEF1dGhlbnRpY2F0aW9uIHN0dWZmIChkaXR0bykKLSMgUHJveHlIYW5kbGVyLCBDdXN0b21Qcm94eSwgQ3VzdG9tUHJveHlIYW5kbGVyIChJIGRvbid0IHVzZSBhIHByb3h5KQotIyBHb3BoZXJIYW5kbGVyIChoYXZlbid0IHVzZWQgZ29waGVyIGZvciBhIGRlY2FkZSBvciBzby4uLikKKyMgQ3VzdG9tUHJveHksIEN1c3RvbVByb3h5SGFuZGxlcgogCiBjbGFzcyBUcml2aWFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3RyaXZpYWwoc2VsZik6CkBAIC05MCw2ICs4OSw3IEBACiAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZShzZWxmLm1ldGhfbmFtZSwgc2VsZi5hY3Rpb24sICphcmdzKQogCiBjbGFzcyBNb2NrSGFuZGxlcjoKKyAgICBoYW5kbGVyX29yZGVyID0gNTAwCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZHMpOgogICAgICAgICBzZWxmLl9kZWZpbmVfbWV0aG9kcyhtZXRob2RzKQogICAgIGRlZiBfZGVmaW5lX21ldGhvZHMoc2VsZiwgbWV0aG9kcyk6CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBmb3IgbWV0aHMgaW4gbWV0aF9zcGVjOgogICAgICAgICBjbGFzcyBNb2NrSGFuZGxlclN1YmNsYXNzKE1vY2tIYW5kbGVyKTogcGFzcwogICAgICAgICBoID0gTW9ja0hhbmRsZXJTdWJjbGFzcyhtZXRocykKLSAgICAgICAgaC5oYW5kbGVyX29yZGVyID0gY291bnQKKyAgICAgICAgaC5oYW5kbGVyX29yZGVyICs9IGNvdW50CiAgICAgICAgIGguYWRkX3BhcmVudChvcGVuZXIpCiAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCiAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChoKQpAQCAtMzQ5LDEzICszNDksMTkgQEAKICAgICAgICAgVEVTVEZOID0gdGVzdF9zdXBwb3J0LlRFU1RGTgogICAgICAgICB1cmxwYXRoID0gc2FuZXBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoVEVTVEZOKSkKICAgICAgICAgdG93cml0ZSA9ICJoZWxsbywgd29ybGRcbiIKLSAgICAgICAgZm9yIHVybCBpbiBbCisgICAgICAgIHVybHMgPSBbCiAgICAgICAgICAgICAiZmlsZTovL2xvY2FsaG9zdCVzIiAlIHVybHBhdGgsCiAgICAgICAgICAgICAiZmlsZTovLyVzIiAlIHVybHBhdGgsCiAgICAgICAgICAgICAiZmlsZTovLyVzJXMiICUgKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwgdXJscGF0aCksCi0gICAgICAgICAgICAiZmlsZTovLyVzJXMiICUgKHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJscGF0aCksCi0gICAgICAgICAgICBdOgorICAgICAgICAgICAgXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NhbGFkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIGxvY2FsYWRkciA9ICcnCisgICAgICAgIGlmIGxvY2FsYWRkcjoKKyAgICAgICAgICAgIHVybHMuYXBwZW5kKCJmaWxlOi8vJXMlcyIgJSAobG9jYWxhZGRyLCB1cmxwYXRoKSkKKworICAgICAgICBmb3IgdXJsIGluIHVybHM6CiAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJ3YiIpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtNjM2LDYgKzY0MiwyMyBAQAogICAgICAgICBvLm9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoaC5yZXEuaGFzX2hlYWRlcigiQ29va2llIikpCiAKKyAgICBkZWYgdGVzdF9wcm94eShzZWxmKToKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGggPSB1cmxsaWIyLlByb3h5SGFuZGxlcihkaWN0KGh0dHA9InByb3h5LmV4YW1wbGUuY29tOjMxMjgiKSkKKyAgICAgICAgby5hZGRfaGFuZGxlcihwaCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWygiaHR0cF9vcGVuIiwgInJldHVybiByZXNwb25zZSIpXQorICAgICAgICAgICAgXQorICAgICAgICBoYW5kbGVycyA9IGFkZF9vcmRlcmVkX21vY2tfaGFuZGxlcnMobywgbWV0aF9zcGVjKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJhY21lLmV4YW1wbGUuY29tIikKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJwcm94eS5leGFtcGxlLmNvbTozMTI4IikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaGFuZGxlcnNbMF0sICJodHRwX29wZW4iKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW3R1cFswOjJdIGZvciB0dXAgaW4gby5jYWxsc10pCisKIAogY2xhc3MgTWlzY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtODIxLDYgKzg0NCw3IEBACiAKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh1cmxsaWIyLCB2ZXJib3NlKQogICAgIHRlc3RzID0gKFRyaXZpYWxUZXN0cywKICAgICAgICAgICAgICBPcGVuZXJEaXJlY3RvclRlc3RzLAogICAgICAgICAgICAgIEhhbmRsZXJUZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CmluZGV4IDM5YWRhMDYuLjVjZWU0NTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtMTIsMTUgKzEyLDUzIEBACiAgICAgZGVmIGNoZWNrUm91bmR0cmlwcyhzZWxmLCB1cmwsIHBhcnNlZCwgc3BsaXQpOgogICAgICAgICByZXN1bHQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBwYXJzZWQpCisgICAgICAgIHQgPSAocmVzdWx0LnNjaGVtZSwgcmVzdWx0Lm5ldGxvYywgcmVzdWx0LnBhdGgsCisgICAgICAgICAgICAgcmVzdWx0LnBhcmFtcywgcmVzdWx0LnF1ZXJ5LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgcGFyc2VkKQogICAgICAgICAjIHB1dCBpdCBiYWNrIHRvZ2V0aGVyIGFuZCBpdCBzaG91bGQgYmUgdGhlIHNhbWUKICAgICAgICAgcmVzdWx0MiA9IHVybHBhcnNlLnVybHVucGFyc2UocmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCByZXN1bHQuZ2V0dXJsKCkpCisKKyAgICAgICAgIyB0aGUgcmVzdWx0IG9mIGdldHVybCgpIGlzIGEgZml4cG9pbnQ7IHdlIGNhbiBhbHdheXMgcGFyc2UgaXQKKyAgICAgICAgIyBhZ2FpbiB0byBnZXQgdGhlIHNhbWUgcmVzdWx0OgorICAgICAgICByZXN1bHQzID0gdXJscGFyc2UudXJscGFyc2UocmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZ2V0dXJsKCksIHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLCAgICAgICAgICByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5zY2hlbWUsICAgcmVzdWx0LnNjaGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLm5ldGxvYywgICByZXN1bHQubmV0bG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGF0aCwgICAgIHJlc3VsdC5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGFyYW1zLCAgIHJlc3VsdC5wYXJhbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5xdWVyeSwgICAgcmVzdWx0LnF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZnJhZ21lbnQsIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnVzZXJuYW1lLCByZXN1bHQudXNlcm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXNzd29yZCwgcmVzdWx0LnBhc3N3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuaG9zdG5hbWUsIHJlc3VsdC5ob3N0bmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBvcnQsICAgICByZXN1bHQucG9ydCkKIAogICAgICAgICAjIGNoZWNrIHRoZSByb3VuZHRyaXAgdXNpbmcgdXJsc3BsaXQoKSBhcyB3ZWxsCiAgICAgICAgIHJlc3VsdCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNwbGl0KQorICAgICAgICB0ID0gKHJlc3VsdC5zY2hlbWUsIHJlc3VsdC5uZXRsb2MsIHJlc3VsdC5wYXRoLAorICAgICAgICAgICAgIHJlc3VsdC5xdWVyeSwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNwbGl0KQogICAgICAgICByZXN1bHQyID0gdXJscGFyc2UudXJsdW5zcGxpdChyZXN1bHQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHJlc3VsdC5nZXR1cmwoKSkKKworICAgICAgICAjIGNoZWNrIHRoZSBmaXhwb2ludCBwcm9wZXJ0eSBvZiByZS1wYXJzaW5nIHRoZSByZXN1bHQgb2YgZ2V0dXJsKCkKKyAgICAgICAgcmVzdWx0MyA9IHVybHBhcnNlLnVybHNwbGl0KHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmdldHVybCgpLCByZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MywgICAgICAgICAgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuc2NoZW1lLCAgIHJlc3VsdC5zY2hlbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5uZXRsb2MsICAgcmVzdWx0Lm5ldGxvYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhdGgsICAgICByZXN1bHQucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnF1ZXJ5LCAgICByZXN1bHQucXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5mcmFnbWVudCwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMudXNlcm5hbWUsIHJlc3VsdC51c2VybmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhc3N3b3JkLCByZXN1bHQucGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5ob3N0bmFtZSwgcmVzdWx0Lmhvc3RuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucG9ydCwgICAgIHJlc3VsdC5wb3J0KQogCiAgICAgZGVmIHRlc3Rfcm91bmR0cmlwcyhzZWxmKToKICAgICAgICAgdGVzdGNhc2VzID0gWwpAQCAtMTg3LDYgKzIyNSw2OSBAQAogICAgICAgICAgICAgXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJsZGVmcmFnKHVybCksIChkZWZyYWcsIGZyYWcpKQogCisgICAgZGVmIHRlc3RfdXJsc3BsaXRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgdXJsID0gIkhUVFA6Ly9XV1cuUFlUSE9OLk9SRy9kb2MvI2ZyYWciCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zY2hlbWUsICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIldXVy5QWVRIT04uT1JHIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhdGgsICIvZG9jLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5xdWVyeSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5mcmFnbWVudCwgImZyYWciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgIyBnZXR1cmwoKSB3b24ndCByZXR1cm4gZXhhY3RseSB0aGUgb3JpZ2luYWwgVVJMIGluIHRoaXMgY2FzZQorICAgICAgICAjIHNpbmNlIHRoZSBzY2hlbWUgaXMgYWx3YXlzIGNhc2Utbm9ybWFsaXplZAorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmwpCisKKyAgICAgICAgdXJsID0gImh0dHA6Ly9Vc2VyOlBhc3NAd3d3LnB5dGhvbi5vcmc6MDgwL2RvYy8/cXVlcnk9eWVzI2ZyYWciCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zY2hlbWUsICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIlVzZXI6UGFzc0B3d3cucHl0aG9uLm9yZzowODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGF0aCwgIi9kb2MvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnF1ZXJ5LCAicXVlcnk9eWVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZyYWdtZW50LCAiZnJhZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgIlVzZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsICJQYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgODApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJsKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19iYWRfcG9ydChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgaGFuZGxpbmcgb2Ygbm9uLWludGVnZXIgcG9ydHMuIiIiCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc193aXRob3V0X25ldGxvYyhzZWxmKToKKyAgICAgICAgIyBUaGlzIGV4YW1wbGUgaXMgc3RyYWlnaHQgZnJvbSBSRkMgMzI2MS4gIEl0IGxvb2tzIGxpa2UgaXQKKyAgICAgICAgIyBzaG91bGQgYWxsb3cgdGhlIHVzZXJuYW1lLCBob3N0bmFtZSwgYW5kIHBvcnQgdG8gYmUgZmlsbGVkCisgICAgICAgICMgaW4sIGJ1dCBkb2Vzbid0LiAgU2luY2UgaXQncyBhIFVSSSBhbmQgZG9lc24ndCB1c2UgdGhlCisgICAgICAgICMgc2NoZW1lOi8vbmV0bG9jIHN5bnRheCwgdGhlIG5ldGxvYyBhbmQgcmVsYXRlZCBhdHRyaWJ1dGVzCisgICAgICAgICMgc2hvdWxkIGJlIGxlZnQgZW1wdHkuCisgICAgICAgIHVyaSA9ICJzaXA6YWxpY2VAYXRsYW50YS5jb207bWFkZHI9MjM5LjI1NS4yNTUuMTt0dGw9MTUiCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmkpCisKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVyaSkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVcmxQYXJzZVRlc3RDYXNlKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5IGIvTGliL3Rlc3QvdGVzdF93YWl0My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE0MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF93YWl0My5weQpAQCAtMCwwICsxLDMyIEBACisiIiJUaGlzIHRlc3QgY2hlY2tzIGZvciBjb3JyZWN0IHdhaXQzKCkgYmVoYXZpb3IuCisiIiIKKworaW1wb3J0IG9zCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorCit0cnk6CisgICAgb3MuZm9yaworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3MuZm9yayBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQzIgorCit0cnk6CisgICAgb3Mud2FpdDMKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCwgIm9zLndhaXQzIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3Rfd2FpdDMiCisKK2NsYXNzIFdhaXQzVGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDMoMCkKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChXYWl0M1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkgYi9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2U1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5CkBAIC0wLDAgKzEsMjkgQEAKKyIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3Qgd2FpdDQoKSBiZWhhdmlvci4KKyIiIgorCitpbXBvcnQgb3MKK2Zyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0CisKK3RyeToKKyAgICBvcy5mb3JrCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICJvcy5mb3JrIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3Rfd2FpdDQiCisKK3RyeToKKyAgICBvcy53YWl0NAorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3Mud2FpdDQgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF93YWl0NCIKKworY2xhc3MgV2FpdDRUZXN0KEZvcmtXYWl0KToKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVzYWdlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFdhaXQ0VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKaW5kZXggYjcwNjFjMS4uNWQwNTFhNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CkBAIC04Miw2ICs4MiwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5jYXRlZ29yeSwgJ1VzZXJXYXJuaW5nJykKIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgICMgT2JzY3VyZSBoYWNrIHNvIHRoYXQgdGhpcyB0ZXN0IHBhc3NlcyBhZnRlciByZWxvYWRzIG9yIHJlcGVhdGVkIGNhbGxzCisgICAgIyB0byB0ZXN0X21haW4gKHJlZ3J0ZXN0IC1SKS4KKyAgICBpZiAnX193YXJuaW5ncmVnaXN0cnlfXycgaW4gZ2xvYmFscygpOgorICAgICAgICBkZWwgZ2xvYmFscygpWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RNb2R1bGUpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQppbmRleCA3N2M0MzJhLi4xOWQ0NDU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKQEAgLTMsNiArMyw5IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgd2luc291bmQsIHRpbWUKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKKwogCiBjbGFzcyBCZWVwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTQ0LDYgKzQ3LDcgQEAKICAgICBkZWYgdGVzdF9xdWVzdGlvbihzZWxmKToKICAgICAgICAgd2luc291bmQuTWVzc2FnZUJlZXAod2luc291bmQuTUJfSUNPTlFVRVNUSU9OKQogCisKIGNsYXNzIFBsYXlTb3VuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgpAQCAtNTYsMTkgKzYwLDU0IEBACiAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX2FzdGVyaXNrKHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUFzdGVyaXNrJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtQXN0ZXJpc2snLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1Bc3RlcmlzaycsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfZXhjbGFtYXRpb24oc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtRXhjbGFtYXRpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGNsYW1hdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUV4Y2xhbWF0aW9uJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19leGl0KHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUV4aXQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGl0Jywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtRXhpdCcsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfaGFuZChzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1IYW5kJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtSGFuZCcsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUhhbmQnLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX3F1ZXN0aW9uKHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbVF1ZXN0aW9uJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtUXVlc3Rpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1RdWVzdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfZmFsbGJhY2soc2VsZik6CiAgICAgICAgICMgVGhpcyB0ZXN0IGNhbid0IGJlIGV4cGVjdGVkIHRvIHdvcmsgb24gYWxsIHN5c3RlbXMuICBUaGUgTVMKQEAgLTg1LDQxICsxMjQsODMgQEAKICAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgdGVzdF9hbGlhc19ub2ZhbGxiYWNrKHNlbGYpOgotICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBhc3NlcnRpbmcgUnVudGltZUVycm9yCi0gICAgICAgICMgd2lsbCBnZXQgcmFpc2VkOiAgeW91IGNhbm5vdCBjb252ZXJ0IHRoaXMgdG8KLSAgICAgICAgIyBzZWxmLmFzc2VydFJhaXNlcyguLi4pIGZvcm0uICBUaGUgYXR0ZW1wdCBtYXkgb3IgbWF5IG5vdAotICAgICAgICAjIHJhaXNlIFJ1bnRpbWVFcnJvciwgYnV0IGl0IHNob3VsZG4ndCByYWlzZSBhbnl0aGluZyBvdGhlcgotICAgICAgICAjIHRoYW4gUnVudGltZUVycm9yLCBhbmQgdGhhdCdzIGFsbCB3ZSdyZSB0cnlpbmcgdG8gdGVzdCBoZXJlLgotICAgICAgICAjIFRoZSBNUyBkb2NzIGFyZW4ndCBjbGVhciBhYm91dCB3aGV0aGVyIHRoZSBTREsgUGxheVNvdW5kKCkKLSAgICAgICAgIyB3aXRoIFNORF9BTElBUyBhbmQgU05EX05PREVGQVVMVCB3aWxsIHJldHVybiBUcnVlIG9yIEZhbHNlIHdoZW4KLSAgICAgICAgIyB0aGUgYWxpYXMgaXMgdW5rbm93bi4gIE9uIFRpbSdzIFdpblhQIGJveCB0b2RheSwgaXQgcmV0dXJucwotICAgICAgICAjIFRydWUgKG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQpLiAgV2hhdCB3ZSdkIHJlYWxseSBsaWtlIHRvIHRlc3QKLSAgICAgICAgIyBpcyB0aGF0IG5vIHNvdW5kIGlzIHBsYXllZCwgYnV0IHRoYXQgcmVxdWlyZXMgZmlyc3Qgd2lyaW5nIGFuCi0gICAgICAgICMgZWFyZHJ1bSBjbGFzcyBpbnRvIHVuaXR0ZXN0IDx3aW5rPi4KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAotICAgICAgICAgICAgICAgICchIiQlJi8oIysqJywKLSAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUCisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYXNzZXJ0aW5nIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgIyB3aWxsIGdldCByYWlzZWQ6ICB5b3UgY2Fubm90IGNvbnZlcnQgdGhpcyB0bworICAgICAgICAgICAgIyBzZWxmLmFzc2VydFJhaXNlcyguLi4pIGZvcm0uICBUaGUgYXR0ZW1wdCBtYXkgb3IgbWF5IG5vdAorICAgICAgICAgICAgIyByYWlzZSBSdW50aW1lRXJyb3IsIGJ1dCBpdCBzaG91bGRuJ3QgcmFpc2UgYW55dGhpbmcgb3RoZXIKKyAgICAgICAgICAgICMgdGhhbiBSdW50aW1lRXJyb3IsIGFuZCB0aGF0J3MgYWxsIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICAgICAjIGhlcmUuICBUaGUgTVMgZG9jcyBhcmVuJ3QgY2xlYXIgYWJvdXQgd2hldGhlciB0aGUgU0RLCisgICAgICAgICAgICAjIFBsYXlTb3VuZCgpIHdpdGggU05EX0FMSUFTIGFuZCBTTkRfTk9ERUZBVUxUIHdpbGwgcmV0dXJuCisgICAgICAgICAgICAjIFRydWUgb3IgRmFsc2Ugd2hlbiB0aGUgYWxpYXMgaXMgdW5rbm93bi4gIE9uIFRpbSdzIFdpblhQCisgICAgICAgICAgICAjIGJveCB0b2RheSwgaXQgcmV0dXJucyBUcnVlIChubyBleGNlcHRpb24gaXMgcmFpc2VkKS4gIFdoYXQKKyAgICAgICAgICAgICMgd2UnZCByZWFsbHkgbGlrZSB0byB0ZXN0IGlzIHRoYXQgbm8gc291bmQgaXMgcGxheWVkLCBidXQKKyAgICAgICAgICAgICMgdGhhdCByZXF1aXJlcyBmaXJzdCB3aXJpbmcgYW4gZWFyZHJ1bSBjbGFzcyBpbnRvIHVuaXR0ZXN0CisgICAgICAgICAgICAjIDx3aW5rPi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCisgICAgICAgICAgICAgICAgICAgICchIiQlJi8oIysqJywKKyAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PREVGQVVMVAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnISIkJSYvKCMrKicsIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT0RFRkFVTFQKICAgICAgICAgICAgICkKLSAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB0ZXN0X3N0b3Bhc3luYyhzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAotICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywKLSAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9BU1lOQyB8IHdpbnNvdW5kLlNORF9MT09QCi0gICAgICAgICkKLSAgICAgICAgdGltZS5zbGVlcCgwLjUpCi0gICAgICAgIHRyeToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CiAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCiAgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywKLSAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9TVE9QCisgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX0xPT1AKICAgICAgICAgICAgICkKLSAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZTogIyB0aGUgZmlyc3Qgc291bmQgbWlnaHQgYWxyZWFkeSBiZSBmaW5pc2hlZAotICAgICAgICAgICAgcGFzcwotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoTm9uZSwgd2luc291bmQuU05EX1BVUkdFKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAorICAgICAgICAgICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLAorICAgICAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9TVE9QCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOiAjIHRoZSBmaXJzdCBzb3VuZCBtaWdodCBhbHJlYWR5IGJlIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKE5vbmUsIHdpbnNvdW5kLlNORF9QVVJHRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgTm9uZSwgd2luc291bmQuU05EX1BVUkdFCisgICAgICAgICAgICApCisKKworZGVmIF9nZXRfY3NjcmlwdF9wYXRoKCk6CisgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHBhdGggdG8gY3NjcmlwdC5leGUgb3IgTm9uZS4iIiIKKyAgICBmb3IgZGlyIGluIG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgIiIpLnNwbGl0KG9zLnBhdGhzZXApOgorICAgICAgICBjc2NyaXB0X3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCAiY3NjcmlwdC5leGUiKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjc2NyaXB0X3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuIGNzY3JpcHRfcGF0aAorCitfX2hhdmVfc291bmRjYXJkX2NhY2hlID0gTm9uZQorZGVmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICIiIlJldHVybiBUcnVlIGlmZiB0aGlzIGNvbXB1dGVyIGhhcyBhIHNvdW5kY2FyZC4iIiIKKyAgICBnbG9iYWwgX19oYXZlX3NvdW5kY2FyZF9jYWNoZQorICAgIGlmIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUgaXMgTm9uZToKKyAgICAgICAgY3NjcmlwdF9wYXRoID0gX2dldF9jc2NyaXB0X3BhdGgoKQorICAgICAgICBpZiBjc2NyaXB0X3BhdGggaXMgTm9uZToKKyAgICAgICAgICAgICMgQ291bGQgbm90IGZpbmQgY3NjcmlwdC5leGUgdG8gcnVuIG91ciBWQlNjcmlwdCBoZWxwZXIuIERlZmF1bHQKKyAgICAgICAgICAgICMgdG8gVHJ1ZTogbW9zdCBjb21wdXRlcnMgdGhlc2UgZGF5cyAqZG8qIGhhdmUgYSBzb3VuZGNhcmQuCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGNoZWNrX3NjcmlwdCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrX3NvdW5kY2FyZC52YnMiKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbY3NjcmlwdF9wYXRoLCBjaGVja19zY3JpcHRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBfX2hhdmVfc291bmRjYXJkX2NhY2hlID0gbm90IHAud2FpdCgpCisgICAgcmV0dXJuIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCZWVwVGVzdCwgTWVzc2FnZUJlZXBUZXN0LCBQbGF5U291bmRUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aXRoLnB5IGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CmluZGV4IDQ4NTQ0MzYuLjQ4ZTAwZjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTQ5NCw2ICs0OTQsNjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzV2l0aEVycm9yKHNlbGYuZm9vKQogICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKHNlbGYuYmFyKQogCisgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMShzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBjbSgpOgorICAgICAgICAgICAgeWllbGQKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKKyAgICAgICAgY2xhc3MgY20gKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jb250ZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBzaG91bGRUaHJvdykKKworICAgIGRlZiB0ZXN0UmFpc2VkR2VuZXJhdG9yRXhpdDEoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgY20oKToKKyAgICAgICAgICAgIHlpZWxkCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgR2VuZXJhdG9yRXhpdCgiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhHZW5lcmF0b3JFeGl0LCBzaG91bGRUaHJvdykKKworICAgIGRlZiB0ZXN0UmFpc2VkR2VuZXJhdG9yRXhpdDIoc2VsZik6CisgICAgICAgIGNsYXNzIGNtIChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIEdlbmVyYXRvckV4aXQoImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoR2VuZXJhdG9yRXhpdCwgc2hvdWxkVGhyb3cpCisKIAogY2xhc3MgTm9uTG9jYWxGbG93Q29udHJvbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkgYi9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQppbmRleCA0MDU5MGNkLi5jMGQxZGJlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQpAQCAtNTcsMTIgKzU3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAwLCAyKnN5cy5tYXhpbnQpCiAKICAgICAgICAgciA9IHhyYW5nZSgtc3lzLm1heGludCwgc3lzLm1heGludCwgMikKLSAgICAgICAgaWYgc3lzLm1heGludCA+IDB4N2ZmZmZmZmY6Ci0gICAgICAgICAgICAjIFhYWCByYWlzaW5nIFZhbHVlRXJyb3IgaXMgbGVzcyB0aGFuIGlkZWFsLCBidXQgdGhpcyBjYW4ndAotICAgICAgICAgICAgIyBiZSBmaXhlZCB1bnRpbCByYW5nZV9sZW5ndGgoKSByZXR1cm5zIGEgbG9uZyBpbiByYW5nZW9iamVjdC5jCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsZW4sIHIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyKSwgc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ociksIHN5cy5tYXhpbnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhyYW5nZSwgLXN5cy5tYXhpbnQtMSwgc3lzLm1heGludCwgMikKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQppbmRleCBlYjdjYmY2Li40ZTFhODQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpAQCAtMTIsNyArMTIsMTIgQEAKIGZyb20gdGVzdC50ZXN0X2ltcG9ydGhvb2tzIGltcG9ydCBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZSwgdGVzdF9zcmMsIHRlc3RfY28KIAogaW1wb3J0IHppcGltcG9ydAotCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgZG9jdGVzdAoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBTdHJpbmdJTworZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGV4dHJhY3RfdGIsIGV4dHJhY3Rfc3RhY2ssIHByaW50X3RiCityYWlzZV9zcmMgPSAnZGVmIGRvX3JhaXNlKCk6IHJhaXNlIFR5cGVFcnJvclxuJwogCiAjIHNvIHdlIG9ubHkgcnVuIHRlc3RBRmFrZVpsaWIgb25jZSBpZiB0aGlzIHRlc3QgaXMgcnVuIHJlcGVhdGVkbHkKICMgd2hpY2ggaGFwcGVucyB3aGVuIHdlIGxvb2sgZm9yIHJlZiBsZWFrcwpAQCAtNTQsNyArNTksOCBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICAjIFdlJ3JlIHJldXNpbmcgdGhlIHppcCBhcmNoaXZlIHBhdGgsIHNvIHdlIG11c3QgY2xlYXIgdGhlCi0gICAgICAgICMgY2FjaGVkIGRpcmVjdG9yeSBpbmZvLgorICAgICAgICAjIGNhY2hlZCBkaXJlY3RvcnkgaW5mbyBhbmQgbGluZWNhY2hlCisgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKICAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNsZWFyKCkKICAgICAgICAgSW1wb3J0SG9va3NCYXNlVGVzdENhc2Uuc2V0VXAoc2VsZikKIApAQCAtODMsNiArODksMTEgQEAKIAogICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXygiLiIuam9pbihtb2R1bGVzKSwgZ2xvYmFscygpLCBsb2NhbHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJfX2R1bW15X18iXSkKKworICAgICAgICAgICAgY2FsbCA9IGt3LmdldCgnY2FsbCcpCisgICAgICAgICAgICBpZiBjYWxsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNhbGwobW9kKQorCiAgICAgICAgICAgICBpZiBleHBlY3RlZF9leHQ6CiAgICAgICAgICAgICAgICAgZmlsZSA9IG1vZC5nZXRfZmlsZSgpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZmlsZSwgb3MucGF0aC5qb2luKFRFTVBfWklQLApAQCAtMjQ5LDYgKzI2MCw3NCBAQAogICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsCiAgICAgICAgICAgICAgICAgICAgIHN0dWZmPSJTb21lIFN0dWZmIiozMSkKIAorICAgIGRlZiBhc3NlcnRNb2R1bGVTb3VyY2Uoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZShtb2R1bGUpLCB0ZXN0X3NyYykKKworICAgIGRlZiB0ZXN0R2V0U291cmNlKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9ELCBjYWxsPXNlbGYuYXNzZXJ0TW9kdWxlU291cmNlKQorCisgICAgZGVmIHRlc3RHZXRDb21waWxlZFNvdXJjZShzZWxmKToKKyAgICAgICAgcHljID0gbWFrZV9weWMoY29tcGlsZSh0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKSwgTk9XKQorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHB5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUTU9ELCBjYWxsPXNlbGYuYXNzZXJ0TW9kdWxlU291cmNlKQorCisgICAgZGVmIHJ1bkRvY3Rlc3Qoc2VsZiwgY2FsbGJhY2spOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgInh5ei50eHQiOiAoTk9XLCAiPj4+IGxvZy5hcHBlbmQoVHJ1ZSlcbiIpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9Y2FsbGJhY2spCisKKyAgICBkZWYgZG9Eb2N0ZXN0RmlsZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBsb2cgPSBbXQorICAgICAgICBvbGRfbWFzdGVyLCBkb2N0ZXN0Lm1hc3RlciA9IGRvY3Rlc3QubWFzdGVyLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRvY3Rlc3QudGVzdGZpbGUoCisgICAgICAgICAgICAgICAgJ3h5ei50eHQnLCBwYWNrYWdlPW1vZHVsZSwgbW9kdWxlX3JlbGF0aXZlPVRydWUsCisgICAgICAgICAgICAgICAgZ2xvYnM9bG9jYWxzKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRvY3Rlc3QubWFzdGVyID0gb2xkX21hc3RlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZyxbVHJ1ZV0pCisKKyAgICBkZWYgdGVzdERvY3Rlc3RGaWxlKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bkRvY3Rlc3Qoc2VsZi5kb0RvY3Rlc3RGaWxlKQorCisgICAgZGVmIGRvRG9jdGVzdFN1aXRlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIGRvY3Rlc3QuRG9jRmlsZVRlc3QoCisgICAgICAgICAgICAneHl6LnR4dCcsIHBhY2thZ2U9bW9kdWxlLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwKKyAgICAgICAgICAgIGdsb2JzPWxvY2FscygpCisgICAgICAgICkucnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csW1RydWVdKQorCisgICAgZGVmIHRlc3REb2N0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgIHNlbGYucnVuRG9jdGVzdChzZWxmLmRvRG9jdGVzdFN1aXRlKQorCisKKyAgICBkZWYgZG9UcmFjZWJhY2soc2VsZiwgbW9kdWxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kdWxlLmRvX3JhaXNlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXS50Yl9uZXh0CisKKyAgICAgICAgICAgIGYsbG5vLG4sbGluZSA9IGV4dHJhY3RfdGIodGIsIDEpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHJhaXNlX3NyYy5zdHJpcCgpKQorCisgICAgICAgICAgICBmLGxubyxuLGxpbmUgPSBleHRyYWN0X3N0YWNrKHRiLnRiX2ZyYW1lLCAxKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCByYWlzZV9zcmMuc3RyaXAoKSkKKworICAgICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByaW50X3RiKHRiLCAxLCBzKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZ2V0dmFsdWUoKS5lbmRzd2l0aChyYWlzZV9zcmMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgb3VnaHQgdG8gYmUgaW1wb3NzaWJsZSIpCisKKyAgICBkZWYgdGVzdFRyYWNlYmFjayhzZWxmKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCByYWlzZV9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdChOb25lLCBmaWxlcywgVEVTVE1PRCwgY2FsbD1zZWxmLmRvVHJhY2ViYWNrKQorCisKIGNsYXNzIENvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZShVbmNvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZSk6CiAgICAgY29tcHJlc3Npb24gPSBaSVBfREVGTEFURUQKIApkaWZmIC0tZ2l0IGEvTGliL3Rva2VuaXplLnB5IGIvTGliL3Rva2VuaXplLnB5CmluZGV4IDJiNDBlNmYuLmEzMDc5MWMgMTAwNjQ0Ci0tLSBhL0xpYi90b2tlbml6ZS5weQorKysgYi9MaWIvdG9rZW5pemUucHkKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgIGZvciB0b2sgaW4gaXRlcmFibGU6CiAgICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rWzoyXQogCi0gICAgICAgIGlmIHRva251bSA9PSBOQU1FOgorICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CiAgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCiAKICAgICAgICAgaWYgdG9rbnVtID09IElOREVOVDoKZGlmZiAtLWdpdCBhL0xpYi90cmFjZWJhY2sucHkgYi9MaWIvdHJhY2ViYWNrLnB5CmluZGV4IDkzYTY0YjcuLmFiZGE0MjIgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZWJhY2sucHkKKysrIGIvTGliL3RyYWNlYmFjay5weQpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICBfcHJpbnQoZmlsZSwKICAgICAgICAgICAgICAgICcgIEZpbGUgIiVzIiwgbGluZSAlZCwgaW4gJXMnICUgKGZpbGVuYW1lLGxpbmVubyxuYW1lKSkKICAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoZmlsZW5hbWUpCi0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCiAgICAgICAgIGlmIGxpbmU6IF9wcmludChmaWxlLCAnICAgICcgKyBsaW5lLnN0cmlwKCkpCiAgICAgICAgIHRiID0gdGIudGJfbmV4dAogICAgICAgICBuID0gbisxCkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKICAgICAgICAgbmFtZSA9IGNvLmNvX25hbWUKICAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoZmlsZW5hbWUpCi0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCiAgICAgICAgIGlmIGxpbmU6IGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgZWxzZTogbGluZSA9IE5vbmUKICAgICAgICAgbGlzdC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUpKQpAQCAtMTU4LDE0ICsxNTgsMTQgQEAKICAgICAiIiIKICAgICBsaXN0ID0gW10KICAgICBpZiAodHlwZShldHlwZSkgPT0gdHlwZXMuQ2xhc3NUeXBlCi0gICAgICAgIG9yIGlzc3ViY2xhc3MoZXR5cGUsIEV4Y2VwdGlvbikpOgorICAgICAgICBvciAoaXNpbnN0YW5jZShldHlwZSwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXR5cGUsIEV4Y2VwdGlvbikpKToKICAgICAgICAgc3R5cGUgPSBldHlwZS5fX25hbWVfXwogICAgIGVsc2U6CiAgICAgICAgIHN0eXBlID0gZXR5cGUKICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICBsaXN0LmFwcGVuZChzdHIoc3R5cGUpICsgJ1xuJykKICAgICBlbHNlOgotICAgICAgICBpZiBldHlwZSBpcyBTeW50YXhFcnJvcjoKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhldHlwZSwgU3ludGF4RXJyb3IpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG1zZywgKGZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgbGluZSkgPSB2YWx1ZQogICAgICAgICAgICAgZXhjZXB0OgpAQCAtMjc5LDcgKzI3OSw3IEBACiAgICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKICAgICAgICAgbmFtZSA9IGNvLmNvX25hbWUKICAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoZmlsZW5hbWUpCi0gICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCiAgICAgICAgIGlmIGxpbmU6IGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgZWxzZTogbGluZSA9IE5vbmUKICAgICAgICAgbGlzdC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUpKQpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggMTM2ZjQyZS4uZDY1YzBiMCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC00NDIsOSArNDQyLDkgQEAKICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIG5vaGVhZGVycygpLCAiZ29waGVyOiIgKyB1cmwpCiAKICAgICBkZWYgb3Blbl9maWxlKHNlbGYsIHVybCk6CisgICAgICAgICIiIlVzZSBsb2NhbCBmaWxlIG9yIEZUUCBkZXBlbmRpbmcgb24gZm9ybSBvZiBVUkwuIiIiCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHVybCwgc3RyKToKICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnZmlsZSBlcnJvcicsICdwcm94eSBzdXBwb3J0IGZvciBmaWxlIHByb3RvY29sIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQnKQotICAgICAgICAiIiJVc2UgbG9jYWwgZmlsZSBvciBGVFAgZGVwZW5kaW5nIG9uIGZvcm0gb2YgVVJMLiIiIgogICAgICAgICBpZiB1cmxbOjJdID09ICcvLycgYW5kIHVybFsyOjNdICE9ICcvJyBhbmQgdXJsWzI6MTJdLmxvd2VyKCkgIT0gJ2xvY2FsaG9zdC8nOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYub3Blbl9mdHAodXJsKQogICAgICAgICBlbHNlOgpAQCAtMTAzMiw3ICsxMDMyLDcgQEAKICAgICBnbG9iYWwgX2hvc3Rwcm9nCiAgICAgaWYgX2hvc3Rwcm9nIGlzIE5vbmU6CiAgICAgICAgIGltcG9ydCByZQotICAgICAgICBfaG9zdHByb2cgPSByZS5jb21waWxlKCdeLy8oW14vXSopKC4qKSQnKQorICAgICAgICBfaG9zdHByb2cgPSByZS5jb21waWxlKCdeLy8oW14vP10qKSguKikkJykKIAogICAgIG1hdGNoID0gX2hvc3Rwcm9nLm1hdGNoKHVybCkKICAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliMi5weSBiL0xpYi91cmxsaWIyLnB5CmluZGV4IDRjODNiZmMuLmVjMDFjOGYgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIyLnB5CisrKyBiL0xpYi91cmxsaWIyLnB5CkBAIC0xNCw3ICsxNCw3IEBACiBIVFRQIDMwMSwgMzAyLCAzMDMgYW5kIDMwNyByZWRpcmVjdCBlcnJvcnMsIGFuZCB0aGUgSFRUUERpZ2VzdEF1dGhIYW5kbGVyCiBkZWFscyB3aXRoIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KIAotdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSkgLS0gYmFzaWMgdXNhZ2UgaXMgdGhhdCBzYW1lIGFzIG9yaWdpbmFsCit1cmxvcGVuKHVybCwgZGF0YT1Ob25lKSAtLSBiYXNpYyB1c2FnZSBpcyB0aGUgc2FtZSBhcyBvcmlnaW5hbAogdXJsbGliLiAgcGFzcyB0aGUgdXJsIGFuZCBvcHRpb25hbGx5IGRhdGEgdG8gcG9zdCB0byBhbiBIVFRQIFVSTCwgYW5kCiBnZXQgYSBmaWxlLWxpa2Ugb2JqZWN0IGJhY2suICBPbmUgZGlmZmVyZW5jZSBpcyB0aGF0IHlvdSBjYW4gYWxzbyBwYXNzCiBhIFJlcXVlc3QgaW5zdGFuY2UgaW5zdGVhZCBvZiBVUkwuICBSYWlzZXMgYSBVUkxFcnJvciAoc3ViY2xhc3Mgb2YKQEAgLTc3LDE2ICs3NywxMyBAQAogIyB0aGUgaGFuZGxlciBrbm93cyB0aGF0IHRoZSBwcm9ibGVtIHdhcywgZS5nLiwgdGhhdCBpdCBkaWRuJ3Qga25vdwogIyB0aGF0IGhhc2ggYWxnbyB0aGF0IHJlcXVlc3RlZCBpbiB0aGUgY2hhbGxlbmdlLCBpdCB3b3VsZCBiZSBnb29kIHRvCiAjIHBhc3MgdGhhdCBpbmZvcm1hdGlvbiBhbG9uZyB0byB0aGUgY2xpZW50LCB0b28uCi0KLSMgWFhYIHRvIGRvOgotIyBuYW1lIQotIyBkb2N1bWVudGF0aW9uIChnZXR0aW5nIHRoZXJlKQotIyBjb21wbGV4IHByb3hpZXMKLSMgYWJzdHJhY3QgZmFjdG9yeSBmb3Igb3BlbmVyCiAjIGZ0cCBlcnJvcnMgYXJlbid0IGhhbmRsZWQgY2xlYW5seQotIyBnb3BoZXIgY2FuIHJldHVybiBhIHNvY2tldC5lcnJvcgogIyBjaGVjayBkaWdlc3QgYWdhaW5zdCBjb3JyZWN0IChpLmUuIG5vbi1hcGFjaGUpIGltcGxlbWVudGF0aW9uCiAKKyMgUG9zc2libGUgZXh0ZW5zaW9uczoKKyMgY29tcGxleCBwcm94aWVzICBYWFggbm90IHN1cmUgd2hhdCBleGFjdGx5IHdhcyBtZWFudCBieSB0aGlzCisjIGFic3RyYWN0IGZhY3RvcnkgZm9yIG9wZW5lcgorCiBpbXBvcnQgYmFzZTY0CiBpbXBvcnQgZnRwbGliCiBpbXBvcnQgaHR0cGxpYgpAQCAtMTExLDE1ICsxMDgsMTUgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCi0jIG5vdCBzdXJlIGhvdyBtYW55IG9mIHRoZXNlIG5lZWQgdG8gYmUgZ290dGVuIHJpZCBvZgotZnJvbSB1cmxsaWIgaW1wb3J0ICh1bndyYXAsIHVucXVvdGUsIHNwbGl0dHlwZSwgc3BsaXRob3N0LAorZnJvbSB1cmxsaWIgaW1wb3J0ICh1bndyYXAsIHVucXVvdGUsIHNwbGl0dHlwZSwgc3BsaXRob3N0LCBxdW90ZSwKICAgICAgYWRkaW5mb3VybCwgc3BsaXRwb3J0LCBzcGxpdGdvcGhlcnR5cGUsIHNwbGl0cXVlcnksCiAgICAgIHNwbGl0YXR0ciwgZnRwd3JhcHBlciwgbm9oZWFkZXJzLCBzcGxpdHVzZXIsIHNwbGl0cGFzc3dkLCBzcGxpdHZhbHVlKQogCiAjIHN1cHBvcnQgZm9yIEZpbGVIYW5kbGVyLCBwcm94aWVzIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKIGZyb20gdXJsbGliIGltcG9ydCBsb2NhbGhvc3QsIHVybDJwYXRobmFtZSwgZ2V0cHJveGllcwogCi1fX3ZlcnNpb25fXyA9ICIyLjQiCisjIHVzZWQgaW4gVXNlci1BZ2VudCBoZWFkZXIgc2VudAorX192ZXJzaW9uX18gPSBzeXMudmVyc2lvbls6M10KIAogX29wZW5lciA9IE5vbmUKIGRlZiB1cmxvcGVuKHVybCwgZGF0YT1Ob25lKToKQEAgLTMzMCw4ICszMjcsOSBAQAogICAgICAgICBwYXNzCiAKICAgICBkZWYgX2NhbGxfY2hhaW4oc2VsZiwgY2hhaW4sIGtpbmQsIG1ldGhfbmFtZSwgKmFyZ3MpOgotICAgICAgICAjIFhYWCByYWlzZSBhbiBleGNlcHRpb24gaWYgbm8gb25lIGVsc2Ugc2hvdWxkIHRyeSB0byBoYW5kbGUKLSAgICAgICAgIyB0aGlzIHVybC4gIHJldHVybiBOb25lIGlmIHlvdSBjYW4ndCBidXQgc29tZW9uZSBlbHNlIGNvdWxkLgorICAgICAgICAjIEhhbmRsZXJzIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBubyBvbmUgZWxzZSBzaG91bGQgdHJ5IHRvIGhhbmRsZQorICAgICAgICAjIHRoZSByZXF1ZXN0LCBvciByZXR1cm4gTm9uZSBpZiB0aGV5IGNhbid0IGJ1dCBhbm90aGVyIGhhbmRsZXIKKyAgICAgICAgIyBjb3VsZC4gIE90aGVyd2lzZSwgdGhleSByZXR1cm4gdGhlIHJlc3BvbnNlLgogICAgICAgICBoYW5kbGVycyA9IGNoYWluLmdldChraW5kLCAoKSkKICAgICAgICAgZm9yIGhhbmRsZXIgaW4gaGFuZGxlcnM6CiAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihoYW5kbGVyLCBtZXRoX25hbWUpCkBAIC01MDcsNiArNTA1LDggQEAKICAgICAgICAgICAgICMgZnJvbSB0aGUgdXNlciAob2YgdXJsbGliMiwgaW4gdGhpcyBjYXNlKS4gIEluIHByYWN0aWNlLAogICAgICAgICAgICAgIyBlc3NlbnRpYWxseSBhbGwgY2xpZW50cyBkbyByZWRpcmVjdCBpbiB0aGlzIGNhc2UsIHNvIHdlCiAgICAgICAgICAgICAjIGRvIHRoZSBzYW1lLgorICAgICAgICAgICAgIyBiZSBjb25jaWxpYW50IHdpdGggVVJJcyBjb250YWluaW5nIGEgc3BhY2UKKyAgICAgICAgICAgIG5ld3VybCA9IG5ld3VybC5yZXBsYWNlKCcgJywgJyUyMCcpCiAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdChuZXd1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXJlcS5oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0PXJlcS5nZXRfb3JpZ2luX3JlcV9ob3N0KCksCkBAIC01NjEsNiArNTYxLDgwIEBACiAgICAgICAgICAgICAgICJsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuXG4iIFwKICAgICAgICAgICAgICAgIlRoZSBsYXN0IDMweCBlcnJvciBtZXNzYWdlIHdhczpcbiIKIAorCitkZWYgX3BhcnNlX3Byb3h5KHByb3h5KToKKyAgICAiIiJSZXR1cm4gKHNjaGVtZSwgdXNlciwgcGFzc3dvcmQsIGhvc3QvcG9ydCkgZ2l2ZW4gYSBVUkwgb3IgYW4gYXV0aG9yaXR5LgorCisgICAgSWYgYSBVUkwgaXMgc3VwcGxpZWQsIGl0IG11c3QgaGF2ZSBhbiBhdXRob3JpdHkgKGhvc3Q6cG9ydCkgY29tcG9uZW50LgorICAgIEFjY29yZGluZyB0byBSRkMgMzk4NiwgaGF2aW5nIGFuIGF1dGhvcml0eSBjb21wb25lbnQgbWVhbnMgdGhlIFVSTCBtdXN0CisgICAgaGF2ZSB0d28gc2xhc2hlcyBhZnRlciB0aGUgc2NoZW1lOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnZmlsZTovZnRwLmV4YW1wbGUuY29tLycpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IHByb3h5IFVSTCB3aXRoIG5vIGF1dGhvcml0eTogJ2ZpbGU6L2Z0cC5leGFtcGxlLmNvbS8nCisKKyAgICBUaGUgZmlyc3QgdGhyZWUgaXRlbXMgb2YgdGhlIHJldHVybmVkIHR1cGxlIG1heSBiZSBOb25lLgorCisgICAgRXhhbXBsZXMgb2YgYXV0aG9yaXR5IHBhcnNpbmc6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdwcm94eS5leGFtcGxlLmNvbScpCisgICAgKE5vbmUsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgKE5vbmUsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKworICAgIFRoZSBhdXRob3JpdHkgY29tcG9uZW50IG1heSBvcHRpb25hbGx5IGluY2x1ZGUgdXNlcmluZm8gKGFzc3VtZWQgdG8gYmUKKyAgICB1c2VybmFtZTpwYXNzd29yZCk6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdqb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb20nKQorICAgIChOb25lLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdqb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgKE5vbmUsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisKKyAgICBTYW1lIGV4YW1wbGVzLCBidXQgd2l0aCBVUkxzIGluc3RlYWQ6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vcHJveHkuZXhhbXBsZS5jb20vJykKKyAgICAoJ2h0dHAnLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9wcm94eS5leGFtcGxlLmNvbTozMTI4LycpCisgICAgKCdodHRwJywgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb20vJykKKyAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgICgnaHR0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisKKyAgICBFdmVyeXRoaW5nIGFmdGVyIHRoZSBhdXRob3JpdHkgaXMgaWdub3JlZDoKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2Z0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbS9ydWJiaXNoOjMxMjgnKQorICAgICgnZnRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisKKyAgICBUZXN0IGZvciBubyB0cmFpbGluZyAnLycgY2FzZToKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb20nKQorICAgICgnaHR0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorCisgICAgIiIiCisgICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgX3NwbGl0bmV0bG9jCisgICAgc2NoZW1lLCByX3NjaGVtZSA9IHNwbGl0dHlwZShwcm94eSkKKyAgICBpZiBub3Qgcl9zY2hlbWUuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAjIGF1dGhvcml0eQorICAgICAgICBzY2hlbWUgPSBOb25lCisgICAgICAgIGF1dGhvcml0eSA9IHByb3h5CisgICAgZWxzZToKKyAgICAgICAgIyBVUkwKKyAgICAgICAgaWYgbm90IHJfc2NoZW1lLnN0YXJ0c3dpdGgoIi8vIik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwcm94eSBVUkwgd2l0aCBubyBhdXRob3JpdHk6ICVyIiAlIHByb3h5KQorICAgICAgICAjIFdlIGhhdmUgYW4gYXV0aG9yaXR5LCBzbyBmb3IgUkZDIDM5ODYtY29tcGxpYW50IFVSTHMgKGJ5IHNzIDMuCisgICAgICAgICMgYW5kIDMuMy4pLCBwYXRoIGlzIGVtcHR5IG9yIHN0YXJ0cyB3aXRoICcvJworICAgICAgICBlbmQgPSByX3NjaGVtZS5maW5kKCIvIiwgMikKKyAgICAgICAgaWYgZW5kID09IC0xOgorICAgICAgICAgICAgZW5kID0gTm9uZQorICAgICAgICBhdXRob3JpdHkgPSByX3NjaGVtZVsyOmVuZF0KKyAgICB1c2VyaW5mbywgaG9zdHBvcnQgPSBzcGxpdHVzZXIoYXV0aG9yaXR5KQorICAgIGlmIHVzZXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICB1c2VyLCBwYXNzd29yZCA9IHNwbGl0cGFzc3dkKHVzZXJpbmZvKQorICAgIGVsc2U6CisgICAgICAgIHVzZXIgPSBwYXNzd29yZCA9IE5vbmUKKyAgICByZXR1cm4gc2NoZW1lLCB1c2VyLCBwYXNzd29yZCwgaG9zdHBvcnQKKwogY2xhc3MgUHJveHlIYW5kbGVyKEJhc2VIYW5kbGVyKToKICAgICAjIFByb3hpZXMgbXVzdCBiZSBpbiBmcm9udAogICAgIGhhbmRsZXJfb3JkZXIgPSAxMDAKQEAgLTU3Nyw3NiArNjUxLDI3IEBACiAKICAgICBkZWYgcHJveHlfb3BlbihzZWxmLCByZXEsIHByb3h5LCB0eXBlKToKICAgICAgICAgb3JpZ190eXBlID0gcmVxLmdldF90eXBlKCkKLSAgICAgICAgdHlwZSwgcl90eXBlID0gc3BsaXR0eXBlKHByb3h5KQotICAgICAgICBpZiBub3QgdHlwZSBvciByX3R5cGUuaXNkaWdpdCgpOgotICAgICAgICAgICAgIyBwcm94eSBpcyBzcGVjaWZpZWQgd2l0aG91dCBwcm90b2NvbAotICAgICAgICAgICAgdHlwZSA9IG9yaWdfdHlwZQotICAgICAgICAgICAgaG9zdCA9IHByb3h5Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBob3N0LCByX2hvc3QgPSBzcGxpdGhvc3Qocl90eXBlKQotICAgICAgICB1c2VyX3Bhc3MsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKLSAgICAgICAgdXNlciwgcGFzc3dvcmQgPSBzcGxpdHBhc3N3ZCh1c2VyX3Bhc3MpCisgICAgICAgIHByb3h5X3R5cGUsIHVzZXIsIHBhc3N3b3JkLCBob3N0cG9ydCA9IF9wYXJzZV9wcm94eShwcm94eSkKKyAgICAgICAgaWYgcHJveHlfdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcHJveHlfdHlwZSA9IG9yaWdfdHlwZQogICAgICAgICBpZiB1c2VyIGFuZCBwYXNzd29yZDoKLSAgICAgICAgICAgIHVzZXIsIHBhc3N3b3JkID0gdXNlcl9wYXNzLnNwbGl0KCc6JywgMSkKLSAgICAgICAgICAgIHVzZXJfcGFzcyA9IGJhc2U2NC5lbmNvZGVzdHJpbmcoJyVzOiVzJyAlICh1bnF1b3RlKHVzZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlKHBhc3N3b3JkKSkpLnN0cmlwKCkKLSAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1hdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyB1c2VyX3Bhc3MpCi0gICAgICAgIGhvc3QgPSB1bnF1b3RlKGhvc3QpCi0gICAgICAgIHJlcS5zZXRfcHJveHkoaG9zdCwgdHlwZSkKLSAgICAgICAgaWYgb3JpZ190eXBlID09IHR5cGU6CisgICAgICAgICAgICB1c2VyX3Bhc3MgPSAnJXM6JXMnICUgKHVucXVvdGUodXNlciksIHVucXVvdGUocGFzc3dvcmQpKQorICAgICAgICAgICAgY3JlZHMgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJfcGFzcykuc3RyaXAoKQorICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LWF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGNyZWRzKQorICAgICAgICBob3N0cG9ydCA9IHVucXVvdGUoaG9zdHBvcnQpCisgICAgICAgIHJlcS5zZXRfcHJveHkoaG9zdHBvcnQsIHByb3h5X3R5cGUpCisgICAgICAgIGlmIG9yaWdfdHlwZSA9PSBwcm94eV90eXBlOgogICAgICAgICAgICAgIyBsZXQgb3RoZXIgaGFuZGxlcnMgdGFrZSBjYXJlIG9mIGl0Ci0gICAgICAgICAgICAjIFhYWCB0aGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIHByb3h5IGlzIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICMgb3RoZXIgaGFuZGxlcnMKICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIG5lZWQgdG8gc3RhcnQgb3ZlciwgYmVjYXVzZSB0aGUgb3RoZXIgaGFuZGxlcnMgZG9uJ3QKICAgICAgICAgICAgICMgZ3JvayB0aGUgcHJveHkncyBVUkwgdHlwZQorICAgICAgICAgICAgIyBlLmcuIGlmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciBhcmcgcHJveGllcyBsaWtlIHNvOgorICAgICAgICAgICAgIyB7J2h0dHAnOiAnZnRwOi8vcHJveHkuZXhhbXBsZS5jb20nfSwgd2UgbWF5IGVuZCB1cCB0dXJuaW5nCisgICAgICAgICAgICAjIGEgcmVxdWVzdCBmb3IgaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vYSBpbnRvIG9uZSBmb3IKKyAgICAgICAgICAgICMgZnRwOi8vcHJveHkuZXhhbXBsZS5jb20vYQogICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxKQogCi0jIGZlYXR1cmUgc3VnZ2VzdGVkIGJ5IER1bmNhbiBCb290aAotIyBYWFggY3VzdG9tIGlzIG5vdCBhIGdvb2QgbmFtZQotY2xhc3MgQ3VzdG9tUHJveHk6Ci0gICAgIyBlaXRoZXIgcGFzcyBhIGZ1bmN0aW9uIHRvIHRoZSBjb25zdHJ1Y3RvciBvciBvdmVycmlkZSBoYW5kbGUKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG8sIGZ1bmM9Tm9uZSwgcHJveHlfYWRkcj1Ob25lKToKLSAgICAgICAgc2VsZi5wcm90byA9IHByb3RvCi0gICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKLSAgICAgICAgc2VsZi5hZGRyID0gcHJveHlfYWRkcgotCi0gICAgZGVmIGhhbmRsZShzZWxmLCByZXEpOgotICAgICAgICBpZiBzZWxmLmZ1bmMgYW5kIHNlbGYuZnVuYyhyZXEpOgotICAgICAgICAgICAgcmV0dXJuIDEKLQotICAgIGRlZiBnZXRfcHJveHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmFkZHIKLQotY2xhc3MgQ3VzdG9tUHJveHlIYW5kbGVyKEJhc2VIYW5kbGVyKToKLSAgICAjIFByb3hpZXMgbXVzdCBiZSBpbiBmcm9udAotICAgIGhhbmRsZXJfb3JkZXIgPSAxMDAKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqcHJveGllcyk6Ci0gICAgICAgIHNlbGYucHJveGllcyA9IHt9Ci0KLSAgICBkZWYgcHJveHlfb3BlbihzZWxmLCByZXEpOgotICAgICAgICBwcm90byA9IHJlcS5nZXRfdHlwZSgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHByb3hpZXMgPSBzZWxmLnByb3hpZXNbcHJvdG9dCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGZvciBwIGluIHByb3hpZXM6Ci0gICAgICAgICAgICBpZiBwLmhhbmRsZShyZXEpOgotICAgICAgICAgICAgICAgIHJlcS5zZXRfcHJveHkocC5nZXRfcHJveHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEpCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICBkZWYgZG9fcHJveHkoc2VsZiwgcCwgcmVxKToKLSAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxKQotCi0gICAgZGVmIGFkZF9wcm94eShzZWxmLCBjcG8pOgotICAgICAgICBpZiBjcG8ucHJvdG8gaW4gc2VsZi5wcm94aWVzOgotICAgICAgICAgICAgc2VsZi5wcm94aWVzW2Nwby5wcm90b10uYXBwZW5kKGNwbykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYucHJveGllc1tjcG8ucHJvdG9dID0gW2Nwb10KLQogY2xhc3MgSFRUUFBhc3N3b3JkTWdyOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5wYXNzd2QgPSB7fQpAQCAtMTEyOCw4ICsxMTUzLDExIEBACiAgICAgbmFtZXMgPSBOb25lCiAgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKICAgICAgICAgaWYgRmlsZUhhbmRsZXIubmFtZXMgaXMgTm9uZToKLSAgICAgICAgICAgIEZpbGVIYW5kbGVyLm5hbWVzID0gKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBGaWxlSGFuZGxlci5uYW1lcyA9IChzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgICAgIEZpbGVIYW5kbGVyLm5hbWVzID0gKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwpCiAgICAgICAgIHJldHVybiBGaWxlSGFuZGxlci5uYW1lcwogCiAgICAgIyBub3QgZW50aXJlbHkgc3VyZSB3aGF0IHRoZSBydWxlcyBhcmUgaGVyZQpAQCAtMTI1OCw2ICsxMjg2LDcgQEAKIAogY2xhc3MgR29waGVySGFuZGxlcihCYXNlSGFuZGxlcik6CiAgICAgZGVmIGdvcGhlcl9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgICMgWFhYIGNhbiByYWlzZSBzb2NrZXQuZXJyb3IKICAgICAgICAgaW1wb3J0IGdvcGhlcmxpYiAgIyB0aGlzIHJhaXNlcyBEZXByZWNhdGlvbldhcm5pbmcgaW4gMi41CiAgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQogICAgICAgICBpZiBub3QgaG9zdDoKQEAgLTEyNzMsMjUgKzEzMDIsMyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgZnAgPSBnb3BoZXJsaWIuc2VuZF9zZWxlY3RvcihzZWxlY3RvciwgaG9zdCkKICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIG5vaGVhZGVycygpLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCi0KLSNibGVjayEgZG9uJ3QgdXNlIHRoaXMgeWV0Ci1jbGFzcyBPcGVuZXJGYWN0b3J5OgotCi0gICAgZGVmYXVsdF9oYW5kbGVycyA9IFtVbmtub3duSGFuZGxlciwgSFRUUEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBIVFRQRGVmYXVsdEVycm9ySGFuZGxlciwgSFRUUFJlZGlyZWN0SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUUEhhbmRsZXIsIEZpbGVIYW5kbGVyXQotICAgIGhhbmRsZXJzID0gW10KLSAgICByZXBsYWNlbWVudF9oYW5kbGVycyA9IFtdCi0KLSAgICBkZWYgYWRkX2hhbmRsZXIoc2VsZiwgaCk6Ci0gICAgICAgIHNlbGYuaGFuZGxlcnMgPSBzZWxmLmhhbmRsZXJzICsgW2hdCi0KLSAgICBkZWYgcmVwbGFjZV9oYW5kbGVyKHNlbGYsIGgpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgYnVpbGRfb3BlbmVyKHNlbGYpOgotICAgICAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCi0gICAgICAgIGZvciBwaCBpbiBzZWxmLmRlZmF1bHRfaGFuZGxlcnM6Ci0gICAgICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3MocGgpOgotICAgICAgICAgICAgICAgIHBoID0gcGgoKQotICAgICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKHBoKQpkaWZmIC0tZ2l0IGEvTGliL3VybHBhcnNlLnB5IGIvTGliL3VybHBhcnNlLnB5CmluZGV4IDhiNzUwNTEuLmVhZGUwNDAgMTAwNjQ0Ci0tLSBhL0xpYi91cmxwYXJzZS5weQorKysgYi9MaWIvdXJscGFyc2UucHkKQEAgLTE2LDEyICsxNiwxMiBAQAogICAgICAgICAgICAgICAgJ3NuZXdzJywgJ3Byb3NwZXJvJywgJ3J0c3AnLCAncnRzcHUnLCAncnN5bmMnLCAnJywKICAgICAgICAgICAgICAgICdzdm4nLCAnc3ZuK3NzaCcsICdzZnRwJ10KIG5vbl9oaWVyYXJjaGljYWwgPSBbJ2dvcGhlcicsICdoZGwnLCAnbWFpbHRvJywgJ25ld3MnLAotICAgICAgICAgICAgICAgICAgICAndGVsbmV0JywgJ3dhaXMnLCAnaW1hcCcsICdzbmV3cycsICdzaXAnXQorICAgICAgICAgICAgICAgICAgICAndGVsbmV0JywgJ3dhaXMnLCAnaW1hcCcsICdzbmV3cycsICdzaXAnLCAnc2lwcyddCiB1c2VzX3BhcmFtcyA9IFsnZnRwJywgJ2hkbCcsICdwcm9zcGVybycsICdodHRwJywgJ2ltYXAnLAotICAgICAgICAgICAgICAgJ2h0dHBzJywgJ3NodHRwJywgJ3J0c3AnLCAncnRzcHUnLCAnc2lwJywKKyAgICAgICAgICAgICAgICdodHRwcycsICdzaHR0cCcsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICdzaXBzJywKICAgICAgICAgICAgICAgICdtbXMnLCAnJywgJ3NmdHAnXQogdXNlc19xdWVyeSA9IFsnaHR0cCcsICd3YWlzJywgJ2ltYXAnLCAnaHR0cHMnLCAnc2h0dHAnLCAnbW1zJywKLSAgICAgICAgICAgICAgJ2dvcGhlcicsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICcnXQorICAgICAgICAgICAgICAnZ29waGVyJywgJ3J0c3AnLCAncnRzcHUnLCAnc2lwJywgJ3NpcHMnLCAnJ10KIHVzZXNfZnJhZ21lbnQgPSBbJ2Z0cCcsICdoZGwnLCAnaHR0cCcsICdnb3BoZXInLCAnbmV3cycsCiAgICAgICAgICAgICAgICAgICdubnRwJywgJ3dhaXMnLCAnaHR0cHMnLCAnc2h0dHAnLCAnc25ld3MnLAogICAgICAgICAgICAgICAgICAnZmlsZScsICdwcm9zcGVybycsICcnXQpAQCAtNDEsNyArNDEsMTExIEBACiAgICAgX3BhcnNlX2NhY2hlID0ge30KIAogCi1kZWYgdXJscGFyc2UodXJsLCBzY2hlbWU9JycsIGFsbG93X2ZyYWdtZW50cz0xKToKK2NsYXNzIEJhc2VSZXN1bHQodHVwbGUpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHRoZSBwYXJzZWQgcmVzdWx0IG9iamVjdHMuCisKKyAgICBUaGlzIHByb3ZpZGVzIHRoZSBhdHRyaWJ1dGVzIHNoYXJlZCBieSB0aGUgdHdvIGRlcml2ZWQgcmVzdWx0CisgICAgb2JqZWN0cyBhcyByZWFkLW9ubHkgcHJvcGVydGllcy4gIFRoZSBkZXJpdmVkIGNsYXNzZXMgYXJlCisgICAgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzIHdlcmUKKyAgICBzdXBwbGllZCB0byB0aGUgY29uc3RydWN0b3IuCisKKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICAjIEF0dHJpYnV0ZXMgdGhhdCBhY2Nlc3MgdGhlIGJhc2ljIGNvbXBvbmVudHMgb2YgdGhlIFVSTDoKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzY2hlbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWzBdCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV0bG9jKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlsxXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWzJdCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcXVlcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmWy0yXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGZyYWdtZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlstMV0KKworICAgICMgQWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gcGFyc2VkLW91dCBwb3J0aW9ucworICAgICMgb2YgdGhlIG5ldGxvYzoKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB1c2VybmFtZShzZWxmKToKKyAgICAgICAgbmV0bG9jID0gc2VsZi5uZXRsb2MKKyAgICAgICAgaWYgIkAiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIHVzZXJpbmZvID0gbmV0bG9jLnNwbGl0KCJAIiwgMSlbMF0KKyAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKKyAgICAgICAgICAgICAgICB1c2VyaW5mbyA9IHVzZXJpbmZvLnNwbGl0KCI6IiwgMSlbMF0KKyAgICAgICAgICAgIHJldHVybiB1c2VyaW5mbworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhc3N3b3JkKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgdXNlcmluZm8gPSBuZXRsb2Muc3BsaXQoIkAiLCAxKVswXQorICAgICAgICAgICAgaWYgIjoiIGluIHVzZXJpbmZvOgorICAgICAgICAgICAgICAgIHJldHVybiB1c2VyaW5mby5zcGxpdCgiOiIsIDEpWzFdCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaG9zdG5hbWUoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2Muc3BsaXQoIkAiLCAxKVsxXQorICAgICAgICBpZiAiOiIgaW4gbmV0bG9jOgorICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLnNwbGl0KCI6IiwgMSlbMF0KKyAgICAgICAgcmV0dXJuIG5ldGxvYy5sb3dlcigpIG9yIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwb3J0KHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLnNwbGl0KCJAIiwgMSlbMV0KKyAgICAgICAgaWYgIjoiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIHBvcnQgPSBuZXRsb2Muc3BsaXQoIjoiLCAxKVsxXQorICAgICAgICAgICAgcmV0dXJuIGludChwb3J0LCAxMCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBTcGxpdFJlc3VsdChCYXNlUmVzdWx0KToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpOgorICAgICAgICByZXR1cm4gQmFzZVJlc3VsdC5fX25ld19fKAorICAgICAgICAgICAgY2xzLCAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkpCisKKyAgICBkZWYgZ2V0dXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gdXJsdW5zcGxpdChzZWxmKQorCisKK2NsYXNzIFBhcnNlUmVzdWx0KEJhc2VSZXN1bHQpOgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX25ld19fKGNscywgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KToKKyAgICAgICAgcmV0dXJuIEJhc2VSZXN1bHQuX19uZXdfXygKKyAgICAgICAgICAgIGNscywgKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFyYW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlszXQorCisgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHVybHVucGFyc2Uoc2VsZikKKworCitkZWYgdXJscGFyc2UodXJsLCBzY2hlbWU9JycsIGFsbG93X2ZyYWdtZW50cz1UcnVlKToKICAgICAiIiJQYXJzZSBhIFVSTCBpbnRvIDYgY29tcG9uZW50czoKICAgICA8c2NoZW1lPjovLzxuZXRsb2M+LzxwYXRoPjs8cGFyYW1zPj88cXVlcnk+IzxmcmFnbWVudD4KICAgICBSZXR1cm4gYSA2LXR1cGxlOiAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KS4KQEAgLTUzLDcgKzE1Nyw3IEBACiAgICAgICAgIHVybCwgcGFyYW1zID0gX3NwbGl0cGFyYW1zKHVybCkKICAgICBlbHNlOgogICAgICAgICBwYXJhbXMgPSAnJwotICAgIHJldHVybiBzY2hlbWUsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudAorICAgIHJldHVybiBQYXJzZVJlc3VsdChzY2hlbWUsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkKIAogZGVmIF9zcGxpdHBhcmFtcyh1cmwpOgogICAgIGlmICcvJyAgaW4gdXJsOgpAQCAtNzMsMTIgKzE3NywxMyBAQAogICAgICAgICBkZWxpbSA9IGxlbih1cmwpCiAgICAgcmV0dXJuIHVybFtzdGFydDpkZWxpbV0sIHVybFtkZWxpbTpdCiAKLWRlZiB1cmxzcGxpdCh1cmwsIHNjaGVtZT0nJywgYWxsb3dfZnJhZ21lbnRzPTEpOgorZGVmIHVybHNwbGl0KHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBVUkwgaW50byA1IGNvbXBvbmVudHM6CiAgICAgPHNjaGVtZT46Ly88bmV0bG9jPi88cGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CiAgICAgUmV0dXJuIGEgNS10dXBsZTogKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpLgogICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBicmVhayB0aGUgY29tcG9uZW50cyB1cCBpbiBzbWFsbGVyIGJpdHMKICAgICAoZS5nLiBuZXRsb2MgaXMgYSBzaW5nbGUgc3RyaW5nKSBhbmQgd2UgZG9uJ3QgZXhwYW5kICUgZXNjYXBlcy4iIiIKKyAgICBhbGxvd19mcmFnbWVudHMgPSBib29sKGFsbG93X2ZyYWdtZW50cykKICAgICBrZXkgPSB1cmwsIHNjaGVtZSwgYWxsb3dfZnJhZ21lbnRzCiAgICAgY2FjaGVkID0gX3BhcnNlX2NhY2hlLmdldChrZXksIE5vbmUpCiAgICAgaWYgY2FjaGVkOgpAQCAtOTcsOSArMjAyLDkgQEAKICAgICAgICAgICAgICAgICB1cmwsIGZyYWdtZW50ID0gdXJsLnNwbGl0KCcjJywgMSkKICAgICAgICAgICAgIGlmICc/JyBpbiB1cmw6CiAgICAgICAgICAgICAgICAgdXJsLCBxdWVyeSA9IHVybC5zcGxpdCgnPycsIDEpCi0gICAgICAgICAgICB0dXBsZSA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudAotICAgICAgICAgICAgX3BhcnNlX2NhY2hlW2tleV0gPSB0dXBsZQotICAgICAgICAgICAgcmV0dXJuIHR1cGxlCisgICAgICAgICAgICB2ID0gU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50KQorICAgICAgICAgICAgX3BhcnNlX2NhY2hlW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgogICAgICAgICBmb3IgYyBpbiB1cmxbOmldOgogICAgICAgICAgICAgaWYgYyBub3QgaW4gc2NoZW1lX2NoYXJzOgogICAgICAgICAgICAgICAgIGJyZWFrCkBAIC0xMTEsOSArMjE2LDkgQEAKICAgICAgICAgdXJsLCBmcmFnbWVudCA9IHVybC5zcGxpdCgnIycsIDEpCiAgICAgaWYgc2NoZW1lIGluIHVzZXNfcXVlcnkgYW5kICc/JyBpbiB1cmw6CiAgICAgICAgIHVybCwgcXVlcnkgPSB1cmwuc3BsaXQoJz8nLCAxKQotICAgIHR1cGxlID0gc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50Ci0gICAgX3BhcnNlX2NhY2hlW2tleV0gPSB0dXBsZQotICAgIHJldHVybiB0dXBsZQorICAgIHYgPSBTcGxpdFJlc3VsdChzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQpCisgICAgX3BhcnNlX2NhY2hlW2tleV0gPSB2CisgICAgcmV0dXJuIHYKIAogZGVmIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSk6CiAgICAgIiIiUHV0IGEgcGFyc2VkIFVSTCBiYWNrIHRvZ2V0aGVyIGFnYWluLiAgVGhpcyBtYXkgcmVzdWx0IGluIGEKQEAgLTEzNiw3ICsyNDEsNyBAQAogICAgICAgICB1cmwgPSB1cmwgKyAnIycgKyBmcmFnbWVudAogICAgIHJldHVybiB1cmwKIAotZGVmIHVybGpvaW4oYmFzZSwgdXJsLCBhbGxvd19mcmFnbWVudHMgPSAxKToKK2RlZiB1cmxqb2luKGJhc2UsIHVybCwgYWxsb3dfZnJhZ21lbnRzPVRydWUpOgogICAgICIiIkpvaW4gYSBiYXNlIFVSTCBhbmQgYSBwb3NzaWJseSByZWxhdGl2ZSBVUkwgdG8gZm9ybSBhbiBhYnNvbHV0ZQogICAgIGludGVycHJldGF0aW9uIG9mIHRoZSBsYXR0ZXIuIiIiCiAgICAgaWYgbm90IGJhc2U6CmRpZmYgLS1naXQgYS9MaWIvdXUucHkgYi9MaWIvdXUucHkKaW5kZXggNDBlOGJmMC4uM2NjZWRiMCAxMDA3NTUKLS0tIGEvTGliL3V1LnB5CisrKyBiL0xpYi91dS5weQpAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgICAgICBkYXRhID0gYmluYXNjaWkuYTJiX3V1KHMpCiAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvciwgdjoKICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgYnJva2VuIHV1ZW5jb2RlcnMgYnkgL0ZyZWRyaWsgTHVuZGgKLSAgICAgICAgICAgIG5ieXRlcyA9ICgoKG9yZChzWzBdKS0zMikgJiA2MykgKiA0ICsgNSkgLyAzCisgICAgICAgICAgICBuYnl0ZXMgPSAoKChvcmQoc1swXSktMzIpICYgNjMpICogNCArIDUpIC8vIDMKICAgICAgICAgICAgIGRhdGEgPSBiaW5hc2NpaS5hMmJfdXUoc1s6bmJ5dGVzXSkKICAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiAlc1xuIiAlIHYpCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgICBpZiBsZW4oYXJncykgPiAyOgotICAgICAgICBwLmVycm9yKCdpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cycpCisgICAgICAgIHBhcnNlci5lcnJvcignaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMnKQogICAgICAgICBzeXMuZXhpdCgxKQogCiAgICAgaW5wdXQgPSBzeXMuc3RkaW4KZGlmZiAtLWdpdCBhL0xpYi93YXJuaW5ncy5weSBiL0xpYi93YXJuaW5ncy5weQppbmRleCBlNjIyYjlhLi5iYzBiODE4IDEwMDY0NAotLS0gYS9MaWIvd2FybmluZ3MucHkKKysrIGIvTGliL3dhcm5pbmdzLnB5CkBAIC01OCwxMCArNTgsMTEgQEAKICAgICAgICAgaWYgbm90IGZpbGVuYW1lOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUKICAgICByZWdpc3RyeSA9IGdsb2JhbHMuc2V0ZGVmYXVsdCgiX193YXJuaW5ncmVnaXN0cnlfXyIsIHt9KQotICAgIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnkpCisgICAgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgIGdsb2JhbHMpCiAKIGRlZiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUpOgorICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgogICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgICBtb2R1bGUgPSBmaWxlbmFtZSBvciAiPHVua25vd24+IgogICAgICAgICBpZiBtb2R1bGVbLTM6XS5sb3dlcigpID09ICIucHkiOgpAQCAtOTIsNiArOTMsMTEgQEAKICAgICBpZiBhY3Rpb24gPT0gImlnbm9yZSI6CiAgICAgICAgIHJlZ2lzdHJ5W2tleV0gPSAxCiAgICAgICAgIHJldHVybgorCisgICAgIyBQcmltZSB0aGUgbGluZWNhY2hlIGZvciBmb3JtYXR0aW5nLCBpbiBjYXNlIHRoZQorICAgICMgImZpbGUiIGlzIGFjdHVhbGx5IGluIGEgemlwZmlsZSBvciBzb21ldGhpbmcuCisgICAgbGluZWNhY2hlLmdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKKwogICAgIGlmIGFjdGlvbiA9PSAiZXJyb3IiOgogICAgICAgICByYWlzZSBtZXNzYWdlCiAgICAgIyBPdGhlciBhY3Rpb25zCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5IGIvTGliL3htbGNvcmUvZG9tL2V4cGF0YnVpbGRlci5weQppbmRleCA4MWQ5YzJiLi4zMmZmYTQxIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5CisrKyBiL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAiTk1UT0tFTlMiOiBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJubXRva2VucyIpLAogICAgIH0KIAotY2xhc3MgRWxlbWVudEluZm8oTmV3U3R5bGUpOgorY2xhc3MgRWxlbWVudEluZm8ob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnX2F0dHJfaW5mbycsICdfbW9kZWwnLCAndGFnTmFtZScKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWdOYW1lLCBtb2RlbD1Ob25lKToKQEAgLTQ2MCw3ICs0NjAsNyBAQAogIyB3aGVyZSBhbGxvd2VkLgogX0FMTE9XRURfRklMVEVSX1JFVFVSTlMgPSAoRklMVEVSX0FDQ0VQVCwgRklMVEVSX1JFSkVDVCwgRklMVEVSX1NLSVApCiAKLWNsYXNzIEZpbHRlclZpc2liaWxpdHlDb250cm9sbGVyKE5ld1N0eWxlKToKK2NsYXNzIEZpbHRlclZpc2liaWxpdHlDb250cm9sbGVyKG9iamVjdCk6CiAgICAgIiIiV3JhcHBlciBhcm91bmQgYSBET01CdWlsZGVyRmlsdGVyIHdoaWNoIGltcGxlbWVudHMgdGhlIGNoZWNrcwogICAgIHRvIG1ha2UgdGhlIHdoYXRUb1Nob3cgZmlsdGVyIGF0dHJpYnV0ZSB3b3JrLiIiIgogCkBAIC01MTgsNyArNTE4LDcgQEAKICAgICAgICAgfQogCiAKLWNsYXNzIEZpbHRlckNydXRjaChOZXdTdHlsZSk6CitjbGFzcyBGaWx0ZXJDcnV0Y2gob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnX2J1aWxkZXInLCAnX2xldmVsJywgJ19vbGRfc3RhcnQnLCAnX29sZF9lbmQnCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CkBAIC05MDgsNyArOTA4LDcgQEAKICAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUoKQogCiAKLWRlZiBwYXJzZShmaWxlLCBuYW1lc3BhY2VzPTEpOgorZGVmIHBhcnNlKGZpbGUsIG5hbWVzcGFjZXM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBkb2N1bWVudCwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgRG9jdW1lbnQgbm9kZS4KIAogICAgICdmaWxlJyBtYXkgYmUgZWl0aGVyIGEgZmlsZSBuYW1lIG9yIGFuIG9wZW4gZmlsZSBvYmplY3QuCkBAIC05MjksNyArOTI5LDcgQEAKICAgICByZXR1cm4gcmVzdWx0CiAKIAotZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgbmFtZXNwYWNlcz0xKToKK2RlZiBwYXJzZVN0cmluZyhzdHJpbmcsIG5hbWVzcGFjZXM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBkb2N1bWVudCBmcm9tIGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZwogICAgIERvY3VtZW50IG5vZGUuCiAgICAgIiIiCkBAIC05NDAsNyArOTQwLDcgQEAKICAgICByZXR1cm4gYnVpbGRlci5wYXJzZVN0cmluZyhzdHJpbmcpCiAKIAotZGVmIHBhcnNlRnJhZ21lbnQoZmlsZSwgY29udGV4dCwgbmFtZXNwYWNlcz0xKToKK2RlZiBwYXJzZUZyYWdtZW50KGZpbGUsIGNvbnRleHQsIG5hbWVzcGFjZXM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBmcmFnbWVudCBvZiBhIGRvY3VtZW50LCBnaXZlbiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIGl0CiAgICAgd2FzIG9yaWdpbmFsbHkgZXh0cmFjdGVkLiAgY29udGV4dCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUKICAgICBub2RlKHMpIHdoaWNoIGFyZSBpbiB0aGUgZnJhZ21lbnQuCkBAIC05NjMsNyArOTYzLDcgQEAKICAgICByZXR1cm4gcmVzdWx0CiAKIAotZGVmIHBhcnNlRnJhZ21lbnRTdHJpbmcoc3RyaW5nLCBjb250ZXh0LCBuYW1lc3BhY2VzPTEpOgorZGVmIHBhcnNlRnJhZ21lbnRTdHJpbmcoc3RyaW5nLCBjb250ZXh0LCBuYW1lc3BhY2VzPVRydWUpOgogICAgICIiIlBhcnNlIGEgZnJhZ21lbnQgb2YgYSBkb2N1bWVudCBmcm9tIGEgc3RyaW5nLCBnaXZlbiB0aGUgY29udGV4dAogICAgIGZyb20gd2hpY2ggaXQgd2FzIG9yaWdpbmFsbHkgZXh0cmFjdGVkLiAgY29udGV4dCBzaG91bGQgYmUgdGhlCiAgICAgcGFyZW50IG9mIHRoZSBub2RlKHMpIHdoaWNoIGFyZSBpbiB0aGUgZnJhZ21lbnQuCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vbWluaWNvbXBhdC5weSBiL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CmluZGV4IDM2NGNhNDUuLmY5OWI3ZmUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CisrKyBiL0xpYi94bWxjb3JlL2RvbS9taW5pY29tcGF0LnB5CkBAIC00LDEwICs0LDYgQEAKICMKICMgVGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgZGVmaW5lZDoKICMKLSMgICBpc2luc3RhbmNlICAgIC0tIHZlcnNpb24gb2YgdGhlIGlzaW5zdGFuY2UoKSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMKLSMgICAgICAgICAgICAgICAgICAgIHR1cGxlcyBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciByZWdhcmRsZXNzIG9mIHRoZQotIyAgICAgICAgICAgICAgICAgICAgUHl0aG9uIHZlcnNpb24KLSMKICMgICBOb2RlTGlzdCAgICAgIC0tIGxpZ2h0ZXN0IHBvc3NpYmxlIE5vZGVMaXN0IGltcGxlbWVudGF0aW9uCiAjCiAjICAgRW1wdHlOb2RlTGlzdCAtLSBsaWdodGVzdCBwb3NzaWJsZSBOb2RlTGlzdCB0aGF0IGlzIGd1YXJhdGVlZCB0bwpAQCAtMTUsOCArMTEsNiBAQAogIwogIyAgIFN0cmluZ1R5cGVzICAgLS0gdHVwbGUgb2YgZGVmaW5lZCBzdHJpbmcgdHlwZXMKICMKLSMgICBHZXRhdHRyTWFnaWMgIC0tIGJhc2UgY2xhc3MgdXNlZCB0byBtYWtlIF9nZXRfPGF0dHI+IGJlIG1hZ2ljYWxseQotIyAgICAgICAgICAgICAgICAgICAgaW52b2tlZCB3aGVuIGF2YWlsYWJsZQogIyAgIGRlZnByb3BlcnR5ICAgLS0gZnVuY3Rpb24gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEdldGF0dHJNYWdpYzsKICMgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZXNlIHRvZ2V0aGVyIGlzIG5lZWRlZCB0byBtYWtlIHRoZW0gd29yawogIyAgICAgICAgICAgICAgICAgICAgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUgaW4gYm90aCBQeXRob24gMi4yKwpAQCAtNDEsMTQgKzM1LDggQEAKICMKICMgICAgICAgICAgICAgICAgICAgIGRlZnByb3BlcnR5KCkgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2ggdmVyc2lvbiBvZgogIyAgICAgICAgICAgICAgICAgICAgdGhlIHJlbGV2YW50IF9nZXRfPHByb3BlcnR5PigpIGZ1bmN0aW9uLgotIwotIyAgIE5ld1N0eWxlICAgICAgLS0gYmFzZSBjbGFzcyB0byBjYXVzZSBfX3Nsb3RzX18gdG8gYmUgaG9ub3JlZCBpbgotIyAgICAgICAgICAgICAgICAgICAgdGhlIG5ldyB3b3JsZAotIwotIyAgIFRydWUsIEZhbHNlICAgLS0gb25seSBmb3IgUHl0aG9uIDIuMiBhbmQgZWFybGllcgogCi1fX2FsbF9fID0gWyJOb2RlTGlzdCIsICJFbXB0eU5vZGVMaXN0IiwgIk5ld1N0eWxlIiwKLSAgICAgICAgICAgIlN0cmluZ1R5cGVzIiwgImRlZnByb3BlcnR5IiwgIkdldGF0dHJNYWdpYyJdCitfX2FsbF9fID0gWyJOb2RlTGlzdCIsICJFbXB0eU5vZGVMaXN0IiwgIlN0cmluZ1R5cGVzIiwgImRlZnByb3BlcnR5Il0KIAogaW1wb3J0IHhtbGNvcmUuZG9tCiAKQEAgLTYwLDEyNSArNDgsNjIgQEAKICAgICBTdHJpbmdUeXBlcyA9IHR5cGUoJycpLCB0eXBlKHVuaWNvZGUoJycpKQogCiAKLSMgZGVmaW5lIFRydWUgYW5kIEZhbHNlIG9ubHkgaWYgbm90IGRlZmluZWQgYXMgYnVpbHQtaW5zCi10cnk6Ci0gICAgVHJ1ZQotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBUcnVlID0gMQotICAgIEZhbHNlID0gMAotICAgIF9fYWxsX18uZXh0ZW5kKFsiVHJ1ZSIsICJGYWxzZSJdKQorY2xhc3MgTm9kZUxpc3QobGlzdCk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgMCA8PSBpbmRleCA8IGxlbihzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmW2luZGV4XQorCisgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYpCisKKyAgICBkZWYgX3NldF9sZW5ndGgoc2VsZiwgdmFsdWUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICdsZW5ndGgnIikKKworICAgIGxlbmd0aCA9IHByb3BlcnR5KF9nZXRfbGVuZ3RoLCBfc2V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkb2M9IlRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIE5vZGVMaXN0LiIpCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGZbOl0gPSBzdGF0ZQorCitjbGFzcyBFbXB0eU5vZGVMaXN0KHR1cGxlKToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBOTCA9IE5vZGVMaXN0KCkKKyAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQorICAgICAgICByZXR1cm4gTkwKKworICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIE5MID0gTm9kZUxpc3QoKQorICAgICAgICBOTC5leHRlbmQob3RoZXIpCisgICAgICAgIHJldHVybiBOTAorCisgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCisKKyAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQogCiAKLXRyeToKLSAgICBpc2luc3RhbmNlKCcnLCBTdHJpbmdUeXBlcykKLWV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgIwotICAgICMgV3JhcCBpc2luc3RhbmNlKCkgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gaW4KLSAgICAjIFB5dGhvbiAyLjIgYW5kIG5ld2VyLgotICAgICMKLSAgICBfaXNpbnN0YW5jZSA9IGlzaW5zdGFuY2UKLSAgICBkZWYgaXNpbnN0YW5jZShvYmosIHR5cGVfb3Jfc2VxKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIF9pc2luc3RhbmNlKG9iaiwgdHlwZV9vcl9zZXEpCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICBmb3IgdCBpbiB0eXBlX29yX3NlcToKLSAgICAgICAgICAgICAgICBpZiBfaXNpbnN0YW5jZShvYmosIHQpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICBfX2FsbF9fLmFwcGVuZCgiaXNpbnN0YW5jZSIpCi0KLQotaWYgbGlzdCBpcyB0eXBlKFtdKToKLSAgICBjbGFzcyBOb2RlTGlzdChsaXN0KToKLSAgICAgICAgX19zbG90c19fID0gKCkKLQotICAgICAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6Ci0gICAgICAgICAgICBpZiAwIDw9IGluZGV4IDwgbGVuKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmW2luZGV4XQotCi0gICAgICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZikKLQotICAgICAgICBkZWYgX3NldF9sZW5ndGgoc2VsZiwgdmFsdWUpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAotICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIG1vZGlmeSByZWFkLW9ubHkgYXR0cmlidXRlICdsZW5ndGgnIikKLQotICAgICAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKLQotICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgotICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKLQotICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKLSAgICAgICAgICAgIHNlbGZbOl0gPSBzdGF0ZQotCi0gICAgY2xhc3MgRW1wdHlOb2RlTGlzdCh0dXBsZSk6Ci0gICAgICAgIF9fc2xvdHNfXyA9ICgpCi0KLSAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgTkwgPSBOb2RlTGlzdCgpCi0gICAgICAgICAgICBOTC5leHRlbmQob3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gTkwKLQotICAgICAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgTkwgPSBOb2RlTGlzdCgpCi0gICAgICAgICAgICBOTC5leHRlbmQob3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gTkwKLQotICAgICAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKLSAgICAgICAgICAgIHJldHVybiAwCi0KLSAgICAgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKLSAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCi0KLSAgICAgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M9IlRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIE5vZGVMaXN0LiIpCi0KLWVsc2U6Ci0gICAgZGVmIE5vZGVMaXN0KCk6Ci0gICAgICAgIHJldHVybiBbXQotCi0gICAgZGVmIEVtcHR5Tm9kZUxpc3QoKToKLSAgICAgICAgcmV0dXJuIFtdCi0KLQotdHJ5OgotICAgIHByb3BlcnR5Ci1leGNlcHQgTmFtZUVycm9yOgotICAgIGRlZiBkZWZwcm9wZXJ0eShrbGFzcywgbmFtZSwgZG9jKToKLSAgICAgICAgIyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBiYXNlIF9fZ2V0YXR0cl9fKCkKLSAgICAgICAgcGFzcwotCi0gICAgY2xhc3MgR2V0YXR0ck1hZ2ljOgotICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwga2V5KToKLSAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCJfIik6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGtleQotCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZ2V0ID0gZ2V0YXR0cihzZWxmLCAiX2dldF8iICsga2V5KQotICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBrZXkKLSAgICAgICAgICAgIHJldHVybiBnZXQoKQotCi0gICAgY2xhc3MgTmV3U3R5bGU6Ci0gICAgICAgIHBhc3MKLQotZWxzZToKLSAgICBkZWYgZGVmcHJvcGVydHkoa2xhc3MsIG5hbWUsIGRvYyk6Ci0gICAgICAgIGdldCA9IGdldGF0dHIoa2xhc3MsICgiX2dldF8iICsgbmFtZSkpLmltX2Z1bmMKLSAgICAgICAgZGVmIHNldChzZWxmLCB2YWx1ZSwgbmFtZT1uYW1lKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKLSAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiICsgcmVwcihuYW1lKSkKLSAgICAgICAgYXNzZXJ0IG5vdCBoYXNhdHRyKGtsYXNzLCAiX3NldF8iICsgbmFtZSksIFwKLSAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgdG8gZmluZCBfc2V0XyIgKyBuYW1lCi0gICAgICAgIHByb3AgPSBwcm9wZXJ0eShnZXQsIHNldCwgZG9jPWRvYykKLSAgICAgICAgc2V0YXR0cihrbGFzcywgbmFtZSwgcHJvcCkKLQotICAgIGNsYXNzIEdldGF0dHJNYWdpYzoKLSAgICAgICAgcGFzcwotCi0gICAgTmV3U3R5bGUgPSBvYmplY3QKK2RlZiBkZWZwcm9wZXJ0eShrbGFzcywgbmFtZSwgZG9jKToKKyAgICBnZXQgPSBnZXRhdHRyKGtsYXNzLCAoIl9nZXRfIiArIG5hbWUpKS5pbV9mdW5jCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSwgbmFtZT1uYW1lKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiICsgcmVwcihuYW1lKSkKKyAgICBhc3NlcnQgbm90IGhhc2F0dHIoa2xhc3MsICJfc2V0XyIgKyBuYW1lKSwgXAorICAgICAgICAgICAiZXhwZWN0ZWQgbm90IHRvIGZpbmQgX3NldF8iICsgbmFtZQorICAgIHByb3AgPSBwcm9wZXJ0eShnZXQsIHNldCwgZG9jPWRvYykKKyAgICBzZXRhdHRyKGtsYXNzLCBuYW1lLCBwcm9wKQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkgYi9MaWIveG1sY29yZS9kb20vbWluaWRvbS5weQppbmRleCA1NDYyMGUxLi5hOGFiZDE0IDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vbWluaWRvbS5weQorKysgYi9MaWIveG1sY29yZS9kb20vbWluaWRvbS5weQpAQCAtMjAsOCArMjAsNiBAQAogZnJvbSB4bWxjb3JlLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCiBmcm9tIHhtbGNvcmUuZG9tLnhtbGJ1aWxkZXIgaW1wb3J0IERPTUltcGxlbWVudGF0aW9uTFMsIERvY3VtZW50TFMKIAotX1R1cGxlVHlwZSA9IHR5cGUoKCkpCi0KICMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBJRC1jYWNoZSBpbnZhbGlkYXRpb24gY2hlY2tzOyB0aGUgbGlzdCBpc24ndAogIyBhY3R1YWxseSBjb21wbGV0ZSwgc2luY2UgdGhlIG5vZGVzIGJlaW5nIGNoZWNrZWQgd2lsbCBuZXZlciBiZSB0aGUKICMgRE9DVU1FTlRfTk9ERSBvciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFLiAgKFRoZSBub2RlIGJlaW5nIGNoZWNrZWQgaXMKQEAgLTMxLDcgKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxjb3JlLmRvbS5Ob2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKIAogCi1jbGFzcyBOb2RlKHhtbGNvcmUuZG9tLk5vZGUsIEdldGF0dHJNYWdpYyk6CitjbGFzcyBOb2RlKHhtbGNvcmUuZG9tLk5vZGUpOgogICAgIG5hbWVzcGFjZVVSSSA9IE5vbmUgIyB0aGlzIGlzIG5vbi1udWxsIG9ubHkgZm9yIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCiAgICAgcGFyZW50Tm9kZSA9IE5vbmUKICAgICBvd25lckRvY3VtZW50ID0gTm9uZQpAQCAtNDU5LDcgKzQ1Nyw3IEBACiBkZWZwcm9wZXJ0eShBdHRyLCAic2NoZW1hVHlwZSIsIGRvYz0iU2NoZW1hIHR5cGUgZm9yIHRoaXMgYXR0cmlidXRlLiIpCiAKIAotY2xhc3MgTmFtZWROb2RlTWFwKE5ld1N0eWxlLCBHZXRhdHRyTWFnaWMpOgorY2xhc3MgTmFtZWROb2RlTWFwKG9iamVjdCk6CiAgICAgIiIiVGhlIGF0dHJpYnV0ZSBsaXN0IGlzIGEgdHJhbnNpZW50IGludGVyZmFjZSB0byB0aGUgdW5kZXJseWluZwogICAgIGRpY3Rpb25hcmllcy4gIE11dGF0aW9ucyBoZXJlIHdpbGwgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQncwogICAgIGRpY3Rpb25hcnkuCkBAIC01MjMsNyArNTIxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBhdHRuYW1lX29yX3R1cGxlKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShhdHRuYW1lX29yX3R1cGxlLCBfVHVwbGVUeXBlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhdHRuYW1lX29yX3R1cGxlLCB0dXBsZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNOU1thdHRuYW1lX29yX3R1cGxlXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzW2F0dG5hbWVfb3JfdHVwbGVdCkBAIC02MTMsNyArNjExLDcgQEAKIEF0dHJpYnV0ZUxpc3QgPSBOYW1lZE5vZGVNYXAKIAogCi1jbGFzcyBUeXBlSW5mbyhOZXdTdHlsZSk6CitjbGFzcyBUeXBlSW5mbyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICduYW1lc3BhY2UnLCAnbmFtZScKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUpOgpAQCAtMTE0Niw3ICsxMTQ0LDcgQEAKICAgICAgICAgd3JpdGVyLndyaXRlKCI8IVtDREFUQVslc11dPiIgJSBzZWxmLmRhdGEpCiAKIAotY2xhc3MgUmVhZE9ubHlTZXF1ZW50aWFsTmFtZWROb2RlTWFwKE5ld1N0eWxlLCBHZXRhdHRyTWFnaWMpOgorY2xhc3MgUmVhZE9ubHlTZXF1ZW50aWFsTmFtZWROb2RlTWFwKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ19zZXEnLAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcT0oKSk6CkBAIC0xMTcwLDcgKzExNjgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBuCiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZV9vcl90dXBsZSk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZV9vcl90dXBsZSwgX1R1cGxlVHlwZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZV9vcl90dXBsZSwgdHVwbGUpOgogICAgICAgICAgICAgbm9kZSA9IHNlbGYuZ2V0TmFtZWRJdGVtTlMoKm5hbWVfb3JfdHVwbGUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBub2RlID0gc2VsZi5nZXROYW1lZEl0ZW0obmFtZV9vcl90dXBsZSkKQEAgLTE0MTgsNyArMTQxNiw3IEBACiAgICAgZGVmIF9jcmVhdGVfZG9jdW1lbnQoc2VsZik6CiAgICAgICAgIHJldHVybiBEb2N1bWVudCgpCiAKLWNsYXNzIEVsZW1lbnRJbmZvKE5ld1N0eWxlKToKK2NsYXNzIEVsZW1lbnRJbmZvKG9iamVjdCk6CiAgICAgIiIiT2JqZWN0IHRoYXQgcmVwcmVzZW50cyBjb250ZW50LW1vZGVsIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LgogCiAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBwcmFjdGljZTsgRE9NCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20veG1sYnVpbGRlci5weSBiL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CmluZGV4IGQ1OGM3MjMuLjY1NjZkM2MgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CisrKyBiL0xpYi94bWxjb3JlL2RvbS94bWxidWlsZGVyLnB5CkBAIC0zLDggKzMsNiBAQAogaW1wb3J0IGNvcHkKIGltcG9ydCB4bWxjb3JlLmRvbQogCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKLQogZnJvbSB4bWxjb3JlLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCiAKIApAQCAtMjExLDcgKzIwOSw3IEBACiAgICAgcmV0dXJuIG5hbWUubG93ZXIoKS5yZXBsYWNlKCctJywgJ18nKQogCiAKLWNsYXNzIERPTUVudGl0eVJlc29sdmVyKE5ld1N0eWxlKToKK2NsYXNzIERPTUVudGl0eVJlc29sdmVyKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ19vcGVuZXInLAogCiAgICAgZGVmIHJlc29sdmVFbnRpdHkoc2VsZiwgcHVibGljSWQsIHN5c3RlbUlkKToKQEAgLTI1NSw3ICsyNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaXQoIj0iLCAxKVsxXS5sb3dlcigpCiAKIAotY2xhc3MgRE9NSW5wdXRTb3VyY2UoTmV3U3R5bGUpOgorY2xhc3MgRE9NSW5wdXRTb3VyY2Uob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAoJ2J5dGVTdHJlYW0nLCAnY2hhcmFjdGVyU3RyZWFtJywgJ3N0cmluZ0RhdGEnLAogICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnLCAncHVibGljSWQnLCAnc3lzdGVtSWQnLCAnYmFzZVVSSScpCiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCmluZGV4IGZlZTQzY2MuLmZkNGIyNjYgMTAwNzU1Ci0tLSBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmKG91dC0+ZXZlbnRDbGFzcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50VHlwZVNwZWMgKioqKioqKi8KQEAgLTc4LDcgKzc4LDcgQEAKIHsKICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJm91dC0+c2lnbmF0dXJlLCAmb3V0LT5pZCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50SG90S2V5SUQgKioqKioqKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKaW5kZXggMjJlOTY3Ni4uNWY5MzRjMiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKQEAgLTEzMjksNyArMTMyOSw3IEBACiAJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQogCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewogCSAgICBjaGFyICpjU3RyOwotCSAgICBpbnQgY0xlbjsKKwkgICAgUHlfc3NpemVfdCBjTGVuOwogCSAgICBpZiggUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHYsICZjU3RyLCAmY0xlbikgPCAwICkgcmV0dXJuIDA7CiAJICAgICpwX2l0c2VsZiA9IENGRGF0YUNyZWF0ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgKHVuc2lnbmVkIGNoYXIgKiljU3RyLCBjTGVuKTsKIAkgICAgcmV0dXJuIDE7CkBAIC0xODI2LDcgKzE4MjYsNyBAQAogCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewogCSAgICBjaGFyICpjU3RyOwogCSAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJlcyIsICJhc2NpaSIsICZjU3RyKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworCSAgICAgICAgcmV0dXJuIDA7CiAJICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKIAkgICAgICAgIHJldHVybiAxOwogCX0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYwppbmRleCBmODI2ODdlLi42ZDg2NzNmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCkBAIC0zMywxNyArMzMsMTAgQEAKIGdlc3RhbHRfZ2VzdGFsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJT1NFcnIgaUVycjsKLQljaGFyICpzdHI7Ci0JaW50IHNpemU7CiAJT1NUeXBlIHNlbGVjdG9yOwogCWxvbmcgcmVzcG9uc2U7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyMiLCAmc3RyLCAmc2l6ZSkpCisJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCiAJCXJldHVybiBOVUxMOwotCWlmIChzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdlc3RhbHQgYXJnIG11c3QgYmUgNC1jaGFyIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZWN0b3IgPSAqKE9TVHlwZSopc3RyOwogCWlFcnIgPSBHZXN0YWx0ICggc2VsZWN0b3IsICZyZXNwb25zZSApOwogCWlmIChpRXJyICE9IDApIAogCQlyZXR1cm4gUHlNYWNfRXJyb3IoaUVycik7CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZC9fUWRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCmluZGV4IDExOGRmYzQuLmJmYjA0MGYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jCkBAIC01ODI0LDcgKzU4MjQsNiBAQAogewogCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19sZW5fXzsKIAlpbnQgdGV4dEJ1Zl9faW5fbGVuX187CiAJc2hvcnQgZmlyc3RCeXRlOwogCXNob3J0IGJ5dGVDb3VudDsKQEAgLTU4ODUsNyArNTg4NCw2IEBACiAJUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCXNob3J0IF9ydjsKIAljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19sZW5fXzsKIAlpbnQgdGV4dEJ1Zl9faW5fbGVuX187CiAJc2hvcnQgZmlyc3RCeXRlOwogCXNob3J0IGJ5dGVDb3VudDsKQEAgLTY0NzEsNyArNjQ2OSw2IEBACiB7CiAJUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2xlbl9fOwogCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKIAlzaG9ydCBmaXJzdEJ5dGU7CiAJc2hvcnQgYnl0ZUNvdW50OwpAQCAtNjUzNCw3ICs2NTMxLDcgQEAKIAkgICAgICAgIHJldHVybiBOVUxMOwogCWlmICggUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihCaXRNYXApICYmIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoUGl4TWFwKSApIHsKIAkgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JICAgICAgICAgICAgICAgICJBcmd1bWVudCBzaXplIHdhcyAlZCwgc2hvdWxkIGJlICVkIChzaXplb2YgQml0TWFwKSBvciAlZCAoc2l6ZW9mIFBpeE1hcCkiLAorCSAgICAgICAgICAgICAgICAiQXJndW1lbnQgc2l6ZSB3YXMgJWxkLCBzaG91bGQgYmUgJWx1IChzaXplb2YgQml0TWFwKSBvciAlbHUgKHNpemVvZiBQaXhNYXApIiwKIAkgICAgICAgICAgICAgICAgUHlTdHJpbmdfU2l6ZShzb3VyY2UpLCBzaXplb2YoQml0TWFwKSwgc2l6ZW9mKFBpeE1hcCkpOwogCSAgICAgICAgcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUucHJlLmluIGIvTWFrZWZpbGUucHJlLmluCmluZGV4IDA1NmI1NzguLmY4YTc0ODEgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLnByZS5pbgorKysgYi9NYWtlZmlsZS5wcmUuaW4KQEAgLTMwLDYgKzMwLDcgQEAKIAogQ0M9CQlAQ0NACiBDWFg9CQlAQ1hYQAorTUFJTkNDPQkJQE1BSU5DQ0AKIExJTktDQz0JCUBMSU5LQ0NACiBBUj0JCUBBUkAKIFJBTkxJQj0JCUBSQU5MSUJACkBAIC0xNTcsNyArMTU4LDYgQEAKIFNZU0xJQlM9CSQoTElCTSkgJChMSUJDKQogU0hMSUJTPQkJQFNITElCU0AKIAotTUFJTk9CSj0JQE1BSU5PQkpACiBUSFJFQURPQko9CUBUSFJFQURPQkpACiBETElOQ0xESVI9CUBETElOQ0xESVJACiBEWU5MT0FERklMRT0JQERZTkxPQURGSUxFQApAQCAtMjE5LDEzICsyMTksMTUgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQVNUCi1BU1RfSD0JCSQoc3JjZGlyKS9JbmNsdWRlL1B5dGhvbi1hc3QuaAotQVNUX0M9CQkkKHNyY2RpcikvUHl0aG9uL1B5dGhvbi1hc3QuYworQVNUX0hfRElSPQkkKHNyY2RpcikvSW5jbHVkZQorQVNUX0g9CQkkKEFTVF9IX0RJUikvUHl0aG9uLWFzdC5oCitBU1RfQ19ESVI9CSQoc3JjZGlyKS9QeXRob24KK0FTVF9DPQkJJChBU1RfQ19ESVIpL1B5dGhvbi1hc3QuYwogQVNUX0FTREw9CSQoc3JjZGlyKS9QYXJzZXIvUHl0aG9uLmFzZGwKIAogQVNETEdFTl9GSUxFUz0JJChzcmNkaXIpL1BhcnNlci9hc2RsLnB5ICQoc3JjZGlyKS9QYXJzZXIvYXNkbF9jLnB5CiAjIFhYWCBOb3RlIHRoYXQgYSBidWlsZCBub3cgcmVxdWlyZXMgUHl0aG9uIGV4aXN0IGJlZm9yZSB0aGUgYnVpbGQgc3RhcnRzCi1BU0RMR0VOPQkkKHNyY2RpcikvUGFyc2VyL2FzZGxfYy5weSAtaCAkKHNyY2RpcikvSW5jbHVkZSAtYyAkKHNyY2RpcikvUHl0aG9uCitBU0RMR0VOPQkkKHNyY2RpcikvUGFyc2VyL2FzZGxfYy5weQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQeXRob24KQEAgLTMyNiw5ICszMjgsOSBAQAogYWxsOgkJJChCVUlMRFBZVEhPTikgb2xkc2hhcmVkbW9kcyBzaGFyZWRtb2RzCiAKICMgQnVpbGQgdGhlIGludGVycHJldGVyCi0kKEJVSUxEUFlUSE9OKToJTW9kdWxlcy8kKE1BSU5PQkopICQoTElCUkFSWSkgJChMRExJQlJBUlkpCiskKEJVSUxEUFlUSE9OKToJTW9kdWxlcy9weXRob24ubyAkKExJQlJBUlkpICQoTERMSUJSQVJZKQogCQkkKExJTktDQykgJChMREZMQUdTKSAkKExJTktGT1JTSEFSRUQpIC1vICRAIFwKLQkJCU1vZHVsZXMvJChNQUlOT0JKKSBcCisJCQlNb2R1bGVzL3B5dGhvbi5vIFwKIAkJCSQoQkxETElCUkFSWSkgJChMSUJTKSAkKE1PRExJQlMpICQoU1lTTElCUykgJChMRExBU1QpCiAKIHBsYXRmb3JtOiAkKEJVSUxEUFlUSE9OKQpAQCAtNDQ4LDggKzQ1MCw4IEBACiAJCS1EVlBBVEg9JyIkKFZQQVRIKSInIFwKIAkJLW8gJEAgJChzcmNkaXIpL01vZHVsZXMvZ2V0cGF0aC5jCiAKLU1vZHVsZXMvY2NweXRob24ubzogJChzcmNkaXIpL01vZHVsZXMvY2NweXRob24uY2MKLQkkKENYWCkgLWMgJChQWV9DRkxBR1MpIC1vICRAICQoc3JjZGlyKS9Nb2R1bGVzL2NjcHl0aG9uLmNjCitNb2R1bGVzL3B5dGhvbi5vOiAkKHNyY2RpcikvTW9kdWxlcy9weXRob24uYworCSQoTUFJTkNDKSAtYyAkKFBZX0NGTEFHUykgLW8gJEAgJChzcmNkaXIpL01vZHVsZXMvcHl0aG9uLmMKIAogCiAkKEdSQU1NQVJfSCkgJChHUkFNTUFSX0MpOiAkKFBHRU4pICQoR1JBTU1BUl9JTlBVVCkKQEAgLTQ2NSw5ICs0NjcsMTIgQEAKIAogUGFyc2VyL3Rva2VuaXplcl9wZ2VuLm86CSQoc3JjZGlyKS9QYXJzZXIvdG9rZW5pemVyLmMKIAotJChBU1RfSCkgJChBU1RfQyk6ICQoQVNUX0FTREwpICQoQVNETEdFTl9GSUxFUykKLQkkKEFTRExHRU4pICQoQVNUX0FTREwpCiskKEFTVF9IKTogJChBU1RfQVNETCkgJChBU0RMR0VOX0ZJTEVTKQorCSQoQVNETEdFTikgLWggJChBU1RfSF9ESVIpICQoQVNUX0FTREwpCiAKKyQoQVNUX0MpOiAkKEFTVF9BU0RMKSAkKEFTRExHRU5fRklMRVMpCisJJChBU0RMR0VOKSAtYyAkKEFTVF9DX0RJUikgJChBU1RfQVNETCkKKwkKIFB5dGhvbi9jb21waWxlLm8gUHl0aG9uL3N5bXRhYmxlLm86ICQoR1JBTU1BUl9IKSAkKEFTVF9IKQogCiBQeXRob24vZ2V0cGxhdGZvcm0ubzogJChzcmNkaXIpL1B5dGhvbi9nZXRwbGF0Zm9ybS5jCkBAIC01MzcsNyArNTQyLDcgQEAKIAkJSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmggXAogCQlweWNvbmZpZy5oCiAKLSQoTElCUkFSWV9PQkpTKSAkKE1PRE9CSlMpIE1vZHVsZXMvJChNQUlOT0JKKTogJChQWVRIT05fSEVBREVSUykKKyQoTElCUkFSWV9PQkpTKSAkKE1PRE9CSlMpIE1vZHVsZXMvcHl0aG9uLm86ICQoUFlUSE9OX0hFQURFUlMpCiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNjgwLDkgKzY4NSwxMyBAQAogUExBVE1BQ1BBVEg9OnBsYXQtbWFjOnBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcwogTElCU1VCRElSUz0JbGliLW9sZCBsaWItdGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3Qvb3V0cHV0IHRlc3QvZGF0YSBcCiAJCXRlc3QvZGVjaW1hbHRlc3RkYXRhIFwKLQkJZW5jb2RpbmdzIGVtYWlsIGVtYWlsL3Rlc3QgZW1haWwvdGVzdC9kYXRhIGNvbXBpbGVyIGhvdHNob3QgXAotCQlsb2dnaW5nIGJzZGRiIGJzZGRiL3Rlc3QgY3N2IGN0eXBlcyBpZGxlbGliIGlkbGVsaWIvSWNvbnMgXAorCQllbmNvZGluZ3MgY29tcGlsZXIgaG90c2hvdCBcCisJCWVtYWlsIGVtYWlsL21pbWUgZW1haWwvdGVzdCBlbWFpbC90ZXN0L2RhdGEgXAorCQlzcWxpdGUzIHNxbGl0ZTMvdGVzdCBcCisJCWxvZ2dpbmcgYnNkZGIgYnNkZGIvdGVzdCBjc3YgXAorCQljdHlwZXMgY3R5cGVzL3Rlc3QgY3R5cGVzL21hY2hvbGliIGlkbGVsaWIgaWRsZWxpYi9JY29ucyBcCiAJCWRpc3R1dGlscyBkaXN0dXRpbHMvY29tbWFuZCBkaXN0dXRpbHMvdGVzdHMgJChYTUxMSUJTVUJESVJTKSBcCisJCXNldHVwdG9vbHMgc2V0dXB0b29scy9jb21tYW5kIHNldHVwdG9vbHMvdGVzdHMgc2V0dXB0b29scy5lZ2ctaW5mbyBcCiAJCWN1cnNlcyAkKE1BQ0hERVBTKQogbGliaW5zdGFsbDoJJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCiAJQGZvciBpIGluICQoU0NSSVBURElSKSAkKExJQkRFU1QpOyBcCkBAIC03MTgsNiArNzI3LDcgQEAKIAlkbyBcCiAJCWE9JChzcmNkaXIpL0xpYi8kJGQ7IFwKIAkJaWYgdGVzdCAhIC1kICQkYTsgdGhlbiBjb250aW51ZTsgZWxzZSB0cnVlOyBmaTsgXAorCQlpZiB0ZXN0IGBscyAkJGEgfCB3YyAtbGAgLWx0IDE7IHRoZW4gY29udGludWU7IGZpOyBcCiAJCWI9JChMSUJERVNUKS8kJGQ7IFwKIAkJZm9yIGkgaW4gJCRhLyo7IFwKIAkJZG8gXApAQCAtODA5LDcgKzgxOSw3IEBACiAJCWZpOyBcCiAJZmkKIAkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9jb25maWcuYyAkKERFU1RESVIpJChMSUJQTCkvY29uZmlnLmMKLQkkKElOU1RBTExfREFUQSkgTW9kdWxlcy8kKE1BSU5PQkopICQoREVTVERJUikkKExJQlBMKS8kKE1BSU5PQkopCisJJChJTlNUQUxMX0RBVEEpIE1vZHVsZXMvcHl0aG9uLm8gJChERVNURElSKSQoTElCUEwpL3B5dGhvbi5vCiAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9Nb2R1bGVzL2NvbmZpZy5jLmluICQoREVTVERJUikkKExJQlBMKS9jb25maWcuYy5pbgogCSQoSU5TVEFMTF9EQVRBKSBNYWtlZmlsZSAkKERFU1RESVIpJChMSUJQTCkvTWFrZWZpbGUKIAkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9TZXR1cCAkKERFU1RESVIpJChMSUJQTCkvU2V0dXAKQEAgLTgxNyw2ICs4MjcsMTEgQEAKIAkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9TZXR1cC5jb25maWcgJChERVNURElSKSQoTElCUEwpL1NldHVwLmNvbmZpZwogCSQoSU5TVEFMTF9TQ1JJUFQpICQoc3JjZGlyKS9Nb2R1bGVzL21ha2VzZXR1cCAkKERFU1RESVIpJChMSUJQTCkvbWFrZXNldHVwCiAJJChJTlNUQUxMX1NDUklQVCkgJChzcmNkaXIpL2luc3RhbGwtc2ggJChERVNURElSKSQoTElCUEwpL2luc3RhbGwtc2gKKwkjIFN1YnN0aXR1dGlvbiBoYXBwZW5zIGhlcmUsIGFzIHRoZSBjb21wbGV0ZWx5LWV4cGFuZGVkIEJJTkRJUgorCSMgaXMgbm90IGF2YWlsYWJsZSBpbiBjb25maWd1cmUKKwlzZWQgLWUgInMsQEJJTkRJUkAsJChCSU5ESVIpLCIgPCAkKHNyY2RpcikvTWlzYy9weXRob24tY29uZmlnLmluID5weXRob24tY29uZmlnCisJJChJTlNUQUxMX1NDUklQVCkgcHl0aG9uLWNvbmZpZyAkKEJJTkRJUikvcHl0aG9uLWNvbmZpZworCXJtIHB5dGhvbi1jb25maWcKIAlAaWYgWyAtcyBNb2R1bGVzL3B5dGhvbi5leHAgLWEgXAogCQkiYGVjaG8gJChNQUNIREVQKSB8IHNlZCAncy9eXCguLi5cKS4qL1wxLydgIiA9ICJhaXgiIF07IHRoZW4gXAogCQllY2hvOyBlY2hvICJJbnN0YWxsaW5nIHN1cHBvcnQgZmlsZXMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBleHRlbnNpb24gbW9kdWxlcyBvbiBBSVg6IjsgXApAQCAtOTQyLDYgKzk1NywxMCBAQAogLmMubzoKIAkkKENDKSAtYyAkKFBZX0NGTEFHUykgLW8gJEAgJDwKIAorIyBSdW4gcmVpbmRlbnQgb24gdGhlIGxpYnJhcnkKK3JlaW5kZW50OgorCS4vcHl0aG9uJChFWEVFWFQpICQoc3JjZGlyKS9Ub29scy9zY3JpcHRzL3JlaW5kZW50LnB5IC1yICQoc3JjZGlyKS9MaWIKKwogIyBSZXJ1biBjb25maWd1cmUgd2l0aCB0aGUgc2FtZSBvcHRpb25zIGFzIGl0IHdhcyBydW4gbGFzdCB0aW1lLAogIyBwcm92aWRlZCB0aGUgY29uZmlnLnN0YXR1cyBzY3JpcHQgZXhpc3RzCiByZWNoZWNrOgpAQCAtOTY5LDEzICs5ODgsMTQgQEAKIAogIyBTYW5pdGF0aW9uIHRhcmdldHMgLS0gY2xlYW4gbGVhdmVzIGxpYnJhcmllcywgZXhlY3V0YWJsZXMgYW5kIHRhZ3MKICMgZmlsZXMsIHdoaWNoIGNsb2JiZXIgcmVtb3ZlcyB0aG9zZSBhcyB3ZWxsCitweWNyZW1vdmFsOgorCWZpbmQgJChzcmNkaXIpIC1uYW1lICcqLnB5W2NvXScgLWV4ZWMgcm0gLWYge30gJzsnCiAKLWNsZWFuOgorY2xlYW46IHB5Y3JlbW92YWwKIAlmaW5kIC4gLW5hbWUgJyoubycgLWV4ZWMgcm0gLWYge30gJzsnCiAJZmluZCAuIC1uYW1lICcqLnNbb2xdJyAtZXhlYyBybSAtZiB7fSAnOycKLQlmaW5kICQoc3JjZGlyKSAtbmFtZSAnKi5weVtjb10nIC1leGVjIHJtIC1mIHt9ICc7JwotCWZpbmQgJChzcmNkaXIpIC1uYW1lICdmZmljb25maWcuaCcgLWV4ZWMgcm0gLWYge30gJzsnCi0JZmluZCAkKHNyY2RpcikgLW5hbWUgJ2ZmaWNvbmZpZy5weScgLWV4ZWMgcm0gLWYge30gJzsnCisJZmluZCAkKHNyY2RpcikvYnVpbGQgLW5hbWUgJ2ZmaWNvbmZpZy5oJyAtZXhlYyBybSAtZiB7fSAnOycgfHwgdHJ1ZQorCWZpbmQgJChzcmNkaXIpL2J1aWxkIC1uYW1lICdmZmljb25maWcucHknIC1leGVjIHJtIC1mIHt9ICc7JyB8fCB0cnVlCiAKIGNsb2JiZXI6IGNsZWFuCiAJLXJtIC1mICQoQlVJTERQWVRIT04pICQoUEdFTikgJChMSUJSQVJZKSAkKExETElCUkFSWSkgJChETExMSUJSQVJZKSBcCmRpZmYgLS1naXQgYS9NaXNjL0FDS1MgYi9NaXNjL0FDS1MKaW5kZXggOTIyNTAzMS4uYTgyNGE4NiAxMDA2NDQKLS0tIGEvTWlzYy9BQ0tTCisrKyBiL01pc2MvQUNLUwpAQCAtMTMyLDYgKzEzMiw3IEBACiBNYXR0IENvbndheQogRGF2aWQgTS4gQ29va2UKIEdyZWcgQ29wZWxhbmQKK0FsZG8gQ29ydGVzaQogRGF2aWQgQ29zdGFuem8KIFNjb3R0IENvdHRvbgogR3JlZyBDb3VjaApAQCAtNDc3LDYgKzQ3OCw3IEBACiBEYW4gUGllcnNvbgogTWFydGlqbiBQaWV0ZXJzCiBGcmFu529pcyBQaW5hcmQKK1phY2ggUGluY3VzCiBNaWNoYWVsIFBpb3Ryb3dza2kKIEl1c3RpbiBQb3AKIEpvaG4gUG9wcGxld2VsbApAQCAtNTM2LDYgKzUzOCw3IEBACiBHcmVnb3IgU2NobWlkCiBSYWxmIFNjaG1pdHQKIFBldGVyIFNjaG5laWRlci1LYW1wCitDaGFkIEouIFNjaHJvZWRlcgogU2FtIFNjaHVsZW5idXJnCiBTdGVmYW4gU2Nod2FyemVyCiBEaWV0bWFyIFNjaHdlcnRiZXJnZXIKZGlmZiAtLWdpdCBhL01pc2MvQmVPUy1zZXR1cC5weSBiL01pc2MvQmVPUy1zZXR1cC5weQppbmRleCAwN2RiZTE1Li45OTFlNjA4IDEwMDY0NAotLS0gYS9NaXNjL0JlT1Mtc2V0dXAucHkKKysrIGIvTWlzYy9CZU9TLXNldHVwLnB5CkBAIC0xNzYsOCArMTc2LDYgQEAKICAgICAgICAgIwogCiAgICAgICAgICMgU29tZSBtb2R1bGVzIHRoYXQgYXJlIG5vcm1hbGx5IGFsd2F5cyBvbjoKLSAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbigncmVnZXgnLCBbJ3JlZ2V4bW9kdWxlLmMnLCAncmVnZXhwci5jJ10pICkKLQogICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfd2Vha3JlZicsIFsnX3dlYWtyZWYuYyddKSApCiAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19zeW10YWJsZScsIFsnc3ltdGFibGVtb2R1bGUuYyddKSApCiAKZGlmZiAtLWdpdCBhL01pc2MvSElTVE9SWSBiL01pc2MvSElTVE9SWQppbmRleCBkODg0N2E4Li5iZTRjYTg4IDEwMDY0NAotLS0gYS9NaXNjL0hJU1RPUlkKKysrIGIvTWlzYy9ISVNUT1JZCkBAIC04LDYgKzgsNTI5MyBAQAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBmaW5hbD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMzAtTk9WLTIwMDQqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEJ1ZyA4NzU2OTI6IEltcHJvdmUgc2lnbmFsIGhhbmRsaW5nLCBlc3BlY2lhbGx5IHdoZW4gdXNpbmcgdGhyZWFkcywgYnkKKyAgZm9yY2luZyBhbiBlYXJseSByZS1leGVjdXRpb24gb2YgUHlFdmFsX0V2YWxGcmFtZSgpICJwZXJpb2RpYyIgY29kZSB3aGVuCisgIHRoaW5nc190b19kbyBpcyBub3QgY2xlYXJlZCBieSBQeV9NYWtlUGVuZGluZ0NhbGxzKCkuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IChyZWxlYXNlIGNhbmRpZGF0ZSAxKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxOC1OT1YtMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQnVnIDEwNjE5Njg6ICBGaXhlcyBpbiAyLjRhMyB0byBhZGRyZXNzIHRocmVhZCBidWcgMTAxMDY3NyByZWludHJvZHVjZWQKKyAgdGhlIHllYXJzLW9sZCB0aHJlYWQgc2h1dGRvd24gcmFjZSBidWcgMjI1NjczLiAgTnVtZXJpYyBoaXN0b3J5IGxlc3NvbgorICBhc2lkZSwgYWxsIGJ1Z3MgaW4gYWxsIHRocmVlIHJlcG9ydHMgYXJlIGZpeGVkIG5vdy4KKworCitMaWJyYXJ5CistLS0tLS0tCisKKy0gQnVnIDEwNTIyNDI6IElmIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCBieSBhbiBhdGV4aXQgaGFuZGxlciBmdW5jdGlvbiBhbgorICBhdHRlbXB0IGlzIG1hZGUgdG8gZXhlY3V0ZSB0aGUgcmVtYWluaW5nIGhhbmRsZXJzLiAgVGhlIGxhc3QgZXhjZXB0aW9uCisgIHJhaXNlZCBpcyByZS1yYWlzZWQuCisKKy0gYGBkb2N0ZXN0YGAncyBuZXcgc3VwcG9ydCBmb3IgYWRkaW5nIGBgcGRiLnNldF90cmFjZSgpYGAgY2FsbHMgdG8KKyAgZG9jdGVzdHMgd2FzIGJyb2tlbiBpbiBhIGRyYW1hdGljIGJ1dCBzaGFsbG93IHdheS4gIEZpeGVkLgorCistIEJ1ZyAxMDY1Mzg4OiAgYGBjYWxlbmRhcmBgJ3MgYGBkYXlfbmFtZWBgLCBgYGRheV9hYmJyYGAsIGBgbW9udGhfbmFtZWBgLAorICBhbmQgYGBtb250aF9hYmJyYGAgYXR0cmlidXRlcyBlbXVsYXRlIHNlcXVlbmNlcyBvZiBsb2NhbGUtY29ycmVjdAorICBzcGVsbGluZ3Mgb2YgbW9udGggYW5kIGRheSBuYW1lcy4gIEJlY2F1c2UgdGhlIGxvY2FsZSBjYW4gY2hhbmdlIGF0CisgIGFueSB0aW1lLCB0aGUgY29ycmVjdCBzcGVsbGluZyBpcyByZWNvbXB1dGVkIHdoZW5ldmVyIG9uZSBvZiB0aGVzZSBpcworICBpbmRleGVkLiAgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbmRleCBtYXkgYmUgYSBzbGljZSBvYmplY3QsIHNvIHRoZXNlCisgIHJlY29tcHV0ZWQgZXZlcnkgZGF5IG9yIG1vbnRoIG5hbWUgZWFjaCB0aW1lIHRoZXkgd2VyZSBpbmRleGVkLiAgVGhpcyBpcworICBtdWNoIHNsb3dlciB0aGFuIG5lY2Vzc2FyeSBpbiB0aGUgdXN1YWwgY2FzZSwgd2hlbiB0aGUgaW5kZXggaXMganVzdCBhbgorICBpbnRlZ2VyLiAgSW4gdGhhdCBjYXNlLCBvbmx5IHRoZSBzaW5nbGUgc3BlbGxpbmcgbmVlZGVkIGlzIHJlY29tcHV0ZWQKKyAgbm93OyBhbmQsIHdoZW4gdGhlIGluZGV4IGlzIGEgc2xpY2Ugb2JqZWN0LCBvbmx5IHRoZSBzcGVsbGluZ3MgbmVlZGVkCisgIGJ5IHRoZSBzbGljZSBhcmUgcmVjb21wdXRlZCBub3cuCisKKy0gUGF0Y2ggMTA2MTY3OTogQWRkZWQgYGBfX2FsbF9fYGAgdG8gcGlja2xldG9vbHMucHkuCisKK0J1aWxkCistLS0tLQorCistIEJ1ZyAxMDM0Mjc3IC8gUGF0Y2ggMTAzNTI1NTogUmVtb3ZlIGNvbXBpbGF0aW9uIG9mIGNvcmUgYWdhaW5zdCBDb3JlU2VydmljZXMKKyAgYW5kIENvcmVGb3VuZGF0aW9uIG9uIE9TIFguICBJbnZvbHZlZCByZW1vdmluZyBQeU1hY19HZXRBcHBsZXRTY3JpcHRGaWxlKCkKKyAgd2hpY2ggaGFzIG5vIGtub3duIHVzZXJzLiAgVGhhbmtzIEJvYiBJcHBvbGl0by4KKworQyBBUEkKKy0tLS0tCisKKy0gVGhlIFB5UmFuZ2VfTmV3KCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgYmV0YSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDMtTk9WLTIwMDQqCisKK0xpY2Vuc2UKKy0tLS0tLS0KKworVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIGNoYW5nZWQgdGhlIGxpY2Vuc2UgdW5kZXIgd2hpY2ggUHl0aG9uCitpcyByZWxlYXNlZCwgdG8gcmVtb3ZlIFB5dGhvbiB2ZXJzaW9uIG51bWJlcnMuICBUaGVyZSB3ZXJlIG5vIG90aGVyCitjaGFuZ2VzIHRvIHRoZSBsaWNlbnNlLiAgU28sIGZvciBleGFtcGxlLCB3aGVyZXZlciB0aGUgbGljZW5zZSBmb3IKK1B5dGhvbiAyLjMgc2FpZCAiUHl0aG9uIDIuMyIsIHRoZSBuZXcgbGljZW5zZSBzYXlzICJQeXRob24iLiAgVGhlCitpbnRlbnQgaXMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWZlciB0byB0aGUgUFNGIGxpY2Vuc2UgaW4gYSBtb3JlCitkdXJhYmxlIHdheS4gIEZvciBleGFtcGxlLCBzb21lIHBlb3BsZSBzYXkgdGhleSdyZSBjb25mdXNlZCBieSB0aGF0Cit0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZSdzIGVudHJ5IGZvciB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KK0xpY2Vuc2U6OgorCisgICAgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL1B5dGhvblNvZnRGb3VuZGF0aW9uLnBocAorCitzYXlzICJQeXRob24gMi4xLjEiIGFsbCBvdmVyIGl0LCB3b25kZXJpbmcgd2hldGhlciBpdCBhcHBsaWVzIG9ubHkKK3RvIFB5dGhvbiAyLjEuMS4KKworVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIG5ldyBsaWNlbnNlIGlzIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorTGljZW5zZSBWZXJzaW9uIDIuCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEJ1ZyAjMTA1NTgyMCBDeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBub3QgcHJvdGVjdGluZyBhZ2FpbnN0IHRoYXQKKyAgY2FsbGluZyBhIGxpdmUgd2Vha3JlZiB0byBhIHBpZWNlIG9mIGN5Y2xpYyB0cmFzaCBjb3VsZCByZXN1cnJlY3QgYW4KKyAgaW5zYW5lIG11dGF0aW9uIG9mIHRoZSB0cmFzaCBpZiBhbnkgUHl0aG9uIGNvZGUgcmFuIGR1cmluZyBnYyAodmlhCisgIHJ1bm5pbmcgYSBkZWFkIG9iamVjdCdzIF9fZGVsX18gbWV0aG9kLCBydW5uaW5nIGFub3RoZXIgY2FsbGJhY2sgb24gYQorICB3ZWFrcmVmIHRvIGEgZGVhZCBvYmplY3QsIG9yIHZpYSBhbnkgUHl0aG9uIGNvZGUgcnVuIGluIGFueSBvdGhlciB0aHJlYWQKKyAgdGhhdCBtYW5hZ2VkIHRvIG9idGFpbiB0aGUgR0lMIHdoaWxlIGEgX19kZWxfXyBvciBjYWxsYmFjayB3YXMgcnVubmluZworICBpbiB0aGUgdGhyZWFkIGRvaW5nIGdjKS4gIFRoZSBtb3N0IGxpa2VseSBzeW1wdG9tIHdhcyAiaW1wb3NzaWJsZSIKKyAgYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbnMsIGFwcGVhcmluZyBzZWVtaW5nbHkgYXQgcmFuZG9tLCBvbiB3ZWFrbHkKKyAgcmVmZXJlbmNlZCBvYmplY3RzLiAgVGhlIGN1cmUgd2FzIHRvIGNsZWFyIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZQorICBvYmplY3RzIGJlZm9yZSBhbGxvd2luZyBhbnkgY2FsbGJhY2tzIHRvIHJ1bi4KKworLSBCdWcgIzEwNTQxMzkgX1B5U3RyaW5nX1Jlc2l6ZSgpIG5vdyBpbnZhbGlkYXRlcyBpdHMgY2FjaGVkIGhhc2ggdmFsdWUuCisKK0V4dGVuc2lvbiBNb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIEJ1ZyAjMTA0ODg3MDogIHRoZSBjb21waWxlciBub3cgZ2VuZXJhdGVzIGRpc3RpbmN0IGNvZGUgb2JqZWN0cyBmb3IKKyAgZnVuY3Rpb25zIHdpdGggaWRlbnRpY2FsIGJvZGllcy4gIFRoaXMgd2FzIHByb2R1Y2luZyBjb25mdXNpbmcKKyAgdHJhY2ViYWNrIG1lc3NhZ2VzIHdoaWNoIHBvaW50ZWQgdG8gdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBjb2RlCisgIG9iamVjdCB3YXMgZmlyc3QgZGVmaW5lZCByYXRoZXIgdGhhbiB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBQYXRjaCAjMTA1Njk2NyBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgb2YgVGVtcGxhdGUuc2FmZV9zdWJzdGl0dXRlKCkgc28gdGhhdAorICBubyBWYWx1ZUVycm9yIGlzIHJhaXNlZCBvbiBhbiAnaW52YWxpZCcgbWF0Y2ggZ3JvdXAuICBOb3cgdGhlIGRlbGltaXRlciBpcworICByZXR1cm5lZC4KKworLSBCdWcgIzEwNTI1MDMgcGRiLnJ1bmNhbGwoKSB3YXMgbm90IHBhc3NpbmcgYWxvbmcga2V5d29yZCBhcmd1bWVudHMuCisKKy0gQnVnICM5MDIwMzc6IFhNTC5zYXguc2F4dXRpbHMucHJlcGFyZV9pbnB1dF9zb3VyY2UoKSBub3cgY29tYmluZXMgcmVsYXRpdmUKKyAgcGF0aHMgd2l0aCBhIGJhc2UgcGF0aCBiZWZvcmUgY2hlY2tpbmcgb3MucGF0aC5pc2ZpbGUoKS4KKworLSBUaGUgd2hpY2hkYiBtb2R1bGUgY2FuIG5vdyBiZSBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCistIEJ1ZyAjMTA0NTM4MTogdGltZS5zdHJwdGltZSgpIGNhbiBub3cgaW5mZXIgdGhlIGRhdGUgdXNpbmcgJVUgb3IgJVcgKHdlZWsgb2YKKyAgdGhlIHllYXIpIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgeWVhciBhcmUgYWxzbyBzcGVjaWZpZWQuCisKKy0gQnVnICMxMDQ4ODE2OiBmaXggYnVnIGluIEN0cmwtSyBhdCBzdGFydCBvZiBsaW5lIGluIGN1cnNlcy50ZXh0cGFkLlRleHRib3gKKworLSBCdWcgIzEwMTc1NTM6IGZpeCBidWcgaW4gdGFyZmlsZS5maWxlbW9kZSgpCisKKy0gUGF0Y2ggIzczNzQ3MzogZml4IGJ1ZyB0aGF0IG9sZCBzb3VyY2UgY29kZSBpcyBzaG93biBpbiB0cmFjZWJhY2tzIGV2ZW4gaWYKKyAgdGhlIHNvdXJjZSBjb2RlIGlzIHVwZGF0ZWQgYW5kIHJlbG9hZGVkLgorCitCdWlsZAorLS0tLS0KKworLSBQYXRjaCAjMTA0NDM5NTogLS1lbmFibGUtc2hhcmVkIGlzIGFsbG93ZWQgaW4gRnJlZUJTRCBhbHNvLgorCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgYmV0YSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTUtT0NULTIwMDQqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIFBhdGNoICM5NzUwNTY6IFJlc3RhcnRhYmxlIHNpZ25hbHMgd2VyZSBub3QgY29ycmVjdGx5IGRpc2FibGVkIG9uCisgIEJTRCBzeXN0ZW1zLiBDb25zaXN0ZW50bHkgdXNlIFB5T1Nfc2V0c2lnKCkgaW5zdGVhZCBvZiBzaWduYWwoKS4KKworLSBUaGUgaW50ZXJuYWwgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLWxvY2FsIHN0b3JhZ2UgKFRMUyksIHVzZWQKKyAgYnkgdGhlIGBgUHlHSUxTdGF0ZV9FbnN1cmUoKWBgL2BgUHlHSUxTdGF0ZV9SZWxlYXNlKClgYCBBUEksIHdhcyBub3QKKyAgdGhyZWFkLWNvcnJlY3QuICBUaGlzIGNvdWxkIGxlYWQgdG8gYSB2YXJpZXR5IG9mIHByb2JsZW1zLCB1cCB0byBhbmQKKyAgaW5jbHVkaW5nIHNlZ2ZhdWx0cy4gIFNlZSBidWcgMTA0MTY0NSBmb3IgYW4gZXhhbXBsZS4KKworLSBBZGRlZCBhIGNvbW1hbmQgbGluZSBvcHRpb24sIC1tIG1vZHVsZSwgd2hpY2ggc2VhcmNoZXMgc3lzLnBhdGggZm9yIHRoZQorICBtb2R1bGUgYW5kIHRoZW4gcnVucyBpdC4gIChDb250cmlidXRlZCBieSBOaWNrIENvZ2hsYW4uKQorCistIFRoZSBieXRlY29kZSBvcHRpbWl6ZXIgbm93IGZvbGRzIHR1cGxlcyBvZiBjb25zdGFudHMgaW50byBhIHNpbmdsZQorICBjb25zdGFudC4KKworLSBTRiBidWcgIzUxMzg2NjogIEZsb2F0L2xvbmcgY29tcGFyaXNvbiBhbm9tYWx5LiAgUHJpb3IgdG8gMi40YjEsIHdoZW4KKyAgYW4gaW50ZWdlciB3YXMgY29tcGFyZWQgdG8gYSBmbG9hdCwgdGhlIGludGVnZXIgd2FzIGNvZXJjZWQgdG8gYSBmbG9hdC4KKyAgVGhhdCBjb3VsZCB5aWVsZCBzcHVyaW91cyBvdmVyZmxvdyBlcnJvcnMgKGlmIHRoZSBpbnRlZ2VyIHdhcyB2ZXJ5CisgIGxhcmdlKSwgYW5kIHRvIGFub21hbGllcyBzdWNoIGFzCisgIGBgbG9uZygxZTIwMCkrMSA9PSAxZTIwMCA9PSBsb25nKDFlMjAwKS0xYGAuICBDb2VyY2lvbiB0byBmbG9hdCBpcyBubworICBsb25nZXIgcGVyZm9ybWVkLCBhbmQgY2FzZXMgbGlrZSBgYGxvbmcoMWUyMDApLTEgPCAxZTIwMGBgLAorICBgYGxvbmcoMWUyMDApKzEgPiAxZTIwMGBgIGFuZCBgYCgxIDw8IDIwMDAwKSA+IDFlMjAwYGAgYXJlIGNvbXB1dGVkCisgIGNvcnJlY3RseSBub3cuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIGBgY29sbGVjdGlvbnMuZGVxdWVgYCBvYmplY3RzIGRpZG4ndCBwbGF5IHF1aXRlIHJpZ2h0IHdpdGggZ2FyYmFnZQorICBjb2xsZWN0aW9uLCB3aGljaCBjb3VsZCBsZWFkIHRvIGEgc2VnZmF1bHQgaW4gYSByZWxlYXNlIGJ1aWxkLCBvcgorICBhbiBhc3NlcnQgZmFpbHVyZSBpbiBhIGRlYnVnIGJ1aWxkLiAgQWxzbywgYWRkZWQgb3ZlcmZsb3cgY2hlY2tzLAorICBiZXR0ZXIgZGV0ZWN0aW9uIG9mIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb24sIGFuZCBzaGllbGRlZCBkZXF1ZQorICBjb21wYXJpc29ucyBmcm9tIHVudXN1YWwgc3ViY2xhc3Mgb3ZlcnJpZGVzIG9mIHRoZSBfX2l0ZXJfXygpIG1ldGhvZC4KKworTGlicmFyeQorLS0tLS0tLQorCistIFBhdGNoIDEwNDY2NDQ6IGRpc3R1dGlscyBidWlsZF9leHQgZ3JldyB0d28gbmV3IG9wdGlvbnMgLSAtLXN3aWcgZm9yCisgIHNwZWNpZnlpbmcgdGhlIHN3aWcgZXhlY3V0YWJsZSB0byB1c2UsIGFuZCAtLXN3aWctb3B0cyB0byBzcGVjaWZ5CisgIG9wdGlvbnMgdG8gcGFzcyB0byBzd2lnLiAtLXN3aWctb3B0cz0iLWMrKyIgaXMgdGhlIG5ldyB3YXkgdG8gc3BlbGwKKyAgLS1zd2lnLWNwcC4KKworLSBQYXRjaCA5ODMyMDY6IGRpc3R1dGlscyBub3cgb2JleXMgZW52aXJvbm1lbnQgdmFyaWFibGUgTERTSEFSRUQsIGlmCisgIGl0IGlzIHNldC4KKworLSBBZGRlZCBQZXRlciBBc3RyYW5kJ3Mgc3VicHJvY2Vzcy5weSBtb2R1bGUuICBTZWUgUEVQIDMyNCBmb3IgZGV0YWlscy4KKworLSB0aW1lLnN0cnB0aW1lKCkgbm93IHByb3Blcmx5IGVzY2FwZXMgdGltZXpvbmVzIGFuZCBhbGwgb3RoZXIgbG9jYWxlLXNwZWNpZmljCisgIHN0cmluZ3MgZm9yIHJlZ2V4LXNwZWNpZmljIHN5bWJvbHMuICBXYXMgYnJlYWtpbmcgdW5kZXIgSmFwYW5lc2UgV2luZG93cyB3aGVuCisgIHRoZSB0aW1lem9uZSB3YXMgc3BlY2lmaWVkIGFzICJUb2t5byAoc3RhbmRhcmQgdGltZSkiLgorICBDbG9zZXMgYnVnICMxMDM5MjcwLgorCistIFVwZGF0ZXMgZm9yIHRoZSBlbWFpbCBwYWNrYWdlOgorCisgICsgZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSgpIGdyZXcgYSAndXNlZ210JyBhcmd1bWVudCBmb3IgSFRUUCBzdXBwb3J0LgorICArIEFsbCBkZXByZWNhdGVkIEFQSXMgdGhhdCBpbiBlbWFpbCAyLnggaXNzdWVkIHdhcm5pbmdzIGhhdmUgYmVlbiByZW1vdmVkOgorICAgIF9lbmNvZGVyIGFyZ3VtZW50IHRvIHRoZSBNSU1FVGV4dCBjb25zdHJ1Y3RvciwgTWVzc2FnZS5hZGRfcGF5bG9hZCgpLAorICAgIFV0aWxzLmR1bXBfYWRkcmVzc19wYWlyKCksIFV0aWxzLmRlY29kZSgpLCBVdGlscy5lbmNvZGUoKQorICArIE5ldyBkZXByZWNhdGlvbnM6IEdlbmVyYXRvci5fX2NhbGxfXygpLCBNZXNzYWdlLmdldF90eXBlKCksCisgICAgTWVzc2FnZS5nZXRfbWFpbl90eXBlKCksIE1lc3NhZ2UuZ2V0X3N1YnR5cGUoKSwgdGhlICdzdHJpY3QnIGFyZ3VtZW50IHRvCisgICAgdGhlIFBhcnNlciBjb25zdHJ1Y3Rvci4gIFRoZXNlIHdpbGwgYmUgcmVtb3ZlZCBpbiBlbWFpbCAzLjEuCisgICsgU3VwcG9ydCBmb3IgUHl0aG9uIGVhcmxpZXIgdGhhbiAyLjMgaGFzIGJlZW4gcmVtb3ZlZCAoc2VlIFBFUCAyOTEpLgorICArIEFsbCBkZWZlY3QgY2xhc3NlcyBoYXZlIGJlZW4gcmVuYW1lZCB0byBlbmQgaW4gJ0RlZmVjdCcuCisgICsgU29tZSBGZWVkUGFyc2VyIGZpeGVzOyBhbHNvIGEgTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0IHdpbGwgYmUKKyAgICBhZGRlZCB0byBtZXNzYWdlcyB0aGF0IGNsYWltIHRvIGJlIG11bHRpcGFydCBidXQgcmVhbGx5IGFyZW4ndC4KKyAgKyBVcGRhdGVzIHRvIGRvY3VtZW50YXRpb24uCisKKy0gcmUncyBmaW5kYWxsKCkgYW5kIGZpbmRpdGVyKCkgZnVuY3Rpb25zIG5vdyB0YWtlIGFuIG9wdGlvbmFsIGZsYWdzIGFyZ3VtZW50CisgIGp1c3QgbGlrZSB0aGUgY29tcGlsZSgpLCBzZWFyY2goKSwgYW5kIG1hdGNoKCkgZnVuY3Rpb25zLiAgQWxzbywgZG9jdW1lbnRlZAorICB0aGUgcHJldmlvdXNseSBleGlzdGluZyBzdGFydCBhbmQgc3RvcCBwYXJhbWV0ZXJzIGZvciB0aGUgZmluZGFsbCgpIGFuZAorICBmaW5kaXRlcigpIG1ldGhvZHMgb2YgcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMuCisKKy0gcmZjODIyIE1lc3NhZ2VzIG5vdyBzdXBwb3J0IGl0ZXJhdGluZyBvdmVyIHRoZSBoZWFkZXJzLgorCistIFRoZSAodW5kb2N1bWVudGVkKSB0YXJmaWxlLlRhcmZpbGUubWVtYmVybmFtZXMgaGFzIGJlZW4gcmVtb3ZlZDsKKyAgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGdldG1lbWJlciBmdW5jdGlvbi4KKworLSBodHRwbGliIG5vdyBvZmZlcnMgc3ltYm9saWMgY29uc3RhbnRzIGZvciB0aGUgSFRUUCBzdGF0dXMgY29kZXMuCisKKy0gU0YgYnVnICMxMDI4MzA2OiAgVHJ5aW5nIHRvIGNvbXBhcmUgYSBgYGRhdGV0aW1lLmRhdGVgYCB0byBhCisgIGBgZGF0ZXRpbWUuZGF0ZXRpbWVgYCBtaXN0YWtlbmx5IGNvbXBhcmVkIG9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkuCisgIE5vdyBpdCBhY3RzIGxpa2UgYSBtaXhlZC10eXBlIGNvbXBhcmlzb246ICBgYEZhbHNlYGAgZm9yIGBgPT1gYCwKKyAgYGBUcnVlYGAgZm9yIGBgIT1gYCwgYW5kIHJhaXNlcyBgYFR5cGVFcnJvcmBgIGZvciBvdGhlciBjb21wYXJpc29uCisgIG9wZXJhdG9ycy4gIEJlY2F1c2UgZGF0ZXRpbWUgaXMgYSBzdWJjbGFzcyBvZiBkYXRlLCBjb21wYXJpbmcgb25seSB0aGUKKyAgYmFzZSBjbGFzcyAoZGF0ZSkgbWVtYmVycyBjYW4gc3RpbGwgYmUgZG9uZSwgaWYgdGhhdCdzIGRlc2lyZWQsIGJ5CisgIGZvcmNpbmcgdXNpbmcgb2YgdGhlIGFwcHJvcHJhdGUgZGF0ZSBtZXRob2Q7IGUuZy4sCisgIGBgYV9kYXRlLl9fZXFfXyhhX2RhdGV0aW1lKWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHllYXIsIG1vbnRoCisgIGFuZCBkYXkgbWVtYmVycyBvZiBgYGFfZGF0ZWBgIGFuZCBgYGFfZGF0ZXRpbWVgYCBhcmUgZXF1YWwuCisKKy0gYmRpc3RfcnBtIG5vdyBzdXBwb3J0cyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtLWZvcmNlLWFyY2gsCisgIHtwcmUscG9zdH0taW5zdGFsbCwgIHtwcmUscG9zdH0tdW5pbnN0YWxsLCBhbmQKKyAge3ByZXAsYnVpbGQsaW5zdGFsbCxjbGVhbix2ZXJpZnl9LXNjcmlwdC4KKworLSBTRiBwYXRjaCAjOTk4OTkzOiBUaGUgVVRGLTggYW5kIHRoZSBVVEYtMTYgc3RhdGVmdWwgZGVjb2RlcnMgbm93IHN1cHBvcnQKKyAgZGVjb2RpbmcgaW5jb21wbGV0ZSBpbnB1dCAod2hlbiB0aGUgaW5wdXQgc3RyZWFtIGlzIHRlbXBvcmFyaWx5IGV4aGF1c3RlZCkuCisgIGBgY29kZWNzLlN0cmVhbVJlYWRlcmBgIG5vdyBpbXBsZW1lbnRzIGJ1ZmZlcmluZywgd2hpY2ggZW5hYmxlcyBwcm9wZXIKKyAgcmVhZGxpbmUgc3VwcG9ydCBmb3IgdGhlIFVURi0xNiBkZWNvZGVycy4gYGBjb2RlY3MuU3RyZWFtUmVhZGVyLnJlYWQoKWBgCisgIGhhcyBhIG5ldyBhcmd1bWVudCBgYGNoYXJzYGAgd2hpY2ggc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0bworICByZXR1cm4uIGBgY29kZWNzLlN0cmVhbVJlYWRlci5yZWFkbGluZSgpYGAgYW5kCisgIGBgY29kZWNzLlN0cmVhbVJlYWRlci5yZWFkbGluZXMoKWBgIGhhdmUgYSBuZXcgYXJndW1lbnQgYGBrZWVwZW5kc2BgLgorICBUcmFpbGluZyAiXG4icyB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGxpbmVzIGlmIGBga2VlcGVuZHNgYCBpcyBmYWxzZS4KKworLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgZG9jdGVzdCBpcyBncmVhdGx5IGV4cGFuZGVkLCBhbmQgbm93IGNvdmVycyBhbGwKKyAgdGhlIG5ldyBwdWJsaWMgZmVhdHVyZXMgKG9mIHdoaWNoIHRoZXJlIGFyZSBtYW55KS4KKworLSBgYGRvY3Rlc3QubWFzdGVyYGAgd2FzIHB1dCBiYWNrIGluLCBhbmQgYGBkb2N0ZXN0LnRlc3Rtb2QoKWBgIG9uY2UgYWdhaW4KKyAgdXBkYXRlcyBpdC4gIFRoaXMgaXNuJ3QgZ29vZCwgYmVjYXVzZSBldmVyeSBgYHRlc3Rtb2QoKWBgIGNhbGwKKyAgY29udHJpYnV0ZXMgdG8gYmxvYXRpbmcgdGhlICJoaWRkZW4iIHN0YXRlIG9mIGBgZG9jdGVzdC5tYXN0ZXJgYCwgYnV0CisgIHNvbWUgb2xkIGNvZGUgYXBwYXJlbnRseSByZWxpZXMgb24gaXQuICBGb3Igbm93LCBhbGwgd2UgY2FuIGRvIGlzCisgIGVuY291cmFnZSBwZW9wbGUgdG8gc3RpdGNoIGRvY3Rlc3RzIHRvZ2V0aGVyIHZpYSBkb2N0ZXN0J3MgdW5pdHRlc3QKKyAgaW50ZWdyYXRpb24gZmVhdHVyZXMgaW5zdGVhZC4KKworLSBodHRwbGliIG5vdyBoYW5kbGVzIGlwdjYgYWRkcmVzcy9wb3J0IHBhaXJzLgorCistIFNGIGJ1ZyAjMTAxNzg2NDogQ29uZmlnUGFyc2VyIG5vdyBjb3JyZWN0bHkgaGFuZGxlcyBkZWZhdWx0IGtleXMsCisgIHByb2Nlc3NpbmcgdGhlbSB3aXRoIGBgQ29uZmlnUGFyc2VyLm9wdGlvbnhmb3JtYGAgd2hlbiBzdXBwbGllZCwKKyAgY29uc2lzdGVudCB3aXRoIHRoZSBoYW5kbGluZyBvZiBjb25maWcgZmlsZSBlbnRyaWVzIGFuZCBydW50aW1lLXNldAorICBvcHRpb25zLgorCistIFNGIGJ1ZyAjOTk3MDUwOiBEb2N1bWVudCwgdGVzdCwgJiBjaGVjayBmb3Igbm9uLXN0cmluZyB2YWx1ZXMgaW4KKyAgQ29uZmlnUGFyc2VyLiAgTW92ZWQgdGhlIG5ldyBzdHJpbmctb25seSByZXN0cmljdGlvbiBhZGRlZCBpbgorICByZXYuIDEuNjUgdG8gdGhlIFNhZmVDb25maWdQYXJzZXIgY2xhc3MsIGxlYXZpbmcgZXhpc3RpbmcKKyAgQ29uZmlnUGFyc2VyICYgUmF3Q29uZmlnUGFyc2VyIGJlaGF2aW9yIGFsb25lLCBhbmQgZG9jdW1lbnRlZCB0aGUKKyAgY29uZGl0aW9ucyB1bmRlciB3aGljaCBub24tc3RyaW5nIHZhbHVlcyB3b3JrLgorCitCdWlsZAorLS0tLS0KKworLSBCdWlsZGluZyBvbiBkYXJ3aW4gbm93IGluY2x1ZGVzIC9vcHQvbG9jYWwvaW5jbHVkZSBhbmQgL29wdC9sb2NhbC9saWIgZm9yCisgIGJ1aWxkaW5nIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhpcyBpcyBzbyBhcyB0byBpbmNsdWRlIHNvZnR3YXJlIGluc3RhbGxlZCBhcworICBhIERhcndpblBvcnRzIHBvcnQgPGh0dHA6Ly9kYXJ3aW5wb3J0cy5vcGVuZGFyd2luLm9yZy8+CisKKy0gcHlwb3J0Lmggbm93IGRlZmluZXMgYSBQeV9JU19OQU4gbWFjcm8uICBJdCB3b3JrcyBhcy1pcyB3aGVuIHRoZQorICBwbGF0Zm9ybSBDIGNvbXB1dGVzIHRydWUgZm9yIGBgeCAhPSB4YGAgaWYgYW5kIG9ubHkgaWYgWCBpcyBhIE5hTi4KKyAgT3RoZXIgcGxhdGZvcm1zIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZWZpbml0aW9uIHdpdGggYSBwbGF0Zm9ybS0KKyAgc3BlY2lmaWMgc3BlbGxpbmcgaW4gdGhhdCBwbGF0Zm9ybSdzIHB5Y29uZmlnLmguICBZb3UgY2FuIGFsc28gb3ZlcnJpZGUKKyAgcHlwb3J0LmgncyBkZWZhdWx0IFB5X0lTX0lORklOSVRZIGRlZmluaXRpb24gbm93LgorCitDIEFQSQorLS0tLS0KKworLSBTRiBwYXRjaCAxMDQ0MDg5OiAgTmV3IGZ1bmN0aW9uIGBgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZCgpYGAgcmV0dXJucworICBub24temVybyBpZiBQeUV2YWxfSW5pdFRocmVhZHMoKSBoYXMgYmVlbiBjYWxsZWQuCisKKy0gVGhlIHVuZG9jdW1lbnRlZCBhbmQgdW51c2VkIGV4dGVybiBpbnQgYGBfUHlUaHJlYWRfU3RhcnRlZGBgIHdhcyByZW1vdmVkLgorCistIFRoZSBDIEFQSSBjYWxscyBgYFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKWBgIGFuZCBgYFB5VGhyZWFkU3RhdGVfTmV3KClgYAorICBhcmUgdHdvIG9mIHRoZSB2ZXJ5IGZldyBhZHZlcnRpc2VkIGFzIGJlaW5nIHNhZmUgdG8gY2FsbCB3aXRob3V0IGhvbGRpbmcKKyAgdGhlIEdJTC4gIEhvd2V2ZXIsIHRoaXMgd2Fzbid0IHRydWUgaW4gYSBkZWJ1ZyBidWlsZCwgYXMgYnVnIDEwNDE2NDUKKyAgZGVtb25zdHJhdGVkLiAgSW4gYSBkZWJ1ZyBidWlsZCwgUHl0aG9uIHJlZGlyZWN0cyB0aGUgYGBQeU1lbWBgIGZhbWlseQorICBvZiBjYWxscyB0byBQeXRob24ncyBzbWFsbC1vYmplY3QgYWxsb2NhdG9yLCB0byBnZXQgdGhlIGJlbmVmaXQgb2YKKyAgaXRzIGV4dHJhIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuICBCdXQgUHl0aG9uJ3Mgc21hbGwtb2JqZWN0IGFsbG9jYXRvcgorICBpc24ndCB0aHJlYWRzYWZlLCByZWx5aW5nIG9uIHRoZSBHSUwgdG8gYXZvaWQgdGhlIGV4cGVuc2Ugb2YgZG9pbmcgaXRzCisgIG93biBsb2NraW5nLiAgYGBQeUludGVycHJldGVyU3RhdGVfTmV3KClgYCBhbmQgYGBQeVRocmVhZFN0YXRlX05ldygpYGAKKyAgY2FsbCB0aGUgcGxhdGZvcm0gYGBtYWxsb2MoKWBgIGRpcmVjdGx5IG5vdywgcmVnYXJkbGVzcyBvZiBidWlsZCB0eXBlLgorCistIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ1tNYXNrXSBub3cgc3VwcG9ydCBpbnQgb2JqZWN0cyBhcyB3ZWxsLgorCistIFNGIHBhdGNoICM5OTg5OTM6IGBgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bGBgIGFuZAorICBgYFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsYGAgaGF2ZSBiZWVuIGFkZGVkLCB3aGljaCBpbXBsZW1lbnQgc3RhdGVmdWwKKyAgZGVjb2RpbmcuCisKK1Rlc3RzCistLS0tLQorCistIHRlc3RfX2xvY2FsZSBwb3J0ZWQgdG8gdW5pdHRlc3QKKworTWFjCistLS0KKworLSBgYHBsaXN0bGliYGAgbm93IHN1cHBvcnRzIG5vbi1kaWN0IHJvb3Qgb2JqZWN0cy4gIFRoZXJlIGlzIGFsc28gYSBuZXcKKyAgaW50ZXJmYWNlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHBsaXN0IGZpbGVzOiBgYHJlYWRQbGlzdChwYXRoT3JGaWxlKWBgCisgIGFuZCBgYHdyaXRlUGxpc3Qocm9vdE9iamVjdCwgcGF0aE9yRmlsZSlgYAorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBUaGUgdGV4dCBmaWxlIGNvbXBhcmlzb24gc2NyaXB0cyBgYG5kaWZmLnB5YGAgYW5kIGBgZGlmZi5weWBgIG5vdworICByZWFkIHRoZSBpbnB1dCBmaWxlcyBpbiB1bml2ZXJzYWwtbmV3bGluZSBtb2RlLiAgVGhpcyBzcGFyZXMgdGhlbQorICBmcm9tIGNvbnN1bWluZyBhIGdyZWF0IGRlYWwgb2YgdGltZSB0byBkZWR1Y2UgdGhlIHVzZWxlc3MgcmVzdWx0IHRoYXQsCisgIGUuZy4sIGEgZmlsZSB3aXRoIFdpbmRvd3MgbGluZSBlbmRzIGFuZCBhIGZpbGUgd2l0aCBMaW51eCBsaW5lIGVuZHMKKyAgaGF2ZSBubyBsaW5lcyBpbiBjb21tb24uCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGFscGhhIDM/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDItU0VQLTIwMDQqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIFNGIHBhdGNoICMxMDA3MTg5OiBgYGZyb20gLi4uIGltcG9ydCAuLi5gYCBzdGF0ZW1lbnRzIG5vdyBhbGxvdyB0aGUgbmFtZQorICBsaXN0IHRvIGJlIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMuCisKKy0gU29tZSBzcGVlZHVwcyBmb3IgbG9uZyBhcml0aG1ldGljLCB0aGFua3MgdG8gVHJldm9yIFBlcnJpbi4gIEdyYWRlc2Nob29sCisgIG11bHRpcGxpY2F0aW9uIHdhcyBzcGVkIGEgbGl0dGxlIGJ5IG9wdGltaXppbmcgdGhlIEMgY29kZS4gIEdyYWRlc2Nob29sCisgIHNxdWFyaW5nIHdhcyBzcGVkIGJ5IGFib3V0IGEgZmFjdG9yIG9mIDIsIGJ5IGV4cGxvaXRpbmcgdGhhdCBhYm91dCBoYWxmCisgIHRoZSBkaWdpdCBwcm9kdWN0cyBhcmUgZHVwbGljYXRlcyBpbiBhIHNxdWFyZS4gIEJlY2F1c2UgZXhwb25lbnRpYXRpb24KKyAgdXNlcyBzcXVhcmluZyBvZnRlbiwgdGhpcyBhbHNvIHNwZWVkcyBsb25nIHBvd2VyLiAgRm9yIGV4YW1wbGUsIHRoZSB0aW1lCisgIHRvIGNvbXB1dGUgMTcqKjEwMDAwMDAgZHJvcHBlZCBmcm9tIGFib3V0IDE0IHNlY29uZHMgdG8gOSBvbiBteSBib3ggZHVlCisgIHRvIHRoaXMgbXVjaC4gIFRoZSBjdXRvZmYgZm9yIEthcmF0c3ViYSBtdWx0aXBsaWNhdGlvbiB3YXMgcmFpc2VkLAorICBzaW5jZSBncmFkZXNjaG9vbCBtdWx0aXBsaWNhdGlvbiBnb3QgcXVpY2tlciwgYW5kIHRoZSBjdXRvZmYgd2FzCisgIGFnZ3Jlc3NpdmVseSBzbWFsbCByZWdhcmRsZXNzLiAgVGhlIGV4cG9uZW50aWF0aW9uIGFsZ29yaXRobSB3YXMgc3dpdGNoZWQKKyAgZnJvbSByaWdodC10by1sZWZ0IHRvIGxlZnQtdG8tcmlnaHQsIHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IGZvciBzbWFsbAorICBiYXNlcy4gIEluIGFkZGl0aW9uLCBpZiB0aGUgZXhwb25lbnQgaXMgbGFyZ2UsIHRoZSBhbGdvcml0aG0gbm93IGRvZXMKKyAgNSBiaXRzIChpbnN0ZWFkIG9mIDEgYml0KSBhdCBhIHRpbWUuICBUaGF0IGN1dCB0aGUgdGltZSB0byBjb21wdXRlCisgIDE3KioxMDAwMDAwIG9uIG15IGJveCBpbiBoYWxmIGFnYWluLCBkb3duIHRvIGFib3V0IDQuNSBzZWNvbmRzLgorCistIE92ZXJmbG93V2FybmluZyBpcyBubyBsb25nZXIgZ2VuZXJhdGVkLiAgUEVQIDIzNyBzY2hlZHVsZWQgdGhpcyB0bworICBvY2N1ciBpbiBQeXRob24gMi4zLCBidXQgc2luY2UgT3ZlcmZsb3dXYXJuaW5nIHdhcyBkaXNhYmxlZCBieSBkZWZhdWx0LAorICBub2JvZHkgcmVhbGl6ZWQgaXQgd2FzIHN0aWxsIGJlaW5nIGdlbmVyYXRlZC4gIE9uIHRoZSBjaGFuY2UgdGhhdCB1c2VyCisgIGNvZGUgaXMgc3RpbGwgdXNpbmcgdGhlbSwgdGhlIFB5dGhvbiBidWlsdGluIE92ZXJmbG93V2FybmluZywgYW5kCisgIGNvcnJlc3BvbmRpbmcgQyBBUEkgUHlFeGNfT3ZlcmZsb3dXYXJuaW5nLCB3aWxsIGV4aXN0IHVudGlsIFB5dGhvbiAyLjUuCisKKy0gUHlfSW5pdGlhbGl6ZUV4IGhhcyBiZWVuIGFkZGVkLgorCistIEZpeCB0aGUgb3JkZXIgb2YgYXBwbGljYXRpb24gb2YgZGVjb3JhdG9ycy4gIFRoZSBwcm9wZXIgb3JkZXIgaXMgYm90dG9tLXVwOworICB0aGUgZmlyc3QgZGVjb3JhdG9yIGxpc3RlZCBpcyB0aGUgbGFzdCBvbmUgY2FsbGVkLgorCistIFNGIHBhdGNoICMxMDA1Nzc4LiAgRml4IGEgc2VnIGZhdWx0IGlmIHRoZSBsaXN0IHNpemUgY2hhbmdlZCB3aGlsZQorICBjYWxsaW5nIGxpc3QuaW5kZXgoKS4gIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uCisgIG1vZGlmaWVkIHRoZSBsaXN0LgorCistIFRoZSBgYGZ1bmNfbmFtZWBgIChhLmsuYS4gYGBfX25hbWVfX2BgKSBhdHRyaWJ1dGUgb2YgdXNlci1kZWZpbmVkCisgIGZ1bmN0aW9ucyBpcyBub3cgd3JpdGFibGUuCisKKy0gY29kZV9uZXcgKGEuay5hIG5ldy5jb2RlKCkpIG5vdyBjaGVja3MgaXRzIGFyZ3VtZW50cyBzdWZmaWNpZW50bHkKKyAgY2FyZWZ1bGx5IHRoYXQgcGFzc2luZyB0aGVtIG9uIHRvIFB5Q29kZV9OZXcoKSB3b24ndCB0cmlnZ2VyIGNhbGxzCisgIHRvIFB5X0ZhdGFsRXJyb3IoKSBvciBQeUVycl9CYWRJbnRlcm5hbENhbGwoKS4gIEl0IGlzIHN0aWxsIHRoZSBjYXNlCisgIHRoYXQgdGhlIHJldHVybmVkIGNvZGUgb2JqZWN0IG1pZ2h0IGJlIGVudGlyZWx5IGluc2FuZS4KKworLSBTdWJjbGFzc2VzIG9mIHN0cmluZyBjYW4gbm8gbG9uZ2VyIGJlIGludGVybmVkLiAgVGhlIHNlbWFudGljcyBvZgorICBpbnRlcm5pbmcgd2VyZSBub3QgY2xlYXIgaGVyZSAtLSBhIHN1YmNsYXNzIGNvdWxkIGJlIG11dGFibGUsIGZvcgorICBleGFtcGxlIC0tIGFuZCBoYWQgYnVncy4gIEV4cGxpY2l0bHkgaW50ZXJuaW5nIGEgc3ViY2xhc3Mgb2Ygc3RyaW5nCisgIHZpYSBpbnRlcm4oKSB3aWxsIHJhaXNlIGEgVHlwZUVycm9yLiAgSW50ZXJuYWwgb3BlcmF0aW9ucyB0aGF0IGF0dGVtcHQKKyAgdG8gaW50ZXJuIGEgc3RyaW5nIHN1YmNsYXNzIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisKKy0gQnVnIDEwMDM5MzU6ICB4cmFuZ2UoKSBjb3VsZCByZXBvcnQgYm9ndXMgT3ZlcmZsb3dFcnJvcnMuICBEb2N1bWVudGVkCisgIHdoYXQgeHJhbmdlKCkgaW50ZW5kcywgYW5kIHJlcGFpcmVkIHRlc3RzIGFjY29yZGluZ2x5LgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBkaWZmbGliIG5vdyBzdXBwb3J0cyBIVE1MIHNpZGUtYnktc2lkZSBkaWZmLgorCistIG9zLnVyYW5kb20gaGFzIGJlZW4gYWRkZWQgZm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHNvdXJjZXMgb2YgcmFuZG9tCisgIGRhdGEuCisKKy0gUGF0Y2ggMTAxMjc0MDogIHRydW5jYXRlKCkgb24gYSB3cml0ZWFibGUgY1N0cmluZ0lPIG5vdyByZXNldHMgdGhlCisgIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBvcmlnaW5hbAorICBTdHJpbmdJTyBtb2R1bGUgYW5kIGF2b2lkcyBpbmFkdmVydGVudGx5IHJlc3VycmVjdGluZyBkYXRhIHRoYXQgd2FzCisgIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiB0cnVuY2F0ZWQgYXdheS4KKworLSBBZGRlZCBzb2NrZXQuc29ja2V0cGFpcigpLgorCistIEFkZGVkIEN1cnJlbnRCeXRlSW5kZXgsIEN1cnJlbnRDb2x1bW5OdW1iZXIsIEN1cnJlbnRMaW5lTnVtYmVyCisgIG1lbWJlcnMgdG8geG1sLnBhcnNlcnMuZXhwYXQuWE1MUGFyc2VyIG9iamVjdC4KKworLSBUaGUgbXB6LCByb3RvciwgYW5kIHhyZWFkbGluZXMgbW9kdWxlcywgYWxsIGRlcHJlY2F0ZWQgaW4gZWFybGllcgorICB2ZXJzaW9ucyBvZiBQeXRob24sIGhhdmUgbm93IGJlZW4gcmVtb3ZlZC4KKworTGlicmFyeQorLS0tLS0tLQorCistIFBhdGNoICM5MzQzNTY6IGlmIGEgbW9kdWxlIGRlZmluZXMgX19hbGxfXywgYmVsaWV2ZSB0aGF0IHJhdGhlciB0aGFuIHVzaW5nCisgIGhldXJpc3RpY3MgZm9yIGZpbHRlcmluZyBvdXQgaW1wb3J0ZWQgbmFtZXMuCisKKy0gUGF0Y2ggIzk0MTQ4NjogYWRkZWQgb3MucGF0aC5sZXhpc3RzKCksIHdoaWNoIHJldHVybnMgVHJ1ZSBmb3IgYnJva2VuCisgIHN5bWxpbmtzLCB1bmxpa2Ugb3MucGF0aC5leGlzdHMoKS4KKworLSB0aGUgcmFuZG9tIG1vZHVsZSBub3cgdXNlcyBvcy51cmFuZG9tKCkgZm9yIHNlZWRpbmcgaWYgaXQgaXMgYXZhaWxhYmxlLgorICBBZGRlZCBhIG5ldyBnZW5lcmF0b3IgYmFzZWQgb24gb3MudXJhbmRvbSgpLgorCistIGRpZmZsaWIgYW5kIGRpZmYucHkgY2FuIG5vdyBnZW5lcmF0ZSBIVE1MLgorCistIGJkaXN0X3JwbSBub3cgaW5jbHVkZXMgdmVyc2lvbiBhbmQgcmVsZWFzZSBpbiB0aGUgQnVpbGRSb290LCBhbmQKKyAgcmVwbGFjZXMgLSBieSBgYF9gYCBpbiB2ZXJzaW9uIGFuZCByZWxlYXNlLgorCistIGRpc3R1dGlscyBidWlsZC9idWlsZF9zY3JpcHRzIG5vdyBoYXMgYW4gLWUgb3B0aW9uIHRvIHNwZWNpZnkgdGhlCisgIHBhdGggdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBmb3IgaW5zdGFsbGVkIHNjcmlwdHMuCisKKy0gUEVQIDI5MiBjbGFzc2VzIFRlbXBsYXRlIGFuZCBTYWZlVGVtcGxhdGUgYXJlIGFkZGVkIHRvIHRoZSBzdHJpbmcgbW9kdWxlLgorCistIHRhcmZpbGUgbm93IGdlbmVyYXRlcyBHTlUgdGFyIGZpbGVzIGJ5IGRlZmF1bHQuCisKKy0gSFRUUFJlc3BvbnNlIGhhcyBub3cgYSBnZXRoZWFkZXJzIG1ldGhvZC4KKworLSBQYXRjaCAjMTAwNjIxOTogbGV0IGluc3BlY3QuZ2V0c291cmNlIGhhbmRsZSAnQCcgZGVjb3JhdG9ycy4gVGhhbmtzIFNpbW9uCisgIFBlcmNpdmFsbC4KKworLSBsb2dnaW5nLmhhbmRsZXJzLlNNVFBIYW5kbGVyLmRhdGVfdGltZSBoYXMgYmVlbiByZW1vdmVkOworICB0aGUgY2xhc3Mgbm93IHVzZXMgZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSB0byBnZW5lcmF0ZSB0aGUgdGltZSBzdGFtcC4KKworLSBBIG5ldyBmdW5jdGlvbiB0a0ZvbnQubmFtZXRvZm9udCB3YXMgYWRkZWQgdG8gcmV0dXJuIGFuIGV4aXN0aW5nCisgIGZvbnQuIFRoZSBGb250IGNsYXNzIGNvbnN0cnVjdG9yIG5vdyBoYXMgYW4gYWRkaXRpb25hbCBleGlzdHMgYXJndW1lbnQKKyAgd2hpY2gsIGlmIFRydWUsIHJlcXVlc3RzIHRvIHJldHVybi9jb25maWd1cmUgYW4gZXhpc3RpbmcgZm9udCwgcmF0aGVyCisgIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgorCistIFVwZGF0ZWQgdGhlIGRlY2ltYWwgcGFja2FnZSdzIG1pbigpIGFuZCBtYXgoKSBtZXRob2RzIHRvIG1hdGNoIHRoZQorICBsYXRlc3QgcmV2aXNpb24gb2YgdGhlIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFNwZWNpZmljYXRpb24uCisgIFF1aWV0IE5hTnMgYXJlIGlnbm9yZWQgYW5kIGVxdWFsIHZhbHVlcyBhcmUgc29ydGVkIGJhc2VkIG9uIHNpZ24KKyAgYW5kIGV4cG9uZW50LgorCistIFRoZSBkZWNpbWFsIHBhY2thZ2UncyBDb250ZXh0LmNvcHkoKSBtZXRob2Qgbm93IHJldHVybnMgZGVlcCBjb3BpZXMuCisKKy0gRGVwcmVjYXRlZCBzeXMuZXhpdGZ1bmMgaW4gZmF2b3Igb2YgdGhlIGF0ZXhpdCBtb2R1bGUuICBUaGUgc3lzLmV4aXRmdW5jCisgIGF0dHJpYnV0ZSB3aWxsIGJlIGtlcHQgYXJvdW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgYXRleGl0CisgIHdpbGwganVzdCBiZWNvbWUgdGhlIG9uZSBwcmVmZXJyZWQgd2F5IHRvIGRvIGl0LgorCistIHBhdGNoICM2NzU1NTE6IEFkZCBnZXRfaGlzdG9yeV9pdGVtIGFuZCByZXBsYWNlX2hpc3RvcnlfaXRlbSBmdW5jdGlvbnMKKyAgdG8gdGhlIHJlYWRsaW5lIG1vZHVsZS4KKworLSBidWcgIzk4OTY3MjogcGRiLmRvYyBhbmQgdGhlIGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBoZWxwX2QgYW5kIGhlbHBfdSBtZXRob2RzCisgIG9mIHRoZSBwZGIuUGRiIGNsYXNzIGdpdmVzIGhhdmUgYmVlbiBjb3JyZWN0ZWQuIGQob3duKSBnb2VzIHRvIGEgbmV3ZXIKKyAgZnJhbWUsIHUocCkgdG8gYW4gb2xkZXIgZnJhbWUsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKworLSBidWcgIzk5MDY2OTogb3MucGF0aC5yZWFscGF0aCgpIHdpbGwgcmVzb2x2ZSBzeW1saW5rcyBiZWZvcmUgbm9ybWFsaXppbmcgdGhlCisgIHBhdGgsIGFzIG5vcm1hbGl6aW5nIHRoZSBwYXRoIG1heSBhbHRlciB0aGUgbWVhbmluZyBvZiB0aGUgcGF0aCBpZiBpdAorICBjb250YWlucyBzeW1saW5rcy4KKworLSBidWcgIzg1MTEyMzogc2h1dGlsLmNvcHlmaWxlIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGNvcHkgYQorICBmaWxlIG9udG8gYSBsaW5rIHRvIGl0c2VsZi4gVGhhbmtzIEdyZWdvcnkgQmFsbC4KKworLSBidWcgIzU3MDMwMDogRml4IGluc3BlY3QgdG8gcmVzb2x2ZSBmaWxlIGxvY2F0aW9ucyB1c2luZyBvcy5wYXRoLnJlYWxwYXRoKCkKKyAgc28gYXMgdG8gcHJvcGVybHkgbGlzdCBhbGwgZnVuY3Rpb25zIGluIGEgbW9kdWxlIHdoZW4gdGhlIG1vZHVsZSBpdHNlbGYgaXMKKyAgcmVhY2hlZCB0aHJvdWdoIGEgc3ltbGluay4gIFRoYW5rcyBKb2hhbm5lcyBHaWpzYmVycy4KKworLSBkb2N0ZXN0IHJlZmFjdG9yaW5nIGNvbnRpbnVlZC4gIFNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscy4gIEFzIHBhcnQgb2YKKyAgdGhpcyBlZmZvcnQsIHNvbWUgb2xkIGFuZCBsaXR0bGUtIChuZXZlcj8pIHVzZWQgZmVhdHVyZXMgYXJlIG5vdworICBkZXByZWNhdGVkOiAgdGhlIFRlc3RlciBjbGFzcywgdGhlIG1vZHVsZSBpc19wcml2YXRlKCkgZnVuY3Rpb24sIGFuZCB0aGUKKyAgaXNwcml2YXRlIGFyZ3VtZW50IHRvIHRlc3Rtb2QoKS4gIFRoZSBUZXN0ZXIgY2xhc3Mgc3VwcGxpZWQgYSBmZWVibGUKKyAgImJ5IGhhbmQiIHdheSB0byBjb21iaW5lIG11bHRpcGxlIGRvY3Rlc3RzLCBpZiB5b3Uga25ldyBleGFjdGx5IHdoYXQKKyAgeW91IHdlcmUgZG9pbmcuICBUaGUgbmV3ZXIgZG9jdGVzdCBmZWF0dXJlcyBmb3IgdW5pdHRlc3QgaW50ZWdyYXRpb24KKyAgYWxyZWFkeSBkaWQgYSBiZXR0ZXIgam9iIG9mIHRoYXQsIGFyZSBzdHJvbmdlciBub3cgdGhhbiBldmVyLCBhbmQgdGhlCisgIG5ldyBEb2NUZXN0UnVubmVyIGNsYXNzIGlzIGEgc2FuZXIgZm91bmRhdGlvbiBpZiB5b3Ugd2FudCB0byBkbyBpdCBieQorICBoYW5kLiAgVGhlICJwcml2YXRlIG5hbWUiIGZpbHRlcmluZyBnaW1taWNrIHdhcyBhIG1pc3Rha2UgZnJvbSB0aGUKKyAgc3RhcnQsIGFuZCB0ZXN0bW9kKCkgY2hhbmdlZCBsb25nIGFnbyB0byBpZ25vcmUgaXQgYnkgZGVmYXVsdC4gIElmCisgIHlvdSB3YW50IHRvIGZpbHRlciBvdXQgdGVzdHMsIHRoZSBuZXcgRG9jVGVzdEZpbmRlciBjbGFzcyBjYW4gYmUgdXNlZAorICB0byByZXR1cm4gYSBsaXN0IG9mIGFsbCBkb2N0ZXN0cywgYW5kIHlvdSBjYW4gZmlsdGVyIHRoYXQgbGlzdCBieQorICBhbnkgY29tcHV0YWJsZSBjcml0ZXJpYSBiZWZvcmUgcGFzc2luZyBpdCB0byBhIERvY1Rlc3RSdW5uZXIgaW5zdGFuY2UuCisKKy0gQnVnICM4OTE2MzcsIHBhdGNoICMxMDA1NDY2OiBmaXggaW5zcGVjdC5nZXRhcmdzKCkgY3Jhc2ggb24gZGVmIGZvbygoYmFyKSkuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIElETEUncyBzaG9ydGN1dCBrZXlzIGZvciB3aW5kb3dzIGFyZSBub3cgY2FzZSBpbnNlbnNpdGl2ZSBzbyB0aGF0CisgIENvbnRyb2wtViB3b3JrcyB0aGUgc2FtZSBhcyBDb250cm9sLXYuCisKKy0gcHlnZXR0ZXh0LnB5OiBHZW5lcmF0ZSBQT1QtQ3JlYXRpb24tRGF0ZSBoZWFkZXIgaW4gSVNPIGZvcm1hdC4KKworQnVpbGQKKy0tLS0tCisKKy0gQmFja3dhcmQgaW5jb21wYXRpYmlsaXR5OiAgbG9uZ2ludHJlcHIuaCBub3cgdHJpZ2dlcnMgYSBjb21waWxlLXRpbWUKKyAgZXJyb3IgaWYgU0hJRlQgKHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIFB5dGhvbiBsb25nICJkaWdpdCIpIGlzbid0CisgIGRpdmlzaWJsZSBieSA1LiAgVGhpcyBuZXcgcmVxdWlyZW1lbnQgYWxsb3dzIHNpbXBsZSBjb2RlIGZvciB0aGUgbmV3CisgIDUtYml0cy1hdC1hLXRpbWUgbG9uZ19wb3coKSBpbXBsZW1lbnRhdGlvbi4gIElmIG5lY2Vzc2FyeSwgdGhlCisgIHJlc3RyaWN0aW9uIGNvdWxkIGJlIHJlbW92ZWQgKGJ5IGNvbXBsaWNhdGluZyBsb25nX3BvdygpLCBvciBieQorICBmYWxsaW5nIGJhY2sgdG8gdGhlIDEtYml0LWF0LWEtdGltZSBhbGdvcml0aG0pLCBidXQgdGhlcmUgYXJlIG5vCisgIHBsYW5zIHRvIGRvIHNvLgorCistIGJ1ZyAjOTkxOTYyOiBXaGVuIGJ1aWxkaW5nIHdpdGggLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSBvbiBEYXJ3aW4gbm8KKyAgYXR0ZW1wdCB0byBidWlsZCBNYWMtc3BlY2lmaWMgbW9kdWxlcyBvY2N1cnMuCisKKy0gVGhlIC0td2l0aC10c2MgZmxhZyB0byBjb25maWd1cmUgdG8gZW5hYmxlIFZNIHByb2ZpbGluZyB3aXRoIHRoZQorICBwcm9jZXNzb3IncyB0aW1lc3RhbXAgY291bnRlciBub3cgd29ya3Mgb24gUFBDIHBsYXRmb3Jtcy4KKworLSBwYXRjaCAjMTAwNjYyOTogRGVmaW5lIF9YT1BFTl9TT1VSQ0UgdG8gNTAwIG9uIFNvbGFyaXMgOC85IHRvIG1hdGNoCisgIEdDQydzIGRlZmluaXRpb24gYW5kIGF2b2lkIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KKworLSBEZXRlY3QgcHRocmVhZHMgc3VwcG9ydCAocHJvdmlkZWQgYnkgZ251IHB0aCBwdGhyZWFkIGVtdWxhdGlvbikgb24KKyAgR05VL2sqQlNEIHN5c3RlbXMuCisKKy0gYnVnICMxMDA1NzM3LCAjMTAwNzI0OTogRml4ZWQgc2V2ZXJhbCBidWlsZCBwcm9ibGVtcyBhbmQgd2FybmluZ3MKKyAgZm91bmQgb24gb2xkL2xlZ2FjeSBDIGNvbXBpbGVycyBvZiBIUC1VWCwgSVJJWCBhbmQgVHJ1NjQuCisKK0MgQVBJCistLS0tLQorCisuLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKKy0gcGF0Y2ggIzEwMDU5MzYsIGJ1ZyAjMTAwOTM3MzogZml4IGluZGV4IGVudHJpZXMgd2hpY2ggY29udGFpbgorICBhbiB1bmRlcnNjb3JlIHdoZW4gdmlld2VkIHdpdGggQWNyb2JhdC4KKworLSBidWcgIzk5MDY2OTogb3MucGF0aC5ub3JtcGF0aCBtYXkgYWx0ZXIgdGhlIG1lYW5pbmcgb2YgYSBwYXRoIGlmCisgIGl0IGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzLiBUaGlzIGhhcyBiZWVuIGRvY3VtZW50ZWQgaW4gYSBjb21tZW50CisgIHNpbmNlIDE5OTIsIGJ1dCBpcyBub3cgaW4gdGhlIGxpYnJhcnkgcmVmZXJlbmNlIGFzIHdlbGwuCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworLSBGcmVlQlNEIDYgaXMgbm93IHN1cHBvcnRlZC4KKworVGVzdHMKKy0tLS0tCisKKy4uCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBCb29zdGVkIHRoZSBzdGFjayByZXNlcnZhdGlvbiBmb3IgcHl0aG9uLmV4ZSBhbmQgcHl0aG9udy5leGUgZnJvbQorICB0aGUgZGVmYXVsdCAxTUIgdG8gMk1CLiAgU3RhY2sgZnJhbWVzIHVuZGVyIFZDIDcuMSBmb3IgMi40IGFyZSBlbm91Z2gKKyAgYmlnZ2VyIHRoYW4gdW5kZXIgVkMgNi4wIGZvciAyLjMuNCB0aGF0IGRlZXBseSByZWN1cnNpdmUgcHJvZ2FtcworICB3aXRoaW4gdGhlIGRlZmF1bHQgc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkgZGVmYXVsdCB2YWx1ZSBvZiAxMDAwIHdlcmUKKyAgYWJsZSB0byBzdWZmZXIgdW5kZXRlY3RlZCBDIHN0YWNrIG92ZXJmbG93cy4gIFRoZSBzdGFuZGFyZCB0ZXN0IHByb2dyYW0KKyAgdGVzdF9jb21waWxlciB3YXMgb25lIHN1Y2ggcHJvZ3JhbS4gIElmIGEgUHl0aG9uIHByb2Nlc3Mgb24gV2luZG93cworICAianVzdCB2YW5pc2hlcyIgd2l0aG91dCBhIHRyYWNlLCBhbmQgd2l0aG91dCBhbiBlcnJvciBtZXNzYWdlIG9mIGFueQorICBraW5kLCBidXQgd2l0aCBhbiBleGl0IGNvZGUgb2YgMTI4LCB1bmRldGVjdGVkIHN0YWNrIG92ZXJmbG93IG1heSBiZQorICB0aGUgcHJvYmxlbS4KKworTWFjCistLS0KKworLi4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgYWxwaGEgMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwNS1BVUctMjAwNCoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gUGF0Y2ggIzk4MDY5NTogIEltcGxlbWVudHMgZWZmaWNpZW50IHN0cmluZyBjb25jYXRlbmF0aW9uIGZvciBzdGF0ZW1lbnRzCisgIG9mIHRoZSBmb3JtIHM9cyt0IGFuZCBzKz10LiAgVGhpcyB3aWxsIHZhcnkgYWNyb3NzIGltcGxlbWVudGF0aW9ucy4KKyAgQWNjb3JkaW5nbHksIHRoZSBzdHIuam9pbigpIG1ldGhvZCBpcyBzdHJvbmdseSBwcmVmZXJyZWQgZm9yIHBlcmZvcm1hbmNlCisgIHNlbnNpdGl2ZSBjb2RlLgorCistIFBFUC0wMzE4LCBGdW5jdGlvbiBEZWNvcmF0b3JzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UuIFRoZXNlIGFyZQorICBpbXBsZW1lbnRlZCB1c2luZyB0aGUgSmF2YS1zdHlsZSBAZGVjb3JhdG9yIHN5bnRheCwgbGlrZSBzbzo6CisKKyAgICAgQHN0YXRpY21ldGhvZAorICAgICBkZWYgZm9vKGJhcik6CisKKyAgKFRoZSBQRVAgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlKQorCistIFdoZW4gaW1wb3J0aW5nIGEgbW9kdWxlIE0gcmFpc2VzIGFuIGV4Y2VwdGlvbiwgUHl0aG9uIG5vIGxvbmdlciBsZWF2ZXMgTQorICBpbiBzeXMubW9kdWxlcy4gIEJlZm9yZSAyLjRhMiBpdCBkaWQsIGFuZCBhIHN1YnNlcXVlbnQgaW1wb3J0IG9mIE0gd291bGQKKyAgc3VjY2VlZCwgcGlja2luZyB1cCBhIG1vZHVsZSBvYmplY3QgZnJvbSBzeXMubW9kdWxlcyByZWZsZWN0aW5nIGFzIG11Y2gKKyAgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIE0gYXMgY29tcGxldGVkIGJlZm9yZSB0aGUgZXhjZXB0aW9uIHdhcyByYWlzZWQuCisgIFN1YnNlcXVlbnQgaW1wb3J0cyBnb3Qgbm8gaW5kaWNhdGlvbiB0aGF0IE0gd2FzIGluIGEgcGFydGlhbGx5LQorICBpbml0aWFsaXplZCBzdGF0ZSwgYW5kIHRoZSBpbXBvcnRlcnMgY291bGQgZ2V0IGludG8gYXJiaXRyYXJpbHkgYmFkCisgIHRyb3VibGUgYXMgYSByZXN1bHQgKHRoZSBNIHRoZXkgZ290IHdhcyBpbiBhbiB1bmludGVuZGVkIHN0YXRlLAorICBhcmJpdHJhcmlseSBmYXIgcmVtb3ZlZCBmcm9tIE0ncyBhdXRob3IncyBpbnRlbnQpLiAgTm93IHN1YnNlcXVlbnQKKyAgaW1wb3J0cyBvZiBNIHdpbGwgY29udGludWUgcmFpc2luZyBleGNlcHRpb25zIChidXQgaWYsIGZvciBleGFtcGxlLCB0aGUKKyAgc291cmNlIGNvZGUgZm9yIE0gaXMgZWRpdGVkIGJldHdlZW4gaW1wb3J0IGF0dGVtcHRzLCB0aGVuIHBlcmhhcHMgbGF0ZXIKKyAgYXR0ZW1wdHMgd2lsbCBzdWNjZWVkLCBvciByYWlzZSBhIGRpZmZlcmVudCBleGNlcHRpb24pLgorCisgIFRoaXMgY2FuIGJyZWFrIGV4aXN0aW5nIGNvZGUsIGJ1dCBpbiBzdWNoIGNhc2VzIHRoZSBjb2RlIHdhcyBwcm9iYWJseQorICB3b3JraW5nIGJlZm9yZSBieSBhY2NpZGVudC4gIEluIHRoZSBQeXRob24gc291cmNlLCB0aGUgb25seSBjYXNlIG9mCisgIGJyZWFrYWdlIGRpc2NvdmVyZWQgd2FzIGluIGEgdGVzdCBhY2NpZGVudGFsbHkgcmVseWluZyBvbiBhIGRhbWFnZWQKKyAgbW9kdWxlIHJlbWFpbmluZyBpbiBzeXMubW9kdWxlcy4gIENhc2VzIGFyZSBhbHNvIGtub3duIHdoZXJlIHRlc3RzCisgIGRlbGliZXJhdGVseSBwcm92b2tpbmcgaW1wb3J0IGVycm9ycyByZW1vdmUgZGFtYWdlZCBtb2R1bGVzIGZyb20KKyAgc3lzLm1vZHVsZXMgdGhlbXNlbHZlcywgYW5kIHN1Y2ggdGVzdHMgd2lsbCBicmVhayBub3cgaWYgdGhleSBkbyBhbgorICB1bmNvbmRpdGlvbmFsIGRlbCBzeXMubW9kdWxlc1tNXS4KKworLSB1JyVzJyAlIG9iaiB3aWxsIG5vdyB0cnkgb2JqLl9fdW5pY29kZV9fKCkgZmlyc3QgYW5kIGZhbGxiYWNrIHRvCisgIG9iai5fX3N0cl9fKCkgaWYgbm8gX191bmljb2RlX18gbWV0aG9kIGNhbiBiZSBmb3VuZC4KKworLSBQYXRjaCAjNTUwNzMyOiBBZGQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoKS4gIEFuYWxvZ291cyB0bworICBQeUFyZ19WYVBhcnNlKCkuICBCb3RoIGFyZSBub3cgZG9jdW1lbnRlZC4gIFRoYW5rcyBHcmVnIENoYXBtYW4uCisKKy0gQWxsb3cgc3RyaW5nIGFuZCB1bmljb2RlIHJldHVybiB0eXBlcyBmcm9tIC5lbmNvZGUoKS8uZGVjb2RlKCkKKyAgbWV0aG9kcyBvbiBzdHJpbmcgYW5kIHVuaWNvZGUgb2JqZWN0cy4gIEFkZGVkIHVuaWNvZGUuZGVjb2RlKCkKKyAgd2hpY2ggd2FzIG1pc3NpbmcgZm9yIG5vIGFwcGFyZW50IHJlYXNvbi4KKworLSBBbiBhdHRlbXB0IHRvIGZpeCB0aGUgbWVzcyB0aGF0IGlzIFB5dGhvbidzIGJlaGF2aW91ciB3aXRoCisgIHNpZ25hbCBoYW5kbGVycyBhbmQgdGhyZWFkcywgY29tcGxpY2F0ZWQgYnkgcmVhZGxpbmUncyBiZWhhdmlvdXIuCisgIEl0J3MgcXVpdGUgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgYnVncyBoZXJlLgorCistIEFkZGVkIEMgbWFjcm9zIFB5X0NMRUFSIGFuZCBQeV9WSVNJVCB0byBlYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICB0eXBlcyB0aGF0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uLgorCistIENvbXBpbGVyIG5vdyB0cmVhdHMgTm9uZSBhcyBhIGNvbnN0YW50LgorCistIFRoZSB0eXBlIG9mIHZhbHVlcyByZXR1cm5lZCBieSBfX2ludF9fLCBfX2Zsb2F0X18sIF9fbG9uZ19fLAorICBfX29jdF9fLCBhbmQgX19oZXhfXyBhcmUgbm93IGNoZWNrZWQuICBSZXR1cm5pbmcgYW4gaW52YWxpZCB0eXBlCisgIHdpbGwgY2F1c2UgYSBUeXBlRXJyb3IgdG8gYmUgcmFpc2VkLiAgVGhpcyBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZgorICBKeXRob24uCisKKy0gSW1wbGVtZW50ZWQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKSBpbiBsb2NhbGUgbW9kdWxlLgorCistIEFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgcHJvcGVyIHN0cmluZyBvcGVyYXRpb25zIGluIEJTRHMuICBzdHIuc3BsaXQKKyAgYW5kIHN0ci5pcyogbWV0aG9kcyBjYW4gbm93IHdvcmsgY29ycmVjdGx5IHdpdGggVVRGLTggbG9jYWxlcy4KKworLSBCdWcgIzk4OTE4NTogdW5pY29kZS5pc3dpZGUoKSBhbmQgdW5pY29kZS53aWR0aCgpIGlzIGRyb3BwZWQgYW5kCisgIHRoZSBFYXN0IEFzaWFuIFdpZHRoIHN1cHBvcnQgaXMgbW92ZWQgdG8gdW5pY29kZWRhdGEgZXh0ZW5zaW9uCisgIG1vZHVsZS4KKworLSBQYXRjaCAjOTQxMjI5OiBUaGUgc291cmNlIGNvZGUgZW5jb2RpbmcgaW4gaW50ZXJhY3RpdmUgbW9kZQorICBub3cgcmVmZXJzIHN5cy5zdGRpbi5lbmNvZGluZyBub3QganVzdCBJU08tODg1OS0xIGFueW1vcmUuICBUaGlzCisgIGFsbG93cyBmb3Igbm9uLWxhdGluLTEgdXNlcnMgdG8gd3JpdGUgdW5pY29kZSBzdHJpbmdzIGRpcmVjdGx5LgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBjcGlja2xlIG5vdyBzdXBwb3J0cyB0aGUgc2FtZSBrZXl3b3JkIGFyZ3VtZW50cyBhcyBwaWNrbGUuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBBZGRlZCBuZXcgY29kZWNzIGFuZCBhbGlhc2VzIGZvciBJU09fODg1OS0xMSwgSVNPXzg4NTktMTYgYW5kCisgIFRJUy02MjAKKworLSBUaGFua3MgdG8gRWR3YXJkIExvcGVyLCBkb2N0ZXN0IGhhcyBiZWVuIG1hc3NpdmVseSByZWZhY3RvcmVkLCBhbmQKKyAgbWFueSBuZXcgZmVhdHVyZXMgd2VyZSBhZGRlZC4gIEZ1bGwgZG9jcyB3aWxsIGFwcGVhciBsYXRlci4gIEZvciBub3cKKyAgdGhlIGRvY3Rlc3QgbW9kdWxlIGNvbW1lbnRzIGFuZCBuZXcgdGVzdCBjYXNlcyBnaXZlIGdvb2QgY292ZXJhZ2UuCisgIFRoZSByZWZhY3RvcmluZyBwcm92aWRlcyBtYW55IGhvb2sgcG9pbnRzIGZvciBjdXN0b21pemluZyBiZWhhdmlvcgorICAoc3VjaCBhcyBob3cgdG8gcmVwb3J0IGVycm9ycywgYW5kIGhvdyB0byBjb21wYXJlIGV4cGVjdGVkIHRvIGFjdHVhbAorICBvdXRwdXQpLiAgTmV3IGZlYXR1cmVzIGluY2x1ZGUgYSA8QkxBTktMSU5FPiBtYXJrZXIgZm9yIGV4cGVjdGVkCisgIG91dHB1dCBjb250YWluaW5nIGJsYW5rIGxpbmVzLCBvcHRpb25zIHRvIHByb2R1Y2UgdW5pZmllZCBvciBjb250ZXh0CisgIGRpZmZzIHdoZW4gYWN0dWFsIG91dHB1dCBkb2Vzbid0IG1hdGNoIGV4cGVjdGF0aW9ucywgYW4gb3B0aW9uIHRvCisgIG5vcm1hbGl6ZSB3aGl0ZXNwYWNlIGJlZm9yZSBjb21wYXJpbmcsIGFuZCBhbiBvcHRpb24gdG8gdXNlIGFuCisgIGVsbGlwc2lzIHRvIHNpZ25pZnkgImRvbid0IGNhcmUiIHJlZ2lvbnMgb2Ygb3V0cHV0LgorCistIFRraW50ZXIgbm93IHN1cHBvcnRzIHRoZSB3aXNoIC1zeW5jIGFuZCAtdXNlIG9wdGlvbnMuCisKKy0gVGhlIGZvbGxvd2luZyBtZXRob2RzIGluIHRpbWUgc3VwcG9ydCBwYXNzaW5nIG9mIE5vbmU6IGN0aW1lKCksIGdtdGltZSgpLAorICBhbmQgbG9jYWx0aW1lKCkuICBJZiBOb25lIGlzIHByb3ZpZGVkLCB0aGUgY3VycmVudCB0aW1lIGlzIHVzZWQgKHRoZQorICBzYW1lIGFzIHdoZW4gdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQpLgorICBbU0YgYnVnIDY1ODI1NCwgcGF0Y2ggNjYzNDgyXQorCistIG5udHBsaWIgZG9lcyBub3cgYWxsb3cgdG8gaWdub3JlIGEgLm5ldHJjIGZpbGUuCisKKy0gdXJsbGliMiBub3cgcmVjb2duaXplcyBCYXNpYyBhdXRoZW50aWNhdGlvbiBldmVuIGlmIG90aGVyIGF1dGhlbnRpY2F0aW9uCisgIHNjaGVtZXMgYXJlIG9mZmVyZWQuCisKKy0gQnVnICMxMDAxMDUzLiAgd2F2ZS5vcGVuKCkgbm93IGFjY2VwdHMgdW5pY29kZSBmaWxlbmFtZXMuCisKKy0gZ3ppcC5HemlwRmlsZSBoYXMgYSBuZXcgZmlsZW5vKCkgbWV0aG9kLCB0byByZXRyaWV2ZSB0aGUgaGFuZGxlIG9mIHRoZQorICB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0IChwcm92aWRlZCBpdCBoYXMgYSBmaWxlbm8oKSBtZXRob2QpLiAgVGhpcyBpcworICBuZWVkZWQgaWYgeW91IHdhbnQgdG8gdXNlIG9zLmZzeW5jKCkgb24gYSBHemlwRmlsZS4KKworLSBpbWFwbGliIGhhcyB0d28gbmV3IG1ldGhvZHM6IGRlbGV0ZWFjbCBhbmQgbXlyaWdodHMuCisKKy0gbm50cGxpYiBoYXMgdHdvIG5ldyBtZXRob2RzOiBkZXNjcmlwdGlvbiBhbmQgZGVzY3JpcHRpb25zLiBUaGV5CisgIHVzZSBhIG1vcmUgUkZDLWNvbXBsaWFudCB3YXkgb2YgZ2V0dGluZyBhIG5ld3Nncm91cCBkZXNjcmlwdGlvbi4KKworLSBCdWcgIzk5MzM5NC4gIEZpeCBhIHBvc3NpYmxlIHJlZCBoZXJyaW5nIG9mIEtleUVycm9yIGluICd0aHJlYWRpbmcnIGJlaW5nCisgIHJhaXNlZCBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24gZnJvbSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gd2l0aCBhdGV4aXQKKyAgd2hlbiBkdW1teV90aHJlYWRpbmcgaXMgYmVpbmcgdXNlZC4KKworLSBCdWcgIzg1NzI5Ny9QYXRjaCAjOTE2ODc0LiAgRml4IGFuIGVycm9yIHdoZW4gZXh0cmFjdGluZyBhIGhhcmQgbGluaworICBmcm9tIGEgdGFyZmlsZS4KKworLSBQYXRjaCAjODQ2NjU5LiAgRml4IGFuIGVycm9yIGluIHRhcmZpbGUucHkgd2hlbiB1c2luZworICBHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24uCisKKy0gVGhlIG9ic29sZXRlIEZDTlRMLnB5IGhhcyBiZWVuIGRlbGV0ZWQuICBUaGUgYnVpbHRpbiBmY250bCBtb2R1bGUKKyAgaGFzIGJlZW4gYXZhaWxhYmxlIChvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGZjbnRsKSBzaW5jZSBQeXRob24KKyAgMS41YTMsIGFuZCBhbGwgRkNOVEwucHkgZGlkIGlzIGV4cG9ydCBmY250bCdzIG5hbWVzLCBhZnRlciBnZW5lcmF0aW5nCisgIGEgZGVwcmVjYXRpb24gd2FybmluZyB0ZWxsaW5nIHlvdSB0byB1c2UgZmNudGwgZGlyZWN0bHkuCisKKy0gU2V2ZXJhbCBuZXcgdW5pY29kZSBjb2RlY3MgYXJlIGFkZGVkOiBiaWc1aGtzY3MsIGV1Y19qaXNfMjAwNCwKKyAgaXNvMjAyMl9qcF8yMDA0LCBzaGlmdF9qaXNfMjAwNC4KKworLSBCdWcgIzc4ODUyMC4gIFF1ZXVlLntnZXQsIGdldF9ub3dhaXQsIHB1dCwgcHV0X25vd2FpdH0gaGF2ZSBuZXcKKyAgaW1wbGVtZW50YXRpb25zLCBleHBsb2l0aW5nIENvbmRpdGlvbnMgKHdoaWNoIGRpZG4ndCBleGlzdCBhdCB0aGUgdGltZQorICBRdWV1ZSB3YXMgaW50cm9kdWNlZCkuICBBIG1pbm9yIHNlbWFudGljIGNoYW5nZSBpcyB0aGF0IHRoZSBGdWxsIGFuZAorICBFbXB0eSBleGNlcHRpb25zIHJhaXNlZCBieSBub24tYmxvY2tpbmcgY2FsbHMgbm93IG9jY3VyIG9ubHkgaWYgdGhlCisgIHF1ZXVlIHRydWx5IHdhcyBmdWxsIG9yIGVtcHR5IGF0IHRoZSBpbnN0YW50IHRoZSBxdWV1ZSB3YXMgY2hlY2tlZCAob2YKKyAgY291cnNlIHRoZSBRdWV1ZSBtYXkgbm8gbG9uZ2VyIGJlIGZ1bGwgb3IgZW1wdHkgYnkgdGhlIHRpbWUgYSBjYWxsaW5nCisgIHRocmVhZCBzZWVzIHRob3NlIGV4Y2VwdGlvbnMsIHRob3VnaCkuICBCZWZvcmUsIHRoZSBleGNlcHRpb25zIGNvdWxkCisgIGFsc28gYmUgcmFpc2VkIGlmIGl0IHdhcyAibWVyZWx5IGluY29udmVuaWVudCIgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbgorICB0byBkZXRlcm1pbmUgdGhlIHRydWUgc3RhdGUgb2YgdGhlIFF1ZXVlIChiZWNhdXNlIHRoZSBRdWV1ZSB3YXMgbG9ja2VkCisgIGJ5IHNvbWUgb3RoZXIgbWV0aG9kIGluIHByb2dyZXNzKS4KKworLSBCdWdzICM5Nzk3OTQgYW5kICM5ODAxMTc6IGRpZmZsaWIuZ2V0X2dyb3VwZWRfb3Bjb2RlcygpIG5vdyBoYW5kbGVzIHRoZQorICBjYXNlIG9mIGNvbXBhcmluZyB0d28gZW1wdHkgbGlzdHMuICBUaGlzIGFmZmVjdGVkIGJvdGggY29udGV4dF9kaWZmKCkgYW5kCisgIHVuaWZpZWRfZGlmZigpLAorCistIEJ1ZyAjOTgwOTM4OiBzbXRwbGliIG5vdyBwcmludHMgZGVidWcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCisKKy0gQnVnICM5MzAwMjQ6IHBvc2l4cGF0aC5yZWFscGF0aCgpIG5vdyBoYW5kbGVzIGluZmluaXRlIGxvb3BzIGluIHN5bWxpbmtzIGJ5CisgIHJldHVybmluZyB0aGUgbGFzdCBwb2ludCBpbiB0aGUgcGF0aCB0aGF0IHdhcyBub3QgcGFydCBvZiBhbnkgbG9vcC4gIFRoYW5rcworICBBTSBLdWNobGluZy4KKworLSBCdWcgIzk4MDMyNzogbnRwYXRoIG5vdCBoYW5kbGVzIGNvbXByZXNzaW5nIGVycm9uZW91cyBzbGFzaGVzIGJldHdlZW4gdGhlCisgIGRyaXZlIGxldHRlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhdGguICBBbHNvIGNsZWFybHkgaGFuZGxlcyBVTkMgYWRkcmVzc2VzIG5vdworICBhcyB3ZWxsLiAgVGhhbmtzIFBhdWwgTW9vcmUuCisKKy0gYnVnICM2Nzk5NTM6IHppcGZpbGUucHkgc2hvdWxkIG5vdyB3b3JrIGZvciBmaWxlcyBvdmVyIDIgR0IuICBUaGUgcGFja2VkIGRhdGEKKyAgZm9yIGZpbGUgc2l6ZXMgKGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCkgd2FzIGJlaW5nIHN0b3JlZCBhcyBzaWduZWQKKyAgaW5zdGVhZCBvZiB1bnNpZ25lZC4KKworLSBkZWNpbWFsLnB5IG5vdyBvbmx5IHVzZXMgc2lnbmFscyBpbiB0aGUgSUJNIHNwZWMuICBUaGUgb3RoZXIgY29uZGl0aW9ucyBhcmUKKyAgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuCisKKy0gY29kZWNzIG1vZHVsZSBub3cgaGFzIHR3byBuZXcgZ2VuZXJpYyBBUElzOiBlbmNvZGUoKSBhbmQgZGVjb2RlKCkKKyAgd2hpY2ggZG9uJ3QgcmVzdHJpY3QgdGhlIHJldHVybiB0eXBlcyAodW5saWtlIHRoZSB1bmljb2RlIGFuZAorICBzdHJpbmcgbWV0aG9kcyBvZiB0aGUgc2FtZSBuYW1lKS4KKworLSBOb24tYmxvY2tpbmcgU1NMIHNvY2tldHMgd29yayBhZ2FpbjsgdGhleSB3ZXJlIGJyb2tlbiBpbiBQeXRob24gMi4zLgorICBTRiBwYXRjaCA5NDU2NDIuCisKKy0gZG9jdGVzdCB1bml0dGVzdCBpbnRlZ3JhdGlvbiBpbXByb3ZlbWVudHM6CisKKyAgbyBJbXByb3ZlZCB0aGUgdW5pdGVzdCB0ZXN0IG91dHB1dCBmb3IgZG9jdGVzdC1iYXNlZCB1bml0IHRlc3RzCisKKyAgbyBDYW4gbm93IHBhc3Mgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bmN0aW9ucyB3aGVuIGNyZWF0aW5nCisgICAgRG9jVGVzdFN1aXRlcy4KKworLSBUaGUgdGhyZWFkaW5nIG1vZHVsZSBoYXMgYSBuZXcgY2xhc3MsIGxvY2FsLCBmb3IgY3JlYXRpbmcgb2JqZWN0cworICB0aGF0IHByb3ZpZGUgdGhyZWFkLWxvY2FsIGRhdGEuCisKKy0gQnVnICM5OTAzMDc6IHdoZW4ga2VlcF9lbXB0eV92YWx1ZXMgaXMgVHJ1ZSwgY2dpLnBhcnNlX3FzbCgpCisgIG5vIGxvbmdlciByZXR1cm5zIHNwdXJpb3VzIGVtcHR5IGZpZWxkcy4KKworLSBJbXBsZW1lbnRlZCBiaW5kX3RleHRkb21haW5fY29kZXNldCgpIGluIGdldHRleHQgbW9kdWxlLgorCistIEludHJvZHVjZWQgaW4gZ2V0dGV4dCBtb2R1bGUgdGhlIGwqZ2V0dGV4dCgpIGZhbWlseSBvZiBmdW5jdGlvbnMsCisgIHdoaWNoIHJldHVybiB0cmFuc2xhdGlvbiBzdHJpbmdzIGVuY29kZWQgaW4gdGhlIHByZWZlcnJlZCBlbmNvZGluZywKKyAgYXMgaW5mb3JtZWQgYnkgbG9jYWxlIG1vZHVsZSdzIGdldHByZWZlcnJlZGVuY29kaW5nKCkuCisKKy0gb3B0cGFyc2UgbW9kdWxlIChhbmQgdGVzdHMpIHVwZ3JhZGVkIHRvIE9wdGlrIDEuNWExLiAgQ2hhbmdlczoKKworICAtIEFkZCBleHBhbnNpb24gb2YgZGVmYXVsdCB2YWx1ZXMgaW4gaGVscCB0ZXh0OiB0aGUgc3RyaW5nCisgICAgIiVkZWZhdWx0IiBpbiBhbiBvcHRpb24ncyBoZWxwIHN0cmluZyBpcyBleHBhbmRlZCB0byBzdHIoKSBvZgorICAgIHRoYXQgb3B0aW9uJ3MgZGVmYXVsdCB2YWx1ZSwgb3IgIm5vbmUiIGlmIG5vIGRlZmF1bHQgdmFsdWUuCisKKyAgLSBCdWcgIzk1NTg4OTogb3B0aW9uIGRlZmF1bHQgdmFsdWVzIHRoYXQgaGFwcGVuIHRvIGJlIHN0cmluZ3MgYXJlCisgICAgbm93IHByb2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdmFsdWVzIGZyb20gdGhlIGNvbW1hbmQgbGluZTsgdGhpcworICAgIGFsbG93cyBnZW5lcmF0aW9uIG9mIG5pY2VyIGhlbHAgd2hlbiB1c2luZyBjdXN0b20gdHlwZXMuICBDYW4KKyAgICBiZSBkaXNhYmxlZCB3aXRoIHBhcnNlci5zZXRfcHJvY2Vzc19kZWZhdWx0X3ZhbHVlcyhGYWxzZSkuCisKKyAgLSBCdWcgIzk2MDUxNTogZG9uJ3QgY3Jhc2ggd2hlbiBnZW5lcmF0aW5nIGhlbHAgZm9yIGNhbGxiYWNrCisgICAgb3B0aW9ucyB0aGF0IHNwZWNpZnkgJ3R5cGUnLCBidXQgbm90ICdkZXN0JyBvciAnbWV0YXZhcicuCisKKyAgLSBGZWF0dXJlICM4MTUyNjQ6IGNoYW5nZSB0aGUgZGVmYXVsdCBoZWxwIGZvcm1hdCBmb3Igc2hvcnQgb3B0aW9ucworICAgIHRoYXQgdGFrZSBhbiBhcmd1bWVudCBmcm9tIGUuZy4gIi1vQVJHIiB0byAiLW8gQVJHIjsgYWRkCisgICAgc2V0X3Nob3J0X29wdF9kZWxpbWl0ZXIoKSBhbmQgc2V0X2xvbmdfb3B0X2RlbGltaXRlcigpIG1ldGhvZHMgdG8KKyAgICBIZWxwRm9ybWF0dGVyIHRvIGFsbG93IChzbGlnaHQpIGN1c3RvbWl6YXRpb24gb2YgdGhlIGZvcm1hdHRpbmcuCisKKyAgLSBQYXRjaCAjNzM2OTQwOiBpbnRlcm5hdGlvbmFsaXplIE9wdGlrOiBhbGwgYnVpbHQtaW4gdXNlci0KKyAgICB0YXJnZXRlZCBsaXRlcmFsIHN0cmluZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIGdldHRleHQuZ2V0dGV4dCgpLiAgKElmCisgICAgeW91IHdhbnQgdHJhbnNsYXRpb25zICgucG8gZmlsZXMpLCB0aGV5J3JlIG5vdCBpbmNsdWRlZCB3aXRoIFB5dGhvbgorICAgIC0tIHlvdSdsbCBmaW5kIHRoZW0gaW4gdGhlIE9wdGlrIHNvdXJjZSBkaXN0cmlidXRpb24gZnJvbQorICAgIGh0dHA6Ly9vcHRpay5zb3VyY2Vmb3JnZS5uZXQvIC4pCisKKyAgLSBCdWcgIzg3ODQ1MzogcmVzcGVjdCAkQ09MVU1OUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IKKyAgICB3cmFwcGluZyBoZWxwIG91dHB1dC4KKworICAtIEZlYXR1cmUgIzk4ODEyMjogZXhwYW5kICIlcHJvZyIgaW4gdGhlICdkZXNjcmlwdGlvbicgcGFzc2VkCisgICAgdG8gT3B0aW9uUGFyc2VyLCBqdXN0IGxpa2UgaW4gdGhlICd1c2FnZScgYW5kICd2ZXJzaW9uJyBzdHJpbmdzLgorICAgIChUaGlzIGlzICpub3QqIGRvbmUgaW4gdGhlICdkZXNjcmlwdGlvbicgcGFzc2VkIHRvIE9wdGlvbkdyb3VwLikKKworQyBBUEkKKy0tLS0tCisKKy0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUoKSBhbmQgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeCgpOiAgaWYgYW4KKyAgZXJyb3Igb2NjdXJzIHdoaWxlIGxvYWRpbmcgdGhlIG1vZHVsZSwgdGhlc2Ugbm93IGRlbGV0ZSB0aGUgbW9kdWxlJ3MKKyAgZW50cnkgZnJvbSBzeXMubW9kdWxlcy4gIEFsbCB3YXlzIG9mIGxvYWRpbmcgbW9kdWxlcyBldmVudHVhbGx5IGNhbGwKKyAgb25lIG9mIHRoZXNlLCBzbyB0aGlzIGlzIGFuIGVycm9yLWNhc2UgY2hhbmdlIGluIHNlbWFudGljcyBmb3IgYWxsCisgIHdheXMgb2YgbG9hZGluZyBtb2R1bGVzLiAgSW4gcmFyZSBjYXNlcywgYSBtb2R1bGUgbG9hZGVyIG1heSB3aXNoCisgIHRvIGtlZXAgYSBtb2R1bGUgb2JqZWN0IGluIHN5cy5tb2R1bGVzIGRlc3BpdGUgdGhhdCB0aGUgbW9kdWxlJ3MKKyAgY29kZSBjYW5ub3QgYmUgZXhlY3V0ZWQuICBJbiBzdWNoIGNhc2VzLCB0aGUgbW9kdWxlIGxvYWRlciBtdXN0CisgIGFycmFuZ2UgdG8gcmVpbnNlcnQgdGhlIG5hbWUgYW5kIG1vZHVsZSBvYmplY3QgaW4gc3lzLm1vZHVsZXMuCisgIFB5SW1wb3J0X1JlbG9hZE1vZHVsZSgpIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVpbnNlcnQgdGhlIG9yaWdpbmFsCisgIG1vZHVsZSBvYmplY3QgaW50byBzeXMubW9kdWxlcyBpZiB0aGUgbW9kdWxlIHJlbG9hZCBmYWlscywgc28gdGhhdAorICBpdHMgdmlzaWJsZSBzZW1hbnRpY3MgaGF2ZSBub3QgY2hhbmdlZC4KKworLSBBIGxhcmdlIHBpbGUgb2YgZGF0ZXRpbWUgZmllbGQtZXh0cmFjdGlvbiBtYWNyb3MgaXMgbm93IGRvY3VtZW50ZWQsCisgIHRoYW5rcyB0byBBbnRob255IFR1aW5pbmdhIChwYXRjaCAjOTg2MDEwKS4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorCistIEltcHJvdmVkIHRoZSB0dXRvcmlhbCBvbiBjcmVhdGluZyB0eXBlcyBpbiBDLgorCisgIC0gcG9pbnQgb3V0IHRoZSBpbXBvcnRhbmNlIG9mIHJlYXNzaWduaW5nIGRhdGEgbWVtYmVycyBiZWZvcmUKKyAgICBhc3NpZ25pbmcgdGhlaXIgdmFsdWVzCisKKyAgLSBjb3JyZWN0IG15IG1pc2NvbmNlcHRpb24gYWJvdXQgcmV0dXJuIHZhbHVlcyBmcm9tIHZpc2l0cHJvY3MuIFNpZ2guCisKKyAgLSBtZW50aW9uIHRoZSBsYWJvciBzYXZpbmcgUHlfVklTSVQgYW5kIFB5X0NMRUFSIG1hY3Jvcy4KKworLSBNYWpvciByZXdyaXRlIG9mIHRoZSBtYXRoIG1vZHVsZSBkb2NzLCB0byBhZGRyZXNzIGNvbW1vbiBjb25mdXNpb25zLgorCitUZXN0cworLS0tLS0KKworLSBUaGUgdGVzdCBkYXRhIGZpbGVzIGZvciB0aGUgZGVjaW1hbCB0ZXN0IHN1aXRlIGFyZSBub3cgaW5zdGFsbGVkIG9uCisgIHBsYXRmb3JtcyB0aGF0IHVzZSB0aGUgTWFrZWZpbGUuCisKKy0gU0YgcGF0Y2ggOTk1MjI1OiAgVGhlIHRlc3QgZmlsZSB0ZXN0dGFyLnRhciBhY2NpZGVudGFsbHkgY29udGFpbmVkCisgIENWUyBrZXl3b3JkcyAobGlrZSAkSWQkKSwgd2hpY2ggY291bGQgY2F1c2Ugc3B1cmlvdXMgZmFpbHVyZXMgaW4KKyAgdGVzdF90YXJmaWxlLnB5IGRlcGVuZGluZyBvbiBob3cgdGhlIHRlc3QgZmlsZSB3YXMgY2hlY2tlZCBvdXQuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDgtSlVMLTIwMDQqCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIHdlYWtyZWYucmVmIGlzIG5vdyB0aGUgdHlwZSBvYmplY3QgYWxzbyBrbm93biBhcworICB3ZWFrcmVmLlJlZmVyZW5jZVR5cGU7IGl0IGNhbiBiZSBzdWJjbGFzc2VkIGxpa2UgYW55IG90aGVyIG5ldy1zdHlsZQorICBjbGFzcy4gIFRoZXJlJ3MgbGVzcyBwZXItZW50cnkgb3ZlcmhlYWQgaW4gV2Vha1ZhbHVlRGljdGlvbmFyeQorICBvYmplY3RzIG5vdyAob25lIG9iamVjdCBpbnN0ZWFkIG9mIHRocmVlKS4KKworLSBCdWcgIzk1MTg1MTogUHl0aG9uIGNyYXNoZWQgd2hlbiByZWFkaW5nIGltcG9ydCB0YWJsZSBvZiBjZXJ0YWluCisgIFdpbmRvd3MgRExMcy4KKworLSBCdWcgIzIxNTEyNi4gIFRoZSBsb2NhbHMgYXJndW1lbnQgdG8gZXZhbCgpLCBleGVjZmlsZSgpLCBhbmQgZXhlYyBub3cKKyAgYWNjZXB0IGFueSBtYXBwaW5nIHR5cGUuCisKKy0gbWFyc2hhbCBub3cgc2hhcmVzIGludGVybmVkIHN0cmluZ3MuIFRoaXMgY2hhbmdlIGludHJvZHVjZXMKKyAgYSBuZXcgLnB5YyBtYWdpYy4KKworLSBCdWcgIzk2NjYyMy4gY2xhc3NlcyBjcmVhdGVkIHdpdGggdHlwZSgpIGluIGFuIGV4ZWMoLCB7fSkgZG9uJ3QKKyAgaGF2ZSBhIF9fbW9kdWxlX18sIGJ1dCBjb2RlIGluIHR5cGVvYmplY3QgYXNzdW1lZCBpdCB3b3VsZCBhbHdheXMKKyAgYmUgdGhlcmUuCisKKy0gUHl0aG9uIG5vIGxvbmdlciByZWxpZXMgb24gdGhlIExDX05VTUVSSUMgbG9jYWxlIHNldHRpbmcgdG8gYmUKKyAgdGhlICJDIiBsb2NhbGU7IGFzIGEgcmVzdWx0LCBpdCBubyBsb25nZXIgdHJpZXMgdG8gcHJldmVudCBjaGFuZ2luZworICB0aGUgTENfTlVNRVJJQyBjYXRlZ29yeS4KKworLSBCdWcgIzk1MjgwNzogIFVucGlja2xpbmcgcGlja2xlZCBpbnN0YW5jZXMgb2Ygc3ViY2xhc3NlcyBvZgorICBkYXRldGltZS5kYXRlLCBkYXRldGltZS5kYXRldGltZSBhbmQgZGF0ZXRpbWUudGltZSBjb3VsZCB5aWVsZCBpbnNhbmUKKyAgb2JqZWN0cy4gIFRoYW5rcyB0byBKaXdvbiBTZW8gZm9yIGEgZml4LgorCistIEJ1ZyAjODQ1ODAyOiBQeXRob24gY3Jhc2hlcyB3aGVuIF9faW5pdF9fLnB5IGlzIGEgZGlyZWN0b3J5LgorCistIFVuaWNvZGUgb2JqZWN0cyByZWNlaXZlZCB0d28gbmV3IG1ldGhvZHM6IGlzd2lkZSgpIGFuZCB3aWR0aCgpLgorICBUaGVzZSBxdWVyeSBFYXN0IEFzaWFuIHdpZHRoIGluZm9ybWF0aW9uLCBhcyBzcGVjaWZpZWQgaW4gVW5pY29kZQorICBUUjExLgorCistIEltcHJvdmVkIHRoZSB0dXBsZSBoYXNoaW5nIGFsZ29yaXRobSB0byBnaXZlIGZld2VyIGNvbGxpc2lvbnMgaW4KKyAgY29tbW9uIGNhc2VzLiAgRml4ZXMgYnVnICAjOTQyOTUyLgorCistIEltcGxlbWVudGVkIGdlbmVyYXRvciBleHByZXNzaW9ucyAoUEVQIDI4OSkuICBDb2RlZCBieSBKaXdvbiBTZW8uCisKKy0gRW5hYmxlZCB0aGUgcHJvZmlsaW5nIG9mIEMgZXh0ZW5zaW9uIGZ1bmN0aW9ucyAoYW5kIGJ1aWx0aW5zKSAtIGNoZWNrCisgIG5ldyBkb2N1bWVudGF0aW9uIGFuZCBtb2RpZmllZCBwcm9maWxlIGFuZCBiZGIgbW9kdWxlcyBmb3IgbW9yZSBkZXRhaWxzCisKKy0gU2V0IGZpbGUubmFtZSB0byB0aGUgb2JqZWN0IHBhc3NlZCB0byBvcGVuIChpbnN0ZWFkIG9mIGEgbmV3IHN0cmluZykKKworLSBNb3ZlZCB0cmFjZWJhY2tvYmplY3QgaW50byB0cmFjZWJhY2suaCBhbmQgcmVuYW1lZCB0byBQeVRyYWNlYmFja09iamVjdAorCistIE9wdGltaXplZCB0aGUgYnl0ZSBjb2RpbmcgZm9yIG11bHRpcGxlIGFzc2lnbm1lbnRzIGxpa2UgImEsYj1iLGEiIGFuZAorICAiYSxiLGM9MSwyLDMiLiAgSW1wcm92ZXMgdGhlaXIgc3BlZWQgYnkgMjUlIHRvIDMwJS4KKworLSBMaW1pdCB0aGUgbmVzdGVkIGRlcHRoIG9mIGEgdHVwbGUgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gaXNpbnN0YW5jZSgpCisgIGFuZCBpc3N1YmNsYXNzKCkgdG8gdGhlIHJlY3Vyc2lvbiBsaW1pdCBvZiB0aGUgaW50ZXJwcmV0ZXIuCisgIEZpeGVzIGJ1ZyAgIzg1ODAxNiAuCisKKy0gT3B0aW1pemVkIGRpY3QgaXRlcmF0b3JzLCBjcmVhdGluZyBzZXBhcmF0ZSB0eXBlcyBmb3IgZWFjaAorICBhbmQgaGF2aW5nIHRoZW0gcmV2ZWFsIHRoZWlyIGxlbmd0aC4gIEFsc28gb3B0aW1pemVkIHRoZQorICBtZXRob2RzOiAga2V5cygpLCB2YWx1ZXMoKSwgYW5kIGl0ZW1zKCkuCisKKy0gSW1wbGVtZW50ZWQgYSBuZXdjb2RlIG9wY29kZSwgTElTVF9BUFBFTkQsIHRoYXQgc2ltcGxpZmllcworICB0aGUgZ2VuZXJhdGVkIGJ5dGVjb2RlIGZvciBsaXN0IGNvbXByZWhlbnNpb25zIGFuZCBmdXJ0aGVyCisgIGltcHJvdmVzIHRoZWlyIHBlcmZvcm1hbmNlIChhYm91dCAzNSUpLgorCistIEltcGxlbWVudGVkIHJpY2ggY29tcGFyaXNvbnMgZm9yIGZsb2F0cywgd2hpY2ggc2VlbXMgdG8gbWFrZQorICBjb21wYXJpc29ucyBpbnZvbHZpbmcgTmFOcyBzb21ld2hhdCBsZXNzIHN1cnByaXNpbmcgd2hlbiB0aGUKKyAgdW5kZXJseWluZyBDIGNvbXBpbGVyIGFjdHVhbGx5IGltcGxlbWVudHMgQzk5IHNlbWFudGljcy4KKworLSBPcHRpbWl6ZWQgbGlzdC5leHRlbmQoKSB0byBzYXZlIG1lbW9yeSBhbmQgbm8gbG9uZ2VyIGNyZWF0ZQorICBpbnRlcm1lZGlhdGUgc2VxdWVuY2VzLiAgQWxzbywgZXh0ZW5kKCkgbm93IHByZS1hbGxvY2F0ZXMgdGhlCisgIG5lZWRlZCBtZW1vcnkgd2hlbmV2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgaXRlcmFibGUgaXMga25vd24gaW4KKyAgYWR2YW5jZSAtLSB0aGlzIGhhbHZlcyB0aGUgdGltZSB0byBleHRlbmQgdGhlIGxpc3QuCisKKy0gT3B0aW1pemVkIGxpc3QgcmVzaXplIG9wZXJhdGlvbnMgdG8gbWFrZSBmZXdlciBjYWxscyB0byB0aGUgc3lzdGVtCisgIHJlYWxsb2MoKS4gIFNpZ25pZmljYW50bHkgc3BlZWRzIHVwIGxpc3QgYXBwZW5kcywgbGlzdCBwb3BzLAorICBsaXN0IGNvbXByZWhlbnNpb25zLCBhbmQgdGhlIGxpc3QgY29uc3RydWN0b3IgKHdoZW4gdGhlIGlucHV0IGl0ZXJhYmxlCisgIGxlbmd0aCBpcyBub3Qga25vd24pLgorCistIENoYW5nZWQgdGhlIGludGVybmFsIGxpc3Qgb3Zlci1hbGxvY2F0aW9uIHNjaGVtZS4gIEZvciBsYXJnZXIgbGlzdHMsCisgIG92ZXJhbGxvY2F0aW9uIHJhbmdlZCBiZXR3ZWVuIDMlIGFuZCAyNSUuICBOb3csIGl0IGlzIGEgY29uc3RhbnQgMTIlLgorICBGb3Igc21hbGxlciBsaXN0cyAobjw4KSwgb3ZlcmFsbG9jYXRpb24gd2FzIHVwdG8gZWlnaHQgZWxlbWVudHMuICBOb3csCisgIHRoZSBvdmVyYWxsb2NhdGlvbiBpcyBubyBtb3JlIHRoYW4gdGhyZWUgZWxlbWVudHMgLS0gdGhpcyBpbXByb3ZlcyBzcGFjZQorICB1dGlsaXphdGlvbiBmb3IgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBsYXJnZSBudW1iZXJzIG9mIHNtYWxsIGxpc3RzLgorCistIE1vc3QgbGlzdCBib2RpZXMgbm93IGdldCByZS11c2VkIHJhdGhlciB0aGFuIGZyZWVkLiAgU3BlZWRzIHVwIGxpc3QKKyAgaW5zdGFudGlhdGlvbiBhbmQgZGVsZXRpb24gYnkgc2F2aW5nIGNhbGxzIHRvIG1hbGxvYygpIGFuZCBmcmVlKCkuCisKKy0gVGhlIGRpY3QudXBkYXRlKCkgbWV0aG9kIG5vdyBhY2NlcHRzIGFsbCB0aGUgc2FtZSBhcmd1bWVudCBmb3JtcworICBhcyB0aGUgZGljdCgpIGNvbnN0cnVjdG9yLiAgVGhpcyBub3cgaW5jbHVkZXMgaXRlbSBsaXN0cyBhbmQvb3IKKyAga2V5d29yZCBhcmd1bWVudHMuCisKKy0gU3VwcG9ydCBmb3IgYXJiaXRyYXJ5IG9iamVjdHMgc3VwcG9ydGluZyB0aGUgcmVhZC1vbmx5IGJ1ZmZlcgorICBpbnRlcmZhY2UgYXMgdGhlIGNvX2NvZGUgZmllbGQgb2YgY29kZSBvYmplY3RzIChzb21ldGhpbmcgdGhhdCB3YXMKKyAgb25seSBwb3NzaWJsZSB0byBjcmVhdGUgZnJvbSBDIGNvZGUpIGhhcyBiZWVuIHJlbW92ZWQuCisKKy0gTWFkZSBvbWl0dGVkIGNhbGxiYWNrIGFuZCBOb25lIGVxdWl2YWxlbnQgZm9yIHdlYWtyZWYucmVmKCkgYW5kCisgIHdlYWtyZWYucHJveHkoKTsgdGhlIE5vbmUgY2FzZSB3YXNuJ3QgaGFuZGxlZCBjb3JyZWN0bHkgaW4gYWxsCisgIGNhc2VzLgorCistIEZpeGVkIHByb2JsZW0gd2hlcmUgUHlXZWFrcmVmX05ld1JlZigpIGFuZCBQeVdlYWtyZWZfTmV3UHJveHkoKQorICBhc3N1bWVkIHRoYXQgaW5pdGlhbCBleGlzdGluZyBlbnRyaWVzIGluIGFuIG9iamVjdCdzIHdlYWtyZWYgbGlzdAorICB3b3VsZCBub3QgYmUgcmVtb3ZlZCB3aGlsZSBhbGxvY2F0aW5nIGEgbmV3IHdlYWtyZWYgb2JqZWN0LiAgU2luY2UKKyAgR0MgY291bGQgYmUgaW52b2tlZCBhdCB0aGF0IHRpbWUsIGhvd2V2ZXIsIHRoYXQgYXNzdW1wdGlvbiB3YXMKKyAgaW52YWxpZC4gIEluIGEgdHJ1bHkgb2JzY3VyZSBjYXNlIG9mIEdDIGJlaW5nIHRyaWdnZXJlZCBkdXJpbmcKKyAgY3JlYXRpb24gZm9yIGEgbmV3IHdlYWtyZWYgb2JqZWN0IGZvciBhbiByZWZlcmVudCB3aGljaCBhbHJlYWR5CisgIGhhcyBhIHdlYWtyZWYgd2l0aG91dCBhIGNhbGxiYWNrIHdoaWNoIGlzIG9ubHkgcmVmZXJlbmNlZCBmcm9tCisgIGN5Y2xpYyB0cmFzaCwgYSBtZW1vcnkgZXJyb3IgY2FuIG9jY3VyLiAgVGhpcyBjb25zaXN0ZW50bHkgY3JlYXRlZCBhCisgIHNlZ2ZhdWx0IGluIGEgZGVidWcgYnVpbGQsIGJ1dCBwcm92aWRlZCBsZXNzIHByZWRpY3RhYmxlIGJlaGF2aW9yIGluCisgIGEgcmVsZWFzZSBidWlsZC4KKworLSBpbnB1dCgpIGJ1aWx0aW4gZnVuY3Rpb24gbm93IHJlc3BlY3RzIGNvbXBpbGVyIGZsYWdzIHN1Y2ggYXMKKyAgX19mdXR1cmVfXyBzdGF0ZW1lbnRzLiAgU0YgcGF0Y2ggODc2MTc4LgorCistIFJlbW92ZWQgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBmcm9tIGFwcGx5KCkuICBhcHBseSgpIHJlbWFpbnMKKyAgZGVwcmVjYXRlZCwgYnV0IHRoZSBudWlzYW5jZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZC4KKworLSBBdCBQeXRob24gc2h1dGRvd24gdGltZSAoUHlfRmluYWxpemUoKSksIDIuMyBjYWxsZWQgY3ljbGljIGdhcmJhZ2UKKyAgY29sbGVjdGlvbiB0d2ljZSwgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRlYXJpbmcgZG93biBtb2R1bGVzLiAgVGhlCisgIGNhbGwgYWZ0ZXIgdGVhcmluZyBkb3duIG1vZHVsZXMgaGFzIGJlZW4gZGlzYWJsZWQsIGJlY2F1c2UgdG9vIG11Y2gKKyAgb2YgUHl0aG9uIGhhcyBiZWVuIHRvcm4gZG93biB0aGVuIGZvciBfX2RlbF9fIG1ldGhvZHMgYW5kIHdlYWtyZWYKKyAgY2FsbGJhY2tzIHRvIGV4ZWN1dGUgc2FuZWx5LiAgVGhlIG1vc3QgY29tbW9uIHN5bXB0b20gd2FzIGEgc2VxdWVuY2UKKyAgb2YgdW5pbmZvcm1hdGl2ZSBtZXNzYWdlcyBvbiBzdGRlcnIgd2hlbiBQeXRob24gc2h1dCBkb3duLCBwcm9kdWNlZAorICBieSB0aHJlYWRzIHRyeWluZyB0byByYWlzZSBleGNlcHRpb25zLCBidXQgdW5hYmxlIHRvIHJlcG9ydCB0aGUgbmF0dXJlCisgIG9mIHRoZWlyIHByb2JsZW1zIGJlY2F1c2UgdG9vIG11Y2ggb2YgdGhlIHN5cyBtb2R1bGUgaGFkIGFscmVhZHkgYmVlbgorICBkZXN0cm95ZWQuCisKKy0gUmVtb3ZlZCBGdXR1cmVXYXJuaW5ncyByZWxhdGVkIHRvIGhleC9vY3QgbGl0ZXJhbHMgYW5kIGNvbnZlcnNpb25zCisgIGFuZCBsZWZ0IHNoaWZ0cy4gIChUaGFua3MgdG8gS2FsbGUgU3ZlbnNzb24gZm9yIFNGIHBhdGNoIDg0OTIyNy4pCisgIFRoaXMgYWRkcmVzc2VzIG1vc3Qgb2YgdGhlIHJlbWFpbmluZyBzZW1hbnRpYyBjaGFuZ2VzIHByb21pc2VkIGJ5CisgIFBFUCAyMzcsIGV4Y2VwdCBmb3IgcmVwcigpIG9mIGEgbG9uZywgd2hpY2ggc3RpbGwgc2hvd3MgdGhlIHRyYWlsaW5nCisgICdMJy4gIFRoZSBQRVAgYXBwZWFycyB0byBwcm9taXNlIHdhcm5pbmdzIGZvciBvcGVyYXRpb25zIHRoYXQKKyAgY2hhbmdlZCBzZW1hbnRpY3MgY29tcGFyZWQgdG8gUHl0aG9uIDIuMywgYnV0IHRoaXMgaXMgbm90CisgIGltcGxlbWVudGVkOyB3ZSd2ZSBzdWZmZXJlZCB0aHJvdWdoIGVub3VnaCB3YXJuaW5ncyByZWxhdGVkIHRvCisgIGhleC9vY3QgbGl0ZXJhbHMgYW5kIEkgdGhpbmsgaXQncyBiZXN0IHRvIGJlIHNpbGVudCBub3cuCisKKy0gRm9yIHN0ciBhbmQgdW5pY29kZSBvYmplY3RzLCB0aGUgbGp1c3QoKSwgY2VudGVyKCksIGFuZCByanVzdCgpCisgIG1ldGhvZHMgbm93IGFjY2VwdCBhbiBvcHRpb25hbCBhcmd1bWVudCBzcGVjaWZ5aW5nIGEgZmlsbAorICBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBhIHNwYWNlLgorCistIFdoZW4gbWV0aG9kIG9iamVjdHMgaGF2ZSBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgc2F0aXNmaWVkIGVpdGhlcgorICBieSB0aGUgZnVuY3Rpb24gb2JqZWN0IG9yIGJ5IHRoZSBtZXRob2Qgb2JqZWN0LCB0aGUgZnVuY3Rpb24KKyAgb2JqZWN0J3MgYXR0cmlidXRlIHVzdWFsbHkgd2lucy4gIENocmlzdGlhbiBUaXNtZXIgcG9pbnRlZCBvdXQgdGhhdAorICB0aGF0IHRoaXMgaXMgcmVhbGx5IGEgbWlzdGFrZSwgYmVjYXVzZSB0aGlzIG9ubHkgaGFwcGVucyBmb3Igc3BlY2lhbAorICBtZXRob2RzIChsaWtlIF9fcmVkdWNlX18pIHdoZXJlIHRoZSBtZXRob2Qgb2JqZWN0J3MgdmVyc2lvbiBpcworICByZWFsbHkgbW9yZSBhcHByb3ByaWF0ZSB0aGFuIHRoZSBmdW5jdGlvbidzIGF0dHJpYnV0ZS4gIFNvIGZyb20gbm93CisgIG9uLCBhbGwgbWV0aG9kIGF0dHJpYnV0ZXMgd2lsbCBoYXZlIHByZWNlZGVuY2Ugb3ZlciBmdW5jdGlvbgorICBhdHRyaWJ1dGVzIHdpdGggdGhlIHNhbWUgbmFtZS4KKworLSBDcml0aWNhbCBidWdmaXgsIGZvciBTRiBidWcgODM5NTQ4OiAgaWYgYSB3ZWFrcmVmIHdpdGggYSBjYWxsYmFjaywKKyAgaXRzIGNhbGxiYWNrLCBhbmQgaXRzIHdlYWtseSByZWZlcmVuY2VkIG9iamVjdCwgYWxsIGJlY2FtZSBwYXJ0IG9mCisgIGN5Y2xpYyBnYXJiYWdlIGR1cmluZyBhIHNpbmdsZSBydW4gb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLCB0aGUgb3JkZXIKKyAgaW4gd2hpY2ggdGhleSB3ZXJlIHRvcm4gZG93biB3YXMgdW5wcmVkaWN0YWJsZS4gIEl0IHdhcyBwb3NzaWJsZSBmb3IKKyAgdGhlIGNhbGxiYWNrIHRvIHNlZSBwYXJ0aWFsbHktdG9ybi1kb3duIG9iamVjdHMsIGxlYWRpbmcgdG8gaW1tZWRpYXRlCisgIHNlZ2ZhdWx0cywgb3IsIGlmIHRoZSBjYWxsYmFjayByZXN1cnJlY3RlZCBnYXJiYWdlIG9iamVjdHMsIHRvCisgIHJlc3VycmVjdCBpbnNhbmUgb2JqZWN0cyB0aGF0IGNhdXNlZCBzZWdmYXVsdHMgKG9yIG90aGVyIHN1cnByaXNlcykKKyAgbGF0ZXIuICBJbiBvbmUgc2Vuc2UgdGhpcyB3YXNuJ3Qgc3VycHJpc2luZywgYmVjYXVzZSBQeXRob24ncyBjeWNsaWMgZ2MKKyAgaGFkIG5vIGtub3dsZWRnZSBvZiBQeXRob24ncyB3ZWFrcmVmIG9iamVjdHMuICBJdCBkb2VzIG5vdy4gIFdoZW4KKyAgd2Vha3JlZnMgd2l0aCBjYWxsYmFja3MgYmVjb21lIHBhcnQgb2YgY3ljbGljIGdhcmJhZ2Ugbm93LCB0aG9zZQorICB3ZWFrcmVmcyBhcmUgY2xlYXJlZCBmaXJzdC4gIFRoZSBjYWxsYmFja3MgZG9uJ3QgdHJpZ2dlciB0aGVuLAorICBwcmV2ZW50aW5nIHRoZSBwcm9ibGVtcy4gIElmIHlvdSBuZWVkIGNhbGxiYWNrcyB0byB0cmlnZ2VyLCB0aGVuIGp1c3QKKyAgYXMgd2hlbiBjeWNsaWMgZ2MgaXMgbm90IGludm9sdmVkLCB5b3UgbmVlZCB0byB3cml0ZSB5b3VyIGNvZGUgc28KKyAgdGhhdCB3ZWFrcmVmIG9iamVjdHMgb3V0bGl2ZSB0aGUgb2JqZWN0cyB0aGV5IHdlYWtseSByZWZlcmVuY2UuCisKKy0gQ3JpdGljYWwgYnVnZml4LCBmb3IgU0YgYnVnIDg0MDgyOTogIGlmIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3Rpb24KKyAgaGFwcGVuZWQgdG8gb2NjdXIgZHVyaW5nIGEgd2Vha3JlZiBjYWxsYmFjayBmb3IgYSBuZXctc3R5bGUgY2xhc3MKKyAgaW5zdGFuY2UsIHN1YnRsZSBtZW1vcnkgY29ycnVwdGlvbiB3YXMgdGhlIHJlc3VsdCAoaW4gYSByZWxlYXNlIGJ1aWxkOworICBpbiBhIGRlYnVnIGJ1aWxkLCBhIHNlZ2ZhdWx0IG9jY3VycmVkIHJlbGlhYmx5IHZlcnkgc29vbiBhZnRlcikuCisgIFRoaXMgaGFzIGJlZW4gcmVwYWlyZWQuCisKKy0gQ29tcGlsZXIgZmxhZ3Mgc2V0IGluIFBZVEhPTlNUQVJUVVAgYXJlIG5vdyBhY3RpdmUgaW4gX19tYWluX18uCisKKy0gQWRkZWQgdHdvIGJ1aWx0aW4gdHlwZXMsIHNldCgpIGFuZCBmcm96ZW5zZXQoKS4KKworLSBBZGRlZCBhIHJldmVyc2VkKCkgYnVpbHRpbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSByZXZlcnNlIGl0ZXJhdG9yCisgIG92ZXIgYSBzZXF1ZW5jZS4KKworLSBBZGRlZCBhIHNvcnRlZCgpIGJ1aWx0aW4gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IHNvcnRlZCBsaXN0CisgIGZyb20gYW55IGl0ZXJhYmxlLgorCistIENPYmplY3RzIGFyZSBub3cgbXV0YWJsZSAob24gdGhlIEMgbGV2ZWwpIHRocm91Z2ggUHlDT2JqZWN0X1NldFZvaWRQdHIuCisKKy0gbGlzdC5zb3J0KCkgbm93IHN1cHBvcnRzIHRocmVlIGtleXdvcmQgYXJndW1lbnRzOiAgY21wLCBrZXksIGFuZCByZXZlcnNlLgorICBUaGUga2V5IGFyZ3VtZW50IGNhbiBiZSBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGV4dHJhY3RzIGEKKyAgY29tcGFyaXNvbiBrZXkgZnJvbSB0aGUgb3JpZ2luYWwgcmVjb3JkOiAgbXlsaXN0LnNvcnQoa2V5PXN0ci5sb3dlcikuCisgIFRoZSByZXZlcnNlIGFyZ3VtZW50IGlzIGEgYm9vbGVhbiB2YWx1ZSBhbmQgaWYgVHJ1ZSB3aWxsIGNoYW5nZSB0aGUKKyAgc29ydCBvcmRlciBhcyBpZiB0aGUgY29tcGFyaXNvbiBhcmd1bWVudHMgd2VyZSByZXZlcnNlZC4gIEluIGFkZGl0aW9uLAorICB0aGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBhbWVuZGVkIHRvIHByb3ZpZGUgYSBndWFyYW50ZWUgdGhhdCBhbGwgc29ydHMKKyAgc3RhcnRpbmcgd2l0aCBQeTIuMyBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUgKHRoZSByZWxhdGl2ZSBvcmRlciBvZgorICByZWNvcmRzIHdpdGggZXF1YWwga2V5cyBpcyB1bmNoYW5nZWQpLgorCistIEFkZGVkIHRlc3Qgd2hldGhlciB3Y2hhcl90IGlzIHNpZ25lZCBvciBub3QuIEEgc2lnbmVkIHdjaGFyX3QgaXMgbm90CisgIHVzYWJsZSBhcyBpbnRlcm5hbCB1bmljb2RlIHR5cGUgYmFzZSBmb3IgUHlfVU5JQ09ERSBzaW5jZSB0aGUKKyAgdW5pY29kZSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIGFuIHVuc2lnbmVkIHR5cGUuCisKKy0gRml4ZWQgYSBidWcgaW4gdGhlIGNhY2hlIG9mIGxlbmd0aC1vbmUgVW5pY29kZSBzdHJpbmdzIHRoYXQgY291bGQKKyAgbGVhZCB0byBhIHNlZyBmYXVsdC4gIFRoZSBzcGVjaWZpYyBwcm9ibGVtIG9jY3VycmVkIHdoZW4gYW4gZWFybGllciwKKyAgbm9uLWZhdGFsIGVycm9yIGxlZnQgYW4gdW5pbml0aWFsaXplZCBVbmljb2RlIG9iamVjdCBpbiB0aGUKKyAgZnJlZWxpc3QuCisKKy0gVGhlICUgZm9ybWF0dGluZyBvcGVyYXRvciBub3cgc3VwcG9ydHMgJyVGJyB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICclZicuICBUaGlzIGhhcyBhbHdheXMgYmVlbiBkb2N1bWVudGVkIGJ1dCBuZXZlciBpbXBsZW1lbnRlZC4KKworLSBjb21wbGV4KG9iaikgY291bGQgbGVhayBhIGxpdHRsZSBtZW1vcnkgaWYgb2JqIHdhc24ndCBhIHN0cmluZyBvcgorICBudW1iZXIuCisKKy0gemlwKCkgd2l0aCBubyBhcmd1bWVudHMgbm93IHJldHVybnMgYW4gZW1wdHkgbGlzdCBpbnN0ZWFkIG9mIHJhaXNpbmcKKyAgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgorCistIG9iai5fX2NvbnRhaW5zX18oKSBub3cgcmV0dXJucyBUcnVlL0ZhbHNlIGluc3RlYWQgb2YgMS8wLiAgU0YgcGF0Y2gKKyAgODIwMTk1LgorCistIFB5dGhvbiBubyBsb25nZXIgdHJpZXMgdG8gYmUgc21hcnQgYWJvdXQgcmVjdXJzaXZlIGNvbXBhcmlzb25zLgorICBXaGVuIGNvbXBhcmluZyBjb250YWluZXJzIHdpdGggY3ljbGljIHJlZmVyZW5jZXMgdG8gdGhlbXNlbHZlcyBpdAorICB3aWxsIG5vdyBqdXN0IGhpdCB0aGUgcmVjdXJzaW9uIGxpbWl0LiAgU2VlIFNGIHBhdGNoIDgyNTYzOS4KKworLSBzdHIgYW5kIHVuaWNvZGUgYnVpbHRpbiB0eXBlcyBub3cgaGF2ZSBhbiByc3BsaXQoKSBtZXRob2QgdGhhdCBpcworICBzYW1lIGFzIHNwbGl0KCkgZXhjZXB0IHRoYXQgaXQgc2NhbnMgdGhlIHN0cmluZyBmcm9tIHRoZSBlbmQKKyAgd29ya2luZyB0b3dhcmRzIHRoZSBiZWdpbm5pbmcuICBTZWUgU0YgZmVhdHVyZSByZXF1ZXN0IDgwMTg0Ny4KKworLSBGaXhlZCBhIGJ1ZyBpbiBvYmplY3QuX19yZWR1Y2VfZXhfXyB3aGVuIHVzaW5nIHByb3RvY29sIDIuICBGYWlsdXJlCisgIHRvIGNsZWFyIHRoZSBlcnJvciB3aGVuIGF0dGVtcHRzIHRvIGdldCB0aGUgX19nZXRzdGF0ZV9fIGF0dHJpYnV0ZQorICBmYWlsIGNhdXNlZCBpbnRlcm1pdHRlbnQgZXJyb3JzIGFuZCBvZGQgYmVoYXZpb3IuCisKKy0gYnVmZmVyIG9iamVjdHMgYmFzZWQgb24gb3RoZXIgb2JqZWN0cyBubyBsb25nZXIgY2FjaGUgYSBwb2ludGVyIHRvCisgIHRoZSBkYXRhIGFuZCB0aGUgZGF0YSBsZW5ndGguICBJbnN0ZWFkLCB0aGUgYXBwcm9wcmlhdGUgdHBfYXNfYnVmZmVyCisgIG1ldGhvZCBpcyBjYWxsZWQgYXMgbmVjZXNzYXJ5LgorCistIGZpeGVkOiBpZiBhIGZpbGUgaXMgb3BlbmVkIHdpdGggYW4gZXhwbGljaXQgYnVmZmVyIHNpemUgPj0gMSwgcmVwZWF0ZWQKKyAgY2xvc2UoKSBjYWxscyB3b3VsZCBhdHRlbXB0IHRvIGZyZWUoKSB0aGUgYnVmZmVyIGFscmVhZHkgZnJlZSgpZWQgb24KKyAgdGhlIGZpcnN0IGNhbGwuCisKKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQWRkZWQgc29ja2V0LmdldHNlcnZieXBvcnQoKSwgYW5kIG1ha2UgdGhlIHNlY29uZCBhcmd1bWVudCBpbgorICBnZXRzZXJ2YnluYW1lKCkgYW5kIGdldHNlcnZieXBvcnQoKSBvcHRpb25hbC4KKworLSB0aW1lIG1vZHVsZSBjb2RlIHRoYXQgZGVhbHMgd2l0aCBpbnB1dCBQT1NJWCB0aW1lc3RhbXBzIHdpbGwgbm93IHJhaXNlCisgIFZhbHVlRXJyb3IgaWYgbW9yZSB0aGFuIGEgc2Vjb25kIGlzIGxvc3QgaW4gcHJlY2lzaW9uIHdoZW4gdGhlCisgIHRpbWVzdGFtcCBpcyBjYXN0IHRvIHRoZSBwbGF0Zm9ybSBDIHRpbWVfdCB0eXBlLiAgVGhlcmUncyBubyBjaGFuY2UKKyAgdGhhdCB0aGUgcGxhdGZvcm0gd2lsbCBkbyBhbnl0aGluZyBzZW5zaWJsZSB3aXRoIHRoZSByZXN1bHQgaW4gc3VjaAorICBjYXNlcy4gIFRoaXMgaW5jbHVkZXMgY3RpbWUoKSwgbG9jYWx0aW1lKCkgYW5kIGdtdGltZSgpLiAgQXNzb3J0ZWQKKyAgZnJvbXRpbWVzdGFtcCgpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgbWV0aG9kcyBpbiB0aGUgZGF0ZXRpbWUgbW9kdWxlCisgIHdlcmUgYWxzbyBwcm90ZWN0ZWQuICBDbG9zZXMgYnVncyAjOTE5MDEyIGFuZCA5NzU5OTYuCisKKy0gZmNudGwuaW9jdGwgbm93IHdhcm5zIGlmIHRoZSBtdXRhdGUgZmxhZyBpcyBub3Qgc3BlY2lmaWVkLgorCistIG50IG5vdyBwcm9wZXJseSBhbGxvd3MgdG8gcmVmZXIgdG8gVU5DIHJvb3RzLCBlLmcuIGluIG50LnN0YXQoKS4KKworLSB0aGUgd2Vha3JlZiBtb2R1bGUgbm93IHN1cHBvcnRzIGFkZGl0aW9uYWwgb2JqZWN0czogIGFycmF5LmFycmF5LAorICBzcmUucGF0dGVybl9vYmplY3RzLCBmaWxlIG9iamVjdHMsIGFuZCBzb2NrZXRzLgorCistIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoKSBhbmQgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoKSBub3cgZ2l2ZQorICBmZXdlciBmYWxzZSBwb3NpdGl2ZXMuCisKKy0gc29ja2V0LnNzbGVycm9yIGlzIG5vdyBhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvciAuICBBbHNvIGFkZGVkCisgIHNvY2tldC5lcnJvciB0byB0aGUgc29ja2V0IG1vZHVsZSdzIEMgQVBJLgorCistIEJ1ZyAjOTIwNTc1OiBBIHByb2JsZW0gd2hlcmUgdGhlIF9sb2NhbGUgbW9kdWxlIHNlZ2ZhdWx0cyBvbgorICBubF9sYW5naW5mbyhFUkEpIGNhdXNlZCBieSBHTlUgbGliYydzIGlsbGVnYWwgTlVMTCByZXR1cm4gaXMgZml4ZWQuCisKKy0gYXJyYXkgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgY29weSBtb2R1bGUuICBBbHNvLCB0aGVpciByZXNpemluZworICBzY2hlbWUgaGFzIGJlZW4gdXBkYXRlZCB0byBtYXRjaCB0aGF0IHVzZWQgZm9yIGxpc3Qgb2JqZWN0cy4gIFRoaXMgaW1wcm92ZXMKKyAgdGhlIHBlcmZvcm1hbmNlIChzcGVlZCBhbmQgbWVtb3J5IHVzYWdlKSBvZiBhcHBlbmQoKSBvcGVyYXRpb25zLgorICBBbHNvLCBhcnJheS5hcnJheSgpIGFuZCBhcnJheS5leHRlbmQoKSBub3cgYWNjZXB0IGFueSBpdGVyYWJsZSBhcmd1bWVudAorICBmb3IgcmVwZWF0ZWQgYXBwZW5kcyB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGFub3RoZXIgdGVtcG9yYXJ5IGFycmF5LgorCistIGNTdHJpbmdJTy53cml0ZWxpbmVzKCkgbm93IGFjY2VwdHMgYW55IGl0ZXJhYmxlIGFyZ3VtZW50IGFuZCB3cml0ZXMKKyAgdGhlIGxpbmVzIG9uZSBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gam9pbmluZyB0aGVtIGFuZCB3cml0aW5nIG9uY2UuCisgIE1hZGUgYSBwYXJhbGxlbCBjaGFuZ2UgdG8gU3RyaW5nSU8ud3JpdGVsaW5lcygpLiAgU2F2ZXMgbWVtb3J5IGFuZAorICBtYWtlcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2VuZXJhdG9yIGV4cHJlc3Npb25zLgorCistIHRpbWUuc3RyZnRpbWUoKSBub3cgY2hlY2tzIHRoYXQgdGhlIHZhbHVlcyBpbiBpdHMgdGltZSB0dXBsZSBhcmd1bWVudAorICBhcmUgd2l0aGluIHRoZSBwcm9wZXIgYm91bmRhcmllcyB0byBwcmV2ZW50IHBvc3NpYmxlIGNyYXNoZXMgZnJvbSB0aGUKKyAgcGxhdGZvcm0ncyBDIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gb2Ygc3RyZnRpbWUoKS4gIENhbiBwb3NzaWJseQorICBicmVhayBjb2RlIHRoYXQgdXNlcyB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgdGhhdCBkaWRuJ3QgY2F1c2UKKyAgcHJvYmxlbXMgcHJldmlvdXNseSAoc3VjaCBhcyBzaXR0aW5nIGRheSBvZiB5ZWFyIHRvIDApLiAgRml4ZXMgYnVnCisgICM4OTc2MjUuCisKKy0gVGhlIHNvY2tldCBtb2R1bGUgbm93IHN1cHBvcnRzIEJsdWV0b290aCBzb2NrZXRzLCBpZiB0aGUKKyAgc3lzdGVtIGhhcyA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorCistIEFkZGVkIGEgY29sbGVjdGlvbnMgbW9kdWxlIGNvbnRhaW5pbmcgYSBuZXcgZGF0YXR5cGUsIGRlcXVlKCksCisgIG9mZmVyaW5nIGhpZ2gtcGVyZm9ybWFuY2UsIHRocmVhZC1zYWZlLCBtZW1vcnkgZnJpZW5kbHkgYXBwZW5kcworICBhbmQgcG9wcyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgZGVxdWUuCisKKy0gU2V2ZXJhbCBtb2R1bGVzIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBjb2xsZWN0aW9ucy5kZXF1ZSgpIGZvcgorICBpbXByb3ZlZCBwZXJmb3JtYW5jZTogIFF1ZXVlLCBtdXRleCwgc2hsZXgsIHRocmVhZGluZywgYW5kIHB5ZG9jLgorCistIFRoZSBvcGVyYXRvciBtb2R1bGUgaGFzIHR3byBuZXcgZnVuY3Rpb25zLCBhdHRyZ2V0dGVyKCkgYW5kCisgIGl0ZW1nZXR0ZXIoKSB3aGljaCBhcmUgdXNlZnVsIGZvciBjcmVhdGluZyBmYXN0IGRhdGEgZXh0cmFjdG9yCisgIGZ1bmN0aW9ucyBmb3IgbWFwKCksIGxpc3Quc29ydCgpLCBpdGVydG9vbHMuZ3JvdXBieSgpLCBhbmQKKyAgb3RoZXIgZnVuY3Rpb25zIHRoYXQgZXhwZWN0IGEgZnVuY3Rpb24gYXJndW1lbnQuCisKKy0gc29ja2V0LlNIVVRfe1JELFdSLFJEV1J9IHdhcyBhZGRlZC4KKworLSBvcy5nZXRzaWQgd2FzIGFkZGVkLgorCistIFRoZSBwd2QgbW9kdWxlIGluY29ycmVjdGx5IGFkdmVydGlzZWQgaXRzIHN0cnVjdCB0eXBlIGFzCisgIHN0cnVjdF9wd2VudDsgdGhpcyBoYXMgYmVlbiByZW5hbWVkIHRvIHN0cnVjdF9wYXNzd2QuICAoVGhlIG9sZCBuYW1lCisgIGlzIHN0aWxsIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKQorCistIFRoZSB4bWwucGFyc2Vycy5leHBhdCBtb2R1bGUgbm93IHByb3ZpZGVzIEV4cGF0IDEuOTUuNy4KKworLSBzb2NrZXQuSVBQUk9UT19JUFY2IHdhcyBhZGRlZC4KKworLSByZWFkbGluZS5jbGVhcl9oaXN0b3J5IHdhcyBhZGRlZC4KKworLSBzZWxlY3Quc2VsZWN0KCkgbm93IGFjY2VwdHMgc2VxdWVuY2VzIGZvciBpdHMgZmlyc3QgdGhyZWUgYXJndW1lbnRzLgorCistIGNTdHJpbmdJTyBub3cgc3VwcG9ydHMgdGhlIGYuY2xvc2VkIGF0dHJpYnV0ZS4KKworLSBUaGUgc2lnbmFsIG1vZHVsZSBub3cgZXhwb3NlcyBTSUdSVE1JTiBhbmQgU0lHUlRNQVggKGlmIGF2YWlsYWJsZSkuCisKKy0gY3Vyc2VzIG1vZHVsZSBub3cgc3VwcG9ydHMgdXNlX2RlZmF1bHRfY29sb3JzKCkuICBbcGF0Y2ggIzczOTEyNF0KKworLSBCdWcgIzgxMTAyODogbmN1cnNlcy5oIGJyZWFrYWdlIG9uIEZyZWVCU0QvTWFjT1MgWAorCistIEJ1ZyAjODE0NjEzOiBJTkVUX0FERFJTVFJMRU4gZml4IG5lZWRlZCBmb3IgYWxsIGNvbXBpbGVycyBvbiBTR0kKKworLSBJbXBsZW1lbnRlZCBub24tcmVjdXJzaXZlIFNSRSBtYXRjaGluZyBzY2hlbWUgKCM3NTc2MjQpLgorCistIEltcGxlbWVudGVkICg/KGlkL25hbWUpeWVzfG5vKSBzdXBwb3J0IGluIFNSRSAoIzU3MjkzNikuCisKKy0gcmFuZG9tLnNlZWQoKSB3aXRoIG5vIGFyZ3VtZW50cyBvciBOb25lIHVzZXMgdGltZS50aW1lKCkgYXMgYSBkZWZhdWx0CisgIHNlZWQuICBNb2RpZmllZCB0byBtYXRjaCBQeTIuMiBiZWhhdmlvciBhbmQgdXNlIGZyYWN0aW9uYWwgc2Vjb25kcyBzbworICB0aGF0IHN1Y2Nlc3NpdmUgcnVucyBhcmUgbW9yZSBsaWtlbHkgdG8gcHJvZHVjZSBkaWZmZXJlbnQgc2VxdWVuY2VzLgorCistIHJhbmRvbS5SYW5kb20gaGFzIGEgbmV3IG1ldGhvZCwgZ2V0cmFuZGJpdHMoayksIHdoaWNoIHJldHVybnMgYW4gaW50CisgIHdpdGggayByYW5kb20gYml0cy4gIFRoaXMgbWV0aG9kIGlzIG5vdyBhbiBvcHRpb25hbCBwYXJ0IG9mIHRoZSBBUEkKKyAgZm9yIHVzZXIgZGVmaW5lZCBnZW5lcmF0b3JzLiAgQW55IGdlbmVyYXRvciB0aGF0IGRlZmluZXMgZ2VucmFuZGJpdHMoKQorICBjYW4gbm93IHVzZSByYW5kcmFuZ2UoKSBmb3IgcmFuZ2VzIHdpdGggYSBsZW5ndGggPj0gMioqNTMuICBGb3JtZXJseSwKKyAgcmFuZHJhbmdlIHdvdWxkIHJldHVybiBvbmx5IGV2ZW4gbnVtYmVycyBmb3IgcmFuZ2VzIHRoYXQgbGFyZ2UgKHNlZQorICBTRiBidWcgIzgxMjIwMikuICBHZW5lcmF0b3JzIHRoYXQgZG8gbm90IGRlZmluZSBnZW5yYW5kYml0cygpIG5vdworICBpc3N1ZSBhIHdhcm5pbmcgd2hlbiByYW5kcmFuZ2UoKSBpcyBjYWxsZWQgd2l0aCBhIHJhbmdlIHRoYXQgbGFyZ2UuCisKKy0gaXRlcnRvb2xzIGhhcyBhIG5ldyBmdW5jdGlvbiwgZ3JvdXBieSgpIGZvciBhZ2dyZWdhdGluZyBpdGVyYWJsZXMKKyAgaW50byBncm91cHMgc2hhcmluZyB0aGUgc2FtZSBrZXkgKGFzIGRldGVybWluZWQgYnkgYSBrZXkgZnVuY3Rpb24pLgorICBJdCBvZmZlcnMgc29tZSBvZiBmdW5jdGlvbmFsaXR5IG9mIFNRTCdzIGdyb3VwYnkga2V5d29yZCBhbmQgb2YKKyAgdGhlIFVuaXggdW5pcSBmaWx0ZXIuCisKKy0gaXRlcnRvb2xzIG5vdyBoYXMgYSBuZXcgdGVlKCkgZnVuY3Rpb24gd2hpY2ggcHJvZHVjZXMgdHdvIGluZGVwZW5kZW50CisgIGl0ZXJhdG9ycyBmcm9tIGEgc2luZ2xlIGl0ZXJhYmxlLgorCistIGl0ZXJ0b29scy5pemlwKCkgd2l0aCBubyBhcmd1bWVudHMgbm93IHJldHVybnMgYW4gZW1wdHkgaXRlcmF0b3IgaW5zdGVhZAorICBvZiByYWlzaW5nIGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KKworLSBGaXhlZCAjODUzMDYxOiBhbGxvdyBCWjJDb21wcmVzc29yLmNvbXByZXNzKCkgdG8gcmVjZWl2ZSBhbiBlbXB0eSBzdHJpbmcKKyAgYXMgcGFyYW1ldGVyLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gQWRkZWQgYSBuZXcgbW9kdWxlOiBjUHJvZmlsZSwgYSBDIHByb2ZpbGVyIHdpdGggdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZQorICBwcm9maWxlIG1vZHVsZS4gIGNQcm9maWxlIGF2b2lkcyBzb21lIG9mIHRoZSBkcmF3YmFja3Mgb2YgdGhlIGhvdHNob3QKKyAgcHJvZmlsZXIgYW5kIHByb3ZpZGVzIGEgYml0IG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUgb3RoZXIgdHdvIHByb2ZpbGVycy4KKyAgQmFzZWQgb24gImxzcHJvZiIgKHBhdGNoICMxMjEyODM3KS4KKworLSBCdWcgIzEyNjYyODM6IFRoZSBuZXcgZnVuY3Rpb24gImxleGlzdHMiIGlzIG5vdyBpbiBvcy5wYXRoLl9fYWxsX18uCisKKy0gQnVnICM5ODE1MzA6IEZpeCBVbmJvdW5kTG9jYWxFcnJvciBpbiBzaHV0aWwucm10cmVlKCkuICBUaGlzIGFmZmVjdHMKKyAgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3I6IHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIG9uZXJyb3IoKQorICBoYW5kbGVyIGNhbiBub3cgYWxzbyBiZSBvcy5saXN0ZGlyLgorCistIEJ1ZyAjNzU0NDQ5OiB0aHJlYWRpbmcuVGhyZWFkIG9iamVjdHMgbm8gbG9uZ2VyIG1hc2sgZXhjZXB0aW9ucyByYWlzZWQgZHVyaW5nCisgIGludGVycHJldGVyIHNodXRkb3duIHdpdGggYW5vdGhlciBleGNlcHRpb24gZnJvbSBhdHRlbXB0aW5nIHRvIGhhbmRsZSB0aGUKKyAgb3JpZ2luYWwgZXhjZXB0aW9uLgorCistIEFkZGVkIGRlY2ltYWwucHkgcGVyIFBFUCAzMjcuCisKKy0gQnVnICM5ODEyOTk6IHJzeW5jIGlzIG5vdyBhIHJlY29nbml6ZWQgcHJvdG9jb2wgaW4gdXJscGFyc2UgdGhhdCB1c2VzIGEKKyAgIm5ldGxvYyIgcG9ydGlvbiBvZiBhIFVSTC4KKworLSBCdWcgIzkxOTAxMjogc2h1dGlsLm1vdmUoKSB3aWxsIG5vdCB0cnkgdG8gbW92ZSBhIGRpcmVjdG9yeSBpbnRvIGl0c2VsZi4KKyAgVGhhbmtzIEpvaGFubmVzIEdpanNiZXJzLgorCistIEJ1ZyAjOTM0MjgyOiBweWRvYy5zdHJpcGlkKCkgaXMgbm93IGNhc2UtaW5zZW5zaXRpdmUuICBUaGFua3MgUm9iaW4gQmVja2VyLgorCistIEJ1ZyAjODIzMjA5OiAgY21hdGgubG9nKCkgbm93IHRha2VzIGFuIG9wdGlvbmFsIGJhc2UgYXJndW1lbnQgc28gdGhhdCBpdHMKKyAgQVBJIG1hdGNoZXMgbWF0aC5sb2coKS4KKworLSBCdWcgIzk1NzM4MTogZGlzdHV0aWxzIGJkaXN0X3JwbSBubyBsb25nZXIgZmFpbHMgb24gcmVjZW50IFJQTSB2ZXJzaW9ucworICB0aGF0IGdlbmVyYXRlIGEgLWRlYnVnaW5mby5ycG0KKworLSBvcy5wYXRoLmRldm51bGwgaGFzIGJlZW4gYWRkZWQgZm9yIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorCistIEZpeGVkICM4NzcxNjU6IGRpc3R1dGlscyBub3cgcGlja3MgdGhlIHJpZ2h0IEMrKyBjb21waWxlciBjb21tYW5kCisgIG9uIGN5Z3dpbiBhbmQgbWluZ3czMi4KKworLSB1cmxsaWIudXJsb3BlbigpLnJlYWRsaW5lKCkgbm93IGhhbmRsZXMgSFRUUC8wLjkgY29ycmVjdGx5LgorCistIHJlZmFjdG9yZWQgc2l0ZS5weSBpbnRvIGZ1bmN0aW9ucy4gIEFsc28gd3JvdGUgcmVncmVzc2lvbiB0ZXN0cyBmb3IgdGhlCisgIG1vZHVsZS4KKworLSBUaGUgZGlzdHV0aWxzIGluc3RhbGwgY29tbWFuZCBub3cgc3VwcG9ydHMgdGhlIC0taG9tZSBvcHRpb24gYW5kCisgIGluc3RhbGxhdGlvbiBzY2hlbWUgZm9yIGFsbCBwbGF0Zm9ybXMuCisKKy0gYXN5bmNvcmUubG9vcCBub3cgaGFzIGEgcmVwZWF0IGNvdW50IHBhcmFtZXRlciB0aGF0IGRlZmF1bHRzIHRvCisgIGxvb3BpbmcgZm9yZXZlci4KKworLSBUaGUgZGlzdHV0aWxzIHNkaXN0IGNvbW1hbmQgbm93IGlnbm9yZXMgYWxsIC5zdm4gZGlyZWN0b3JpZXMsIGluCisgIGFkZGl0aW9uIHRvIENWUyBhbmQgUkNTIGRpcmVjdG9yaWVzLiAgLnN2biBkaXJlY3RvcmllcyBob2xkCisgIGFkbWluaXN0cmF0aXZlIGZpbGVzIGZvciB0aGUgU3VidmVyc2lvbiBzb3VyY2UgY29udHJvbCBzeXN0ZW0uCisKKy0gQWRkZWQgYSBuZXcgbW9kdWxlOiBjb29raWVsaWIuICBBdXRvbWF0aWMgY29va2llIGhhbmRsaW5nIGZvciBIVFRQCisgIGNsaWVudHMuICBBbHNvLCBzdXBwb3J0IGZvciBjb29raWVsaWIgaGFzIGJlZW4gYWRkZWQgdG8gdXJsbGliMiwgc28KKyAgdXJsbGliMi51cmxvcGVuKCkgY2FuIHRyYW5zcGFyZW50bHkgaGFuZGxlIGNvb2tpZXMuCisKKy0gc3RyaW5ncHJlcC5weSBub3cgdXNlcyBidWlsdC1pbiBzZXQoKSBpbnN0ZWFkIG9mIHNldHMuU2V0KCkuCisKKy0gQnVnICM4NzYyNzg6IFVuYm91bmRlZCByZWN1cnNpb24gaW4gbW9kdWxlZmluZGVyCisKKy0gQnVnICM3ODAzMDA6IFN3YXAgcHVibGljIGFuZCBzeXN0ZW0gSUQgaW4gTGV4aWNhbEhhbmRsZXIuc3RhcnREVEQuCisgIEFwcGxpY2F0aW9ucyByZWx5aW5nIG9uIHRoZSB3cm9uZyBvcmRlciBuZWVkIHRvIGJlIGNvcnJlY3RlZC4KKworLSBCdWcgIzkyNjA3NTogRml4ZWQgYSBidWcgdGhhdCByZXR1cm5zIGEgd3JvbmcgcGF0dGVybiBvYmplY3QKKyAgZm9yIGEgc3RyaW5nIG9yIHVuaWNvZGUgb2JqZWN0IGluIHNyZS5jb21waWxlKCkgd2hlbiBhIGRpZmZlcmVudAorICB0eXBlIHBhdHRlcm4gd2l0aCB0aGUgc2FtZSB2YWx1ZSBleGlzdHMuCisKKy0gQWRkZWQgY291bnRjYWxsZXJzIGFyZyB0byB0cmFjZS5UcmFjZSBjbGFzcyAoLS10cmFja2NhbGxzIGNvbW1hbmQgbGluZSBhcmcKKyAgd2hlbiBydW4gZnJvbSB0aGUgY29tbWFuZCBwcm9tcHQpLgorCistIEZpeGVkIGEgY2FjaGluZyBidWcgaW4gcGxhdGZvcm0ucGxhdGZvcm0oKSB3aGVyZSB0aGUgYXJndW1lbnQgb2YgJ3RlcnNlJyB3YXMKKyAgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiB3aGVuIGNhY2hpbmcgdmFsdWUuCisKKy0gQWRkZWQgdHdvIG5ldyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBwcm9maWxlIChvdXRwdXQgZmlsZSBhbmQKKyAgZGVmYXVsdCBzb3J0KS4KKworLSBBZGRlZCBnbG9iYWwgcnVuY3R4IGZ1bmN0aW9uIHRvIHByb2ZpbGUgbW9kdWxlCisKKy0gQWRkIGhsaXN0IG1pc3NpbmcgZW50cnljb25maWd1cmUgYW5kIGVudHJ5Y2dldCBtZXRob2RzLgorCistIFRoZSBwdGNwMTU0IGNvZGVjIHdhcyBhZGRlZCBmb3IgS2F6YWtoIGNoYXJhY3RlciBzZXQgc3VwcG9ydC4KKworLSBTdXBwb3J0IG5vbi1hbm9ueW1vdXMgZnRwIFVSTHMgaW4gdXJsbGliMi4KKworLSBUaGUgZW5jb2RpbmdzIHBhY2thZ2Ugd2lsbCBub3cgYXBwbHkgY29kZWMgbmFtZSBhbGlhc2VzCisgIGZpcnN0IGJlZm9yZSBzdGFydGluZyB0byB0cnkgdGhlIGltcG9ydCBvZiB0aGUgY29kZWMgbW9kdWxlLgorICBUaGlzIHNpbXBsaWZpZXMgb3ZlcnJpZGluZyBidWlsdC1pbiBjb2RlY3Mgd2l0aCBleHRlcm5hbAorICBwYWNrYWdlcywgZS5nLiB0aGUgaW5jbHVkZWQgQ0pLIGNvZGVjcyB3aXRoIHRoZSBKYXBhbmVzZUNvZGVjcworICBwYWNrYWdlLCBieSBhZGp1c3RpbmcgdGhlIGFsaWFzZXMgZGljdGlvbmFyeSBpbiBlbmNvZGluZ3MuYWxpYXNlcworICBhY2NvcmRpbmdseS4KKworLSBiYXNlNjQgbm93IHN1cHBvcnRzIFJGQyAzNTQ4IEJhc2UxNiwgQmFzZTMyLCBhbmQgQmFzZTY0IGVuY29kaW5nIGFuZAorICBkZWNvZGluZyBzdGFuZGFyZHMuCisKKy0gdXJsbGliMiBub3cgc3VwcG9ydHMgcHJvY2Vzc29ycy4gIEEgcHJvY2Vzc29yIGlzIGEgaGFuZGxlciB0aGF0CisgIGltcGxlbWVudHMgYW4geHh4X3JlcXVlc3Qgb3IgeHh4X3Jlc3BvbnNlIG1ldGhvZC4gIFRoZXNlIG1ldGhvZHMgYXJlCisgIGNhbGxlZCBmb3IgYWxsIHJlcXVlc3RzLgorCistIGRpc3R1dGlscyBjb21waWxlcnMgbm93IGNvbXBpbGUgc291cmNlIGZpbGVzIGluIHRoZSBzYW1lIG9yZGVyIGFzCisgIHRoZXkgYXJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIuCisKKy0gcHByaW50LnBwcmludCgpIGFuZCBwcHJpbnQucGZvcm1hdCgpIG5vdyBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycworICBpbmRlbnQsIHdpZHRoIGFuZCBkZXB0aC4KKworLSBQYXRjaCAjNzUwNTQyOiBwcHJpbnQgbm93IHdpbGwgcHJldHR5IHByaW50IHN1YmNsYXNzZXMgb2YgbGlzdCwgdHVwbGUKKyAgYW5kIGRpY3QgdG9vLCBhcyBsb25nIGFzIHRoZXkgZG9uJ3Qgb3ZlcndyaXRlIF9fcmVwcl9fKCkuCisKKy0gQnVnICM4NDg2MTQ6IGRpc3R1dGlscycgbXN2Y2NvbXBpbGVyIGZhaWxzIHRvIGZpbmQgdGhlIE1TVkM2CisgIGNvbXBpbGVyIGJlY2F1c2Ugb2YgaW5jb21wbGV0ZSByZWdpc3RyeSBlbnRyaWVzLgorCistIGh0dHBsaWIuSFRUUC5wdXRyZXF1ZXN0IG5vdyBvZmZlcnMgdG8gb21pdCB0aGUgaW1wbGljaXQgQWNjZXB0LUVuY29kaW5nLgorCistIFBhdGNoICM4NDE5Nzc6IG1vZHVsZWZpbmRlciBkaWRuJ3QgZmluZCBleHRlbnNpb24gbW9kdWxlcyBpbiBwYWNrYWdlcworCistIGltYXBsaWIuSU1BUDQudGhyZWFkIHdhcyBhZGRlZC4KKworLSBQbHVnZ2VkIGEgbWlub3IgaG9sZSBpbiB0ZW1wZmlsZS5ta3RlbXAoKSBkdWUgdG8gdGhlIHVzZSBvZgorICBvcy5wYXRoLmV4aXN0cygpLCBzd2l0Y2hlZCB0byB1c2luZyBvcy5sc3RhdCgpIGRpcmVjdGx5IGlmIHBvc3NpYmxlLgorCistIGJpc2VjdC5weSBhbmQgaGVhcHEucHkgbm93IGhhdmUgdW5kZXJseWluZyBDIGltcGxlbWVudGF0aW9ucworICBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLgorCistIGhlYXBxLnB5IGhhcyB0d28gbmV3IGZ1bmN0aW9ucywgbnNtYWxsZXN0KCkgYW5kIG5sYXJnZXN0KCkuCisKKy0gdHJhY2ViYWNrLmZvcm1hdF9leGMgaGFzIGJlZW4gYWRkZWQgKHNpbWlsYXIgdG8gcHJpbnRfZXhjIGJ1dCBpdCByZXR1cm5zCisgIGEgc3RyaW5nKS4KKworLSB4bWxycGNsaWIuTXVsdGlDYWxsIGhhcyBiZWVuIGFkZGVkLgorCistIHBvcGxpYi5QT1AzX1NTTCBoYXMgYmVlbiBhZGRlZC4KKworLSB0bXBmaWxlLm1rc3RlbXAgbm93IHJldHVybnMgYW4gYWJzb2x1dGUgcGF0aCBldmVuIGlmIGRpciBpcyByZWxhdGl2ZS4KKworLSB1cmxwYXJzZSBpcyBSRkMgMjM5NiBjb21wbGlhbnQuCisKKy0gVGhlIGZpZWxkbmFtZXMgYXJndW1lbnQgdG8gdGhlIGNzdiBtb2R1bGUncyBEaWN0UmVhZGVyIGNvbnN0cnVjdG9yIGlzIG5vdworICBvcHRpb25hbC4gIElmIG9taXR0ZWQsIHRoZSBmaXJzdCByb3cgb2YgdGhlIGZpbGUgd2lsbCBiZSB1c2VkIGFzIHRoZQorICBsaXN0IG9mIGZpZWxkbmFtZXMuCisKKy0gZW5jb2RpbmdzLmJ6Ml9jb2RlYyB3YXMgYWRkZWQgZm9yIGFjY2VzcyB0byBiejIgY29tcHJlc3Npb24KKyAgdXNpbmcgImEgbG9uZyBzdHJpbmciLmVuY29kZSgnYnoyJykKKworLSBWYXJpb3VzIGltcHJvdmVtZW50cyB0byB1bml0dGVzdC5weSwgcmVhbGlnbmVkIHdpdGggUHlVbml0IENWUy4KKworLSBkaXJjYWNoZSBub3cgcGFzc2VzIGV4Y2VwdGlvbnMgdG8gdGhlIGNhbGxlciwgaW5zdGVhZCBvZiByZXR1cm5pbmcKKyAgZW1wdHkgbGlzdHMuCisKKy0gVGhlIGJzZGRiIG1vZHVsZSBhbmQgZGJoYXNoIG1vZHVsZSBub3cgc3VwcG9ydCB0aGUgaXRlcmF0b3IgYW5kCisgIG1hcHBpbmcgcHJvdG9jb2xzIHdoaWNoIG1ha2UgdGhlbSBtb3JlIHN1YnN0aXR1dGFibGUgZm9yIGRpY3Rpb25hcmllcworICBhbmQgc2hlbHZlcy4KKworLSBUaGUgY3N2IG1vZHVsZSdzIERpY3RSZWFkZXIgYW5kIERpY3RXcml0ZXIgY2xhc3NlcyBub3cgYWNjZXB0IGtleXdvcmQKKyAgYXJndW1lbnRzLiAgVGhpcyB3YXMgYW4gb21pc3Npb24gaW4gdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCisKKy0gVGhlIGVtYWlsIHBhY2thZ2UgaGFuZGxlcyBzb21lIFJGQyAyMjMxIHBhcmFtZXRlcnMgd2l0aCBtaXNzaW5nCisgIENIQVJTRVQgZmllbGRzIGJldHRlci4gIEl0IGFsc28gaW5jbHVkZXMgYSBwYXRjaCB0byBwYXJhbWV0ZXIKKyAgcGFyc2luZyB3aGVuIHNlbWljb2xvbnMgYXBwZWFyIGluc2lkZSBxdW90ZXMuCisKKy0gc2V0cy5weSBub3cgcnVucyB1bmRlciBQeTIuMi4gIEluIGFkZGl0aW9uLCB0aGUgYXJndW1lbnQgcmVzdHJpY3Rpb25zCisgIGZvciBtb3N0IHNldCBtZXRob2RzIChidXQgbm90IHRoZSBvcGVyYXRvcnMpIGhhdmUgYmVlbiByZWxheGVkIHRvCisgIGFsbG93IGFueSBpdGVyYWJsZS4KKworLSBfc3RycHRpbWUucHkgbm93IGhhcyBhIGJlaGluZC10aGUtc2NlbmVzIGNhY2hpbmcgbWVjaGFuaXNtIGZvciB0aGUgbW9zdAorICByZWNlbnQgVGltZVJFIGluc3RhbmNlIHVzZWQgYWxvbmcgd2l0aCB0aGUgbGFzdCBmaXZlIHVuaXF1ZSBkaXJlY3RpdmUKKyAgcGF0dGVybnMuICBUaGUgb3ZlcmFsbCBtb2R1bGUgd2FzIGFsc28gbWFkZSBtb3JlIHRocmVhZC1zYWZlLgorCistIHJhbmRvbS5jdW5pZnZhcmlhdGUoKSBhbmQgcmFuZG9tLnN0ZGdhbW1hKCkgd2VyZSBkZXByZWNhdGVkIGluIFB5Mi4zCisgIGFuZCByZW1vdmVkIGluIFB5Mi40LgorCistIEJ1ZyAjODIzMzI4OiB1cmxsaWIyLnB5J3MgSFRUUCBEaWdlc3QgQXV0aCBzdXBwb3J0IHdvcmtzIGFnYWluLgorCistIFBhdGNoICM4NzM1OTc6IENKSyBjb2RlY3MgYXJlIGltcG9ydGVkIGludG8gcmFuayBvZiBkZWZhdWx0IGNvZGVjcy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gQSBob3RzaG90bWFpbiBzY3JpcHQgd2FzIGFkZGVkIHRvIHRoZSBUb29scy9zY3JpcHRzIGRpcmVjdG9yeSB0aGF0CisgIG1ha2VzIGl0IGVhc3kgdG8gcnVuIGEgc2NyaXB0IHVuZGVyIGNvbnRyb2wgb2YgdGhlIGhvdHNob3QgcHJvZmlsZXIuCisKKy0gVGhlIGRiMnBpY2tsZSBhbmQgcGlja2xlMmRiIHNjcmlwdHMgY2FuIG5vdyBkdW1wL2xvYWQgZ2RibSBmaWxlcy4KKworLSBUaGUgZmlsZSBvcmRlciBvbiB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSBwaWNrbGUyZGIgc2NyaXB0IHdhcyByZXZlcnNlZC4KKyAgSXQgaXMgbm93IFsgcGlja2xlZmlsZSBdIGRiZmlsZS4gIFRoaXMgcHJvdmlkZXMgYmV0dGVyIHN5bW1ldHJ5IHdpdGgKKyAgZGIycGlja2xlLiAgVGhlIGZpbGUgYXJndW1lbnRzIHRvIGJvdGggc2NyaXB0cyBhcmUgbm93IHNvdXJjZSBmb2xsb3dlZCBieQorICBkZXN0aW5hdGlvbiBpbiBzaXR1YXRpb25zIHdoZXJlIGJvdGggZmlsZXMgYXJlIGdpdmVuLgorCistIFRoZSBweWRvYyBzY3JpcHQgd2lsbCBkaXNwbGF5IGEgbGluayB0byB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24gZm9yCisgIG1vZHVsZXMgZGV0ZXJtaW5lZCB0byBiZSBwYXJ0IG9mIHRoZSBjb3JlIGRpc3RyaWJ1dGlvbi4gIFRoZSBkb2N1bWVudGF0aW9uCisgIGJhc2UgZGlyZWN0b3J5IGRlZmF1bHRzIHRvIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvY3VycmVudC9saWIvIGJ1dCBjYW4KKyAgYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSBQWVRIT05ET0NTIGVudmlyb25tZW50IHZhcmlhYmxlLgorCistIHRleGNoZWNrLnB5IG5vdyBkZXRlY3RzIGRvdWJsZSB3b3JkIGVycm9ycy4KKworLSBtZDVzdW0ucHkgbWlzdGFrZW5seSBvcGVuZWQgaW5wdXQgZmlsZXMgaW4gdGV4dCBtb2RlIGJ5IGRlZmF1bHQsIGEKKyAgc2lsZW50IGFuZCBkYW5nZXJvdXMgY2hhbmdlIGZyb20gcHJldmlvdXMgcmVsZWFzZXMuICBJdCBvbmNlIGFnYWluCisgIG9wZW5zIGlucHV0IGZpbGVzIGluIGJpbmFyeSBtb2RlIGJ5IGRlZmF1bHQuICBUaGUgLXQgYW5kIC1iIGZsYWdzCisgIHJlbWFpbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSAyLjMgcmVsZWFzZSwgYnV0IC1iIGlzIHRoZSBkZWZhdWx0CisgIG5vdy4KKworLSBweS1lbGVjdHJpYy1jb2xvbiBub3cgd29ya3Mgd2hlbiBwZW5kaW5nLWRlbGV0ZS9kZWxldGUtc2VsZWN0aW9uIG1vZGUgaXMKKyAgaW4gZWZmZWN0CisKKy0gcHktaGVscC1hdC1wb2ludCBpcyBubyBsb25nZXIgYm91bmQgdG8gdGhlIEYxIGtleSAtIGl0J3Mgc3RpbGwgYm91bmQgdG8KKyAgQy1jIEMtaAorCistIFB5bmNoZSB3YXMgZml4ZWQgdG8gbm90IGNyYXNoIHdoZW4gdGhlcmUgaXMgbm8gfi8ucHluY2hlIGZpbGUgYW5kIG5vCisgIC1kIG9wdGlvbiB3YXMgZ2l2ZW4uCisKK0J1aWxkCistLS0tLQorCistIEJ1ZyAjOTc4NjQ1OiBNb2R1bGVzL2dldHBhdGguYyBub3cgYnVpbGRzIHByb3Blcmx5IGluIC0tZGlzYWJsZS1mcmFtZXdvcmsKKyAgYnVpbGQgdW5kZXIgT1MgWC4KKworLSBQcm9maWxpbmcgdXNpbmcgZ3Byb2YgaXMgbm93IGF2YWlsYWJsZSBpZiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRoCisgIC0tZW5hYmxlLXByb2ZpbGluZy4KKworLSBQcm9maWxpbmcgdGhlIFZNIHVzaW5nIHRoZSBQZW50aXVtIFRTQyBpcyBub3cgcG9zc2libGUgaWYgUHl0aG9uCisgIGlzIGNvbmZpZ3VyZWQgLS13aXRoLXRzYy4KKworLSBJbiBvcmRlciB0byBmaW5kIGxpYnJhcmllcywgc2V0dXAucHkgbm93IGFsc28gbG9va3MgaW4gL2xpYjY0LCBmb3IgdXNlCisgIG9uIEFNRDY0LgorCistIEJ1ZyAjOTM0NjM1OiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgY29uZmlndXJlIHNjcmlwdCBjb3VsZG4ndCBkZXRlY3QKKyAgZ2V0YWRkcmluZm8oKSBwcm9wZXJseSBpZiB0aGUgS0FNRSBzdGFjayBoYWQgU0NUUCBzdXBwb3J0LgorCistIFN1cHBvcnQgZm9yIG1pc3NpbmcgQU5TSSBDIGhlYWRlciBmaWxlcyAobGltaXRzLmgsIHN0ZGRlZi5oLCBldGMpIHdhcworICByZW1vdmVkLgorCistIFN5c3RlbXMgcmVxdWlyaW5nIHRoZSBENCwgRDYgb3IgRDcgdmFyaWFudHMgb2YgcHRocmVhZHMgYXJlIG5vIGxvbmdlcgorICBzdXBwb3J0ZWQgKHNlZSBQRVAgMTEpLgorCistIFVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgY2FuIG5vIGxvbmdlciBiZSBkaXNhYmxlZCAoc2VlIFBFUCAxMSkuCisKKy0gU3VwcG9ydCBmb3IgREdVWCwgU3VuT1MgNCwgSVJJWCA0IGFuZCBNaW5peCB3YXMgcmVtb3ZlZCAoc2VlIFBFUCAxMSkuCisKKy0gU3VwcG9ydCBmb3Igc3lzdGVtcyByZXF1aXJpbmcgLS13aXRoLWRsLWRsZCBvciAtLXdpdGgtc2dpLWRsIHdhcyByZW1vdmVkCisgIChzZWUgUEVQIDExKS4KKworLSBUZXN0cyBmb3Igc2l6ZW9mKGNoYXIpIHdlcmUgcmVtb3ZlZCBzaW5jZSBBTlNJIEMgbWFuZGF0ZXMgdGhhdAorICBzaXplb2YoY2hhcikgbXVzdCBiZSAxLgorCitDIEFQSQorLS0tLS0KKworLSBUaGFua3MgdG8gQW50aG9ueSBUdWluaW5nYSwgdGhlIGRhdGV0aW1lIG1vZHVsZSBub3cgc3VwcGxpZXMgYSBDIEFQSQorICBjb250YWluaW5nIHR5cGUtY2hlY2sgbWFjcm9zIGFuZCBjb25zdHJ1Y3RvcnMuICBTZWUgbmV3IGRvY3MgaW4gdGhlCisgIFB5dGhvbi9DIEFQSSBSZWZlcmVuY2UgTWFudWFsIGZvciBkZXRhaWxzLgorCistIFByaXZhdGUgZnVuY3Rpb24gX1B5VGltZV9Eb3VibGVUb1RpbWV0IGFkZGVkLCB0byBjb252ZXJ0IGEgUHl0aG9uCisgIHRpbWVzdGFtcCAoQyBkb3VibGUpIHRvIHBsYXRmb3JtIHRpbWVfdCB3aXRoIHNvbWUgb3V0LW9mLWJvdW5kcworICBjaGVja2luZy4gIERlY2xhcmVkIGluIG5ldyBoZWFkZXIgZmlsZSB0aW1lZnVuY3MuaC4gIEl0IHdvdWxkIGJlCisgIGdvb2QgdG8gZXhwb3NlIHNvbWUgb3RoZXIgaW50ZXJuYWwgdGltZW1vZHVsZS5jIGZ1bmN0aW9ucyB0aGVyZS4KKworLSBOZXcgcHVibGljIGZ1bmN0aW9ucyBQeUV2YWxfRXZhbHVhdGVGcmFtZSBhbmQgUHlHZW5fTmV3IHRvIGV4cG9zZQorICBnZW5lcmF0b3Igb2JqZWN0cy4KKworLSBOZXcgcHVibGljIGZ1bmN0aW9ucyBQeV9JbmNSZWYoKSBhbmQgUHlfRGVjUmVmKCksIGV4cG9zaW5nIHRoZQorICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBQeV9YSU5DUkVGKCkgYW5kIFB5X1hERUNSRUYgbWFjcm9zLiBVc2VmdWwgZm9yCisgIHJ1bnRpbWUgZHluYW1pYyBlbWJlZGRpbmcgb2YgUHl0aG9uLiAgU2VlIHBhdGNoICM5MzgzMDIsIGJ5IEJvYgorICBJcHBvbGl0by4KKworLSBBZGRlZCBhIG5ldyBtYWNybywgUHlTZXF1ZW5jZV9GYXN0X0lURU1TLCB3aGljaCByZXRyaWV2ZXMgYSBmYXN0IHNlcXVlbmNlJ3MKKyAgdW5kZXJseWluZyBhcnJheSBvZiBQeU9iamVjdCBwb2ludGVycy4gIFVzZWZ1bCBmb3IgaGlnaCBzcGVlZCBsb29waW5nLgorCistIENyZWF0ZWQgYSBuZXcgbWV0aG9kIGZsYWcsIE1FVEhfQ09FWElTVCwgd2hpY2ggY2F1c2VzIGEgbWV0aG9kIHRvIGJlIGxvYWRlZAorICBldmVuIGlmIGFscmVhZHkgZGVmaW5lZCBieSBhIHNsb3Qgd3JhcHBlci4gIFRoaXMgYWxsb3dzIGEgX19jb250YWluc19fCisgIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHRvIGNvLWV4aXN0IHdpdGggYSBkZWZpbmVkIHNxX2NvbnRhaW5zIHNsb3QuICBUaGlzCisgIGlzIGhlbHBmdWwgYmVjYXVzZSB0aGUgUHlDRnVuY3Rpb24gY2FuIHRha2UgYWR2YW50YWdlIG9mIG9wdGltaXplZCBjYWxscworICB3aGVuZXZlciBNRVRIX08gb3IgTUVUSF9OT0FSR1MgZmxhZ3MgYXJlIGRlZmluZWQuCisKKy0gQWRkZWQgYSBuZXcgZnVuY3Rpb24sIFB5RGljdF9Db250YWlucyhkLCBrKSB3aGljaCBpcyBsaWtlCisgIFB5U2VxdWVuY2VfQ29udGFpbnMoKSBidXQgaXMgc3BlY2lmaWMgdG8gZGljdGlvbmFyaWVzIGFuZCBleGVjdXRlcworICBhYm91dCAxMCUgZmFzdGVyLgorCistIEFkZGVkIHRocmVlIG5ldyBtYWNyb3M6IFB5X1JFVFVSTl9OT05FLCBQeV9SRVRVUk5fVFJVRSwgYW5kIFB5X1JFVFVSTl9GQUxTRS4KKyAgRWFjaCByZXR1cm4gdGhlIHNpbmdsZXRvbiB0aGV5IG1lbnRpb24gYWZ0ZXIgUHlfSU5DUkVGKClpbmcgdGhlbS4KKworLSBBZGRlZCBhIG5ldyBmdW5jdGlvbiwgUHlUdXBsZV9QYWNrKG4sIC4uLikgZm9yIGNvbnN0cnVjdGluZyB0dXBsZXMgZnJvbSBhCisgIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudCBsaXN0IG9mIFB5dGhvbiBvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGludm9rZQorICB0aGUgbW9yZSBjb21wbGV4IG1hY2hpbmVyeSBvZiBQeV9CdWlsZFZhbHVlKCkuICBQeVR1cGxlX1BhY2soMywgYSwgYiwgYykKKyAgaXMgZXF1aXZhbGVudCB0byBQeV9CdWlsZFZhbHVlKCIoT09PKSIsIGEsIGIsIGMpLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIF93aW5yZWcgbW9kdWxlIGNvdWxkIHNlZ2ZhdWx0IHdoZW4gcmVhZGluZyB2ZXJ5IGxhcmdlIHJlZ2lzdHJ5CisgIHZhbHVlcywgZHVlIHRvIHVuY2hlY2tlZCBhbGxvY2EoKSBjYWxscyAoU0YgYnVnIDg1MTA1NikuICBUaGUgZml4IGlzCisgIHVzZXMgZWl0aGVyIFB5TWVtX01hbGxvYyhuKSBvciBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKSwKKyAgYXMgYXBwcm9wcmlhdGUsIGZvbGxvd2VkIGJ5IGEgc2l6ZSBjaGVjay4KKworLSBmaWxlLnRydW5jYXRlKCkgY291bGQgbWlzYmVoYXZlIGlmIHRoZSBmaWxlIHdhcyBvcGVuIGZvciB1cGRhdGUKKyAgKG1vZGVzIHIrLCByYissIHcrLCB3YispLCBhbmQgdGhlIG1vc3QgcmVjZW50IGZpbGUgb3BlcmF0aW9uIGJlZm9yZQorICB0aGUgdHJ1bmNhdGUoKSBjYWxsIHdhcyBhbiBpbnB1dCBvcGVyYXRpb24uICBTRiBidWcgODAxNjMxLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBmaW5hbD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjktSnVsLTIwMDMqCisKK0lETEUKKy0tLS0KKworLSBCdWcgNzc4NDAwOiAgSURMRSBoYW5ncyB3aGVuIHNlbGVjdGluZyAiRWRpdCB3aXRoIElETEUiIGZyb20gZXhwbG9yZXIuCisgIFRoaXMgd2FzIHVuaXF1ZSB0byBXaW5kb3dzLCBhbmQgd2FzIGZpeGVkIGJ5IGFkZGluZyBhbiAtbiBzd2l0Y2ggdG8KKyAgdGhlIGNvbW1hbmQgdGhlIFdpbmRvd3MgaW5zdGFsbGVyIGNyZWF0ZXMgdG8gZXhlY3V0ZSAiRWRpdCB3aXRoIElETEUiCisgIGNvbnRleHQtbWVudSBhY3Rpb25zLgorCistIElETEUgZGlzcGxheXMgYSBuZXcgbWVzc2FnZSB1cG9uIHN0YXJ0dXA6ICBzb21lICJwZXJzb25hbCBmaXJld2FsbCIKKyAga2luZHMgb2YgcHJvZ3JhbXMgKGZvciBleGFtcGxlLCBab25lQWxhcm0pIG9wZW4gYSBkaWFsb2cgb2YgdGhlaXIKKyAgb3duIHdoZW4gYW55IHByb2dyYW0gb3BlbnMgYSBzb2NrZXQuICBJRExFIGRvZXMgdXNlIHNvY2tldHMsIHRhbGtpbmcKKyAgb24gdGhlIGNvbXB1dGVyJ3MgaW50ZXJuYWwgbG9vcGJhY2sgaW50ZXJmYWNlLiAgVGhpcyBjb25uZWN0aW9uIGlzIG5vdAorICB2aXNpYmxlIG9uIGFueSBleHRlcm5hbCBpbnRlcmZhY2UgYW5kIG5vIGRhdGEgaXMgc2VudCB0byBvciByZWNlaXZlZAorICBmcm9tIHRoZSBJbnRlcm5ldC4gIFNvLCBpZiB5b3UgZ2V0IHN1Y2ggYSBkaWFsb2cgd2hlbiBvcGVuaW5nIElETEUsCisgIGFza2luZyB3aGV0aGVyIHRvIGxldCBweXRob253LmV4ZSB0YWxrIHRvIGFkZHJlc3MgMTI3LjAuMC4xLCBzYXkgeWVzLAorICBhbmQgcmVzdCBhc3N1cmVkIG5vIGNvbW11bmljYXRpb24gZXh0ZXJuYWwgdG8geW91ciBtYWNoaW5lIGlzIHRha2luZworICBwbGFjZS4gIElmIHlvdSBkb24ndCBhbGxvdyBpdCwgSURMRSB3b24ndCBiZSBhYmxlIHRvIHN0YXJ0LgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMyByZWxlYXNlIGNhbmRpZGF0ZSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI0LUp1bC0yMDAzKgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJdCBpcyBub3cgcG9zc2libGUgdG8gaW1wb3J0IGZyb20gemlwZmlsZXMgY29udGFpbmluZyBhZGRpdGlvbmFsCisgIGRhdGEgYnl0ZXMgYmVmb3JlIHRoZSB6aXAgY29tcGF0aWJsZSBhcmNoaXZlLiAgWmlwZmlsZXMgY29udGFpbmluZyBhCisgIGNvbW1lbnQgYXQgdGhlIGVuZCBhcmUgc3RpbGwgdW5zdXBwb3J0ZWQuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIEEgbG9uZ3N0YW5kaW5nIGJ1ZyBpbiB0aGUgcGFyc2VyIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uIGNvdWxkIGNhdXNlCisgIGZhdGFsIGludGVybmFsIHJlZmNvdW50IGNvbmZ1c2lvbiB3aGVuIHRoZSBtb2R1bGUgZ290IGluaXRpYWxpemVkIG1vcmUKKyAgdGhhbiBvbmNlLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KKworLSBGaXhlZCBtZW1vcnkgbGVhayBpbiBweWV4cGF0OyB1c2luZyB0aGUgcGFyc2VyJ3MgUGFyc2VGaWxlKCkgbWV0aG9kCisgIHdpdGggb3BlbiBmaWxlcyB0aGF0IGFyZW4ndCBpbnN0YW5jZXMgb2YgdGhlIHN0YW5kYXJkIGZpbGUgdHlwZQorICBjYXVzZWQgYW4gaW5zdGFuY2Ugb2YgdGhlIGJvdW5kIC5yZWFkKCkgbWV0aG9kIHRvIGJlIGxlYWtlZCBvbiBldmVyeQorICBjYWxsLgorCistIEZpeGVkIHNvbWUgbGVha3MgaW4gdGhlIGxvY2FsZSBtb2R1bGUuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBMaWIvZW5jb2RpbmdzL3JvdF8xMy5weSB3aGVuIHVzZWQgYXMgYSBzY3JpcHQsIG5vdyBtb3JlIHByb3Blcmx5CisgIHVzZXMgdGhlIGZpcnN0IFB5dGhvbiBpbnRlcnByZXRlciBvbiB5b3VyIHBhdGguCisKKy0gUmVtb3ZlZCBjYWNoaW5nIG9mIFRpbWVSRSAoYW5kIHRodXMgTG9jYWxlVGltZSkgaW4gX3N0cnB0aW1lLnB5IHRvCisgIGZpeCBhIGxvY2FsZSByZWxhdGVkIGJ1ZyBpbiB0aGUgdGVzdCBzdWl0ZS4gIEFsdGhvdWdoIGFub3RoZXIgcGF0Y2gKKyAgd2FzIG5lZWRlZCB0byBhY3R1YWxseSBmaXggdGhlIHByb2JsZW0sIHRoZSBjYWNoZSBjb2RlIHdhcyBub3QKKyAgcmVzdG9yZWQuCisKK0lETEUKKy0tLS0KKworLSBDYWxsdGlwcyBwYXRjaGVzLgorCitCdWlsZAorLS0tLS0KKworLSBGb3IgTWFjT1NYLCBhZGRlZCAtbW5vLWZ1c2VkLW1hZGQgdG8gQkFTRUNGTEFHUyB0byBmaXggdGVzdF9jb2VyY2lvbgorICBvbiBQYW50aGVyIChPU1ggMTAuMykuCisKK0MgQVBJCistLS0tLQorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIHRlbXBmaWxlIG1vZHVsZSBjb3VsZCBkbyBpbnNhbmUgaW1wb3J0cyBvbiBXaW5kb3dzIGlmIFBZVEhPTkNBU0VPSworICB3YXMgc2V0LCBtYWtpbmcgdGVtcCBmaWxlIGNyZWF0aW9uIGltcG9zc2libGUuICBSZXBhaXJlZC4KKworLSBBZGQgYSBwYXRjaCB0byB3b3JrYXJvdW5kIHB0aHJlYWRfc2lnbWFzaygpIGJ1Z3MgaW4gQ3lnd2luLgorCitNYWMKKy0tLQorCistIFZhcmlvdXMgZml4ZXMgdG8gcGltcC4KKworLSBTY3JpcHRzIHJ1bnMgd2l0aCBweXRob253IG5vIGxvbmdlciBoYWQgZnVsbCB3aW5kb3cgbWFuYWdlciBhY2Nlc3MuCisKKy0gRG9uJ3QgZm9yY2UgYm9vdC1kaXNrLW9ubHkgaW5zdGFsbCwgZm9yIHJlYXNvbnMgdW5rbm93biBpdCBjYXVzZXMKKyAgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IHNvbHZlcy4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgcmVsZWFzZSBjYW5kaWRhdGUgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxOC1KdWwtMjAwMyoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gVGhlIG5ldyBmdW5jdGlvbiBzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgc2V0CisgIGJ5IHN5cy5zZXRjaGVja2ludGVydmFsKCkuCisKKy0gU2V2ZXJhbCBidWdzIGluIHRoZSBzeW1ib2wgdGFibGUgcGhhc2Ugb2YgdGhlIGNvbXBpbGVyIGhhdmUgYmVlbgorICBmaXhlZC4gIEVycm9ycyBjb3VsZCBiZSBsb3N0IGFuZCBjb21waWxhdGlvbiBjb3VsZCBmYWlsIHdpdGhvdXQKKyAgcmVwb3J0aW5nIGFuIGVycm9yLiAgU0YgcGF0Y2ggNzYzMjAxLgorCistIFRoZSBpbnRlcnByZXRlciBpcyBub3cgbW9yZSByb2J1c3QgYWJvdXQgaW1wb3J0aW5nIHRoZSB3YXJuaW5ncworICBtb2R1bGUuICBJbiBhbiBleGVjdXRhYmxlIGdlbmVyYXRlZCBieSBmcmVlemUgb3Igc2ltaWxhciBwcm9ncmFtcywKKyAgZWFybGllciB2ZXJzaW9ucyBvZiAyLjMgd291bGQgZmFpbCBpZiB0aGUgd2FybmluZ3MgbW9kdWxlIGNvdWxkCisgIG5vdCBiZSBmb3VuZCBvbiB0aGUgZmlsZSBzeXN0ZW0uICBGaXhlcyBTRiBidWcgNzcxMDk3LgorCistIEEgd2FybmluZyBhYm91dCBhc3NpZ25tZW50cyB0byBtb2R1bGUgYXR0cmlidXRlcyB0aGF0IHNoYWRvdworICBidWlsdGlucywgcHJlc2VudCBpbiBlYXJsaWVyIHJlbGVhc2VzIG9mIDIuMywgaGFzIGJlZW4gcmVtb3ZlZC4KKworLSBJdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIHN1YmNsYXNzZXMgb2YgYnVpbHRpbiB0eXBlcyBsaWtlIHN0cgorICBhbmQgdHVwbGUgdGhhdCBkZWZpbmUgYW4gaXRlbXNpemUuICBFYXJsaWVyIHJlbGVhc2VzIG9mIFB5dGhvbiAyLjMKKyAgYWxsb3dlZCB0aGlzIGJ5IG1pc3Rha2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyBhbmQgb3RoZXIgcHJvYmxlbXMuCisKKy0gVGhlIHRocmVhZF9pZCBpcyBub3cgaW5pdGlhbGl6ZWQgdG8gMCBpbiBhIG5vbi10aHJlYWQgYnVpbGQuICBTRiBidWcKKyAgNzcwMjQ3LgorCistIFNGIGJ1ZyA3NjI4OTE6ICJkZWwgcFtrZXldIiBvbiBwcm94eSBvYmplY3Qgbm8gbG9uZ2VyIHJhaXNlcyBTeXN0ZW1FcnJvci4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gd2Vha3JlZi5wcm94eSgpIGNhbiBub3cgaGFuZGxlICJkZWwgb2JqW2ldIiBmb3IgcHJveHkgb2JqZWN0cworICBkZWZpbmluZyBfX2RlbGl0ZW1fXy4gIEZvcm1lcmx5LCBpdCBnZW5lcmF0ZWQgYSBTeXN0ZW1FcnJvci4KKworLSBTU0wgbm8gbG9uZ2VyIGNyYXNoZXMgdGhlIGludGVycHJldGVyIHdoZW4gdGhlIHJlbW90ZSBzaWRlIGRpc2Nvbm5lY3RzLgorCistIE9uIFVuaXggdGhlIG1tYXAgbW9kdWxlIGNhbiBhZ2FpbiBiZSB1c2VkIHRvIG1hcCBkZXZpY2UgZmlsZXMuCisKKy0gdGltZS5zdHJwdGltZSBub3cgZXhjbHVzaXZlbHkgdXNlcyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCisgIGNvbnRhaW5lZCB3aXRoaW4gdGhlIF9zdHJwdGltZSBtb2R1bGUuCisKKy0gVGhlIHByaW50IHNsb3Qgb2Ygd2Vha3JlZiBwcm94eSBvYmplY3RzIHdhcyByZW1vdmVkLCBiZWNhdXNlIGl0IHdhcworICBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBvYmplY3QncyByZXByIHNsb3QuCisKKy0gVGhlIG1tYXAgbW9kdWxlIG9ubHkgY2hlY2tzIGZpbGUgc2l6ZSBmb3IgcmVndWxhciBmaWxlcywgbm90CisgIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2VzLiAgU0YgcGF0Y2ggNzA4Mzc0LgorCistIFRoZSBjUGlja2xlIFBpY2tsZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIHN1cHBvcnQgd2FzIGZpeGVkIHRvIHRyYXZlcnNlCisgIHRoZSBmaW5kX2NsYXNzIGF0dHJpYnV0ZSwgaWYgcHJlc2VudC4KKworLSBUaGVyZSBhcmUgc2V2ZXJhbCBmaXhlcyBmb3IgdGhlIGJzZGRiMyB3cmFwcGVyIG1vZHVsZS4KKworICBic2RkYjMgbm8gbG9uZ2VyIGNyYXNoZXMgaWYgYW4gZW52aXJvbm1lbnQgaXMgY2xvc2VkIGJlZm9yZSBhIGN1cnNvcgorICAoU0YgYnVnIDc2MzI5OCkuCisKKyAgVGhlIERCIGFuZCBEQkVudiBzZXRfZ2V0X3JldHVybnNfbm9uZSBmdW5jdGlvbiB3YXMgZXh0ZW5kZWQgdG8gdGFrZQorICBhIGxldmVsIGluc3RlYWQgb2YgYSBib29sZWFuIGZsYWcuICBUaGUgbmV3IGxldmVsIDIgbWVhbnMgdGhhdCBpbgorICBhZGRpdGlvbiwgY3Vyc29yLnNldCgpLy5nZXQoKSBtZXRob2RzIHJldHVybiBOb25lIGluc3RlYWQgb2YgcmFpc2luZworICBhbiBleGNlcHRpb24uCisKKyAgQSB0eXBvIHdhcyBmaXhlZCBpbiBEQkN1cnNvci5qb2luX2l0ZW0oKSwgcHJldmVudGluZyBhIGNyYXNoLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gZGlzdHV0aWxzIG5vdyBzdXBwb3J0cyBNU1ZDIDcuMQorCistIGRvY3Rlc3Qgbm93IGV4YW1pbmVzIGFsbCBkb2NzdHJpbmdzIGJ5IGRlZmF1bHQuICBQcmV2aW91c2x5LCBpdCB3b3VsZAorICBza2lwIG92ZXIgZnVuY3Rpb25zIHdpdGggcHJpdmF0ZSBuYW1lcyAoYXMgaW5kaWNhdGVkIGJ5IHRoZSB1bmRlcnNjb3JlCisgIG5hbWluZyBjb252ZW50aW9uKS4gIFRoZSBvbGQgZGVmYXVsdCBjcmVhdGVkIHRvbyBtdWNoIG9mIGEgcmlzayB0aGF0CisgIHVzZXIgdGVzdHMgd2VyZSBiZWluZyBza2lwcGVkIGluYWR2ZXJ0ZW50bHkuICBOb3RlLCB0aGlzIGNoYW5nZSBjb3VsZAorICBicmVhayBjb2RlIGluIHRoZSB1bmxpa2VseSBjYXNlIHRoYXQgc29tZW9uZSBoYWQgaW50ZW50aW9uYWxseSBwdXQKKyAgZmFpbGluZyB0ZXN0cyBpbiB0aGUgZG9jc3RyaW5ncyBvZiBwcml2YXRlIGZ1bmN0aW9ucy4gIFRoZSBicmVha2FnZQorICBpcyBlYXNpbHkgZml4YWJsZSBieSBzcGVjaWZ5aW5nIHRoZSBvbGQgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIHRlc3Rtb2QoKQorICBvciBUZXN0ZXIoKS4KKworLSBUaGVyZSB3ZXJlIHNldmVyYWwgZml4ZXMgdG8gdGhlIHdheSBkdW1iZGJtcyBhcmUgY2xvc2VkLiAgSXQncyB2aXRhbAorICB0aGF0IGEgZHVtYmRibSBkYXRhYmFzZSBiZSBjbG9zZWQgcHJvcGVybHksIGVsc2UgdGhlIG9uLWRpc2sgZGF0YQorICBhbmQgZGlyZWN0b3J5IGZpbGVzIGNhbiBiZSBsZWZ0IGluIG11dHVhbGx5IGluY29uc2lzdGVudCBzdGF0ZXMuCisgIGR1bWJkYm0ucHkncyBfRGF0YWJhc2UuX19kZWxfXygpIG1ldGhvZCBhdHRlbXB0ZWQgdG8gY2xvc2UgdGhlCisgIGRhdGFiYXNlIHByb3Blcmx5LCBidXQgYSBzaHV0ZG93biByYWNlIGluIF9EYXRhYmFzZS5fY29tbWl0KCkgY291bGQKKyAgcHJldmVudCB0aGlzIGZyb20gd29ya2luZywgc28gdGhhdCBhIHByb2dyYW0gdHJ1c3RpbmcgX19kZWxfXygpIHRvCisgIGdldCB0aGUgb24tZGlzayBmaWxlcyBpbiBzeW5jaCBjb3VsZCBiZSBiYWRseSBzdXJwcmlzZWQuICBUaGUgcmFjZQorICBoYXMgYmVlbiByZXBhaXJlZC4gIEEgc3luYygpIG1ldGhvZCB3YXMgYWxzbyBhZGRlZCBzbyB0aGF0IHNoZWx2ZQorICBjYW4gZ3VhcmFudGVlIGRhdGEgaXMgd3JpdHRlbiB0byBkaXNrLgorCisgIFRoZSBjbG9zZSgpIG1ldGhvZCBjYW4gbm93IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSB3aXRob3V0IGNvbXBsYWludC4KKworLSBUaGUgY2xhc3NlcyBpbiB0aHJlYWRpbmcucHkgYXJlIG5vdyBuZXctc3R5bGUgY2xhc3Nlcy4gIFRoYXQgdGhleQorICB3ZXJlbid0IGJlZm9yZSB3YXMgYW4gb3ZlcnNpZ2h0LgorCistIFRoZSB1cmxsaWIyIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBoYW5kbGVycyBub3cgZGVmaW5lIHRoZSBjb3JyZWN0CisgIGF1dGhfaGVhZGVyLiAgVGhlIGVhcmxpZXIgdmVyc2lvbnMgd291bGQgZmFpbCBhdCBydW50aW1lLgorCistIFNGIGJ1ZyA3NjMwMjM6IGZpeCB1bmNhdWdodCBaZXJvRGl2aXNpb25FcnJvciBpbiBkaWZmbGliIHJhdGlvIG1ldGhvZHMKKyAgd2hlbiB0aGVyZSBhcmUgbm8gbGluZXMuCisKKy0gU0YgYnVnIDc2MzYzNzogZml4IGV4Y2VwdGlvbiBpbiBUa2ludGVyIHdpdGggYWZ0ZXJfY2FuY2VsCisgIHdoaWNoIGNvdWxkIG9jY3VyIHdpdGggVGsgOC40CisKKy0gU0YgYnVnIDc3MDYwMTogQ0dJSFRUUFNlcnZlci5weSBub3cgcGFzc2VzIHRoZSBlbnRpcmUgZW52aXJvbm1lbnQKKyAgdG8gY2hpbGQgcHJvY2Vzc2VzLgorCistIFNGIGJ1ZyA3NjUyMzg6IGFkZCBmaWx0ZXIgdG8gZm5tYXRjaCdzIF9fYWxsX18uCisKKy0gU0YgYnVnIDc0ODIwMTogbWFrZSB0aW1lLnN0cnB0aW1lKCkgZXJyb3IgbWVzc2FnZXMgbW9yZSBoZWxwZnVsLgorCistIFNGIHBhdGNoIDc2NDQ3MDogRG8gbm90IGR1bXAgdGhlIGFyZ3MgYXR0cmlidXRlIG9mIGEgRmF1bHQgb2JqZWN0IGluCisgIHhtbHJwY2xpYi4KKworLSBTRiBwYXRjaCA1NDkxNTE6IHVybGxpYiBhbmQgdXJsbGliMiBub3cgcmVkaXJlY3QgUE9TVHMgb24gMzAxCisgIHJlc3BvbnNlcy4KKworLSBTRiBwYXRjaCA3NjY2NTA6IFRoZSB3aGljaGRiIG1vZHVsZSB3YXMgZml4ZWQgdG8gcmVjb2duaXplIGRibSBmaWxlcworICBnZW5lcmF0ZWQgYnkgZ2RibSBvbiBPUy8yIEVNWC4KKworLSBTRiBidWdzIDc2MzA0NyBhbmQgNzYzMDUyOiBmaXhlcyBidWcgb2YgdGltZXpvbmUgdmFsdWUgYmVpbmcgbGVmdCBhcworICAtMSB3aGVuIGBgdGltZS50em5hbWVbMF0gPT0gdGltZS50em5hbWVbMV0gYW5kIG5vdCB0aW1lLmRheWxpZ2h0YGAKKyAgaXMgdHJ1ZSB3aGVuIGl0IHNob3VsZCBvbmx5IHdoZW4gdGltZS5kYXlsaWdodCBpcyB0cnVlLgorCistIFNGIGJ1ZyA3NjQ1NDg6IHJlIG5vdyBhbGxvd3Mgc3ViY2xhc3NlcyBvZiBzdHIgYW5kIHVuaWNvZGUgdG8gYmUKKyAgdXNlZCBhcyBwYXR0ZXJucy4KKworLSBTRiBidWcgNzYzNjM3OiBJbiBUa2ludGVyLCBjaGFuZ2UgYWZ0ZXJfY2FuY2VsKCkgdG8gaGFuZGxlIHR1cGxlcworICBvZiB2YXJ5aW5nIHNpemVzLiAgVGsgOC40IHJldHVybnMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHZhbHVlcworICB0aGFuIFRrIDguMy4KKworLSBTRiBidWcgNzYzMDIzOiBkaWZmbGliLnJhdGlvKCkgZGlkIG5vdCBjYXRjaCB6ZXJvIGRpdmlzaW9uLgorCistIFRoZSBRdWV1ZSBtb2R1bGUgbm93IGhhcyBhbiBfX2FsbF9fIGF0dHJpYnV0ZS4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gU2VlIExpYi9pZGxlbGliL05FV1MudHh0IGZvciBJRExFIG5ld3MuCisKKy0gU0YgYnVnIDc1MzU5Mjogd2ViY2hlY2tlci93c2d1aSBub3cgaGFuZGxlcyB1c2VyIHN1cHBsaWVkIGRpcmVjdG9yaWVzLgorCistIFRoZSB0cmFjZS5weSBzY3JpcHQgaGFzIGJlZW4gcmVtb3ZlZC4gIEl0IGlzIG5vdyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KKworQnVpbGQKKy0tLS0tCisKKy0gUHl0aG9uIG5vdyBjb21waWxlcyB3aXRoIC1mbm8tc3RyaWN0LWFsaWFzaW5nIGlmIHBvc3NpYmxlIChTRiBidWcgNzY2Njk2KS4KKworLSBUaGUgc29ja2V0IG1vZHVsZSBjb21waWxlcyBvbiBJUklYIDYuNS4xMC4KKworLSBBbiBpcml4NjQgc3lzdGVtIGlzIHRyZWF0ZWQgdGhlIHNhbWUgd2F5IGFzIGFuIGlyaXg2IHN5c3RlbSAoU0YKKyAgcGF0Y2ggNzY0NTYwKS4KKworLSBTZXZlcmFsIGRlZmluaXRpb25zIHdlcmUgbWlzc2luZyBvbiBGcmVlQlNEIDUueCB1bmxlc3MgdGhlCisgIF9fQlNEX1ZJU0lCTEUgc3ltYm9sIHdhcyBkZWZpbmVkLiAgY29uZmlndXJlIG5vdyBkZWZpbmVzIGl0IGFzCisgIG5lZWRlZC4KKworQyBBUEkKKy0tLS0tCisKKy0gVW5pY29kZSBvYmplY3RzIG5vdyBzdXBwb3J0IG1iY3MgYXMgYSBidWlsdC1pbiBlbmNvZGluZywgc28gdGhlIEMKKyAgQVBJIGNhbiB1c2UgaXQgd2l0aG91dCBkZWZlcnJpbmcgdG8gdGhlIGVuY29kaW5ncyBwYWNrYWdlLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gb2YgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCgpIG5ldmVyCisgIGNoZWNrZWQgZXJyb3IgcmV0dXJucyBmcm9tIFdpbmRvd3MgZnVuY3Rpb25zIGNvcnJlY3RseS4gIEFzIGEgcmVzdWx0LAorICBpdCBjb3VsZCBjbGFpbSB0byBzdGFydCBhIG5ldyB0aHJlYWQgZXZlbiB3aGVuIHRoZSBNaWNyb3NvZnQKKyAgX2JlZ2ludGhyZWFkKCkgZnVuY3Rpb24gZmFpbGVkIChkdWUgdG8gInRvbyBtYW55IHRocmVhZHMiIC0tIHRoaXMgaXMKKyAgb24gdGhlIG9yZGVyIG9mIHRob3VzYW5kcyB3aGVuIGl0IGhhcHBlbnMpLiAgSW4gdGhlc2UgY2FzZXMsIHRoZQorICBQeXRob24gZXhjZXB0aW9uIDo6CisKKyAgICAgIHRocmVhZC5lcnJvcjogY2FuJ3Qgc3RhcnQgbmV3IHRocmVhZAorCisgIGlzIHJhaXNlZCBub3cuCisKKy0gU0YgYnVnIDc2NjY2OTogUHJldmVudCBhIEdQRiBvbiBpbnRlcnByZXRlciBleGl0IHdoZW4gc29ja2V0cyBhcmUgaW4KKyAgdXNlLiAgVGhlIGludGVycHJldGVyIG5vdyBjYWxscyBXU0FDbGVhbnVwKCkgZnJvbSBQeV9GaW5hbGl6ZSgpCisgIGluc3RlYWQgb2YgZnJvbSBETEwgdGVhcmRvd24uCisKK01hYworLS0tCisKKy0gQnVuZGxlYnVpbGRlciBub3cgaW5oZXJpdHMgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHJpZ2h0IHdheS4gIEl0IHdhcworICBwcmV2aW91c2x5IHBvc3NpYmxlIGZvciBhcHAgYnVuZGxlcyB0byBnZXQgYSB0eXBlIG9mICJCTkRMIiBpbnN0ZWFkCisgIG9mICJBUFBMLiIgIE90aGVyIGltcHJvdmVtZW50cyBpbmNsdWRlLCBhIC0tYnVpbGQtaWQgb3B0aW9uIHRvCisgIHNwZWNpZnkgdGhlIENGQnVuZGxlSWRlbnRpZmllciBhbmQgdXNpbmcgdGhlIC0tcHl0aG9uIG9wdGlvbiB0byBzZXQKKyAgdGhlIGV4ZWN1dGFibGUgaW4gdGhlIGJ1bmRsZS4KKworLSBGaXhlZCB0d28gYnVncyBpbiBNYWNPU1ggZnJhbWV3b3JrIGhhbmRsaW5nLgorCistIHB5dGhvbncgZGlkIG5vdCBhbGxvdyB1c2VyIGludGVyYWN0aW9uIGluIDIuM3JjMSwgdGhpcyBoYXMgYmVlbiBmaXhlZC4KKworLSBQeXRob24gaXMgbm93IGNvbXBpbGVkIHdpdGggLW1uby1mdXNlZC1tYWRkLCBtYWtpbmcgYWxsIHRlc3RzIHBhc3MKKyAgb24gUGFudGhlci4KKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGJldGEgMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI5LUp1bi0yMDAzKgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBIHByb2dyYW0gY2FuIG5vdyBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFBZVEhPTklOU1BFQ1QgdG8gc29tZQorICBzdHJpbmcgdmFsdWUgaW4gUHl0aG9uLCBhbmQgY2F1c2UgdGhlIGludGVycHJldGVyIHRvIGVudGVyIHRoZQorICBpbnRlcmFjdGl2ZSBwcm9tcHQgYXQgcHJvZ3JhbSBleGl0LCBhcyBpZiBQeXRob24gaGFkIGJlZW4gaW52b2tlZAorICB3aXRoIHRoZSAtaSBvcHRpb24uCisKKy0gbGlzdC5pbmRleCgpIG5vdyBhY2NlcHRzIG9wdGlvbmFsIHN0YXJ0IGFuZCBzdG9wIGFyZ3VtZW50cy4gIFNpbWlsYXIKKyAgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gVXNlckxpc3QuaW5kZXgoKS4gU0YgZmVhdHVyZSByZXF1ZXN0IDc1NDAxNC4KKworLSBTRiBwYXRjaCA3NTE5OTggZml4ZXMgYW4gdW53YW50ZWQgc2lkZSBlZmZlY3Qgb2YgdGhlIHByZXZpb3VzIGZpeAorICBmb3IgU0YgYnVnIDc0Mjg2MCAodGhlIG5leHQgaXRlbSkuCisKKy0gU0YgYnVnIDc0Mjg2MDogIldlYWtLZXlEaWN0aW9uYXJ5IF9fZGVsaXRlbV9fIHVzZXMgaXRlcmtleXMiLiAgVGhpcworICB3YXNuJ3QgdGhyZWFkc2FmZSwgd2FzIHZlcnkgaW5lZmZpY2llbnQgKGV4cGVjdGVkIHRpbWUgTyhsZW4oZGljdCkpCisgIGluc3RlYWQgb2YgTygxKSksIGFuZCBjb3VsZCByYWlzZSBhIHNwdXJpb3VzIFJ1bnRpbWVFcnJvciBpZiBhbm90aGVyCisgIHRocmVhZCBtdXRhdGVkIHRoZSBkaWN0IGR1cmluZyBfX2RlbGl0ZW1fXywgb3IgaWYgYSBjb21wYXJpc29uIGZ1bmN0aW9uCisgIG11dGF0ZWQgaXQuICBJdCBhbHNvIG5lZ2xlY3RlZCB0byByYWlzZSBLZXlFcnJvciB3aGVuIHRoZSBrZXkgd2Fzbid0CisgIHByZXNlbnQ7IGRpZG4ndCByYWlzZSBUeXBlRXJyb3Igd2hlbiB0aGUga2V5IHdhc24ndCBvZiBhIHdlYWtseQorICByZWZlcmVuY2FibGUgdHlwZTsgYW5kIGJyb2tlIHZhcmlvdXMgbW9yZS1vci1sZXNzIG9ic2N1cmUgZGljdAorICBpbnZhcmlhbnRzIGJ5IHVzaW5nIGEgc2VxdWVuY2Ugb2YgZXF1YWxpdHkgY29tcGFyaXNvbnMgb3ZlciB0aGUgd2hvbGUKKyAgc2V0IG9mIGRpY3Qga2V5cyBpbnN0ZWFkIG9mIGNvbXB1dGluZyB0aGUga2V5J3MgaGFzaCBjb2RlIHRvIG5hcnJvdworICB0aGUgc2VhcmNoIHRvIHRob3NlIGtleXMgd2l0aCB0aGUgc2FtZSBoYXNoIGNvZGUuICBBbGwgb2YgdGhlc2UgYXJlCisgIGNvbnNpZGVyZWQgdG8gYmUgYnVncy4gIEEgbmV3IGltcGxlbWVudGF0aW9uIG9mIF9fZGVsaXRlbV9fIHJlcGFpcnMgYWxsCisgIHRoYXQsIGJ1dCBub3RlIHRoYXQgZml4aW5nIHRoZXNlIGJ1Z3MgbWF5IGNoYW5nZSB2aXNpYmxlIGJlaGF2aW9yIGluCisgIGNvZGUgcmVseWluZyAod2hldGhlciBpbnRlbnRpb25hbGx5IG9yIGFjY2lkZW50YWxseSkgb24gb2xkIGJlaGF2aW9yLgorCistIFNGIGJ1ZyA3MzQ4Njk6IEZpeGVkIGEgY29tcGlsZXIgYnVnIHRoYXQgY2F1c2VkIGEgZmF0YWwgZXJyb3Igd2hlbgorICBjb21waWxpbmcgYSBsaXN0IGNvbXByZWhlbnNpb24gdGhhdCBjb250YWluZWQgYW5vdGhlciBsaXN0IGNvbXByZWhlbnNpb24KKyAgZW1iZWRkZWQgaW4gYSBsYW1iZGEgZXhwcmVzc2lvbi4KKworLSBTRiBidWcgNzA1MjMxOiAgYnVpbHRpbiBwb3coKSBubyBsb25nZXIgbGV0cyB0aGUgcGxhdGZvcm0gQyBwb3coKQorICByYWlzZSAtMS4wIHRvIGludGVnZXIgcG93ZXJzLCBiZWNhdXNlIChhdCBsZWFzdCkgZ2xpYmMgZ2V0cyBpdCB3cm9uZworICBpbiBzb21lIGNhc2VzLiAgVGhlIHJlc3VsdCBzaG91bGQgYmUgLTEuMCBpZiB0aGUgcG93ZXIgaXMgb2RkIGFuZCAxLjAKKyAgaWYgdGhlIHBvd2VyIGlzIGV2ZW4sIGFuZCBhbnkgZmxvYXQgd2l0aCBhIHN1ZmZpY2llbnRseSBsYXJnZSBleHBvbmVudAorICBpcyAobWF0aGVtYXRpY2FsbHkpIGFuIGV4YWN0IGV2ZW4gaW50ZWdlci4KKworLSBTRiBidWcgNzU5MjI3OiBBIG5ldy1zdHlsZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgX19ub256ZXJvX18oKSBtdXN0CisgIHJldHVybiBhIGJvb2wgb3IgaW50IChidXQgbm90IGFuIGludCBzdWJjbGFzcykgZnJvbSB0aGF0IG1ldGhvZC4gIFRoaXMKKyAgbWF0Y2hlcyB0aGUgcmVzdHJpY3Rpb24gb24gY2xhc3NpYyBjbGFzc2VzLgorCistIFRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQgZm9yIGZpbGUgb2JqZWN0cywgYW5kIHNldCB0bworICB0aGUgdGVybWluYWwgZW5jb2Rpbmcgb24gVW5peCBhbmQgV2luZG93cy4KKworLSBUaGUgc29mdHNwYWNlIGF0dHJpYnV0ZSBvZiBmaWxlIG9iamVjdHMgYmVjYW1lIHJlYWQtb25seSBieSBvdmVyc2lnaHQuCisgIEl0J3Mgd3JpdGFibGUgYWdhaW4uCisKKy0gUmV2ZXJ0ZWQgYSAyLjMgYmV0YSAxIGNoYW5nZSB0byBpdGVyYXRvcnMgZm9yIHN1YmNsYXNzZXMgb2YgbGlzdCBhbmQKKyAgdHVwbGUuICBCeSBkZWZhdWx0LCB0aGUgaXRlcmF0b3JzIG5vdyBhY2Nlc3MgZGF0YSBlbGVtZW50cyBkaXJlY3RseQorICBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggX19nZXRpdGVtX18uICBJZiBfX2dldGl0ZW1fXyBhY2Nlc3MgaXMKKyAgcHJlZmVycmVkLCB0aGVuIF9faXRlcl9fIGNhbiBiZSBvdmVycmlkZGVuLgorCistIFNGIGJ1ZyA3MzUyNDc6IFRoZSBzdGF0aWNtZXRob2QgYW5kIHN1cGVyIHR5cGVzIHBhcnRpY2lwYXRlIGluCisgIGdhcmJhZ2UgY29sbGVjdGlvbi4gQmVmb3JlIHRoaXMgY2hhbmdlLCBpdCB3YXMgcG9zc2libGUgZm9yIGxlYWtzIHRvCisgIG9jY3VyIGluIGZ1bmN0aW9ucyB3aXRoIG5vbi1nbG9iYWwgZnJlZSB2YXJpYWJsZXMgdGhhdCB1c2VkIHRoZXNlIHR5cGVzLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSB0aGUgc29ja2V0IG1vZHVsZSBoYXMgYSBuZXcgZXhjZXB0aW9uLCBzb2NrZXQudGltZW91dCwgdG8gYWxsb3cKKyAgdGltZW91dHMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5IGZyb20gb3RoZXIgc29ja2V0IGVycm9ycy4KKworLSBTRiBidWcgNzUxMjc2OiBjUGlja2xlIGhhcyBmaXhlZCB0byBwcm9wYWdhdGUgZXhjZXB0aW9ucyByYWlzZWQgaW4KKyAgdXNlciBjb2RlLiAgSW4gZWFybGllciB2ZXJzaW9ucywgY1BpY2tsZSBjYXVnaHQgYW5kIGlnbm9yZWQgYW55CisgIGV4Y2VwdGlvbiB3aGVuIGl0IHBlcmZvcm1lZCBvcGVyYXRpb25zIHRoYXQgaXQgZXhwZWN0ZWQgdG8gcmFpc2UKKyAgc3BlY2lmaWMgZXhjZXB0aW9ucyBsaWtlIEF0dHJpYnV0ZUVycm9yLgorCistIGNQaWNrbGUgUGlja2xlciBhbmQgVW5waWNrbGVyIG9iamVjdHMgbm93IHBhcnRpY2lwYXRlIGluIGdhcmJhZ2UKKyAgY29sbGVjdGlvbi4KKworLSBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5KCkgY291bGQgcmV0dXJuIGR1cGxpY2F0ZSBzdHJpbmdzIGF0IHRpbWVzLAorICBlc3BlY2lhbGx5IGxpa2VseSBvbiBXaW5kb3dzLiAgVGhlIHN0cmluZ3MgcmV0dXJuZWQgYXJlIG5vdyBndWFyYW50ZWVkCisgIHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgcHJvZ3JhbSBydW4uCisKKy0gdGhyZWFkLmludGVycnVwdF9tYWluKCkgcmFpc2VzIEtleWJvYXJkSW50ZXJydXB0IGluIHRoZSBtYWluIHRocmVhZC4KKyAgZHVtbXlfdGhyZWFkIGhhcyBhbHNvIGJlZW4gbW9kaWZpZWQgdG8gdHJ5IHRvIHNpbXVsYXRlIHRoZSBiZWhhdmlvci4KKworLSBhcnJheS5hcnJheS5pbnNlcnQoKSBub3cgdHJlYXRzIG5lZ2F0aXZlIGluZGljZXMgYXMgYmVpbmcgcmVsYXRpdmUKKyAgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXksIGp1c3QgbGlrZSBsaXN0Lmluc2VydCgpIGRvZXMuIChTRiBidWcgIzczOTMxMykKKworLSBUaGUgZGF0ZXRpbWUgbW9kdWxlIGNsYXNzZXMgZGF0ZXRpbWUsIHRpbWUsIGFuZCB0aW1lZGVsdGEgYXJlIG5vdworICBwcm9wZXJseSBzdWJjbGFzc2FibGUuCisKKy0gX3RraW50ZXIue2dldHxzZXR9YnVzeXdhaXRpbnRlcnZhbCB3YXMgYWRkZWQuCisKKy0gaXRlcnRvb2xzLmlzbGljZSgpIG5vdyBhY2NlcHRzIHN0b3A9Tm9uZSBhcyBkb2N1bWVudGVkLgorICBGaXhlcyBTRiBidWcgIzczMDY4NS4KKworLSB0aGUgYnNkZGIxODUgbW9kdWxlIGlzIGJ1aWx0IGluIG9uZSByZXN0cmljdGVkIGluc3RhbmNlIC0KKyAgL3Vzci9pbmNsdWRlL2RiLmggZXhpc3RzIGFuZCBkZWZpbmVzIEhBU0hWRVJTSU9OIHRvIGJlIDIuICBUaGlzIGlzIHRydWUKKyAgZm9yIG1hbnkgQlNELWRlcml2ZWQgc3lzdGVtcy4KKworCitMaWJyYXJ5CistLS0tLS0tCisKKy0gU29tZSBoYXBweSBkb2N0ZXN0IGV4dGVuc2lvbnMgZnJvbSBKaW0gRnVsdG9uIGhhdmUgYmVlbiBhZGRlZCB0bworICBkb2N0ZXN0LnB5LiAgVGhlc2UgYXJlIGFscmVhZHkgYmVpbmcgdXNlZCBpbiBab3BlMy4gIFRoZSB0d28KKyAgcHJpbWFyeSBvbmVzOgorCisgIGRvY3Rlc3QuZGVidWcobW9kdWxlLCBuYW1lKSBleHRyYWN0cyB0aGUgZG9jdGVzdHMgZnJvbSB0aGUgbmFtZWQgb2JqZWN0CisgIGluIHRoZSBnaXZlbiBtb2R1bGUsIHB1dHMgdGhlbSBpbiBhIHRlbXAgZmlsZSwgYW5kIHN0YXJ0cyBwZGIgcnVubmluZworICBvbiB0aGF0IGZpbGUuICBUaGlzIGlzIGdyZWF0IHdoZW4gYSBkb2N0ZXN0IGZhaWxzLgorCisgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKG1vZHVsZT1Ob25lKSByZXR1cm5zIGEgc3ludGhlc2l6ZWQgdW5pdHRlc3QKKyAgVGVzdFN1aXRlIGluc3RhbmNlLCB0byBiZSBydW4gYnkgdGhlIHVuaXR0ZXN0IGZyYW1ld29yaywgd2hpY2gKKyAgcnVucyBhbGwgdGhlIGRvY3Rlc3RzIGluIHRoZSBtb2R1bGUuICBUaGlzIGFsbG93cyB3cml0aW5nIHRlc3RzIGluCisgIGRvY3Rlc3Qgc3R5bGUgKHdoaWNoIGNhbiBiZSBjbGVhcmVyIGFuZCBzaG9ydGVyIHRoYW4gd3JpdGluZyB0ZXN0cworICBpbiB1bml0dGVzdCBzdHlsZSksIHdpdGhvdXQgbG9zaW5nIHVuaXR0ZXN0J3MgcG93ZXJmdWwgdGVzdGluZworICBmcmFtZXdvcmsgZmVhdHVyZXMgKHdoaWNoIGRvY3Rlc3QgbGFja3MpLgorCistIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZG9jdGVzdHMgY3JlYXRlZCBiZWZvcmUgMi4zLCBpZiBhbiBleHBlY3RlZAorICBvdXRwdXQgYmxvY2sgY29uc2lzdHMgc29sZWx5IG9mICIxIiBhbmQgdGhlIGFjdHVhbCBvdXRwdXQgYmxvY2sKKyAgY29uc2lzdHMgc29sZWx5IG9mICJUcnVlIiwgaXQncyBhY2NlcHRlZCBhcyBhIG1hdGNoOyBzaW1pbGFybHkKKyAgZm9yICIwIiBhbmQgIkZhbHNlIi4gIFRoaXMgaXMgcXVpdGUgdW4tZG9jdGVzdC1saWtlLCBidXQgaXMgcHJhY3RpY2FsLgorICBUaGUgYmVoYXZpb3IgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIG5ldyBkb2N0ZXN0IG1vZHVsZQorICBjb25zdGFudCBET05UX0FDQ0VQVF9UUlVFX0ZPUl8xIHRvIHRoZSBuZXcgb3B0aW9uZmxhZ3Mgb3B0aW9uYWwKKyAgYXJndW1lbnQuCisKKy0gWmlwRmlsZS50ZXN0emlwKCkgbm93IG9ubHkgdHJhcHMgQmFkWmlwZmlsZSBleGNlcHRpb25zLiAgUHJldmlvdXNseSwKKyAgYSBiYXJlIGV4Y2VwdCBjYXVnaHQgdG8gbXVjaCBhbmQgcmVwb3J0ZWQgYWxsIGVycm9ycyBhcyBhIHByb2JsZW0KKyAgaW4gdGhlIGFyY2hpdmUuCisKKy0gVGhlIGxvZ2dpbmcgbW9kdWxlIG5vdyBoYXMgYSBuZXcgZnVuY3Rpb24sIG1ha2VMb2dSZWNvcmQoKSBtYWtpbmcKKyAgTG9nSGFuZGxlciBlYXNpZXIgdG8gaW50ZXJhY3Qgd2l0aCBEYXRhZ3JhbUhhbmRsZXIgYW5kIFNvY2tldEhhbmRsZXIuCisKKy0gVGhlIGNnaXRiIG1vZHVsZSBoYXMgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IHBsYWluIHRleHQgZGlzcGxheSAoU0YgcGF0Y2gKKyAgNTY5NTc0KS4KKworLSBBIGJyYW5kIG5ldyB2ZXJzaW9uIG9mIElETEUgKGZyb20gdGhlIElETEVmb3JrIHByb2plY3QgYXQKKyAgU291cmNlRm9yZ2UpIGlzIG5vdyBpbmNsdWRlZCBhcyBMaWIvaWRsZWxpYi4gIFRoZSBvbGQgVG9vbHMvaWRsZSBpcworICBubyBtb3JlLgorCistIEFkZGVkIGEgbmV3IG1vZHVsZTogdHJhY2UgKGRvY3VtZW50YXRpb24gbWlzc2luZykuICBUaGlzIG1vZHVsZSB1c2VkCisgIHRvIGJlIGRpc3RyaWJ1dGVkIGluIFRvb2xzL3NjcmlwdHMuICBJdCB1c2VzIHN5cy5zZXR0cmFjZSgpIHRvIHRyYWNlCisgIGNvZGUgZXhlY3V0aW9uIC0tIGVpdGhlciBmdW5jdGlvbiBjYWxscyBvciBpbmRpdmlkdWFsIGxpbmVzLiAgSXQgY2FuCisgIGdlbmVyYXRlIHRyYWNpbmcgb3V0cHV0IGR1cmluZyBleGVjdXRpb24gb3IgYSBwb3N0LW1vcnRlbSByZXBvcnQgb2YKKyAgY29kZSBjb3ZlcmFnZS4KKworLSBUaGUgdGhyZWFkaW5nIG1vZHVsZSBoYXMgbmV3IGZ1bmN0aW9ucyBzZXR0cmFjZSgpIGFuZCBzZXRwcm9maWxlKCkKKyAgdGhhdCBjb29wZXJhdGUgd2l0aCB0aGUgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHN5cworICBtb2R1bGUuICBBIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgdGhyZWFkaW5nIG1vZHVsZSB3aWxsCisgIGJlIHVzZWQgZm9yIGFsbCB0aHJlYWRzIGl0IGNyZWF0ZXMuICBUaGUgbmV3IHRyYWNlIG1vZHVsZSB1c2VzIHRoaXMKKyAgdG8gcHJvdmlkZSB0cmFjaW5nIGZvciBjb2RlIHJ1bm5pbmcgaW4gdGhyZWFkcy4KKworLSBjb3B5LnB5OiBhcHBsaWVkIFNGIHBhdGNoIDcwNzkwMCwgZml4aW5nIGJ1ZyA3MDI4NTgsIGJ5IFN0ZXZlbgorICBUYXNjaHVrLiAgQ29weWluZyBhIG5ldy1zdHlsZSBjbGFzcyB0aGF0IGhhZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYKKyAgZGlkbid0IHdvcmsuICAoVGhlIHNhbWUgdGhpbmcgd29ya2VkIGZpbmUgZm9yIG9sZC1zdHlsZSBjbGFzc2VzLikKKyAgQnVpbHRpbiBmdW5jdGlvbnMgYXJlIG5vdyB0cmVhdGVkIGFzIGF0b21pYywgZml4aW5nIGJ1ZyAjNzQ2MzA0LgorCistIGRpZmZsaWIucHkgaGFzIHR3byBuZXcgZnVuY3Rpb25zOiAgY29udGV4dF9kaWZmKCkgYW5kIHVuaWZpZWRfZGlmZigpLgorCistIE1vcmUgZml4ZXMgdG8gdXJsbGliIChTRiA1NDkxNTEpOiAoYSkgV2hlbiByZWRpcmVjdGluZywgYWx3YXlzIHVzZQorICBHRVQuICBUaGlzIGlzIGNvbW1vbiBwcmFjdGljZSBhbmQgbW9yZS1vci1sZXNzIHNhbmN0aW9uZWQgYnkgdGhlCisgIEhUVFAgc3RhbmRhcmQuIChiKSBBZGQgYSBoYW5kbGVyIGZvciAzMDcgcmVkaXJlY3Rpb24sIHdoaWNoIGJlY29tZXMKKyAgYW4gZXJyb3IgZm9yIFBPU1QsIGJ1dCBhIHJlZ3VsYXIgcmVkaXJlY3QgZm9yIEdFVCBhbmQgSEVBRAorCistIEFkZGVkIG9wdGlvbmFsICdvbmVycm9yJyBhcmd1bWVudCB0byBvcy53YWxrKCksIHRvIGNvbnRyb2wgZXJyb3IKKyAgaGFuZGxpbmcuCisKKy0gaW5zcGVjdC5pc3ttZXRob2R8ZGF0YX1kZXNjcmlwdG9yIHdhcyBhZGRlZCwgdG8gYWxsb3cgcHlkb2MgZGlzcGxheQorICBfX2RvY19fIG9mIGRhdGEgZGVzY3JpcHRvcnMuCisKKy0gRml4ZWQgc29ja2V0IHNwZWVkIGxvc3MgY2F1c2VkIGJ5IHVzZSBvZiB0aGUgX3NvY2tldG9iamVjdCB3cmFwcGVyIGNsYXNzCisgIGluIHNvY2tldC5weS4KKworLSB0aW1laXQucHkgbm93IGNoZWNrcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9yIGltcG9ydHMuCisKKy0gdXJsbGliMi5weSBub3cga25vd3MgaG93IHRvIG9yZGVyIHByb3h5IGNsYXNzZXMsIHNvIHRoZSB1c2VyIGRvZXNuJ3QKKyAgaGF2ZSB0byBpbnNlcnQgaXQgaW4gZnJvbnQgb2Ygb3RoZXIgY2xhc3Nlcywgbm9yIGRvIGRpcnR5IHRyaWNrcyBsaWtlCisgIGluc2VydGluZyBhICJkdW1teSIgSFRUUEhhbmRsZXIgYWZ0ZXIgYSBQcm94eUhhbmRsZXIgd2hlbiBidWlsZGluZyBhbgorICBvcGVuZXIgd2l0aCBwcm94eSBzdXBwb3J0LgorCistIEl0ZXJhdG9ycyBoYXZlIGJlZW4gYWRkZWQgZm9yIGRibSBrZXlzLgorCistIHJhbmRvbS5SYW5kb20gb2JqZWN0cyBjYW4gbm93IGJlIHBpY2tsZWQuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIHB5ZG9jIG5vdyBvZmZlcnMgaGVscCBvbiBrZXl3b3JkcyBhbmQgdG9waWNzLgorCistIFRvb2xzL2lkbGUgaXMgZ29uZTsgbG9uZyBsaXZlIExpYi9pZGxlbGliLgorCistIGRpZmYucHkgcHJpbnRzIGZpbGUgZGlmZnMgaW4gY29udGV4dCwgdW5pZmllZCwgb3IgbmRpZmYgZm9ybWF0cywKKyAgcHJvdmlkaW5nIGEgY29tbWFuZCBsaW5lIGludGVyZmFjZSB0byBkaWZmbGliLnB5LgorCistIHRleGNoZWNrLnB5IGlzIGEgbmV3IHNjcmlwdCBmb3IgbWFraW5nIGEgcm91Z2ggdmFsaWRhdGlvbiBvZiBQeXRob24gTGFUZVgKKyAgZmlsZXMuCisKK0J1aWxkCistLS0tLQorCistIFNldHRpbmcgREVTVERJUiBkdXJpbmcgJ21ha2UgaW5zdGFsbCcgbm93IGFsbG93cyBzcGVjaWZ5aW5nIGEKKyAgZGlmZmVyZW50IHJvb3QgZGlyZWN0b3J5LgorCitDIEFQSQorLS0tLS0KKworLSBQeVR5cGVfUmVhZHkoKTogIElmIGEgdHlwZSBkZWNsYXJlcyB0aGF0IGl0IHBhcnRpY2lwYXRlcyBpbiBnYworICAoUHlfVFBGTEFHU19IQVZFX0dDKSwgYW5kIGl0cyBiYXNlIGNsYXNzIGRvZXMgbm90LCBhbmQgaXRzIGJhc2UgY2xhc3MncworICB0cF9mcmVlIHNsb3QgaXMgdGhlIGRlZmF1bHQgX1B5T2JqZWN0X0RlbCwgYW5kIHR5cGUgZG9lcyBub3QgZGVmaW5lCisgIGEgdHBfZnJlZSBzbG90IGl0c2VsZiwgX1B5T2JqZWN0X0dDX0RlbCBpcyBhc3NpZ25lZCB0byB0eXBlLT50cF9mcmVlLgorICBQcmV2aW91c2x5IF9QeU9iamVjdF9EZWwgd2FzIGluaGVyaXRlZCwgd2hpY2ggY291bGQgYXQgYmVzdCBsZWFkIHRvIGEKKyAgc2VnZmF1bHQuICBJbiBhZGRpdGlvbiwgaWYgZXZlbiBhZnRlciB0aGlzIG1hZ2ljIHRoZSB0eXBlJ3MgdHBfZnJlZQorICBzbG90IGlzIF9QeU9iamVjdF9EZWwgb3IgTlVMTCwgYW5kIHRoZSB0eXBlIGlzIGEgYmFzZSB0eXBlCisgIChQeV9UUEZMQUdTX0JBU0VUWVBFKSwgVHlwZUVycm9yIGlzIHJhaXNlZDogIHNpbmNlIHRoZSB0eXBlIGlzIGEgYmFzZQorICB0eXBlLCBpdHMgZGVhbGxvYyBmdW5jdGlvbiBtdXN0IGNhbGwgdHlwZS0+dHBfZnJlZSwgYW5kIHNpbmNlIHRoZSB0eXBlCisgIGlzIGdjJ2FibGUsIHRwX2ZyZWUgbXVzdCBub3QgYmUgTlVMTCBvciBfUHlPYmplY3RfRGVsLgorCistIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMoKTogQSBuZXcgQVBJIChkZWxpYmVyYXRlbHkgYWNjZXNzaWJsZSBvbmx5CisgIGZyb20gQykgdG8gaW50ZXJydXB0IGEgdGhyZWFkIGJ5IHNlbmRpbmcgaXQgYW4gZXhjZXB0aW9uLiAgSXQgaXMKKyAgaW50ZW50aW9uYWwgdGhhdCB5b3UgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBDIGV4dGVuc2lvbiB0byBjYWxsIGl0CisgIGZyb20gUHl0aG9uLgorCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworTm9uZSB0aGlzIHRpbWUuCisKK1Rlc3RzCistLS0tLQorCistIHRlc3RfaW1wIHJld3JpdHRlbiBzbyB0aGF0IGl0IGRvZXNuJ3QgcmFpc2UgUnVudGltZUVycm9yIGlmIHJ1biBhcyBhCisgIHNpZGUgZWZmZWN0IG9mIGJlaW5nIGltcG9ydGVkICgiaW1wb3J0IHRlc3QuYXV0b3Rlc3QiKS4KKworV2luZG93cworLS0tLS0tLQorCistIFRoZSBXaW5kb3dzIGluc3RhbGxlciBzaGlwcyB3aXRoIFRjbC9UayA4LjQuMyAodXBncmFkZWQgZnJvbSA4LjQuMSkuCisKKy0gVGhlIGluc3RhbGxlciBhbHdheXMgc3VnZ2VzdGVkIHRoYXQgUHl0aG9uIGJlIGluc3RhbGxlZCBvbiB0aGUgQzoKKyAgZHJpdmUsIGR1ZSB0byBhIGhhcmRjb2RlZCAiQzoiIGdlbmVyYXRlZCBieSB0aGUgV2lzZSBpbnN0YWxsYXRpb24KKyAgd2l6YXJkLiAgUGVvcGxlIHdpdGggbWFjaGluZXMgd2hlcmUgQzogaXMgbm90IHRoZSBzeXN0ZW0gZHJpdmUKKyAgdXN1YWxseSB3YW50IFB5dGhvbiBpbnN0YWxsZWQgb24gd2hpY2hldmVyIGRyaXZlIGlzIHRoZWlyIHN5c3RlbSBkcml2ZQorICBpbnN0ZWFkLiAgV2UgcmVtb3ZlZCB0aGUgaGFyZGNvZGVkICJDOiIsIGFuZCB0d28gdGVzdGVycyBvbiBtYWNoaW5lcworICB3aGVyZSBDOiBpcyBub3QgdGhlIHN5c3RlbSBkcml2ZSByZXBvcnQgdGhhdCB0aGUgaW5zdGFsbGVyIG5vdworICBzdWdnZXN0cyB0aGVpciBzeXN0ZW0gZHJpdmUuICBOb3RlIHRoYXQgeW91IGNhbiBhbHdheXMgc2VsZWN0IHRoZQorICBkaXJlY3RvcnkgeW91IHdhbnQgaW4gdGhlICJTZWxlY3QgRGVzdGluYXRpb24gRGlyZWN0b3J5IiBkaWFsb2cgLS0KKyAgdGhhdCdzIHdoYXQgaXQncyBmb3IuCisKK01hYworLS0tCisKKy0gVGhlcmUncyBhIG5ldyBtb2R1bGUgY2FsbGVkICJhdXRvR0lMIiwgd2hpY2ggb2ZmZXJzIGEgbWVjaGFuaXNtIHRvCisgIGF1dG9tYXRpY2FsbHkgcmVsZWFzZSB0aGUgR2xvYmFsIEludGVycHJldGVyIExvY2sgd2hlbiBhbiBldmVudCBsb29wCisgIGdvZXMgdG8gc2xlZXAsIGFsbG93aW5nIG90aGVyIHRocmVhZHMgdG8gcnVuLiBJdCdzIGN1cnJlbnRseSBvbmx5CisgIHN1cHBvcnRlZCBvbiBPU1gsIGluIHRoZSBNYWNoLU8gdmVyc2lvbi4KKy0gVGhlIE9TQSBtb2R1bGVzIG5vdyBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIHByb3BlcnRpZXMgb2YgdGhlCisgIHRvcGxldmVsIGFwcGxpY2F0aW9uIGNsYXNzIChpbiBBcHBsZVNjcmlwdCB0ZXJtaW5vbG9neSkuCistIFRoZSBQYWNrYWdlIE1hbmFnZXIgY2FuIG5vdyB1cGRhdGUgaXRzZWxmLgorCitTb3VyY2VGb3JnZSBCdWdzIGFuZCBQYXRjaGVzIEFwcGxpZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis0MzAxNjAsIDQ3MTg5MywgNTAxNzE2LCA1NDI1NjIsIDU0OTE1MSwgNTY5NTc0LCA1OTU4MzcsIDU5NjQzNCwKKzU5ODE2MywgNjA0MjEwLCA2MDQ3MTYsIDYxMDMzMiwgNjEyNjI3LCA2MTQ3NzAsIDYyMDE5MCwgNjIxODkxLAorNjIyMDQyLCA2MzkxMzksIDY0MDIzNiwgNjQ0MzQ1LCA2NDk3NDIsIDY0OTc0MiwgNjU4MjMzLCA2NjAwMjIsCis2NjEzMTgsIDY2MTY3NiwgNjYyODA3LCA2NjI5MjMsIDY2NjIxOSwgNjcyODU1LCA2NzgzMjUsIDY4MjM0NywKKzY4MzQ4NiwgNjg0OTgxLCA2ODU3NzMsIDY4NjI1NCwgNjkyNzc2LCA2OTI5NTksIDY5MzA5NCwgNjk2Nzc3LAorNjk3OTg5LCA3MDA4MjcsIDcwMzY2NiwgNzA4NDk1LCA3MDg2MDQsIDcwODkwMSwgNzEwNzMzLCA3MTE5MDIsCis3MTM3MjIsIDcxNTc4MiwgNzE4Mjg2LCA3MTkzNTksIDcxOTM2NywgNzIzMTM2LCA3MjM4MzEsIDcyMzk2MiwKKzcyNDU4OCwgNzI0NzY3LCA3MjQ3NjcsIDcyNTk0MiwgNzI2MTUwLCA3MjY0NDYsIDcyNjg2OSwgNzI3MDUxLAorNzI3NzE5LCA3Mjc3MTksIDcyNzgwNSwgNzI4Mjc3LCA3Mjg1NjMsIDcyODY1NiwgNzI5MDk2LCA3MjkxMDMsCis3MjkyOTMsIDcyOTI5NywgNzI5MzAwLCA3MjkzMTcsIDcyOTM5NSwgNzI5NjIyLCA3Mjk4MTcsIDczMDE3MCwKKzczMDI5NiwgNzMwNTk0LCA3MzA2ODUsIDczMDgyNiwgNzMwOTYzLCA3MzEyMDksIDczMTQwMywgNzMxNTA0LAorNzMxNTE0LCA3MzE2MjYsIDczMTYzNSwgNzMxNjQzLCA3MzE2NDQsIDczMTY0NCwgNzMxNjg5LCA3MzIxMjQsCis3MzIxNDMsIDczMjIzNCwgNzMyMjg0LCA3MzIyODQsIDczMjQ3OSwgNzMyNzYxLCA3MzI3ODMsIDczMjk1MSwKKzczMzY2NywgNzMzNzgxLCA3MzQxMTgsIDczNDIzMSwgNzM0ODY5LCA3MzUwNTEsIDczNTI5MywgNzM1NTI3LAorNzM1NjEzLCA3MzU2OTQsIDczNjk2MiwgNzM2OTYyLCA3Mzc5NzAsIDczODA2NiwgNzM5MzEzLCA3NDAwNTUsCis3NDAyMzQsIDc0MDMwMSwgNzQxODA2LCA3NDIxMjYsIDc0Mjc0MSwgNzQyODYwLCA3NDI4NjAsIDc0MjkxMSwKKzc0NDA0MSwgNzQ0MTA0LCA3NDQyMzgsIDc0NDY4NywgNzQ0ODc3LCA3NDUwNTUsIDc0NTQ3OCwgNzQ1NTI1LAorNzQ1NjIwLCA3NDYwMTIsIDc0NjMwNCwgNzQ2MzY2LCA3NDY4MDEsIDc0Njk1MywgNzQ3MzQ4LCA3NDc2NjcsCis3NDc5NTQsIDc0ODg0NiwgNzQ4ODQ5LCA3NDg5NzMsIDc0ODk3NSwgNzQ5MTkxLCA3NDkyMTAsIDc0OTc1OSwKKzc0OTgzMSwgNzQ5OTExLCA3NTAwMDgsIDc1MDA5MiwgNzUwNTQyLCA3NTA1OTUsIDc1MTAzOCwgNzUxMTA3LAorNzUxMjc2LCA3NTE0NTEsIDc1MTkxNiwgNzUxOTQxLCA3NTE5NTYsIDc1MTk5OCwgNzUyNjcxLCA3NTM0NTEsCis3NTM2MDIsIDc1MzYxNywgNzUzODQ1LCA3NTM5MjUsIDc1NDAxNCwgNzU0MzQwLCA3NTQ0NDcsIDc1NTAzMSwKKzc1NTA4NywgNzU1MTQ3LCA3NTUyNDUsIDc1NTY4MywgNzU1OTg3LCA3NTYwMzIsIDc1Njk5NiwgNzU3MDU4LAorNzU3MjI5LCA3NTc4MTgsIDc1NzgyMSwgNzU3ODIyLCA3NTgxMTIsIDc1ODkxMCwgNzU5MjI3LCA3NTk4ODksCis3NjAyNTcsIDc2MDcwMywgNzYwNzkyLCA3NjExMDQsIDc2MTMzNywgNzYxNTE5LCA3NjE4MzAsIDc2MjQ1NQorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBiZXRhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyNS1BcHItMjAwMyoKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gTmV3IGZvcm1hdCBjb2RlcyBCLCBILCBJLCBrIGFuZCBLIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBmb3IKKyAgUHlBcmdfUGFyc2VUdXBsZSBhbmQgUHlCdWlsZF9WYWx1ZS4KKworLSBOZXcgYnVpbHRpbiBmdW5jdGlvbiBzdW0oc2VxLCBzdGFydD0wKSByZXR1cm5zIHRoZSBzdW0gb2YgYWxsIHRoZQorICBpdGVtcyBpbiBpdGVyYWJsZSBvYmplY3Qgc2VxLCBwbHVzIHN0YXJ0IChpdGVtcyBhcmUgbm9ybWFsbHkgbnVtYmVycywKKyAgYW5kIGNhbm5vdCBiZSBzdHJpbmdzKS4KKworLSBib29sKCkgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzIG5vdyByZXR1cm5zIEZhbHNlIHJhdGhlciB0aGFuCisgIHJhaXNpbmcgYW4gZXhjZXB0aW9uLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggY2FsbGluZyB0aGUKKyAgY29uc3RydWN0b3JzIGZvciB0aGUgb3RoZXIgYnVpbHRpbiB0eXBlcyAtLSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudAorICB0aGV5IGFsbCByZXR1cm4gdGhlIGZhbHNlIHZhbHVlIG9mIHRoYXQgdHlwZS4gIChTRiBwYXRjaCAjNzI0MTM1KQorCistIEluIHN1cHBvcnQgb2YgUEVQIDI2OSAobWFraW5nIHRoZSBwZ2VuIHBhcnNlciBnZW5lcmF0b3IgYWNjZXNzaWJsZQorICBmcm9tIFB5dGhvbiksIHNvbWUgY2hhbmdlcyB0byB0aGUgcGdlbiBjb2RlIHN0cnVjdHVyZSB3ZXJlIG1hZGU7IGEKKyAgZmV3IGZpbGVzIHRoYXQgdXNlZCB0byBiZSBsaW5rZWQgb25seSB3aXRoIHBnZW4gYXJlIG5vdyBsaW5rZWQgd2l0aAorICBQeXRob24gaXRzZWxmLgorCistIFRoZSByZXByKCkgb2YgYSB3ZWFrcmVmIG9iamVjdCBub3cgc2hvd3MgdGhlIF9fbmFtZV9fIGF0dHJpYnV0ZSBvZgorICB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGlmIGl0IGhhcyBvbmUuCisKKy0gc3VwZXIoKSBubyBsb25nZXIgaWdub3JlcyBkYXRhIGRlc2NyaXB0b3JzLCBleGNlcHQgX19jbGFzc19fLiAgU2VlCisgIHRoZSB0aHJlYWQgc3RhcnRlZCBhdAorICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDMtQXByaWwvMDM0MzM4Lmh0bWwKKworLSBsaXN0Lmluc2VydChpLCB4KSBub3cgaW50ZXJwcmV0cyBuZWdhdGl2ZSBpIGFzIGl0IHdvdWxkIGJlCisgIGludGVycHJldGVkIGJ5IHNsaWNpbmcsIHNvIG5lZ2F0aXZlIHZhbHVlcyBjb3VudCBmcm9tIHRoZSBlbmQgb2YgdGhlCisgIGxpc3QuICBUaGlzIHdhcyB0aGUgb25seSBwbGFjZSB3aGVyZSBzdWNoIGFuIGludGVycHJldGF0aW9uIHdhcyBub3QKKyAgcGxhY2VkIG9uIGEgbGlzdCBpbmRleC4KKworLSByYW5nZSgpIG5vdyB3b3JrcyBldmVuIGlmIHRoZSBhcmd1bWVudHMgYXJlIGxvbmdzIHdpdGggbWFnbml0dWRlCisgIGxhcmdlciB0aGFuIHN5cy5tYXhpbnQsIGFzIGxvbmcgYXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UKKyAgZml0cy4gIEUuZy4sIHJhbmdlKDIqKjEwMCwgMioqMTAxLCAyKioxMDApIGlzIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyAgWzEyNjc2NTA2MDAyMjgyMjk0MDE0OTY3MDMyMDUzNzZMXS4gIChTRiBwYXRjaCAjNzA3NDI3LikKKworLSBTb21lIGhvcnJpZGx5IG9ic2N1cmUgcHJvYmxlbXMgd2VyZSBmaXhlZCBpbnZvbHZpbmcgaW50ZXJhY3Rpb24KKyAgYmV0d2VlbiBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIG9sZC1zdHlsZSBjbGFzc2VzIHdpdGggImFtYml0aW91cyIKKyAgZ2V0YXR0ciBob29rcy4gIElmIGFuIG9sZC1zdHlsZSBpbnN0YW5jZSBkaWRuJ3QgaGF2ZSBhIF9fZGVsX18gbWV0aG9kLAorICBidXQgZGlkIGhhdmUgYSBfX2dldGF0dHJfXyBob29rLCBhbmQgdGhlIGluc3RhbmNlIGJlY2FtZSByZWFjaGFibGUKKyAgb25seSBmcm9tIGFuIHVucmVhY2hhYmxlIGN5Y2xlLCBhbmQgdGhlIGhvb2sgcmVzdXJyZWN0ZWQgb3IgZGVsZXRlZAorICB1bnJlYWNoYWJsZSBvYmplY3RzIHdoZW4gYXNrZWQgdG8gcmVzb2x2ZSAiX19kZWxfXyIsIGFueXRoaW5nIHVwIHRvCisgIGEgc2VnZmF1bHQgY291bGQgaGFwcGVuLiAgVGhhdCdzIGJlZW4gcmVwYWlyZWQuCisKKy0gZGljdC5wb3Agbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHNwZWNpZnlpbmcgYSBkZWZhdWx0CisgIHZhbHVlIHRvIHJldHVybiBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgZGljdC4gIElmIGEgZGVmYXVsdCBpcyBub3QKKyAgZ2l2ZW4gYW5kIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBhIEtleUVycm9yIHdpbGwgc3RpbGwgYmUgcmFpc2VkLgorICBQYXJhbGxlbCBjaGFuZ2VzIHdlcmUgbWFkZSB0byBVc2VyRGljdC5Vc2VyRGljdCBhbmQgVXNlckRpY3QuRGljdE1peGluLgorICBbU0YgcGF0Y2ggIzY5Mzc1M10gKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgU3RvbmUuKQorCistIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSB3YXMgYWRkZWQgdG8gZXhwb3NlCisgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcuCisKKy0gTmV3IGZ1bmN0aW9uIHN5cy5leGNfY2xlYXIoKSBjbGVhcnMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLiAgVGhpcyBpcworICByYXJlbHkgbmVlZGVkLCBidXQgY2FuIHNvbWV0aW1lcyBiZSB1c2VmdWwgdG8gcmVsZWFzZSBvYmplY3RzCisgIHJlZmVyZW5jZWQgYnkgdGhlIHRyYWNlYmFjayBoZWxkIGluIHN5cy5leGNfaW5mbygpWzJdLiAgKFNGIHBhdGNoCisgICM2OTMxOTUuKQorCistIE9uIDY0LWJpdCBzeXN0ZW1zLCBhIGRpY3Rpb25hcnkgY291bGQgY29udGFpbiBkdXBsaWNhdGUgbG9uZy9pbnQga2V5cworICBpZiB0aGUga2V5IHZhbHVlIHdhcyBsYXJnZXIgdGhhbiAyKiozMi4gIFNlZSBTRiBidWcgIzY4OTY1OS4KKworLSBGaXhlZCBTRiBidWcgIzY2MzA3NC4gVGhlIGNvZGVjIHN5c3RlbSB3YXMgdXNpbmcgZ2xvYmFsIHN0YXRpYworICB2YXJpYWJsZXMgdG8gc3RvcmUgaW50ZXJuYWwgZGF0YS4gQXMgYSByZXN1bHQsIGFueSBhdHRlbXB0cyB0byB1c2UgdGhlCisgIHVuaWNvZGUgc3lzdGVtIHdpdGggbXVsdGlwbGUgYWN0aXZlIGludGVycHJldGVycywgb3Igc3VjY2Vzc2l2ZQorICBpbnRlcnByZXRlciBleGVjdXRpb25zLCB3b3VsZCBmYWlsLgorCistICIlYyIgJSB1ImEiIG5vdyByZXR1cm5zIGEgdW5pY29kZSBzdHJpbmcgaW5zdGVhZCBvZiByYWlzaW5nIGEKKyAgVHlwZUVycm9yLiB1IiVjIiAlIDB4ZmZmZmZmZmYgbm93IHJhaXNlcyBhIE92ZXJmbG93RXJyb3IgaW5zdGVhZAorICBvZiBhIFZhbHVlRXJyb3IgdG8gYmUgY29uc2lzdGVudCB3aXRoICIlYyIgJSAyNTYuIFNlZSBTRiBwYXRjaCAjNzEwMTI3LgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBUaGUgc29ja2V0IG1vZHVsZSBub3cgcHJvdmlkZXMgdGhlIGZ1bmN0aW9ucyBpbmV0X3B0b24gYW5kIGluZXRfbnRvcAorICBmb3IgY29udmVydGluZyBiZXR3ZWVuIHN0cmluZyBhbmQgcGFja2VkIHJlcHJlc2VudGF0aW9uIG9mIElQCisgIGFkZHJlc3Nlcy4gIFRoZXJlIGlzIGFsc28gYSBuZXcgbW9kdWxlIHZhcmlhYmxlLCBoYXNfaXB2Niwgd2hpY2ggaXMKKyAgVHJ1ZSBpZmYgdGhlIGN1cnJlbnQgUHl0aG9uIGhhcyBJUHY2IHN1cHBvcnQuICBTZWUgU0YgcGF0Y2ggIzY1ODMyNy4KKworLSBUa2ludGVyIHdyYXBwZXJzIGFyb3VuZCBUY2wgdmFyaWFibGVzIG5vdyBwYXNzIG9iamVjdHMgZGlyZWN0bHkKKyAgdG8gVGNsLCBpbnN0ZWFkIG9mIGZpcnN0IGNvbnZlcnRpbmcgdGhlbSB0byBzdHJpbmdzLgorCistIFRoZSAuKj8gcGF0dGVybiBpbiB0aGUgcmUgbW9kdWxlIGlzIG5vdyBzcGVjaWFsLWNhc2VkIHRvIGF2b2lkIHRoZQorICByZWN1cnNpb24gbGltaXQuICAoU0YgcGF0Y2ggIzcyMDk5MSAtLSBtYW55IHRoYW5rcyB0byBHYXJ5IEhlcnJvbgorICBhbmQgR3JlZyBDaGFwbWFuLikKKworLSBOZXcgZnVuY3Rpb24gc3lzLmNhbGxfdHJhY2luZygpIGFsbG93cyBwZGIgdG8gZGVidWcgY29kZQorICByZWN1cnNpdmVseS4KKworLSBOZXcgZnVuY3Rpb24gZ2MuZ2V0X3JlZmVyZW50cyhvYmopIHJldHVybnMgYSBsaXN0IG9mIG9iamVjdHMKKyAgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBvYmouICBJbiBlZmZlY3QsIGl0IGV4cG9zZXMgd2hhdCB0aGUgb2JqZWN0J3MKKyAgdHBfdHJhdmVyc2Ugc2xvdCBkb2VzLCBhbmQgY2FuIGJlIGhlbHBmdWwgd2hlbiBkZWJ1Z2dpbmcgbWVtb3J5CisgIGxlYWtzLgorCistIFRoZSBpY29udiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoaXMgcmVsZWFzZS4KKworLSBUaGUgcGxhdGZvcm0taW5kZXBlbmRlbnQgcm91dGluZXMgZm9yIHBhY2tpbmcgZmxvYXRzIGluIElFRUUgZm9ybWF0cworICAoc3RydWN0LnBhY2sncyA8ZiwgPmYsIDxkLCBhbmQgPmQgY29kZXM7IHBpY2tsZSBhbmQgY1BpY2tsZSdzIHByb3RvY29sIDEKKyAgcGlja2xpbmcgb2YgZmxvYXRzKSBpZ25vcmVkIHRoYXQgcm91bmRpbmcgY2FuIGNhdXNlIGEgY2FycnkgdG8KKyAgcHJvcGFnYXRlLiAgVGhlIHdvcnN0IGNvbnNlcXVlbmNlIHdhcyB0aGF0LCBpbiByYXJlIGNhc2VzLCA8ZiBhbmQgPmYKKyAgY291bGQgcHJvZHVjZSBzdHJpbmdzIHRoYXQsIHdoZW4gdW5wYWNrZWQgYWdhaW4sIHdlcmUgYSBmYWN0b3Igb2YgMgorICBhd2F5IGZyb20gdGhlIG9yaWdpbmFsIGZsb2F0LiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4gIFNlZSBTRiBidWcKKyAgIzcwNTgzNi4KKworLSBOZXcgZnVuY3Rpb24gdGltZS50enNldCgpIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgQyBsaWJyYXJ5IHR6c2V0KCkKKyAgZnVuY3Rpb24sIGlmIHN1cHBvcnRlZC4gIChTRiBwYXRjaCAjNjc1NDIyLikKKworLSBVc2luZyBjcmVhdGVmaWxlaGFuZGxlciwgZGVsZXRlZmlsZWhhbmRsZXIsIGNyZWF0ZXRpbWVyaGFuZGxlciBmdW5jdGlvbnMKKyAgb24gVGtpbnRlci50a2ludGVyIChfdGtpbnRlciBtb2R1bGUpIG5vIGxvbmdlciBjcmFzaGVzIHRoZSBpbnRlcnByZXRlci4KKyAgU2VlIFNGIGJ1ZyAjNjkyNDE2LgorCistIE1vZGlmaWVkIHRoZSBmY250bC5pb2N0bCgpIGZ1bmN0aW9uIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBhIHBhc3NlZAorICBtdXRhYmxlIGJ1ZmZlciAoZm9yIGRldGFpbHMgc2VlIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbikuCisKKy0gTWFkZSB1c2VyIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRoZSBpdGVydG9vbHMgbW9kdWxlLgorICBTdWJzdW1lZCB0aGUgdGltZXMoKSBmdW5jdGlvbiBpbnRvIHJlcGVhdCgpLgorICBBZGRlZCBjaGFpbigpIGFuZCBjeWNsZSgpLgorCistIFRoZSByb3RvciBtb2R1bGUgaXMgbm93IGRlcHJlY2F0ZWQ7IHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSBpdCB1c2VzCisgIGlzIG5vdCBiZWxpZXZlZCB0byBiZSBzZWN1cmUsIGFuZCBpbmNsdWRpbmcgY3J5cHRvIGNvZGUgd2l0aCBQeXRob24KKyAgaGFzIGltcGxpY2F0aW9ucyBmb3IgZXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgaXQgaW4gdmFyaW91cyBjb3VudHJpZXMuCisKKy0gVGhlIHNvY2tldCBtb2R1bGUgbm93IGFsd2F5cyB1c2VzIHRoZSBfc29ja2V0b2JqZWN0IHdyYXBwZXIgY2xhc3MsIGV2ZW4gb24KKyAgcGxhdGZvcm1zIHdoaWNoIGhhdmUgZHVwKDIpLiAgVGhlIG1ha2VmaWxlKCkgbWV0aG9kIGlzIGJ1aWx0IGRpcmVjdGx5CisgIG9uIHRvcCBvZiB0aGUgc29ja2V0IHdpdGhvdXQgZHVwbGljYXRpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciwgYWxsb3dpbmcKKyAgdGltZW91dHMgdG8gd29yayBwcm9wZXJseS4KKworTGlicmFyeQorLS0tLS0tLQorCistIE5ldyBnZW5lcmF0b3IgZnVuY3Rpb24gb3Mud2FsaygpIGlzIGFuIGVhc3ktdG8tdXNlIGFsdGVybmF0aXZlIHRvCisgIG9zLnBhdGgud2FsaygpLiAgU2VlIG9zIG1vZHVsZSBkb2NzIGZvciBkZXRhaWxzLiAgb3MucGF0aC53YWxrKCkKKyAgaXNuJ3QgZGVwcmVjYXRlZCBhdCB0aGlzIHRpbWUsIGJ1dCBtYXkgYmVjb21lIGRlcHJlY2F0ZWQgaW4gYQorICBmdXR1cmUgcmVsZWFzZS4KKworLSBBZGRlZCBuZXcgbW9kdWxlICJwbGF0Zm9ybSIgd2hpY2ggcHJvdmlkZXMgYSB3aWRlIHJhbmdlIG9mIHRvb2xzCisgIGZvciBxdWVyeWluZyBwbGF0Zm9ybSBkZXBlbmRlbnQgZmVhdHVyZXMuCisKKy0gbmV0cmMgbm93IGFsbG93cyBBU0NJSSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGluIHBhc3N3b3Jkcy4KKworLSBzaGVsdmUgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCB3cml0ZWJhY2sgYXJndW1lbnQsIGFuZCBleHBvc2VzCisgIHBpY2tsZSBwcm90b2NvbCB2ZXJzaW9ucy4KKworLSBTZXZlcmFsIG1ldGhvZHMgb2Ygbm50cGxpYi5OTlRQIGhhdmUgZ3Jvd24gYW4gb3B0aW9uYWwgZmlsZSBhcmd1bWVudAorICB3aGljaCBzcGVjaWZpZXMgYSBmaWxlIHdoZXJlIHRvIGRpdmVydCB0aGUgY29tbWFuZCdzIG91dHB1dAorICAoYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGJvZHkoKSBtZXRob2QpLiAgKFNGIHBhdGNoICM3MjA0NjgpCisKKy0gVGhlIHNlbGYtZG9jdW1lbnRpbmcgWE1MIHNlcnZlciBsaWJyYXJ5IERvY1hNTFJQQ1NlcnZlciB3YXMgYWRkZWQuCisKKy0gU3VwcG9ydCBmb3IgaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWVzIGhhcyBiZWVuIGFkZGVkIHRocm91Z2gKKyAgdGhlICdpZG5hJyBhbmQgJ3B1bnljb2RlJyBlbmNvZGluZ3MsIHRoZSAnc3RyaW5ncHJlcCcgbW9kdWxlLCB0aGUKKyAgJ21rc3RyaW5ncHJlcCcgdG9vbCwgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgc29ja2V0IGFuZCBodHRwbGliCisgIG1vZHVsZXMuCisKKy0gaHRtbGVudGl0eWRlZnMgaGFzIHR3byBuZXcgZGljdGlvbmFyaWVzOiBuYW1lMmNvZGVwb2ludCBtYXBzCisgIEhUTUwgZW50aXR5IG5hbWVzIHRvIFVuaWNvZGUgY29kZXBvaW50cyAoYXMgaW50ZWdlcnMpLgorICBjb2RlcG9pbnQybmFtZSBpcyB0aGUgcmV2ZXJzZSBtYXBwaW5nLiBTZWUgU0YgcGF0Y2ggIzcyMjAxNy4KKworLSBwZGIgaGFzIGEgbmV3IGNvbW1hbmQsICJkZWJ1ZyIsIHdoaWNoIGxldHMgeW91IHN0ZXAgdGhyb3VnaAorICBhcmJpdHJhcnkgY29kZSBmcm9tIHRoZSBkZWJ1Z2dlcidzIChwZGIpIHByb21wdC4KKworLSB1bml0dGVzdC5mYWlsVW5sZXNzRXF1YWwgYW5kIGl0cyBlcXVpdmFsZW50IHVuaXR0ZXN0LmFzc2VydEVxdWFsIG5vdworICByZXR1cm4gJ25vdCBhID09IGInIHJhdGhlciB0aGFuICdhICE9IGInLiAgVGhpcyBnaXZlcyB0aGUgZGVzaXJlZAorICByZXN1bHQgZm9yIGNsYXNzZXMgdGhhdCBkZWZpbmUgX19lcV9fIHdpdGhvdXQgZGVmaW5pbmcgX19uZV9fLgorCistIHNnbWxsaWIgbm93IHN1cHBvcnRzIFNHTUwgbWFya2VkIHNlY3Rpb25zLCBpbiBwYXJ0aWN1bGFyIHRoZQorICBNUyBPZmZpY2UgZXh0ZW5zaW9ucy4KKworLSBUaGUgdXJsbGliIG1vZHVsZSBub3cgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZSBpdGVyYXRvciBwcm90b2NvbC4KKyAgU0YgcGF0Y2ggNjk4NTIwIGNvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbi4KKworLSBOZXcgbW9kdWxlIHRpbWVpdCBwcm92aWRlcyBhIHNpbXBsZSBmcmFtZXdvcmsgZm9yIHRpbWluZyB0aGUKKyAgZXhlY3V0aW9uIHNwZWVkIG9mIGV4cHJlc3Npb25zIGFuZCBzdGF0ZW1lbnRzLgorCistIHNldHMuU2V0IG9iamVjdHMgbm93IHN1cHBvcnQgbWl4ZWQtdHlwZSBfX2VxX18gYW5kIF9fbmVfXywgaW5zdGVhZAorICBvZiByYWlzaW5nIFR5cGVFcnJvci4gIElmIHggaXMgYSBTZXQgb2JqZWN0IGFuZCB5IGlzIGEgbm9uLVNldCBvYmplY3QsCisgIHggPT0geSBpcyBGYWxzZSwgYW5kIHggIT0geSBpcyBUcnVlLiAgVGhpcyBpcyBha2luIHRvIHRoZSBjaGFuZ2UgbWFkZQorICBmb3IgbWl4ZWQtdHlwZSBjb21wYXJpc29ucyBvZiBkYXRldGltZSBvYmplY3RzIGluIDIuM2EyOyBtb3JlIGluZm8KKyAgYWJvdXQgdGhlIHJhdGlvbmFsZSBpcyBpbiB0aGUgTkVXUyBlbnRyeSBmb3IgdGhhdC4gIFNlZSBhbHNvIFNGIGJ1ZworICByZXBvcnQgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82OTMxMjE+LgorCistIE9uIFVuaXggcGxhdGZvcm1zLCBpZiBvcy5saXN0ZGlyKCkgaXMgY2FsbGVkIHdpdGggYSBVbmljb2RlIGFyZ3VtZW50LAorICBpdCBub3cgcmV0dXJucyBVbmljb2RlIHN0cmluZ3MuICAoVGhpcyBiZWhhdmlvciB3YXMgYWRkZWQgZWFybGllcgorICB0byB0aGUgV2luZG93cyBOVC8yay9YUCB2ZXJzaW9uIG9mIG9zLmxpc3RkaXIoKS4pCisKKy0gRGlzdHV0aWxzOiBib3RoICdweV9tb2R1bGVzJyBhbmQgJ3BhY2thZ2VzJyBrZXl3b3JkcyBjYW4gbm93IGJlIHNwZWNpZmllZAorICBpbiBjb3JlLnNldHVwKCkuICBQcmV2aW91c2x5IHlvdSBjb3VsZCBzdXBwbHkgb25lIG9yIHRoZSBvdGhlciwgYnV0CisgIG5vdCBib3RoIG9mIHRoZW0uICAoU0YgcGF0Y2ggIzY5NTA5MCBmcm9tIEJlcm5oYXJkIEhlcnpvZykKKworLSBOZXcgY3N2IHBhY2thZ2UgbWFrZXMgaXQgZWFzeSB0byByZWFkL3dyaXRlIENTViBmaWxlcy4KKworLSBNb2R1bGUgc2hsZXggaGFzIGJlZW4gZXh0ZW5kZWQgdG8gYWxsb3cgcG9zaXgtbGlrZSBzaGVsbCBwYXJzaW5ncywKKyAgaW5jbHVkaW5nIGEgc3BsaXQoKSBmdW5jdGlvbiBmb3IgZWFzeSBzcGxpdGluZyBvZiBxdW90ZWQgc3RyaW5ncyBhbmQKKyAgY29tbWFuZHMuIEFuIGl0ZXJhdG9yIGludGVyZmFjZSB3YXMgYWxzbyBpbXBsZW1lbnRlZC4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gTmV3IHNjcmlwdCBjb21iaW5lcmVmcy5weSBoZWxwcyBhbmFseXplIG5ldyBQWVRIT05EVU1QUkVGUyBvdXRwdXQuCisgIFNlZSB0aGUgbW9kdWxlIGRvY3N0cmluZyBmb3IgZGV0YWlscy4KKworQnVpbGQKKy0tLS0tCisKKy0gRml4IHByb2JsZW0gYnVpbGRpbmcgb24gT1NGMSBiZWNhdXNlIHRoZSBjb21waWxlciBvbmx5IGFjY2VwdGVkCisgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQgc3RhcnQgaW4gY29sdW1uIDEuICAoU0YgYnVnICM2OTE3OTMuKQorCitDIEFQSQorLS0tLS0KKworLSBBZGRlZCBQeUdDX0NvbGxlY3QoKSwgZXF1aXZhbGVudCB0byBjYWxsaW5nIGdjLmNvbGxlY3QoKS4KKworLSBQeVRocmVhZFN0YXRlX0dldERpY3QoKSB3YXMgY2hhbmdlZCBub3QgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIG9yCisgIGlzc3VlIGEgZmF0YWwgZXJyb3Igd2hlbiBubyBjdXJyZW50IHRocmVhZCBzdGF0ZSBpcyBhdmFpbGFibGUuICBUaGlzCisgIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHByaW50IGRpY3Rpb25hcmllcyB3aGVuIG5vIHRocmVhZCBpcyBhY3RpdmUuCisKKy0gTE9OR19MT05HIHdhcyByZW5hbWVkIHRvIFBZX0xPTkdfTE9ORy4gIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhpcyBhbmQKKyAgbmVlZCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgY2FuIHVzZSB0aGlzOgorCisgICAgI2lmbmRlZiAgUFlfTE9OR19MT05HCisgICAgI2RlZmluZSAgUFlfTE9OR19MT05HICBMT05HX0xPTkcKKyAgICAjZW5kaWYKKworLSBBZGRlZCBQeU9iamVjdF9TZWxmSXRlcigpIHRvIGZpbGwgdGhlIHRwX2l0ZXIgc2xvdCBmb3IgdGhlCisgIHR5cGljYWwgY2FzZSB3aGVyZSB0aGUgbWV0aG9kIHJldHVybnMgaXRzIHNlbGYgYXJndW1lbnQuCisKKy0gVGhlIGV4dGVuZGVkIHR5cGUgc3RydWN0dXJlIHVzZWQgZm9yIGhlYXAgdHlwZXMgKG5ldy1zdHlsZQorICBjbGFzc2VzIGRlZmluZWQgYnkgUHl0aG9uIGNvZGUgdXNpbmcgYSBjbGFzcyBzdGF0ZW1lbnQpIGlzIG5vdworICBleHBvcnRlZCBmcm9tIG9iamVjdC5oIGFzIFB5SGVhcFR5cGVPYmplY3QuICAoU0YgcGF0Y2ggIzY5NjE5My4pCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworTm9uZSB0aGlzIHRpbWUuCisKK1Rlc3RzCistLS0tLQorCistIHRlc3RfdGltZW91dCBub3cgcmVxdWlyZXMgLXUgbmV0d29yayB0byBiZSBwYXNzZWQgdG8gcmVncnRlc3QgdG8gcnVuLgorICBTZWUgU0YgYnVnICM2OTI5ODguCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBvcy5mc3luYygpIG5vdyBleGlzdHMgb24gV2luZG93cywgYW5kIGNhbGxzIHRoZSBNaWNyb3NvZnQgX2NvbW1pdCgpCisgIGZ1bmN0aW9uLgorCistIE5ldyBmdW5jdGlvbiB3aW5zb3VuZC5NZXNzYWdlQmVlcCgpIHdyYXBzIHRoZSBXaW4zMiBBUEkKKyAgTWVzc2FnZUJlZXAoKS4KKworTWFjCistLS0KKworLSBvcy5saXN0ZGlyKCkgbm93IHJldHVybnMgVW5pY29kZSBzdHJpbmdzIG9uIE1hY09TIFggd2hlbiBjYWxsZWQgd2l0aAorICBhIFVuaWNvZGUgYXJndW1lbnQuIFNlZSB0aGUgZ2VuZXJhbCBuZXdzIGl0ZW0gdW5kZXIgIkxpYnJhcnkiLgorCistIEEgbmV3IG1ldGhvZCBNYWNPUy5XTUF2YWlsYWJsZSgpIHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIGFjY2VzcworICB0aGUgd2luZG93IG1hbmFnZXIsIGZhbHNlIG90aGVyd2lzZS4KKworLSBFYXN5RGlhbG9ncyBkaWFsb2dzIGFyZSBub3cgbW92YWJsZS1tb2RhbCwgYW5kIGlmIHRoZSBhcHBsaWNhdGlvbiBpcworICBjdXJyZW50bHkgaW4gdGhlIGJhY2tncm91bmQgdGhleSB3aWxsIGFzayB0byBiZSBtb3ZlZCB0byB0aGUgZm9yZWdyb3VuZAorICBiZWZvcmUgZGlzcGxheWluZy4KKworLSBPU0EgU2NyaXB0aW5nIHN1cHBvcnQgaGFzIGltcHJvdmVkIGEgbG90LCBhbmQgZ2Vuc3VpdGVtb2R1bGUucHkgY2FuIG5vdworICBiZSB1c2VkIGJ5IG1lcmUgbW9ydGFscy4gVGhlIGRvY3VtZW50YXRpb24gaXMgbm93IGFsc28gbW9yZSBvciBsZXNzCisgIGNvbXBsZXRlLgorCistIFRoZSBJREUgKGluIGEgZnJhbWV3b3JrIGJ1aWxkKSBub3cgaW5jbHVkZXMgaW50cm9kdWN0b3J5IGRvY3VtZW50YXRpb24KKyAgaW4gQXBwbGUgSGVscCBWaWV3ZXIgZm9ybWF0LgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBhbHBoYSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE5LUZlYi0yMDAzKgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBOZWdhdGl2ZSBwb3NpdGlvbnMgcmV0dXJuZWQgZnJvbSBQRVAgMjkzIGVycm9yIGNhbGxiYWNrcyBhcmUgbm93CisgIHRyZWF0ZWQgYXMgYmVpbmcgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLiBQb3NpdGlvbnMKKyAgdGhhdCBhcmUgb3V0IG9mIGJvdW5kcyByYWlzZSBhbiBJbmRleEVycm9yLgorCistIHN5cy5wYXRoWzBdICh0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIHNjcmlwdCBpcyBsb2FkZWQpIGlzIG5vdworICB0dXJuZWQgaW50byBhbiBhYnNvbHV0ZSBwYXRobmFtZSwgdW5sZXNzIGl0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCisgIChTRiBwYXRjaCAjNjY0Mzc2LikKKworLSBGaW5hbGx5IGZpeGVkIHRoZSBidWcgaW4gY29tcGlsZSgpIGFuZCBleGVjIHdoZXJlIGEgc3RyaW5nIGVuZGluZworICB3aXRoIGFuIGluZGVudGVkIGNvZGUgYmxvY2sgYnV0IG5vIG5ld2xpbmUgd291bGQgcmFpc2UgU3ludGF4RXJyb3IuCisgIFRoaXMgd291bGQgaGF2ZSBiZWVuIGEgZm91ci1saW5lIGNoYW5nZSBpbiBwYXJzZXRvay5jLi4uICBFeGNlcHQKKyAgY29kZW9wLnB5IGRlcGVuZHMgb24gdGhpcyBiZWhhdmlvciwgc28gYSBjb21waWxhdGlvbiBmbGFnIGhhZCB0byBiZQorICBpbnZlbnRlZCB0aGF0IGNhdXNlcyB0aGUgdG9rZW5pemVyIHRvIHJldmVydCB0byB0aGUgb2xkIGJlaGF2aW9yOworICB0aGlzIHJlcXVpcmVkIGV4dHJhIGNoYW5nZXMgdG8gMiAuaCBmaWxlcywgMiAuYyBmaWxlcywgYW5kIDIgLnB5CisgIGZpbGVzLiAgKEZpeGVzIFNGIGJ1ZyAjNTAxNjIyLikKKworLSBJZiBhIG5ldy1zdHlsZSBjbGFzcyBkZWZpbmVzIG5laXRoZXIgX19uZXdfXyBub3IgX19pbml0X18sIGl0cworICBjb25zdHJ1Y3RvciB3b3VsZCBpZ25vcmUgYWxsIGFyZ3VtZW50cy4gIFRoaXMgaXMgY2hhbmdlZCBub3c6IHRoZQorICBjb25zdHJ1Y3RvciByZWZ1c2VzIGFyZ3VtZW50cyBpbiB0aGlzIGNhc2UuICBUaGlzIG1pZ2h0IGJyZWFrIGNvZGUKKyAgdGhhdCB3b3JrZWQgdW5kZXIgUHl0aG9uIDIuMi4gIFRoZSBzaW1wbGVzdCBmaXggaXMgdG8gYWRkIGEgbm8tb3AKKyAgX19pbml0X186IGBgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KTogcGFzc2BgLgorCistIFRocm91Z2ggYSBieXRlY29kZSBvcHRpbWl6ZXIgYnVnIChhbmQgSSBiZXQgeW91IGRpZG4ndCBldmVuIGtub3cKKyAgUHl0aG9uICpoYWQqIGEgYnl0ZWNvZGUgb3B0aW1pemVyIDotKSwgInVuc2lnbmVkIiBoZXgvb2N0IGNvbnN0YW50cworICB3aXRoIGEgbGVhZGluZyBtaW51cyBzaWduIHdvdWxkIGNvbWUgb3V0IHdpdGggdGhlIHdyb25nIHNpZ24uCisgICgiVW5zaWduZWQiIGhleC9vY3QgY29uc3RhbnRzIGFyZSB0aG9zZSB3aXRoIGEgZmFjZSB2YWx1ZSBpbiB0aGUKKyAgcmFuZ2Ugc3lzLm1heGludCsxIHRocm91Z2ggc3lzLm1heGludCoyKzEsIGluY2x1c2l2ZTsgdGhlc2UgaGF2ZQorICBhbHdheXMgYmVlbiBpbnRlcnByZXRlZCBhcyBuZWdhdGl2ZSBudW1iZXJzIHRocm91Z2ggc2lnbiBmb2xkaW5nLikKKyAgRS5nLiAweGZmZmZmZmZmIGlzIC0xLCBhbmQgLSgweGZmZmZmZmZmKSBpcyAxLCBidXQgLTB4ZmZmZmZmZmYgd291bGQKKyAgY29tZSBvdXQgYXMgLTQyOTQ5NjcyOTUuICBUaGlzIHdhcyB0aGUgY2FzZSBpbiBQeXRob24gMi4yIHRocm91Z2gKKyAgMi4yLjIgYW5kIDIuM2ExLCBhbmQgaW4gUHl0aG9uIDIuNCBpdCB3aWxsIG9uY2UgYWdhaW4gaGF2ZSB0aGF0CisgIHZhbHVlLCBidXQgYWNjb3JkaW5nIHRvIFBFUCAyMzcgaXQgcmVhbGx5IG5lZWRzIHRvIGJlIDEgbm93LiAgVGhpcworICB3aWxsIGJlIGJhY2twb3J0ZWQgdG8gUHl0aG9uIDIuMi4zIGEgd2VsbC4gIChTRiAjNjYwNDU1KQorCistIGludChzLCBiYXNlKSBzb21ldGltZXMgc2lnbi1mb2xkcyBoZXggYW5kIG9jdCBjb25zdGFudHM7IGl0IG9ubHkKKyAgZG9lcyB0aGlzIHdoZW4gYmFzZSBpcyAwIGFuZCBzLnN0cmlwKCkgc3RhcnRzIHdpdGggYSAnMCcuICBXaGVuIHRoZQorICBzaWduIGlzIGFjdHVhbGx5IGZvbGRlZCwgYXMgaW4gaW50KCIweGZmZmZmZmZmIiwgMCkgb24gYSAzMi1iaXQKKyAgbWFjaGluZSwgd2hpY2ggcmV0dXJucyAtMSwgYSBGdXR1cmVXYXJuaW5nIGlzIG5vdyBpc3N1ZWQ7IGluIFB5dGhvbgorICAyLjQsIHRoaXMgd2lsbCByZXR1cm4gNDI5NDk2NzI5NUwsIGFzIGRvIGludCgiKzB4ZmZmZmZmZmYiLCAwKSBhbmQKKyAgaW50KCIweGZmZmZmZmZmIiwgMTYpIHJpZ2h0IG5vdy4gIChQRVAgMzQ3KQorCistIHN1cGVyKFgsIHgpOiB4IG1heSBub3cgYmUgYSBwcm94eSBmb3IgYW4gWCBpbnN0YW5jZSwgaS5lLgorICBpc3N1YmNsYXNzKHguX19jbGFzc19fLCBYKSBidXQgbm90IGlzc3ViY2xhc3ModHlwZSh4KSwgWCkuCisKKy0gaXNpbnN0YW5jZSh4LCBYKTogaWYgWCBpcyBhIG5ldy1zdHlsZSBjbGFzcywgdGhpcyBpcyBub3cgZXF1aXZhbGVudAorICB0byBpc3N1YmNsYXNzKHR5cGUoeCksIFgpIG9yIGlzc3ViY2xhc3MoeC5fX2NsYXNzX18sIFgpLiAgUHJldmlvdXNseQorICBvbmx5IHR5cGUoeCkgd2FzIHRlc3RlZC4gIChGb3IgY2xhc3NpYyBjbGFzc2VzIHRoaXMgd2FzIGFscmVhZHkgdGhlCisgIGNhc2UuKQorCistIGNvbXBpbGUoKSwgZXZhbCgpIGFuZCB0aGUgZXhlYyBzdGF0ZW1lbnQgbm93IGZ1bGx5IHN1cHBvcnQgc291cmNlIGNvZGUKKyAgcGFzc2VkIGFzIHVuaWNvZGUgc3RyaW5ncy4KKworLSBpbnQgc3ViY2xhc3NlcyBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBsb25ncyBpZiB0aGUgdmFsdWUgZml0cyBpbiBhbiBpbnQuCisgIFNlZSBTRiBidWcgIzY4MzQ2Ny4KKworLSBsb25nKHN0cmluZywgYmFzZSkgdGFrZXMgdGltZSBsaW5lYXIgaW4gbGVuKHN0cmluZykgd2hlbiBiYXNlIGlzIGEgcG93ZXIKKyAgb2YgMiBub3cuICBJdCB1c2VkIHRvIHRha2UgdGltZSBxdWFkcmF0aWMgaW4gbGVuKHN0cmluZykuCisKKy0gZmlsdGVyIHJldHVybnMgbm93IFVuaWNvZGUgcmVzdWx0cyBmb3IgVW5pY29kZSBhcmd1bWVudHMuCisKKy0gcmF3X2lucHV0IGNhbiBub3cgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cy4KKworLSBMaXN0IG9iamVjdHMnIHNvcnQoKSBtZXRob2Qgbm93IGFjY2VwdHMgTm9uZSBhcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi4KKyAgUGFzc2luZyBOb25lIGlzIHNlbWFudGljYWxseSBpZGVudGljYWwgdG8gY2FsbGluZyBzb3J0KCkgd2l0aCBubworICBhcmd1bWVudHMuCisKKy0gRml4ZWQgY3Jhc2ggd2hlbiBwcmludGluZyBhIHN1YmNsYXNzIG9mIHN0ciBhbmQgX19zdHJfXyByZXR1cm5lZCBzZWxmLgorICBTZWUgU0YgYnVnICM2NjcxNDcuCisKKy0gRml4ZWQgYW4gaW52YWxpZCBSdW50aW1lV2FybmluZyBhbmQgYW4gdW5kZXRlY3RlZCBlcnJvciB3aGVuIHRyeWluZworICB0byBjb252ZXJ0IGEgbG9uZyBpbnRlZ2VyIGludG8gYSBmbG9hdCB3aGljaCBjb3VsZG4ndCBmaXQuCisgIFNlZSBTRiBidWcgIzY3NjE1NS4KKworLSBGdW5jdGlvbiBvYmplY3RzIG5vdyBoYXZlIGEgX19tb2R1bGVfXyBhdHRyaWJ1dGUgdGhhdCBpcyBib3VuZCB0bworICB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gIFRoaXMKKyAgYXBwbGllcyBmb3IgQyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgYXMgd2VsbCBhcyBmdW5jdGlvbnMgYW5kIG1ldGhvZHMKKyAgZGVmaW5lZCBpbiBQeXRob24uICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGJ5IHBpY2tsZS53aGljaG1vZHVsZSgpLAorICB3aGljaCBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB3aGljaG1vZHVsZSBzbGlnaHRseS4gIEluIFB5dGhvbiAyLjIKKyAgd2hpY2htb2R1bGUoKSByZXR1cm5zICJfX21haW5fXyIgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgZGVmaW5lZAorICBhdCB0aGUgdG9wLWxldmVsIG9mIGEgbW9kdWxlIChleGFtcGxlczogbWV0aG9kcywgbmVzdGVkIGZ1bmN0aW9ucykuCisgIE5vdyB3aGljaG1vZHVsZSgpIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXIgbW9kdWxlIG5hbWUuCisKK0V4dGVuc2lvbiBtb2R1bGVzCistLS0tLS0tLS0tLS0tLS0tLQorCistIG9wZXJhdG9yLmlzTnVtYmVyVHlwZSgpIG5vdyBjaGVja3MgdGhhdCB0aGUgb2JqZWN0IGhhcyBhIG5iX2ludCBvcgorICBuYl9mbG9hdCBzbG90LCByYXRoZXIgdGhhbiBzaW1wbHkgY2hlY2tpbmcgd2hldGhlciBpdCBoYXMgYSBub24tTlVMTAorICB0cF9hc19udW1iZXIgcG9pbnRlci4KKworLSBUaGUgaW1wIG1vZHVsZSBub3cgaGFzIHdheXMgdG8gYWNxdWlyZSBhbmQgcmVsZWFzZSB0aGUgImltcG9ydAorICBsb2NrIjogaW1wLmFjcXVpcmVfbG9jaygpIGFuZCBpbXAucmVsZWFzZV9sb2NrKCkuICBOb3RlOiB0aGlzIGlzIGEKKyAgcmVlbnRyYW50IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgbG9jayBvbmx5IHRydWx5IHJlbGVhc2VzIGl0IHdoZW4KKyAgdGhpcyBpcyB0aGUgbGFzdCByZWxlYXNlX2xvY2soKSBjYWxsLiAgWW91IGNhbiBjaGVjayB3aXRoCisgIGltcC5sb2NrX2hlbGQoKS4gIChTRiBidWcgIzU4MDk1MiBhbmQgcGF0Y2ggIzY4MzI1Ny4pCisKKy0gQ2hhbmdlIHRvIGNQaWNrbGUgdG8gbWF0Y2ggcGlja2xlLnB5IChzZWUgYmVsb3cgYW5kIFBFUCAzMDcpLgorCistIEZpeCBzb21lIGJ1Z3MgaW4gdGhlIHBhcnNlciBtb2R1bGUuICBTRiBidWcgIzY3ODUxOC4KKworLSBUaGFua3MgdG8gU2NvdHQgRGF2aWQgRGFuaWVscywgYSBzdWJ0bGUgYnVnIGluIGhvdyB0aGUgemxpYgorICBleHRlbnNpb24gaW1wbGVtZW50ZWQgZmx1c2goKSB3YXMgZml4ZWQuICBTY290dCBhbHNvIHJld3JvdGUgdGhlCisgIHpsaWIgdGVzdCBzdWl0ZSB1c2luZyB0aGUgdW5pdHRlc3QgbW9kdWxlLiAgKFNGIGJ1ZyAjNjQwMjMwIGFuZAorICBwYXRjaCAjNjc4NTMxLikKKworLSBBZGRlZCBhbiBpdGVydG9vbHMgbW9kdWxlIGNvbnRhaW5pbmcgaGlnaCBzcGVlZCwgbWVtb3J5IGVmZmljaWVudAorICBsb29waW5nIGNvbnN0cnVjdHMgaW5zcGlyZWQgYnkgdG9vbHMgZnJvbSBIYXNrZWxsIGFuZCBTTUwuCisKKy0gVGhlIFNTTCBtb2R1bGUgbm93IGhhbmRsZXMgc29ja2V0cyB3aXRoIGEgdGltZW91dCBzZXQgY29ycmVjdGx5IChTRgorICBwYXRjaCAjNjc1NzUwLCBmaXhpbmcgU0YgYnVnICM2NzU1NTIpLgorCistIG9zL3Bvc2l4bW9kdWxlIGhhcyBncm93biB0aGUgc3lzZXhpdHMuaCBjb25zdGFudHMgKEVYX09LIGFuZCBmcmllbmRzKS4KKworLSBGaXhlZCBicm9rZW4gdGhyZWFkc3RhdGUgc3dhcCBpbiByZWFkbGluZSB0aGF0IGNvdWxkIGNhdXNlIGZhdGFsCisgIGVycm9ycyB3aGVuIGEgcmVhZGxpbmUgaG9vayB3YXMgYmVpbmcgaW52b2tlZCB3aGlsZSBhIGJhY2tncm91bmQKKyAgdGhyZWFkIHdhcyBhY3RpdmUuICAoU0YgYnVncyAjNjYwNDc2IGFuZCAjNTEzMDMzLikKKworLSBmY250bCBub3cgZXhwb3NlcyB0aGUgc3Ryb3BzLmggSV8qIGNvbnN0YW50cy4KKworLSBGaXggYSBjcmFzaCBvbiBTb2xhcmlzIHRoYXQgb2NjdXJyZWQgd2hlbiBjYWxsaW5nIGNsb3NlKCkgb24KKyAgYW4gbW1hcCdlZCBmaWxlIHdoaWNoIHdhcyBhbHJlYWR5IGNsb3NlZC4gIChTRiBwYXRjaCAjNjY1OTEzKQorCistIEZpeGVkIHNldmVyYWwgc2VyaW91cyBidWdzIGluIHRoZSB6aXBpbXBvcnQgaW1wbGVtZW50YXRpb24uCisKKy0gZGF0ZXRpbWUgY2hhbmdlczoKKworICBUaGUgZGF0ZSBjbGFzcyBpcyBub3cgcHJvcGVybHkgc3ViY2xhc3NhYmxlLiAgKFNGIGJ1ZyAjNzIwOTA4KQorCisgIFRoZSBkYXRldGltZSBhbmQgZGF0ZXRpbWV0eiBjbGFzc2VzIGhhdmUgYmVlbiBjb2xsYXBzZWQgaW50byBhIHNpbmdsZQorICBkYXRldGltZSBjbGFzcywgYW5kIGxpa2V3aXNlIHRoZSB0aW1lIGFuZCB0aW1ldHogY2xhc3NlcyBpbnRvIGEgc2luZ2xlCisgIHRpbWUgY2xhc3MuICBQcmV2aW91c2x5LCBhIGRhdGV0aW1ldHogb2JqZWN0IHdpdGggdHppbmZvPU5vbmUgYWN0ZWQKKyAgZXhhY3RseSBsaWtlIGEgZGF0ZXRpbWUgb2JqZWN0LCBhbmQgc2ltaWxhcmx5IGZvciB0aW1ldHouICBUaGlzIHdhc24ndAorICBlbm91Z2ggb2YgYSBkaWZmZXJlbmNlIHRvIGp1c3RpZnkgZGlzdGluY3QgY2xhc3NlcywgYW5kIGxpZmUgaXMgc2ltcGxlcgorICBub3cuCisKKyAgdG9kYXkoKSBhbmQgbm93KCkgbm93IHJvdW5kIHN5c3RlbSB0aW1lc3RhbXBzIHRvIHRoZSBjbG9zZXN0CisgIG1pY3Jvc2Vjb25kIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjYxMDg2Pi4gIFRoaXMgcmVwYWlycyBhbgorICBpcnJpdGF0aW9uIG1vc3QgbGlrZWx5IHNlZW4gb24gV2luZG93cyBzeXN0ZW1zLgorCisgIEluIGR0LmFzdGltZXpvbmUodHopLCBpZiB0ei51dGNvZmZzZXQoZHQpIHJldHVybnMgYSBkdXJhdGlvbiwKKyAgVmFsdWVFcnJvciBpcyByYWlzZWQgaWYgdHouZHN0KGR0KSByZXR1cm5zIE5vbmUgKDIuM2ExIHRyZWF0ZWQgaXQKKyAgYXMgMCBpbnN0ZWFkLCBidXQgYSB0emluZm8gc3ViY2xhc3Mgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbgorICB0aW1lIHpvbmUgY29udmVyc2lvbiBoYXMgdG8gdGFrZSBhIHN0YW5kIG9uIHdoZXRoZXIgaXQgc3VwcG9ydHMKKyAgRFNUOyBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBEU1QsIHRoZW4gY29kZSBkc3QoKSB0byByZXR1cm4gMCBtaW51dGVzLAorICBtZWFuaW5nIHRoYXQgRFNUIGlzIG5ldmVyIGluIGVmZmVjdCkuCisKKyAgVGhlIHR6aW5mbyBtZXRob2RzIHV0Y29mZnNldCgpIGFuZCBkc3QoKSBtdXN0IHJldHVybiBhIHRpbWVkZWx0YSBvYmplY3QKKyAgKG9yIE5vbmUpIG5vdy4gIEluIDIuM2ExIHRoZXkgY291bGQgYWxzbyByZXR1cm4gYW4gaW50IG9yIGxvbmcsIGJ1dCB0aGF0CisgIHdhcyBhbiB1bmhlbHBmdWxseSByZWR1bmRhbnQgbGVmdG92ZXIgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gd2hlcmVpbgorICB0aGV5IGNvdWxkbid0IHJldHVybiBhIHRpbWVkZWx0YS4gIFRPT1dUREkuCisKKyAgVGhlIGV4YW1wbGUgdHppbmZvIGNsYXNzIGZvciBsb2NhbCB0aW1lIGhhZCBhIGJ1Zy4gIEl0IHdhcyByZXBsYWNlZAorICBieSBhIGxhdGVyIGV4YW1wbGUgY29kZWQgYnkgR3VpZG8uCisKKyAgZGF0ZXRpbWUuYXN0aW1lem9uZSh0eikgbm8gbG9uZ2VyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiB0aGUKKyAgaW5wdXQgZGF0ZXRpbWUgaGFzIG5vIFVUQyBlcXVpdmFsZW50IGluIHR6LiAgRm9yIHR5cGljYWwgImh5YnJpZCIgdGltZQorICB6b25lcyAoYSBzaW5nbGUgdHppbmZvIHN1YmNsYXNzIG1vZGVsaW5nIGJvdGggc3RhbmRhcmQgYW5kIGRheWxpZ2h0CisgIHRpbWUpLCB0aGlzIGNhc2UgY2FuIGFyaXNlIG9uZSBob3VyIHBlciB5ZWFyLCBhdCB0aGUgaG91ciBkYXlsaWdodCB0aW1lCisgIGVuZHMuICBTZWUgbmV3IGRvY3MgZm9yIGRldGFpbHMuICBJbiBzaG9ydCwgdGhlIG5ldyBiZWhhdmlvciBtaW1pY3MKKyAgdGhlIGxvY2FsIHdhbGwgY2xvY2sncyBiZWhhdmlvciBvZiByZXBlYXRpbmcgYW4gaG91ciBpbiBsb2NhbCB0aW1lLgorCisgIGR0LmFzdGltZXpvbmUoKSBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIG5haXZlIGFuZCBhd2FyZQorICBkYXRldGltZSBvYmplY3RzLiAgSWYgeW91IG1lcmVseSB3YW50IHRvIGF0dGFjaCwgb3IgcmVtb3ZlLCBhIHR6aW5mbworICBvYmplY3QsIHdpdGhvdXQgYW55IGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLCB1c2UKKyAgZHQucmVwbGFjZSh0emluZm89d2hhdGV2ZXIpIGluc3RlYWQsIHdoZXJlICJ3aGF0ZXZlciIgaXMgTm9uZSBvciBhCisgIHR6aW5mbyBzdWJjbGFzcyBpbnN0YW5jZS4KKworICBBIG5ldyBtZXRob2QgdHppbmZvLmZyb211dGMoZHQpIGNhbiBiZSBvdmVycmlkZGVuIGluIHR6aW5mbyBzdWJjbGFzc2VzCisgIHRvIGdpdmUgY29tcGxldGUgY29udHJvbCBvdmVyIGhvdyBhIFVUQyB0aW1lIGlzIHRvIGJlIGNvbnZlcnRlZCB0bworICBhIGxvY2FsIHRpbWUuICBUaGUgZGVmYXVsdCBhc3RpbWV6b25lKCkgaW1wbGVtZW50YXRpb24gY2FsbHMgZnJvbXV0YygpCisgIGFzIGl0cyBsYXN0IHN0ZXAsIHNvIGEgdHppbmZvIHN1YmNsYXNzIGNhbiBhZmZlY3QgdGhhdCB0b28gYnkgb3ZlcnJpZGluZworICBmcm9tdXRjKCkuICBJdCdzIGV4cGVjdGVkIHRoYXQgdGhlIGRlZmF1bHQgZnJvbXV0YygpIGltcGxlbWVudGF0aW9uIHdpbGwKKyAgYmUgc3VpdGFibGUgYXMtaXMgZm9yICJhbG1vc3QgYWxsIiB0aW1lIHpvbmUgc3ViY2xhc3NlcywgYnV0IHRoZQorICBjcmVhdGl2aXR5IG9mIHBvbGl0aWNhbCB0aW1lIHpvbmUgZmlkZGxpbmcgYXBwZWFycyB1bmJvdW5kZWQgLS0gZnJvbXV0YygpCisgIGFsbG93cyB0aGUgaGlnaGx5IG1vdGl2YXRlZCB0byBlbXVsYXRlIGFueSBzY2hlbWUgZXhwcmVzc2libGUgaW4gUHl0aG9uLgorCisgIGRhdGV0aW1lLm5vdygpOiAgVGhlIG9wdGlvbmFsIHR6aW5mbyBhcmd1bWVudCB3YXMgdW5kb2N1bWVudGVkICh0aGF0J3MKKyAgcmVwYWlyZWQpLCBhbmQgaXRzIG5hbWUgd2FzIGNoYW5nZWQgdG8gdHogKCJ0emluZm8iIGlzIG92ZXJsb2FkZWQgZW5vdWdoCisgIGFscmVhZHkpLiAgV2l0aCBhIHR6IGFyZ3VtZW50LCBub3codHopIHVzZWQgdG8gcmV0dXJuIHRoZSBsb2NhbCBkYXRlCisgIGFuZCB0aW1lLCBhbmQgYXR0YWNoIHR6IHRvIGl0LCB3aXRob3V0IGFueSBjb252ZXJzaW9uIG9mIGRhdGUgYW5kIHRpbWUKKyAgbWVtYmVycy4gIFRoaXMgd2FzIGxlc3MgdGhhbiB1c2VmdWwuICBOb3cgbm93KHR6KSByZXR1cm5zIHRoZSBjdXJyZW50CisgIGRhdGUgYW5kIHRpbWUgYXMgbG9jYWwgdGltZSBpbiB0eidzIHRpbWUgem9uZSwgYWtpbiB0byA6OgorCisgICAgICB0ei5mcm9tdXRjKGRhdGV0aW1lLnV0Y25vdygpLnJlcGxhY2UodHppbmZvPXV0YykpCisKKyAgd2hlcmUgInV0YyIgaXMgYW4gaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MgbW9kZWxpbmcgVVRDLiAgV2l0aG91dAorICBhIHR6IGFyZ3VtZW50LCBub3coKSBjb250aW51ZXMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IGxvY2FsIGRhdGUgYW5kIHRpbWUsCisgIGFzIGEgbmFpdmUgZGF0ZXRpbWUgb2JqZWN0LgorCisgIGRhdGV0aW1lLmZyb210aW1lc3RhbXAoKTogIExpa2UgZGF0ZXRpbWUubm93KCkgYWJvdmUsIHRoaXMgaGFkIGxlc3MgdGhhbgorICB1c2VmdWwgYmVoYXZpb3Igd2hlbiB0aGUgb3B0aW9uYWwgdGluem8gYXJndW1lbnQgd2FzIHNwZWNpZmllZC4gIFNlZQorICBhbHNvIFNGIGJ1ZyByZXBvcnQgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82NjA4NzI+LgorCisgIGRhdGUgYW5kIGRhdGV0aW1lIGNvbXBhcmlzb246ICBJbiBvcmRlciB0byBwcmV2ZW50IGNvbXBhcmlzb24gZnJvbQorICBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3QtYWRkcmVzc2VzIHN0cmF0ZWd5LCB0aGVzZQorICByYWlzZWQgVHlwZUVycm9yIHdoZW5ldmVyIHRoZXkgZGlkbid0IHVuZGVyc3RhbmQgdGhlIG90aGVyIG9iamVjdCB0eXBlLgorICBUaGV5IHN0aWxsIGRvLCBleGNlcHQgd2hlbiB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhICJ0aW1ldHVwbGUiIGF0dHJpYnV0ZSwKKyAgaW4gd2hpY2ggY2FzZSB0aGV5IHJldHVybiBOb3RJbXBsZW1lbnRlZCBub3cuICBUaGlzIGdpdmVzIG90aGVyCisgIGRhdGV0aW1lIG9iamVjdHMgKGUuZy4sIG14RGF0ZVRpbWUpIGEgY2hhbmNlIHRvIGludGVyY2VwdCB0aGUKKyAgY29tcGFyaXNvbi4KKworICBkYXRlLCB0aW1lLCBkYXRldGltZSBhbmQgdGltZWRlbHRhIGNvbXBhcmlzb246ICBXaGVuIHRoZSBleGNlcHRpb24KKyAgZm9yIG1peGVkLXR5cGUgY29tcGFyaXNvbnMgaW4gdGhlIGxhc3QgcGFyYWdyYXBoIGRvZXNuJ3QgYXBwbHksIGlmCisgIHRoZSBjb21wYXJpc29uIGlzID09IHRoZW4gRmFsc2UgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgY29tcGFyaXNvbiBpcworICAhPSB0aGVuIFRydWUgaXMgcmV0dXJuZWQuICBCZWNhdXNlIGRpY3QgbG9va3VwIGFuZCB0aGUgImluIiBvcGVyYXRvcgorICBvbmx5IGludm9rZSBfX2VxX18sIHRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgOjoKKworICAgICAgaWYgc29tZV9kYXRldGltZSBpbiBzb21lX3NlcXVlbmNlOgorCisgIGFuZCA6OgorCisgICAgICBzb21lX2RpY3Rbc29tZV90aW1lZGVsdGFdID0gd2hhdGV2ZXIKKworICB0byB3b3JrIGFzIGV4cGVjdGVkLCB3aXRob3V0IHJhaXNpbmcgVHlwZUVycm9yIGp1c3QgYmVjYXVzZSB0aGUKKyAgc2VxdWVuY2UgaXMgaGV0ZXJvZ2VuZW91cywgb3IgdGhlIGRpY3QgaGFzIG1peGVkLXR5cGUga2V5cy4gIFtUaGlzCisgIHNlZW1zIGxpa2UgYSBnb29kIGlkZWEgdG8gaW1wbGVtZW50IGZvciBhbGwgbWl4ZWQtdHlwZSBjb21wYXJpc29ucworICB0aGF0IGRvbid0IHdhbnQgdG8gYWxsb3cgZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi5dCisKKyAgVGhlIGNvbnN0cnVjdG9ycyBidWlsZGluZyBhIGRhdGV0aW1lIGZyb20gYSB0aW1lc3RhbXAgY291bGQgcmFpc2UKKyAgVmFsdWVFcnJvciBpZiB0aGUgcGxhdGZvcm0gQyBsb2NhbHRpbWUoKS9nbXRpbWUoKSBpbnNlcnRlZCAibGVhcAorICBzZWNvbmRzIi4gIExlYXAgc2Vjb25kcyBhcmUgaWdub3JlZCBub3cuICBPbiBzdWNoIHBsYXRmb3JtcywgaXQncworICBwb3NzaWJsZSB0byBoYXZlIHRpbWVzdGFtcHMgdGhhdCBkaWZmZXIgYnkgYSBzZWNvbmQsIHlldCB3aGVyZQorICBkYXRldGltZXMgY29uc3RydWN0ZWQgZnJvbSB0aGVtIGFyZSBlcXVhbC4KKworICBUaGUgcGlja2xlIGZvcm1hdCBvZiBkYXRlLCB0aW1lIGFuZCBkYXRldGltZSBvYmplY3RzIGhhcyBjaGFuZ2VkCisgIGNvbXBsZXRlbHkuICBUaGUgdW5kb2N1bWVudGVkIHBpY2tsZXIgYW5kIHVucGlja2xlciBmdW5jdGlvbnMgbm8KKyAgbG9uZ2VyIGV4aXN0LiAgVGhlIHVuZG9jdW1lbnRlZCBfX3NldHN0YXRlX18oKSBhbmQgX19nZXRzdGF0ZV9fKCkKKyAgbWV0aG9kcyBubyBsb25nZXIgZXhpc3QgZWl0aGVyLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gVGhlIGxvZ2dpbmcgbW9kdWxlIHdhcyB1cGRhdGVkIHNsaWdodGx5OyB0aGUgV0FSTiBsZXZlbCB3YXMgcmVuYW1lZAorICB0byBXQVJOSU5HLCBhbmQgdGhlIG1hdGNoaW5nIGZ1bmN0aW9uL21ldGhvZCB3YXJuKCkgdG8gd2FybmluZygpLgorCistIFRoZSBwaWNrbGUgYW5kIGNQaWNrbGUgbW9kdWxlcyB3ZXJlIHVwZGF0ZWQgd2l0aCBhIG5ldyBwaWNrbGluZworICBwcm90b2NvbCAoZG9jdW1lbnRlZCBieSBwaWNrbGV0b29scy5weSwgc2VlIGJlbG93KSBhbmQgc2V2ZXJhbAorICBleHRlbnNpb25zIHRvIHRoZSBwaWNrbGUgY3VzdG9taXphdGlvbiBBUEkgKF9fcmVkdWNlX18sIF9fc2V0c3RhdGVfXworICBldGMuKS4gIFRoZSBjb3B5IG1vZHVsZSBub3cgdXNlcyBtb3JlIG9mIHRoZSBwaWNrbGUgY3VzdG9taXphdGlvbgorICBBUEkgdG8gY29weSBvYmplY3RzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IF9fY29weV9fIG9yIF9fZGVlcGNvcHlfXy4KKyAgU2VlIFBFUCAzMDcgZm9yIGRldGFpbHMuCisKKy0gVGhlIGRpc3R1dGlscyAicmVnaXN0ZXIiIGNvbW1hbmQgbm93IHVzZXMgaHR0cDovL3d3dy5weXRob24ub3JnL3B5cGkKKyAgYXMgdGhlIGRlZmF1bHQgcmVwb3NpdG9yeS4gIChTZWUgUEVQIDMwMS4pCisKKy0gdGhlIHBsYXRmb3JtIGRlcGVuZGVudCBwYXRoIHJlbGF0ZWQgdmFyaWFibGVzIHNlcCwgYWx0c2VwLCBleHRzZXAsCisgIHBhdGhzZXAsIGN1cmRpciwgcGFyZGlyIGFuZCBkZWZwYXRoIGFyZSBub3cgZGVmaW5lZCBpbiB0aGUgcGxhdGZvcm0KKyAgZGVwZW5kZW50IHBhdGggbW9kdWxlcyAoZS5nLiBudHBhdGgucHkpIHJhdGhlciB0aGFuIG9zLnB5LCBzbyB0aGVzZQorICB2YXJpYWJsZXMgYXJlIG5vdyBhdmFpbGFibGUgdmlhIG9zLnBhdGguICBUaGV5IGNvbnRpbnVlIHRvIGJlCisgIGF2YWlsYWJsZSBmcm9tIHRoZSBvcyBtb2R1bGUuCisgIChzZWUgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82ODA3ODk+KS4KKworLSBhcnJheS5hcnJheSB3YXMgYWRkZWQgdG8gdGhlIHR5cGVzIHJlcHIucHkga25vd3MgYWJvdXQgKHNlZQorICA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzY4MDc4OT4pLgorCistIFRoZSBuZXcgcGlja2xldG9vbHMucHkgY29udGFpbnMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFib3V0IHBpY2tsZQorICBpbnRlcm5hbHMsIGFuZCBzdXBwbGllcyBzb21lIGhlbHBlcnMgZm9yIHdvcmtpbmcgd2l0aCBwaWNrbGVzLCBzdWNoIGFzCisgIGEgc3ltYm9saWMgcGlja2xlIGRpc2Fzc2VtYmxlci4KKworLSBYbWxycGNsaWIucHkgbm93IHN1cHBvcnRzIHRoZSBidWlsdGluIGJvb2xlYW4gdHlwZS4KKworLSBweV9jb21waWxlIGhhcyBhIG5ldyAnZG9yYWlzZScgZmxhZyBhbmQgYSBuZXcgUHlDb21waWxlRXJyb3IKKyAgZXhjZXB0aW9uLgorCistIFNpbXBsZVhNTFJQQ1NlcnZlciBub3cgc3VwcG9ydHMgQ0dJIHRocm91Z2ggdGhlIENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyCisgIGNsYXNzLgorCistIFRoZSBzZXRzIG1vZHVsZSBub3cgcmFpc2VzIFR5cGVFcnJvciBpbiBfX2NtcF9fLCB0byBjbGFyaWZ5IHRoYXQKKyAgc2V0cyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHRocmVlLXdheS1jb21wYXJlZDsgdGhlIGNvbXBhcmlzb24KKyAgb3BlcmF0b3JzIGFyZSBvdmVybG9hZGVkIGFzIHN1YnNldC9zdXBlcnNldCB0ZXN0cy4KKworLSBCYXN0aW9uLnB5IGFuZCByZXhlYy5weSBhcmUgZGlzYWJsZWQuICBUaGVzZSBtb2R1bGVzIGFyZSBub3Qgc2FmZSBpbgorICBQeXRob24gMi4yLiBvciAyLjMuCisKKy0gcmVhbHBhdGggaXMgbm93IGV4cG9ydGVkIHdoZW4gZG9pbmcgYGBmcm9tIHBveGl4cGF0aCBpbXBvcnQgKmBgLgorICBJdCBpcyBhbHNvIGV4cG9ydGVkIGZvciBudHBhdGgsIG1hY3BhdGgsIGFuZCBvczJlbXhwYXRoLgorICBTZWUgU0YgYnVnICM2NTkyMjguCisKKy0gTmV3IG1vZHVsZSB0YXJmaWxlIGZyb20gTGFycyBHdXN0w6RiZWwgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGludGVyZmFjZQorICB0byB0YXIgYXJjaGl2ZSBmaWxlcyB3aXRoIHRyYW5zcGFyZW50IGd6aXAgYW5kIGJ6aXAyIGNvbXByZXNzaW9uLgorICBTZWUgU0YgcGF0Y2ggIzY1MTA4Mi4KKworLSB1cmxwYXJzZSBjYW4gbm93IHBhcnNlIGltYXA6Ly8gVVJMcy4gIFNlZSBTRiBmZWF0dXJlIHJlcXVlc3QgIzYxODAyNC4KKworLSBUa2ludGVyLkNhbnZhcy5zY2FuX2RyYWd0bygpIHByb3ZpZGVzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzdXBwb3J0CisgIHRoZSBnYWluIHZhbHVlIHdoaWNoIGlzIHBhc3NlZCB0byBUay4gIFNGIGJ1ZyMgNjAyMjU5LgorCistIEZpeCBsb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIgcHJvdG9jb2wgd2hlbiB1c2luZyBVTklYIGRvbWFpbiBzb2NrZXRzLgorICBTZWUgU0YgcGF0Y2ggIzY0Mjk3NC4KKworLSBUaGUgZG9zcGF0aCBtb2R1bGUgd2FzIGRlbGV0ZWQuICBVc2UgdGhlIG50cGF0aCBtb2R1bGUgd2hlbiBtYW5pcHVsYXRpbmcKKyAgRE9TIHBhdGhzIGZyb20gb3RoZXIgcGxhdGZvcm1zLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBUd28gbmV3IHNjcmlwdHMgKGRiMnBpY2tsZS5weSBhbmQgcGlja2xlMmRiLnB5KSB3ZXJlIGFkZGVkIHRvIHRoZQorICBUb29scy9zY3JpcHRzIGRpcmVjdG9yeSB0byBmYWNpbGl0YXRlIGNvbnZlcnNpb24gZnJvbSB0aGUgb2xkIGJzZGRiIG1vZHVsZQorICB0byB0aGUgbmV3IG9uZS4gIFdoaWxlIHRoZSB1c2VyLXZpc2libGUgQVBJIG9mIHRoZSBuZXcgbW9kdWxlIGlzCisgIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIG9uZSwgaXQncyBsaWtlbHkgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUKKyAgdW5kZXJseWluZyBkYXRhYmFzZSBsaWJyYXJ5IGhhcyBjaGFuZ2VkLiAgVG8gY29udmVydCBmcm9tIHRoZSBvbGQgbGlicmFyeSwKKyAgcnVuIHRoZSBkYjJwaWNrbGUucHkgc2NyaXB0IHVzaW5nIHRoZSBvbGQgdmVyc2lvbiBvZiBQeXRob24gdG8gY29udmVydCBpdAorICB0byBhIHBpY2tsZSBmaWxlLiAgQWZ0ZXIgdXBncmFkaW5nIFB5dGhvbiwgcnVuIHRoZSBwaWNrbGUyZGIucHkgc2NyaXB0CisgIHVzaW5nIHRoZSBuZXcgdmVyc2lvbiBvZiBQeXRob24gdG8gcmVjb25zdGl0dXRlIHlvdXIgZGF0YWJhc2UuICBGb3IKKyAgZXhhbXBsZToKKworICAgICUgcHl0aG9uMi4yIGRiMnBpY2tsZS5weSAtaCBzb21lLmRiID4gc29tZS5waWNrbGUKKyAgICAlIHB5dGhvbjIuMyBwaWNrbGUyZGIucHkgLWggc29tZS5kYi5uZXcgPCBzb21lLnBpY2tsZQorCisgIFJ1biB0aGUgc2NyaXB0cyB3aXRob3V0IGFueSBhcmdzIHRvIGdldCBhIHVzYWdlIG1lc3NhZ2UuCisKKworQnVpbGQKKy0tLS0tCisKKy0gVGhlIGF1ZGlvIGRyaXZlciB0ZXN0cyAodGVzdF9vc3NhdWRpb2Rldi5weSBhbmQKKyAgdGVzdF9saW51eGF1ZGlvZGV2LnB5KSBhcmUgbm8gbG9uZ2VyIHJ1biBieSBkZWZhdWx0LiAgVGhpcyBpcworICBiZWNhdXNlIHRoZXkgZG9uJ3QgYWx3YXlzIHdvcmssIGRlcGVuZGluZyBvbiB5b3VyIGhhcmR3YXJlIGFuZAorICBzb2Z0d2FyZS4gIFRvIHJ1biB0aGVzZSB0ZXN0cywgeW91IG11c3QgdXNlIGFuIGludm9jYXRpb24gbGlrZSA6OgorCisgICAgLi9weXRob24gTGliL3Rlc3QvcmVncnRlc3QucHkgLXUgYXVkaW8gdGVzdF9vc3NhdWRpb2RldgorCistIE9uIHN5c3RlbXMgd2hpY2ggYnVpbGQgdXNpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGNvbXBpbGVyIGZsYWdzIHdoaWNoCisgIHVzZWQgdG8gYmUgbHVtcGVkIHRvZ2V0aGVyIHVzaW5nIHRoZSBPUFQgZmxhZyBoYXZlIGJlZW4gc3BsaXQgaW50byB0d28KKyAgZ3JvdXBzLCBPUFQgYW5kIEJBU0VDRkxBR1MuICBPUFQgaXMgbWVhbnQgdG8gY2FycnkganVzdCBvcHRpbWl6YXRpb24tIGFuZAorICBkZWJ1Zy1yZWxhdGVkIGZsYWdzIGxpa2UgIi1nIiBhbmQgIi1PMyIuICBCQVNFQ0ZMQUdTIGlzIG1lYW50IHRvIGNhcnJ5CisgIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGdldCBhIGNsZWFuIGNvbXBpbGUuICBPbiBzb21lCisgIHBsYXRmb3JtcyAobWFueSBMaW51eCBmbGF2b3JzIGluIHBhcnRpY3VsYXIpIEJBU0VDRkxBR1Mgd2lsbCBiZSBlbXB0eSBieQorICBkZWZhdWx0LiAgT24gb3RoZXJzLCBzdWNoIGFzIE1hYyBPUyBYIGFuZCBTQ08sIGl0IHdpbGwgY29udGFpbiByZXF1aXJlZAorICBmbGFncy4gIFRoaXMgY2hhbmdlIGFsbG93cyBwZW9wbGUgYnVpbGRpbmcgUHl0aG9uIHRvIG92ZXJyaWRlIE9QVCB3aXRob3V0CisgIGZlYXIgb2YgY2xvYmJlcmluZyBjb21waWxlciBmbGFncyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gZ2V0IGEgY2xlYW4gYnVpbGQuCisKKy0gT24gRGFyd2luL01hYyBPUyBYIHBsYXRmb3JtcywgL3N3L2xpYiBhbmQgL3N3L2luY2x1ZGUgYXJlIGFkZGVkIHRvIHRoZQorICByZWxldmFudCBzZWFyY2ggbGlzdHMgaW4gc2V0dXAucHkuICBUaGlzIGFsbG93cyB1c2VycyBidWlsZGluZyBQeXRob24gdG8KKyAgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG1hbnkgcGFja2FnZXMgYXZhaWxhYmxlIGZyb20gdGhlIGZpbmsgcHJvamVjdAorICA8aHR0cDovL2Zpbmsuc2YubmV0Lz4uCisKKy0gQSBuZXcgTWFrZWZpbGUgdGFyZ2V0LCBzY3JpcHRzaW5zdGFsbCwgaW5zdGFsbHMgYSBudW1iZXIgb2YgdXNlZnVsIHNjcmlwdHMKKyAgZnJvbSB0aGUgVG9vbHMvc2NyaXB0cyBkaXJlY3RvcnkuCisKK0MgQVBJCistLS0tLQorCistIFB5RXZhbF9HZXRGcmFtZSgpIGlzIG5vdyBkZWNsYXJlZCB0byByZXR1cm4gYSBgYFB5RnJhbWVPYmplY3QgKmBgCisgIGluc3RlYWQgb2YgYSBwbGFpbiBgYFB5T2JqZWN0ICpgYC4gIChTRiBwYXRjaCAjNjg2NjAxLikKKworLSBQeU51bWJlcl9DaGVjaygpIG5vdyBjaGVja3MgdGhhdCB0aGUgb2JqZWN0IGhhcyBhIG5iX2ludCBvciBuYl9mbG9hdAorICBzbG90LCByYXRoZXIgdGhhbiBzaW1wbHkgY2hlY2tpbmcgd2hldGhlciBpdCBoYXMgYSBub24tTlVMTAorICB0cF9hc19udW1iZXIgcG9pbnRlci4KKworLSBBIEMgdHlwZSB0aGF0IGluaGVyaXRzIGZyb20gYSBiYXNlIHR5cGUgdGhhdCBkZWZpbmVzIHRwX2FzX2J1ZmZlcgorICB3aWxsIG5vdyBpbmhlcml0IHRoZSB0cF9hc19idWZmZXIgcG9pbnRlciBpZiBpdCBkb2Vzbid0IGRlZmluZSBvbmUuCisgIChTRiAjNjgxMzY3KQorCistIFRoZSBQeUFyZ19QYXJzZSBmdW5jdGlvbnMgbm93IGlzc3VlIGEgRGVwcmVjYXRpb25XYXJuaW5nIGlmIGEgZmxvYXQKKyAgYXJndW1lbnQgaXMgcHJvdmlkZWQgd2hlbiBhbiBpbnRlZ2VyIGlzIHNwZWNpZmllZCAodGhpcyBhZmZlY3RzIHRoZSAnYicsCisgICdCJywgJ2gnLCAnSCcsICdpJywgYW5kICdsJyBjb2RlcykuICBGdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uIHdpbGwKKyAgcmFpc2UgYSBUeXBlRXJyb3IuCisKK1Rlc3RzCistLS0tLQorCistIFNldmVyYWwgdGVzdHMgd2VyZW4ndCBiZWluZyBydW4gZnJvbSByZWdydGVzdC5weSAodGVzdF90aW1lb3V0LnB5LAorICB0ZXN0X3RhcmZpbGUucHksIHRlc3RfbmV0cmMucHksIHRlc3RfbXVsdGlmaWxlLnB5LAorICB0ZXN0X2ltcG9ydGhvb2tzLnB5IGFuZCB0ZXN0X2ltcC5weSkuICBOb3cgdGhleSBhcmUuICAoTm90ZSB0bworICBkZXZlbG9wZXJzOiBwbGVhc2UgcmVhZCBMaWIvdGVzdC9SRUFETUUgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZXN0LCB0bworICBtYWtlIHN1cmUgdG8gZG8gaXQgcmlnaHQhICBBbGwgdGVzdHMgbmVlZCB0byB1c2UgZWl0aGVyIHVuaXR0ZXN0IG9yCisgIHB5ZG9jLikKKworLSBBZGRlZCB0ZXN0X3Bvc2l4LnB5LCBhIHRlc3Qgc3VpdGUgZm9yIHRoZSBwb3NpeCBtb2R1bGUuCisKKy0gQWRkZWQgdGVzdF9oZXhvY3QucHksIGEgdGVzdCBzdWl0ZSBmb3IgaGV4L29jdCBjb25zdGFudCBmb2xkaW5nLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIHRpbWVvdXQgY29kZSBmb3Igc29ja2V0IGNvbm5lY3QoKSBkaWRuJ3Qgd29yayByaWdodDsgdGhpcyBoYXMKKyAgbm93IGJlZW4gZml4ZWQuICB0ZXN0X3RpbWVvdXQucHkgc2hvdWxkIHBhc3MgKGF0IGxlYXN0IG1vc3Qgb2YgdGhlCisgIHRpbWUpLgorCistIGRpc3R1dGlscycgbXN2Y2NvbXBpbGVyIGNsYXNzIG5vdyBwYXNzZXMgdGhlIHByZXByb2Nlc3NvciBvcHRpb25zIHRvCisgIHRoZSByZXNvdXJjZSBjb21waWxlci4gIFNlZSBTRiBwYXRjaCAjNjY5MTk4LgorCistIFRoZSBic2RkYiBtb2R1bGUgbm93IHNoaXBzIHdpdGggU2xlZXB5Y2F0J3MgNC4xLjI1Lk5DLCB0aGUgbGF0ZXN0CisgIHJlbGVhc2Ugd2l0aG91dCBzdHJvbmcgY3J5cHRvZ3JhcGh5LgorCistIHN5cy5wYXRoWzBdLCBpZiBpdCBjb250YWlucyBhIGRpcmVjdG9yeSBuYW1lLCBpcyBub3cgYWx3YXlzIGFuCisgIGFic29sdXRlIHBhdGhuYW1lLiAoU0YgcGF0Y2ggIzY2NDM3Ni4pCisKKy0gVGhlIG5ldyBsb2dnaW5nIHBhY2thZ2UgaXMgbm93IGluc3RhbGxlZCBieSB0aGUgV2luZG93cyBpbnN0YWxsZXIuICBJdAorICB3YXNuJ3QgaW4gMi4zYTEgZHVlIHRvIG92ZXJzaWdodC4KKworTWFjCistLS0KKworLSBUaGVyZSBhcmUgbmV3IGRpYWxvZ3MgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4sIEFza0ZpbGVGb3JTYXZlCisgIGFuZCBBc2tGb2xkZXIuIFRoZSBvbGQgbWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLgorCistIE1vc3Qgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbm93IHVzZXMgcGF0aG5hbWVzIG9yIEZTUmVmcyBpbiBwcmVmZXJlbmNlCisgIG9mIEZTU3BlY3MsIGFuZCB1c2UgdGhlIHVuZGVybHlpbmcgQ2FyYm9uLkZpbGUgYW5kIENhcmJvbi5Gb2xkZXIgbW9kdWxlcworICBpbiBzdGVhZCBvZiBtYWNmcy4gbWFjZnMgd2lsbCBwcm9iYWJseSBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuCisKKy0gVHlwZSBDYXJib24uRmlsZS5GU0NhdGFsb2dJbmZvIGFuZCBzdXBwb3J0aW5nIG1ldGhvZHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgorICBUaGlzIGFsc28gbWFrZXMgbWFjZnMuRlNTcGVjLlNldERhdGVzKCkgd29yayBhZ2Fpbi4KKworLSBUaGVyZSBpcyBhIG5ldyBtb2R1bGUgcGltcCwgdGhlIHBhY2thZ2UgaW5zdGFsbCBtYW5hZ2VyIGZvciBQeXRob24sIGFuZAorICBhY2NvbXBhbnlpbmcgYXBwbGV0IFBhY2thZ2VNYW5hZ2VyLiBUaGVzZSBhbGxvdyB5b3UgdG8gZWFzaWx5IGRvd25sb2FkCisgIGFuZCBpbnN0YWxsIHByZXRlc3RlZCBleHRlbnNpb24gcGFja2FnZXMgZWl0aGVyIGluIHNvdXJjZSBvciBiaW5hcnkKKyAgZm9ybS4gT25seSBpbiBNYWNQeXRob24tT1NYLgorCistIEFwcGxldHMgYXJlIG5vdyBidWlsdCB3aXRoIGJ1bmRsZWJ1aWxkZXIgaW4gTWFjUHl0aG9uLU9TWCwgd2hpY2ggc2hvdWxkIG1ha2UKKyAgdGhlbSBtb3JlIHJvYnVzdCBhbmQgYWxzbyBwcm92aWRlcyBhIHBhdGggdG93YXJkcyBCdWlsZEFwcGxpY2F0aW9uLiBUaGUKKyAgZG93bnNpZGUgb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCBhcHBsZXRzIGNhbiBubyBsb25nZXIgYmUgcnVuIGZyb20gdGhlCisgIFRlcm1pbmFsIHdpbmRvdywgdGhpcyB3aWxsIGhvcGVmdWxseSBiZSBmaXhlZCBpbiB0aGUgMi4zYjEuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMzEtRGVjLTIwMDIqCisKK1R5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIE9uZSBjYW4gbm93IGFzc2lnbiB0byBfX2Jhc2VzX18gYW5kIF9fbmFtZV9fIG9mIG5ldy1zdHlsZSBjbGFzc2VzLgorCistIGRpY3QoKSBub3cgYWNjZXB0cyBrZXl3b3JkIGFyZ3VtZW50cyBzbyB0aGF0IGRpY3Qob25lPTEsIHR3bz0yKQorICBpcyB0aGUgZXF1aXZhbGVudCBvZiB7Im9uZSI6IDEsICJ0d28iOiAyfS4gIEFjY29yZGluZ2x5LAorICB0aGUgZXhpc3RpbmcgKGJ1dCB1bmRvY3VtZW50ZWQpICdpdGVtcycga2V5d29yZCBhcmd1bWVudCBoYXMKKyAgYmVlbiBlbGltaW5hdGVkLiAgVGhpcyBtZWFucyB0aGF0IGRpY3QoaXRlbXM9c29tZU1hcHBpbmcpIG5vdyBoYXMKKyAgYSBkaWZmZXJlbnQgbWVhbmluZyB0aGFuIGJlZm9yZS4KKworLSBpbnQoKSBub3cgcmV0dXJucyBhIGxvbmcgb2JqZWN0IGlmIHRoZSBhcmd1bWVudCBpcyBvdXRzaWRlIHRoZQorICBpbnRlZ2VyIHJhbmdlLCBzbyBpbnQoIjQiICogMTAwMCksIGludCgxZTIwMCkgYW5kIGludCgxTDw8MTAwMCkgd2lsbAorICBhbGwgcmV0dXJuIGxvbmcgb2JqZWN0cyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gT3ZlcmZsb3dFcnJvci4KKworLSBBc3NpZ25tZW50IHRvIF9fY2xhc3NfXyBpcyBkaXNhbGxvd2VkIGlmIGVpdGhlciB0aGUgb2xkIG9yIHRoZSBuZXcKKyAgY2xhc3MgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdCAoc3VjaCBhcyBkZWZpbmVkIGJ5IGFuCisgIGV4dGVuc2lvbiBtb2R1bGUpLiAgVGhpcyBwcmV2ZW50cyBhbm9tYWxpZXMgbGlrZSAyLl9fY2xhc3NfXyA9IGJvb2wuCisKKy0gTmV3LXN0eWxlIG9iamVjdCBjcmVhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGhhdmUgYmVlbiBzcGVkIHVwCisgIHNpZ25pZmljYW50bHk7IHRoZXkgYXJlIG5vdyBmYXN0ZXIgdGhhbiBjbGFzc2ljIGluc3RhbmNlIGNyZWF0aW9uCisgIGFuZCBkZWFsbG9jYXRpb24uCisKKy0gVGhlIF9fc2xvdHNfXyB2YXJpYWJsZSBjYW4gbm93IG1lbnRpb24gInByaXZhdGUiIG5hbWVzLCBhbmQgdGhlCisgIHJpZ2h0IHRoaW5nIHdpbGwgaGFwcGVuIChlLmcuIF9fc2xvdHNfXyA9IFsiX19mb28iXSkuCisKKy0gVGhlIGJ1aWx0LWlucyBzbGljZSgpIGFuZCBidWZmZXIoKSBhcmUgbm93IGNhbGxhYmxlIHR5cGVzLiAgVGhlCisgIHR5cGVzIGNsYXNzb2JqIChmb3JtZXJseSBjbGFzcyksIGNvZGUsIGZ1bmN0aW9uLCBpbnN0YW5jZSwgYW5kCisgIGluc3RhbmNlbWV0aG9kIChmb3JtZXJseSBpbnN0YW5jZS1tZXRob2QpLCB3aGljaCBoYXZlIG5vIGJ1aWx0LWluCisgIG5hbWVzIGJ1dCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSB0eXBlcyBtb2R1bGUsIGFyZSBub3cgYWxzbworICBjYWxsYWJsZS4gIFRoZSB0eXBlIGRpY3QtcHJveHkgaXMgcmVuYW1lZCB0byBkaWN0cHJveHkuCisKKy0gQ3ljbGVzIGdvaW5nIHRocm91Z2ggdGhlIF9fY2xhc3NfXyBsaW5rIG9mIGEgbmV3LXN0eWxlIGluc3RhbmNlIGFyZQorICBub3cgZGV0ZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorCistIENsYXNzZXMgdXNpbmcgX19zbG90c19fIGFyZSBub3cgcHJvcGVybHkgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIFtTRiBidWcgNTE5NjIxXQorCistIFRpZ2h0ZW5lZCB0aGUgX19zbG90c19fIHJ1bGVzOiBhIHNsb3QgbmFtZSBtdXN0IGJlIGEgdmFsaWQgUHl0aG9uCisgIGlkZW50aWZpZXIuCisKKy0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kdWxlIHR5cGUgbm93IHJlcXVpcmVzIGEgbmFtZSBhcmd1bWVudCBhbmQKKyAgdGFrZXMgYW4gb3B0aW9uYWwgZG9jc3RyaW5nIGFyZ3VtZW50LiAgUHJldmlvdXNseSwgdGhpcyBjb25zdHJ1Y3RvcgorICBpZ25vcmVkIGl0cyBhcmd1bWVudHMuICBBcyBhIGNvbnNlcXVlbmNlLCBkZXJpdmluZyBhIGNsYXNzIGZyb20gYQorICBtb2R1bGUgKG5vdCBmcm9tIHRoZSBtb2R1bGUgdHlwZSkgaXMgbm93IGlsbGVnYWw7IHByZXZpb3VzbHkgdGhpcworICBjcmVhdGVkIGFuIHVubmFtZWQgbW9kdWxlLCBqdXN0IGxpa2UgaW52b2tpbmcgdGhlIG1vZHVsZSB0eXBlIGRpZC4KKyAgW1NGIGJ1ZyA1NjMwNjBdCisKKy0gQSBuZXcgdHlwZSBvYmplY3QsICdiYXNlc3RyaW5nJywgaXMgYWRkZWQuICBUaGlzIGlzIGEgY29tbW9uIGJhc2UgdHlwZQorICBmb3IgJ3N0cicgYW5kICd1bmljb2RlJywgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKKyAgdHlwZXMuU3RyaW5nVHlwZXMsIGUuZy4gdG8gdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyAiYSBzdHJpbmciOgorICBpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpIGlzIFRydWUgZm9yIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MuICBUaGlzCisgIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgYW5kIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCisKKy0gQ2hhbmdlZCBuZXctc3R5bGUgY2xhc3MgaW5zdGFudGlhdGlvbiBzbyB0aGF0IHdoZW4gQydzIF9fbmV3X18KKyAgbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHRoYXQncyBub3QgYSBDIGluc3RhbmNlLCBpdHMgX19pbml0X18gaXMKKyAgbm90IGNhbGxlZC4gIFtTRiBidWcgIzUzNzQ1MF0KKworLSBGaXhlZCBzdXBlcigpIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggY2xhc3MgbWV0aG9kcy4gIFtTRiBidWcgIzUzNTQ0NF0KKworLSBJZiB5b3UgdHJ5IHRvIHBpY2tsZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIF9fc2xvdHNfXyBidXQKKyAgZG9lc24ndCBkZWZpbmUgb3Igb3ZlcnJpZGUgX19nZXRzdGF0ZV9fLCBhIFR5cGVFcnJvciBpcyBub3cgcmFpc2VkLgorICBUaGlzIGlzIGRvbmUgYnkgYWRkaW5nIGEgYm96byBfX2dldHN0YXRlX18gdG8gdGhlIGNsYXNzIHRoYXQgYWx3YXlzCisgIHJhaXNlcyBUeXBlRXJyb3IuICAoQmVmb3JlLCB0aGlzIHdvdWxkIGFwcGVhciB0byBiZSBwaWNrbGVkLCBidXQgdGhlCisgIHN0YXRlIG9mIHRoZSBzbG90cyB3b3VsZCBiZSBsb3N0LikKKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSW1wb3J0IGZyb20gemlwZmlsZXMgaXMgbm93IHN1cHBvcnRlZC4gIFRoZSBuYW1lIG9mIGEgemlwZmlsZSBwbGFjZWQKKyAgb24gc3lzLnBhdGggY2F1c2VzIHRoZSBpbXBvcnQgc3RhdGVtZW50IHRvIGxvb2sgZm9yIGltcG9ydGFibGUgUHl0aG9uCisgIG1vZHVsZXMgKHdpdGggLnB5LCBweWMgYW5kIC5weW8gZXh0ZW5zaW9ucykgYW5kIHBhY2thZ2VzIGluc2lkZSB0aGUKKyAgemlwZmlsZS4gIFRoZSB6aXBmaWxlIGltcG9ydCBmb2xsb3dzIHRoZSBzcGVjaWZpY2F0aW9uICh0aG91Z2ggbm90CisgIHRoZSBzYW1wbGUgaW1wbGVtZW50YXRpb24pIG9mIFBFUCAyNzMuICBUaGUgc2VtYW50aWNzIG9mIF9fcGF0aF9fIGFyZQorICBjb21wYXRpYmxlIHdpdGggdGhvc2UgdGhhdCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gSnl0aG9uIHNpbmNlCisgIEp5dGhvbiAyLjEuCisKKy0gUEVQIDMwMiBoYXMgYmVlbiBhY2NlcHRlZC4gIEFsdGhvdWdoIGl0IHdhcyBpbml0aWFsbHkgZGV2ZWxvcGVkIHRvCisgIHN1cHBvcnQgemlwaW1wb3J0LCBpdCBvZmZlcnMgYSBuZXcsIGdlbmVyYWwgaW1wb3J0IGhvb2sgbWVjaGFuaXNtLgorICBTZXZlcmFsIG5ldyB2YXJpYWJsZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBzeXMgbW9kdWxlOgorICBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlOyB0aGVzZQorICBtYWtlIGV4dGVuZGluZyB0aGUgaW1wb3J0IHN0YXRlbWVudCBtdWNoIG1vcmUgY29udmVuaWVudCB0aGFuCisgIG92ZXJyaWRpbmcgdGhlIF9faW1wb3J0X18gYnVpbHQtaW4gZnVuY3Rpb24uICBGb3IgYSBkZXNjcmlwdGlvbiBvZgorICB0aGVzZSwgc2VlIFBFUCAzMDIuCisKKy0gQSBmcmFtZSBvYmplY3QncyBmX2xpbmVubyBhdHRyaWJ1dGUgY2FuIG5vdyBiZSB3cml0dGVuIHRvIGZyb20gYQorICB0cmFjZSBmdW5jdGlvbiB0byBjaGFuZ2Ugd2hpY2ggbGluZSB3aWxsIGV4ZWN1dGUgbmV4dC4gIEEgY29tbWFuZCB0bworICBleHBsb2l0IHRoaXMgZnJvbSBwZGIgaGFzIGJlZW4gYWRkZWQuICBbU0YgcGF0Y2ggIzY0MzgzNV0KKworLSBUaGUgX2NvZGVjcyBzdXBwb3J0IG1vZHVsZSBmb3IgY29kZWNzLnB5IHdhcyB0dXJuZWQgaW50byBhIGJ1aWx0aW4KKyAgbW9kdWxlIHRvIGFzc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSBidWlsdGluIGNvZGVjcyBhcmUgYXZhaWxhYmxlCisgIHRvIHRoZSBQeXRob24gcGFyc2VyIGZvciBzb3VyY2UgY29kZSBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUEVQIDI2My4KKworLSBpc3N1YmNsYXNzIG5vdyBzdXBwb3J0cyBhIHR1cGxlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGp1c3QgbGlrZQorICBpc2luc3RhbmNlIGRvZXMuIGBgaXNzdWJjbGFzcyhYLCAoQSwgQikpYGAgaXMgZXF1aXZhbGVudCB0bworICBgYGlzc3ViY2xhc3MoWCwgQSkgb3IgaXNzdWJjbGFzcyhYLCBCKWBgLgorCistIFRoYW5rcyB0byBBcm1pbiBSaWdvLCB0aGUgbGFzdCBrbm93biB3YXkgdG8gcHJvdm9rZSBhIHN5c3RlbSBjcmFzaAorICBieSBjbGV2ZXJseSBhcnJhbmdpbmcgZm9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBtdXRhdGUgYSBsaXN0CisgIGR1cmluZyBhIGxpc3Quc29ydCgpIG9wZXJhdGlvbiBoYXMgYmVlbiBmaXhlZC4gIFRoZSBlZmZlY3Qgb2YKKyAgYXR0ZW1wdGluZyB0byBtdXRhdGUgYSBsaXN0LCBvciBldmVuIHRvIGluc3BlY3QgaXRzIGNvbnRlbnRzIG9yCisgIGxlbmd0aCwgd2hpbGUgYSBzb3J0IGlzIGluIHByb2dyZXNzLCBpcyBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCisgIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYXR0ZW1wdHMgdG8gZGV0ZWN0IG11dGF0aW9ucywKKyAgYW5kIHJhaXNlIFZhbHVlRXJyb3IgaWYgb25lIG9jY3VycywgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQKKyAgYWxsIG11dGF0aW9ucyB3aWxsIGJlIGNhdWdodCwgb3IgdGhhdCBhbnkgd2lsbCBiZSBjYXVnaHQgYWNyb3NzCisgIHJlbGVhc2VzIG9yIGltcGxlbWVudGF0aW9ucy4KKworLSBVbmljb2RlIGZpbGUgbmFtZSBwcm9jZXNzaW5nIGZvciBXaW5kb3dzIChQRVAgMjc3KSBpcyBpbXBsZW1lbnRlZC4KKyAgQWxsIHBsYXRmb3JtcyBub3cgaGF2ZSBhbiBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzIGF0dHJpYnV0ZSwKKyAgd2hpY2ggaXMgc2V0IHRvIFRydWUgb24gV2luZG93cyBOVC8yMDAwL1hQLCBhbmQgRmFsc2UgZWxzZXdoZXJlLgorCistIENvZGVjIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrcyAoUEVQIDI5MykgYXJlIGltcGxlbWVudGVkLgorICBFcnJvciBoYW5kbGluZyBpbiB1bmljb2RlLmVuY29kZSBvciBzdHIuZGVjb2RlIGNhbiBub3cgYmUgY3VzdG9taXplZC4KKworLSBBIHN1YnRsZSBjaGFuZ2UgdG8gdGhlIHNlbWFudGljcyBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gaW50ZXJuKCk6CisgIGludGVybmVkIHN0cmluZ3MgYXJlIG5vIGxvbmdlciBpbW1vcnRhbC4gIFlvdSBtdXN0IGtlZXAgYSByZWZlcmVuY2UKKyAgdG8gdGhlIHJldHVybiB2YWx1ZSBpbnRlcm4oKSBhcm91bmQgdG8gZ2V0IHRoZSBiZW5lZml0LgorCistIFVzZSBvZiAnTm9uZScgYXMgYSB2YXJpYWJsZSwgYXJndW1lbnQgb3IgYXR0cmlidXRlIG5hbWUgbm93CisgIGlzc3VlcyBhIFN5bnRheFdhcm5pbmcuICBJbiB0aGUgZnV0dXJlLCBOb25lIG1heSBiZWNvbWUgYSBrZXl3b3JkLgorCistIFNFVF9MSU5FTk8gaXMgZ29uZS4gIGNvX2xub3RhYiBpcyBub3cgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGVuIHRvCisgIGNhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLiAgQyBjb2RlIHRoYXQgYWNjZXNzZWQgZl9saW5lbm8gc2hvdWxkIGNhbGwKKyAgUHlDb2RlX0FkZHIyTGluZSBpbnN0ZWFkIChmX2xpbmVubyBpcyBzdGlsbCB0aGVyZSwgYnV0IG9ubHkga2VwdCB1cAorICB0byBkYXRlIHdoZW4gdGhlcmUgaXMgYSB0cmFjZSBmdW5jdGlvbiBzZXQpLgorCistIFRoZXJlJ3MgYSBuZXcgd2FybmluZyBjYXRlZ29yeSwgRnV0dXJlV2FybmluZy4gIFRoaXMgaXMgdXNlZCB0byB3YXJuCisgIGFib3V0IGEgbnVtYmVyIG9mIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHZhbHVlIG9yIHNpZ24gb2YgYW4gaW50ZWdlcgorICByZXN1bHQgd2lsbCBjaGFuZ2UgaW4gUHl0aG9uIDIuNCBhcyBhIHJlc3VsdCBvZiBQRVAgMjM3IChpbnRlZ2VyCisgIHVuaWZpY2F0aW9uKS4gIFRoZSB3YXJuaW5ncyBpbXBsZW1lbnQgc3RhZ2UgQjAgbWVudGlvbmVkIGluIHRoYXQKKyAgUEVQLiAgVGhlIHdhcm5pbmdzIGFyZSBhYm91dCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6CisKKyAgICAtIE9jdGFsIGFuZCBoZXggbGl0ZXJhbHMgd2l0aG91dCAnTCcgcHJlZml4IGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UKKyAgICAgIFsweDgwMDAwMDAwLi4weGZmZmZmZmZmXTsgdGhlc2UgYXJlIGN1cnJlbnRseSBuZWdhdGl2ZSBpbnRzLCBidXQKKyAgICAgIGluIFB5dGhvbiAyLjQgdGhleSB3aWxsIGJlIHBvc2l0aXZlIGxvbmdzIHdpdGggdGhlIHNhbWUgYml0CisgICAgICBwYXR0ZXJuLgorCisgICAgLSBMZWZ0IHNoaWZ0cyBvbiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGNhdXNlIHRoZSBvdXRjb21lIHRvIGxvc2UKKyAgICAgIGJpdHMgb3IgaGF2ZSBhIGRpZmZlcmVudCBzaWduIHRoYW4gdGhlIGxlZnQgb3BlcmFuZC4gIFRvIGJlCisgICAgICBwcmVjaXNlOiB4PDxuIHdoZXJlIHRoaXMgY3VycmVudGx5IGRvZXNuJ3QgeWllbGQgdGhlIHNhbWUgdmFsdWUKKyAgICAgIGFzIGxvbmcoeCk8PG47IGluIFB5dGhvbiAyLjQsIHRoZSBvdXRjb21lIHdpbGwgYmUgbG9uZyh4KTw8bi4KKworICAgIC0gQ29udmVyc2lvbnMgZnJvbSBpbnRzIHRvIHN0cmluZyB0aGF0IHNob3cgbmVnYXRpdmUgdmFsdWVzIGFzCisgICAgICB1bnNpZ25lZCBpbnRzIGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UgWzB4ODAwMDAwMDAuLjB4ZmZmZmZmZmZdOworICAgICAgdGhpcyBhZmZlY3RzIHRoZSBmdW5jdGlvbnMgaGV4KCkgYW5kIG9jdCgpLCBhbmQgdGhlIHN0cmluZworICAgICAgZm9ybWF0dGluZyBjb2RlcyAldSwgJW8sICV4LCBhbmQgJVguICBJbiBQeXRob24gMi40LCB0aGVzZSB3aWxsCisgICAgICBzaG93IHNpZ25lZCB2YWx1ZXMgKGUuZy4gaGV4KC0xKSBjdXJyZW50bHkgcmV0dXJucyAiMHhmZmZmZmZmZiI7CisgICAgICBpbiBQeXRob24gMi40IGl0IHdpbGwgcmV0dXJuICItMHgxIikuCisKKy0gVGhlIGJpdHMgbWFuaXB1bGF0ZWQgdW5kZXIgdGhlIGNvdmVyIGJ5IHN5cy5zZXRjaGVja2ludGVydmFsKCkgaGF2ZQorICBiZWVuIGNoYW5nZWQuICBCb3RoIHRoZSBjaGVjayBpbnRlcnZhbCBhbmQgdGhlIHRpY2tlciB1c2VkIHRvIGJlCisgIHBlci10aHJlYWQgdmFsdWVzLiAgVGhleSBhcmUgbm93IGp1c3QgYSBwYWlyIG9mIGdsb2JhbCB2YXJpYWJsZXMuCisgIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBjaGVjayBpbnRlcnZhbCB3YXMgYm9vc3RlZCBmcm9tIDEwIHRvIDEwMAorICBieXRlY29kZSBpbnN0cnVjdGlvbnMuICBUaGlzIG1heSBoYXZlIHNvbWUgZWZmZWN0IG9uIHN5c3RlbXMgdGhhdAorICByZWxpZWQgb24gdGhlIG9sZCBkZWZhdWx0IHZhbHVlLiAgSW4gcGFydGljdWxhciwgaW4gbXVsdGktdGhyZWFkZWQKKyAgYXBwbGljYXRpb25zIHdoaWNoIHRyeSB0byBiZSBoaWdobHkgcmVzcG9uc2l2ZSwgcmVzcG9uc2UgdGltZSB3aWxsCisgIGluY3JlYXNlIGJ5IHNvbWUgKHBlcmhhcHMgaW1wZXJjZXB0aWJsZSkgYW1vdW50LgorCistIFdoZW4gbXVsdGlwbHlpbmcgdmVyeSBsYXJnZSBpbnRlZ2VycywgYSB2ZXJzaW9uIG9mIHRoZSBzby1jYWxsZWQKKyAgS2FyYXRzdWJhIGFsZ29yaXRobSBpcyBub3cgdXNlZC4gIFRoaXMgaXMgbW9zdCBlZmZlY3RpdmUgaWYgdGhlCisgIGlucHV0cyBoYXZlIHJvdWdobHkgdGhlIHNhbWUgc2l6ZS4gIElmIHRoZXkgYm90aCBoYXZlIGFib3V0IE4gZGlnaXRzLAorICBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gaGFzIE8oTioqMS41OCkgcnVudGltZSAodGhlIGV4cG9uZW50IGlzCisgIGxvZ19iYXNlXzIoMykpIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIE8oTioqMikuICBNZWFzdXJlZCByZXN1bHRzIG1heQorICBiZSBiZXR0ZXIgb3Igd29yc2UgdGhhbiB0aGF0LCBkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzLiAgQmVzaWRlcworICB0aGUgTygpIGltcHJvdmVtZW50IGluIHJhdyBpbnN0cnVjdGlvbiBjb3VudCwgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0KKyAgYXBwZWFycyB0byBoYXZlIG11Y2ggYmV0dGVyIGNhY2hlIGJlaGF2aW9yIG9uIGV4dHJlbWVseSBsYXJnZSBpbnRlZ2VycworICAoc3RhcnRpbmcgaW4gdGhlIGJhbGxwYXJrIG9mIGEgbWlsbGlvbiBiaXRzKS4gIE5vdGUgdGhhdCB0aGlzIGlzIGEKKyAgc2ltcGxlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlcmUncyBubyBpbnRlbnQgaGVyZSB0byBjb21wZXRlIHdpdGgsCisgIGUuZy4sIEdNUC4gIEl0IGdpdmVzIGEgdmVyeSBuaWNlIHNwZWVkdXAgd2hlbiBpdCBhcHBsaWVzLCBidXQgYSBwYWNrYWdlCisgIGRldm90ZWQgdG8gZmFzdCBsYXJnZS1pbnRlZ2VyIGFyaXRobWV0aWMgc2hvdWxkIHJ1biBjaXJjbGVzIGFyb3VuZCBpdC4KKworLSB1JyVjJyB3aWxsIG5vdyByYWlzZSBhIFZhbHVlRXJyb3IgaW4gY2FzZSB0aGUgYXJndW1lbnQgaXMgYW4KKyAgaW50ZWdlciBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBvZiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbHMuCisKKy0gVGhlIHRlbXBmaWxlIG1vZHVsZSBoYXMgYmVlbiBvdmVyaGF1bGVkIGZvciBlbmhhbmNlZCBzZWN1cml0eS4gIFRoZQorICBta3RlbXAoKSBmdW5jdGlvbiBpcyBub3cgZGVwcmVjYXRlZDsgbmV3LCBzYWZlIHJlcGxhY2VtZW50cyBhcmUKKyAgbWtzdGVtcCgpIChmb3IgZmlsZXMpIGFuZCBta2R0ZW1wKCkgKGZvciBkaXJlY3RvcmllcyksIGFuZCB0aGUKKyAgaGlnaGVyLWxldmVsIGZ1bmN0aW9ucyBOYW1lZFRlbXBvcmFyeUZpbGUoKSBhbmQgVGVtcG9yYXJ5RmlsZSgpLgorICBVc2Ugb2Ygc29tZSBnbG9iYWwgdmFyaWFibGVzIGluIHRoaXMgbW9kdWxlIGlzIGFsc28gZGVwcmVjYXRlZDsgdGhlCisgIG5ldyBmdW5jdGlvbnMgaGF2ZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcm92aWRlIHRoZSBzYW1lCisgIGZ1bmN0aW9uYWxpdHkuICBBbGwgTGliLCBUb29scyBhbmQgRGVtbyBtb2R1bGVzIHRoYXQgdXNlZCB0aGUgdW5zYWZlCisgIGludGVyZmFjZXMgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSBzYWZlIHJlcGxhY2VtZW50cy4gIFRoYW5rcworICB0byBaYWNrIFdlaW5iZXJnIQorCistIFdoZW4geCBpcyBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgaW1wbGVtZW50cyBfX211bF9fIGFuZCBfX3JtdWxfXywKKyAgMS4wKnggd291bGQgY29ycmVjdGx5IGludm9rZSBfX3JtdWxfXywgYnV0IDEqeCB3b3VsZCBlcnJvbmVvdXNseQorICBpbnZva2UgX19tdWxfXy4gIFRoaXMgd2FzIGR1ZSB0byB0aGUgc2VxdWVuY2UtcmVwZWF0IGNvZGUgaW4gdGhlIGludAorICB0eXBlLiAgVGhpcyBoYXMgYmVlbiBmaXhlZCBub3cuCisKKy0gUHJldmlvdXNseSwgInN0cjEgaW4gc3RyMiIgcmVxdWlyZWQgc3RyMSB0byBiZSBhIHN0cmluZyBvZiBsZW5ndGggMS4KKyAgVGhpcyByZXN0cmljdGlvbiBoYXMgYmVlbiByZWxheGVkIHRvIGFsbG93IHN0cjEgdG8gYmUgYSBzdHJpbmcgb2YKKyAgYW55IGxlbmd0aC4gIFRodXMgIidlbCcgaW4gJ2hlbGxvIHdvcmxkJyIgcmV0dXJucyBUcnVlIG5vdy4KKworLSBGaWxlIG9iamVjdHMgYXJlIG5vdyB0aGVpciBvd24gaXRlcmF0b3JzLiAgRm9yIGEgZmlsZSBmLCBpdGVyKGYpIG5vdworICByZXR1cm5zIGYgKHVubGVzcyBmIGlzIGNsb3NlZCksIGFuZCBmLm5leHQoKSBpcyBzaW1pbGFyIHRvCisgIGYucmVhZGxpbmUoKSB3aGVuIEVPRiBpcyBub3QgcmVhY2hlZDsgaG93ZXZlciwgZi5uZXh0KCkgdXNlcyBhCisgIHJlYWRhaGVhZCBidWZmZXIgdGhhdCBtZXNzZXMgdXAgdGhlIGZpbGUgcG9zaXRpb24sIHNvIG1peGluZworICBmLm5leHQoKSBhbmQgZi5yZWFkbGluZSgpIChvciBvdGhlciBtZXRob2RzKSBkb2Vzbid0IHdvcmsgcmlnaHQuCisgIENhbGxpbmcgZi5zZWVrKCkgZHJvcHMgdGhlIHJlYWRhaGVhZCBidWZmZXIsIGJ1dCBvdGhlciBvcGVyYXRpb25zCisgIGRvbid0LiAgSXQgc28gaGFwcGVucyB0aGF0IHRoaXMgZ2l2ZXMgYSBuaWNlIGFkZGl0aW9uYWwgc3BlZWQgYm9vc3QKKyAgdG8gImZvciBsaW5lIGluIGZpbGU6IjsgdGhlIHhyZWFkbGluZXMgbWV0aG9kIGFuZCBjb3JyZXNwb25kaW5nCisgIG1vZHVsZSBhcmUgbm93IG9ic29sZXRlLiAgVGhhbmtzIHRvIE9yZW4gVGlyb3NoIQorCistIEVuY29kaW5nIGRlY2xhcmF0aW9ucyAoUEVQIDI2MywgcGhhc2UgMSkgaGF2ZSBiZWVuIGltcGxlbWVudGVkLiAgQQorICBjb21tZW50IG9mIHRoZSBmb3JtICIjIC0qLSBjb2Rpbmc6IDxlbmNvZGluZ25hbWU+IC0qLSIgaW4gdGhlIGZpcnN0CisgIG9yIHNlY29uZCBsaW5lIG9mIGEgUHl0aG9uIHNvdXJjZSBmaWxlIGluZGljYXRlcyB0aGUgZW5jb2RpbmcuCisKKy0gbGlzdC5zb3J0KCkgaGFzIGEgbmV3IGltcGxlbWVudGF0aW9uLiAgV2hpbGUgY3Jvc3MtcGxhdGZvcm0gcmVzdWx0cworICBtYXkgdmFyeSwgYW5kIGluIGRhdGEtZGVwZW5kZW50IHdheXMsIHRoaXMgaXMgbXVjaCBmYXN0ZXIgb24gbWFueQorICBraW5kcyBvZiBwYXJ0aWFsbHkgb3JkZXJlZCBsaXN0cyB0aGFuIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwKKyAgYW5kIHJlcG9ydGVkIHRvIGJlIGp1c3QgYXMgZmFzdCBvbiByYW5kb21seSBvcmRlcmVkIGxpc3RzIG9uCisgIHNldmVyYWwgbWFqb3IgcGxhdGZvcm1zLiAgVGhpcyBzb3J0IGlzIGFsc28gc3RhYmxlIChpZiBBPT1CIGFuZCBBCisgIHByZWNlZGVzIEIgaW4gdGhlIGxpc3QgYXQgdGhlIHN0YXJ0LCBBIHByZWNlZGVzIEIgYWZ0ZXIgdGhlIHNvcnQgdG9vKSwKKyAgYWx0aG91Z2ggdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gZG9lcyBub3QgZ3VhcmFudGVlIHN0YWJpbGl0eS4gIEEKKyAgcG90ZW50aWFsIGRyYXdiYWNrIGlzIHRoYXQgbGlzdC5zb3J0KCkgbWF5IHJlcXVpcmUgdGVtcCBzcGFjZSBvZgorICBsZW4obGlzdCkqMiBieXRlcyAoYGAqNGBgIG9uIGEgNjQtYml0IG1hY2hpbmUpLiAgSXQncyB0aGVyZWZvcmUgcG9zc2libGUKKyAgZm9yIGxpc3Quc29ydCgpIHRvIHJhaXNlIE1lbW9yeUVycm9yIG5vdywgZXZlbiBpZiBhIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAgZG9lcyBub3QuICBTZWUgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81ODcwNzY+IGZvciBmdWxsIGRldGFpbHMuCisKKy0gQWxsIHN0YW5kYXJkIGl0ZXJhdG9ycyBub3cgZW5zdXJlIHRoYXQsIG9uY2UgU3RvcEl0ZXJhdGlvbiBoYXMgYmVlbgorICByYWlzZWQsIGFsbCBmdXR1cmUgY2FsbHMgdG8gbmV4dCgpIG9uIHRoZSBzYW1lIGl0ZXJhdG9yIHdpbGwgYWxzbworICByYWlzZSBTdG9wSXRlcmF0aW9uLiAgVGhlcmUgdXNlZCB0byBiZSB2YXJpb3VzIGNvdW50ZXJleGFtcGxlcyB0bworICB0aGlzIGJlaGF2aW9yLCB3aGljaCBjb3VsZCBjYXVzZWQgY29uZnVzaW9uIG9yIHN1YnRsZSBwcm9ncmFtCisgIGJyZWFrYWdlLCB3aXRob3V0IGFueSBiZW5lZml0cy4gIChOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhbgorICBpdGVyYXRvcidzIHJlc3BvbnNpYmlsaXR5OyB0aGUgaXRlcmF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IGVuZm9yY2UKKyAgdGhpcy4pCisKKy0gQ3RybCtDIGhhbmRsaW5nIG9uIFdpbmRvd3MgaGFzIGJlZW4gbWFkZSBtb3JlIGNvbnNpc3RlbnQgd2l0aAorICBvdGhlciBwbGF0Zm9ybXMuICBLZXlib2FyZEludGVycnVwdCBjYW4gbm93IHJlbGlhYmx5IGJlIGNhdWdodCwKKyAgYW5kIEN0cmwrQyBhdCBhbiBpbnRlcmFjdGl2ZSBwcm9tcHQgbm8gbG9uZ2VyIHRlcm1pbmF0ZXMgdGhlCisgIHByb2Nlc3MgdW5kZXIgTlQvMmsvWFAgKGl0IG5ldmVyIGRpZCB1bmRlciBXaW45eCkuICBDdHJsK0Mgd2lsbAorICBpbnRlcnJ1cHQgdGltZS5zbGVlcCgpIGluIHRoZSBtYWluIHRocmVhZCwgYW5kIGFueSBjaGlsZCBwcm9jZXNzZXMKKyAgY3JlYXRlZCB2aWEgdGhlIHBvcGVuIGZhbWlseSAob24gd2luMms7IHdlIGNhbid0IG1ha2Ugd2luOXggd29yaworICByZWxpYWJseSkgYXJlIGFsc28gaW50ZXJydXB0ZWQgKGFzIGdlbmVyYWxseSBoYXBwZW5zIG9uIGZvciBMaW51eC9Vbml4LikKKyAgW1NGIGJ1Z3MgMjMxMjczLCA0Mzk5OTIgYW5kIDU4MTIzMl0KKworLSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSBoYXMgYmVlbiBhZGRlZCBvbiBXaW5kb3dzLiAgVGhpcworICByZXR1cm5zIGEgdHVwbGUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZiBXaW5kb3dzCisgIGN1cnJlbnRseSBydW5uaW5nLgorCistIFNsaWNlcyBhbmQgcmVwZXRpdGlvbnMgb2YgYnVmZmVyIG9iamVjdHMgbm93IGNvbnNpc3RlbnRseSByZXR1cm4KKyAgYSBzdHJpbmcuICBGb3JtZXJseSwgc3RyaW5ncyB3b3VsZCBiZSByZXR1cm5lZCBtb3N0IG9mIHRoZSB0aW1lLAorICBidXQgYSBidWZmZXIgb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHJlcGV0aXRpb24gY291bnQKKyAgd2FzIG9uZSBvciB3aGVuIHRoZSBzbGljZSByYW5nZSB3YXMgYWxsIGluY2x1c2l2ZS4KKworLSBVbmljb2RlIG9iamVjdHMgaW4gc3lzLnBhdGggYXJlIG5vIGxvbmdlciBpZ25vcmVkIGJ1dCB0cmVhdGVkCisgIGFzIGRpcmVjdG9yeSBuYW1lcy4KKworLSBGaXhlZCBzdHJpbmcuc3RhcnRzd2l0aCBhbmQgc3RyaW5nLmVuZHN3aXRoIGJ1aWx0aW4gbWV0aG9kcworICBzbyB0aGV5IGFjY2VwdCBuZWdhdGl2ZSBpbmRpY2VzLiAgW1NGIGJ1ZyA0OTM5NTFdCisKKy0gRml4ZWQgYSBidWcgd2l0aCBhIGNvbnRpbnVlIGluc2lkZSBhIHRyeSBibG9jayBhbmQgYSB5aWVsZCBpbiB0aGUKKyAgZmluYWxseSBjbGF1c2UuICBbU0YgYnVnIDU2NzUzOF0KKworLSBNb3N0IGJ1aWx0aW4gc2VxdWVuY2VzIG5vdyBzdXBwb3J0ICJleHRlbmRlZCBzbGljZXMiLCBpLmUuIHNsaWNlcworICB3aXRoIGEgdGhpcmQgInN0cmlkZSIgcGFyYW1ldGVyLiAgRm9yIGV4YW1wbGUsICJoZWxsbyB3b3JsZCJbOjotMV0KKyAgZ2l2ZXMgImRscm93IG9sbGVoIi4KKworLSBBIG5ldyB3YXJuaW5nIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgd2FzIGFkZGVkIHRvIHByb3ZpZGUKKyAgZGlyZWN0aW9uIG9uIGZlYXR1cmVzIHdoaWNoIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXByZWNhdGVkLgorICBUaGUgd2FybmluZyB3aWxsIG5vdCBiZSBwcmludGVkIGJ5IGRlZmF1bHQuICBUbyBzZWUgdGhlIHBlbmRpbmcKKyAgZGVwcmVjYXRpb25zLCB1c2UgLVdhbHdheXM6OlBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc6OgorICBhcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gb3Igd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoKSBpbiBjb2RlLgorCistIERlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgeHJhbmdlIG9iamVjdHMgaGF2ZSBiZWVuIHJlbW92ZWQgYXMKKyAgcHJvbWlzZWQuICBUaGUgc3RhcnQsIHN0b3AsIGFuZCBzdGVwIGF0dHJpYnV0ZXMgYW5kIHRoZSB0b2xpc3QoKQorICBtZXRob2Qgbm8gbG9uZ2VyIGV4aXN0LiAgeHJhbmdlIHJlcGV0aXRpb24gYW5kIHNsaWNpbmcgaGF2ZSBiZWVuCisgIHJlbW92ZWQuCisKKy0gTmV3IGJ1aWx0aW4gZnVuY3Rpb24gZW51bWVyYXRlKHgpLCBmcm9tIFBFUCAyNzkuICBFeGFtcGxlOgorICBlbnVtZXJhdGUoImFiYyIpIGlzIGFuIGl0ZXJhdG9yIHJldHVybmluZyAoMCwiYSIpLCAoMSwiYiIpLCAoMiwiYyIpLgorICBUaGUgYXJndW1lbnQgY2FuIGJlIGFuIGFyYml0cmFyeSBpdGVyYWJsZSBvYmplY3QuCisKKy0gVGhlIGFzc2VydCBzdGF0ZW1lbnQgbm8gbG9uZ2VyIHRlc3RzIF9fZGVidWdfXyBhdCBydW50aW1lLiAgVGhpcyBtZWFucworICB0aGF0IGFzc2VydCBzdGF0ZW1lbnRzIGNhbm5vdCBiZSBkaXNhYmxlZCBieSBhc3NpZ25pbmcgYSBmYWxzZSB2YWx1ZQorICB0byBfX2RlYnVnX18uCisKKy0gQSBtZXRob2QgemZpbGwoKSB3YXMgYWRkZWQgdG8gc3RyIGFuZCB1bmljb2RlLCB0aGF0IGZpbGxzIGEgbnVtZXJpYworICBzdHJpbmcgdG8gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEZvciBleGFtcGxlLAorICAiKzEyMyIuemZpbGwoNikgLT4gIiswMDEyMyIuCisKKy0gQ29tcGxleCBudW1iZXJzIHN1cHBvcnRlZCBkaXZtb2QoKSBhbmQgdGhlIC8vIGFuZCAlIG9wZXJhdG9ycywgYnV0CisgIHRoZXNlIG1ha2Ugbm8gc2Vuc2UuICBTaW5jZSB0aGlzIHdhcyBkb2N1bWVudGVkLCB0aGV5J3JlIGJlaW5nCisgIGRlcHJlY2F0ZWQgbm93LgorCistIFN0cmluZyBhbmQgdW5pY29kZSBtZXRob2RzIGxzdHJpcCgpLCByc3RyaXAoKSBhbmQgc3RyaXAoKSBub3cgdGFrZQorICBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IHNwZWNpZmllcyB0aGUgY2hhcmFjdGVycyB0byBzdHJpcC4gIEZvcgorICBleGFtcGxlLCAiRm9vISEhPyE/IT8iLnJzdHJpcCgiPyEiKSAtPiAiRm9vIi4KKworLSBUaGVyZSdzIGEgbmV3IGRpY3Rpb25hcnkgY29uc3RydWN0b3IgKGEgY2xhc3MgbWV0aG9kIG9mIHRoZSBkaWN0CisgIGNsYXNzKSwgZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgdmFsdWU9Tm9uZSkuICBJdCBjb25zdHJ1Y3RzIGEKKyAgZGljdGlvbmFyeSB3aXRoIGtleXMgdGFrZW4gZnJvbSB0aGUgaXRlcmFibGUgYW5kIGFsbCB2YWx1ZXMgc2V0IHRvIGEKKyAgc2luZ2xlIHZhbHVlLiAgSXQgY2FuIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHNldHMgYW5kIGZvciByZW1vdmluZworICBkdXBsaWNhdGVzIGZyb20gc2VxdWVuY2VzLgorCistIEFkZGVkIGEgbmV3IGRpY3QgbWV0aG9kIHBvcChrZXkpLiAgVGhpcyByZW1vdmVzIGFuZCByZXR1cm5zIHRoZQorICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleS4gIFtTRiBwYXRjaCAjNTM5OTQ5XQorCistIEEgbmV3IGJ1aWx0LWluIHR5cGUsIGJvb2wsIGhhcyBiZWVuIGFkZGVkLCBhcyB3ZWxsIGFzIGJ1aWx0LWluCisgIG5hbWVzIGZvciBpdHMgdHdvIHZhbHVlcywgVHJ1ZSBhbmQgRmFsc2UuICBDb21wYXJpc29ucyBhbmQgc3VuZHJ5CisgIG90aGVyIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gYSB0cnV0aCB2YWx1ZSBoYXZlIGJlZW4gY2hhbmdlZCB0bworICByZXR1cm4gYSBib29sIGluc3RlYWQuICBSZWFkIFBFUCAyODUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzCisgIGlzIGJhY2t3YXJkIGNvbXBhdGlibGUuCisKKy0gRml4ZWQgdHdvIGJ1Z3MgcmVwb3J0ZWQgYXMgU0YgIzUzNTkwNTogdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLAorICBkZWFsbG9jYXRpbmcgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0IGluIHRoZQorICBnYXJiYWdlIGNvbGxlY3RvciwgZHVlIHRvIGludGVyYWN0aW9uIHdpdGggdGhlICJ0cmFzaGNhbiIgY29kZTsKKyAgYWNjZXNzIHRvIHRoZSBjdXJyZW50IGZyYW1lIGR1cmluZyBkZXN0cnVjdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlCisgIGNvdWxkIGFjY2VzcyBhIHBvaW50ZXIgdG8gZnJlZWQgbWVtb3J5LgorCistIFRoZSBvcHRpb25hbCBvYmplY3QgYWxsb2NhdG9yICgicHltYWxsb2MiKSBoYXMgYmVlbiBlbmFibGVkIGJ5CisgIGRlZmF1bHQuICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAorICBkZWFsbG9jYXRpb24gaGFzIGJlZW4gc3RyZWFtbGluZWQuICBBIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkLAorICBNaXNjL3B5bWVtY29tcGF0LmgsIHdoaWNoIGNhbiBiZSBidW5kbGVkIHdpdGggM3JkIHBhcnR5IGV4dGVuc2lvbnMKKyAgYW5kIGxldHMgdGhlbSB1c2UgdGhlIHNhbWUgQVBJIHdpdGggUHl0aG9uIHZlcnNpb25zIGZyb20gMS41LjIKKyAgb253YXJkcy4KKworLSBQeUVycl9EaXNwbGF5IHdpbGwgcHJvdmlkZSBmaWxlIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBhbGwgZXhjZXB0aW9ucworICB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHByaW50X2ZpbGVfYW5kX2xpbmUsIG5vdCBqdXN0IFN5bnRheEVycm9ycy4KKworLSBUaGUgVVRGLTggY29kZWMgd2lsbCBub3cgZW5jb2RlIGFuZCBkZWNvZGUgVW5pY29kZSBzdXJyb2dhdGVzCisgIGNvcnJlY3RseSBhbmQgd2l0aG91dCByYWlzaW5nIGV4Y2VwdGlvbnMgZm9yIHVucGFpcmVkIG9uZXMuCisKKy0gVW5pdmVyc2FsIG5ld2xpbmVzIChQRVAgMjc4KSBpcyBpbXBsZW1lbnRlZC4gIEJyaWVmbHksIHVzaW5nICdVJworICBpbnN0ZWFkIG9mICdyJyB3aGVuIG9wZW5pbmcgYSB0ZXh0IGZpbGUgZm9yIHJlYWRpbmcgY2hhbmdlcyB0aGUgbGluZQorICBlbmRpbmcgY29udmVudGlvbiBzbyB0aGF0IGFueSBvZiAnXHInLCAnXHJcbicsIGFuZCAnXG4nIGlzCisgIHJlY29nbml6ZWQgKGV2ZW4gbWl4ZWQgaW4gb25lIGZpbGUpOyBhbGwgdGhyZWUgYXJlIGNvbnZlcnRlZCB0bworICAnXG4nLCB0aGUgc3RhbmRhcmQgUHl0aG9uIGxpbmUgZW5kIGNoYXJhY3Rlci4KKworLSBmaWxlLnhyZWFkbGluZXMoKSBub3cgcmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgZmlsZSBpcyBjbG9zZWQ6CisgIFByZXZpb3VzbHksIGFuIHhyZWFkbGluZXMgb2JqZWN0IHdhcyByZXR1cm5lZCB3aGljaCB3b3VsZCByYWlzZQorICBhIFZhbHVlRXJyb3Igd2hlbiB0aGUgeHJlYWRsaW5lcy5uZXh0KCkgbWV0aG9kIHdhcyBjYWxsZWQuCisKKy0gc3lzLmV4aXQoKSBpbmFkdmVydGVudGx5IGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4KKyAgQW4gZXhjZXB0aW9uIHdpbGwgbm93IGJlIHJhaXNlZCBpZiBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGlzIHVzZWQuCisKKy0gQ2hhbmdlZCBldmFsdWF0aW9uIG9yZGVyIG9mIGRpY3Rpb25hcnkgbGl0ZXJhbHMgdG8gY29uZm9ybSB0byB0aGUKKyAgZ2VuZXJhbCBsZWZ0IHRvIHJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgcnVsZS4gTm93IHtmMSgpOiBmMigpfSB3aWxsCisgIGV2YWx1YXRlIGYxIGZpcnN0LgorCistIEZpeGVkIGJ1ZyAjNTIxNzgyOiB3aGVuIGEgZmlsZSB3YXMgaW4gbm9uLWJsb2NraW5nIG1vZGUsIGZpbGUucmVhZCgpCisgIGNvdWxkIHNpbGVudGx5IGxvc2UgZGF0YSBvciB3cm9uZ2x5IHRocm93IGFuIHVua25vd24gZXJyb3IuCisKKy0gVGhlIHNxX3JlcGVhdCwgc3FfaW5wbGFjZV9yZXBlYXQsIHNxX2NvbmNhdCBhbmQgc3FfaW5wbGFjZV9jb25jYXQKKyAgc2xvdHMgYXJlIG5vdyBhbHdheXMgdHJpZWQgYWZ0ZXIgdHJ5aW5nIHRoZSBjb3JyZXNwb25kaW5nIG5iXyogc2xvdHMuCisgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2YgbWlub3IgYnVncyAoc2VlIGJ1ZyAjNjI0ODA3KS4KKworLSBGaXggcHJvYmxlbSB3aXRoIGR5bmFtaWMgbG9hZGluZyBvbiA2NC1iaXQgQUlYIChzZWUgYnVnICM2Mzk5NDUpLgorCitFeHRlbnNpb24gbW9kdWxlcworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBZGRlZCB0aHJlZSBvcGVyYXRvcnMgdG8gdGhlIG9wZXJhdG9yIG1vZHVsZToKKyAgICBvcGVyYXRvci5wb3coYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSoqYi4KKyAgICBvcGVyYXRvci5pc18oYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSBpcyBiLgorICAgIG9wZXJhdG9yLmlzX25vdChhLGIpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86ICBhIGlzIG5vdCBiLgorCistIHBvc2l4Lm9wZW5wdHkgbm93IHdvcmtzIG9uIGFsbCBzeXN0ZW1zIHRoYXQgaGF2ZSAvZGV2L3B0bXguCisKKy0gQSBtb2R1bGUgemlwaW1wb3J0IGV4aXN0cyB0byBzdXBwb3J0IGltcG9ydGluZyBjb2RlIGZyb20gemlwCisgIGFyY2hpdmVzLgorCistIFRoZSBuZXcgZGF0ZXRpbWUgbW9kdWxlIHN1cHBsaWVzIGNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBkYXRlcyBhbmQKKyAgdGltZXMuICBUaGUgYmFzaWMgZGVzaWduIGNhbWUgZnJvbSB0aGUgWm9wZSAiZmlzaGJvd2wgcHJvY2VzcyIsIGFuZAorICBmYXZvcnMgcHJhY3RpY2FsIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zIG92ZXIgY2FsZW5kYXIgZXNvdGVyaWNhLiAgU2VlCisKKyAgICAgIGh0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9mZHJha2UvRGF0ZVRpbWVXaWtpL0Zyb250UGFnZQorCistIF90a2ludGVyIG5vdyByZXR1cm5zIFRjbCBvYmplY3RzLCBpbnN0ZWFkIG9mIHN0cmluZ3MuIE9iamVjdHMgd2hpY2gKKyAgaGF2ZSBQeXRob24gZXF1aXZhbGVudHMgYXJlIGNvbnZlcnRlZCB0byBQeXRob24gb2JqZWN0cywgb3RoZXIgb2JqZWN0cworICBhcmUgd3JhcHBlZC4gVGhpcyBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIHRoZSB3YW50b2JqZWN0cyBtZXRob2QsCisgIG9yIFRraW50ZXIud2FudG9iamVjdHMuCisKKy0gVGhlIFB5QlNEREIgd3JhcHBlciBhcm91bmQgdGhlIFNsZWVweWNhdCBCZXJrZWxleSBEQiBsaWJyYXJ5IGhhcworICBiZWVuIGFkZGVkIGFzIHRoZSBwYWNrYWdlIGJzZGRiLiAgVGhlIHRyYWRpdGlvbmFsIGJzZGRiIG1vZHVsZSBpcworICBzdGlsbCBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUsIGJ1dCBub3QgYnVpbHQgYXV0b21hdGljYWxseSBhbnltb3JlLAorICBhbmQgaXMgbm93IG5hbWVkIGJzZGRiMTg1LiAgVGhpcyBzdXBwb3J0cyBCZXJrZWxleSBEQiB2ZXJzaW9ucyBmcm9tCisgIDMuMCB0byA0LjEuICBGb3IgaGVscCBjb252ZXJ0aW5nIHlvdXIgZGF0YWJhc2VzIGZyb20gdGhlIG9sZCBtb2R1bGUgKHdoaWNoCisgIHByb2JhYmx5IHVzZWQgYW4gb2Jzb2xldGUgdmVyc2lvbiBvZiBCZXJrZWxleSBEQikgdG8gdGhlIG5ldyBtb2R1bGUsIHNlZQorICB0aGUgZGIycGlja2xlLnB5IGFuZCBwaWNrbGUyZGIucHkgc2NyaXB0cyBkZXNjcmliZWQgaW4gdGhlIFRvb2xzL0RlbW9zCisgIHNlY3Rpb24gYWJvdmUuCisKKy0gdW5pY29kZWRhdGEgd2FzIHVwZGF0ZWQgdG8gVW5pY29kZSAzLjIuIEl0IHN1cHBvcnRzIG5vcm1hbGl6YXRpb24KKyAgYW5kIG5hbWVzIGZvciBIYW5ndWwgc3lsbGFibGVzIGFuZCBDSksgdW5pZmllZCBpZGVvZ3JhcGhzLgorCistIHJlc291cmNlLmdldHJsaW1pdCgpIG5vdyByZXR1cm5zIGxvbmdzIGluc3RlYWQgb2YgaW50cy4KKworLSByZWFkbGluZSBub3cgZHluYW1pY2FsbHkgYWRqdXN0cyBpdHMgaW5wdXQvb3V0cHV0IHN0cmVhbSBpZgorICBzeXMuc3RkaW4vc3Rkb3V0IGNoYW5nZXMuCisKKy0gVGhlIF90a2ludGVyIG1vZHVsZSAoYW5kIGhlbmNlIFRraW50ZXIpIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yCisgIFRjbC9UayA4LjAgYW5kIDguMS4gIE9ubHkgVGNsL1RrIHZlcnNpb25zIDguMiwgOC4zIGFuZCA4LjQgYXJlCisgIHN1cHBvcnRlZC4KKworLSBjUGlja2xlLkJhZFBpY2tsZUdldCBpcyBub3cgYSBjbGFzcy4KKworLSBUaGUgdGltZSBzdGFtcHMgaW4gb3Muc3RhdF9yZXN1bHQgYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKKyAgYWZ0ZXIgc3RhdF9mbG9hdF90aW1lcyBoYXMgYmVlbiBjYWxsZWQuCisKKy0gSWYgdGhlIHNpemUgcGFzc2VkIHRvIG1tYXAubW1hcCgpIGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCisgIGZpbGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCBhIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiBbU0YgYnVnIDU4NTc5Ml0KKworLSBUaGUgeHJlYWRsaW5lcyBtb2R1bGUgaXMgc2xhdGVkIGZvciBvYnNvbGVzY2VuY2UuCisKKy0gVGhlIHN0cnB0aW1lIGZ1bmN0aW9uIGluIHRoZSB0aW1lIG1vZHVsZSBpcyBub3cgYWx3YXlzIGF2YWlsYWJsZSAoYQorICBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBDIGxpYnJhcnkgZG9lc24ndCBkZWZpbmUgaXQpLgorCistIFRoZSAnbmV3JyBtb2R1bGUgaXMgbm8gbG9uZ2VyIGFuIGV4dGVuc2lvbiwgYnV0IGEgUHl0aG9uIG1vZHVsZSB0aGF0CisgIG9ubHkgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0cyBjb250ZW50cyBhcmUgbm8gbG9uZ2VyCisgIGZ1bmN0aW9ucyBidXQgY2FsbGFibGUgdHlwZSBvYmplY3RzLgorCistIFRoZSBic2RkYi4qb3BlbiBmdW5jdGlvbnMgY2FuIG5vdyB0YWtlICdOb25lJyBhcyBhIGZpbGVuYW1lLgorICBUaGlzIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGluLW1lbW9yeSBic2RkYiB0aGF0IHdvbid0IGJlCisgIHdyaXR0ZW4gdG8gZGlzay4KKworLSBwb3NpeC5nZXRsb2FkYXZnLCBwb3NpeC5sY2hvd24sIHBvc2l4LmtpbGxwZywgcG9zaXgubWtub2QsIGFuZAorICBwb3NpeC5nZXRwZ2lkIGhhdmUgYmVlbiBhZGRlZCB3aGVyZSBhdmFpbGFibGUuCisKKy0gVGhlIGxvY2FsZSBtb2R1bGUgbm93IGV4cG9zZXMgdGhlIEMgbGlicmFyeSdzIGdldHRleHQgaW50ZXJmYWNlLiBJdAorICBhbHNvIGhhcyBhIG5ldyBmdW5jdGlvbiBnZXRwcmVmZXJyZWRlbmNvZGluZy4KKworLSBBIHNlY3VyaXR5IGhvbGUgKCJkb3VibGUgZnJlZSIpIHdhcyBmb3VuZCBpbiB6bGliLTEuMS4zLCBhIHBvcHVsYXIKKyAgdGhpcmQgcGFydHkgY29tcHJlc3Npb24gbGlicmFyeSB1c2VkIGJ5IHNvbWUgUHl0aG9uIG1vZHVsZXMuICBUaGUKKyAgaG9sZSB3YXMgcXVpY2tseSBwbHVnZ2VkIGluIHpsaWItMS4xLjQsIGFuZCB0aGUgV2luZG93cyBidWlsZCBvZgorICBQeXRob24gbm93IHNoaXBzIHdpdGggemxpYi0xLjEuNC4KKworLSBwd2QsIGdycCwgYW5kIHJlc291cmNlIHJldHVybiBlbmhhbmNlZCB0dXBsZXMgbm93LCB3aXRoIHN5bWJvbGljCisgIGZpZWxkIG5hbWVzLgorCistIGFycmF5LmFycmF5IGlzIG5vdyBhIHR5cGUgb2JqZWN0LiBBIG5ldyBmb3JtYXQgY2hhcmFjdGVyCisgICd1JyBpbmRpY2F0ZXMgUHlfVU5JQ09ERSBhcnJheXMuIEZvciB0aG9zZSwgLnRvdW5pY29kZSBhbmQKKyAgLmZyb211bmljb2RlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZS4gQXJyYXlzIG5vdyBzdXBwb3J0IF9faWFkZF9fCisgIGFuZCBfX2ltdWxfXy4KKworLSBkbCBub3cgYnVpbGRzIG9uIGV2ZXJ5IHN5c3RlbSB0aGF0IGhhcyBkbGZjbi5oLiAgRmFpbHVyZSBpbiBjYXNlCisgIG9mIHNpemVvZihpbnQpIT1zaXplb2YobG9uZykhPXNpemVvZih2b2lkKikgaXMgZGVsYXllZCB1bnRpbCBkbC5vcGVuCisgIGlzIGNhbGxlZC4KKworLSBUaGUgc3lzIG1vZHVsZSBhY3F1aXJlZCBhIG5ldyBhdHRyaWJ1dGUsIGFwaV92ZXJzaW9uLCB3aGljaCBldmFsdWF0ZXMKKyAgdG8gdGhlIHZhbHVlIG9mIHRoZSBQWVRIT05fQVBJX1ZFUlNJT04gbWFjcm8gd2l0aCB3aGljaCB0aGUKKyAgaW50ZXJwcmV0ZXIgd2FzIGNvbXBpbGVkLgorCistIEZpeGVkIGJ1ZyAjNDcwNTgyOiBzcmUgbW9kdWxlIHdvdWxkIHJldHVybiBhIHR1cGxlIChOb25lLCAnYScsICdhYicpCisgIHdoZW4gYXBwbHlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnXigoYSljKT8oYWIpJCcgb24gJ2FiJy4gSXQgbm93CisgIHJldHVybnMgKE5vbmUsIE5vbmUsICdhYicpLCBhcyBleHBlY3RlZC4gQWxzbyBmaXhlZCBoYW5kbGluZyBvZgorICBsYXN0aW5kZXgvbGFzdGdyb3VwIG1hdGNoIGF0dHJpYnV0ZXMgaW4gc2ltaWxhciBjYXNlcy4gRm9yIGV4YW1wbGUsCisgIHdoZW4gcnVubmluZyB0aGUgZXhwcmVzc2lvbiByJyhhKShiKT9iJyBvdmVyICdhYicsIGxhc3RpbmRleCBtdXN0IGJlCisgIDEsIG5vdCAyLgorCistIEZpeGVkIGJ1ZyAjNTgxMDgwOiBzcmUgc2Nhbm5lciB3YXMgbm90IGNoZWNraW5nIHRoZSBidWZmZXIgbGltaXQKKyAgYmVmb3JlIGluY3JlYXNpbmcgdGhlIGN1cnJlbnQgcG9pbnRlci4gVGhpcyB3YXMgY3JlYXRpbmcgYW4gaW5maW5pdGUKKyAgbG9vcCBpbiB0aGUgc2VhcmNoIGZ1bmN0aW9uLCBvbmNlIHRoZSBwb2ludGVyIGV4Y2VlZGVkIHRoZSBidWZmZXIKKyAgbGltaXQuCisKKy0gVGhlIG9zLmZkb3BlbiBmdW5jdGlvbiBub3cgZW5mb3JjZXMgYSBmaWxlIG1vZGUgc3RhcnRpbmcgd2l0aCB0aGUKKyAgbGV0dGVyICdyJywgJ3cnIG9yICdhJywgb3RoZXJ3aXNlIGEgVmFsdWVFcnJvciBpcyByYWlzZWQuIFRoaXMgZml4ZXMKKyAgYnVnICM2MjM0NjQuCisKKy0gVGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGlzIG5vdyBkZXByZWNhdGVkOyBpdCBpcyBiZWluZyByZXBsYWNlZCBieQorICBvc3NhdWRpb2Rldi4gIFRoZSBpbnRlcmZhY2UgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gY292ZXIgYSBsb3QgbW9yZSBvZgorICBPU1MgKHNlZSB3d3cub3BlbnNvdW5kLmNvbSksIGluY2x1ZGluZyBtb3N0IERTUCBpb2N0bHMgYW5kIHRoZQorICBPU1MgbWl4ZXIgQVBJLiAgRG9jdW1lbnRhdGlvbiBmb3J0aGNvbWluZyBpbiAyLjNhMi4KKworTGlicmFyeQorLS0tLS0tLQorCistIGltYXBsaWIucHkgbm93IHN1cHBvcnRzIFNTTCAoVGlubyBMYW5nZSBhbmQgUGllcnMgTGF1ZGVyKS4KKworLSBGcmVlemUncyBtb2R1bGVmaW5kZXIucHkgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnk7CisgIHNsaWdodGx5IGltcHJvdmVkIHNvIGl0IHdpbGwgaXNzdWUgbGVzcyBmYWxzZSBtaXNzaW5nIHN1Ym1vZHVsZQorICByZXBvcnRzIChzZWUgc2YgcGF0aCAjNjQzNzExIGZvciBkZXRhaWxzKS4gIERvY3VtZW50YXRpb24gd2lsbCBmb2xsb3cKKyAgd2l0aCBQeXRob24gMi4zYTIuCisKKy0gb3MucGF0aCBleHBvc2VzIGdldGN0aW1lLgorCistIHVuaXR0ZXN0LnB5IG5vdyBoYXMgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcyBjYWxsZWQgYXNzZXJ0QWxtb3N0RXF1YWwoKQorICBhbmQgZmFpbElmQWxtb3N0RXF1YWwoKS4gIFRoZXkgaW1wbGVtZW50IGFuIGFwcHJveGltYXRlIGNvbXBhcmlzb24KKyAgYnkgcm91bmRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGFyZ3VtZW50cyBhbmQgY29tcGFyaW5nCisgIHRoZSByZXN1bHQgdG8gemVyby4gIEFwcHJveGltYXRlIGNvbXBhcmlzb24gaXMgZXNzZW50aWFsIGZvcgorICB1bml0IHRlc3RzIG9mIGZsb2F0aW5nIHBvaW50IHJlc3VsdHMuCisKKy0gY2FsZW5kYXIucHkgbm93IGRlcGVuZHMgb24gdGhlIG5ldyBkYXRldGltZSBtb2R1bGUgcmF0aGVyIHRoYW4KKyAgdGhlIHRpbWUgbW9kdWxlLiAgQXMgYSByZXN1bHQsIHRoZSByYW5nZSBvZiBhbGxvd2FibGUgZGF0ZXMKKyAgaGFzIGJlZW4gaW5jcmVhc2VkLgorCistIHBkYiBoYXMgYSBuZXcgJ2oodW1wKScgY29tbWFuZCB0byBzZWxlY3QgdGhlIG5leHQgbGluZSB0byBiZQorICBleGVjdXRlZC4KKworLSBUaGUgZGlzdHV0aWxzIGNyZWF0ZWQgd2luZG93cyBpbnN0YWxsZXJzIG5vdyBjYW4gcnVuIGEKKyAgcG9zdGluc3RhbGxhdGlvbiBzY3JpcHQuCisKKy0gZG9jdGVzdC50ZXN0bW9kIGNhbiBub3cgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnQsIHdoaWNoIG1lYW5zIHRvCisgIHRlc3QgdGhlIGN1cnJlbnQgbW9kdWxlLgorCistIFdoZW4gY2FuY2VsaW5nIGEgc2VydmVyIHRoYXQgaW1wbGVtZW50ZWQgdGhyZWFkaW5nIHdpdGggYSBrZXlib2FyZAorICBpbnRlcnJ1cHQsIHRoZSBzZXJ2ZXIgd291bGQgc2h1dCBkb3duIGJ1dCBub3QgdGVybWluYXRlICh3YWl0aW5nIG9uCisgIGNsaWVudCB0aHJlYWRzKS4gQSBuZXcgbWVtYmVyIHZhcmlhYmxlLCBkYWVtb25fdGhyZWFkcywgd2FzIGFkZGVkIHRvCisgIHRoZSBUaHJlYWRpbmdNaXhJbiBjbGFzcyBpbiBTb2NrZXRTZXJ2ZXIucHkgdG8gbWFrZSBpdCBleHBsaWNpdCB0aGF0CisgIHRoaXMgYmVoYXZpb3IgbmVlZHMgdG8gYmUgY29udHJvbGxlZC4KKworLSBBIG5ldyBtb2R1bGUsIG9wdHBhcnNlLCBwcm92aWRlcyBhIGZhbmN5IGFsdGVybmF0aXZlIHRvIGdldG9wdCBmb3IKKyAgY29tbWFuZCBsaW5lIHBhcnNpbmcuICBJdCBpcyBhIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgR3JlZworICBXYXJkJ3MgT3B0aWsgcGFja2FnZS4KKworLSBVc2VyRGljdC5weSBub3cgZGVmaW5lcyBhIERpY3RNaXhpbiBjbGFzcyB3aGljaCBkZWZpbmVzIGFsbCBkaWN0aW9uYXJ5CisgIG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBtaW5pbXVtIG1hcHBpbmcgaW50ZXJmYWNlLgorICBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB3cml0aW5nIGNsYXNzZXMgdGhhdCBuZWVkIHRvIGJlIHN1YnN0aXR1dGFibGUKKyAgZm9yIGRpY3Rpb25hcmllcyAoc3VjaCBhcyB0aGUgc2hlbHZlIG1vZHVsZSkuCisKKy0gc2hlbHZlLnB5IG5vdyBzdWJjbGFzc2VzIGZyb20gVXNlckRpY3QuRGljdE1peGluLiAgTm93IHNoZWx2ZSBzdXBwb3J0cworICBhbGwgZGljdGlvbmFyeSBtZXRob2RzLiAgVGhpcyBlYXNlcyB0aGUgdHJhbnNpdGlvbiB0byBwZXJzaXN0ZW50CisgIHN0b3JhZ2UgZm9yIHNjcmlwdHMgb3JpZ2luYWxseSB3cml0dGVuIHdpdGggZGljdGlvbmFyaWVzIGluIG1pbmQuCisKKy0gc2hlbHZlLm9wZW4gYW5kIHRoZSB2YXJpb3VzIGNsYXNzZXMgaW4gc2hlbHZlLnB5IG5vdyBhY2NlcHQgYW4gb3B0aW9uYWwKKyAgYmluYXJ5IGZsYWcsIHdoaWNoIGRlZmF1bHRzIHRvIEZhbHNlLiAgSWYgVHJ1ZSwgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlCisgIHNoZWxmIGFyZSBiaW5hcnkgcGlja2xlcy4KKworLSBBIG5ldyBwYWNrYWdlLCBsb2dnaW5nLCBpbXBsZW1lbnRzIHRoZSBsb2dnaW5nIEFQSSBkZWZpbmVkIGJ5IFBFUAorICAyODIuICBUaGUgY29kZSBpcyB3cml0dGVuIGJ5IFZpbmF5IFNhamlwLgorCistIFN0cmVhbVJlYWRlciwgU3RyZWFtUmVhZGVyV3JpdGVyIGFuZCBTdHJlYW1SZWNvZGVyIGluIHRoZSBjb2RlY3MKKyAgbW9kdWxlcyBhcmUgaXRlcmF0b3JzIG5vdy4KKworLSBnemlwLnB5IG5vdyBoYW5kbGVzIGZpbGVzIGV4Y2VlZGluZyAyR0IuICBGaWxlcyBvdmVyIDRHQiBhbHNvIHdvcmsKKyAgbm93IChwcm92aWRlZCB0aGUgT1Mgc3VwcG9ydHMgaXQsIGFuZCBQeXRob24gaXMgY29uZmlndXJlZCB3aXRoIGxhcmdlCisgIGZpbGUgc3VwcG9ydCksIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIHVuZGVybHlpbmcgZ3ppcCBmaWxlIGZvcm1hdCBjYW4KKyAgcmVjb3JkIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIGZpbGUgc2l6ZSwgc28gdGhhdAorICBzb21lIHRvb2xzIHdvcmtpbmcgd2l0aCBnemlwcGVkIGZpbGVzIG1heSByZXBvcnQgYW4gaW5jb3JyZWN0IGZpbGUKKyAgc2l6ZS4KKworLSB4bWwuc2F4LnNheHV0aWxzLnVuZXNjYXBlIGhhcyBiZWVuIGFkZGVkLCB0byByZXBsYWNlIGVudGl0eSByZWZlcmVuY2VzCisgIHdpdGggdGhlaXIgZW50aXR5IHZhbHVlLgorCistIFF1ZXVlLlF1ZXVlLntwdXQsZ2V0fSBub3cgc3VwcG9ydCBhbiBvcHRpb25hbCB0aW1lb3V0IGFyZ3VtZW50LgorCistIFZhcmlvdXMgZmVhdHVyZXMgb2YgVGsgOC40IGFyZSBleHBvc2VkIGluIFRraW50ZXIucHkuIFRoZSBtdWx0aXBsZQorICBvcHRpb24gb2YgdGtGaWxlRGlhbG9nIGlzIGV4cG9zZWQgYXMgZnVuY3Rpb24gYXNrb3BlbmZpbGV7LG5hbWV9cy4KKworLSBWYXJpb3VzIGNvbmZpZ3VyZSBtZXRob2RzIG9mIFRraW50ZXIgaGF2ZSBiZWVuIHN0cmVhbS1saW5lZCwgc28gdGhhdAorICB0YWdfY29uZmlndXJlLCBpbWFnZV9jb25maWd1cmUsIHdpbmRvd19jb25maWd1cmUgbm93IHJldHVybiBhCisgIGRpY3Rpb25hcnkgd2hlbiBpbnZva2VkIHdpdGggbm8gYXJndW1lbnQuCisKKy0gSW1wb3J0aW5nIHRoZSByZWFkbGluZSBtb2R1bGUgbm93IG5vIGxvbmdlciBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mCisgIGNhbGxpbmcgc2V0bG9jYWxlKExDX0NUWVBFLCAiIikuICBUaGUgaW5pdGlhbCAiQyIgbG9jYWxlLCBvcgorICB3aGF0ZXZlciBsb2NhbGUgaXMgZXhwbGljaXRseSBzZXQgYnkgdGhlIHVzZXIsIGlzIHByZXNlcnZlZC4gIElmIHlvdQorICB3YW50IHJlcHIoKSBvZiA4LWJpdCBzdHJpbmdzIGluIHlvdXIgcHJlZmVycmVkIGVuY29kaW5nIHRvIHByZXNlcnZlCisgIGFsbCBwcmludGFibGUgY2hhcmFjdGVycyBvZiB0aGF0IGVuY29kaW5nLCB5b3UgaGF2ZSB0byBhZGQgdGhlCisgIGZvbGxvd2luZyBjb2RlIHRvIHlvdXIgJFBZVEhPTlNUQVJUVVAgZmlsZSBvciB0byB5b3VyIGFwcGxpY2F0aW9uJ3MKKyAgbWFpbigpOgorCisgICAgaW1wb3J0IGxvY2FsZQorICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAiIikKKworLSBzaHV0aWwubW92ZSB3YXMgYWRkZWQuIHNodXRpbC5jb3B5dHJlZSBub3cgcmVwb3J0cyBlcnJvcnMgYXMgYW4KKyAgZXhjZXB0aW9uIGF0IHRoZSBlbmQsIGluc3RlYWQgb2YgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuCisKKy0gRW5jb2RpbmcgbmFtZSBub3JtYWxpemF0aW9uIHdhcyBnZW5lcmFsaXplZCB0byBub3Qgb25seQorICByZXBsYWNlIGh5cGhlbnMgd2l0aCB1bmRlcnNjb3JlcywgYnV0IGFsc28gYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMKKyAgY2hhcmFjdGVycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBkb3Qgd2hpY2ggaXMgdXNlZCBmb3IgUHl0aG9uCisgIHBhY2thZ2UgbmFtZXMgZHVyaW5nIGxvb2t1cCkuIFRoZSBhbGlhc2VzLnB5IG1hcHBpbmcgd2FzIHVwZGF0ZWQKKyAgdG8gdGhlIG5ldyBzdGFuZGFyZC4KKworLSBtaW1ldHlwZXMgaGFzIHR3byBuZXcgZnVuY3Rpb25zOiBndWVzc19hbGxfZXh0ZW5zaW9ucygpIHdoaWNoCisgIHJldHVybnMgYSBsaXN0IG9mIGFsbCBrbm93biBleHRlbnNpb25zIGZvciBhIG1pbWUgdHlwZSwgYW5kCisgIGFkZF90eXBlKCkgd2hpY2ggYWRkcyBvbmUgbWFwcGluZyBiZXR3ZWVuIGEgbWltZSB0eXBlIGFuZAorICBhbiBleHRlbnNpb24gdG8gdGhlIGRhdGFiYXNlLgorCistIE5ldyBtb2R1bGU6IHNldHMsIGRlZmluZXMgdGhlIGNsYXNzIFNldCB0aGF0IGltcGxlbWVudHMgYSBtdXRhYmxlCisgIHNldCB0eXBlIHVzaW5nIHRoZSBrZXlzIG9mIGEgZGljdCB0byByZXByZXNlbnQgdGhlIHNldC4gIFRoZXJlJ3MKKyAgYWxzbyBhIGNsYXNzIEltbXV0YWJsZVNldCB3aGljaCBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCBzZXRzIG9mIHNldHMKKyAgb3Igd2hlbiB5b3UgbmVlZCB0byB1c2Ugc2V0cyBhcyBkaWN0IGtleXMsIGFuZCBhIGNsYXNzIEJhc2VTZXQgd2hpY2gKKyAgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHR3by4KKworLSBBZGRlZCByYW5kb20uc2FtcGxlKHBvcHVsYXRpb24saykgZm9yIHJhbmRvbSBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50LgorICBSZXR1cm5zIGEgayBsZW5ndGggbGlzdCBvZiB1bmlxdWUgZWxlbWVudHMgY2hvc2VuIGZyb20gdGhlIHBvcHVsYXRpb24uCisKKy0gcmFuZG9tLnJhbmRyYW5nZSgtc3lzLm1heGludC0xLCBzeXMubWF4aW50KSBubyBsb25nZXIgcmFpc2VzCisgIE92ZXJmbG93RXJyb3IuICBUaGF0IGlzLCBpdCBub3cgYWNjZXB0cyBhbnkgY29tYmluYXRpb24gb2YgJ3N0YXJ0JworICBhbmQgJ3N0b3AnIGFyZ3VtZW50cyBzbyBsb25nIGFzIGVhY2ggaXMgaW4gdGhlIHJhbmdlIG9mIFB5dGhvbidzCisgIGJvdW5kZWQgaW50ZWdlcnMuCisKKy0gVGhhbmtzIHRvIFJheW1vbmQgSGV0dGluZ2VyLCByYW5kb20ucmFuZG9tKCkgbm93IHVzZXMgYSBuZXcgY29yZQorICBnZW5lcmF0b3IuICBUaGUgTWVyc2VubmUgVHdpc3RlciBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQgaW4gQywKKyAgdGhyZWFkc2FmZSwgZmFzdGVyIHRoYW4gdGhlIHByZXZpb3VzIGdlbmVyYXRvciwgaGFzIGFuIGFzdHJvbm9taWNhbGx5CisgIGxhcmdlIHBlcmlvZCAoMioqMTk5MzctMSksIGNyZWF0ZXMgcmFuZG9tIGZsb2F0cyB0byBmdWxsIDUzLWJpdAorICBwcmVjaXNpb24sIGFuZCBtYXkgYmUgdGhlIG1vc3Qgd2lkZWx5IHRlc3RlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICBpbiBleGlzdGVuY2UuCisKKyAgVGhlIHJhbmRvbS5qdW1wYWhlYWQobikgbWV0aG9kIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciB0aGUgbmV3CisgIGdlbmVyYXRvci4gIEluc3RlYWQgb2YganVtcGluZyBuIHN0ZXBzIGFoZWFkLCBpdCB1c2VzIG4gYW5kIHRoZQorICBleGlzdGluZyBzdGF0ZSB0byBjcmVhdGUgYSBuZXcgc3RhdGUuICBUaGlzIG1lYW5zIHRoYXQganVtcGFoZWFkKCkKKyAgY29udGludWVzIHRvIHN1cHBvcnQgbXVsdGktdGhyZWFkZWQgY29kZSBuZWVkaW5nIGdlbmVyYXRvcnMgb2YKKyAgbm9uLW92ZXJsYXBwaW5nIHNlcXVlbmNlcy4gIEhvd2V2ZXIsIGl0IHdpbGwgYnJlYWsgY29kZSB3aGljaCByZWxpZXMKKyAgb24ganVtcGFoZWFkIG1vdmluZyBhIHNwZWNpZmljIG51bWJlciBvZiBzdGVwcyBmb3J3YXJkLgorCisgIFRoZSBhdHRyaWJ1dGVzIHJhbmRvbS53aHNlZWQgYW5kIHJhbmRvbS5fX3doc2VlZCBoYXZlIG5vIG1lYW5pbmcgZm9yCisgIHRoZSBuZXcgZ2VuZXJhdG9yLiAgQ29kZSB1c2luZyB0aGVzZSBhdHRyaWJ1dGVzIHNob3VsZCBzd2l0Y2ggdG8gYQorICBuZXcgY2xhc3MsIHJhbmRvbS5XaWNobWFubkhpbGwgd2hpY2ggaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkCisgIGNvbXBhdGliaWxpdHkgYW5kIHRvIG1ha2UgYW4gYWx0ZXJuYXRlIGdlbmVyYXRvciBhdmFpbGFibGUuCisKKy0gTmV3ICJhbGdvcml0aG1zIiBtb2R1bGU6IGhlYXBxLCBpbXBsZW1lbnRzIGEgaGVhcCBxdWV1ZS4gIFRoYW5rcyB0bworICBLZXZpbiBPJ0Nvbm5vciBmb3IgdGhlIGNvZGUgYW5kIEZyYW7Dp29pcyBQaW5hcmQgZm9yIGFuIGVudGVydGFpbmluZworICB3cml0ZS11cCBleHBsYWluaW5nIHRoZSB0aGVvcnkgYW5kIHByYWN0aWNhbCB1c2VzIG9mIGhlYXBzLgorCistIE5ldyBlbmNvZGluZyBmb3IgdGhlIFBhbG0gT1MgY2hhcmFjdGVyIHNldDogcGFsbW9zLgorCistIGJpbmFzY2lpLmNyYzMyKCkgYW5kIHRoZSB6aXBmaWxlIG1vZHVsZSBoYWQgcHJvYmxlbXMgb24gc29tZSA2NC1iaXQKKyAgcGxhdGZvcm1zLiAgVGhlc2UgaGF2ZSBiZWVuIGZpeGVkLiAgT24gYSBwbGF0Zm9ybSB3aXRoIDgtYnl0ZSBDIGxvbmdzLAorICBjcmMzMigpIG5vdyByZXR1cm5zIGEgc2lnbmVkLWV4dGVuZGVkIDQtYnl0ZSByZXN1bHQsIHNvIHRoYXQgaXRzIHZhbHVlCisgIGFzIGEgUHl0aG9uIGludCBpcyBlcXVhbCB0byB0aGUgdmFsdWUgY29tcHV0ZWQgYSAzMi1iaXQgcGxhdGZvcm0uCisKKy0geG1sLmRvbS5taW5pZG9tLnRveG1sIGFuZCB0b3ByZXR0eXhtbCBub3cgdGFrZSBhbiBvcHRpb25hbCBlbmNvZGluZworICBhcmd1bWVudC4KKworLSBTb21lIGZpeGVzIGluIHRoZSBjb3B5IG1vZHVsZTogd2hlbiBhbiBvYmplY3QgaXMgY29waWVkIHRocm91Z2ggaXRzCisgIF9fcmVkdWNlX18gbWV0aG9kLCB0aGVyZSB3YXMgbm8gY2hlY2sgZm9yIGEgX19zZXRzdGF0ZV9fIG1ldGhvZCBvbgorICB0aGUgcmVzdWx0IFtTRiBwYXRjaCA1NjUwODVdOyBkZWVwY29weSBzaG91bGQgdHJlYXQgaW5zdGFuY2VzIG9mCisgIGN1c3RvbSBtZXRhY2xhc3NlcyB0aGUgc2FtZSB3YXkgaXQgdHJlYXRzIGluc3RhbmNlcyBvZiB0eXBlICd0eXBlJworICBbU0YgcGF0Y2ggNTYwNzk0XS4KKworLSBTb2NrZXRzIG5vdyBzdXBwb3J0IHRpbWVvdXQgbW9kZS4gIEFmdGVyIHMuc2V0dGltZW91dChUKSwgd2hlcmUgVCBpcworICBhIGZsb2F0IGV4cHJlc3Npbmcgc2Vjb25kcywgc3Vic2VxdWVudCBvcGVyYXRpb25zIHJhaXNlIGFuIGV4Y2VwdGlvbgorICBpZiB0aGV5IGNhbm5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIFQgc2Vjb25kcy4gIFRvIGRpc2FibGUgdGltZW91dAorICBtb2RlLCB1c2Ugcy5zZXR0aW1lb3V0KE5vbmUpLiAgVGhlcmUncyBhbHNvIGEgbW9kdWxlIGZ1bmN0aW9uLAorICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoVCksIHdoaWNoIHNldHMgdGhlIGRlZmF1bHQgZm9yIGFsbCBzb2NrZXRzCisgIGNyZWF0ZWQgaGVuY2Vmb3J0aC4KKworLSBnZXRvcHQuZ251X2dldG9wdCB3YXMgYWRkZWQuICBUaGlzIHN1cHBvcnRzIEdOVS1zdHlsZSBvcHRpb24KKyAgcHJvY2Vzc2luZywgd2hlcmUgb3B0aW9ucyBjYW4gYmUgbWl4ZWQgd2l0aCBub24tb3B0aW9uIGFyZ3VtZW50cy4KKworLSBTdG9wIHVzaW5nIHN0cmluZ3MgZm9yIGV4Y2VwdGlvbnMuICBTdHJpbmcgb2JqZWN0cyB1c2VkIGZvcgorICBleGNlcHRpb25zIGFyZSBub3cgY2xhc3NlcyBkZXJpdmluZyBmcm9tIEV4Y2VwdGlvbi4gIFRoZSBvYmplY3RzCisgIGNoYW5nZWQgd2VyZTogVGtpbnRlci5UY2xFcnJvciwgYmRiLkJkYlF1aXQsIG1hY3BhdGgubm9ybV9lcnJvciwKKyAgdGFibmFubnkuTmFubnlOYWcsIGFuZCB4ZHJsaWIuRXJyb3IuCisKKy0gQ29uc3RhbnRzIEJPTV9VVEY4LCBCT01fVVRGMTYsIEJPTV9VVEYxNl9MRSwgQk9NX1VURjE2X0JFLAorICBCT01fVVRGMzIsIEJPTV9VVEYzMl9MRSBhbmQgQk9NX1VURjMyX0JFIHRoYXQgcmVwcmVzZW50IHRoZSBCeXRlCisgIE9yZGVyIE1hcmsgaW4gVVRGLTgsIFVURi0xNiBhbmQgVVRGLTMyIGVuY29kaW5ncyBmb3IgbGl0dGxlIGFuZAorICBiaWcgZW5kaWFuIHN5c3RlbXMgd2VyZSBhZGRlZCB0byB0aGUgY29kZWNzIG1vZHVsZS4gVGhlIG9sZCBuYW1lcworICBCT00zMl8qIGFuZCBCT002NF8qIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDIuCisKKy0gQWRkZWQgY29udmVyc2lvbiBmdW5jdGlvbnMgbWF0aC5kZWdyZWVzKCkgYW5kIG1hdGgucmFkaWFucygpLgorCistIG1hdGgubG9nKCkgbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50OiAgbWF0aC5sb2coeFssIGJhc2VdKS4KKworLSBmdHBsaWIucmV0cmxpbmVzKCkgbm93IHRlc3RzIGZvciBjYWxsYmFjayBpcyBOb25lIHJhdGhlciB0aGFuIHRlc3RpbmcKKyAgZm9yIEZhbHNlLiAgV2FzIGNhdXNpbmcgYW4gZXJyb3Igd2hlbiBnaXZlbiBhIGNhbGxiYWNrIG9iamVjdCB3aGljaAorICB3YXMgY2FsbGFibGUgYnV0IGFsc28gcmV0dXJuZWQgbGVuKCkgYXMgemVyby4gIFRoZSBjaGFuZ2UgbWF5CisgIGNyZWF0ZSBuZXcgYnJlYWthZ2UgaWYgdGhlIGNhbGxlciByZWxpZWQgb24gdGhlIHVuZG9jdW1lbnRlZCBiZWhhdmlvcgorICBhbmQgY2FsbGVkIHdpdGggY2FsbGJhY2sgc2V0IHRvIFtdIG9yIHNvbWUgb3RoZXIgRmFsc2UgdmFsdWUgbm90CisgIGlkZW50aWNhbCB0byBOb25lLgorCistIHJhbmRvbS5nYXVzcygpIHVzZXMgYSBwaWVjZSBvZiBoaWRkZW4gc3RhdGUgdXNlZCBieSBub3RoaW5nIGVsc2UsCisgIGFuZCB0aGUgLnNlZWQoKSBhbmQgLndoc2VlZCgpIG1ldGhvZHMgZmFpbGVkIHRvIHJlc2V0IGl0LiAgSW4gb3RoZXIKKyAgd29yZHMsIHNldHRpbmcgdGhlIHNlZWQgZGlkbid0IGNvbXBsZXRlbHkgZGV0ZXJtaW5lIHRoZSBzZXF1ZW5jZSBvZgorICByZXN1bHRzIHByb2R1Y2VkIGJ5IHJhbmRvbS5nYXVzcygpLiAgSXQgZG9lcyBub3cuICBQcm9ncmFtcyByZXBlYXRlZGx5CisgIG1peGluZyBjYWxscyB0byBhIHNlZWQgbWV0aG9kIHdpdGggY2FsbHMgdG8gZ2F1c3MoKSBtYXkgc2VlIGRpZmZlcmVudAorICByZXN1bHRzIG5vdy4KKworLSBUaGUgcGlja2xlLlBpY2tsZXIgY2xhc3MgZ3JldyBhIGNsZWFyX21lbW8oKSBtZXRob2QgdG8gbWltaWMgdGhhdAorICBwcm92aWRlZCBieSBjUGlja2xlLlBpY2tsZXIuCisKKy0gZGlmZmxpYidzIFNlcXVlbmNlTWF0Y2hlciBjbGFzcyBub3cgZG9lcyBhIGR5bmFtaWMgYW5hbHlzaXMgb2YKKyAgd2hpY2ggZWxlbWVudHMgYXJlIHNvIGZyZXF1ZW50IGFzIHRvIGNvbnN0aXR1dGUgbm9pc2UuICBGb3IKKyAgY29tcGFyaW5nIGZpbGVzIGFzIHNlcXVlbmNlcyBvZiBsaW5lcywgdGhpcyBnZW5lcmFsbHkgd29ya3MgYmV0dGVyCisgIHRoYW4gdGhlIElTX0xJTkVfSlVOSyBmdW5jdGlvbiwgYW5kIGZ1bmN0aW9uIG5kaWZmJ3MgbGluZWp1bmsKKyAgYXJndW1lbnQgZGVmYXVsdHMgdG8gTm9uZSBub3cgYXMgYSByZXN1bHQuICBBIGhhcHB5IGJlbmVmaXQgaXMKKyAgdGhhdCBTZXF1ZW5jZU1hdGNoZXIgbWF5IHJ1biBtdWNoIGZhc3RlciBub3cgd2hlbiBhcHBsaWVkCisgIHRvIGxhcmdlIGZpbGVzIHdpdGggbWFueSBkdXBsaWNhdGUgbGluZXMgKGZvciBleGFtcGxlLCBDIHByb2dyYW0KKyAgdGV4dCB3aXRoIGxvdHMgb2YgcmVwZWF0ZWQgIn0iIGFuZCAicmV0dXJuIE5VTEw7IiBsaW5lcykuCisKKy0gTmV3IFRleHQuZHVtcCgpIG1ldGhvZCBpbiBUa2ludGVyIG1vZHVsZS4KKworLSBOZXcgZGlzdHV0aWxzIGNvbW1hbmRzIGZvciBidWlsZGluZyBwYWNrYWdlcnMgd2VyZSBhZGRlZCB0bworICBzdXBwb3J0IHBrZ3Rvb2wgb24gU29sYXJpcyBhbmQgc3dpbnN0YWxsIG9uIEhQLVVYLgorCistIGRpc3R1dGlscyBub3cgaGFzIGEgbmV3IGFic3RyYWN0IGJpbmFyeSBwYWNrYWdlciBiYXNlIGNsYXNzCisgIGNvbW1hbmQvYmRpc3RfcGFja2FnZXIsIHdoaWNoIHNpbXBsaWZpZXMgd3JpdGluZyBwYWNrYWdlcnMuCisgIFRoaXMgd2lsbCBob3BlZnVsbHkgcHJvdmlkZSB0aGUgbWlzc2luZyBiaXRzIHRvIGVuY291cmFnZQorICBwZW9wbGUgdG8gc3VibWl0IG1vcmUgcGFja2FnZXJzLCBlLmcuIGZvciBEZWJpYW4sIEZyZWVCU0QKKyAgYW5kIG90aGVyIHN5c3RlbXMuCisKKy0gVGhlIFVURi0xNiwgLUxFIGFuZCAtQkUgc3RyZWFtIHJlYWRlcnMgbm93IHJhaXNlIGEKKyAgTm90SW1wbGVtZW50ZWRFcnJvciBmb3IgYWxsIGNhbGxzIHRvIC5yZWFkbGluZSgpLiBQcmV2aW91c2x5LCB0aGV5CisgIHVzZWQgdG8ganVzdCBwcm9kdWNlIGdhcmJhZ2Ugb3IgZmFpbCB3aXRoIGFuIGVuY29kaW5nIGVycm9yIC0tCisgIFVURi0xNiBpcyBhIDItYnl0ZSBlbmNvZGluZyBhbmQgdGhlIEMgbGliJ3MgbGluZSByZWFkaW5nIEFQSXMgZG9uJ3QKKyAgd29yayB3ZWxsIHdpdGggdGhlc2UuCisKKy0gY29tcGlsZWFsbCBub3cgc3VwcG9ydHMgcXVpZXQgb3BlcmF0aW9uLgorCistIFRoZSBCYXNlSFRUUFNlcnZlciBub3cgaW1wbGVtZW50cyBvcHRpb25hbCBIVFRQLzEuMSBwZXJzaXN0ZW50CisgIGNvbm5lY3Rpb25zLgorCistIHNvY2tldCBtb2R1bGU6IHRoZSBTU0wgc3VwcG9ydCB3YXMgYnJva2VuIG91dCBvZiB0aGUgbWFpbgorICBfc29ja2V0IG1vZHVsZSBDIGhlbHBlciBhbmQgcGxhY2VkIGludG8gYSBuZXcgX3NzbCBoZWxwZXIKKyAgd2hpY2ggbm93IGdldHMgaW1wb3J0ZWQgYnkgc29ja2V0LnB5IGlmIGF2YWlsYWJsZSBhbmQgd29ya2luZy4KKworLSBlbmNvZGluZ3MgcGFja2FnZTogYWRkZWQgYWxpYXNlcyBmb3IgYWxsIHN1cHBvcnRlZCBJQU5BIGNoYXJhY3RlcgorICBzZXRzCisKKy0gZnRwbGliOiB0byBzYWZlZ3VhcmQgdGhlIHVzZXIncyBwcml2YWN5LCBhbm9ueW1vdXMgbG9naW4gd2lsbCB1c2UKKyAgImFub255bW91c0AiIGFzIGRlZmF1bHQgcGFzc3dvcmQsIHJhdGhlciB0aGFuIHRoZSByZWFsIHVzZXIgYW5kIGhvc3QKKyAgbmFtZS4KKworLSB3ZWJicm93c2VyOiB0aWdodGVuZWQgdXAgdGhlIGNvbW1hbmQgcGFzc2VkIHRvIG9zLnN5c3RlbSgpIHNvIHRoYXQKKyAgYXJiaXRyYXJ5IHNoZWxsIGNvZGUgY2FuJ3QgYmUgZXhlY3V0ZWQgYmVjYXVzZSBhIGJvZ3VzIFVSTCB3YXMKKyAgcGFzc2VkIGluLgorCistIGdldHRleHQudHJhbnNsYXRpb24gaGFzIGFuIG9wdGlvbmFsIGZhbGxiYWNrIGFyZ3VtZW50LCBhbmQKKyAgZ2V0dGV4dC5maW5kIGFuIG9wdGlvbmFsIGFsbCBhcmd1bWVudC4gVHJhbnNsYXRpb25zIHdpbGwgbm93IGZhbGxiYWNrCisgIG9uIGEgcGVyLW1lc3NhZ2UgYmFzaXMuIFRoZSBtb2R1bGUgc3VwcG9ydHMgcGx1cmFsIGZvcm1zLCBieSBtZWFucworICBvZiBnZXR0ZXh0LltkXW5nZXR0ZXh0IGFuZCBUcmFuc2xhdGlvbi5bdV1uZ2V0dGV4dC4KKworLSBkaXN0dXRpbHMgYmRpc3QgY29tbWFuZHMgbm93IG9mZmVyIGEgLS1za2lwLWJ1aWxkIG9wdGlvbi4KKworLSB3YXJuaW5ncy53YXJuIG5vdyBhY2NlcHRzIGEgV2FybmluZyBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudC4KKworLSBUaGUgeG1sLnNheC5leHBhdHJlYWRlci5FeHBhdFBhcnNlciBjbGFzcyB3aWxsIG5vIGxvbmdlciBjcmVhdGUKKyAgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSB1c2luZyBpdHNlbGYgYXMgdGhlIGxvY2F0b3IgdGhhdCBnZXRzIHBhc3NlZAorICB0byB0aGUgY29udGVudCBoYW5kbGVyIGltcGxlbWVudGF0aW9uLiAgW1NGIGJ1ZyAjNTM1NDc0XQorCistIFRoZSBlbWFpbC5QYXJzZXIuUGFyc2VyIGNsYXNzIG5vdyBwcm9wZXJseSBwYXJzZXMgc3RyaW5ncyByZWdhcmRsZXNzCisgIG9mIHRoZWlyIGxpbmUgZW5kaW5ncywgd2hpY2ggY2FuIGJlIGFueSBvZiBcciwgXG4sIG9yIFxyXG4gKENSLCBMRiwKKyAgb3IgQ1JMRikuICBBbHNvLCB0aGUgSGVhZGVyIGNsYXNzJ3MgY29uc3RydWN0b3IgZGVmYXVsdCBhcmd1bWVudHMKKyAgaGFzIGNoYW5nZWQgc2xpZ2h0bHkgc28gdGhhdCBhbiBleHBsaWNpdCBtYXhsaW5lbGVuIHZhbHVlIGlzIGFsd2F5cworICBob25vcmVkLCBhbmQgc28gdW5pY29kZSBjb252ZXJzaW9uIGVycm9yIGhhbmRsaW5nIGNhbiBiZSBzcGVjaWZpZWQuCisKKy0gZGlzdHV0aWxzJyBidWlsZF9leHQgY29tbWFuZCBub3cgbGlua3MgQysrIGV4dGVuc2lvbnMgd2l0aCB0aGUgQysrCisgIGNvbXBpbGVyIGF2YWlsYWJsZSBpbiB0aGUgTWFrZWZpbGUgb3IgQ1hYIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZgorICBydW5uaW5nIHVuZGVyIFwqbml4LgorCistIE5ldyBtb2R1bGUgYnoyOiBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlIGZvciB0aGUgYnoyIGNvbXByZXNzaW9uCisgIGxpYnJhcnkuICBJdCBpbXBsZW1lbnRzIGEgY29tcGxldGUgZmlsZSBpbnRlcmZhY2UsIG9uZS1zaG90IChkZSljb21wcmVzc2lvbgorICBmdW5jdGlvbnMsIGFuZCB0eXBlcyBmb3Igc2VxdWVudGlhbCAoZGUpY29tcHJlc3Npb24uCisKKy0gTmV3IHBkYiBjb21tYW5kICdwcCcgd2hpY2ggaXMgbGlrZSAncCcgZXhjZXB0IHRoYXQgaXQgcHJldHR5LXByaW50cworICB0aGUgdmFsdWUgb2YgaXRzIGV4cHJlc3Npb24gYXJndW1lbnQuCisKKy0gTm93IGJkaXN0X3JwbSBkaXN0dXRpbHMgY29tbWFuZCB1bmRlcnN0YW5kcyBhIHZlcmlmeV9zY3JpcHQgb3B0aW9uIGluCisgIHRoZSBjb25maWcgZmlsZSwgaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgcmVmZXJyZWQgZmlsZW5hbWUgaW4KKyAgdGhlICIldmVyaWZ5c2NyaXB0IiBzZWN0aW9uIG9mIHRoZSBycG0gc3BlYyBmaWxlLgorCistIEZpeGVkIGJ1ZyAjNDk1Njk1OiB3ZWJicm93c2VyIG1vZHVsZSB3b3VsZCBydW4gZ3JhcGhpYyBicm93c2VycyBpbiBhCisgIHVuaXggZW52aXJvbm1lbnQgZXZlbiBpZiBESVNQTEFZIHdhcyBub3Qgc2V0LiBBbHNvLCBzdXBwb3J0IGZvcgorICBza2lwc3RvbmUgYnJvd3NlciB3YXMgaW5jbHVkZWQuCisKKy0gRml4ZWQgYnVnICM2MzY3Njk6IHJleGVjIHdvdWxkIHJ1biB1bmFsbG93ZWQgY29kZSBpZiBzdWJjbGFzc2VzIG9mCisgIHN0cmluZ3Mgd2VyZSB1c2VkIGFzIHBhcmFtZXRlcnMgZm9yIGNlcnRhaW4gZnVuY3Rpb25zLgorCitUb29scy9EZW1vcworLS0tLS0tLS0tLS0KKworLSBweWdldHRleHQucHkgbm93IHN1cHBvcnRzIGdsb2JiaW5nIG9uIFdpbmRvd3MsIGFuZCBhY2NlcHRzIG1vZHVsZQorICBuYW1lcyBpbiBhZGRpdGlvbiB0byBhY2NlcHRpbmcgZmlsZSBuYW1lcy4KKworLSBUaGUgU0dJIGRlbW9zIChEZW1vL3NnaSkgaGF2ZSBiZWVuIHJlbW92ZWQuICBOb2JvZHkgdGhvdWdodCB0aGV5CisgIHdlcmUgaW50ZXJlc3RpbmcgYW55IG1vcmUuICAoVGhlIFNHSSBsaWJyYXJ5IG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMKKyAgYXJlIHN0aWxsIHRoZXJlOyBpdCBpcyBiZWxpZXZlZCB0aGF0IGF0IGxlYXN0IHNvbWUgb2YgdGhlc2UgYXJlCisgIHN0aWxsIHVzZWQgYW5kIHVzZWZ1bC4pCisKKy0gSURMRSBzdXBwb3J0cyB0aGUgbmV3IGVuY29kaW5nIGRlY2xhcmF0aW9ucyAoUEVQIDI2Myk7IGl0IGNhbiBhbHNvCisgIGRlYWwgd2l0aCBsZWdhY3kgOC1iaXQgZmlsZXMgaWYgdGhleSB1c2UgdGhlIGxvY2FsZSdzIGVuY29kaW5nLiBJdAorICBhbGxvd3Mgbm9uLUFTQ0lJIHN0cmluZ3MgaW4gdGhlIGludGVyYWN0aXZlIHNoZWxsIGFuZCBleGVjdXRlcyB0aGVtCisgIGluIHRoZSBsb2NhbGUncyBlbmNvZGluZy4KKworLSBmcmVlemUucHkgbm93IHByb2R1Y2VzIGJpbmFyaWVzIHdoaWNoIGNhbiBpbXBvcnQgc2hhcmVkIG1vZHVsZXMsCisgIHVubGlrZSBiZWZvcmUgd2hlbiB0aGlzIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzeW1ib2wgZXhwb3J0cyBpbgorICB0aGUgZ2VuZXJhdGVkIGJpbmFyeS4KKworQnVpbGQKKy0tLS0tCisKKy0gT24gVW5peCwgSURMRSBpcyBub3cgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkuCisKKy0gVGhlIGZwZWN0bCBtb2R1bGUgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQ7IGl0J3MgZGFuZ2Vyb3VzIG9yIHVzZWxlc3MKKyAgZXhjZXB0IGluIHRoZSBoYW5kcyBvZiBleHBlcnRzLgorCistIFRoZSBwdWJsaWMgUHl0aG9uIEMgQVBJIHdpbGwgZ2VuZXJhbGx5IGJlIGRlY2xhcmVkIHVzaW5nIFB5QVBJX0ZVTkMKKyAgYW5kIFB5QVBJX0RBVEEgbWFjcm9zLCB3aGlsZSBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZSBpbml0IGZ1bmN0aW9ucworICB3aWxsIGJlIGRlY2xhcmVkIHdpdGggUHlNT0RJTklUX0ZVTkMuICBETF9FWFBPUlQvRExfSU1QT1JUIG1hY3JvcworICBhcmUgZGVwcmVjYXRlZC4KKworLSBBIGJ1ZyB3YXMgZml4ZWQgdGhhdCBjb3VsZCBjYXVzZSBDT1VOVF9BTExPQ1MgYnVpbGRzIHRvIHNlZ2ZhdWx0LCBvcgorICBnZXQgaW50byBpbmZpbml0ZSBsb29wcywgd2hlbiBhIG5ldy1zdHlsZSBjbGFzcyBnb3QgZ2FyYmFnZS1jb2xsZWN0ZWQuCisgIFVuZm9ydHVuYXRlbHksIHRvIGF2b2lkIHRoaXMsIHRoZSB3YXkgQ09VTlRfQUxMT0NTIHdvcmtzIHJlcXVpcmVzCisgIHRoYXQgbmV3LXN0eWxlIGNsYXNzZXMgYmUgaW1tb3J0YWwgaW4gQ09VTlRfQUxMT0NTIGJ1aWxkcy4gIE5vdGUgdGhhdAorICBDT1VOVF9BTExPQ1MgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgaW4gZWl0aGVyIHJlbGVhc2Ugb3IgZGVidWcKKyAgYnVpbGRzLCBhbmQgdGhhdCBuZXctc3R5bGUgY2xhc3NlcyBhcmUgaW1tb3J0YWwgb25seSBpbiBDT1VOVF9BTExPQ1MKKyAgYnVpbGRzLgorCistIENvbXBpbGluZyBvdXQgdGhlIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBubyBsb25nZXIgYW4gb3B0aW9uLgorICBUaGUgb2xkIHN5bWJvbCBXSVRIX0NZQ0xFX0dDIGlzIG5vdyBpZ25vcmVkLCBhbmQgUHl0aG9uLmggYXJyYW5nZXMKKyAgdGhhdCBpdCdzIGFsd2F5cyBkZWZpbmVkIChmb3IgdGhlIGJlbmVmaXQgb2YgYW55IGV4dGVuc2lvbiBtb2R1bGVzCisgIHRoYXQgbWF5IGJlIGNvbmRpdGlvbmFsaXppbmcgb24gaXQpLiAgQSBib251cyBpcyB0aGF0IGFueSBleHRlbnNpb24KKyAgdHlwZSBwYXJ0aWNpcGF0aW5nIGluIGN5Y2xpYyBnYyBjYW4gY2hvb3NlIHRvIHBhcnRpY2lwYXRlIGluIHRoZQorICBQeV9UUkFTSENBTiBtZWNoYW5pc20gbm93IHRvbzsgaW4gdGhlIGFic2VuY2Ugb2YgY3ljbGljIGdjLCB0aGlzIHVzZWQKKyAgdG8gcmVxdWlyZSBlZGl0aW5nIHRoZSBjb3JlIHRvIHRlYWNoIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20gYWJvdXQgdGhlCisgIG5ldyB0eXBlLgorCistIEFjY29yZGluZyB0byBBbm5leCBGIG9mIHRoZSBjdXJyZW50IEMgc3RhbmRhcmQsCisKKyAgICBUaGUgU3RhbmRhcmQgQyBtYWNybyBIVUdFX1ZBTCBhbmQgaXRzIGZsb2F0IGFuZCBsb25nIGRvdWJsZSBhbmFsb2dzLAorICAgIEhVR0VfVkFMRiBhbmQgSFVHRV9WQUxMLCBleHBhbmQgdG8gZXhwcmVzc2lvbnMgd2hvc2UgdmFsdWVzIGFyZQorICAgIHBvc2l0aXZlIGluZmluaXRpZXMuCisKKyAgUHl0aG9uIG9ubHkgdXNlcyB0aGUgZG91YmxlIEhVR0VfVkFMLCBhbmQgb25seSB0byAjZGVmaW5lIGl0cyBvd24gc3ltYm9sCisgIFB5X0hVR0VfVkFMLiAgU29tZSBwbGF0Zm9ybXMgaGF2ZSBpbmNvcnJlY3QgZGVmaW5pdGlvbnMgZm9yIEhVR0VfVkFMLgorICBweXBvcnQuaCB1c2VkIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LCBidXQgdGhlIHdvcmthcm91bmRzIHRyaWdnZXJlZAorICBvdGhlciBidWdzIG9uIG90aGVyIHBsYXRmb3Jtcywgc28gd2UgZ2F2ZSB1cC4gIElmIHlvdXIgcGxhdGZvcm0gZGVmaW5lcworICBIVUdFX1ZBTCBpbmNvcnJlY3RseSwgeW91J2xsIG5lZWQgdG8gI2RlZmluZSBQeV9IVUdFX1ZBTCB0byBzb21ldGhpbmcKKyAgdGhhdCB3b3JrcyBvbiB5b3VyIHBsYXRmb3JtLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBJJ20gc3VyZSBhYm91dAorICBpcyBvbiBhbiB1bmtub3duIHN1YnNldCBvZiBDcmF5IHN5c3RlbXMsIGRlc2NyaWJlZCBoZXJlOgorCisgIGh0dHA6Ly93d3cuY3JheS5jb20vc3dwdWJzL21hbnVhbHMvU04tMjE5NF8yLjAvaHRtbC1TTi0yMTk0XzIuMC94MzEzOC5odG0KKworICBQcmVzdW1hYmx5IDIuM2ExIGJyZWFrcyBzdWNoIHN5c3RlbXMuICBJZiBhbnlvbmUgdXNlcyBzdWNoIGEgc3lzdGVtLCBoZWxwIQorCistIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aG91dC1kb2Mtc3RyaW5ncyBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlCisgIGRvYyBzdHJpbmdzIGZyb20gdGhlIGJ1aWx0aW4gZnVuY3Rpb25zIGFuZCBtb2R1bGVzOyB0aGlzIHJlZHVjZXMgdGhlCisgIHNpemUgb2YgdGhlIGV4ZWN1dGFibGUuCisKKy0gVGhlIHVuaXZlcnNhbCBuZXdsaW5lcyBvcHRpb24gKFBFUCAyNzgpIGlzIG9uIGJ5IGRlZmF1bHQuICBPbiBVbml4CisgIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIC0td2l0aG91dC11bml2ZXJzYWwtbmV3bGluZXMgdG8gdGhlCisgIGNvbmZpZ3VyZSBzY3JpcHQuICBPbiBvdGhlciBwbGF0Zm9ybXMsIHJlbW92ZQorICBXSVRIX1VOSVZFUlNBTF9ORVdMSU5FUyBmcm9tIHB5Y29uZmlnLmguCisKKy0gT24gVW5peCwgYSBzaGFyZWQgbGlicHl0aG9uMi4zLnNvIGNhbiBiZSBjcmVhdGVkIHdpdGggLS1lbmFibGUtc2hhcmVkLgorCistIEFsbCB1c2VzIG9mIHRoZSBDQUNIRV9IQVNILCBJTlRFUk5fU1RSSU5HUywgYW5kIERPTlRfU0hBUkVfU0hPUlRfU1RSSU5HUworICBwcmVwcm9jZXNzb3Igc3ltYm9scyB3ZXJlIGVsaW1pbmF0ZWQuICBUaGUgaW50ZXJuYWwgZGVjaXNpb25zIHRoZXkKKyAgY29udHJvbGxlZCBzdG9wcGVkIGJlaW5nIGV4cGVyaW1lbnRhbCBsb25nIGFnby4KKworLSBUaGUgdG9vbHMgdXNlZCB0byBidWlsZCB0aGUgZG9jdW1lbnRhdGlvbiBub3cgd29yayB1bmRlciBDeWd3aW4gYXMKKyAgd2VsbCBhcyBVbml4LgorCistIFRoZSBic2RkYiBhbmQgZGJtIG1vZHVsZSBidWlsZHMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gdHJ5IGFuZCBhdm9pZCB2ZXJzaW9uCisgIHNrZXcgcHJvYmxlbXMgYW5kIGRpc2FibGUgbGlua2FnZSB3aXRoIEJlcmtlbGV5IERCIDEuODUgdW5sZXNzIHRoZQorICBpbnN0YWxsZXIga25vd3Mgd2hhdCBzL2hlJ3MgZG9pbmcuICBTZWUgdGhlIHNlY3Rpb24gb24gYnVpbGRpbmcgdGhlc2UKKyAgbW9kdWxlcyBpbiB0aGUgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuCisKK0MgQVBJCistLS0tLQorCistIFB5TnVtYmVyX0NoZWNrKCkgbm93IHJldHVybnMgdHJ1ZSBmb3Igc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMuCisgIFRoaXMgaXMgYSByZXN1bHQgb2YgdGhlc2UgdHlwZXMgaGF2aW5nIGEgcGFydGlhbGx5IGRlZmluZWQKKyAgdHBfYXNfbnVtYmVyIHNsb3QuICAoVGhpcyBpcyBub3QgYSBmZWF0dXJlLCBidXQgYW4gaW5kaWNhdGlvbiB0aGF0CisgIFB5TnVtYmVyX0NoZWNrKCkgaXMgbm90IHZlcnkgdXNlZnVsIHRvIGRldGVybWluZSBudW1lcmljIGJlaGF2aW9yLgorICBJdCBtYXkgYmUgZGVwcmVjYXRlZC4pCisKKy0gVGhlIHN0cmluZyBvYmplY3QncyBsYXlvdXQgaGFzIGNoYW5nZWQ6IHRoZSBwb2ludGVyIG1lbWJlcgorICBvYl9zaW50ZXJuZWQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYW4gaW50IG1lbWJlciBvYl9zc3RhdGUuICBPbiBzb21lCisgIHBsYXRmb3JtcyAoZS5nLiBtb3N0IDY0LWJpdCBzeXN0ZW1zKSB0aGlzIG1heSBjaGFuZ2UgdGhlIG9mZnNldCBvZgorICB0aGUgb2Jfc3ZhbCBtZW1iZXIsIHNvIGFzIGEgcHJlY2F1dGlvbiB0aGUgQVBJX1ZFUlNJT04gaGFzIGJlZW4KKyAgaW5jcmVtZW50ZWQuICBUaGUgYXBwYXJlbnRseSB1bnVzZWQgZmVhdHVyZSBvZiAiaW5kaXJlY3QgaW50ZXJuZWQKKyAgc3RyaW5ncyIsIHN1cHBvcnRlZCBieSB0aGUgb2Jfc2ludGVybmVkIG1lbWJlciwgaXMgZ29uZS4gIEludGVybmVkCisgIHN0cmluZ3MgYXJlIG5vdyB1c3VhbGx5IG1vcnRhbDsgdGhlcmUgaXMgYSBuZXcgQVBJLAorICBQeVN0cmluZ19JbnRlcm5JbW1vcnRhbCgpIHRoYXQgY3JlYXRlcyBpbW1vcnRhbCBpbnRlcm5lZCBzdHJpbmdzLgorICAoVGhlIG9iX3NzdGF0ZSBtZW1iZXIgY2FuIG9ubHkgdGFrZSB0aHJlZSB2YWx1ZXM7IGhvd2V2ZXIsIHdoaWxlCisgIG1ha2luZyBpdCBhIGNoYXIgc2F2ZXMgYSBmZXcgYnl0ZXMgcGVyIHN0cmluZyBvYmplY3Qgb24gYXZlcmFnZSwgaW4KKyAgaXQgYWxzbyBzbG93ZWQgdGhpbmdzIGRvd24gYSBiaXQgYmVjYXVzZSBvYl9zdmFsIHdhcyBubyBsb25nZXIKKyAgYWxpZ25lZC4pCisKKy0gVGhlIFB5X0luaXRNb2R1bGUqKCkgZnVuY3Rpb25zIG5vdyBhY2NlcHQgTlVMTCBmb3IgdGhlICdtZXRob2RzJworICBhcmd1bWVudC4gIE1vZHVsZXMgd2l0aG91dCBnbG9iYWwgZnVuY3Rpb25zIGFyZSBiZWNvbWluZyBtb3JlIGNvbW1vbgorICBub3cgdGhhdCBmYWN0b3JpZXMgY2FuIGJlIHR5cGVzIHJhdGhlciB0aGFuIGZ1bmN0aW9ucy4KKworLSBOZXcgQyBBUEkgUHlVbmljb2RlX0Zyb21PcmRpbmFsKCkgd2hpY2ggZXhwb3NlcyB1bmljaHIoKSBhdCBDCisgIGxldmVsLgorCistIE5ldyBmdW5jdGlvbnMgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoKSBhbmQKKyAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoKS4gU2ltaWxhciB0bworICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgpIGFuZAorICBQeUVycl9TZXRGcm9tV2luZG93c0VycigpLCBidXQgdGhleSBhbGxvdyB0byBzcGVjaWZ5CisgIHRoZSBleGNlcHRpb24gdHlwZSB0byByYWlzZS4gQXZhaWxhYmxlIG9uIFdpbmRvd3MuCisKKy0gUHlfRmF0YWxFcnJvcigpIGlzIG5vdyBkZWNsYXJlZCBhcyB0YWtpbmcgYSBjb25zdCBjaGFyKiBhcmd1bWVudC4gIEl0CisgIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGhvdXQgY29uc3QuICBUaGlzIHNob3VsZCBub3QgYWZmZWN0IHdvcmtpbmcKKyAgY29kZS4KKworLSBBZGRlZCBuZXcgbWFjcm8gUHlTZXF1ZW5jZV9JVEVNKG8sIGkpIHRoYXQgZGlyZWN0bHkgY2FsbHMKKyAgc3FfaXRlbSB3aXRob3V0IHJlY2hlY2tpbmcgdGhhdCBvIGlzIGEgc2VxdWVuY2UgYW5kIHdpdGhvdXQKKyAgYWRqdXN0aW5nIGZvciBuZWdhdGl2ZSBpbmRpY2VzLgorCistIFB5UmFuZ2VfTmV3KCkgbm93IHJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSBmb3VydGggYXJndW1lbnQgaXMgbm90IDEuCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcmVtb3ZhbCBvZiBkZXByZWNhdGVkIGZlYXR1cmVzIG9mIHRoZSB4cmFuZ2UKKyAgb2JqZWN0LgorCistIFB5TnVtYmVyX0NvZXJjZSgpIGFuZCBQeU51bWJlcl9Db2VyY2VFeCgpIG5vdyBhbHNvIGludm9rZSB0aGUgdHlwZSdzCisgIGNvZXJjaW9uIGlmIGJvdGggYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBidXQgdGhpcyB0eXBlIGhhcyB0aGUKKyAgQ0hFQ0tUWVBFUyBmbGFnIHNldC4gIFRoaXMgaXMgdG8gYmV0dGVyIHN1cHBvcnQgcHJveGllcy4KKworLSBUaGUgdHlwZSBvZiB0cF9mcmVlIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAiYGB2b2lkICgqKShQeU9iamVjdCAqKWBgIiB0bworICAiYGB2b2lkICgqKSh2b2lkICopYGAiLgorCistIFB5T2JqZWN0X0RlbCwgUHlPYmplY3RfR0NfRGVsIGFyZSBub3cgZnVuY3Rpb25zIGluc3RlYWQgb2YgbWFjcm9zLgorCistIEEgdHlwZSBjYW4gbm93IGluaGVyaXQgaXRzIG1ldGF0eXBlIGZyb20gaXRzIGJhc2UgdHlwZS4gIFByZXZpb3VzbHksCisgIHdoZW4gUHlUeXBlX1JlYWR5KCkgd2FzIGNhbGxlZCwgaWYgb2JfdHlwZSB3YXMgZm91bmQgdG8gYmUgTlVMTCwgaXQKKyAgd2FzIGFsd2F5cyBzZXQgdG8gJlB5VHlwZV9UeXBlOyBub3cgaXQgaXMgc2V0IHRvIGJhc2UtPm9iX3R5cGUsCisgIHdoZXJlIGJhc2UgaXMgdHBfYmFzZSwgZGVmYXVsdGluZyB0byAmUHlPYmplY3RfVHlwZS4KKworLSBQeVR5cGVfUmVhZHkoKSBhY2NpZGVudGFsbHkgZGlkIG5vdCBpbmhlcml0IHRwX2lzX2djOyBub3cgaXQgZG9lcy4KKworLSBUaGUgUHlDb3JlXyogZmFtaWx5IG9mIEFQSXMgaGF2ZSBiZWVuIHJlbW92ZWQuCisKKy0gVGhlICJ1IyIgcGFyc2VyIG1hcmtlciB3aWxsIG5vdyBwYXNzIHRocm91Z2ggVW5pY29kZSBvYmplY3RzIGFzLWlzCisgIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgYnVmZmVyIEFQSS4KKworLSBUaGUgZW51bWVyYXRvcnMgb2YgY21wX29wIGhhdmUgYmVlbiByZW5hbWVkIHRvIHVzZSB0aGUgcHJlZml4IGBgUHlDbXBfYGAuCisKKy0gQW4gb2xkICNkZWZpbmUgb2YgQU5ZIGFzIHZvaWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHB5cG9ydC5oLiAgVGhpcworICBoYXNuJ3QgYmVlbiB1c2VkIHNpbmNlIFB5dGhvbidzIHByZS1BTlNJIGRheXMsIGFuZCB0aGUgI2RlZmluZSBoYXMKKyAgYmVlbiBtYXJrZWQgYXMgb2Jzb2xldGUgc2luY2UgdGhlbi4gIFNGIGJ1ZyA0OTU1NDggc2F5cyBpdCBjcmVhdGVkCisgIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzLCBzbyBrZWVwaW5nIGl0IGFyb3VuZCB3YXNuJ3QgaGFybWxlc3MuCisKKy0gQmVjYXVzZSBQeXRob24ncyBtYWdpYyBudW1iZXIgc2NoZW1lIGJyb2tlIG9uIEphbnVhcnkgMXN0LCB3ZSBkZWNpZGVkCisgIHRvIHN0b3AgUHl0aG9uIGRldmVsb3BtZW50LiAgVGhhbmtzIGZvciBhbGwgdGhlIGZpc2ghCisKKy0gU29tZSBvZiB1cyBkb24ndCBsaWtlIGZpc2gsIHNvIHdlIGNoYW5nZWQgUHl0aG9uJ3MgbWFnaWMgbnVtYmVyCisgIHNjaGVtZSB0byBhIG5ldyBvbmUuIFNlZSBQeXRob24vaW1wb3J0LmMgZm9yIGRldGFpbHMuCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworLSBPcGVuVk1TIGlzIG5vdyBzdXBwb3J0ZWQuCisKKy0gQXRoZU9TIGlzIG5vdyBzdXBwb3J0ZWQuCisKKy0gdGhlIEVNWCBydW50aW1lIGVudmlyb25tZW50IG9uIE9TLzIgaXMgbm93IHN1cHBvcnRlZC4KKworLSBHTlUvSHVyZCBpcyBub3cgc3VwcG9ydGVkLgorCitUZXN0cworLS0tLS0KKworLSBUaGUgcmVncnRlc3QucHkgc2NyaXB0J3MgLXUgb3B0aW9uIG5vdyBwcm92aWRlcyBhIHdheSB0byBzYXkgImFsbG93CisgIGFsbCByZXNvdXJjZXMgZXhjZXB0IHRoaXMgb25lLiIgIEZvciBleGFtcGxlLCB0byBhbGxvdyBldmVyeXRoaW5nCisgIGV4Y2VwdCBic2RkYiwgZ2l2ZSB0aGUgb3B0aW9uICctdWFsbCwtYnNkZGInLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gVGhlIFdpbmRvd3MgZGlzdHJpYnV0aW9uIG5vdyBzaGlwcyB3aXRoIHZlcnNpb24gNC4wLjE0IG9mIHRoZQorICBTbGVlcHljYXQgQmVya2VsZXkgZGF0YWJhc2UgbGlicmFyeS4gIFRoaXMgc2hvdWxkIGJlIGEgaHVnZQorICBpbXByb3ZlbWVudCBvdmVyIHRoZSBwcmV2aW91cyBCZXJrZWxleSBEQiAxLjg1LCB3aGljaCBoYWQgbWFueQorICBidWdzLgorICBYWFggV2hhdCBhcmUgdGhlIGxpY2Vuc2luZyBpc3N1ZXMgaGVyZT8KKyAgWFhYIElmIGEgdXNlciBoYXMgYSBkYXRhYmFzZSBjcmVhdGVkIHdpdGggYSBwcmV2aW91cyB2ZXJzaW9uIG9mCisgIFhYWCAgICAgUHl0aG9uLCB3aGF0IG11c3QgdGhleSBkbyB0byBjb252ZXJ0IGl0PworICBYWFggSSdtIHN0aWxsIG5vdCBzdXJlIGhvdyB0byBsaW5rIHRoaXMgdGhpbmcgKHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQpLgorICBYWFggVGhlIHZlcnNpb24gIyBpcyBsaWtlbHkgdG8gY2hhbmdlIGJlZm9yZSAyLjNhMS4KKworLSBUaGUgV2luZG93cyBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggYSBTZWN1cmUgU29ja2V0cyBMaWJyYXJ5IChTTEwpCisgICBtb2R1bGUgKF9zc2wucHlkKQorCistIFRoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBub3cgc2hpcHMgd2l0aCBUY2wvVGsgdmVyc2lvbiA4LjQuMSAoaXQKKyAgcHJldmlvdXNseSBzaGlwcGVkIHdpdGggVGNsL1RrIDguMy4yKS4KKworLSBXaGVuIFB5dGhvbiBpcyBidWlsdCB1bmRlciBhIE1pY3Jvc29mdCBjb21waWxlciwgc3lzLnZlcnNpb24gbm93CisgIGluY2x1ZGVzIHRoZSBjb21waWxlciB2ZXJzaW9uIG51bWJlciAoX01TQ19WRVIpLiAgRm9yIGV4YW1wbGUsIHVuZGVyCisgIE1TVkMgNiwgc3lzLnZlcnNpb24gY29udGFpbnMgdGhlIHN1YnN0cmluZyAiTVNDIHYuMTIwMCAiLiAgMTIwMCBpcworICB0aGUgdmFsdWUgb2YgX01TQ19WRVIgdW5kZXIgTVNWQyA2LgorCistIFNvbWV0aW1lcyB0aGUgdW5pbnN0YWxsIGV4ZWN1dGFibGUgKFVOV0lTRS5FWEUpIHZhbmlzaGVzLiAgT25lIGNhdXNlCisgIG9mIHRoYXQgaGFzIGJlZW4gZml4ZWQgaW4gdGhlIGluc3RhbGxlciAoZGlzYWJsZWQgV2lzZSdzICJkZWxldGUgaW4tCisgIHVzZSBmaWxlcyIgdW5pbnN0YWxsIG9wdGlvbikuCisKKy0gRml4ZWQgYSBidWcgaW4gdXJsbGliJ3MgcHJveHkgaGFuZGxpbmcgaW4gV2luZG93cy4gIFtTRiBidWcgIzUwMzAzMV0KKworLSBUaGUgaW5zdGFsbGVyIG5vdyBpbnN0YWxscyBTdGFydCBtZW51IHNob3J0Y3V0cyB1bmRlciAodGhlIGxvY2FsCisgIGVxdWl2YWxlbnQgb2YpICJBbGwgVXNlcnMiIHdoZW4gZG9pbmcgYW4gQWRtaW4gaW5zdGFsbC4KKworLSBmaWxlLnRydW5jYXRlKFtuZXdzaXplXSkgbm93IHdvcmtzIG9uIFdpbmRvd3MgZm9yIGFsbCBuZXdzaXplIHZhbHVlcy4KKyAgSXQgdXNlZCB0byBmYWlsIGlmIG5ld3NpemUgZGlkbid0IGZpdCBpbiAzMiBiaXRzLCByZWZsZWN0aW5nIGEKKyAgbGltaXRhdGlvbiBvZiBNUyBfY2hzaXplICh3aGljaCBpcyBubyBsb25nZXIgdXNlZCkuCisKKy0gb3Mud2FpdHBpZCgpIGlzIG5vdyBpbXBsZW1lbnRlZCBmb3IgV2luZG93cywgYW5kIGNhbiBiZSB1c2VkIHRvIGJsb2NrCisgIHVudGlsIGEgc3BlY2lmaWVkIHByb2Nlc3MgZXhpdHMuICBUaGlzIGlzIHNpbWlsYXIgdG8sIGJ1dCBub3QgZXhhY3RseQorICB0aGUgc2FtZSBhcywgb3Mud2FpdHBpZCgpIG9uIFBPU0lYIHN5c3RlbXMuICBJZiB5b3UncmUgd2FpdGluZyBmb3IKKyAgYSBzcGVjaWZpYyBwcm9jZXNzIHdob3NlIHBpZCB3YXMgb2J0YWluZWQgZnJvbSBvbmUgb2YgdGhlIHNwYXduKCkKKyAgZnVuY3Rpb25zLCB0aGUgc2FtZSBQeXRob24gb3Mud2FpdHBpZCgpIGNvZGUgd29ya3MgYWNyb3NzIHBsYXRmb3Jtcy4KKyAgU2VlIHRoZSBkb2NzIGZvciBkZXRhaWxzLiAgVGhlIGRvY3Mgd2VyZSBjaGFuZ2VkIHRvIGNsYXJpZnkgdGhhdAorICBzcGF3biBmdW5jdGlvbnMgcmV0dXJuLCBhbmQgd2FpdHBpZCByZXF1aXJlcywgYSBwcm9jZXNzIGhhbmRsZSBvbgorICBXaW5kb3dzIChub3QgdGhlIHNhbWUgdGhpbmcgYXMgYSBXaW5kb3dzIHByb2Nlc3MgaWQpLgorCistIE5ldyB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlIGltcGxlbWVudGF0aW9uIGZvciBXaW5kb3dzOiAgdGhpcyBkb2Vzbid0CisgIG5lZWQgYSBUZW1wb3JhcnlGaWxlV3JhcHBlciB3cmFwcGVyIGFueW1vcmUsIGFuZCBzaG91bGQgYmUgaW1tdW5lCisgIHRvIGEgbmFzdHkgcHJvYmxlbTogIGJlZm9yZSAyLjMsIGlmIHlvdSBnb3QgYSB0ZW1wIGZpbGUgb24gV2luZG93cywgaXQKKyAgZ290IHdyYXBwZWQgaW4gYW4gb2JqZWN0IHdob3NlIGNsb3NlKCkgbWV0aG9kIGZpcnN0IGNsb3NlZCB0aGUKKyAgdW5kZXJseWluZyBmaWxlLCB0aGVuIGRlbGV0ZWQgdGhlIGZpbGUuICBUaGlzIHVzdWFsbHkgd29ya2VkIGZpbmUuCisgIEhvd2V2ZXIsIHRoZSBzcGF3biBmYW1pbHkgb2YgZnVuY3Rpb25zIG9uIFdpbmRvd3MgY3JlYXRlIChhdCBhIGxvdyBDCisgIGxldmVsKSB0aGUgc2FtZSBzZXQgb2Ygb3BlbiBmaWxlcyBpbiB0aGUgc3Bhd25lZCBwcm9jZXNzIFEgYXMgd2VyZQorICBvcGVuIGluIHRoZSBzcGF3bmluZyBwcm9jZXNzIFAuICBJZiBhIHRlbXAgZmlsZSBmIHdhcyBhbW9uZyB0aGVtLCB0aGVuCisgIGRvaW5nIGYuY2xvc2UoKSBpbiBQIGZpcnN0IGNsb3NlZCBQJ3MgQy1sZXZlbCBmaWxlIGhhbmRsZSBvbiBmLCBidXQgUSdzCisgIEMtbGV2ZWwgZmlsZSBoYW5kbGUgb24gZiByZW1haW5lZCBvcGVuLCBzbyB0aGUgYXR0ZW1wdCBpbiBQIHRvIGRlbGV0ZSBmCisgIGJsZXcgdXAgd2l0aCBhICJQZXJtaXNzaW9uIGRlbmllZCIgZXJyb3IgKFdpbmRvd3MgZG9lc24ndCBhbGxvdworICBkZWxldGluZyBvcGVuIGZpbGVzKS4gIFRoaXMgd2FzIHN1cnByaXNpbmcsIHN1YnRsZSwgYW5kIGRpZmZpY3VsdCB0bworICB3b3JrIGFyb3VuZC4KKworLSBUaGUgb3MgbW9kdWxlIG5vdyBleHBvcnRzIGFsbCB0aGUgc3ltYm9saWMgY29uc3RhbnRzIHVzYWJsZSB3aXRoIHRoZQorICBsb3ctbGV2ZWwgb3Mub3BlbigpIG9uIFdpbmRvd3M6ICB0aGUgbmV3IGNvbnN0YW50cyBpbiAyLjMgYXJlCisgIE9fTk9JTkhFUklULCBPX1NIT1JUX0xJVkVELCBPX1RFTVBPUkFSWSwgT19SQU5ET00gYW5kIE9fU0VRVUVOVElBTC4KKyAgVGhlIG90aGVycyB3ZXJlIGFsc28gYXZhaWxhYmxlIGluIDIuMjogIE9fQVBQRU5ELCBPX0JJTkFSWSwgT19DUkVBVCwKKyAgT19FWENMLCBPX1JET05MWSwgT19SRFdSLCBPX1RFWFQsIE9fVFJVTkMgYW5kIE9fV1JPTkxZLiAgQ29udHJhcnkKKyAgdG8gTWljcm9zb2Z0IGRvY3MsIE9fU0hPUlRfTElWRUQgZG9lcyBub3Qgc2VlbSB0byBpbXBseSBPX1RFTVBPUkFSWQorICAoc28gc3BlY2lmeSBib3RoIGlmIHlvdSB3YW50IGJvdGg7IG5vdGUgdGhhdCBuZWl0aGVyIGlzIHVzZWZ1bCB1bmxlc3MKKyAgc3BlY2lmaWVkIHdpdGggT19DUkVBVCB0b28pLgorCitNYWMKKy0tLS0KKworLSBNYWMvUmVsbm90ZXMgaXMgZ29uZSwgdGhlIHJlbGVhc2Ugbm90ZXMgYXJlIG5vdyBoZXJlLgorCistIFB5dGhvbiAodGhlIE9TWC1vbmx5LCB1bml4LWJhc2VkIHZlcnNpb24sIG5vdCB0aGUgT1M5LWNvbXBhdGlibGUgQ0ZNCisgIHZlcnNpb24pIG5vdyBmdWxseSBzdXBwb3J0cyB1bmljb2RlIHN0cmluZ3MgYXMgYXJndW1lbnRzIHRvIHZhcmlvdXMgZmlsZQorICBzeXN0ZW0gY2FsbHMsIGVnLiBvcGVuKCksIGZpbGUoKSwgb3Muc3RhdCgpIGFuZCBvcy5saXN0ZGlyKCkuCisKKy0gVGhlIGN1cnJlbnQgbmFtaW5nIGNvbnZlbnRpb24gZm9yIFB5dGhvbiBvbiB0aGUgTWFjaW50b3NoIGlzIHRoYXQgTWFjUHl0aG9uCisgIHJlZmVycyB0byB0aGUgdW5peC1iYXNlZCBPU1gtb25seSB2ZXJzaW9uLCBhbmQgTWFjUHl0aG9uLU9TOSByZWZlcnMgdG8gdGhlCisgIENGTS1iYXNlZCB2ZXJzaW9uIHRoYXQgcnVucyBvbiBib3RoIE9TOSBhbmQgT1NYLgorCistIEFsbCBNYWNQeXRob24tT1M5IGZ1bmN0aW9uYWxpdHkgaXMgbm93IGF2YWlsYWJsZSBpbiBhbiBPU1ggdW5peCBidWlsZCwKKyAgaW5jbHVkaW5nIHRoZSBDYXJib24gbW9kdWxlcywgdGhlIElERSwgT1NBIHN1cHBvcnQsIGV0Yy4gQSBsb3Qgb2YgdGhpcworICB3aWxsIG9ubHkgd29yayBjb3JyZWN0bHkgaW4gYSBmcmFtZXdvcmsgYnVpbGQsIHRob3VnaCwgYmVjYXVzZSB5b3UgY2Fubm90CisgIHRhbGsgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyIHVubGVzcyB5b3VyIGFwcGxpY2F0aW9uIGlzIHJ1biBmcm9tIGEgLmFwcAorICBidW5kbGUuIFRoZXJlIGlzIGEgY29tbWFuZCBsaW5lIHRvb2wgInB5dGhvbnciIHRoYXQgcnVucyB5b3VyIHNjcmlwdAorICB3aXRoIGFuIGludGVycHJldGVyIGxpdmluZyBpbiBzdWNoIGEgLmFwcCBidW5kbGUsIHRoaXMgaW50ZXJwcmV0ZXIgc2hvdWxkCisgIGJlIHVzZWQgdG8gcnVuIGFueSBQeXRob24gc2NyaXB0IHVzaW5nIHRoZSB3aW5kb3cgbWFuYWdlciAoaW5jbHVkaW5nCisgIFRraW50ZXIgb3Igd3hQeXRob24gc2NyaXB0cykuCisKKy0gTW9zdCBvZiBNYWMvTGliIGhhcyBtb3ZlZCB0byBMaWIvcGxhdC1tYWMsIHdoaWNoIGlzIGFnYWluIHVzZWQgYm90aCBpbgorICBNYWNQeXRob24tT1NYIGFuZCBNYWNQeXRob24tT1M5LiBUaGUgb25seSBtb2R1bGVzIHJlbWFpbmluZyBpbiBNYWMvTGliCisgIGFyZSBzcGVjaWZpY2FsbHkgZm9yIE1hY1B5dGhvbi1PUzkgKENGTSBzdXBwb3J0LCBwcmVmZXJlbmNlIHJlc291cmNlcywgZXRjKS4KKworLSBBIG5ldyB1dGlsaXR5IFB5dGhvbkxhdW5jaGVyIHdpbGwgc3RhcnQgYSBQeXRob24gaW50ZXJwcmV0ZXIgd2hlbiBhIC5weSBvcgorICAucHl3IHNjcmlwdCBpcyBkb3VibGUtY2xpY2tlZCBpbiB0aGUgRmluZGVyLiBCeSBkZWZhdWx0IC5weSBzY3JpcHRzIGFyZQorICBydW4gd2l0aCBhIG5vcm1hbCBQeXRob24gaW50ZXJwcmV0ZXIgaW4gYSBUZXJtaW5hbCB3aW5kb3cgYW5kIC5weXcKKyAgZmlsZXMgYXJlIHJ1biB3aXRoIGEgd2luZG93LWF3YXJlIHB5dGhvbncgaW50ZXJwcmV0ZXIgd2l0aG91dCBhIFRlcm1pbmFsCisgIHdpbmRvdywgYnV0IGFsbCB0aGlzIGNhbiBiZSBjdXN0b21pemVkLgorCistIE1hY1B5dGhvbi1PUzkgaXMgbm93IENhcmJvbi1vbmx5LCBzbyBpdCBydW5zIG9uIE1hYyBPUyA5IG9yIE1hYyBPUyBYIGFuZAorICBwb3NzaWJseSBvbiBNYWMgT1MgOC42IHdpdGggdGhlIHJpZ2h0IENhcmJvbkxpYiBpbnN0YWxsZWQsIGJ1dCBub3Qgb24gZWFybGllcgorICByZWxlYXNlcy4KKworLSBNYW55IHRvb2xzIHN1Y2ggYXMgQnVpbGRBcHBsZXQucHkgYW5kIGdlbnN1aXRlbW9kdWxlLnB5IG5vdyBzdXBwb3J0IGEgY29tbWFuZAorICBsaW5lIGludGVyZmFjZSB0b28uCisKKy0gQWxsIHRoZSBDYXJib24gY2xhc3NlcyBhcmUgbm93IFBFUDI1MyBjb21wbGlhbnQsIG1lYW5pbmcgdGhhdCB5b3UgY2FuCisgIHN1YmNsYXNzIHRoZW0gZnJvbSBQeXRob24uIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgaGF2ZSBnb25lLCB5b3Ugc2hvdWxkCisgIG5vdyB1c2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9uIGNhbGwgQVBJLCB3aGljaCBpcyBhbHNvIHdoYXQgQXBwbGUncworICBkb2N1bWVudGF0aW9uIHVzZXMuIFNvbWUgYXR0cmlidXRlcyBzdWNoIGFzIGdyYWZwb3J0LnZpc1JnbiBhcmUgc3RpbGwKKyAgYXZhaWxhYmxlIGZvciBjb252ZW5pZW5jZS4KKworLSBOZXcgQ2FyYm9uIG1vZHVsZXMgRmlsZSAoaW1wbGVtZW50aW5nIHRoZSBBUElzIGluIEZpbGVzLmggYW5kIEFsaWFzZXMuaCkKKyAgYW5kIEZvbGRlciAoQVBJcyBmcm9tIEZvbGRlcnMuaCkuIFRoZSBvbGQgbWFjZnMgYnVpbHRpbiBtb2R1bGUgaXMKKyAgZ29uZSwgYW5kIHJlcGxhY2VkIGJ5IGEgUHl0aG9uIHdyYXBwZXIgYXJvdW5kIHRoZSBuZXcgbW9kdWxlcy4KKworLSBQYXRobmFtZSBoYW5kbGluZyBzaG91bGQgbm93IGJlIGZ1bGx5IGNvbnNpc3RlbnQ6IE1hY1B5dGhvbi1PU1ggYWx3YXlzIHVzZXMKKyAgdW5peCBwYXRobmFtZXMgYW5kIE1hY1B5dGhvbi1PUzkgYWx3YXlzIHVzZXMgY29sb24tc2VwYXJhdGVkIE1hYyBwYXRobmFtZXMKKyAgKGFsc28gd2hlbiBydW5uaW5nIG9uIE1hYyBPUyBYKS4KKworLSBOZXcgQ2FyYm9uIG1vZHVsZXMgSGVscCBhbmQgQUggZ2l2ZSBhY2Nlc3MgdG8gdGhlIENhcmJvbiBIZWxwIE1hbmFnZXIuCisgIFRoZXJlIGFyZSBob29rcyBpbiB0aGUgSURFIHRvIGFsbG93IGFjY2Vzc2luZyB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24KKyAgKGFuZCBBcHBsZSdzIENhcmJvbiBhbmQgQ29jb2EgZG9jdW1lbnRhdGlvbikgdGhyb3VnaCB0aGUgSGVscCBWaWV3ZXIuCisgIFNlZSBNYWMvT1NYL1JFQURNRSBmb3IgY29udmVydGluZyB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gdG8gYQorICBIZWxwIFZpZXdlciBjb21wYXRpYmxlIGZvcm0gYW5kIGluc3RhbGxpbmcgaXQuCisKKy0gT1NBIHN1cHBvcnQgaGFzIGJlZW4gcmVkZXNpZ25lZCBhbmQgdGhlIGdlbmVyYXRlZCBQeXRob24gY2xhc3NlcyBub3cKKyAgbWlycm9yIHRoZSBpbmhlcml0YW5jZSBkZWZpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIE9TQSBjbGFzc2VzLgorCistIE1hY1B5dGhvbiBubyBsb25nZXIgbWFwcyBib3RoIFxyIGFuZCBcbiB0byBcbiBvbiBpbnB1dCBmb3IgYW55IHRleHQgZmlsZS4KKyAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgKFBFUDI3OCkuCisKKy0gVGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIFB5dGhvbiBzb3VyY2VmaWxlcyBpbiBNYWNQeXRob24tT1M5IGlzIG5vIGxvbmdlcgorICBtYWMtcm9tYW4gKG9yIHdoYXRldmVyIHlvdXIgbG9jYWwgTWFjIGVuY29kaW5nIHdhcykgYnV0ICJhc2NpaSIsIGxpa2Ugb24KKyAgb3RoZXIgcGxhdGZvcm1zLiBJZiB5b3UgcmVhbGx5IG5lZWQgc291cmNlZmlsZXMgd2l0aCBNYWMgY2hhcmFjdGVycyBpbiB0aGVtCisgIHlvdSBjYW4gY2hhbmdlIHRoaXMgaW4gc2l0ZS5weS4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjIgZmluYWw/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIxLURlYy0yMDAxKgorCitUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBwaWNrbGUucHksIGNQaWNrbGU6IGFsbG93IHBpY2tsaW5nIGluc3RhbmNlcyBvZiBuZXctc3R5bGUgY2xhc3NlcworICB3aXRoIGEgY3VzdG9tIG1ldGFjbGFzcy4KKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gd2Vha3JlZiBwcm94eSBvYmplY3Q6IHdoZW4gY29tcGFyaW5nLCB1bndyYXAgYm90aCBhcmd1bWVudHMgaWYgYm90aAorICBhcmUgcHJveGllcy4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gYmluYXNjaWkuYjJhX2Jhc2U2NCgpOiBmaXggYSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gd2hlbiBlbmNvZGluZworICB2ZXJ5IHNob3J0IHN0cmluZ3MuCisKKy0gY1BpY2tsZTogdGhlIG9ic2N1cmUgImZhc3QiIG1vZGUgd2FzIHN1c3BlY3RlZCBvZiBjYXVzaW5nIHN0YWNrCisgIG92ZXJmbG93cyBvbiB0aGUgTWFjLiAgSG9wZWZ1bGx5IGZpeGVkIHRoaXMgYnkgc2V0dGluZyB0aGUgcmVjdXJzaW9uCisgIGxpbWl0IG11Y2ggc21hbGxlci4gIElmIHRoZSBsaW1pdCBpcyB0b28gbG93IChpdCBvbmx5IGFmZmVjdHMKKyAgcGVyZm9ybWFuY2UpLCB5b3UgY2FuIGNoYW5nZSBpdCBieSBkZWZpbmluZyBQWV9DUElDS0xFX0ZBU1RfTElNSVQKKyAgd2hlbiBjb21waWxpbmcgY1BpY2tsZS5jIChvciBpbiBweWNvbmZpZy5oKS4KKworTGlicmFyeQorLS0tLS0tLQorCistIGR1bWJkYm0ucHk6IGZpeGVkIGEgZHVtYiBvbGQgYnVnICh0aGUgZmlsZSBkaWRuJ3QgZ2V0IHN5bmNoZWQgYXQKKyAgY2xvc2Ugb3IgZGVsZXRlIHRpbWUpLgorCistIHJmYzgyMi5weTogZml4ZWQgYSBidWcgd2hlcmUgdGhlIGFkZHJlc3MgJzw+JyB3YXMgY29udmVydGVkIHRvIE5vbmUKKyAgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcgKGFsc28gZml4ZXMgdGhlIGVtYWlsLlV0aWxzIG1vZHVsZSkuCisKKy0geG1scnBjbGliLnB5OiB2ZXJzaW9uIDEuMC4wOyB1c2VzIHByZWNpc2lvbiBmb3IgZG91Ymxlcy4KKworLSB0ZXN0IHN1aXRlOiB0aGUgcGlja2xlIGFuZCBjUGlja2xlIHRlc3RzIHdlcmUgbm90IGV4ZWN1dGluZyBhbnkgY29kZQorICB3aGVuIHJ1biBmcm9tIHRoZSBzdGFuZGFyZCByZWdyZXNzaW9uIHRlc3QuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCitCdWlsZAorLS0tLS0KKworQyBBUEkKKy0tLS0tCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworVGVzdHMKKy0tLS0tCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBkaXN0dXRpbHMgcGFja2FnZTogZml4ZWQgYnJva2VuIFdpbmRvd3MgaW5zdGFsbGVycyAoYmRpc3Rfd2luaW5zdCkuCisKKy0gdGVtcGZpbGUucHk6IHByZXZlbnQgbXlzdGVyaW91cyB3YXJuaW5ncyB3aGVuIFRlbXBvcmFyeUZpbGVXcmFwcGVyCisgIGluc3RhbmNlcyBhcmUgZGVsZXRlZCBhdCBwcm9jZXNzIGV4aXQgdGltZS4KKworLSBzb2NrZXQucHk6IHByZXZlbnQgbXlzdGVyaW91cyB3YXJuaW5ncyB3aGVuIHNvY2tldCBpbnN0YW5jZXMgYXJlCisgIGRlbGV0ZWQgYXQgcHJvY2VzcyBleGl0IHRpbWUuCisKKy0gcG9zaXhtb2R1bGUuYzogZml4IGEgV2luZG93cyBjcmFzaCB3aXRoIHN0YXQoKSBvZiBhIGZpbGVuYW1lIGVuZGluZworICBpbiBiYWNrc2xhc2guCisKK01hYworLS0tLQorCistIFRoZSBDYXJib24gdG9vbGJveCBtb2R1bGVzIGhhdmUgYmVlbiB1cGdyYWRlZCB0byBVbml2ZXJzYWwgSGVhZGVycworICAzLjQsIGFuZCBleHBlcmltZW50YWwgQ29yZUdyYXBoaWNzIGFuZCBDYXJib25FdmVudHMgbW9kdWxlcyBoYXZlCisgIGJlZW4gYWRkZWQuICBBbGwgb25seSBmb3IgZnJhbWV3b3JrLWVuYWJsZWQgTWFjT1NYLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmMxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE0LURlYy0yMDAxKgorCitUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBHdWlkbydzIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byB0aGUgbmV3IHR5cGUvY2xhc3MgZmVhdHVyZXMgaGFzCisgIGJlZW4gZXh0ZW5zaXZlbHkgdXBkYXRlZC4gIFNlZQorCisgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbAorCisgIFRoYXQgcmVtYWlucyB0aGUgcHJpbWFyeSBkb2N1bWVudGF0aW9uIGluIHRoaXMgYXJlYS4KKworLSBGaXhlZCBhIGxlYWs6IGluc3RhbmNlIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoIF9fc2xvdHNfXyB3ZXJlIG5ldmVyCisgIGRlbGV0ZWQhCisKKy0gVGhlICJkZWxldGUgYXR0cmlidXRlIiBtZXRob2Qgb2YgZGVzY3JpcHRvciBvYmplY3RzIGlzIGNhbGxlZAorICBfX2RlbGV0ZV9fLCBub3QgX19kZWxfXy4gIEluIHByZXZpb3VzIHJlbGVhc2VzLCBpdCB3YXMgbWlzdGFrZW5seQorICBjYWxsZWQgX19kZWxfXywgd2hpY2ggY3JlYXRlZCBhbiB1bmZvcnR1bmF0ZSBvdmVybG9hZGluZyBjb25kaXRpb24KKyAgd2l0aCBmaW5hbGl6ZXJzLiAgKFRoZSAiZ2V0IGF0dHJpYnV0ZSIgYW5kICJzZXQgYXR0cmlidXRlIiBtZXRob2RzCisgIGFyZSBzdGlsbCBjYWxsZWQgX19nZXRfXyBhbmQgX19zZXRfXywgcmVzcGVjdGl2ZWx5LikKKworLSBTb21lIHN1YnRsZSBpc3N1ZXMgd2l0aCB0aGUgc3VwZXIgYnVpbHQtaW4gd2VyZSBmaXhlZDoKKworICAoYSkgV2hlbiBzdXBlciBpdHNlbGYgaXMgc3ViY2xhc3NlZCwgaXRzIF9fZ2V0X18gbWV0aG9kIHdvdWxkIHN0aWxsCisgICAgICByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY2xhc3MgKGkuZS4sIG9mIHN1cGVyKS4KKworICAoYikgc3VwZXIoQywgQygpKS5fX2NsYXNzX18gd291bGQgcmV0dXJuIEMgcmF0aGVyIHRoYW4gc3VwZXIuICBUaGlzCisgICAgICBpcyBjb25mdXNpbmcuICBUbyBmaXggdGhpcywgSSBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mCisgICAgICBzdXBlciBzbyB0aGF0IGl0IG9ubHkgYXBwbGllcyB0byBjb2RlIGF0dHJpYnV0ZXMsIG5vdCB0byBkYXRhCisgICAgICBhdHRyaWJ1dGVzLiAgQWZ0ZXIgYWxsLCBvdmVycmlkaW5nIGRhdGEgYXR0cmlidXRlcyBpcyBub3QKKyAgICAgIHN1cHBvcnRlZCBhbnl3YXkuCisKKyAgKGMpIFRoZSBfX2dldF9fIG1ldGhvZCBkaWRuJ3QgY2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgd2FzIGFuCisgICAgICBpbnN0YW5jZSBvZiB0aGUgdHlwZSB1c2VkIGluIGNyZWF0aW9uIG9mIHRoZSBzdXBlciBpbnN0YW5jZS4KKworLSBQcmV2aW91c2x5LCBoYXNoKCkgb2YgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBhIG11dGFibGUgdHlwZQorICAobGlzdCBvciBkaWN0aW9uYXJ5KSB3b3VsZCByZXR1cm4gc29tZSB2YWx1ZSwgcmF0aGVyIHRoYW4gcmFpc2luZworICBUeXBlRXJyb3IuICBUaGlzIGhhcyBiZWVuIGZpeGVkLiAgQWxzbywgZGlyZWN0bHkgY2FsbGluZworICBkaWN0Ll9faGFzaF9fIGFuZCBsaXN0Ll9faGFzaF9fIG5vdyByYWlzZXMgdGhlIHNhbWUgVHlwZUVycm9yCisgIChwcmV2aW91c2x5LCB0aGVzZSB3ZXJlIHRoZSBzYW1lIGFzIG9iamVjdC5fX2hhc2hfXykuCisKKy0gTmV3LXN0eWxlIG9iamVjdHMgbm93IHN1cHBvcnQgZGVsZXRpbmcgdGhlaXIgX19kaWN0X18uICBUaGlzIGlzIGZvcgorICBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgZXF1aXZhbGVudCB0byBhc3NpZ25pbmcgYSBicmFuZCBuZXcgZW1wdHkKKyAgZGljdGlvbmFyeSwgYnV0IHNhdmVzIHNwYWNlIGlmIHRoZSBvYmplY3QgaXMgbm90IHVzZWQgZnVydGhlci4KKworQ29yZSBhbmQgYnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gLVFuZXcgbm93IHdvcmtzIGFzIGRvY3VtZW50ZWQgaW4gUEVQIDIzODogIHdoZW4gLVFuZXcgaXMgcGFzc2VkIG9uCisgIHRoZSBjb21tYW5kIGxpbmUsIGFsbCBvY2N1cnJlbmNlcyBvZiAiLyIgdXNlIHRydWUgZGl2aXNpb24gaW5zdGVhZAorICBvZiBjbGFzc2ljIGRpdmlzaW9uLiAgU2VlIHRoZSBQRVAgZm9yIGRldGFpbHMuICBOb3RlIHRoYXQgImFsbCIKKyAgbWVhbnMgYWxsIGluc3RhbmNlcyBpbiBsaWJyYXJ5IGFuZCAzcmQtcGFydHkgbW9kdWxlcywgYXMgd2VsbCBhcyBpbgorICB5b3VyIG93biBjb2RlLiAgQXMgdGhlIFBFUCBzYXlzLCAtUW5ldyBpcyBpbnRlbmRlZCBmb3IgdXNlIG9ubHkgaW4KKyAgZWR1Y2F0aW9uYWwgZW52aXJvbm1lbnRzIHdpdGggY29udHJvbCBvdmVyIHRoZSBsaWJyYXJpZXMgaW4gdXNlLgorICBOb3RlIHRoYXQgdGVzdF9jb2VyY2lvbi5weSBpbiB0aGUgc3RhbmRhcmQgUHl0aG9uIHRlc3Qgc3VpdGUgZmFpbHMKKyAgdW5kZXIgLVFuZXc7IHRoaXMgaXMgZXhwZWN0ZWQsIGFuZCB3b24ndCBiZSByZXBhaXJlZCB1bnRpbCB0cnVlCisgIGRpdmlzaW9uIGJlY29tZXMgdGhlIGRlZmF1bHQgKGluIHRoZSBtZWFudGltZSwgdGVzdF9jb2VyY2lvbiBpcworICB0ZXN0aW5nIHRoZSBjdXJyZW50IHJ1bGVzKS4KKworLSBjb21wbGV4KCkgbm93IG9ubHkgYWxsb3dzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIHN0cmluZworICBhcmd1bWVudCwgYW5kIHJhaXNlcyBUeXBlRXJyb3IgaWYgZWl0aGVyIHRoZSBzZWNvbmQgYXJnIGlzIGEgc3RyaW5nCisgIG9yIGlmIHRoZSBzZWNvbmQgYXJnIGlzIHNwZWNpZmllZCB3aGVuIHRoZSBmaXJzdCBpcyBhIHN0cmluZy4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gZ2MuZ2V0X3JlZmVyZW50cyB3YXMgcmVuYW1lZCB0byBnYy5nZXRfcmVmZXJyZXJzLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gRnVuY3Rpb25zIGluIHRoZSBvcy5zcGF3bigpIGZhbWlseSBub3cgcmVsZWFzZSB0aGUgZ2xvYmFsIGludGVycHJldGVyCisgIGxvY2sgYXJvdW5kIGNhbGxpbmcgdGhlIHBsYXRmb3JtIHNwYXduLiAgVGhleSBzaG91bGQgYWx3YXlzIGhhdmUgZG9uZQorICB0aGlzLCBidXQgZGlkIG5vdCBiZWZvcmUgMi4yYzEuICBNdWx0aXRocmVhZGVkIHByb2dyYW1zIGNhbGxpbmcKKyAgYW4gb3Muc3Bhd24gZnVuY3Rpb24gd2l0aCBQX1dBSVQgd2lsbCBubyBsb25nZXIgYmxvY2sgYWxsIFB5dGhvbiB0aHJlYWRzCisgIHVudGlsIHRoZSBzcGF3bmVkIHByb2dyYW0gY29tcGxldGVzLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcHJvZ3JhbXMKKyAgcmVsaWVzIG9uIGJsb2NraW5nLCBhbHRob3VnaCBtb3JlIGxpa2VseSBieSBhY2NpZGVudCB0aGFuIGJ5IGRlc2lnbi4KKworLSB3ZWJicm93c2VyIGRlZmF1bHRzIHRvIG5ldHNjYXBlLmV4ZSBvbiBPUy8yIG5vdy4KKworLSBUaXguUmVzaXplSGFuZGxlIGV4cG9zZXMgZGV0YWNoX3dpZGdldCwgaGlkZSwgYW5kIHNob3cuCisKKy0gVGhlIGNoYXJzZXQgYWxpYXMgd2luZG93c18xMjUyIGhhcyBiZWVuIGFkZGVkLgorCistIHR5cGVzLlN0cmluZ1R5cGVzIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZGVmaW5lZCBzdHJpbmcgdHlwZXM7CisgIHVzdWFsbHkgdGhpcyB3aWxsIGJlIChzdHIsIHVuaWNvZGUpLCBidXQgaWYgUHl0aG9uIHdhcyBjb21waWxlZAorICB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCBpdCB3aWxsIGJlIGp1c3QgKHN0ciwpLgorCistIFRoZSBwdWxsZG9tIGFuZCBtaW5pZG9tIG1vZHVsZXMgd2VyZSBzeW5jaHJvbml6ZWQgdG8gUHlYTUwuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIEEgbmV3IHNjcmlwdCBjYWxsZWQgVG9vbHMvc2NyaXB0cy9nb29nbGUucHkgd2FzIGFkZGVkLCB3aGljaCBmaXJlcworICBvZmYgYSBzZWFyY2ggb24gR29vZ2xlLgorCitCdWlsZAorLS0tLS0KKworLSBOb3RlIHRoYXQgcmVsZWFzZSBidWlsZHMgb2YgUHl0aG9uIHNob3VsZCBhcnJhbmdlIHRvIGRlZmluZSB0aGUKKyAgcHJlcHJvY2Vzc29yIHN5bWJvbCBOREVCVUcgb24gdGhlIGNvbW1hbmQgbGluZSAob3IgZXF1aXZhbGVudCkuCisgIEluIHRoZSAyLjIgcHJlLXJlbGVhc2Ugc2VyaWVzIHdlIHRyaWVkIHRvIGRlZmluZSB0aGlzIGJ5IG1hZ2ljIGluCisgIFB5dGhvbi5oIGluc3RlYWQsIGJ1dCBpdCBwcm92ZWQgdG8gY2F1c2UgcHJvYmxlbXMgZm9yIGV4dGVuc2lvbgorICBhdXRob3JzLiAgVGhlIFVuaXgsIFdpbmRvd3MgYW5kIE1hYyBidWlsZHMgbm93IGFsbCBkZWZpbmUgTkRFQlVHIGluCisgIHJlbGVhc2UgYnVpbGRzIHZpYSBjbWRsaW5lIChvciBlcXVpdmFsZW50KSBpbnN0ZWFkLiAgUG9ydHMgdG8KKyAgb3RoZXIgcGxhdGZvcm1zIHNob3VsZCBkbyBsaWtld2lzZS4KKworLSBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHVzZSAtLXdpdGgtc3VmZml4IHdoZW4gYnVpbGRpbmcgb24gYQorICBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtIChzdWNoIGFzIE1hYyBPUyBYIEhGUyspLiBJbiB0aGUgYnVpbGQKKyAgZGlyZWN0b3J5IGFuIGV4dGVuc2lvbiBpcyB1c2VkLCBidXQgbm90IGluIHRoZSBpbnN0YWxsZWQgcHl0aG9uLgorCitDIEFQSQorLS0tLS0KKworLSBOZXcgZnVuY3Rpb24gUHlEaWN0X01lcmdlRnJvbVNlcTIoKSBleHBvc2VzIHRoZSBidWlsdGluIGRpY3QKKyAgY29uc3RydWN0b3IncyBsb2dpYyBmb3IgdXBkYXRpbmcgYSBkaWN0aW9uYXJ5IGZyb20gYW4gaXRlcmFibGUgb2JqZWN0CisgIHByb2R1Y2luZyBrZXktdmFsdWUgcGFpcnMuCisKKy0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgcmVxdWlyZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgdGhlIGtleXdvcmQgbGlzdCBlcXVhbCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHNwZWNpZmllcnMuICBUaGlzCisgIHdhc24ndCBjaGVja2VkIGNvcnJlY3RseSwgYW5kIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBjb3VsZCBldmVuCisgIGR1bXAgY29yZSBpbiBzb21lIGJhZCBjYXNlcy4gIFRoaXMgaGFzIGJlZW4gcmVwYWlyZWQuICBBcyBhIHJlc3VsdCwKKyAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIG1heSByYWlzZSBSdW50aW1lRXJyb3IgaW4gYmFkIGNhc2VzIHRoYXQKKyAgcHJldmlvdXNseSB3ZW50IHVuY2hhbGxlbmdlZC4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCitUZXN0cworLS0tLS0KKworV2luZG93cworLS0tLS0tLQorCitNYWMKKy0tLS0KKworLSBJbiB1bml4LVB5dGhvbiBvbiBNYWMgT1MgWCAoYW5kIGRhcndpbikgc3lzLnBsYXRmb3JtIGlzIG5vdyAiZGFyd2luIiwKKyAgd2l0aG91dCBhbnkgdHJhaWxpbmcgZGlnaXRzLgorCistIENoYW5nZWQgbG9naWMgZm9yIGZpbmRpbmcgcHl0aG9uIGhvbWUgaW4gTWFjIE9TIFggZnJhbWV3b3JrIFB5dGhvbnMuCisgIE5vdyBzeXMuZXhlY3V0YWJsZSBwb2ludHMgdG8gdGhlIGV4ZWN1dGFibGUgYWdhaW4sIGluIHN0ZWFkIG9mIHRvCisgIHRoZSBzaGFyZWQgbGlicmFyeS4gVGhlIGxhdHRlciBpcyB1c2VkIG9ubHkgZm9yIGxvY2F0aW5nIHRoZSBweXRob24KKyAgaG9tZS4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJiMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxNi1Ob3YtMjAwMSoKKworVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gTXVsdGlwbGUgaW5oZXJpdGFuY2UgbWl4aW5nIG5ldy1zdHlsZSBhbmQgY2xhc3NpYyBjbGFzc2VzIGluIHRoZQorICBsaXN0IG9mIGJhc2UgY2xhc3NlcyBpcyBub3cgYWxsb3dlZCwgc28gdGhpcyB3b3JrcyBub3c6CisKKyAgICAgIGNsYXNzIENsYXNzaWM6IHBhc3MKKyAgICAgIGNsYXNzIE1peGVkKENsYXNzaWMsIG9iamVjdCk6IHBhc3MKKworICBUaGUgTVJPIChtZXRob2QgcmVzb2x1dGlvbiBvcmRlcikgZm9yIGVhY2ggYmFzZSBjbGFzcyBpcyByZXNwZWN0ZWQKKyAgYWNjb3JkaW5nIHRvIGl0cyBraW5kLCBidXQgdGhlIE1STyBmb3IgdGhlIGRlcml2ZWQgY2xhc3MgaXMgY29tcHV0ZWQKKyAgdXNpbmcgbmV3LXN0eWxlIE1STyBydWxlcyBpZiBhbnkgYmFzZSBjbGFzcyBpcyBhIG5ldy1zdHlsZSBjbGFzcy4KKyAgVGhpcyBuZWVkcyB0byBiZSBkb2N1bWVudGVkLgorCistIFRoZSBuZXcgYnVpbHRpbiBkaWN0aW9uYXJ5KCkgY29uc3RydWN0b3IsIGFuZCBkaWN0aW9uYXJ5IHR5cGUsIGhhdmUKKyAgYmVlbiByZW5hbWVkIHRvIGRpY3QuICBUaGlzIHJlZmxlY3RzIGEgZGVjYWRlIG9mIGNvbW1vbiB1c2FnZS4KKworLSBkaWN0KCkgbm93IGFjY2VwdHMgYW4gaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyAyLXNlcXVlbmNlcy4gIEZvcgorICBleGFtcGxlLCBkaWN0KGQuaXRlbXMoKSkgPT0gZCBmb3IgYW55IGRpY3Rpb25hcnkgZC4gIFRoZSBhcmd1bWVudCwKKyAgYW5kIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJndW1lbnQsIGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0cy4KKworLSBOZXctc3R5bGUgY2xhc3NlcyBjYW4gbm93IGhhdmUgYSBfX2RlbF9fIG1ldGhvZCwgd2hpY2ggaXMgY2FsbGVkCisgIHdoZW4gdGhlIGluc3RhbmNlIGlzIGRlbGV0ZWQgKGp1c3QgbGlrZSBmb3IgY2xhc3NpYyBjbGFzc2VzKS4KKworLSBBc3NpZ25tZW50IHRvIG9iamVjdC5fX2RpY3RfXyBpcyBub3cgcG9zc2libGUsIGZvciBvYmplY3RzIHRoYXQgYXJlCisgIGluc3RhbmNlcyBvZiBuZXctc3R5bGUgY2xhc3NlcyB0aGF0IGhhdmUgYSBfX2RpY3RfXyAodW5sZXNzIHRoZSBiYXNlCisgIGNsYXNzIGZvcmJpZHMgaXQpLgorCistIE1ldGhvZHMgb2YgYnVpbHQtaW4gdHlwZXMgbm93IHByb3Blcmx5IGNoZWNrIGZvciBrZXl3b3JkIGFyZ3VtZW50cworICAoZm9ybWVybHkgdGhlc2Ugd2VyZSBzaWxlbnRseSBpZ25vcmVkKS4gIFRoZSBvbmx5IGJ1aWx0LWluIG1ldGhvZHMKKyAgdGhhdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIGFyZSBfX2NhbGxfXywgX19pbml0X18gYW5kIF9fbmV3X18uCisKKy0gVGhlIHNvY2tldCBmdW5jdGlvbiBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSB0eXBlOyBzZWUgYmVsb3cuCisKK0NvcmUgYW5kIGJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIEFzc2lnbm1lbnQgdG8gX19kZWJ1Z19fIHJhaXNlcyBTeW50YXhFcnJvciBhdCBjb21waWxlLXRpbWUuICBUaGlzCisgIHdhcyBwcm9taXNlZCB3aGVuIDIuMWMxIHdhcyByZWxlYXNlZCBhcyAiV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzEiCisgIChzZWUgYmVsb3cpIHNheXMuCisKKy0gQ2xhcmlmaWVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgdW5zdXBwb3J0ZWQgb3BlcmFuZHMgdG8gYW4gb3BlcmF0b3IKKyAgKGxpa2UgMSArICcnKS4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gbW1hcCBoYXMgYSBuZXcga2V5d29yZCBhcmd1bWVudCwgImFjY2VzcyIsIGFsbG93aW5nIGEgdW5pZm9ybSB3YXkgZm9yCisgIGJvdGggV2luZG93cyBhbmQgVW5peCB1c2VycyB0byBjcmVhdGUgcmVhZC1vbmx5LCB3cml0ZS10aHJvdWdoIGFuZAorICBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXBwaW5ncy4gIFRoaXMgd2FzIHByZXZpb3VzbHkgcG9zc2libGUgb25seSBvbgorICBVbml4LiAgQSBuZXcga2V5d29yZCBhcmd1bWVudCB3YXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzIGluIGEKKyAgdW5pZm9ybSB3YXkgYmVjYXVzZSB0aGUgbW1hcCgpIHNpZ25hdHVyZXMgaGFkIGRpdmVyZ2VkIGFjcm9zcworICBwbGF0Zm9ybXMuICBUaGFua3MgdG8gSmF5IFQgTWlsbGVyIGZvciByZXBhaXJpbmcgdGhpcyEKKworLSBCeSBkZWZhdWx0LCB0aGUgZ2MuZ2FyYmFnZSBsaXN0IG5vdyBjb250YWlucyBvbmx5IHRob3NlIGluc3RhbmNlcyBpbgorICB1bnJlYWNoYWJsZSBjeWNsZXMgdGhhdCBoYXZlIF9fZGVsX18gbWV0aG9kczsgaW4gMi4xIGl0IGNvbnRhaW5lZCBhbGwKKyAgaW5zdGFuY2VzIGluIHVucmVhY2hhYmxlIGN5Y2xlcy4gICJJbnN0YW5jZXMiIGhlcmUgaGFzIGJlZW4gZ2VuZXJhbGl6ZWQKKyAgdG8gaW5jbHVkZSBpbnN0YW5jZXMgb2YgYm90aCBuZXctc3R5bGUgYW5kIG9sZC1zdHlsZSBjbGFzc2VzLgorCistIFRoZSBzb2NrZXQgbW9kdWxlIGRlZmluZXMgYSBuZXcgbWV0aG9kIGZvciBzb2NrZXQgb2JqZWN0cywKKyAgc2VuZGFsbCgpLiAgVGhpcyBpcyBsaWtlIHNlbmQoKSBidXQgbWF5IG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8KKyAgc2VuZCgpIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQuICBBbHNvLCB0aGUgc29ja2V0IGZ1bmN0aW9uIGhhcworICBiZWVuIGNvbnZlcnRlZCB0byBhIHN1YmNsYXNzYWJsZSB0eXBlLCBsaWtlIGxpc3QgYW5kIHR1cGxlIChldGMuKQorICBiZWZvcmUgaXQ7IHNvY2tldCBhbmQgU29ja2V0VHlwZSBhcmUgbm93IHRoZSBzYW1lIHRoaW5nLgorCistIFZhcmlvdXMgYnVnZml4ZXMgdG8gdGhlIGN1cnNlcyBtb2R1bGUuICBUaGVyZSBpcyBub3cgYSB0ZXN0IHN1aXRlCisgIGZvciB0aGUgY3Vyc2VzIG1vZHVsZSAoeW91IGhhdmUgdG8gcnVuIGl0IG1hbnVhbGx5KS4KKworLSBiaW5hc2NpaS5iMmFfYmFzZTY0IG5vIGxvbmdlciBwbGFjZXMgYW4gYXJiaXRyYXJ5IHJlc3RyaWN0aW9uIG9mIDU3CisgIGJ5dGVzIG9uIGl0cyBpbnB1dC4KKworTGlicmFyeQorLS0tLS0tLQorCistIHRrRmlsZURpYWxvZyBleHBvc2VzIGEgRGlyZWN0b3J5IGNsYXNzIGFuZCBhc2tkaXJlY3RvcnkKKyAgY29udmVuaWVuY2UgZnVuY3Rpb24uCisKKy0gU3ltYm9saWMgZ3JvdXAgbmFtZXMgaW4gcmVndWxhciBleHByZXNzaW9ucyBtdXN0IGJlIHVuaXF1ZS4gIEZvcgorICBleGFtcGxlLCB0aGUgcmVnZXhwIHInKD9QPGFiYz4pKD9QPGFiYz4pJyBpcyBub3QgYWxsb3dlZCwgYmVjYXVzZSBhCisgIHNpbmdsZSBuYW1lIGNhbid0IG1lYW4gYm90aCAiZ3JvdXAgMSIgYW5kICJncm91cCAyIiBzaW11bHRhbmVvdXNseS4KKyAgUHl0aG9uIDIuMiBkZXRlY3RzIHRoaXMgZXJyb3IgYXQgcmVnZXhwIGNvbXBpbGF0aW9uIHRpbWU7CisgIHByZXZpb3VzbHksIHRoZSBlcnJvciB3ZW50IHVuZGV0ZWN0ZWQsIGFuZCByZXN1bHRzIHdlcmUKKyAgdW5wcmVkaWN0YWJsZS4gIEFsc28gaW4gc3JlLCB0aGUgcGF0dGVybi5zcGxpdCgpLCBwYXR0ZXJuLnN1YigpLCBhbmQKKyAgcGF0dGVybi5zdWJuKCkgbWV0aG9kcyBoYXZlIGJlZW4gcmV3cml0dGVuIGluIEMuICBBbHNvLCBhbgorICBleHBlcmltZW50YWwgZnVuY3Rpb24vbWV0aG9kIGZpbmRpdGVyKCkgaGFzIGJlZW4gYWRkZWQsIHdoaWNoIHdvcmtzCisgIGxpa2UgZmluZGFsbCgpIGJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLgorCistIFRpeCBleHBvc2VzIG1vcmUgY29tbWFuZHMgdGhyb3VnaCB0aGUgY2xhc3NlcyBEaXJTZWxlY3RCb3gsCisgIERpclNlbGVjdERpYWxvZywgTGlzdE5vdGVCb29rLCBNZXRlciwgQ2hlY2tMaXN0LCBhbmQgdGhlCisgIG1ldGhvZHMgdGl4X2FkZGJpdG1hcGRpciwgdGl4X2NnZXQsIHRpeF9jb25maWd1cmUsIHRpeF9maWxlZGlhbG9nLAorICB0aXhfZ2V0Yml0bWFwLCB0aXhfZ2V0aW1hZ2UsIHRpeF9vcHRpb25fZ2V0LCBhbmQgdGl4X3Jlc2V0b3B0aW9ucy4KKworLSBUcmFjZWJhY2sgb2JqZWN0cyBhcmUgbm93IHNjYW5uZWQgYnkgY3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbiwgc28KKyAgY3ljbGVzIGNyZWF0ZWQgYnkgY2FzdWFsIHVzZSBvZiBzeXMuZXhjX2luZm8oKSBubyBsb25nZXIgY2F1c2UKKyAgcGVybWFuZW50IG1lbW9yeSBsZWFrcyAocHJvdmlkZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGVuYWJsZWQpLgorCistIG9zLmV4dHNlcCAtLSBhIG5ldyB2YXJpYWJsZSBuZWVkZWQgYnkgdGhlIFJJU0NPUyBzdXBwb3J0LiAgSXQgaXMgdGhlCisgIHNlcGFyYXRvciB1c2VkIGJ5IGV4dGVuc2lvbnMsIGFuZCBpcyAnLicgb24gYWxsIHBsYXRmb3JtcyBleGNlcHQKKyAgUklTQ09TLCB3aGVyZSBpdCBpcyAnLycuICBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGlzIHZhcmlhYmxlCisgIHVubGVzcyB5b3UgaGF2ZSBhIG1hc29jaGlzdGljIGRlc2lyZSB0byBwb3J0IHlvdXIgY29kZSB0byBSSVNDT1MuCisKKy0gbWltZXR5cGVzLnB5IGhhcyBvcHRpb25hbCBzdXBwb3J0IGZvciBub24tc3RhbmRhcmQsIGJ1dCBjb21tb25seQorICBmb3VuZCB0eXBlcy4gIGd1ZXNzX3R5cGUoKSBhbmQgZ3Vlc3NfZXh0ZW5zaW9uKCkgbm93IGFjY2VwdCBhbgorICBvcHRpb25hbCAnc3RyaWN0JyBmbGFnLCBkZWZhdWx0aW5nIHRvIHRydWUsIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIKKyAgcmVjb2duaXplIG5vbi1zdGFuZGFyZCB0eXBlcyBvciBub3QuICBBIGZldyBub24tc3RhbmRhcmQgdHlwZXMgd2UKKyAga25vdyBhYm91dCBoYXZlIGJlZW4gYWRkZWQuICBBbHNvLCB3aGVuIHJ1biBhcyBhIHNjcmlwdCwgdGhlcmUgYXJlCisgIG5ldyAtbCBhbmQgLWUgb3B0aW9ucy4KKworLSBzdGF0Y2FjaGUgaXMgbm93IGRlcHJlY2F0ZWQuCisKKy0gZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSgpIG5vdyBwcm9kdWNlcyB0aGUgcHJlZmVycmVkIFJGQyAyODIyIHN0eWxlCisgIGRhdGVzIHdpdGggbnVtZXJpYyB0aW1lem9uZXMgKGl0IHVzZWQgdG8gcHJvZHVjZSBvYnNvbGV0ZSBkYXRlcworICBoYXJkIGNvZGVkIHRvICJHTVQiIHRpbWV6b25lKS4gIEFuIG9wdGlvbmFsICdsb2NhbHRpbWUnIGZsYWcgaXMKKyAgYWRkZWQgdG8gcHJvZHVjZSBkYXRlcyBpbiB0aGUgbG9jYWwgdGltZXpvbmUsIHdpdGggZGF5bGlnaHQgc2F2aW5ncworICB0aW1lIHByb3Blcmx5IHRha2VuIGludG8gYWNjb3VudC4KKworLSBJbiBwaWNrbGUgYW5kIGNQaWNrbGUsIGluc3RlYWQgb2YgbWFza2luZyBlcnJvcnMgaW4gbG9hZCgpIGJ5CisgIHRyYW5zZm9ybWluZyB0aGVtIGludG8gU3lzdGVtRXJyb3IsIHdlIGxldCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uCisgIHByb3BhZ2F0ZSBvdXQuICBBbHNvLCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18KKyAgaW4gcGlja2xlLCBhcyBpdCBhbHJlYWR5IHdhcyBzdXBwb3J0ZWQgaW4gY1BpY2tsZS4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKK0J1aWxkCistLS0tLQorCistIFRoZSBkYm0gbW9kdWxlIGlzIGJ1aWx0IHVzaW5nIGxpYmRiMSBpZiBhdmFpbGFibGUuICBUaGUgYnNkZGIgbW9kdWxlCisgIGlzIGJ1aWx0IHdpdGggbGliZGIzIGlmIGF2YWlsYWJsZS4KKworLSBNaXNjL01ha2VmaWxlLnByZS5pbiBoYXMgYmVlbiByZW1vdmVkIGJ5IEJERkwgcHJvbm91bmNlbWVudC4KKworQyBBUEkKKy0tLS0tCisKKy0gTmV3IGZ1bmN0aW9uIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSgpIHJldHVybnMgdGhlIHNpemUgb2YgYSBub24tCisgIE5VTEwgcmVzdWx0IGZyb20gUHlTZXF1ZW5jZV9GYXN0KCksIG1vcmUgcXVpY2tseSB0aGFuIGNhbGxpbmcKKyAgUHlTZXF1ZW5jZV9TaXplKCkuCisKKy0gTmV3IGFyZ3VtZW50IHVucGFja2luZyBmdW5jdGlvbiBQeUFyZ19VbnBhY2tUdXBsZSgpIGFkZGVkLgorCistIE5ldyBmdW5jdGlvbnMgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygpIGFuZAorICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncygpIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIGl0IG1vcmUKKyAgY29udmVuaWVudCBhbmQgZWZmaWNpZW50IHRvIGNhbGwgZnVuY3Rpb25zIGFuZCBtZXRob2RzIGZyb20gQy4KKworLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBubyBsb25nZXIgbWFza3MgZXJyb3JzLCBzbyBpdCdzCisgIHBvc3NpYmxlIHRoYXQgdGhpcyB3aWxsIHByb3BhZ2F0ZSBlcnJvcnMgaXQgZGlkbid0IGJlZm9yZS4KKworLSBOZXcgZnVuY3Rpb24gUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKCksIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiBpdHMKKyAgYXJndW1lbnQgc3VwcG9ydHMgdGhlIHNpbmdsZS1zZWdtZW50IHJlYWRhYmxlIGJ1ZmZlciBpbnRlcmZhY2UuCisKK05ldyBwbGF0Zm9ybXMKKy0tLS0tLS0tLS0tLS0KKworLSBXZSd2ZSBmaW5hbGx5IGNvbmZpcm1lZCB0aGF0IHRoaXMgcmVsZWFzZSBidWlsZHMgb24gSFAtVVggMTEuMDAsCisgICp3aXRoKiB0aHJlYWRzLCBhbmQgcGFzc2VzIHRoZSB0ZXN0IHN1aXRlLgorCistIFRoYW5rcyB0byBhIHNlcmllcyBvZiBwYXRjaGVzIGZyb20gTWljaGFlbCBNdWxsZXIsIFB5dGhvbiBtYXkgYnVpbGQKKyAgYWdhaW4gdW5kZXIgT1MvMiBWaXN1YWwgQWdlIEMrKy4KKworLSBVcGRhdGVkIFJJU0NPUyBwb3J0IGJ5IERpZXRtYXIgU2Nod2VydGJlcmdlci4KKworVGVzdHMKKy0tLS0tCisKKy0gQWRkZWQgYSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGN1cnNlcyBtb2R1bGUuICBJdCBpc24ndCBydW4gYXV0b21hdGljYWxseTsKKyAgcmVncnRlc3QucHkgbXVzdCBiZSBydW4gd2l0aCAnLXUgY3Vyc2VzJyB0byBlbmFibGUgaXQuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworTWFjCistLS0tCisKKy0gUHl0aG9uU2NyaXB0IGhhcyBiZWVuIG1vdmVkIHRvIHVuc3VwcG9ydGVkIGFuZCBpcyBzbGF0ZWQgdG8gYmUKKyAgcmVtb3ZlZCBjb21wbGV0ZWx5IGluIHRoZSBuZXh0IHJlbGVhc2UuCisKKy0gSXQgc2hvdWxkIG5vdyBiZSBwb3NzaWJsZSB0byBidWlsZCBhcHBsZXRzIHRoYXQgd29yayBvbiBib3RoIE9TOSBhbmQKKyAgT1NYLgorCistIFRoZSBjb3JlIGlzIG5vdyBsaW5rZWQgd2l0aCBDb3JlU2VydmljZXMgbm90IENhcmJvbjsgYXMgYSBzaWRlCisgIHJlc3VsdCwgZGVmYXVsdCA4Yml0IGVuY29kaW5nIG9uIE9TWCBpcyBub3cgQVNDSUkuCisKKy0gUHl0aG9uIHNob3VsZCBub3cgYnVpbGQgb24gT1NYIDEwLjEuMQorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmIxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE5LU9jdC0yMDAxKgorCitUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBOZXctc3R5bGUgY2xhc3NlcyBhcmUgbm93IGFsd2F5cyBkeW5hbWljIChleGNlcHQgZm9yIGJ1aWx0LWluIGFuZAorICBleHRlbnNpb24gdHlwZXMpLiAgVGhlcmUgaXMgbm8gbG9uZ2VyIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSwgYW5kIEkKKyAgbm8gbG9uZ2VyIHNlZSBhbm90aGVyIHJlYXNvbiB0byBrZWVwIHRoaXMgYmFnZ2FnZSBhcm91bmQuICBPbmUgcmVsaWMKKyAgcmVtYWluczogdGhlIF9fZGljdF9fIG9mIGEgbmV3LXN0eWxlIGNsYXNzIGlzIGEgcmVhZC1vbmx5IHByb3h5OyB5b3UKKyAgbXVzdCBzZXQgdGhlIGNsYXNzJ3MgYXR0cmlidXRlIHRvIG1vZGlmeSBpdC4gIEFzIGEgY29uc2VxdWVuY2UsIHRoZQorICBfX2RlZmluZWRfXyBhdHRyaWJ1dGUgb2YgbmV3LXN0eWxlIHR5cGVzIG5vIGxvbmdlciBleGlzdHMsIGZvciBsYWNrCisgIG9mIG5lZWQ6IHRoZXJlIGlzIG9uY2UgYWdhaW4gb25seSBvbmUgX19kaWN0X18gKGFsdGhvdWdoIGluIHRoZQorICBmdXR1cmUgYSBfX2NhY2hlX18gbWF5IGJlIHJlc3VycmVjdGVkIHdpdGggYSBzaW1pbGFyIGZ1bmN0aW9uLCBpZiBJCisgIGNhbiBwcm92ZSB0aGF0IGl0IGFjdHVhbGx5IHNwZWVkcyB0aGluZ3MgdXApLgorCistIEMuX19kb2NfXyBub3cgd29ya3MgYXMgZXhwZWN0ZWQgZm9yIG5ldy1zdHlsZSBjbGFzc2VzIChpbiAyLjJhNCBpdAorICBhbHdheXMgcmV0dXJuZWQgTm9uZSwgZXZlbiB3aGVuIHRoZXJlIHdhcyBhIGNsYXNzIGRvY3N0cmluZykuCisKKy0gZG9jdGVzdCBub3cgZmluZHMgYW5kIHJ1bnMgZG9jc3RyaW5ncyBhdHRhY2hlZCB0byBuZXctc3R5bGUgY2xhc3NlcywKKyAgY2xhc3MgbWV0aG9kcywgc3RhdGljIG1ldGhvZHMsIGFuZCBwcm9wZXJ0aWVzLgorCitDb3JlIGFuZCBidWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBBIHZlcnkgc3VidGxlIHN5bnRhY3RpY2FsIHBpdGZhbGwgaW4gbGlzdCBjb21wcmVoZW5zaW9ucyB3YXMgZml4ZWQuCisgIEZvciBleGFtcGxlOiBbYStiIGZvciBhIGluICdhYmMnLCBmb3IgYiBpbiAnZGVmJ10uICBUaGUgY29tbWEgaW4KKyAgdGhpcyBleGFtcGxlIGlzIGEgbWlzdGFrZS4gIFByZXZpb3VzbHksIHRoaXMgd291bGQgc2lsZW50bHkgbGV0ICdhJworICBpdGVyYXRlIG92ZXIgdGhlIHNpbmdsZXRvbiB0dXBsZSAoJ2FiYycsKSwgeWllbGRpbmcgWydhYmNkJywgJ2FiY2UnLAorICAnYWJjZiddIHJhdGhlciB0aGFuIHRoZSBpbnRlbmRlZCBbJ2FkJywgJ2FlJywgJ2FmJywgJ2JkJywgJ2JlJywKKyAgJ2JmJywgJ2NkJywgJ2NlJywgJ2NmJ10uICBOb3csIHRoaXMgaXMgZmxhZ2dlZCBhcyBhIHN5bnRheCBlcnJvci4KKyAgTm90ZSB0aGF0IFthIGZvciBhIGluIDxzaW5nbGV0b24+XSBpcyBhIGNvbnZvbHV0ZWQgd2F5IHRvIHNheQorICBbPHNpbmdsZXRvbj5dIGFueXdheSwgc28gaXQncyBub3QgbGlrZSBhbnkgZXhwcmVzc2l2ZW5lc3MgaXMgbG9zdC4KKworLSBnZXRhdHRyKG9iaiwgbmFtZSwgZGVmYXVsdCkgbm93IG9ubHkgY2F0Y2hlcyBBdHRyaWJ1dGVFcnJvciwgYXMKKyAgZG9jdW1lbnRlZCwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwKKyAgZXhjZXB0aW9ucyAod2hpY2ggY291bGQgbWFzayBidWdzIGluIGEgX19nZXRhdHRyX18gaG9vaywgZm9yCisgIGV4YW1wbGUpLgorCistIFdlYWsgcmVmZXJlbmNlIG9iamVjdHMgYXJlIG5vdyBwYXJ0IG9mIHRoZSBjb3JlIGFuZCBvZmZlciBhIEMgQVBJLgorICBBIGJ1ZyB3aGljaCBjb3VsZCBhbGxvdyBhIGNvcmUgZHVtcCB3aGVuIGJpbmFyeSBvcGVyYXRpb25zIGludm9sdmVkCisgIHByb3h5IHJlZmVyZW5jZSBoYXMgYmVlbiBmaXhlZC4gIHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IgaXMgbm93IGEKKyAgYnVpbHQtaW4gZXhjZXB0aW9uLgorCistIHVuaWNvZGUob2JqKSBub3cgYmVoYXZlcyBtb3JlIGxpa2Ugc3RyKG9iaiksIGFjY2VwdGluZyBhcmJpdHJhcnkKKyAgb2JqZWN0cywgYW5kIGNhbGxpbmcgYSBfX3VuaWNvZGVfXyBtZXRob2QgaWYgaXQgZXhpc3RzLgorICB1bmljb2RlKG9iaiwgZW5jb2RpbmcpIGFuZCB1bmljb2RlKG9iaiwgZW5jb2RpbmcsIGVycm9ycykgc3RpbGwKKyAgcmVxdWlyZSBhbiA4LWJpdCBzdHJpbmcgb3IgY2hhcmFjdGVyIGJ1ZmZlciBhcmd1bWVudC4KKworLSBpc2luc3RhbmNlKCkgbm93IGFsbG93cyBhbnkgb2JqZWN0IGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgYQorICBjbGFzcywgYSB0eXBlIG9yIHNvbWV0aGluZyB3aXRoIGEgX19iYXNlc19fIHR1cGxlIGF0dHJpYnV0ZSBmb3IgdGhlCisgIHNlY29uZCBhcmd1bWVudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGFsc28gYmUgYSB0dXBsZSBvZiBhCisgIGNsYXNzLCB0eXBlLCBvciBzb21ldGhpbmcgd2l0aCBfX2Jhc2VzX18sIGluIHdoaWNoIGNhc2UgaXNpbnN0YW5jZSgpCisgIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGFueSBvZiB0aGUKKyAgdGhpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHR1cGxlLiAgRS5nLgorCisgIGlzaW5zdGFuY2UoeCwgKEEsIEIpKQorCisgIHJldHVybnMgdHJ1ZSBpZiB4IGlzIGFuIGluc3RhbmNlIG9mIEEgb3IgQi4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyB0aGUgdGhyZWFkIElEIChwcmV2aW91c2x5IE5vbmUpLgorCistIGJpbmFzY2lpIGhhcyBub3cgdHdvIHF1b3ByaSBzdXBwb3J0IGZ1bmN0aW9ucywgYTJiX3FwIGFuZCBiMmFfcXAuCisKKy0gcmVhZGxpbmUgbm93IHN1cHBvcnRzIHNldHRpbmcgdGhlIHN0YXJ0dXBfaG9vayBhbmQgdGhlCisgIHByZV9ldmVudF9ob29rLCBhbmQgYWRkcyB0aGUgYWRkX2hpc3RvcnkoKSBmdW5jdGlvbi4KKworLSBvcyBhbmQgcG9zaXggc3VwcG9ydHMgY2hyb290KCksIHNldGdyb3VwcygpIGFuZCB1bnNldGVudigpIHdoZXJlCisgIGF2YWlsYWJsZS4gIFRoZSBzdGF0KCksIGZzdGF0KCksIHN0YXR2ZnMoKSBhbmQgZnN0YXR2ZnMoKSBmdW5jdGlvbnMKKyAgbm93IHJldHVybiAicHNldWRvLXNlcXVlbmNlcyIgLS0gdGhlIHZhcmlvdXMgZmllbGRzIGNhbiBub3cgYmUKKyAgYWNjZXNzZWQgYXMgYXR0cmlidXRlcyAoZS5nLiBvcy5zdGF0KCIvIikuc3RfbXRpbWUpIGJ1dCBmb3IKKyAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdGhleSBhbHNvIGJlaGF2ZSBhcyBhIGZpeGVkLWxlbmd0aCBzZXF1ZW5jZS4KKyAgU29tZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWVsZHMgKGUuZy4gc3RfcmRldikgYXJlIG9ubHkgYWNjZXNzaWJsZSBhcworICBhdHRyaWJ1dGVzLgorCistIHRpbWU6IGxvY2FsdGltZSgpLCBnbXRpbWUoKSBhbmQgc3RycHRpbWUoKSBub3cgcmV0dXJuIGEKKyAgcHNldWRvLXNlcXVlbmNlIHNpbWlsYXIgdG8gdGhlIG9zLnN0YXQoKSByZXR1cm4gdmFsdWUsIHdpdGgKKyAgYXR0cmlidXRlcyBsaWtlIHRtX3llYXIgZXRjLgorCistIERlY29tcHJlc3Npb24gb2JqZWN0cyBpbiB0aGUgemxpYiBtb2R1bGUgbm93IGFjY2VwdCBhbiBvcHRpb25hbAorICBzZWNvbmQgcGFyYW1ldGVyIHRvIGRlY29tcHJlc3MoKSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQKKyAgb2YgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorCistIG9wdGlvbmFsIFNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBleHBvcnRzIE9wZW5TU0wKKyAgZnVuY3Rpb25zIFJBTkRfYWRkKCksIFJBTkRfZWdkKCksIGFuZCBSQU5EX3N0YXR1cygpLiAgVGhlc2UgY2FsbHMKKyAgYXJlIHVzZWZ1bCBvbiBwbGF0Zm9ybXMgbGlrZSBTb2xhcmlzIHdoZXJlIE9wZW5TU0wgZG9lcyBub3QKKyAgYXV0b21hdGljYWxseSBzZWVkIGl0cyBQUk5HLiAgQWxzbywgdGhlIGtleWZpbGUgYW5kIGNlcnRmaWxlCisgIGFyZ3VtZW50cyB0byBzb2NrZXQuc3NsKCkgYXJlIG5vdyBvcHRpb25hbC4KKworLSBwb3NpeG1vZHVsZSAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlIG9zIG1vZHVsZSBvbiBQT1NJWCBwbGF0Zm9ybXMpIG5vdworICBleHBvcnRzIE9fTEFSR0VGSUxFLCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksIGFuZCBPX05PRk9MTE9XLgorCitMaWJyYXJ5CistLS0tLS0tCisKKy0gZG9jdGVzdCBub3cgZXhjbHVkZXMgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIG5vdCBkZWZpbmVkIGJ5IHRoZSBtb2R1bGUKKyAgYmVpbmcgdGVzdGVkLCB0aGFua3MgdG8gVGltIEhvY2hiZXJnLgorCistIEhvdFNob3QsIGEgbmV3IHByb2ZpbGVyIGltcGxlbWVudGVkIHVzaW5nIGEgQy1iYXNlZCBjYWxsYmFjaywgaGFzCisgIGJlZW4gYWRkZWQuICBUaGlzIHN1YnN0YW50aWFsbHkgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgb2YgcHJvZmlsaW5nLAorICBidXQgaXQgaXMgc3RpbGwgcXVpdGUgcHJlbGltaW5hcnkuICBTdXBwb3J0IG1vZHVsZXMgYW5kCisgIGRvY3VtZW50YXRpb24gd2lsbCBiZSBhZGRlZCBpbiB1cGNvbWluZyByZWxlYXNlcyAoYmVmb3JlIDIuMiBmaW5hbCkuCisKKy0gcHJvZmlsZSBub3cgcHJvZHVjZXMgY29ycmVjdCBvdXRwdXQgaW4gc2l0dWF0aW9ucyB3aGVyZSBhbiBleGNlcHRpb24KKyAgcmFpc2VkIGluIFB5dGhvbiBpcyBjbGVhcmVkIGJ5IEMgY29kZSAoZS5nLiBoYXNhdHRyKCkpLiAgVGhpcyB1c2VkCisgIHRvIGNhdXNlIHdyb25nIG91dHB1dCwgaW5jbHVkaW5nIHNwdXJpb3VzIGNsYWltcyBvZiByZWN1cnNpdmUKKyAgZnVuY3Rpb25zIGFuZCBhdHRyaWJ1dGlvbiBvZiB0aW1lIHNwZW50IHRvIHRoZSB3cm9uZyBmdW5jdGlvbi4KKworICBUaGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRlcml2ZWQgT2xkUHJvZmlsZSBhbmQgSG90UHJvZmlsZQorICBwcm9maWxpbmcgY2xhc3NlcyB3YXMgcmVtb3ZlZC4gIFRoZSBjb2RlIGhhc24ndCB3b3JrZWQgZm9yIHllYXJzIChpZgorICB5b3UgdHJpZWQgdG8gdXNlIHRoZW0sIHRoZXkgcmFpc2VkIGV4Y2VwdGlvbnMpLiAgT2xkUHJvZmlsZQorICBpbnRlbmRlZCB0byByZXByb2R1Y2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9maWxlciBQeXRob24gdXNlZCBtb3JlCisgIHRoYW4gNyB5ZWFycyBhZ28sIGFuZCBpc24ndCBpbnRlcmVzdGluZyBhbnltb3JlLiAgSG90UHJvZmlsZSBpbnRlbmRlZAorICB0byBwcm92aWRlIGEgZmFzdGVyIHByb2ZpbGVyIChidXQgcHJvZHVjaW5nIGxlc3MgaW5mb3JtYXRpb24pLCBhbmQKKyAgdGhhdCdzIGEgd29ydGh5IGdvYWwgd2UgaW50ZW5kIHRvIG1lZXQgdmlhIGEgZGlmZmVyZW50IGFwcHJvYWNoIChidXQKKyAgd2l0aG91dCBsb3NpbmcgaW5mb3JtYXRpb24pLgorCistIFByb2ZpbGUuY2FsaWJyYXRlKCkgaGFzIGEgbmV3IGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGRlbGl2ZXIKKyAgYSBtdWNoIGJldHRlciBzeXN0ZW0tc3BlY2lmaWMgY2FsaWJyYXRpb24gY29uc3RhbnQuICBUaGUgY29uc3RhbnQgY2FuCisgIG5vdyBiZSBzcGVjaWZpZWQgaW4gYW4gaW5zdGFuY2UgY29uc3RydWN0b3IsIG9yIGFzIGEgUHJvZmlsZSBjbGFzcyBvcgorICBpbnN0YW5jZSB2YXJpYWJsZSwgaW5zdGVhZCBvZiBieSBlZGl0aW5nIHByb2ZpbGUucHkncyBzb3VyY2UgY29kZS4KKyAgQ2FsaWJyYXRpb24gbXVzdCBzdGlsbCBiZSBkb25lIG1hbnVhbGx5IChzZWUgdGhlIGRvY3MgZm9yIHRoZSBwcm9maWxlCisgIG1vZHVsZSkuCisKKyAgTm90ZSB0aGF0IFByb2ZpbGUuY2FsaWJyYXRlKCkgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgIEltcHJvdmluZyB0aGUgYWNjdXJhY3kgcmVxdWlyZWQgZXhwbG9pdGluZyBkZXRhaWxlZCBrbm93bGVkZ2Ugb2YKKyAgcHJvZmlsZXIgaW50ZXJuYWxzOyB0aGUgZWFybGllciBtZXRob2QgYWJzdHJhY3RlZCBhd2F5IHRoZSBkZXRhaWxzCisgIGFuZCBtZWFzdXJlZCBhIHNpbXBsaWZpZWQgbW9kZWwgaW5zdGVhZCwgYnV0IGNvbnNlcXVlbnRseSBjb21wdXRlZAorICBhIGNvbnN0YW50IHRvbyBzbWFsbCBieSBhIGZhY3RvciBvZiAyIG9uIHNvbWUgbW9kZXJuIG1hY2hpbmVzLgorCistIHF1b3ByaSdzIGVuY29kZSBhbmQgZGVjb2RlIG1ldGhvZHMgdGFrZSBhbiBvcHRpb25hbCBoZWFkZXIgcGFyYW1ldGVyLAorICB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvdXRwdXQgaXMgaW50ZW5kZWQgZm9yIHRoZSBoZWFkZXIgJ1EnCisgIGVuY29kaW5nLgorCistIFRoZSBTb2NrZXRTZXJ2ZXIuVGhyZWFkaW5nTWl4SW4gY2xhc3Mgbm93IGNsb3NlcyB0aGUgcmVxdWVzdCBhZnRlcgorICBmaW5pc2hfcmVxdWVzdCgpIHJldHVybnMuICAoTm90IHdoZW4gaXQgZXJyb3JzIG91dCB0aG91Z2guKQorCistIFRoZSBubnRwbGliIG1vZHVsZSdzIE5OVFAuYm9keSgpIG1ldGhvZCBoYXMgZ3Jvd24gYSAnZmlsZScgYXJndW1lbnQKKyAgdG8gYWxsb3cgc2F2aW5nIHRoZSBtZXNzYWdlIGJvZHkgdG8gYSBmaWxlLgorCistIFRoZSBlbWFpbCBwYWNrYWdlIGhhcyBhZGRlZCBhIGNsYXNzIGVtYWlsLlBhcnNlci5IZWFkZXJQYXJzZXIgd2hpY2gKKyAgb25seSBwYXJzZXMgaGVhZGVycyBhbmQgZG9lcyBub3QgcmVjdXJzZSBpbnRvIHRoZSBtZXNzYWdlJ3MgYm9keS4KKyAgQWxzbywgdGhlIG1vZHVsZS9jbGFzcyBNSU1FQXVkaW8gaGFzIGJlZW4gYWRkZWQgZm9yIHJlcHJlc2VudGluZworICBhdWRpbyBkYXRhIChjb250cmlidXRlZCBieSBBbnRob255IEJheHRlcikuCisKKy0gZnRwbGliIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBmaWxlcyA+IDJHQi4KKworLSBDb25maWdQYXJzZXIuZ2V0Ym9vbGVhbigpIG5vdyBhbHNvIGludGVycHJldHMgVFJVRSwgRkFMU0UsIFlFUywgTk8sCisgIE9OLCBhbmQgT0ZGLgorCistIHhtbC5kb20ubWluaWRvbSBOb2RlTGlzdCBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSBsZW5ndGggYXR0cmlidXRlCisgIGFuZCBpdGVtKCkgbWV0aG9kIGFzIHJlcXVpcmVkIGJ5IHRoZSBET00gc3BlY2lmaWNhdGlvbnMuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIERlbW8vZG5zIHdhcyByZW1vdmVkLiAgSXQgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgcHVycG9zZTsgYSBwYWNrYWdlCisgIGRlcml2ZWQgZnJvbSBpdCBpcyBub3cgbWFpbnRhaW5lZCBieSBBbnRob255IEJheHRlciwgc2VlCisgIGh0dHA6Ly9QeUROUy5Tb3VyY2VGb3JnZS5uZXQuCisKKy0gVGhlIGZyZWV6ZSB0b29sIGhhcyBiZWVuIG1hZGUgbW9yZSByb2J1c3QsIGFuZCB0d28gbmV3IG9wdGlvbnMgaGF2ZQorICBiZWVuIGFkZGVkOiAtWCBhbmQgLUUuCisKK0J1aWxkCistLS0tLQorCistIGNvbmZpZ3VyZSB3aWxsIHVzZSBDWFggaW4gTElOS0NDIGlmIENYWCBpcyB1c2VkIHRvIGJ1aWxkIG1haW4oKSBhbmQKKyAgdGhlIHN5c3RlbSByZXF1aXJlcyB0byBsaW5rIGEgQysrIG1haW4gdXNpbmcgdGhlIEMrKyBjb21waWxlci4KKworQyBBUEkKKy0tLS0tCisKKy0gVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB0cF9jb21wYXJlIHNsb3QgaXMgdXBkYXRlZCB0byByZXF1aXJlIHRoYXQKKyAgdGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIC0xLCAwLCAxOyBhbiBhcmJpdHJhcnkgbnVtYmVyIDwwIG9yID4wIGlzCisgIG5vdCBjb3JyZWN0LiAgVGhpcyBpcyBub3QgeWV0IGVuZm9yY2VkIGJ1dCB3aWxsIGJlIGVuZm9yY2VkIGluCisgIFB5dGhvbiAyLjM7IGV2ZW4gbGF0ZXIsIHdlIG1heSB1c2UgLTIgdG8gaW5kaWNhdGUgZXJyb3JzIGFuZCArMiBmb3IKKyAgIk5vdEltcGxlbWVudGVkIi4gIFJpZ2h0IG5vdywgLTEgc2hvdWxkIGJlIHVzZWQgZm9yIGFuIGVycm9yIHJldHVybi4KKworLSBQeUxvbmdfQXNMb25nTG9uZygpIG5vdyBhY2NlcHRzIGludCAoYXMgd2VsbCBhcyBsb25nKSBhcmd1bWVudHMuCisgIENvbnNlcXVlbnRseSwgUHlBcmdfUGFyc2VUdXBsZSdzICdMJyBjb2RlIGFsc28gYWNjZXB0cyBpbnQgKGFzIHdlbGwKKyAgYXMgbG9uZykgYXJndW1lbnRzLgorCistIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyBhIGxvbmcgaW50IGdpdmluZyB0aGUgdGhyZWFkCisgIElELCBpZiBvbmUgY2FuIGJlIGNhbGN1bGF0ZWQ7IGl0IHJldHVybnMgLTEgZm9yIGVycm9yLCAwIGlmIG5vCisgIHRocmVhZCBJRCBpcyBjYWxjdWxhdGVkICh0aGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBvbmx5CisgIHRoZSB0aHJlYWQgbW9kdWxlIHVzZWQgdGhpcyBBUEkpLiAgVGhpcyBjb2RlIGhhcyBvbmx5IHJlYWxseSBiZWVuCisgIHRlc3RlZCBvbiBMaW51eCBhbmQgV2luZG93czsgb3RoZXIgcGxhdGZvcm1zIHBsZWFzZSBiZXdhcmUgKGFuZAorICByZXBvcnQgYW55IGJ1Z3Mgb3Igc3RyYW5nZSBiZWhhdmlvcikuCisKKy0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgbm8gbG9uZ2VyIGFjY2VwdHMgVW5pY29kZSBvYmplY3RzIGFzCisgIGlucHV0LgorCitOZXcgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tCisKK1Rlc3RzCistLS0tLQorCitXaW5kb3dzCistLS0tLS0tCisKKy0gSW5zdGFsbGVyOiAgSWYgeW91IGluc3RhbGwgSURMRSwgYW5kIGRvbid0IGRpc2FibGUgZmlsZS1leHRlbnNpb24KKyAgcmVnaXN0cmF0aW9uLCBhIG5ldyAiRWRpdCB3aXRoIElETEUiIGNvbnRleHQgKHJpZ2h0LWNsaWNrKSBtZW51IGVudHJ5CisgIGlzIGNyZWF0ZWQgZm9yIC5weSBhbmQgLnB5dyBmaWxlcy4KKworLSBUaGUgc2lnbmFsIG1vZHVsZSBub3cgc3VwcG9ydHMgU0lHQlJFQUsgb24gV2luZG93cywgdGhhbmtzIHRvIFN0ZXZlbgorICBTY290dC4gIE5vdGUgdGhhdCBTSUdCUkVBSyBpcyB1bmlxdWUgdG8gV2luZG93cy4gIFRoZSBkZWZhdWx0IFNJR0JSRUFLCisgIGFjdGlvbiByZW1haW5zIHRvIGNhbGwgV2luMzIgRXhpdFByb2Nlc3MoKS4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhCisgIHNpZ25hbC5zaWduYWwoKS4gIEZvciBleGFtcGxlOjoKKworICAgICAgIyBNYWtlIEN0cmwrQnJlYWsgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQsIGxpa2UgUHl0aG9uJ3MgZGVmYXVsdCBDdHJsK0MKKyAgICAgICMgKFNJR0lOVCkgYmVoYXZpb3IuCisgICAgICBpbXBvcnQgc2lnbmFsCisgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdCUkVBSywgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCisKKyAgICAgIHRyeToKKyAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICBwYXNzCisgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgIyBXZSBnZXQgaGVyZSBvbiBDdHJsK0Mgb3IgQ3RybCtCcmVhayBub3c7IGlmIHdlIGhhZCBub3QgY2hhbmdlZAorICAgICAgICAgICMgU0lHQlJFQUssIG9ubHkgb24gQ3RybCtDIChhbmQgQ3RybCtCcmVhayB3b3VsZCB0ZXJtaW5hdGUgdGhlCisgICAgICAgICAgIyBwcm9ncmFtIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IGZvciBhbnkgUHl0aG9uLWxldmVsIGNsZWFudXApLgorICAgICAgICAgIHByaW50ICJDbGVhbiBleGl0IgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmE0PworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI4LVNlcC0yMDAxKgorCitUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBweWRvYyBhbmQgaW5zcGVjdCBhcmUgbm93IGF3YXJlIG9mIG5ldy1zdHlsZSBjbGFzc2VzOworICBlLmcuIGhlbHAobGlzdCkgYXQgdGhlIGludGVyYWN0aXZlIHByb21wdCBub3cgc2hvd3MgcHJvcGVyCisgIGRvY3VtZW50YXRpb24gZm9yIGFsbCBvcGVyYXRpb25zIG9uIGxpc3Qgb2JqZWN0cy4KKworLSBBcHBsaWNhdGlvbnMgdXNpbmcgSmltIEZ1bHRvbidzIEV4dGVuc2lvbkNsYXNzIG1vZHVsZSBjYW4gbm93IHNhZmVseQorICBiZSB1c2VkIHdpdGggUHl0aG9uIDIuMi4gIEluIHBhcnRpY3VsYXIsIFpvcGUgMi40LjEgbm93IHdvcmtzIHdpdGgKKyAgUHl0aG9uIDIuMiAoYXMgd2VsbCBhcyB3aXRoIFB5dGhvbiAyLjEuMSkuICBUaGUgRGVtby9tZXRhY2xhc3MKKyAgZXhhbXBsZXMgYWxzbyB3b3JrIGFnYWluLiAgSXQgaXMgaG9wZWQgdGhhdCBHdGsgYW5kIEJvb3N0IGFsc28gd29yaworICB3aXRoIDIuMmE0IGFuZCBiZXlvbmQuICAoSWYgeW91IGNhbiBjb25maXJtIHRoaXMsIHBsZWFzZSB3cml0ZQorICB3ZWJtYXN0ZXJAcHl0aG9uLm9yZzsgaWYgdGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zLCBwbGVhc2Ugb3BlbiBhIGJ1ZworICByZXBvcnQgb24gU291cmNlRm9yZ2UuKQorCistIHByb3BlcnR5KCkgbm93IHRha2VzIDQga2V5d29yZCBhcmd1bWVudHM6ICBmZ2V0LCBmc2V0LCBmZGVsIGFuZCBkb2MuCisgIFRoZXNlIG1hcCB0byByZWFkLW9ubHkgYXR0cmlidXRlcyAnZmdldCcsICdmc2V0JywgJ2ZkZWwnLCBhbmQgJ19fZG9jX18nCisgIGluIHRoZSBjb25zdHJ1Y3RlZCBwcm9wZXJ0eSBvYmplY3QuICBmZ2V0LCBmc2V0IGFuZCBmZGVsIHdlcmVuJ3QKKyAgZGlzY292ZXJhYmxlIGZyb20gUHl0aG9uIGluIDIuMmEzLiAgX19kb2NfXyBpcyBuZXcsIGFuZCBhbGxvd3MgdG8KKyAgYXNzb2NpYXRlIGEgZG9jc3RyaW5nIHdpdGggYSBwcm9wZXJ0eS4KKworLSBDb21wYXJpc29uIG92ZXJsb2FkaW5nIGlzIG5vdyBtb3JlIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQuICBGb3IKKyAgZXhhbXBsZSwgYSBzdHIgc3ViY2xhc3MgaW5zdGFuY2UgY2FuIHByb3Blcmx5IGJlIGNvbXBhcmVkIHRvIGEgc3RyCisgIGluc3RhbmNlLCBhbmQgaXQgY2FuIHByb3Blcmx5IG92ZXJsb2FkIGNvbXBhcmlzb24uICBEaXR0byBmb3IgbW9zdAorICBvdGhlciBidWlsdC1pbiBvYmplY3QgdHlwZXMuCisKKy0gVGhlIHJlcHIoKSBvZiBuZXctc3R5bGUgY2xhc3NlcyBoYXMgY2hhbmdlZDsgaW5zdGVhZCBvZiA8dHlwZQorICAnTS5Gb28nPiBhIG5ldy1zdHlsZSBjbGFzcyBpcyBub3cgcmVuZGVyZWQgYXMgPGNsYXNzICdNLkZvbyc+LAorICAqZXhjZXB0KiBmb3IgYnVpbHQtaW4gdHlwZXMsIHdoaWNoIGFyZSBzdGlsbCByZW5kZXJlZCBhcyA8dHlwZQorICAnRm9vJz4gKHRvIGF2b2lkIHVwc2V0dGluZyBleGlzdGluZyBjb2RlIHRoYXQgbWlnaHQgcGFyc2Ugb3IKKyAgb3RoZXJ3aXNlIHJlbHkgb24gcmVwcigpIG9mIGNlcnRhaW4gdHlwZSBvYmplY3RzKS4KKworLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBvYmplY3RzIGlzIG5vdyBhbHdheXMgPEZvbyBvYmplY3QgYXQgWFhYPjsKKyAgcHJldmlvdXNseSwgaXQgd2FzIHNvbWV0aW1lcyA8Rm9vIGluc3RhbmNlIGF0IFhYWD4uCisKKy0gRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB3aGF0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBfX2dldGF0dHJfXyBpcyBub3cKKyAgY2FsbGVkIF9fZ2V0YXR0cmlidXRlX18uICBUaGlzIG1ldGhvZCwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGZvcgorICAqZXZlcnkqIGF0dHJpYnV0ZSBhY2Nlc3MuICBBIG5ldyBfX2dldGF0dHJfXyBob29rIG1vcmUgc2ltaWxhciB0byB0aGUKKyAgb25lIGluIGNsYXNzaWMgY2xhc3NlcyBpcyBkZWZpbmVkIHdoaWNoIGlzIGNhbGxlZCBvbmx5IGlmIHJlZ3VsYXIKKyAgYXR0cmlidXRlIGFjY2VzcyByYWlzZXMgQXR0cmlidXRlRXJyb3I7IHRvIGNhdGNoICphbGwqIGF0dHJpYnV0ZQorICBhY2Nlc3MsIHlvdSBjYW4gdXNlIF9fZ2V0YXR0cmlidXRlX18gKGZvciBuZXctc3R5bGUgY2xhc3NlcykuICBJZgorICBib3RoIGFyZSBkZWZpbmVkLCBfX2dldGF0dHJpYnV0ZV9fIGlzIGNhbGxlZCBmaXJzdCwgYW5kIGlmIGl0IHJhaXNlcworICBBdHRyaWJ1dGVFcnJvciwgX19nZXRhdHRyX18gaXMgY2FsbGVkLgorCistIFRoZSBfX2NsYXNzX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSBvYmplY3RzIGNhbiBiZSBhc3NpZ25lZCB0by4KKyAgVGhlIG5ldyBjbGFzcyBtdXN0IGhhdmUgdGhlIHNhbWUgQy1sZXZlbCBvYmplY3QgbGF5b3V0IGFzIHRoZSBvbGQKKyAgY2xhc3MuCisKKy0gVGhlIGJ1aWx0aW4gZmlsZSB0eXBlIGNhbiBiZSBzdWJjbGFzc2VkIG5vdy4gIEluIHRoZSB1c3VhbCBwYXR0ZXJuLAorICAiZmlsZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGJ1aWx0aW4gdHlwZSwgYW5kIGZpbGUoKSBpcyBhIG5ldyBidWlsdGluCisgIGNvbnN0cnVjdG9yLCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgYnVpbHRpbiBvcGVuKCkgZnVuY3Rpb24uCisgIGZpbGUoKSBpcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgdG8gb3BlbiBhIGZpbGUuCisKKy0gUHJldmlvdXNseSwgX19uZXdfXyB3b3VsZCBvbmx5IHNlZSBzZXF1ZW50aWFsIGFyZ3VtZW50cyBwYXNzZWQgdG8KKyAgdGhlIHR5cGUgaW4gYSBjb25zdHJ1Y3RvciBjYWxsOyBfX2luaXRfXyB3b3VsZCBzZWUgYm90aCBzZXF1ZW50aWFsCisgIGFuZCBrZXl3b3JkIGFyZ3VtZW50cy4gIFRoaXMgbWFkZSBubyBzZW5zZSB3aGF0c29ldmVyIGFueSBtb3JlLCBzbworICBub3cgYm90aCBfX25ld19fIGFuZCBfX2luaXRfXyBzZWUgYWxsIGFyZ3VtZW50cy4KKworLSBQcmV2aW91c2x5LCBoYXNoKCkgYXBwbGllZCB0byBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHN0ciBvcgorICB1bmljb2RlIGFsd2F5cyByZXR1cm5lZCAwLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4KKworLSBQcmV2aW91c2x5LCBhbiBvcGVyYXRpb24gb24gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBhbgorICBpbW11dGFibGUgdHlwZSAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIHN0ciwgdW5pY29kZSksCisgIHdoZXJlIHRoZSBzdWJ0eXBlIGRpZG4ndCBvdmVycmlkZSB0aGUgb3BlcmF0aW9uIChhbmQgc28gdGhlCisgIG9wZXJhdGlvbiB3YXMgaGFuZGxlZCBieSB0aGUgYnVpbHRpbiB0eXBlKSwgY291bGQgcmV0dXJuIHRoYXQKKyAgaW5zdGFuY2UgaW5zdGVhZCBhIHZhbHVlIG9mIHRoZSBiYXNlIHR5cGUuICBGb3IgZXhhbXBsZSwgaWYgcyB3YXMgb2YKKyAgYSBzdHIgc3ViY2xhc3MgdHlwZSwgc1s6XSByZXR1cm5lZCBzIGFzLWlzLiAgTm93IGl0IHJldHVybnMgYSBzdHIKKyAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyBzLgorCistIFByb3Zpc2lvbmFsIHN1cHBvcnQgZm9yIHBpY2tsaW5nIG5ldy1zdHlsZSBvYmplY3RzIGhhcyBiZWVuIGFkZGVkLgorCitDb3JlCistLS0tCisKKy0gZmlsZS53cml0ZWxpbmVzKCkgbm93IGFjY2VwdHMgYW55IGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncy4KKworLSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKSBub3cgd29ya3MgdmVyeSBtdWNoIGxpa2UKKyAgUHlPYmplY3RfU3RyKG9iaikgaW4gdGhhdCBpdCB0cmllcyB0byB1c2UgX19zdHJfXy90cF9zdHIKKyAgb24gdGhlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIHN0cmluZyBvciBidWZmZXIuIFRoaXMKKyAgbWFrZXMgdW5pY29kZSgpIGJlaGF2ZSBsaWtlIHN0cigpIHdoZW4gYXBwbGllZCB0byBub24tc3RyaW5nL2J1ZmZlcgorICBvYmplY3RzLgorCistIFB5RmlsZV9Xcml0ZU9iamVjdCBub3cgcGFzc2VzIFVuaWNvZGUgb2JqZWN0cyB0byB0aGUgZmlsZSdzIHdyaXRlCisgIG1ldGhvZC4gQXMgYSByZXN1bHQsIGFsbCBmaWxlLWxpa2Ugb2JqZWN0cyB3aGljaCBtYXkgYmUgdGhlIHRhcmdldAorICBvZiBhIHByaW50IHN0YXRlbWVudCBtdXN0IHN1cHBvcnQgVW5pY29kZSBvYmplY3RzLCBpLmUuIHRoZXkgbXVzdAorICBhdCBsZWFzdCBjb252ZXJ0IHRoZW0gaW50byBBU0NJSSBzdHJpbmdzLgorCistIFRocmVhZCBzY2hlZHVsaW5nIG9uIFNvbGFyaXMgc2hvdWxkIGJlIGltcHJvdmVkOyBpdCBpcyBubyBsb25nZXIKKyAgbmVjZXNzYXJ5IHRvIGluc2VydCBhIHNtYWxsIHNsZWVwIGF0IHRoZSBzdGFydCBvZiBhIHRocmVhZCBpbiBvcmRlcgorICB0byBsZXQgb3RoZXIgcnVubmFibGUgdGhyZWFkcyBiZSBzY2hlZHVsZWQuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgYW5kIGNTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgc3VwcG9ydAorICByZWFkIGNoYXJhY3RlciBidWZmZXIgY29tcGF0aWJsZSBvYmplY3RzIGZvciB0aGVpciAud3JpdGUoKSBtZXRob2RzLgorICBUaGVzZSBvYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgdGhlbiBoYW5kbGVkIGFzIHN1Y2gKKyAgYnkgdGhlIGluc3RhbmNlcy4KKworLSBUaGUgImVtYWlsIiBwYWNrYWdlIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0IG9mIHRoZQorICBtaW1lbGliIHBhY2thZ2UgPGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvbWltZWxpYj4gd2l0aCBBUEkgY2hhbmdlcworICBhbmQgc29tZSBpbXBsZW1lbnRhdGlvbnMgdXBkYXRlZCB0byB1c2UgaXRlcmF0b3JzIGFuZCBnZW5lcmF0b3JzLgorCistIGRpZmZsaWIubmRpZmYoKSBhbmQgZGlmZmxpYi5EaWZmZXIuY29tcGFyZSgpIGFyZSBnZW5lcmF0b3JzIG5vdy4gIFRoaXMKKyAgcmVzdG9yZXMgdGhlIGFiaWxpdHkgb2YgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSB0byBzdGFydCBwcm9kdWNpbmcgb3V0cHV0CisgIGJlZm9yZSB0aGUgZW50aXJlIGNvbXBhcmlzb24gaXMgY29tcGxldGUuCisKKy0gU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIGFuZCBjU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIHN1cHBvcnQKKyAgaXRlcmF0aW9uIGp1c3QgbGlrZSBmaWxlIG9iamVjdHMgKGkuZS4gdGhlaXIgLnJlYWRsaW5lKCkgbWV0aG9kIGlzCisgIGNhbGxlZCBmb3IgZWFjaCBpdGVyYXRpb24gdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcpLgorCistIFRoZSBjb2RlY3MgbW9kdWxlIGhhcyBncm93biBmb3VyIG5ldyBoZWxwZXIgQVBJcyB0byBhY2Nlc3MKKyAgYnVpbHRpbiBjb2RlY3M6IGdldGVuY29kZXIoKSwgZ2V0ZGVjb2RlcigpLCBnZXRyZWFkZXIoKSwKKyAgZ2V0d3JpdGVyKCkuCisKKy0gU2ltcGxlWE1MUlBDU2VydmVyOiBhIG5ldyBtb2R1bGUgKGJhc2VkIHVwb24gU2ltcGxlSFRNTFNlcnZlcikKKyAgc2ltcGxpZmllcyB3cml0aW5nIFhNTCBSUEMgc2VydmVycy4KKworLSBvcy5wYXRoLnJlYWxwYXRoKCk6IGEgbmV3IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aG5hbWUKKyAgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2Ygc3ltYm9saWMgbGlua3MuICBPbiBub24tVW5peCBzeXN0ZW1zLCB0aGlzCisgIGlzIGFuIGFsaWFzIGZvciBvcy5wYXRoLmFic3BhdGgoKS4KKworLSBvcGVyYXRvci5pbmRleE9mKCkgKFB5U2VxdWVuY2VfSW5kZXgoKSBpbiB0aGUgQyBBUEkpIG5vdyB3b3JrcyB3aXRoIGFueQorICBpdGVyYWJsZSBvYmplY3QuCisKKy0gc210cGxpYiBub3cgc3VwcG9ydHMgdmFyaW91cyBhdXRoZW50aWNhdGlvbiBhbmQgc2VjdXJpdHkgZmVhdHVyZXMgb2YKKyAgdGhlIFNNVFAgcHJvdG9jb2wgdGhyb3VnaCB0aGUgbmV3IGxvZ2luKCkgYW5kIHN0YXJ0dGxzKCkgbWV0aG9kcy4KKworLSBobWFjOiBhIG5ldyBtb2R1bGUgaW1wbGVtZW50aW5nIGtleWVkIGhhc2hpbmcgZm9yIG1lc3NhZ2UKKyAgYXV0aGVudGljYXRpb24uCisKKy0gbWltZXR5cGVzIG5vdyByZWNvZ25pemVzIG1vcmUgZXh0ZW5zaW9ucyBhbmQgZmlsZSB0eXBlcy4gIEF0IHRoZQorICBzYW1lIHRpbWUsIHNvbWUgbWFwcGluZ3Mgbm90IHNhbmN0aW9uZWQgYnkgSUFOQSB3ZXJlIHJlbW92ZWQuCisKKy0gVGhlICJjb21waWxlciIgcGFja2FnZSBoYXMgYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgdG8gdGhlIHN0YXRlIG9mCisgIFB5dGhvbiAyLjIgYnl0ZWNvZGUgZ2VuZXJhdGlvbi4gIEl0IGhhcyBhbHNvIGJlZW4gcHJvbW90ZWQgZnJvbSBhCisgIFRvb2wgdG8gYSBzdGFuZGFyZCBsaWJyYXJ5IHBhY2thZ2UuICAoVG9vbHMvY29tcGlsZXIgc3RpbGwgZXhpc3RzIGFzCisgIGEgc2FtcGxlIGRyaXZlci4pCisKK0J1aWxkCistLS0tLQorCistIExhcmdlIGZpbGUgc3VwcG9ydCAoTEZTKSBpcyBub3cgYXV0b21hdGljIHdoZW4gdGhlIHBsYXRmb3JtIHN1cHBvcnRzCisgIGl0OyBubyBtb3JlIG1hbnVhbCBjb25maWd1cmF0aW9uIHR3ZWFrcyBhcmUgbmVlZGVkLiAgT24gTGludXgsIGF0CisgIGxlYXN0LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBzeXN0ZW0gd2hvc2UgQyBsaWJyYXJ5IHN1cHBvcnRzIGxhcmdlCisgIGZpbGVzIGJ1dCB3aG9zZSBrZXJuZWwgZG9lc24ndDsgaW4gdGhpcyBjYXNlLCBsYXJnZSBmaWxlIHN1cHBvcnQgaXMKKyAgc3RpbGwgZW5hYmxlZCBidXQgZG9lc24ndCBkbyB5b3UgYW55IGdvb2QgdW5sZXNzIHlvdSB1cGdyYWRlIHlvdXIKKyAga2VybmVsIG9yIHNoYXJlIHlvdXIgUHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBhbm90aGVyIHN5c3RlbSB3aG9zZQorICBrZXJuZWwgaGFzIGxhcmdlIGZpbGUgc3VwcG9ydC4KKworLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgc3VwcGxpZXMgcGxhdXNpYmxlIGRlZmF1bHRzIGluIGEKKyAgY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnQuICBUaGlzIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBzdXBwbGllZAorICB2YWx1ZXMgYXJlIGFsd2F5cyBjb3JyZWN0LCBvciB0aGF0IGNyb3NzLWNvbXBpbGF0aW9uIG5vdyB3b3JrcworICBmbGF3bGVzc2x5IC0tIGJ1dCBpdCdzIGEgZmlyc3Qgc3RlcCAoYW5kIGl0IHNodXRzIHVwIG1vc3Qgb2YKKyAgYXV0b2NvbmYncyB3YXJuaW5ncyBhYm91dCBBQ19UUllfUlVOKS4KKworLSBUaGUgVW5peCBidWlsZCBpcyBub3cgYSBiaXQgbGVzcyBjaGF0dHksIGNvdXJ0ZXN5IG9mIHRoZSBwYXJzZXIKKyAgZ2VuZXJhdG9yLiAgVGhlIGJ1aWxkIGlzIGNvbXBsZXRlbHkgc2lsZW50IChleGNlcHQgZm9yIGVycm9ycykgd2hlbgorICB1c2luZyAibWFrZSAtcyIsIHRoYW5rcyB0byBhIC1xIG9wdGlvbiB0byBzZXR1cC5weS4KKworQyBBUEkKKy0tLS0tCisKKy0gVGhlICJzdHJ1Y3RtZW1iZXIiIEFQSSBub3cgc3VwcG9ydHMgc29tZSBuZXcgZmxhZyBiaXRzIHRvIGRlbnkgcmVhZAorICBhbmQvb3Igd3JpdGUgYWNjZXNzIHRvIGF0dHJpYnV0ZXMgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZS4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCistIENvbXBhcSdzIGlQQVEgaGFuZGhlbGQsIHJ1bm5pbmcgdGhlICJmYW1pbGlhciIgTGludXggZGlzdHJpYnV0aW9uCisgIChodHRwOi8vZmFtaWxpYXIuaGFuZGhlbGRzLm9yZykuCisKK1Rlc3RzCistLS0tLQorCistIFRoZSAiY2xhc3NpYyIgc3RhbmRhcmQgdGVzdHMsIHdoaWNoIHdvcmsgYnkgY29tcGFyaW5nIHN0ZG91dCB0bworICBhbiBleHBlY3RlZC1vdXRwdXQgZmlsZSB1bmRlciBMaWIvdGVzdC9vdXRwdXQvLCBubyBsb25nZXIgc3RvcCBhdAorICB0aGUgZmlyc3QgbWlzbWF0Y2guICBJbnN0ZWFkIHRoZSB0ZXN0IGlzIHJ1biB0byBjb21wbGV0aW9uLCBhbmQgYQorICB2YXJpYW50IG9mIG5kaWZmLXN0eWxlIGNvbXBhcmlzb24gaXMgdXNlZCB0byByZXBvcnQgYWxsIGRpZmZlcmVuY2VzLgorICBUaGlzIGlzIG11Y2ggZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhbiB0aGUgcHJldmlvdXMgc3R5bGUgb2YgcmVwb3J0aW5nLgorCistIFRoZSB1bml0dGVzdC1iYXNlZCBzdGFuZGFyZCB0ZXN0cyBub3cgdXNlIHJlZ3J0ZXN0J3MgdGVzdF9tYWluKCkKKyAgY29udmVudGlvbiwgaW5zdGVhZCBvZiBydW5uaW5nIGFzIGEgc2lkZS1lZmZlY3Qgb2YgbWVyZWx5IGJlaW5nCisgIGltcG9ydGVkLiAgVGhpcyBhbGxvd3MgdGhlc2UgdGVzdHMgdG8gYmUgcnVuIGluIG1vcmUgbmF0dXJhbCBhbmQKKyAgZmxleGlibGUgd2F5cyBhcyB1bml0dGVzdHMsIG91dHNpZGUgdGhlIHJlZ3J0ZXN0IGZyYW1ld29yay4KKworLSByZWdydGVzdC5weSBpcyBtdWNoIGJldHRlciBpbnRlZ3JhdGVkIHdpdGggdW5pdHRlc3QgYW5kIGRvY3Rlc3Qgbm93LAorICBlc3BlY2lhbGx5IGluIHJlZ2FyZCB0byByZXBvcnRpbmcgZXJyb3JzLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gTGFyZ2UgZmlsZSBzdXBwb3J0IG5vdyBhbHNvIHdvcmtzIGZvciBmaWxlcyA+IDRHQiwgb24gZmlsZXN5c3RlbXMKKyAgdGhhdCBzdXBwb3J0IGl0IChOVEZTIHVuZGVyIFdpbmRvd3MgMjAwMCkuICBTZWUgIldoYXQncyBOZXcgaW4KKyAgUHl0aG9uIDIuMmEzIiBmb3IgbW9yZSBkZXRhaWwuCisKKworV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTM/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgRGF0ZTogMDctU2VwLTIwMDEqCisKK0NvcmUKKy0tLS0KKworLSBDb252ZXJzaW9uIG9mIGxvbmcgdG8gZmxvYXQgbm93IHJhaXNlcyBPdmVyZmxvd0Vycm9yIGlmIHRoZSBsb25nIGlzIHRvbworICBiaWcgdG8gcmVwcmVzZW50IGFzIGEgQyBkb3VibGUuCisKKy0gVGhlIDMtYXJndW1lbnQgYnVpbHRpbiBwb3coKSBubyBsb25nZXIgYWxsb3dzIGEgdGhpcmQgbm9uLU5vbmUgYXJndW1lbnQKKyAgaWYgZWl0aGVyIG9mIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGlzIGEgZmxvYXQsIG9yIGlmIGJvdGggYXJlIG9mCisgIGludGVnZXIgdHlwZXMgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmUgKGluIHdoaWNoIGxhdHRlciBjYXNlCisgIHRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBmbG9hdCwgc28gdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUKKyAgcmVzdHJpY3Rpb24pLgorCistIFRoZSBidWlsdGluIGRpcigpIG5vdyByZXR1cm5zIG1vcmUgaW5mb3JtYXRpb24sIGFuZCBzb21ldGltZXMgbXVjaAorICBtb3JlLCBnZW5lcmFsbHkgbmFtaW5nIGFsbCBhdHRyaWJ1dGVzIG9mIGFuIG9iamVjdCwgYW5kIGFsbCBhdHRyaWJ1dGVzCisgIHJlYWNoYWJsZSBmcm9tIHRoZSBvYmplY3QgdmlhIGl0cyBjbGFzcywgYW5kIGZyb20gaXRzIGNsYXNzJ3MgYmFzZQorICBjbGFzc2VzLCBhbmQgc28gb24gZnJvbSB0aGVtIHRvby4gIEV4YW1wbGU6ICBpbiAyLjJhMiwgZGlyKFtdKSByZXR1cm5lZAorICBhbiBlbXB0eSBsaXN0LiAgSW4gMi4yYTMsCisKKyAgPj4+IGRpcihbXSkKKyAgWydfX2FkZF9fJywgJ19fY2xhc3NfXycsICdfX2NvbnRhaW5zX18nLCAnX19kZWxhdHRyX18nLCAnX19kZWxpdGVtX18nLAorICAgJ19fZXFfXycsICdfX2dlX18nLCAnX19nZXRhdHRyX18nLCAnX19nZXRpdGVtX18nLCAnX19nZXRzbGljZV9fJywKKyAgICdfX2d0X18nLCAnX19oYXNoX18nLCAnX19pYWRkX18nLCAnX19pbXVsX18nLCAnX19pbml0X18nLCAnX19sZV9fJywKKyAgICdfX2xlbl9fJywgJ19fbHRfXycsICdfX211bF9fJywgJ19fbmVfXycsICdfX25ld19fJywgJ19fcmVwcl9fJywKKyAgICdfX3JtdWxfXycsICdfX3NldGF0dHJfXycsICdfX3NldGl0ZW1fXycsICdfX3NldHNsaWNlX18nLCAnX19zdHJfXycsCisgICAnYXBwZW5kJywgJ2NvdW50JywgJ2V4dGVuZCcsICdpbmRleCcsICdpbnNlcnQnLCAncG9wJywgJ3JlbW92ZScsCisgICAncmV2ZXJzZScsICdzb3J0J10KKworICBkaXIobW9kdWxlKSBjb250aW51ZXMgdG8gcmV0dXJuIG9ubHkgdGhlIG1vZHVsZSdzIGF0dHJpYnV0ZXMsIHRob3VnaC4KKworLSBPdmVyZmxvd2luZyBvcGVyYXRpb25zIG9uIHBsYWluIGludHMgbm93IHJldHVybiBhIGxvbmcgaW50IHJhdGhlcgorICB0aGFuIHJhaXNpbmcgT3ZlcmZsb3dFcnJvci4gIFRoaXMgaXMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIFBFUAorICAyMzcuICBZb3UgY2FuIHVzZSAtV2RlZmF1bHQ6Ok92ZXJmbG93V2FybmluZyB0byBlbmFibGUgYSB3YXJuaW5nIGZvcgorICB0aGlzIHNpdHVhdGlvbiwgYW5kIC1XZXJyb3I6Ok92ZXJmbG93V2FybmluZyB0byByZXZlcnQgdG8gdGhlIG9sZAorICBPdmVyZmxvd0Vycm9yIGV4Y2VwdGlvbi4KKworLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtUTxhcmc+LCBpcyBhZGRlZCB0byBjb250cm9sIHJ1bi10aW1lCisgIHdhcm5pbmdzIGZvciB0aGUgdXNlIG9mIGNsYXNzaWMgZGl2aXNpb24uICAoU2VlIFBFUCAyMzguKSAgUG9zc2libGUKKyAgdmFsdWVzIGFyZSAtUW9sZCwgLVF3YXJuLCAtUXdhcm5hbGwsIGFuZCAtUW5ldy4gIFRoZSBkZWZhdWx0IGlzCisgIC1Rb2xkLCBtZWFuaW5nIHRoZSAvIG9wZXJhdG9yIGhhcyBpdHMgY2xhc3NpYyBtZWFuaW5nIGFuZCBubworICB3YXJuaW5ncyBhcmUgaXNzdWVkLiAgVXNpbmcgLVF3YXJuIGlzc3VlcyBhIHJ1bi10aW1lIHdhcm5pbmcgYWJvdXQKKyAgYWxsIHVzZXMgb2YgY2xhc3NpYyBkaXZpc2lvbiBmb3IgaW50IGFuZCBsb25nIGFyZ3VtZW50czsgLVF3YXJuYWxsCisgIGFsc28gd2FybnMgYWJvdXQgY2xhc3NpYyBkaXZpc2lvbiBmb3IgZmxvYXQgYW5kIGNvbXBsZXggYXJndW1lbnRzCisgIChmb3IgdXNlIHdpdGggZml4ZGl2LnB5KS4KKyAgW05vdGU6ICB0aGUgcmVtYWluZGVyIG9mIHRoaXMgaXRlbSAocHJlc2VydmVkIGJlbG93KSBiZWNhbWUKKyAgb2Jzb2xldGUgaW4gMi4yYzEgLS0gLVFuZXcgaGFzIGdsb2JhbCBlZmZlY3QgaW4gMi4yXSA6OgorCisgICAgVXNpbmcgLVFuZXcgaXMgcXVlc3Rpb25hYmxlOyBpdCB0dXJucyBvbiBuZXcgZGl2aXNpb24gYnkgZGVmYXVsdCwgYnV0CisgICAgb25seSBpbiB0aGUgX19tYWluX18gbW9kdWxlLiAgWW91IGNhbiB1c2VmdWxseSBjb21iaW5lIC1Rd2FybiBvcgorICAgIC1Rd2FybmFsbCBhbmQgLVFuZXc6IHRoaXMgZ2l2ZXMgdGhlIF9fbWFpbl9fIG1vZHVsZSBuZXcgZGl2aXNpb24sIGFuZAorICAgIHdhcm5zIGFib3V0IGNsYXNzaWMgZGl2aXNpb24gZXZlcnl3aGVyZSBlbHNlLgorCistIE1hbnkgYnVpbHQtaW4gdHlwZXMgY2FuIG5vdyBiZSBzdWJjbGFzc2VkLiAgVGhpcyBhcHBsaWVzIHRvIGludCwKKyAgbG9uZywgZmxvYXQsIHN0ciwgdW5pY29kZSwgYW5kIHR1cGxlLiAgKFRoZSB0eXBlcyBjb21wbGV4LCBsaXN0IGFuZAorICBkaWN0aW9uYXJ5IGNhbiBhbHNvIGJlIHN1YmNsYXNzZWQ7IHRoaXMgd2FzIGludHJvZHVjZWQgZWFybGllci4pCisgIE5vdGUgdGhhdCByZXN0cmljdGlvbnMgYXBwbHkgd2hlbiBzdWJjbGFzc2luZyBpbW11dGFibGUgYnVpbHQtaW4KKyAgdHlwZXM6IHlvdSBjYW4gb25seSBhZmZlY3QgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBieSBvdmVybG9hZGluZworICBfX25ld19fLiAgWW91IGNhbiBhZGQgbXV0YWJsZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIHN1YmNsYXNzIGluc3RhbmNlcworICB3aWxsIGhhdmUgYSBfX2RpY3RfXyBhdHRyaWJ1dGUsIGJ1dCB5b3UgY2Fubm90IGNoYW5nZSB0aGUgInZhbHVlIgorICAoYXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MpIG9mIGFuIGltbXV0YWJsZSBzdWJjbGFzcyBpbnN0YW5jZQorICBvbmNlIGl0IGlzIGNyZWF0ZWQuCisKKy0gVGhlIGRpY3Rpb25hcnkgY29uc3RydWN0b3Igbm93IHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LCBhCisgIG1hcHBpbmctbGlrZSBvYmplY3QsIGFuZCBpbml0aWFsaXplcyB0aGUgZGljdGlvbmFyeSBmcm9tIGl0cworICAoa2V5LCB2YWx1ZSkgcGFpcnMuCisKKy0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgc3VwZXIsIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBmYWNpbGl0YXRlcyBtYWtpbmcKKyAgImNvb3BlcmF0aXZlIHN1cGVyIGNhbGxzIiBpbiBhIG11bHRpcGxlIGluaGVyaXRhbmNlIHNldHRpbmcuICBGb3IgYW4KKyAgZXhwbGFuYXRpb24sIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNjb29wZXJhdGlvbgorCistIEEgbmV3IGJ1aWx0LWluIHR5cGUsIHByb3BlcnR5LCBoYXMgYmVlbiBhZGRlZC4gIFRoaXMgZW5hYmxlcyB0aGUKKyAgY3JlYXRpb24gb2YgInByb3BlcnRpZXMiLiAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgaW1wbGVtZW50ZWQgYnkKKyAgZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zIChvciBvbmx5IG9uZSBvZiB0aGVzZSBmb3IgcmVhZC1vbmx5IG9yCisgIHdyaXRlLW9ubHkgYXR0cmlidXRlcyksIHdpdGhvdXQgdGhlIG5lZWQgdG8gb3ZlcnJpZGUgX19nZXRhdHRyX18uCisgIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbCNwcm9wZXJ0eQorCistIFRoZSBzeW50YXggb2YgZmxvYXRpbmctcG9pbnQgYW5kIGltYWdpbmFyeSBsaXRlcmFscyBoYXMgYmVlbgorICBsaWJlcmFsaXplZCwgdG8gYWxsb3cgbGVhZGluZyB6ZXJvZXMuICBFeGFtcGxlcyBvZiBsaXRlcmFscyBub3cKKyAgbGVnYWwgdGhhdCB3ZXJlIFN5bnRheEVycm9ycyBiZWZvcmU6CisKKyAgICAgIDAwLjAgICAgMGUzICAgMDEwMGogICAwNy41ICAgMDAwMDAwMDAwMDAwMDAwMDAwMDguCisKKy0gQW4gb2xkIHRva2VuaXplciBidWcgYWxsb3dlZCBmbG9hdGluZyBwb2ludCBsaXRlcmFscyB3aXRoIGFuIGluY29tcGxldGUKKyAgZXhwb25lbnQsIHN1Y2ggYXMgMWUgYW5kIDMuMWUtLiAgU3VjaCBsaXRlcmFscyBub3cgcmFpc2UgU3ludGF4RXJyb3IuCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSB0ZWxuZXRsaWIgaW5jbHVkZXMgc3ltYm9saWMgbmFtZXMgZm9yIHRoZSBvcHRpb25zLCBhbmQgc3VwcG9ydCBmb3IKKyAgc2V0dGluZyBhbiBvcHRpb24gbmVnb3RpYXRpb24gY2FsbGJhY2suIEl0IGFsc28gc3VwcG9ydHMgcHJvY2Vzc2luZworICBvZiBzdWJvcHRpb25zLgorCistIFRoZSBuZXcgQyBzdGFuZGFyZCBubyBsb25nZXIgcmVxdWlyZXMgdGhhdCBtYXRoIGxpYnJhcmllcyBzZXQgZXJybm8gdG8KKyAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKKyAgZnJlZWRvbSwgUHl0aG9uJ3Mgb3ZlcmZsb3ctY2hlY2tpbmcgd2FzIHdob2xseSBicm9rZW4uICBBIG5ldyBvdmVyZmxvdy0KKyAgY2hlY2tpbmcgc2NoZW1lIGF0dGVtcHRzIHRvIHJlcGFpciB0aGF0LCBidXQgbWF5IG5vdCBiZSByZWxpYWJsZSBvbiBhbGwKKyAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQorICBpbiB0aGlzIGFyZWEgYW55bW9yZSkuCisKKy0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcworICB0aHJlYWRpbmcuVGltZXIuCisKKy0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKKyAgbG9uZyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgbWF0aC5sb2cxMCgxMCAqKiAxMDAwMCkgfj0gMTAwMDAuMC4KKworLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKKyAgY3VycmVudGx5IGhlbGQuICBTZWUgdGhlIGRvY3MgZm9yIHRoZSBpbXAgbW9kdWxlLgorCistIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKKyAgZHVtcHMgY29udGFpbmluZyBpbnRzIHdyaXR0ZW4gb24gcGxhdGZvcm1zIHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA4IGJ5dGVzLgorICBXaGVuIHJlYWQgb24gYSBib3ggd2hlcmUgUHl0aG9uIGludHMgYXJlIDQgYnl0ZXMsIHN1Y2ggdmFsdWVzIGFyZQorICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgorCistIEluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUgKHVzaW5nIHRoZSByZXhlYyBtb2R1bGUpLCB1bm1hcnNoYWxsaW5nCisgIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgorCistIHVuaXR0ZXN0LlRlc3RSZXN1bHQgaW5zdGFuY2VzIG5vIGxvbmdlciBzdG9yZSByZWZlcmVuY2VzIHRvIHRyYWNlYmFja3MKKyAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCisgIHRvIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgYmV0d2VlbiB0ZXN0cy4KKworVG9vbHMKKy0tLS0tCisKKy0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CisgIGRpdmlzaW9uIG9wZXJhdG9ycyBhcyBwZXIgUEVQIDIzOC4KKworQnVpbGQKKy0tLS0tCisKKy0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKKyAgTWFjL09TWC4gVGhlcmUgaXMgYSBNYWtlZmlsZSB0aGVyZSB0aGF0IHdpbGwgYnVpbGQgUHl0aG9uIGFzIGEgcmVhbCBNYWMKKyAgYXBwbGljYXRpb24sIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBleHBlcmltZW50aW5nIHdpdGggQ2FyYm9uIG9yIENvY29hLgorICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgorCitDIEFQSQorLS0tLS0KKworLSBOZXcgZnVuY3Rpb24gUHlPYmplY3RfRGlyKG9iaiksIGxpa2UgUHl0aG9uIF9fYnVpbHRpbl9fLmRpcihvYmopLgorCistIE5vdGUgdGhhdCBQeUxvbmdfQXNEb3VibGUgY2FuIGZhaWwhICBUaGlzIGhhcyBhbHdheXMgYmVlbiB0cnVlLCBidXQgbm8KKyAgY2FsbGVycyBjaGVja2VkIGZvciBpdC4gIEl0J3MgbW9yZSBsaWtlbHkgdG8gZmFpbCBub3csIGJlY2F1c2Ugb3ZlcmZsb3cKKyAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazo6CisKKyAgICAgIGRvdWJsZSB4ID0gUHlMb25nX0FzRG91YmxlKHNvbWVfbG9uZ19vYmplY3QpOworICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgIC8qIFRoZSBjb252ZXJzaW9uIGZhaWxlZC4gKi8KKyAgICAgIH0KKworLSBUaGUgR0MgQVBJIGhhcyBiZWVuIGNoYW5nZWQuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoZSBvbGQgQVBJIHdpbGwgc3RpbGwKKyAgY29tcGlsZSBidXQgd2lsbCBub3QgcGFydGljaXBhdGUgaW4gR0MuICBUbyB1cGdyYWRlIGFuIGV4dGVuc2lvbgorICBtb2R1bGU6CisKKyAgICAtIHJlbmFtZSBQeV9UUEZMQUdTX0dDIHRvIFB5VFBGTEFHU19IQVZFX0dDCisKKyAgICAtIHVzZSBQeU9iamVjdF9HQ19OZXcgb3IgUHlPYmplY3RfR0NfTmV3VmFyIHRvIGFsbG9jYXRlIG9iamVjdHMgYW5kCisgICAgICBQeU9iamVjdF9HQ19EZWwgdG8gZGVhbGxvY2F0ZSB0aGVtCisKKyAgICAtIHJlbmFtZSBQeU9iamVjdF9HQ19Jbml0IHRvIFB5T2JqZWN0X0dDX1RyYWNrIGFuZCBQeU9iamVjdF9HQ19GaW5pCisgICAgICB0byBQeU9iamVjdF9HQ19VblRyYWNrCisKKyAgICAtIHJlbW92ZSBQeUdDX0hFQURfU0laRSBmcm9tIG9iamVjdCBzaXplIGNhbGN1bGF0aW9ucworCisgICAgLSByZW1vdmUgY2FsbHMgdG8gUHlPYmplY3RfQVNfR0MgYW5kIFB5T2JqZWN0X0ZST01fR0MKKworLSBUd28gbmV3IGZ1bmN0aW9uczogUHlTdHJpbmdfRnJvbUZvcm1hdCgpIGFuZCBQeVN0cmluZ19Gcm9tRm9ybWF0VigpLgorICBUaGVzZSBjYW4gYmUgdXNlZCBzYWZlbHkgdG8gY29uc3RydWN0IHN0cmluZyBvYmplY3RzIGZyb20gYQorICBzcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcgKHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmcgc3VwcG9ydGVkCisgIGJ5IFB5RXJyX0Zvcm1hdCgpKS4KKworTmV3IHBsYXRmb3JtcworLS0tLS0tLS0tLS0tLQorCistIFN0ZXBoZW4gSGFuc2VuIGNvbnRyaWJ1dGVkIHBhdGNoZXMgc3VmZmljaWVudCB0byBnZXQgYSBjbGVhbiBjb21waWxlCisgIHVuZGVyIEJvcmxhbmQgQyAoV2luZG93cyksIGJ1dCBoZSByZXBvcnRzIHByb2JsZW1zIHJ1bm5pbmcgaXQgYW5kIHJhbgorICBvdXQgb2YgdGltZSB0byBjb21wbGV0ZSB0aGUgcG9ydC4gIFZvbHVudGVlcnM/ICBFeHBlY3QgYSBNZW1vcnlFcnJvcgorICB3aGVuIGltcG9ydGluZyB0aGUgdHlwZXMgbW9kdWxlOyB0aGlzIGlzIHByb2JhYmx5IHNoYWxsb3csIGFuZAorICBjYXVzaW5nIGxhdGVyIGZhaWx1cmVzIHRvby4KKworVGVzdHMKKy0tLS0tCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBMYXJnZSBmaWxlIHN1cHBvcnQgaXMgbm93IGVuYWJsZWQgb24gV2luMzIgcGxhdGZvcm1zIGFzIHdlbGwgYXMgb24KKyAgV2luNjQuICBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBmLnRlbGwoKSBhbmQgZi5zZWVrKCkKKyAgdG8gbWFuaXB1bGF0ZSBmaWxlcyBsYXJnZXIgdGhhbiAyIGdpZ2FieXRlcyAocHJvdmlkZWQgeW91IGhhdmUgZW5vdWdoCisgIGRpc2sgc3BhY2UsIGFuZCBhcmUgdXNpbmcgYSBXaW5kb3dzIGZpbGVzeXN0ZW0gdGhhdCBzdXBwb3J0cyBsYXJnZQorICBwYXJ0aXRpb25zKS4gIFdpbmRvd3MgZmlsZXN5c3RlbSBsaW1pdHM6ICBGQVQgaGFzIGEgMkdCIChnaWdhYnl0ZSkKKyAgZmlsZXNpemUgbGltaXQsIGFuZCBsYXJnZSBmaWxlIHN1cHBvcnQgbWFrZXMgbm8gZGlmZmVyZW5jZSB0aGVyZS4KKyAgRkFUMzIncyBsaW1pdCBpcyA0R0IsIGFuZCBmaWxlcyA+PSAyR0IgYXJlIGVhc2llciB0byB1c2UgZnJvbSBQeXRob24gbm93LgorICBOVEZTIGhhcyBubyBwcmFjdGljYWwgbGltaXQgb24gZmlsZSBzaXplLCBhbmQgZmlsZXMgb2YgYW55IHNpemUgY2FuIGJlCisgIHVzZWQgZnJvbSBQeXRob24gbm93LgorCistIFRoZSB3OXhwb3BlbiBoYWNrIGlzIG5vdyB1c2VkIG9uIFdpbmRvd3MgTlQgYW5kIDIwMDAgdG9vIHdoZW4gQ09NUFNQRUMKKyAgcG9pbnRzIHRvIGNvbW1hbmQuY29tIChwYXRjaCBmcm9tIEJyaWFuIFF1aW5sYW4pLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIERhdGU6IDIyLUF1Zy0yMDAxKgorCitCdWlsZAorLS0tLS0KKworLSBUaW0gUGV0ZXJzIGRldmVsb3BlZCBhIGJyYW5kIG5ldyBXaW5kb3dzIGluc3RhbGxlciB1c2luZyBXaXNlIDguMSwKKyAgZ2VuZXJvdXNseSBkb25hdGVkIHRvIHVzIGJ5IFdpc2UgU29sdXRpb25zLgorCistIGNvbmZpZ3VyZSBzdXBwb3J0cyBhIG5ldyBvcHRpb24gLS1lbmFibGUtdW5pY29kZSwgd2l0aCB0aGUgdmFsdWVzCisgIHVjczIgYW5kIHVjczQgKG5ldyBpbiAyLjJhMSkuIFdpdGggLS1kaXNhYmxlLXVuaWNvZGUsIHRoZSBVbmljb2RlCisgIHR5cGUgYW5kIHN1cHBvcnRpbmcgY29kZSBpcyBjb21wbGV0ZWx5IHJlbW92ZWQgZnJvbSB0aGUgaW50ZXJwcmV0ZXIuCisKKy0gQSBuZXcgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1mcmFtZXdvcmsgYnVpbGRzIGEgTWFjIE9TIFggZnJhbWV3b3JrLAorICB3aGljaCAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB3aWxsIGluc3RhbGwuIFRoaXMgcHJvdmlkZXMgYSBzdGFydGluZworICBwb2ludCBmb3IgbW9yZSBtYWMtbGlrZSBmdW5jdGlvbmFsaXR5LCBqb2luIHB5dGhvbm1hYy1zaWdAcHl0aG9uLm9yZworICBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGVscGluZy4KKworLSBUaGUgTmVYVCBwbGF0Zm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorCistIFRoZSAnbmV3JyBtb2R1bGUgaXMgbm93IHN0YXRpY2FsbHkgbGlua2VkLgorCitUb29scworLS0tLS0KKworLSBUaGUgbmV3IFRvb2xzL3NjcmlwdHMvY2xlYW5mdXR1cmUucHkgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQorICBlZGl0IG91dCBvYnNvbGV0ZSBmdXR1cmUgc3RhdGVtZW50cyBmcm9tIFB5dGhvbiBzb3VyY2UgY29kZS4gIFNlZQorICB0aGUgbW9kdWxlIGRvY3N0cmluZyBmb3IgZGV0YWlscy4KKworVGVzdHMKKy0tLS0tCisKKy0gcmVncnRlc3QucHkgbm93IGtub3dzIHdoaWNoIHRlc3RzIGFyZSBleHBlY3RlZCB0byBiZSBza2lwcGVkIG9uIHNvbWUKKyAgcGxhdGZvcm1zLCBhbGxvd2luZyB0byBnaXZlIGNsZWFyZXIgdGVzdCByZXN1bHQgb3V0cHV0LiAgcmVncnRlc3QKKyAgYWxzbyBoYXMgb3B0aW9uYWwgLS11c2UvLXUgc3dpdGNoIHRvIHJ1biBub3JtYWxseSBkaXNhYmxlZCB0ZXN0cworICB3aGljaCByZXF1aXJlIG5ldHdvcmsgYWNjZXNzIG9yIGNvbnN1bWUgc2lnbmlmaWNhbnQgZGlzayByZXNvdXJjZXMuCisKKy0gU2V2ZXJhbCBuZXcgdGVzdHMgaW4gdGhlIHN0YW5kYXJkIHRlc3Qgc3VpdGUsIHdpdGggc3BlY2lhbCB0aGFua3MgdG8KKyAgTmljayBNYXRoZXdzb24uCisKK0NvcmUKKy0tLS0KKworLSBUaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IgLy8gaGFzIGJlZW4gYWRkZWQgYXMgb3V0bGluZWQgaW4gUEVQCisgIDIzOC4gIFRoZSAvIG9wZXJhdG9yIHN0aWxsIHByb3ZpZGVzIGNsYXNzaWMgZGl2aXNpb24gKGFuZCB3aWxsIHVudGlsCisgIFB5dGhvbiAzLjApIHVubGVzcyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIgaXMgaW5jbHVkZWQsIGluCisgIHdoaWNoIGNhc2UgdGhlIC8gb3BlcmF0b3Igd2lsbCBwcm92aWRlIHRydWUgZGl2aXNpb24uICBUaGUgb3BlcmF0b3IKKyAgbW9kdWxlIHByb3ZpZGVzIHRydWVkaXYoKSBhbmQgZmxvb3JkaXYoKSBmdW5jdGlvbnMuICBBdWdtZW50ZWQKKyAgYXNzaWdubWVudCB2YXJpYW50cyBhcmUgaW5jbHVkZWQsIGFzIGFyZSB0aGUgZXF1aXZhbGVudCBvdmVybG9hZGFibGUKKyAgbWV0aG9kcyBhbmQgQyBBUEkgbWV0aG9kcy4gIFNlZSB0aGUgUEVQIGZvciBhIGZ1bGwgZGlzY3Vzc2lvbjoKKyAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyMzguaHRtbD4KKworLSBGdXR1cmUgc3RhdGVtZW50cyBhcmUgbm93IGVmZmVjdGl2ZSBpbiBzaW11bGF0ZWQgaW50ZXJhY3RpdmUgc2hlbGxzCisgIChsaWtlIElETEUpLiAgVGhpcyBzaG91bGQgImp1c3Qgd29yayIgYnkgbWFnaWMsIGJ1dCByZWFkIE1pY2hhZWwKKyAgSHVkc29uJ3MgIkZ1dHVyZSBzdGF0ZW1lbnRzIGluIHNpbXVsYXRlZCBzaGVsbHMiIFBFUCAyNjQgZm9yIGZ1bGwKKyAgZGV0YWlsczogIDxodHRwOi8vcHl0aG9uLnNmLm5ldC9wZXBzL3BlcC0wMjY0Lmh0bWw+LgorCistIFRoZSB0eXBlL2NsYXNzIHVuaWZpY2F0aW9uIChQRVAgMjUyLTI1Mykgd2FzIGludGVncmF0ZWQgaW50byB0aGUKKyAgdHJ1bmsgYW5kIGlzIG5vdCBzbyB0ZW50YXRpdmUgYW55IG1vcmUgKHRoZSBleGFjdCBzcGVjaWZpY2F0aW9uIG9mCisgIHNvbWUgZmVhdHVyZXMgaXMgc3RpbGwgdGVudGF0aXZlKS4gIEEgbG90IG9mIHdvcmsgaGFzIGRvbmUgb24gZml4aW5nCisgIGJ1Z3MgYW5kIGFkZGluZyByb2J1c3RuZXNzIGFuZCBmZWF0dXJlcyAocGVyZm9ybWFuY2Ugc3RpbGwgaGFzIHRvCisgIGNvbWUgYSBsb25nIHdheSkuCisKKy0gV2FybmluZ3MgYWJvdXQgYSBtaXNtYXRjaCBpbiB0aGUgUHl0aG9uIEFQSSBkdXJpbmcgZXh0ZW5zaW9uIGltcG9ydAorICBub3cgdXNlIHRoZSBQeXRob24gd2FybmluZyBmcmFtZXdvcmsgKHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgIHdyaXRlIGZpbHRlcnMgZm9yIHRoZXNlIHdhcm5pbmdzKS4KKworLSBBIGZ1bmN0aW9uJ3MgX19kaWN0X18gKGFrYSBmdW5jX2RpY3QpIHdpbGwgbm93IGFsd2F5cyBiZSBhCisgIGRpY3Rpb25hcnkuICBJdCB1c2VkIHRvIGJlIHBvc3NpYmxlIHRvIGRlbGV0ZSBpdCBvciBzZXQgaXQgdG8gTm9uZSwKKyAgYnV0IG5vdyBib3RoIGFjdGlvbnMgcmFpc2UgVHlwZUVycm9ycy4gIEl0IGlzIHN0aWxsIGxlZ2FsIHRvIHNldCBpdAorICB0byBhIGRpY3Rpb25hcnkgb2JqZWN0LiAgR2V0dGluZyBmdW5jLl9fZGljdF9fIGJlZm9yZSBhbnkgYXR0cmlidXRlcworICBoYXZlIGJlZW4gYXNzaWduZWQgbm93IHJldHVybnMgYW4gZW1wdHkgZGljdGlvbmFyeSBpbnN0ZWFkIG9mIE5vbmUuCisKKy0gQSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiwgLUUsIHdhcyBhZGRlZCB3aGljaCBkaXNhYmxlcyB0aGUgdXNlIG9mCisgIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG9yIGF0IGxlYXN0IHRob3NlIHRoYXQgYXJlIHNwZWNpZmljYWxseQorICBzaWduaWZpY2FudCB0byBQeXRob24uICBVc3VhbGx5IHRob3NlIGhhdmUgYSBuYW1lIHN0YXJ0aW5nIHdpdGgKKyAgIlBZVEhPTiIuICBUaGlzIHdhcyB1c2VkIHRvIGZpeCBhIHByb2JsZW0gd2hlcmUgdGhlIHRlc3RzIGZhaWwgaWYKKyAgdGhlIHVzZXIgaGFwcGVucyB0byBoYXZlIFBZVEhPTkhPTUUgb3IgUFlUSE9OUEFUSCBwb2ludGluZyB0byBhbgorICBvbGRlciBkaXN0cmlidXRpb24uCisKK0xpYnJhcnkKKy0tLS0tLS0KKworLSBOZXcgY2xhc3MgRGlmZmVyIGFuZCBuZXcgZnVuY3Rpb25zIG5kaWZmKCkgYW5kIHJlc3RvcmUoKSBpbiBkaWZmbGliLnB5LgorICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKKyAgZm9yIHByb2dyYW1tYXRpYyByZXVzZS4KKworLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKKyAgdmFsdWUgdXNpbmcgdGhlIG1pbmltYWwgcXVvdGluZyByZXF1aXJlZCBmb3IgdGhlIHZhbHVlOyBtb3JlCisgIHJlbGlhYmxlIHRoYW4gdXNpbmcgeG1sLnNheC5zYXh1dGlscy5lc2NhcGUoKSBmb3IgYXR0cmlidXRlIHZhbHVlcy4KKworLSBSZWFkbGluZSBjb21wbGV0aW9uIHN1cHBvcnQgZm9yIGNtZC5DbWQgd2FzIGFkZGVkLgorCistIENhbGxpbmcgb3MudGVtcG5hbSgpIG9yIG9zLnRtcG5hbSgpIGdlbmVyYXRlIFJ1bnRpbWVXYXJuaW5ncy4KKworLSBBZGRlZCBmdW5jdGlvbiB0aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZSgpCisKKy0gQWRkZWQgS2EtUGluZyBZZWUncyBjZ2l0Yi5weSBtb2R1bGUuCisKKy0gVGhlICduZXcnIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQ09feHh4IGZsYWdzLgorCistIFRoZSBnYyBtb2R1bGUgb2ZmZXJzIHRoZSBnZXRfcmVmZXJlbnRzIGZ1bmN0aW9uLgorCitOZXcgcGxhdGZvcm1zCistLS0tLS0tLS0tLS0tCisKK0MgQVBJCistLS0tLQorCistIFR3byBuZXcgQVBJcyBQeU9TX3NucHJpbnRmKCkgYW5kIFB5T1NfdnNucHJpbnRmKCkgd2VyZSBhZGRlZAorICB3aGljaCBwcm92aWRlIGEgY3Jvc3MtcGxhdGZvcm0gaW1wbGVtZW50YXRpb25zIGZvciB0aGUKKyAgcmVsYXRpdmVseSBuZXcgc25wcmludGYoKS92c25wcmludGYoKSBDIGxpYiBBUElzLiBJbiBjb250cmFzdCB0bworICB0aGUgc3RhbmRhcmQgc3ByaW50ZigpIGFuZCB2c3ByaW50ZigpIEMgbGliIEFQSXMsIHRoZXNlIHZlcnNpb25zCisgIGFwcGx5IGJvdW5kcyBjaGVja2luZyBvbiB0aGUgdXNlZCBidWZmZXIgd2hpY2ggZW5oYW5jZXMgcHJvdGVjdGlvbgorICBhZ2FpbnN0IGJ1ZmZlciBvdmVycnVucy4KKworLSBVbmljb2RlIEFQSXMgbm93IHVzZSBuYW1lIG1hbmdsaW5nIHRvIGFzc3VyZSB0aGF0IG1peGluZyBpbnRlcnByZXRlcnMKKyAgYW5kIGV4dGVuc2lvbnMgdXNpbmcgZGlmZmVyZW50IFVuaWNvZGUgd2lkdGhzIGlzIHJlbmRlcmVkIG5leHQgdG8KKyAgaW1wb3NzaWJsZS4gVHJ5aW5nIHRvIGltcG9ydCBhbiBpbmNvbXBhdGlibGUgVW5pY29kZS1hd2FyZSBleHRlbnNpb24KKyAgd2lsbCByZXN1bHQgaW4gYW4gSW1wb3J0RXJyb3IuICBVbmljb2RlIGV4dGVuc2lvbnMgd3JpdGVycyBtdXN0IG1ha2UKKyAgc3VyZSB0byBjaGVjayB0aGUgVW5pY29kZSB3aWR0aCBjb21wYXRpYmlsaXR5IGluIHRoZWlyIGV4dGVuc2lvbnMgYnkKKyAgdXNpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYW5nbGVkIFVuaWNvZGUgQVBJcyBpbiB0aGUgZXh0ZW5zaW9uLgorCistIFR3byBuZXcgZmxhZ3MgTUVUSF9OT0FSR1MgYW5kIE1FVEhfTyBhcmUgYXZhaWxhYmxlIGluIG1ldGhvZCBkZWZpbml0aW9uCisgIHRhYmxlcyB0byBzaW1wbGlmeSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIGFuZCBhCisgIHNpbmdsZSB1bnR5cGVkIGFyZ3VtZW50LiBDYWxsaW5nIHN1Y2ggbWV0aG9kcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuCisgIGNhbGxpbmcgY29ycmVzcG9uZGluZyBNRVRIX1ZBUkFSR1MgbWV0aG9kcy4gTUVUSF9PTERBUkdTIGlzIG5vdworICBkZXByZWNhdGVkLgorCitXaW5kb3dzCistLS0tLS0tCisKKy0gImltcG9ydCBtb2R1bGUiIG5vdyBjb21waWxlcyBtb2R1bGUucHl3IGlmIGl0IGV4aXN0cyBhbmQgbm90aGluZyBlbHNlCisgIHJlbGV2YW50IGlzIGZvdW5kLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDIuMmExPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE4LUp1bC0yMDAxKgorCitDb3JlCistLS0tCisKKy0gVEVOVEFUSVZFTFksIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgaW1wbGVtZW50aW5nIG11Y2ggb2Ygd2hhdCdzCisgIGRlc2NyaWJlZCBpbiBQRVAgMjUyIChNYWtpbmcgVHlwZXMgTG9vayBNb3JlIExpa2UgQ2xhc3NlcykgYW5kIFBFUAorICAyNTMgKFN1YnR5cGluZyBCdWlsdC1pbiBUeXBlcykgd2FzIGFkZGVkLiAgVGhpcyB3aWxsIGJlIHJlbGVhc2VkCisgIHdpdGggUHl0aG9uIDIuMmExLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKKyAgdGhyb3VnaCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yLy4gIFRoZSBwdXJwb3NlIG9mIHJlbGVhc2luZyB0aGlzCisgIHdpdGggUHl0aG9uIDIuMmExIGlzIHRvIHRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJdCBpcworICBwb3NzaWJsZSwgdGhvdWdoIG5vdCBsaWtlbHksIHRoYXQgYSBkZWNpc2lvbiBpcyBtYWRlIG5vdCB0byByZWxlYXNlCisgIHRoaXMgY29kZSBhcyBwYXJ0IG9mIDIuMiBmaW5hbCwgaWYgYW55IHNlcmlvdXMgYmFja3dhcmRzCisgIGluY29tcGF0aWJpbGl0aWVzIGFyZSBmb3VuZCBkdXJpbmcgYWxwaGEgdGVzdGluZyB0aGF0IGNhbm5vdCBiZQorICByZXBhaXJlZC4KKworLSBHZW5lcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBuZXcgd2F5IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciAoc2VlCisgIGJlbG93KSB1c2luZyB3aGF0IGxvb2tzIGxpa2UgYSBzaW1wbGUgZnVuY3Rpb24gY29udGFpbmluZyBvbmUgb3IKKyAgbW9yZSAneWllbGQnIHN0YXRlbWVudHMuICBTZWUgUEVQIDI1NS4gIFNpbmNlIHRoaXMgYWRkcyBhIG5ldworICBrZXl3b3JkIHRvIHRoZSBsYW5ndWFnZSwgdGhpcyBmZWF0dXJlIG11c3QgYmUgZW5hYmxlZCBieSBpbmNsdWRpbmcgYQorICBmdXR1cmUgc3RhdGVtZW50OiAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzIiAoc2VlIFBFUCAyMzYpLgorICBHZW5lcmF0b3JzIHdpbGwgYmVjb21lIGEgc3RhbmRhcmQgZmVhdHVyZSBpbiBhIGZ1dHVyZSByZWxlYXNlCisgIChwcm9iYWJseSAyLjMpLiAgV2l0aG91dCB0aGlzIGZ1dHVyZSBzdGF0ZW1lbnQsICd5aWVsZCcgcmVtYWlucyBhbgorICBvcmRpbmFyeSBpZGVudGlmaWVyLCBidXQgYSB3YXJuaW5nIGlzIGlzc3VlZCBlYWNoIHRpbWUgaXQgaXMgdXNlZC4KKyAgKFRoZXNlIHdhcm5pbmdzIGN1cnJlbnRseSBkb24ndCBjb25mb3JtIHRvIHRoZSB3YXJuaW5ncyBmcmFtZXdvcmsgb2YKKyAgUEVQIDIzMDsgd2UgaW50ZW5kIHRvIGZpeCB0aGlzIGluIDIuMmEyLikKKworLSBUaGUgVVRGLTE2IGNvZGVjIHdhcyBtb2RpZmllZCB0byBiZSBtb3JlIFJGQyBjb21wbGlhbnQuIEl0IHdpbGwgbm93CisgIG9ubHkgcmVtb3ZlIEJPTSBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIGFuZCB0aGVuCisgIG9ubHkgaWYgcnVubmluZyBpbiBuYXRpdmUgbW9kZSAoVVRGLTE2LUxFIGFuZCAtQkUgd29uJ3QgcmVtb3ZlIGEKKyAgbGVhZGluZyBCTU8gY2hhcmFjdGVyKS4KKworLSBTdHJpbmdzIG5vdyBoYXZlIGEgbmV3IG1ldGhvZCAuZGVjb2RlKCkgdG8gY29tcGxlbWVudCB0aGUgYWxyZWFkeQorICBleGlzdGluZyAuZW5jb2RlKCkgbWV0aG9kLiBUaGVzZSB0d28gbWV0aG9kcyBwcm92aWRlIGRpcmVjdCBhY2Nlc3MKKyAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlcnMgYW5kIGVuY29kZXJzIG9mIHRoZSByZWdpc3RlcmVkIGNvZGVjcy4KKworICBUbyBlbmhhbmNlIHRoZSB1c2FiaWxpdHkgb2YgdGhlIC5lbmNvZGUoKSBtZXRob2QsIHRoZSBzcGVjaWFsCisgIGNhc2luZyBvZiBVbmljb2RlIG9iamVjdCByZXR1cm4gdmFsdWVzIHdhcyBkcm9wcGVkIChVbmljb2RlIG9iamVjdHMKKyAgd2VyZSBhdXRvLW1hZ2ljYWxseSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KKworICBCb3RoIG1ldGhvZHMgd2lsbCBub3cgcmV0dXJuIHdoYXRldmVyIHRoZSBjb2RlYyBpbiBjaGFyZ2Ugb2YgdGhlCisgIHJlcXVlc3RlZCBlbmNvZGluZyByZXR1cm5zIGFzIG9iamVjdCwgZS5nLiBVbmljb2RlIGNvZGVjcyB3aWxsCisgIHJldHVybiBVbmljb2RlIG9iamVjdHMgd2hlbiBkZWNvZGluZyBpcyByZXF1ZXN0ZWQgKCLDpMO2w7wiLmRlY29kZSgibGF0aW4tMSIpCisgIHdpbGwgcmV0dXJuIHUiw6TDtsO8IikuIFRoaXMgZW5hYmxlcyBjb2RlYyB3cml0ZXIgdG8gY3JlYXRlIGNvZGVjcworICBmb3IgdmFyaW91cyBzaW1wbGUgdG8gdXNlIGNvbnZlcnNpb25zLgorCisgIE5ldyBjb2RlY3Mgd2VyZSBhZGRlZCB0byBkZW1vbnN0cmF0ZSB0aGVzZSBuZXcgZmVhdHVyZXMgKHRoZSAuZW5jb2RlKCkKKyAgYW5kIC5kZWNvZGUoKSBjb2x1bW5zIGluZGljYXRlIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3RzKToKKworICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8TmFtZSAgICAgfCAuZW5jb2RlKCkgfCAuZGVjb2RlKCkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgfAorICArPT09PT09PT09Kz09PT09PT09PT09Kz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworICB8dXUgICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBVVSBjb2RlYyAoZS5nLiBmb3IgZW1haWwpICAgfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8YmFzZTY0ICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBiYXNlNjQgY29kZWMgICAgICAgICAgICAgICAgfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8cXVvcHJpICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBxdW90ZWQtcHJpbnRhYmxlIGNvZGVjICAgICAgfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8emxpYiAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCB6bGliIGNvbXByZXNzaW9uICAgICAgICAgICAgfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8aGV4ICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCAyLWJ5dGUgaGV4IGNvZGVjICAgICAgICAgICAgfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8cm90LTEzICAgfCBzdHJpbmcgICAgfCBVbmljb2RlICAgfCBST1QtMTMgVW5pY29kZSBjaGFybWFwIGNvZGVjfAorICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCistIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbm93IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2YgYSBkZWZhdWx0IFVuaWNvZGUKKyAgZW5jb2RpbmcgZm9yIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuICBOb3RhYmx5LCBXaW5kb3dzIHN1cHBvcnRzICdtYmNzJworICBhcyB0aGUgZGVmYXVsdC4gIFRoZSBNYWNpbnRvc2ggd2lsbCBhbHNvIGFkb3B0IHRoaXMgY29uY2VwdCBpbiB0aGUgbWVkaXVtCisgIHRlcm0sIGFsdGhvdWdoIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGF0IHBsYXRmb3JtIHdpbGwgYmUgb3RoZXIgdGhhbgorICAnbWJjcycuCisKKyAgT24gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHN1cHBvcnQgbm9uLUFTQ0lJIGZpbGVuYW1lcywgaXQgaXMgY29tbW9uIGZvcgorICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZmlsZW5hbWVzIChzdWNoIGFzIG9zLmxpc3RkaXIoKSkgdG8gcmV0dXJuIFB5dGhvbgorICBzdHJpbmcgb2JqZWN0cyBwcmUtZW5jb2RlZCB1c2luZyB0aGUgZGVmYXVsdCBmaWxlIHN5c3RlbSBlbmNvZGluZyBmb3IKKyAgdGhlIHBsYXRmb3JtLiAgQXMgdGhpcyBlbmNvZGluZyBpcyBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZyb20gUHl0aG9uJ3MKKyAgZGVmYXVsdCBlbmNvZGluZywgY29udmVydGluZyB0aGlzIG5hbWUgdG8gYSBVbmljb2RlIG9iamVjdCBiZWZvcmUgcGFzc2luZworICBpdCBiYWNrIHRvIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHdvdWxkIHJlc3VsdCBpbiBhIFVuaWNvZGUgZXJyb3IsIGFzIFB5dGhvbgorICB3b3VsZCBhdHRlbXB0IHRvIHVzZSBpdHMgZGVmYXVsdCBlbmNvZGluZyAoZ2VuZXJhbGx5IEFTQ0lJKSByYXRoZXIgdGhhbgorICB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorCisgIEluIGdlbmVyYWwsIHRoaXMgY2hhbmdlIHNpbXBseSByZW1vdmVzIHN1cnByaXNlcyB3aGVuIHdvcmtpbmcgd2l0aAorICBVbmljb2RlIGFuZCB0aGUgZmlsZSBzeXN0ZW0sIG1ha2luZyB0aGVzZSBvcGVyYXRpb25zIHdvcmsgYXMgeW91IGV4cGVjdCwKKyAgaW5jcmVhc2luZyB0aGUgdHJhbnNwYXJlbmN5IG9mIFVuaWNvZGUgb2JqZWN0cyBpbiB0aGlzIGNvbnRleHQuCisgIFNlZSBbPz8/P10gZm9yIG1vcmUgZGV0YWlscywgaW5jbHVkaW5nIGV4YW1wbGVzLgorCistIEZsb2F0IChhbmQgY29tcGxleCkgbGl0ZXJhbHMgaW4gc291cmNlIGNvZGUgd2VyZSBldmFsdWF0ZWQgdG8gZnVsbAorICBwcmVjaXNpb24gb25seSB3aGVuIHJ1bm5pbmcgZnJvbSBhIC5weSBmaWxlOyB0aGUgc2FtZSBjb2RlIGxvYWRlZCBmcm9tIGEKKyAgLnB5YyAob3IgLnB5bykgZmlsZSBjb3VsZCBzdWZmZXIgbnVtZXJpYyBkaWZmZXJlbmNlcyBzdGFydGluZyBhdCBhYm91dCB0aGUKKyAgMTJ0aCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0LiAgRm9yIGV4YW1wbGUsIG9uIGEgbWFjaGluZSB3aXRoIElFRUUtNzU0CisgIGZsb2F0aW5nIGFyaXRobWV0aWMsCisKKyAgICAgIHggPSA5MDA3MTk5MjU0NzQwOTkyLjAKKyAgICAgIHByaW50IGxvbmcoeCkKKworICBwcmludGVkIDkwMDcxOTkyNTQ3NDA5OTIgaWYgcnVuIGRpcmVjdGx5IGZyb20gLnB5LCBidXQgOTAwNzE5OTI1NDc0MDAwMAorICBpZiBmcm9tIGEgY29tcGlsZWQgKC5weWMgb3IgLnB5bykgZmlsZS4gIFRoaXMgd2FzIGR1ZSB0byBtYXJzaGFsIHVzaW5nCisgIHN0cihmbG9hdCkgaW5zdGVhZCBvZiByZXByKGZsb2F0KSB3aGVuIGJ1aWxkaW5nIGNvZGUgb2JqZWN0cy4gIG1hcnNoYWwKKyAgbm93IHVzZXMgcmVwcihmbG9hdCkgaW5zdGVhZCwgd2hpY2ggc2hvdWxkIHJlcHJvZHVjZSBmbG9hdHMgdG8gZnVsbAorICBtYWNoaW5lIHByZWNpc2lvbiAoYXNzdW1pbmcgdGhlIHBsYXRmb3JtIEMgZmxvYXQ8LT5zdHJpbmcgSS9PIGNvbnZlcnNpb24KKyAgZnVuY3Rpb25zIGFyZSBvZiBnb29kIHF1YWxpdHkpLgorCisgIFRoaXMgbWF5IGNhdXNlIGZsb2F0aW5nLXBvaW50IHJlc3VsdHMgdG8gY2hhbmdlIGluIHNvbWUgY2FzZXMsIGFuZAorICB1c3VhbGx5IGZvciB0aGUgYmV0dGVyLCBidXQgbWF5IGFsc28gY2F1c2UgbnVtZXJpY2FsbHkgdW5zdGFibGUKKyAgYWxnb3JpdGhtcyB0byBicmVhay4KKworLSBUaGUgaW1wbGVtZW50YXRpb24gb2YgZGljdHMgc3VmZmVycyBmZXdlciBjb2xsaXNpb25zLCB3aGljaCBoYXMgc3BlZWQKKyAgYmVuZWZpdHMuICBIb3dldmVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggZGljdCBlbnRyaWVzIGFwcGVhciBpbiBkaWN0LmtleXMoKSwKKyAgZGljdC52YWx1ZXMoKSBhbmQgZGljdC5pdGVtcygpIG1heSBkaWZmZXIgZnJvbSBwcmV2aW91cyByZWxlYXNlcyBmb3IgYQorICBnaXZlbiBkaWN0LiAgTm90aGluZyBpcyBkZWZpbmVkIGFib3V0IHRoaXMgb3JkZXIsIHNvIG5vIHByb2dyYW0gc2hvdWxkCisgIHJlbHkgb24gaXQuICBOZXZlcnRoZWxlc3MsIGl0J3MgZWFzeSB0byB3cml0ZSB0ZXN0IGNhc2VzIHRoYXQgcmVseSBvbiB0aGUKKyAgb3JkZXIgYnkgYWNjaWRlbnQsIHR5cGljYWxseSBiZWNhdXNlIG9mIHByaW50aW5nIHRoZSBzdHIoKSBvciByZXByKCkgb2YgYQorICBkaWN0IHRvIGFuICJleHBlY3RlZCByZXN1bHRzIiBmaWxlLiAgU2VlIExpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weSdzIG5ldworICBzb3J0ZGljdChkaWN0KSBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgd2F5IHRvIGRpc3BsYXkgYSBkaWN0IGluIHNvcnRlZAorICBvcmRlci4KKworLSBNYW55IG90aGVyIHNtYWxsIGNoYW5nZXMgdG8gZGljdHMgd2VyZSBtYWRlLCByZXN1bHRpbmcgaW4gZmFzdGVyCisgIG9wZXJhdGlvbiBhbG9uZyB0aGUgbW9zdCBjb21tb24gY29kZSBwYXRocy4KKworLSBEaWN0aW9uYXJ5IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlICJpbiIgb3BlcmF0b3I6ICJ4IGluIGRpY3QiIG1lYW5zCisgIHRoZSBzYW1lIGFzIGRpY3QuaGFzX2tleSh4KS4KKworLSBUaGUgdXBkYXRlKCkgbWV0aG9kIG9mIGRpY3Rpb25hcmllcyBub3cgYWNjZXB0cyBnZW5lcmljIG1hcHBpbmcKKyAgb2JqZWN0cy4gIFNwZWNpZmljYWxseSB0aGUgYXJndW1lbnQgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgLmtleXMoKQorICBhbmQgX19nZXRpdGVtX18oKSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgeW91IHRvIHNheSwgZm9yIGV4YW1wbGUsCisgIHt9LnVwZGF0ZShVc2VyRGljdCgpKQorCistIEl0ZXJhdG9ycyB3ZXJlIGFkZGVkOyB0aGlzIGlzIGEgZ2VuZXJhbGl6ZWQgd2F5IG9mIHByb3ZpZGluZyB2YWx1ZXMKKyAgdG8gYSBmb3IgbG9vcC4gIFNlZSBQRVAgMjM0LiAgVGhlcmUncyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiBpdGVyKCkKKyAgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgdGhlIG5leHQgdmFsdWUKKyAgZnJvbSBhbiBpdGVyYXRvciB1c2luZyB0aGUgbmV4dCgpIG1ldGhvZCAoaW4gUHl0aG9uKSBvciB0aGUKKyAgdHBfaXRlcm5leHQgc2xvdCAoaW4gQykuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCBpdGVyYXRvcnMKKyAgdXNpbmcgdGhlIF9faXRlcl9fKCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZSB0cF9pdGVyIHNsb3QgKGluIEMpLgorICBJdGVyYXRpbmcgKGkuZS4gYSBmb3IgbG9vcCkgb3ZlciBhIGRpY3Rpb25hcnkgZ2VuZXJhdGVzIGl0cyBrZXlzLgorICBJdGVyYXRpbmcgb3ZlciBhIGZpbGUgZ2VuZXJhdGVzIGl0cyBsaW5lcy4KKworLSBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3ZXJlIGdlbmVyYWxpemVkIHRvIHdvcmsgbmljZWx5IHdpdGggaXRlcmF0b3IKKyAgYXJndW1lbnRzOjoKKworICAgIG1hcCgpLCBmaWx0ZXIoKSwgcmVkdWNlKCksIHppcCgpCisgICAgbGlzdCgpLCB0dXBsZSgpIChQeVNlcXVlbmNlX1R1cGxlKCkgYW5kIFB5U2VxdWVuY2VfRmFzdCgpIGluIEMgQVBJKQorICAgIG1heCgpLCBtaW4oKQorICAgIGpvaW4oKSBtZXRob2Qgb2Ygc3RyaW5ncworICAgIGV4dGVuZCgpIG1ldGhvZCBvZiBsaXN0cworICAgICd4IGluIHknIGFuZCAneCBub3QgaW4geScgKFB5U2VxdWVuY2VfQ29udGFpbnMoKSBpbiBDIEFQSSkKKyAgICBvcGVyYXRvci5jb3VudE9mKCkgKFB5U2VxdWVuY2VfQ291bnQoKSBpbiBDIEFQSSkKKyAgICByaWdodC1oYW5kIHNpZGUgb2YgYXNzaWdubWVudCBzdGF0ZW1lbnRzIHdpdGggbXVsdGlwbGUgdGFyZ2V0cywgc3VjaCBhcyA6OgorICAgICAgICB4LCB5LCB6ID0gc29tZV9pdGVyYWJsZV9vYmplY3RfcmV0dXJuaW5nX2V4YWN0bHlfM192YWx1ZXMKKworLSBBY2Nlc3NpbmcgbW9kdWxlIGF0dHJpYnV0ZXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgKGZvciBleGFtcGxlLAorICByYW5kb20ucmFuZG9tIG9yIG9zLnBhdGggb3IgeW91clB5dGhvbk1vZHVsZS55b3VyQXR0cmlidXRlKS4KKworLSBDb21wYXJpbmcgZGljdGlvbmFyeSBvYmplY3RzIHZpYSA9PSBhbmQgIT0gaXMgZmFzdGVyLCBhbmQgbm93IHdvcmtzIGV2ZW4KKyAgaWYgdGhlIGtleXMgYW5kIHZhbHVlcyBkb24ndCBzdXBwb3J0IGNvbXBhcmlzb25zIG90aGVyIHRoYW4gPT0uCisKKy0gQ29tcGFyaW5nIGRpY3Rpb25hcmllcyBpbiB3YXlzIG90aGVyIHRoYW4gPT0gYW5kICE9IGlzIHNsb3dlcjogIHRoZXJlIHdlcmUKKyAgaW5zZWN1cml0aWVzIGluIHRoZSBkaWN0IGNvbXBhcmlzb24gaW1wbGVtZW50YXRpb24gdGhhdCBjb3VsZCBjYXVzZSBQeXRob24KKyAgdG8gY3Jhc2ggaWYgdGhlIGVsZW1lbnQgY29tcGFyaXNvbiByb3V0aW5lcyBmb3IgdGhlIGRpY3Qga2V5cyBhbmQvb3IKKyAgdmFsdWVzIG11dGF0ZWQgdGhlIGRpY3RzLiAgTWFraW5nIHRoZSBjb2RlIGJ1bGxldHByb29mIHNsb3dlZCBpdCBkb3duLgorCistIENvbGxpc2lvbnMgaW4gZGljdHMgYXJlIHJlc29sdmVkIHZpYSBhIG5ldyBhcHByb2FjaCwgd2hpY2ggY2FuIGhlbHAKKyAgZHJhbWF0aWNhbGx5IGluIGJhZCBjYXNlcy4gIEZvciBleGFtcGxlLCBsb29raW5nIHVwIGV2ZXJ5IGtleSBpbiBhIGRpY3QKKyAgZCB3aXRoIGQua2V5cygpID09IFtpIDw8IDE2IGZvciBpIGluIHJhbmdlKDIwMDAwKV0gaXMgYXBwcm94aW1hdGVseSA1MDB4CisgIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKKyAgdGhlIG5hdHVyZSBvZiBhbiBlZmZlY3RpdmUgY3VyZSAobGFzdCBEZWNlbWJlciEgYmV0dGVyIGxhdGUgdGhhbiBuZXZlcikuCisKKy0gcmVwcigpIGlzIG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzIChkaWN0LCBsaXN0LCB0dXBsZSkuCisKKworTGlicmFyeQorLS0tLS0tLQorCistIFRoZSBjb25zdGFudHMgYXNjaWlfbGV0dGVycywgYXNjaWlfbG93ZXJjYXNlLiBhbmQgYXNjaWlfdXBwZXJjYXNlCisgIHdlcmUgYWRkZWQgdG8gdGhlIHN0cmluZyBtb2R1bGUuICBUaGVzZSBhIGxvY2FsZS1pbmRlcGVuZGVudAorICBjb25zdGFudHMsIHVubGlrZSBsZXR0ZXJzLCBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2UuICBUaGVzZSBhcmUgbm93CisgIHVzZSBpbiBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCisKKy0gVGhlIGZsYWdzIHVzZWQgaW4gZGxvcGVuIGNhbGxzIGNhbiBub3cgYmUgY29uZmlndXJlZCB1c2luZworICBzeXMuc2V0ZGxvcGVuZmxhZ3MgYW5kIHF1ZXJpZWQgdXNpbmcgc3lzLmdldGRsb3BlbmZsYWdzLgorCistIEZyZWRyaWsgTHVuZGgncyB4bWxycGNsaWIgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuICBUaGlzCisgIHByb3ZpZGVzIGZ1bGwgY2xpZW50LXNpZGUgWE1MLVJQQyBzdXBwb3J0LiAgSW4gYWRkaXRpb24sCisgIERlbW8veG1scnBjLyBjb250YWlucyB0d28gc2VydmVyIGZyYW1ld29ya3MgKG9uZSBTb2NrZXRTZXJ2ZXItYmFzZWQsCisgIG9uZSBhc3luY29yZS1iYXNlZCkuICBUaGFua3MgdG8gRXJpYyBSYXltb25kIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KKworLSBUaGUgeHJhbmdlKCkgb2JqZWN0IGlzIHNpbXBsaWZpZWQ6IGl0IG5vIGxvbmdlciBzdXBwb3J0cyBzbGljaW5nLAorICByZXBldGl0aW9uLCBjb21wYXJpc29ucywgZWZmaWNpZW50ICdpbicgY2hlY2tpbmcsIHRoZSB0b2xpc3QoKQorICBtZXRob2QsIG9yIHRoZSBzdGFydCwgc3RvcCBhbmQgc3RlcCBhdHRyaWJ1dGVzLiAgU2VlIFBFUCAyNjAuCisKKy0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgorCistIGNhbGVuZGFyLnB5IHVzZXMgbW9udGggYW5kIGRheSBuYW1lcyBiYXNlZCBvbiB0aGUgY3VycmVudCBsb2NhbGUuCisKKy0gc3Ryb3AgaXMgbm93ICpyZWFsbHkqIG9ic29sZXRlICh0aGlzIHdhcyBhbm5vdW5jZWQgYmVmb3JlIHdpdGggMS42KSwKKyAgYW5kIGlzc3VlcyBEZXByZWNhdGlvbldhcm5pbmcgd2hlbiB1c2VkIChleGNlcHQgZm9yIHRoZSBmb3VyIGl0ZW1zCisgIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KKworLSBDb29raWUucHkgbm93IHNvcnRzIGtleSt2YWx1ZSBwYWlycyBieSBrZXkgaW4gb3V0cHV0IHN0cmluZ3MuCisKKy0gcHByaW50LmlzcmVjdXJzaXZlKG9iamVjdCkgZGlkbid0IGNvcnJlY3RseSBpZGVudGlmeSByZWN1cnNpdmUgb2JqZWN0cy4KKyAgTm93IGl0IGRvZXMuCisKKy0gcHByaW50IGZ1bmN0aW9ucyBub3cgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKHR1cGxlLCBsaXN0LCBkaWN0KS4KKworLSBOZXcgJ3EnIGFuZCAnUScgZm9ybWF0IGNvZGVzIGluIHRoZSBzdHJ1Y3QgbW9kdWxlLCBjb3JyZXNwb25kaW5nIHRvIEMKKyAgdHlwZXMgImxvbmcgbG9uZyIgYW5kICJ1bnNpZ25lZCBsb25nIGxvbmciIChvbiBXaW5kb3dzLCBfX2ludDY0KS4gIEluCisgIG5hdGl2ZSBtb2RlLCB0aGVzZSBjYW4gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIEMgY29tcGlsZXIgc3VwcG9ydHMKKyAgdGhlc2UgdHlwZXMgKHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgI2RlZmluZSdkIGJ5IHRoZSBQeXRob24gY29uZmlnCisgIHByb2Nlc3MpLCBhbmQgdGhlbiB0aGV5IGluaGVyaXQgdGhlIHNpemVzIGFuZCBhbGlnbm1lbnRzIG9mIHRoZSBDIHR5cGVzLgorICBJbiBzdGFuZGFyZCBtb2RlLCAncScgYW5kICdRJyBhcmUgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBhcmUKKyAgOC1ieXRlIGludGVncmFsIHR5cGVzLgorCistIFRoZSBzaXRlIG1vZHVsZSBpbnN0YWxscyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiAnaGVscCcgdGhhdCBpbnZva2VzCisgIHB5ZG9jLmhlbHAuICBJdCBtdXN0IGJlIGludm9rZWQgYXMgJ2hlbHAoKSc7IHdoZW4gaW52b2tlZCBhcyAnaGVscCcsCisgIGl0IGRpc3BsYXlzIGEgbWVzc2FnZSByZW1pbmRpbmcgdGhlIHVzZXIgdG8gdXNlICdoZWxwKCknIG9yCisgICdoZWxwKG9iamVjdCknLgorCitUZXN0cworLS0tLS0KKworLSBOZXcgdGVzdF9tdXRhbnRzLnB5IHJ1bnMgZGljdCBjb21wYXJpc29ucyB3aGVyZSB0aGUga2V5IGFuZCB2YWx1ZQorICBjb21wYXJpc29uIG9wZXJhdG9ycyBtdXRhdGUgdGhlIGRpY3RzIHJhbmRvbWx5IGR1cmluZyBjb21wYXJpc29uLiAgVGhpcworICByYXBpZGx5IGNhdXNlcyBQeXRob24gdG8gY3Jhc2ggdW5kZXIgZWFybGllciByZWxlYXNlcyAobm90IGZvciB0aGUgZmFpbnQKKyAgb2YgaGVhcnQ6ICBpdCBjYW4gYWxzbyBjYXVzZSBXaW45eCB0byBmcmVlemUgb3IgcmVib290ISkuCisKKy0gTmV3IHRlc3RfcHByaW50LnB5IHZlcmlmaWVzIHRoYXQgcHByaW50LmlzcmVjdXJzaXZlKCkgYW5kCisgIHBwcmludC5pc3JlYWRhYmxlKCkgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMuICBBbHNvIHZlcmlmaWVzIHRoYXQgc2ltcGxlCisgIGNhc2VzIHByb2R1Y2UgY29ycmVjdCBvdXRwdXQuCisKK0MgQVBJCistLS0tLQorCistIFJlbW92ZWQgdGhlIHVudXNlZCBsYXN0X2lzX3N0aWNreSBhcmd1bWVudCBmcm9tIHRoZSBpbnRlcm5hbAorICBfUHlUdXBsZV9SZXNpemUoKS4gIElmIHRoaXMgYWZmZWN0cyB5b3UsIHlvdSB3ZXJlIGNoZWF0aW5nLgorCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgKGZpbmFsKT8KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRS52YWxncmluZCBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCmluZGV4IDE1N2JkYzMuLmI1YTlhMzIgMTAwNjQ0Ci0tLSBhL01pc2MvUkVBRE1FLnZhbGdyaW5kCisrKyBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCkBAIC0yNCw2ICsyNCwxMiBAQAogdGhlIG1lbW9yeSB1c2FnZSBkb3duIHRvIGFsbG93IHRoZSB0ZXN0cyB0byBjb21wbGV0ZS4gIEl0IHNlZW1zIHRvIHRha2UKIGFib3V0IDUgdGltZXMgbG9uZ2VyIHRvIHJ1biAtLXdpdGhvdXQtcHltYWxsb2MuCiAKK0FwciAxNSwgMjAwNjoKKyAgdGVzdF9jdHlwZXMgY2F1c2VzIFZhbGdyaW5kIDMuMS4xIHRvIGZhaWwgKGNyYXNoKS4KKyAgdGVzdF9zb2NrZXRfc3NsIHNob3VsZCBiZSBza2lwcGVkIHdoZW4gcnVubmluZyB2YWxncmluZC4KKwlUaGUgcmVhc29uIGlzIHRoYXQgaXQgcHVycG9zZWx5IHVzZXMgdW5pbml0aWFsaXplZCBtZW1vcnkuCisJVGhpcyBjYXVzZXMgbWFueSBzcHVyaW91cyB3YXJuaW5ncywgc28gaXQncyBlYXNpZXIgdG8ganVzdCBza2lwIGl0LgorCiAKIERldGFpbHM6CiAtLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTWlzYy9SUE0vcHl0aG9uLTIuNC5zcGVjIGIvTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIE1pc2MvUlBNL3B5dGhvbi0yLjQuc3BlYwpyZW5hbWUgdG8gTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjCmluZGV4IGJkNGM3ZjcuLjM1MTU4NTYgMTAwNjQ0Ci0tLSBhL01pc2MvUlBNL3B5dGhvbi0yLjQuc3BlYworKysgYi9NaXNjL1JQTS9weXRob24tMi41LnNwZWMKQEAgLTYsNyArNiw3IEBACiAjICAicHl0aG9uMiI/CiAjV0FSTklORzogQ29tbWVudGluZyBvdXQgZG9lc24ndCB3b3JrLiAgTGFzdCBsaW5lIGlzIHdoYXQncyB1c2VkLgogJWRlZmluZSBjb25maWdfYmluc3VmZml4IG5vbmUKLSVkZWZpbmUgY29uZmlnX2JpbnN1ZmZpeCAyLjQKKyVkZWZpbmUgY29uZmlnX2JpbnN1ZmZpeCAyLjUKIAogIyAgQnVpbGQgdGtpbnRlcj8gICJhdXRvIiBlbmFibGVzIGl0IGlmIC91c3IvYmluL3dpc2ggZXhpc3RzLgogI1dBUk5JTkc6IENvbW1lbnRpbmcgb3V0IGRvZXNuJ3Qgd29yay4gIExhc3QgbGluZSBpcyB3aGF0J3MgdXNlZC4KQEAgLTMzLDkgKzMzLDkgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAlZGVmaW5lIG5hbWUgcHl0aG9uCi0lZGVmaW5lIHZlcnNpb24gMi40Ci0lZGVmaW5lIGxpYnZlcnMgMi40Ci0lZGVmaW5lIHJlbGVhc2UgMnB5ZG90b3JnCislZGVmaW5lIHZlcnNpb24gMi41YTEKKyVkZWZpbmUgbGlidmVycyAyLjUKKyVkZWZpbmUgcmVsZWFzZSAxcHlkb3RvcmcKICVkZWZpbmUgX19wcmVmaXggL3VzcgogCiAjICBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCBycG0gPHBlcmNlbnQ+ZGVmaW5lIHdlaXJkbmVzcwpAQCAtNjIsNiArNjIsNyBAQAogQnVpbGRQcmVyZXE6IGV4cGF0LWRldmVsCiBCdWlsZFByZXJlcTogZGI0LWRldmVsCiBCdWlsZFByZXJlcTogZ2RibS1kZXZlbAorQnVpbGRQcmVyZXE6IHNxbGl0ZS1kZXZlbAogUHJlZml4OiAle19fcHJlZml4fQogUGFja2FnZXI6IFNlYW4gUmVpZnNjaG5laWRlciA8amFmby1ycG1zQHR1bW15LmNvbT4KIApAQCAtMzU0LDYgKzM1NSw4IEBACiAle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vdGVzdAogJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L3htbAogJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L2VtYWlsCisle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vZW1haWwvbWltZQorJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L3NxbGl0ZTMKICV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9jb21waWxlcgogJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L2JzZGRiCiAle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vaG90c2hvdApkaWZmIC0tZ2l0IGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dCBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKaW5kZXggYWU5YWI0Yy4uZTBiMzMxNSAxMDA2NDQKLS0tIGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAorKysgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CkBAIC0xLDggKzEsOCBAQAogVGhpcyBmaWxlIGRlc2NyaWJlcyBzb21lIHNwZWNpYWwgUHl0aG9uIGJ1aWxkIHR5cGVzIGVuYWJsZWQgdmlhCiBjb21waWxlLXRpbWUgcHJlcHJvY2Vzc29yIGRlZmluZXMuCiAKLUl0IGlzIGJlc3QgdG8gZGVmaW5lIHRoZXNlIG9wdGlvbnMgaW4gdGhlIEVYVFJBX0NGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZTsKLWBgRVhUUkFfQ0ZMQUdTPSItRFB5X1JFRl9ERUJVRyIgLi9jb25maWd1cmVgYC4KK0l0IGlzIGJlc3QgdG8gZGVmaW5lIHRoZXNlIG9wdGlvbnMgaW4gdGhlIEVYVFJBX0NGTEFHUyBtYWtlIHZhcmlhYmxlOworYGBtYWtlIEVYVFJBX0NGTEFHUz0iLURQeV9SRUZfREVCVUciYGAuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUHlfUkVGX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvZHVjZWQgaW4gMS40CmRpZmYgLS1naXQgYS9NaXNjL2J1aWxkLnNoIGIvTWlzYy9idWlsZC5zaAppbmRleCAzYzY2OWEwLi5kZTUxNTM5IDEwMDc1NQotLS0gYS9NaXNjL2J1aWxkLnNoCisrKyBiL01pc2MvYnVpbGQuc2gKQEAgLTU1LDEzICs1NSwyMSBAQAogUlNZTkNfT1BUUz0iLWFDIC1lIHNzaCIKIAogUkVGTE9HPSJidWlsZC9yZWZsb2cudHh0Lm91dCIKLSMgVGhlc2UgdGVzdHMgYXJlIG5vdCBzdGFibGUgYW5kIHNvbWV0aW1lcyByZXBvcnQgbGVha3M7IGhvd2V2ZXIsCi0jIHRlc3RfZ2VuZXJhdG9ycyByZWFsbHkgbGVha3MuICBTaW5jZSB0ZXN0X2dlbmVyYXRvcnMgcHJvYmFibHkgd29uJ3QKLSMgYmUgZml4ZWQgcmVhbCBzb29uLCBkaXNhYmxlIHdhcm5pbmcgYWJvdXQgaXQgZm9yIG5vdy4KKyMgVGhlc2UgdGVzdHMgYXJlIG5vdCBzdGFibGUgYW5kIGZhbHNlbHkgcmVwb3J0IGxlYWtzIHNvbWV0aW1lcy4KICMgVGhlIGVudGlyZSBsZWFrIHJlcG9ydCB3aWxsIGJlIG1haWxlZCBpZiBhbnkgdGVzdCBub3QgaW4gdGhpcyBsaXN0IGxlYWtzLgotTEVBS1lfVEVTVFM9InRlc3RfKGNhcGl8Y2ZncGFyc2VyfGNoYXJtYXBjb2RlY3xjbWRfbGluZXxjb21waWxlcnxmaWxlY21wfGdlbmVyYXRvcnN8cXVvcHJpfHNvY2tldHx0aHJlYWRlZF9pbXBvcnR8dGhyZWFkZWR0ZW1wZmlsZXx0aHJlYWRpbmd8dGhyZWFkaW5nX2xvY2FsfHVybGxpYjIpIgorIyBOb3RlOiB0ZXN0X1hYWCAobm9uZSBjdXJyZW50bHkpIHJlYWxseSBsZWFrLCBidXQgYXJlIGRpc2FibGVkCisjIHNvIHdlIGRvbid0IHNlbmQgc3BhbS4gIEFueSB0ZXN0IHdoaWNoIHJlYWxseSBsZWFrcyBzaG91bGQgb25seSAKKyMgYmUgbGlzdGVkIGhlcmUgaWYgdGhlcmUgYXJlIGFsc28gdGVzdCBjYXNlcyB1bmRlciBMaWIvdGVzdC9sZWFrZXJzLgorTEVBS1lfVEVTVFM9InRlc3RfKGN0eXBlc3xmaWxlY21wfHNvY2tldHx0aHJlYWRlZHRlbXBmaWxlfHRocmVhZGluZ3x1cmxsaWIyKSIKIAotIyBDaGFuZ2UgdGhpcyBmbGFnIHRvICJ5ZXMiIGZvciBvbGQgcmVsZWFzZXMgdG8ganVzdCB1cGRhdGUvYnVpbGQgdGhlIGRvY3MuCisjIFNraXAgdGhlc2UgdGVzdHMgYWx0b2dldGhlciB3aGVuIGxvb2tpbmcgZm9yIGxlYWtzLiAgVGhlc2UgdGVzdHMKKyMgZG8gbm90IG5lZWQgdG8gYmUgc3RvcmVkIGFib3ZlIGluIExFQUtZX1RFU1RTIHRvby4KKyMgdGVzdF9jb21waWxlciBhbG1vc3QgbmV2ZXIgZmluaXNoZXMgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgcmVmcworIyBzaW5jZSBpdCBkZXBlbmRzIG9uIG90aGVyIG1vZHVsZXMsIHNraXAgaXQuCisjIHRlc3RfbG9nZ2luZyBjYXVzZXMgaGFuZ3MsIHNraXAgaXQuCitMRUFLWV9TS0lQUz0iLXggdGVzdF9jb21waWxlciB0ZXN0X2xvZ2dpbmciCisKKyMgQ2hhbmdlIHRoaXMgZmxhZyB0byAieWVzIiBmb3Igb2xkIHJlbGVhc2VzIHRvIG9ubHkgdXBkYXRlL2J1aWxkIHRoZSBkb2NzLgogQlVJTERfRElTQUJMRUQ9Im5vIgogCiAjIyB1dGlsaXR5IGZ1bmN0aW9ucwpAQCAtMTU5LDcgKzE2Nyw5IEBACiAgICAgICAgICAgICAjIyBydW4gdGhlIHRlc3RzIGxvb2tpbmcgZm9yIGxlYWtzCiAgICAgICAgICAgICBGPW1ha2UtdGVzdC1yZWZsZWFrLm91dAogICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICAgICAgICAgIC4vcHl0aG9uIC4vTGliL3Rlc3QvcmVncnRlc3QucHkgLVIgNDozOiRSRUZMT0cgLXUgbmV0d29yayA+JiBidWlsZC8kRgorICAgICAgICAgICAgIyMgZW5zdXJlIHRoYXQgdGhlIHJlZmxvZyBleGlzdHMgc28gdGhlIGdyZXAgZG9lc24ndCBmYWlsCisgICAgICAgICAgICB0b3VjaCAkUkVGTE9HCisgICAgICAgICAgICAuL3B5dGhvbiAuL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IC1SIDQ6MzokUkVGTE9HIC11IG5ldHdvcmsgJExFQUtZX1NLSVBTID4mIGJ1aWxkLyRGCiAgICAgICAgICAgICBOVU1fRkFJTFVSRVM9YGVncmVwIC12YyAiJExFQUtZX1RFU1RTIiAkUkVGTE9HYAogICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyByZWZsZWFrcyAoJE5VTV9GQUlMVVJFUyBmYWlsdXJlcykiICIkRiIgJHN0YXJ0CiAgICAgICAgICAgICBtYWlsX29uX2ZhaWx1cmUgInJlZmxlYWsiICRSRUZMT0cKZGlmZiAtLWdpdCBhL01pc2MvY2hlYXRzaGVldCBiL01pc2MvY2hlYXRzaGVldAppbmRleCBiOGRlNDI4MS4uMDI0NTQ1ZCAxMDA2NDQKLS0tIGEvTWlzYy9jaGVhdHNoZWV0CisrKyBiL01pc2MvY2hlYXRzaGVldApAQCAtMTk0Niw4ICsxOTQ2LDYgQEAKIHJhbmQgICAgICAgICAgICAgRG9uJ3QgdXNlIHVubGVzcyB5b3Ugd2FudCBjb21wYXRpYmlsaXR5IHdpdGggQydzIHJhbmQoKS4KIHJhbmRvbSAgICAgICAgICAgUmFuZG9tIHZhcmlhYmxlIGdlbmVyYXRvcnMKIHJlICAgICAgICAgICAgICAgUmVndWxhciBFeHByZXNzaW9ucy4KLXJlY29udmVydCAgICAgICAgQ29udmVydCBvbGQgKCJyZWdleCIpIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gbmV3IHN5bnRheAotICAgICAgICAgICAgICAgICAoInJlIikuCiByZXByICAgICAgICAgICAgIFJlZG8gcmVwcigpIGJ1dCB3aXRoIGxpbWl0cyBvbiBtb3N0IHNpemVzLgogcmV4ZWMgICAgICAgICAgICBSZXN0cmljdGVkIGV4ZWN1dGlvbiBmYWNpbGl0aWVzICgic2FmZSIgZXhlYywgZXZhbCwgZXRjKS4KIHJmYzgyMiAgICAgICAgICAgUkZDLTgyMiBtZXNzYWdlIG1hbmlwdWxhdGlvbiBjbGFzcy4KQEAgLTIwMjUsNyArMjAyMyw2IEBACiAgICAgICAgICAgICBhcnJheSAgICAgICAgICAgICAgIE9iaiBlZmZpY2llbnRseSByZXByZXNlbnRpbmcgYXJyYXlzIG9mIGJhc2ljIHZhbHVlcwogICAgICAgICAgICAgbWF0aCAgICAgICAgICAgICAgICBNYXRoIGZ1bmN0aW9ucyBvZiBDIHN0YW5kYXJkCiAgICAgICAgICAgICB0aW1lICAgICAgICAgICAgICAgIFRpbWUtcmVsYXRlZCBmdW5jdGlvbnMgKGFsc28gdGhlIG5ld2VyIGRhdGV0aW1lIG1vZHVsZSkKLSAgICAgICAgICAgIHJlZ2V4ICAgICAgICAgICAgICAgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG9wZXJhdGlvbnMKICAgICAgICAgICAgIG1hcnNoYWwgICAgICAgICAgICAgUmVhZCBhbmQgd3JpdGUgc29tZSBweXRob24gdmFsdWVzIGluIGJpbmFyeSBmb3JtYXQKICAgICAgICAgICAgIHN0cnVjdCAgICAgICAgICAgICAgQ29udmVydCBiZXR3ZWVuIHB5dGhvbiB2YWx1ZXMgYW5kIEMgc3RydWN0cwogCmRpZmYgLS1naXQgYS9NaXNjL2RldmVsb3BlcnMudHh0IGIvTWlzYy9kZXZlbG9wZXJzLnR4dAppbmRleCBjM2RjMzA2Li5mZjg0NzBlIDEwMDY0NAotLS0gYS9NaXNjL2RldmVsb3BlcnMudHh0CisrKyBiL01pc2MvZGV2ZWxvcGVycy50eHQKQEAgLTE3LDYgKzE3LDEyIEBACiBQZXJtaXNzaW9ucyBIaXN0b3J5CiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy0gR2VvcmdlIFlvc2hpZGEgKFNGIG5hbWUgInF1aXZlciIpIGFkZGVkIHRvIHRoZSBTb3VyY2VGb3JnZSBQeXRob24KKyAgcHJvamVjdCAxNCBBcHIgMjAwNiwgYnkgVGltIFBldGVycywgYXMgYSB0cmFja2VyIGFkbWluLiAgU2VlCisgIGNvbnRlbXBvcmFuZW91cyBweXRob24tY2hlY2tpbnMgdGhyZWFkIHdpdGggdGhlIHVubGlrZWx5IFN1YmplY3Q6CisKKyAgICAgIHI0NTMyOSAtIHB5dGhvbi90cnVuay9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKKwogLSBSb25hbGQgT3Vzc29yZW4gd2FzIGdpdmVuIFNWTiBhY2Nlc3Mgb24gMyBNYXIgMjAwNiBieSBOQ04sIGZvciBNYWMKICAgcmVsYXRlZCB3b3JrLgogCmRpZmYgLS1naXQgYS9NaXNjL3B5dGhvbi1jb25maWcuaW4gYi9NaXNjL3B5dGhvbi1jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL01pc2MvcHl0aG9uLWNvbmZpZy5pbgpAQCAtMCwwICsxLDUwIEBACisjIUBCSU5ESVJAL3B5dGhvbgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBnZXRvcHQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKwordmFsaWRfb3B0cyA9IFsncHJlZml4JywgJ2V4ZWMtcHJlZml4JywgJ2luY2x1ZGVzJywgJ2xpYnMnLCAnY2ZsYWdzJywgCisgICAgICAgICAgICAgICdsZGZsYWdzJywgJ2hlbHAnXQorCitkZWYgZXhpdF93aXRoX3VzYWdlKGNvZGU9MSk6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVXNhZ2U6ICVzIFslc10iICUgKHN5cy5hcmd2WzBdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnLmpvaW4oJy0tJytvcHQgZm9yIG9wdCBpbiB2YWxpZF9vcHRzKSkKKyAgICBzeXMuZXhpdChjb2RlKQorCit0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnJywgdmFsaWRfb3B0cykKK2V4Y2VwdCBnZXRvcHQuZXJyb3I6CisgICAgZXhpdF93aXRoX3VzYWdlKCkKKworaWYgbm90IG9wdHM6CisgICAgZXhpdF93aXRoX3VzYWdlKCkKKworb3B0ID0gb3B0c1swXVswXQorCitweXZlciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignVkVSU0lPTicpCitnZXR2YXIgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIKKworaWYgb3B0ID09ICctLWhlbHAnOgorICAgIGV4aXRfd2l0aF91c2FnZSgwKQorCitlbGlmIG9wdCA9PSAnLS1wcmVmaXgnOgorICAgIHByaW50IHN5c2NvbmZpZy5QUkVGSVgKKworZWxpZiBvcHQgPT0gJy0tZXhlYy1wcmVmaXgnOgorICAgIHByaW50IHN5c2NvbmZpZy5FWEVDX1BSRUZJWAorCitlbGlmIG9wdCBpbiAoJy0taW5jbHVkZXMnLCAnLS1jZmxhZ3MnKToKKyAgICBmbGFncyA9IFsnLUknK2RpciBmb3IgZGlyIGluIGdldHZhcignSU5DTERJUlNUT01BS0UnKS5zcGxpdCgpXQorICAgIGlmIG9wdCA9PSAnLS1jZmxhZ3MnOgorICAgICAgICBmbGFncy5leHRlbmQoZ2V0dmFyKCdDRkxBR1MnKS5zcGxpdCgpKQorICAgIHByaW50ICcgJy5qb2luKGZsYWdzKQorCitlbGlmIG9wdCBpbiAoJy0tbGlicycsICctLWxkZmxhZ3MnKToKKyAgICBsaWJzID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMSUJTJykuc3BsaXQoKQorICAgIGxpYnMuYXBwZW5kKCctbHB5dGhvbicrcHl2ZXIpCisgICAgaWYgb3B0ID09ICctLWxkZmxhZ3MnOgorICAgICAgICBsaWJzLmluc2VydCgwLCAnLUwnICsgZ2V0dmFyKCdMSUJQTCcpKQorICAgIHByaW50ICcgJy5qb2luKGxpYnMpCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvU2V0dXAuZGlzdCBiL01vZHVsZXMvU2V0dXAuZGlzdAppbmRleCAzYTUxMmI1Li40OWM4NDI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL1NldHVwLmRpc3QKKysrIGIvTW9kdWxlcy9TZXR1cC5kaXN0CkBAIC0yMzYsOSArMjM2LDkgQEAKIAogIyBUaGUgbWQ1IG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUKICMgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLCBkZXNjcmliZWQgaW4gUkZDIDEzMjEuICBUaGUgbmVjZXNzYXJ5IGZpbGVzCi0jIG1kNWMuYyBhbmQgbWQ1LmggYXJlIGluY2x1ZGVkIGhlcmUuCisjIG1kNS5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KIAotI21kNSBtZDVtb2R1bGUuYyBtZDVjLmMKKyNtZDUgbWQ1bW9kdWxlLmMgbWQ1LmMKIAogCiAjIFRoZSBzaGEgbW9kdWxlIGltcGxlbWVudHMgdGhlIFNIQSBjaGVja3N1bSBhbGdvcml0aG0uCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ic2RkYi5jIGIvTW9kdWxlcy9fYnNkZGIuYwppbmRleCA4ZTllYzBmLi4xNjQxZTIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ic2RkYi5jCisrKyBiL01vZHVsZXMvX2JzZGRiLmMKQEAgLTEwMSw2ICsxMDEsMTAgQEAKIHN0YXRpYyBjaGFyICpyY3NfaWQgPSAiJElkJCI7CiAKIAorI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisjZGVmaW5lIFB5X3NzaXplX3QgICAgICBpbnQKKyNlbmRpZgorCiAjaWZkZWYgV0lUSF9USFJFQUQKIAogLyogVGhlc2UgYXJlIGZvciB3aGVuIGNhbGxpbmcgUHl0aG9uIC0tPiBDICovCkBAIC00Njg4LDcgKzQ2OTIsMTEgQEAKIAogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBEQl9tYXBwaW5nID0geworI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisgICAgICAgIChpbnF1aXJ5KURCX2xlbmd0aCwgICAgICAgICAgLyptcF9sZW5ndGgqLworI2Vsc2UKICAgICAgICAgKGxlbmZ1bmMpREJfbGVuZ3RoLCAgICAgICAgICAvKm1wX2xlbmd0aCovCisjZW5kaWYKICAgICAgICAgKGJpbmFyeWZ1bmMpREJfc3Vic2NyaXB0LCAgICAvKm1wX3N1YnNjcmlwdCovCiAgICAgICAgIChvYmpvYmphcmdwcm9jKURCX2Fzc19zdWIsICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CkBAIC01Mzg1LDkgKzUzOTMsMjEgQEAKICAgICBBRERfSU5UKGQsIERCX1NFVF9UWE5fVElNRU9VVCk7CiAjZW5kaWYKIAorICAgIC8qIFRoZSBleGNlcHRpb24gbmFtZSBtdXN0IGJlIGNvcnJlY3QgZm9yIHBpY2tsZWQgZXhjZXB0aW9uICoKKyAgICAgKiBvYmplY3RzIHRvIHVucGlja2xlIHByb3Blcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFBZQlNEREJfU1RBTkRBTE9ORSAgLyogZGlmZmVyZW50IHZhbHVlIG5lZWRlZCBmb3Igc3RhbmRhbG9uZSBweWJzZGRiICovCisjZGVmaW5lIFBZQlNEREJfRVhDRVBUSU9OX0JBU0UgICJic2RkYjMuZGIuIgorI2Vsc2UKKyNkZWZpbmUgUFlCU0REQl9FWENFUFRJT05fQkFTRSAgImJzZGRiLmRiLiIKKyNlbmRpZgorCisgICAgLyogQWxsIHRoZSByZXN0IG9mIHRoZSBleGNlcHRpb25zIGRlcml2ZSBvbmx5IGZyb20gREJFcnJvciAqLworI2RlZmluZSBNQUtFX0VYKG5hbWUpICAgbmFtZSA9IFB5RXJyX05ld0V4Y2VwdGlvbihQWUJTRERCX0VYQ0VQVElPTl9CQVNFICNuYW1lLCBEQkVycm9yLCBOVUxMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgI25hbWUsIG5hbWUpCisKICAgICAvKiBUaGUgYmFzZSBleGNlcHRpb24gY2xhc3MgaXMgREJFcnJvciAqLwotICAgIERCRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLl9kYi5EQkVycm9yIiwgTlVMTCwgTlVMTCk7Ci0gICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRCRXJyb3IiLCBEQkVycm9yKTsKKyAgICBEQkVycm9yID0gTlVMTDsgICAgIC8qIHVzZWQgaW4gTUFLRV9FWCBzbyB0aGF0IGl0IGRlcml2ZXMgZnJvbSBub3RoaW5nICovCisgICAgTUFLRV9FWChEQkVycm9yKTsKIAogICAgIC8qIFNvbWUgbWFnaWMgdG8gbWFrZSBEQk5vdEZvdW5kRXJyb3IgYW5kIERCS2V5RW1wdHlFcnJvciBkZXJpdmUKICAgICAgKiBmcm9tIGJvdGggREJFcnJvciBhbmQgS2V5RXJyb3IsIHNpbmNlIHRoZSBBUEkgb25seSBzdXBwb3J0cwpAQCAtNTQwMSwxMCArNTQyMSw2IEBACiAgICAgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoZCwgIktleUVycm9yIik7CiAKIAotICAgIC8qIEFsbCB0aGUgcmVzdCBvZiB0aGUgZXhjZXB0aW9ucyBkZXJpdmUgb25seSBmcm9tIERCRXJyb3IgKi8KLSNkZWZpbmUgTUFLRV9FWChuYW1lKSAgIG5hbWUgPSBQeUVycl9OZXdFeGNlcHRpb24oImJzZGRiLl9kYi4iICNuYW1lLCBEQkVycm9yLCBOVUxMKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgI25hbWUsIG5hbWUpCi0KICNpZiAhSU5DT01QTEVURV9JU19XQVJOSU5HCiAgICAgTUFLRV9FWChEQkluY29tcGxldGVFcnJvcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggNDY5Y2Q2NC4uNDcwNGMxNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTM3LDYgKzM3LDI4IEBACiAjCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAogIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogI2VuZGlmCisKKyNpZm5kZWYgUHlfQ0xFQVIKKyNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAob3ApIHsJCQkJCVwKKwkJCVB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCisJCQkob3ApID0gTlVMTDsJCQkJXAorCQkJUHlfREVDUkVGKHRtcCk7CQkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIFB5X1ZJU0lUCisjZGVmaW5lIFB5X1ZJU0lUKG9wKQkJCQkJCQlcCisgICAgICAgIGRvIHsgCQkJCQkJCQlcCisgICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOwlcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJldCkJCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7CQkJCVwKKyAgICAgICAgICAgICAgICB9CQkJCQkJCVwKKyAgICAgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCiAvKiBlbmQgMi4yIGNvbXBhdGliaWxpdHkgbWFjcm9zICovCiAKICNkZWZpbmUgSVNfQkFTRVNUUklORyhvKSBcCkBAIC04MTIsMjggKzgzNCwxOCBAQAogc3RhdGljIGludAogUmVhZGVyX3RyYXZlcnNlKFJlYWRlck9iaiAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0JVklTSVQoc2VsZi0+ZGlhbGVjdCk7Ci0JVklTSVQoc2VsZi0+aW5wdXRfaXRlcik7Ci0JVklTSVQoc2VsZi0+ZmllbGRzKTsKKwlQeV9WSVNJVChzZWxmLT5kaWFsZWN0KTsKKwlQeV9WSVNJVChzZWxmLT5pbnB1dF9pdGVyKTsKKwlQeV9WSVNJVChzZWxmLT5maWVsZHMpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBSZWFkZXJfY2xlYXIoUmVhZGVyT2JqICpzZWxmKQogewotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmlucHV0X2l0ZXIpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmZpZWxkcyk7Ci0gICAgICAgIHNlbGYtPmRpYWxlY3QgPSBOVUxMOwotICAgICAgICBzZWxmLT5pbnB1dF9pdGVyID0gTlVMTDsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKKwlQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKKwlQeV9DTEVBUihzZWxmLT5pbnB1dF9pdGVyKTsKKwlQeV9DTEVBUihzZWxmLT5maWVsZHMpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjQ1LDI1ICsxMjU3LDE2IEBACiBzdGF0aWMgaW50CiBXcml0ZXJfdHJhdmVyc2UoV3JpdGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQlWSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlWSVNJVChzZWxmLT53cml0ZWxpbmUpOworCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworCVB5X1ZJU0lUKHNlbGYtPndyaXRlbGluZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFdyaXRlcl9jbGVhcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+d3JpdGVsaW5lKTsKLQlzZWxmLT5kaWFsZWN0ID0gTlVMTDsKLQlzZWxmLT53cml0ZWxpbmUgPSBOVUxMOworCVB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworCVB5X0NMRUFSKHNlbGYtPndyaXRlbGluZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0OTUsNyArMTQ5OCw3IEBACiBQeURvY19TVFJWQVIoY3N2X3dyaXRlcl9kb2MsCiAiICAgIGNzdl93cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmogWywgZGlhbGVjdD0nZXhjZWwnXVxuIgogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uYWwga2V5d29yZCBhcmdzXSlcbiIKLSIgICAgZm9yIHJvdyBpbiBjc3Zfd3JpdGVyOlxuIgorIiAgICBmb3Igcm93IGluIHNlcXVlbmNlOlxuIgogIiAgICAgICAgY3N2X3dyaXRlci53cml0ZXJvdyhyb3cpXG4iCiAiXG4iCiAiICAgIFtvcl1cbiIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCmluZGV4IDkyNmM4NWIuLmU2ZDZhYTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwpAQCAtMTA1LDYgKzEwNSwxMCBAQAogI2luY2x1ZGUgPGZmaS5oPgogI2lmZGVmIE1TX1dJTjMyCiAjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBJU19JTlRSRVNPVVJDRQorI2RlZmluZSBJU19JTlRSRVNPVVJDRSh4KSAoKChzaXplX3QpKHgpID4+IDE2KSA9PSAwKQorI2VuZGlmCiAjIGlmZGVmIF9XSU4zMl9XQ0UKIC8qIFVubGlrZSBkZXNrdG9wIFdpbmRvd3MsIFdpbkNFIGhhcyBib3RoIFcgYW5kIEEgdmFyaWFudHMgb2YKICAgIEdldFByb2NBZGRyZXNzLCBidXQgdGhlIGRlZmF1bHQgVyB2ZXJzaW9uIGlzIG5vdCB3aGF0IHdlIHdhbnQgKi8KQEAgLTI4NSw2ICsyODksNyBAQAogCWlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKIAkJUHlDQXJnT2JqZWN0ICpwID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwogCQlQeU9iamVjdCAqb2IgPSBwLT5vYmo7CisJCWNvbnN0IGNoYXIgKm9iX25hbWU7CiAJCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAJCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKIApAQCAtMjk2LDEwICszMDEsMTAgQEAKIAkJCVB5X0lOQ1JFRih2YWx1ZSk7CiAJCQlyZXR1cm4gdmFsdWU7CiAJCX0KKwkJb2JfbmFtZSA9IChvYikgPyBvYi0+b2JfdHlwZS0+dHBfbmFtZSA6ICI/Pz8iOwogCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiBwb2ludGVyIHRvICVzIiwKLQkJCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwKLQkJCSAgICAgb2ItPm9iX3R5cGUtPnRwX25hbWUpOworCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLCBvYl9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogI2lmIDEKQEAgLTUwNiwxMiArNTExLDEyIEBACiBzdGF0aWMgaW50CiBQb2ludGVyVHlwZV9TZXRQcm90byhTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCBQeU9iamVjdCAqcHJvdG8pCiB7Ci0JaWYgKHByb3RvICYmICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7CisJaWYgKCFwcm90byB8fCAhUHlUeXBlX0NoZWNrKHByb3RvKSkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJfdHlwZV8gbXVzdCBiZSBhIHR5cGUiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAocHJvdG8gJiYgIVB5VHlwZV9zdGdkaWN0KHByb3RvKSkgeworCWlmICghUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7CiAJCXJldHVybiAtMTsKQEAgLTU0Myw4ICs1NDgsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAlzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CiAJc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAyOwotCXN0Z2RpY3QtPmZmaV90eXBlID0gZmZpX3R5cGVfcG9pbnRlcjsKKwlzdGdkaWN0LT5sZW5ndGggPSAxOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCiAJcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KIAlpZiAocHJvdG8gJiYgLTEgPT0gUG9pbnRlclR5cGVfU2V0UHJvdG8oc3RnZGljdCwgcHJvdG8pKSB7CkBAIC04OTksNyArOTA0LDcgQEAKIAlQeU9iamVjdCAqdHlwZWRpY3Q7CiAJaW50IGxlbmd0aDsKIAotCWludCBpdGVtc2l6ZSwgaXRlbWFsaWduLCBpdGVtbGVuOworCWludCBpdGVtc2l6ZSwgaXRlbWFsaWduOwogCiAJdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7CiAJaWYgKCF0eXBlZGljdCkKQEAgLTkzNiw3ICs5NDEsNiBAQAogCiAJaXRlbXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKIAlpdGVtYWxpZ24gPSBpdGVtZGljdC0+YWxpZ247Ci0JaXRlbWxlbiA9IGl0ZW1kaWN0LT5sZW5ndGg7CiAKIAlzdGdkaWN0LT5zaXplID0gaXRlbXNpemUgKiBsZW5ndGg7CiAJc3RnZGljdC0+YWxpZ24gPSBpdGVtYWxpZ247CkBAIC05NDUsNyArOTQ5LDcgQEAKIAlzdGdkaWN0LT5wcm90byA9IHByb3RvOwogCiAJLyogQXJyYXlzIGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgdG8gZnVuY3Rpb24gY2FsbHMuICovCi0Jc3RnZGljdC0+ZmZpX3R5cGUgPSBmZmlfdHlwZV9wb2ludGVyOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCiAJLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCiAJICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwpAQCAtMTI2NCw5ICsxMjY4LDEzIEBACiAJUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAlQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JUHlPYmplY3QgKnN3YXBwZWRfYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOworCVB5T2JqZWN0ICpzd2FwcGVkX2FyZ3M7CiAJc3RhdGljIFB5T2JqZWN0ICpzdWZmaXg7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOworCisJc3dhcHBlZF9hcmdzID0gUHlUdXBsZV9OZXcoUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7CisJaWYgKCFzd2FwcGVkX2FyZ3MpCisJCXJldHVybiBOVUxMOwogCiAJaWYgKHN1ZmZpeCA9PSBOVUxMKQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgpAQCAtMTI3NSw4ICsxMjgzLDEwIEBACiAJCXN1ZmZpeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9iZSIpOwogI2VuZGlmCiAKLQlQeV9JTkNSRUYoc3VmZml4KTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJm5hbWUsIHN1ZmZpeCk7CisJUHlfSU5DUkVGKG5hbWUpOworCVB5U3RyaW5nX0NvbmNhdCgmbmFtZSwgc3VmZml4KTsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAogCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCAwLCBuYW1lKTsKIAlmb3IgKGk9MTsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyArK2kpIHsKQEAgLTEyOTcsNyArMTMwNyw3IEBACiAJaWYgKCFzdGdkaWN0KSAvKiBYWFggbGVha3MgcmVzdWx0ISAqLwogCQlyZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPmZmaV90eXBlID0gKmZtdC0+cGZmaV90eXBlOworCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CiAJc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OwogCXN0Z2RpY3QtPmxlbmd0aCA9IDA7CiAJc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOwpAQCAtMTM1NSw3ICsxMzY1LDcgQEAKIAogCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGUgPSAqZm10LT5wZmZpX3R5cGU7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKIAlzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CiAJc3RnZGljdC0+bGVuZ3RoID0gMDsKIAlzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CkBAIC0xNDUwLDYgKzE0NjAsNyBAQAogCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwogCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKICNlbmRpZgorCQlQeV9ERUNSRUYoc3dhcHBlZCk7CiAJfTsKIAogCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CkBAIC0xNjI0LDcgKzE2MzUsNyBAQAogCXN0Z2RpY3QtPnNpemUgPSBzaXplb2Yodm9pZCAqKTsKIAlzdGdkaWN0LT5zZXRmdW5jID0gTlVMTDsKIAlzdGdkaWN0LT5nZXRmdW5jID0gTlVMTDsKLQlzdGdkaWN0LT5mZmlfdHlwZSA9IGZmaV90eXBlX3BvaW50ZXI7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKIAlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZmxhZ3NfIik7CiAJaWYgKCFvYiB8fCAhUHlJbnRfQ2hlY2sob2IpKSB7CkBAIC0xODQ2LDcgKzE4NTcsNyBAQAogCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwogCVB5X0NMRUFSKHNlbGYtPmJfb2JqZWN0cyk7CiAJaWYgKChzZWxmLT5iX25lZWRzZnJlZSkKLQkgICAgJiYgKGRpY3QtPnNpemUgPiBzaXplb2Yoc2VsZi0+Yl92YWx1ZSkpKQorCSAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKIAkJUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7CiAJc2VsZi0+Yl9wdHIgPSBOVUxMOwogCVB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7CkBAIC0xODczLDggKzE4ODQsOSBAQAogCXsgTlVMTCB9LAogfTsKIAotc3RhdGljIFB5X3NzaXplX3QgQ0RhdGFfR2V0QnVmZmVyKENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHNlZywgdm9pZCAqKnBwdHIpCitzdGF0aWMgUHlfc3NpemVfdCBDRGF0YV9HZXRCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IHNlZywgdm9pZCAqKnBwdHIpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpZiAoc2VnICE9IDApIHsKIAkJLyogSG0uIE11c3QgdGhpcyBzZXQgYW4gZXhjZXB0aW9uPyAqLwogCQlyZXR1cm4gLTE7CkBAIC0xODgzLDcgKzE4OTUsNyBAQAogCXJldHVybiBzZWxmLT5iX3NpemU7CiB9CiAKLXN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldFNlZ2NvdW50KENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQorc3RhdGljIFB5X3NzaXplX3QgQ0RhdGFfR2V0U2VnY291bnQoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewogCWlmIChsZW5wKQogCQkqbGVucCA9IDE7CkBAIC0xODkxLDEwICsxOTAzLDEwIEBACiB9CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIENEYXRhX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCSh3cml0ZWJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCShzZWdjb3VudHByb2MpQ0RhdGFfR2V0U2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKU5VTEwsCisJQ0RhdGFfR2V0QnVmZmVyLAorCUNEYXRhX0dldEJ1ZmZlciwKKwlDRGF0YV9HZXRTZWdjb3VudCwKKwlOVUxMLAogfTsKIAogLyoKQEAgLTE5NjcsNyArMTk3OSw3IEBACiAKIHN0YXRpYyB2b2lkIENEYXRhX01hbGxvY0J1ZmZlcihDRGF0YU9iamVjdCAqb2JqLCBTdGdEaWN0T2JqZWN0ICpkaWN0KQogewotCWlmIChkaWN0LT5zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7CisJaWYgKChzaXplX3QpZGljdC0+c2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgewogCQkvKiBObyBuZWVkIHRvIGNhbGwgbWFsbG9jLCBjYW4gdXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciAqLwogCQlvYmotPmJfcHRyID0gKGNoYXIgKikmb2JqLT5iX3ZhbHVlOwogCQlvYmotPmJfbmVlZHNmcmVlID0gMTsKQEAgLTE5NzUsNyArMTk4Nyw3IEBACiAJCS8qIEluIHB5dGhvbiAyLjQsIGFuZCBjdHlwZXMgMC45LjYsIHRoZSBtYWxsb2MgY2FsbCB0b29rIGFib3V0CiAJCSAgIDMzJSBvZiB0aGUgY3JlYXRpb24gdGltZSBmb3IgY19pbnQoKS4KIAkJKi8KLQkJb2JqLT5iX3B0ciA9IFB5TWVtX01hbGxvYyhkaWN0LT5zaXplKTsKKwkJb2JqLT5iX3B0ciA9IChjaGFyICopUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOwogCQlvYmotPmJfbmVlZHNmcmVlID0gMTsKIAkJbWVtc2V0KG9iai0+Yl9wdHIsIDAsIGRpY3QtPnNpemUpOwogCX0KQEAgLTIwNDAsNyArMjA1Miw3IEBACiAJaWYgKCFwZCkKIAkJcmV0dXJuIE5VTEw7CiAJYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKHBkKSk7Ci0JcGQtPmJfcHRyID0gYnVmOworCXBkLT5iX3B0ciA9IChjaGFyICopYnVmOwogCXBkLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKIAlwZC0+Yl9zaXplID0gZGljdC0+c2l6ZTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopcGQ7CkBAIC0yMzgzLDYgKzIzOTUsMTEgQEAKIAlhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CiAJaWYgKGFkZHJlc3MpCiAJCXJldHVybiBhZGRyZXNzOworCisJaWYgKCgoc2l6ZV90KW5hbWUgJiB+MHhGRkZGKSA9PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwogCS8qIEl0IHNob3VsZCBub3QgaGFwcGVuIHRoYXQgZGljdCBpcyBOVUxMLCBidXQgYmV0dGVyIGJlIHNhZmUgKi8KIAlpZiAoZGljdD09TlVMTCB8fCBkaWN0LT5mbGFncyAmIEZVTkNGTEFHX0NERUNMKQogCQlyZXR1cm4gYWRkcmVzczsKQEAgLTIzOTEsNyArMjQwOCw3IEBACiAJICAgZnVuY25hbWUgLT4gX2Z1bmNuYW1lQDxuPgogCSAgIHdoZXJlIG4gaXMgMCwgNCwgOCwgMTIsIC4uLiwgMTI4CiAJICovCi0JbWFuZ2xlZF9uYW1lID0gX2FsbG9jYShzdHJsZW4obmFtZSkgKyAxICsgMSArIDEgKyAzKTsgLyogXDAgXyBAICVkICovCisJbWFuZ2xlZF9uYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgewogCQlzcHJpbnRmKG1hbmdsZWRfbmFtZSwgIl8lc0AlZCIsIG5hbWUsIGkqNCk7CiAJCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBtYW5nbGVkX25hbWUpOwpAQCAtMjQ4OCw2ICsyNTA1LDI4IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQKK19nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjaGFyICoqcG5hbWUpCit7CisjaWZkZWYgTVNfV0lOMzIKKwlpZiAoUHlJbnRfQ2hlY2sob2JqKSB8fCBQeUxvbmdfQ2hlY2sob2JqKSkgeworCQkvKiBXZSBoYXZlIHRvIHVzZSBNQUtFSU5UUkVTT1VSQ0VBIGZvciBXaW5kb3dzIENFLgorCQkgICBXb3JrcyBvbiBXaW5kb3dzIGFzIHdlbGwsIG9mIGNvdXJzZS4KKwkJKi8KKwkJKnBuYW1lID0gTUFLRUlOVFJFU09VUkNFQShQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sob2JqKSAmIDB4RkZGRik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCWlmIChQeVN0cmluZ19DaGVjayhvYmopIHx8IFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisJCSpwbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iaik7CisJCXJldHVybiAqcG5hbWUgPyAxIDogMDsKKwl9CisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJCSJmdW5jdGlvbiBuYW1lIG11c3QgYmUgc3RyaW5nIG9yIGludGVnZXIiKTsKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfRnJvbURsbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTI0OTksNyArMjUzOCw3IEBACiAJdm9pZCAqaGFuZGxlOwogCVB5T2JqZWN0ICpwYXJhbWZsYWdzID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic098TyIsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIoTyZPKXxPIiwgX2dldF9uYW1lLCAmbmFtZSwgJmRsbCwgJnBhcmFtZmxhZ3MpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQogCQlwYXJhbWZsYWdzID0gTlVMTDsKQEAgLTI1MjQsOSArMjU2MywxNCBAQAogI2lmZGVmIE1TX1dJTjMyCiAJYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7CiAJaWYgKCFhZGRyZXNzKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kIiwKLQkJCSAgICAgbmFtZSk7CisJCWlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisJCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQiLAorCQkJCSAgICAgbmFtZSk7CisJCWVsc2UKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKwkJCQkgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCisJCQkJICAgICAoV09SRCkoc2l6ZV90KW5hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAjZWxzZQpAQCAtMjYwMyw4ICsyNjQ3LDkgQEAKICAgIk8iIC0gbXVzdCBiZSBhIGNhbGxhYmxlLCBjcmVhdGVzIGEgQyBjYWxsYWJsZSBmdW5jdGlvbgogCiAgIHR3byBvciBtb3JlIGFyZ3VtZW50IGZvcm1zICh0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBwYXJhbWZsYWdzIHR1cGxlKQotICAic098TyIgLSBmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKQotICAiaXN8TyIgLSB2dGFibGUgaW5kZXgsIG1ldGhvZCBuYW1lLCBjcmVhdGVzIGNhbGxhYmxlIGNhbGxpbmcgQ09NIHZ0YmwKKyAgIihzTyl8Li4uIiAtIChmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKSksIHBhcmFtZmxhZ3MKKyAgIihpTyl8Li4uIiAtIChmdW5jdGlvbiBvcmRpbmFsLCBkbGwgb2JqZWN0ICh3aXRoIGFuIGludGVnZXIgaGFuZGxlKSksIHBhcmFtZmxhZ3MKKyAgImlzfC4uLiIgLSB2dGFibGUgaW5kZXgsIG1ldGhvZCBuYW1lLCBjcmVhdGVzIGNhbGxhYmxlIGNhbGxpbmcgQ09NIHZ0YmwKICovCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQpAQCAtMjYxMiwxOSArMjY1NywxOCBAQAogCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwogCVB5T2JqZWN0ICpjYWxsYWJsZTsKIAlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVRIVU5LIHRodW5rOworCWZmaV9pbmZvICp0aHVuazsKIAogCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCiAJCXJldHVybiBHZW5lcmljQ0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwogCi0JLyogU2hvdWxkbid0IHRoZSBmb2xsb3dpbmcgYmV0dGVyIGJlIGRvbmUgaW4gX19pbml0X18/ICovCi0JaWYgKDIgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewotI2lmZGVmIE1TX1dJTjMyCi0JCWlmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkKLQkJCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOwotI2VuZGlmCisJaWYgKDEgPD0gUHlUdXBsZV9HRVRfU0laRShhcmdzKSAmJiBQeVR1cGxlX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpKQogCQlyZXR1cm4gQ0Z1bmNQdHJfRnJvbURsbCh0eXBlLCBhcmdzLCBrd2RzKTsKLQl9CisKKyNpZmRlZiBNU19XSU4zMgorCWlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCisJCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOworI2VuZGlmCiAKIAlpZiAoMSA9PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpCiAJICAgICYmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKQpAQCAtMjc4MSw3ICsyODI1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfY2FsbGFyZ3MoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmd0eXBlcywKIAkJUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMsCi0JCWludCAqcG91dG1hc2ssIGludCAqcGlub3V0bWFzaywgaW50ICpwbnVtcmV0dmFscykKKwkJaW50ICpwb3V0bWFzaywgaW50ICpwaW5vdXRtYXNrLCB1bnNpZ25lZCBpbnQgKnBudW1yZXR2YWxzKQogewogCVB5T2JqZWN0ICpwYXJhbWZsYWdzID0gc2VsZi0+cGFyYW1mbGFnczsKIAlQeU9iamVjdCAqY2FsbGFyZ3M7CkBAIC0yODM1LDggKzI4NzksMTQgQEAKIAogCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewogCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6Ci0JCQkvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwgKi8KLQkJCVB5X0lOQ1JFRihkZWZ2YWwpOworCQkJLyogWydpbicsICdsY2lkJ10gcGFyYW1ldGVyLiAgQWx3YXlzIHRha2VuIGZyb20gZGVmdmFsLAorCQkJIGlmIGdpdmVuLCBlbHNlIHRoZSBpbnRlZ2VyIDAuICovCisJCQlpZiAoZGVmdmFsID09IE5VTEwpIHsKKwkJCQlkZWZ2YWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKwkJCQlpZiAoZGVmdmFsID09IE5VTEwpCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2UKKwkJCQlQeV9JTkNSRUYoZGVmdmFsKTsKIAkJCVB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUKToKQEAgLTI5MzksOSArMjk4OSwxMCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfcmVzdWx0KFB5T2JqZWN0ICpyZXN1bHQsIFB5T2JqZWN0ICpjYWxsYXJncywKLQkgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgaW50IG51bXJldHZhbHMpCisJICAgICAgaW50IG91dG1hc2ssIGludCBpbm91dG1hc2ssIHVuc2lnbmVkIGludCBudW1yZXR2YWxzKQogewotCWludCBpLCBpbmRleCwgYml0OworCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwlpbnQgYml0OwogCVB5T2JqZWN0ICp0dXAgPSBOVUxMOwogCiAJaWYgKGNhbGxhcmdzID09IE5VTEwpCkBAIC0yOTUyLDYgKzMwMDMsNyBAQAogCX0KIAlQeV9ERUNSRUYocmVzdWx0KTsKIAorCS8qIHR1cCB3aWxsIG5vdCBiZSBhbGxvY2F0ZWQgaWYgbnVtcmV0dmFscyA9PSAxICovCiAJLyogYWxsb2NhdGUgdHVwbGUgdG8gaG9sZCB0aGUgcmVzdWx0ICovCiAJaWYgKG51bXJldHZhbHMgPiAxKSB7CiAJCXR1cCA9IFB5VHVwbGVfTmV3KG51bXJldHZhbHMpOwpAQCAtMzAwOSw3ICszMDYxLDcgQEAKIAogCWludCBpbm91dG1hc2s7CiAJaW50IG91dG1hc2s7Ci0JaW50IG51bXJldHZhbHM7CisJdW5zaWduZWQgaW50IG51bXJldHZhbHM7CiAKIAlhc3NlcnQoZGljdCk7IC8qIGlmIG5vdCwgaXQncyBhIGJ1ZyAqLwogCXJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7CkBAIC0zMTQ1LDkgKzMxOTcsMTEgQEAKIAlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKIAlQeV9DTEVBUihzZWxmLT5wYXJhbWZsYWdzKTsKIAotCWlmIChzZWxmLT50aHVuaykKLQkJRnJlZUNhbGxiYWNrKHNlbGYtPnRodW5rKTsKLQlzZWxmLT50aHVuayA9IE5VTEw7CisJaWYgKHNlbGYtPnRodW5rKSB7CisJCUZyZWVDbG9zdXJlKHNlbGYtPnRodW5rLT5wY2wpOworCQlQeU1lbV9GcmVlKHNlbGYtPnRodW5rKTsKKwkJc2VsZi0+dGh1bmsgPSBOVUxMOworCX0KIAogCXJldHVybiBDRGF0YV9jbGVhcigoQ0RhdGFPYmplY3QgKilzZWxmKTsKIH0KQEAgLTMyNDEsNyArMzI5NSw3IEBACiAKIAlwYXJnLT50YWcgPSAnVic7CiAJc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlOworCXBhcmctPnBmZmlfdHlwZSA9ICZzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwogCS8qIEZvciBzdHJ1Y3R1cmUgcGFyYW1ldGVycyAoYnkgdmFsdWUpLCBwYXJnLT52YWx1ZSBkb2Vzbid0IGNvbnRhaW4gdGhlIHN0cnVjdHVyZQogCSAgIGRhdGEgaXRzZWxmLCBpbnN0ZWFkIHBhcmctPnZhbHVlLnAgKnBvaW50cyogdG8gdGhlIHN0cnVjdHVyZSdzIGRhdGEKIAkgICBTZWUgYWxzbyBfY3R5cGVzLmMsIGZ1bmN0aW9uIF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoKS4KQEAgLTMyNzUsNiArMzMyOSw4IEBACiAJCWlmICghZmllbGRzKSB7CiAJCQlQeUVycl9DbGVhcigpOwogCQkJZmllbGRzID0gUHlUdXBsZV9OZXcoMCk7CisJCQlpZiAoIWZpZWxkcykKKwkJCQlyZXR1cm4gLTE7CiAJCX0KIAogCQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcykpIHsKQEAgLTM0NDUsOCArMzUwMSw5IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1BcnJheV9pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgpCitBcnJheV9pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCWludCBvZmZzZXQsIHNpemU7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIApAQCAtMzQ2OSw4ICszNTI2LDkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLUFycmF5X3NsaWNlKENEYXRhT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCitBcnJheV9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CiAJUHlMaXN0T2JqZWN0ICpucDsKQEAgLTM1MDQsMTUgKzM1NjIsMTYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKHNlbGYsIGkraWxvdyk7CisJCVB5T2JqZWN0ICp2ID0gQXJyYXlfaXRlbShfc2VsZiwgaStpbG93KTsKIAkJUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKIAl9CiAJcmV0dXJuIChQeU9iamVjdCAqKW5wOwogfQogCiBzdGF0aWMgaW50Ci1BcnJheV9hc3NfaXRlbShDRGF0YU9iamVjdCAqc2VsZiwgaW50IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCitBcnJheV9hc3NfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCWludCBzaXplLCBvZmZzZXQ7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAljaGFyICpwdHI7CkBAIC0zNTM4LDggKzM1OTcsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1BcnJheV9hc3Nfc2xpY2UoQ0RhdGFPYmplY3QgKnNlbGYsIGludCBpbG93LCBpbnQgaWhpZ2gsIFB5T2JqZWN0ICp2YWx1ZSkKK0FycmF5X2Fzc19zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnZhbHVlKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IGksIGxlbjsKIAogCWlmICh2YWx1ZSA9PSBOVUxMKSB7CkBAIC0zNTcwLDcgKzM2MzAsNyBAQAogCQlpbnQgcmVzdWx0OwogCQlpZiAoaXRlbSA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwotCQlyZXN1bHQgPSBBcnJheV9hc3NfaXRlbShzZWxmLCBpK2lsb3csIGl0ZW0pOworCQlyZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgaStpbG93LCBpdGVtKTsKIAkJUHlfREVDUkVGKGl0ZW0pOwogCQlpZiAocmVzdWx0ID09IC0xKQogCQkJcmV0dXJuIC0xOwpAQCAtMzU3OCwyMCArMzYzOCwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1BcnJheV9sZW5ndGgoQ0RhdGFPYmplY3QgKnNlbGYpCitzdGF0aWMgUHlfc3NpemVfdAorQXJyYXlfbGVuZ3RoKFB5T2JqZWN0ICpfc2VsZikKIHsKKwlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCXJldHVybiBzZWxmLT5iX2xlbmd0aDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIEFycmF5X2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKUFycmF5X2xlbmd0aCwJCQkvKiBzcV9sZW5ndGg7ICovCisJQXJyYXlfbGVuZ3RoLAkJCQkvKiBzcV9sZW5ndGg7ICovCiAJMCwJCQkJCS8qIHNxX2NvbmNhdDsgKi8KIAkwLAkJCQkJLyogc3FfcmVwZWF0OyAqLwotCShzc2l6ZWFyZ2Z1bmMpQXJyYXlfaXRlbSwJCS8qIHNxX2l0ZW07ICovCi0JKHNzaXplc3NpemVhcmdmdW5jKUFycmF5X3NsaWNlLAkJLyogc3Ffc2xpY2U7ICovCi0JKHNzaXplb2JqYXJncHJvYylBcnJheV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW07ICovCi0JKHNzaXplc3NpemVvYmphcmdwcm9jKUFycmF5X2Fzc19zbGljZSwJLyogc3FfYXNzX3NsaWNlOyAqLworCUFycmF5X2l0ZW0sCQkJCS8qIHNxX2l0ZW07ICovCisJQXJyYXlfc2xpY2UsCQkJCS8qIHNxX3NsaWNlOyAqLworCUFycmF5X2Fzc19pdGVtLAkJCQkvKiBzcV9hc3NfaXRlbTsgKi8KKwlBcnJheV9hc3Nfc2xpY2UsCQkJLyogc3FfYXNzX3NsaWNlOyAqLwogCTAsCQkJCQkvKiBzcV9jb250YWluczsgKi8KIAkKIAkwLAkJCQkJLyogc3FfaW5wbGFjZV9jb25jYXQ7ICovCkBAIC0zOTQyLDggKzQwMDMsOSBAQAogICBQb2ludGVyX1R5cGUKICovCiBzdGF0aWMgUHlPYmplY3QgKgotUG9pbnRlcl9pdGVtKENEYXRhT2JqZWN0ICpzZWxmLCBpbnQgaW5kZXgpCitQb2ludGVyX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemUsIG9mZnNldDsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7CiAJUHlPYmplY3QgKnByb3RvOwpAQCAtMzk2OSw4ICs0MDMxLDkgQEAKIH0KIAogc3RhdGljIGludAotUG9pbnRlcl9hc3NfaXRlbShDRGF0YU9iamVjdCAqc2VsZiwgaW50IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCitQb2ludGVyX2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogeworCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAJaW50IHNpemU7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIApAQCAtNDExMSw4ICs0MTc0LDkgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLVBvaW50ZXJfc2xpY2UoQ0RhdGFPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKK1BvaW50ZXJfc2xpY2UoUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7CisJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlQeUxpc3RPYmplY3QgKm5wOwogCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKIAlQeU9iamVjdCAqcHJvdG87CkBAIC00MTQyLDcgKzQyMDYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IFBvaW50ZXJfaXRlbShzZWxmLCBpK2lsb3cpOworCQlQeU9iamVjdCAqdiA9IFBvaW50ZXJfaXRlbShfc2VsZiwgaStpbG93KTsKIAkJUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKIAl9CiAJcmV0dXJuIChQeU9iamVjdCAqKW5wOwpAQCAtNDE1Miw5ICs0MjE2LDkgQEAKIAkwLAkJCQkJLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCiAJMCwJCQkJCS8qIGJpbmFyeWZ1bmMgc3FfY29uY2F0OyAqLwogCTAsCQkJCQkvKiBpbnRhcmdmdW5jIHNxX3JlcGVhdDsgKi8KLQkoc3NpemVhcmdmdW5jKVBvaW50ZXJfaXRlbSwJCS8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpUG9pbnRlcl9zbGljZSwJLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KLQkoc3NpemVvYmphcmdwcm9jKVBvaW50ZXJfYXNzX2l0ZW0sCS8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCisJUG9pbnRlcl9pdGVtLAkJCQkvKiBpbnRhcmdmdW5jIHNxX2l0ZW07ICovCisJUG9pbnRlcl9zbGljZSwJCQkJLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKwlQb2ludGVyX2Fzc19pdGVtLAkJCS8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCiAJMCwJCQkJCS8qIGludGludG9iamFyZ3Byb2Mgc3FfYXNzX3NsaWNlOyAqLwogCTAsCQkJCQkvKiBvYmpvYmpwcm9jIHNxX2NvbnRhaW5zOyAqLwogCS8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCkBAIC00MzM0LDYgKzQzOTgsNDIgQEAKIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKIH0KIAorc3RhdGljIGludAorY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnKQoreworCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisKKwlpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKwkJcmV0dXJuIDE7CisJZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisJaWYgKGRpY3QpIHsKKwkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQorCQkgICAgJiYgKHN0cmNocigic1B6VVpYTyIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworCQkJLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJICAgICAiY2FzdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKKwkJICAgICBQeVR5cGVfQ2hlY2soYXJnKQorCQkgICAgID8gKChQeVR5cGVPYmplY3QgKilhcmcpLT50cF9uYW1lCisJCSAgICAgOiBhcmctPm9iX3R5cGUtPnRwX25hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorY2FzdCh2b2lkICpwdHIsIFB5T2JqZWN0ICpjdHlwZSkKK3sKKwlDRGF0YU9iamVjdCAqcmVzdWx0OworCWlmICgwID09IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoY3R5cGUpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCS8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCisJbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NDY5LDE0ICs0NTY5LDI1IEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9zdHJpbmdfYXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihzdHJpbmdfYXQpKTsKKwlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9jYXN0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIoY2FzdCkpOwogI2lmZGVmIENUWVBFU19VTklDT0RFCiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfd3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHdzdHJpbmdfYXQpKTsKICNlbmRpZgogCi0jaWZkZWYgUlRMRF9MT0NBTAorLyogSWYgUlRMRF9MT0NBTCBpcyBub3QgZGVmaW5lZCAoV2luZG93cyEpLCBzZXQgaXQgdG8gemVyby4gKi8KKyNpZm5kZWYgUlRMRF9MT0NBTAorI2RlZmluZSBSVExEX0xPQ0FMIDAKKyNlbmRpZgorCisvKiBJZiBSVExEX0dMT0JBTCBpcyBub3QgZGVmaW5lZCAoY3lnd2luKSwgc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGFzCisgICBSVExEX0xPQ0FMLgorKi8KKyNpZm5kZWYgUlRMRF9HTE9CQUwKKyNkZWZpbmUgUlRMRF9HTE9CQUwgUlRMRF9MT0NBTAorI2VuZGlmCisKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfTE9DQUwiLCBQeUludF9Gcm9tTG9uZyhSVExEX0xPQ0FMKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSVExEX0dMT0JBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfR0xPQkFMKSk7Ci0jZW5kaWYKIAkKIAlQeUV4Y19BcmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY3R5cGVzLkFyZ3VtZW50RXJyb3IiLCBOVUxMLCBOVUxMKTsKIAlpZiAoUHlFeGNfQXJnRXJyb3IpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYwppbmRleCBhNDZmNWU0Li5hZDNiMDQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCkBAIC01MSwyMSArNTEsMjEgQEAKIAkqcHJlc3VsdCA9IGEgKyBiOwogfQogCi1FWFBPUlQoaW50KSBfdGVzdGZ1bmNfaV9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChpbnQpIF90ZXN0ZnVuY19pX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIC8vCXByaW50ZigiX3Rlc3RmdW5jX2lfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCiAvLwkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAJcmV0dXJuIChpbnQpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKLUVYUE9SVChmbG9hdCkgX3Rlc3RmdW5jX2ZfYmhpbGZkKGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCitFWFBPUlQoZmxvYXQpIF90ZXN0ZnVuY19mX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIC8vCXByaW50ZigiX3Rlc3RmdW5jX2ZfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCiAvLwkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAJcmV0dXJuIChmbG9hdCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAotRVhQT1JUKGRvdWJsZSkgX3Rlc3RmdW5jX2RfYmhpbGZkKGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCitFWFBPUlQoZG91YmxlKSBfdGVzdGZ1bmNfZF9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7CiAvLwlwcmludGYoIl90ZXN0ZnVuY19kX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAogLy8JICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwpAQCAtNzQsNyArNzQsNyBAQAogCiBFWFBPUlQoY2hhciAqKSBfdGVzdGZ1bmNfcF9wKHZvaWQgKnMpCiB7Ci0JcmV0dXJuIHM7CisJcmV0dXJuIChjaGFyICopczsKIH0KIAogRVhQT1JUKHZvaWQgKikgX3Rlc3RmdW5jX2NfcF9wKGludCAqYXJnY3AsIGNoYXIgKiphcmd2KQpAQCAtODksNyArODksNyBAQAogCiBFWFBPUlQoY2hhciAqKSBteV9zdHJkdXAoY2hhciAqc3JjKQogewotCWNoYXIgKmRzdCA9IG1hbGxvYyhzdHJsZW4oc3JjKSsxKTsKKwljaGFyICpkc3QgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3JjKSsxKTsKIAlpZiAoIWRzdCkKIAkJcmV0dXJuIE5VTEw7CiAJc3RyY3B5KGRzdCwgc3JjKTsKQEAgLTk5LDggKzk5LDggQEAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIEVYUE9SVCh3Y2hhcl90ICopIG15X3djc2R1cCh3Y2hhcl90ICpzcmMpCiB7Ci0JaW50IGxlbiA9IHdjc2xlbihzcmMpOwotCXdjaGFyX3QgKnB0ciA9IG1hbGxvYygobGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworCXNpemVfdCBsZW4gPSB3Y3NsZW4oc3JjKTsKKwl3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKW1hbGxvYygobGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogCWlmIChwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJbWVtY3B5KHB0ciwgc3JjLCAobGVuKzEpICogc2l6ZW9mKHdjaGFyX3QpKTsKQEAgLTE1MiwxMyArMTUyLDEzIEBACiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkcShjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCitFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmRxKHNpZ25lZCBjaGFyIGIsIHNob3J0IGgsIGludCBpLCBsb25nIGwsIGZsb2F0IGYsCiAJCQkJICAgICBkb3VibGUgZCwgUFlfTE9OR19MT05HIHEpCiB7CiAJcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCi1FWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKK0VYUE9SVChQWV9MT05HX0xPTkcpIF90ZXN0ZnVuY19xX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKIAlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KQEAgLTE5MSw3ICsxOTEsNyBAQAogewogCXN0YXRpYyBjaGFyIG1lc3NhZ2VbXSA9ICJIZWxsbywgV29ybGQiOwogCWlmIChwKSB7Ci0JCSpwID0gbWFsbG9jKHNpemVvZihjaGFyICopKTsKKwkJKnAgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikpOwogCQlwcmludGYoIm1hbGxvYyByZXR1cm5lZCAlcFxuIiwgKnApOwogCQkqKnAgPSBtZXNzYWdlOwogCQlyZXR1cm4gMTsKQEAgLTM4NSw3ICszODUsNyBAQAogI2RlZmluZSBTIGxhc3RfdGZfYXJnX3MgPSAoUFlfTE9OR19MT05HKWMKICNkZWZpbmUgVSBsYXN0X3RmX2FyZ191ID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyljCiAKLUVYUE9SVChjaGFyKSB0Zl9iKGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoc2lnbmVkIGNoYXIpIHRmX2Ioc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodW5zaWduZWQgY2hhcikgdGZfQih1bnNpZ25lZCBjaGFyIGMpIHsgVTsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHNob3J0KSB0Zl9oKHNob3J0IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHVuc2lnbmVkIHNob3J0KSB0Zl9IKHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQpAQCAtMzk5LDcgKzM5OSw3IEBACiBFWFBPUlQoZG91YmxlKSB0Zl9kKGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KIAogI2lmZGVmIE1TX1dJTjMyCi1FWFBPUlQoY2hhcikgX19zdGRjYWxsIHNfdGZfYihjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHNpZ25lZCBjaGFyKSBfX3N0ZGNhbGwgc190Zl9iKHNpZ25lZCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQogRVhQT1JUKHVuc2lnbmVkIGNoYXIpIF9fc3RkY2FsbCBzX3RmX0IodW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KIEVYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfaChzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KIEVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgX19zdGRjYWxsIHNfdGZfSCh1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KQEAgLTQxNCwzMyArNDE0LDMzIEBACiAjZW5kaWYKIC8qKioqKioqLwogCi1FWFBPUlQoY2hhcikgdGZfYmIoY2hhciB4LCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGNoYXIpIHRmX2JCKGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChzaG9ydCkgdGZfYmgoY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgdGZfYkgoY2hhciB4LCB1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChpbnQpIHRmX2JpKGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGludCkgdGZfYkkoY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQobG9uZykgdGZfYmwoY2hhciB4LCBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGxvbmcpIHRmX2JMKGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChQWV9MT05HX0xPTkcpIHRmX2JxKGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgdGZfYlEoY2hhciB4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZmxvYXQpIHRmX2JmKGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZG91YmxlKSB0Zl9iZChjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaWduZWQgY2hhcikgdGZfYmIoc2lnbmVkIGNoYXIgeCwgc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgY2hhcikgdGZfYkIoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaG9ydCkgdGZfYmgoc2lnbmVkIGNoYXIgeCwgc2hvcnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgc2hvcnQpIHRmX2JIKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGludCkgdGZfYmkoc2lnbmVkIGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGludCkgdGZfYkkoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcpIHRmX2JsKHNpZ25lZCBjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgbG9uZykgdGZfYkwoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChQWV9MT05HX0xPTkcpIHRmX2JxKHNpZ25lZCBjaGFyIHgsIFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIHRmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChmbG9hdCkgdGZfYmYoc2lnbmVkIGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoZG91YmxlKSB0Zl9iZChzaWduZWQgY2hhciB4LCBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodm9pZCkgdHZfaShpbnQgYykgeyBTOyByZXR1cm47IH0KIAogI2lmZGVmIE1TX1dJTjMyCi1FWFBPUlQoY2hhcikgX19zdGRjYWxsIHNfdGZfYmIoY2hhciB4LCBjaGFyIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGNoYXIpIF9fc3RkY2FsbCBzX3RmX2JCKGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfYmgoY2hhciB4LCBzaG9ydCBjKSB7IFM7IHJldHVybiBjLzM7IH0KLUVYUE9SVCh1bnNpZ25lZCBzaG9ydCkgX19zdGRjYWxsIHNfdGZfYkgoY2hhciB4LCB1bnNpZ25lZCBzaG9ydCBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChpbnQpIF9fc3RkY2FsbCBzX3RmX2JpKGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGludCkgX19zdGRjYWxsIHNfdGZfYkkoY2hhciB4LCB1bnNpZ25lZCBpbnQgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQobG9uZykgX19zdGRjYWxsIHNfdGZfYmwoY2hhciB4LCBsb25nIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIGxvbmcpIF9fc3RkY2FsbCBzX3RmX2JMKGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KLUVYUE9SVChQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JxKGNoYXIgeCwgUFlfTE9OR19MT05HIGMpIHsgUzsgcmV0dXJuIGMvMzsgfQotRVhQT1JUKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgX19zdGRjYWxsIHNfdGZfYlEoY2hhciB4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgYykgeyBVOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZmxvYXQpIF9fc3RkY2FsbCBzX3RmX2JmKGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9Ci1FWFBPUlQoZG91YmxlKSBfX3N0ZGNhbGwgc190Zl9iZChjaGFyIHgsIGRvdWJsZSBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfYmIoc2lnbmVkIGNoYXIgeCwgc2lnbmVkIGNoYXIgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgY2hhcikgX19zdGRjYWxsIHNfdGZfYkIoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgY2hhciBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChzaG9ydCkgX19zdGRjYWxsIHNfdGZfYmgoc2lnbmVkIGNoYXIgeCwgc2hvcnQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgc2hvcnQpIF9fc3RkY2FsbCBzX3RmX2JIKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIHNob3J0IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGludCkgX19zdGRjYWxsIHNfdGZfYmkoc2lnbmVkIGNoYXIgeCwgaW50IGMpIHsgUzsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKHVuc2lnbmVkIGludCkgX19zdGRjYWxsIHNfdGZfYkkoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgaW50IGMpIHsgVTsgcmV0dXJuIGMvMzsgfQorRVhQT1JUKGxvbmcpIF9fc3RkY2FsbCBzX3RmX2JsKHNpZ25lZCBjaGFyIHgsIGxvbmcgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQodW5zaWduZWQgbG9uZykgX19zdGRjYWxsIHNfdGZfYkwoc2lnbmVkIGNoYXIgeCwgdW5zaWduZWQgbG9uZyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JxKHNpZ25lZCBjaGFyIHgsIFBZX0xPTkdfTE9ORyBjKSB7IFM7IHJldHVybiBjLzM7IH0KK0VYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIF9fc3RkY2FsbCBzX3RmX2JRKHNpZ25lZCBjaGFyIHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBjKSB7IFU7IHJldHVybiBjLzM7IH0KK0VYUE9SVChmbG9hdCkgX19zdGRjYWxsIHNfdGZfYmYoc2lnbmVkIGNoYXIgeCwgZmxvYXQgYykgeyBTOyByZXR1cm4gYy8zOyB9CitFWFBPUlQoZG91YmxlKSBfX3N0ZGNhbGwgc190Zl9iZChzaWduZWQgY2hhciB4LCBkb3VibGUgYykgeyBTOyByZXR1cm4gYy8zOyB9CiBFWFBPUlQodm9pZCkgX19zdGRjYWxsIHNfdHZfaShpbnQgYykgeyBTOyByZXR1cm47IH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggMjk0OGQ5OC4uOGMyOWM1NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtMjY0LDE2ICsyNjQsNiBAQAogCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlmZmlfY2xvc3VyZSAqcGNsOyAvKiB0aGUgQyBjYWxsYWJsZSAqLwotCWZmaV9jaWYgY2lmOwotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKLQlTRVRGVU5DIHNldGZ1bmM7Ci0JZmZpX3R5cGUgKnJlc3R5cGU7Ci0JZmZpX3R5cGUgKmF0eXBlc1swXTsKLX0gZmZpX2luZm87Ci0KIHN0YXRpYyB2b2lkIGNsb3N1cmVfZmNuKGZmaV9jaWYgKmNpZiwKIAkJCXZvaWQgKnJlc3AsCiAJCQl2b2lkICoqYXJncywKQEAgLTI4OSwxNiArMjc5LDEwIEBACiAJCQkgIGFyZ3MpOwogfQogCi12b2lkIEZyZWVDYWxsYmFjayhUSFVOSyB0aHVuaykKLXsKLQlGcmVlQ2xvc3VyZSgoKGZmaV9pbmZvICopdGh1bmspLT5wY2wpOwotCVB5TWVtX0ZyZWUodGh1bmspOwotfQotCi1USFVOSyBBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkJICAgIGludCBpc19jZGVjbCkKK2ZmaV9pbmZvICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAorCQkJCVB5T2JqZWN0ICpjb252ZXJ0ZXJzLAorCQkJCVB5T2JqZWN0ICpyZXN0eXBlLAorCQkJCWludCBpc19jZGVjbCkKIHsKIAlpbnQgcmVzdWx0OwogCWZmaV9pbmZvICpwOwpAQCAtMzEzLDEzICsyOTcsMTQgQEAKIAl9CiAJcC0+cGNsID0gTWFsbG9jQ2xvc3VyZSgpOwogCWlmIChwLT5wY2wgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKHApOwogCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewogCQlQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOworCQlpZiAoY252ID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCQlwLT5hdHlwZXNbaV0gPSBHZXRUeXBlKGNudik7CiAJCVB5X0RFQ1JFRihjbnYpOwogCX0KQEAgLTMzMCwxMiArMzE1LDEwIEBACiAJCXAtPnJlc3R5cGUgPSAmZmZpX3R5cGVfdm9pZDsKIAl9IGVsc2UgewogCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7Ci0JCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCVB5TWVtX0ZyZWUocCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorCQlpZiAoZGljdCA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKIAkJcC0+c2V0ZnVuYyA9IGRpY3QtPnNldGZ1bmM7Ci0JCXAtPnJlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGU7CisJCXAtPnJlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKIAl9CiAKIAljYyA9IEZGSV9ERUZBVUxUX0FCSTsKQEAgLTM0OSwyMSArMzMyLDI2IEBACiAJaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKIAkJCSAgICAgImZmaV9wcmVwX2NpZiBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7Ci0JCVB5TWVtX0ZyZWUocCk7Ci0JCXJldHVybiBOVUxMOworCQlnb3RvIGVycm9yOwogCX0KIAlyZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOwogCWlmIChyZXN1bHQgIT0gRkZJX09LKSB7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCiAJCQkgICAgICJmZmlfcHJlcF9jbG9zdXJlIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJUHlNZW1fRnJlZShwKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJcC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CiAJcC0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKKwlyZXR1cm4gcDsKIAotCXJldHVybiAoVEhVTkspcDsKKyAgZXJyb3I6CisJaWYgKHApIHsKKwkJaWYgKHAtPnBjbCkKKwkJCUZyZWVDbG9zdXJlKHAtPnBjbCk7CisJCVB5TWVtX0ZyZWUocCk7CisJfQorCXJldHVybiBOVUxMOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwppbmRleCA5ZDllMzIyLi44MTYzZjQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwpAQCAtNjQsMTQgKzY0LDE3IEBACiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTjMyCi0jZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjaW5jbHVkZSA8bWFsbG9jLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgPGZmaS5oPgogI2luY2x1ZGUgImN0eXBlcy5oIgogCi0jaWZkZWYgX0RFQlVHCi0jZGVmaW5lIERFQlVHX0VYQ0VQVElPTlMgLyogKi8KKyNpZiBkZWZpbmVkKF9ERUJVRykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKy8qIERvbid0IHVzZSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyBvbiBXaW5kb3dzIGlmIHRoaXMgaXMgZGVmaW5lZC4KKyAgIE1pbmdXLCBBRkFJSywgZG9lc24ndCBzdXBwb3J0IGl0LgorKi8KKyNkZWZpbmUgRE9OVF9VU0VfU0VICiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTjMyCkBAIC05Niw2ICs5OSw3IEBACiAJcmV0dXJuIGxwTXNnQnVmOwogfQogCisjaWZuZGVmIERPTlRfVVNFX1NFSAogdm9pZCBTZXRFeGNlcHRpb24oRFdPUkQgY29kZSwgRVhDRVBUSU9OX1JFQ09SRCAqcHIpCiB7CiAJVENIQVIgKmxwTXNnQnVmOwpAQCAtMjU0LDYgKzI1OCw3IEBACiAJKnJlY29yZCA9ICpwdHJzLT5FeGNlcHRpb25SZWNvcmQ7CiAJcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7CiB9CisjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoZWNrX2hyZXN1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNTc2LDE0ICs1ODEsMTQgQEAKIAkvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgogCSAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKIAkqLwotCWlmIChkaWN0LT5mZmlfdHlwZS50eXBlID09IEZGSV9UWVBFX1NUUlVDVCkgewotCQlpZiAoZGljdC0+ZmZpX3R5cGUuc2l6ZSA8PSA0KQorCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisJCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKIAkJCXJldHVybiAmZmZpX3R5cGVfc2ludDMyOwotCQllbHNlIGlmIChkaWN0LT5mZmlfdHlwZS5zaXplIDw9IDgpCisJCWVsc2UgaWYgKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA8PSA4KQogCQkJcmV0dXJuICZmZmlfdHlwZV9zaW50NjQ7CiAJfQogI2VuZGlmCi0JcmV0dXJuICZkaWN0LT5mZmlfdHlwZTsKKwlyZXR1cm4gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CiB9CiAKIApAQCAtNjEyLDkgKzYxNywxMSBAQAogCWludCBjYzsKICNpZmRlZiBNU19XSU4zMgogCWludCBkZWx0YTsKKyNpZm5kZWYgRE9OVF9VU0VfU0VICiAJRFdPUkQgZHdFeGNlcHRpb25Db2RlID0gMDsKIAlFWENFUFRJT05fUkVDT1JEIHJlY29yZDsKICNlbmRpZgorI2VuZGlmCiAJLyogWFhYIGNoZWNrIGJlZm9yZSBoZXJlICovCiAJaWYgKHJlc3R5cGUgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLApAQCAtNjQwLDE0ICs2NDcsMTQgQEAKIAlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQogCQlQeV9VTkJMT0NLX1RIUkVBRFMKICNpZmRlZiBNU19XSU4zMgotI2lmbmRlZiBERUJVR19FWENFUFRJT05TCisjaWZuZGVmIERPTlRfVVNFX1NFSAogCV9fdHJ5IHsKICNlbmRpZgogCQlkZWx0YSA9CiAjZW5kaWYKIAkJCWZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CiAjaWZkZWYgTVNfV0lOMzIKLSNpZm5kZWYgREVCVUdfRVhDRVBUSU9OUworI2lmbmRlZiBET05UX1VTRV9TRUgKIAl9CiAJX19leGNlcHQgKEhhbmRsZUV4Y2VwdGlvbihHZXRFeGNlcHRpb25JbmZvcm1hdGlvbigpLAogCQkJCSAgJmR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCkpIHsKQEAgLTY1OCwxMCArNjY1LDEyIEBACiAJaWYgKChmbGFncyAmIEZVTkNGTEFHX1BZVEhPTkFQSSkgPT0gMCkKIAkJUHlfQkxPQ0tfVEhSRUFEUwogI2lmZGVmIE1TX1dJTjMyCisjaWZuZGVmIERPTlRfVVNFX1NFSAogCWlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKIAkJU2V0RXhjZXB0aW9uKGR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCk7CiAJCXJldHVybiAtMTsKIAl9CisjZW5kaWYKIAlpZiAoZGVsdGEgPCAwKSB7CiAJCWlmIChmbGFncyAmIEZVTkNGTEFHX0NERUNMKQogCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCkBAIC03NTgsNiArNzY3LDggQEAKIAlpZiAoY2xzX3N0cikgewogCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIGNsc19zdHIpOwogCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjogIikpOworCQlpZiAocyA9PSBOVUxMKQorCQkJZ290byBlcnJvcjsKIAl9IGVsc2UKIAkJUHlFcnJfQ2xlYXIoKTsKIAltc2dfc3RyID0gUHlPYmplY3RfU3RyKHYpOwpAQCAtNzY2LDEyICs3NzcsMTUgQEAKIAllbHNlIHsKIAkJUHlFcnJfQ2xlYXIoKTsKIAkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI/Pz8iKSk7CisJCWlmIChzID09IE5VTEwpCisJCQlnb3RvIGVycm9yOwogCX0KIAlQeUVycl9TZXRPYmplY3QoZXhjX2NsYXNzLCBzKTsKK2Vycm9yOgogCVB5X1hERUNSRUYodHApOwogCVB5X1hERUNSRUYodik7CiAJUHlfWERFQ1JFRih0Yik7Ci0JUHlfREVDUkVGKHMpOworCVB5X1hERUNSRUYocyk7CiB9CiAKIApAQCAtMTM2Myw3ICsxMzc3LDcgQEAKIGNvbnZlcnRlcihQeU9iamVjdCAqb2JqLCB2b2lkICoqYWRkcmVzcykKIHsKIAkqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlyZXR1cm4gYWRkcmVzcyAhPSBOVUxMOworCXJldHVybiAqYWRkcmVzcyAhPSBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQyMyw3MSArMTQzNyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGNoYXIgY2FzdF9kb2NbXSA9Ci0iY2FzdChjb2JqZWN0LCBjdHlwZSkgLT4gY3R5cGUtaW5zdGFuY2VcblwKLVxuXAotQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGN0eXBlLCBhbmQgY29weSB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlclxuXAotb2YgY29iamVjdCB0byB0aGUgbmV3IGluc3RhbmNlLiAgU2hvdWxkIGJlIHVzZWQgdG8gY2FzdCBvbmUgdHlwZVxuXAotb2YgcG9pbnRlciB0byBhbm90aGVyIHR5cGUgb2YgcG9pbnRlci5cblwKLURvZXNuJ3Qgd29yayBjb3JyZWN0bHkgd2l0aCBjdHlwZXMgaW50ZWdlcnMuXG4iOwotCi1zdGF0aWMgaW50IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKipwb2JqKQotewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0KLQlpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkgewotCQkqcG9iaiA9IGFyZzsKLQkJcmV0dXJuIDE7Ci0JfQotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0KSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKLQkJICAgICYmIChzdHJjaHIoInNQelVaWE8iLCBQeVN0cmluZ19BU19TVFJJTkcoZGljdC0+cHJvdG8pWzBdKSkpIHsKLQkJCS8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkJCSpwb2JqID0gYXJnOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JaWYgKFB5VHlwZV9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYXN0KCkgYXJndW1lbnQgMiBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAotCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYXN0KCkgYXJndW1lbnQgMiBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgYSAlcyIsCi0JCQkgICAgIGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKmNhc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpvYmosICpjdHlwZTsKLQlzdHJ1Y3QgYXJndW1lbnQgYTsKLQlDRGF0YU9iamVjdCAqcmVzdWx0OwotCi0JLyogV2UgY291bGQgYW5kIHNob3VsZCBhbGxvdyBhcnJheSB0eXBlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudAotCSAgIGFsc28sIGJ1dCB3ZSBjYW5ub3QgdXNlIHRoZSBzaW1wbGUgbWVtY3B5IGJlbG93IGZvciB0aGVtLiAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08mOmNhc3QiLCAmb2JqLCAmY2FzdF9jaGVja19wb2ludGVydHlwZSwgJmN0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKC0xID09IENvbnZQYXJhbShvYmosIDEsICZhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjdHlwZSwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoYS5rZWVwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8vIHJlc3VsdC0+Yl9zaXplCi0JLy8gYS5mZmlfdHlwZS0+c2l6ZQotCW1lbWNweShyZXN1bHQtPmJfcHRyLCAmYS52YWx1ZSwKLQkgICAgICAgbWluKHJlc3VsdC0+Yl9zaXplLCAoaW50KWEuZmZpX3R5cGUtPnNpemUpKTsKLQlQeV9YREVDUkVGKGEua2VlcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLX0KLQotCiBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXsiY2FzdCIsIGNhc3QsIE1FVEhfVkFSQVJHUywgY2FzdF9kb2N9LAogI2lmZGVmIENUWVBFU19VTklDT0RFCiAJeyJzZXRfY29udmVyc2lvbl9tb2RlIiwgc2V0X2NvbnZlcnNpb25fbW9kZSwgTUVUSF9WQVJBUkdTLCBzZXRfY29udmVyc2lvbl9tb2RlX2RvY30sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwppbmRleCAzMzZmMjY1Li43YmVmNDEyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCkBAIC00OTksNyArNDk5LDcgQEAKIAlsb25nIHZhbDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKihjaGFyICopcHRyID0gKGNoYXIpU0VUKCooY2hhciAqKXB0ciwgKGNoYXIpdmFsLCBzaXplKTsKKwkqKHNpZ25lZCBjaGFyICopcHRyID0gKHNpZ25lZCBjaGFyKVNFVCgqKHNpZ25lZCBjaGFyICopcHRyLCAoc2lnbmVkIGNoYXIpdmFsLCBzaXplKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNTA3LDcgKzUwNyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYl9nZXQodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWNoYXIgdmFsID0gKihjaGFyICopcHRyOworCXNpZ25lZCBjaGFyIHZhbCA9ICooc2lnbmVkIGNoYXIgKilwdHI7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CkBAIC01MzYsOSArNTM2LDEyIEBACiBoX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAlsb25nIHZhbDsKKwlzaG9ydCB4OwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKHNob3J0ICopcHRyID0gKHNob3J0KVNFVCgqKHNob3J0ICopcHRyLCAoc2hvcnQpdmFsLCBzaXplKTsKKwltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKwl4ID0gU0VUKHgsIChzaG9ydCl2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC01NTAsMjQgKzU1MywyOCBAQAogCXNob3J0IGZpZWxkOwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfMigqKHNob3J0ICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKIAlmaWVsZCA9IFNFVChmaWVsZCwgKHNob3J0KXZhbCwgc2l6ZSk7Ci0JKihzaG9ydCAqKXB0ciA9IFNXQVBfMihmaWVsZCk7CisJZmllbGQgPSBTV0FQXzIoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0Jc2hvcnQgdmFsID0gKihzaG9ydCAqKXB0cjsKKwlzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXNob3J0IHZhbCA9ICooc2hvcnQgKilwdHI7CisJc2hvcnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQXzIodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTU3NywxMCArNTg0LDEyIEBACiBIX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKKwl1bnNpZ25lZCBzaG9ydCB4OwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JKih1bnNpZ25lZCBzaG9ydCAqKXB0ciA9ICh1bnNpZ25lZCBzaG9ydClTRVQoKih1bnNpZ25lZCBzaG9ydCAqKXB0ciwKLQkJCQkJCSAgICAgKHVuc2lnbmVkIHNob3J0KXZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNTkxLDkgKzYwMCwxMSBAQAogCXVuc2lnbmVkIHNob3J0IGZpZWxkOwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JZmllbGQgPSBTV0FQXzIoKih1bnNpZ25lZCBzaG9ydCAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfMihmaWVsZCk7CiAJZmllbGQgPSBTRVQoZmllbGQsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCSoodW5zaWduZWQgc2hvcnQgKilwdHIgPSBTV0FQXzIoZmllbGQpOworCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02MDEsNyArNjEyLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsID0gKih1bnNpZ25lZCBzaG9ydCAqKXB0cjsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNjA5LDcgKzYyMSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIHNob3J0IHZhbCA9ICoodW5zaWduZWQgc2hvcnQgKilwdHI7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQXzIodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTYxOSw5ICs2MzIsMTIgQEAKIGlfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCWxvbmcgdmFsOworCWludCB4OwogCWlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKGludCAqKXB0ciA9IChpbnQpU0VUKCooaW50ICopcHRyLCAoaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCAoaW50KXZhbCwgc2l6ZSk7CisJbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTYzMiw5ICs2NDgsMTEgQEAKIAlpbnQgZmllbGQ7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCWZpZWxkID0gU1dBUF9JTlQoKihpbnQgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisJZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7CiAJZmllbGQgPSBTRVQoZmllbGQsIChpbnQpdmFsLCBzaXplKTsKLQkqKGludCAqKXB0ciA9IFNXQVBfSU5UKGZpZWxkKTsKKwlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02NDIsNyArNjYwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JaW50IHZhbCA9ICooaW50ICopcHRyOworCWludCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNjUwLDcgKzY2OSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWludCB2YWwgPSAqKGludCAqKXB0cjsKKwlpbnQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0lOVCh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwpAQCAtNjg0LDkgKzcwNCwxMiBAQAogSV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIHVuc2lnbmVkIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgaW50IHg7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gIE5VTEw7Ci0JKih1bnNpZ25lZCBpbnQgKilwdHIgPSAodW5zaWduZWQgaW50KVNFVCgqKHVuc2lnbmVkIGludCAqKXB0ciwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC02OTcsOSArNzIwLDEwIEBACiAJdW5zaWduZWQgaW50IGZpZWxkOwogCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuICBOVUxMOwotCWZpZWxkID0gU1dBUF9JTlQoKih1bnNpZ25lZCBpbnQgKilwdHIpOworCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CiAJZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOwotCSoodW5zaWduZWQgaW50ICopcHRyID0gU1dBUF9JTlQoZmllbGQpOworCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKQEAgLTcwNyw3ICs3MzEsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIElfZ2V0KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKilwdHI7CisJdW5zaWduZWQgaW50IHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CkBAIC03MTUsNyArNzQwLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBJX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopcHRyOworCXVuc2lnbmVkIGludCB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfSU5UKHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CkBAIC03MjUsOSArNzUxLDEyIEBACiBsX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAlsb25nIHZhbDsKKwlsb25nIHg7CiAJaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSoobG9uZyAqKXB0ciA9IChsb25nKVNFVCgqKGxvbmcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03MzgsOSArNzY3LDExIEBACiAJbG9uZyBmaWVsZDsKIAlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0xPTkcoKihsb25nICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKIAlmaWVsZCA9IChsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKGxvbmcgKilwdHIgPSBTV0FQX0xPTkcoZmllbGQpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03NDgsNyArNzc5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JbG9uZyB2YWwgPSAqKGxvbmcgKilwdHI7CisJbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQpAQCAtNzU2LDcgKzc4OCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCWxvbmcgdmFsID0gKihsb25nICopcHRyOworCWxvbmcgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0xPTkcodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKQEAgLTc2Niw5ICs3OTksMTIgQEAKIExfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgeDsKIAlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiAgTlVMTDsKLQkqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSAodW5zaWduZWQgbG9uZylTRVQoKih1bnNpZ25lZCBsb25nICopcHRyLCB2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtNzc5LDkgKzgxNSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmllbGQ7CiAJaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gIE5VTEw7Ci0JZmllbGQgPSBTV0FQX0xPTkcoKih1bnNpZ25lZCBsb25nICopcHRyKTsKKwltZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKIAlmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKHVuc2lnbmVkIGxvbmcgKilwdHIgPSBTV0FQX0xPTkcoZmllbGQpOworCWZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKwltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC03ODksNyArODI3LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSAqKHVuc2lnbmVkIGxvbmcgKilwdHI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQpAQCAtNzk3LDcgKzgzNiw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTF9nZXRfc3codm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsID0gKih1bnNpZ25lZCBsb25nICopcHRyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKIAl2YWwgPSBTV0FQX0xPTkcodmFsKTsKIAlHRVRfQklURklFTEQodmFsLCBzaXplKTsKIAlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKQEAgLTgwOCw5ICs4NDgsMTIgQEAKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKQogewogCVBZX0xPTkdfTE9ORyB2YWw7CisJUFlfTE9OR19MT05HIHg7CiAJaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQkqKFBZX0xPTkdfTE9ORyAqKXB0ciA9IChQWV9MT05HX0xPTkcpU0VUKCooUFlfTE9OR19MT05HICopcHRyLCB2YWwsIHNpemUpOworCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKKwltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKIAlfUkVUKHZhbHVlKTsKIH0KIApAQCAtODIxLDE2ICs4NjQsMTkgQEAKIAlQWV9MT05HX0xPTkcgZmllbGQ7CiAJaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfOCgqKFBZX0xPTkdfTE9ORyAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CiAJZmllbGQgPSAoUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKFBZX0xPTkdfTE9ORyAqKXB0ciA9IFNXQVBfOChmaWVsZCk7CisJZmllbGQgPSBTV0FQXzgoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbCA9ICooUFlfTE9OR19MT05HICopcHRyOworCVBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CiB9CkBAIC04MzgsNyArODg0LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBxX2dldF9zdyh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbCA9ICooUFlfTE9OR19MT05HICopcHRyOworCVBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCXZhbCA9IFNXQVBfOCh2YWwpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbCk7CkBAIC04NDgsOSArODk1LDEyIEBACiBRX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgdW5zaWduZWQgc2l6ZSkKIHsKIAl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwogCWlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCiAJCXJldHVybiBOVUxMOwotCSoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylTRVQoKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHIsIHZhbCwgc2l6ZSk7CisJbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisJeCA9IFNFVCh4LCB2YWwsIHNpemUpOworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCkBAIC04NjEsMTYgKzkxMSwxOSBAQAogCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKIAlpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKLQlmaWVsZCA9IFNXQVBfOCgqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0cik7CisJbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKwlmaWVsZCA9IFNXQVBfOChmaWVsZCk7CiAJZmllbGQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQkqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKXB0ciA9IFNXQVBfOChmaWVsZCk7CisJZmllbGQgPSBTV0FQXzgoZmllbGQpOworCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBRX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbCA9ICoodW5zaWduZWQgUFlfTE9OR19MT05HICopcHRyOworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisJbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwogCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwogCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKIH0KQEAgLTg3OCw3ICs5MzEsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFFfZ2V0X3N3KHZvaWQgKnB0ciwgdW5zaWduZWQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsID0gKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilwdHI7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CiAJdmFsID0gU1dBUF84KHZhbCk7CiAJR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CiAJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOwpAQCAtOTAzLDE0ICs5NTcsMTYgQEAKIAkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JKihkb3VibGUgKilwdHIgPSB4OworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoZG91YmxlKSk7CiAJX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkX2dldCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgqKGRvdWJsZSAqKXB0cik7CisJZG91YmxlIHZhbDsKKwltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtOTU3LDE0ICsxMDEzLDE2IEBACiAJCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCSooZmxvYXQgKilwdHIgPSB4OworCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwogCV9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXQodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplKQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKihmbG9hdCAqKXB0cik7CisJZmxvYXQgdmFsOworCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzE3LDYgKzEzNzUsNyBAQAogCQlpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAogCQkJCQkgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgewogCQkJUHlfREVDUkVGKHZhbHVlKTsKKwkJCVB5X0RFQ1JFRihrZWVwKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCVB5X0RFQ1JFRih2YWx1ZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmggYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKaW5kZXggMTc5ZGNmMS4uNzk4ODU5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaApAQCAtMiwxNSArMiw2IEBACiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQogdHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKLSNkZWZpbmUgbGVuZnVuYyBpbnF1aXJ5Ci0jZGVmaW5lIHJlYWRidWZmZXJwcm9jIGdldHJlYWRidWZmZXJwcm9jCi0jZGVmaW5lIHdyaXRlYnVmZmVycHJvYyBnZXR3cml0ZWJ1ZmZlcnByb2MKLSNkZWZpbmUgc2VnY291bnRwcm9jIGdldHNlZ2NvdW50cHJvYwotI2RlZmluZSBjaGFyYnVmZmVycHJvYyBnZXRjaGFyYnVmZmVycHJvYwotI2RlZmluZSBzc2l6ZWFyZ2Z1bmMgaW50YXJnZnVuYwotI2RlZmluZSBzc2l6ZXNzaXplYXJnZnVuYyBpbnRpbnRhcmdmdW5jCi0jZGVmaW5lIHNzaXplb2JqYXJncHJvYyBpbnRvYmphcmdwcm9jCi0jZGVmaW5lIHNzaXplc3NpemVvYmphcmdwcm9jIGludGludG9iamFyZ3Byb2MKICNlbmRpZgogCiAjaWZuZGVmIE1TX1dJTjMyCkBAIC0zMCw4ICsyMSw5IEBACiAjZGVmaW5lIFBZX0xPTkdfTE9ORyBMT05HX0xPTkcKICNlbmRpZgogCi10eXBlZGVmIGludCAoKlRIVU5LKSh2b2lkKTsKIHR5cGVkZWYgc3RydWN0IHRhZ0NEYXRhT2JqZWN0IENEYXRhT2JqZWN0OwordHlwZWRlZiBQeU9iamVjdCAqKCogR0VURlVOQykodm9pZCAqLCB1bnNpZ25lZCBzaXplKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqIFNFVEZVTkMpKHZvaWQgKiwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKTsKIAogLyogQSBkZWZhdWx0IGJ1ZmZlciBpbiBDRGF0YU9iamVjdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHNtYWxsIEMgdHlwZXMuICBJZgogdGhpcyBidWZmZXIgaXMgdG9vIHNtYWxsLCBQeU1lbV9NYWxsb2Mgd2lsbCBiZSBjYWxsZWQgdG8gY3JlYXRlIGEgbGFyZ2VyIG9uZSwKQEAgLTcyLDYgKzY0LDE2IEBACiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7CisJZmZpX2Nsb3N1cmUgKnBjbDsgLyogdGhlIEMgY2FsbGFibGUgKi8KKwlmZmlfY2lmIGNpZjsKKwlQeU9iamVjdCAqY29udmVydGVyczsKKwlQeU9iamVjdCAqY2FsbGFibGU7CisJU0VURlVOQyBzZXRmdW5jOworCWZmaV90eXBlICpyZXN0eXBlOworCWZmaV90eXBlICphdHlwZXNbMF07Cit9IGZmaV9pbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CiAJLyogRmlyc3QgcGFydCBpZGVudGljYWwgdG8gdGFnQ0RhdGFPYmplY3QgKi8KIAlQeU9iamVjdF9IRUFECiAJY2hhciAqYl9wdHI7CQkvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLwpAQCAtODUsNyArODcsNyBAQAogCXVuaW9uIHZhbHVlIGJfdmFsdWU7CiAJLyogZW5kIG9mIHRhZ0NEYXRhT2JqZWN0LCBhZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KIAotCVRIVU5LIHRodW5rOworCWZmaV9pbmZvICp0aHVuazsKIAlQeU9iamVjdCAqY2FsbGFibGU7CiAKIAkvKiBUaGVzZSB0d28gZmllbGRzIHdpbGwgb3ZlcnJpZGUgdGhlIG9uZXMgaW4gdGhlIHR5cGUncyBzdGdkaWN0IGlmCkBAIC0xNTQsMTcgKzE1NiwxMiBAQAogCiBleHRlcm4gdm9pZCBpbml0X2NhbGxiYWNrc19pbl9tb2R1bGUoUHlPYmplY3QgKm0pOwogCi1leHRlcm4gVEhVTksgQWxsb2NGdW5jdGlvbkNhbGxiYWNrKFB5T2JqZWN0ICpjYWxsYWJsZSwKLQkJCQkgICBQeU9iamVjdCAqY29udmVydGVycywKLQkJCQkgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJCQkgICBpbnQgc3RkY2FsbCk7Ci1leHRlcm4gdm9pZCBGcmVlQ2FsbGJhY2soVEhVTkspOwotCiBleHRlcm4gUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXTsKIAotdHlwZWRlZiBQeU9iamVjdCAqKCogR0VURlVOQykodm9pZCAqLCB1bnNpZ25lZCBzaXplKTsKLXR5cGVkZWYgUHlPYmplY3QgKigqIFNFVEZVTkMpKHZvaWQgKiwgUHlPYmplY3QgKnZhbHVlLCB1bnNpZ25lZCBzaXplKTsKLQorZXh0ZXJuIGZmaV9pbmZvICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAorCQkJCSAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKwkJCQkgICAgICAgUHlPYmplY3QgKnJlc3R5cGUsCisJCQkJICAgICAgIGludCBzdGRjYWxsKTsKIC8qIGEgdGFibGUgZW50cnkgZGVzY3JpYmluZyBhIHByZWRlZmluZWQgY3R5cGVzIHR5cGUgKi8KIHN0cnVjdCBmaWVsZGRlc2MgewogCWNoYXIgY29kZTsKQEAgLTIwMSw3ICsxOTgsNyBAQAogCVB5X3NzaXplX3Qgc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzICovCiAJUHlfc3NpemVfdCBhbGlnbjsJLyogYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwogCVB5X3NzaXplX3QgbGVuZ3RoOwkvKiBudW1iZXIgb2YgZmllbGRzICovCi0JZmZpX3R5cGUgZmZpX3R5cGU7CisJZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKIAlQeU9iamVjdCAqcHJvdG87CS8qIE9ubHkgZm9yIFBvaW50ZXIvQXJyYXlPYmplY3QgKi8KIAlTRVRGVU5DIHNldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCiAJR0VURlVOQyBnZXRmdW5jOwkvKiBPbmx5IGZvciBzaW1wbGUgb2JqZWN0cyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQppbmRleCAwOTkxYjYzLi5jMWU1Y2Q0IDEwMDc1NQotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQpAQCAtMzQ5MCw2ICszNDkwLDcgQEAKIGkqODYtKi1iZW9zKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotZnJlZWJzZCogfCBpKjg2LSota2ZyZWVic2QqLWdudSkgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotbmV0YnNkZWxmKiB8IGkqODYtKi1rbmV0YnNkKi1nbnUpIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OworaSo4Ni0qLW9wZW5ic2QqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1ydGVtcyopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXdpbjMyKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotY3lnd2luKikgVEFSR0VUPVg4Nl9XSU4zMjsgVEFSR0VURElSPXg4Njs7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCmluZGV4IDc2YmYxNmUuLmM3ZjA1ZDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCkBAIC0yOCw2ICsyOCw3IEBACiBpKjg2LSotYmVvcyopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWZyZWVic2QqIHwgaSo4Ni0qLWtmcmVlYnNkKi1nbnUpIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLW5ldGJzZGVsZiogfCBpKjg2LSota25ldGJzZCotZ251KSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKK2kqODYtKi1vcGVuYnNkKikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotcnRlbXMqKSBUQVJHRVQ9WDg2OyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi13aW4zMiopIFRBUkdFVD1YODZfV0lOMzI7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWN5Z3dpbiopIFRBUkdFVD1YODZfV0lOMzI7IFRBUkdFVERJUj14ODY7OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCmluZGV4IDc5NTk4MzguLjZkOWEzNjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKQEAgLTI0Niw3ICsyNDYsNyBAQAogLyogRU5EKGZmaV9jbG9zdXJlX0FTTSkgICovCiAKIC5kYXRhCi0uc2VjdGlvbiBfX1RFWFQsX19laF9mcmFtZSxjb2FsZXNjZWQsbm9fdG9jK3N0cmlwX3N0YXRpY19zeW1zK2xpdmVfc3VwcG9ydAorLnNlY3Rpb24gX19URVhULF9fZWhfZnJhbWUsY29hbGVzY2VkLG5vX3RvYytzdHJpcF9zdGF0aWNfc3ltcwogRUhfZnJhbWUxOgogCS5zZXQJTCRzZXQkMCxMRUNJRTEtTFNDSUUxCiAJLmxvbmcJTCRzZXQkMAk7IExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmkuYwppbmRleCBlNGQ1ZmMzLi43Zjc5MmI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQogICAgIHsKICAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6Ci0jaWZuZGVmIFg4Nl9XSU4zMgorI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgogI2VuZGlmCiAgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7CiAgICAgICBicmVhazsKIAotI2lmZGVmIFg4Nl9XSU4zMgorI2lmIGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgogICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKaW5kZXggY2IzZDU5OS4uMzM2YmUzNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCkBAIC0zOCw3ICszOCw3IEBACiBTdGdEaWN0X2RlYWxsb2MoU3RnRGljdE9iamVjdCAqc2VsZikKIHsKIAlTdGdEaWN0X2NsZWFyKHNlbGYpOwotCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGUuZWxlbWVudHMpOworCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CiAJUHlEaWN0X1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIApAQCAtNDksOCArNDksOCBAQAogCWludCBzaXplOwogCiAJU3RnRGljdF9jbGVhcihkc3QpOwotCVB5TWVtX0ZyZWUoZHN0LT5mZmlfdHlwZS5lbGVtZW50cyk7Ci0JZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IE5VTEw7CisJUHlNZW1fRnJlZShkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOworCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IE5VTEw7CiAKIAlkID0gKGNoYXIgKilkc3Q7CiAJcyA9IChjaGFyICopc3JjOwpAQCAtNjQsMTMgKzY0LDE1IEBACiAJUHlfWElOQ1JFRihkc3QtPnJlc3R5cGUpOwogCVB5X1hJTkNSRUYoZHN0LT5jaGVja2VyKTsKIAotCWlmIChzcmMtPmZmaV90eXBlLmVsZW1lbnRzID09IE5VTEwpCisJaWYgKHNyYy0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAlzaXplID0gc2l6ZW9mKGZmaV90eXBlICopICogKHNyYy0+bGVuZ3RoICsgMSk7Ci0JZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQlpZiAoZHN0LT5mZmlfdHlwZS5lbGVtZW50cyA9PSBOVUxMKQorCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKKwlpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpCiAJCXJldHVybiAtMTsKLQltZW1jcHkoZHN0LT5mZmlfdHlwZS5lbGVtZW50cywgc3JjLT5mZmlfdHlwZS5lbGVtZW50cywgc2l6ZSk7CisJbWVtY3B5KGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKwkgICAgICAgc3JjLT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorCSAgICAgICBzaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM0LDggKzIzNiw4IEBACiAJICAgc3R1ZmYgaXMgc3VjZXNzZnVsbHkgZmluaXNoZWQuICovCiAJc3RnZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CS8qIHNldCBmaW5hbCAqLwogCi0JaWYgKHN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzKQotCQlQeU1lbV9GcmVlKHN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzKTsKKwlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cykKKwkJUHlNZW1fRnJlZShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKIAogCWJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYmFzZSk7CiAJaWYgKGJhc2VkaWN0ICYmICF1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzKSB7CkBAIC0yNDMsMTAgKzI0NSwxMiBAQAogCQlhbGlnbiA9IGJhc2VkaWN0LT5hbGlnbjsKIAkJdW5pb25fc2l6ZSA9IDA7CiAJCXRvdGFsX2FsaWduID0gYWxpZ24gPyBhbGlnbiA6IDE7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIDAsIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQltZW1jcHkoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIGJhc2VkaWN0LT5mZmlfdHlwZS5lbGVtZW50cywKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKwkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworCQltZW1jcHkoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywKKwkJICAgICAgIGJhc2VkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAogCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGgpKTsKIAkJZmZpX29mcyA9IGJhc2VkaWN0LT5sZW5ndGg7CiAJfSBlbHNlIHsKQEAgLTI1NSw5ICsyNTksMTAgQEAKIAkJYWxpZ24gPSAwOwogCQl1bmlvbl9zaXplID0gMDsKIAkJdG90YWxfYWxpZ24gPSAxOwotCQlzdGdkaWN0LT5mZmlfdHlwZS50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotCQlzdGdkaWN0LT5mZmlfdHlwZS5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOwotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGUuZWxlbWVudHMsIDAsIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisJCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAobGVuICsgMSkpOworCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKwkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CiAJCWZmaV9vZnMgPSAwOwogCX0KIApAQCAtMjgzLDEwICsyODgsMTAgQEAKIAkJCQkgICAgIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCXN0Z2RpY3QtPmZmaV90eXBlLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZTsKKwkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50c1tmZmlfb2ZzICsgaV0gPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKIAkJZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIG1hcmsgZmllbGQgdHlwZSBmaW5hbCAqLwogCQlpZiAoUHlUdXBsZV9TaXplKHBhaXIpID09IDMpIHsgLyogYml0cyBzcGVjaWZpZWQgKi8KLQkJCXN3aXRjaChkaWN0LT5mZmlfdHlwZS50eXBlKSB7CisJCQlzd2l0Y2goZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlKSB7CiAJCQljYXNlIEZGSV9UWVBFX1VJTlQ4OgogCQkJY2FzZSBGRklfVFlQRV9VSU5UMTY6CiAJCQljYXNlIEZGSV9UWVBFX1VJTlQzMjoKQEAgLTM1Nyw4ICszNjIsOCBAQAogCS8qIEFkanVzdCB0aGUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KIAlzaXplID0gKChzaXplICsgdG90YWxfYWxpZ24gLSAxKSAvIHRvdGFsX2FsaWduKSAqIHRvdGFsX2FsaWduOwogCi0Jc3RnZGljdC0+ZmZpX3R5cGUuYWxpZ25tZW50ID0gdG90YWxfYWxpZ247Ci0Jc3RnZGljdC0+ZmZpX3R5cGUuc2l6ZSA9IHNpemU7CisJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5hbGlnbm1lbnQgPSB0b3RhbF9hbGlnbjsKKwlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPSBzaXplOwogCiAJc3RnZGljdC0+c2l6ZSA9IHNpemU7CiAJc3RnZGljdC0+YWxpZ24gPSB0b3RhbF9hbGlnbjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hvdHNob3QuYyBiL01vZHVsZXMvX2hvdHNob3QuYwppbmRleCBkNWI0Y2RlLi4yZWU0ZWI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ob3RzaG90LmMKKysrIGIvTW9kdWxlcy9faG90c2hvdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCiAjZXJyb3IgIlRoaXMgbW9kdWxlIHJlcXVpcmVzIGdldHRpbWVvZmRheSgpIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcyEiCiAjZW5kaWYKLSNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpCisjaWYgKGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpKSB8fCBkZWZpbmVkKF9fUU5YX18pCiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbHNlCiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICBpZiAoKGVyciA9IHVucGFja19wYWNrZWRfaW50KHNlbGYsICZsZW4sIDApKSkKICAgICAgICAgcmV0dXJuIGVycjsKIAotICAgIGJ1ZiA9IG1hbGxvYyhsZW4pOworICAgIGJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7CiAgICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBjaCA9IGZnZXRjKHNlbGYtPmxvZ2ZwKTsKIAlidWZbaV0gPSBjaDsKQEAgLTkxOCw3ICs5MTgsNyBAQAogI2VuZGlmCiAgICAgfQogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChQWU9TX09TMikgfHwgXAotICAgIGRlZmluZWQoX19WTVMpCisgICAgZGVmaW5lZChfX1ZNUykgfHwgZGVmaW5lZCAoX19RTlhfXykKICAgICBydXNhZ2VfZGlmZiA9IC0xOwogI2Vsc2UKICAgICB7CkBAIC0xNDAzLDcgKzE0MDMsNyBAQAogICAgICAgICArK3JldjsKICAgICB3aGlsZSAocmV2W2ldICE9ICcgJyAmJiByZXZbaV0gIT0gJ1wwJykKICAgICAgICAgKytpOwotICAgIGJ1ZmZlciA9IG1hbGxvYyhpICsgMSk7CisgICAgYnVmZmVyID0gKGNoYXIgKiltYWxsb2MoaSArIDEpOwogICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcmV2LCBpKTsKICAgICAgICAgYnVmZmVyW2ldID0gJ1wwJzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xzcHJvZi5jIGIvTW9kdWxlcy9fbHNwcm9mLmMKaW5kZXggMTdjNzFlOS4uZDY2NWY4MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbHNwcm9mLmMKKysrIGIvTW9kdWxlcy9fbHNwcm9mLmMKQEAgLTUxNSw2ICs1MTUsNyBAQAogCTUKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0YXRzRW50cnlUeXBlOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0c1N1YkVudHJ5VHlwZTsKIApAQCAtODU3LDggKzg1OCwxMiBAQAogCQlyZXR1cm47CiAJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlByb2ZpbGVyIiwgKFB5T2JqZWN0ICopJlB5UHJvZmlsZXJfVHlwZSk7CiAKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzU3ViRW50cnlUeXBlLCAmcHJvZmlsZXJfc3ViZW50cnlfZGVzYyk7CisJaWYgKCFpbml0aWFsaXplZCkgeworCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgCisJCQkJCSAgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOworCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c1N1YkVudHJ5VHlwZSwgCisJCQkJCSAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOworCX0KIAlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKIAlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLApAQCAtODY2LDQgKzg3MSw1IEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgInByb2ZpbGVyX3N1YmVudHJ5IiwKIAkJCSAgIChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSk7CiAJZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuYyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmRlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuYwpAQCAtMCwwICsxLDQwIEBACisvKiBhZGFwdGVycy5jIC0gZGVmYXVsdCBhZGFwdGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImFkYXB0ZXJzLmgiCisKKy8qIGR1bW15LCB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF0ZXIgdmVyc2lvbiAqLworCitQeU9iamVjdCogYWRhcHRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogYWRhcHRfZGF0ZXRpbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlODQ3OQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGFkYXB0ZXJzLmggLSBkZWZhdWx0IGFkYXB0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQURBUFRFUlNfSAorI2RlZmluZSBQWVNRTElURV9BREFQVEVSU19ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNpbmNsdWRlICJzcWxpdGUzLmgiCisKK1B5T2JqZWN0KiBhZGFwdF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CitQeU9iamVjdCogYWRhcHRfZGF0ZXRpbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYwpAQCAtMCwwICsxLDM2MiBAQAorLyogY2FjaGUgLmMgLSBhIExSVSBjYWNoZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLworTm9kZSogbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpCit7CisgICAgTm9kZSogbm9kZTsKKworICAgIG5vZGUgPSAoTm9kZSopIChOb2RlVHlwZS50cF9hbGxvYygmTm9kZVR5cGUsIDApKTsKKyAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgbm9kZS0+a2V5ID0ga2V5OworCisgICAgUHlfSU5DUkVGKGRhdGEpOworICAgIG5vZGUtPmRhdGEgPSBkYXRhOworCisgICAgbm9kZS0+cHJldiA9IE5VTEw7CisgICAgbm9kZS0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKwordm9pZCBub2RlX2RlYWxsb2MoTm9kZSogc2VsZikKK3sKKyAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKKyAgICBQeV9ERUNSRUYoc2VsZi0+ZGF0YSk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK2ludCBjYWNoZV9pbml0KENhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogZmFjdG9yeTsKKyAgICBpbnQgc2l6ZSA9IDEwOworCisgICAgc2VsZi0+ZmFjdG9yeSA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIGlmIChzaXplIDwgNSkgeworICAgICAgICBzaXplID0gNTsKKyAgICB9CisgICAgc2VsZi0+c2l6ZSA9IHNpemU7CisgICAgc2VsZi0+Zmlyc3QgPSBOVUxMOworICAgIHNlbGYtPmxhc3QgPSBOVUxMOworCisgICAgc2VsZi0+bWFwcGluZyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXNlbGYtPm1hcHBpbmcpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihmYWN0b3J5KTsKKyAgICBzZWxmLT5mYWN0b3J5ID0gZmFjdG9yeTsKKworICAgIHNlbGYtPmRlY3JlZl9mYWN0b3J5ID0gMTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGNhY2hlX2RlYWxsb2MoQ2FjaGUqIHNlbGYpCit7CisgICAgTm9kZSogbm9kZTsKKyAgICBOb2RlKiBkZWxldGVfbm9kZTsKKworICAgIGlmICghc2VsZi0+ZmFjdG9yeSkgeworICAgICAgICAvKiBjb25zdHJ1Y3RvciBmYWlsZWQsIGp1c3QgZ2V0IG91dCBvZiBoZXJlICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub2RlID0gc2VsZi0+Zmlyc3Q7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgZGVsZXRlX25vZGUgPSBub2RlOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgUHlfREVDUkVGKGRlbGV0ZV9ub2RlKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+ZGVjcmVmX2ZhY3RvcnkpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmZhY3RvcnkpOworICAgIH0KKyAgICBQeV9ERUNSRUYoc2VsZi0+bWFwcGluZyk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK1B5T2JqZWN0KiBjYWNoZV9nZXQoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiBrZXkgPSBhcmdzOworICAgIE5vZGUqIG5vZGU7CisgICAgTm9kZSogcHRyOworICAgIFB5T2JqZWN0KiBkYXRhOworCisgICAgbm9kZSA9IChOb2RlKilQeURpY3RfR2V0SXRlbShzZWxmLT5tYXBwaW5nLCBrZXkpOworICAgIGlmIChub2RlKSB7CisgICAgICAgIG5vZGUtPmNvdW50Kys7CisgICAgICAgIGlmIChub2RlLT5wcmV2ICYmIG5vZGUtPmNvdW50ID4gbm9kZS0+cHJldi0+Y291bnQpIHsKKyAgICAgICAgICAgIHB0ciA9IG5vZGUtPnByZXY7CisKKyAgICAgICAgICAgIHdoaWxlIChwdHItPnByZXYgJiYgbm9kZS0+Y291bnQgPiBwdHItPnByZXYtPmNvdW50KSB7CisgICAgICAgICAgICAgICAgcHRyID0gcHRyLT5wcmV2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobm9kZS0+bmV4dCkgeworICAgICAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5sYXN0ID0gbm9kZS0+cHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2RlLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgcHRyLT5wcmV2LT5uZXh0ID0gbm9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub2RlLT5uZXh0ID0gcHRyOworICAgICAgICAgICAgbm9kZS0+cHJldiA9IHB0ci0+cHJldjsKKyAgICAgICAgICAgIGlmICghbm9kZS0+cHJldikgeworICAgICAgICAgICAgICAgIHNlbGYtPmZpcnN0ID0gbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0ci0+cHJldiA9IG5vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgeworICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi0+bGFzdDsKKworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5tYXBwaW5nLCBzZWxmLT5sYXN0LT5rZXkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5vZGUtPnByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlLT5wcmV2OworICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOworCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5mYWN0b3J5LCAiTyIsIGtleSk7CisKKyAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUgPSBuZXdfbm9kZShrZXksIGRhdGEpOworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG5vZGUtPnByZXYgPSBzZWxmLT5sYXN0OworCisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWFwcGluZywga2V5LCAoUHlPYmplY3QqKW5vZGUpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihub2RlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKKyAgICAgICAgICAgIHNlbGYtPmxhc3QtPm5leHQgPSBub2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi0+Zmlyc3QgPSBub2RlOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmxhc3QgPSBub2RlOworICAgIH0KKworICAgIFB5X0lOQ1JFRihub2RlLT5kYXRhKTsKKyAgICByZXR1cm4gbm9kZS0+ZGF0YTsKK30KKworUHlPYmplY3QqIGNhY2hlX2Rpc3BsYXkoQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIE5vZGUqIHB0cjsKKyAgICBQeU9iamVjdCogcHJldmtleTsKKyAgICBQeU9iamVjdCogbmV4dGtleTsKKyAgICBQeU9iamVjdCogZm10X2FyZ3M7CisgICAgUHlPYmplY3QqIHRlbXBsYXRlOworICAgIFB5T2JqZWN0KiBkaXNwbGF5X3N0cjsKKworICAgIHB0ciA9IHNlbGYtPmZpcnN0OworCisgICAgd2hpbGUgKHB0cikgeworICAgICAgICBpZiAocHRyLT5wcmV2KSB7CisgICAgICAgICAgICBwcmV2a2V5ID0gcHRyLT5wcmV2LT5rZXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2a2V5ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYocHJldmtleSk7CisKKyAgICAgICAgaWYgKHB0ci0+bmV4dCkgeworICAgICAgICAgICAgbmV4dGtleSA9IHB0ci0+bmV4dC0+a2V5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV4dGtleSA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG5leHRrZXkpOworCisgICAgICAgIGZtdF9hcmdzID0gUHlfQnVpbGRWYWx1ZSgiT09PIiwgcHJldmtleSwgcHRyLT5rZXksIG5leHRrZXkpOworICAgICAgICBpZiAoIWZtdF9hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiVzIDwtICVzIC0+JXNcbiIpOworICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkaXNwbGF5X3N0ciA9IFB5U3RyaW5nX0Zvcm1hdCh0ZW1wbGF0ZSwgZm10X2FyZ3MpOworICAgICAgICBQeV9ERUNSRUYodGVtcGxhdGUpOworICAgICAgICBQeV9ERUNSRUYoZm10X2FyZ3MpOworICAgICAgICBpZiAoIWRpc3BsYXlfc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeU9iamVjdF9QcmludChkaXNwbGF5X3N0ciwgc3Rkb3V0LCBQeV9QUklOVF9SQVcpOworICAgICAgICBQeV9ERUNSRUYoZGlzcGxheV9zdHIpOworCisgICAgICAgIFB5X0RFQ1JFRihwcmV2a2V5KTsKKyAgICAgICAgUHlfREVDUkVGKG5leHRrZXkpOworCisgICAgICAgIHB0ciA9IHB0ci0+bmV4dDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBjYWNoZV9tZXRob2RzW10gPSB7CisgICAgeyJnZXQiLCAoUHlDRnVuY3Rpb24pY2FjaGVfZ2V0LCBNRVRIX08sCisgICAgICAgIFB5RG9jX1NUUigiR2V0cyBhbiBlbnRyeSBmcm9tIHRoZSBjYWNoZS4iKX0sCisgICAgeyJkaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKWNhY2hlX2Rpc3BsYXksIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZvciBkZWJ1Z2dpbmcgb25seS4iKX0sCisgICAge05VTEwsIE5VTEx9Cit9OworCitQeVR5cGVPYmplY3QgTm9kZVR5cGUgPSB7CisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgICAgIE1PRFVMRV9OQU1FICJOb2RlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgICAgc2l6ZW9mKE5vZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAgIChkZXN0cnVjdG9yKW5vZGVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgICAgKGluaXRwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworfTsKKworUHlUeXBlT2JqZWN0IENhY2hlVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5DYWNoZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoQ2FjaGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpY2FjaGVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIGNhY2hlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpY2FjaGVfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IGNhY2hlX3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgaW50IHJjOworCisgICAgTm9kZVR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgQ2FjaGVUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworCisgICAgcmMgPSBQeVR5cGVfUmVhZHkoJk5vZGVUeXBlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IFB5VHlwZV9SZWFkeSgmQ2FjaGVUeXBlKTsKKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaCBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzE2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaApAQCAtMCwwICsxLDYxIEBACisvKiBjYWNoZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBMUlUgY2FjaGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NBQ0hFX0gKKyNkZWZpbmUgUFlTUUxJVEVfQ0FDSEVfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCit0eXBlZGVmIHN0cnVjdCBfTm9kZQoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCoga2V5OworICAgIFB5T2JqZWN0KiBkYXRhOworICAgIGxvbmcgY291bnQ7CisgICAgc3RydWN0IF9Ob2RlKiBwcmV2OworICAgIHN0cnVjdCBfTm9kZSogbmV4dDsKK30gTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IHNpemU7CisgICAgUHlPYmplY3QqIG1hcHBpbmc7CisgICAgUHlPYmplY3QqIGZhY3Rvcnk7CisgICAgTm9kZSogZmlyc3Q7CisgICAgTm9kZSogbGFzdDsKKyAgICBpbnQgZGVjcmVmX2ZhY3Rvcnk7Cit9IENhY2hlOworCitleHRlcm4gUHlUeXBlT2JqZWN0IE5vZGVUeXBlOworZXh0ZXJuIFB5VHlwZU9iamVjdCBDYWNoZVR5cGU7CisKK2ludCBub2RlX2luaXQoTm9kZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwordm9pZCBub2RlX2RlYWxsb2MoTm9kZSogc2VsZik7CisKK2ludCBjYWNoZV9pbml0KENhY2hlKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Cit2b2lkIGNhY2hlX2RlYWxsb2MoQ2FjaGUqIHNlbGYpOworUHlPYmplY3QqIGNhY2hlX2dldChDYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworCitpbnQgY2FjaGVfc2V0dXBfdHlwZXModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYWQzNwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKQEAgLTAsMCArMSwxMDgyIEBACisvKiBjb25uZWN0aW9uLmMgLSB0aGUgY29ubmVjdGlvbiB0eXBlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICogCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInNxbGl0ZWNvbXBhdC5oIgorCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKworc3RhdGljIGludCBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCk7CisKK2ludCBjb25uZWN0aW9uX2luaXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhYmFzZSIsICJ0aW1lb3V0IiwgImRldGVjdF90eXBlcyIsICJpc29sYXRpb25fbGV2ZWwiLCAiY2hlY2tfc2FtZV90aHJlYWQiLCAiZmFjdG9yeSIsICJjYWNoZWRfc3RhdGVtZW50cyIsIE5VTEwsIE5VTEx9OworCisgICAgY2hhciogZGF0YWJhc2U7CisgICAgaW50IGRldGVjdF90eXBlcyA9IDA7CisgICAgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCA9IE5VTEw7CisgICAgUHlPYmplY3QqIGZhY3RvcnkgPSBOVUxMOworICAgIGludCBjaGVja19zYW1lX3RocmVhZCA9IDE7CisgICAgaW50IGNhY2hlZF9zdGF0ZW1lbnRzID0gMTAwOworICAgIGRvdWJsZSB0aW1lb3V0ID0gNS4wOworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8ZGlPaU9pIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhYmFzZSwgJnRpbWVvdXQsICZkZXRlY3RfdHlwZXMsICZpc29sYXRpb25fbGV2ZWwsICZjaGVja19zYW1lX3RocmVhZCwgJmZhY3RvcnksICZjYWNoZWRfc3RhdGVtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CisKKyAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSBOVUxMOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPnJvd19mYWN0b3J5ID0gUHlfTm9uZTsKKworICAgIFB5X0lOQ1JFRigmUHlVbmljb2RlX1R5cGUpOworICAgIHNlbGYtPnRleHRfZmFjdG9yeSA9IChQeU9iamVjdCopJlB5VW5pY29kZV9UeXBlOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gc3FsaXRlM19vcGVuKGRhdGFiYXNlLCAmc2VsZi0+ZGIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWlzb2xhdGlvbl9sZXZlbCkgeworICAgICAgICBpc29sYXRpb25fbGV2ZWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsKKyAgICB9CisgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gTlVMTDsKKyAgICBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoc2VsZiwgaXNvbGF0aW9uX2xldmVsKTsKKyAgICBQeV9ERUNSRUYoaXNvbGF0aW9uX2xldmVsKTsKKworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IChDYWNoZSopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJkNhY2hlVHlwZSwgIk9pIiwgc2VsZiwgY2FjaGVkX3N0YXRlbWVudHMpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBCeSBkZWZhdWx0LCB0aGUgQ2FjaGUgY2xhc3MgSU5DUkVGcyB0aGUgZmFjdG9yeSBpbiBpdHMgaW5pdGlhbGl6ZXIsIGFuZAorICAgICAqIGRlY3JlZnMgaXQgaW4gaXRzIGRlYWxsb2NhdG9yIG1ldGhvZC4gU2luY2UgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhcgorICAgICAqIHJlZmVyZW5jZSBoZXJlLCB3ZSdyZSBicmVha2luZyBpdCBieSBkZWNyZW1lbnRpbmcgc2VsZiwgYW5kIHRlbGxpbmcgdGhlCisgICAgICogY2FjaGUgY2xhc3MgdG8gbm90IGRlY3JlZiB0aGUgZmFjdG9yeSAoc2VsZikgaW4gaXRzIGRlYWxsb2NhdG9yLgorICAgICAqLworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+ZGVjcmVmX2ZhY3RvcnkgPSAwOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKworICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOworICAgIHNlbGYtPmRldGVjdF90eXBlcyA9IGRldGVjdF90eXBlczsKKyAgICBzZWxmLT50aW1lb3V0ID0gdGltZW91dDsKKyAgICAodm9pZClzcWxpdGUzX2J1c3lfdGltZW91dChzZWxmLT5kYiwgKGludCkodGltZW91dCoxMDAwKSk7CisKKyAgICBzZWxmLT50aHJlYWRfaWRlbnQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQgPSBjaGVja19zYW1lX3RocmVhZDsKKworICAgIHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkID0gUHlEaWN0X05ldygpOworICAgIGlmICghc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNlbGYtPmNvbGxhdGlvbnMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFzZWxmLT5jb2xsYXRpb25zKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzZWxmLT5XYXJuaW5nID0gV2FybmluZzsKKyAgICBzZWxmLT5FcnJvciA9IEVycm9yOworICAgIHNlbGYtPkludGVyZmFjZUVycm9yID0gSW50ZXJmYWNlRXJyb3I7CisgICAgc2VsZi0+RGF0YWJhc2VFcnJvciA9IERhdGFiYXNlRXJyb3I7CisgICAgc2VsZi0+RGF0YUVycm9yID0gRGF0YUVycm9yOworICAgIHNlbGYtPk9wZXJhdGlvbmFsRXJyb3IgPSBPcGVyYXRpb25hbEVycm9yOworICAgIHNlbGYtPkludGVncml0eUVycm9yID0gSW50ZWdyaXR5RXJyb3I7CisgICAgc2VsZi0+SW50ZXJuYWxFcnJvciA9IEludGVybmFsRXJyb3I7CisgICAgc2VsZi0+UHJvZ3JhbW1pbmdFcnJvciA9IFByb2dyYW1taW5nRXJyb3I7CisgICAgc2VsZi0+Tm90U3VwcG9ydGVkRXJyb3IgPSBOb3RTdXBwb3J0ZWRFcnJvcjsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZsdXNoX3N0YXRlbWVudF9jYWNoZShDb25uZWN0aW9uKiBzZWxmKQoreworICAgIE5vZGUqIG5vZGU7CisgICAgU3RhdGVtZW50KiBzdGF0ZW1lbnQ7CisKKyAgICBub2RlID0gc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5maXJzdDsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIHN0YXRlbWVudCA9IChTdGF0ZW1lbnQqKShub2RlLT5kYXRhKTsKKyAgICAgICAgKHZvaWQpc3RhdGVtZW50X2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOworICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IChDYWNoZSopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJkNhY2hlVHlwZSwgIk8iLCBzZWxmKTsKKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5kZWNyZWZfZmFjdG9yeSA9IDA7Cit9CisKK3ZvaWQgcmVzZXRfYWxsX3N0YXRlbWVudHMoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBOb2RlKiBub2RlOworICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworCisgICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7CisgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzdGF0ZW1lbnQpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3ZvaWQgY29ubmVjdGlvbl9kZWFsbG9jKENvbm5lY3Rpb24qIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRfY2FjaGUpOworCisgICAgLyogQ2xlYW4gdXAgaWYgdXNlciBoYXMgbm90IGNhbGxlZCAuY2xvc2UoKSBleHBsaWNpdGx5LiAqLworICAgIGlmIChzZWxmLT5kYikgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIGlmIChzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iZWdpbl9zdGF0ZW1lbnQpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmlzb2xhdGlvbl9sZXZlbCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT50ZXh0X2ZhY3RvcnkpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CisKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2N1cnNvcihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZhY3RvcnkiLCBOVUxMLCBOVUxMfTsKKyAgICBQeU9iamVjdCogZmFjdG9yeSA9IE5VTEw7CisgICAgUHlPYmplY3QqIGN1cnNvcjsKKworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcnkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYpIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkN1cnNvclR5cGU7CisgICAgfQorCisgICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZhY3RvcnksICJPIiwgc2VsZik7CisKKyAgICBpZiAoY3Vyc29yICYmIHNlbGYtPnJvd19mYWN0b3J5ICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRigoKEN1cnNvciopY3Vyc29yKS0+cm93X2ZhY3RvcnkpOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOworICAgICAgICAoKEN1cnNvciopY3Vyc29yKS0+cm93X2ZhY3RvcnkgPSBzZWxmLT5yb3dfZmFjdG9yeTsKKyAgICB9CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jbG9zZShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmbHVzaF9zdGF0ZW1lbnRfY2FjaGUoc2VsZik7CisKKyAgICBpZiAoc2VsZi0+ZGIpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfY2xvc2Uoc2VsZi0+ZGIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYtPmRiID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworLyoKKyAqIENoZWNrcyBpZiBhIGNvbm5lY3Rpb24gb2JqZWN0IGlzIHVzYWJsZSAoaS4gZS4gbm90IGNsb3NlZCkuCisgKgorICogMCA9PiBlcnJvcjsgMSA9PiBvaworICovCitpbnQgY2hlY2tfY29ubmVjdGlvbihDb25uZWN0aW9uKiBjb24pCit7CisgICAgaWYgKCFjb24tPmRiKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiQ2Fubm90IG9wZXJhdGUgb24gYSBjbG9zZWQgZGF0YWJhc2UuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworUHlPYmplY3QqIF9jb25uZWN0aW9uX2JlZ2luKENvbm5lY3Rpb24qIHNlbGYpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsIHNlbGYtPmJlZ2luX3N0YXRlbWVudCwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmKTsKKyAgICBpZiAocmMgPT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICB9CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0sgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jb21taXQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiQ09NTUlUIiwgLTEsICZzdGF0ZW1lbnQsICZ0YWlsKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICByYyA9IF9zcWxpdGVfc3RlcF93aXRoX2J1c3loYW5kbGVyKHN0YXRlbWVudCwgc2VsZik7CisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfRE9ORSkgeworICAgICAgICAgICAgc2VsZi0+aW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICB9CisKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgfQorCisgICAgfQorCitlcnJvcjoKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKworUHlPYmplY3QqIGNvbm5lY3Rpb25fcm9sbGJhY2soQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgaW50IHJjOworICAgIGNvbnN0IGNoYXIqIHRhaWw7CisgICAgc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQ7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICByZXNldF9hbGxfc3RhdGVtZW50cyhzZWxmKTsKKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLCAiUk9MTEJBQ0siLCAtMSwgJnN0YXRlbWVudCwgJnRhaWwpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3RhdGVtZW50LCBzZWxmKTsKKyAgICAgICAgaWYgKHJjID09IFNRTElURV9ET05FKSB7CisgICAgICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJjID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICB9CisKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCit2b2lkIF9zZXRfcmVzdWx0KHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgUHlPYmplY3QqIHB5X3ZhbCkKK3sKKyAgICBsb25nIGxvbmd2YWw7CisgICAgY29uc3QgY2hhciogYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmbGVuOworICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAvKiBFcnJvcnMgaW4gY2FsbGJhY2tzIGFyZSBpZ25vcmVkLCBhbmQgd2UgcmV0dXJuIE5VTEwgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKKyAgICB9IGVsc2UgaWYgKHB5X3ZhbCA9PSBQeV9Ob25lKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhweV92YWwpKSB7CisgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocHlfdmFsKTsKKyAgICAgICAgLyogVE9ETzogaW52ZXN0aWdhdGUgd2hhdCB0byBkbyB3aXRoIHJhbmdlIG92ZXJmbG93cyAtIGxvbmcgdnMuIGxvbmcgbG9uZyAqLworICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoUFlfTE9OR19MT05HKWxvbmd2YWwpOworICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhweV92YWwpKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2RvdWJsZShjb250ZXh0LCBQeUZsb2F0X0FzRG91YmxlKHB5X3ZhbCkpOworICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgeworICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHB5X3ZhbCwgJmJ1ZmZlciwgJmJ1ZmxlbikgIT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socHlfdmFsKSkgeworICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhweV92YWwpKSB7CisgICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKKyAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRPRE86IHJhaXNlIGVycm9yICovCisgICAgfQorfQorCitQeU9iamVjdCogX2J1aWxkX3B5X3BhcmFtcyhzcWxpdGUzX2NvbnRleHQgKmNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlKiogYXJndikKK3sKKyAgICBQeU9iamVjdCogYXJnczsKKyAgICBpbnQgaTsKKyAgICBzcWxpdGUzX3ZhbHVlKiBjdXJfdmFsdWU7CisgICAgUHlPYmplY3QqIGN1cl9weV92YWx1ZTsKKyAgICBjb25zdCBjaGFyKiB2YWxfc3RyOworICAgIFBZX0xPTkdfTE9ORyB2YWxfaW50OworICAgIFB5X3NzaXplX3QgYnVmbGVuOworICAgIHZvaWQqIHJhd19idWZmZXI7CisKKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoYXJnYyk7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY3VyX3ZhbHVlID0gYXJndltpXTsKKyAgICAgICAgc3dpdGNoIChzcWxpdGUzX3ZhbHVlX3R5cGUoYXJndltpXSkpIHsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgdmFsX2ludCA9IHNxbGl0ZTNfdmFsdWVfaW50NjQoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUludF9Gcm9tTG9uZygobG9uZyl2YWxfaW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShzcWxpdGUzX3ZhbHVlX2RvdWJsZShjdXJfdmFsdWUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1FMSVRFX1RFWFQ6CisgICAgICAgICAgICAgICAgdmFsX3N0ciA9IChjb25zdCBjaGFyKilzcWxpdGUzX3ZhbHVlX3RleHQoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzdHJsZW4odmFsX3N0ciksIE5VTEwpOworICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gc2hvdyBlcnJvcnMgaGVyZSAqLworICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTElURV9CTE9COgorICAgICAgICAgICAgICAgIGJ1ZmxlbiA9IHNxbGl0ZTNfdmFsdWVfYnl0ZXMoY3VyX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUJ1ZmZlcl9OZXcoYnVmbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihjdXJfcHlfdmFsdWUsICZyYXdfYnVmZmVyLCAmYnVmbGVuKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM192YWx1ZV9ibG9iKGN1cl92YWx1ZSksIGJ1Zmxlbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNRTElURV9OVUxMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgaSwgY3VyX3B5X3ZhbHVlKTsKKworICAgIH0KKworICAgIHJldHVybiBhcmdzOworfQorCit2b2lkIF9mdW5jX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBhcmd2KQoreworICAgIFB5T2JqZWN0KiBhcmdzOworICAgIFB5T2JqZWN0KiBweV9mdW5jOworICAgIFB5T2JqZWN0KiBweV9yZXR2YWw7CisKKworICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CisKKyAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisKKyAgICBweV9mdW5jID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOworCisgICAgcHlfcmV0dmFsID0gUHlPYmplY3RfQ2FsbE9iamVjdChweV9mdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisKKyAgICBfc2V0X3Jlc3VsdChjb250ZXh0LCBweV9yZXR2YWwpOworICAgIFB5X1hERUNSRUYocHlfcmV0dmFsKTsKKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9zdGVwX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBwYXJhbXMpCit7CisgICAgUHlPYmplY3QqIGFyZ3M7CisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOworICAgIFB5T2JqZWN0KiogYWdncmVnYXRlX2luc3RhbmNlOworICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kOworCisgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKKworICAgIHRocmVhZHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIGFnZ3JlZ2F0ZV9jbGFzcyA9IChQeU9iamVjdCopc3FsaXRlM191c2VyX2RhdGEoY29udGV4dCk7CisKKyAgICBhZ2dyZWdhdGVfaW5zdGFuY2UgPSAoUHlPYmplY3QqKilzcWxpdGUzX2FnZ3JlZ2F0ZV9jb250ZXh0KGNvbnRleHQsIHNpemVvZihQeU9iamVjdCopKTsKKworICAgIGlmICgqYWdncmVnYXRlX2luc3RhbmNlID09IDApIHsKKyAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihhZ2dyZWdhdGVfY2xhc3MsICIiKTsKKworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSAwOworICAgICAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZXBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJzdGVwIik7CisgICAgaWYgKCFzdGVwbWV0aG9kKQorICAgIHsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIHBhcmFtcyk7CisKKyAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0ZXBtZXRob2QsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoc3RlcG1ldGhvZCk7CisKKyAgICBpZiAoZnVuY3Rpb25fcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKKyAgICB9CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworfQorCit2b2lkIF9maW5hbF9jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQpCit7CisgICAgUHlPYmplY3QqIGFyZ3M7CisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKKyAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOworICAgIFB5T2JqZWN0KiBmaW5hbGl6ZW1ldGhvZDsKKworICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CisKKyAgICB0aHJlYWRzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisKKyAgICBhZ2dyZWdhdGVfY2xhc3MgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOworCisgICAgYWdncmVnYXRlX2luc3RhbmNlID0gKFB5T2JqZWN0Kiopc3FsaXRlM19hZ2dyZWdhdGVfY29udGV4dChjb250ZXh0LCBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgaWYgKCEqYWdncmVnYXRlX2luc3RhbmNlKSB7CisgICAgICAgIC8qIHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gaW4gdGhlIGFnZ3JlZ2F0ZSdzCisgICAgICAgICAqIF9faW5pdF9fICovCisKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZpbmFsaXplbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqYWdncmVnYXRlX2luc3RhbmNlLCAiZmluYWxpemUiKTsKKworICAgIGlmICghZmluYWxpemVtZXRob2QpIHsKKyAgICAgICAgLyoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJmaW5hbGl6ZSBtZXRob2QgbWlzc2luZyIpOworICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5X05vbmU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoIWFyZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGZpbmFsaXplbWV0aG9kLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoZmluYWxpemVtZXRob2QpOworICAgIH0KKworICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIGZ1bmN0aW9uX3Jlc3VsdCk7CisgICAgUHlfWERFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKKyAgICBQeV9YREVDUkVGKGZ1bmN0aW9uX3Jlc3VsdCk7CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOworfQorCisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NyZWF0ZV9mdW5jdGlvbihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAibmFyZyIsICJmdW5jIiwgTlVMTCwgTlVMTH07CisKKyAgICBQeU9iamVjdCogZnVuYzsKKyAgICBjaGFyKiBuYW1lOworICAgIGludCBuYXJnOworICAgIGludCByYzsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNpTyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgJm5hcmcsICZmdW5jKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJjID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oc2VsZi0+ZGIsIG5hbWUsIG5hcmcsIFNRTElURV9VVEY4LCAodm9pZCopZnVuYywgX2Z1bmNfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworCisgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGZ1bmMsIFB5X05vbmUpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CisKKyAgICBpbnQgbl9hcmc7CisgICAgY2hhciogbmFtZTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ICJuYW1lIiwgIm5fYXJnIiwgImFnZ3JlZ2F0ZV9jbGFzcyIsIE5VTEwgfTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzaU86Y3JlYXRlX2FnZ3JlZ2F0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZuX2FyZywgJmFnZ3JlZ2F0ZV9jbGFzcykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbl9hcmcsIFNRTElURV9VVEY4LCAodm9pZCopYWdncmVnYXRlX2NsYXNzLCAwLCAmX3N0ZXBfY2FsbGJhY2ssICZfZmluYWxfY2FsbGJhY2spOworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmRiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGFnZ3JlZ2F0ZV9jbGFzcywgUHlfTm9uZSk7CisKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK2ludCBjaGVja190aHJlYWQoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBpZiAoc2VsZi0+Y2hlY2tfc2FtZV90aHJlYWQpIHsKKyAgICAgICAgaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBzZWxmLT50aHJlYWRfaWRlbnQpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNRTGl0ZSBvYmplY3RzIGNyZWF0ZWQgaW4gYSB0aHJlYWQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGF0IHNhbWUgdGhyZWFkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgb2JqZWN0IHdhcyBjcmVhdGVkIGluIHRocmVhZCBpZCAlbGQgYW5kIHRoaXMgaXMgdGhyZWFkIGlkICVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT50aHJlYWRfaWRlbnQsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsKENvbm5lY3Rpb24qIHNlbGYsIHZvaWQqIHVudXNlZCkKK3sKKyAgICBQeV9JTkNSRUYoc2VsZi0+aXNvbGF0aW9uX2xldmVsKTsKKyAgICByZXR1cm4gc2VsZi0+aXNvbGF0aW9uX2xldmVsOworfQorCitzdGF0aWMgUHlPYmplY3QqIGNvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMoQ29ubmVjdGlvbiogc2VsZiwgdm9pZCogdW51c2VkKQoreworICAgIGlmICghY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNxbGl0ZTNfdG90YWxfY2hhbmdlcyhzZWxmLT5kYikpOworICAgIH0KK30KKworc3RhdGljIGludCBjb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGlzb2xhdGlvbl9sZXZlbCkKK3sKKyAgICBQeU9iamVjdCogZW1wdHk7CisgICAgUHlPYmplY3QqIHJlczsKKyAgICBQeU9iamVjdCogYmVnaW5fc3RhdGVtZW50OworCisgICAgUHlfWERFQ1JFRihzZWxmLT5pc29sYXRpb25fbGV2ZWwpOworCisgICAgaWYgKHNlbGYtPmJlZ2luX3N0YXRlbWVudCkgeworICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmJlZ2luX3N0YXRlbWVudCk7CisgICAgICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGlzb2xhdGlvbl9sZXZlbCA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gUHlfTm9uZTsKKworICAgICAgICBlbXB0eSA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoIWVtcHR5KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gY29ubmVjdGlvbl9jb21taXQoc2VsZiwgZW1wdHkpOworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihlbXB0eSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworCisgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihpc29sYXRpb25fbGV2ZWwpOworICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBpc29sYXRpb25fbGV2ZWw7CisKKyAgICAgICAgYmVnaW5fc3RhdGVtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiQkVHSU4gIik7CisgICAgICAgIGlmICghYmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZiZWdpbl9zdGF0ZW1lbnQsIGlzb2xhdGlvbl9sZXZlbCk7CisgICAgICAgIGlmICghYmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLT5iZWdpbl9zdGF0ZW1lbnQgPSBQeU1lbV9NYWxsb2MoUHlTdHJpbmdfU2l6ZShiZWdpbl9zdGF0ZW1lbnQpICsgMik7CisgICAgICAgIGlmICghc2VsZi0+YmVnaW5fc3RhdGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzdHJjcHkoc2VsZi0+YmVnaW5fc3RhdGVtZW50LCBQeVN0cmluZ19Bc1N0cmluZyhiZWdpbl9zdGF0ZW1lbnQpKTsKKyAgICAgICAgUHlfREVDUkVGKGJlZ2luX3N0YXRlbWVudCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2NhbGwoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIHNxbDsKKyAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmc3FsKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcoU3RhdGVtZW50LCAmU3RhdGVtZW50VHlwZSk7CisgICAgaWYgKCFzdGF0ZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzdGF0ZW1lbnRfY3JlYXRlKHN0YXRlbWVudCwgc2VsZiwgc3FsKTsKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgaWYgKHJjID09IFBZU1FMSVRFX1RPT19NVUNIX1NRTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFdhcm5pbmcsICJZb3UgY2FuIG9ubHkgZXhlY3V0ZSBvbmUgc3RhdGVtZW50IGF0IGEgdGltZS4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYyA9PSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFdhcm5pbmcsICJTUUwgaXMgb2Ygd3JvbmcgdHlwZS4gTXVzdCBiZSBzdHJpbmcgb3IgdW5pY29kZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIH0KKworICAgICAgICBQeV9ERUNSRUYoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzdGF0ZW1lbnQ7Cit9CisKK1B5T2JqZWN0KiBjb25uZWN0aW9uX2V4ZWN1dGUoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGN1cnNvciA9IDA7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IDA7CisgICAgUHlPYmplY3QqIG1ldGhvZCA9IDA7CisKKyAgICBjdXJzb3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCopc2VsZiwgImN1cnNvciIsICIiKTsKKyAgICBpZiAoIWN1cnNvcikgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY3Vyc29yLCAiZXhlY3V0ZSIpOworICAgIGlmICghbWV0aG9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKG1ldGhvZCk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9leGVjdXRlbWFueShDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogY3Vyc29yID0gMDsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCogbWV0aG9kID0gMDsKKworICAgIGN1cnNvciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0KilzZWxmLCAiY3Vyc29yIiwgIiIpOworICAgIGlmICghY3Vyc29yKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjdXJzb3IsICJleGVjdXRlbWFueSIpOworICAgIGlmICghbWV0aG9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihjdXJzb3IpOworICAgICAgICBjdXJzb3IgPSAwOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QobWV0aG9kLCBhcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKG1ldGhvZCk7CisKKyAgICByZXR1cm4gY3Vyc29yOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBjdXJzb3IgPSAwOworICAgIFB5T2JqZWN0KiByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0KiBtZXRob2QgPSAwOworCisgICAgY3Vyc29yID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QqKXNlbGYsICJjdXJzb3IiLCAiIik7CisgICAgaWYgKCFjdXJzb3IpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGN1cnNvciwgImV4ZWN1dGVzY3JpcHQiKTsKKyAgICBpZiAoIW1ldGhvZCkgeworICAgICAgICBQeV9ERUNSRUYoY3Vyc29yKTsKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ldGhvZCwgYXJncyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlfREVDUkVGKGN1cnNvcik7CisgICAgICAgIGN1cnNvciA9IDA7CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgUHlfWERFQ1JFRihtZXRob2QpOworCisgICAgcmV0dXJuIGN1cnNvcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDT0xMQVRJT04gQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorY29sbGF0aW9uX2NhbGxiYWNrKAorICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICBpbnQgdGV4dDFfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0MV9kYXRhLAorICAgICAgICBpbnQgdGV4dDJfbGVuZ3RoLCBjb25zdCB2b2lkKiB0ZXh0Ml9kYXRhKQoreworICAgIFB5T2JqZWN0KiBjYWxsYmFjayA9IChQeU9iamVjdCopY29udGV4dDsKKyAgICBQeU9iamVjdCogc3RyaW5nMSA9IDA7CisgICAgUHlPYmplY3QqIHN0cmluZzIgPSAwOworICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7CisKKyAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKKyAgICBzdHJpbmcxID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIqKXRleHQxX2RhdGEsIHRleHQxX2xlbmd0aCk7CisgICAgc3RyaW5nMiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyKil0ZXh0Ml9kYXRhLCB0ZXh0Ml9sZW5ndGgpOworCisgICAgaWYgKCFzdHJpbmcxIHx8ICFzdHJpbmcyKSB7CisgICAgICAgIGdvdG8gZmluYWxseTsgLyogZmFpbGVkIHRvIGFsbG9jYXRlIHN0cmluZ3MgKi8KKyAgICB9CisKKyAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCBzdHJpbmcxLCBzdHJpbmcyLCBOVUxMKTsKKworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIC8qIGV4ZWN1dGlvbiBmYWlsZWQgKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHJlc3VsdCA9IFB5SW50X0FzTG9uZyhyZXR2YWwpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorCitmaW5hbGx5OgorICAgIFB5X1hERUNSRUYoc3RyaW5nMSk7CisgICAgUHlfWERFQ1JFRihzdHJpbmcyKTsKKyAgICBQeV9YREVDUkVGKHJldHZhbCk7CisKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2Nvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogY2FsbGFibGU7CisgICAgUHlPYmplY3QqIHVwcGVyY2FzZV9uYW1lID0gMDsKKyAgICBQeU9iamVjdCogbmFtZTsKKyAgICBQeU9iamVjdCogcmV0dmFsOworICAgIGNoYXIqIGNoazsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmKSkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIU86Y3JlYXRlX2NvbGxhdGlvbihuYW1lLCBjYWxsYmFjaykiLCAmUHlTdHJpbmdfVHlwZSwgJm5hbWUsICZjYWxsYWJsZSkpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHVwcGVyY2FzZV9uYW1lID0gUHlPYmplY3RfQ2FsbE1ldGhvZChuYW1lLCAidXBwZXIiLCAiIik7CisgICAgaWYgKCF1cHBlcmNhc2VfbmFtZSkgeworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorCisgICAgY2hrID0gUHlTdHJpbmdfQXNTdHJpbmcodXBwZXJjYXNlX25hbWUpOworICAgIHdoaWxlICgqY2hrKSB7CisgICAgICAgIGlmICgoKmNoayA+PSAnMCcgJiYgKmNoayA8PSAnOScpCisgICAgICAgICB8fCAoKmNoayA+PSAnQScgJiYgKmNoayA8PSAnWicpCisgICAgICAgICB8fCAoKmNoayA9PSAnXycpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGsrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiaW52YWxpZCBjaGFyYWN0ZXIgaW4gY29sbGF0aW9uIG5hbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKGNhbGxhYmxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIGlmIChjYWxsYWJsZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmNvbGxhdGlvbnMsIHVwcGVyY2FzZV9uYW1lLCBjYWxsYWJsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29sbGF0aW9ucywgdXBwZXJjYXNlX25hbWUpOworICAgIH0KKworICAgIHJjID0gc3FsaXRlM19jcmVhdGVfY29sbGF0aW9uKHNlbGYtPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHVwcGVyY2FzZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGFibGUgIT0gUHlfTm9uZSkgPyBjYWxsYWJsZSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxhYmxlICE9IFB5X05vbmUpID8gY29sbGF0aW9uX2NhbGxiYWNrIDogTlVMTCk7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBQeURpY3RfRGVsSXRlbShzZWxmLT5jb2xsYXRpb25zLCB1cHBlcmNhc2VfbmFtZSk7CisgICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisKK2ZpbmFsbHk6CisgICAgUHlfWERFQ1JFRih1cHBlcmNhc2VfbmFtZSk7CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR2YWwgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK1B5RG9jX1NUUigiPG1pc3NpbmcgZG9jc3RyaW5nPiIpOworCitzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsKKyAgICB7Imlzb2xhdGlvbl9sZXZlbCIsICAoZ2V0dGVyKWNvbm5lY3Rpb25fZ2V0X2lzb2xhdGlvbl9sZXZlbCwgKHNldHRlciljb25uZWN0aW9uX3NldF9pc29sYXRpb25fbGV2ZWx9LAorICAgIHsidG90YWxfY2hhbmdlcyIsICAoZ2V0dGVyKWNvbm5lY3Rpb25fZ2V0X3RvdGFsX2NoYW5nZXMsIChzZXR0ZXIpMH0sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgUHlNZXRob2REZWYgY29ubmVjdGlvbl9tZXRob2RzW10gPSB7CisgICAgeyJjdXJzb3IiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jdXJzb3IsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBQeURvY19TVFIoIlJldHVybiBhIGN1cnNvciBmb3IgdGhlIGNvbm5lY3Rpb24uIil9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiQ2xvc2VzIHRoZSBjb25uZWN0aW9uLiIpfSwKKyAgICB7ImNvbW1pdCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NvbW1pdCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiIpfSwKKyAgICB7InJvbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcm9sbGJhY2ssIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIlJvbGwgYmFjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4iKX0sCisgICAgeyJjcmVhdGVfZnVuY3Rpb24iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfZnVuY3Rpb24sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJjcmVhdGVfYWdncmVnYXRlIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY3JlYXRlX2FnZ3JlZ2F0ZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIG5ldyBhZ2dyZWdhdGUuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJleGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImV4ZWN1dGVtYW55IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXBlYXRlZGx5IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImV4ZWN1dGVzY3JpcHQiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiY3JlYXRlX2NvbGxhdGlvbiIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NyZWF0ZV9jb2xsYXRpb24sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29sbGF0aW9uIGZ1bmN0aW9uLiIpfSwKKyAgICB7TlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgY29ubmVjdGlvbl9tZW1iZXJzW10gPQoreworICAgIHsiV2FybmluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBXYXJuaW5nKSwgUk99LAorICAgIHsiRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgRXJyb3IpLCBST30sCisgICAgeyJJbnRlcmZhY2VFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBJbnRlcmZhY2VFcnJvciksIFJPfSwKKyAgICB7IkRhdGFiYXNlRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgRGF0YWJhc2VFcnJvciksIFJPfSwKKyAgICB7IkRhdGFFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBEYXRhRXJyb3IpLCBST30sCisgICAgeyJPcGVyYXRpb25hbEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIE9wZXJhdGlvbmFsRXJyb3IpLCBST30sCisgICAgeyJJbnRlZ3JpdHlFcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCBJbnRlZ3JpdHlFcnJvciksIFJPfSwKKyAgICB7IkludGVybmFsRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgSW50ZXJuYWxFcnJvciksIFJPfSwKKyAgICB7IlByb2dyYW1taW5nRXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgUHJvZ3JhbW1pbmdFcnJvciksIFJPfSwKKyAgICB7Ik5vdFN1cHBvcnRlZEVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKENvbm5lY3Rpb24sIE5vdFN1cHBvcnRlZEVycm9yKSwgUk99LAorICAgIHsicm93X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ29ubmVjdGlvbiwgcm93X2ZhY3RvcnkpfSwKKyAgICB7InRleHRfZmFjdG9yeSIsIFRfT0JKRUNULCBvZmZzZXRvZihDb25uZWN0aW9uLCB0ZXh0X2ZhY3RvcnkpfSwKKyAgICB7TlVMTH0KK307CisKK1B5VHlwZU9iamVjdCBDb25uZWN0aW9uVHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5Db25uZWN0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoQ29ubmVjdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpY29ubmVjdGlvbl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgKHRlcm5hcnlmdW5jKWNvbm5lY3Rpb25fY2FsbCwgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIGNvbm5lY3Rpb25fZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIGNvbm5lY3Rpb25fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgY29ubmVjdGlvbl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICBjb25uZWN0aW9uX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpY29ubmVjdGlvbl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IGNvbm5lY3Rpb25fc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBDb25uZWN0aW9uVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZDb25uZWN0aW9uVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFlNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwNiBAQAorLyogY29ubmVjdGlvbi5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uIHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBQWVNRTElURV9DT05ORUNUSU9OX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKworI2luY2x1ZGUgInNxbGl0ZTMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgc3FsaXRlMyogZGI7CisKKyAgICBpbnQgaW5UcmFuc2FjdGlvbjsKKyAgICBpbnQgZGV0ZWN0X3R5cGVzOworCisgICAgLyogdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgZGF0YWJhc2UgbG9ja3MgKi8KKyAgICBkb3VibGUgdGltZW91dDsKKworICAgIC8qIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHRpbWVvdXQgaGFuZGxlcjogd2hlbiBkaWQgdGhlIHRpbWVvdXQgaGFuZGxlcgorICAgICAqIGZpcnN0IGdldCBjYWxsZWQgd2l0aCBjb3VudD0wPyAqLworICAgIGRvdWJsZSB0aW1lb3V0X3N0YXJ0ZWQ7CisKKyAgICAvKiBOb25lIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBQeVN0cmluZyB3aXRoIHRoZSBpc29sYXRpb24gbGV2ZWwgKi8KKyAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOworCisgICAgLyogTlVMTCBmb3IgYXV0b2NvbW1pdCwgb3RoZXJ3aXNlIGEgc3RyaW5nIHdpdGggdGhlIEJFR0lOIHN0YXRtZW50OyB3aWxsIGJlCisgICAgICogZnJlZWQgaW4gY29ubmVjdGlvbiBkZXN0cnVjdG9yICovCisgICAgY2hhciogYmVnaW5fc3RhdGVtZW50OworCisgICAgaW50IGNoZWNrX3NhbWVfdGhyZWFkOworICAgIGxvbmcgdGhyZWFkX2lkZW50OworCisgICAgQ2FjaGUqIHN0YXRlbWVudF9jYWNoZTsKKworICAgIFB5T2JqZWN0KiByb3dfZmFjdG9yeTsKKworICAgIFB5T2JqZWN0KiB0ZXh0X2ZhY3Rvcnk7CisKKyAgICAvKiByZW1lbWJlciByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucy9jbGFzc2VzIHVzZWQgaW4KKyAgICAgKiBjcmVhdGVfZnVuY3Rpb24vY3JlYXRlL2FnZ3JlZ2F0ZSwgdXNlIHRoZXNlIGFzIGRpY3Rpb25hcnkga2V5cywgc28gd2UKKyAgICAgKiBjYW4ga2VlcCB0aGUgdG90YWwgc3lzdGVtIHJlZmNvdW50IGNvbnN0YW50IGJ5IGNsZWFyaW5nIHRoYXQgZGljdGlvbmFyeQorICAgICAqIGluIGNvbm5lY3Rpb25fZGVhbGxvYyAqLworICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9waW5ib2FyZDsKKworICAgIC8qIGEgZGljdGlvbmFyeSBvZiByZWdpc3RlcmVkIGNvbGxhdGlvbiBuYW1lID0+IGNvbGxhdGlvbiBjYWxsYWJsZSBtYXBwaW5ncyAqLworICAgIFB5T2JqZWN0KiBjb2xsYXRpb25zOworCisgICAgLyogRXhjZXB0aW9uIG9iamVjdHMgKi8KKyAgICBQeU9iamVjdCogV2FybmluZzsKKyAgICBQeU9iamVjdCogRXJyb3I7CisgICAgUHlPYmplY3QqIEludGVyZmFjZUVycm9yOworICAgIFB5T2JqZWN0KiBEYXRhYmFzZUVycm9yOworICAgIFB5T2JqZWN0KiBEYXRhRXJyb3I7CisgICAgUHlPYmplY3QqIE9wZXJhdGlvbmFsRXJyb3I7CisgICAgUHlPYmplY3QqIEludGVncml0eUVycm9yOworICAgIFB5T2JqZWN0KiBJbnRlcm5hbEVycm9yOworICAgIFB5T2JqZWN0KiBQcm9ncmFtbWluZ0Vycm9yOworICAgIFB5T2JqZWN0KiBOb3RTdXBwb3J0ZWRFcnJvcjsKK30gQ29ubmVjdGlvbjsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBDb25uZWN0aW9uVHlwZTsKKworUHlPYmplY3QqIGNvbm5lY3Rpb25fYWxsb2MoUHlUeXBlT2JqZWN0KiB0eXBlLCBpbnQgYXdhcmUpOwordm9pZCBjb25uZWN0aW9uX2RlYWxsb2MoQ29ubmVjdGlvbiogc2VsZik7CitQeU9iamVjdCogY29ubmVjdGlvbl9jdXJzb3IoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fY2xvc2UoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIF9jb25uZWN0aW9uX2JlZ2luKENvbm5lY3Rpb24qIHNlbGYpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fYmVnaW4oQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGNvbm5lY3Rpb25fY29tbWl0KENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjb25uZWN0aW9uX3JvbGxiYWNrKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKK1B5T2JqZWN0KiBjb25uZWN0aW9uX25ldyhQeVR5cGVPYmplY3QqIHR5cGUsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3cpOworaW50IGNvbm5lY3Rpb25faW5pdChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CisKK2ludCBjaGVja190aHJlYWQoQ29ubmVjdGlvbiogc2VsZik7CitpbnQgY2hlY2tfY29ubmVjdGlvbihDb25uZWN0aW9uKiBjb24pOworCitpbnQgY29ubmVjdGlvbl9zZXR1cF90eXBlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTgwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYwpAQCAtMCwwICsxLDQwIEBACisvKiBjb252ZXJ0ZXJzLmMgLSBkZWZhdWx0IGNvbnZlcnRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJhZGFwdGVycy5oIgorCisvKiBkdW1teSwgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBhIGxhdGVyIHZlcnNpb24gKi8KKworUHlPYmplY3QqIGNvbnZlcnRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitQeU9iamVjdCogY29udmVydF90aW1lc3RhbXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmggYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzc2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGNvbnZlcnRlcnMuaCAtIGRlZmF1bHQgY29udmVydGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBZU1FMSVRFX0NPTlZFUlRFUlNfSAorI2RlZmluZSBQWVNRTElURV9DT05WRVJURVJTX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJweXRocmVhZC5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKworUHlPYmplY3QqIGNvbnZlcnRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOworUHlPYmplY3QqIGNvbnZlcnRfdGltZXN0YW1wKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjhjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKiBjdXJzb3IuYyAtIHRoZSBjdXJzb3IgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCisKKy8qIHVzZWQgdG8gZGVjaWRlIHdldGhlciB0byBjYWxsIFB5SW50X0Zyb21Mb25nIG9yIFB5TG9uZ19Gcm9tTG9uZ0xvbmcgKi8KKyNkZWZpbmUgSU5UMzJfTUlOICgtMjE0NzQ4MzY0NyAtIDEpCisjZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisKK1B5T2JqZWN0KiBjdXJzb3JfaXRlcm5leHQoQ3Vyc29yICpzZWxmKTsKKworc3RhdGljIFN0YXRlbWVudEtpbmQgZGV0ZWN0X3N0YXRlbWVudF90eXBlKGNoYXIqIHN0YXRlbWVudCkKK3sKKyAgICBjaGFyIGJ1ZlsyMF07CisgICAgY2hhciogc3JjOworICAgIGNoYXIqIGRzdDsKKworICAgIHNyYyA9IHN0YXRlbWVudDsKKyAgICAvKiBza2lwIG92ZXIgd2hpdGVwYWNlICovCisgICAgd2hpbGUgKCpzcmMgPT0gJ1xyJyB8fCAqc3JjID09ICdcbicgfHwgKnNyYyA9PSAnICcgfHwgKnNyYyA9PSAnXHQnKSB7CisgICAgICAgIHNyYysrOworICAgIH0KKworICAgIGlmICgqc3JjID09IDApCisgICAgICAgIHJldHVybiBTVEFURU1FTlRfSU5WQUxJRDsKKworICAgIGRzdCA9IGJ1ZjsKKyAgICAqZHN0ID0gMDsKKyAgICB3aGlsZSAoaXNhbHBoYSgqc3JjKSAmJiBkc3QgLSBidWYgPCBzaXplb2YoYnVmKSAtIDIpIHsKKyAgICAgICAgKmRzdCsrID0gdG9sb3dlcigqc3JjKyspOworICAgIH0KKworICAgICpkc3QgPSAwOworCisgICAgaWYgKCFzdHJjbXAoYnVmLCAic2VsZWN0IikpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9TRUxFQ1Q7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImluc2VydCIpKSB7CisgICAgICAgIHJldHVybiBTVEFURU1FTlRfSU5TRVJUOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJ1cGRhdGUiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1VQREFURTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiZGVsZXRlIikpIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9ERUxFVEU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInJlcGxhY2UiKSkgeworICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1JFUExBQ0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICB9Cit9CisKK2ludCBjdXJzb3JfaW5pdChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIENvbm5lY3Rpb24qIGNvbm5lY3Rpb247CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJkNvbm5lY3Rpb25UeXBlLCAmY29ubmVjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gLTE7IAorICAgIH0KKworICAgIFB5X0lOQ1JFRihjb25uZWN0aW9uKTsKKyAgICBzZWxmLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICBzZWxmLT5zdGF0ZW1lbnQgPSBOVUxMOworICAgIHNlbGYtPm5leHRfcm93ID0gTlVMTDsKKworICAgIHNlbGYtPnJvd19jYXN0X21hcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFzZWxmLT5yb3dfY2FzdF9tYXApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5X05vbmU7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+bGFzdHJvd2lkPSBQeV9Ob25lOworCisgICAgc2VsZi0+YXJyYXlzaXplID0gMTsKKworICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICBpZiAoIXNlbGYtPnJvd2NvdW50KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+cm93X2ZhY3RvcnkgPSBQeV9Ob25lOworCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGN1cnNvcl9kZWFsbG9jKEN1cnNvciogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICAvKiBSZXNldCB0aGUgc3RhdGVtZW50IGlmIHRoZSB1c2VyIGhhcyBub3QgY2xvc2VkIHRoZSBjdXJzb3IgKi8KKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgIHJjID0gc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgIH0KKworICAgIFB5X1hERUNSRUYoc2VsZi0+Y29ubmVjdGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfY2FzdF9tYXApOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdHJvd2lkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19mYWN0b3J5KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm5leHRfcm93KTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworaW50IGJ1aWxkX3Jvd19jYXN0X21hcChDdXJzb3IqIHNlbGYpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgY2hhciogdHlwZV9zdGFydCA9IChjb25zdCBjaGFyKiktMTsKKyAgICBjb25zdCBjaGFyKiBwb3M7CisKKyAgICBjb25zdCBjaGFyKiBjb2xuYW1lOworICAgIGNvbnN0IGNoYXIqIGRlY2x0eXBlOworICAgIFB5T2JqZWN0KiBweV9kZWNsdHlwZTsKKyAgICBQeU9iamVjdCogY29udmVydGVyOworICAgIFB5T2JqZWN0KiBrZXk7CisKKyAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJvd19jYXN0X21hcCk7CisgICAgc2VsZi0+cm93X2Nhc3RfbWFwID0gUHlMaXN0X05ldygwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzcWxpdGUzX2NvbHVtbl9jb3VudChzZWxmLT5zdGF0ZW1lbnQtPnN0KTsgaSsrKSB7CisgICAgICAgIGNvbnZlcnRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmRldGVjdF90eXBlcyB8IFBBUlNFX0NPTE5BTUVTKSB7CisgICAgICAgICAgICBjb2xuYW1lID0gc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKworICAgICAgICAgICAgZm9yIChwb3MgPSBjb2xuYW1lOyAqcG9zICE9IDA7IHBvcysrKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwb3MgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RhcnQgPSBwb3MgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnBvcyA9PSAnXScgJiYgdHlwZV9zdGFydCAhPSAoY29uc3QgY2hhciopLTEpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodHlwZV9zdGFydCwgcG9zIC0gdHlwZV9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGluZyBhIHN0cmluZyBmYWlsZWQsIGJ1dCBpdCBpcyB0b28gY29tcGxpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgaGVyZSwgd2UganVzdCBhc3N1bWUgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vIGNvbnZlcnRlciBhbmQgcHJvY2VlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNvbnZlcnRlciAmJiBzZWxmLT5jb25uZWN0aW9uLT5kZXRlY3RfdHlwZXMgfCBQQVJTRV9ERUNMVFlQRVMpIHsKKyAgICAgICAgICAgIGRlY2x0eXBlID0gc3FsaXRlM19jb2x1bW5fZGVjbHR5cGUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBpZiAoZGVjbHR5cGUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IGRlY2x0eXBlOztwb3MrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnBvcyA9PSAnICcgfHwgKnBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBweV9kZWNsdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRlY2x0eXBlLCBwb3MgLSBkZWNsdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB5X2RlY2x0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBweV9kZWNsdHlwZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB5X2RlY2x0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udmVydGVyKSB7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeV9Ob25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+cm93X2Nhc3RfbWFwLCBjb252ZXJ0ZXIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjb252ZXJ0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfY2FzdF9tYXApOworICAgICAgICAgICAgc2VsZi0+cm93X2Nhc3RfbWFwID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK1B5T2JqZWN0KiBfYnVpbGRfY29sdW1uX25hbWUoY29uc3QgY2hhciogY29sbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyKiBwb3M7CisKKyAgICBpZiAoIWNvbG5hbWUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICBmb3IgKHBvcyA9IGNvbG5hbWU7OyBwb3MrKykgeworICAgICAgICBpZiAoKnBvcyA9PSAwIHx8ICpwb3MgPT0gJyAnKSB7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29sbmFtZSwgcG9zIC0gY29sbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1B5T2JqZWN0KiB1bmljb2RlX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIqIHZhbF9zdHIsIGludCBvcHRpbWl6ZSkKK3sKKyAgICBjb25zdCBjaGFyKiBjaGVjazsKKyAgICBpbnQgaXNfYXNjaWkgPSAwOworCisgICAgaWYgKG9wdGltaXplKSB7CisgICAgICAgIGlzX2FzY2lpID0gMTsKKworICAgICAgICBjaGVjayA9IHZhbF9zdHI7CisgICAgICAgIHdoaWxlICgqY2hlY2spIHsKKyAgICAgICAgICAgIGlmICgqY2hlY2sgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgaXNfYXNjaWkgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVjaysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX2FzY2lpKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzdHJsZW4odmFsX3N0ciksIE5VTEwpOworICAgIH0KK30KKworLyoKKyAqIFJldHVybnMgYSByb3cgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBTUUxpdGUgc3RhdGVtZW50CisgKgorICogUHJlY29uZGlkaXRpb246CisgKiAtIHNxbGl0ZTNfc3RlcCgpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgYW5kIGl0IHJldHVybmVkIFNRTElURV9ST1cuCisgKi8KK1B5T2JqZWN0KiBfZmV0Y2hfb25lX3JvdyhDdXJzb3IqIHNlbGYpCit7CisgICAgaW50IGksIG51bWNvbHM7CisgICAgUHlPYmplY3QqIHJvdzsKKyAgICBQeU9iamVjdCogaXRlbSA9IE5VTEw7CisgICAgaW50IGNvbHR5cGU7CisgICAgUFlfTE9OR19MT05HIGludHZhbDsKKyAgICBQeU9iamVjdCogY29udmVydGVyOworICAgIFB5T2JqZWN0KiBjb252ZXJ0ZWQ7CisgICAgUHlfc3NpemVfdCBuYnl0ZXM7CisgICAgUHlPYmplY3QqIGJ1ZmZlcjsKKyAgICB2b2lkKiByYXdfYnVmZmVyOworICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7CisgICAgY2hhciBidWZbMjAwXTsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBudW1jb2xzID0gc3FsaXRlM19kYXRhX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICByb3cgPSBQeVR1cGxlX05ldyhudW1jb2xzKTsKKyAgICBpZiAoIXJvdykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sczsgaSsrKSB7CisgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5kZXRlY3RfdHlwZXMpIHsKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnJvd19jYXN0X21hcCwgaSk7CisgICAgICAgICAgICBpZiAoIWNvbnZlcnRlcikgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeV9Ob25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX3RleHQoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBpZiAoIXZhbF9zdHIpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsX3N0cik7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29udmVydGVyLCAiTyIsIGl0ZW0pOworICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gbG9nIHRoZXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGNvbHR5cGUgPSBzcWxpdGUzX2NvbHVtbl90eXBlKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmIChjb2x0eXBlID09IFNRTElURV9OVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5X05vbmU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX0lOVEVHRVIpIHsKKyAgICAgICAgICAgICAgICBpbnR2YWwgPSBzcWxpdGUzX2NvbHVtbl9pbnQ2NChzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW50dmFsIDwgSU5UMzJfTUlOIHx8IGludHZhbCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGludHZhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaW50dmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlGbG9hdF9Gcm9tRG91YmxlKHNxbGl0ZTNfY29sdW1uX2RvdWJsZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHR5cGUgPT0gU1FMSVRFX1RFWFQpIHsKKyAgICAgICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX3RleHQoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGUpCisgICAgICAgICAgICAgICAgICAgIHx8IChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gT3B0aW1pemVkVW5pY29kZSkpIHsKKworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSB1bmljb2RlX2Zyb21fc3RyaW5nKHZhbF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gT3B0aW1pemVkVW5pY29kZSA/IDEgOiAwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIkNvdWxkIG5vdCBkZWNvZGUgdG8gVVRGLTggY29sdW1uICVzIHdpdGggdGV4dCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpLCB2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBidWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlTdHJpbmdfVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbF9zdHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnksICJzIiwgdmFsX3N0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBjb2x0eXBlID09IFNRTElURV9CTE9CICovCisgICAgICAgICAgICAgICAgbmJ5dGVzID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlCdWZmZXJfTmV3KG5ieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKGJ1ZmZlciwgJnJhd19idWZmZXIsICZuYnl0ZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM19jb2x1bW5fYmxvYihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSwgbmJ5dGVzKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBidWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocm93LCBpLCBjb252ZXJ0ZWQpOworICAgIH0KKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyb3cpOworICAgICAgICByb3cgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByb3c7Cit9CisKK1B5T2JqZWN0KiBfcXVlcnlfZXhlY3V0ZShDdXJzb3IqIHNlbGYsIGludCBtdWx0aXBsZSwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIG9wZXJhdGlvbjsKKyAgICBQeU9iamVjdCogb3BlcmF0aW9uX2J5dGVzdHIgPSBOVUxMOworICAgIGNoYXIqIG9wZXJhdGlvbl9jc3RyOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzX2xpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzX2l0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0KiBwYXJhbWV0ZXJzID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmM7CisgICAgUHlPYmplY3QqIGZ1bmNfYXJnczsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIGludCBudW1jb2xzOworICAgIFBZX0xPTkdfTE9ORyBsYXN0cm93aWQ7CisgICAgaW50IHN0YXRlbWVudF90eXBlOworICAgIFB5T2JqZWN0KiBkZXNjcmlwdG9yOworICAgIFB5T2JqZWN0KiBzZWNvbmRfYXJndW1lbnQgPSBOVUxMOworICAgIGxvbmcgcm93Y291bnQgPSAwOworCisgICAgaWYgKCFjaGVja190aHJlYWQoc2VsZi0+Y29ubmVjdGlvbikgfHwgIWNoZWNrX2Nvbm5lY3Rpb24oc2VsZi0+Y29ubmVjdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfWERFQ1JFRihzZWxmLT5uZXh0X3Jvdyk7CisgICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworCisgICAgaWYgKG11bHRpcGxlKSB7CisgICAgICAgIC8qIGV4ZWN1dGVtYW55KCkgKi8KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZvcGVyYXRpb24sICZzZWNvbmRfYXJndW1lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIH0KKworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9wZXJhdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBzdHIgb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlJdGVyX0NoZWNrKHNlY29uZF9hcmd1bWVudCkpIHsKKyAgICAgICAgICAgIC8qIGl0ZXJhdG9yICovCisgICAgICAgICAgICBQeV9JTkNSRUYoc2Vjb25kX2FyZ3VtZW50KTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnNfaXRlciA9IHNlY29uZF9hcmd1bWVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHNlcXVlbmNlICovCisgICAgICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlY29uZF9hcmd1bWVudCk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGV4ZWN1dGUoKSAqLworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyIsICZvcGVyYXRpb24sICZzZWNvbmRfYXJndW1lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIH0KKworICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wZXJhdGlvbikgJiYgIVB5VW5pY29kZV9DaGVjayhvcGVyYXRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9wZXJhdGlvbiBwYXJhbWV0ZXIgbXVzdCBiZSBzdHIgb3IgdW5pY29kZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbWV0ZXJzX2xpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAoIXBhcmFtZXRlcnNfbGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2Vjb25kX2FyZ3VtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNlY29uZF9hcmd1bWVudCA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICAgICAgaWYgKCFzZWNvbmRfYXJndW1lbnQpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKHNlY29uZF9hcmd1bWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocGFyYW1ldGVyc19saXN0LCBzZWNvbmRfYXJndW1lbnQpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZWNvbmRfYXJndW1lbnQpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoc2Vjb25kX2FyZ3VtZW50KTsKKworICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHBhcmFtZXRlcnNfbGlzdCk7CisgICAgICAgIGlmICghcGFyYW1ldGVyc19pdGVyKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudCAhPSBOVUxMKSB7CisgICAgICAgIC8qIFRoZXJlIGlzIGFuIGFjdGl2ZSBzdGF0ZW1lbnQgKi8KKyAgICAgICAgcmMgPSBzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICB9CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob3BlcmF0aW9uKSkgeworICAgICAgICBvcGVyYXRpb25fY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wZXJhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BlcmF0aW9uX2J5dGVzdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG9wZXJhdGlvbik7CisgICAgICAgIGlmICghb3BlcmF0aW9uX2J5dGVzdHIpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBvcGVyYXRpb25fY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG9wZXJhdGlvbl9ieXRlc3RyKTsKKyAgICB9CisKKyAgICAvKiByZXNldCBkZXNjcmlwdGlvbiBhbmQgcm93Y291bnQgKi8KKyAgICBQeV9ERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IFB5X05vbmU7CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+cm93Y291bnQpOworICAgIHNlbGYtPnJvd2NvdW50ID0gUHlJbnRfRnJvbUxvbmcoLTFMKTsKKyAgICBpZiAoIXNlbGYtPnJvd2NvdW50KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgc3RhdGVtZW50X3R5cGUgPSBkZXRlY3Rfc3RhdGVtZW50X3R5cGUob3BlcmF0aW9uX2NzdHIpOworICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5iZWdpbl9zdGF0ZW1lbnQpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZW1lbnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfVVBEQVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfREVMRVRFOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfSU5TRVJUOgorICAgICAgICAgICAgY2FzZSBTVEFURU1FTlRfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Nvbm5lY3Rpb25fYmVnaW4oc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX09USEVSOgorICAgICAgICAgICAgICAgIC8qIGl0J3MgYSBEREwgc3RhdGVtZW50IG9yIHNvbWV0aGluZyBzaW1pbGFyCisgICAgICAgICAgICAgICAgICAgLSB3ZSBiZXR0ZXIgQ09NTUlUIGZpcnN0IHNvIGl0IHdvcmtzIGZvciBhbGwgY2FzZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+aW5UcmFuc2FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBmdW5jX2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmdW5jX2FyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgZnVuY19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmNfYXJncyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVNRU5UX1NFTEVDVDoKKyAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2Fubm90IGV4ZWN1dGUgU0VMRUNUIHN0YXRlbWVudHMgaW4gZXhlY3V0ZW1hbnkoKS4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jX2FyZ3MgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAoIWZ1bmNfYXJncykgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9JTkNSRUYob3BlcmF0aW9uKTsKKyAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKGZ1bmNfYXJncywgMCwgb3BlcmF0aW9uKSAhPSAwKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudCkgeworICAgICAgICAodm9pZClzdGF0ZW1lbnRfcmVzZXQoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgfQorCisgICAgc2VsZi0+c3RhdGVtZW50ID0gKFN0YXRlbWVudCopY2FjaGVfZ2V0KHNlbGYtPmNvbm5lY3Rpb24tPnN0YXRlbWVudF9jYWNoZSwgZnVuY19hcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKworICAgIGlmICghc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHNlbGYtPnN0YXRlbWVudC0+aW5fdXNlKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcoU3RhdGVtZW50LCAmU3RhdGVtZW50VHlwZSk7CisgICAgICAgIGlmICghc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJjID0gc3RhdGVtZW50X2NyZWF0ZShzZWxmLT5zdGF0ZW1lbnQsIHNlbGYtPmNvbm5lY3Rpb24sIG9wZXJhdGlvbik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IDA7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgc3RhdGVtZW50X21hcmtfZGlydHkoc2VsZi0+c3RhdGVtZW50KTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHBhcmFtZXRlcnMgPSBQeUl0ZXJfTmV4dChwYXJhbWV0ZXJzX2l0ZXIpOworICAgICAgICBpZiAoIXBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVtZW50X21hcmtfZGlydHkoc2VsZi0+c3RhdGVtZW50KTsKKworICAgICAgICBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHNlbGYtPnN0YXRlbWVudCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1aWxkX3Jvd19jYXN0X21hcChzZWxmKSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIHdoaWxlIGJ1aWxkaW5nIHJvd19jYXN0X21hcCIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfRE9ORSAmJiByYyAhPSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICAgICAgaWYgKHJjID09IFNRTElURV9TQ0hFTUEpIHsKKyAgICAgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9yZWNvbXBpbGUoc2VsZi0+c3RhdGVtZW50LCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfUk9XIHx8IChyYyA9PSBTUUxJVEVfRE9ORSAmJiBzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfU0VMRUNUKSkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgbnVtY29scyA9IHNxbGl0ZTNfY29sdW1uX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICAgICAgaWYgKHNlbGYtPmRlc2NyaXB0aW9uID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+ZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIHNlbGYtPmRlc2NyaXB0aW9uID0gUHlUdXBsZV9OZXcobnVtY29scyk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWxmLT5kZXNjcmlwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY29sczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBQeVR1cGxlX05ldyg3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCAwLCBfYnVpbGRfY29sdW1uX25hbWUoc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSkpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCAxLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgMiwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDMsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7IFB5VHVwbGVfU2V0SXRlbShkZXNjcmlwdG9yLCA0LCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOyBQeVR1cGxlX1NldEl0ZW0oZGVzY3JpcHRvciwgNSwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsgUHlUdXBsZV9TZXRJdGVtKGRlc2NyaXB0b3IsIDYsIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oc2VsZi0+ZGVzY3JpcHRpb24sIGksIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgImV4ZWN1dGVtYW55KCkgY2FuIG9ubHkgZXhlY3V0ZSBETUwgc3RhdGVtZW50cy4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZWxmLT5uZXh0X3JvdyA9IF9mZXRjaF9vbmVfcm93KHNlbGYpOworICAgICAgICB9IGVsc2UgaWYgKHJjID09IFNRTElURV9ET05FICYmICFtdWx0aXBsZSkgeworICAgICAgICAgICAgc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlbWVudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHN0YXRlbWVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9VUERBVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9ERUxFVEU6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9JTlNFUlQ6CisgICAgICAgICAgICBjYXNlIFNUQVRFTUVOVF9SRVBMQUNFOgorICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICByb3djb3VudCArPSAobG9uZylzcWxpdGUzX2NoYW5nZXMoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnJvd2NvdW50KTsKKyAgICAgICAgICAgICAgICBzZWxmLT5yb3djb3VudCA9IFB5SW50X0Zyb21Mb25nKHJvd2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOworICAgICAgICBpZiAoc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX0lOU0VSVCkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgbGFzdHJvd2lkID0gc3FsaXRlM19sYXN0X2luc2VydF9yb3dpZChzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgc2VsZi0+bGFzdHJvd2lkID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbGFzdHJvd2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHNlbGYtPmxhc3Ryb3dpZCA9IFB5X05vbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXVsdGlwbGUpIHsKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X3Jlc2V0KHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzKTsKKyAgICB9CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYob3BlcmF0aW9uX2J5dGVzdHIpOworICAgIFB5X1hERUNSRUYocGFyYW1ldGVycyk7CisgICAgUHlfWERFQ1JFRihwYXJhbWV0ZXJzX2l0ZXIpOworICAgIFB5X1hERUNSRUYocGFyYW1ldGVyc19saXN0KTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICB9Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfZXhlY3V0ZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIHJldHVybiBfcXVlcnlfZXhlY3V0ZShzZWxmLCAwLCBhcmdzKTsKK30KKworUHlPYmplY3QqIGN1cnNvcl9leGVjdXRlbWFueShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIHJldHVybiBfcXVlcnlfZXhlY3V0ZShzZWxmLCAxLCBhcmdzKTsKK30KKworUHlPYmplY3QqIGN1cnNvcl9leGVjdXRlc2NyaXB0KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIHNjcmlwdF9vYmo7CisgICAgUHlPYmplY3QqIHNjcmlwdF9zdHIgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIHNjcmlwdF9jc3RyOworICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OworICAgIGludCByYzsKKyAgICBQeU9iamVjdCogZnVuY19hcmdzOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgaW50IHN0YXRlbWVudF9jb21wbGV0ZWQgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIiwgJnNjcmlwdF9vYmopKSB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2NyaXB0X29iaikpIHsKKyAgICAgICAgc2NyaXB0X2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRfb2JqKTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzY3JpcHRfb2JqKSkgeworICAgICAgICBzY3JpcHRfc3RyID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzY3JpcHRfb2JqKTsKKyAgICAgICAgaWYgKCFzY3JpcHRfc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNjcmlwdF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2NyaXB0X3N0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzY3JpcHQgYXJndW1lbnQgbXVzdCBiZSB1bmljb2RlIG9yIHN0cmluZy4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogY29tbWl0IGZpcnN0ICovCisgICAgZnVuY19hcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKCFmdW5jX2FyZ3MpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgZnVuY19hcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghc3FsaXRlM19jb21wbGV0ZShzY3JpcHRfY3N0cikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudF9jb21wbGV0ZWQgPSAxOworCisgICAgICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmNvbm5lY3Rpb24tPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfY3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRfY3N0cik7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLyogZXhlY3V0ZSBzdGF0ZW1lbnQsIGFuZCBpZ25vcmUgcmVzdWx0cyBvZiBTRUxFQ1Qgc3RhdGVtZW50cyAqLworICAgICAgICByYyA9IFNRTElURV9ST1c7CisgICAgICAgIHdoaWxlIChyYyA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgICAgICByYyA9IF9zcWxpdGVfc3RlcF93aXRoX2J1c3loYW5kbGVyKHN0YXRlbWVudCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7CisgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgICAgIF9zZXRlcnJvcihzZWxmLT5jb25uZWN0aW9uLT5kYik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHNjcmlwdF9zdHIpOworCisgICAgaWYgKCFzdGF0ZW1lbnRfY29tcGxldGVkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAieW91IGRpZCBub3QgcHJvdmlkZSBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQiKTsKKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgfQorfQorCitQeU9iamVjdCogY3Vyc29yX2dldGl0ZXIoQ3Vyc29yICpzZWxmKQoreworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworfQorCitQeU9iamVjdCogY3Vyc29yX2l0ZXJuZXh0KEN1cnNvciAqc2VsZikKK3sKKyAgICBQeU9iamVjdCogbmV4dF9yb3dfdHVwbGU7CisgICAgUHlPYmplY3QqIG5leHRfcm93OworICAgIGludCByYzsKKworICAgIGlmICghY2hlY2tfdGhyZWFkKHNlbGYtPmNvbm5lY3Rpb24pIHx8ICFjaGVja19jb25uZWN0aW9uKHNlbGYtPmNvbm5lY3Rpb24pKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghc2VsZi0+bmV4dF9yb3cpIHsKKyAgICAgICAgIGlmIChzZWxmLT5zdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudCk7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZW1lbnQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG5leHRfcm93X3R1cGxlID0gc2VsZi0+bmV4dF9yb3c7CisgICAgc2VsZi0+bmV4dF9yb3cgPSBOVUxMOworCisgICAgaWYgKHNlbGYtPnJvd19mYWN0b3J5ICE9IFB5X05vbmUpIHsKKyAgICAgICAgbmV4dF9yb3cgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+cm93X2ZhY3RvcnksICJPTyIsIHNlbGYsIG5leHRfcm93X3R1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfcm93X3R1cGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXh0X3JvdyA9IG5leHRfcm93X3R1cGxlOworICAgIH0KKworICAgIHJjID0gX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc2VsZi0+c3RhdGVtZW50LT5zdCwgc2VsZi0+Y29ubmVjdGlvbik7CisgICAgaWYgKHJjICE9IFNRTElURV9ET05FICYmIHJjICE9IFNRTElURV9ST1cpIHsKKyAgICAgICAgUHlfREVDUkVGKG5leHRfcm93KTsKKyAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHJjID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgc2VsZi0+bmV4dF9yb3cgPSBfZmV0Y2hfb25lX3JvdyhzZWxmKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dF9yb3c7Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfZmV0Y2hvbmUoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogcm93OworCisgICAgcm93ID0gY3Vyc29yX2l0ZXJuZXh0KHNlbGYpOworICAgIGlmICghcm93ICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgcmV0dXJuIHJvdzsKK30KKworUHlPYmplY3QqIGN1cnNvcl9mZXRjaG1hbnkoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBQeU9iamVjdCogcm93OworICAgIFB5T2JqZWN0KiBsaXN0OworICAgIGludCBtYXhyb3dzID0gc2VsZi0+YXJyYXlzaXplOworICAgIGludCBjb3VudGVyID0gMDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmbWF4cm93cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghbGlzdCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBqdXN0IG1ha2Ugc3VyZSB3ZSBlbnRlciB0aGUgbG9vcCAqLworICAgIHJvdyA9IFB5X05vbmU7CisKKyAgICB3aGlsZSAocm93KSB7CisgICAgICAgIHJvdyA9IGN1cnNvcl9pdGVybmV4dChzZWxmKTsKKyAgICAgICAgaWYgKHJvdykgeworICAgICAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCByb3cpOworICAgICAgICAgICAgUHlfREVDUkVGKHJvdyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgrK2NvdW50ZXIgPT0gbWF4cm93cykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworUHlPYmplY3QqIGN1cnNvcl9mZXRjaGFsbChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQoreworICAgIFB5T2JqZWN0KiByb3c7CisgICAgUHlPYmplY3QqIGxpc3Q7CisKKyAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIWxpc3QpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoganVzdCBtYWtlIHN1cmUgd2UgZW50ZXIgdGhlIGxvb3AgKi8KKyAgICByb3cgPSAoUHlPYmplY3QqKVB5X05vbmU7CisKKyAgICB3aGlsZSAocm93KSB7CisgICAgICAgIHJvdyA9IGN1cnNvcl9pdGVybmV4dChzZWxmKTsKKyAgICAgICAgaWYgKHJvdykgeworICAgICAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCByb3cpOworICAgICAgICAgICAgUHlfREVDUkVGKHJvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KK30KKworUHlPYmplY3QqIHB5c3FsaXRlX25vb3AoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgLyogZG9uJ3QgY2FyZSwgcmV0dXJuIE5vbmUgKi8KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK1B5T2JqZWN0KiBjdXJzb3JfY2xvc2UoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKK3sKKyAgICBpZiAoIWNoZWNrX3RocmVhZChzZWxmLT5jb25uZWN0aW9uKSB8fCAhY2hlY2tfY29ubmVjdGlvbihzZWxmLT5jb25uZWN0aW9uKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+c3RhdGVtZW50KSB7CisgICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzZWxmLT5zdGF0ZW1lbnQpOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50KTsKKyAgICAgICAgc2VsZi0+c3RhdGVtZW50ID0gMDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBjdXJzb3JfbWV0aG9kc1tdID0geworICAgIHsiZXhlY3V0ZSIsIChQeUNGdW5jdGlvbiljdXJzb3JfZXhlY3V0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4iKX0sCisgICAgeyJleGVjdXRlbWFueSIsIChQeUNGdW5jdGlvbiljdXJzb3JfZXhlY3V0ZW1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXBlYXRlZGx5IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4iKX0sCisgICAgeyJleGVjdXRlc2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9leGVjdXRlc2NyaXB0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiRXhlY3V0ZXMgYSBtdWx0aXBsZSBTUUwgc3RhdGVtZW50cyBhdCBvbmNlLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsiZmV0Y2hvbmUiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2ZldGNob25lLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGZXRjaGVzIHNldmVyYWwgcm93cyBmcm9tIHRoZSByZXN1bHRzZXQuIil9LAorICAgIHsiZmV0Y2htYW55IiwgKFB5Q0Z1bmN0aW9uKWN1cnNvcl9mZXRjaG1hbnksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJGZXRjaGVzIGFsbCByb3dzIGZyb20gdGhlIHJlc3VsdHNldC4iKX0sCisgICAgeyJmZXRjaGFsbCIsIChQeUNGdW5jdGlvbiljdXJzb3JfZmV0Y2hhbGwsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkZldGNoZXMgb25lIHJvdyBmcm9tIHRoZSByZXN1bHRzZXQuIil9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY3Vyc29yX2Nsb3NlLCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJDbG9zZXMgdGhlIGN1cnNvci4iKX0sCisgICAgeyJzZXRpbnB1dHNpemVzIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX25vb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXF1aXJlZCBieSBEQi1BUEkuIERvZXMgbm90aGluZyBpbiBweXNxbGl0ZS4iKX0sCisgICAgeyJzZXRvdXRwdXRzaXplIiwgKFB5Q0Z1bmN0aW9uKXB5c3FsaXRlX25vb3AsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJSZXF1aXJlZCBieSBEQi1BUEkuIERvZXMgbm90aGluZyBpbiBweXNxbGl0ZS4iKX0sCisgICAge05VTEwsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIGN1cnNvcl9tZW1iZXJzW10gPQoreworICAgIHsiY29ubmVjdGlvbiIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIGNvbm5lY3Rpb24pLCBST30sCisgICAgeyJkZXNjcmlwdGlvbiIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIGRlc2NyaXB0aW9uKSwgUk99LAorICAgIHsiYXJyYXlzaXplIiwgVF9JTlQsIG9mZnNldG9mKEN1cnNvciwgYXJyYXlzaXplKSwgMH0sCisgICAgeyJsYXN0cm93aWQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ3Vyc29yLCBsYXN0cm93aWQpLCBST30sCisgICAgeyJyb3djb3VudCIsIFRfT0JKRUNULCBvZmZzZXRvZihDdXJzb3IsIHJvd2NvdW50KSwgUk99LAorICAgIHsicm93X2ZhY3RvcnkiLCBUX09CSkVDVCwgb2Zmc2V0b2YoQ3Vyc29yLCByb3dfZmFjdG9yeSksIDB9LAorICAgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IEN1cnNvclR5cGUgPSB7CisgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgICAgIE1PRFVMRV9OQU1FICIuQ3Vyc29yIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgICAgc2l6ZW9mKEN1cnNvciksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAgIChkZXN0cnVjdG9yKWN1cnNvcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19IQVZFX0lURVJ8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIChnZXRpdGVyZnVuYyljdXJzb3JfZ2V0aXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgKGl0ZXJuZXh0ZnVuYyljdXJzb3JfaXRlcm5leHQsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgY3Vyc29yX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICBjdXJzb3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYyljdXJzb3JfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgY3Vyc29yX3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgQ3Vyc29yVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZDdXJzb3JUeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaCBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU2Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIGN1cnNvci5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjdXJzb3IgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfQ1VSU09SX0gKKyNkZWZpbmUgUFlTUUxJVEVfQ1VSU09SX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKworI2luY2x1ZGUgInN0YXRlbWVudC5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29ubmVjdGlvbiogY29ubmVjdGlvbjsKKyAgICBQeU9iamVjdCogZGVzY3JpcHRpb247CisgICAgUHlPYmplY3QqIHJvd19jYXN0X21hcDsKKyAgICBpbnQgYXJyYXlzaXplOworICAgIFB5T2JqZWN0KiBsYXN0cm93aWQ7CisgICAgUHlPYmplY3QqIHJvd2NvdW50OworICAgIFB5T2JqZWN0KiByb3dfZmFjdG9yeTsKKyAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKworICAgIC8qIHRoZSBuZXh0IHJvdyB0byBiZSByZXR1cm5lZCwgTlVMTCBpZiBubyBuZXh0IHJvdyBhdmFpbGFibGUgKi8KKyAgICBQeU9iamVjdCogbmV4dF9yb3c7Cit9IEN1cnNvcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTVEFURU1FTlRfSU5WQUxJRCwgU1RBVEVNRU5UX0lOU0VSVCwgU1RBVEVNRU5UX0RFTEVURSwKKyAgICBTVEFURU1FTlRfVVBEQVRFLCBTVEFURU1FTlRfUkVQTEFDRSwgU1RBVEVNRU5UX1NFTEVDVCwKKyAgICBTVEFURU1FTlRfT1RIRVIKK30gU3RhdGVtZW50S2luZDsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBDdXJzb3JUeXBlOworCitpbnQgY3Vyc29yX2luaXQoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Cit2b2lkIGN1cnNvcl9kZWFsbG9jKEN1cnNvciogc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGUoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2V4ZWN1dGVtYW55KEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9nZXRpdGVyKEN1cnNvciAqc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2l0ZXJuZXh0KEN1cnNvciAqc2VsZik7CitQeU9iamVjdCogY3Vyc29yX2ZldGNob25lKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9mZXRjaG1hbnkoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncyk7CitQeU9iamVjdCogY3Vyc29yX2ZldGNoYWxsKEN1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIHB5c3FsaXRlX25vb3AoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOworUHlPYmplY3QqIGN1cnNvcl9jbG9zZShDdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKKworaW50IGN1cnNvcl9zZXR1cF90eXBlcyh2b2lkKTsKKworI2RlZmluZSBVTktOT1dOICgtMSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmMgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU2YWMwCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIG1pY3JvcHJvdG9jb2xzLmMgLSBtaW5pbWFsaXN0IGFuZCBub24tdmFsaWRhdGluZyBwcm90b2NvbHMgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBGZWRlcmljbyBEaSBHcmVnb3JpbyA8Zm9nQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHN5Y29wZyBhbmQgd2FzIGFkYXB0ZWQgZm9yIHB5c3FsaXRlLiBGZWRlcmljbyBEaQorICogR3JlZ29yaW8gZ2F2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgaXQgd2l0aGluIHB5c3FsaXRlIHVuZGVyIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8c3RydWN0bWVtYmVyLmg+CisKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKworCisvKiogdGhlIGFkYXB0ZXJzIHJlZ2lzdHJ5ICoqLworCitQeU9iamVjdCAqcHN5Y29fYWRhcHRlcnM7CisKKy8qIG1pY3JvcHJvdG9jb2xzX2luaXQgLSBpbml0aWFsaXplIHRoZSBhZGFwdGVycyBkaWN0aW9uYXJ5ICovCisKK2ludAorbWljcm9wcm90b2NvbHNfaW5pdChQeU9iamVjdCAqZGljdCkKK3sKKyAgICAvKiBjcmVhdGUgYWRhcHRlcnMgZGljdGlvbmFyeSBhbmQgcHV0IGl0IGluIG1vZHVsZSBuYW1lc3BhY2UgKi8KKyAgICBpZiAoKHBzeWNvX2FkYXB0ZXJzID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImFkYXB0ZXJzIiwgcHN5Y29fYWRhcHRlcnMpOworfQorCisKKy8qIG1pY3JvcHJvdG9jb2xzX2FkZCAtIGFkZCBhIHJldmVyc2UgdHlwZS1jYXN0ZXIgdG8gdGhlIGRpY3Rpb25hcnkgKi8KKworaW50CittaWNyb3Byb3RvY29sc19hZGQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqcHJvdG8sIFB5T2JqZWN0ICpjYXN0KQoreworICAgIFB5T2JqZWN0KiBrZXk7CisgICAgaW50IHJjOworCisgICAgaWYgKHByb3RvID09IE5VTEwpIHByb3RvID0gKFB5T2JqZWN0KikmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworICAgIGtleSA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCAoUHlPYmplY3QqKXR5cGUsIHByb3RvKTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmMgPSBQeURpY3RfU2V0SXRlbShwc3ljb19hZGFwdGVycywga2V5LCBjYXN0KTsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKworICAgIHJldHVybiByYzsKK30KKworLyogbWljcm9wcm90b2NvbHNfYWRhcHQgLSBhZGFwdCBhbiBvYmplY3QgdG8gdGhlIGJ1aWx0LWluIHByb3RvY29sICovCisKK1B5T2JqZWN0ICoKK21pY3JvcHJvdG9jb2xzX2FkYXB0KFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpwcm90bywgUHlPYmplY3QgKmFsdCkKK3sKKyAgICBQeU9iamVjdCAqYWRhcHRlciwgKmtleTsKKworICAgIC8qIHdlIGRvbid0IGNoZWNrIGZvciBleGFjdCB0eXBlIGNvbmZvcm1hbmNlIGFzIHNwZWNpZmllZCBpbiBQRVAgMjQ2CisgICAgICAgYmVjYXVzZSB0aGUgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSB0eXBlIGlzIGFic3RyYWN0IGFuZCB0aGVyZSBpcyBubworICAgICAgIHdheSB0byBnZXQgYSBxdW90YWJsZSBvYmplY3QgdG8gYmUgaXRzIGluc3RhbmNlICovCisKKyAgICAvKiBsb29rIGZvciBhbiBhZGFwdGVyIGluIHRoZSByZWdpc3RyeSAqLworICAgIGtleSA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCAoUHlPYmplY3QqKW9iai0+b2JfdHlwZSwgcHJvdG8pOworICAgIGlmICgha2V5KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhZGFwdGVyID0gUHlEaWN0X0dldEl0ZW0ocHN5Y29fYWRhcHRlcnMsIGtleSk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgaWYgKGFkYXB0ZXIpIHsKKyAgICAgICAgUHlPYmplY3QgKmFkYXB0ZWQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGFkYXB0ZXIsIG9iaiwgTlVMTCk7CisgICAgICAgIHJldHVybiBhZGFwdGVkOworICAgIH0KKworICAgIC8qIHRyeSB0byBoYXZlIHRoZSBwcm90b2NvbCBhZGFwdCB0aGlzIG9iamVjdCovCisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcocHJvdG8sICJfX2FkYXB0X18iKSkgeworICAgICAgICBQeU9iamVjdCAqYWRhcHRlZCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHJvdG8sICJfX2FkYXB0X18iLCAiTyIsIG9iaik7CisgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICBpZiAoYWRhcHRlZCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpICYmICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBhbmQgZmluYWxseSB0cnkgdG8gaGF2ZSB0aGUgb2JqZWN0IGFkYXB0IGl0c2VsZiAqLworICAgIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG9iaiwgIl9fY29uZm9ybV9fIikpIHsKKyAgICAgICAgUHlPYmplY3QgKmFkYXB0ZWQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgIl9fY29uZm9ybV9fIiwiTyIsIHByb3RvKTsKKyAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgIGlmIChhZGFwdGVkICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgJiYgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlbHNlIHNldCB0aGUgcmlnaHQgZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCAqLworICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiY2FuJ3QgYWRhcHQiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIG1vZHVsZS1sZXZlbCBmdW5jdGlvbnMgKiovCisKK1B5T2JqZWN0ICoKK3BzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0KEN1cnNvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKm9iaiwgKmFsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnByb3RvID0gKFB5T2JqZWN0KikmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPTyIsICZvYmosICZwcm90bywgJmFsdCkpIHJldHVybiBOVUxMOworICAgIHJldHVybiBtaWNyb3Byb3RvY29sc19hZGFwdChvYmosIHByb3RvLCBhbHQpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmggYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmQ5YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogbWljcm9wcm90b2NvbHMuYyAtIGRlZmluaXRpb25zIGZvciBtaW5pbWFsaXN0IGFuZCBub24tdmFsaWRhdGluZyBwcm90b2NvbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBGZWRlcmljbyBEaSBHcmVnb3JpbyA8Zm9nQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHN5Y29wZyBhbmQgd2FzIGFkYXB0ZWQgZm9yIHB5c3FsaXRlLiBGZWRlcmljbyBEaQorICogR3JlZ29yaW8gZ2F2ZSB0aGUgcGVybWlzc2lvbiB0byB1c2UgaXQgd2l0aGluIHB5c3FsaXRlIHVuZGVyIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIFBTWUNPUEdfTUlDUk9QUk9UT0NPTFNfSAorI2RlZmluZSBQU1lDT1BHX01JQ1JPUFJPVE9DT0xTX0ggMQorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIGFkYXB0ZXJzIHJlZ2lzdHJ5ICoqLworCitleHRlcm4gUHlPYmplY3QgKnBzeWNvX2FkYXB0ZXJzOworCisvKiogdGhlIG5hbWVzIG9mIHRoZSB0aHJlZSBtYW5kYXRvcnkgbWV0aG9kcyAqKi8KKworI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRRVU9URURfTkFNRSAiZ2V0cXVvdGVkIgorI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRTVFJJTkdfTkFNRSAiZ2V0c3RyaW5nIgorI2RlZmluZSBNSUNST1BST1RPQ09MU19HRVRCSU5BUllfTkFNRSAiZ2V0YmluYXJ5IgorCisvKiogZXhwb3J0ZWQgZnVuY3Rpb25zICoqLworCisvKiB1c2VkIGJ5IG1vZHVsZS5jIHRvIGluaXQgdGhlIG1pY3JvcHJvdG9jb2xzIHN5c3RlbSAqLworZXh0ZXJuIGludCBtaWNyb3Byb3RvY29sc19pbml0KFB5T2JqZWN0ICpkaWN0KTsKK2V4dGVybiBpbnQgbWljcm9wcm90b2NvbHNfYWRkKAorICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnByb3RvLCBQeU9iamVjdCAqY2FzdCk7CitleHRlcm4gUHlPYmplY3QgKm1pY3JvcHJvdG9jb2xzX2FkYXB0KAorICAgIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpwcm90bywgUHlPYmplY3QgKmFsdCk7CisKK2V4dGVybiBQeU9iamVjdCAqCisgICAgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQoQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCAqYXJncyk7ICAgCisjZGVmaW5lIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvYyBcCisgICAgImFkYXB0KG9iaiwgcHJvdG9jb2wsIGFsdGVybmF0ZSkgLT4gYWRhcHQgb2JqIHRvIGdpdmVuIHByb3RvY29sIgorICAgIAorI2VuZGlmIC8qICFkZWZpbmVkKFBTWUNPUEdfTUlDUk9QUk9UT0NPTFNfSCkgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM3ZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0wLDAgKzEsMzI1IEBACisvKiBtb2R1bGUuYyAtIHRoZSBtb2R1bGUgaXRzZWxmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInByZXBhcmVfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgorI2luY2x1ZGUgInJvdy5oIgorCisjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKKyNkZWZpbmUgSEFWRV9TSEFSRURfQ0FDSEUKKyNlbmRpZgorCisvKiBzdGF0aWMgb2JqZWN0cyBhdCBtb2R1bGUtbGV2ZWwgKi8KKworUHlPYmplY3QqIEVycm9yLCAqV2FybmluZywgKkludGVyZmFjZUVycm9yLCAqRGF0YWJhc2VFcnJvciwgKkludGVybmFsRXJyb3IsCisgICAgKk9wZXJhdGlvbmFsRXJyb3IsICpQcm9ncmFtbWluZ0Vycm9yLCAqSW50ZWdyaXR5RXJyb3IsICpEYXRhRXJyb3IsCisgICAgKk5vdFN1cHBvcnRlZEVycm9yLCAqT3B0aW1pemVkVW5pY29kZTsKKworUHlPYmplY3QqIGNvbnZlcnRlcnM7CisKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2Nvbm5lY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKKyAgICAgICAga3dhcmdzKQoreworICAgIC8qIFB5dGhvbiBzZWVtcyB0byBoYXZlIG5vIHdheSBvZiBleHRyYWN0aW5nIGEgc2luZ2xlIGtleXdvcmQtYXJnIGF0CisgICAgICogQy1sZXZlbCwgc28gdGhpcyBjb2RlIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBvbmUgaW4gY29ubmVjdGlvbl9pbml0IGluCisgICAgICogY29ubmVjdGlvbi5jIGFuZCBtdXN0IGFsd2F5cyBiZSBjb3BpZWQgZnJvbSB0aGVyZSAuLi4gKi8KKworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YWJhc2UiLCAidGltZW91dCIsICJkZXRlY3RfdHlwZXMiLCAiaXNvbGF0aW9uX2xldmVsIiwgImNoZWNrX3NhbWVfdGhyZWFkIiwgImZhY3RvcnkiLCAiY2FjaGVkX3N0YXRlbWVudHMiLCBOVUxMLCBOVUxMfTsKKyAgICBjaGFyKiBkYXRhYmFzZTsKKyAgICBpbnQgZGV0ZWN0X3R5cGVzID0gMDsKKyAgICBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsOworICAgIFB5T2JqZWN0KiBmYWN0b3J5ID0gTlVMTDsKKyAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQgPSAxOworICAgIGludCBjYWNoZWRfc3RhdGVtZW50czsKKyAgICBkb3VibGUgdGltZW91dCA9IDUuMDsKKworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGRpT2lPaSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YWJhc2UsICZ0aW1lb3V0LCAmZGV0ZWN0X3R5cGVzLCAmaXNvbGF0aW9uX2xldmVsLCAmY2hlY2tfc2FtZV90aHJlYWQsICZmYWN0b3J5LCAmY2FjaGVkX3N0YXRlbWVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7IAorICAgIH0KKworICAgIGlmIChmYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgZmFjdG9yeSA9IChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZmFjdG9yeSwgYXJncywga3dhcmdzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2NvbXBsZXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqCisgICAgICAgIGt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InN0YXRlbWVudCIsIE5VTEwsIE5VTEx9OworICAgIGNoYXIqIHN0YXRlbWVudDsKKworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzIiwga3dsaXN0LCAmc3RhdGVtZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICBpZiAoc3FsaXRlM19jb21wbGV0ZShzdGF0ZW1lbnQpKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfRmFsc2U7CisgICAgfQorCisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKK3N0YXRpYyBQeU9iamVjdCogbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoKKyAgICAgICAga3dhcmdzKQoreworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9fZW5hYmxlIiwgTlVMTCwgTlVMTH07CisgICAgaW50IGRvX2VuYWJsZTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpIiwga3dsaXN0LCAmZG9fZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOyAKKyAgICB9CisKKyAgICByYyA9IHNxbGl0ZTNfZW5hYmxlX3NoYXJlZF9jYWNoZShkb19lbmFibGUpOworCisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisjZW5kaWYgLyogSEFWRV9TSEFSRURfQ0FDSEUgKi8KKworc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlUeXBlT2JqZWN0KiB0eXBlOworICAgIFB5T2JqZWN0KiBjYXN0ZXI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cGUsICZjYXN0ZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1pY3JvcHJvdG9jb2xzX2FkZCh0eXBlLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBjYXN0ZXIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIFB5T2JqZWN0KiBuYW1lOworICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmbmFtZSwgJmNhbGxhYmxlKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oY29udmVydGVycywgbmFtZSwgY2FsbGFibGUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCit2b2lkIGNvbnZlcnRlcnNfaW5pdChQeU9iamVjdCogZGljdCkKK3sKKyAgICBjb252ZXJ0ZXJzID0gUHlEaWN0X05ldygpOworICAgIGlmICghY29udmVydGVycykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImNvbnZlcnRlcnMiLCBjb252ZXJ0ZXJzKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CisgICAgeyJjb25uZWN0IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29ubmVjdCwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb25uZWN0aW9uLiIpfSwKKyAgICB7ImNvbXBsZXRlX3N0YXRlbWVudCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2NvbXBsZXRlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ2hlY2tzIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4iKX0sCisjaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKKyAgICB7ImVuYWJsZV9zaGFyZWRfY2FjaGUiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiRW5hYmxlIG9yIGRpc2FibGUgc2hhcmVkIGNhY2hlIG1vZGUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4iKX0sCisjZW5kaWYKKyAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIil9LAorICAgIHsicmVnaXN0ZXJfY29udmVydGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYSBjb252ZXJ0ZXIgd2l0aCBzcWxpdGUuIil9LAorICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0LCBNRVRIX1ZBUkFSR1MsIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvY30sCisgICAge05VTEwsIE5VTEx9Cit9OworCitQeU1PRElOSVRfRlVOQyBpbml0X3NxbGl0ZTModm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKKyAgICBQeU9iamVjdCAqdG1wX29iajsKKworICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9zcWxpdGUzIiwgbW9kdWxlX21ldGhvZHMpOworCisgICAgaWYgKCFtb2R1bGUgfHwKKyAgICAgICAgKHJvd19zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKGN1cnNvcl9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKGNvbm5lY3Rpb25fc2V0dXBfdHlwZXMoKSA8IDApIHx8CisgICAgICAgIChjYWNoZV9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKHN0YXRlbWVudF9zZXR1cF90eXBlcygpIDwgMCkgfHwKKyAgICAgICAgKHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXMoKSA8IDApCisgICAgICAgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoJkNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopICZDb25uZWN0aW9uVHlwZSk7CisgICAgUHlfSU5DUkVGKCZDdXJzb3JUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ3Vyc29yIiwgKFB5T2JqZWN0KikgJkN1cnNvclR5cGUpOworICAgIFB5X0lOQ1JFRigmQ2FjaGVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiU3RhdGVtZW50IiwgKFB5T2JqZWN0KikmU3RhdGVtZW50VHlwZSk7CisgICAgUHlfSU5DUkVGKCZTdGF0ZW1lbnRUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ2FjaGUiLCAoUHlPYmplY3QqKSAmQ2FjaGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQcmVwYXJlUHJvdG9jb2wiLCAoUHlPYmplY3QqKSAmU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZSk7CisgICAgUHlfSU5DUkVGKCZSb3dUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiUm93IiwgKFB5T2JqZWN0KikgJlJvd1R5cGUpOworCisgICAgaWYgKCEoZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKioqIENyZWF0ZSBEQi1BUEkgRXhjZXB0aW9uIGhpZXJhcmNoeSAqLworCisgICAgaWYgKCEoRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5FcnJvciIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiRXJyb3IiLCBFcnJvcik7CisKKyAgICBpZiAoIShXYXJuaW5nID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuV2FybmluZyIsIFB5RXhjX1N0YW5kYXJkRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiV2FybmluZyIsIFdhcm5pbmcpOworCisgICAgLyogRXJyb3Igc3ViY2xhc3NlcyAqLworCisgICAgaWYgKCEoSW50ZXJmYWNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcmZhY2VFcnJvciIsIEVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkludGVyZmFjZUVycm9yIiwgSW50ZXJmYWNlRXJyb3IpOworCisgICAgaWYgKCEoRGF0YWJhc2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLkRhdGFiYXNlRXJyb3IiLCBFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJEYXRhYmFzZUVycm9yIiwgRGF0YWJhc2VFcnJvcik7CisKKyAgICAvKiBEYXRhYmFzZUVycm9yIHN1YmNsYXNzZXMgKi8KKworICAgIGlmICghKEludGVybmFsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5JbnRlcm5hbEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJJbnRlcm5hbEVycm9yIiwgSW50ZXJuYWxFcnJvcik7CisKKyAgICBpZiAoIShPcGVyYXRpb25hbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuT3BlcmF0aW9uYWxFcnJvciIsIERhdGFiYXNlRXJyb3IsIE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3BlcmF0aW9uYWxFcnJvciIsIE9wZXJhdGlvbmFsRXJyb3IpOworCisgICAgaWYgKCEoUHJvZ3JhbW1pbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLlByb2dyYW1taW5nRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlByb2dyYW1taW5nRXJyb3IiLCBQcm9ncmFtbWluZ0Vycm9yKTsKKworICAgIGlmICghKEludGVncml0eUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKE1PRFVMRV9OQU1FICIuSW50ZWdyaXR5RXJyb3IiLCBEYXRhYmFzZUVycm9yLE5VTEwpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiSW50ZWdyaXR5RXJyb3IiLCBJbnRlZ3JpdHlFcnJvcik7CisKKyAgICBpZiAoIShEYXRhRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oTU9EVUxFX05BTUUgIi5EYXRhRXJyb3IiLCBEYXRhYmFzZUVycm9yLCBOVUxMKSkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIkRhdGFFcnJvciIsIERhdGFFcnJvcik7CisKKyAgICBpZiAoIShOb3RTdXBwb3J0ZWRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbihNT0RVTEVfTkFNRSAiLk5vdFN1cHBvcnRlZEVycm9yIiwgRGF0YWJhc2VFcnJvciwgTlVMTCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJOb3RTdXBwb3J0ZWRFcnJvciIsIE5vdFN1cHBvcnRlZEVycm9yKTsKKworICAgIC8qIFdlIGp1c3QgbmVlZCAic29tZXRoaW5nIiB1bmlxdWUgZm9yIE9wdGltaXplZFVuaWNvZGUuIEl0IGRvZXMgbm90IHJlYWxseQorICAgICAqIG5lZWQgdG8gYmUgYSBzdHJpbmcgc3ViY2xhc3MuIEp1c3QgYW55dGhpbmcgdGhhdCBjYW4gYWN0IGFzIGEgc3BlY2lhbAorICAgICAqIG1hcmtlciBmb3IgdXMuIFNvIEkgcHVsbGVkIFB5Q2VsbF9UeXBlIG91dCBvZiBteSBtYWdpYyBoYXQuCisgICAgICovCisgICAgUHlfSU5DUkVGKChQeU9iamVjdCopJlB5Q2VsbF9UeXBlKTsKKyAgICBPcHRpbWl6ZWRVbmljb2RlID0gKFB5T2JqZWN0KikmUHlDZWxsX1R5cGU7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIk9wdGltaXplZFVuaWNvZGUiLCBPcHRpbWl6ZWRVbmljb2RlKTsKKworICAgIGlmICghKHRtcF9vYmogPSBQeUludF9Gcm9tTG9uZyhQQVJTRV9ERUNMVFlQRVMpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfREVDTFRZUEVTIiwgdG1wX29iaik7CisKKyAgICBpZiAoISh0bXBfb2JqID0gUHlJbnRfRnJvbUxvbmcoUEFSU0VfQ09MTkFNRVMpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfQ09MTkFNRVMiLCB0bXBfb2JqKTsKKworICAgIGlmICghKHRtcF9vYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFBZU1FMSVRFX1ZFUlNJT04pKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAidmVyc2lvbiIsIHRtcF9vYmopOworCisgICAgaWYgKCEodG1wX29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3FsaXRlM19saWJ2ZXJzaW9uKCkpKSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAic3FsaXRlX3ZlcnNpb24iLCB0bXBfb2JqKTsKKworICAgIC8qIGluaXRpYWxpemUgbWljcm9wcm90b2NvbHMgbGF5ZXIgKi8KKyAgICBtaWNyb3Byb3RvY29sc19pbml0KGRpY3QpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjb252ZXJ0ZXJzICovCisgICAgY29udmVydGVyc19pbml0KGRpY3QpOworCisgICAgLyogT3JpZ2luYWwgY29tbWVudCBmb3JtIF9ic2RkYi5jIGluIHRoZSBQeXRob24gY29yZS4gVGhpcyBpcyBhbHNvIHN0aWxsCisgICAgICogbmVlZGVkIG5vd2FkYXlzIGZvciBQeXRob24gMi4zLzIuNC4KKyAgICAgKiAKKyAgICAgKiBQeUV2YWxfSW5pdFRocmVhZHMgaXMgY2FsbGVkIGhlcmUgZHVlIHRvIGEgcXVpcmsgaW4gcHl0aG9uIDEuNQorICAgICAqIC0gMi4yLjEgKGF0IGxlYXN0KSBhY2NvcmRpbmcgdG8gUnVzc2VsbCBXaWxsaWFtc29uIDxtZXJlbEB3dC5uZXQ+OgorICAgICAqIFRoZSBnbG9iYWwgaW50ZXJlcHJldGVyIGxvY2sgaXMgbm90IGluaXRpYWxpemVkIHVudGlsIHRoZSBmaXJzdAorICAgICAqIHRocmVhZCBpcyBjcmVhdGVkIHVzaW5nIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKCkgb3IgZm9yaygpIGlzCisgICAgICogY2FsbGVkLiAgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQUxMT1dfVEhSRUFEUyBoZXJlIHRvIHNlZ2ZhdWx0IGR1ZQorICAgICAqIHRvIGEgbnVsbCBwb2ludGVyIHJlZmVyZW5jZSBpZiBubyB0aHJlYWRzIG9yIGNoaWxkIHByb2Nlc3NlcworICAgICAqIGhhdmUgYmVlbiBjcmVhdGVkLiAgVGhpcyB3b3JrcyBhcm91bmQgdGhhdCBhbmQgaXMgYSBuby1vcCBpZgorICAgICAqIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICogIChzZWUgcHlic2RkYi11c2VycyBtYWlsaW5nIGxpc3QgcG9zdCBvbiAyMDAyLTA4LTA3KQorICAgICAqLworICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOworCitlcnJvcjoKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgTU9EVUxFX05BTUUgIjogaW5pdCBmYWlsZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmggYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5NDczNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaApAQCAtMCwwICsxLDU1IEBACisvKiBtb2R1bGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9NT0RVTEVfSAorI2RlZmluZSBQWVNRTElURV9NT0RVTEVfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjZGVmaW5lIFBZU1FMSVRFX1ZFUlNJT04gIjIuMi4wIgorCitleHRlcm4gUHlPYmplY3QqIEVycm9yOworZXh0ZXJuIFB5T2JqZWN0KiBXYXJuaW5nOworZXh0ZXJuIFB5T2JqZWN0KiBJbnRlcmZhY2VFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogRGF0YWJhc2VFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogSW50ZXJuYWxFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogT3BlcmF0aW9uYWxFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogUHJvZ3JhbW1pbmdFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogSW50ZWdyaXR5RXJyb3I7CitleHRlcm4gUHlPYmplY3QqIERhdGFFcnJvcjsKK2V4dGVybiBQeU9iamVjdCogTm90U3VwcG9ydGVkRXJyb3I7CisKK2V4dGVybiBQeU9iamVjdCogT3B0aW1pemVkVW5pY29kZTsKKworLyogdGhlIGZ1bmN0aW9ucyB0aW1lLnRpbWUoKSBhbmQgdGltZS5zbGVlcCgpICovCitleHRlcm4gUHlPYmplY3QqIHRpbWVfdGltZTsKK2V4dGVybiBQeU9iamVjdCogdGltZV9zbGVlcDsKKworLyogQSBkaWN0aW9uYXJ5LCBtYXBwaW5nIGNvbHVtIHR5cGVzIChJTlRFR0VSLCBWQVJDSEFSLCBldGMuKSB0byBjb252ZXJ0ZXIKKyAqIGZ1bmN0aW9ucywgdGhhdCBjb252ZXJ0IHRoZSBTUUwgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIFB5dGhvbiB2YWx1ZS4KKyAqIFRoZSBrZXkgaXMgdXBwZXJjYXNlLgorICovCitleHRlcm4gUHlPYmplY3QqIGNvbnZlcnRlcnM7CisKKyNkZWZpbmUgUEFSU0VfREVDTFRZUEVTIDEKKyNkZWZpbmUgUEFSU0VfQ09MTkFNRVMgMgorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcHJlcGFyZV9wcm90b2NvbC5jIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI2NjNiCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDg0IEBACisvKiBwcmVwYXJlX3Byb3RvY29sLmMgLSB0aGUgcHJvdG9jb2wgZm9yIHByZXBhcmluZyB2YWx1ZXMgZm9yIFNRTGl0ZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisKK2ludCBwcmVwYXJlX3Byb3RvY29sX2luaXQoU1FMaXRlUHJlcGFyZVByb3RvY29sKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwcmVwYXJlX3Byb3RvY29sX2RlYWxsb2MoU1FMaXRlUHJlcGFyZVByb3RvY29sKiBzZWxmKQoreworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworUHlUeXBlT2JqZWN0IFNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGU9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5QcmVwYXJlUHJvdG9jb2wiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoU1FMaXRlUHJlcGFyZVByb3RvY29sKSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpcHJlcGFyZV9wcm90b2NvbF9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpcHJlcGFyZV9wcm90b2NvbF9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IHByZXBhcmVfcHJvdG9jb2xfc2V0dXBfdHlwZXModm9pZCkKK3sKKyAgICBTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIFNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUub2JfdHlwZT0gJlB5VHlwZV9UeXBlOworICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJlNRTGl0ZVByZXBhcmVQcm90b2NvbFR5cGUpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuaCBiL01vZHVsZXMvX3NxbGl0ZS9wcmVwYXJlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNGY2MQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9wcmVwYXJlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw0MSBAQAorLyogcHJlcGFyZV9wcm90b2NvbC5oIC0gdGhlIHByb3RvY29sIGZvciBwcmVwYXJpbmcgdmFsdWVzIGZvciBTUUxpdGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9QUkVQQVJFX1BST1RPQ09MX0gKKyNkZWZpbmUgUFlTUUxJVEVfUFJFUEFSRV9QUk9UT0NPTF9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorfSBTUUxpdGVQcmVwYXJlUHJvdG9jb2w7CisKK2V4dGVybiBQeVR5cGVPYmplY3QgU1FMaXRlUHJlcGFyZVByb3RvY29sVHlwZTsKKworaW50IHByZXBhcmVfcHJvdG9jb2xfaW5pdChTUUxpdGVQcmVwYXJlUHJvdG9jb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKK3ZvaWQgcHJlcGFyZV9wcm90b2NvbF9kZWFsbG9jKFNRTGl0ZVByZXBhcmVQcm90b2NvbCogc2VsZik7CisKK2ludCBwcmVwYXJlX3Byb3RvY29sX3NldHVwX3R5cGVzKHZvaWQpOworCisjZGVmaW5lIFVOS05PV04gKC0xKQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcm93LmMgYi9Nb2R1bGVzL19zcWxpdGUvcm93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNjEzNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuYwpAQCAtMCwwICsxLDIwMiBAQAorLyogcm93LmMgLSBhbiBlbmhhbmNlZCB0dXBsZSBmb3IgZGF0YWJhc2Ugcm93cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJyb3cuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKKwordm9pZCByb3dfZGVhbGxvYyhSb3cqIHNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kYXRhKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRlc2NyaXB0aW9uKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworaW50IHJvd19pbml0KFJvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgUHlPYmplY3QqIGRhdGE7CisgICAgQ3Vyc29yKiBjdXJzb3I7CisKKyAgICBzZWxmLT5kYXRhID0gMDsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmN1cnNvciwgJmRhdGEpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIVB5T2JqZWN0X0lzSW5zdGFuY2UoKFB5T2JqZWN0KiljdXJzb3IsIChQeU9iamVjdCopJkN1cnNvclR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBvZiBjdXJzb3IgcmVxdWlyZWQgZm9yIGZpcnN0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soZGF0YSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR1cGxlIHJlcXVpcmVkIGZvciBzZWNvbmQgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihkYXRhKTsKKyAgICBzZWxmLT5kYXRhID0gZGF0YTsKKworICAgIFB5X0lOQ1JFRihjdXJzb3ItPmRlc2NyaXB0aW9uKTsKKyAgICBzZWxmLT5kZXNjcmlwdGlvbiA9IGN1cnNvci0+ZGVzY3JpcHRpb247CisKKyAgICByZXR1cm4gMDsKK30KKworUHlPYmplY3QqIHJvd19zdWJzY3JpcHQoUm93KiBzZWxmLCBQeU9iamVjdCogaWR4KQoreworICAgIGxvbmcgX2lkeDsKKyAgICBjaGFyKiBrZXk7CisgICAgaW50IG5pdGVtcywgaTsKKyAgICBjaGFyKiBjb21wYXJlX2tleTsKKworICAgIGNoYXIqIHAxOworICAgIGNoYXIqIHAyOworCisgICAgUHlPYmplY3QqIGl0ZW07CisKKyAgICBpZiAoUHlJbnRfQ2hlY2soaWR4KSkgeworICAgICAgICBfaWR4ID0gUHlJbnRfQXNMb25nKGlkeCk7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+ZGF0YSwgX2lkeCk7CisgICAgICAgIFB5X1hJTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlkeCkpIHsKKyAgICAgICAgX2lkeCA9IFB5TG9uZ19Bc0xvbmcoaWR4KTsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBfaWR4KTsKKyAgICAgICAgUHlfWElOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhpZHgpKSB7CisgICAgICAgIGtleSA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkeCk7CisKKyAgICAgICAgbml0ZW1zID0gUHlUdXBsZV9TaXplKHNlbGYtPmRlc2NyaXB0aW9uKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbml0ZW1zOyBpKyspIHsKKyAgICAgICAgICAgIGNvbXBhcmVfa2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HRVRfSVRFTShQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmRlc2NyaXB0aW9uLCBpKSwgMCkpOworICAgICAgICAgICAgaWYgKCFjb21wYXJlX2tleSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwMSA9IGtleTsKKyAgICAgICAgICAgIHAyID0gY29tcGFyZV9rZXk7CisKKyAgICAgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgaWYgKCgqcDEgPT0gKGNoYXIpMCkgfHwgKCpwMiA9PSAoY2hhcikwKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCpwMSB8IDB4MjApICE9ICgqcDIgfCAweDIwKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwMSsrOworICAgICAgICAgICAgICAgIHAyKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKnAxID09IChjaGFyKTApICYmICgqcDIgPT0gKGNoYXIpMCkpIHsKKyAgICAgICAgICAgICAgICAvKiBmb3VuZCBpdGVtICovCisgICAgICAgICAgICAgICAgaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5kYXRhLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiTm8gaXRlbSB3aXRoIHRoYXQga2V5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpZHgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2xpY2VzIG5vdCBpbXBsZW1lbnRlZCwgeWV0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiSW5kZXggbXVzdCBiZSBpbnQgb3Igc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworUHlfc3NpemVfdCByb3dfbGVuZ3RoKFJvdyogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCit7CisgICAgcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcm93X3ByaW50KFJvdyogc2VsZiwgRklMRSAqZnAsIGludCBmbGFncykKK3sKKyAgICByZXR1cm4gKCZQeVR1cGxlX1R5cGUpLT50cF9wcmludChzZWxmLT5kYXRhLCBmcCwgZmxhZ3MpOworfQorCisKK1B5TWFwcGluZ01ldGhvZHMgcm93X2FzX21hcHBpbmcgPSB7CisgICAgLyogbXBfbGVuZ3RoICAgICAgICAqLyAobGVuZnVuYylyb3dfbGVuZ3RoLAorICAgIC8qIG1wX3N1YnNjcmlwdCAgICAgKi8gKGJpbmFyeWZ1bmMpcm93X3N1YnNjcmlwdCwKKyAgICAvKiBtcF9hc3Nfc3Vic2NyaXB0ICovIChvYmpvYmphcmdwcm9jKTAsCit9OworCisKK1B5VHlwZU9iamVjdCBSb3dUeXBlID0geworICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICAgICBNT0RVTEVfTkFNRSAiLlJvdyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihSb3cpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3Rvcilyb3dfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIChwcmludGZ1bmMpcm93X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAgIChpbml0cHJvYylyb3dfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KK307CisKK2V4dGVybiBpbnQgcm93X3NldHVwX3R5cGVzKHZvaWQpCit7CisgICAgUm93VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBSb3dUeXBlLnRwX2FzX21hcHBpbmcgPSAmcm93X2FzX21hcHBpbmc7CisgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmUm93VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcm93LmggYi9Nb2R1bGVzL19zcWxpdGUvcm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDgzYwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuaApAQCAtMCwwICsxLDM5IEBACisvKiByb3cuaCAtIGFuIGVuaGFuY2VkIHR1cGxlIGZvciBkYXRhYmFzZSByb3dzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpZm5kZWYgUFlTUUxJVEVfUk9XX0gKKyNkZWZpbmUgUFlTUUxJVEVfUk9XX0gKKyNpbmNsdWRlICJQeXRob24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JvdworeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCogZGF0YTsKKyAgICBQeU9iamVjdCogZGVzY3JpcHRpb247Cit9IFJvdzsKKworZXh0ZXJuIFB5VHlwZU9iamVjdCBSb3dUeXBlOworCitpbnQgcm93X3NldHVwX3R5cGVzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zcWxpdGVjb21wYXQuaCBiL01vZHVsZXMvX3NxbGl0ZS9zcWxpdGVjb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc5ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3NxbGl0ZWNvbXBhdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHNxbGl0ZWNvbXBhdC5oIC0gY29tcGF0aWJpbGl0eSBtYWNyb3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9DT01QQVRfSAorI2RlZmluZSBQWVNRTElURV9DT01QQVRfSAorCisvKiBkZWZpbmUgUHlfc3NpemVfdCBmb3IgcHJlLTIuNSB2ZXJzaW9ucyBvZiBQeXRob24gKi8KKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMAordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKK3R5cGVkZWYgaW50ICgqbGVuZnVuYykoUHlPYmplY3QqKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkzNjUxCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCkBAIC0wLDAgKzEsNDI3IEBACisvKiBzdGF0ZW1lbnQuYyAtIHRoZSBzdGF0ZW1lbnQgdHlwZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJzdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJjdXJzb3IuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAibWljcm9wcm90b2NvbHMuaCIKKyNpbmNsdWRlICJwcmVwYXJlX3Byb3RvY29sLmgiCisjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCisKKy8qIHByb3RvdHlwZXMgKi8KK2ludCBjaGVja19yZW1haW5pbmdfc3FsKGNvbnN0IGNoYXIqIHRhaWwpOworCit0eXBlZGVmIGVudW0geworICAgIExJTkVDT01NRU5UXzEsCisgICAgSU5fTElORUNPTU1FTlQsCisgICAgQ09NTUVOVFNUQVJUXzEsCisgICAgSU5fQ09NTUVOVCwKKyAgICBDT01NRU5URU5EXzEsCisgICAgTk9STUFMCit9IHBhcnNlX3JlbWFpbmluZ19zcWxfc3RhdGU7CisKK2ludCBzdGF0ZW1lbnRfY3JlYXRlKFN0YXRlbWVudCogc2VsZiwgQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCkKK3sKKyAgICBjb25zdCBjaGFyKiB0YWlsOworICAgIGludCByYzsKKyAgICBQeU9iamVjdCogc3FsX3N0cjsKKyAgICBjaGFyKiBzcWxfY3N0cjsKKworICAgIHNlbGYtPnN0ID0gTlVMTDsKKyAgICBzZWxmLT5pbl91c2UgPSAwOworCisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNxbCkpIHsKKyAgICAgICAgc3FsX3N0ciA9IHNxbDsKKyAgICAgICAgUHlfSU5DUkVGKHNxbF9zdHIpOworICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNxbCkpIHsKKyAgICAgICAgc3FsX3N0ciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoc3FsKTsKKyAgICAgICAgaWYgKCFzcWxfc3RyKSB7CisgICAgICAgICAgICByYyA9IFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBQWVNRTElURV9TUUxfV1JPTkdfVFlQRTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHNlbGYtPnNxbCA9IHNxbF9zdHI7CisKKyAgICBzcWxfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNxbF9zdHIpOworCisgICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoY29ubmVjdGlvbi0+ZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsKKworICAgIHNlbGYtPmRiID0gY29ubmVjdGlvbi0+ZGI7CisKKyAgICBpZiAocmMgPT0gU1FMSVRFX09LICYmIGNoZWNrX3JlbWFpbmluZ19zcWwodGFpbCkpIHsKKyAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CisgICAgICAgIHNlbGYtPnN0ID0gTlVMTDsKKyAgICAgICAgcmMgPSBQWVNRTElURV9UT09fTVVDSF9TUUw7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKFN0YXRlbWVudCogc2VsZiwgaW50IHBvcywgUHlPYmplY3QqIHBhcmFtZXRlcikKK3sKKyAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CisgICAgbG9uZyBsb25ndmFsOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgUFlfTE9OR19MT05HIGxvbmdsb25ndmFsOworI2VuZGlmCisgICAgY29uc3QgY2hhciogYnVmZmVyOworICAgIGNoYXIqIHN0cmluZzsKKyAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKKyAgICBQeU9iamVjdCogc3RyaW5ndmFsOworCisgICAgaWYgKHBhcmFtZXRlciA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX251bGwoc2VsZi0+c3QsIHBvcyk7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocGFyYW1ldGVyKTsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NClsb25ndmFsKTsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgbG9uZ2xvbmd2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhwYXJhbWV0ZXIpOworICAgICAgICAvKiBpbiB0aGUgb3ZlcmZsb3cgZXJyb3IgY2FzZSwgbG9uZ2xvbmd2YWwgaXMgLTEsIGFuZCBhbiBleGNlcHRpb24gaXMgc2V0ICovCisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2ludDY0KHNlbGYtPnN0LCBwb3MsIChzcWxpdGVfaW50NjQpbG9uZ2xvbmd2YWwpOworI2VuZGlmCisgICAgfSBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHBhcmFtZXRlcikpIHsKKyAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfZG91YmxlKHNlbGYtPnN0LCBwb3MsIFB5RmxvYXRfQXNEb3VibGUocGFyYW1ldGVyKSk7CisgICAgfSBlbHNlIGlmIChQeUJ1ZmZlcl9DaGVjayhwYXJhbWV0ZXIpKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CisgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9ibG9iKHNlbGYtPnN0LCBwb3MsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSB7CisgICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHBhcmFtZXRlcik7CisgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX3RleHQoc2VsZi0+c3QsIHBvcywgc3RyaW5nLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CisgICAgfSBlbHNlIGlmIFB5VW5pY29kZV9DaGVjayhwYXJhbWV0ZXIpIHsKKyAgICAgICAgc3RyaW5ndmFsID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhwYXJhbWV0ZXIpOworICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpOworICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKFN0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMpCit7CisgICAgUHlPYmplY3QqIGN1cnJlbnRfcGFyYW07CisgICAgUHlPYmplY3QqIGFkYXB0ZWQ7CisgICAgY29uc3QgY2hhciogYmluZGluZ19uYW1lOworICAgIGludCBpOworICAgIGludCByYzsKKyAgICBpbnQgbnVtX3BhcmFtc19uZWVkZWQ7CisgICAgaW50IG51bV9wYXJhbXM7CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgbnVtX3BhcmFtc19uZWVkZWQgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX2NvdW50KHNlbGYtPnN0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKFB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSkgeworICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBkaWN0aW9uYXJ5ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX3BhcmFtc19uZWVkZWQ7IGkrKykgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgYmluZGluZ19uYW1lID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9uYW1lKHNlbGYtPnN0LCBpKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICBpZiAoIWJpbmRpbmdfbmFtZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLCAiQmluZGluZyAlZCBoYXMgbm8gbmFtZSwgYnV0IHlvdSBzdXBwbGllZCBhIGRpY3Rpb25hcnkgKHdoaWNoIGhhcyBvbmx5IG5hbWVzKS4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmRpbmdfbmFtZSsrOyAvKiBza2lwIGZpcnN0IGNoYXIgKHRoZSBjb2xvbikgKi8KKyAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCBiaW5kaW5nX25hbWUpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFByb2dyYW1taW5nRXJyb3IsICJZb3UgZGlkIG5vdCBzdXBwbHkgYSB2YWx1ZSBmb3IgYmluZGluZyAlZC4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFB5X0lOQ1JFRihjdXJyZW50X3BhcmFtKTsKKyAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChhZGFwdGVkKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cnJlbnRfcGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IHN0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihzZWxmLCBpLCBhZGFwdGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChJbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyIDolcyAtIHByb2JhYmx5IHVuc3VwcG9ydGVkIHR5cGUuIiwgYmluZGluZ19uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIHNlcXVlbmNlICovCisgICAgICAgIG51bV9wYXJhbXMgPSBQeVNlcXVlbmNlX0xlbmd0aChwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKG51bV9wYXJhbXMgIT0gbnVtX3BhcmFtc19uZWVkZWQpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQcm9ncmFtbWluZ0Vycm9yLCAiSW5jb3JyZWN0IG51bWJlciBvZiBiaW5kaW5ncyBzdXBwbGllZC4gVGhlIGN1cnJlbnQgc3RhdGVtZW50IHVzZXMgJWQsIGFuZCB0aGVyZSBhcmUgJWQgc3VwcGxpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zX25lZWRlZCwgbnVtX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJhbXM7IGkrKykgeworICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYXJhbWV0ZXJzLCBpKTsKKyAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkYXB0ZWQgPSBtaWNyb3Byb3RvY29sc19hZGFwdChjdXJyZW50X3BhcmFtLCAoUHlPYmplY3QqKSZTUUxpdGVQcmVwYXJlUHJvdG9jb2xUeXBlLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGkgKyAxLCBhZGFwdGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKKworICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChJbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyICVkIC0gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZS4iLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBzdGF0ZW1lbnRfcmVjb21waWxlKFN0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyKiB0YWlsOworICAgIGludCByYzsKKyAgICBjaGFyKiBzcWxfY3N0cjsKKyAgICBzcWxpdGUzX3N0bXQqIG5ld19zdDsKKworICAgIHNxbF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+c3FsKTsKKworICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNxbF9jc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhaWwpOworCisgICAgaWYgKHJjID09IFNRTElURV9PSykgeworICAgICAgICAvKiBUaGUgZWZmaWNpZW50IHNxbGl0ZTNfdHJhbnNmZXJfYmluZGluZ3MgaXMgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlCisgICAgICAgICAqIHZlcnNpb24gMy4yLjIgb3IgbGF0ZXIuIEZvciBvbGRlciBTUUxpdGUgcmVsZWFzZXMsIHRoYXQgbWlnaHQgbm90CisgICAgICAgICAqIGV2ZW4gZGVmaW5lIFNRTElURV9WRVJTSU9OX05VTUJFUiwgd2UgZG8gaXQgdGhlIG1hbnVhbCB3YXkuCisgICAgICAgICAqLworICAgICAgICAjaWZkZWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSCisgICAgICAgICNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMgorICAgICAgICAodm9pZClzcWxpdGUzX3RyYW5zZmVyX2JpbmRpbmdzKHNlbGYtPnN0LCBuZXdfc3QpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhzZWxmLCBwYXJhbXMpOworICAgICAgICAjZW5kaWYKKworICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKKyAgICAgICAgc2VsZi0+c3QgPSBuZXdfc3Q7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhdGVtZW50X2ZpbmFsaXplKFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IFNRTElURV9PSzsKKyAgICBpZiAoc2VsZi0+c3QpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5zdCA9IE5VTEw7CisgICAgfQorCisgICAgc2VsZi0+aW5fdXNlID0gMDsKKworICAgIHJldHVybiByYzsKK30KKworaW50IHN0YXRlbWVudF9yZXNldChTdGF0ZW1lbnQqIHNlbGYpCit7CisgICAgaW50IHJjOworCisgICAgcmMgPSBTUUxJVEVfT0s7CisKKyAgICBpZiAoc2VsZi0+aW5fdXNlICYmIHNlbGYtPnN0KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmMgPSBzcWxpdGUzX3Jlc2V0KHNlbGYtPnN0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CisgICAgICAgICAgICBzZWxmLT5pbl91c2UgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHN0YXRlbWVudF9tYXJrX2RpcnR5KFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBzZWxmLT5pbl91c2UgPSAxOworfQorCit2b2lkIHN0YXRlbWVudF9kZWFsbG9jKFN0YXRlbWVudCogc2VsZikKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoc2VsZi0+c3QpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIHNlbGYtPnN0ID0gTlVMTDsKKworICAgIFB5X1hERUNSRUYoc2VsZi0+c3FsKTsKKworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKK30KKworLyoKKyAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0IGluIGFuIFNRTCBzdHJpbmcgYWZ0ZXIgU1FMaXRlIGNvbXBpbGVkIGl0LgorICogVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGlmIHNvbWVib2R5IHRyaWVkIHRvIGV4ZWN1dGUgbW9yZSB0aGFuIG9uZSBTUUwgY29tbWFuZAorICogd2l0aCBvbmUgZXhlY3V0ZSgpL2V4ZWN1dGVtYW55KCkgY29tbWFuZCwgd2hpY2ggdGhlIERCLUFQSSBhbmQgd2UgZG9uJ3QKKyAqIGFsbG93LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBtb3JlIGxlZnQgdGhhbiBzaG91bGQgYmUuIDAgaWYgb2suCisgKi8KK2ludCBjaGVja19yZW1haW5pbmdfc3FsKGNvbnN0IGNoYXIqIHRhaWwpCit7CisgICAgY29uc3QgY2hhciogcG9zID0gdGFpbDsKKworICAgIHBhcnNlX3JlbWFpbmluZ19zcWxfc3RhdGUgc3RhdGUgPSBOT1JNQUw7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN3aXRjaCAoKnBvcykgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSAgPSBMSU5FQ09NTUVOVF8xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gTElORUNPTU1FTlRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0xJTkVDT01NRU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gSU5fTElORUNPTU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTU1FTlRTVEFSVF8xOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gTk9STUFMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVFNUQVJUXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IExJTkVDT01NRU5UXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVEVORF8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IENPTU1FTlRFTkRfMSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fQ09NTUVOVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBvcysrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitQeVR5cGVPYmplY3QgU3RhdGVtZW50VHlwZSA9IHsKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAgICAgTU9EVUxFX05BTUUgIi5TdGF0ZW1lbnQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgICBzaXplb2YoU3RhdGVtZW50KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgICAgKGRlc3RydWN0b3Ipc3RhdGVtZW50X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgICAgICAoaW5pdHByb2MpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCit9OworCitleHRlcm4gaW50IHN0YXRlbWVudF9zZXR1cF90eXBlcyh2b2lkKQoreworICAgIFN0YXRlbWVudFR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgcmV0dXJuIFB5VHlwZV9SZWFkeSgmU3RhdGVtZW50VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmggYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YTBmYwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaApAQCAtMCwwICsxLDU4IEBACisvKiBzdGF0ZW1lbnQuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgc3RhdGVtZW50IHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9TVEFURU1FTlRfSAorI2RlZmluZSBQWVNRTElURV9TVEFURU1FTlRfSAorI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInNxbGl0ZTMuaCIKKworI2RlZmluZSBQWVNRTElURV9UT09fTVVDSF9TUUwgKC0xMDApCisjZGVmaW5lIFBZU1FMSVRFX1NRTF9XUk9OR19UWVBFICgtMTAxKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBzcWxpdGUzKiBkYjsKKyAgICBzcWxpdGUzX3N0bXQqIHN0OworICAgIFB5T2JqZWN0KiBzcWw7CisgICAgaW50IGluX3VzZTsKK30gU3RhdGVtZW50OworCitleHRlcm4gUHlUeXBlT2JqZWN0IFN0YXRlbWVudFR5cGU7CisKK2ludCBzdGF0ZW1lbnRfY3JlYXRlKFN0YXRlbWVudCogc2VsZiwgQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCk7Cit2b2lkIHN0YXRlbWVudF9kZWFsbG9jKFN0YXRlbWVudCogc2VsZik7CisKK2ludCBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoU3RhdGVtZW50KiBzZWxmLCBpbnQgcG9zLCBQeU9iamVjdCogcGFyYW1ldGVyKTsKK3ZvaWQgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhTdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbWV0ZXJzKTsKKworaW50IHN0YXRlbWVudF9yZWNvbXBpbGUoU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycyk7CitpbnQgc3RhdGVtZW50X2ZpbmFsaXplKFN0YXRlbWVudCogc2VsZik7CitpbnQgc3RhdGVtZW50X3Jlc2V0KFN0YXRlbWVudCogc2VsZik7Cit2b2lkIHN0YXRlbWVudF9tYXJrX2RpcnR5KFN0YXRlbWVudCogc2VsZik7CisKK2ludCBzdGF0ZW1lbnRfc2V0dXBfdHlwZXModm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NDhhNgotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKQEAgLTAsMCArMSw5NiBAQAorLyogdXRpbC5jIC0gdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyAqCisgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICovCisKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKK2ludCBfc3FsaXRlX3N0ZXBfd2l0aF9idXN5aGFuZGxlcihzcWxpdGUzX3N0bXQqIHN0YXRlbWVudCwgQ29ubmVjdGlvbiogY29ubmVjdGlvbgorKQoreworICAgIGludCByYzsKKworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IHNxbGl0ZTNfc3RlcChzdGF0ZW1lbnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJlZCkuCisgKi8KK2ludCBfc2V0ZXJyb3Ioc3FsaXRlMyogZGIpCit7CisgICAgaW50IGVycm9yY29kZTsKKworICAgIGVycm9yY29kZSA9IHNxbGl0ZTNfZXJyY29kZShkYik7CisKKyAgICBzd2l0Y2ggKGVycm9yY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgU1FMSVRFX09LOgorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9JTlRFUk5BTDoKKyAgICAgICAgY2FzZSBTUUxJVEVfTk9URk9VTkQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW50ZXJuYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9OT01FTToKKyAgICAgICAgICAgICh2b2lkKVB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfRVJST1I6CisgICAgICAgIGNhc2UgU1FMSVRFX1BFUk06CisgICAgICAgIGNhc2UgU1FMSVRFX0FCT1JUOgorICAgICAgICBjYXNlIFNRTElURV9CVVNZOgorICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CisgICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgorICAgICAgICBjYXNlIFNRTElURV9JTlRFUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX0lPRVJSOgorICAgICAgICBjYXNlIFNRTElURV9GVUxMOgorICAgICAgICBjYXNlIFNRTElURV9DQU5UT1BFTjoKKyAgICAgICAgY2FzZSBTUUxJVEVfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgU1FMSVRFX0VNUFRZOgorICAgICAgICBjYXNlIFNRTElURV9TQ0hFTUE6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfVE9PQklHOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DT05TVFJBSU5UOgorICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbnRlZ3JpdHlFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9NSVNVU0U6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlM19lcnJtc2coZGIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERhdGFiYXNlRXJyb3IsIHNxbGl0ZTNfZXJybXNnKGRiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3Jjb2RlOworfQorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTlhNGRkCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaApAQCAtMCwwICsxLDM4IEBACisvKiB1dGlsLmggLSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorICoKKyAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisgKi8KKworI2lmbmRlZiBQWVNRTElURV9VVElMX0gKKyNkZWZpbmUgUFlTUUxJVEVfVVRJTF9ICisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAicHl0aHJlYWQuaCIKKyNpbmNsdWRlICJzcWxpdGUzLmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorCitpbnQgX3NxbGl0ZV9zdGVwX3dpdGhfYnVzeWhhbmRsZXIoc3FsaXRlM19zdG10KiBzdGF0ZW1lbnQsIENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pOworCisvKioKKyAqIENoZWNrcyB0aGUgU1FMaXRlIGVycm9yIGNvZGUgYW5kIHNldHMgdGhlIGFwcHJvcHJpYXRlIERCLUFQSSBleGNlcHRpb24uCisgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VyZWQpLgorICovCitpbnQgX3NldGVycm9yKHNxbGl0ZTMqIGRiKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3JlLmMgYi9Nb2R1bGVzL19zcmUuYwppbmRleCA4MTIyM2Q3Li40YWYwOGVkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcmUuYworKysgYi9Nb2R1bGVzL19zcmUuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgICAgICAgICBkYXRhX3N0YWNrX2RlYWxsb2Moc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIFNSRV9FUlJPUl9NRU1PUlk7CiAgICAgICAgIH0KLSAgICAgICAgc3RhdGUtPmRhdGFfc3RhY2sgPSBzdGFjazsKKyAgICAgICAgc3RhdGUtPmRhdGFfc3RhY2sgPSAoY2hhciAqKXN0YWNrOwogICAgICAgICBzdGF0ZS0+ZGF0YV9zdGFja19zaXplID0gY3Vyc2l6ZTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0zMzUsNyArMzM1LDcgQEAKIHsKICAgICAvKiBjaGVjayBpZiBwb2ludGVyIGlzIGF0IGdpdmVuIHBvc2l0aW9uICovCiAKLSAgICBpbnQgdGhpcywgdGhhdDsKKyAgICBpbnQgdGhpc3AsIHRoYXRwOwogCiAgICAgc3dpdGNoIChhdCkgewogCkBAIC0zNjIsNTcgKzM2Miw1NyBAQAogICAgIGNhc2UgU1JFX0FUX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX0lTX1dPUkQoKGludCkgcHRyWy0xXSkgOiAwOwotICAgICAgICB0aGlzID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPworICAgICAgICB0aGlzcCA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KICAgICAgICAgICAgIFNSRV9JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9OT05fQk9VTkRBUlk6CiAgICAgICAgIGlmIChzdGF0ZS0+YmVnaW5uaW5nID09IHN0YXRlLT5lbmQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgdGhhdCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KKyAgICAgICAgdGhhdHAgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CiAgICAgICAgICAgICBTUkVfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKIAogICAgIGNhc2UgU1JFX0FUX0xPQ19CT1VOREFSWToKICAgICAgICAgaWYgKHN0YXRlLT5iZWdpbm5pbmcgPT0gc3RhdGUtPmVuZCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB0aGF0ID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPworICAgICAgICB0aGF0cCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KICAgICAgICAgICAgIFNSRV9MT0NfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX0xPQ19JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9MT0NfTk9OX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX0xPQ19JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfTE9DX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKIAogI2lmIGRlZmluZWQoSEFWRV9VTklDT0RFKQogICAgIGNhc2UgU1JFX0FUX1VOSV9CT1VOREFSWToKICAgICAgICAgaWYgKHN0YXRlLT5iZWdpbm5pbmcgPT0gc3RhdGUtPmVuZCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB0aGF0ID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPworICAgICAgICB0aGF0cCA9ICgodm9pZCopIHB0ciA+IHN0YXRlLT5iZWdpbm5pbmcpID8KICAgICAgICAgICAgIFNSRV9VTklfSVNfV09SRCgoaW50KSBwdHJbLTFdKSA6IDA7Ci0gICAgICAgIHRoaXMgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CisgICAgICAgIHRoaXNwID0gKCh2b2lkKikgcHRyIDwgc3RhdGUtPmVuZCkgPwogICAgICAgICAgICAgU1JFX1VOSV9JU19XT1JEKChpbnQpIHB0clswXSkgOiAwOwotICAgICAgICByZXR1cm4gdGhpcyAhPSB0aGF0OworICAgICAgICByZXR1cm4gdGhpc3AgIT0gdGhhdHA7CiAKICAgICBjYXNlIFNSRV9BVF9VTklfTk9OX0JPVU5EQVJZOgogICAgICAgICBpZiAoc3RhdGUtPmJlZ2lubmluZyA9PSBzdGF0ZS0+ZW5kKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHRoYXQgPSAoKHZvaWQqKSBwdHIgPiBzdGF0ZS0+YmVnaW5uaW5nKSA/CisgICAgICAgIHRoYXRwID0gKCh2b2lkKikgcHRyID4gc3RhdGUtPmJlZ2lubmluZykgPwogICAgICAgICAgICAgU1JFX1VOSV9JU19XT1JEKChpbnQpIHB0clstMV0pIDogMDsKLSAgICAgICAgdGhpcyA9ICgodm9pZCopIHB0ciA8IHN0YXRlLT5lbmQpID8KKyAgICAgICAgdGhpc3AgPSAoKHZvaWQqKSBwdHIgPCBzdGF0ZS0+ZW5kKSA/CiAgICAgICAgICAgICBTUkVfVU5JX0lTX1dPUkQoKGludCkgcHRyWzBdKSA6IDA7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHRoYXQ7CisgICAgICAgIHJldHVybiB0aGlzcCA9PSB0aGF0cDsKICNlbmRpZgogCiAgICAgfQpAQCAtNTE2LDggKzUxNiw4IEBACiBTUkVfQ09VTlQoU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4sIGludCBtYXhjb3VudCkKIHsKICAgICBTUkVfQ09ERSBjaHI7Ci0gICAgU1JFX0NIQVIqIHB0ciA9IHN0YXRlLT5wdHI7Ci0gICAgU1JFX0NIQVIqIGVuZCA9IHN0YXRlLT5lbmQ7CisgICAgU1JFX0NIQVIqIHB0ciA9IChTUkVfQ0hBUiAqKXN0YXRlLT5wdHI7CisgICAgU1JFX0NIQVIqIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgaW50IGk7CiAKICAgICAvKiBhZGp1c3QgZW5kICovCkBAIC04MDMsNyArODAzLDcgQEAKIExPQ0FMKGludCkKIFNSRV9NQVRDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybikKIHsKLSAgICBTUkVfQ0hBUiogZW5kID0gc3RhdGUtPmVuZDsKKyAgICBTUkVfQ0hBUiogZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICBpbnQgYWxsb2NfcG9zLCBjdHhfcG9zID0gLTE7CiAgICAgaW50IGksIHJldCA9IDA7CiAgICAgaW50IGp1bXA7CkBAIC04MjEsNyArODIxLDcgQEAKIAogZW50cmFuY2U6CiAKLSAgICBjdHgtPnB0ciA9IHN0YXRlLT5wdHI7CisgICAgY3R4LT5wdHIgPSAoU1JFX0NIQVIgKilzdGF0ZS0+cHRyOwogCiAgICAgaWYgKGN0eC0+cGF0dGVyblswXSA9PSBTUkVfT1BfSU5GTykgewogICAgICAgICAvKiBvcHRpbWl6YXRpb24gaW5mbyBibG9jayAqLwpAQCAtMTQ3Nyw4ICsxNDc3LDggQEAKIExPQ0FMKGludCkKIFNSRV9TRUFSQ0goU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4pCiB7Ci0gICAgU1JFX0NIQVIqIHB0ciA9IHN0YXRlLT5zdGFydDsKLSAgICBTUkVfQ0hBUiogZW5kID0gc3RhdGUtPmVuZDsKKyAgICBTUkVfQ0hBUiogcHRyID0gKFNSRV9DSEFSICopc3RhdGUtPnN0YXJ0OworICAgIFNSRV9DSEFSKiBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludCBwcmVmaXhfbGVuID0gMDsKICAgICBpbnQgcHJlZml4X3NraXAgPSAwOwpAQCAtMTUyNCw3ICsxNTI0LDcgQEAKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGtub3duIHByZWZpeC4gIHVzZSB0aGUgb3ZlcmxhcAogICAgICAgICAgICB0YWJsZSB0byBza2lwIGZvcndhcmQgYXMgZmFzdCBhcyB3ZSBwb3NzaWJseSBjYW4gKi8KICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBlbmQgPSBzdGF0ZS0+ZW5kOworICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7CiAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgaWYgKChTUkVfQ09ERSkgcHRyWzBdICE9IHByZWZpeFtpXSkgewpAQCAtMTU1OSw3ICsxNTU5LDcgQEAKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGxpdGVyYWwgY2hhcmFjdGVyLiAgdGhpcyBpcyB1c2VkCiAgICAgICAgICAgIGZvciBzaG9ydCBwcmVmaXhlcywgYW5kIGlmIGZhc3Qgc2VhcmNoIGlzIGRpc2FibGVkICovCiAgICAgICAgIFNSRV9DT0RFIGNociA9IHBhdHRlcm5bMV07Ci0gICAgICAgIGVuZCA9IHN0YXRlLT5lbmQ7CisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQgJiYgKFNSRV9DT0RFKSBwdHJbMF0gIT0gY2hyKQogICAgICAgICAgICAgICAgIHB0cisrOwpAQCAtMTU3Niw3ICsxNTc2LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KLSAgICAgICAgZW5kID0gc3RhdGUtPmVuZDsKKyAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCAmJiAhU1JFX0NIQVJTRVQoY2hhcnNldCwgcHRyWzBdKSkKICAgICAgICAgICAgICAgICBwdHIrKzsKQEAgLTE2MTksNzIgKzE2MTksOCBAQAogLyogZmFjdG9yaWVzIGFuZCBkZXN0cnVjdG9ycyAqLwogCiAvKiBzZWUgc3JlLmggZm9yIG9iamVjdCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIFB5VHlwZU9iamVjdCBQYXR0ZXJuX1R5cGU7Ci1zdGF0aWMgUHlUeXBlT2JqZWN0IE1hdGNoX1R5cGU7Ci1zdGF0aWMgUHlUeXBlT2JqZWN0IFNjYW5uZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLV9jb21waWxlKFB5T2JqZWN0KiBzZWxmXywgUHlPYmplY3QqIGFyZ3MpCi17Ci0gICAgLyogImNvbXBpbGUiIHBhdHRlcm4gZGVzY3JpcHRvciB0byBwYXR0ZXJuIG9iamVjdCAqLwotCi0gICAgUGF0dGVybk9iamVjdCogc2VsZjsKLSAgICBpbnQgaSwgbjsKLQotICAgIFB5T2JqZWN0KiBwYXR0ZXJuOwotICAgIGludCBmbGFncyA9IDA7Ci0gICAgUHlPYmplY3QqIGNvZGU7Ci0gICAgaW50IGdyb3VwcyA9IDA7Ci0gICAgUHlPYmplY3QqIGdyb3VwaW5kZXggPSBOVUxMOwotICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwID0gTlVMTDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8aU9PIiwgJnBhdHRlcm4sICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmY29kZSwgJmdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwaW5kZXgsICZpbmRleGdyb3VwKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGNvZGUpOwotCi0gICAgc2VsZiA9IFB5T2JqZWN0X05FV19WQVIoUGF0dGVybk9iamVjdCwgJlBhdHRlcm5fVHlwZSwgbik7Ci0gICAgaWYgKCFzZWxmKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHNlbGYtPmNvZGVzaXplID0gbjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oY29kZSwgaSk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSBQeUludF9DaGVjayhvKSA/ICh1bnNpZ25lZCBsb25nKVB5SW50X0FzTG9uZyhvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHlMb25nX0FzVW5zaWduZWRMb25nKG8pOwotICAgICAgICBzZWxmLT5jb2RlW2ldID0gKFNSRV9DT0RFKSB2YWx1ZTsKLSAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBzZWxmLT5jb2RlW2ldICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIGNvZGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKLSAgICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNlbGYtPmZsYWdzID0gZmxhZ3M7Ci0KLSAgICBzZWxmLT5ncm91cHMgPSBncm91cHM7Ci0KLSAgICBQeV9YSU5DUkVGKGdyb3VwaW5kZXgpOwotICAgIHNlbGYtPmdyb3VwaW5kZXggPSBncm91cGluZGV4OwotCi0gICAgUHlfWElOQ1JFRihpbmRleGdyb3VwKTsKLSAgICBzZWxmLT5pbmRleGdyb3VwID0gaW5kZXhncm91cDsKLQotICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKLQotICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotfQorc3RhdGljIFB5T2JqZWN0KnBhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqLCBTUkVfU1RBVEUqLCBpbnQpOworc3RhdGljIFB5T2JqZWN0KnBhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0KiwgUHlPYmplY3QqKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNyZV9jb2Rlc2l6ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0xOTAwLDk4ICsxODM2LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBQeU9iamVjdCoKLXBhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFNSRV9TVEFURSogc3RhdGUsIGludCBzdGF0dXMpCi17Ci0gICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAoZnJvbSBzdGF0ZSBvYmplY3QpICovCi0KLSAgICBNYXRjaE9iamVjdCogbWF0Y2g7Ci0gICAgaW50IGksIGo7Ci0gICAgY2hhciogYmFzZTsKLSAgICBpbnQgbjsKLQotICAgIGlmIChzdGF0dXMgPiAwKSB7Ci0KLSAgICAgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAod2l0aCByb29tIGZvciBleHRyYSBncm91cCBtYXJrcykgKi8KLSAgICAgICAgbWF0Y2ggPSBQeU9iamVjdF9ORVdfVkFSKE1hdGNoT2JqZWN0LCAmTWF0Y2hfVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKHBhdHRlcm4tPmdyb3VwcysxKSk7Ci0gICAgICAgIGlmICghbWF0Y2gpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBQeV9JTkNSRUYocGF0dGVybik7Ci0gICAgICAgIG1hdGNoLT5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgICAgICBQeV9JTkNSRUYoc3RhdGUtPnN0cmluZyk7Ci0gICAgICAgIG1hdGNoLT5zdHJpbmcgPSBzdGF0ZS0+c3RyaW5nOwotCi0gICAgICAgIG1hdGNoLT5yZWdzID0gTlVMTDsKLSAgICAgICAgbWF0Y2gtPmdyb3VwcyA9IHBhdHRlcm4tPmdyb3VwcysxOwotCi0gICAgICAgIC8qIGZpbGwgaW4gZ3JvdXAgc2xpY2VzICovCi0KLSAgICAgICAgYmFzZSA9IChjaGFyKikgc3RhdGUtPmJlZ2lubmluZzsKLSAgICAgICAgbiA9IHN0YXRlLT5jaGFyc2l6ZTsKLQotICAgICAgICBtYXRjaC0+bWFya1swXSA9ICgoY2hhciopIHN0YXRlLT5zdGFydCAtIGJhc2UpIC8gbjsKLSAgICAgICAgbWF0Y2gtPm1hcmtbMV0gPSAoKGNoYXIqKSBzdGF0ZS0+cHRyIC0gYmFzZSkgLyBuOwotCi0gICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgcGF0dGVybi0+Z3JvdXBzOyBpKyssIGorPTIpCi0gICAgICAgICAgICBpZiAoaisxIDw9IHN0YXRlLT5sYXN0bWFyayAmJiBzdGF0ZS0+bWFya1tqXSAmJiBzdGF0ZS0+bWFya1tqKzFdKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2pdIC0gYmFzZSkgLyBuOwotICAgICAgICAgICAgICAgIG1hdGNoLT5tYXJrW2orM10gPSAoKGNoYXIqKSBzdGF0ZS0+bWFya1tqKzFdIC0gYmFzZSkgLyBuOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9IG1hdGNoLT5tYXJrW2orM10gPSAtMTsgLyogdW5kZWZpbmVkICovCi0KLSAgICAgICAgbWF0Y2gtPnBvcyA9IHN0YXRlLT5wb3M7Ci0gICAgICAgIG1hdGNoLT5lbmRwb3MgPSBzdGF0ZS0+ZW5kcG9zOwotCi0gICAgICAgIG1hdGNoLT5sYXN0aW5kZXggPSBzdGF0ZS0+bGFzdGluZGV4OwotCi0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBtYXRjaDsKLQotICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IDApIHsKLQotICAgICAgICAvKiBubyBtYXRjaCAqLwotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOwotCi0gICAgfQotCi0gICAgLyogaW50ZXJuYWwgZXJyb3IgKi8KLSAgICBwYXR0ZXJuX2Vycm9yKHN0YXR1cyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCoKLXBhdHRlcm5fc2Nhbm5lcihQYXR0ZXJuT2JqZWN0KiBwYXR0ZXJuLCBQeU9iamVjdCogYXJncykKLXsKLSAgICAvKiBjcmVhdGUgc2VhcmNoIHN0YXRlIG9iamVjdCAqLwotCi0gICAgU2Nhbm5lck9iamVjdCogc2VsZjsKLQotICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aWk6c2Nhbm5lciIsICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogY3JlYXRlIHNjYW5uZXIgb2JqZWN0ICovCi0gICAgc2VsZiA9IFB5T2JqZWN0X05FVyhTY2FubmVyT2JqZWN0LCAmU2Nhbm5lcl9UeXBlKTsKLSAgICBpZiAoIXNlbGYpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc2VsZi0+c3RhdGUsIHBhdHRlcm4sIHN0cmluZywgc3RhcnQsIGVuZCk7Ci0gICAgaWYgKCFzdHJpbmcpIHsKLSAgICAgICAgUHlPYmplY3RfREVMKHNlbGYpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBQeV9JTkNSRUYocGF0dGVybik7Ci0gICAgc2VsZi0+cGF0dGVybiA9IChQeU9iamVjdCopIHBhdHRlcm47Ci0KLSAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLX0KLQogc3RhdGljIHZvaWQKIHBhdHRlcm5fZGVhbGxvYyhQYXR0ZXJuT2JqZWN0KiBzZWxmKQogewpAQCAtMjQxNCw3ICsyMjU4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotcGF0dGVybl9zdWJ4KFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiB0ZW1wbGF0ZSwgUHlPYmplY3QqIHN0cmluZywKK3BhdHRlcm5fc3VieChQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogcHRlbXBsYXRlLCBQeU9iamVjdCogc3RyaW5nLAogICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN1Ym4pCiB7CiAgICAgU1JFX1NUQVRFIHN0YXRlOwpAQCAtMjQyOSwyMSArMjI3MywyMSBAQAogICAgIGludCBpLCBiLCBlOwogICAgIGludCBmaWx0ZXJfaXNfY2FsbGFibGU7CiAKLSAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayh0ZW1wbGF0ZSkpIHsKKyAgICBpZiAoUHlDYWxsYWJsZV9DaGVjayhwdGVtcGxhdGUpKSB7CiAgICAgICAgIC8qIHN1Yi9zdWJuIHRha2VzIGVpdGhlciBhIGZ1bmN0aW9uIG9yIGEgdGVtcGxhdGUgKi8KLSAgICAgICAgZmlsdGVyID0gdGVtcGxhdGU7CisgICAgICAgIGZpbHRlciA9IHB0ZW1wbGF0ZTsKICAgICAgICAgUHlfSU5DUkVGKGZpbHRlcik7CiAgICAgICAgIGZpbHRlcl9pc19jYWxsYWJsZSA9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogaWYgbm90IGNhbGxhYmxlLCBjaGVjayBpZiBpdCdzIGEgbGl0ZXJhbCBzdHJpbmcgKi8KICAgICAgICAgaW50IGxpdGVyYWw7Ci0gICAgICAgIHB0ciA9IGdldHN0cmluZyh0ZW1wbGF0ZSwgJm4sICZiKTsKKyAgICAgICAgcHRyID0gZ2V0c3RyaW5nKHB0ZW1wbGF0ZSwgJm4sICZiKTsKICAgICAgICAgaWYgKHB0cikgewogICAgICAgICAgICAgaWYgKGIgPT0gMSkgewotICAgICAgICAgICAgICAgIGxpdGVyYWwgPSBzcmVfbGl0ZXJhbF90ZW1wbGF0ZShwdHIsIG4pOworCQkgICAgbGl0ZXJhbCA9IHNyZV9saXRlcmFsX3RlbXBsYXRlKCh1bnNpZ25lZCBjaGFyICopcHRyLCBuKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAjaWYgZGVmaW5lZChIQVZFX1VOSUNPREUpCi0gICAgICAgICAgICAgICAgbGl0ZXJhbCA9IHNyZV91bGl0ZXJhbF90ZW1wbGF0ZShwdHIsIG4pOworCQkgICAgbGl0ZXJhbCA9IHNyZV91bGl0ZXJhbF90ZW1wbGF0ZSgoUHlfVU5JQ09ERSAqKXB0ciwgbik7CiAjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTI0NTEsMTQgKzIyOTUsMTQgQEAKICAgICAgICAgICAgIGxpdGVyYWwgPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChsaXRlcmFsKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSB0ZW1wbGF0ZTsKKyAgICAgICAgICAgIGZpbHRlciA9IHB0ZW1wbGF0ZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihmaWx0ZXIpOwogICAgICAgICAgICAgZmlsdGVyX2lzX2NhbGxhYmxlID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIG5vdCBhIGxpdGVyYWw7IGhhbmQgaXQgb3ZlciB0byB0aGUgdGVtcGxhdGUgY29tcGlsZXIgKi8KICAgICAgICAgICAgIGZpbHRlciA9IGNhbGwoCiAgICAgICAgICAgICAgICAgU1JFX1BZX01PRFVMRSwgIl9zdWJ4IiwKLSAgICAgICAgICAgICAgICBQeVR1cGxlX1BhY2soMiwgc2VsZiwgdGVtcGxhdGUpCisgICAgICAgICAgICAgICAgUHlUdXBsZV9QYWNrKDIsIHNlbGYsIHB0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgaWYgKCFmaWx0ZXIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yNTk3LDI5ICsyNDQxLDI5IEBACiBzdGF0aWMgUHlPYmplY3QqCiBwYXR0ZXJuX3N1YihQYXR0ZXJuT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewotICAgIFB5T2JqZWN0KiB0ZW1wbGF0ZTsKKyAgICBQeU9iamVjdCogcHRlbXBsYXRlOwogICAgIFB5T2JqZWN0KiBzdHJpbmc7CiAgICAgaW50IGNvdW50ID0gMDsKICAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJyZXBsIiwgInN0cmluZyIsICJjb3VudCIsIE5VTEwgfTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfGk6c3ViIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDApOworICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgcHRlbXBsYXRlLCBzdHJpbmcsIGNvdW50LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcGF0dGVybl9zdWJuKFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3cpCiB7Ci0gICAgUHlPYmplY3QqIHRlbXBsYXRlOworICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKICAgICBpbnQgY291bnQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTCB9OwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098aTpzdWJuIiwga3dsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wbGF0ZSwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRlbXBsYXRlLCAmc3RyaW5nLCAmY291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgdGVtcGxhdGUsIHN0cmluZywgY291bnQsIDEpOworICAgIHJldHVybiBwYXR0ZXJuX3N1Yngoc2VsZiwgcHRlbXBsYXRlLCBzdHJpbmcsIGNvdW50LCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtMjc5OSw2ICsyNjQzLDY4IEBACiAgICAgb2Zmc2V0b2YoUGF0dGVybk9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0ICoKK19jb21waWxlKFB5T2JqZWN0KiBzZWxmXywgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgLyogImNvbXBpbGUiIHBhdHRlcm4gZGVzY3JpcHRvciB0byBwYXR0ZXJuIG9iamVjdCAqLworCisgICAgUGF0dGVybk9iamVjdCogc2VsZjsKKyAgICBpbnQgaSwgbjsKKworICAgIFB5T2JqZWN0KiBwYXR0ZXJuOworICAgIGludCBmbGFncyA9IDA7CisgICAgUHlPYmplY3QqIGNvZGU7CisgICAgaW50IGdyb3VwcyA9IDA7CisgICAgUHlPYmplY3QqIGdyb3VwaW5kZXggPSBOVUxMOworICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTyF8aU9PIiwgJnBhdHRlcm4sICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5TGlzdF9UeXBlLCAmY29kZSwgJmdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwaW5kZXgsICZpbmRleGdyb3VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGNvZGUpOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FV19WQVIoUGF0dGVybk9iamVjdCwgJlBhdHRlcm5fVHlwZSwgbik7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPmNvZGVzaXplID0gbjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oY29kZSwgaSk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUgPSBQeUludF9DaGVjayhvKSA/ICh1bnNpZ25lZCBsb25nKVB5SW50X0FzTG9uZyhvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHlMb25nX0FzVW5zaWduZWRMb25nKG8pOworICAgICAgICBzZWxmLT5jb2RlW2ldID0gKFNSRV9DT0RFKSB2YWx1ZTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBzZWxmLT5jb2RlW2ldICE9IHZhbHVlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIGNvZGUgc2l6ZSBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKKyAgICBzZWxmLT5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgIHNlbGYtPmZsYWdzID0gZmxhZ3M7CisKKyAgICBzZWxmLT5ncm91cHMgPSBncm91cHM7CisKKyAgICBQeV9YSU5DUkVGKGdyb3VwaW5kZXgpOworICAgIHNlbGYtPmdyb3VwaW5kZXggPSBncm91cGluZGV4OworCisgICAgUHlfWElOQ1JFRihpbmRleGdyb3VwKTsKKyAgICBzZWxmLT5pbmRleGdyb3VwID0gaW5kZXhncm91cDsKKworICAgIHNlbGYtPndlYWtyZWZsaXN0ID0gTlVMTDsKKworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogbWF0Y2ggbWV0aG9kcyAqLwogCkBAIC0yODY4LDE0ICsyNzc0LDE0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRjaF9leHBhbmQoTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIFB5T2JqZWN0KiB0ZW1wbGF0ZTsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86ZXhwYW5kIiwgJnRlbXBsYXRlKSkKKyAgICBQeU9iamVjdCogcHRlbXBsYXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpleHBhbmQiLCAmcHRlbXBsYXRlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBkZWxlZ2F0ZSB0byBQeXRob24gY29kZSAqLwogICAgIHJldHVybiBjYWxsKAogICAgICAgICBTUkVfUFlfTU9EVUxFLCAiX2V4cGFuZCIsCi0gICAgICAgIFB5VHVwbGVfUGFjaygzLCBzZWxmLT5wYXR0ZXJuLCBzZWxmLCB0ZW1wbGF0ZSkKKyAgICAgICAgUHlUdXBsZV9QYWNrKDMsIHNlbGYtPnBhdHRlcm4sIHNlbGYsIHB0ZW1wbGF0ZSkKICAgICAgICAgKTsKIH0KIApAQCAtMzI2Miw2ICszMTY4LDY5IEBACiAgICAgKGdldGF0dHJmdW5jKW1hdGNoX2dldGF0dHIgLyp0cF9nZXRhdHRyKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCoKK3BhdHRlcm5fbmV3X21hdGNoKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFNSRV9TVEFURSogc3RhdGUsIGludCBzdGF0dXMpCit7CisgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAoZnJvbSBzdGF0ZSBvYmplY3QpICovCisKKyAgICBNYXRjaE9iamVjdCogbWF0Y2g7CisgICAgaW50IGksIGo7CisgICAgY2hhciogYmFzZTsKKyAgICBpbnQgbjsKKworICAgIGlmIChzdGF0dXMgPiAwKSB7CisKKyAgICAgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAod2l0aCByb29tIGZvciBleHRyYSBncm91cCBtYXJrcykgKi8KKyAgICAgICAgbWF0Y2ggPSBQeU9iamVjdF9ORVdfVkFSKE1hdGNoT2JqZWN0LCAmTWF0Y2hfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKHBhdHRlcm4tPmdyb3VwcysxKSk7CisgICAgICAgIGlmICghbWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBQeV9JTkNSRUYocGF0dGVybik7CisgICAgICAgIG1hdGNoLT5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgICAgICBQeV9JTkNSRUYoc3RhdGUtPnN0cmluZyk7CisgICAgICAgIG1hdGNoLT5zdHJpbmcgPSBzdGF0ZS0+c3RyaW5nOworCisgICAgICAgIG1hdGNoLT5yZWdzID0gTlVMTDsKKyAgICAgICAgbWF0Y2gtPmdyb3VwcyA9IHBhdHRlcm4tPmdyb3VwcysxOworCisgICAgICAgIC8qIGZpbGwgaW4gZ3JvdXAgc2xpY2VzICovCisKKyAgICAgICAgYmFzZSA9IChjaGFyKikgc3RhdGUtPmJlZ2lubmluZzsKKyAgICAgICAgbiA9IHN0YXRlLT5jaGFyc2l6ZTsKKworICAgICAgICBtYXRjaC0+bWFya1swXSA9ICgoY2hhciopIHN0YXRlLT5zdGFydCAtIGJhc2UpIC8gbjsKKyAgICAgICAgbWF0Y2gtPm1hcmtbMV0gPSAoKGNoYXIqKSBzdGF0ZS0+cHRyIC0gYmFzZSkgLyBuOworCisgICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgcGF0dGVybi0+Z3JvdXBzOyBpKyssIGorPTIpCisgICAgICAgICAgICBpZiAoaisxIDw9IHN0YXRlLT5sYXN0bWFyayAmJiBzdGF0ZS0+bWFya1tqXSAmJiBzdGF0ZS0+bWFya1tqKzFdKSB7CisgICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9ICgoY2hhciopIHN0YXRlLT5tYXJrW2pdIC0gYmFzZSkgLyBuOworICAgICAgICAgICAgICAgIG1hdGNoLT5tYXJrW2orM10gPSAoKGNoYXIqKSBzdGF0ZS0+bWFya1tqKzFdIC0gYmFzZSkgLyBuOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbWF0Y2gtPm1hcmtbaisyXSA9IG1hdGNoLT5tYXJrW2orM10gPSAtMTsgLyogdW5kZWZpbmVkICovCisKKyAgICAgICAgbWF0Y2gtPnBvcyA9IHN0YXRlLT5wb3M7CisgICAgICAgIG1hdGNoLT5lbmRwb3MgPSBzdGF0ZS0+ZW5kcG9zOworCisgICAgICAgIG1hdGNoLT5sYXN0aW5kZXggPSBzdGF0ZS0+bGFzdGluZGV4OworCisgICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBtYXRjaDsKKworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IDApIHsKKworICAgICAgICAvKiBubyBtYXRjaCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworCisgICAgfQorCisgICAgLyogaW50ZXJuYWwgZXJyb3IgKi8KKyAgICBwYXR0ZXJuX2Vycm9yKHN0YXR1cyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNjYW5uZXIgbWV0aG9kcyAoZXhwZXJpbWVudGFsKSAqLwogCkBAIC0zMzcyLDYgKzMzNDEsMzYgQEAKICAgICAoZ2V0YXR0cmZ1bmMpc2Nhbm5lcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwogfTsKIAorc3RhdGljIFB5T2JqZWN0KgorcGF0dGVybl9zY2FubmVyKFBhdHRlcm5PYmplY3QqIHBhdHRlcm4sIFB5T2JqZWN0KiBhcmdzKQoreworICAgIC8qIGNyZWF0ZSBzZWFyY2ggc3RhdGUgb2JqZWN0ICovCisKKyAgICBTY2FubmVyT2JqZWN0KiBzZWxmOworCisgICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBpbnQgc3RhcnQgPSAwOworICAgIGludCBlbmQgPSBJTlRfTUFYOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpaTpzY2FubmVyIiwgJnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBjcmVhdGUgc2Nhbm5lciBvYmplY3QgKi8KKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKFNjYW5uZXJPYmplY3QsICZTY2FubmVyX1R5cGUpOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHJpbmcgPSBzdGF0ZV9pbml0KCZzZWxmLT5zdGF0ZSwgcGF0dGVybiwgc3RyaW5nLCBzdGFydCwgZW5kKTsKKyAgICBpZiAoIXN0cmluZykgeworICAgICAgICBQeU9iamVjdF9ERUwoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihwYXR0ZXJuKTsKKyAgICBzZWxmLT5wYXR0ZXJuID0gKFB5T2JqZWN0KikgcGF0dGVybjsKKworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOworfQorCiBzdGF0aWMgUHlNZXRob2REZWYgX2Z1bmN0aW9uc1tdID0gewogICAgIHsiY29tcGlsZSIsIF9jb21waWxlLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0Y29kZXNpemUiLCBzcmVfY29kZXNpemUsIE1FVEhfVkFSQVJHU30sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IDVmNTQxZjUuLjRjMGRhNmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC01NSw3ICs1NSw2IEBACiAJU1NMX0NUWCogCWN0eDsKIAlTU0wqICAgICAJc3NsOwogCVg1MDkqICAgIAlzZXJ2ZXJfY2VydDsKLQlCSU8qCQlzYmlvOwogCWNoYXIgICAgCXNlcnZlcltYNTA5X05BTUVfTUFYTEVOXTsKIAljaGFyCQlpc3N1ZXJbWDUwOV9OQU1FX01BWExFTl07CiAKQEAgLTQ3NCwxNSArNDczLDIyIEBACiAKIAlpZiAoIShidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCBsZW4pKSkKIAkJcmV0dXJuIE5VTEw7CisJCisJLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIGJ5dGVzIHJlYWR5IHRvIGJlIHJlYWQgKi8KKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJY291bnQgPSBTU0xfcGVuZGluZyhzZWxmLT5zc2wpOworCVB5X0VORF9BTExPV19USFJFQURTCiAKLQlzb2Nrc3RhdGUgPSBjaGVja19zb2NrZXRfYW5kX3dhaXRfZm9yX3RpbWVvdXQoc2VsZi0+U29ja2V0LCAwKTsKLQlpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9IQVNfVElNRURfT1VUKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCIpOwotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChzb2Nrc3RhdGUgPT0gU09DS0VUX1RPT19MQVJHRV9GT1JfU0VMRUNUKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVW5kZXJseWluZyBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QoKS4iKTsKLQkJcmV0dXJuIE5VTEw7CisJaWYgKCFjb3VudCkgeworCQlzb2Nrc3RhdGUgPSBjaGVja19zb2NrZXRfYW5kX3dhaXRfZm9yX3RpbWVvdXQoc2VsZi0+U29ja2V0LCAwKTsKKwkJaWYgKHNvY2tzdGF0ZSA9PSBTT0NLRVRfSEFTX1RJTUVEX09VVCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKFB5U1NMRXJyb3JPYmplY3QsICJUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0Iik7CisJCQlQeV9ERUNSRUYoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9IGVsc2UgaWYgKHNvY2tzdGF0ZSA9PSBTT0NLRVRfVE9PX0xBUkdFX0ZPUl9TRUxFQ1QpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeVNTTEVycm9yT2JqZWN0LCAiVW5kZXJseWluZyBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QoKS4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJfQogCWRvIHsKIAkJZXJyID0gMDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDZkOGVhM2MuLmU4ODgxZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtMTAsNyArMTAsNiBAQAogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwotCiBzdGF0aWMgUHlPYmplY3QgKlRlc3RFcnJvcjsJLyogc2V0IHRvIGV4Y2VwdGlvbiBvYmplY3QgaW4gaW5pdCAqLwogCiAvKiBSYWlzZSBUZXN0RXJyb3Igd2l0aCB0ZXN0X25hbWUgKyAiOiAiICsgbXNnLCBhbmQgcmV0dXJuIE5VTEwuICovCkBAIC0yMzUsNyArMjM0LDcgQEAKICNpbmNsdWRlICJ0ZXN0Y2FwaV9sb25nLmgiCiAKIHN0YXRpYyBQeU9iamVjdCAqCi10ZXN0X2xvbmdsb25nX2FwaShQeU9iamVjdCogc2VsZikKK3Rlc3RfbG9uZ2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlyZXR1cm4gVEVTVE5BTUUocmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcik7CiB9CkBAIC0zNjEsNiArMzYwLDE1IEBACiAJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitnZXRhcmdzX24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5X3NzaXplX3QgdmFsdWU7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuIiwgJnZhbHVlKSkKKwlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QodmFsdWUpOworfQorCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0woUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtNDA1LDcgKzQxMyw3IEBACiAKICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotICAgICAgICB2YWx1ZSA9IC0xOworICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQogICAgICAgICAJcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCkBAIC00MjQsNyArNDMyLDcgQEAKIAogICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0JdmFsdWUgPSAtMTsKKwl2YWx1ZSA9IDA7CiAgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQogICAgICAgICAJcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKQEAgLTQ3OCw2ICs0ODYsMjYgQEAKIAlyZXR1cm4gUHlfTm9uZTsKIH0KIAorc3RhdGljCitQeU9iamVjdCAqY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwljb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGVuY29kZXIiLAorCQkJICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOworfQorCitzdGF0aWMKK1B5T2JqZWN0ICpjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZGVjb2RlciIsCisJCQkgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7Cit9CisKICNlbmRpZgogCiAvKiBTaW1wbGUgdGVzdCBvZiBfUHlMb25nX051bUJpdHMgYW5kIF9QeUxvbmdfU2lnbi4gKi8KQEAgLTU2Myw3ICs1OTEsMTcgQEAKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAKLXZvaWQgX21ha2VfY2FsbCh2b2lkICpjYWxsYWJsZSkKKy8qIHRlc3RfdGhyZWFkX3N0YXRlIHNwYXducyBhIHRocmVhZCBvZiBpdHMgb3duLCBhbmQgdGhhdCB0aHJlYWQgcmVsZWFzZXMKKyAqIGB0aHJlYWRfZG9uZWAgd2hlbiBpdCdzIGZpbmlzaGVkLiAgVGhlIGRyaXZlciBjb2RlIGhhcyB0byBrbm93IHdoZW4gdGhlCisgKiB0aHJlYWQgZmluaXNoZXMsIGJlY2F1c2UgdGhlIHRocmVhZCB1c2VzIGEgUHlPYmplY3QgKHRoZSBjYWxsYWJsZSkgdGhhdAorICogbWF5IGdvIGF3YXkgd2hlbiB0aGUgZHJpdmVyIGZpbmlzaGVzLiAgVGhlIGZvcm1lciBsYWNrIG9mIHRoaXMgZXhwbGljaXQKKyAqIHN5bmNocm9uaXphdGlvbiBjYXVzZWQgcmFyZSBzZWdmYXVsdHMsIHNvIHJhcmUgdGhhdCB0aGV5IHdlcmUgc2VlbiBvbmx5CisgKiBvbiBhIE1hYyBidWlsZGJvdCAoYWx0aG91Z2ggdGhleSB3ZXJlIHBvc3NpYmxlIG9uIGFueSBib3gpLgorICovCitzdGF0aWMgUHlUaHJlYWRfdHlwZV9sb2NrIHRocmVhZF9kb25lID0gTlVMTDsKKworc3RhdGljIHZvaWQKK19tYWtlX2NhbGwodm9pZCAqY2FsbGFibGUpCiB7CiAJUHlPYmplY3QgKnJjOwogCVB5R0lMU3RhdGVfU1RBVEUgcyA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CkBAIC01NzIsMzIgKzYxMCw1MyBAQAogCVB5R0lMU3RhdGVfUmVsZWFzZShzKTsKIH0KIAorLyogU2FtZSB0aGluZywgYnV0IHJlbGVhc2VzIGB0aHJlYWRfZG9uZWAgd2hlbiBpdCByZXR1cm5zLiAgVGhpcyB2YXJpYW50CisgKiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbSB0aHJlYWRzIHNwYXduZWQgYnkgdGVzdF90aHJlYWRfc3RhdGUoKS4KKyAqLworc3RhdGljIHZvaWQKK19tYWtlX2NhbGxfZnJvbV90aHJlYWQodm9pZCAqY2FsbGFibGUpCit7CisJX21ha2VfY2FsbChjYWxsYWJsZSk7CisJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfdGhyZWFkX3N0YXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlQeU9iamVjdCAqZm47CisKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dGVzdF90aHJlYWRfc3RhdGUiLCAmZm4pKQogCQlyZXR1cm4gTlVMTDsKLQkvKiBFbnN1cmUgUHl0aG9uIGlzIHNldHVwIGZvciB0aHJlYWRpbmcgKi8KKworCS8qIEVuc3VyZSBQeXRob24gaXMgc2V0IHVwIGZvciB0aHJlYWRpbmcgKi8KIAlQeUV2YWxfSW5pdFRocmVhZHMoKTsKLQkvKiBTdGFydCBhIG5ldyB0aHJlYWQgZm9yIG91ciBjYWxsYmFjay4gKi8KLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCBfbWFrZV9jYWxsLCBmbik7CisJdGhyZWFkX2RvbmUgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisJaWYgKHRocmVhZF9kb25lID09IE5VTEwpCisJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7CisKKwkvKiBTdGFydCBhIG5ldyB0aHJlYWQgd2l0aCBvdXIgY2FsbGJhY2suICovCisJUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CiAJLyogTWFrZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgdGhyZWFkIGxvY2sgaGVsZCBieSB0aGlzIHRocmVhZCAqLwogCV9tYWtlX2NhbGwoZm4pOwogCS8qIERvIGl0IGFsbCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIHRoZSB0aHJlYWQtbG9jayByZWxlYXNlZCAqLwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAlfbWFrZV9jYWxsKGZuKTsKKwlQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOyAgLyogd2FpdCBmb3IgdGhyZWFkIHRvIGZpbmlzaCAqLwogCVB5X0VORF9BTExPV19USFJFQURTCisKIAkvKiBBbmQgb25jZSBtb3JlIHdpdGggYW5kIHdpdGhvdXQgYSB0aHJlYWQKLQkgICBYWFggLSBzaG91bGQgdXNlIGEgbG9jayBhbmQgd29yayBvdXQgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcgCi0JICAgdG8gdGVzdCA8d2luaz4gCisJICAgWFhYIC0gc2hvdWxkIHVzZSBhIGxvY2sgYW5kIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCB3ZSBhcmUgdHJ5aW5nCisJICAgdG8gdGVzdCA8d2luaz4KIAkqLwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKCBfbWFrZV9jYWxsLCBmbik7CisJUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CiAJX21ha2VfY2FsbChmbik7CisJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworCVB5VGhyZWFkX2ZyZWVfbG9jayh0aHJlYWRfZG9uZSk7CisJUHlfUkVUVVJOX05PTkU7CiB9CiAjZW5kaWYKIApAQCAtNjExLDI0ICs2NzAsMjkgQEAKIAl7InRlc3Rfa19jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X2tfY29kZSwJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfbnVsbF9zdHJpbmdzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLAkgTUVUSF9OT0FSR1N9LAogCi0JeyJnZXRhcmdzX2IiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfYiwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19CIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX0IsCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSCIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19ILAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0kiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfSSwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19rIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX2ssCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfaSIsCQkoUHlDRnVuY3Rpb24pZ2V0YXJnc19pLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2wiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfbCwJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19iIiwJCWdldGFyZ3NfYiwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfQiIsCQlnZXRhcmdzX0IsCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX0giLAkJZ2V0YXJnc19ILAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19JIiwJCWdldGFyZ3NfSSwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfayIsCQlnZXRhcmdzX2ssCQkJIE1FVEhfVkFSQVJHU30sCisJeyJnZXRhcmdzX2kiLAkJZ2V0YXJnc19pLAkJCSBNRVRIX1ZBUkFSR1N9LAorCXsiZ2V0YXJnc19sIiwJCWdldGFyZ3NfbCwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfbiIsCQlnZXRhcmdzX24sIAkJCSBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JeyJnZXRhcmdzX0wiLAkJKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfTCwJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19LIiwJCShQeUNGdW5jdGlvbilnZXRhcmdzX0ssCQkgTUVUSF9WQVJBUkdTfSwKLQl7InRlc3RfbG9uZ2xvbmdfYXBpIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ2xvbmdfYXBpLAkgTUVUSF9OT0FSR1N9LAorCXsiZ2V0YXJnc19MIiwJCWdldGFyZ3NfTCwJCQkgTUVUSF9WQVJBUkdTfSwKKwl7ImdldGFyZ3NfSyIsCQlnZXRhcmdzX0ssCQkJIE1FVEhfVkFSQVJHU30sCisJeyJ0ZXN0X2xvbmdsb25nX2FwaSIsCXRlc3RfbG9uZ2xvbmdfYXBpLAkJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfTF9jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X0xfY29kZSwJIE1FVEhfTk9BUkdTfSwKKwl7ImNvZGVjX2luY3JlbWVudGFsZW5jb2RlciIsCisJIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGVuY29kZXIsCSBNRVRIX1ZBUkFSR1N9LAorCXsiY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyIiwKKwkgKFB5Q0Z1bmN0aW9uKWNvZGVjX2luY3JlbWVudGFsZGVjb2RlciwJIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJeyJ0ZXN0X3VfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF91X2NvZGUsCSBNRVRIX05PQVJHU30sCiAjZW5kaWYKICNpZmRlZiBXSVRIX1RIUkVBRAotCXsiX3Rlc3RfdGhyZWFkX3N0YXRlIiwgKFB5Q0Z1bmN0aW9uKXRlc3RfdGhyZWFkX3N0YXRlLCBNRVRIX1ZBUkFSR1N9LAorCXsiX3Rlc3RfdGhyZWFkX3N0YXRlIiwgIHRlc3RfdGhyZWFkX3N0YXRlLCAJCSBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCiAJe05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwpAQCAtNjUwLDggKzcxNCwxMCBAQAogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUxPTkdfTUFYKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUlOIiwgUHlJbnRfRnJvbUxvbmcoSU5UX01JTikpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NSU4iLCBQeUludF9Gcm9tTG9uZyhMT05HX01JTikpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01JTikpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSU5UX01BWCIsIFB5SW50X0Zyb21Mb25nKElOVF9NQVgpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxPTkdfTUFYIiwgUHlJbnRfRnJvbUxvbmcoTE9OR19NQVgpKTsKKwlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUFYIiwgUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKIAogCVRlc3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3Rlc3RjYXBpLmVycm9yIiwgTlVMTCwgTlVMTCk7CiAJUHlfSU5DUkVGKFRlc3RFcnJvcik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggZThlZmFhNy4uYzE3YjZjNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIAlzdHJjcHkoYXJndjAsIGNsYXNzTmFtZSk7CiAJaWYgKGlzdXBwZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKSkKLQkJYXJndjBbMF0gPSB0b2xvd2VyKGFyZ3YwWzBdKTsKKwkJYXJndjBbMF0gPSB0b2xvd2VyKFB5X0NIQVJNQVNLKGFyZ3YwWzBdKSk7CiAJVGNsX1NldFZhcih2LT5pbnRlcnAsICJhcmd2MCIsIGFyZ3YwLCBUQ0xfR0xPQkFMX09OTFkpOwogCWNrZnJlZShhcmd2MCk7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYWxtb2R1bGUuYyBiL01vZHVsZXMvYWxtb2R1bGUuYwppbmRleCA1MjU0ZmNhLi5mYmViMTNhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hbG1vZHVsZS5jCkBAIC0xNDgyLDcgKzE0ODIsOCBAQAogCX0KIAlpZiAoYWxHZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQogCQlnb3RvIGVycm9yOwotCXYgPSBQeUxpc3RfTmV3KG5wdnMpOworCWlmICghKHYgPSBQeUxpc3RfTmV3KG5wdnMpKSkKKwkJZ290byBlcnJvcjsKIAlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CiAJCWlmIChwdnNbaV0uc2l6ZU91dCA8IDApIHsKIAkJCWNoYXIgYnVmWzMyXTsKQEAgLTE2OTIsNiArMTY5Myw3IEBACiAJaWYgKGFsR2V0UGFyYW1JbmZvKHJlcywgcGFyYW0sICZwaW5mbykgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAl2ID0gUHlEaWN0X05ldygpOworCWlmICghdikgcmV0dXJuIE5VTEw7CiAKIAlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnJlc291cmNlKTsKIAlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicmVzb3VyY2UiLCBpdGVtKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCAxNjUwZmYyLi41MmE3ZjVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0xODYsNyArMTg2LDggQEAKIAlpZiAoIVB5QXJnX1BhcnNlKHYsICJ1IzthcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiLCAmcCwgJmxlbikpCiAJCXJldHVybiAtMTsKIAlpZiAobGVuICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIpOworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJhcnJheSBpdGVtIG11c3QgYmUgdW5pY29kZSBjaGFyYWN0ZXIiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAoaSA+PSAwKQpAQCAtMTE2Myw3ICsxMTY0LDcgQEAKIAlyZWdpc3RlciBjaGFyICpwLCAqcTsKIAkvKiBsaXR0bGUgYnVmZmVyIHRvIGhvbGQgaXRlbXMgd2hpbGUgc3dhcHBpbmcgKi8KIAljaGFyIHRtcFsyNTZdOwkvKiA4IGlzIHByb2JhYmx5IGVub3VnaCAtLSBidXQgd2h5IHNraW1wICovCi0JYXNzZXJ0KGl0ZW1zaXplIDw9IHNpemVvZih0bXApKTsKKwlhc3NlcnQoKHNpemVfdClpdGVtc2l6ZSA8PSBzaXplb2YodG1wKSk7CiAKIAlpZiAoc2VsZi0+b2Jfc2l6ZSA+IDEpIHsKIAkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwKQEAgLTE2NzMsNyArMTY3NCw4IEBACiAJCQl9CiAKIAkJCXNlbGYtPm9iX3NpemUgLT0gc2xpY2VsZW5ndGg7Ci0JCQlzZWxmLT5vYl9pdGVtID0gUHlNZW1fUkVBTExPQyhzZWxmLT5vYl9pdGVtLCBpdGVtc2l6ZSpzZWxmLT5vYl9zaXplKTsKKwkJCXNlbGYtPm9iX2l0ZW0gPSAoY2hhciAqKVB5TWVtX1JFQUxMT0Moc2VsZi0+b2JfaXRlbSwKKwkJCQkJCQkgICAgICBpdGVtc2l6ZSpzZWxmLT5vYl9zaXplKTsKIAkJCXNlbGYtPmFsbG9jYXRlZCA9IHNlbGYtPm9iX3NpemU7CiAKIAkJCXJldHVybiAwOwpAQCAtMTg2NSw3ICsxODY3LDcgQEAKIAkJCQlpZiAobiA+IDApIHsKIAkJCQkJYXJyYXlvYmplY3QgKnNlbGYgPSAoYXJyYXlvYmplY3QgKilhOwogCQkJCQljaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKLQkJCQkJaXRlbSA9IFB5TWVtX1JlYWxsb2MoaXRlbSwgbik7CisJCQkJCWl0ZW0gPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoaXRlbSwgbik7CiAJCQkJCWlmIChpdGVtID09IE5VTEwpIHsKIAkJCQkJCVB5RXJyX05vTWVtb3J5KCk7CiAJCQkJCQlQeV9ERUNSRUYoYSk7CkBAIC0yMDYwLDggKzIwNjIsNyBAQAogc3RhdGljIGludAogYXJyYXlpdGVyX3RyYXZlcnNlKGFycmF5aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChpdC0+YW8gIT0gTlVMTCkKLQkJcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKShpdC0+YW8pLCBhcmcpOworCVB5X1ZJU0lUKGl0LT5hbyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggYmVlYWNkMy4uZWQ3MGNkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTE1LDYgKzE1LDggQEAKICNlbmRpZgogI2VuZGlmCiAKK3R5cGVkZWYgc2hvcnQgUHlJbnQxNjsKKwogI2lmIGRlZmluZWQoX19DSEFSX1VOU0lHTkVEX18pCiAjaWYgZGVmaW5lZChzaWduZWQpCiAvKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBvbiBzeXN0ZW1zIHdoZXJlIG9ubHkgdW5zaWduZWQKQEAgLTIyLDEyMiArMjQsMjY3IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiBDb2RlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHNveCwKKy8qIENvZGUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gc294LCAxMi4xNy43LCBnNzExLmMKICoqIChjKSBDcmFpZyBSZWVzZSwgSm9lIENhbXBiZWxsIGFuZCBKZWZmIFBvc2thbnplciAxOTg5ICovCiAKLSNkZWZpbmUgTUlOTElOIC0zMjc2OAotI2RlZmluZSBNQVhMSU4gMzI3NjcKLSNkZWZpbmUgTElOQ0xJUCh4KSBkbyB7IGlmICggeCA8IE1JTkxJTiApIHggPSBNSU5MSU4gOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggeCA+IE1BWExJTiApIHggPSBNQVhMSU47IFwKLSAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggMCApCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHN0X2xpbmVhcl90b191bGF3KGludCBzYW1wbGUpOwotCi0vKgotKiogVGhpcyBtYWNybyBjb252ZXJ0cyBmcm9tIHVsYXcgdG8gMTYgYml0IGxpbmVhciwgZmFzdGVyLgotKioKLSoqIEplZiBQb3NrYW56ZXIKLSoqIDIzIE9jdG9iZXIgMTk4OQotKioKLSoqIElucHV0OiA4IGJpdCB1bGF3IHNhbXBsZQotKiogT3V0cHV0OiBzaWduZWQgMTYgYml0IGxpbmVhciBzYW1wbGUKLSovCi0jZGVmaW5lIHN0X3VsYXdfdG9fbGluZWFyKHVsYXdieXRlKSB1bGF3X3RhYmxlW3VsYXdieXRlXQotCi1zdGF0aWMgaW50IHVsYXdfdGFibGVbMjU2XSA9IHsKLQktMzIxMjQsIC0zMTEwMCwgLTMwMDc2LCAtMjkwNTIsIC0yODAyOCwgLTI3MDA0LCAtMjU5ODAsIC0yNDk1NiwKLQktMjM5MzIsIC0yMjkwOCwgLTIxODg0LCAtMjA4NjAsIC0xOTgzNiwgLTE4ODEyLCAtMTc3ODgsIC0xNjc2NCwKLQktMTU5OTYsIC0xNTQ4NCwgLTE0OTcyLCAtMTQ0NjAsIC0xMzk0OCwgLTEzNDM2LCAtMTI5MjQsIC0xMjQxMiwKLQktMTE5MDAsIC0xMTM4OCwgLTEwODc2LCAtMTAzNjQsICAtOTg1MiwgIC05MzQwLCAgLTg4MjgsICAtODMxNiwKLQktNzkzMiwgIC03Njc2LCAgLTc0MjAsICAtNzE2NCwgIC02OTA4LCAgLTY2NTIsICAtNjM5NiwgIC02MTQwLAotCS01ODg0LCAgLTU2MjgsICAtNTM3MiwgIC01MTE2LCAgLTQ4NjAsICAtNDYwNCwgIC00MzQ4LCAgLTQwOTIsCi0JLTM5MDAsICAtMzc3MiwgIC0zNjQ0LCAgLTM1MTYsICAtMzM4OCwgIC0zMjYwLCAgLTMxMzIsICAtMzAwNCwKLQktMjg3NiwgIC0yNzQ4LCAgLTI2MjAsICAtMjQ5MiwgIC0yMzY0LCAgLTIyMzYsICAtMjEwOCwgIC0xOTgwLAotCS0xODg0LCAgLTE4MjAsICAtMTc1NiwgIC0xNjkyLCAgLTE2MjgsICAtMTU2NCwgIC0xNTAwLCAgLTE0MzYsCi0JLTEzNzIsICAtMTMwOCwgIC0xMjQ0LCAgLTExODAsICAtMTExNiwgIC0xMDUyLCAgIC05ODgsICAgLTkyNCwKLQktODc2LCAgIC04NDQsICAgLTgxMiwgICAtNzgwLCAgIC03NDgsICAgLTcxNiwgICAtNjg0LCAgIC02NTIsCi0JLTYyMCwgICAtNTg4LCAgIC01NTYsICAgLTUyNCwgICAtNDkyLCAgIC00NjAsICAgLTQyOCwgICAtMzk2LAotCS0zNzIsICAgLTM1NiwgICAtMzQwLCAgIC0zMjQsICAgLTMwOCwgICAtMjkyLCAgIC0yNzYsICAgLTI2MCwKLQktMjQ0LCAgIC0yMjgsICAgLTIxMiwgICAtMTk2LCAgIC0xODAsICAgLTE2NCwgICAtMTQ4LCAgIC0xMzIsCi0JLTEyMCwgICAtMTEyLCAgIC0xMDQsICAgIC05NiwgICAgLTg4LCAgICAtODAsICAgIC03MiwgICAgLTY0LAotCS01NiwgICAgLTQ4LCAgICAtNDAsICAgIC0zMiwgICAgLTI0LCAgICAtMTYsICAgICAtOCwgICAgICAwLAotCTMyMTI0LCAgMzExMDAsICAzMDA3NiwgIDI5MDUyLCAgMjgwMjgsICAyNzAwNCwgIDI1OTgwLCAgMjQ5NTYsCi0JMjM5MzIsICAyMjkwOCwgIDIxODg0LCAgMjA4NjAsICAxOTgzNiwgIDE4ODEyLCAgMTc3ODgsICAxNjc2NCwKLQkxNTk5NiwgIDE1NDg0LCAgMTQ5NzIsICAxNDQ2MCwgIDEzOTQ4LCAgMTM0MzYsICAxMjkyNCwgIDEyNDEyLAotCTExOTAwLCAgMTEzODgsICAxMDg3NiwgIDEwMzY0LCAgIDk4NTIsICAgOTM0MCwgICA4ODI4LCAgIDgzMTYsCi0JNzkzMiwgICA3Njc2LCAgIDc0MjAsICAgNzE2NCwgICA2OTA4LCAgIDY2NTIsICAgNjM5NiwgICA2MTQwLAotCTU4ODQsICAgNTYyOCwgICA1MzcyLCAgIDUxMTYsICAgNDg2MCwgICA0NjA0LCAgIDQzNDgsICAgNDA5MiwKLQkzOTAwLCAgIDM3NzIsICAgMzY0NCwgICAzNTE2LCAgIDMzODgsICAgMzI2MCwgICAzMTMyLCAgIDMwMDQsCi0JMjg3NiwgICAyNzQ4LCAgIDI2MjAsICAgMjQ5MiwgICAyMzY0LCAgIDIyMzYsICAgMjEwOCwgICAxOTgwLAotCTE4ODQsICAgMTgyMCwgICAxNzU2LCAgIDE2OTIsICAgMTYyOCwgICAxNTY0LCAgIDE1MDAsICAgMTQzNiwKLQkxMzcyLCAgIDEzMDgsICAgMTI0NCwgICAxMTgwLCAgIDExMTYsICAgMTA1MiwgICAgOTg4LCAgICA5MjQsCi0JODc2LCAgICA4NDQsICAgIDgxMiwgICAgNzgwLCAgICA3NDgsICAgIDcxNiwgICAgNjg0LCAgICA2NTIsCi0JNjIwLCAgICA1ODgsICAgIDU1NiwgICAgNTI0LCAgICA0OTIsICAgIDQ2MCwgICAgNDI4LCAgICAzOTYsCi0JMzcyLCAgICAzNTYsICAgIDM0MCwgICAgMzI0LCAgICAzMDgsICAgIDI5MiwgICAgMjc2LCAgICAyNjAsCi0JMjQ0LCAgICAyMjgsICAgIDIxMiwgICAgMTk2LCAgICAxODAsICAgIDE2NCwgICAgMTQ4LCAgICAxMzIsCi0JMTIwLCAgICAxMTIsICAgIDEwNCwgICAgIDk2LCAgICAgODgsICAgICA4MCwgICAgIDcyLCAgICAgNjQsCi0JNTYsICAgICA0OCwgICAgIDQwLCAgICAgMzIsICAgICAyNCwgICAgIDE2LCAgICAgIDgsICAgICAgMCB9OwotCi0vKiAjZGVmaW5lIFpFUk9UUkFQICovICAgLyogdHVybiBvbiB0aGUgdHJhcCBhcyBwZXIgdGhlIE1JTC1TVEQgKi8KKy8qIEZyb20gZzcxMS5jOgorICoKKyAqIERlY2VtYmVyIDMwLCAxOTk0OgorICogRnVuY3Rpb25zIGxpbmVhcjJhbGF3LCBsaW5lYXIydWxhdyBoYXZlIGJlZW4gdXBkYXRlZCB0byBjb3JyZWN0bHkKKyAqIGNvbnZlcnQgdW5xdWFudGl6ZWQgMTYgYml0IHZhbHVlcy4KKyAqIFRhYmxlcyBmb3IgZGlyZWN0IHUtIHRvIEEtbGF3IGFuZCBBLSB0byB1LWxhdyBjb252ZXJzaW9ucyBoYXZlIGJlZW4KKyAqIGNvcnJlY3RlZC4KKyAqIEJvcmdlIExpbmRiZXJnLCBDZW50ZXIgZm9yIFBlcnNvbktvbW11bmlrYXRpb24sIEFhbGJvcmcgVW5pdmVyc2l0eS4KKyAqIGJsaUBjcGsuYXVjLmRrCisgKgorICovCiAjZGVmaW5lIEJJQVMgMHg4NCAgIC8qIGRlZmluZSB0aGUgYWRkLWluIGJpYXMgZm9yIDE2IGJpdCBzYW1wbGVzICovCiAjZGVmaW5lIENMSVAgMzI2MzUKKyNkZWZpbmUgU0lHTl9CSVQgICAgICAgICgweDgwKSAgICAgICAgICAvKiBTaWduIGJpdCBmb3IgYSBBLWxhdyBieXRlLiAqLworI2RlZmluZSBRVUFOVF9NQVNLICAgICAgKDB4ZikgICAgICAgICAgIC8qIFF1YW50aXphdGlvbiBmaWVsZCBtYXNrLiAqLworI2RlZmluZSBTRUdfU0hJRlQgICAgICAgKDQpICAgICAgICAgICAgIC8qIExlZnQgc2hpZnQgZm9yIHNlZ21lbnQgbnVtYmVyLiAqLworI2RlZmluZSBTRUdfTUFTSyAgICAgICAgKDB4NzApICAgICAgICAgIC8qIFNlZ21lbnQgZmllbGQgbWFzay4gKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0X2xpbmVhcl90b191bGF3KGludCBzYW1wbGUpCitzdGF0aWMgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsweDFGLCAweDNGLCAweDdGLCAweEZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkZ9Oworc3RhdGljIFB5SW50MTYgc2VnX3VlbmRbOF0gPSB7MHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkZ9OworCitzdGF0aWMgUHlJbnQxNgorc2VhcmNoKFB5SW50MTYgdmFsLCBQeUludDE2ICp0YWJsZSwgaW50IHNpemUpCiB7Ci0Jc3RhdGljIGludCBleHBfbHV0WzI1Nl0gPSB7MCwwLDEsMSwyLDIsMiwyLDMsMywzLDMsMywzLDMsMywKLQkJCQkgICA0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAotCQkJCSAgIDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsCi0JCQkJICAgNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKLQkJCQkgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotCQkJCSAgIDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi0JCQkJICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKLQkJCQkgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLQkJCQkgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotCQkJCSAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0JCQkJICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsN307Ci0JaW50IHNpZ24sIGV4cG9uZW50LCBtYW50aXNzYTsKLQl1bnNpZ25lZCBjaGFyIHVsYXdieXRlOworICAgICAgICBpbnQgaTsKIAotCS8qIEdldCB0aGUgc2FtcGxlIGludG8gc2lnbi1tYWduaXR1ZGUuICovCi0Jc2lnbiA9IChzYW1wbGUgPj4gOCkgJiAweDgwOwkJLyogc2V0IGFzaWRlIHRoZSBzaWduICovCi0JaWYgKCBzaWduICE9IDAgKSBzYW1wbGUgPSAtc2FtcGxlOwkvKiBnZXQgbWFnbml0dWRlICovCi0JaWYgKCBzYW1wbGUgPiBDTElQICkgc2FtcGxlID0gQ0xJUDsJLyogY2xpcCB0aGUgbWFnbml0dWRlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDw9ICp0YWJsZSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNpemUpOworfQorI2RlZmluZSBzdF91bGF3MmxpbmVhcjE2KHVjKSAoX3N0X3VsYXcybGluZWFyMTZbdWNdKQorI2RlZmluZSBzdF9hbGF3MmxpbmVhcjE2KHVjKSAoX3N0X2FsYXcybGluZWFyMTZbdWNdKQogCi0JLyogQ29udmVydCBmcm9tIDE2IGJpdCBsaW5lYXIgdG8gdWxhdy4gKi8KLQlzYW1wbGUgPSBzYW1wbGUgKyBCSUFTOwotCWV4cG9uZW50ID0gZXhwX2x1dFsoIHNhbXBsZSA+PiA3ICkgJiAweEZGXTsKLQltYW50aXNzYSA9ICggc2FtcGxlID4+ICggZXhwb25lbnQgKyAzICkgKSAmIDB4MEY7Ci0JdWxhd2J5dGUgPSB+ICggc2lnbiB8ICggZXhwb25lbnQgPDwgNCApIHwgbWFudGlzc2EgKTsKLSNpZmRlZiBaRVJPVFJBUAotCWlmICggdWxhd2J5dGUgPT0gMCApIHVsYXdieXRlID0gMHgwMjsJLyogb3B0aW9uYWwgQ0NJVFQgdHJhcCAqLwotI2VuZGlmCitzdGF0aWMgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0geworICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKKyAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCisgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LAorICAgIC0xMzQzNiwgIC0xMjkyNCwgIC0xMjQxMiwgIC0xMTkwMCwgIC0xMTM4OCwgIC0xMDg3NiwgIC0xMDM2NCwKKyAgICAgLTk4NTIsICAgLTkzNDAsICAgLTg4MjgsICAgLTgzMTYsICAgLTc5MzIsICAgLTc2NzYsICAgLTc0MjAsCisgICAgIC03MTY0LCAgIC02OTA4LCAgIC02NjUyLCAgIC02Mzk2LCAgIC02MTQwLCAgIC01ODg0LCAgIC01NjI4LAorICAgICAtNTM3MiwgICAtNTExNiwgICAtNDg2MCwgICAtNDYwNCwgICAtNDM0OCwgICAtNDA5MiwgICAtMzkwMCwKKyAgICAgLTM3NzIsICAgLTM2NDQsICAgLTM1MTYsICAgLTMzODgsICAgLTMyNjAsICAgLTMxMzIsICAgLTMwMDQsCisgICAgIC0yODc2LCAgIC0yNzQ4LCAgIC0yNjIwLCAgIC0yNDkyLCAgIC0yMzY0LCAgIC0yMjM2LCAgIC0yMTA4LAorICAgICAtMTk4MCwgICAtMTg4NCwgICAtMTgyMCwgICAtMTc1NiwgICAtMTY5MiwgICAtMTYyOCwgICAtMTU2NCwKKyAgICAgLTE1MDAsICAgLTE0MzYsICAgLTEzNzIsICAgLTEzMDgsICAgLTEyNDQsICAgLTExODAsICAgLTExMTYsCisgICAgIC0xMDUyLCAgICAtOTg4LCAgICAtOTI0LCAgICAtODc2LCAgICAtODQ0LCAgICAtODEyLCAgICAtNzgwLAorICAgICAgLTc0OCwgICAgLTcxNiwgICAgLTY4NCwgICAgLTY1MiwgICAgLTYyMCwgICAgLTU4OCwgICAgLTU1NiwKKyAgICAgIC01MjQsICAgIC00OTIsICAgIC00NjAsICAgIC00MjgsICAgIC0zOTYsICAgIC0zNzIsICAgIC0zNTYsCisgICAgICAtMzQwLCAgICAtMzI0LCAgICAtMzA4LCAgICAtMjkyLCAgICAtMjc2LCAgICAtMjYwLCAgICAtMjQ0LAorICAgICAgLTIyOCwgICAgLTIxMiwgICAgLTE5NiwgICAgLTE4MCwgICAgLTE2NCwgICAgLTE0OCwgICAgLTEzMiwKKyAgICAgIC0xMjAsICAgIC0xMTIsICAgIC0xMDQsICAgICAtOTYsICAgICAtODgsICAgICAtODAsICAgICAtNzIsCisgICAgICAgLTY0LCAgICAgLTU2LCAgICAgLTQ4LCAgICAgLTQwLCAgICAgLTMyLCAgICAgLTI0LCAgICAgLTE2LAorICAgICAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKKyAgICAgMjcwMDQsICAgMjU5ODAsICAgMjQ5NTYsICAgMjM5MzIsICAgMjI5MDgsICAgMjE4ODQsICAgMjA4NjAsCisgICAgIDE5ODM2LCAgIDE4ODEyLCAgIDE3Nzg4LCAgIDE2NzY0LCAgIDE1OTk2LCAgIDE1NDg0LCAgIDE0OTcyLAorICAgICAxNDQ2MCwgICAxMzk0OCwgICAxMzQzNiwgICAxMjkyNCwgICAxMjQxMiwgICAxMTkwMCwgICAxMTM4OCwKKyAgICAgMTA4NzYsICAgMTAzNjQsICAgIDk4NTIsICAgIDkzNDAsICAgIDg4MjgsICAgIDgzMTYsICAgIDc5MzIsCisgICAgICA3Njc2LCAgICA3NDIwLCAgICA3MTY0LCAgICA2OTA4LCAgICA2NjUyLCAgICA2Mzk2LCAgICA2MTQwLAorICAgICAgNTg4NCwgICAgNTYyOCwgICAgNTM3MiwgICAgNTExNiwgICAgNDg2MCwgICAgNDYwNCwgICAgNDM0OCwKKyAgICAgIDQwOTIsICAgIDM5MDAsICAgIDM3NzIsICAgIDM2NDQsICAgIDM1MTYsICAgIDMzODgsICAgIDMyNjAsCisgICAgICAzMTMyLCAgICAzMDA0LCAgICAyODc2LCAgICAyNzQ4LCAgICAyNjIwLCAgICAyNDkyLCAgICAyMzY0LAorICAgICAgMjIzNiwgICAgMjEwOCwgICAgMTk4MCwgICAgMTg4NCwgICAgMTgyMCwgICAgMTc1NiwgICAgMTY5MiwKKyAgICAgIDE2MjgsICAgIDE1NjQsICAgIDE1MDAsICAgIDE0MzYsICAgIDEzNzIsICAgIDEzMDgsICAgIDEyNDQsCisgICAgICAxMTgwLCAgICAxMTE2LCAgICAxMDUyLCAgICAgOTg4LCAgICAgOTI0LCAgICAgODc2LCAgICAgODQ0LAorICAgICAgIDgxMiwgICAgIDc4MCwgICAgIDc0OCwgICAgIDcxNiwgICAgIDY4NCwgICAgIDY1MiwgICAgIDYyMCwKKyAgICAgICA1ODgsICAgICA1NTYsICAgICA1MjQsICAgICA0OTIsICAgICA0NjAsICAgICA0MjgsICAgICAzOTYsCisgICAgICAgMzcyLCAgICAgMzU2LCAgICAgMzQwLCAgICAgMzI0LCAgICAgMzA4LCAgICAgMjkyLCAgICAgMjc2LAorICAgICAgIDI2MCwgICAgIDI0NCwgICAgIDIyOCwgICAgIDIxMiwgICAgIDE5NiwgICAgIDE4MCwgICAgIDE2NCwKKyAgICAgICAxNDgsICAgICAxMzIsICAgICAxMjAsICAgICAxMTIsICAgICAxMDQsICAgICAgOTYsICAgICAgODgsCisgICAgICAgIDgwLCAgICAgIDcyLCAgICAgIDY0LCAgICAgIDU2LCAgICAgIDQ4LCAgICAgIDQwLCAgICAgIDMyLAorICAgICAgICAyNCwgICAgICAxNiwgICAgICAgOCwgICAgICAgMAorfTsKIAotCXJldHVybiB1bGF3Ynl0ZTsKKy8qCisgKiBsaW5lYXIydWxhdygpIGFjY2VwdHMgYSAxNC1iaXQgc2lnbmVkIGludGVnZXIgYW5kIGVuY29kZXMgaXQgYXMgdS1sYXcgZGF0YQorICogc3RvcmVkIGluIGEgdW5zaWduZWQgY2hhci4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBkYXRhIHNoaWZ0ZWQgc3VjaCB0aGF0IGl0IG9ubHkgY29udGFpbnMgaW5mb3JtYXRpb24gaW4gdGhlIGxvd2VyCisgKiAxNC1iaXRzLgorICoKKyAqIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBlbmNvZGluZyBwcm9jZXNzLCB0aGUgb3JpZ2luYWwgbGluZWFyIG1hZ25pdHVkZQorICogaXMgYmlhc2VkIGJ5IGFkZGluZyAzMyB3aGljaCBzaGlmdHMgdGhlIGVuY29kaW5nIHJhbmdlIGZyb20gKDAgLSA4MTU4KSB0bworICogKDMzIC0gODE5MSkuIFRoZSByZXN1bHQgY2FuIGJlIHNlZW4gaW4gdGhlIGZvbGxvd2luZyBlbmNvZGluZyB0YWJsZToKKyAqCisgKiAgICAgIEJpYXNlZCBMaW5lYXIgSW5wdXQgQ29kZSAgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmdoICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBFYWNoIGJpYXNlZCBsaW5lYXIgY29kZSBoYXMgYSBsZWFkaW5nIDEgd2hpY2ggaWRlbnRpZmllcyB0aGUgc2VnbWVudAorICogbnVtYmVyLiBUaGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgbnVtYmVyIGlzIGVxdWFsIHRvIDcgbWludXMgdGhlIG51bWJlcgorICogb2YgbGVhZGluZyAwJ3MuIFRoZSBxdWFudGl6YXRpb24gaW50ZXJ2YWwgaXMgZGlyZWN0bHkgYXZhaWxhYmxlIGFzIHRoZQorICogZm91ciBiaXRzIHd4eXouICAqIFRoZSB0cmFpbGluZyBiaXRzIChhIC0gaCkgYXJlIGlnbm9yZWQuCisgKgorICogT3JkaW5hcmlseSB0aGUgY29tcGxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGNvZGUgd29yZCBpcyB1c2VkIGZvcgorICogdHJhbnNtaXNzaW9uLCBhbmQgc28gdGhlIGNvZGUgd29yZCBpcyBjb21wbGVtZW50ZWQgYmVmb3JlIGl0IGlzIHJldHVybmVkLgorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSBKb2huIEMuIEJlbGxhbXkncyBEaWdpdGFsIFRlbGVwaG9ueSwgMTk4MiwKKyAqIEpvaG4gV2lsZXkgJiBTb25zLCBwcHMgOTgtMTExIGFuZCA0NzItNDc2LgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhcgorc3RfMTRsaW5lYXIydWxhdyhQeUludDE2IHBjbV92YWwpCS8qIDIncyBjb21wbGVtZW50ICgxNC1iaXQgcmFuZ2UpICovCit7CisgICAgICAgIFB5SW50MTYgICAgICAgICBtYXNrOworICAgICAgICBQeUludDE2ICAgICAgICAgc2VnOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgdXZhbDsKKworICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc294IGNvZGUgZG9lcyB0aGlzIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgaGVyZSAqLworICAgICAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAyOworCisgICAgICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KKyAgICAgICAgLyogR2V0IHRoZSBzaWduIGFuZCB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4gKi8KKyAgICAgICAgaWYgKHBjbV92YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsOworICAgICAgICAgICAgICAgIG1hc2sgPSAweDdGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hc2sgPSAweEZGOworICAgICAgICB9CisgICAgICAgIGlmICggcGNtX3ZhbCA+IENMSVAgKSBwY21fdmFsID0gQ0xJUDsgICAgICAgICAgIC8qIGNsaXAgdGhlIG1hZ25pdHVkZSAqLworICAgICAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOworCisgICAgICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCisgICAgICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfdWVuZCwgOCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgcXVhbnRpemF0aW9uIGJpdHM7CisgICAgICAgICAqIGFuZCBjb21wbGVtZW50IHRoZSBjb2RlIHdvcmQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdXZhbCA9ICh1bnNpZ25lZCBjaGFyKSAoc2VnIDw8IDQpIHwgKChwY21fdmFsID4+IChzZWcgKyAxKSkgJiAweEYpOworICAgICAgICAgICAgICAgIHJldHVybiAodXZhbCBeIG1hc2spOworICAgICAgICB9CisKK30KKworc3RhdGljIFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKKyAgICAgLTU1MDQsICAgLTUyNDgsICAgLTYwMTYsICAgLTU3NjAsICAgLTQ0ODAsICAgLTQyMjQsICAgLTQ5OTIsCisgICAgIC00NzM2LCAgIC03NTUyLCAgIC03Mjk2LCAgIC04MDY0LCAgIC03ODA4LCAgIC02NTI4LCAgIC02MjcyLAorICAgICAtNzA0MCwgICAtNjc4NCwgICAtMjc1MiwgICAtMjYyNCwgICAtMzAwOCwgICAtMjg4MCwgICAtMjI0MCwKKyAgICAgLTIxMTIsICAgLTI0OTYsICAgLTIzNjgsICAgLTM3NzYsICAgLTM2NDgsICAgLTQwMzIsICAgLTM5MDQsCisgICAgIC0zMjY0LCAgIC0zMTM2LCAgIC0zNTIwLCAgIC0zMzkyLCAgLTIyMDE2LCAgLTIwOTkyLCAgLTI0MDY0LAorICAgIC0yMzA0MCwgIC0xNzkyMCwgIC0xNjg5NiwgIC0xOTk2OCwgIC0xODk0NCwgIC0zMDIwOCwgIC0yOTE4NCwKKyAgICAtMzIyNTYsICAtMzEyMzIsICAtMjYxMTIsICAtMjUwODgsICAtMjgxNjAsICAtMjcxMzYsICAtMTEwMDgsCisgICAgLTEwNDk2LCAgLTEyMDMyLCAgLTExNTIwLCAgIC04OTYwLCAgIC04NDQ4LCAgIC05OTg0LCAgIC05NDcyLAorICAgIC0xNTEwNCwgIC0xNDU5MiwgIC0xNjEyOCwgIC0xNTYxNiwgIC0xMzA1NiwgIC0xMjU0NCwgIC0xNDA4MCwKKyAgICAtMTM1NjgsICAgIC0zNDQsICAgIC0zMjgsICAgIC0zNzYsICAgIC0zNjAsICAgIC0yODAsICAgIC0yNjQsCisgICAgICAtMzEyLCAgICAtMjk2LCAgICAtNDcyLCAgICAtNDU2LCAgICAtNTA0LCAgICAtNDg4LCAgICAtNDA4LAorICAgICAgLTM5MiwgICAgLTQ0MCwgICAgLTQyNCwgICAgIC04OCwgICAgIC03MiwgICAgLTEyMCwgICAgLTEwNCwKKyAgICAgICAtMjQsICAgICAgLTgsICAgICAtNTYsICAgICAtNDAsICAgIC0yMTYsICAgIC0yMDAsICAgIC0yNDgsCisgICAgICAtMjMyLCAgICAtMTUyLCAgICAtMTM2LCAgICAtMTg0LCAgICAtMTY4LCAgIC0xMzc2LCAgIC0xMzEyLAorICAgICAtMTUwNCwgICAtMTQ0MCwgICAtMTEyMCwgICAtMTA1NiwgICAtMTI0OCwgICAtMTE4NCwgICAtMTg4OCwKKyAgICAgLTE4MjQsICAgLTIwMTYsICAgLTE5NTIsICAgLTE2MzIsICAgLTE1NjgsICAgLTE3NjAsICAgLTE2OTYsCisgICAgICAtNjg4LCAgICAtNjU2LCAgICAtNzUyLCAgICAtNzIwLCAgICAtNTYwLCAgICAtNTI4LCAgICAtNjI0LAorICAgICAgLTU5MiwgICAgLTk0NCwgICAgLTkxMiwgICAtMTAwOCwgICAgLTk3NiwgICAgLTgxNiwgICAgLTc4NCwKKyAgICAgIC04ODAsICAgIC04NDgsICAgIDU1MDQsICAgIDUyNDgsICAgIDYwMTYsICAgIDU3NjAsICAgIDQ0ODAsCisgICAgICA0MjI0LCAgICA0OTkyLCAgICA0NzM2LCAgICA3NTUyLCAgICA3Mjk2LCAgICA4MDY0LCAgICA3ODA4LAorICAgICAgNjUyOCwgICAgNjI3MiwgICAgNzA0MCwgICAgNjc4NCwgICAgMjc1MiwgICAgMjYyNCwgICAgMzAwOCwKKyAgICAgIDI4ODAsICAgIDIyNDAsICAgIDIxMTIsICAgIDI0OTYsICAgIDIzNjgsICAgIDM3NzYsICAgIDM2NDgsCisgICAgICA0MDMyLCAgICAzOTA0LCAgICAzMjY0LCAgICAzMTM2LCAgICAzNTIwLCAgICAzMzkyLCAgIDIyMDE2LAorICAgICAyMDk5MiwgICAyNDA2NCwgICAyMzA0MCwgICAxNzkyMCwgICAxNjg5NiwgICAxOTk2OCwgICAxODk0NCwKKyAgICAgMzAyMDgsICAgMjkxODQsICAgMzIyNTYsICAgMzEyMzIsICAgMjYxMTIsICAgMjUwODgsICAgMjgxNjAsCisgICAgIDI3MTM2LCAgIDExMDA4LCAgIDEwNDk2LCAgIDEyMDMyLCAgIDExNTIwLCAgICA4OTYwLCAgICA4NDQ4LAorICAgICAgOTk4NCwgICAgOTQ3MiwgICAxNTEwNCwgICAxNDU5MiwgICAxNjEyOCwgICAxNTYxNiwgICAxMzA1NiwKKyAgICAgMTI1NDQsICAgMTQwODAsICAgMTM1NjgsICAgICAzNDQsICAgICAzMjgsICAgICAzNzYsICAgICAzNjAsCisgICAgICAgMjgwLCAgICAgMjY0LCAgICAgMzEyLCAgICAgMjk2LCAgICAgNDcyLCAgICAgNDU2LCAgICAgNTA0LAorICAgICAgIDQ4OCwgICAgIDQwOCwgICAgIDM5MiwgICAgIDQ0MCwgICAgIDQyNCwgICAgICA4OCwgICAgICA3MiwKKyAgICAgICAxMjAsICAgICAxMDQsICAgICAgMjQsICAgICAgIDgsICAgICAgNTYsICAgICAgNDAsICAgICAyMTYsCisgICAgICAgMjAwLCAgICAgMjQ4LCAgICAgMjMyLCAgICAgMTUyLCAgICAgMTM2LCAgICAgMTg0LCAgICAgMTY4LAorICAgICAgMTM3NiwgICAgMTMxMiwgICAgMTUwNCwgICAgMTQ0MCwgICAgMTEyMCwgICAgMTA1NiwgICAgMTI0OCwKKyAgICAgIDExODQsICAgIDE4ODgsICAgIDE4MjQsICAgIDIwMTYsICAgIDE5NTIsICAgIDE2MzIsICAgIDE1NjgsCisgICAgICAxNzYwLCAgICAxNjk2LCAgICAgNjg4LCAgICAgNjU2LCAgICAgNzUyLCAgICAgNzIwLCAgICAgNTYwLAorICAgICAgIDUyOCwgICAgIDYyNCwgICAgIDU5MiwgICAgIDk0NCwgICAgIDkxMiwgICAgMTAwOCwgICAgIDk3NiwKKyAgICAgICA4MTYsICAgICA3ODQsICAgICA4ODAsICAgICA4NDgKK307CisKKy8qCisgKiBsaW5lYXIyYWxhdygpIGFjY2VwdHMgYW4gMTMtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBlbmNvZGVzIGl0IGFzIEEtbGF3IGRhdGEKKyAqIHN0b3JlZCBpbiBhIHVuc2lnbmVkIGNoYXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aXRoCisgKiB0aGUgZGF0YSBzaGlmdGVkIHN1Y2ggdGhhdCBpdCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGluIHRoZSBsb3dlcgorICogMTMtYml0cy4KKyAqCisgKiAgICAgICAgICAgICAgTGluZWFyIElucHV0IENvZGUgICAgICAgQ29tcHJlc3NlZCBDb2RlCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIDAwMDAwMDB3eHl6YSAgICAgICAgICAgICAgICAgICAgMDAwd3h5egorICogICAgICAwMDAwMDAxd3h5emEgICAgICAgICAgICAgICAgICAgIDAwMXd4eXoKKyAqICAgICAgMDAwMDAxd3h5emFiICAgICAgICAgICAgICAgICAgICAwMTB3eHl6CisgKiAgICAgIDAwMDAxd3h5emFiYyAgICAgICAgICAgICAgICAgICAgMDExd3h5egorICogICAgICAwMDAxd3h5emFiY2QgICAgICAgICAgICAgICAgICAgIDEwMHd4eXoKKyAqICAgICAgMDAxd3h5emFiY2RlICAgICAgICAgICAgICAgICAgICAxMDF3eHl6CisgKiAgICAgIDAxd3h5emFiY2RlZiAgICAgICAgICAgICAgICAgICAgMTEwd3h5egorICogICAgICAxd3h5emFiY2RlZmcgICAgICAgICAgICAgICAgICAgIDExMXd4eXoKKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgSm9obiBDLiBCZWxsYW15J3MgRGlnaXRhbCBUZWxlcGhvbnksIDE5ODIsCisgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3N0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KK3sKKyAgICAgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7CisgICAgICAgIHNob3J0ICAgICAgICAgICBzZWc7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBhdmFsOworCisgICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCisgICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDM7CisKKyAgICAgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCisgICAgICAgIGlmIChwY21fdmFsID49IDApIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KKyAgICAgICAgICAgICAgICBwY21fdmFsID0gLXBjbV92YWwgLSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICAgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ19hZW5kLCA4KTsKKworICAgICAgICAvKiBDb21iaW5lIHRoZSBzaWduLCBzZWdtZW50LCBhbmQgcXVhbnRpemF0aW9uIGJpdHMuICovCisKKyAgICAgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGF2YWwgPSAodW5zaWduZWQgY2hhcikgc2VnIDw8IFNFR19TSElGVDsKKyAgICAgICAgICAgICAgICBpZiAoc2VnIDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gMSkgJiBRVUFOVF9NQVNLOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gc2VnKSAmIFFVQU5UX01BU0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIChhdmFsIF4gbWFzayk7CisgICAgICAgIH0KIH0KIC8qIEVuZCBvZiBjb2RlIHRha2VuIGZyb20gc294ICovCiAKIC8qIEludGVsIEFEUENNIHN0ZXAgdmFyaWF0aW9uIHRhYmxlICovCiBzdGF0aWMgaW50IGluZGV4VGFibGVbMTZdID0gewotCS0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAotCS0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCiB9OwogCiBzdGF0aWMgaW50IHN0ZXBzaXplVGFibGVbODldID0gewotCTcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAotCTE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAotCTUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCi0JMTMwLCAxNDMsIDE1NywgMTczLCAxOTAsIDIwOSwgMjMwLCAyNTMsIDI3OSwgMzA3LAotCTMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKLQk4NzYsIDk2MywgMTA2MCwgMTE2NiwgMTI4MiwgMTQxMSwgMTU1MiwgMTcwNywgMTg3OCwgMjA2NiwKLQkyMjcyLCAyNDk5LCAyNzQ5LCAzMDI0LCAzMzI3LCAzNjYwLCA0MDI2LCA0NDI4LCA0ODcxLCA1MzU4LAotCTU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAotCTE1Mjg5LCAxNjgxOCwgMTg1MDAsIDIwMzUwLCAyMjM4NSwgMjQ2MjMsIDI3MDg2LCAyOTc5NCwgMzI3NjcKKyAgICAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCisgICAgICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAorICAgICAgICA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LAorICAgICAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCisgICAgICAgIDMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKKyAgICAgICAgODc2LCA5NjMsIDEwNjAsIDExNjYsIDEyODIsIDE0MTEsIDE1NTIsIDE3MDcsIDE4NzgsIDIwNjYsCisgICAgICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCisgICAgICAgIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAorICAgICAgICAxNTI4OSwgMTY4MTgsIDE4NTAwLCAyMDM1MCwgMjIzODUsIDI0NjIzLCAyNzA4NiwgMjk3OTQsIDMyNzY3CiB9OwogICAgIAogI2RlZmluZSBDSEFSUChjcCwgaSkgKChzaWduZWQgY2hhciAqKShjcCtpKSkKQEAgLTE1MSwxMzcgKzI5OCwxMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2dldHNhbXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKjQpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBpIDwgMCB8fCBpID49IGxlbi9zaXplICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKjIpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotCWludCBpOwotCWludCBtYXggPSAwOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgbWF4ID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKLQkJaWYgKCB2YWwgPiBtYXggKSBtYXggPSB2YWw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbWlubWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBtaW4gPSAweDdmZmZmZmZmLCBtYXggPSAtMHg3ZmZmZmZmZjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKLQkJaWYgKHNpemUgPT0gMSkgdmFsID0gKGludCkgKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoc2l6ZSA9PSAyKSB2YWwgPSAoaW50KSAqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOwotCQlpZiAodmFsID4gbWF4KSBtYXggPSB2YWw7Ci0JCWlmICh2YWwgPCBtaW4pIG1pbiA9IHZhbDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB2YWwgPSAoaW50KSAqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgdmFsID0gKGludCkgKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIG1heCA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluKSBtaW4gPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7Ci0JZG91YmxlIGF2ZyA9IDAuMDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIGF2ZyA9IDAuMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWF2ZyArPSB2YWw7Ci0JfQotCWlmICggbGVuID09IDAgKQotCQl2YWwgPSAwOwotCWVsc2UKLQkJdmFsID0gKGludCkoYXZnIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBhdmcgKz0gdmFsOworICAgICAgICB9CisgICAgICAgIGlmICggbGVuID09IDAgKQorICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3Bfcm1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlpbnQgaTsKLQlkb3VibGUgc3VtX3NxdWFyZXMgPSAwLjA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRvdWJsZSBzdW1fc3F1YXJlcyA9IDAuMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCXN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOwotCX0KLQlpZiAoIGxlbiA9PSAwICkKLQkJdmFsID0gMDsKLQllbHNlCi0JCXZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgc3VtX3NxdWFyZXMgKz0gKGRvdWJsZSl2YWwqKGRvdWJsZSl2YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpc3FydChzdW1fc3F1YXJlcyAvIChkb3VibGUpKGxlbi9zaXplKSk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgZG91YmxlIF9zdW0yKHNob3J0ICphLCBzaG9ydCAqYiwgaW50IGxlbikKIHsKLQlpbnQgaTsKLQlkb3VibGUgc3VtID0gMC4wOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKIAotCWZvciggaT0wOyBpPGxlbjsgaSsrKSB7Ci0JCXN1bSA9IHN1bSArIChkb3VibGUpYVtpXSooZG91YmxlKWJbaV07Ci0JfQotCXJldHVybiBzdW07CisgICAgICAgIGZvciggaT0wOyBpPGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOwogfQogCiAvKgpAQCAtMzAzLDE1ICs0NTAsMTUgQEAKICoqIHZqID0gKCBzdW0oQVtqK2ldXjIpKnN1bShSW2ldXjIpIC0gc3VtKEFbaitpXVJbaV0pXjIgKSAvIHN1bSggQVtqK2ldXjIgKQogKioKICoqIEluIHRoZSBjb2RlIHZhcmlhYmxlcyBjb3JyZXNwb25kIGFzIGZvbGxvd3M6Ci0qKiBjcDEJCUEKLSoqIGNwMgkJUgotKiogbGVuMQkJTgotKiogbGVuMgkJbgotKiogYWpfbTEJQVtqLTFdCi0qKiBhal9sbTEJQVtqK24tMV0KLSoqIHN1bV9yaV8yCXN1bShSW2ldXjIpCi0qKiBzdW1fYWlqXzIJc3VtKEFbaStqXV4yKQotKiogc3VtX2Fpal9yaQlzdW0oQVtpK2pdUltpXSkKKyoqIGNwMSAgICAgICAgICBBCisqKiBjcDIgICAgICAgICAgUgorKiogbGVuMSAgICAgICAgIE4KKyoqIGxlbjIgICAgICAgICBuCisqKiBhal9tMSAgICAgICAgQVtqLTFdCisqKiBhal9sbTEgICAgICAgQVtqK24tMV0KKyoqIHN1bV9yaV8yICAgICBzdW0oUltpXV4yKQorKiogc3VtX2Fpal8yICAgIHN1bShBW2kral1eMikKKyoqIHN1bV9haWpfcmkgICBzdW0oQVtpK2pdUltpXSkKICoqCiAqKiBzdW1fcmkgaXMgY2FsY3VsYXRlZCBvbmNlLCBzdW1fYWlqXzIgaXMgdXBkYXRlZCBlYWNoIHN0ZXAgYW5kIHN1bV9haWpfcmkKICoqIGlzIGNvbXBsZXRlbHkgcmVjYWxjdWxhdGVkIGVhY2ggc3RlcC4KQEAgLTMxOSw1NSArNDY2LDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kZml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCAqY3AxLCAqY3AyOwotCWludCBsZW4xLCBsZW4yOwotCWludCBqLCBiZXN0X2o7Ci0JZG91YmxlIGFqX20xLCBhal9sbTE7Ci0JZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqXzIsIHN1bV9haWpfcmksIHJlc3VsdCwgYmVzdF9yZXN1bHQsIGZhY3RvcjsKKyAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKKyAgICAgICAgaW50IGxlbjEsIGxlbjI7CisgICAgICAgIGludCBqLCBiZXN0X2o7CisgICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOworICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI3MjKSIsICZjcDEsICZsZW4xLCAmY3AyLCAmbGVuMikgKQotCQlyZXR1cm4gMDsKLQlpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbGVuMSA+Pj0gMTsKLQlsZW4yID4+PSAxOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjcyMpIiwgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsZW4xID4+PSAxOworICAgICAgICBsZW4yID4+PSAxOwogICAgIAotCWlmICggbGVuMSA8IGxlbjIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJGaXJzdCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0Jc3VtX2Fpal8yID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOwotCXN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgICAgIGlmICggbGVuMSA8IGxlbjIgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7CisgICAgICAgIHN1bV9haWpfMiA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKyAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotCXJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpIC8gc3VtX2Fpal8yOworICAgICAgICByZXN1bHQgPSAoc3VtX3JpXzIqc3VtX2Fpal8yIC0gc3VtX2Fpal9yaSpzdW1fYWlqX3JpKSAvIHN1bV9haWpfMjsKIAotCWJlc3RfcmVzdWx0ID0gcmVzdWx0OwotCWJlc3RfaiA9IDA7Ci0JaiA9IDA7CisgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICBiZXN0X2ogPSAwOworICAgICAgICBqID0gMDsKIAotCWZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKLQkJYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOwotCQlhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CisgICAgICAgIGZvciAoIGo9MTsgajw9bGVuMS1sZW4yOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07CisgICAgICAgICAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOwogCi0JCXN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKLQkJc3VtX2Fpal9yaSA9IF9zdW0yKGNwMStqLCBjcDIsIGxlbjIpOworICAgICAgICAgICAgICAgIHN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKKyAgICAgICAgICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxK2osIGNwMiwgbGVuMik7CiAKLQkJcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkKLQkJCS8gc3VtX2Fpal8yOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpCisgICAgICAgICAgICAgICAgICAgICAgICAvIHN1bV9haWpfMjsKIAotCQlpZiAoIHJlc3VsdCA8IGJlc3RfcmVzdWx0ICkgewotCQkJYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQliZXN0X2ogPSBqOwotCQl9Ci0JCi0JfQorICAgICAgICAgICAgICAgIGlmICggcmVzdWx0IDwgYmVzdF9yZXN1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfaiA9IGo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQogCi0JZmFjdG9yID0gX3N1bTIoY3AxK2Jlc3RfaiwgY3AyLCBsZW4yKSAvIHN1bV9yaV8yOworICAgICAgICBmYWN0b3IgPSBfc3VtMihjcDErYmVzdF9qLCBjcDIsIGxlbjIpIC8gc3VtX3JpXzI7CiAgICAgCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpZikiLCBiZXN0X2osIGZhY3Rvcik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWYpIiwgYmVzdF9qLCBmYWN0b3IpOwogfQogCiAvKgpAQCAtMzc3LDI3ICs1MjQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2ZpbmRmYWN0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0ICpjcDEsICpjcDI7Ci0JaW50IGxlbjEsIGxlbjI7Ci0JZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqX3JpLCByZXN1bHQ7CisgICAgICAgIHNob3J0ICpjcDEsICpjcDI7CisgICAgICAgIGludCBsZW4xLCBsZW4yOworICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfcmksIHJlc3VsdDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzIykiLCAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggbGVuMSAhPSBsZW4yICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2FtcGxlcyBzaG91bGQgYmUgc2FtZSBzaXplIik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4yID4+PSAxOwotCXN1bV9yaV8yID0gX3N1bTIoY3AyLCBjcDIsIGxlbjIpOwotCXN1bV9haWpfcmkgPSBfc3VtMihjcDEsIGNwMiwgbGVuMik7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzIykiLCAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICggbGVuMSAhPSBsZW4yICkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTYW1wbGVzIHNob3VsZCBiZSBzYW1lIHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBsZW4yID4+PSAxOworICAgICAgICBzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKKyAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotCXJlc3VsdCA9IHN1bV9haWpfcmkgLyBzdW1fcmlfMjsKKyAgICAgICAgcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOwogCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyZXN1bHQpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIC8qCkBAIC00MDcsOTgxICs1NTQsMTA1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfZmluZG1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgKmNwMTsKLQlpbnQgbGVuMSwgbGVuMjsKLQlpbnQgaiwgYmVzdF9qOwotCWRvdWJsZSBhal9tMSwgYWpfbG0xOwotCWRvdWJsZSByZXN1bHQsIGJlc3RfcmVzdWx0OworICAgICAgICBzaG9ydCAqY3AxOworICAgICAgICBpbnQgbGVuMSwgbGVuMjsKKyAgICAgICAgaW50IGosIGJlc3RfajsKKyAgICAgICAgZG91YmxlIGFqX20xLCBhal9sbTE7CisgICAgICAgIGRvdWJsZSByZXN1bHQsIGJlc3RfcmVzdWx0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwgJmNwMSwgJmxlbjEsICZsZW4yKSApCi0JCXJldHVybiAwOwotCWlmICggbGVuMSAmIDEgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7Ci0JCXJldHVybiAwOwotCX0KLQlsZW4xID4+PSAxOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AxLCAmbGVuMSwgJmxlbjIpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBsZW4xICYgMSApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGxlbjEgPj49IDE7CiAgICAgCi0JaWYgKCBsZW4xIDwgbGVuMiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIklucHV0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiSW5wdXQgc2FtcGxlIHNob3VsZCBiZSBsb25nZXIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCi0JcmVzdWx0ID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOworICAgICAgICByZXN1bHQgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CiAKLQliZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLQliZXN0X2ogPSAwOwotCWogPSAwOworICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgYmVzdF9qID0gMDsKKyAgICAgICAgaiA9IDA7CiAKLQlmb3IgKCBqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7Ci0JCWFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKLQkJYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOworICAgICAgICBmb3IgKCBqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7CisgICAgICAgICAgICAgICAgYWpfbTEgPSAoZG91YmxlKWNwMVtqLTFdOworICAgICAgICAgICAgICAgIGFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKIAotCQlyZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOwogCi0JCWlmICggcmVzdWx0ID4gYmVzdF9yZXN1bHQgKSB7Ci0JCQliZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLQkJCWJlc3RfaiA9IGo7Ci0JCX0KLQkKLQl9CisgICAgICAgICAgICAgICAgaWYgKCByZXN1bHQgPiBiZXN0X3Jlc3VsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9qID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYmVzdF9qKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGJlc3Rfaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2Z3BwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAotCQlwcmV2ZXh0cmVtZSA9IDA7Ci0JaW50IGk7Ci0JZG91YmxlIGF2ZyA9IDAuMDsKLQlpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmLCBuZXh0cmVtZSA9IDA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAorICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGRvdWJsZSBhdmcgPSAwLjA7CisgICAgICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmYsIG5leHRyZW1lID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCi0JKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQotCSovCi0JaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOwotCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7Ci0JZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKLQlwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCisgICAgICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOworICAgICAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CiAgICAgCi0JZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCQlpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgewotCQkJLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0byBsYXN0Ci0JCQkqKiBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KLQkJCSovCi0JCQlpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7Ci0JCQkJZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0JCQkJaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotCQkJCQlleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLQkJCQlhdmcgKz0gZXh0cmVtZWRpZmY7Ci0JCQkJbmV4dHJlbWUrKzsKLQkJCX0KLQkJCXByZXZleHRyZW1ldmFsaWQgPSAxOwotCQkJcHJldmV4dHJlbWUgPSBwcmV2dmFsOwotCQl9Ci0JCXByZXZ2YWwgPSB2YWw7Ci0JCWlmICggZGlmZiAhPSAwICkKLQkJCXByZXZkaWZmID0gZGlmZjsJCi0JfQotCWlmICggbmV4dHJlbWUgPT0gMCApCi0JCXZhbCA9IDA7Ci0JZWxzZQotCQl2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICAgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcgKz0gZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRyZW1lKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7ICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpZiAoIG5leHRyZW1lID09IDAgKQorICAgICAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heHBwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAotCQlwcmV2ZXh0cmVtZSA9IDA7Ci0JaW50IGk7Ci0JaW50IG1heCA9IDA7Ci0JaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZjsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgICAgICAgICAgcHJldmV4dHJlbWUgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgIGludCBkaWZmLCBwcmV2ZGlmZiwgZXh0cmVtZWRpZmY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOwotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cwotCSoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKLQkqLwotCWlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOwotCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0JcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIENvbXB1dGUgZmlyc3QgZGVsdGEgdmFsdWUgYWhlYWQuIEFsc28gYXV0b21hdGljYWxseSBtYWtlcyB1cworICAgICAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCisgICAgICAgICovCisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICBwcmV2dmFsID0gKGludCkqQ0hBUlAoY3AsIDApOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBwcmV2dmFsID0gKGludCkqTE9OR1AoY3AsIDApOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIHNpemUpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBzaXplKTsKKyAgICAgICAgcHJldmRpZmYgPSB2YWwgLSBwcmV2dmFsOwogCi0JZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0JCWRpZmYgPSB2YWwgLSBwcmV2dmFsOwotCQlpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgewotCQkJLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bwotCQkJKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KLQkJCSovCi0JCQlpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7Ci0JCQkJZXh0cmVtZWRpZmYgPSBwcmV2dmFsIC0gcHJldmV4dHJlbWU7Ci0JCQkJaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotCQkJCQlleHRyZW1lZGlmZiA9IC1leHRyZW1lZGlmZjsKLQkJCQlpZiAoIGV4dHJlbWVkaWZmID4gbWF4ICkKLQkJCQkJbWF4ID0gZXh0cmVtZWRpZmY7Ci0JCQl9Ci0JCQlwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLQkJCXByZXZleHRyZW1lID0gcHJldnZhbDsKLQkJfQotCQlwcmV2dmFsID0gdmFsOwotCQlpZiAoIGRpZmYgIT0gMCApCi0JCQlwcmV2ZGlmZiA9IGRpZmY7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOworICAgICAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPiBtYXggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9jcm9zcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JaW50IGk7Ci0JaW50IHByZXZ2YWwsIG5jcm9zczsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHByZXZ2YWwsIG5jcm9zczsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpKSIsICZjcCwgJmxlbiwgJnNpemUpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbmNyb3NzID0gLTE7Ci0JcHJldnZhbCA9IDE3OyAvKiBBbnl0aGluZyA8PiAwLDEgKi8KLQlmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPj4gNzsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICgoaW50KSpTSE9SVFAoY3AsIGkpKSA+PiAxNTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOwotCQl2YWwgPSB2YWwgJiAxOwotCQlpZiAoIHZhbCAhPSBwcmV2dmFsICkgbmNyb3NzKys7Ci0JCXByZXZ2YWwgPSB2YWw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhuY3Jvc3MpOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG5jcm9zcyA9IC0xOworICAgICAgICBwcmV2dmFsID0gMTc7IC8qIEFueXRoaW5nIDw+IDAsMSAqLworICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA+PiA3OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoKGludCkqU0hPUlRQKGNwLCBpKSkgPj4gMTU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDMxOworICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAmIDE7CisgICAgICAgICAgICAgICAgaWYgKCB2YWwgIT0gcHJldnZhbCApIG5jcm9zcysrOworICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG5jcm9zcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX211bChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0JZG91YmxlIGZhY3RvciwgZnZhbCwgbWF4dmFsOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaTsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBkb3VibGUgZmFjdG9yLCBmdmFsLCBtYXh2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhY3RvciApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjdG9yICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotCQlmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsID0gKGludClmdmFsOwotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhY3RvcjsKKyAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIHZhbCA9IChpbnQpZnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpdmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMil2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF90b21vbm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDA7Ci0JZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwOworICAgICAgICBkb3VibGUgZmFjMSwgZmFjMiwgZnZhbCwgbWF4dmFsOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lkZCkiLCAmY3AsICZsZW4sICZzaXplLCAmZmFjMSwgJmZhYzIgKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWRkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAKLQlpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0JZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLQllbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLzIpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vMik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKICAgICAKLQlmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcCwgaSsxKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AsIGkrMik7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7Ci0JCWZ2YWwgPSAoZG91YmxlKXZhbDEqZmFjMSArIChkb3VibGUpdmFsMipmYWMyOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsMSA9IChpbnQpZnZhbDsKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkvMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpLzIpPSAoUHlfSW50MzIpdmFsMTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgeworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7CisgICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7CisgICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgICAgICAgICB2YWwxID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpLzIpID0gKHNpZ25lZCBjaGFyKXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfdG9zdGVyZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwxLCB2YWwyLCB2YWwgPSAwOwotCWRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7CisgICAgICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWRkKSIsICZjcCwgJmxlbiwgJnNpemUsICZmYWMxLCAmZmFjMiApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNpZGQpIiwgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwogCi0JCWZ2YWwgPSAoZG91YmxlKXZhbCpmYWMxOwotCQlpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotCQllbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLQkJdmFsMSA9IChpbnQpZnZhbDsKKyAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjMTsKKyAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CiAKLQkJZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7Ci0JCWlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotCQl2YWwyID0gKGludClmdmFsOworICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMyOworICAgICAgICAgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgICAgICAgICAgdmFsMiA9IChpbnQpZnZhbDsKIAotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKSA9IChzaG9ydCl2YWwxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIpID0gKFB5X0ludDMyKXZhbDE7CiAKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMisxKSA9IChzaWduZWQgY2hhcil2YWwyOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMisyKSA9IChzaG9ydCl2YWwyOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKzQpID0gKFB5X0ludDMyKXZhbDI7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKzEpID0gKHNpZ25lZCBjaGFyKXZhbDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKjIrMikgPSAoc2hvcnQpdmFsMjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKzQpID0gKFB5X0ludDMyKXZhbDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDEsICpjcDIsICpuY3A7Ci0JaW50IGxlbjEsIGxlbjIsIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMCwgbWF4dmFsLCBuZXd2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICBzaWduZWQgY2hhciAqY3AxLCAqY3AyLCAqbmNwOworICAgICAgICBpbnQgbGVuMSwgbGVuMiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwLCBtYXh2YWwsIG5ld3ZhbDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzI2kpIiwKLQkJCSAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKLQkJcmV0dXJuIDA7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICIocyNzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCWlmICggbGVuMSAhPSBsZW4yICkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIGxlbjEgIT0gbGVuMiApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiTGVuZ3RocyBzaG91bGQgYmUgdGhlIHNhbWUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCWlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKLQllbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOwotCWVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAweDdmZmZmZmZmOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAweDdmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbjEpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4xKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuMTsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwMSwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwMSwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwxID0gKGludCkqTE9OR1AoY3AxLCBpKTsKLQkKLQkJaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcDIsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwMiwgaSk7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjE7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMSA9IChpbnQpKkNIQVJQKGNwMSwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AxLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwMSwgaSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwyID0gKGludCkqQ0hBUlAoY3AyLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcDIsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AyLCBpKTsKIAotCQluZXd2YWwgPSB2YWwxICsgdmFsMjsKLQkJLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLwotCQlpZiAobmV3dmFsID4gbWF4dmFsKSBuZXd2YWwgPSBtYXh2YWw7Ci0JCWVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7Ci0JCWVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKLQkJCW5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CisgICAgICAgICAgICAgICAgbmV3dmFsID0gdmFsMSArIHZhbDI7CisgICAgICAgICAgICAgICAgLyogdHJ1bmNhdGUgaW4gY2FzZSBvZiBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGlmIChuZXd2YWwgPiBtYXh2YWwpIG5ld3ZhbCA9IG1heHZhbDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChuZXd2YWwgPCAtbWF4dmFsKSBuZXd2YWwgPSAtbWF4dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCAmJiAobmV3dmFsXnZhbDEpIDwgMCAmJiAobmV3dmFsXnZhbDIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IHZhbDEgPiAwID8gbWF4dmFsIDogLSBtYXh2YWw7CiAKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKW5ld3ZhbDsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCluZXd2YWw7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMiluZXd2YWw7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpbmV3dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpbmV3dmFsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMiluZXd2YWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9iaWFzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IGJpYXM7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGJpYXM7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSAsICZiaWFzKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotCQotCQlpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsK2JpYXMpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsK2JpYXMpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCtiaWFzKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3JldmVyc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGo7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpLCBqOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0JCWogPSBsZW4gLSBpIC0gc2l6ZTsKLQkKLQkJaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBqKSA9IChQeV9JbnQzMikodmFsPDwxNik7Ci0JfQotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBqID0gbGVuIC0gaSAtIHNpemU7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBqOworICAgICAgICBzaWduZWQgY2hhciAqY3A7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGksIGo7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgfHwKLQkgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAorICAgICAgICAgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4vc2l6ZSkqc2l6ZTIpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4vc2l6ZSkqc2l6ZTIpOworICAgICAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKICAgICAKLQlmb3IgKCBpPTAsIGo9MDsgaSA8IGxlbjsgaSArPSBzaXplLCBqICs9IHNpemUyICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wLCBqPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSwgaiArPSBzaXplMiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJaWYgKCBzaXplMiA9PSAxICkgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7Ci0JCWVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOwotCQllbHNlIGlmICggc2l6ZTIgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGludAogZ2NkKGludCBhLCBpbnQgYikKIHsKLQl3aGlsZSAoYiA+IDApIHsKLQkJaW50IHRtcCA9IGEgJSBiOwotCQlhID0gYjsKLQkJYiA9IHRtcDsKLQl9Ci0JcmV0dXJuIGE7CisgICAgICAgIHdoaWxlIChiID4gMCkgeworICAgICAgICAgICAgICAgIGludCB0bXAgPSBhICUgYjsKKyAgICAgICAgICAgICAgICBhID0gYjsKKyAgICAgICAgICAgICAgICBiID0gdG1wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9yYXRlY3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmNwLCAqbmNwOwotCWludCBsZW4sIHNpemUsIG5jaGFubmVscywgaW5yYXRlLCBvdXRyYXRlLCB3ZWlnaHRBLCB3ZWlnaHRCOwotCWludCBjaGFuLCBkLCAqcHJldl9pLCAqY3VyX2ksIGN1cl9vOwotCVB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOwotCWludCBieXRlc19wZXJfZnJhbWU7CisgICAgICAgIGNoYXIgKmNwLCAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgd2VpZ2h0QSwgd2VpZ2h0QjsKKyAgICAgICAgaW50IGNoYW4sIGQsICpwcmV2X2ksICpjdXJfaSwgY3VyX287CisgICAgICAgIFB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOworICAgICAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lOwogCi0Jd2VpZ2h0QSA9IDE7Ci0Jd2VpZ2h0QiA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlPfGlpOnJhdGVjdiIsICZjcCwgJmxlbiwgJnNpemUsICZuY2hhbm5lbHMsCi0JCQkgICAgICAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5jaGFubmVscyA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIiMgb2YgY2hhbm5lbHMgc2hvdWxkIGJlID49IDEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ5dGVzX3Blcl9mcmFtZSA9IHNpemUgKiBuY2hhbm5lbHM7Ci0JaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7Ci0JCS8qIFRoaXMgb3ZlcmZsb3cgdGVzdCBpcyByaWdvcm91c2x5IGNvcnJlY3QgYmVjYXVzZQotCQkgICBib3RoIG11bHRpcGxpY2FuZHMgYXJlID49IDEuICBVc2UgdGhlIGFyZ3VtZW50IG5hbWVzCi0JCSAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkgICAgICAgICAgICAgICAgIndpZHRoICogbmNoYW5uZWxzIHRvbyBiaWcgZm9yIGEgQyBpbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh3ZWlnaHRBIDwgMSB8fCB3ZWlnaHRCIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAotCQkJIndlaWdodEEgc2hvdWxkIGJlID49IDEsIHdlaWdodEIgc2hvdWxkIGJlID49IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChsZW4gJSBieXRlc19wZXJfZnJhbWUgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAibm90IGEgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGlucmF0ZSA8PSAwIHx8IG91dHJhdGUgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAic2FtcGxpbmcgcmF0ZSBub3QgPiAwIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBkaXZpZGUgaW5yYXRlIGFuZCBvdXRyYXRlIGJ5IHRoZWlyIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCi0JZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOwotCWlucmF0ZSAvPSBkOwotCW91dHJhdGUgLz0gZDsKKyAgICAgICAgd2VpZ2h0QSA9IDE7CisgICAgICAgIHdlaWdodEIgPSAwOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaU98aWk6cmF0ZWN2IiwgJmNwLCAmbGVuLCAmc2l6ZSwgJm5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsICZ3ZWlnaHRBLCAmd2VpZ2h0QikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobmNoYW5uZWxzIDwgMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICIjIG9mIGNoYW5uZWxzIHNob3VsZCBiZSA+PSAxIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNfcGVyX2ZyYW1lID0gc2l6ZSAqIG5jaGFubmVsczsKKyAgICAgICAgaWYgKGJ5dGVzX3Blcl9mcmFtZSAvIG5jaGFubmVscyAhPSBzaXplKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBvdmVyZmxvdyB0ZXN0IGlzIHJpZ29yb3VzbHkgY29ycmVjdCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgYm90aCBtdWx0aXBsaWNhbmRzIGFyZSA+PSAxLiAgVXNlIHRoZSBhcmd1bWVudCBuYW1lcworICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGRvY3MgZm9yIHRoZSBlcnJvciBtc2cuICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAqIG5jaGFubmVscyB0b28gYmlnIGZvciBhIEMgaW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdlaWdodEEgPCAxIHx8IHdlaWdodEIgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWlnaHRBIHNob3VsZCBiZSA+PSAxLCB3ZWlnaHRCIHNob3VsZCBiZSA+PSAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiAlIGJ5dGVzX3Blcl9mcmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIm5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5yYXRlIDw9IDAgfHwgb3V0cmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgInNhbXBsaW5nIHJhdGUgbm90ID4gMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIGRpdmlkZSBpbnJhdGUgYW5kIG91dHJhdGUgYnkgdGhlaXIgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgKi8KKyAgICAgICAgZCA9IGdjZChpbnJhdGUsIG91dHJhdGUpOworICAgICAgICBpbnJhdGUgLz0gZDsKKyAgICAgICAgb3V0cmF0ZSAvPSBkOwogCi0JcHJldl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOwotCWN1cl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOwotCWlmIChwcmV2X2kgPT0gTlVMTCB8fCBjdXJfaSA9PSBOVUxMKSB7Ci0JCSh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGV4aXQ7Ci0JfQorICAgICAgICBwcmV2X2kgPSAoaW50ICopIG1hbGxvYyhuY2hhbm5lbHMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGN1cl9pID0gKGludCAqKSBtYWxsb2MobmNoYW5uZWxzICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAocHJldl9pID09IE5VTEwgfHwgY3VyX2kgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQogCi0JbGVuIC89IGJ5dGVzX3Blcl9mcmFtZTsJLyogIyBvZiBmcmFtZXMgKi8KKyAgICAgICAgbGVuIC89IGJ5dGVzX3Blcl9mcmFtZTsgLyogIyBvZiBmcmFtZXMgKi8KIAotCWlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7Ci0JCWQgPSAtb3V0cmF0ZTsKLQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQotCQkJcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl0gPSAwOwotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAotCQkJCSJpTyE7YXVkaW9vcC5yYXRlY3Y6IGlsbGVnYWwgc3RhdGUgYXJndW1lbnQiLAotCQkJCSZkLCAmUHlUdXBsZV9UeXBlLCAmc2FtcHMpKQotCQkJZ290byBleGl0OwotCQlpZiAoUHlUdXBsZV9TaXplKHNhbXBzKSAhPSBuY2hhbm5lbHMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCi0JCQkJCSJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoUHlUdXBsZV9HZXRJdGVtKHNhbXBzLCBjaGFuKSwKLQkJCQkJICAgICAgImlpOnJhdGVjdiIsJnByZXZfaVtjaGFuXSwmY3VyX2lbY2hhbl0pKQotCQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KKyAgICAgICAgaWYgKHN0YXRlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBkID0gLW91dHJhdGU7CisgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlPITthdWRpb29wLnJhdGVjdjogaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLCAmUHlUdXBsZV9UeXBlLCAmc2FtcHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIGlmIChQeVR1cGxlX1NpemUoc2FtcHMpICE9IG5jaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShQeVR1cGxlX0dldEl0ZW0oc2FtcHMsIGNoYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpaTpyYXRlY3YiLCZwcmV2X2lbY2hhbl0sJmN1cl9pW2NoYW5dKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JLyogc3RyIDwtIFNwYWNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLQl7Ci0JCS8qIFRoZXJlIGFyZSBsZW4gaW5wdXQgZnJhbWVzLCBzbyB3ZSBuZWVkIChtYXRoZW1hdGljYWxseSkKLQkJICAgY2VpbGluZyhsZW4qb3V0cmF0ZS9pbnJhdGUpIG91dHB1dCBmcmFtZXMsIGFuZCBlYWNoIGZyYW1lCi0JCSAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCi0JCSAgIHdpdGhvdXQgc3B1cmlvdXMgb3ZlcmZsb3cgaXMgdGhlIGNoYWxsZW5nZTsgd2UgY2FuCi0JCSAgIHNldHRsZSBmb3IgYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kLCB0aG91Z2guICovCi0JCWludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLwotCQlpbnQgbmJ5dGVzOyAgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyBuZWVkZWQgKi8KLQkJaW50IHEgPSBsZW4gLyBpbnJhdGU7Ci0JCS8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAotCQkgICBhbmQgdGhpcyBpcyBsZXNzIHRoYW4gcSAqIGlucmF0ZSArIGlucmF0ZSA9IChxKzEpKmlucmF0ZS4KLQkJICAgU28gYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIGxlbipvdXRyYXRlL2lucmF0ZSBpcwotCQkgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9Ci0JCSAgIChxKzEpKm91dHJhdGUuCi0JCSovCi0JCWNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7Ci0JCW5ieXRlcyA9IGNlaWxpbmcgKiBieXRlc19wZXJfZnJhbWU7Ci0JCS8qIFNlZSB3aGV0aGVyIGFueXRoaW5nIG92ZXJmbG93ZWQ7IGlmIG5vdCwgZ2V0IHRoZSBzcGFjZS4gKi8KLQkJaWYgKHErMSA8IDAgfHwKLQkJICAgIGNlaWxpbmcgLyBvdXRyYXRlICE9IHErMSB8fAotCQkgICAgbmJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYW1lICE9IGNlaWxpbmcpCi0JCQlzdHIgPSBOVUxMOwotCQllbHNlCi0JCQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOworICAgICAgICAvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLworICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIGxlbiBpbnB1dCBmcmFtZXMsIHNvIHdlIG5lZWQgKG1hdGhlbWF0aWNhbGx5KQorICAgICAgICAgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQorICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCisgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzcHVyaW91cyBvdmVyZmxvdyBpcyB0aGUgY2hhbGxlbmdlOyB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLworICAgICAgICAgICAgICAgIGludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLworICAgICAgICAgICAgICAgIGludCBuYnl0ZXM7ICAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOworICAgICAgICAgICAgICAgIC8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAorICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIGlzIGxlc3MgdGhhbiBxICogaW5yYXRlICsgaW5yYXRlID0gKHErMSkqaW5yYXRlLgorICAgICAgICAgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKKyAgICAgICAgICAgICAgICAgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9CisgICAgICAgICAgICAgICAgICAgKHErMSkqb3V0cmF0ZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7CisgICAgICAgICAgICAgICAgbmJ5dGVzID0gY2VpbGluZyAqIGJ5dGVzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCisgICAgICAgICAgICAgICAgaWYgKHErMSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgY2VpbGluZyAvIG91dHJhdGUgIT0gcSsxIHx8CisgICAgICAgICAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOwogCi0JCWlmIChzdHIgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCW5jcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwogCi0JZm9yICg7OykgewotCQl3aGlsZSAoZCA8IDApIHsKLQkJCWlmIChsZW4gPT0gMCkgewotCQkJCXNhbXBzID0gUHlUdXBsZV9OZXcobmNoYW5uZWxzKTsKLQkJCQlpZiAoc2FtcHMgPT0gTlVMTCkKLQkJCQkJZ290byBleGl0OwotCQkJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHNhbXBzLCBjaGFuLAotCQkJCQkJUHlfQnVpbGRWYWx1ZSgiKGlpKSIsCi0JCQkJCQkJICAgICAgcHJldl9pW2NoYW5dLAotCQkJCQkJCSAgICAgIGN1cl9pW2NoYW5dKSk7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCWdvdG8gZXhpdDsKLQkJCQkvKiBXZSBoYXZlIGNoZWNrZWQgYmVmb3JlIHRoYXQgdGhlIGxlbmd0aAotCQkJCSAqIG9mIHRoZSBzdHJpbmcgZml0cyBpbnRvIGludC4gKi8KLQkJCQlsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKLQkJCQlpZiAobGVuID09IDApIHsKLQkJCQkJLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCi0JCQkJCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotCQkJCQlQeV9ERUNSRUYoc3RyKTsKLQkJCQkJc3RyID0gcnY7Ci0JCQkJfSBlbHNlIGlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbikgPCAwKQotCQkJCQlnb3RvIGV4aXQ7Ci0JCQkJcnYgPSBQeV9CdWlsZFZhbHVlKCIoTyhpTykpIiwgc3RyLCBkLCBzYW1wcyk7Ci0JCQkJUHlfREVDUkVGKHNhbXBzKTsKLQkJCQlQeV9ERUNSRUYoc3RyKTsKLQkJCQlnb3RvIGV4aXQ7IC8qIHJldHVybiBydiAqLwotCQkJfQotCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQkJcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl07Ci0JCQkJaWYgKHNpemUgPT0gMSkKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqQ0hBUlAoY3AsIDApKSA8PCA4OwotCQkJCWVsc2UgaWYgKHNpemUgPT0gMikKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOwotCQkJCWVsc2UgaWYgKHNpemUgPT0gNCkKLQkJCQkgICAgY3VyX2lbY2hhbl0gPSAoKGludCkqTE9OR1AoY3AsIDApKSA+PiAxNjsKLQkJCQljcCArPSBzaXplOwotCQkJCS8qIGltcGxlbWVudHMgYSBzaW1wbGUgZGlnaXRhbCBmaWx0ZXIgKi8KLQkJCQljdXJfaVtjaGFuXSA9Ci0JCQkJCSh3ZWlnaHRBICogY3VyX2lbY2hhbl0gKwotCQkJCQkgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLwotCQkJCQkod2VpZ2h0QSArIHdlaWdodEIpOwotCQkJfQotCQkJbGVuLS07Ci0JCQlkICs9IG91dHJhdGU7Ci0JCX0KLQkJd2hpbGUgKGQgPj0gMCkgewotCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0JCQkJY3VyX28gPSAocHJldl9pW2NoYW5dICogZCArCi0JCQkJCSBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KLQkJCQkJb3V0cmF0ZTsKLQkJCQlpZiAoc2l6ZSA9PSAxKQotCQkJCSAgICAqQ0hBUlAobmNwLCAwKSA9IChzaWduZWQgY2hhcikoY3VyX28gPj4gOCk7Ci0JCQkJZWxzZSBpZiAoc2l6ZSA9PSAyKQotCQkJCSAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKLQkJCQllbHNlIGlmIChzaXplID09IDQpCi0JCQkJICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOwotCQkJCW5jcCArPSBzaXplOwotCQkJfQotCQkJZCAtPSBpbnJhdGU7Ci0JCX0KLQl9CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBjaGVja2VkIGJlZm9yZSB0aGF0IHRoZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaU8pKSIsIHN0ciwgZCwgc2FtcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2FtcHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OyAvKiByZXR1cm4gcnYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkNIQVJQKGNwLCAwKSkgPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCArPSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpZ2l0YWwgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSAqIGN1cl9pW2NoYW5dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICsgd2VpZ2h0Qik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9vID0gKHByZXZfaVtjaGFuXSAqIGQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxPTkdQKG5jcCwgMCkgPSAoUHlfSW50MzIpKGN1cl9vPDwxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZCAtPSBpbnJhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAgIGV4aXQ6Ci0JaWYgKHByZXZfaSAhPSBOVUxMKQotCQlmcmVlKHByZXZfaSk7Ci0JaWYgKGN1cl9pICE9IE5VTEwpCi0JCWZyZWUoY3VyX2kpOwotCXJldHVybiBydjsKKyAgICAgICAgaWYgKHByZXZfaSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGZyZWUocHJldl9pKTsKKyAgICAgICAgaWYgKGN1cl9pICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZnJlZShjdXJfaSk7CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMnVsYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgICAgIGludCBpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0JCWlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CiAKLQkJKm5jcCsrID0gc3RfbGluZWFyX3RvX3VsYXcodmFsKTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgICAgICAgICAgICAgICpuY3ArKyA9IHN0XzE0bGluZWFyMnVsYXcodmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3VsYXcybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyIGN2YWw7Ci0Jc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWw7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdmFsOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAotCQkJICAmY3AsICZsZW4sICZzaXplKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKTsKKyAgICAgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogICAgIAotCWZvciAoIGk9MDsgaSA8IGxlbipzaXplOyBpICs9IHNpemUgKSB7Ci0JCWN2YWwgPSAqY3ArKzsKLQkJdmFsID0gc3RfdWxhd190b19saW5lYXIoY3ZhbCk7Ci0JCi0JCWlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotCQllbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOwotCQllbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbipzaXplOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgY3ZhbCA9ICpjcCsrOworICAgICAgICAgICAgICAgIHZhbCA9IHN0X3VsYXcybGluZWFyMTYoY3ZhbCk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCithdWRpb29wX2xpbjJhbGF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIAorICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisKKyAgICAgICAgICAgICAgICAqbmNwKysgPSBzdF9saW5lYXIyYWxhdyh2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2F1ZGlvb3BfYWxhdzJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjdmFsOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWw7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSk7CisgICAgICAgIGlmICggcnYgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICAKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuKnNpemU7IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBjdmFsID0gKmNwKys7CisgICAgICAgICAgICAgICAgdmFsID0gc3RfYWxhdzJsaW5lYXIxNihjdmFsKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbGluMmFkcGNtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaWduZWQgY2hhciAqY3A7Ci0Jc2lnbmVkIGNoYXIgKm5jcDsKLQlpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKLQkJaW5kZXgsIHNpZ24sIHZwZGlmZiwgZGlmZjsKLQlQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKLQlpbnQgaSwgb3V0cHV0YnVmZmVyID0gMCwgYnVmZmVyc3RlcDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKmNwOworICAgICAgICBzaWduZWQgY2hhciAqbmNwOworICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBzdGVwLCB2YWxwcmVkLCBkZWx0YSwKKyAgICAgICAgICAgICAgICBpbmRleCwgc2lnbiwgdnBkaWZmLCBkaWZmOworICAgICAgICBQeU9iamVjdCAqcnYsICpzdGF0ZSwgKnN0cjsKKyAgICAgICAgaW50IGksIG91dHB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKLQkJCSAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCi0JCXJldHVybiAwOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiKHMjaU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnN0YXRlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgCiAKLQlpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgCi0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKLQlpZiAoIHN0ciA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKKyAgICAgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKLQkvKiBEZWNvZGUgc3RhdGUsIHNob3VsZCBoYXZlICh2YWx1ZSwgc3RlcCkgKi8KLQlpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7Ci0JCS8qIEZpcnN0IHRpbWUsIGl0IHNlZW1zLiBTZXQgZGVmYXVsdHMgKi8KLQkJdmFscHJlZCA9IDA7Ci0JCXN0ZXAgPSA3OwotCQlpbmRleCA9IDA7Ci0JfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlKHN0YXRlLCAiKGlpKSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKLQkJcmV0dXJuIDA7CisgICAgICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLworICAgICAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLworICAgICAgICAgICAgICAgIHZhbHByZWQgPSAwOworICAgICAgICAgICAgICAgIHN0ZXAgPSA3OworICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlKHN0YXRlLCAiKGlpKSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCXN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQlidWZmZXJzdGVwID0gMTsKKyAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICBidWZmZXJzdGVwID0gMTsKIAotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotCQlpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKyAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwogCi0JCS8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCi0JCWRpZmYgPSB2YWwgLSB2YWxwcmVkOwotCQlzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOwotCQlpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDEgLSBjb21wdXRlIGRpZmZlcmVuY2Ugd2l0aCBwcmV2aW91cyB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGRpZmYgPSB2YWwgLSB2YWxwcmVkOworICAgICAgICAgICAgICAgIHNpZ24gPSAoZGlmZiA8IDApID8gOCA6IDA7CisgICAgICAgICAgICAgICAgaWYgKCBzaWduICkgZGlmZiA9ICgtZGlmZik7CiAKLQkJLyogU3RlcCAyIC0gRGl2aWRlIGFuZCBjbGFtcCAqLwotCQkvKiBOb3RlOgotCQkqKiBUaGlzIGNvZGUgKmFwcHJveGltYXRlbHkqIGNvbXB1dGVzOgotCQkqKiAgICBkZWx0YSA9IGRpZmYqNC9zdGVwOwotCQkqKiAgICB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQ7Ci0JCSoqIGJ1dCBpbiBzaGlmdCBzdGVwIGJpdHMgYXJlIGRyb3BwZWQuIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMKLQkJKiogaXMgdGhhdCBldmVuIGlmIHlvdSBoYXZlIGZhc3QgbXVsL2RpdiBoYXJkd2FyZSB5b3UgY2Fubm90Ci0JCSoqIHB1dCBpdCB0byBnb29kIHVzZSBzaW5jZSB0aGUgZml4dXAgd291bGQgYmUgdG9vIGV4cGVuc2l2ZS4KLQkJKi8KLQkJZGVsdGEgPSAwOwotCQl2cGRpZmYgPSAoc3RlcCA+PiAzKTsKLQkKLQkJaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0JCQlkZWx0YSA9IDQ7Ci0JCQlkaWZmIC09IHN0ZXA7Ci0JCQl2cGRpZmYgKz0gc3RlcDsKLQkJfQotCQlzdGVwID4+PSAxOwotCQlpZiAoIGRpZmYgPj0gc3RlcCAgKSB7Ci0JCQlkZWx0YSB8PSAyOwotCQkJZGlmZiAtPSBzdGVwOwotCQkJdnBkaWZmICs9IHN0ZXA7Ci0JCX0KLQkJc3RlcCA+Pj0gMTsKLQkJaWYgKCBkaWZmID49IHN0ZXAgKSB7Ci0JCQlkZWx0YSB8PSAxOwotCQkJdnBkaWZmICs9IHN0ZXA7Ci0JCX0KKyAgICAgICAgICAgICAgICAvKiBTdGVwIDIgLSBEaXZpZGUgYW5kIGNsYW1wICovCisgICAgICAgICAgICAgICAgLyogTm90ZToKKyAgICAgICAgICAgICAgICAqKiBUaGlzIGNvZGUgKmFwcHJveGltYXRlbHkqIGNvbXB1dGVzOgorICAgICAgICAgICAgICAgICoqICAgIGRlbHRhID0gZGlmZio0L3N0ZXA7CisgICAgICAgICAgICAgICAgKiogICAgdnBkaWZmID0gKGRlbHRhKzAuNSkqc3RlcC80OworICAgICAgICAgICAgICAgICoqIGJ1dCBpbiBzaGlmdCBzdGVwIGJpdHMgYXJlIGRyb3BwZWQuIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMKKyAgICAgICAgICAgICAgICAqKiBpcyB0aGF0IGV2ZW4gaWYgeW91IGhhdmUgZmFzdCBtdWwvZGl2IGhhcmR3YXJlIHlvdSBjYW5ub3QKKyAgICAgICAgICAgICAgICAqKiBwdXQgaXQgdG8gZ29vZCB1c2Ugc2luY2UgdGhlIGZpeHVwIHdvdWxkIGJlIHRvbyBleHBlbnNpdmUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBkZWx0YSA9IDA7CisgICAgICAgICAgICAgICAgdnBkaWZmID0gKHN0ZXAgPj4gMyk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmID49IHN0ZXAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgfD0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gc3RlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGVwID4+PSAxOworICAgICAgICAgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgfD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KIAotCQkvKiBTdGVwIDMgLSBVcGRhdGUgcHJldmlvdXMgdmFsdWUgKi8KLQkJaWYgKCBzaWduICkKLQkJCXZhbHByZWQgLT0gdnBkaWZmOwotCQllbHNlCi0JCQl2YWxwcmVkICs9IHZwZGlmZjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDMgLSBVcGRhdGUgcHJldmlvdXMgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHNpZ24gKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCArPSB2cGRpZmY7CiAKLQkJLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLwotCQlpZiAoIHZhbHByZWQgPiAzMjc2NyApCi0JCQl2YWxwcmVkID0gMzI3Njc7Ci0JCWVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLQkJCXZhbHByZWQgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLworICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwogCi0JCS8qIFN0ZXAgNSAtIEFzc2VtYmxlIHZhbHVlLCB1cGRhdGUgaW5kZXggYW5kIHN0ZXAgdmFsdWVzICovCi0JCWRlbHRhIHw9IHNpZ247Ci0JCi0JCWluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOwotCQlpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLQkJaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKLQkJc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNSAtIEFzc2VtYmxlIHZhbHVlLCB1cGRhdGUgaW5kZXggYW5kIHN0ZXAgdmFsdWVzICovCisgICAgICAgICAgICAgICAgZGVsdGEgfD0gc2lnbjsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaW5kZXggKz0gaW5kZXhUYWJsZVtkZWx0YV07CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKKyAgICAgICAgICAgICAgICBzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07CiAKLQkJLyogU3RlcCA2IC0gT3V0cHV0IHZhbHVlICovCi0JCWlmICggYnVmZmVyc3RlcCApIHsKLQkJCW91dHB1dGJ1ZmZlciA9IChkZWx0YSA8PCA0KSAmIDB4ZjA7Ci0JCX0gZWxzZSB7Ci0JCQkqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKLQkJfQotCQlidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7Ci0JfQotCXJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOwotCVB5X0RFQ1JFRihzdHIpOwotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIGJ1ZmZlcnN0ZXAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRidWZmZXIgPSAoZGVsdGEgPDwgNCkgJiAweGYwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworICAgICAgICB9CisgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZHBjbTJsaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNpZ25lZCBjaGFyICpjcDsKLQlzaWduZWQgY2hhciAqbmNwOwotCWludCBsZW4sIHNpemUsIHZhbHByZWQsIHN0ZXAsIGRlbHRhLCBpbmRleCwgc2lnbiwgdnBkaWZmOwotCVB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOwotCWludCBpLCBpbnB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CisgICAgICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKKyAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFscHJlZCwgc3RlcCwgZGVsdGEsIGluZGV4LCBzaWduLCB2cGRpZmY7CisgICAgICAgIFB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOworICAgICAgICBpbnQgaSwgaW5wdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lPKSIsCi0JCQkgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UoYXJncywgIihzI2lPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIAotCS8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotCWlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKLQkJLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotCQl2YWxwcmVkID0gMDsKLQkJc3RlcCA9IDc7Ci0JCWluZGV4ID0gMDsKLQl9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQotCQlyZXR1cm4gMDsKKyAgICAgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCisgICAgICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCisgICAgICAgICAgICAgICAgdmFscHJlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RlcCA9IDc7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2Uoc3RhdGUsICIoaWkpIiwgJnZhbHByZWQsICZpbmRleCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgIAotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbipzaXplKjIpOwotCWlmICggc3RyID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qc2l6ZSoyKTsKKyAgICAgICAgaWYgKCBzdHIgPT0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKLQlzdGVwID0gc3RlcHNpemVUYWJsZVtpbmRleF07Ci0JYnVmZmVyc3RlcCA9IDA7CisgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICAgICAgYnVmZmVyc3RlcCA9IDA7CiAgICAgCi0JZm9yICggaT0wOyBpIDwgbGVuKnNpemUqMjsgaSArPSBzaXplICkgewotCQkvKiBTdGVwIDEgLSBnZXQgdGhlIGRlbHRhIHZhbHVlIGFuZCBjb21wdXRlIG5leHQgaW5kZXggKi8KLQkJaWYgKCBidWZmZXJzdGVwICkgewotCQkJZGVsdGEgPSBpbnB1dGJ1ZmZlciAmIDB4ZjsKLQkJfSBlbHNlIHsKLQkJCWlucHV0YnVmZmVyID0gKmNwKys7Ci0JCQlkZWx0YSA9IChpbnB1dGJ1ZmZlciA+PiA0KSAmIDB4ZjsKLQkJfQorICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW4qc2l6ZSoyOyBpICs9IHNpemUgKSB7CisgICAgICAgICAgICAgICAgLyogU3RlcCAxIC0gZ2V0IHRoZSBkZWx0YSB2YWx1ZSBhbmQgY29tcHV0ZSBuZXh0IGluZGV4ICovCisgICAgICAgICAgICAgICAgaWYgKCBidWZmZXJzdGVwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBpbnB1dGJ1ZmZlciAmIDB4ZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRidWZmZXIgPSAqY3ArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKGlucHV0YnVmZmVyID4+IDQpICYgMHhmOworICAgICAgICAgICAgICAgIH0KIAotCQlidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgICAgICAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOwogCi0JCS8qIFN0ZXAgMiAtIEZpbmQgbmV3IGluZGV4IHZhbHVlIChmb3IgbGF0ZXIpICovCi0JCWluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOwotCQlpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLQkJaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDIgLSBGaW5kIG5ldyBpbmRleCB2YWx1ZSAoZm9yIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CiAKLQkJLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCi0JCXNpZ24gPSBkZWx0YSAmIDg7Ci0JCWRlbHRhID0gZGVsdGEgJiA3OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgMyAtIFNlcGFyYXRlIHNpZ24gYW5kIG1hZ25pdHVkZSAqLworICAgICAgICAgICAgICAgIHNpZ24gPSBkZWx0YSAmIDg7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSAmIDc7CiAKLQkJLyogU3RlcCA0IC0gQ29tcHV0ZSBkaWZmZXJlbmNlIGFuZCBuZXcgcHJlZGljdGVkIHZhbHVlICovCi0JCS8qCi0JCSoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKLQkJKiogaW4gYWRwY21fY29kZXIuCi0JCSovCi0JCXZwZGlmZiA9IHN0ZXAgPj4gMzsKLQkJaWYgKCBkZWx0YSAmIDQgKSB2cGRpZmYgKz0gc3RlcDsKLQkJaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKLQkJaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDQgLSBDb21wdXRlIGRpZmZlcmVuY2UgYW5kIG5ldyBwcmVkaWN0ZWQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAqKiBpbiBhZHBjbV9jb2Rlci4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHZwZGlmZiA9IHN0ZXAgPj4gMzsKKyAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgNCApIHZwZGlmZiArPSBzdGVwOworICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiAyICkgdnBkaWZmICs9IHN0ZXA+PjE7CisgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKIAotCQlpZiAoIHNpZ24gKQotCQkJdmFscHJlZCAtPSB2cGRpZmY7Ci0JCWVsc2UKLQkJCXZhbHByZWQgKz0gdnBkaWZmOworICAgICAgICAgICAgICAgIGlmICggc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkIC09IHZwZGlmZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkICs9IHZwZGlmZjsKIAotCQkvKiBTdGVwIDUgLSBjbGFtcCBvdXRwdXQgdmFsdWUgKi8KLQkJaWYgKCB2YWxwcmVkID4gMzI3NjcgKQotCQkJdmFscHJlZCA9IDMyNzY3OwotCQllbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCi0JCQl2YWxwcmVkID0gLTMyNzY4OworICAgICAgICAgICAgICAgIC8qIFN0ZXAgNSAtIGNsYW1wIG91dHB1dCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIGlmICggdmFscHJlZCA+IDMyNzY3ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAzMjc2NzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggdmFscHJlZCA8IC0zMjc2OCApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxwcmVkID0gLTMyNzY4OwogCi0JCS8qIFN0ZXAgNiAtIFVwZGF0ZSBzdGVwIHZhbHVlICovCi0JCXN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBVcGRhdGUgc3RlcCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKIAotCQkvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KLQkJaWYgKCBzaXplID09IDEgKSAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFscHJlZCA+PiA4KTsKLQkJZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7Ci0JCWVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOwotCX0KKyAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBPdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbHByZWQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKSA9IChQeV9JbnQzMikodmFscHJlZDw8MTYpOworICAgICAgICB9CiAKLQlydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKLQlQeV9ERUNSRUYoc3RyKTsKLQlyZXR1cm4gcnY7CisgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaWkpKSIsIHN0ciwgdmFscHJlZCwgaW5kZXgpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYXVkaW9vcF9tZXRob2RzW10gPSB7Ci0JeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfT0xEQVJHUyB9LAotCXsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX09MREFSR1MgfSwKLQl7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9PTERBUkdTIH0sCi0JeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX09MREFSR1MgfSwKLQl7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX09MREFSR1MgfSwKLQl7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX09MREFSR1MgfSwKLQl7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfT0xEQVJHUyB9LAotCXsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX09MREFSR1MgfSwKLQl7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9PTERBUkdTIH0sCi0JeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9PTERBUkdTIH0sCi0JeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX09MREFSR1MgfSwKLQl7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfT0xEQVJHUyB9LAotCXsgImxpbjJsaW4iLCBhdWRpb29wX2xpbjJsaW4sIE1FVEhfT0xEQVJHUyB9LAotCXsgImFkcGNtMmxpbiIsIGF1ZGlvb3BfYWRwY20ybGluLCBNRVRIX09MREFSR1MgfSwKLQl7ICJsaW4yYWRwY20iLCBhdWRpb29wX2xpbjJhZHBjbSwgTUVUSF9PTERBUkdTIH0sCi0JeyAidG9tb25vIiwgYXVkaW9vcF90b21vbm8sIE1FVEhfT0xEQVJHUyB9LAotCXsgInRvc3RlcmVvIiwgYXVkaW9vcF90b3N0ZXJlbywgTUVUSF9PTERBUkdTIH0sCi0JeyAiZ2V0c2FtcGxlIiwgYXVkaW9vcF9nZXRzYW1wbGUsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJldmVyc2UiLCBhdWRpb29wX3JldmVyc2UsIE1FVEhfT0xEQVJHUyB9LAotCXsgInJhdGVjdiIsIGF1ZGlvb3BfcmF0ZWN2LCBNRVRIX1ZBUkFSR1MgfSwKLQl7IDAsICAgICAgICAgIDAgfQorICAgICAgICB7ICJtYXgiLCBhdWRpb29wX21heCwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYXZnIiwgYXVkaW9vcF9hdmcsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJtYXhwcCIsIGF1ZGlvb3BfbWF4cHAsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJybXMiLCBhdWRpb29wX3JtcywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImZpbmRmaXQiLCBhdWRpb29wX2ZpbmRmaXQsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiZmluZGZhY3RvciIsIGF1ZGlvb3BfZmluZGZhY3RvciwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImNyb3NzIiwgYXVkaW9vcF9jcm9zcywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYWRkIiwgYXVkaW9vcF9hZGQsIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJiaWFzIiwgYXVkaW9vcF9iaWFzLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMnVsYXciLCBhdWRpb29wX2xpbjJ1bGF3LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAiYWxhdzJsaW4iLCBhdWRpb29wX2FsYXcybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmFsYXciLCBhdWRpb29wX2xpbjJhbGF3LCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmxpbiIsIGF1ZGlvb3BfbGluMmxpbiwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImFkcGNtMmxpbiIsIGF1ZGlvb3BfYWRwY20ybGluLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAibGluMmFkcGNtIiwgYXVkaW9vcF9saW4yYWRwY20sIE1FVEhfT0xEQVJHUyB9LAorICAgICAgICB7ICJ0b21vbm8iLCBhdWRpb29wX3RvbW9ubywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInRvc3RlcmVvIiwgYXVkaW9vcF90b3N0ZXJlbywgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgImdldHNhbXBsZSIsIGF1ZGlvb3BfZ2V0c2FtcGxlLCBNRVRIX09MREFSR1MgfSwKKyAgICAgICAgeyAicmV2ZXJzZSIsIGF1ZGlvb3BfcmV2ZXJzZSwgTUVUSF9PTERBUkdTIH0sCisgICAgICAgIHsgInJhdGVjdiIsIGF1ZGlvb3BfcmF0ZWN2LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICAgICAgeyAwLCAgICAgICAgICAwIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXVkaW9vcCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlfSW5pdE1vZHVsZSgiYXVkaW9vcCIsIGF1ZGlvb3BfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUF1ZGlvb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXVkaW9vcC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKLQkgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsImVycm9yIixBdWRpb29wRXJyb3IpOworICAgICAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKKyAgICAgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgICAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKKyAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJlcnJvciIsQXVkaW9vcEVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggNzI3ZGNjOS4uMThkZjU5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogICAqX19nZXRzdGF0ZV9fX3N0ciwgKl9fc2V0c3RhdGVfX19zdHIsICpfX25hbWVfX19zdHIsICpfX3JlZHVjZV9fX3N0ciwKICAgKl9fcmVkdWNlX2V4X19fc3RyLAogICAqd3JpdGVfc3RyLCAqYXBwZW5kX3N0ciwKLSAgKnJlYWRfc3RyLCAqcmVhZGxpbmVfc3RyLCAqX19tYWluX19fc3RyLCAqX19iYXNpY25ld19fX3N0ciwKKyAgKnJlYWRfc3RyLCAqcmVhZGxpbmVfc3RyLCAqX19tYWluX19fc3RyLCAKICAgKmNvcHlfcmVnX3N0ciwgKmRpc3BhdGNoX3RhYmxlX3N0cjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI5MDksMzggKzI5MDksMjggQEAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfdHJhdmVyc2UoUGlja2xlcm9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKFNMT1QpLCBhcmcpOyBcCi0JCWlmIChlcnIpIFwKLQkJCXJldHVybiBlcnI7IFwKLQl9Ci0JVklTSVQoc2VsZi0+d3JpdGUpOwotCVZJU0lUKHNlbGYtPm1lbW8pOwotCVZJU0lUKHNlbGYtPmZhc3RfbWVtbyk7Ci0JVklTSVQoc2VsZi0+YXJnKTsKLQlWSVNJVChzZWxmLT5maWxlKTsKLQlWSVNJVChzZWxmLT5wZXJzX2Z1bmMpOwotCVZJU0lUKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKLQlWSVNJVChzZWxmLT5kaXNwYXRjaF90YWJsZSk7Ci0jdW5kZWYgVklTSVQKKwlQeV9WSVNJVChzZWxmLT53cml0ZSk7CisJUHlfVklTSVQoc2VsZi0+bWVtbyk7CisJUHlfVklTSVQoc2VsZi0+ZmFzdF9tZW1vKTsKKwlQeV9WSVNJVChzZWxmLT5hcmcpOworCVB5X1ZJU0lUKHNlbGYtPmZpbGUpOworCVB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7CisJUHlfVklTSVQoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOworCVB5X1ZJU0lUKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9jbGVhcihQaWNrbGVyb2JqZWN0ICpzZWxmKQogewotI2RlZmluZSBDTEVBUihTTE9UKSBQeV9YREVDUkVGKFNMT1QpOyBTTE9UID0gTlVMTDsKLQlDTEVBUihzZWxmLT53cml0ZSk7Ci0JQ0xFQVIoc2VsZi0+bWVtbyk7Ci0JQ0xFQVIoc2VsZi0+ZmFzdF9tZW1vKTsKLQlDTEVBUihzZWxmLT5hcmcpOwotCUNMRUFSKHNlbGYtPmZpbGUpOwotCUNMRUFSKHNlbGYtPnBlcnNfZnVuYyk7Ci0JQ0xFQVIoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCUNMRUFSKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLSN1bmRlZiBDTEVBUgorCVB5X0NMRUFSKHNlbGYtPndyaXRlKTsKKwlQeV9DTEVBUihzZWxmLT5tZW1vKTsKKwlQeV9DTEVBUihzZWxmLT5mYXN0X21lbW8pOworCVB5X0NMRUFSKHNlbGYtPmFyZyk7CisJUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisJUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9DTEVBUihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisJUHlfQ0xFQVIoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwogCXJldHVybiAwOwogfQogCkBAIC01MjYwLDQxICs1MjUwLDMwIEBACiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfdHJhdmVyc2UoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCi0jZGVmaW5lIFZJU0lUKFNMT1QpIFwKLQlpZiAoU0xPVCkgeyBcCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShTTE9UKSwgYXJnKTsgXAotCQlpZiAoZXJyKSBcCi0JCQlyZXR1cm4gZXJyOyBcCi0JfQotCVZJU0lUKHNlbGYtPnJlYWRsaW5lKTsKLQlWSVNJVChzZWxmLT5yZWFkKTsKLQlWSVNJVChzZWxmLT5maWxlKTsKLQlWSVNJVChzZWxmLT5tZW1vKTsKLQlWSVNJVChzZWxmLT5zdGFjayk7Ci0JVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKLQlWSVNJVChzZWxmLT5hcmcpOwotCVZJU0lUKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlWSVNJVChzZWxmLT5maW5kX2NsYXNzKTsKLSN1bmRlZiBWSVNJVAorCVB5X1ZJU0lUKHNlbGYtPnJlYWRsaW5lKTsKKwlQeV9WSVNJVChzZWxmLT5yZWFkKTsKKwlQeV9WSVNJVChzZWxmLT5maWxlKTsKKwlQeV9WSVNJVChzZWxmLT5tZW1vKTsKKwlQeV9WSVNJVChzZWxmLT5zdGFjayk7CisJUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKKwlQeV9WSVNJVChzZWxmLT5hcmcpOworCVB5X1ZJU0lUKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKwlQeV9WSVNJVChzZWxmLT5maW5kX2NsYXNzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogVW5waWNrbGVyX2NsZWFyKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLSNkZWZpbmUgQ0xFQVIoU0xPVCkgUHlfWERFQ1JFRihTTE9UKTsgU0xPVCA9IE5VTEwKLQlDTEVBUihzZWxmLT5yZWFkbGluZSk7Ci0JQ0xFQVIoc2VsZi0+cmVhZCk7Ci0JQ0xFQVIoc2VsZi0+ZmlsZSk7Ci0JQ0xFQVIoc2VsZi0+bWVtbyk7Ci0JQ0xFQVIoc2VsZi0+c3RhY2spOwotCUNMRUFSKHNlbGYtPnBlcnNfZnVuYyk7Ci0JQ0xFQVIoc2VsZi0+YXJnKTsKLQlDTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7Ci0JQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7Ci0jdW5kZWYgQ0xFQVIKKwlQeV9DTEVBUihzZWxmLT5yZWFkbGluZSk7CisJUHlfQ0xFQVIoc2VsZi0+cmVhZCk7CisJUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisJUHlfQ0xFQVIoc2VsZi0+bWVtbyk7CisJUHlfQ0xFQVIoc2VsZi0+c3RhY2spOworCVB5X0NMRUFSKHNlbGYtPnBlcnNfZnVuYyk7CisJUHlfQ0xFQVIoc2VsZi0+YXJnKTsKKwlQeV9DTEVBUihzZWxmLT5sYXN0X3N0cmluZyk7CisJUHlfQ0xFQVIoc2VsZi0+ZmluZF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU2MDIsNyArNTU4MSw2IEBACiAJSU5JVF9TVFIocmVhZGxpbmUpOwogCUlOSVRfU1RSKGNvcHlfcmVnKTsKIAlJTklUX1NUUihkaXNwYXRjaF90YWJsZSk7Ci0JSU5JVF9TVFIoX19iYXNpY25ld19fKTsKIAogCWlmICghKCBjb3B5X3JlZyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKSkpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY1N0cmluZ0lPLmMgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCmluZGV4IGJkYzlmMDAuLjRkZWJiNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1N0cmluZ0lPLmMKKysrIGIvTW9kdWxlcy9jU3RyaW5nSU8uYwpAQCAtNTAzLDE3ICs1MDMsMTcgQEAKICAgMCwJICAgICAgIAkJCS8qdHBfaXRlbXNpemUqLwogICAvKiBtZXRob2RzICovCiAgIChkZXN0cnVjdG9yKU9fZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgKHByaW50ZnVuYykwLAkJCS8qdHBfcHJpbnQqLworICAwLAkJCQkvKnRwX3ByaW50Ki8KICAgMCwJCSAJCS8qdHBfZ2V0YXR0ciAqLwogICAwLAkJIAkJLyp0cF9zZXRhdHRyICovCi0gIChjbXBmdW5jKTAsCQkJLyp0cF9jb21wYXJlKi8KLSAgKHJlcHJmdW5jKTAsCQkJLyp0cF9yZXByKi8KKyAgMCwJCQkJLyp0cF9jb21wYXJlKi8KKyAgMCwJCQkJLyp0cF9yZXByKi8KICAgMCwJCQkJLyp0cF9hc19udW1iZXIqLwogICAwLAkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KICAgMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgKGhhc2hmdW5jKTAsCQkJLyp0cF9oYXNoKi8KLSAgKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotICAocmVwcmZ1bmMpMCwJCQkvKnRwX3N0ciovCisgIDAsCQkJCS8qdHBfaGFzaCovCisgIDAJLAkJCS8qdHBfY2FsbCovCisgIDAsCQkJCS8qdHBfc3RyKi8KICAgMCwJCQkJLyp0cF9nZXRhdHRybyAqLwogICAwLAkJCQkvKnRwX3NldGF0dHJvICovCiAgIDAsCQkJCS8qdHBfYXNfYnVmZmVyICovCkBAIC02MjQsMTcgKzYyNCwxNyBAQAogICAwLAkJCQkJLyp0cF9pdGVtc2l6ZSovCiAgIC8qIG1ldGhvZHMgKi8KICAgKGRlc3RydWN0b3IpSV9kZWFsbG9jLAkJLyp0cF9kZWFsbG9jKi8KLSAgKHByaW50ZnVuYykwLAkJCQkvKnRwX3ByaW50Ki8KKyAgMCwJCQkJCS8qdHBfcHJpbnQqLwogICAwLAkJIAkJCS8qIHRwX2dldGF0dHIgKi8KLSAgKHNldGF0dHJmdW5jKTAsCQkJLyp0cF9zZXRhdHRyKi8KLSAgKGNtcGZ1bmMpMCwJCQkJLyp0cF9jb21wYXJlKi8KLSAgKHJlcHJmdW5jKTAsCQkJCS8qdHBfcmVwciovCisgIDAsCQkJCQkvKnRwX3NldGF0dHIqLworICAwLAkJCQkJLyp0cF9jb21wYXJlKi8KKyAgMCwJCQkJCS8qdHBfcmVwciovCiAgIDAsCQkJCQkvKnRwX2FzX251bWJlciovCiAgIDAsCQkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KICAgMCwJCQkJCS8qdHBfYXNfbWFwcGluZyovCi0gIChoYXNoZnVuYykwLAkJCQkvKnRwX2hhc2gqLwotICAodGVybmFyeWZ1bmMpMCwJCQkvKnRwX2NhbGwqLwotICAocmVwcmZ1bmMpMCwJCQkJLyp0cF9zdHIqLworICAwLAkJCQkJLyp0cF9oYXNoKi8KKyAgMCwJCQkJCS8qdHBfY2FsbCovCisgIDAsCQkJCQkvKnRwX3N0ciovCiAgIDAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwogICAwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jY3B5dGhvbi5jYyBiL01vZHVsZXMvY2NweXRob24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTk3ZmYuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9jY3B5dGhvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIE1pbmltYWwgbWFpbiBwcm9ncmFtIC0tIGV2ZXJ5dGhpbmcgaXMgbG9hZGVkIGZyb20gdGhlIGxpYnJhcnkgKi8KLQotI2luY2x1ZGUgIlB5dGhvbi5oIgotCi1leHRlcm4gIkMiCi1ETF9FWFBPUlQoaW50KSBQeV9NYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICk7Ci0KLWludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKLXsKLQlyZXR1cm4gUHlfTWFpbihhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYwppbmRleCBmZDA0OGQ5Li5mYjUxMjk3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCkBAIC0yMTcsMTEgKzIxNyw4IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCSJ1bmljb2RlIG1hcHBpbmcgaW52YWxpZCIpOworCQkJaWYgKHV0cnJhbmdlLT5maXJzdCA9PSAwKQogCQkJCXJldHVybiAxOwotCQkJfQogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKaW5kZXggZjUxYjZmMi4uMzQwZGUxOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCkBAIC02LDYgKzYsNyBAQAogCiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKICNpbmNsdWRlICJtdWx0aWJ5dGVjb2RlYy5oIgogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zOCwyMiArMzksMTQgQEAKIGFyZSAnaWdub3JlJyBhbmQgJ3JlcGxhY2UnIGFzIHdlbGwgYXMgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJkIHdpdGhcblwKIGNvZGVjcy5yZWdpc3Rlcl9lcnJvciB0aGF0IGlzIGFibGUgdG8gaGFuZGxlIFVuaWNvZGVEZWNvZGVFcnJvcnMuIik7CiAKLVB5RG9jX1NUUlZBUihNdWx0aWJ5dGVDb2RlY19TdHJlYW1SZWFkZXJfX2RvY19fLAotIkkuU3RyZWFtUmVhZGVyKHN0cmVhbVssIGVycm9yc10pIC0+IFN0cmVhbVJlYWRlciBpbnN0YW5jZSIpOwotCi1QeURvY19TVFJWQVIoTXVsdGlieXRlQ29kZWNfU3RyZWFtV3JpdGVyX19kb2NfXywKLSJJLlN0cmVhbVdyaXRlcihzdHJlYW1bLCBlcnJvcnNdKSAtPiBTdHJlYW1Xcml0ZXIgaW5zdGFuY2UiKTsKLQogc3RhdGljIGNoYXIgKmNvZGVja3dhcmdsaXN0W10gPSB7ImlucHV0IiwgImVycm9ycyIsIE5VTEx9Oworc3RhdGljIGNoYXIgKmluY25ld2t3YXJnbGlzdFtdID0geyJlcnJvcnMiLCBOVUxMfTsKK3N0YXRpYyBjaGFyICppbmNyZW1lbnRhbGt3YXJnbGlzdFtdID0geyJpbnB1dCIsICJmaW5hbCIsIE5VTEx9Owogc3RhdGljIGNoYXIgKnN0cmVhbWt3YXJnbGlzdFtdID0geyJzdHJlYW0iLCAiZXJyb3JzIiwgTlVMTH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbXVsdGlieXRlY29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjICosCiAJCU11bHRpYnl0ZUNvZGVjX1N0YXRlICosIGNvbnN0IFB5X1VOSUNPREUgKiosIFB5X3NzaXplX3QsCiAJCVB5T2JqZWN0ICosIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKm1ic3RyZWFtcmVhZGVyX2NyZWF0ZShNdWx0aWJ5dGVDb2RlYyAqLAotCQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIFB5T2JqZWN0ICptYnN0cmVhbXdyaXRlcl9jcmVhdGUoTXVsdGlieXRlQ29kZWMgKiwKLQkJUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIAogI2RlZmluZSBNQkVOQ19SRVNFVAlNQkVOQ19NQVg8PDEgLyogcmVzZXQgYWZ0ZXIgYW4gZW5jb2Rpbmcgc2Vzc2lvbiAqLwogCkBAIC04Myw3ICs3Niw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1nZXRfZXJyb3JjYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCitpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICplcnJvcnMpCiB7CiAJaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQogCQlyZXR1cm4gRVJST1JfU1RSSUNUOwpAQCAtOTEsMTcgKzg0LDg4IEBACiAJCXJldHVybiBFUlJPUl9JR05PUkU7CiAJZWxzZSBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKQogCQlyZXR1cm4gRVJST1JfUkVQTEFDRTsKLQllbHNlIHsKLQkJcmV0dXJuIFB5Q29kZWNfTG9va3VwRXJyb3IoZXJyb3JzKTsKLQl9CisJZWxzZQorCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorY2FsbF9lcnJvcl9jYWxsYmFjayhQeU9iamVjdCAqZXJyb3JzLCBQeU9iamVjdCAqZXhjKQoreworCVB5T2JqZWN0ICphcmdzLCAqY2IsICpyOworCisJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGVycm9ycykpOworCWNiID0gUHlDb2RlY19Mb29rdXBFcnJvcihQeVN0cmluZ19BU19TVFJJTkcoZXJyb3JzKSk7CisJaWYgKGNiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJYXJncyA9IFB5VHVwbGVfTmV3KDEpOworCWlmIChhcmdzID09IE5VTEwpIHsKKwkJUHlfREVDUkVGKGNiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBleGMpOworCVB5X0lOQ1JFRihleGMpOworCisJciA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2IsIGFyZ3MpOworCVB5X0RFQ1JFRihhcmdzKTsKKwlQeV9ERUNSRUYoY2IpOworCXJldHVybiByOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorY29kZWNjdHhfZXJyb3JzX2dldChNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dCAqc2VsZikKK3sKKwljb25zdCBjaGFyICplcnJvcnM7CisKKwlpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1NUUklDVCkKKwkJZXJyb3JzID0gInN0cmljdCI7CisJZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX0lHTk9SRSkKKwkJZXJyb3JzID0gImlnbm9yZSI7CisJZWxzZSBpZiAoc2VsZi0+ZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpCisJCWVycm9ycyA9ICJyZXBsYWNlIjsKKwllbHNlIHsKKwkJUHlfSU5DUkVGKHNlbGYtPmVycm9ycyk7CisJCXJldHVybiBzZWxmLT5lcnJvcnM7CisJfQorCisJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKK30KKworc3RhdGljIGludAorY29kZWNjdHhfZXJyb3JzX3NldChNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAorCQkgICAgdm9pZCAqY2xvc3VyZSkKK3sKKwlQeU9iamVjdCAqY2I7CisKKwlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXJyb3JzIG11c3QgYmUgYSBzdHJpbmciKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSk7CisJaWYgKGNiID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworCXNlbGYtPmVycm9ycyA9IGNiOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGdldHNldCBoYW5kbGVycyBsaXN0IGlzIHVzZWQgYnkgYWxsIHRoZSBzdGF0ZWZ1bCBjb2RlYyBvYmplY3RzICovCitzdGF0aWMgUHlHZXRTZXREZWYgY29kZWNjdHhfZ2V0c2V0c1tdID0geworCXsiZXJyb3JzIiwJKGdldHRlciljb2RlY2N0eF9lcnJvcnNfZ2V0LAorCQkJKHNldHRlciljb2RlY2N0eF9lcnJvcnNfc2V0LAorCQkJUHlEb2NfU1RSKCJob3cgdG8gdHJlYXQgZXJyb3JzIil9LAorCXtOVUxMLH0KK307CisKIHN0YXRpYyBpbnQKIGV4cGFuZF9lbmNvZGVidWZmZXIoTXVsdGlieXRlRW5jb2RlQnVmZmVyICpidWYsIFB5X3NzaXplX3QgZXNpemUpCiB7CiAJUHlfc3NpemVfdCBvcmdwb3MsIG9yZ3NpemU7CiAKLQlvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIqKWJ1Zi0+b3V0YnVmIC0KKwlvcmdwb3MgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYtPm91dGJ1ZiAtCiAJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi0+b3V0b2JqKSk7CiAJb3Jnc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKIAlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLT5vdXRvYmosIG9yZ3NpemUgKyAoCkBAIC0xMjUsOCArMTg5LDcgQEAKIHsKIAlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1ZiAtCi0JCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopKTsKKwlvcmdwb3MgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikpOwogCW9yZ3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArICgKIAkgICAgZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKSkgPT0gLTEpCkBAIC0xNDQsMTYgKzIwNywyMSBAQAogCQkJZ290byBlcnJvcmV4aXQ7CQkJCQlcCiB9CiAKKworLyoqCisgKiBNdWx0aWJ5dGVDb2RlYyBvYmplY3QKKyAqLworCiBzdGF0aWMgaW50CiBtdWx0aWJ5dGVjb2RlY19lbmNlcnJvcihNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCiAJCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCiAJCQlNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwKIAkJCVB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICphcmdzb2JqLCAqdG9iajsKKwlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICp0b2JqOwogCVB5X3NzaXplX3QgcmV0c3Ryc2l6ZSwgbmV3cG9zOwotCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAlQeV9zc2l6ZV90IGVzaXplLCBzdGFydCwgZW5kOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAogCWlmIChlID4gMCkgewogCQlyZWFzb24gPSAiaWxsZWdhbCBtdWx0aWJ5dGUgc2VxdWVuY2UiOwpAQCAtMTY2LDcgKzIzNCw3IEBACiAJCQlyZXR1cm4gMDsgLyogcmV0cnkgaXQgKi8KIAkJY2FzZSBNQkVSUl9UT09GRVc6CiAJCQlyZWFzb24gPSAiaW5jb21wbGV0ZSBtdWx0aWJ5dGUgc2VxdWVuY2UiOwotCQkJZXNpemUgPSAoc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworCQkJZXNpemUgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKIAkJCWJyZWFrOwogCQljYXNlIE1CRVJSX0lOVEVSTkFMOgogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTIzMCwyMSArMjk4LDE1IEBACiAJCWdvdG8gZXJyb3JleGl0OwogCX0KIAotCWFyZ3NvYmogPSBQeVR1cGxlX05ldygxKTsKLQlpZiAoYXJnc29iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCVB5VHVwbGVfU0VUX0lURU0oYXJnc29iaiwgMCwgYnVmLT5leGNvYmopOwotCVB5X0lOQ1JFRihidWYtPmV4Y29iaik7Ci0JcmV0b2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdChlcnJvcnMsIGFyZ3NvYmopOwotCVB5X0RFQ1JFRihhcmdzb2JqKTsKKwlyZXRvYmogPSBjYWxsX2Vycm9yX2NhbGxiYWNrKGVycm9ycywgYnVmLT5leGNvYmopOwogCWlmIChyZXRvYmogPT0gTlVMTCkKIAkJZ290byBlcnJvcmV4aXQ7CiAKIAlpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAogCSAgICAhUHlVbmljb2RlX0NoZWNrKCh0b2JqID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIVB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorCSAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKIAkJCQkiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKIAkJZ290byBlcnJvcmV4aXQ7CkBAIC0yNjcsMTIgKzMyOSwxMyBAQAogCWJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CiAKIAluZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKLQlpZiAobmV3cG9zIDwgMCkKKwlpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKIAkJbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKIAlpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7CisJCVB5RXJyX0NsZWFyKCk7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAicG9zaXRpb24gJWQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAotCQkJICAgICAoaW50KW5ld3Bvcyk7CisJCQkgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorCQkJICAgICBuZXdwb3MpOwogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAJYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwpAQCAtMjkzLDcgKzM1Niw3IEBACiAJCQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwKIAkJCVB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqYXJnc29iaiwgKnJldG9iaiA9IE5VTEwsICpyZXR1bmkgPSBOVUxMOworCVB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0dW5pID0gTlVMTDsKIAlQeV9zc2l6ZV90IHJldHVuaXNpemUsIG5ld3BvczsKIAljb25zdCBjaGFyICpyZWFzb247CiAJUHlfc3NpemVfdCBlc2l6ZSwgc3RhcnQsIGVuZDsKQEAgLTMwOSw3ICszNzIsNyBAQAogCQkJcmV0dXJuIDA7IC8qIHJldHJ5IGl0ICovCiAJCWNhc2UgTUJFUlJfVE9PRkVXOgogCQkJcmVhc29uID0gImluY29tcGxldGUgbXVsdGlieXRlIHNlcXVlbmNlIjsKLQkJCWVzaXplID0gKHNpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKwkJCWVzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CiAJCQlicmVhazsKIAkJY2FzZSBNQkVSUl9JTlRFUk5BTDoKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC0zNTQsMjEgKzQxNywxNSBAQAogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAKLQlhcmdzb2JqID0gUHlUdXBsZV9OZXcoMSk7Ci0JaWYgKGFyZ3NvYmogPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0KLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3NvYmosIDAsIGJ1Zi0+ZXhjb2JqKTsKLQlQeV9JTkNSRUYoYnVmLT5leGNvYmopOwotCXJldG9iaiA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZXJyb3JzLCBhcmdzb2JqKTsKLQlQeV9ERUNSRUYoYXJnc29iaik7CisJcmV0b2JqID0gY2FsbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMsIGJ1Zi0+ZXhjb2JqKTsKIAlpZiAocmV0b2JqID09IE5VTEwpCiAJCWdvdG8gZXJyb3JleGl0OwogCiAJaWYgKCFQeVR1cGxlX0NoZWNrKHJldG9iaikgfHwgUHlUdXBsZV9HRVRfU0laRShyZXRvYmopICE9IDIgfHwKIAkgICAgIVB5VW5pY29kZV9DaGVjaygocmV0dW5pID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKLQkgICAgIVB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorCSAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKIAkJCQkiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKIAkJZ290byBlcnJvcmV4aXQ7CkBAIC0zODMsMTIgKzQ0MCwxMyBAQAogCX0KIAogCW5ld3BvcyA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOwotCWlmIChuZXdwb3MgPCAwKQorCWlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQogCQluZXdwb3MgKz0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApOwogCWlmIChuZXdwb3MgPCAwIHx8IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zID4gYnVmLT5pbmJ1Zl9lbmQpIHsKKwkJUHlFcnJfQ2xlYXIoKTsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInBvc2l0aW9uICVkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKLQkJCQkoaW50KW5ld3Bvcyk7CisJCQkgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAorCQkJICAgICBuZXdwb3MpOwogCQlnb3RvIGVycm9yZXhpdDsKIAl9CiAJYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOwpAQCAtNDUzLDcgKzUxMSw3IEBACiAJCQkJZ290byBlcnJvcmV4aXQ7CiAJCX0KIAotCWZpbmFsc2l6ZSA9IChQeV9zc2l6ZV90KSgoY2hhciopYnVmLm91dGJ1ZiAtCisJZmluYWxzaXplID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLm91dGJ1ZiAtCiAJCQkJIFB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKSk7CiAKIAlpZiAoZmluYWxzaXplICE9IFB5U3RyaW5nX0dFVF9TSVpFKGJ1Zi5vdXRvYmopKQpAQCAtNTAwLDcgKzU1OCw3IEBACiAJZGF0YSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7CiAJZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShhcmcpOwogCi0JZXJyb3JjYiA9IGdldF9lcnJvcmNhbGxiYWNrKGVycm9ycyk7CisJZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CiAJaWYgKGVycm9yY2IgPT0gTlVMTCkgewogCQlQeV9YREVDUkVGKHVjdnQpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTUxNSwxNiArNTczLDEyIEBACiAJaWYgKHIgPT0gTlVMTCkKIAkJZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZXJyb3JjYiA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JfQorCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKIAlQeV9YREVDUkVGKHVjdnQpOwogCXJldHVybiBtYWtlX3R1cGxlKHIsIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JaWYgKGVycm9yY2IgPiBFUlJPUl9NQVgpIHsKLQkJUHlfREVDUkVGKGVycm9yY2IpOwotCX0KKwlFUlJPUl9ERUNSRUYoZXJyb3JjYik7CiAJUHlfWERFQ1JFRih1Y3Z0KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTU0MywxOCArNTk3LDE2IEBACiAJCQkJY29kZWNrd2FyZ2xpc3QsICZkYXRhLCAmZGF0YWxlbiwgJmVycm9ycykpCiAJCXJldHVybiBOVUxMOwogCi0JZXJyb3JjYiA9IGdldF9lcnJvcmNhbGxiYWNrKGVycm9ycyk7CisJZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CiAJaWYgKGVycm9yY2IgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoZGF0YWxlbiA9PSAwKSB7Ci0JCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JCX0KKwkJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCQlyZXR1cm4gbWFrZV90dXBsZShQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCksIDApOwogCX0KIAotCWJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKwlidWYuZXhjb2JqID0gTlVMTDsKIAlidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwogCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKIAlidWYub3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGRhdGFsZW4pOwpAQCAtNTkwLDQ5ICs2NDIsMTcgQEAKIAkJCWdvdG8gZXJyb3JleGl0OwogCiAJUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlpZiAoZXJyb3JjYiA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoZXJyb3JjYik7Ci0JfQorCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKIAlyZXR1cm4gbWFrZV90dXBsZShidWYub3V0b2JqLCBkYXRhbGVuKTsKIAogZXJyb3JleGl0OgotCWlmIChlcnJvcmNiID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihlcnJvcmNiKTsKLQl9CisJRVJST1JfREVDUkVGKGVycm9yY2IpOwogCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CiAJUHlfWERFQ1JFRihidWYub3V0b2JqKTsKIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotTXVsdGlieXRlQ29kZWNfU3RyZWFtUmVhZGVyKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkJICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQotewotCVB5T2JqZWN0ICpzdHJlYW07Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98czpTdHJlYW1SZWFkZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2NyZWF0ZShzZWxmLT5jb2RlYywgc3RyZWFtLCBlcnJvcnMpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotTXVsdGlieXRlQ29kZWNfU3RyZWFtV3JpdGVyKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmLAotCQkJICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQotewotCVB5T2JqZWN0ICpzdHJlYW07Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98czpTdHJlYW1Xcml0ZXIiLAotCQkJCXN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG1ic3RyZWFtd3JpdGVyX2NyZWF0ZShzZWxmLT5jb2RlYywgc3RyZWFtLCBlcnJvcnMpOwotfQotCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG11bHRpYnl0ZWNvZGVjX21ldGhvZHNbXSA9IHsKIAl7ImVuY29kZSIsCShQeUNGdW5jdGlvbilNdWx0aWJ5dGVDb2RlY19FbmNvZGUsCiAJCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLApAQCAtNjQwLDEyICs2NjAsNiBAQAogCXsiZGVjb2RlIiwJKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX0RlY29kZSwKIAkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAJCQlNdWx0aWJ5dGVDb2RlY19EZWNvZGVfX2RvY19ffSwKLQl7IlN0cmVhbVJlYWRlciIsKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX1N0cmVhbVJlYWRlciwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19TdHJlYW1SZWFkZXJfX2RvY19ffSwKLQl7IlN0cmVhbVdyaXRlciIsKFB5Q0Z1bmN0aW9uKU11bHRpYnl0ZUNvZGVjX1N0cmVhbVdyaXRlciwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQlNdWx0aWJ5dGVDb2RlY19TdHJlYW1Xcml0ZXJfX2RvY19ffSwKIAl7TlVMTCwJCU5VTEx9LAogfTsKIApAQCAtNjU1LDggKzY2OSw2IEBACiAJUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCi0KLQogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVDb2RlY19UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogCTAsCQkJCS8qIG9iX3NpemUgKi8KQEAgLTY5MCwxMyArNzAyLDQ5OCBAQAogCW11bHRpYnl0ZWNvZGVjX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCiB9OwogCisKKy8qKgorICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHN0YXRlZnVsIGNvZGVjIG1lY2hhbmlzbQorICovCisKKyNkZWZpbmUgU1RBVEVGVUxfRENUWChvKQkoKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKikobykpCisjZGVmaW5lIFNUQVRFRlVMX0VDVFgobykJKChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICopKG8pKQorCitzdGF0aWMgUHlPYmplY3QgKgorZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dCAqY3R4LAorCQkJUHlPYmplY3QgKnVuaXN0ciwgaW50IGZpbmFsKQoreworCVB5T2JqZWN0ICp1Y3Z0LCAqciA9IE5VTEw7CisJUHlfVU5JQ09ERSAqaW5idWYsICppbmJ1Zl9lbmQsICppbmJ1Zl90bXAgPSBOVUxMOworCVB5X3NzaXplX3QgZGF0YWxlbiwgb3JpZ3BlbmRpbmc7CisKKwlpZiAoUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpCisJCXVjdnQgPSBOVUxMOworCWVsc2UgeworCQl1bmlzdHIgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZSh1bmlzdHIpOworCQlpZiAodW5pc3RyID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmlzdHIpKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKKwkJCVB5X0RFQ1JFRih1Y3Z0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOworCW9yaWdwZW5kaW5nID0gY3R4LT5wZW5kaW5nc2l6ZTsKKworCWlmIChvcmlncGVuZGluZyA+IDApIHsKKwkJaW5idWZfdG1wID0gUHlNZW1fTmV3KFB5X1VOSUNPREUsIGRhdGFsZW4gKyBjdHgtPnBlbmRpbmdzaXplKTsKKwkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQorCQkJZ290byBlcnJvcmV4aXQ7CisJCW1lbWNweShpbmJ1Zl90bXAsIGN0eC0+cGVuZGluZywKKwkJCVB5X1VOSUNPREVfU0laRSAqIGN0eC0+cGVuZGluZ3NpemUpOworCQltZW1jcHkoaW5idWZfdG1wICsgY3R4LT5wZW5kaW5nc2l6ZSwKKwkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCisJCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKKwkJZGF0YWxlbiArPSBjdHgtPnBlbmRpbmdzaXplOworCQljdHgtPnBlbmRpbmdzaXplID0gMDsKKwkJaW5idWYgPSBpbmJ1Zl90bXA7CisJfQorCWVsc2UKKwkJaW5idWYgPSAoUHlfVU5JQ09ERSAqKVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0cik7CisKKwlpbmJ1Zl9lbmQgPSBpbmJ1ZiArIGRhdGFsZW47CisKKwlyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorCQkJKGNvbnN0IFB5X1VOSUNPREUgKiopJmluYnVmLAorCQkJZGF0YWxlbiwgY3R4LT5lcnJvcnMsIGZpbmFsID8gTUJFTkNfRkxVU0ggOiAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisJCWlmIChvcmlncGVuZGluZyA+IDApCisJCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1Zl90bXAsCisJCQkJUHlfVU5JQ09ERV9TSVpFICogb3JpZ3BlbmRpbmcpOworCQljdHgtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCWlmIChpbmJ1ZiA8IGluYnVmX2VuZCkgeworCQljdHgtPnBlbmRpbmdzaXplID0gKFB5X3NzaXplX3QpKGluYnVmX2VuZCAtIGluYnVmKTsKKwkJaWYgKGN0eC0+cGVuZGluZ3NpemUgPiBNQVhFTkNQRU5ESU5HKSB7CisJCQkvKiBub3JtYWwgY29kZWNzIGNhbid0IHJlYWNoIGhlcmUgKi8KKwkJCWN0eC0+cGVuZGluZ3NpemUgPSAwOworCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwKKwkJCQkJInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7CisJCQlnb3RvIGVycm9yZXhpdDsKKwkJfQorCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1ZiwKKwkJCWN0eC0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOworCX0KKworCWlmIChpbmJ1Zl90bXAgIT0gTlVMTCkKKwkJUHlNZW1fRGVsKGluYnVmX3RtcCk7CisJUHlfWERFQ1JFRih1Y3Z0KTsKKwlyZXR1cm4gcjsKKworZXJyb3JleGl0OgorCWlmIChpbmJ1Zl90bXAgIT0gTlVMTCkKKwkJUHlNZW1fRGVsKGluYnVmX3RtcCk7CisJUHlfWERFQ1JFRihyKTsKKwlQeV9YREVDUkVGKHVjdnQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKKwkJICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQoreworCVB5X3NzaXplX3QgbnBlbmRpbmdzOworCisJbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisJaWYgKG5wZW5kaW5ncyArIGN0eC0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsICJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweShjdHgtPnBlbmRpbmcgKyBjdHgtPnBlbmRpbmdzaXplLCBidWYtPmluYnVmLCBucGVuZGluZ3MpOworCWN0eC0+cGVuZGluZ3NpemUgKz0gbnBlbmRpbmdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmLCBjb25zdCBjaGFyICpkYXRhLAorCQkgICAgICAgUHlfc3NpemVfdCBzaXplKQoreworCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopZGF0YTsKKwlidWYtPmluYnVmX2VuZCA9IGJ1Zi0+aW5idWZfdG9wICsgc2l6ZTsKKwlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkgeyAvKiBvbmx5IGlmIG91dG9iaiBpcyBub3QgYWxsb2NhdGVkIHlldCAqLworCQlidWYtPm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKKwkJaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopOworCQlidWYtPm91dGJ1Zl9lbmQgPSBidWYtPm91dGJ1ZiArCisJCQkJICBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZWNvZGVyX2ZlZWRfYnVmZmVyKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKmN0eCwKKwkJICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQoreworCXdoaWxlIChidWYtPmluYnVmIDwgYnVmLT5pbmJ1Zl9lbmQpIHsKKwkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQ7CisJCWludCByOworCisJCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKKworCQlyID0gY3R4LT5jb2RlYy0+ZGVjb2RlKCZjdHgtPnN0YXRlLCBjdHgtPmNvZGVjLT5jb25maWcsCisJCQkmYnVmLT5pbmJ1ZiwgaW5sZWZ0LCAmYnVmLT5vdXRidWYsIG91dGxlZnQpOworCQlpZiAociA9PSAwIHx8IHIgPT0gTUJFUlJfVE9PRkVXKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKGN0eC0+Y29kZWMsICZjdHgtPnN0YXRlLAorCQkJCQkJIGJ1ZiwgY3R4LT5lcnJvcnMsIHIpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciBvYmplY3QKKyAqLworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9lbmNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAorCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworCVB5T2JqZWN0ICpkYXRhOworCWludCBmaW5hbCA9IDA7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfGk6ZW5jb2RlIiwKKwkJCWluY3JlbWVudGFsa3dhcmdsaXN0LCAmZGF0YSwgJmZpbmFsKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgZGF0YSwgZmluYWwpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9yZXNldChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCit7CisJaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCisJICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCXJldHVybiBOVUxMOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKworCVB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1iaWVuY29kZXJfbWV0aG9kc1tdID0geworCXsiZW5jb2RlIiwJKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfZW5jb2RlLAorCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgTlVMTH0sCisJeyJyZXNldCIsCShQeUNGdW5jdGlvbiltYmllbmNvZGVyX3Jlc2V0LAorCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAorCXtOVUxMLAkJTlVMTH0sCit9OworCitzdGF0aWMgUHlPYmplY3QgKgorbWJpZW5jb2Rlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8czpJbmNyZW1lbnRhbEVuY29kZXIiLAorCQkJCQkgaW5jbmV3a3dhcmdsaXN0LCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21iaWVuY29kZXJfdHJhdmVyc2UoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmLAorCQkgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisJaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisJCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittYmllbmNvZGVyX2RlYWxsb2MoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0ICpzZWxmKQoreworCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisJRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisJc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfVHlwZSA9IHsKKwlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKwkwLAkJCQkvKiBvYl9zaXplICovCisJIk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciIsCS8qIHRwX25hbWUgKi8KKwlzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisJMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KKwkvKiAgbWV0aG9kcyAgKi8KKwkoZGVzdHJ1Y3RvciltYmllbmNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKwkwLAkJCQkvKiB0cF9wcmludCAqLworCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRyICovCisJMCwJCQkJLyogdHBfY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3JlcHIgKi8KKwkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KKwkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCQkvKiB0cF9oYXNoICovCisJMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCisJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KKwkwLAkJCQkvKiB0cF9kb2MgKi8KKwkodHJhdmVyc2Vwcm9jKW1iaWVuY29kZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJMCwJCQkJLyogdHBfY2xlYXIgKi8KKwkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaXRlciAqLworCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KKwltYmllbmNvZGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisJMCwJCQkJLyogdHBfbWVtYmVycyAqLworCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KKwkwLAkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJLyogdHBfZGljdCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLworCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KKwkwLAkJCQkvKiB0cF9pbml0ICovCisJMCwJCQkJLyogdHBfYWxsb2MgKi8KKwltYmllbmNvZGVyX25ldywJCQkvKiB0cF9uZXcgKi8KK307CisKKworLyoqCisgKiBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIgb2JqZWN0CisgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfZGVjb2RlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKKwkJICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKwlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOworCWNoYXIgKmRhdGEsICp3ZGF0YTsKKwlQeV9zc2l6ZV90IHdzaXplLCBmaW5hbHNpemUgPSAwLCBzaXplLCBvcmlncGVuZGluZzsKKwlpbnQgZmluYWwgPSAwOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAidCN8aTpkZWNvZGUiLAorCQkJaW5jcmVtZW50YWxrd2FyZ2xpc3QsICZkYXRhLCAmc2l6ZSwgJmZpbmFsKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7CisJb3JpZ3BlbmRpbmcgPSBzZWxmLT5wZW5kaW5nc2l6ZTsKKworCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA9PSAwKSB7CisJCXdzaXplID0gc2l6ZTsKKwkJd2RhdGEgPSBkYXRhOworCX0KKwllbHNlIHsKKwkJd3NpemUgPSBzaXplICsgc2VsZi0+cGVuZGluZ3NpemU7CisJCXdkYXRhID0gUHlNZW1fTWFsbG9jKHdzaXplKTsKKwkJaWYgKHdkYXRhID09IE5VTEwpCisJCQlnb3RvIGVycm9yZXhpdDsKKwkJbWVtY3B5KHdkYXRhLCBzZWxmLT5wZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSk7CisJCW1lbWNweSh3ZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLCBkYXRhLCBzaXplKTsKKwkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCX0KKworCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIHdkYXRhLCB3c2l6ZSkgIT0gMCkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlpZiAoZGVjb2Rlcl9mZWVkX2J1ZmZlcihTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSkKKwkJZ290byBlcnJvcmV4aXQ7CisKKwlpZiAoZmluYWwgJiYgYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworCQlpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKwkJCQkmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpIHsKKwkJCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisJCQltZW1jcHkoc2VsZi0+cGVuZGluZywgd2RhdGEsIG9yaWdwZW5kaW5nKTsKKwkJCXNlbGYtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisJCQlnb3RvIGVycm9yZXhpdDsKKwkJfQorCX0KKworCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7IC8qIHBlbmRpbmcgc2VxdWVuY2Ugc3RpbGwgZXhpc3RzICovCisJCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpICE9IDApCisJCQlnb3RvIGVycm9yZXhpdDsKKwl9CisKKwlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtIFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopKTsKKwlpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKKwkJaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCisJCQlnb3RvIGVycm9yZXhpdDsKKworCWlmICh3ZGF0YSAhPSBkYXRhKQorCQlQeU1lbV9EZWwod2RhdGEpOworCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisJcmV0dXJuIGJ1Zi5vdXRvYmo7CisKK2Vycm9yZXhpdDoKKwlpZiAod2RhdGEgIT0gTlVMTCAmJiB3ZGF0YSAhPSBkYXRhKQorCQlQeU1lbV9EZWwod2RhdGEpOworCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisJUHlfWERFQ1JFRihidWYub3V0b2JqKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfcmVzZXQoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmKQoreworCWlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKwlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisKKwlQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYmlkZWNvZGVyX21ldGhvZHNbXSA9IHsKKwl7ImRlY29kZSIsCShQeUNGdW5jdGlvbiltYmlkZWNvZGVyX2RlY29kZSwKKwkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIE5VTEx9LAorCXsicmVzZXQiLAkoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9yZXNldCwKKwkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKKwl7TlVMTCwJCU5VTEx9LAorfTsKKworc3RhdGljIFB5T2JqZWN0ICoKK21iaWRlY29kZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCU11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZjsKKwlQeU9iamVjdCAqY29kZWMgPSBOVUxMOworCWNoYXIgKmVycm9ycyA9IE5VTEw7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxEZWNvZGVyIiwKKwkJCQkJIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCisJCXJldHVybiBOVUxMOworCisJc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOworCQlnb3RvIGVycm9yZXhpdDsKKwl9CisKKwlzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKwlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKKwkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlnb3RvIGVycm9yZXhpdDsKKworCVB5X0RFQ1JFRihjb2RlYyk7CisJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKK2Vycm9yZXhpdDoKKwlQeV9YREVDUkVGKHNlbGYpOworCVB5X1hERUNSRUYoY29kZWMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CittYmlkZWNvZGVyX3RyYXZlcnNlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKKwkJICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbWJpZGVjb2Rlcl9kZWFsbG9jKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZikKK3sKKwlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoc2VsZik7Cit9CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUgPSB7CisJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisJMCwJCQkJLyogb2Jfc2l6ZSAqLworCSJNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIiLAkvKiB0cF9uYW1lICovCisJc2l6ZW9mKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCisJLyogIG1ldGhvZHMgICovCisJKGRlc3RydWN0b3IpbWJpZGVjb2Rlcl9kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCisJMCwJCQkJLyogdHBfcHJpbnQgKi8KKwkwLAkJCQkvKiB0cF9nZXRhdHRyICovCisJMCwJCQkJLyogdHBfc2V0YXR0ciAqLworCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KKwkwLAkJCQkvKiB0cF9yZXByICovCisJMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCisJMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KKwkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCisJMCwJCQkJLyogdHBfaGFzaCAqLworCTAsCQkJCS8qIHRwX2NhbGwgKi8KKwkwLAkJCQkvKiB0cF9zdHIgKi8KKwlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KKwkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLworCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQworCQl8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCisJMCwJCQkJLyogdHBfZG9jICovCisJKHRyYXZlcnNlcHJvYyltYmlkZWNvZGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLworCTAsCQkJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkvKiB0cF9pdGVyZXh0ICovCisJbWJpZGVjb2Rlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KKwljb2RlY2N0eF9nZXRzZXRzLAkJLyogdHBfZ2V0c2V0ICovCisJMCwJCQkJLyogdHBfYmFzZSAqLworCTAsCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KKwkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJLyogdHBfaW5pdCAqLworCTAsCQkJCS8qIHRwX2FsbG9jICovCisJbWJpZGVjb2Rlcl9uZXcsCQkJLyogdHBfbmV3ICovCit9OworCisKKy8qKgorICogTXVsdGlieXRlU3RyZWFtUmVhZGVyIG9iamVjdAorICovCisKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9pcmVhZChNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYsCiAJCSAgICAgY29uc3QgY2hhciAqbWV0aG9kLCBQeV9zc2l6ZV90IHNpemVoaW50KQogewogCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CiAJUHlPYmplY3QgKmNyZXM7Ci0JUHlfc3NpemVfdCByc2l6ZSwgciwgZmluYWxzaXplID0gMDsKKwlQeV9zc2l6ZV90IHJzaXplLCBmaW5hbHNpemUgPSAwOwogCiAJaWYgKHNpemVoaW50ID09IDApCiAJCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7CkBAIC03NDAsMzkgKzEyMzcsMTMgQEAKIAkJfQogCiAJCXJzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY3Jlcyk7Ci0JCWJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPQotCQkJKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoY3Jlcyk7Ci0JCWJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgcnNpemU7Ci0JCWlmIChidWYub3V0b2JqID09IE5VTEwpIHsKLQkJCWJ1Zi5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcnNpemUpOwotCQkJaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJCWJ1Zi5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKTsKLQkJCWJ1Zi5vdXRidWZfZW5kID0gYnVmLm91dGJ1ZiArCi0JCQkJCVB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKTsKLQkJfQorCQlpZiAoZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcigmYnVmLCBQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCisJCQkJCSAgIHJzaXplKSAhPSAwKQorCQkJZ290byBlcnJvcmV4aXQ7CiAKLQkJciA9IDA7Ci0JCWlmIChyc2l6ZSA+IDApCi0JCQl3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQkJCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwotCi0JCQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLQotCQkJCQkJICAgICAgYnVmLmluYnVmKTsKLQkJCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0KLQkJCQkJCSAgICAgICBidWYub3V0YnVmKTsKLQotCQkJCXIgPSBzZWxmLT5jb2RlYy0+ZGVjb2RlKCZzZWxmLT5zdGF0ZSwKLQkJCQkJCQlzZWxmLT5jb2RlYy0+Y29uZmlnLAotCQkJCQkJCSZidWYuaW5idWYsIGlubGVmdCwKLQkJCQkJCQkmYnVmLm91dGJ1Ziwgb3V0bGVmdCk7Ci0JCQkJaWYgKHIgPT0gMCB8fCByID09IE1CRVJSX1RPT0ZFVykKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsCi0JCQkJCQkmc2VsZi0+c3RhdGUsICZidWYsCi0JCQkJCQlzZWxmLT5lcnJvcnMsIHIpKQotCQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJCX0KKwkJaWYgKHJzaXplID4gMCAmJiBkZWNvZGVyX2ZlZWRfYnVmZmVyKAorCQkJCShNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopc2VsZiwgJmJ1ZikpCisJCQlnb3RvIGVycm9yZXhpdDsKIAogCQlpZiAocnNpemUgPT0gMCB8fCBzaXplaGludCA8IDApIHsgLyogZW5kIG9mIGZpbGUgKi8KIAkJCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kICYmCkBAIC03ODIsMjAgKzEyNTMsOSBAQAogCQl9CiAKIAkJaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBleGlzdHMgKi8KLQkJCVB5X3NzaXplX3QgbnBlbmRpbmdzOwotCi0JCQkvKiB3ZSBjYW4ndCBhc3N1bWUgdGhhdCBwZW5kaW5nc2l6ZSBpcyBzdGlsbCAwIGhlcmUuCi0JCQkgKiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWN1cnNpdmVseQotCQkJICogZnJvbSBlcnJvciBjYWxsYmFjayAqLwotCQkJbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOwotCQkJaWYgKG5wZW5kaW5ncyArIHNlbGYtPnBlbmRpbmdzaXplID4gTUFYREVDUEVORElORykgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCQkicGVuZGluZyBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJCWlmIChkZWNvZGVyX2FwcGVuZF9wZW5kaW5nKFNUQVRFRlVMX0RDVFgoc2VsZiksCisJCQkJCQkgICAmYnVmKSAhPSAwKQogCQkJCWdvdG8gZXJyb3JleGl0OwotCQkJfQotCQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcgKyBzZWxmLT5wZW5kaW5nc2l6ZSwgYnVmLmluYnVmLAotCQkJCW5wZW5kaW5ncyk7Ci0JCQlzZWxmLT5wZW5kaW5nc2l6ZSArPSBucGVuZGluZ3M7CiAJCX0KIAogCQlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtCkBAIC05MDEsOCArMTM2MSw3IEBACiAJCXJldHVybiBOVUxMOwogCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKwlQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXJlYWRlcl9tZXRob2RzW10gPSB7CkBAIC05MTcsMTggKzEzNzYsNzUgQEAKIAl7TlVMTCwJCU5VTEx9LAogfTsKIAorc3RhdGljIFB5TWVtYmVyRGVmIG1ic3RyZWFtcmVhZGVyX21lbWJlcnNbXSA9IHsKKwl7InN0cmVhbSIsCVRfT0JKRUNULAorCQkJb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LCBzdHJlYW0pLAorCQkJUkVBRE9OTFksIE5VTEx9LAorCXtOVUxMLH0KK307CisKK3N0YXRpYyBQeU9iamVjdCAqCittYnN0cmVhbXJlYWRlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmOworCVB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7CisJY2hhciAqZXJyb3JzID0gTlVMTDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtUmVhZGVyIiwKKwkJCQlzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGYgPSAoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwljb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisJaWYgKGNvZGVjID09IE5VTEwpCisJCWdvdG8gZXJyb3JleGl0OworCWlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKwkJZ290byBlcnJvcmV4aXQ7CisJfQorCisJc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKwlzZWxmLT5zdHJlYW0gPSBzdHJlYW07CisJUHlfSU5DUkVGKHN0cmVhbSk7CisJc2VsZi0+cGVuZGluZ3NpemUgPSAwOworCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisJaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisJCWdvdG8gZXJyb3JleGl0OworCisJUHlfREVDUkVGKGNvZGVjKTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKworZXJyb3JleGl0OgorCVB5X1hERUNSRUYoc2VsZik7CisJUHlfWERFQ1JFRihjb2RlYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK21ic3RyZWFtcmVhZGVyX3RyYXZlcnNlKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKKwkJCXZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQorCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOworCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkCiBtYnN0cmVhbXJlYWRlcl9kZWFsbG9jKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+ZXJyb3JzID4gRVJST1JfTUFYKSB7Ci0JCVB5X0RFQ1JFRihzZWxmLT5lcnJvcnMpOwotCX0KKwlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworCUVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOwogCVB5X0RFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKwlzZWxmLT5vYl90eXBlLT50cF9mcmVlKHNlbGYpOwogfQogCi0KLQogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKIAkwLAkJCQkvKiBvYl9zaXplICovCkBAIC05NTEsOTcgKzE0NjcsNTAgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KIAkwLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLworCSh0cmF2ZXJzZXByb2MpbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCiAJMCwJCQkJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAJMCwJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KIAltYnN0cmVhbXJlYWRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCW1ic3RyZWFtcmVhZGVyX21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCisJY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkvKiB0cF9hbGxvYyAqLworCW1ic3RyZWFtcmVhZGVyX25ldywJCS8qIHRwX25ldyAqLwogfTsKIAorCisvKioKKyAqIE11bHRpYnl0ZVN0cmVhbVdyaXRlciBvYmplY3QKKyAqLworCiBzdGF0aWMgaW50CiBtYnN0cmVhbXdyaXRlcl9pd3JpdGUoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLAogCQkgICAgICBQeU9iamVjdCAqdW5pc3RyKQogewotCVB5T2JqZWN0ICp3ciwgKnVjdnQsICpyID0gTlVMTDsKLQlQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBkYXRhbGVuOworCVB5T2JqZWN0ICpzdHIsICp3cjsKIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkKLQkJdWN2dCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXVuaXN0ciA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKHVuaXN0cik7Ci0JCWlmICh1bmlzdHIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmlzdHIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKLQkJCVB5X0RFQ1JFRih1Y3Z0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKwlzdHIgPSBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChTVEFURUZVTF9FQ1RYKHNlbGYpLCB1bmlzdHIsIDApOworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOwogCi0JZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOwotCWlmIChkYXRhbGVuID09IDApIHsKLQkJUHlfWERFQ1JFRih1Y3Z0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHNlbGYtPnBlbmRpbmdzaXplID4gMCkgewotCQlpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJaWYgKGluYnVmX3RtcCA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCW1lbWNweShpbmJ1Zl90bXAsIHNlbGYtPnBlbmRpbmcsCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBzZWxmLT5wZW5kaW5nc2l6ZSk7Ci0JCW1lbWNweShpbmJ1Zl90bXAgKyBzZWxmLT5wZW5kaW5nc2l6ZSwKLQkJCVB5VW5pY29kZV9BU19VTklDT0RFKHVuaXN0ciksCi0JCQlQeV9VTklDT0RFX1NJWkUgKiBkYXRhbGVuKTsKLQkJZGF0YWxlbiArPSBzZWxmLT5wZW5kaW5nc2l6ZTsKLQkJc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCQlpbmJ1ZiA9IGluYnVmX3RtcDsKLQl9Ci0JZWxzZQotCQlpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKLQotCWluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKLQotCXIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKLQkJCShjb25zdCBQeV9VTklDT0RFICoqKSZpbmJ1ZiwgZGF0YWxlbiwgc2VsZi0+ZXJyb3JzLCAwKTsKLQlpZiAociA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCWlmIChpbmJ1ZiA8IGluYnVmX2VuZCkgewotCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IChQeV9zc2l6ZV90KShpbmJ1Zl9lbmQgLSBpbmJ1Zik7Ci0JCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA+IE1BWEVOQ1BFTkRJTkcpIHsKLQkJCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCSJwZW5kaW5nIGJ1ZmZlciBvdmVyZmxvdyIpOwotCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KLQkJbWVtY3B5KHNlbGYtPnBlbmRpbmcsIGluYnVmLAotCQkJc2VsZi0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOwotCX0KLQotCXdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgcik7CisJd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBzdHIpOworCVB5X0RFQ1JFRihzdHIpOwogCWlmICh3ciA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKKwkJcmV0dXJuIC0xOwogCi0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9ERUNSRUYocik7CiAJUHlfREVDUkVGKHdyKTsKLQlQeV9YREVDUkVGKHVjdnQpOwogCXJldHVybiAwOwotCi1lcnJvcmV4aXQ6Ci0JaWYgKGluYnVmX3RtcCAhPSBOVUxMKQotCQlQeU1lbV9EZWwoaW5idWZfdG1wKTsKLQlQeV9YREVDUkVGKHIpOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTA1NCwxMCArMTUyMyw4IEBACiAKIAlpZiAobWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaikpCiAJCXJldHVybiBOVUxMOwotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKwllbHNlCisJCVB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTA4Nyw4ICsxNTU0LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCX0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKwlQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTExMTksMTggKzE1ODUsNjkgQEAKIAl9CiAJUHlfREVDUkVGKHB3cnQpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworCVB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbWJzdHJlYW13cml0ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCU11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZjsKKwlQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOworCWNoYXIgKmVycm9ycyA9IE5VTEw7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVdyaXRlciIsCisJCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOworCWlmIChjb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycm9yZXhpdDsKKwlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7CisJCWdvdG8gZXJyb3JleGl0OworCX0KKworCXNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisJc2VsZi0+c3RyZWFtID0gc3RyZWFtOworCVB5X0lOQ1JFRihzdHJlYW0pOworCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKKwlzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKwkJZ290byBlcnJvcmV4aXQ7CisJaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKKwkgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorCQlnb3RvIGVycm9yZXhpdDsKKworCVB5X0RFQ1JFRihjb2RlYyk7CisJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisKK2Vycm9yZXhpdDoKKwlQeV9YREVDUkVGKHNlbGYpOworCVB5X1hERUNSRUYoY29kZWMpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CittYnN0cmVhbXdyaXRlcl90cmF2ZXJzZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsCisJCQl2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKwkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKwlQeV9WSVNJVChzZWxmLT5zdHJlYW0pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbWJzdHJlYW13cml0ZXJfZGVhbGxvYyhNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmVycm9ycyA+IEVSUk9SX01BWCkgewotCQlQeV9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKLQl9CisJUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKwlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKIAlQeV9ERUNSRUYoc2VsZi0+c3RyZWFtKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisJc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXdyaXRlcl9tZXRob2RzW10gPSB7CkBAIC0xMTQzLDcgKzE2NjAsMTIgQEAKIAl7TlVMTCwJCU5VTEx9LAogfTsKIAotCitzdGF0aWMgUHlNZW1iZXJEZWYgbWJzdHJlYW13cml0ZXJfbWVtYmVyc1tdID0geworCXsic3RyZWFtIiwJVF9PQkpFQ1QsCisJCQlvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QsIHN0cmVhbSksCisJCQlSRUFET05MWSwgTlVMTH0sCisJe05VTEwsfQorfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKQEAgLTExNjcsMTcgKzE2ODksMzMgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCisJCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KIAkwLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLworCSh0cmF2ZXJzZXByb2MpbWJzdHJlYW13cml0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCiAJMCwJCQkJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAJMCwJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KIAltYnN0cmVhbXdyaXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworCW1ic3RyZWFtd3JpdGVyX21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCisJY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCS8qIHRwX2Jhc2UgKi8KKwkwLAkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisJMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLworCTAsCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkvKiB0cF9hbGxvYyAqLworCW1ic3RyZWFtd3JpdGVyX25ldywJCS8qIHRwX25ldyAqLwogfTsKIAorCisvKioKKyAqIEV4cG9zZWQgZmFjdG9yeSBmdW5jdGlvbgorICovCisKIHN0YXRpYyBQeU9iamVjdCAqCiBfX2NyZWF0ZV9jb2RlYyhQeU9iamVjdCAqaWdub3JlLCBQeU9iamVjdCAqYXJnKQogewpAQCAtMTIwMSw4MCArMTczOSwzOCBAQAogCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotbWJzdHJlYW1yZWFkZXJfY3JlYXRlKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJICAgICAgUHlPYmplY3QgKnN0cmVhbSwgY29uc3QgY2hhciAqZXJyb3JzKQotewotCU11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZjsKLQotCXNlbGYgPSBQeU9iamVjdF9OZXcoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LAotCQkJJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXNlbGYtPmNvZGVjID0gY29kZWM7Ci0Jc2VsZi0+c3RyZWFtID0gc3RyZWFtOwotCVB5X0lOQ1JFRihzdHJlYW0pOwotCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQlzZWxmLT5lcnJvcnMgPSBnZXRfZXJyb3JjYWxsYmFjayhlcnJvcnMpOwotCWlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JaWYgKHNlbGYtPmNvZGVjLT5kZWNpbml0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlnb3RvIGVycm9yZXhpdDsKLQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCi1lcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW1ic3RyZWFtd3JpdGVyX2NyZWF0ZShNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCi0JCSAgICAgIFB5T2JqZWN0ICpzdHJlYW0sIGNvbnN0IGNoYXIgKmVycm9ycykKLXsKLQlNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGY7Ci0KLQlzZWxmID0gUHlPYmplY3RfTmV3KE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwKLQkJCSZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzZWxmLT5jb2RlYyA9IGNvZGVjOwotCXNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKLQlQeV9JTkNSRUYoc3RyZWFtKTsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0Jc2VsZi0+ZXJyb3JzID0gZ2V0X2Vycm9yY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQotZXJyb3JleGl0OgotCVB5X1hERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgX19tZXRob2RzW10gPSB7CiAJeyJfX2NyZWF0ZV9jb2RlYyIsIChQeUNGdW5jdGlvbilfX2NyZWF0ZV9jb2RlYywgTUVUSF9PfSwKIAl7TlVMTCwgTlVMTH0sCiB9OwogCi12b2lkCitQeU1PRElOSVRfRlVOQwogaW5pdF9tdWx0aWJ5dGVjb2RlYyh2b2lkKQogeworCWludCBpOworCVB5T2JqZWN0ICptOworCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKKwkJJk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlcl9UeXBlLAorCQkmTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX1R5cGUsCisJCSZNdWx0aWJ5dGVTdHJlYW1SZWFkZXJfVHlwZSwKKwkJJk11bHRpYnl0ZVN0cmVhbVdyaXRlcl9UeXBlLAorCQlOVUxMCisJfTsKKwogCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZUNvZGVjX1R5cGUpIDwgMCkKIAkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSkgPCAwKQorCisJbSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aWJ5dGVjb2RlYyIsIF9fbWV0aG9kcyk7CisJaWYgKG0gPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JUHlfSW5pdE1vZHVsZSgiX211bHRpYnl0ZWNvZGVjIiwgX19tZXRob2RzKTsKKwlmb3IgKGkgPSAwOyB0eXBlbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQorCQkJcmV0dXJuOworCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOworCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgdHlwZWxpc3RbaV0tPnRwX25hbWUsCisJCQkJICAgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworCX0KIAogCWlmIChQeUVycl9PY2N1cnJlZCgpKQogCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIHRoZSBfbXVsdGlieXRlY29kZWMgbW9kdWxlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaAppbmRleCBlYzQ5Yzc4Li4yMmVhNWQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKQEAgLTY3LDI0ICs2Nyw1MSBAQAogCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKIH0gTXVsdGlieXRlQ29kZWNPYmplY3Q7CiAKLSNkZWZpbmUgTUFYREVDUEVORElORwk4CisjZGVmaW5lIE11bHRpYnl0ZUNvZGVjX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmTXVsdGlieXRlQ29kZWNfVHlwZSkKKworI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECQlcCisJUHlPYmplY3RfSEVBRAkJCQlcCisJTXVsdGlieXRlQ29kZWMgKmNvZGVjOwkJCVwKKwlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsJCVwKKwlQeU9iamVjdCAqZXJyb3JzOwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlNdWx0aWJ5dGVDb2RlYyAqY29kZWM7Ci0JTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7Ci0JdW5zaWduZWQgY2hhciBwZW5kaW5nW01BWERFQ1BFTkRJTkddOwotCVB5X3NzaXplX3QgcGVuZGluZ3NpemU7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmVycm9yczsKLX0gTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0OworCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQKK30gTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQ7CiAKICNkZWZpbmUgTUFYRU5DUEVORElORwkyCi10eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKLQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKLQlQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAkJXAorCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKKwlQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107CVwKIAlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwotCVB5T2JqZWN0ICpzdHJlYW0sICplcnJvcnM7Cit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECit9IE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQ7CisKKyNkZWZpbmUgTUFYREVDUEVORElORwk4CisjZGVmaW5lIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAkJXAorCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQJCVwKKwl1bnNpZ25lZCBjaGFyIHBlbmRpbmdbTUFYREVDUEVORElOR107CVwKKwlQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorfSBNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisJX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECit9IE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorfSBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKKwlQeU9iamVjdCAqc3RyZWFtOworfSBNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQKKwlQeU9iamVjdCAqc3RyZWFtOwogfSBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3Q7CiAKIC8qIHBvc2l0aXZlIHZhbHVlcyBmb3IgaWxsZWdhbCBzZXF1ZW5jZXMgKi8KQEAgLTk1LDcgKzEyMiwxMiBAQAogI2RlZmluZSBFUlJPUl9TVFJJQ1QJCShQeU9iamVjdCAqKSgxKQogI2RlZmluZSBFUlJPUl9JR05PUkUJCShQeU9iamVjdCAqKSgyKQogI2RlZmluZSBFUlJPUl9SRVBMQUNFCQkoUHlPYmplY3QgKikoMykKLSNkZWZpbmUgRVJST1JfTUFYCQlFUlJPUl9SRVBMQUNFCisjZGVmaW5lIEVSUk9SX0lTQ1VTVE9NKHApCSgocCkgPCBFUlJPUl9TVFJJQ1QgfHwgRVJST1JfUkVQTEFDRSA8IChwKSkKKyNkZWZpbmUgRVJST1JfREVDUkVGKHApIGRvIHsJCQlcCisJaWYgKHAgIT0gTlVMTCAmJiBFUlJPUl9JU0NVU1RPTShwKSkgewlcCisJCVB5X0RFQ1JFRihwKTsJCQlcCisJfQkJCQkJXAorfSB3aGlsZSAoMCk7CiAKICNkZWZpbmUgTUJFTkNfRkxVU0gJCTB4MDAwMSAvKiBlbmNvZGUgYWxsIGNoYXJhY3RlcnMgZW5jb2RhYmxlICovCiAjZGVmaW5lIE1CRU5DX01BWAkJTUJFTkNfRkxVU0gKZGlmZiAtLWdpdCBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCBiODBhYjA3Li5jN2UyYzg1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC04MzIsMTEgKzgzMiwxMSBAQAogCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCiAJLyogbWV0aG9kcyAqLwogCShkZXN0cnVjdG9yKWRlcXVlX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWRlcXVlX3RwX3ByaW50LAkvKiB0cF9wcmludCAqLworCWRlcXVlX3RwX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCiAJMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KIAkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWRlcXVlX3JlcHIsCQkvKiB0cF9yZXByICovCisJZGVxdWVfcmVwciwJCQkvKiB0cF9yZXByICovCiAJMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCiAJJmRlcXVlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KIAkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCkBAIC0xMjM2LDEwICsxMjM2LDcgQEAKIHN0YXRpYyBpbnQKIGRlZmRpY3RfdHBfY2xlYXIoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgIT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JCWRkLT5kZWZhdWx0X2ZhY3RvcnkgPSBOVUxMOwotCX0KKwlQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKIAlyZXR1cm4gUHlEaWN0X1R5cGUudHBfY2xlYXIoKFB5T2JqZWN0ICopZGQpOwogfQogCkBAIC0xMjc3LDggKzEyNzQsMTEgQEAKIEEgZGVmYXVsdGRpY3QgY29tcGFyZXMgZXF1YWwgdG8gYSBkaWN0IHdpdGggdGhlIHNhbWUgaXRlbXMuXG5cCiAiKTsKIAorLyogU2VlIGNvbW1lbnQgaW4geHhzdWJ0eXBlLmMgKi8KKyNkZWZpbmUgREVGRVJSRURfQUREUkVTUyhBRERSKSAwCisKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVmZGljdF90eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCVB5T2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSkpCiAJMCwJCQkJLyogb2Jfc2l6ZSAqLwogCSJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIsCS8qIHRwX25hbWUgKi8KIAlzaXplb2YoZGVmZGljdG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KQEAgLTEzMDIsNyArMTMwMiw3IEBACiAJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAJCVB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywJLyogdHBfZmxhZ3MgKi8KIAlkZWZkaWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWRlZmRpY3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJZGVmZGljdF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCiAJKGlucXVpcnkpZGVmZGljdF90cF9jbGVhciwJLyogdHBfY2xlYXIgKi8KIAkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0Ki8KQEAgLTEzMTEsMTIgKzEzMTEsMTIgQEAKIAlkZWZkaWN0X21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCiAJZGVmZGljdF9tZW1iZXJzLAkJLyogdHBfbWVtYmVycyAqLwogCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCSZQeURpY3RfVHlwZSwJCQkvKiB0cF9iYXNlICovCisJREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLAkvKiB0cF9iYXNlICovCiAJMCwJCQkJLyogdHBfZGljdCAqLwogCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwogCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwogCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZGVmZGljdF9pbml0LAkJLyogdHBfaW5pdCAqLworCWRlZmRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCiAJUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCiAJMCwJCQkJLyogdHBfbmV3ICovCiAJUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLwpAQCAtMTM0NCw2ICsxMzQ0LDcgQEAKIAlQeV9JTkNSRUYoJmRlcXVlX3R5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVxdWUiLCAoUHlPYmplY3QgKikmZGVxdWVfdHlwZSk7CiAKKwlkZWZkaWN0X3R5cGUudHBfYmFzZSA9ICZQeURpY3RfVHlwZTsKIAlpZiAoUHlUeXBlX1JlYWR5KCZkZWZkaWN0X3R5cGUpIDwgMCkKIAkJcmV0dXJuOwogCVB5X0lOQ1JFRigmZGVmZGljdF90eXBlKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvY29uZmlnLmMuaW4gYi9Nb2R1bGVzL2NvbmZpZy5jLmluCmluZGV4IDllYzI4MWMuLmY4MTE5OTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29uZmlnLmMuaW4KKysrIGIvTW9kdWxlcy9jb25maWcuYy5pbgpAQCAtMTcsNiArMTcsMTAgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIAogLyogLS0gQURETU9EVUxFIE1BUktFUiAxIC0tICovCiAKQEAgLTUwLDMgKzU0LDkgQEAKIAkvKiBTZW50aW5lbCAqLwogCXswLCAwfQogfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggYzFhMGNiMy4uOWFlMjM1YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwpAQCAtMTIyOCw4ICsxMjI4LDggQEAKIAkJCQl9CiAJCQl9CiAJCQlhc3NlcnQoenJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQXNTdHJpbmcoenJlcGxhY2VtZW50KTsKLQkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX1NpemUoenJlcGxhY2VtZW50KTsKKwkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyh6cmVwbGFjZW1lbnQpOworCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoenJlcGxhY2VtZW50KTsKIAkJfQogCQllbHNlIGlmIChjaCA9PSAnWicpIHsKIAkJCS8qIGZvcm1hdCB0em5hbWUgKi8KQEAgLTEyNTcsMTQgKzEyNTcsMTggQEAKIAkJCQkJCVB5X0RFQ1JFRih0ZW1wKTsKIAkJCQkJCWlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkKIAkJCQkJCQlnb3RvIERvbmU7CisJCQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKFpyZXBsYWNlbWVudCkpIHsKKwkJCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidHpuYW1lLnJlcGxhY2UoKSBkaWQgbm90IHJldHVybiBhIHN0cmluZyIpOworCQkJCQkJCWdvdG8gRG9uZTsKKwkJCQkJCX0KIAkJCQkJfQogCQkJCQllbHNlCiAJCQkJCQlQeV9ERUNSRUYodGVtcCk7CiAJCQkJfQogCQkJfQogCQkJYXNzZXJ0KFpyZXBsYWNlbWVudCAhPSBOVUxMKTsKLQkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FzU3RyaW5nKFpyZXBsYWNlbWVudCk7Ci0JCQludG9hcHBlbmQgPSBQeVN0cmluZ19TaXplKFpyZXBsYWNlbWVudCk7CisJCQlwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoWnJlcGxhY2VtZW50KTsKKwkJCW50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKFpyZXBsYWNlbWVudCk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKiBwZXJjZW50IGZvbGxvd2VkIGJ5IG5laXRoZXIgeiBub3IgWiAqLwpAQCAtMTI3NSw2ICsxMjc5LDcgQEAKICAJCS8qIEFwcGVuZCB0aGUgbnRvYXBwZW5kIGNoYXJzIHN0YXJ0aW5nIGF0IHB0b2FwcGVuZCB0bwogIAkJICogdGhlIG5ldyBmb3JtYXQuCiAgCQkgKi8KKyAJCWFzc2VydChwdG9hcHBlbmQgIT0gTlVMTCk7CiAgCQlhc3NlcnQobnRvYXBwZW5kID49IDApOwogIAkJaWYgKG50b2FwcGVuZCA9PSAwKQogIAkJCWNvbnRpbnVlOwpAQCAtMjQwNCwxMSArMjQwOSwxMSBAQAogZGF0ZV9yZXByKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKIAljaGFyIGJ1ZmZlclsxMDI4XTsKLQljb25zdCBjaGFyICp0eXBlbmFtZTsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CiAKLQl0eXBlbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CisJdHlwZV9uYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKIAlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyglZCwgJWQsICVkKSIsCi0JCSAgICAgIHR5cGVuYW1lLAorCQkgICAgICB0eXBlX25hbWUsCiAJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZikpOwogCiAJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKQEAgLTMxMzAsNyArMzEzNSw3IEBACiB0aW1lX3JlcHIoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewogCWNoYXIgYnVmZmVyWzEwMF07Ci0JY29uc3QgY2hhciAqdHlwZW5hbWUgPSBzZWxmLT5vYl90eXBlLT50cF9uYW1lOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CiAJaW50IGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOwogCWludCBtID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOwogCWludCBzID0gVElNRV9HRVRfU0VDT05EKHNlbGYpOwpAQCAtMzEzOSwxMyArMzE0NCwxMyBAQAogCiAJaWYgKHVzKQogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQpIiwgdHlwZW5hbWUsIGgsIG0sIHMsIHVzKTsKKwkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMsIHVzKTsKIAllbHNlIGlmIChzKQogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlbmFtZSwgaCwgbSwgcyk7CisJCQkgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMpOwogCWVsc2UKIAkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgIiVzKCVkLCAlZCkiLCB0eXBlbmFtZSwgaCwgbSk7CisJCQkgICAgICAiJXMoJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSk7CiAJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogCWlmIChyZXN1bHQgIT0gTlVMTCAmJiBIQVNUWklORk8oc2VsZikpCiAJCXJlc3VsdCA9IGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhyZXN1bHQsIHNlbGYtPnR6aW5mbyk7CkBAIC0zODE2LDYgKzM4MjEsMTAgQEAKIAkJaWYgKFB5U2VxdWVuY2VfQ2hlY2sob2JqKSAmJiBQeVNlcXVlbmNlX1NpemUob2JqKSA+PSA2KQogCQkJZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKIAkJCQlQeU9iamVjdCAqcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIGkpOworCQkJCWlmIChwID09IE5VTEwpIHsKKwkJCQkJUHlfREVDUkVGKG9iaik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KIAkJCQlpZiAoUHlJbnRfQ2hlY2socCkpCiAJCQkJCWlhW2ldID0gUHlJbnRfQXNMb25nKHApOwogCQkJCWVsc2UKQEAgLTQwMjMsMTMgKzQwMzIsMTMgQEAKIGRhdGV0aW1lX3JlcHIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKIAljaGFyIGJ1ZmZlclsxMDAwXTsKLQljb25zdCBjaGFyICp0eXBlbmFtZSA9IHNlbGYtPm9iX3R5cGUtPnRwX25hbWU7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKIAlQeU9iamVjdCAqYmFzZXJlcHI7CiAKIAlpZiAoREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpIHsKIAkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAogCQkJICAgICAgIiVzKCVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlbmFtZSwKKwkJCSAgICAgIHR5cGVfbmFtZSwKIAkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAJCQkgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksCkBAIC00MDM4LDcgKzQwNDcsNyBAQAogCWVsc2UgaWYgKERBVEVfR0VUX1NFQ09ORChzZWxmKSkgewogCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCiAJCQkgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZW5hbWUsCisJCQkgICAgICB0eXBlX25hbWUsCiAJCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAogCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogCQkJICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKQEAgLTQwNDYsNyArNDA1NSw3IEBACiAJZWxzZSB7CiAJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKIAkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVuYW1lLAorCQkJICAgICAgdHlwZV9uYW1lLAogCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKIAkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSk7CiAJfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mdW5jdGlvbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYwppbmRleCA0YjJlOWI0Li4zOGVmNDNhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYworKysgYi9Nb2R1bGVzL2Z1bmN0aW9uYWxtb2R1bGUuYwpAQCAtNDgsNyArNDgsNyBAQAogCiAJcHRvLT5mbiA9IGZ1bmM7CiAJUHlfSU5DUkVGKGZ1bmMpOwotCXB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgSU5UX01BWCk7CisJcHRvLT5hcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQWV9TU0laRV9UX01BWCk7CiAJaWYgKHB0by0+YXJncyA9PSBOVUxMKSB7CiAJCXB0by0+a3cgPSBOVUxMOwogCQlQeV9ERUNSRUYocHRvKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCA3ZTNmOTVhLi4wMTc2ZDZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC00MTMsOCArNDEzLDEyIEBACiAJCWFzc2VydChkZWxzdHIgIT0gTlVMTCk7CiAJCXJldHVybiBfUHlJbnN0YW5jZV9Mb29rdXAob3AsIGRlbHN0cikgIT0gTlVMTDsKIAl9Ci0JZWxzZSAKKwllbHNlIGlmIChQeVR5cGVfSGFzRmVhdHVyZShvcC0+b2JfdHlwZSwgUHlfVFBGTEFHU19IRUFQVFlQRSkpCiAJCXJldHVybiBvcC0+b2JfdHlwZS0+dHBfZGVsICE9IE5VTEw7CisJZWxzZSBpZiAoUHlHZW5fQ2hlY2tFeGFjdChvcCkpCisJCXJldHVybiBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKFB5R2VuT2JqZWN0ICopb3ApOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIC8qIE1vdmUgdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgd2l0aCBfX2RlbF9fIG1ldGhvZHMgaW50byBgZmluYWxpemVyc2AuCkBAIC03MzAsNiArNzM0LDggQEAKIAlQeUdDX0hlYWQgdW5yZWFjaGFibGU7IC8qIG5vbi1wcm9ibGVtYXRpYyB1bnJlYWNoYWJsZSB0cmFzaCAqLwogCVB5R0NfSGVhZCBmaW5hbGl6ZXJzOyAgLyogb2JqZWN0cyB3aXRoLCAmIHJlYWNoYWJsZSBmcm9tLCBfX2RlbF9fICovCiAJUHlHQ19IZWFkICpnYzsKKwlzdGF0aWMgUHlPYmplY3QgKnRtb2QgPSBOVUxMOworCWRvdWJsZSB0MSA9IDAuMDsKIAogCWlmIChkZWxzdHIgPT0gTlVMTCkgewogCQlkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7CkBAIC03MzcsMTkgKzc0MywyOSBAQAogCQkJUHlfRmF0YWxFcnJvcigiZ2MgY291bGRuJ3QgYWxsb2NhdGUgXCJfX2RlbF9fXCIiKTsKIAl9CiAKKwlpZiAodG1vZCA9PSBOVUxMKSB7CisJCXRtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInRpbWUiKTsKKwkJaWYgKHRtb2QgPT0gTlVMTCkKKwkJCVB5RXJyX0NsZWFyKCk7CisJfQorCiAJaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKKwkJaWYgKHRtb2QgIT0gTlVMTCkgeworCQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7CisJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXQxID0gUHlGbG9hdF9Bc0RvdWJsZShmKTsKKwkJCQlQeV9ERUNSRUYoZik7CisJCQl9CisJCX0KIAkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBjb2xsZWN0aW5nIGdlbmVyYXRpb24gJWQuLi5cbiIsCiAJCQkJICBnZW5lcmF0aW9uKTsKIAkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBvYmplY3RzIGluIGVhY2ggZ2VuZXJhdGlvbjoiKTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7Ci0jaWZkZWYgTVNfV0lONjQKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIgJUlkIiwgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7Ci0jZWxzZQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiAlbGQiLAotCQkJCVB5X1NBRkVfRE9XTkNBU1QoZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSwKLQkJCQkJCSBQeV9zc2l6ZV90LCBsb25nKSk7Ci0jZW5kaWYKLQkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspCisJCQlQeVN5c19Xcml0ZVN0ZGVycigiICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorCQkJCQkgIGdjX2xpc3Rfc2l6ZShHRU5fSEVBRChpKSkpOwogCQlQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKIAl9CiAKQEAgLTgxNiw2ICs4MzIsMTcgQEAKIAkJaWYgKGRlYnVnICYgREVCVUdfQ09MTEVDVEFCTEUpIHsKIAkJCWRlYnVnX2N5Y2xlKCJjb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKIAkJfQorCQlpZiAodG1vZCAhPSBOVUxMICYmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSkgeworCQkJUHlPYmplY3QgKmYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRtb2QsICJ0aW1lIiwgTlVMTCk7CisJCQlpZiAoZiA9PSBOVUxMKSB7CisJCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXQxID0gUHlGbG9hdF9Bc0RvdWJsZShmKS10MTsKKwkJCQlQeV9ERUNSRUYoZik7CisJCQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiAlLjRmcyBlbGFwc2VkLlxuIiwgdDEpOworCQkJfQorCQl9CiAJfQogCiAJLyogQ2xlYXIgd2Vha3JlZnMgYW5kIGludm9rZSBjYWxsYmFja3MgYXMgbmVjZXNzYXJ5LiAqLwpAQCAtODM3LDIxICs4NjQsMTQgQEAKIAkJCWRlYnVnX2N5Y2xlKCJ1bmNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOwogCX0KIAlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgewotCQlpZiAobSA9PSAwICYmIG4gPT0gMCkgeworCQlpZiAobSA9PSAwICYmIG4gPT0gMCkKIAkJCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogZG9uZS5cbiIpOwotCQl9Ci0JCWVsc2UgewotI2lmZGVmIE1TX1dJTjY0CisJCWVsc2UKIAkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJICAgICJnYzogZG9uZSwgJUlkIHVucmVhY2hhYmxlLCAlSWQgdW5jb2xsZWN0YWJsZS5cbiIsCisJCQkgICAgImdjOiBkb25lLCAiCisJCQkgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5yZWFjaGFibGUsICIKKwkJCSAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bmNvbGxlY3RhYmxlLlxuIiwKIAkJCSAgICBuK20sIG4pOwotI2Vsc2UKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJICAgICJnYzogZG9uZSwgJWxkIHVucmVhY2hhYmxlLCAlbGQgdW5jb2xsZWN0YWJsZS5cbiIsCi0JCQkgICAgUHlfU0FGRV9ET1dOQ0FTVChuK20sIFB5X3NzaXplX3QsIGxvbmcpLAotCQkJICAgIFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgbG9uZykpOwotI2VuZGlmCi0JCX0KIAl9CiAKIAkvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxlIHNldCB0byBhIFB5dGhvbgpAQCAtMTA1MCw3ICsxMDcwLDcgQEAKIHN0YXRpYyBpbnQKIHJlZmVycmVyc3Zpc2l0KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0ICpvYmpzKQogewotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShvYmpzKTsgaSsrKQogCQlpZiAoUHlUdXBsZV9HRVRfSVRFTShvYmpzLCBpKSA9PSBvYmopCiAJCQlyZXR1cm4gMTsKQEAgLTEwODUsNiArMTEwNSw4IEBACiB7CiAJaW50IGk7CiAJUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworCiAJZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7CiAJCWlmICghKGdjX3JlZmVycmVyc19mb3IoYXJncywgR0VOX0hFQUQoaSksIHJlc3VsdCkpKSB7CiAJCQlQeV9ERUNSRUYocmVzdWx0KTsKQEAgLTExMDgsNyArMTEzMCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X3JlZmVyZW50cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOwogCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwogCiAJaWYgKHJlc3VsdCA9PSBOVUxMKQpAQCAtMTI4OCw3ICsxMzEwLDggQEAKIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90IGJhc2ljc2l6ZSkKIHsKIAlQeU9iamVjdCAqb3A7Ci0JUHlHQ19IZWFkICpnID0gUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKKwlQeUdDX0hlYWQgKmcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAorICAgICAgICAgICAgICAgIHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKIAlpZiAoZyA9PSBOVUxMKQogCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAlnLT5nYy5nY19yZWZzID0gR0NfVU5UUkFDS0VEOwpAQCAtMTMzMCw3ICsxMzUzLDcgQEAKIHsKIAljb25zdCBzaXplX3QgYmFzaWNzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKG9wLT5vYl90eXBlLCBuaXRlbXMpOwogCVB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKLQlnID0gUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworCWcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOwogCWlmIChnID09IE5VTEwpCiAJCXJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOwogCW9wID0gKFB5VmFyT2JqZWN0ICopIEZST01fR0MoZyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDQ3MTZkMTUuLjhlYmE3MzAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC05MSw2ICs5MSwxMSBAQAogICogcHJvY2VzcyB0byBmaW5kIHRoZSBpbnN0YWxsZWQgUHl0aG9uIHRyZWUuCiAgKi8KIAorI2lmZGVmIF9fY3BsdXNwbHVzCisgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCiAjaWZuZGVmIFZFUlNJT04KICNpZiBkZWZpbmVkKF9fVk1TKQogI2RlZmluZSBWRVJTSU9OICIyXzEiCkBAIC01NjYsNyArNTcxLDcgQEAKICAgICBidWZzeiArPSBzdHJsZW4oZXhlY19wcmVmaXgpICsgMTsKIAogICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgbWFsbG9jIGNhbGwgaW4gdGhpcyBmaWxlICovCi0gICAgYnVmID0gUHlNZW1fTWFsbG9jKGJ1ZnN6KTsKKyAgICBidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZzeik7CiAKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCkBAIC02ODEsMyArNjg2LDkgQEAKICAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKICAgICByZXR1cm4gcHJvZ3BhdGg7CiB9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ncnBtb2R1bGUuYyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKaW5kZXggZGU4NDljOS4uMTJkMzNkZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9ncnBtb2R1bGUuYworKysgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCkBAIC0yOSw2ICsyOSw3IEBACiB9OwogCiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdEdycFR5cGU7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzQsNiArMTc1LDggQEAKICAgICBpZiAobSA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0gICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0R3JwVHlwZSwgJnN0cnVjdF9ncm91cF90eXBlX2Rlc2MpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisJICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdEdycFR5cGUsICZzdHJ1Y3RfZ3JvdXBfdHlwZV9kZXNjKTsKICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RydWN0X2dyb3VwIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RHcnBUeXBlKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwppbmRleCA0OWQyNDFmLi45NDYxN2E5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCisrKyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKQEAgLTM0MCw3ICszNDAsNyBAQAogewogCXRlZWRhdGFvYmplY3QgKnRkbzsKIAotCXRkbyA9IFB5T2JqZWN0X05ldyh0ZWVkYXRhb2JqZWN0LCAmdGVlZGF0YW9iamVjdF90eXBlKTsKKwl0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7CiAJaWYgKHRkbyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzQ4LDYgKzM0OCw3IEBACiAJdGRvLT5uZXh0bGluayA9IE5VTEw7CiAJUHlfSU5DUkVGKGl0KTsKIAl0ZG8tPml0ID0gaXQ7CisJUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopdGRvOwogfQogCkBAIC0zODEsMTYgKzM4MiwzNCBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGludAordGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKK3sKKwlpbnQgaTsKKwlQeV9WSVNJVCh0ZG8tPml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCisJCVB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKKwlQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGVlZGF0YW9iamVjdF9jbGVhcih0ZWVkYXRhb2JqZWN0ICp0ZG8pCit7CisJaW50IGk7CisJUHlfQ0xFQVIodGRvLT5pdCk7CisJZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykKKwkJUHlfQ0xFQVIodGRvLT52YWx1ZXNbaV0pOworCVB5X0NMRUFSKHRkby0+bmV4dGxpbmspOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZAogdGVlZGF0YW9iamVjdF9kZWFsbG9jKHRlZWRhdGFvYmplY3QgKnRkbykKIHsKLQlpbnQgaTsKLQotCWZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCi0JCVB5X0RFQ1JFRih0ZG8tPnZhbHVlc1tpXSk7Ci0JUHlfWERFQ1JFRih0ZG8tPml0KTsKLQlQeV9YREVDUkVGKHRkby0+bmV4dGxpbmspOwotCVB5T2JqZWN0X0RlbCh0ZG8pOworCVB5T2JqZWN0X0dDX1VuVHJhY2sodGRvKTsKKwl0ZWVkYXRhb2JqZWN0X2NsZWFyKHRkbyk7CisJUHlPYmplY3RfR0NfRGVsKHRkbyk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVkYXRhb2JqZWN0X2RvYywgIkRhdGEgY29udGFpbmVyIGNvbW1vbiB0byBtdWx0aXBsZSB0ZWUgb2JqZWN0cy4iKTsKQEAgLTQxNyw5ICs0MzYsMjYgQEAKIAlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCiAJMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLworCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KIAl0ZWVkYXRhb2JqZWN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KKwkodHJhdmVyc2Vwcm9jKXRlZWRhdGFvYmplY3RfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCisJKGlucXVpcnkpdGVlZGF0YW9iamVjdF9jbGVhciwJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KKwkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLworCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisJMCwJCQkJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJMCwJCQkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCQkJLyogdHBfYWxsb2MgKi8KKwkwLAkJCQkJLyogdHBfbmV3ICovCisJUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtNDQzLDE4ICs0NzksMjYgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQKK3RlZV90cmF2ZXJzZSh0ZWVvYmplY3QgKnRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKwlQeV9WSVNJVCgoUHlPYmplY3QgKil0by0+ZGF0YW9iaik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZWVfY29weSh0ZWVvYmplY3QgKnRvKQogewogCXRlZW9iamVjdCAqbmV3dG87CiAKLQluZXd0byA9IFB5T2JqZWN0X05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CisJbmV3dG8gPSBQeU9iamVjdF9HQ19OZXcodGVlb2JqZWN0LCAmdGVlX3R5cGUpOwogCWlmIChuZXd0byA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlQeV9JTkNSRUYodG8tPmRhdGFvYmopOwogCW5ld3RvLT5kYXRhb2JqID0gdG8tPmRhdGFvYmo7CiAJbmV3dG8tPmluZGV4ID0gdG8tPmluZGV4OwogCW5ld3RvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisJUHlPYmplY3RfR0NfVHJhY2sobmV3dG8pOwogCXJldHVybiAoUHlPYmplY3QgKiluZXd0bzsKIH0KIApAQCAtNDc0LDEyICs1MTgsMTMgQEAKIAkJZ290byBkb25lOwogCX0KIAotCXRvID0gUHlPYmplY3RfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKKwl0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CiAJaWYgKHRvID09IE5VTEwpIAogCQlnb3RvIGRvbmU7CiAJdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKIAl0by0+aW5kZXggPSAwOwogCXRvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisJUHlPYmplY3RfR0NfVHJhY2sodG8pOwogZG9uZToKIAlQeV9YREVDUkVGKGl0KTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopdG87CkBAIC00OTUsMTMgKzU0MCwyMSBAQAogCXJldHVybiB0ZWVfZnJvbWl0ZXJhYmxlKGl0ZXJhYmxlKTsKIH0KIAotc3RhdGljIHZvaWQKLXRlZV9kZWFsbG9jKHRlZW9iamVjdCAqdG8pCitzdGF0aWMgaW50Cit0ZWVfY2xlYXIodGVlb2JqZWN0ICp0bykKIHsKIAlpZiAodG8tPndlYWtyZWZsaXN0ICE9IE5VTEwpCiAJCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHRvKTsKLQlQeV9YREVDUkVGKHRvLT5kYXRhb2JqKTsKLQlQeU9iamVjdF9EZWwodG8pOworCVB5X0NMRUFSKHRvLT5kYXRhb2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RlZV9kZWFsbG9jKHRlZW9iamVjdCAqdG8pCit7CisJUHlPYmplY3RfR0NfVW5UcmFjayh0byk7CisJdGVlX2NsZWFyKHRvKTsKKwlQeU9iamVjdF9HQ19EZWwodG8pOwogfQogCiBQeURvY19TVFJWQVIodGVlb2JqZWN0X2RvYywKQEAgLTUzNCwxMCArNTg3LDEwIEBACiAJMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwogCXRlZW9iamVjdF9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLworCSh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLworCShpbnF1aXJ5KXRlZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCiAJMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KIAlvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KIAlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KQEAgLTU1Myw3ICs2MDYsNyBAQAogCTAsCQkJCS8qIHRwX2luaXQgKi8KIAkwLAkJCQkvKiB0cF9hbGxvYyAqLwogCXRlZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKwlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCBiM2NlMTZlLi43MzI2YTI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtMjgsNiArMjgsMTAgQEAKICAgICAiVHlwZSBcImhlbHBcIiwgXCJjb3B5cmlnaHRcIiwgXCJjcmVkaXRzXCIgb3IgXCJsaWNlbnNlXCIgIiBcCiAgICAgImZvciBtb3JlIGluZm9ybWF0aW9uLiIKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiAvKiBGb3IgUHlfR2V0QXJnY0FyZ3YoKTsgc2V0IGJ5IG1haW4oKSAqLwogc3RhdGljIGNoYXIgKipvcmlnX2FyZ3Y7CiBzdGF0aWMgaW50ICBvcmlnX2FyZ2M7CkBAIC0yMDYsNyArMjEwLDcgQEAKIAkJCS8qIC1jIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwogCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCiAJCQkgICBjb21tYW5kIHRvIGludGVycHJldC4gKi8KLQkJCWNvbW1hbmQgPSBtYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKKwkJCWNvbW1hbmQgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOwogCQkJaWYgKGNvbW1hbmQgPT0gTlVMTCkKIAkJCQlQeV9GYXRhbEVycm9yKAogCQkJCSAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IC1jIGFyZ3VtZW50Iik7CkBAIC0yMTksNyArMjIzLDcgQEAKIAkJCS8qIC1tIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cwogCQkJICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCiAJCQkgICBtb2R1bGUgdG8gaW50ZXJwcmV0LiAqLwotCQkJbW9kdWxlID0gbWFsbG9jKHN0cmxlbihfUHlPU19vcHRhcmcpICsgMik7CisJCQltb2R1bGUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOwogCQkJaWYgKG1vZHVsZSA9PSBOVUxMKQogCQkJCVB5X0ZhdGFsRXJyb3IoCiAJCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLW0gYXJndW1lbnQiKTsKQEAgLTUwOSwzICs1MTMsOCBAQAogCSphcmdjID0gb3JpZ19hcmdjOwogCSphcmd2ID0gb3JpZ19hcmd2OwogfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNS5jIGIvTW9kdWxlcy9tZDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzVkOTZjCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9tZDUuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkOiBtZDUuYyx2IDEuNiAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuYyBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKKwllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+CisJaW4gbGlicmFyeS4KKyAgMjAwMi0wMy0xMSBscGQgQ29ycmVjdGVkIGFyZ3VtZW50IGxpc3QgZm9yIG1haW4oKSwgYW5kIGFkZGVkIGludCByZXR1cm4KKwl0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KKyAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgorICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKKwl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCisJc2VsZi1jaGVja2luZy4KKyAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCisgIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSkuCisgIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjdW5kZWYgQllURV9PUkRFUgkvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLworI2lmZGVmIEFSQ0hfSVNfQklHX0VORElBTgorIyAgZGVmaW5lIEJZVEVfT1JERVIgKEFSQ0hfSVNfQklHX0VORElBTiA/IDEgOiAtMSkKKyNlbHNlCisjICBkZWZpbmUgQllURV9PUkRFUiAwCisjZW5kaWYKKworI2RlZmluZSBUX01BU0sgKChtZDVfd29yZF90KX4wKQorI2RlZmluZSBUMSAvKiAweGQ3NmFhNDc4ICovIChUX01BU0sgXiAweDI4OTU1Yjg3KQorI2RlZmluZSBUMiAvKiAweGU4YzdiNzU2ICovIChUX01BU0sgXiAweDE3Mzg0OGE5KQorI2RlZmluZSBUMyAgICAweDI0MjA3MGRiCisjZGVmaW5lIFQ0IC8qIDB4YzFiZGNlZWUgKi8gKFRfTUFTSyBeIDB4M2U0MjMxMTEpCisjZGVmaW5lIFQ1IC8qIDB4ZjU3YzBmYWYgKi8gKFRfTUFTSyBeIDB4MGE4M2YwNTApCisjZGVmaW5lIFQ2ICAgIDB4NDc4N2M2MmEKKyNkZWZpbmUgVDcgLyogMHhhODMwNDYxMyAqLyAoVF9NQVNLIF4gMHg1N2NmYjllYykKKyNkZWZpbmUgVDggLyogMHhmZDQ2OTUwMSAqLyAoVF9NQVNLIF4gMHgwMmI5NmFmZSkKKyNkZWZpbmUgVDkgICAgMHg2OTgwOThkOAorI2RlZmluZSBUMTAgLyogMHg4YjQ0ZjdhZiAqLyAoVF9NQVNLIF4gMHg3NGJiMDg1MCkKKyNkZWZpbmUgVDExIC8qIDB4ZmZmZjViYjEgKi8gKFRfTUFTSyBeIDB4MDAwMGE0NGUpCisjZGVmaW5lIFQxMiAvKiAweDg5NWNkN2JlICovIChUX01BU0sgXiAweDc2YTMyODQxKQorI2RlZmluZSBUMTMgICAgMHg2YjkwMTEyMgorI2RlZmluZSBUMTQgLyogMHhmZDk4NzE5MyAqLyAoVF9NQVNLIF4gMHgwMjY3OGU2YykKKyNkZWZpbmUgVDE1IC8qIDB4YTY3OTQzOGUgKi8gKFRfTUFTSyBeIDB4NTk4NmJjNzEpCisjZGVmaW5lIFQxNiAgICAweDQ5YjQwODIxCisjZGVmaW5lIFQxNyAvKiAweGY2MWUyNTYyICovIChUX01BU0sgXiAweDA5ZTFkYTlkKQorI2RlZmluZSBUMTggLyogMHhjMDQwYjM0MCAqLyAoVF9NQVNLIF4gMHgzZmJmNGNiZikKKyNkZWZpbmUgVDE5ICAgIDB4MjY1ZTVhNTEKKyNkZWZpbmUgVDIwIC8qIDB4ZTliNmM3YWEgKi8gKFRfTUFTSyBeIDB4MTY0OTM4NTUpCisjZGVmaW5lIFQyMSAvKiAweGQ2MmYxMDVkICovIChUX01BU0sgXiAweDI5ZDBlZmEyKQorI2RlZmluZSBUMjIgICAgMHgwMjQ0MTQ1MworI2RlZmluZSBUMjMgLyogMHhkOGExZTY4MSAqLyAoVF9NQVNLIF4gMHgyNzVlMTk3ZSkKKyNkZWZpbmUgVDI0IC8qIDB4ZTdkM2ZiYzggKi8gKFRfTUFTSyBeIDB4MTgyYzA0MzcpCisjZGVmaW5lIFQyNSAgICAweDIxZTFjZGU2CisjZGVmaW5lIFQyNiAvKiAweGMzMzcwN2Q2ICovIChUX01BU0sgXiAweDNjYzhmODI5KQorI2RlZmluZSBUMjcgLyogMHhmNGQ1MGQ4NyAqLyAoVF9NQVNLIF4gMHgwYjJhZjI3OCkKKyNkZWZpbmUgVDI4ICAgIDB4NDU1YTE0ZWQKKyNkZWZpbmUgVDI5IC8qIDB4YTllM2U5MDUgKi8gKFRfTUFTSyBeIDB4NTYxYzE2ZmEpCisjZGVmaW5lIFQzMCAvKiAweGZjZWZhM2Y4ICovIChUX01BU0sgXiAweDAzMTA1YzA3KQorI2RlZmluZSBUMzEgICAgMHg2NzZmMDJkOQorI2RlZmluZSBUMzIgLyogMHg4ZDJhNGM4YSAqLyAoVF9NQVNLIF4gMHg3MmQ1YjM3NSkKKyNkZWZpbmUgVDMzIC8qIDB4ZmZmYTM5NDIgKi8gKFRfTUFTSyBeIDB4MDAwNWM2YmQpCisjZGVmaW5lIFQzNCAvKiAweDg3NzFmNjgxICovIChUX01BU0sgXiAweDc4OGUwOTdlKQorI2RlZmluZSBUMzUgICAgMHg2ZDlkNjEyMgorI2RlZmluZSBUMzYgLyogMHhmZGU1MzgwYyAqLyAoVF9NQVNLIF4gMHgwMjFhYzdmMykKKyNkZWZpbmUgVDM3IC8qIDB4YTRiZWVhNDQgKi8gKFRfTUFTSyBeIDB4NWI0MTE1YmIpCisjZGVmaW5lIFQzOCAgICAweDRiZGVjZmE5CisjZGVmaW5lIFQzOSAvKiAweGY2YmI0YjYwICovIChUX01BU0sgXiAweDA5NDRiNDlmKQorI2RlZmluZSBUNDAgLyogMHhiZWJmYmM3MCAqLyAoVF9NQVNLIF4gMHg0MTQwNDM4ZikKKyNkZWZpbmUgVDQxICAgIDB4Mjg5YjdlYzYKKyNkZWZpbmUgVDQyIC8qIDB4ZWFhMTI3ZmEgKi8gKFRfTUFTSyBeIDB4MTU1ZWQ4MDUpCisjZGVmaW5lIFQ0MyAvKiAweGQ0ZWYzMDg1ICovIChUX01BU0sgXiAweDJiMTBjZjdhKQorI2RlZmluZSBUNDQgICAgMHgwNDg4MWQwNQorI2RlZmluZSBUNDUgLyogMHhkOWQ0ZDAzOSAqLyAoVF9NQVNLIF4gMHgyNjJiMmZjNikKKyNkZWZpbmUgVDQ2IC8qIDB4ZTZkYjk5ZTUgKi8gKFRfTUFTSyBeIDB4MTkyNDY2MWEpCisjZGVmaW5lIFQ0NyAgICAweDFmYTI3Y2Y4CisjZGVmaW5lIFQ0OCAvKiAweGM0YWM1NjY1ICovIChUX01BU0sgXiAweDNiNTNhOTlhKQorI2RlZmluZSBUNDkgLyogMHhmNDI5MjI0NCAqLyAoVF9NQVNLIF4gMHgwYmQ2ZGRiYikKKyNkZWZpbmUgVDUwICAgIDB4NDMyYWZmOTcKKyNkZWZpbmUgVDUxIC8qIDB4YWI5NDIzYTcgKi8gKFRfTUFTSyBeIDB4NTQ2YmRjNTgpCisjZGVmaW5lIFQ1MiAvKiAweGZjOTNhMDM5ICovIChUX01BU0sgXiAweDAzNmM1ZmM2KQorI2RlZmluZSBUNTMgICAgMHg2NTViNTljMworI2RlZmluZSBUNTQgLyogMHg4ZjBjY2M5MiAqLyAoVF9NQVNLIF4gMHg3MGYzMzM2ZCkKKyNkZWZpbmUgVDU1IC8qIDB4ZmZlZmY0N2QgKi8gKFRfTUFTSyBeIDB4MDAxMDBiODIpCisjZGVmaW5lIFQ1NiAvKiAweDg1ODQ1ZGQxICovIChUX01BU0sgXiAweDdhN2JhMjJlKQorI2RlZmluZSBUNTcgICAgMHg2ZmE4N2U0ZgorI2RlZmluZSBUNTggLyogMHhmZTJjZTZlMCAqLyAoVF9NQVNLIF4gMHgwMWQzMTkxZikKKyNkZWZpbmUgVDU5IC8qIDB4YTMwMTQzMTQgKi8gKFRfTUFTSyBeIDB4NWNmZWJjZWIpCisjZGVmaW5lIFQ2MCAgICAweDRlMDgxMWExCisjZGVmaW5lIFQ2MSAvKiAweGY3NTM3ZTgyICovIChUX01BU0sgXiAweDA4YWM4MTdkKQorI2RlZmluZSBUNjIgLyogMHhiZDNhZjIzNSAqLyAoVF9NQVNLIF4gMHg0MmM1MGRjYSkKKyNkZWZpbmUgVDYzICAgIDB4MmFkN2QyYmIKKyNkZWZpbmUgVDY0IC8qIDB4ZWI4NmQzOTEgKi8gKFRfTUFTSyBeIDB4MTQ3OTJjNmUpCisKKworc3RhdGljIHZvaWQKK21kNV9wcm9jZXNzKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEgLypbNjRdKi8pCit7CisgICAgbWQ1X3dvcmRfdAorCWEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCisJYyA9IHBtcy0+YWJjZFsyXSwgZCA9IHBtcy0+YWJjZFszXTsKKyAgICBtZDVfd29yZF90IHQ7CisjaWYgQllURV9PUkRFUiA+IDAKKyAgICAvKiBEZWZpbmUgc3RvcmFnZSBvbmx5IGZvciBiaWctZW5kaWFuIENQVXMuICovCisgICAgbWQ1X3dvcmRfdCBYWzE2XTsKKyNlbHNlCisgICAgLyogRGVmaW5lIHN0b3JhZ2UgZm9yIGxpdHRsZS1lbmRpYW4gb3IgYm90aCB0eXBlcyBvZiBDUFVzLiAqLworICAgIG1kNV93b3JkX3QgeGJ1ZlsxNl07CisgICAgY29uc3QgbWQ1X3dvcmRfdCAqWDsKKyNlbmRpZgorCisgICAgeworI2lmIEJZVEVfT1JERVIgPT0gMAorCS8qCisJICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKKwkgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAorCSAqIGFsZ29yaXRobSBvbiB0aGUgbGF0dGVyLgorCSAqLworCXN0YXRpYyBjb25zdCBpbnQgdyA9IDE7CisKKwlpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCisjZW5kaWYKKyNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KKwl7CisJICAgIC8qCisJICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKKwkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCisJICAgICAqLworCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgeworCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCisJCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7CisJICAgIH0gZWxzZSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7CisJCVggPSB4YnVmOworCSAgICB9CisJfQorI2VuZGlmCisjaWYgQllURV9PUkRFUiA9PSAwCisJZWxzZQkJCS8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLworI2VuZGlmCisjaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCisJeworCSAgICAvKgorCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQorCSAgICAgKiByaWdodCBvcmRlci4KKwkgICAgICovCisJICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKKwkgICAgaW50IGk7CisKKyMgIGlmIEJZVEVfT1JERVIgPT0gMAorCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCisjICBlbHNlCisjICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KKyMgIGVuZGlmCisJICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQorCQl4YnVmW2ldID0geHBbMF0gKyAoeHBbMV0gPDwgOCkgKyAoeHBbMl0gPDwgMTYpICsgKHhwWzNdIDw8IDI0KTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCisKKyAgICAvKiBSb3VuZCAxLiAqLworICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgRihiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDcsICBUMSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAxLCAxMiwgIFQyKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE3LCAgVDMpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMywgMjIsICBUNCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNywgIFQ1KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDUsIDEyLCAgVDYpOworICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTcsICBUNyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA3LCAyMiwgIFQ4KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA3LCAgVDkpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOSwgMTIsIFQxMCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNywgVDExKTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTEsIDIyLCBUMTIpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDcsIFQxMyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDEzLCAxMiwgVDE0KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE3LCBUMTUpOworICAgIFNFVChiLCBjLCBkLCBhLCAxNSwgMjIsIFQxNik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMi4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKKyNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKKyAgdCA9IGEgKyBHKGIsYyxkKSArIFhba10gKyBUaTtcCisgIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKKyAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDUsIFQxNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA2LCAgOSwgVDE4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE0LCBUMTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAgMCwgMjAsIFQyMCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNSwgVDIxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTAsICA5LCBUMjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTQsIFQyMyk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA0LCAyMCwgVDI0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA1LCBUMjUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxNCwgIDksIFQyNik7CisgICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNCwgVDI3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDgsIDIwLCBUMjgpOworICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDUsIFQyOSk7CisgICAgU0VUKGQsIGEsIGIsIGMsICAyLCAgOSwgVDMwKTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE0LCBUMzEpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMiwgMjAsIFQzMik7CisjdW5kZWYgU0VUCisKKyAgICAgLyogUm91bmQgMy4gKi8KKyAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLworI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCisgIHQgPSBhICsgSChiLGMsZCkgKyBYW2tdICsgVGk7XAorICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCisgICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KKyAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA0LCBUMzMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgOCwgMTEsIFQzNCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNiwgVDM1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgMTQsIDIzLCBUMzYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDQsIFQzNyk7CisgICAgU0VUKGQsIGEsIGIsIGMsICA0LCAxMSwgVDM4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE2LCBUMzkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMCwgMjMsIFQ0MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNCwgVDQxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDAsIDExLCBUNDIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTYsIFQ0Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA2LCAyMywgVDQ0KTsKKyAgICBTRVQoYSwgYiwgYywgZCwgIDksICA0LCBUNDUpOworICAgIFNFVChkLCBhLCBiLCBjLCAxMiwgMTEsIFQ0Nik7CisgICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNiwgVDQ3KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDIsIDIzLCBUNDgpOworI3VuZGVmIFNFVAorCisgICAgIC8qIFJvdW5kIDQuICovCisgICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KKyNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQorI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAorICB0ID0gYSArIEkoYixjLGQpICsgWFtrXSArIFRpO1wKKyAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgorICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCisgICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNiwgVDQ5KTsKKyAgICBTRVQoZCwgYSwgYiwgYywgIDcsIDEwLCBUNTApOworICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTUsIFQ1MSk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA1LCAyMSwgVDUyKTsKKyAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA2LCBUNTMpOworICAgIFNFVChkLCBhLCBiLCBjLCAgMywgMTAsIFQ1NCk7CisgICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNSwgVDU1KTsKKyAgICBTRVQoYiwgYywgZCwgYSwgIDEsIDIxLCBUNTYpOworICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDYsIFQ1Nyk7CisgICAgU0VUKGQsIGEsIGIsIGMsIDE1LCAxMCwgVDU4KTsKKyAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE1LCBUNTkpOworICAgIFNFVChiLCBjLCBkLCBhLCAxMywgMjEsIFQ2MCk7CisgICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNiwgVDYxKTsKKyAgICBTRVQoZCwgYSwgYiwgYywgMTEsIDEwLCBUNjIpOworICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTUsIFQ2Myk7CisgICAgU0VUKGIsIGMsIGQsIGEsICA5LCAyMSwgVDY0KTsKKyN1bmRlZiBTRVQKKworICAgICAvKiBUaGVuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuIChUaGF0IGlzIGluY3JlbWVudCBlYWNoCisgICAgICAgIG9mIHRoZSBmb3VyIHJlZ2lzdGVycyBieSB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGJsb2NrCisgICAgICAgIHdhcyBzdGFydGVkLikgKi8KKyAgICBwbXMtPmFiY2RbMF0gKz0gYTsKKyAgICBwbXMtPmFiY2RbMV0gKz0gYjsKKyAgICBwbXMtPmFiY2RbMl0gKz0gYzsKKyAgICBwbXMtPmFiY2RbM10gKz0gZDsKK30KKwordm9pZAorbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcykKK3sKKyAgICBwbXMtPmNvdW50WzBdID0gcG1zLT5jb3VudFsxXSA9IDA7CisgICAgcG1zLT5hYmNkWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBwbXMtPmFiY2RbMV0gPSAvKjB4ZWZjZGFiODkqLyBUX01BU0sgXiAweDEwMzI1NDc2OworICAgIHBtcy0+YWJjZFsyXSA9IC8qMHg5OGJhZGNmZSovIFRfTUFTSyBeIDB4Njc0NTIzMDE7CisgICAgcG1zLT5hYmNkWzNdID0gMHgxMDMyNTQ3NjsKK30KKwordm9pZAorbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKQoreworICAgIGNvbnN0IG1kNV9ieXRlX3QgKnAgPSBkYXRhOworICAgIGludCBsZWZ0ID0gbmJ5dGVzOworICAgIGludCBvZmZzZXQgPSAocG1zLT5jb3VudFswXSA+PiAzKSAmIDYzOworICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOworCisgICAgaWYgKG5ieXRlcyA8PSAwKQorCXJldHVybjsKKworICAgIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBsZW5ndGguICovCisgICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7CisgICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKKyAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQorCXBtcy0+Y291bnRbMV0rKzsKKworICAgIC8qIFByb2Nlc3MgYW4gaW5pdGlhbCBwYXJ0aWFsIGJsb2NrLiAqLworICAgIGlmIChvZmZzZXQpIHsKKwlpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKKworCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7CisJaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKKwkgICAgcmV0dXJuOworCXAgKz0gY29weTsKKwlsZWZ0IC09IGNvcHk7CisJbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7CisgICAgfQorCisgICAgLyogUHJvY2VzcyBmdWxsIGJsb2Nrcy4gKi8KKyAgICBmb3IgKDsgbGVmdCA+PSA2NDsgcCArPSA2NCwgbGVmdCAtPSA2NCkKKwltZDVfcHJvY2VzcyhwbXMsIHApOworCisgICAgLyogUHJvY2VzcyBhIGZpbmFsIHBhcnRpYWwgYmxvY2suICovCisgICAgaWYgKGxlZnQpCisJbWVtY3B5KHBtcy0+YnVmLCBwLCBsZWZ0KTsKK30KKwordm9pZAorbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pCit7CisgICAgc3RhdGljIGNvbnN0IG1kNV9ieXRlX3QgcGFkWzY0XSA9IHsKKwkweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBtZDVfYnl0ZV90IGRhdGFbOF07CisgICAgaW50IGk7CisKKyAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwlkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KKyAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7CisgICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCisgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQorCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNS5oIGIvTW9kdWxlcy9tZDUuaAppbmRleCAxMzYyOGRmLi41ZWI2ZDZjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21kNS5oCisrKyBiL01vZHVsZXMvbWQ1LmgKQEAgLTEsNjIgKzEsOTEgQEAKLS8qIE1ENS5IIC0gaGVhZGVyIGZpbGUgZm9yIE1ENUMuQworLyoKKyAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBMLiBQZXRlciBEZXV0c2NoCisgIGdob3N0QGFsYWRkaW4uY29tCisKKyAqLworLyogJElkJCAqLworLyoKKyAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCisKKyAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKKyAgdGV4dCBpcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAorICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCisgIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQorICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCisgIGNvcHlyaWdodGVkLgorCisgIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuaCBpcyBMLiBQZXRlciBEZXV0c2NoCisgIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgorCisgIDIwMDItMDQtMTMgbHBkIFJlbW92ZWQgc3VwcG9ydCBmb3Igbm9uLUFOU0kgY29tcGlsZXJzOyByZW1vdmVkCisJcmVmZXJlbmNlcyB0byBHaG9zdHNjcmlwdDsgY2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsKKwlub3cgaGFuZGxlcyBieXRlIG9yZGVyIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LgorICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KKyAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KTsKKwlhZGRlZCBjb25kaXRpb25hbGl6YXRpb24gZm9yIEMrKyBjb21waWxhdGlvbiBmcm9tIE1hcnRpbgorCVB1cnNjaGtlIDxwdXJzY2hrZUBibmwuZ292Pi4KKyAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KICAqLwogCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4KKyNpZm5kZWYgbWQ1X0lOQ0xVREVECisjICBkZWZpbmUgbWQ1X0lOQ0xVREVECiAKLUxpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0Ci1pcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0Ci1BbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKLW9yIHRoaXMgZnVuY3Rpb24uCi0KLUxpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCi10aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKLVNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAotbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgotCi1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgY29uY2VybmluZyBlaXRoZXIKLXRoZSBtZXJjaGFudGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBvciB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcwotc29mdHdhcmUgZm9yIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLXdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5IG9mIGFueSBraW5kLgotCi1UaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCi1kb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKy8qCisgKiBUaGlzIHBhY2thZ2Ugc3VwcG9ydHMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGRldGVybWluYXRpb24gb2YgQ1BVCisgKiBieXRlIG9yZGVyLiAgSWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQgYXMgMCwgdGhlIGNvZGUgd2lsbCBiZQorICogY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gbGl0dGxlLWVuZGlhbiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMKKyAqIGRlZmluZWQgYXMgbm9uLXplcm8sIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8gcnVuIG9ubHkgb24gYmlnLWVuZGlhbgorICogQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvCisgKiBydW4gb24gZWl0aGVyIGJpZy0gb3IgbGl0dGxlLWVuZGlhbiBDUFVzLCBidXQgd2lsbCBydW4gc2xpZ2h0bHkgbGVzcworICogZWZmaWNpZW50bHkgb24gZWl0aGVyIG9uZSB0aGFuIGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkLgogICovCiAKLS8qID09PT09PT09PT0gaW5jbHVkZSBnbG9iYWwuaCA9PT09PT09PT09ICovCi0vKiBHTE9CQUwuSCAtIFJTQVJFRiB0eXBlcyBhbmQgY29uc3RhbnRzCi0gKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBtZDVfYnl0ZV90OyAvKiA4LWJpdCBieXRlICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBtZDVfd29yZF90OyAvKiAzMi1iaXQgd29yZCAqLwogCi0vKiBQT0lOVEVSIGRlZmluZXMgYSBnZW5lcmljIHBvaW50ZXIgdHlwZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICpQT0lOVEVSOworLyogRGVmaW5lIHRoZSBzdGF0ZSBvZiB0aGUgTUQ1IEFsZ29yaXRobS4gKi8KK3R5cGVkZWYgc3RydWN0IG1kNV9zdGF0ZV9zIHsKKyAgICBtZDVfd29yZF90IGNvdW50WzJdOwkvKiBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzLCBsc3cgZmlyc3QgKi8KKyAgICBtZDVfd29yZF90IGFiY2RbNF07CQkvKiBkaWdlc3QgYnVmZmVyICovCisgICAgbWQ1X2J5dGVfdCBidWZbNjRdOwkJLyogYWNjdW11bGF0ZSBibG9jayAqLworfSBtZDVfc3RhdGVfdDsKIAotLyogVUlOVDQgZGVmaW5lcyBhIGZvdXIgYnl0ZSB3b3JkICovCi0jaWYgU0laRU9GX0xPTkcgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBVSU5UNDsKLSNlbGlmIFNJWkVPRl9TSE9SVCA9PSA0Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBVSU5UNDsKLSNlbGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDQ7Ci0jZWxzZQotI2Vycm9yICJDYW4ndCBmaW5kIGEgNC1ieXRlIGludGVncmFsIHR5cGUiCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgCit7CiAjZW5kaWYKIAotLyogPT09PT09PT09PSBFbmQgZ2xvYmFsLmg7IGNvbnRpbnVlIG1kNS5oID09PT09PT09PT0gKi8KKy8qIEluaXRpYWxpemUgdGhlIGFsZ29yaXRobS4gKi8KK3ZvaWQgbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcyk7CiAKLS8qIE1ENSBjb250ZXh0LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQ0IHN0YXRlWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGUgKEFCQ0QpICovCi0gICAgVUlOVDQgY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls2NF07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwotfSBNRDVfQ1RYOworLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBtZXNzYWdlLiAqLwordm9pZCBtZDVfYXBwZW5kKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEsIGludCBuYnl0ZXMpOwogCi0vKiBSZW5hbWUgYWxsIGV4cG9ydGVkIHN5bWJvbHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc2ltaWxhcmx5IG5hbWVkCi0gICBzeW1ib2xzIGluIHNvbWUgc3lzdGVtcycgc3RhbmRhcmQgQyBsaWJyYXJpZXMuLi4gKi8KKy8qIEZpbmlzaCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBkaWdlc3QuICovCit2b2lkIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKTsKIAotI2RlZmluZSBNRDVJbml0IF9QeV9NRDVJbml0Ci0jZGVmaW5lIE1ENVVwZGF0ZSBfUHlfTUQ1VXBkYXRlCi0jZGVmaW5lIE1ENUZpbmFsIF9QeV9NRDVGaW5hbAorI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvKiBlbmQgZXh0ZXJuICJDIiAqLworI2VuZGlmCiAKLXZvaWQgTUQ1SW5pdChNRDVfQ1RYICopOwotdm9pZCBNRDVVcGRhdGUoTUQ1X0NUWCAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7Ci12b2lkIE1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgWzE2XSwgTUQ1X0NUWCAqKTsKKyNlbmRpZiAvKiBtZDVfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1Yy5jIGIvTW9kdWxlcy9tZDVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGRmZGIuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9tZDVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyogTUQ1Qy5DIC0gUlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0KLSAqLwotCi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4KLQotTGljZW5zZSB0byBjb3B5IGFuZCB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBncmFudGVkIHByb3ZpZGVkIHRoYXQgaXQKLWlzIGlkZW50aWZpZWQgYXMgdGhlICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZS1EaWdlc3QKLUFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsIG1lbnRpb25pbmcgb3IgcmVmZXJlbmNpbmcgdGhpcyBzb2Z0d2FyZQotb3IgdGhpcyBmdW5jdGlvbi4KLQotTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKLXRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQotU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCi1tZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCi0KLVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgotdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCi1zb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCi0KLVRoZXNlIG5vdGljZXMgbXVzdCBiZSByZXRhaW5lZCBpbiBhbnkgY29waWVzIG9mIGFueSBwYXJ0IG9mIHRoaXMKLWRvY3VtZW50YXRpb24gYW5kL29yIHNvZnR3YXJlLgotICovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJtZDUuaCIKLQotLyogQ29uc3RhbnRzIGZvciBNRDVUcmFuc2Zvcm0gcm91dGluZS4gKi8KLQotI2RlZmluZSBTMTEgNwotI2RlZmluZSBTMTIgMTIKLSNkZWZpbmUgUzEzIDE3Ci0jZGVmaW5lIFMxNCAyMgotI2RlZmluZSBTMjEgNQotI2RlZmluZSBTMjIgOQotI2RlZmluZSBTMjMgMTQKLSNkZWZpbmUgUzI0IDIwCi0jZGVmaW5lIFMzMSA0Ci0jZGVmaW5lIFMzMiAxMQotI2RlZmluZSBTMzMgMTYKLSNkZWZpbmUgUzM0IDIzCi0jZGVmaW5lIFM0MSA2Ci0jZGVmaW5lIFM0MiAxMAotI2RlZmluZSBTNDMgMTUKLSNkZWZpbmUgUzQ0IDIxCi0KLXN0YXRpYyB2b2lkIE1ENVRyYW5zZm9ybShVSU5UNFs0XSwgdW5zaWduZWQgY2hhcls2NF0pOwotCi0KLS8qIEVuY29kZXMgaW5wdXQgKFVJTlQ0KSBpbnRvIG91dHB1dCAodW5zaWduZWQgY2hhcikuIEFzc3VtZXMgbGVuIGlzCi0gICBhIG11bHRpcGxlIG9mIDQuCi0gKi8KLXN0YXRpYyB2b2lkCi1FbmNvZGUodW5zaWduZWQgY2hhciAqb3V0cHV0LCBVSU5UNCAqaW5wdXQsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gICAgdW5zaWduZWQgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwLCBqID0gMDsgaiA8IGxlbjsgaSsrLCBqICs9IDQpIHsKLSAgICAgICAgb3V0cHV0W2pdID0gKHVuc2lnbmVkIGNoYXIpKGlucHV0W2ldICYgMHhmZik7Ci0gICAgICAgIG91dHB1dFtqKzFdID0gKHVuc2lnbmVkIGNoYXIpKChpbnB1dFtpXSA+PiA4KSAmIDB4ZmYpOwotICAgICAgICBvdXRwdXRbaisyXSA9ICh1bnNpZ25lZCBjaGFyKSgoaW5wdXRbaV0gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgIG91dHB1dFtqKzNdID0gKHVuc2lnbmVkIGNoYXIpKChpbnB1dFtpXSA+PiAyNCkgJiAweGZmKTsKLSAgICB9Ci19Ci0KLQotLyogRGVjb2RlcyBpbnB1dCAodW5zaWduZWQgY2hhcikgaW50byBvdXRwdXQgKFVJTlQ0KS4gQXNzdW1lcyBsZW4gaXMKLSAgIGEgbXVsdGlwbGUgb2YgNC4KLSAqLwotc3RhdGljIHZvaWQKLURlY29kZShVSU5UNCAqb3V0cHV0LCB1bnNpZ25lZCBjaGFyICppbnB1dCwgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgbGVuOyBpKyssIGogKz0gNCkgewotICAgICAgICBvdXRwdXRbaV0gPSAoKFVJTlQ0KWlucHV0W2pdKSB8ICgoKFVJTlQ0KWlucHV0W2orMV0pIDw8IDgpIHwKLSAgICAgICAgICAgICgoKFVJTlQ0KWlucHV0W2orMl0pIDw8IDE2KSB8ICgoKFVJTlQ0KWlucHV0W2orM10pIDw8IDI0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFERElOR1s2NF0gPSB7Ci0gICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLS8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuICovCi0jZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQotI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiAofnopKSkKLSNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCi0KLS8qIFJPVEFURV9MRUZUIHJvdGF0ZXMgeCBsZWZ0IG4gYml0cy4gKi8KLSNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyLShuKSkpKQotCi0vKiBGRiwgR0csIEhILCBhbmQgSUkgdHJhbnNmb3JtYXRpb25zIGZvciByb3VuZHMgMSwgMiwgMywgYW5kIDQuCi0gICBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbi4KLSAqLwotI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCi0gICAgIChhKSArPSBGICgoYiksIChjKSwgKGQpKSArICh4KSArIChVSU5UNCkoYWMpOyBcCi0gICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgICAgKGEpICs9IChiKTsgXAotICAgIH0KLSNkZWZpbmUgR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHsgXAotICAgICAoYSkgKz0gRyAoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAoVUlOVDQpKGFjKTsgXAotICAgICAoYSkgPSBST1RBVEVfTEVGVCAoKGEpLCAocykpOyBcCi0gICAgIChhKSArPSAoYik7IFwKLSAgICB9Ci0jZGVmaW5lIEhIKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKLSAgICAgKGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQ0KShhYyk7IFwKLSAgICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXAotICAgICAoYSkgKz0gKGIpOyBcCi0gICAgfQotI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyBcCi0gICAgIChhKSArPSBJICgoYiksIChjKSwgKGQpKSArICh4KSArIChVSU5UNCkoYWMpOyBcCi0gICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKLSAgICAgKGEpICs9IChiKTsgXAotICAgIH0KLQotCi0vKiBNRDUgaW5pdGlhbGl6YXRpb24uIEJlZ2lucyBhbiBNRDUgb3BlcmF0aW9uLCB3cml0aW5nIGEgbmV3IGNvbnRleHQuICovCi12b2lkCi1NRDVJbml0KE1ENV9DVFggKmNvbnRleHQpCi17Ci0gICAgY29udGV4dC0+Y291bnRbMF0gPSBjb250ZXh0LT5jb3VudFsxXSA9IDA7Ci0gICAgLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICovCi0gICAgY29udGV4dC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOwotICAgIGNvbnRleHQtPnN0YXRlWzFdID0gMHhlZmNkYWI4OTsKLSAgICBjb250ZXh0LT5zdGF0ZVsyXSA9IDB4OThiYWRjZmU7Ci0gICAgY29udGV4dC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OwotfQotCi0KLS8qIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBDb250aW51ZXMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0Ci0gICBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBkYXRpbmcgdGhlCi0gICBjb250ZXh0LgotICovCi12b2lkCi1NRDVVcGRhdGUoTUQ1X0NUWCAqY29udGV4dCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGludCBpbnB1dExlbikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIHBhcnRMZW47Ci0KLSAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8KLSAgICBpbmRleCA9ICh1bnNpZ25lZCBpbnQpKChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M0YpOwotCi0gICAgLyogVXBkYXRlIG51bWJlciBvZiBiaXRzICovCi0gICAgaWYgKChjb250ZXh0LT5jb3VudFswXSArPSAoKFVJTlQ0KWlucHV0TGVuIDw8IDMpKQotICAgICAgICA8ICgoVUlOVDQpaW5wdXRMZW4gPDwgMykpCi0gICAgICAgIGNvbnRleHQtPmNvdW50WzFdKys7Ci0gICAgY29udGV4dC0+Y291bnRbMV0gKz0gKChVSU5UNClpbnB1dExlbiA+PiAyOSk7Ci0KLSAgICBwYXJ0TGVuID0gNjQgLSBpbmRleDsKLQotICAgIC8qIFRyYW5zZm9ybSBhcyBtYW55IHRpbWVzIGFzIHBvc3NpYmxlLiAqLwotICAgIGlmIChpbnB1dExlbiA+PSBwYXJ0TGVuKSB7Ci0gICAgICAgIG1lbWNweSgoUE9JTlRFUikmY29udGV4dC0+YnVmZmVyW2luZGV4XSwgKFBPSU5URVIpaW5wdXQsIHBhcnRMZW4pOwotICAgICAgICBNRDVUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7Ci0KLSAgICAgICAgZm9yIChpID0gcGFydExlbjsgaSArIDYzIDwgaW5wdXRMZW47IGkgKz0gNjQpCi0gICAgICAgICAgICBNRDVUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZpbnB1dFtpXSk7Ci0KLSAgICAgICAgaW5kZXggPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGkgPSAwOwotCi0gICAgLyogQnVmZmVyIHJlbWFpbmluZyBpbnB1dCAqLwotICAgIG1lbWNweSgoUE9JTlRFUikmY29udGV4dC0+YnVmZmVyW2luZGV4XSwKLSAgICAgICAgICAgICAgIChQT0lOVEVSKSZpbnB1dFtpXSwgaW5wdXRMZW4taSk7Ci19Ci0KLS8qIE1ENSBmaW5hbGl6YXRpb24uIEVuZHMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0IG9wZXJhdGlvbiwgd3JpdGluZyB0aGUKLSAgbWVzc2FnZSBkaWdlc3QgYW5kIHplcm9pbmcgdGhlIGNvbnRleHQuCi0gKi8KLXZvaWQKLU1ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgTUQ1X0NUWCAqY29udGV4dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGJpdHNbOF07Ci0gICAgdW5zaWduZWQgaW50IGluZGV4LCBwYWRMZW47Ci0KLSAgICAvKiBTYXZlIG51bWJlciBvZiBiaXRzICovCi0gICAgRW5jb2RlIChiaXRzLCBjb250ZXh0LT5jb3VudCwgOCk7Ci0KLSAgICAvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NC4gKi8KLSAgICBpbmRleCA9ICh1bnNpZ25lZCBpbnQpKChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M2YpOwotICAgIHBhZExlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgxMjAgLSBpbmRleCk7Ci0gICAgTUQ1VXBkYXRlKGNvbnRleHQsIFBBRERJTkcsIHBhZExlbik7Ci0KLSAgICAvKiBBcHBlbmQgbGVuZ3RoIChiZWZvcmUgcGFkZGluZykgKi8KLSAgICBNRDVVcGRhdGUoY29udGV4dCwgYml0cywgOCk7Ci0KLSAgICAvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KLSAgICBFbmNvZGUoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgMTYpOwotCi0gICAgLyogWmVyb2l6ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi0gICAgbWVtc2V0KChQT0lOVEVSKWNvbnRleHQsIDAsIHNpemVvZiAoKmNvbnRleHQpKTsKLX0KLQotCi0vKiBNRDUgYmFzaWMgdHJhbnNmb3JtYXRpb24uIFRyYW5zZm9ybXMgc3RhdGUgYmFzZWQgb24gYmxvY2suICovCi1zdGF0aWMgdm9pZAotTUQ1VHJhbnNmb3JtKFVJTlQ0IHN0YXRlWzRdLCB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XSkKLXsKLSAgICBVSU5UNCBhID0gc3RhdGVbMF0sIGIgPSBzdGF0ZVsxXSwgYyA9IHN0YXRlWzJdLCBkID0gc3RhdGVbM10sIHhbMTZdOwotCi0gICAgRGVjb2RlICh4LCBibG9jaywgNjQpOwotCi0gICAgLyogUm91bmQgMSAqLwotICAgIEZGKGEsIGIsIGMsIGQsIHhbIDBdLCBTMTEsIDB4ZDc2YWE0NzgpOyAvKiAxICovCi0gICAgRkYoZCwgYSwgYiwgYywgeFsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7IC8qIDIgKi8KLSAgICBGRihjLCBkLCBhLCBiLCB4WyAyXSwgUzEzLCAweDI0MjA3MGRiKTsgLyogMyAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbIDNdLCBTMTQsIDB4YzFiZGNlZWUpOyAvKiA0ICovCi0gICAgRkYoYSwgYiwgYywgZCwgeFsgNF0sIFMxMSwgMHhmNTdjMGZhZik7IC8qIDUgKi8KLSAgICBGRihkLCBhLCBiLCBjLCB4WyA1XSwgUzEyLCAweDQ3ODdjNjJhKTsgLyogNiAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbIDZdLCBTMTMsIDB4YTgzMDQ2MTMpOyAvKiA3ICovCi0gICAgRkYoYiwgYywgZCwgYSwgeFsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7IC8qIDggKi8KLSAgICBGRihhLCBiLCBjLCBkLCB4WyA4XSwgUzExLCAweDY5ODA5OGQ4KTsgLyogOSAqLwotICAgIEZGKGQsIGEsIGIsIGMsIHhbIDldLCBTMTIsIDB4OGI0NGY3YWYpOyAvKiAxMCAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbMTBdLCBTMTMsIDB4ZmZmZjViYjEpOyAvKiAxMSAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbMTFdLCBTMTQsIDB4ODk1Y2Q3YmUpOyAvKiAxMiAqLwotICAgIEZGKGEsIGIsIGMsIGQsIHhbMTJdLCBTMTEsIDB4NmI5MDExMjIpOyAvKiAxMyAqLwotICAgIEZGKGQsIGEsIGIsIGMsIHhbMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpOyAvKiAxNCAqLwotICAgIEZGKGMsIGQsIGEsIGIsIHhbMTRdLCBTMTMsIDB4YTY3OTQzOGUpOyAvKiAxNSAqLwotICAgIEZGKGIsIGMsIGQsIGEsIHhbMTVdLCBTMTQsIDB4NDliNDA4MjEpOyAvKiAxNiAqLwotCi0gICAgLyogUm91bmQgMiAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDFdLCBTMjEsIDB4ZjYxZTI1NjIpOyAvKiAxNyAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbIDZdLCBTMjIsIDB4YzA0MGIzNDApOyAvKiAxOCAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbMTFdLCBTMjMsIDB4MjY1ZTVhNTEpOyAvKiAxOSAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDBdLCBTMjQsIDB4ZTliNmM3YWEpOyAvKiAyMCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDVdLCBTMjEsIDB4ZDYyZjEwNWQpOyAvKiAyMSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbMTBdLCBTMjIsICAweDI0NDE0NTMpOyAvKiAyMiAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbMTVdLCBTMjMsIDB4ZDhhMWU2ODEpOyAvKiAyMyAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDRdLCBTMjQsIDB4ZTdkM2ZiYzgpOyAvKiAyNCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbIDldLCBTMjEsIDB4MjFlMWNkZTYpOyAvKiAyNSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbMTRdLCBTMjIsIDB4YzMzNzA3ZDYpOyAvKiAyNiAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbIDNdLCBTMjMsIDB4ZjRkNTBkODcpOyAvKiAyNyAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbIDhdLCBTMjQsIDB4NDU1YTE0ZWQpOyAvKiAyOCAqLwotICAgIEdHKGEsIGIsIGMsIGQsIHhbMTNdLCBTMjEsIDB4YTllM2U5MDUpOyAvKiAyOSAqLwotICAgIEdHKGQsIGEsIGIsIGMsIHhbIDJdLCBTMjIsIDB4ZmNlZmEzZjgpOyAvKiAzMCAqLwotICAgIEdHKGMsIGQsIGEsIGIsIHhbIDddLCBTMjMsIDB4Njc2ZjAyZDkpOyAvKiAzMSAqLwotICAgIEdHKGIsIGMsIGQsIGEsIHhbMTJdLCBTMjQsIDB4OGQyYTRjOGEpOyAvKiAzMiAqLwotCi0gICAgLyogUm91bmQgMyAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDVdLCBTMzEsIDB4ZmZmYTM5NDIpOyAvKiAzMyAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDhdLCBTMzIsIDB4ODc3MWY2ODEpOyAvKiAzNCAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpOyAvKiAzNSAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbMTRdLCBTMzQsIDB4ZmRlNTM4MGMpOyAvKiAzNiAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDFdLCBTMzEsIDB4YTRiZWVhNDQpOyAvKiAzNyAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDRdLCBTMzIsIDB4NGJkZWNmYTkpOyAvKiAzOCAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbIDddLCBTMzMsIDB4ZjZiYjRiNjApOyAvKiAzOSAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbMTBdLCBTMzQsIDB4YmViZmJjNzApOyAvKiA0MCAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbMTNdLCBTMzEsIDB4Mjg5YjdlYzYpOyAvKiA0MSAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbIDBdLCBTMzIsIDB4ZWFhMTI3ZmEpOyAvKiA0MiAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbIDNdLCBTMzMsIDB4ZDRlZjMwODUpOyAvKiA0MyAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbIDZdLCBTMzQsICAweDQ4ODFkMDUpOyAvKiA0NCAqLwotICAgIEhIKGEsIGIsIGMsIGQsIHhbIDldLCBTMzEsIDB4ZDlkNGQwMzkpOyAvKiA0NSAqLwotICAgIEhIKGQsIGEsIGIsIGMsIHhbMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpOyAvKiA0NiAqLwotICAgIEhIKGMsIGQsIGEsIGIsIHhbMTVdLCBTMzMsIDB4MWZhMjdjZjgpOyAvKiA0NyAqLwotICAgIEhIKGIsIGMsIGQsIGEsIHhbIDJdLCBTMzQsIDB4YzRhYzU2NjUpOyAvKiA0OCAqLwotCi0gICAgLyogUm91bmQgNCAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDBdLCBTNDEsIDB4ZjQyOTIyNDQpOyAvKiA0OSAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbIDddLCBTNDIsIDB4NDMyYWZmOTcpOyAvKiA1MCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbMTRdLCBTNDMsIDB4YWI5NDIzYTcpOyAvKiA1MSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDVdLCBTNDQsIDB4ZmM5M2EwMzkpOyAvKiA1MiAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbMTJdLCBTNDEsIDB4NjU1YjU5YzMpOyAvKiA1MyAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbIDNdLCBTNDIsIDB4OGYwY2NjOTIpOyAvKiA1NCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbMTBdLCBTNDMsIDB4ZmZlZmY0N2QpOyAvKiA1NSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDFdLCBTNDQsIDB4ODU4NDVkZDEpOyAvKiA1NiAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDhdLCBTNDEsIDB4NmZhODdlNGYpOyAvKiA1NyAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbMTVdLCBTNDIsIDB4ZmUyY2U2ZTApOyAvKiA1OCAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbIDZdLCBTNDMsIDB4YTMwMTQzMTQpOyAvKiA1OSAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbMTNdLCBTNDQsIDB4NGUwODExYTEpOyAvKiA2MCAqLwotICAgIElJKGEsIGIsIGMsIGQsIHhbIDRdLCBTNDEsIDB4Zjc1MzdlODIpOyAvKiA2MSAqLwotICAgIElJKGQsIGEsIGIsIGMsIHhbMTFdLCBTNDIsIDB4YmQzYWYyMzUpOyAvKiA2MiAqLwotICAgIElJKGMsIGQsIGEsIGIsIHhbIDJdLCBTNDMsIDB4MmFkN2QyYmIpOyAvKiA2MyAqLwotICAgIElJKGIsIGMsIGQsIGEsIHhbIDldLCBTNDQsIDB4ZWI4NmQzOTEpOyAvKiA2NCAqLwotCi0gICAgc3RhdGVbMF0gKz0gYTsKLSAgICBzdGF0ZVsxXSArPSBiOwotICAgIHN0YXRlWzJdICs9IGM7Ci0gICAgc3RhdGVbM10gKz0gZDsKLQotICAgIC8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLwotICAgIG1lbXNldCgoUE9JTlRFUil4LCAwLCBzaXplb2YgKHgpKTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1bW9kdWxlLmMgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCmluZGV4IGUxMmJlZjguLjVlNGYxMTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWQ1bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tZDVtb2R1bGUuYwpAQCAtMTUsNyArMTUsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAotICAgICAgICBNRDVfQ1RYCW1kNTsJCS8qIHRoZSBjb250ZXh0IGhvbGRlciAqLworICAgICAgICBtZDVfc3RhdGVfdAltZDU7CQkvKiB0aGUgY29udGV4dCBob2xkZXIgKi8KIH0gbWQ1b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1ENXR5cGU7CkBAIC0zMSw3ICszMSw3IEBACiAJaWYgKG1kNXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlNRDVJbml0KCZtZDVwLT5tZDUpOwkvKiBhY3R1YWwgaW5pdGlhbGlzYXRpb24gKi8KKwltZDVfaW5pdCgmbWQ1cC0+bWQ1KTsJLyogYWN0dWFsIGluaXRpYWxpc2F0aW9uICovCiAJcmV0dXJuIG1kNXA7CiB9CiAKQEAgLTU2LDcgKzU2LDcgQEAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnVwZGF0ZSIsICZjcCwgJmxlbikpCiAJCXJldHVybiBOVUxMOwogCi0JTUQ1VXBkYXRlKCZzZWxmLT5tZDUsIGNwLCBsZW4pOworCW1kNV9hcHBlbmQoJnNlbGYtPm1kNSwgY3AsIGxlbik7CiAKIAlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJcmV0dXJuIFB5X05vbmU7CkBAIC03MywxMiArNzMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfZGlnZXN0KG1kNW9iamVjdCAqc2VsZikKIHsKLSAJTUQ1X0NUWCBtZENvbnRleHQ7CisgCW1kNV9zdGF0ZV90IG1kQ29udGV4dDsKIAl1bnNpZ25lZCBjaGFyIGFEaWdlc3RbMTZdOwogCiAJLyogbWFrZSBhIHRlbXBvcmFyeSBjb3B5LCBhbmQgcGVyZm9ybSB0aGUgZmluYWwgKi8KIAltZENvbnRleHQgPSBzZWxmLT5tZDU7Ci0JTUQ1RmluYWwoYURpZ2VzdCwgJm1kQ29udGV4dCk7CisJbWQ1X2ZpbmlzaCgmbWRDb250ZXh0LCBhRGlnZXN0KTsKIAogCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWFEaWdlc3QsIDE2KTsKIH0KQEAgLTk0LDE0ICs5NCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1kNV9oZXhkaWdlc3QobWQ1b2JqZWN0ICpzZWxmKQogewotIAlNRDVfQ1RYIG1kQ29udGV4dDsKKyAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKIAl1bnNpZ25lZCBjaGFyIGhleGRpZ2VzdFszMl07CiAJaW50IGksIGo7CiAKIAkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwogCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQlNRDVGaW5hbChkaWdlc3QsICZtZENvbnRleHQpOworCW1kNV9maW5pc2goJm1kQ29udGV4dCwgZGlnZXN0KTsKIAogCS8qIE1ha2UgaGV4IHZlcnNpb24gb2YgdGhlIGRpZ2VzdCAqLwogCWZvcihpPWo9MDsgaTwxNjsgaSsrKSB7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoY3ApCi0JCU1ENVVwZGF0ZSgmbWQ1cC0+bWQ1LCBjcCwgbGVuKTsKKwkJbWQ1X2FwcGVuZCgmbWQ1cC0+bWQ1LCBjcCwgbGVuKTsKIAogCXJldHVybiAoUHlPYmplY3QgKiltZDVwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vcGVyYXRvci5jIGIvTW9kdWxlcy9vcGVyYXRvci5jCmluZGV4IDI0ZjRlMGEuLmNiY2UxNmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3BlcmF0b3IuYworKysgYi9Nb2R1bGVzL29wZXJhdG9yLmMKQEAgLTM1NCw4ICszNTQsNyBAQAogc3RhdGljIGludAogaXRlbWdldHRlcl90cmF2ZXJzZShpdGVtZ2V0dGVyb2JqZWN0ICppZywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGlnLT5pdGVtKQotCQlyZXR1cm4gdmlzaXQoaWctPml0ZW0sIGFyZyk7CisJUHlfVklTSVQoaWctPml0ZW0pOwogCXJldHVybiAwOwogfQogCkBAIC00OTMsOCArNDkyLDcgQEAKIHN0YXRpYyBpbnQKIGF0dHJnZXR0ZXJfdHJhdmVyc2UoYXR0cmdldHRlcm9iamVjdCAqYWcsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChhZy0+YXR0cikKLQkJcmV0dXJuIHZpc2l0KGFnLT5hdHRyLCBhcmcpOworCVB5X1ZJU0lUKGFnLT5hdHRyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vc3NhdWRpb2Rldi5jIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCmluZGV4IGNlOGEwZDAuLjU2MzYyMGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYworKysgYi9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKQEAgLTkzNSwyNCArOTM1LDMyIEBACiAKICAgICBsYWJlbHMgPSBQeUxpc3RfTmV3KG51bV9jb250cm9scyk7CiAgICAgbmFtZXMgPSBQeUxpc3RfTmV3KG51bV9jb250cm9scyk7CisgICAgaWYgKGxhYmVscyA9PSBOVUxMIHx8IG5hbWVzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3IyOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbHM7IGkrKykgewogICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb250cm9sX2xhYmVsc1tpXSk7CiAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxhYmVscywgaSwgcyk7CiAKICAgICAgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY29udHJvbF9uYW1lc1tpXSk7CiAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBnb3RvIGVycm9yMjsKICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKG5hbWVzLCBpLCBzKTsKICAgICB9CiAKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgImNvbnRyb2xfbGFiZWxzIiwgbGFiZWxzKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBnb3RvIGVycm9yMjsKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgImNvbnRyb2xfbmFtZXMiLCBuYW1lcykgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZ290byBlcnJvcjE7CiAKICAgICByZXR1cm4gMDsKKworZXJyb3IyOgorICAgIFB5X1hERUNSRUYobGFiZWxzKTsKK2Vycm9yMToKKyAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKaW5kZXggODMxNjViYS4uYzllZGFlNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCkBAIC02NTcsOSArNjU3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFvaykgewotICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJvcyIsIGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBub2RlIGNvbnN0cnVjdC4iKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgib3MiLCBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgbm9kZSBjb25zdHJ1Y3QuIik7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLCBlcnIpOworICAgICAgICAgICAgUHlfWERFQ1JFRihlcnIpOwogICAgICAgICAgICAgUHlfWERFQ1JFRihlbGVtKTsKICAgICAgICAgICAgIHJldHVybiAoMCk7CiAgICAgICAgIH0KQEAgLTcwMCw3ICs3MDEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRlbXApICsgMTsKLSAgICAgICAgICAgIHN0cm4gPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4pOworICAgICAgICAgICAgc3RybiA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKGxlbik7CiAgICAgICAgICAgICBpZiAoc3RybiAhPSBOVUxMKQogICAgICAgICAgICAgICAgICh2b2lkKSBtZW1jcHkoc3RybiwgUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApLCBsZW4pOwogICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOwpAQCAtNzEwLDE4ICs3MTEsMTkgQEAKICAgICAgICAgICAgICAqICBJdCBoYXMgdG8gYmUgb25lIG9yIHRoZSBvdGhlcjsgdGhpcyBpcyBhbiBlcnJvci4KICAgICAgICAgICAgICAqICBUaHJvdyBhbiBleGNlcHRpb24uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgib3MiLCBlbGVtLCAidW5rbm93biBub2RlIHR5cGUuIikpOworICAgICAgICAgICAgUHlPYmplY3QgKmVyciA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgZWxlbSwgInVua25vd24gbm9kZSB0eXBlLiIpOworICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgZXJyKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZXJyKTsKICAgICAgICAgICAgIFB5X1hERUNSRUYoZWxlbSk7CiAgICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgICB9CiAgICAgICAgIGVyciA9IFB5Tm9kZV9BZGRDaGlsZChyb290LCB0eXBlLCBzdHJuLCAqbGluZV9udW0sIDApOwogICAgICAgICBpZiAoZXJyID09IEVfTk9NRU0pIHsKLSAgICAgICAgICAgIFB5TWVtX0RFTChzdHJuKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoc3Rybik7CiAgICAgICAgICAgICByZXR1cm4gKG5vZGUgKikgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXJyID09IEVfT1ZFUkZMT1cpIHsKLSAgICAgICAgICAgIFB5TWVtX0RFTChzdHJuKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoc3Rybik7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc0MCw3ICs3NDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYoZWxlbSk7CiAgICAgfQotICAgIHJldHVybiAocm9vdCk7CisgICAgcmV0dXJuIHJvb3Q7CiB9CiAKIApAQCAtNzYyLDYgKzc2NCw3IEBACiAgICAgICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgib3MiLCB0dXBsZSwKICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgc3ludGF4LXRyZWU7IGNhbm5vdCBzdGFydCB3aXRoIHRlcm1pbmFsIHN5bWJvbC4iKTsKICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgdHVwbGUpOworICAgICAgICBQeV9YREVDUkVGKHR1cGxlKTsKICAgICB9CiAgICAgZWxzZSBpZiAoSVNOT05URVJNSU5BTChudW0pKSB7CiAgICAgICAgIC8qCkBAIC03ODQsNyArNzg3LDcgQEAKICAgICAgICAgICAgIGlmIChyZXMgJiYgZW5jb2RpbmcpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICAgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShlbmNvZGluZykgKyAxOwotICAgICAgICAgICAgICAgIHJlcy0+bl9zdHIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW4pOworICAgICAgICAgICAgICAgIHJlcy0+bl9zdHIgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhsZW4pOwogICAgICAgICAgICAgICAgIGlmIChyZXMtPm5fc3RyICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtZW1jcHkocmVzLT5uX3N0ciwgUHlTdHJpbmdfQVNfU1RSSU5HKGVuY29kaW5nKSwgbGVuKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZW5jb2RpbmcpOwpAQCAtNzkyLDE0ICs3OTUsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlCisgICAgZWxzZSB7CiAgICAgICAgIC8qICBUaGUgdHVwbGUgaXMgaWxsZWdhbCAtLSBpZiB0aGUgbnVtYmVyIGlzIG5laXRoZXIgVEVSTUlOQUwgbm9yCiAgICAgICAgICAqICBOT05URVJNSU5BTCwgd2UgY2FuJ3QgdXNlIGl0LiAgTm90IHN1cmUgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAqICBhbGxvd3MgdGhpcyBjb25kaXRpb24sIGJ1dCB0aGUgQVBJIGRvZXNuJ3QgcHJlY2x1ZGUgaXQuCiAgICAgICAgICAqLwotICAgICAgICBQeUVycl9TZXRPYmplY3QocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgib3MiLCB0dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgY29tcG9uZW50IHR1cGxlLiIpKTsKKyAgICAgICAgUHlPYmplY3QgKmVyciA9IFB5X0J1aWxkVmFsdWUoIm9zIiwgdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIGNvbXBvbmVudCB0dXBsZS4iKTsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHBhcnNlcl9lcnJvciwgZXJyKTsKKyAgICAgICAgUHlfWERFQ1JFRihlcnIpOworICAgIH0KIAogICAgIHJldHVybiAocmVzKTsKIH0KQEAgLTEzMjEsNyArMTMyNiw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotLyogIGxpc3RfaWY6ICAnaWYnIHRlc3QgW2xpc3RfaXRlcl0KKy8qICBsaXN0X2lmOiAgJ2lmJyBvbGRfdGVzdCBbbGlzdF9pdGVyXQogICovCiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9saXN0X2lmKG5vZGUgKnRyZWUpCkBAIC0xMzM2LDEyICsxMzQxLDEyIEBACiAKICAgICBpZiAocmVzKQogICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX29sZF90ZXN0KENISUxEKHRyZWUsIDEpKSk7CiAKICAgICByZXR1cm4gcmVzOwogfQogCi0vKiAgZ2VuX2lmOiAgJ2lmJyB0ZXN0IFtnZW5faXRlcl0KKy8qICBnZW5faWY6ICAnaWYnIG9sZF90ZXN0IFtnZW5faXRlcl0KICAqLwogc3RhdGljIGludAogdmFsaWRhdGVfZ2VuX2lmKG5vZGUgKnRyZWUpCkBAIC0xMzU2LDcgKzEzNjEsNyBAQAogICAgIAogICAgIGlmIChyZXMpCiAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAxKSkpOworICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfb2xkX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKIAogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggMWZiYzM1My4uYjUxYmE1ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtMjIsNiArMjIsMTAgQEAKICMgICAgaW5jbHVkZSA8dW5peGlvLmg+CiAjZW5kaWYgLyogZGVmaW5lZChfX1ZNUykgKi8KIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiBQeURvY19TVFJWQVIocG9zaXhfX2RvY19fLAogIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byBvcGVyYXRpbmcgc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdGhhdCBpc1xuXAogc3RhbmRhcmRpemVkIGJ5IHRoZSBDIFN0YW5kYXJkIGFuZCB0aGUgUE9TSVggc3RhbmRhcmQgKGEgdGhpbmx5XG5cCkBAIC0yNjQsNiArMjY4LDEyIEBACiAjZGVmaW5lIFdURVJNU0lHKHVfd2FpdCkgKCh1X3dhaXQpLndfdGVybXNpZykKICNlbmRpZgogCisjZGVmaW5lIFdBSVRfVFlQRSB1bmlvbiB3YWl0CisjZGVmaW5lIFdBSVRfU1RBVFVTX0lOVChzKSAocy53X3N0YXR1cykKKworI2Vsc2UgLyogIVVOSU9OX1dBSVQgKi8KKyNkZWZpbmUgV0FJVF9UWVBFIGludAorI2RlZmluZSBXQUlUX1NUQVRVU19JTlQocykgKHMpCiAjZW5kaWYgLyogVU5JT05fV0FJVCAqLwogCiAvKiBEb24ndCB1c2UgdGhlICJfciIgZm9ybSBpZiB3ZSBkb24ndCBuZWVkIGl0IChhbHNvLCB3b24ndCBoYXZlIGEKQEAgLTk3MSw2ICs5ODEsNyBAQAogCTEwCiB9OwogCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdGF0UmVzdWx0VHlwZTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RhdFZGU1Jlc3VsdFR5cGU7CiBzdGF0aWMgbmV3ZnVuYyBzdHJ1Y3RzZXFfbmV3OwpAQCAtMTgzOSw2ICsxODUwLDcgQEAKIAlzdHJ1Y3QgZGlyZW50ICplcDsKIAlpbnQgYXJnX2lzX3VuaWNvZGUgPSAxOwogCisJZXJybm8gPSAwOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVTpsaXN0ZGlyIiwgJnYpKSB7CiAJCWFyZ19pc191bmljb2RlID0gMDsKIAkJUHlFcnJfQ2xlYXIoKTsKQEAgLTE4OTUsNiArMTkwNywxMiBAQAogCQl9CiAJCVB5X0RFQ1JFRih2KTsKIAl9CisJaWYgKGVycm5vICE9IDAgJiYgZCAhPSBOVUxMKSB7CisJCS8qIHJlYWRkaXIoKSByZXR1cm5lZCBOVUxMIGFuZCBzZXQgZXJybm8gKi8KKwkJY2xvc2VkaXIoZGlycCk7CisJCVB5X0RFQ1JFRihkKTsKKwkJcmV0dXJuIHBvc2l4X2Vycm9yX3dpdGhfYWxsb2NhdGVkX2ZpbGVuYW1lKG5hbWUpOyAKKwl9CiAJY2xvc2VkaXIoZGlycCk7CiAJUHlNZW1fRnJlZShuYW1lKTsKIApAQCAtMTk5NSwxMyArMjAxMywxMyBAQAogfQogCiAKLSNpZmRlZiBIQVZFX05JQ0UKLSNpZiBkZWZpbmVkKEhBVkVfQlJPS0VOX05JQ0UpICYmIGRlZmluZWQoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKLSNpZiBkZWZpbmVkKEhBVkVfR0VUUFJJT1JJVFkpICYmICFkZWZpbmVkKFBSSU9fUFJPQ0VTUykKKy8qIHN5cy9yZXNvdXJjZS5oIGlzIG5lZWRlZCBmb3IgYXQgbGVhc3Q6IHdhaXQzKCksIHdhaXQ0KCksIGJyb2tlbiBuaWNlLiAqLworI2lmIGRlZmluZWQoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNlbmRpZgotI2VuZGlmCiAKKworI2lmZGVmIEhBVkVfTklDRQogUHlEb2NfU1RSVkFSKHBvc2l4X25pY2VfX2RvY19fLAogIm5pY2UoaW5jKSAtPiBuZXdfcHJpb3JpdHlcblxuXAogRGVjcmVhc2UgdGhlIHByaW9yaXR5IG9mIHByb2Nlc3MgYnkgaW5jIGFuZCByZXR1cm4gdGhlIG5ldyBwcmlvcml0eS4iKTsKQEAgLTMwODgsNyArMzEwNiw3IEBACiAjaWYgZGVmaW5lZChIQVZFX0RFVl9QVE1YKSAmJiAhZGVmaW5lZChIQVZFX09QRU5QVFkpICYmICFkZWZpbmVkKEhBVkVfX0dFVFBUWSkKIAlQeU9TX3NpZ2hhbmRsZXJfdCBzaWdfc2F2ZWQ7CiAjaWZkZWYgc3VuCi0JZXh0ZXJuIGNoYXIgKnB0c25hbWUoKTsKKwlleHRlcm4gY2hhciAqcHRzbmFtZShpbnQgZmlsZGVzKTsKICNlbmRpZgogI2VuZGlmCiAKQEAgLTUwOTEsNiArNTEwOSwxMTQgQEAKIH0KICNlbmRpZiAvKiBIQVZFX1NFVEdST1VQUyAqLwogCisjaWYgZGVmaW5lZChIQVZFX1dBSVQzKSB8fCBkZWZpbmVkKEhBVkVfV0FJVDQpCitzdGF0aWMgUHlPYmplY3QgKgord2FpdF9oZWxwZXIoaW50IHBpZCwgaW50IHN0YXR1cywgc3RydWN0IHJ1c2FnZSAqcnUpCit7CisJUHlPYmplY3QgKnJlc3VsdDsKKyAgIAlzdGF0aWMgUHlPYmplY3QgKnN0cnVjdF9ydXNhZ2U7CisKKwlpZiAocGlkID09IC0xKQorCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKKworCWlmIChzdHJ1Y3RfcnVzYWdlID09IE5VTEwpIHsKKwkJUHlPYmplY3QgKm0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInJlc291cmNlIik7CisJCWlmIChtID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3RydWN0X3J1c2FnZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobSwgInN0cnVjdF9ydXNhZ2UiKTsKKwkJUHlfREVDUkVGKG0pOworCQlpZiAoc3RydWN0X3J1c2FnZSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogWFhYKG5ub3J3aXR6KTogQ29waWVkICh3L21vZHMpIGZyb20gcmVzb3VyY2UuYywgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLiAqLworCXJlc3VsdCA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KChQeVR5cGVPYmplY3QqKSBzdHJ1Y3RfcnVzYWdlKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZm5kZWYgZG91YmxldGltZQorI2RlZmluZSBkb3VibGV0aW1lKFRWKSAoKGRvdWJsZSkoVFYpLnR2X3NlYyArIChUVikudHZfdXNlYyAqIDAuMDAwMDAxKQorI2VuZGlmCisKKwlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMCwKKwkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LT5ydV91dGltZSkpKTsKKwlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMSwKKwkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LT5ydV9zdGltZSkpKTsKKyNkZWZpbmUgU0VUX0lOVChyZXN1bHQsIGluZGV4LCB2YWx1ZSlcCisJCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCBpbmRleCwgUHlJbnRfRnJvbUxvbmcodmFsdWUpKQorCVNFVF9JTlQocmVzdWx0LCAyLCBydS0+cnVfbWF4cnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgMywgcnUtPnJ1X2l4cnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNCwgcnUtPnJ1X2lkcnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNSwgcnUtPnJ1X2lzcnNzKTsKKwlTRVRfSU5UKHJlc3VsdCwgNiwgcnUtPnJ1X21pbmZsdCk7CisJU0VUX0lOVChyZXN1bHQsIDcsIHJ1LT5ydV9tYWpmbHQpOworCVNFVF9JTlQocmVzdWx0LCA4LCBydS0+cnVfbnN3YXApOworCVNFVF9JTlQocmVzdWx0LCA5LCBydS0+cnVfaW5ibG9jayk7CisJU0VUX0lOVChyZXN1bHQsIDEwLCBydS0+cnVfb3VibG9jayk7CisJU0VUX0lOVChyZXN1bHQsIDExLCBydS0+cnVfbXNnc25kKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTIsIHJ1LT5ydV9tc2dyY3YpOworCVNFVF9JTlQocmVzdWx0LCAxMywgcnUtPnJ1X25zaWduYWxzKTsKKwlTRVRfSU5UKHJlc3VsdCwgMTQsIHJ1LT5ydV9udmNzdyk7CisJU0VUX0lOVChyZXN1bHQsIDE1LCBydS0+cnVfbml2Y3N3KTsKKyN1bmRlZiBTRVRfSU5UCisKKwlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeV9ERUNSRUYocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpTiIsIHBpZCwgc3RhdHVzLCByZXN1bHQpOworfQorI2VuZGlmIC8qIEhBVkVfV0FJVDMgfHwgSEFWRV9XQUlUNCAqLworCisjaWZkZWYgSEFWRV9XQUlUMworUHlEb2NfU1RSVkFSKHBvc2l4X3dhaXQzX19kb2NfXywKKyJ3YWl0MyhvcHRpb25zKSAtPiAocGlkLCBzdGF0dXMsIHJ1c2FnZSlcblxuXAorV2FpdCBmb3IgY29tcGxldGlvbiBvZiBhIGNoaWxkIHByb2Nlc3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitwb3NpeF93YWl0MyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJaW50IHBpZCwgb3B0aW9uczsKKwlzdHJ1Y3QgcnVzYWdlIHJ1OworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOndhaXQzIiwgJm9wdGlvbnMpKQorCQlyZXR1cm4gTlVMTDsKKworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwlwaWQgPSB3YWl0Mygmc3RhdHVzLCBvcHRpb25zLCAmcnUpOworCVB5X0VORF9BTExPV19USFJFQURTCisKKwlyZXR1cm4gd2FpdF9oZWxwZXIocGlkLCBXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSwgJnJ1KTsKK30KKyNlbmRpZiAvKiBIQVZFX1dBSVQzICovCisKKyNpZmRlZiBIQVZFX1dBSVQ0CitQeURvY19TVFJWQVIocG9zaXhfd2FpdDRfX2RvY19fLAorIndhaXQ0KHBpZCwgb3B0aW9ucykgLT4gKHBpZCwgc3RhdHVzLCBydXNhZ2UpXG5cblwKK1dhaXQgZm9yIGNvbXBsZXRpb24gb2YgYSBnaXZlbiBjaGlsZCBwcm9jZXNzLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorcG9zaXhfd2FpdDQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCWludCBwaWQsIG9wdGlvbnM7CisJc3RydWN0IHJ1c2FnZSBydTsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6d2FpdDQiLCAmcGlkLCAmb3B0aW9ucykpCisJCXJldHVybiBOVUxMOworCisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCXBpZCA9IHdhaXQ0KHBpZCwgJnN0YXR1cywgb3B0aW9ucywgJnJ1KTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCisJcmV0dXJuIHdhaXRfaGVscGVyKHBpZCwgV0FJVF9TVEFUVVNfSU5UKHN0YXR1cyksICZydSk7Cit9CisjZW5kaWYgLyogSEFWRV9XQUlUNCAqLworCiAjaWZkZWYgSEFWRV9XQUlUUElECiBQeURvY19TVFJWQVIocG9zaXhfd2FpdHBpZF9fZG9jX18sCiAid2FpdHBpZChwaWQsIG9wdGlvbnMpIC0+IChwaWQsIHN0YXR1cylcblxuXApAQCAtNTEwMCwxNCArNTIyNiw4IEBACiBwb3NpeF93YWl0cGlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlpbnQgcGlkLCBvcHRpb25zOwotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOndhaXRwaWQiLCAmcGlkLCAmb3B0aW9ucykpCiAJCXJldHVybiBOVUxMOwpAQCAtNTExNiw4ICs1MjM2LDggQEAKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChwaWQgPT0gLTEpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXNfaSk7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCBwaWQsIFdBSVRfU1RBVFVTX0lOVChzdGF0dXMpKTsKIH0KIAogI2VsaWYgZGVmaW5lZChIQVZFX0NXQUlUKQpAQCAtNTE0MCwxMCArNTI2MCw5IEBACiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAlpZiAocGlkID09IC0xKQogCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKLQllbHNlCi0JCS8qIHNoaWZ0IHRoZSBzdGF0dXMgbGVmdCBhIGJ5dGUgc28gdGhpcyBpcyBtb3JlIGxpa2UgdGhlCi0JCSAgIFBPU0lYIHdhaXRwaWQgKi8KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXMgPDwgOCk7CisKKwkvKiBzaGlmdCB0aGUgc3RhdHVzIGxlZnQgYSBieXRlIHNvIHRoaXMgaXMgbW9yZSBsaWtlIHRoZSBQT1NJWCB3YWl0cGlkICovCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXMgPDwgOCk7CiB9CiAjZW5kaWYgLyogSEFWRV9XQUlUUElEIHx8IEhBVkVfQ1dBSVQgKi8KIApAQCAtNTE1NiwyMyArNTI3NSwxNiBAQAogcG9zaXhfd2FpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKIAlpbnQgcGlkOwotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCXN0YXR1c19pID0gMDsKIAlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJcGlkID0gd2FpdCgmc3RhdHVzKTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChwaWQgPT0gLTEpCiAJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgcGlkLCBzdGF0dXNfaSk7Ci0jdW5kZWYgc3RhdHVzX2kKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIHBpZCwgV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpOwogfQogI2VuZGlmCiAKQEAgLTU2NjgsOSArNTc4MCwyNCBAQAogCQkJICAgICAiaW52YWxpZCBmaWxlIG1vZGUgJyVzJyIsIG1vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KIAlQeV9CRUdJTl9BTExPV19USFJFQURTCisjaWYgIWRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChIQVZFX0ZDTlRMX0gpCisJaWYgKG1vZGVbMF0gPT0gJ2EnKSB7CisJCS8qIHRyeSB0byBtYWtlIHN1cmUgdGhlIE9fQVBQRU5EIGZsYWcgaXMgc2V0ICovCisJCWludCBmbGFnczsKKwkJZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7CisJCWlmIChmbGFncyAhPSAtMSkKKwkJCWZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fQVBQRU5EKTsKKwkJZnAgPSBmZG9wZW4oZmQsIG1vZGUpOworCQlpZiAoZnAgPT0gTlVMTCAmJiBmbGFncyAhPSAtMSkKKwkJCS8qIHJlc3RvcmUgb2xkIG1vZGUgaWYgZmRvcGVuIGZhaWxlZCAqLworCQkJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKTsKKwl9IGVsc2UgeworCQlmcCA9IGZkb3BlbihmZCwgbW9kZSk7CisJfQorI2Vsc2UKIAlmcCA9IGZkb3BlbihmZCwgbW9kZSk7CisjZW5kaWYKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChmcCA9PSBOVUxMKQogCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKQEAgLTU4ODcsNyArNjAxNCw3IEBACiBwb3NpeF9wdXRlbnYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgICAgICBjaGFyICpzMSwgKnMyOwotICAgICAgICBjaGFyICpuZXc7CisgICAgICAgIGNoYXIgKm5ld2VudjsKIAlQeU9iamVjdCAqbmV3c3RyOwogCXNpemVfdCBsZW47CiAKQEAgLTU5MTgsOSArNjA0NSw5IEBACiAJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClsZW4gLSAxKTsKIAlpZiAobmV3c3RyID09IE5VTEwpCiAJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5ldyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdzdHIpOwotCVB5T1Nfc25wcmludGYobmV3LCBsZW4sICIlcz0lcyIsIHMxLCBzMik7Ci0JaWYgKHB1dGVudihuZXcpKSB7CisJbmV3ZW52ID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld3N0cik7CisJUHlPU19zbnByaW50ZihuZXdlbnYsIGxlbiwgIiVzPSVzIiwgczEsIHMyKTsKKwlpZiAocHV0ZW52KG5ld2VudikpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKICAgICAgICAgICAgICAgICBwb3NpeF9lcnJvcigpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjAxMCwyMiArNjEzNywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dDT1JFRFVNUChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXQ09SRURVTVAiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0NPUkVEVU1QIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhXQ09SRURVTVAoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXQ09SRURVTVAgKi8KIApAQCAtNjAzOCwyMiArNjE1NiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dJRkNPTlRJTlVFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXQ09OVElOVUVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldDT05USU5VRUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRkNPTlRJTlVFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRkNPTlRJTlVFRCAqLwogCkBAIC02MDY1LDIyICs2MTc0LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0lGU1RPUFBFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTVE9QUEVEIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRlNUT1BQRUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRlNUT1BQRUQoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXSUZTVE9QUEVEICovCiAKQEAgLTYwOTIsMjIgKzYxOTIsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XSUZTSUdOQUxFRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTSUdOQUxFRCIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZTSUdOQUxFRCIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoV0lGU0lHTkFMRUQoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXSUZTSUdOQUxFRCAqLwogCkBAIC02MTIwLDIyICs2MjExLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0lGRVhJVEVEKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldJRkVYSVRFRCIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXSUZFWElURUQiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFdJRkVYSVRFRChzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdJRkVYSVRFRCAqLwogCkBAIC02MTQ3LDIyICs2MjI5LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfV0VYSVRTVEFUVVMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotI2lmZGVmIFVOSU9OX1dBSVQKLQl1bmlvbiB3YWl0IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgKHN0YXR1cy53X3N0YXR1cykKLSNlbHNlCi0JaW50IHN0YXR1czsKLSNkZWZpbmUgc3RhdHVzX2kgc3RhdHVzCi0jZW5kaWYKLQlzdGF0dXNfaSA9IDA7CisJV0FJVF9UWVBFIHN0YXR1czsKKwlXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0VYSVRTVEFUVVMiLCAmc3RhdHVzX2kpKQotCXsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6V0VYSVRTVEFUVVMiLCAmV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykpKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIFdFWElUU1RBVFVTKHN0YXR1cykpOwotI3VuZGVmIHN0YXR1c19pCiB9CiAjZW5kaWYgLyogV0VYSVRTVEFUVVMgKi8KIApAQCAtNjE3NSwyMiArNjI0OCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X1dURVJNU0lHKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSNpZmRlZiBVTklPTl9XQUlUCi0JdW5pb24gd2FpdCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIChzdGF0dXMud19zdGF0dXMpCi0jZWxzZQotCWludCBzdGF0dXM7Ci0jZGVmaW5lIHN0YXR1c19pIHN0YXR1cwotI2VuZGlmCi0Jc3RhdHVzX2kgPSAwOworCVdBSVRfVFlQRSBzdGF0dXM7CisJV0FJVF9TVEFUVVNfSU5UKHN0YXR1cykgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldURVJNU0lHIiwgJnN0YXR1c19pKSkKLQl7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOldURVJNU0lHIiwgJldBSVRfU1RBVFVTX0lOVChzdGF0dXMpKSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSN1bmRlZiBzdGF0dXNfaQogfQogI2VuZGlmIC8qIFdURVJNU0lHICovCiAKQEAgLTYyMDMsMjIgKzYyNjcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9XU1RPUFNJRyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0jaWZkZWYgVU5JT05fV0FJVAotCXVuaW9uIHdhaXQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSAoc3RhdHVzLndfc3RhdHVzKQotI2Vsc2UKLQlpbnQgc3RhdHVzOwotI2RlZmluZSBzdGF0dXNfaSBzdGF0dXMKLSNlbmRpZgotCXN0YXR1c19pID0gMDsKKwlXQUlUX1RZUEUgc3RhdHVzOworCVdBSVRfU1RBVFVTX0lOVChzdGF0dXMpID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXU1RPUFNJRyIsICZzdGF0dXNfaSkpCi0JeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpXU1RPUFNJRyIsICZXQUlUX1NUQVRVU19JTlQoc3RhdHVzKSkpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgV1NUT1BTSUcoc3RhdHVzKSk7Ci0jdW5kZWYgc3RhdHVzX2kKIH0KICNlbmRpZiAvKiBXU1RPUFNJRyAqLwogCkBAIC02Mzk2LDE1ICs2NDUxLDE2IEBACiAgICAgbmFtZSA9IHRtcG5hbShidWZmZXIpOwogI2VuZGlmCiAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfT1NFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImlzIiwgMCwKKwlQeU9iamVjdCAqZXJyID0gUHlfQnVpbGRWYWx1ZSgiaXMiLCAwLAogI2lmZGVmIFVTRV9UTVBOQU1fUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gdG1wbmFtX3IiCiAjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gdG1wbmFtIgogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKwlQeUVycl9TZXRPYmplY3QoUHlFeGNfT1NFcnJvciwgZXJyKTsKKwlQeV9YREVDUkVGKGVycik7CisJcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CkBAIC02NzUzLDI2ICs2ODA5LDMwIEBACiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgaW50IG5hbWU7Ci0gICAgY2hhciBidWZmZXJbNjRdOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CiAKICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyY6Y29uZnN0ciIsIGNvbnZfY29uZnN0cl9jb25mbmFtZSwgJm5hbWUpKSB7Ci0gICAgICAgIGludCBsZW4gPSBjb25mc3RyKG5hbWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCWludCBsZW47CiAKICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIGlmIChlcnJubyAhPSAwKQotICAgICAgICAgICAgICAgIHBvc2l4X2Vycm9yKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisJbGVuID0gY29uZnN0cihuYW1lLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwlpZiAobGVuID09IDApIHsKKwkgICAgaWYgKGVycm5vKSB7CisJCXBvc2l4X2Vycm9yKCk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCXJlc3VsdCA9IFB5X05vbmU7CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGxlbiA+PSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisJICAgIGlmICgodW5zaWduZWQgaW50KWxlbiA+PSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi0xKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGNvbmZzdHIobmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCksIGxlbisxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZnN0cihuYW1lLCBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwgbGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBsZW4tMSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTc0MjMsNiArNzQ4Myw0NCBAQAogCWNoYXIgKmZpbGVwYXRoOwogCWNoYXIgKm9wZXJhdGlvbiA9IE5VTEw7CiAJSElOU1RBTkNFIHJjOworI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgeworCQlQeU9iamVjdCAqdW5pcGF0aCwgKndvcGVyYXRpb24gPSBOVUxMOworCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8czpzdGFydGZpbGUiLAorCQkJCSAgICAgICZ1bmlwYXRoLCAmb3BlcmF0aW9uKSkgeworCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCWdvdG8gbm9ybWFsOworCQl9CisJCQorCisJCWlmIChvcGVyYXRpb24pIHsKKwkJICAgIHdvcGVyYXRpb24gPSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkob3BlcmF0aW9uLCAKKwkJCQkJCSAgICAgICBzdHJsZW4ob3BlcmF0aW9uKSwgTlVMTCk7CisJCSAgICBpZiAoIXdvcGVyYXRpb24pIHsKKwkJCSAgICBQeUVycl9DbGVhcigpOworCQkJICAgIG9wZXJhdGlvbiA9IE5VTEw7CisJCQkgICAgZ290byBub3JtYWw7CisJCSAgICB9CisJCX0KKwkJCQorCQlQeV9CRUdJTl9BTExPV19USFJFQURTCisJCXJjID0gU2hlbGxFeGVjdXRlVygoSFdORCkwLCB3b3BlcmF0aW9uID8gUHlVbmljb2RlX0FTX1VOSUNPREUod29wZXJhdGlvbikgOiAwLAorCQkJUHlVbmljb2RlX0FTX1VOSUNPREUodW5pcGF0aCksCisJCQlOVUxMLCBOVUxMLCBTV19TSE9XTk9STUFMKTsKKwkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworCQlQeV9YREVDUkVGKHdvcGVyYXRpb24pOworCQlpZiAocmMgPD0gKEhJTlNUQU5DRSkzMikgeworCQkJUHlPYmplY3QgKmVycnZhbCA9IHdpbjMyX2Vycm9yX3VuaWNvZGUoInN0YXJ0ZmlsZSIsCisJCQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlwYXRoKSk7CisJCQlyZXR1cm4gZXJydmFsOworCQl9CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkJcmV0dXJuIFB5X05vbmU7CisJfQorI2VuZGlmCisKK25vcm1hbDoKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0fHM6c3RhcnRmaWxlIiwgCiAJCQkgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmZmlsZXBhdGgsIAogCQkJICAgICAgJm9wZXJhdGlvbikpCkBAIC03Njk1LDYgKzc3OTMsMTIgQEAKICNpZmRlZiBIQVZFX1dBSVQKIAl7IndhaXQiLAlwb3NpeF93YWl0LCBNRVRIX05PQVJHUywgcG9zaXhfd2FpdF9fZG9jX199LAogI2VuZGlmIC8qIEhBVkVfV0FJVCAqLworI2lmZGVmIEhBVkVfV0FJVDMKKyAgICAgICAgeyJ3YWl0MyIsCXBvc2l4X3dhaXQzLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3dhaXQzX19kb2NfX30sCisjZW5kaWYgLyogSEFWRV9XQUlUMyAqLworI2lmZGVmIEhBVkVfV0FJVDQKKyAgICAgICAgeyJ3YWl0NCIsCXBvc2l4X3dhaXQ0LCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3dhaXQ0X19kb2NfX30sCisjZW5kaWYgLyogSEFWRV9XQUlUNCAqLwogI2lmIGRlZmluZWQoSEFWRV9XQUlUUElEKSB8fCBkZWZpbmVkKEhBVkVfQ1dBSVQpCiAJeyJ3YWl0cGlkIiwJcG9zaXhfd2FpdHBpZCwgTUVUSF9WQVJBUkdTLCBwb3NpeF93YWl0cGlkX19kb2NfX30sCiAjZW5kaWYgLyogSEFWRV9XQUlUUElEICovCkBAIC04MTQyLDE5ICs4MjQ2LDI3IEBACiAJCXBvc2l4X3B1dGVudl9nYXJiYWdlID0gUHlEaWN0X05ldygpOwogI2VuZGlmCiAKLQlzdGF0X3Jlc3VsdF9kZXNjLm5hbWUgPSBNT0ROQU1FICIuc3RhdF9yZXN1bHQiOwotCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzddLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKLQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s4XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7Ci0Jc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbOV0ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7Ci0Jc3RydWN0c2VxX25ldyA9IFN0YXRSZXN1bHRUeXBlLnRwX25ldzsKLQlTdGF0UmVzdWx0VHlwZS50cF9uZXcgPSBzdGF0cmVzdWx0X25ldzsKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCXN0YXRfcmVzdWx0X2Rlc2MubmFtZSA9IE1PRE5BTUUgIi5zdGF0X3Jlc3VsdCI7CisJCXN0YXRfcmVzdWx0X2Rlc2MuZmllbGRzWzddLm5hbWUgPSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZDsKKwkJc3RhdF9yZXN1bHRfZGVzYy5maWVsZHNbOF0ubmFtZSA9IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOworCQlzdGF0X3Jlc3VsdF9kZXNjLmZpZWxkc1s5XS5uYW1lID0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7CisJCXN0cnVjdHNlcV9uZXcgPSBTdGF0UmVzdWx0VHlwZS50cF9uZXc7CisJCVN0YXRSZXN1bHRUeXBlLnRwX25ldyA9IHN0YXRyZXN1bHRfbmV3OworCisJCXN0YXR2ZnNfcmVzdWx0X2Rlc2MubmFtZSA9IE1PRE5BTUUgIi5zdGF0dmZzX3Jlc3VsdCI7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRWRlNSZXN1bHRUeXBlLCAmc3RhdHZmc19yZXN1bHRfZGVzYyk7CisJfQogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdFJlc3VsdFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RhdF9yZXN1bHQiLCAoUHlPYmplY3QqKSAmU3RhdFJlc3VsdFR5cGUpOwotCi0Jc3RhdHZmc19yZXN1bHRfZGVzYy5uYW1lID0gTU9ETkFNRSAiLnN0YXR2ZnNfcmVzdWx0IjsKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0VkZTUmVzdWx0VHlwZSwgJnN0YXR2ZnNfcmVzdWx0X2Rlc2MpOwogCVB5X0lOQ1JFRigoUHlPYmplY3QqKSAmU3RhdFZGU1Jlc3VsdFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RhdHZmc19yZXN1bHQiLAogCQkJICAgKFB5T2JqZWN0KikgJlN0YXRWRlNSZXN1bHRUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL01vZHVsZXMvcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCmluZGV4IDllN2I4NjQuLjllMDFmNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwpAQCAtNDIsNiArNDIsNyBAQAogZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUgZW50cnkgYXNrZWQgZm9yIGNhbm5vdCBiZSBmb3VuZC4iKTsKIAogICAgICAgCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RQd2RUeXBlOwogCiBzdGF0aWMgdm9pZApAQCAtMTg2LDkgKzE4NywxMiBAQAogCWlmIChtID09IE5VTEwpCiAgICAgCQlyZXR1cm47CiAKLQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RQd2RUeXBlLCAmc3RydWN0X3B3ZF90eXBlX2Rlc2MpOworCWlmICghaW5pdGlhbGl6ZWQpCisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsIAorCQkJCQkgICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7CiAJUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcGFzc3dkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKIAkvKiBBbmQgZm9yIGIvdyBjb21wYXRpYmlsaXR5ICh0aGlzIHdhcyBkZWZpbmVkIGJ5IG1pc3Rha2UpOiAqLwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3B3ZW50IiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B5ZXhwYXQuYyBiL01vZHVsZXMvcHlleHBhdC5jCmluZGV4IGU0YmYxODAuLmZlNTBlMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHlleHBhdC5jCisrKyBiL01vZHVsZXMvcHlleHBhdC5jCkBAIC0xNTE5LDYgKzE1MTksOCBAQAogICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgUHlPYmplY3QgKnJjID0gUHlMaXN0X05ldygwKTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IGdldF9oYW5kbGVyX25hbWUoJmhhbmRsZXJfaW5mb1tpXSk7CiAgICAgICAgICAgICBpZiAobyAhPSBOVUxMKQpAQCAtMTY1MiwxNCArMTY1NCw5IEBACiBzdGF0aWMgaW50CiB4bWxwYXJzZV90cmF2ZXJzZSh4bWxwYXJzZW9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIGludCBpLCBlcnI7Ci0gICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0gICAgICAgIGlmICghb3AtPmhhbmRsZXJzW2ldKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGVyciA9IHZpc2l0KG9wLT5oYW5kbGVyc1tpXSwgYXJnKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgUHlfVklTSVQob3AtPmhhbmRsZXJzW2ldKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTY2Nyw4ICsxNjY0LDcgQEAKIHhtbHBhcnNlX2NsZWFyKHhtbHBhcnNlb2JqZWN0ICpvcCkKIHsKICAgICBjbGVhcl9oYW5kbGVycyhvcCwgMCk7Ci0gICAgUHlfWERFQ1JFRihvcC0+aW50ZXJuKTsKLSAgICBvcC0+aW50ZXJuID0gMDsKKyAgICBQeV9DTEVBUihvcC0+aW50ZXJuKTsKICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZWdleG1vZHVsZS5jIGIvTW9kdWxlcy9yZWdleG1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmI0MTk4Li4wMDAwMDAwCi0tLSBhL01vZHVsZXMvcmVnZXhtb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKgotWFhYIHN1cHBvcnQgcmFuZ2UgcGFyYW1ldGVyIG9uIHNlYXJjaAotWFhYIHN1cHBvcnQgbXN0b3AgcGFyYW1ldGVyIG9uIHNlYXJjaAotKi8KLQotCi0vKiBSZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyAqLwotLyogVGhpcyB1c2VzIFRhdHUgWWxvbmVuJ3MgY29weWxlZnQtZnJlZSByZWltcGxlbWVudGF0aW9uIG9mCi0gICBHTlUgcmVndWxhciBleHByZXNzaW9ucyAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicmVnZXhwci5oIgotCi1zdGF0aWMgUHlPYmplY3QgKlJlZ2V4RXJyb3I7CS8qIEV4Y2VwdGlvbiAqLwkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgcmVfcGF0YnVmOyAvKiBUaGUgY29tcGlsZWQgZXhwcmVzc2lvbiAqLwotCXN0cnVjdCByZV9yZWdpc3RlcnMgcmVfcmVnczsgLyogVGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBsYXN0IG1hdGNoICovCi0JY2hhciByZV9mYXN0bWFwWzI1Nl07CS8qIFN0b3JhZ2UgZm9yIGZhc3RtYXAgKi8KLQlQeU9iamVjdCAqcmVfdHJhbnNsYXRlOwkvKiBTdHJpbmcgb2JqZWN0IGZvciB0cmFuc2xhdGUgdGFibGUgKi8KLQlQeU9iamVjdCAqcmVfbGFzdG9rOwkvKiBTdHJpbmcgb2JqZWN0IGxhc3QgbWF0Y2hlZC9zZWFyY2hlZCAqLwotCVB5T2JqZWN0ICpyZV9ncm91cGluZGV4OwkvKiBHcm91cCBuYW1lIHRvIGluZGV4IGRpY3Rpb25hcnkgKi8KLQlQeU9iamVjdCAqcmVfZ2l2ZW5wYXQ7CS8qIFBhdHRlcm4gd2l0aCBzeW1ib2xpYyBncm91cHMgKi8KLQlQeU9iamVjdCAqcmVfcmVhbHBhdDsJLyogUGF0dGVybiB3aXRob3V0IHN5bWJvbGljIGdyb3VwcyAqLwotfSByZWdleG9iamVjdDsKLQotLyogUmVnZXggb2JqZWN0IG1ldGhvZHMgKi8KLQotc3RhdGljIHZvaWQKLXJlZ19kZWFsbG9jKHJlZ2V4b2JqZWN0ICpyZSkKLXsKLQlpZiAocmUtPnJlX3BhdGJ1Zi5idWZmZXIpCi0JCWZyZWUocmUtPnJlX3BhdGJ1Zi5idWZmZXIpOwotCVB5X1hERUNSRUYocmUtPnJlX3RyYW5zbGF0ZSk7Ci0JUHlfWERFQ1JFRihyZS0+cmVfbGFzdG9rKTsKLQlQeV9YREVDUkVGKHJlLT5yZV9ncm91cGluZGV4KTsKLQlQeV9YREVDUkVGKHJlLT5yZV9naXZlbnBhdCk7Ci0JUHlfWERFQ1JFRihyZS0+cmVfcmVhbHBhdCk7Ci0JUHlPYmplY3RfRGVsKHJlKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW1ha2VyZXN1bHQoc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVncykKLXsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQlzdGF0aWMgUHlPYmplY3QgKmZpbGxlciA9IE5VTEw7Ci0KLQlpZiAoZmlsbGVyID09IE5VTEwpIHsKLQkJZmlsbGVyID0gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIC0xLCAtMSk7Ci0JCWlmIChmaWxsZXIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlUdXBsZV9OZXcoUkVfTlJFR1MpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IFJFX05SRUdTOyBpKyspIHsKLQkJaW50IGxvID0gcmVncy0+c3RhcnRbaV07Ci0JCWludCBoaSA9IHJlZ3MtPmVuZFtpXTsKLQkJUHlPYmplY3QgKnc7Ci0JCWlmIChsbyA9PSAtMSAmJiBoaSA9PSAtMSkgewotCQkJdyA9IGZpbGxlcjsKLQkJCVB5X0lOQ1JFRih3KTsKLQkJfQotCQllbHNlCi0JCQl3ID0gUHlfQnVpbGRWYWx1ZSgiKGlpKSIsIGxvLCBoaSk7Ci0JCWlmICh3ID09IE5VTEwgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHcpIDwgMCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfbWF0Y2gocmVnZXhvYmplY3QgKnJlLCBQeU9iamVjdCAqYXJncykKLXsKLQlQeU9iamVjdCAqYXJnc3RyaW5nOwotCWNoYXIgKmJ1ZmZlcjsKLQlpbnQgc2l6ZTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6bWF0Y2giLCAmYXJnc3RyaW5nLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzdHJpbmcsICJ0IyIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAibWF0Y2ggb2Zmc2V0IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfWERFQ1JFRihyZS0+cmVfbGFzdG9rKTsKLQlyZS0+cmVfbGFzdG9rID0gTlVMTDsKLQlyZXN1bHQgPSBfUHlfcmVfbWF0Y2goJnJlLT5yZV9wYXRidWYsICh1bnNpZ25lZCBjaGFyICopYnVmZmVyLCBzaXplLCBvZmZzZXQsCi0JCQkgICAgICAmcmUtPnJlX3JlZ3MpOwotCWlmIChyZXN1bHQgPCAtMSkgewotCQkvKiBTZXJpb3VzIGZhaWx1cmUgb2Ygc29tZSBzb3J0OyBpZiByZV9tYXRjaCBkaWRuJ3QgCi0JCSAgIHNldCBhbiBleGNlcHRpb24sIHJhaXNlIGEgZ2VuZXJpYyBlcnJvciAqLwotCSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAibWF0Y2ggZmFpbHVyZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCVB5X0lOQ1JFRihhcmdzdHJpbmcpOwotCQlyZS0+cmVfbGFzdG9rID0gYXJnc3RyaW5nOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmVzdWx0KTsgLyogTGVuZ3RoIG9mIHRoZSBtYXRjaCBvciAtMSAqLwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnb2JqX3NlYXJjaChyZWdleG9iamVjdCAqcmUsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICphcmdzdHJpbmc7Ci0JY2hhciAqYnVmZmVyOwotCWludCBzaXplOwotCWludCBvZmZzZXQgPSAwOwotCWludCByYW5nZTsKLQlpbnQgcmVzdWx0OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlYXJjaCIsICZhcmdzdHJpbmcsICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3N0cmluZywgInQjOnNlYXJjaCIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLCAic2VhcmNoIG9mZnNldCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIE5COiBJbiBFbWFjcyAxOC41NywgdGhlIGRvY3VtZW50YXRpb24gZm9yIHJlX3NlYXJjaFtfMl0gYW5kCi0JICAgdGhlIGltcGxlbWVudGF0aW9uIGRvbid0IG1hdGNoOiB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdAotCSAgIHxyYW5nZXwgcG9zaXRpb25zIGFyZSB0cmllZCwgd2hpbGUgdGhlIGNvZGUgdHJpZXMgfHJhbmdlfCsxCi0JICAgcG9zaXRpb25zLiAgSXQgc2VlbXMgbW9yZSBwcm9kdWN0aXZlIHRvIGJlbGlldmUgdGhlIGNvZGUhICovCi0JcmFuZ2UgPSBzaXplIC0gb2Zmc2V0OwotCVB5X1hERUNSRUYocmUtPnJlX2xhc3Rvayk7Ci0JcmUtPnJlX2xhc3RvayA9IE5VTEw7Ci0JcmVzdWx0ID0gX1B5X3JlX3NlYXJjaCgmcmUtPnJlX3BhdGJ1ZiwgKHVuc2lnbmVkIGNoYXIgKilidWZmZXIsIHNpemUsIG9mZnNldCwgcmFuZ2UsCi0JCQkgICAmcmUtPnJlX3JlZ3MpOwotCWlmIChyZXN1bHQgPCAtMSkgewotCQkvKiBTZXJpb3VzIGZhaWx1cmUgb2Ygc29tZSBzb3J0OyBpZiByZV9tYXRjaCBkaWRuJ3QgCi0JCSAgIHNldCBhbiBleGNlcHRpb24sIHJhaXNlIGEgZ2VuZXJpYyBlcnJvciAqLwotCSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCSAgCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsICJtYXRjaCBmYWlsdXJlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVzdWx0ID49IDApIHsKLQkJUHlfSU5DUkVGKGFyZ3N0cmluZyk7Ci0JCXJlLT5yZV9sYXN0b2sgPSBhcmdzdHJpbmc7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXN1bHQpOyAvKiBQb3NpdGlvbiBvZiB0aGUgbWF0Y2ggb3IgLTEgKi8KLX0KLQotLyogZ2V0IHRoZSBncm91cCBmcm9tIHRoZSByZWdleCB3aGVyZSBpbmRleCBjYW4gYmUgYSBzdHJpbmcgKGdyb3VwIG5hbWUpIG9yCi0gICBhbiBpbnRlZ2VyIGluZGV4IFswIC4uIDk5XQotICovCi1zdGF0aWMgUHlPYmplY3QqCi1ncm91cF9mcm9tX2luZGV4KHJlZ2V4b2JqZWN0ICpyZSwgUHlPYmplY3QgKmluZGV4KQotewotCWludCBpLCBhLCBiOwotCWNoYXIgKnY7Ci0KLQlpZiAoUHlTdHJpbmdfQ2hlY2soaW5kZXgpKQotCQlpZiAocmUtPnJlX2dyb3VwaW5kZXggPT0gTlVMTCB8fAotCQkgICAgIShpbmRleCA9IFB5RGljdF9HZXRJdGVtKHJlLT5yZV9ncm91cGluZGV4LCBpbmRleCkpKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwKLQkJCQkJImdyb3VwKCkgZ3JvdXAgbmFtZSBkb2Vzbid0IGV4aXN0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JaSA9IFB5SW50X0FzTG9uZyhpbmRleCk7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoaSA8IDAgfHwgaSA+PSBSRV9OUkVHUykgewotCQlQeUVycl9TZXRTdHJpbmcoUmVnZXhFcnJvciwgImdyb3VwKCkgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmUtPnJlX2xhc3RvayA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhSZWdleEVycm9yLAotCQkJICAgImdyb3VwKCkgb25seSB2YWxpZCBhZnRlciBzdWNjZXNzZnVsIG1hdGNoL3NlYXJjaCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYSA9IHJlLT5yZV9yZWdzLnN0YXJ0W2ldOwotCWIgPSByZS0+cmVfcmVncy5lbmRbaV07Ci0JaWYgKGEgPCAwIHx8IGIgPCAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCQotCWlmICghKHYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZS0+cmVfbGFzdG9rKSkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHYrYSwgYi1hKTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgotcmVnb2JqX2dyb3VwKHJlZ2V4b2JqZWN0ICpyZSwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JaW50IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0KLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA9PSAxKSB7Ci0JCS8qIHJldHVybiB2YWx1ZSBpcyBhIHNpbmdsZSBzdHJpbmcgKi8KLQkJUHlPYmplY3QgKmluZGV4ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlpZiAoIWluZGV4KQotCQkJcmV0dXJuIE5VTEw7Ci0JCQotCQlyZXR1cm4gZ3JvdXBfZnJvbV9pbmRleChyZSwgaW5kZXgpOwotCX0KLQotCS8qIHJldHVybiB2YWx1ZSBpcyBhIHR1cGxlICovCi0JaWYgKCEocmVzID0gUHlUdXBsZV9OZXcobikpKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmluZGV4ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqZ3JvdXAgPSBOVUxMOwotCi0JCWlmICghaW5kZXgpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWlmICghKGdyb3VwID0gZ3JvdXBfZnJvbV9pbmRleChyZSwgaW5kZXgpKSkKLQkJCWdvdG8gZmluYWxseTsKLQkJaWYgKFB5VHVwbGVfU2V0SXRlbShyZXMsIGksIGdyb3VwKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCXJldHVybiByZXM7Ci0KLSAgZmluYWxseToKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHJlZ19tZXRob2RzW10gPSB7Ci0JeyJtYXRjaCIsCShQeUNGdW5jdGlvbilyZWdvYmpfbWF0Y2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZWFyY2giLAkoUHlDRnVuY3Rpb24pcmVnb2JqX3NlYXJjaCwgTUVUSF9WQVJBUkdTfSwKLQl7Imdyb3VwIiwJKFB5Q0Z1bmN0aW9uKXJlZ29ial9ncm91cCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwotfTsKLQotCi0MCi1zdGF0aWMgY2hhciogbWVtYmVyc1tdID0gewotCSJsYXN0IiwgInJlZ3MiLCAidHJhbnNsYXRlIiwKLQkiZ3JvdXBpbmRleCIsICJyZWFscGF0IiwgImdpdmVucGF0IiwKLQlOVUxMCi19OwotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1yZWdvYmpfZ2V0YXR0cihyZWdleG9iamVjdCAqcmUsIGNoYXIgKm5hbWUpCi17Ci0JaWYgKHN0cmNtcChuYW1lLCAicmVncyIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9sYXN0b2sgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJcmV0dXJuIG1ha2VyZXN1bHQoJnJlLT5yZV9yZWdzKTsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAibGFzdCIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9sYXN0b2sgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9sYXN0b2spOwotCQlyZXR1cm4gcmUtPnJlX2xhc3RvazsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAidHJhbnNsYXRlIikgPT0gMCkgewotCQlpZiAocmUtPnJlX3RyYW5zbGF0ZSA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX3RyYW5zbGF0ZSk7Ci0JCXJldHVybiByZS0+cmVfdHJhbnNsYXRlOwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJncm91cGluZGV4IikgPT0gMCkgewotCQlpZiAocmUtPnJlX2dyb3VwaW5kZXggPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9ncm91cGluZGV4KTsKLQkJcmV0dXJuIHJlLT5yZV9ncm91cGluZGV4OwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJyZWFscGF0IikgPT0gMCkgewotCQlpZiAocmUtPnJlX3JlYWxwYXQgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlLT5yZV9yZWFscGF0KTsKLQkJcmV0dXJuIHJlLT5yZV9yZWFscGF0OwotCX0KLQlpZiAoc3RyY21wKG5hbWUsICJnaXZlbnBhdCIpID09IDApIHsKLQkJaWYgKHJlLT5yZV9naXZlbnBhdCA9PSBOVUxMKSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYocmUtPnJlX2dpdmVucGF0KTsKLQkJcmV0dXJuIHJlLT5yZV9naXZlbnBhdDsKLQl9Ci0JaWYgKHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwKSB7Ci0JCWludCBpID0gMDsKLQkJUHlPYmplY3QgKmxpc3QgPSBOVUxMOwotCi0JCS8qIG9rYXksIHNvIGl0J3MgdW5saWtlbHkgdGhpcyBsaXN0IHdpbGwgY2hhbmdlIHRoYXQgb2Z0ZW4uCi0JCSAgIHN0aWxsLCBpdCdzIGVhc2llciB0byBjaGFuZ2UgaXQgaW4ganVzdCBvbmUgcGxhY2UuCi0JCSAqLwotCQl3aGlsZSAobWVtYmVyc1tpXSkKLQkJCWkrKzsKLQkJaWYgKCEobGlzdCA9IFB5TGlzdF9OZXcoaSkpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaSA9IDA7Ci0JCXdoaWxlIChtZW1iZXJzW2ldKSB7Ci0JCQlQeU9iamVjdCogdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWVtYmVyc1tpXSk7Ci0JCQlpZiAoIXYgfHwgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdikgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChyZWdfbWV0aG9kcywgKFB5T2JqZWN0ICopcmUsIG5hbWUpOwotfQotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IFJlZ2V4dHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCQkgICAgIC8qb2Jfc2l6ZSovCi0JInJlZ2V4LnJlZ2V4IiwJCQkgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKHJlZ2V4b2JqZWN0KSwJCSAgICAgLyp0cF9zaXplKi8KLQkwLAkJCQkgICAgIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilyZWdfZGVhbGxvYywJICAgICAvKnRwX2RlYWxsb2MqLwotCTAsCQkJCSAgICAgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKXJlZ29ial9nZXRhdHRyLAkgICAgIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIqLwotCTAsCQkJCSAgICAgLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkgICAgIC8qdHBfcmVwciovCi19OwotCi0vKiByZWZlcmVuY2UgY291bnRpbmcgaW52YXJpYW50czoKLSAgIHBhdHRlcm46IGJvcnJvd2VkCi0gICB0cmFuc2xhdGU6IGJvcnJvd2VkCi0gICBnaXZlbnBhdDogYm9ycm93ZWQKLSAgIGdyb3VwaW5kZXg6IHRyYW5zZmVycmVkCi0qLwotc3RhdGljIFB5T2JqZWN0ICoKLW5ld3JlZ2V4b2JqZWN0KFB5T2JqZWN0ICpwYXR0ZXJuLCBQeU9iamVjdCAqdHJhbnNsYXRlLCBQeU9iamVjdCAqZ2l2ZW5wYXQsIFB5T2JqZWN0ICpncm91cGluZGV4KQotewotCXJlZ2V4b2JqZWN0ICpyZTsKLQljaGFyICpwYXQ7Ci0JaW50IHNpemU7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlKHBhdHRlcm4sICJ0IyIsICZwYXQsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKHRyYW5zbGF0ZSAhPSBOVUxMICYmIFB5U3RyaW5nX1NpemUodHJhbnNsYXRlKSAhPSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsCi0JCQkJInRyYW5zbGF0aW9uIHRhYmxlIG11c3QgYmUgMjU2IGJ5dGVzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZSA9IFB5T2JqZWN0X05ldyhyZWdleG9iamVjdCwgJlJlZ2V4dHlwZSk7Ci0JaWYgKHJlICE9IE5VTEwpIHsKLQkJY2hhciAqZXJyb3I7Ci0JCXJlLT5yZV9wYXRidWYuYnVmZmVyID0gTlVMTDsKLQkJcmUtPnJlX3BhdGJ1Zi5hbGxvY2F0ZWQgPSAwOwotCQlyZS0+cmVfcGF0YnVmLmZhc3RtYXAgPSAodW5zaWduZWQgY2hhciAqKXJlLT5yZV9mYXN0bWFwOwotCQlpZiAodHJhbnNsYXRlKSB7Ci0JCQlyZS0+cmVfcGF0YnVmLnRyYW5zbGF0ZSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcodHJhbnNsYXRlKTsKLQkJCWlmICghcmUtPnJlX3BhdGJ1Zi50cmFuc2xhdGUpCi0JCQkJZ290byBmaW5hbGx5OwotCQkJUHlfSU5DUkVGKHRyYW5zbGF0ZSk7Ci0JCX0KLQkJZWxzZQotCQkJcmUtPnJlX3BhdGJ1Zi50cmFuc2xhdGUgPSBOVUxMOwotCQlyZS0+cmVfdHJhbnNsYXRlID0gdHJhbnNsYXRlOwotCQlyZS0+cmVfbGFzdG9rID0gTlVMTDsKLQkJcmUtPnJlX2dyb3VwaW5kZXggPSBncm91cGluZGV4OwotCQlQeV9JTkNSRUYocGF0dGVybik7Ci0JCXJlLT5yZV9yZWFscGF0ID0gcGF0dGVybjsKLQkJUHlfSU5DUkVGKGdpdmVucGF0KTsKLQkJcmUtPnJlX2dpdmVucGF0ID0gZ2l2ZW5wYXQ7Ci0JCWVycm9yID0gX1B5X3JlX2NvbXBpbGVfcGF0dGVybigodW5zaWduZWQgY2hhciAqKXBhdCwgc2l6ZSwgJnJlLT5yZV9wYXRidWYpOwotCQlpZiAoZXJyb3IgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFJlZ2V4RXJyb3IsIGVycm9yKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmU7Ci0gIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHJlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X2NvbXBpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpwYXQgPSBOVUxMOwotCVB5T2JqZWN0ICp0cmFuID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3xTOmNvbXBpbGUiLCAmcGF0LCAmdHJhbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdyZWdleG9iamVjdChwYXQsIHRyYW4sIHBhdCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1zeW1jb21wKFB5T2JqZWN0ICpwYXR0ZXJuLCBQeU9iamVjdCAqZ2RpY3QpCi17Ci0JY2hhciAqb3BhdCwgKm9lbmQsICpvLCAqbiwgKmcsICp2OwotCWludCBncm91cF9jb3VudCA9IDA7Ci0JaW50IHN6OwotCWludCBlc2NhcGVkID0gMDsKLQljaGFyIG5hbWVfYnVmWzEyOF07Ci0JUHlPYmplY3QgKm5wYXR0ZXJuOwotCWludCByZXF1aXJlX2VzY2FwZSA9IHJlX3N5bnRheCAmIFJFX05PX0JLX1BBUkVOUyA/IDAgOiAxOwotCi0JaWYgKCEob3BhdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHBhdHRlcm4pKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKHN6ID0gUHlTdHJpbmdfU2l6ZShwYXR0ZXJuKSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQotCW9lbmQgPSBvcGF0ICsgc3o7Ci0JbyA9IG9wYXQ7Ci0KLQlpZiAob2VuZCA9PSBvcGF0KSB7Ci0JCVB5X0lOQ1JFRihwYXR0ZXJuKTsKLQkJcmV0dXJuIHBhdHRlcm47Ci0JfQotCi0JaWYgKCEobnBhdHRlcm4gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opKSB8fAotCSAgICAhKG4gPSBQeVN0cmluZ19Bc1N0cmluZyhucGF0dGVybikpKQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlIChvIDwgb2VuZCkgewotCQlpZiAoKm8gPT0gJygnICYmIGVzY2FwZWQgPT0gcmVxdWlyZV9lc2NhcGUpIHsKLQkJCWNoYXIgKmJhY2t0cmFjazsKLQkJCWVzY2FwZWQgPSAwOwotCQkJKytncm91cF9jb3VudDsKLQkJCSpuKysgPSAqbzsKLQkJCWlmICgrK28gPj0gb2VuZCB8fCAqbyAhPSAnPCcpCi0JCQkJY29udGludWU7Ci0JCQkvKiAqbyA9PSAnPCcgKi8KLQkJCWlmIChvKzEgPCBvZW5kICYmICoobysxKSA9PSAnPicpCi0JCQkJY29udGludWU7Ci0JCQliYWNrdHJhY2sgPSBvOwotCQkJZyA9IG5hbWVfYnVmOwotCQkJZm9yICgrK287IG8gPCBvZW5kOykgewotCQkJCWlmICgqbyA9PSAnPicpIHsKLQkJCQkgICAgUHlPYmplY3QgKmdyb3VwX25hbWUgPSBOVUxMOwotCQkJCSAgICBQeU9iamVjdCAqZ3JvdXBfaW5kZXggPSBOVUxMOwotCQkJCSAgICAqZysrID0gJ1wwJzsKLQkJCQkgICAgZ3JvdXBfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZV9idWYpOwotCQkJCSAgICBncm91cF9pbmRleCA9IFB5SW50X0Zyb21Mb25nKGdyb3VwX2NvdW50KTsKLQkJCQkgICAgaWYgKGdyb3VwX25hbWUgPT0gTlVMTCB8fAotCQkJCQlncm91cF9pbmRleCA9PSBOVUxMIHx8Ci0JCQkJCVB5RGljdF9TZXRJdGVtKGdkaWN0LCBncm91cF9uYW1lLAotCQkJCQkJICAgICAgIGdyb3VwX2luZGV4KSAhPSAwKQotCQkJCSAgICB7Ci0JCQkJCSAgICBQeV9YREVDUkVGKGdyb3VwX25hbWUpOwotCQkJCQkgICAgUHlfWERFQ1JFRihncm91cF9pbmRleCk7Ci0JCQkJCSAgICBQeV9YREVDUkVGKG5wYXR0ZXJuKTsKLQkJCQkJICAgIHJldHVybiBOVUxMOwotCQkJCSAgICB9Ci0JCQkJICAgIFB5X0RFQ1JFRihncm91cF9uYW1lKTsKLQkJCQkgICAgUHlfREVDUkVGKGdyb3VwX2luZGV4KTsKLQkJCQkgICAgKytvOyAgICAgLyogZWF0IHRoZSAnPicgKi8KLQkJCQkgICAgYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghaXNhbG51bShQeV9DSEFSTUFTSygqbykpICYmICpvICE9ICdfJykgewotCQkJCQlvID0gYmFja3RyYWNrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJKmcrKyA9ICpvKys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKm8gPT0gJ1snICYmICFlc2NhcGVkKSB7Ci0JCQkqbisrID0gKm87Ci0JCQkrK287CQkgICAgIC8qIGVhdCB0aGUgY2hhciBmb2xsb3dpbmcgJ1snICovCi0JCQkqbisrID0gKm87Ci0JCQl3aGlsZSAobyA8IG9lbmQgJiYgKm8gIT0gJ10nKSB7Ci0JCQkJKytvOwotCQkJCSpuKysgPSAqbzsKLQkJCX0KLQkJCWlmIChvIDwgb2VuZCkKLQkJCQkrK287Ci0JCX0KLQkJZWxzZSBpZiAoKm8gPT0gJ1xcJykgewotCQkJZXNjYXBlZCA9IDE7Ci0JCQkqbisrID0gKm87Ci0JCQkrK287Ci0JCX0KLQkJZWxzZSB7Ci0JCQllc2NhcGVkID0gMDsKLQkJCSpuKysgPSAqbzsKLQkJCSsrbzsKLQkJfQotCX0KLQotCWlmICghKHYgPSBQeVN0cmluZ19Bc1N0cmluZyhucGF0dGVybikpKSB7Ci0JCVB5X0RFQ1JFRihucGF0dGVybik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBfUHlTdHJpbmdfUmVzaXplKCkgZGVjcmVtZW50cyBucGF0dGVybiBvbiBmYWlsdXJlICovCi0JX1B5U3RyaW5nX1Jlc2l6ZSgmbnBhdHRlcm4sIG4gLSB2KTsKLQlyZXR1cm4gbnBhdHRlcm47Ci0KLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3N5bWNvbXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICpwYXR0ZXJuOwotCVB5T2JqZWN0ICp0cmFuID0gTlVMTDsKLQlQeU9iamVjdCAqZ2RpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICpucGF0dGVybjsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiU3xTOnN5bWNvbXAiLCAmcGF0dGVybiwgJnRyYW4pKQotCQlyZXR1cm4gTlVMTDsKLQotCWdkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChnZGljdCA9PSBOVUxMIHx8IChucGF0dGVybiA9IHN5bWNvbXAocGF0dGVybiwgZ2RpY3QpKSA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoZ2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dmFsID0gbmV3cmVnZXhvYmplY3QobnBhdHRlcm4sIHRyYW4sIHBhdHRlcm4sIGdkaWN0KTsKLQlQeV9ERUNSRUYobnBhdHRlcm4pOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9wYXQ7Ci1zdGF0aWMgUHlPYmplY3QgKmNhY2hlX3Byb2c7Ci0KLXN0YXRpYyBpbnQKLXVwZGF0ZV9jYWNoZShQeU9iamVjdCAqcGF0KQotewotCVB5T2JqZWN0ICp0dXBsZSA9IFB5VHVwbGVfUGFjaygxLCBwYXQpOwotCWludCBzdGF0dXMgPSAwOwotCi0JaWYgKCF0dXBsZSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHBhdCAhPSBjYWNoZV9wYXQpIHsKLQkJUHlfWERFQ1JFRihjYWNoZV9wYXQpOwotCQljYWNoZV9wYXQgPSBOVUxMOwotCQlQeV9YREVDUkVGKGNhY2hlX3Byb2cpOwotCQljYWNoZV9wcm9nID0gcmVnZXhfY29tcGlsZSgoUHlPYmplY3QgKilOVUxMLCB0dXBsZSk7Ci0JCWlmIChjYWNoZV9wcm9nID09IE5VTEwpIHsKLQkJCXN0YXR1cyA9IC0xOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWNhY2hlX3BhdCA9IHBhdDsKLQkJUHlfSU5DUkVGKGNhY2hlX3BhdCk7Ci0JfQotICBmaW5hbGx5OgotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X21hdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLQlQeU9iamVjdCAqcGF0LCAqc3RyaW5nOwotCVB5T2JqZWN0ICp0dXBsZSwgKnY7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlNTOm1hdGNoIiwgJnBhdCwgJnN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCWlmICh1cGRhdGVfY2FjaGUocGF0KSA8IDApCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCEodHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoUykiLCBzdHJpbmcpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IHJlZ29ial9tYXRjaCgocmVnZXhvYmplY3QgKiljYWNoZV9wcm9nLCB0dXBsZSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3NlYXJjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlPYmplY3QgKnBhdCwgKnN0cmluZzsKLQlQeU9iamVjdCAqdHVwbGUsICp2OwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTUzpzZWFyY2giLCAmcGF0LCAmc3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVwZGF0ZV9jYWNoZShwYXQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoISh0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihTKSIsIHN0cmluZykpKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gcmVnb2JqX3NlYXJjaCgocmVnZXhvYmplY3QgKiljYWNoZV9wcm9nLCB0dXBsZSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X3NldF9zeW50YXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCWludCBzeW50YXg7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF9zeW50YXgiLCAmc3ludGF4KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3ludGF4ID0gcmVfc2V0X3N5bnRheChzeW50YXgpOwotCS8qIHdpcGUgdGhlIGdsb2JhbCBwYXR0ZXJuIGNhY2hlICovCi0JUHlfWERFQ1JFRihjYWNoZV9wYXQpOwotCWNhY2hlX3BhdCA9IE5VTEw7Ci0JUHlfWERFQ1JFRihjYWNoZV9wcm9nKTsKLQljYWNoZV9wcm9nID0gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3ludGF4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXJlZ2V4X2dldF9zeW50YXgoUHlPYmplY3QgKnNlbGYpCi17Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJlX3N5bnRheCk7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiByZWdleF9nbG9iYWxfbWV0aG9kc1tdID0gewotCXsiY29tcGlsZSIsCXJlZ2V4X2NvbXBpbGUsIE1FVEhfVkFSQVJHU30sCi0JeyJzeW1jb21wIiwJcmVnZXhfc3ltY29tcCwgTUVUSF9WQVJBUkdTfSwKLQl7Im1hdGNoIiwJcmVnZXhfbWF0Y2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZWFyY2giLAlyZWdleF9zZWFyY2gsIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRfc3ludGF4IiwJcmVnZXhfc2V0X3N5bnRheCwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldF9zeW50YXgiLCAgKFB5Q0Z1bmN0aW9uKXJlZ2V4X2dldF9zeW50YXgsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkgICAgIC8qIHNlbnRpbmVsICovCi19OwotCi1QeU1PRElOSVRfRlVOQwotaW5pdHJlZ2V4KHZvaWQpCi17Ci0JUHlPYmplY3QgKm0sICpkLCAqdjsKLQlpbnQgaTsKLQljaGFyICpzOwotCQotCS8qIEluaXRpYWxpemUgb2JqZWN0IHR5cGUgKi8KLQlSZWdleHR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQotCW0gPSBQeV9Jbml0TW9kdWxlKCJyZWdleCIsIHJlZ2V4X2dsb2JhbF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0KLQlpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAidGhlIHJlZ2V4IG1vZHVsZSBpcyBkZXByZWNhdGVkOyAiCi0JCSAgICAgICAicGxlYXNlIHVzZSB0aGUgcmUgbW9kdWxlIikgPCAwKQotCQlyZXR1cm47Ci0JCi0JLyogSW5pdGlhbGl6ZSByZWdleC5lcnJvciBleGNlcHRpb24gKi8KLQl2ID0gUmVnZXhFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicmVnZXguZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAodiA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIHYpICE9IDApCi0JCWdvdG8gZmluYWxseTsKLQkKLQkvKiBJbml0aWFsaXplIHJlZ2V4LmNhc2Vmb2xkIGNvbnN0YW50ICovCi0JaWYgKCEodiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgMjU2KSkpCi0JCWdvdG8gZmluYWxseTsKLQkKLQlpZiAoIShzID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQotCQlnb3RvIGZpbmFsbHk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaWYgKGlzdXBwZXIoaSkpCi0JCQlzW2ldID0gdG9sb3dlcihpKTsKLQkJZWxzZQotCQkJc1tpXSA9IGk7Ci0JfQotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2FzZWZvbGQiLCB2KSA8IDApCi0JCWdvdG8gZmluYWxseTsKLQlQeV9ERUNSRUYodik7Ci0KLQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybjsKLSAgZmluYWxseToKLQkvKiBOb3RoaW5nICovIDsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVnZXhwci5jIGIvTW9kdWxlcy9yZWdleHByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTU0MTcuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9yZWdleHByLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDk0ICswLDAgQEAKLS8qIHJlZ2V4cHIuYwotICoKLSAqIEF1dGhvcjogVGF0dSBZbG9uZW4gPHlsb0BuZ3MuZmk+Ci0gKgotICogQ29weXJpZ2h0IChjKSAxOTkxIFRhdHUgWWxvbmVuLCBFc3BvbywgRmlubGFuZAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dAotICogZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4KLSAqCi0gKiBDcmVhdGVkOiBUaHUgU2VwIDI2IDE3OjE0OjA1IDE5OTEgeWxvCi0gKiBMYXN0IG1vZGlmaWVkOiBNb24gTm92ICA0IDE3OjA2OjQ4IDE5OTEgeWxvCi0gKiBQb3J0ZWQgdG8gVGhpbmsgQzogMTkgSmFuIDE5OTIgZ3VpZG9AY3dpLm5sCi0gKgotICogVGhpcyBjb2RlIGRyYXdzIG1hbnkgaWRlYXMgZnJvbSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhY2thZ2VzIGJ5Ci0gKiBIZW5yeSBTcGVuY2VyIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFRvcm9udG8gYW5kIFJpY2hhcmQgU3RhbGxtYW4gb2YKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogRW1hY3Mtc3BlY2lmaWMgY29kZSBhbmQgc3ludGF4IHRhYmxlIGNvZGUgaXMgYWxtb3N0IGRpcmVjdGx5IGJvcnJvd2VkCi0gKiBmcm9tIEdOVSByZWdleHAuCi0gKgotICogQnVncyBmaXhlZCBhbmQgbG90cyBvZiByZW9yZ2FuaXphdGlvbiBieSBKZWZmcmV5IEMuIE9sbGllLCBBcHJpbAotICogMTk5NyBUaGFua3MgZm9yIGJ1ZyByZXBvcnRzIGFuZCBpZGVhcyBmcm9tIEFuZHJldyBLdWNobGluZywgVGltCi0gKiBQZXRlcnMsIEd1aWRvIHZhbiBSb3NzdW0sIEthLVBpbmcgWWVlLCBTam9lcmQgTXVsbGVuZGVyLCBhbmQKLSAqIHByb2JhYmx5IG9uZSBvciB0d28gb3RoZXJzIHRoYXQgSSdtIGZvcmdldHRpbmcuCi0gKgotICogJElkJCAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSAicmVnZXhwci5oIgotCi0vKiBUaGUgb3JpZ2luYWwgY29kZSBibGl0aGVseSBhc3N1bWVkIHRoYXQgc2l6ZW9mKHNob3J0KSA9PSAyLiAgTm90Ci0gKiBhbHdheXMgdHJ1ZS4gIE9yaWdpbmFsIGluc3RhbmNlcyBvZiAiKHNob3J0KXgiIHdlcmUgcmVwbGFjZWQgYnkKLSAqIFNIT1JUKHgpLCB3aGVyZSBTSE9SVCBpcyAjZGVmaW5lZCBiZWxvdy4gICovCi0KLSNkZWZpbmUgU0hPUlQoeCkgKCh4KSAmIDB4ODAwMCA/ICh4KSAtIDB4MTAwMDAgOiAoeCkpCi0KLS8qIFRoZSBzdGFjayBpbXBsZW1lbnRhdGlvbiBpcyB0YWtlbiBmcm9tIGFuIGlkZWEgYnkgQW5kcmV3IEt1Y2hsaW5nLgotICogSXQncyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBhcnJheXMuIFRoZSBhZHZhbnRhZ2VzIG9mIHRoaXMgb3ZlciBhCi0gKiBzaW1wbGUgbGlua2VkIGxpc3QgYXJlIHRoYXQgdGhlIG51bWJlciBvZiBtYWxsb2NzIHJlcXVpcmVkIGFyZQotICogcmVkdWNlZC4gSXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIGVub3VnaAotICogc3BhY2Ugc28gdGhhdCBzbWFsbCBwYXR0ZXJucyBkb24ndCBldmVyIG5lZWQgdG8gY2FsbCBtYWxsb2MuCi0gKgotICogVGhlIGFkdmFudGFnZXMgb3ZlciBhIHNpbmdsZSBhcnJheSBpcyB0aGF0IGlzIHBlcmlvZGljYWxseQotICogcmVhbGxvY2VkIHdoZW4gbW9yZSBzcGFjZSBpcyBuZWVkZWQgaXMgdGhhdCB3ZSBhdm9pZCBldmVyIGNvcHlpbmcKLSAqIHRoZSBzdGFjay4gKi8KLQotLyogaXRlbV90IGlzIHRoZSBiYXNpYyBzdGFjayBlbGVtZW50LiAgRGVmaW5lZCBhcyBhIHVuaW9uIG9mCi0gKiBzdHJ1Y3R1cmVzIHNvIHRoYXQgYm90aCByZWdpc3RlcnMsIGZhaWx1cmUgcG9pbnRzLCBhbmQgY291bnRlcnMgY2FuCi0gKiBiZSBwdXNoZWQvcG9wcGVkIGZyb20gdGhlIHN0YWNrLiAgVGhlcmUncyBub3RoaW5nIGJ1aWx0IGludG8gdGhlCi0gKiBpdGVtIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhIGNlcnRhaW4gc3RhY2sgaXRlbSBpcyBhIHJlZ2lzdGVyLCBhCi0gKiBmYWlsdXJlIHBvaW50LCBvciBhIGNvdW50ZXIuICovCi0KLXR5cGVkZWYgdW5pb24gaXRlbV90Ci17Ci0Jc3RydWN0Ci0JewotCQlpbnQgbnVtOwotCQlpbnQgbGV2ZWw7Ci0JCXVuc2lnbmVkIGNoYXIgKnN0YXJ0OwotCQl1bnNpZ25lZCBjaGFyICplbmQ7Ci0JfSByZWc7Ci0Jc3RydWN0Ci0JewotCQlpbnQgY291bnQ7Ci0JCWludCBsZXZlbDsKLQkJaW50IHBoYW50b207Ci0JCXVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0JCXVuc2lnbmVkIGNoYXIgKnRleHQ7Ci0JfSBmYWlsOwotCXN0cnVjdAotCXsKLQkJaW50IG51bTsKLQkJaW50IGxldmVsOwotCQlpbnQgY291bnQ7Ci0JfSBjbnRyOwotfSBpdGVtX3Q7Ci0KLSNkZWZpbmUgU1RBQ0tfUEFHRV9TSVpFIDI1NgotI2RlZmluZSBOVU1fUkVHSVNURVJTIDI1NgotCi0vKiBBICdwYWdlJyBvZiBzdGFjayBpdGVtcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaXRlbV9wYWdlX3QKLXsKLQlpdGVtX3QgaXRlbXNbU1RBQ0tfUEFHRV9TSVpFXTsKLQlzdHJ1Y3QgaXRlbV9wYWdlX3QgKnByZXY7Ci0Jc3RydWN0IGl0ZW1fcGFnZV90ICpuZXh0OwotfSBpdGVtX3BhZ2VfdDsKLQotCi10eXBlZGVmIHN0cnVjdCBtYXRjaF9zdGF0ZQotewotCS8qIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvIHRoZSBzdGFjawotCSAqIHNpbmNlIHRoZSBsYXN0IGZhaWx1cmUgcG9pbnQuICovCi0KLQlpbnQgY291bnQ7Ci0KLQkvKiBVc2VkIHRvIGNvbnRyb2wgd2hlbiByZWdpc3RlcnMgbmVlZCB0byBiZSBwdXNoZWQgb250byB0aGUKLQkgKiBzdGFjay4gKi8KLQkKLQlpbnQgbGV2ZWw7Ci0JCi0JLyogVGhlIG51bWJlciBvZiBmYWlsdXJlIHBvaW50cyBvbiB0aGUgc3RhY2suICovCi0JCi0JaW50IHBvaW50OwotCQotCS8qIFN0b3JhZ2UgZm9yIHRoZSByZWdpc3RlcnMuICBFYWNoIHJlZ2lzdGVyIGNvbnNpc3RzIG9mIHR3bwotCSAqIHBvaW50ZXJzIHRvIGNoYXJhY3RlcnMuICBTbyByZWdpc3RlciBOIGlzIHJlcHJlc2VudGVkIGFzCi0JICogc3RhcnRbTl0gYW5kIGVuZFtOXS4gIFRoZSBwb2ludGVycyBtdXN0IGJlIGNvbnZlcnRlZCB0bwotCSAqIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgYmVmb3JlIHJldHVybmluZyB0aGUKLQkgKiByZWdpc3RlcnMgdG8gdGhlIGNhbGxpbmcgcHJvZ3JhbS4gKi8KLQkKLQl1bnNpZ25lZCBjaGFyICpzdGFydFtOVU1fUkVHSVNURVJTXTsKLQl1bnNpZ25lZCBjaGFyICplbmRbTlVNX1JFR0lTVEVSU107Ci0JCi0JLyogS2VlcHMgdHJhY2sgb2Ygd2hldGhlciBhIHJlZ2lzdGVyIGhhcyBjaGFuZ2VkIHJlY2VudGx5LiAqLwotCQotCWludCBjaGFuZ2VkW05VTV9SRUdJU1RFUlNdOwotCQotCS8qIFN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB0aGUgc3RhY2suICovCi0Jc3RydWN0Ci0JewotCQkvKiBpbmRleCBpbnRvIHRoZSBjdXJyZW50IHBhZ2UuICBJZiBpbmRleCA9PSAwIGFuZCB5b3UgbmVlZAotCQkgKiB0byBwb3AgYW4gaXRlbSwgbW92ZSB0byB0aGUgcHJldmlvdXMgcGFnZSBhbmQgc2V0IGluZGV4Ci0JCSAqID0gU1RBQ0tfUEFHRV9TSVpFIC0gMS4gIE90aGVyd2lzZSBkZWNyZW1lbnQgaW5kZXggdG8KLQkJICogcHVzaCBhIHBhZ2UuIElmIGluZGV4ID09IFNUQUNLX1BBR0VfU0laRSBhbmQgeW91IG5lZWQKLQkJICogdG8gcHVzaCBhIHBhZ2UgbW92ZSB0byB0aGUgbmV4dCBwYWdlIGFuZCBzZXQgaW5kZXggPQotCQkgKiAwLiBJZiB0aGVyZSBpcyBubyBuZXcgbmV4dCBwYWdlLCBhbGxvY2F0ZSBhIG5ldyBwYWdlCi0JCSAqIGFuZCBsaW5rIGl0IGluLiBPdGhlcndpc2UsIGluY3JlbWVudCBpbmRleCB0byBwdXNoIGEKLQkJICogcGFnZS4gKi8KLQkJCi0JCWludCBpbmRleDsKLQkJaXRlbV9wYWdlX3QgKmN1cnJlbnQ7IC8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcGFnZS4gKi8KLQkJaXRlbV9wYWdlX3QgZmlyc3Q7IC8qIEZpcnN0IHBhZ2UgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICovCi0JfSBzdGFjazsKLX0gbWF0Y2hfc3RhdGU7Ci0KLS8qIEluaXRpYWxpemUgYSBzdGF0ZSBvYmplY3QgKi8KLQotLyogI2RlZmluZSBORVdfU1RBVEUoc3RhdGUpIFwgKi8KLS8qIG1lbXNldCgmc3RhdGUsIDAsICh2b2lkICopKCZzdGF0ZS5zdGFjaykgLSAodm9pZCAqKSgmc3RhdGUpKTsgXCAqLwotLyogc3RhdGUuc3RhY2suY3VycmVudCA9ICZzdGF0ZS5zdGFjay5maXJzdDsgXCAqLwotLyogc3RhdGUuc3RhY2suZmlyc3QucHJldiA9IE5VTEw7IFwgKi8KLS8qIHN0YXRlLnN0YWNrLmZpcnN0Lm5leHQgPSBOVUxMOyBcICovCi0vKiBzdGF0ZS5zdGFjay5pbmRleCA9IDA7IFwgKi8KLS8qIHN0YXRlLmxldmVsID0gMSAqLwotCi0jZGVmaW5lIE5FV19TVEFURShzdGF0ZSwgbnJlZ3MpIFwKLXsgXAotCWludCBpOyBcCi0JZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspIFwKLQl7IFwKLQkJc3RhdGUuc3RhcnRbaV0gPSBOVUxMOyBcCi0JCXN0YXRlLmVuZFtpXSA9IE5VTEw7IFwKLQkJc3RhdGUuY2hhbmdlZFtpXSA9IDA7IFwKLQl9IFwKLQlzdGF0ZS5zdGFjay5jdXJyZW50ID0gJnN0YXRlLnN0YWNrLmZpcnN0OyBcCi0Jc3RhdGUuc3RhY2suZmlyc3QucHJldiA9IE5VTEw7IFwKLQlzdGF0ZS5zdGFjay5maXJzdC5uZXh0ID0gTlVMTDsgXAotCXN0YXRlLnN0YWNrLmluZGV4ID0gMDsgXAotCXN0YXRlLmxldmVsID0gMTsgXAotCXN0YXRlLmNvdW50ID0gMDsgXAotCXN0YXRlLmxldmVsID0gMDsgXAotCXN0YXRlLnBvaW50ID0gMDsgXAotfQotCi0vKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBtaWdodCBoYXZlIGJlZW4gbWFsbG9jJ2QgKi8KLQotI2RlZmluZSBGUkVFX1NUQVRFKHN0YXRlKSBcCi13aGlsZShzdGF0ZS5zdGFjay5maXJzdC5uZXh0ICE9IE5VTEwpIFwKLXsgXAotCXN0YXRlLnN0YWNrLmN1cnJlbnQgPSBzdGF0ZS5zdGFjay5maXJzdC5uZXh0OyBcCi0Jc3RhdGUuc3RhY2suZmlyc3QubmV4dCA9IHN0YXRlLnN0YWNrLmN1cnJlbnQtPm5leHQ7IFwKLQlmcmVlKHN0YXRlLnN0YWNrLmN1cnJlbnQpOyBcCi19Ci0KLS8qIERpc2NhcmQgdGhlIHRvcCAnY291bnQnIHN0YWNrIGl0ZW1zLiAqLwotCi0jZGVmaW5lIFNUQUNLX0RJU0NBUkQoc3RhY2ssIGNvdW50LCBvbl9lcnJvcikgXAotc3RhY2suaW5kZXggLT0gY291bnQ7IFwKLXdoaWxlIChzdGFjay5pbmRleCA8IDApIFwKLXsgXAotCWlmIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJb25fZXJyb3I7IFwKLQlzdGFjay5jdXJyZW50ID0gc3RhY2suY3VycmVudC0+cHJldjsgXAotCXN0YWNrLmluZGV4ICs9IFNUQUNLX1BBR0VfU0laRTsgXAotfQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIGl0ZW0gb24gdGhlIHN0YWNrLiBVc2VkIHRvIHBvcCBhbgotICogaXRlbSBvZmYgb2YgdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNUQUNLX1BSRVYoc3RhY2ssIHRvcCwgb25fZXJyb3IpIFwKLWlmIChzdGFjay5pbmRleCA9PSAwKSBcCi17IFwKLQlpZiAoc3RhY2suY3VycmVudC0+cHJldiA9PSBOVUxMKSBcCi0JCW9uX2Vycm9yOyBcCi0Jc3RhY2suY3VycmVudCA9IHN0YWNrLmN1cnJlbnQtPnByZXY7IFwKLQlzdGFjay5pbmRleCA9IFNUQUNLX1BBR0VfU0laRSAtIDE7IFwKLX0gXAotZWxzZSBcCi17IFwKLQlzdGFjay5pbmRleC0tOyBcCi19IFwKLXRvcCA9ICYoc3RhY2suY3VycmVudC0+aXRlbXNbc3RhY2suaW5kZXhdKQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIG5leHQgaXRlbSBvbiB0aGUgc3RhY2suIFVzZWQgdG8gcHVzaCBhbiBpdGVtCi0gKiBvbiB0byB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU1RBQ0tfTkVYVChzdGFjaywgdG9wLCBvbl9lcnJvcikgXAotaWYgKHN0YWNrLmluZGV4ID09IFNUQUNLX1BBR0VfU0laRSkgXAoteyBcCi0JaWYgKHN0YWNrLmN1cnJlbnQtPm5leHQgPT0gTlVMTCkgXAotCXsgXAotCQlzdGFjay5jdXJyZW50LT5uZXh0ID0gKGl0ZW1fcGFnZV90ICopbWFsbG9jKHNpemVvZihpdGVtX3BhZ2VfdCkpOyBcCi0JCWlmIChzdGFjay5jdXJyZW50LT5uZXh0ID09IE5VTEwpIFwKLQkJCW9uX2Vycm9yOyBcCi0JCXN0YWNrLmN1cnJlbnQtPm5leHQtPnByZXYgPSBzdGFjay5jdXJyZW50OyBcCi0JCXN0YWNrLmN1cnJlbnQtPm5leHQtPm5leHQgPSBOVUxMOyBcCi0JfSBcCi0Jc3RhY2suY3VycmVudCA9IHN0YWNrLmN1cnJlbnQtPm5leHQ7IFwKLQlzdGFjay5pbmRleCA9IDA7IFwKLX0gXAotdG9wID0gJihzdGFjay5jdXJyZW50LT5pdGVtc1tzdGFjay5pbmRleCsrXSkKLQotLyogU3RvcmUgYSBwb2ludGVyIHRvIHRoZSBpdGVtIHRoYXQgaXMgJ2NvdW50JyBpdGVtcyBiYWNrIGluIHRoZQotICogc3RhY2suIFNUQUNLX0JBQ0soc3RhY2ssIHRvcCwgMSwgb25fZXJyb3IpIGlzIGVxdWl2YWxlbnQgdG8KLSAqIFNUQUNLX1RPUChzdGFjaywgdG9wLCBvbl9lcnJvcikuICAqLwotCi0jZGVmaW5lIFNUQUNLX0JBQ0soc3RhY2ssIHRvcCwgY291bnQsIG9uX2Vycm9yKSBcCi17IFwKLQlpbnQgaW5kZXg7IFwKLQlpdGVtX3BhZ2VfdCAqY3VycmVudDsgXAotCWN1cnJlbnQgPSBzdGFjay5jdXJyZW50OyBcCi0JaW5kZXggPSBzdGFjay5pbmRleCAtIChjb3VudCk7IFwKLQl3aGlsZSAoaW5kZXggPCAwKSBcCi0JeyBcCi0JCWlmIChjdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJCW9uX2Vycm9yOyBcCi0JCWN1cnJlbnQgPSBjdXJyZW50LT5wcmV2OyBcCi0JCWluZGV4ICs9IFNUQUNLX1BBR0VfU0laRTsgXAotCX0gXAotCXRvcCA9ICYoY3VycmVudC0+aXRlbXNbaW5kZXhdKTsgXAotfQotCi0vKiBTdG9yZSBhIHBvaW50ZXIgdG8gdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjay4gRXhlY3V0ZSB0aGUKLSAqICdvbl9lcnJvcicgY29kZSBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgb24gdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNUQUNLX1RPUChzdGFjaywgdG9wLCBvbl9lcnJvcikgXAotaWYgKHN0YWNrLmluZGV4ID09IDApIFwKLXsgXAotCWlmIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpIFwKLQkJb25fZXJyb3I7IFwKLQl0b3AgPSAmKHN0YWNrLmN1cnJlbnQtPnByZXYtPml0ZW1zW1NUQUNLX1BBR0VfU0laRSAtIDFdKTsgXAotfSBcCi1lbHNlIFwKLXsgXAotCXRvcCA9ICYoc3RhY2suY3VycmVudC0+aXRlbXNbc3RhY2suaW5kZXggLSAxXSk7IFwKLX0KLQotLyogVGVzdCB0byBzZWUgaWYgdGhlIHN0YWNrIGlzIGVtcHR5ICovCi0KLSNkZWZpbmUgU1RBQ0tfRU1QVFkoc3RhY2spICgoc3RhY2suaW5kZXggPT0gMCkgJiYgXAotCQkJICAgIChzdGFjay5jdXJyZW50LT5wcmV2ID09IE5VTEwpKQotCi0vKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIHJlZ2lzdGVyICdyZWcnICovCi0KLSNkZWZpbmUgR0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnKSAoc3RhdGUuc3RhcnRbcmVnXSkKLQotLyogUmV0dXJuIHRoZSBlbmQgb2YgcmVnaXN0ZXIgJ3JlZycgKi8KLQotI2RlZmluZSBHRVRfUkVHX0VORChzdGF0ZSwgcmVnKSAoc3RhdGUuZW5kW3JlZ10pCi0KLS8qIFNldCB0aGUgc3RhcnQgb2YgcmVnaXN0ZXIgJ3JlZycuIElmIHRoZSBzdGF0ZSBvZiB0aGUgcmVnaXN0ZXIgbmVlZHMKLSAqIHNhdmluZywgcHVzaCBpdCBvbiB0aGUgc3RhY2suICovCi0KLSNkZWZpbmUgU0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnLCB0ZXh0LCBvbl9lcnJvcikgXAotaWYoc3RhdGUuY2hhbmdlZFtyZWddIDwgc3RhdGUubGV2ZWwpIFwKLXsgXAotCWl0ZW1fdCAqaXRlbTsgXAotCVNUQUNLX05FWFQoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCWl0ZW0tPnJlZy5udW0gPSByZWc7IFwKLQlpdGVtLT5yZWcuc3RhcnQgPSBzdGF0ZS5zdGFydFtyZWddOyBcCi0JaXRlbS0+cmVnLmVuZCA9IHN0YXRlLmVuZFtyZWddOyBcCi0JaXRlbS0+cmVnLmxldmVsID0gc3RhdGUuY2hhbmdlZFtyZWddOyBcCi0Jc3RhdGUuY2hhbmdlZFtyZWddID0gc3RhdGUubGV2ZWw7IFwKLQlzdGF0ZS5jb3VudCsrOyBcCi19IFwKLXN0YXRlLnN0YXJ0W3JlZ10gPSB0ZXh0Ci0KLS8qIFNldCB0aGUgZW5kIG9mIHJlZ2lzdGVyICdyZWcnLiBJZiB0aGUgc3RhdGUgb2YgdGhlIHJlZ2lzdGVyIG5lZWRzCi0gKiBzYXZpbmcsIHB1c2ggaXQgb24gdGhlIHN0YWNrLiAqLwotCi0jZGVmaW5lIFNFVF9SRUdfRU5EKHN0YXRlLCByZWcsIHRleHQsIG9uX2Vycm9yKSBcCi1pZihzdGF0ZS5jaGFuZ2VkW3JlZ10gPCBzdGF0ZS5sZXZlbCkgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JU1RBQ0tfTkVYVChzdGF0ZS5zdGFjaywgaXRlbSwgb25fZXJyb3IpOyBcCi0JaXRlbS0+cmVnLm51bSA9IHJlZzsgXAotCWl0ZW0tPnJlZy5zdGFydCA9IHN0YXRlLnN0YXJ0W3JlZ107IFwKLQlpdGVtLT5yZWcuZW5kID0gc3RhdGUuZW5kW3JlZ107IFwKLQlpdGVtLT5yZWcubGV2ZWwgPSBzdGF0ZS5jaGFuZ2VkW3JlZ107IFwKLQlzdGF0ZS5jaGFuZ2VkW3JlZ10gPSBzdGF0ZS5sZXZlbDsgXAotCXN0YXRlLmNvdW50Kys7IFwKLX0gXAotc3RhdGUuZW5kW3JlZ10gPSB0ZXh0Ci0KLSNkZWZpbmUgUFVTSF9GQUlMVVJFKHN0YXRlLCB4Y29kZSwgeHRleHQsIG9uX2Vycm9yKSBcCi17IFwKLQlpdGVtX3QgKml0ZW07IFwKLQlTVEFDS19ORVhUKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lcnJvcik7IFwKLQlpdGVtLT5mYWlsLmNvZGUgPSB4Y29kZTsgXAotCWl0ZW0tPmZhaWwudGV4dCA9IHh0ZXh0OyBcCi0JaXRlbS0+ZmFpbC5jb3VudCA9IHN0YXRlLmNvdW50OyBcCi0JaXRlbS0+ZmFpbC5sZXZlbCA9IHN0YXRlLmxldmVsOyBcCi0JaXRlbS0+ZmFpbC5waGFudG9tID0gMDsgXAotCXN0YXRlLmNvdW50ID0gMDsgXAotCXN0YXRlLmxldmVsKys7IFwKLQlzdGF0ZS5wb2ludCsrOyBcCi19Ci0KLS8qIFVwZGF0ZSB0aGUgbGFzdCBmYWlsdXJlIHBvaW50IHdpdGggYSBuZXcgcG9zaXRpb24gaW4gdGhlIHRleHQuICovCi0KLSNkZWZpbmUgVVBEQVRFX0ZBSUxVUkUoc3RhdGUsIHh0ZXh0LCBvbl9lcnJvcikgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JU1RBQ0tfQkFDSyhzdGF0ZS5zdGFjaywgaXRlbSwgc3RhdGUuY291bnQgKyAxLCBvbl9lcnJvcik7IFwKLQlpZiAoIWl0ZW0tPmZhaWwucGhhbnRvbSkgXAotCXsgXAotCQlpdGVtX3QgKml0ZW0yOyBcCi0JCVNUQUNLX05FWFQoc3RhdGUuc3RhY2ssIGl0ZW0yLCBvbl9lcnJvcik7IFwKLQkJaXRlbTItPmZhaWwuY29kZSA9IGl0ZW0tPmZhaWwuY29kZTsgXAotCQlpdGVtMi0+ZmFpbC50ZXh0ID0geHRleHQ7IFwKLQkJaXRlbTItPmZhaWwuY291bnQgPSBzdGF0ZS5jb3VudDsgXAotCQlpdGVtMi0+ZmFpbC5sZXZlbCA9IHN0YXRlLmxldmVsOyBcCi0JCWl0ZW0yLT5mYWlsLnBoYW50b20gPSAxOyBcCi0JCXN0YXRlLmNvdW50ID0gMDsgXAotCQlzdGF0ZS5sZXZlbCsrOyBcCi0JCXN0YXRlLnBvaW50Kys7IFwKLQl9IFwKLQllbHNlIFwKLQl7IFwKLQkJU1RBQ0tfRElTQ0FSRChzdGF0ZS5zdGFjaywgc3RhdGUuY291bnQsIG9uX2Vycm9yKTsgXAotCQlTVEFDS19UT1Aoc3RhdGUuc3RhY2ssIGl0ZW0sIG9uX2Vycm9yKTsgXAotCQlpdGVtLT5mYWlsLnRleHQgPSB4dGV4dDsgXAotCQlzdGF0ZS5jb3VudCA9IDA7IFwKLQkJc3RhdGUubGV2ZWwrKzsgXAotCX0gXAotfQotCi0jZGVmaW5lIFBPUF9GQUlMVVJFKHN0YXRlLCB4Y29kZSwgeHRleHQsIG9uX2VtcHR5LCBvbl9lcnJvcikgXAoteyBcCi0JaXRlbV90ICppdGVtOyBcCi0JZG8gXAotCXsgXAotCQl3aGlsZShzdGF0ZS5jb3VudCA+IDApIFwKLQkJeyBcCi0JCQlTVEFDS19QUkVWKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lcnJvcik7IFwKLQkJCXN0YXRlLnN0YXJ0W2l0ZW0tPnJlZy5udW1dID0gaXRlbS0+cmVnLnN0YXJ0OyBcCi0JCQlzdGF0ZS5lbmRbaXRlbS0+cmVnLm51bV0gPSBpdGVtLT5yZWcuZW5kOyBcCi0JCQlzdGF0ZS5jaGFuZ2VkW2l0ZW0tPnJlZy5udW1dID0gaXRlbS0+cmVnLmxldmVsOyBcCi0JCQlzdGF0ZS5jb3VudC0tOyBcCi0JCX0gXAotCQlTVEFDS19QUkVWKHN0YXRlLnN0YWNrLCBpdGVtLCBvbl9lbXB0eSk7IFwKLQkJeGNvZGUgPSBpdGVtLT5mYWlsLmNvZGU7IFwKLQkJeHRleHQgPSBpdGVtLT5mYWlsLnRleHQ7IFwKLQkJc3RhdGUuY291bnQgPSBpdGVtLT5mYWlsLmNvdW50OyBcCi0JCXN0YXRlLmxldmVsID0gaXRlbS0+ZmFpbC5sZXZlbDsgXAotCQlzdGF0ZS5wb2ludC0tOyBcCi0JfSBcCi0Jd2hpbGUgKGl0ZW0tPmZhaWwudGV4dCA9PSBOVUxMKTsgXAotfQotCi1lbnVtIHJlZ2V4cF9jb21waWxlZF9vcHMgLyogb3Bjb2RlcyBmb3IgY29tcGlsZWQgcmVnZXhwICovCi17Ci0JQ2VuZCwJCSAgICAgIC8qIGVuZCBvZiBwYXR0ZXJuIHJlYWNoZWQgKi8KLQlDYm9sLAkJICAgICAgLyogYmVnaW5uaW5nIG9mIGxpbmUgKi8KLQlDZW9sLAkJICAgICAgLyogZW5kIG9mIGxpbmUgKi8KLQlDc2V0LAkJICAgICAgLyogY2hhcmFjdGVyIHNldC4gIEZvbGxvd2VkIGJ5IDMyIGJ5dGVzIG9mIHNldC4gKi8KLQlDZXhhY3QsCQkgICAgICAvKiBmb2xsb3dlZCBieSBhIGJ5dGUgdG8gbWF0Y2ggKi8KLQlDYW55Y2hhciwJICAgICAgLyogbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBuZXdsaW5lICovCi0JQ3N0YXJ0X21lbW9yeSwJICAgICAgLyogc2V0IHJlZ2lzdGVyIHN0YXJ0IGFkZHIgKGZvbGxvd2VkIGJ5IHJlZyBudW1iZXIpICovCi0JQ2VuZF9tZW1vcnksCSAgICAgIC8qIHNldCByZWdpc3RlciBlbmQgYWRkciAoZm9sbG93ZWQgYnkgcmVnIG51bWJlcikgKi8KLQlDbWF0Y2hfbWVtb3J5LAkgICAgICAvKiBtYXRjaCBhIGR1cGxpY2F0ZSBvZiByZWcgY29udGVudHMgKHJlZ251bSBmb2xsb3dzKSovCi0JQ2p1bXAsCQkgICAgICAvKiBmb2xsb3dlZCBieSB0d28gYnl0ZXMgKGxzYixtc2IpIG9mIGRpc3BsYWNlbWVudC4gKi8KLQlDc3Rhcl9qdW1wLAkgICAgICAvKiB3aWxsIGNoYW5nZSB0byBqdW1wL3VwZGF0ZV9mYWlsdXJlX2p1bXAgYXQgcnVudGltZSAqLwotCUNmYWlsdXJlX2p1bXAsCSAgICAgIC8qIGp1bXAgdG8gYWRkciBvbiBmYWlsdXJlICovCi0JQ3VwZGF0ZV9mYWlsdXJlX2p1bXAsIC8qIHVwZGF0ZSB0b3Btb3N0IGZhaWx1cmUgcG9pbnQgYW5kIGp1bXAgKi8KLQlDZHVtbXlfZmFpbHVyZV9qdW1wLCAgLyogcHVzaCBhIGR1bW15IGZhaWx1cmUgcG9pbnQgYW5kIGp1bXAgKi8KLQlDYmVnYnVmLAkgICAgICAvKiBtYXRjaCBhdCBiZWdpbm5pbmcgb2YgYnVmZmVyICovCi0JQ2VuZGJ1ZiwJICAgICAgLyogbWF0Y2ggYXQgZW5kIG9mIGJ1ZmZlciAqLwotCUN3b3JkYmVnLAkgICAgICAvKiBtYXRjaCBhdCBiZWdpbm5pbmcgb2Ygd29yZCAqLwotCUN3b3JkZW5kLAkgICAgICAvKiBtYXRjaCBhdCBlbmQgb2Ygd29yZCAqLwotCUN3b3JkYm91bmQsCSAgICAgIC8qIG1hdGNoIGlmIGF0IHdvcmQgYm91bmRhcnkgKi8KLQlDbm90d29yZGJvdW5kLCAgICAgICAgLyogbWF0Y2ggaWYgbm90IGF0IHdvcmQgYm91bmRhcnkgKi8KLQlDc3ludGF4c3BlYywJICAgICAgLyogbWF0Y2hlcyBzeW50YXggY29kZSAoMSBieXRlIGZvbGxvd3MpICovCi0JQ25vdHN5bnRheHNwZWMsICAgICAgIC8qIG1hdGNoZXMgaWYgc3ludGF4IGNvZGUgZG9lcyBub3QgbWF0Y2ggKDEgYnl0ZSBmb2xsb3dzKSAqLwotCUNyZXBlYXQxCi19OwotCi1lbnVtIHJlZ2V4cF9zeW50YXhfb3AJLyogc3ludGF4IGNvZGVzIGZvciBwbGFpbiBhbmQgcXVvdGVkIGNoYXJhY3RlcnMgKi8KLXsKLQlSZW5kLAkJICAvKiBzcGVjaWFsIGNvZGUgZm9yIGVuZCBvZiByZWdleHAgKi8KLQlSbm9ybWFsLAkgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgKi8KLQlSYW55Y2hhciwJICAvKiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBuZXdsaW5lICovCi0JUnF1b3RlLAkJICAvKiB0aGUgcXVvdGUgY2hhcmFjdGVyICovCi0JUmJvbCwJCSAgLyogbWF0Y2ggYmVnaW5uaW5nIG9mIGxpbmUgKi8KLQlSZW9sLAkJICAvKiBtYXRjaCBlbmQgb2YgbGluZSAqLwotCVJvcHRpb25hbCwJICAvKiBtYXRjaCBwcmVjZWRpbmcgZXhwcmVzc2lvbiBvcHRpb25hbGx5ICovCi0JUnN0YXIsCQkgIC8qIG1hdGNoIHByZWNlZGluZyBleHByIHplcm8gb3IgbW9yZSB0aW1lcyAqLwotCVJwbHVzLAkJICAvKiBtYXRjaCBwcmVjZWRpbmcgZXhwciBvbmUgb3IgbW9yZSB0aW1lcyAqLwotCVJvciwJCSAgLyogbWF0Y2ggZWl0aGVyIG9mIGFsdGVybmF0aXZlcyAqLwotCVJvcGVucGFyLAkgIC8qIG9wZW5pbmcgcGFyZW50aGVzaXMgKi8KLQlSY2xvc2VwYXIsCSAgLyogY2xvc2luZyBwYXJlbnRoZXNpcyAqLwotCVJtZW1vcnksCSAgLyogbWF0Y2ggbWVtb3J5IHJlZ2lzdGVyICovCi0JUmV4dGVuZGVkX21lbW9yeSwgLyogXHZubiB0byBtYXRjaCByZWdpc3RlcnMgMTAtOTkgKi8KLQlSb3BlbnNldCwJICAvKiBvcGVuIHNldC4gIEludGVybmFsIHN5bnRheCBoYXJkLWNvZGVkIGJlbG93LiAqLwotCS8qIHRoZSBmb2xsb3dpbmcgYXJlIGdudSBleHRlbnNpb25zIHRvICJub3JtYWwiIHJlZ2V4cCBzeW50YXggKi8KLQlSYmVnYnVmLAkgIC8qIGJlZ2lubmluZyBvZiBidWZmZXIgKi8KLQlSZW5kYnVmLAkgIC8qIGVuZCBvZiBidWZmZXIgKi8KLQlSd29yZGNoYXIsCSAgLyogd29yZCBjaGFyYWN0ZXIgKi8KLQlSbm90d29yZGNoYXIsCSAgLyogbm90IHdvcmQgY2hhcmFjdGVyICovCi0JUndvcmRiZWcsCSAgLyogYmVnaW5uaW5nIG9mIHdvcmQgKi8KLQlSd29yZGVuZCwJICAvKiBlbmQgb2Ygd29yZCAqLwotCVJ3b3JkYm91bmQsCSAgLyogd29yZCBib3VuZCAqLwotCVJub3R3b3JkYm91bmQsCSAgLyogbm90IHdvcmQgYm91bmQgKi8KLQlSbnVtX29wcwotfTsKLQotc3RhdGljIGludCByZV9jb21waWxlX2luaXRpYWxpemVkID0gMDsKLXN0YXRpYyBpbnQgcmVnZXhwX3N5bnRheCA9IDA7Ci1pbnQgcmVfc3ludGF4ID0gMDsgLyogRXhwb3J0ZWQgY29weSBvZiByZWdleHBfc3ludGF4ICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciByZWdleHBfcGxhaW5fb3BzWzI1Nl07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciByZWdleHBfcXVvdGVkX29wc1syNTZdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVnZXhwX3ByZWNlZGVuY2VzW1JudW1fb3BzXTsKLXN0YXRpYyBpbnQgcmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzOwotc3RhdGljIGludCByZWdleHBfYW5zaV9zZXF1ZW5jZXM7Ci0KLSNkZWZpbmUgTlVNX0xFVkVMUyAgNSAgICAvKiBudW1iZXIgb2YgcHJlY2VkZW5jZSBsZXZlbHMgaW4gdXNlICovCi0jZGVmaW5lIE1BWF9ORVNUSU5HIDEwMCAgLyogbWF4IG5lc3RpbmcgbGV2ZWwgb2Ygb3BlcmF0b3JzICovCi0KLSNkZWZpbmUgU1lOVEFYKGNoKSByZV9zeW50YXhfdGFibGVbKHVuc2lnbmVkIGNoYXIpKGNoKV0KLQotdW5zaWduZWQgY2hhciByZV9zeW50YXhfdGFibGVbMjU2XTsKLQotdm9pZCByZV9jb21waWxlX2luaXRpYWxpemUodm9pZCkKLXsKLQlpbnQgYTsKLSAgCi0Jc3RhdGljIGludCBzeW50YXhfdGFibGVfaW5pdGVkID0gMDsKLQotCWlmICghc3ludGF4X3RhYmxlX2luaXRlZCkKLQl7Ci0JCXN5bnRheF90YWJsZV9pbml0ZWQgPSAxOwotCQltZW1zZXQocmVfc3ludGF4X3RhYmxlLCAwLCAyNTYpOwotCQlmb3IgKGEgPSAnYSc7IGEgPD0gJ3onOyBhKyspCi0JCQlyZV9zeW50YXhfdGFibGVbYV0gPSBTd29yZDsKLQkJZm9yIChhID0gJ0EnOyBhIDw9ICdaJzsgYSsrKQotCQkJcmVfc3ludGF4X3RhYmxlW2FdID0gU3dvcmQ7Ci0JCWZvciAoYSA9ICcwJzsgYSA8PSAnOSc7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSA9IFN3b3JkIHwgU2RpZ2l0IHwgU2hleGRpZ2l0OwotCQlmb3IgKGEgPSAnMCc7IGEgPD0gJzcnOyBhKyspCi0JCQlyZV9zeW50YXhfdGFibGVbYV0gfD0gU29jdGFsZGlnaXQ7Ci0JCWZvciAoYSA9ICdBJzsgYSA8PSAnRic7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSB8PSBTaGV4ZGlnaXQ7Ci0JCWZvciAoYSA9ICdhJzsgYSA8PSAnZic7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSB8PSBTaGV4ZGlnaXQ7Ci0JCXJlX3N5bnRheF90YWJsZVsnXyddID0gU3dvcmQ7Ci0JCWZvciAoYSA9IDk7IGEgPD0gMTM7IGErKykKLQkJCXJlX3N5bnRheF90YWJsZVthXSA9IFN3aGl0ZXNwYWNlOwotCQlyZV9zeW50YXhfdGFibGVbJyAnXSA9IFN3aGl0ZXNwYWNlOwotCX0KLQlyZV9jb21waWxlX2luaXRpYWxpemVkID0gMTsKLQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JewotCQlyZWdleHBfcGxhaW5fb3BzW2FdID0gUm5vcm1hbDsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbYV0gPSBSbm9ybWFsOwotCX0KLQlmb3IgKGEgPSAnMCc7IGEgPD0gJzknOyBhKyspCi0JCXJlZ2V4cF9xdW90ZWRfb3BzW2FdID0gUm1lbW9yeTsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTM0J10gPSBScXVvdGU7Ci0JaWYgKHJlZ2V4cF9zeW50YXggJiBSRV9OT19CS19QQVJFTlMpCi0JewotCQlyZWdleHBfcGxhaW5fb3BzWycoJ10gPSBSb3BlbnBhcjsKLQkJcmVnZXhwX3BsYWluX29wc1snKSddID0gUmNsb3NlcGFyOwotCX0KLQllbHNlCi0JewotCQlyZWdleHBfcXVvdGVkX29wc1snKCddID0gUm9wZW5wYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWycpJ10gPSBSY2xvc2VwYXI7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfTk9fQktfVkJBUikKLQkJcmVnZXhwX3BsYWluX29wc1snXDE3NCddID0gUm9yOwotCWVsc2UKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ1wxNzQnXSA9IFJvcjsKLQlyZWdleHBfcGxhaW5fb3BzWycqJ10gPSBSc3RhcjsKLQlpZiAocmVnZXhwX3N5bnRheCAmIFJFX0JLX1BMVVNfUU0pCi0JewotCQlyZWdleHBfcXVvdGVkX29wc1snKyddID0gUnBsdXM7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyc/J10gPSBSb3B0aW9uYWw7Ci0JfQotCWVsc2UKLQl7Ci0JCXJlZ2V4cF9wbGFpbl9vcHNbJysnXSA9IFJwbHVzOwotCQlyZWdleHBfcGxhaW5fb3BzWyc/J10gPSBSb3B0aW9uYWw7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfTkVXTElORV9PUikKLQkJcmVnZXhwX3BsYWluX29wc1snXG4nXSA9IFJvcjsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTMzJ10gPSBSb3BlbnNldDsKLQlyZWdleHBfcGxhaW5fb3BzWydcMTM2J10gPSBSYm9sOwotCXJlZ2V4cF9wbGFpbl9vcHNbJyQnXSA9IFJlb2w7Ci0JcmVnZXhwX3BsYWluX29wc1snLiddID0gUmFueWNoYXI7Ci0JaWYgKCEocmVnZXhwX3N5bnRheCAmIFJFX05PX0dOVV9FWFRFTlNJT05TKSkKLQl7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyd3J10gPSBSd29yZGNoYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydXJ10gPSBSbm90d29yZGNoYXI7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWyc8J10gPSBSd29yZGJlZzsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJz4nXSA9IFJ3b3JkZW5kOwotCQlyZWdleHBfcXVvdGVkX29wc1snYiddID0gUndvcmRib3VuZDsKLQkJcmVnZXhwX3F1b3RlZF9vcHNbJ0InXSA9IFJub3R3b3JkYm91bmQ7Ci0JCXJlZ2V4cF9xdW90ZWRfb3BzWydgJ10gPSBSYmVnYnVmOwotCQlyZWdleHBfcXVvdGVkX29wc1snXCcnXSA9IFJlbmRidWY7Ci0JfQotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfQU5TSV9IRVgpCi0JCXJlZ2V4cF9xdW90ZWRfb3BzWyd2J10gPSBSZXh0ZW5kZWRfbWVtb3J5OwotCWZvciAoYSA9IDA7IGEgPCBSbnVtX29wczsgYSsrKQotCQlyZWdleHBfcHJlY2VkZW5jZXNbYV0gPSA0OwotCWlmIChyZWdleHBfc3ludGF4ICYgUkVfVElHSFRfVkJBUikKLQl7Ci0JCXJlZ2V4cF9wcmVjZWRlbmNlc1tSb3JdID0gMzsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jib2xdID0gMjsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jlb2xdID0gMjsKLQl9Ci0JZWxzZQotCXsKLQkJcmVnZXhwX3ByZWNlZGVuY2VzW1Jvcl0gPSAyOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmJvbF0gPSAzOwotCQlyZWdleHBfcHJlY2VkZW5jZXNbUmVvbF0gPSAzOwotCX0KLQlyZWdleHBfcHJlY2VkZW5jZXNbUmNsb3NlcGFyXSA9IDE7Ci0JcmVnZXhwX3ByZWNlZGVuY2VzW1JlbmRdID0gMDsKLQlyZWdleHBfY29udGV4dF9pbmRlcF9vcHMgPSAocmVnZXhwX3N5bnRheCAmIFJFX0NPTlRFWFRfSU5ERVBfT1BTKSAhPSAwOwotCXJlZ2V4cF9hbnNpX3NlcXVlbmNlcyA9IChyZWdleHBfc3ludGF4ICYgUkVfQU5TSV9IRVgpICE9IDA7Ci19Ci0KLWludCByZV9zZXRfc3ludGF4KGludCBzeW50YXgpCi17Ci0JaW50IHJldDsKLQkKLQlyZXQgPSByZWdleHBfc3ludGF4OwotCXJlZ2V4cF9zeW50YXggPSBzeW50YXg7Ci0JcmVfc3ludGF4ID0gc3ludGF4OyAvKiBFeHBvcnRlZCBjb3B5ICovCi0JcmVfY29tcGlsZV9pbml0aWFsaXplKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBoZXhfY2hhcl90b19kZWNpbWFsKGludCBjaCkKLXsKLQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkJcmV0dXJuIGNoIC0gJzAnOwotCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQotCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKLQlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKLQkJcmV0dXJuIGNoIC0gJ0EnICsgMTA7Ci0JcmV0dXJuIDE2OwotfQotCi1zdGF0aWMgdm9pZCByZV9jb21waWxlX2Zhc3RtYXBfYXV4KHVuc2lnbmVkIGNoYXIgKmNvZGUsIGludCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnZpc2l0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNhbl9iZV9udWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmYXN0bWFwKQotewotCWludCBhOwotCWludCBiOwotCWludCBzeW50YXhjb2RlOwotCQotCWlmICh2aXNpdGVkW3Bvc10pCi0JCXJldHVybjsgIC8qIHdlIGhhdmUgYWxyZWFkeSBiZWVuIGhlcmUgKi8KLQl2aXNpdGVkW3Bvc10gPSAxOwotCWZvciAoOzspCi0JCXN3aXRjaCAoY29kZVtwb3MrK10pIHsKLQkJY2FzZSBDZW5kOgotCQkJewotCQkJCSpjYW5fYmVfbnVsbCA9IDE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQljYXNlIENib2w6Ci0JCWNhc2UgQ2JlZ2J1ZjoKLQkJY2FzZSBDZW5kYnVmOgotCQljYXNlIEN3b3JkYmVnOgotCQljYXNlIEN3b3JkZW5kOgotCQljYXNlIEN3b3JkYm91bmQ6Ci0JCWNhc2UgQ25vdHdvcmRib3VuZDoKLQkJewotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWZhc3RtYXBbYV0gPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDc3ludGF4c3BlYzoKLQkJewotCQkJc3ludGF4Y29kZSA9IGNvZGVbcG9zKytdOwotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWlmIChTWU5UQVgoYSkgJiBzeW50YXhjb2RlKSAKLQkJCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDbm90c3ludGF4c3BlYzoKLQkJewotCQkJc3ludGF4Y29kZSA9IGNvZGVbcG9zKytdOwotCQkJZm9yIChhID0gMDsgYSA8IDI1NjsgYSsrKQotCQkJCWlmICghKFNZTlRBWChhKSAmIHN5bnRheGNvZGUpICkKLQkJCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDZW9sOgotCQl7Ci0JCQlmYXN0bWFwWydcbiddID0gMTsKLQkJCWlmICgqY2FuX2JlX251bGwgPT0gMCkKLQkJCQkqY2FuX2JlX251bGwgPSAyOyAvKiBjYW4gbWF0Y2ggbnVsbCwgYnV0IG9ubHkgYXQgZW5kIG9mIGJ1ZmZlciovCi0JCQlyZXR1cm47Ci0JCX0KLQkJY2FzZSBDc2V0OgotCQl7Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2Lzg7IGErKykKLQkJCQlpZiAoY29kZVtwb3MgKyBhXSAhPSAwKQotCQkJCQlmb3IgKGIgPSAwOyBiIDwgODsgYisrKQotCQkJCQkJaWYgKGNvZGVbcG9zICsgYV0gJiAoMSA8PCBiKSkKLQkJCQkJCQlmYXN0bWFwWyhhIDw8IDMpICsgYl0gPSAxOwotCQkJcG9zICs9IDI1Ni84OwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2V4YWN0OgotCQl7Ci0JCQlmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKWNvZGVbcG9zXV0gPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2FueWNoYXI6Ci0JCXsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTY7IGErKykKLQkJCQlpZiAoYSAhPSAnXG4nKQotCQkJCQlmYXN0bWFwW2FdID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQljYXNlIENzdGFydF9tZW1vcnk6Ci0JCWNhc2UgQ2VuZF9tZW1vcnk6Ci0JCXsKLQkJCXBvcysrOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQl7Ci0JCQlmb3IgKGEgPSAwOyBhIDwgMjU2OyBhKyspCi0JCQkJZmFzdG1hcFthXSA9IDE7Ci0JCQkqY2FuX2JlX251bGwgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNhc2UgQ2p1bXA6Ci0JCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDdXBkYXRlX2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDc3Rhcl9qdW1wOgotCQl7Ci0JCQlhID0gKHVuc2lnbmVkIGNoYXIpY29kZVtwb3MrK107Ci0JCQlhIHw9ICh1bnNpZ25lZCBjaGFyKWNvZGVbcG9zKytdIDw8IDg7Ci0JCQlwb3MgKz0gKGludClTSE9SVChhKTsKLQkJCWlmICh2aXNpdGVkW3Bvc10pCi0JCQl7Ci0JCQkJLyogYXJnaC4uLiB0aGUgcmVnZXhwIGNvbnRhaW5zIGVtcHR5IGxvb3BzLiAgVGhpcyBpcyBub3QKLQkJCQkgICBnb29kLCBhcyB0aGlzIG1heSBjYXVzZSBhIGZhaWx1cmUgc3RhY2sgb3ZlcmZsb3cgd2hlbgotCQkJCSAgIG1hdGNoaW5nLiAgT2ggd2VsbC4gKi8KLQkJCQkvKiB0aGlzIHBhdGggbGVhZHMgbm93aGVyZTsgcHVyc3VlIG90aGVyIHBhdGhzLiAqLwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXZpc2l0ZWRbcG9zXSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhciljb2RlW3BvcysrXTsKLQkJCWEgfD0gKHVuc2lnbmVkIGNoYXIpY29kZVtwb3MrK10gPDwgODsKLQkJCWEgPSBwb3MgKyAoaW50KVNIT1JUKGEpOwotCQkJcmVfY29tcGlsZV9mYXN0bWFwX2F1eChjb2RlLCBhLCB2aXNpdGVkLCBjYW5fYmVfbnVsbCwgZmFzdG1hcCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENyZXBlYXQxOgotCQl7Ci0JCQlwb3MgKz0gMjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbmtub3duIHJlZ2V4IG9wY29kZTogbWVtb3J5IGNvcnJ1cHRlZD8iKTsKLQkJICAgICAgICByZXR1cm47Ci0JCQkvKk5PVFJFQUNIRUQqLwotCQl9Ci0JCX0KLX0KLQotc3RhdGljIGludCByZV9kb19jb21waWxlX2Zhc3RtYXAodW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgdXNlZCwgaW50IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNhbl9iZV9udWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZmFzdG1hcCkKLXsKLQl1bnNpZ25lZCBjaGFyIHNtYWxsX3Zpc2l0ZWRbNTEyXSwgKnZpc2l0ZWQ7Ci0gICAKLQlpZiAodXNlZCA8PSBzaXplb2Yoc21hbGxfdmlzaXRlZCkpCi0JCXZpc2l0ZWQgPSBzbWFsbF92aXNpdGVkOwotCWVsc2UKLQl7Ci0JCXZpc2l0ZWQgPSBtYWxsb2ModXNlZCk7Ci0JCWlmICghdmlzaXRlZCkKLQkJCXJldHVybiAwOwotCX0KLQkqY2FuX2JlX251bGwgPSAwOwotCW1lbXNldChmYXN0bWFwLCAwLCAyNTYpOwotCW1lbXNldCh2aXNpdGVkLCAwLCB1c2VkKTsKLQlyZV9jb21waWxlX2Zhc3RtYXBfYXV4KGJ1ZmZlciwgcG9zLCB2aXNpdGVkLCBjYW5fYmVfbnVsbCwgZmFzdG1hcCk7Ci0JaWYgKHZpc2l0ZWQgIT0gc21hbGxfdmlzaXRlZCkKLQkJZnJlZSh2aXNpdGVkKTsKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCByZV9jb21waWxlX2Zhc3RtYXAocmVnZXhwX3QgYnVmcCkKLXsKLQlpZiAoIWJ1ZnAtPmZhc3RtYXAgfHwgYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSkKLQkJcmV0dXJuOwotCWFzc2VydChidWZwLT51c2VkID4gMCk7Ci0JaWYgKCFyZV9kb19jb21waWxlX2Zhc3RtYXAoYnVmcC0+YnVmZmVyLAotCQkJCSAgIGJ1ZnAtPnVzZWQsCi0JCQkJICAgMCwKLQkJCQkgICAmYnVmcC0+Y2FuX2JlX251bGwsCi0JCQkJICAgYnVmcC0+ZmFzdG1hcCkpCi0JCXJldHVybjsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgcmV0dXJuOwotCWlmIChidWZwLT5idWZmZXJbMF0gPT0gQ2JvbCkKLQkJYnVmcC0+YW5jaG9yID0gMTsgICAvKiBiZWdsaW5lICovCi0JZWxzZQotCQlpZiAoYnVmcC0+YnVmZmVyWzBdID09IENiZWdidWYpCi0JCQlidWZwLT5hbmNob3IgPSAyOyAvKiBiZWdidWYgKi8KLQkJZWxzZQotCQkJYnVmcC0+YW5jaG9yID0gMDsgLyogbm9uZSAqLwotCWJ1ZnAtPmZhc3RtYXBfYWNjdXJhdGUgPSAxOwotfQotCi0vKiAKLSAqIHN0YXIgaXMgY29kZWQgYXM6Ci0gKiAxOiBmYWlsdXJlX2p1bXAgMgotICogICAgLi4uIGNvZGUgZm9yIG9wZXJhbmQgb2Ygc3RhcgotICogICAgc3Rhcl9qdW1wIDEKLSAqIDI6IC4uLiBjb2RlIGFmdGVyIHN0YXIKLSAqCi0gKiBXZSBjaGFuZ2UgdGhlIHN0YXJfanVtcCB0byB1cGRhdGVfZmFpbHVyZV9qdW1wIGlmIHdlIGNhbiBkZXRlcm1pbmUKLSAqIHRoYXQgaXQgaXMgc2FmZSB0byBkbyBzbzsgb3RoZXJ3aXNlIHdlIGNoYW5nZSBpdCB0byBhbiBvcmRpbmFyeQotICoganVtcC4KLSAqCi0gKiBwbHVzIGlzIGNvZGVkIGFzCi0gKgotICogICAganVtcCAyCi0gKiAxOiBmYWlsdXJlX2p1bXAgMwotICogMjogLi4uIGNvZGUgZm9yIG9wZXJhbmQgb2YgcGx1cwotICogICAgc3Rhcl9qdW1wIDEKLSAqIDM6IC4uLiBjb2RlIGFmdGVyIHBsdXMKLSAqCi0gKiBGb3Igc3Rhcl9qdW1wIGNvbnNpZGVyYXRpb25zIHRoaXMgaXMgcHJvY2Vzc2VkIGlkZW50aWNhbGx5IHRvIHN0YXIuCi0gKgotICovCi0KLXN0YXRpYyBpbnQgcmVfb3B0aW1pemVfc3Rhcl9qdW1wKHJlZ2V4cF90IGJ1ZnAsIHVuc2lnbmVkIGNoYXIgKmNvZGUpCi17Ci0JdW5zaWduZWQgY2hhciBtYXBbMjU2XTsKLQl1bnNpZ25lZCBjaGFyIGNhbl9iZV9udWxsOwotCXVuc2lnbmVkIGNoYXIgKnAxOwotCXVuc2lnbmVkIGNoYXIgKnAyOwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JaW50IGE7Ci0JaW50IGI7Ci0JaW50IG51bV9pbnN0cnVjdGlvbnMgPSAwOwotCi0JYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JYSB8PSAodW5zaWduZWQgY2hhcikqY29kZSsrIDw8IDg7Ci0JYSA9IChpbnQpU0hPUlQoYSk7Ci0JCi0JcDEgPSBjb2RlICsgYSArIDM7IC8qIHNraXAgdGhlIGZhaWx1cmVfanVtcCAqLwotCS8qIENoZWNrIHRoYXQgdGhlIGp1bXAgaXMgd2l0aGluIHRoZSBwYXR0ZXJuICovCi0JaWYgKHAxPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZDxwMSkKLQkgIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiUmVnZXggVk0ganVtcCBvdXQgb2YgYm91bmRzIChmYWlsdXJlX2p1bXAgb3B0KSIpOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQkKLQlhc3NlcnQocDFbLTNdID09IENmYWlsdXJlX2p1bXApOwotCXAyID0gY29kZTsKLQkvKiBwMSBwb2ludHMgaW5zaWRlIGxvb3AsIHAyIHBvaW50cyB0byBhZnRlciBsb29wICovCi0JaWYgKCFyZV9kb19jb21waWxlX2Zhc3RtYXAoYnVmcC0+YnVmZmVyLCBidWZwLT51c2VkLAotCQkJCSAgIChpbnQpKHAyIC0gYnVmcC0+YnVmZmVyKSwKLQkJCQkgICAmY2FuX2JlX251bGwsIG1hcCkpCi0JCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQkKLQkvKiBJZiB3ZSBtaWdodCBpbnRyb2R1Y2UgYSBuZXcgdXBkYXRlIHBvaW50IGluc2lkZSB0aGUKLQkgKiBsb29wLCB3ZSBjYW4ndCBvcHRpbWl6ZSBiZWNhdXNlIHRoZW4gdXBkYXRlX2p1bXAgd291bGQKLQkgKiB1cGRhdGUgYSB3cm9uZyBmYWlsdXJlIHBvaW50LiAgVGh1cyB3ZSBoYXZlIHRvIGJlCi0JICogcXVpdGUgY2FyZWZ1bCBoZXJlLgotCSAqLwotCQotCS8qIGxvb3AgdW50aWwgd2UgZmluZCBzb21ldGhpbmcgdGhhdCBjb25zdW1lcyBhIGNoYXJhY3RlciAqLwotICBsb29wX3AxOgotCW51bV9pbnN0cnVjdGlvbnMrKzsKLQlzd2l0Y2ggKCpwMSsrKQotCXsKLQljYXNlIENib2w6Ci0JY2FzZSBDZW9sOgotCWNhc2UgQ2JlZ2J1ZjoKLQljYXNlIENlbmRidWY6Ci0JY2FzZSBDd29yZGJlZzoKLQljYXNlIEN3b3JkZW5kOgotCWNhc2UgQ3dvcmRib3VuZDoKLQljYXNlIENub3R3b3JkYm91bmQ6Ci0JewotCQlnb3RvIGxvb3BfcDE7Ci0JfQotCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQljYXNlIENlbmRfbWVtb3J5OgotCXsKLQkJcDErKzsKLQkJZ290byBsb29wX3AxOwotCX0KLQljYXNlIENleGFjdDoKLQl7Ci0JCWNoID0gKHVuc2lnbmVkIGNoYXIpKnAxKys7Ci0JCWlmIChtYXBbKGludCljaF0pCi0JCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCWJyZWFrOwotCX0KLQljYXNlIENhbnljaGFyOgotCXsKLQkJZm9yIChiID0gMDsgYiA8IDI1NjsgYisrKQotCQkJaWYgKGIgIT0gJ1xuJyAmJiBtYXBbYl0pCi0JCQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCQlicmVhazsKLQl9Ci0JY2FzZSBDc2V0OgotCXsKLQkJZm9yIChiID0gMDsgYiA8IDI1NjsgYisrKQotCQkJaWYgKChwMVtiID4+IDNdICYgKDEgPDwgKGIgJiA3KSkpICYmIG1hcFtiXSkKLQkJCQlnb3RvIG1ha2Vfbm9ybWFsX2p1bXA7Ci0JCXAxICs9IDI1Ni84OwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQl7Ci0JCWdvdG8gbWFrZV9ub3JtYWxfanVtcDsKLQl9Ci0JfQotCS8qIG5vdyB3ZSBrbm93IHRoYXQgd2UgY2FuJ3QgYmFja3RyYWNrLiAqLwotCXdoaWxlIChwMSAhPSBwMiAtIDMpCi0JewotCQludW1faW5zdHJ1Y3Rpb25zKys7Ci0JCXN3aXRjaCAoKnAxKyspCi0JCXsKLQkJY2FzZSBDZW5kOgotCQl7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIENib2w6Ci0JCWNhc2UgQ2VvbDoKLQkJY2FzZSBDYW55Y2hhcjoKLQkJY2FzZSBDYmVnYnVmOgotCQljYXNlIENlbmRidWY6Ci0JCWNhc2UgQ3dvcmRiZWc6Ci0JCWNhc2UgQ3dvcmRlbmQ6Ci0JCWNhc2UgQ3dvcmRib3VuZDoKLQkJY2FzZSBDbm90d29yZGJvdW5kOgotCQl7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzZXQ6Ci0JCXsKLQkJCXAxICs9IDI1Ni84OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDZXhhY3Q6Ci0JCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQkJY2FzZSBDZW5kX21lbW9yeToKLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQljYXNlIENzeW50YXhzcGVjOgotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQlwMSsrOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDanVtcDoKLQkJY2FzZSBDc3Rhcl9qdW1wOgotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ3VwZGF0ZV9mYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQkJewotCQkJZ290byBtYWtlX25vcm1hbF9qdW1wOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JCX0KLQl9Ci0JCi0JLyogbWFrZV91cGRhdGVfanVtcDogKi8KLQljb2RlIC09IDM7Ci0JYSArPSAzOyAgLyoganVtcCB0byBhZnRlciB0aGUgQ2ZhaWx1cmVfanVtcCAqLwotCWNvZGVbMF0gPSBDdXBkYXRlX2ZhaWx1cmVfanVtcDsKLQljb2RlWzFdID0gYSAmIDB4ZmY7Ci0JY29kZVsyXSA9IGEgPj4gODsKLQlpZiAobnVtX2luc3RydWN0aW9ucyA+IDEpCi0JCXJldHVybiAxOwotCWFzc2VydChudW1faW5zdHJ1Y3Rpb25zID09IDEpOwotCS8qIGlmIHRoZSBvbmx5IGluc3RydWN0aW9uIG1hdGNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyLCB3ZSBjYW4gZG8KLQkgKiBiZXR0ZXIgKi8KLQlwMSA9IGNvZGUgKyAzICsgYTsgICAvKiBzdGFydCBvZiBzb2xlIGluc3RydWN0aW9uICovCi0JaWYgKCpwMSA9PSBDc2V0IHx8ICpwMSA9PSBDZXhhY3QgfHwgKnAxID09IENhbnljaGFyIHx8Ci0JICAgICpwMSA9PSBDc3ludGF4c3BlYyB8fCAqcDEgPT0gQ25vdHN5bnRheHNwZWMpCi0JCWNvZGVbMF0gPSBDcmVwZWF0MTsKLQlyZXR1cm4gMTsKLQkKLSAgbWFrZV9ub3JtYWxfanVtcDoKLQljb2RlIC09IDM7Ci0JKmNvZGUgPSBDanVtcDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCByZV9vcHRpbWl6ZShyZWdleHBfdCBidWZwKQotewotCXVuc2lnbmVkIGNoYXIgKmNvZGU7Ci0JCi0JY29kZSA9IGJ1ZnAtPmJ1ZmZlcjsKLQkKLQl3aGlsZSgxKQotCXsKLQkJc3dpdGNoICgqY29kZSsrKQotCQl7Ci0JCWNhc2UgQ2VuZDoKLQkJewotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY2FzZSBDYW55Y2hhcjoKLQkJY2FzZSBDYm9sOgotCQljYXNlIENlb2w6Ci0JCWNhc2UgQ2JlZ2J1ZjoKLQkJY2FzZSBDZW5kYnVmOgotCQljYXNlIEN3b3JkYmVnOgotCQljYXNlIEN3b3JkZW5kOgotCQljYXNlIEN3b3JkYm91bmQ6Ci0JCWNhc2UgQ25vdHdvcmRib3VuZDoKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDc2V0OgotCQl7Ci0JCQljb2RlICs9IDI1Ni84OwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBDZXhhY3Q6Ci0JCWNhc2UgQ3N0YXJ0X21lbW9yeToKLQkJY2FzZSBDZW5kX21lbW9yeToKLQkJY2FzZSBDbWF0Y2hfbWVtb3J5OgotCQljYXNlIENzeW50YXhzcGVjOgotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQljb2RlKys7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENzdGFyX2p1bXA6Ci0JCXsKLQkJCWlmICghcmVfb3B0aW1pemVfc3Rhcl9qdW1wKGJ1ZnAsIGNvZGUpKQotCQkJewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCX0KLQkJY2FzZSBDdXBkYXRlX2ZhaWx1cmVfanVtcDoKLQkJY2FzZSBDanVtcDoKLQkJY2FzZSBDZHVtbXlfZmFpbHVyZV9qdW1wOgotCQljYXNlIENmYWlsdXJlX2p1bXA6Ci0JCWNhc2UgQ3JlcGVhdDE6Ci0JCXsKLQkJCWNvZGUgKz0gMjsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJCXJldHVybiAwOwotCQl9Ci0JCX0KLQl9Ci19Ci0KLSNkZWZpbmUgTkVYVENIQVIodmFyKSBcCi17IFwKLQlpZiAocG9zID49IHNpemUpIFwKLQkJZ290byBlbmRzX3ByZW1hdHVyZWx5OyBcCi0JKHZhcikgPSByZWdleFtwb3NdOyBcCi0JcG9zKys7IFwKLX0KLQotI2RlZmluZSBBTExPQyhhbW91bnQpIFwKLXsgXAotCSAgaWYgKHBhdHRlcm5fb2Zmc2V0KyhhbW91bnQpID4gYWxsb2MpIFwKLQkgIHsgXAotCQkgIGFsbG9jICs9IDI1NiArIChhbW91bnQpOyBcCi0JCSAgcGF0dGVybiA9IHJlYWxsb2MocGF0dGVybiwgYWxsb2MpOyBcCi0JCSAgaWYgKCFwYXR0ZXJuKSBcCi0JCQkgIGdvdG8gb3V0X29mX21lbW9yeTsgXAotCSAgfSBcCi19Ci0KLSNkZWZpbmUgU1RPUkUoY2gpIHBhdHRlcm5bcGF0dGVybl9vZmZzZXQrK10gPSAoY2gpCi0KLSNkZWZpbmUgQ1VSUkVOVF9MRVZFTF9TVEFSVCAoc3RhcnRzW3N0YXJ0c19iYXNlICsgY3VycmVudF9sZXZlbF0pCi0KLSNkZWZpbmUgU0VUX0xFVkVMX1NUQVJUIHN0YXJ0c1tzdGFydHNfYmFzZSArIGN1cnJlbnRfbGV2ZWxdID0gcGF0dGVybl9vZmZzZXQKLQotI2RlZmluZSBQVVNIX0xFVkVMX1NUQVJUUyBcCi1pZiAoc3RhcnRzX2Jhc2UgPCAoTUFYX05FU1RJTkctMSkqTlVNX0xFVkVMUykgXAotCXN0YXJ0c19iYXNlICs9IE5VTV9MRVZFTFM7IFwKLWVsc2UgXAotCWdvdG8gdG9vX2NvbXBsZXggXAotCi0jZGVmaW5lIFBPUF9MRVZFTF9TVEFSVFMgc3RhcnRzX2Jhc2UgLT0gTlVNX0xFVkVMUwotCi0jZGVmaW5lIFBVVF9BRERSKG9mZnNldCxhZGRyKSBcCi17IFwKLQlpbnQgZGlzcCA9IChhZGRyKSAtIChvZmZzZXQpIC0gMjsgXAotCXBhdHRlcm5bKG9mZnNldCldID0gZGlzcCAmIDB4ZmY7IFwKLQlwYXR0ZXJuWyhvZmZzZXQpKzFdID0gKGRpc3A+PjgpICYgMHhmZjsgXAotfQotCi0jZGVmaW5lIElOU0VSVF9KVU1QKHBvcyx0eXBlLGFkZHIpIFwKLXsgXAotCWludCBhLCBwID0gKHBvcyksIHQgPSAodHlwZSksIGFkID0gKGFkZHIpOyBcCi0JZm9yIChhID0gcGF0dGVybl9vZmZzZXQgLSAxOyBhID49IHA7IGEtLSkgXAotCQlwYXR0ZXJuW2EgKyAzXSA9IHBhdHRlcm5bYV07IFwKLQlwYXR0ZXJuW3BdID0gdDsgXAotCVBVVF9BRERSKHArMSxhZCk7IFwKLQlwYXR0ZXJuX29mZnNldCArPSAzOyBcCi19Ci0KLSNkZWZpbmUgU0VUQklUKGJ1ZixvZmZzZXQsYml0KSAoYnVmKVsob2Zmc2V0KSsoYml0KS84XSB8PSAoMTw8KChiaXQpICYgNykpCi0KLSNkZWZpbmUgU0VUX0ZJRUxEUyBcCi17IFwKLQlidWZwLT5hbGxvY2F0ZWQgPSBhbGxvYzsgXAotCWJ1ZnAtPmJ1ZmZlciA9IHBhdHRlcm47IFwKLQlidWZwLT51c2VkID0gcGF0dGVybl9vZmZzZXQ7IFwKLX0KLSAgICAKLSNkZWZpbmUgR0VUSEVYKHZhcikgXAoteyBcCi0JdW5zaWduZWQgY2hhciBnZXRoZXhfY2gsIGdldGhleF92YWx1ZTsgXAotCU5FWFRDSEFSKGdldGhleF9jaCk7IFwKLQlnZXRoZXhfdmFsdWUgPSBoZXhfY2hhcl90b19kZWNpbWFsKGdldGhleF9jaCk7IFwKLQlpZiAoZ2V0aGV4X3ZhbHVlID09IDE2KSBcCi0JCWdvdG8gaGV4X2Vycm9yOyBcCi0JTkVYVENIQVIoZ2V0aGV4X2NoKTsgXAotCWdldGhleF9jaCA9IGhleF9jaGFyX3RvX2RlY2ltYWwoZ2V0aGV4X2NoKTsgXAotCWlmIChnZXRoZXhfY2ggPT0gMTYpIFwKLQkJZ290byBoZXhfZXJyb3I7IFwKLQkodmFyKSA9IGdldGhleF92YWx1ZSAqIDE2ICsgZ2V0aGV4X2NoOyBcCi19Ci0KLSNkZWZpbmUgQU5TSV9UUkFOU0xBVEUoY2gpIFwKLXsgXAotCXN3aXRjaCAoY2gpIFwKLQl7IFwKLQljYXNlICdhJzogXAotCWNhc2UgJ0EnOiBcCi0JeyBcCi0JCWNoID0gNzsgLyogYXVkaWJsZSBiZWxsICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICdiJzogXAotCWNhc2UgJ0InOiBcCi0JeyBcCi0JCWNoID0gODsgLyogYmFja3NwYWNlICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICdmJzogXAotCWNhc2UgJ0YnOiBcCi0JeyBcCi0JCWNoID0gMTI7IC8qIGZvcm0gZmVlZCAqLyBcCi0JCWJyZWFrOyBcCi0JfSBcCi0JY2FzZSAnbic6IFwKLQljYXNlICdOJzogXAotCXsgXAotCQljaCA9IDEwOyAvKiBsaW5lIGZlZWQgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ3InOiBcCi0JY2FzZSAnUic6IFwKLQl7IFwKLQkJY2ggPSAxMzsgLyogY2FycmlhZ2UgcmV0dXJuICovIFwKLQkJYnJlYWs7IFwKLQl9IFwKLQljYXNlICd0JzogXAotCWNhc2UgJ1QnOiBcCi0JeyBcCi0JICAgICAgY2ggPSA5OyAvKiB0YWIgKi8gXAotCSAgICAgIGJyZWFrOyBcCi0JfSBcCi0JY2FzZSAndic6IFwKLQljYXNlICdWJzogXAotCXsgXAotCQljaCA9IDExOyAvKiB2ZXJ0aWNhbCB0YWIgKi8gXAotCQlicmVhazsgXAotCX0gXAotCWNhc2UgJ3gnOiAvKiBoZXggY29kZSAqLyBcCi0JY2FzZSAnWCc6IFwKLQl7IFwKLQkJR0VUSEVYKGNoKTsgXAotCQlicmVhazsgXAotCX0gXAotCWRlZmF1bHQ6IFwKLQl7IFwKLQkJLyogb3RoZXIgY2hhcmFjdGVycyBwYXNzZWQgdGhyb3VnaCAqLyBcCi0JCWlmICh0cmFuc2xhdGUpIFwKLQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsgXAotCQlicmVhazsgXAotCX0gXAotCX0gXAotfQotCi1jaGFyICpyZV9jb21waWxlX3BhdHRlcm4odW5zaWduZWQgY2hhciAqcmVnZXgsIGludCBzaXplLCByZWdleHBfdCBidWZwKQotewotCWludCBhOwotCWludCBwb3M7Ci0JaW50IG9wOwotCWludCBjdXJyZW50X2xldmVsOwotCWludCBsZXZlbDsKLQlpbnQgb3Bjb2RlOwotCWludCBwYXR0ZXJuX29mZnNldCA9IDAsIGFsbG9jOwotCWludCBzdGFydHNbTlVNX0xFVkVMUyAqIE1BWF9ORVNUSU5HXTsKLQlpbnQgc3RhcnRzX2Jhc2U7Ci0JaW50IGZ1dHVyZV9qdW1wc1tNQVhfTkVTVElOR107Ci0JaW50IG51bV9qdW1wczsKLQl1bnNpZ25lZCBjaGFyIGNoID0gJ1wwJzsKLQl1bnNpZ25lZCBjaGFyICpwYXR0ZXJuOwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsKLQlpbnQgbmV4dF9yZWdpc3RlcjsKLQlpbnQgcGFyZW5fZGVwdGg7Ci0JaW50IG51bV9vcGVuX3JlZ2lzdGVyczsKLQlpbnQgb3Blbl9yZWdpc3RlcnNbUkVfTlJFR1NdOwotCWludCBiZWdpbm5pbmdfY29udGV4dDsKLQkKLQlpZiAoIXJlX2NvbXBpbGVfaW5pdGlhbGl6ZWQpCi0JCXJlX2NvbXBpbGVfaW5pdGlhbGl6ZSgpOwotCWJ1ZnAtPnVzZWQgPSAwOwotCWJ1ZnAtPmZhc3RtYXBfYWNjdXJhdGUgPSAwOwotCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQlidWZwLT5udW1fcmVnaXN0ZXJzID0gMTsKLQl0cmFuc2xhdGUgPSBidWZwLT50cmFuc2xhdGU7Ci0JcGF0dGVybiA9IGJ1ZnAtPmJ1ZmZlcjsKLQlhbGxvYyA9IGJ1ZnAtPmFsbG9jYXRlZDsKLQlpZiAoYWxsb2MgPT0gMCB8fCBwYXR0ZXJuID09IE5VTEwpCi0JewotCQlhbGxvYyA9IDI1NjsKLQkJcGF0dGVybiA9IG1hbGxvYyhhbGxvYyk7Ci0JCWlmICghcGF0dGVybikKLQkJCWdvdG8gb3V0X29mX21lbW9yeTsKLQl9Ci0JcGF0dGVybl9vZmZzZXQgPSAwOwotCXN0YXJ0c19iYXNlID0gMDsKLQludW1fanVtcHMgPSAwOwotCWN1cnJlbnRfbGV2ZWwgPSAwOwotCVNFVF9MRVZFTF9TVEFSVDsKLQludW1fb3Blbl9yZWdpc3RlcnMgPSAwOwotCW5leHRfcmVnaXN0ZXIgPSAxOwotCXBhcmVuX2RlcHRoID0gMDsKLQliZWdpbm5pbmdfY29udGV4dCA9IDE7Ci0Jb3AgPSAtMTsKLQkvKiB3ZSB1c2UgUmVuZCBkdW1teSB0byBlbnN1cmUgdGhhdCBwZW5kaW5nIGp1bXBzIGFyZSB1cGRhdGVkCi0JICAgKGR1ZSB0byBsb3cgcHJpb3JpdHkgb2YgUmVuZCkgYmVmb3JlIGV4aXRpbmcgdGhlIGxvb3AuICovCi0JcG9zID0gMDsKLQl3aGlsZSAob3AgIT0gUmVuZCkKLQl7Ci0JCWlmIChwb3MgPj0gc2l6ZSkKLQkJCW9wID0gUmVuZDsKLQkJZWxzZQotCQl7Ci0JCQlORVhUQ0hBUihjaCk7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCW9wID0gcmVnZXhwX3BsYWluX29wc1sodW5zaWduZWQgY2hhciljaF07Ci0JCQlpZiAob3AgPT0gUnF1b3RlKQotCQkJewotCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQlvcCA9IHJlZ2V4cF9xdW90ZWRfb3BzWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCQlpZiAob3AgPT0gUm5vcm1hbCAmJiByZWdleHBfYW5zaV9zZXF1ZW5jZXMpCi0JCQkJCUFOU0lfVFJBTlNMQVRFKGNoKTsKLQkJCX0KLQkJfQotCQlsZXZlbCA9IHJlZ2V4cF9wcmVjZWRlbmNlc1tvcF07Ci0JCS8qIHByaW50ZigiY2g9JyVjJyBvcD0lZCBsZXZlbD0lZCBjdXJyZW50X2xldmVsPSVkCi0JCSAgIGN1cmxldnN0YXJ0PSVkXG4iLCBjaCwgb3AsIGxldmVsLCBjdXJyZW50X2xldmVsLAotCQkgICBDVVJSRU5UX0xFVkVMX1NUQVJUKTsgKi8KLQkJaWYgKGxldmVsID4gY3VycmVudF9sZXZlbCkKLQkJewotCQkJZm9yIChjdXJyZW50X2xldmVsKys7IGN1cnJlbnRfbGV2ZWwgPCBsZXZlbDsgY3VycmVudF9sZXZlbCsrKQotCQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJfQotCQllbHNlCi0JCQlpZiAobGV2ZWwgPCBjdXJyZW50X2xldmVsKQotCQkJewotCQkJCWN1cnJlbnRfbGV2ZWwgPSBsZXZlbDsKLQkJCQlmb3IgKDtudW1fanVtcHMgPiAwICYmCi0JCQkJCSAgICAgZnV0dXJlX2p1bXBzW251bV9qdW1wcy0xXSA+PSBDVVJSRU5UX0xFVkVMX1NUQVJUOwotCQkJCSAgICAgbnVtX2p1bXBzLS0pCi0JCQkJCVBVVF9BRERSKGZ1dHVyZV9qdW1wc1tudW1fanVtcHMtMV0sIHBhdHRlcm5fb2Zmc2V0KTsKLQkJCX0KLQkJc3dpdGNoIChvcCkKLQkJewotCQljYXNlIFJlbmQ6Ci0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm5vcm1hbDoKLQkJewotCQkgIG5vcm1hbF9jaGFyOgotCQkJb3Bjb2RlID0gQ2V4YWN0OwotCQkgIHN0b3JlX29wY29kZV9hbmRfYXJnOiAvKiBvcGNvZGUgJiBjaCBtdXN0IGJlIHNldCAqLwotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJQUxMT0MoMik7Ci0JCQlTVE9SRShvcGNvZGUpOwotCQkJU1RPUkUoY2gpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSYW55Y2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ2FueWNoYXI7Ci0JCSAgc3RvcmVfb3Bjb2RlOgotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJQUxMT0MoMSk7Ci0JCQlTVE9SRShvcGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBScXVvdGU6Ci0JCXsKLQkJCVB5X0ZhdGFsRXJyb3IoIlJxdW90ZSIpOwotCQkJLypOT1RSRUFDSEVEKi8KLQkJfQotCQljYXNlIFJib2w6Ci0JCXsKLQkJCWlmICghYmVnaW5uaW5nX2NvbnRleHQpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCW9wY29kZSA9IENib2w7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJlb2w6Ci0JCXsKLQkJCWlmICghKChwb3MgPj0gc2l6ZSkgfHwKLQkJCSAgICAgICgocmVnZXhwX3N5bnRheCAmIFJFX05PX0JLX1ZCQVIpID8KLQkJCSAgICAgICAocmVnZXhbcG9zXSA9PSAnXDE3NCcpIDoKLQkJCSAgICAgICAocG9zKzEgPCBzaXplICYmIHJlZ2V4W3Bvc10gPT0gJ1wxMzQnICYmCi0JCQkJcmVnZXhbcG9zKzFdID09ICdcMTc0JykpIHx8Ci0JCQkgICAgICAoKHJlZ2V4cF9zeW50YXggJiBSRV9OT19CS19QQVJFTlMpPwotCQkJICAgICAgIChyZWdleFtwb3NdID09ICcpJyk6Ci0JCQkgICAgICAgKHBvcysxIDwgc2l6ZSAmJiByZWdleFtwb3NdID09ICdcMTM0JyAmJgotCQkJCXJlZ2V4W3BvcysxXSA9PSAnKScpKSkpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCW9wY29kZSA9IENlb2w7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm9wdGlvbmFsOgotCQl7Ci0JCQlpZiAoYmVnaW5uaW5nX2NvbnRleHQpIHsKLQkJCQlpZiAocmVnZXhwX2NvbnRleHRfaW5kZXBfb3BzKQotCQkJCQlnb3RvIG9wX2Vycm9yOwotCQkJCWVsc2UKLQkJCQkJZ290byBub3JtYWxfY2hhcjsKLQkJCX0KLQkJCWlmIChDVVJSRU5UX0xFVkVMX1NUQVJUID09IHBhdHRlcm5fb2Zmc2V0KQotCQkJCWJyZWFrOyAvKiBpZ25vcmUgZW1wdHkgcGF0dGVybnMgZm9yID8gKi8KLQkJCUFMTE9DKDMpOwotCQkJSU5TRVJUX0pVTVAoQ1VSUkVOVF9MRVZFTF9TVEFSVCwgQ2ZhaWx1cmVfanVtcCwKLQkJCQkgICAgcGF0dGVybl9vZmZzZXQgKyAzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUnN0YXI6Ci0JCWNhc2UgUnBsdXM6Ci0JCXsKLQkJCWlmIChiZWdpbm5pbmdfY29udGV4dCkgewotCQkJCWlmIChyZWdleHBfY29udGV4dF9pbmRlcF9vcHMpCi0JCQkJCWdvdG8gb3BfZXJyb3I7Ci0JCQkJZWxzZQotCQkJCQlnb3RvIG5vcm1hbF9jaGFyOwotCQkJfQotCQkJaWYgKENVUlJFTlRfTEVWRUxfU1RBUlQgPT0gcGF0dGVybl9vZmZzZXQpCi0JCQkJYnJlYWs7IC8qIGlnbm9yZSBlbXB0eSBwYXR0ZXJucyBmb3IgKyBhbmQgKiAqLwotCQkJQUxMT0MoOSk7Ci0JCQlJTlNFUlRfSlVNUChDVVJSRU5UX0xFVkVMX1NUQVJULCBDZmFpbHVyZV9qdW1wLAotCQkJCSAgICBwYXR0ZXJuX29mZnNldCArIDYpOwotCQkJSU5TRVJUX0pVTVAocGF0dGVybl9vZmZzZXQsIENzdGFyX2p1bXAsIENVUlJFTlRfTEVWRUxfU1RBUlQpOwotCQkJaWYgKG9wID09IFJwbHVzKSAgLyoganVtcCBvdmVyIGluaXRpYWwgZmFpbHVyZV9qdW1wICovCi0JCQkJSU5TRVJUX0pVTVAoQ1VSUkVOVF9MRVZFTF9TVEFSVCwgQ2R1bW15X2ZhaWx1cmVfanVtcCwKLQkJCQkJICAgIENVUlJFTlRfTEVWRUxfU1RBUlQgKyA2KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm9yOgotCQl7Ci0JCQlBTExPQyg2KTsKLQkJCUlOU0VSVF9KVU1QKENVUlJFTlRfTEVWRUxfU1RBUlQsIENmYWlsdXJlX2p1bXAsCi0JCQkJICAgIHBhdHRlcm5fb2Zmc2V0ICsgNik7Ci0JCQlpZiAobnVtX2p1bXBzID49IE1BWF9ORVNUSU5HKQotCQkJCWdvdG8gdG9vX2NvbXBsZXg7Ci0JCQlTVE9SRShDanVtcCk7Ci0JCQlmdXR1cmVfanVtcHNbbnVtX2p1bXBzKytdID0gcGF0dGVybl9vZmZzZXQ7Ci0JCQlTVE9SRSgwKTsKLQkJCVNUT1JFKDApOwotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSb3BlbnBhcjoKLQkJewotCQkJU0VUX0xFVkVMX1NUQVJUOwotCQkJaWYgKG5leHRfcmVnaXN0ZXIgPCBSRV9OUkVHUykKLQkJCXsKLQkJCQlidWZwLT51c2VzX3JlZ2lzdGVycyA9IDE7Ci0JCQkJQUxMT0MoMik7Ci0JCQkJU1RPUkUoQ3N0YXJ0X21lbW9yeSk7Ci0JCQkJU1RPUkUobmV4dF9yZWdpc3Rlcik7Ci0JCQkJb3Blbl9yZWdpc3RlcnNbbnVtX29wZW5fcmVnaXN0ZXJzKytdID0gbmV4dF9yZWdpc3RlcjsKLQkJCQlidWZwLT5udW1fcmVnaXN0ZXJzKys7Ci0JCQkJbmV4dF9yZWdpc3RlcisrOwotCQkJfQotCQkJcGFyZW5fZGVwdGgrKzsKLQkJCVBVU0hfTEVWRUxfU1RBUlRTOwotCQkJY3VycmVudF9sZXZlbCA9IDA7Ci0JCQlTRVRfTEVWRUxfU1RBUlQ7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJjbG9zZXBhcjoKLQkJewotCQkJaWYgKHBhcmVuX2RlcHRoIDw9IDApCi0JCQkJZ290byBwYXJlbnRoZXNpc19lcnJvcjsKLQkJCVBPUF9MRVZFTF9TVEFSVFM7Ci0JCQljdXJyZW50X2xldmVsID0gcmVnZXhwX3ByZWNlZGVuY2VzW1JvcGVucGFyXTsKLQkJCXBhcmVuX2RlcHRoLS07Ci0JCQlpZiAocGFyZW5fZGVwdGggPCBudW1fb3Blbl9yZWdpc3RlcnMpCi0JCQl7Ci0JCQkJYnVmcC0+dXNlc19yZWdpc3RlcnMgPSAxOwotCQkJCUFMTE9DKDIpOwotCQkJCVNUT1JFKENlbmRfbWVtb3J5KTsKLQkJCQludW1fb3Blbl9yZWdpc3RlcnMtLTsKLQkJCQlTVE9SRShvcGVuX3JlZ2lzdGVyc1tudW1fb3Blbl9yZWdpc3RlcnNdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUm1lbW9yeToKLQkJewotCQkJaWYgKGNoID09ICcwJykKLQkJCQlnb3RvIGJhZF9tYXRjaF9yZWdpc3RlcjsKLQkJCWFzc2VydChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKLQkJCWJ1ZnAtPnVzZXNfcmVnaXN0ZXJzID0gMTsKLQkJCW9wY29kZSA9IENtYXRjaF9tZW1vcnk7Ci0JCQljaCAtPSAnMCc7Ci0JCQlnb3RvIHN0b3JlX29wY29kZV9hbmRfYXJnOwotCQl9Ci0JCWNhc2UgUmV4dGVuZGVkX21lbW9yeToKLQkJewotCQkJTkVYVENIQVIoY2gpOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCQkJCWdvdG8gYmFkX21hdGNoX3JlZ2lzdGVyOwotCQkJTkVYVENIQVIoYSk7Ci0JCQlpZiAoYSA8ICcwJyB8fCBhID4gJzknKQotCQkJCWdvdG8gYmFkX21hdGNoX3JlZ2lzdGVyOwotCQkJY2ggPSAxMCAqIChhIC0gJzAnKSArIGNoIC0gJzAnOwotCQkJaWYgKGNoID09IDAgfHwgY2ggPj0gUkVfTlJFR1MpCi0JCQkJZ290byBiYWRfbWF0Y2hfcmVnaXN0ZXI7Ci0JCQlidWZwLT51c2VzX3JlZ2lzdGVycyA9IDE7Ci0JCQlvcGNvZGUgPSBDbWF0Y2hfbWVtb3J5OwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJvcGVuc2V0OgotCQl7Ci0JCQlpbnQgY29tcGxlbWVudDsKLQkJCWludCBwcmV2OwotCQkJaW50IG9mZnNldDsKLQkJCWludCByYW5nZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdGNoYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNFVF9MRVZFTF9TVEFSVDsKLQkJCUFMTE9DKDErMjU2LzgpOwotCQkJU1RPUkUoQ3NldCk7Ci0JCQlvZmZzZXQgPSBwYXR0ZXJuX29mZnNldDsKLQkJCWZvciAoYSA9IDA7IGEgPCAyNTYvODsgYSsrKQotCQkJCVNUT1JFKDApOwotCQkJTkVYVENIQVIoY2gpOwotCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhciljaF07Ci0JCQlpZiAoY2ggPT0gJ1wxMzYnKQotCQkJewotCQkJCWNvbXBsZW1lbnQgPSAxOwotCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQlpZiAodHJhbnNsYXRlKQotCQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhciljaF07Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tcGxlbWVudCA9IDA7Ci0JCQlwcmV2ID0gLTE7Ci0JCQlyYW5nZSA9IDA7Ci0JCQlmaXJzdGNoYXIgPSAxOwotCQkJd2hpbGUgKGNoICE9ICdcMTM1JyB8fCBmaXJzdGNoYXIpCi0JCQl7Ci0JCQkJZmlyc3RjaGFyID0gMDsKLQkJCQlpZiAocmVnZXhwX2Fuc2lfc2VxdWVuY2VzICYmIGNoID09ICdcMTM0JykKLQkJCQl7Ci0JCQkJCU5FWFRDSEFSKGNoKTsKLQkJCQkJQU5TSV9UUkFOU0xBVEUoY2gpOwotCQkJCX0KLQkJCQlpZiAocmFuZ2UpCi0JCQkJewotCQkJCQlmb3IgKGEgPSBwcmV2OyBhIDw9IChpbnQpY2g7IGErKykKLQkJCQkJCVNFVEJJVChwYXR0ZXJuLCBvZmZzZXQsIGEpOwotCQkJCQlwcmV2ID0gLTE7Ci0JCQkJCXJhbmdlID0gMDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlpZiAocHJldiAhPSAtMSAmJiBjaCA9PSAnLScpCi0JCQkJCQlyYW5nZSA9IDE7Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJU0VUQklUKHBhdHRlcm4sIG9mZnNldCwgY2gpOwotCQkJCQkJcHJldiA9IGNoOwotCQkJCQl9Ci0JCQkJTkVYVENIQVIoY2gpOwotCQkJCWlmICh0cmFuc2xhdGUpCi0JCQkJCWNoID0gdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKWNoXTsKLQkJCX0KLQkJCWlmIChyYW5nZSkKLQkJCQlTRVRCSVQocGF0dGVybiwgb2Zmc2V0LCAnLScpOwotCQkJaWYgKGNvbXBsZW1lbnQpCi0JCQl7Ci0JCQkJZm9yIChhID0gMDsgYSA8IDI1Ni84OyBhKyspCi0JCQkJCXBhdHRlcm5bb2Zmc2V0K2FdIF49IDB4ZmY7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFJiZWdidWY6Ci0JCXsKLQkJCW9wY29kZSA9IENiZWdidWY7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJlbmRidWY6Ci0JCXsKLQkJCW9wY29kZSA9IENlbmRidWY7Ci0JCQlnb3RvIHN0b3JlX29wY29kZTsKLQkJfQotCQljYXNlIFJ3b3JkY2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ3N5bnRheHNwZWM7Ci0JCQljaCA9IFN3b3JkOwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJub3R3b3JkY2hhcjoKLQkJewotCQkJb3Bjb2RlID0gQ25vdHN5bnRheHNwZWM7Ci0JCQljaCA9IFN3b3JkOwotCQkJZ290byBzdG9yZV9vcGNvZGVfYW5kX2FyZzsKLQkJfQotCQljYXNlIFJ3b3JkYmVnOgotCQl7Ci0JCQlvcGNvZGUgPSBDd29yZGJlZzsKLQkJCWdvdG8gc3RvcmVfb3Bjb2RlOwotCQl9Ci0JCWNhc2UgUndvcmRlbmQ6Ci0JCXsKLQkJCW9wY29kZSA9IEN3b3JkZW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJY2FzZSBSd29yZGJvdW5kOgotCQl7Ci0JCQlvcGNvZGUgPSBDd29yZGJvdW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJY2FzZSBSbm90d29yZGJvdW5kOgotCQl7Ci0JCQlvcGNvZGUgPSBDbm90d29yZGJvdW5kOwotCQkJZ290byBzdG9yZV9vcGNvZGU7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJewotCQkJYWJvcnQoKTsKLQkJfQotCQl9Ci0JCWJlZ2lubmluZ19jb250ZXh0ID0gKG9wID09IFJvcGVucGFyIHx8IG9wID09IFJvcik7Ci0JfQotCWlmIChzdGFydHNfYmFzZSAhPSAwKQotCQlnb3RvIHBhcmVudGhlc2lzX2Vycm9yOwotCWFzc2VydChudW1fanVtcHMgPT0gMCk7Ci0JQUxMT0MoMSk7Ci0JU1RPUkUoQ2VuZCk7Ci0JU0VUX0ZJRUxEUzsKLQlpZighcmVfb3B0aW1pemUoYnVmcCkpCi0JCXJldHVybiAiT3B0aW1pemF0aW9uIGVycm9yIjsKLQlyZXR1cm4gTlVMTDsKLQotICBvcF9lcnJvcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkbHkgcGxhY2VkIHNwZWNpYWwgY2hhcmFjdGVyIjsKLQotICBiYWRfbWF0Y2hfcmVnaXN0ZXI6Ci0JU0VUX0ZJRUxEUzsKLQlyZXR1cm4gIkJhZCBtYXRjaCByZWdpc3RlciBudW1iZXIiOwotICAgCi0gIGhleF9lcnJvcjoKLQlTRVRfRklFTERTOwotCXJldHVybiAiQmFkIGhleGFkZWNpbWFsIG51bWJlciI7Ci0gICAKLSAgcGFyZW50aGVzaXNfZXJyb3I6Ci0JU0VUX0ZJRUxEUzsKLQlyZXR1cm4gIkJhZGx5IHBsYWNlZCBwYXJlbnRoZXNpcyI7Ci0gICAKLSAgb3V0X29mX21lbW9yeToKLQlTRVRfRklFTERTOwotCXJldHVybiAiT3V0IG9mIG1lbW9yeSI7Ci0gICAKLSAgZW5kc19wcmVtYXR1cmVseToKLQlTRVRfRklFTERTOwotCXJldHVybiAiUmVndWxhciBleHByZXNzaW9uIGVuZHMgcHJlbWF0dXJlbHkiOwotCi0gIHRvb19jb21wbGV4OgotCVNFVF9GSUVMRFM7Ci0JcmV0dXJuICJSZWd1bGFyIGV4cHJlc3Npb24gdG9vIGNvbXBsZXgiOwotfQotCi0jdW5kZWYgQ0hBUkFUCi0jdW5kZWYgTkVYVENIQVIKLSN1bmRlZiBHRVRIRVgKLSN1bmRlZiBBTExPQwotI3VuZGVmIFNUT1JFCi0jdW5kZWYgQ1VSUkVOVF9MRVZFTF9TVEFSVAotI3VuZGVmIFNFVF9MRVZFTF9TVEFSVAotI3VuZGVmIFBVU0hfTEVWRUxfU1RBUlRTCi0jdW5kZWYgUE9QX0xFVkVMX1NUQVJUUwotI3VuZGVmIFBVVF9BRERSCi0jdW5kZWYgSU5TRVJUX0pVTVAKLSN1bmRlZiBTRVRCSVQKLSN1bmRlZiBTRVRfRklFTERTCi0KLSNkZWZpbmUgUFJFRkVUQ0ggaWYgKHRleHQgPT0gdGV4dGVuZCkgZ290byBmYWlsCi0KLSNkZWZpbmUgTkVYVENIQVIodmFyKSBcCi1QUkVGRVRDSDsgXAotdmFyID0gKHVuc2lnbmVkIGNoYXIpKnRleHQrKzsgXAotaWYgKHRyYW5zbGF0ZSkgXAotCXZhciA9IHRyYW5zbGF0ZVt2YXJdCi0KLWludCByZV9tYXRjaChyZWdleHBfdCBidWZwLCB1bnNpZ25lZCBjaGFyICpzdHJpbmcsIGludCBzaXplLCBpbnQgcG9zLAotICAgICAgICAgICAgIHJlZ2V4cF9yZWdpc3RlcnNfdCBvbGRfcmVncykKLXsKLQl1bnNpZ25lZCBjaGFyICpjb2RlOwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsKLQl1bnNpZ25lZCBjaGFyICp0ZXh0OwotCXVuc2lnbmVkIGNoYXIgKnRleHRzdGFydDsKLQl1bnNpZ25lZCBjaGFyICp0ZXh0ZW5kOwotCWludCBhOwotCWludCBiOwotCWludCBjaDsKLQlpbnQgcmVnOwotCWludCBtYXRjaF9lbmQ7Ci0JdW5zaWduZWQgY2hhciAqcmVnc3RhcnQ7Ci0JdW5zaWduZWQgY2hhciAqcmVnZW5kOwotCWludCByZWdzaXplOwotCW1hdGNoX3N0YXRlIHN0YXRlOwotICAKLQlhc3NlcnQocG9zID49IDAgJiYgc2l6ZSA+PSAwKTsKLQlhc3NlcnQocG9zIDw9IHNpemUpOwotICAKLQl0ZXh0ID0gc3RyaW5nICsgcG9zOwotCXRleHRzdGFydCA9IHN0cmluZzsKLQl0ZXh0ZW5kID0gc3RyaW5nICsgc2l6ZTsKLSAgCi0JY29kZSA9IGJ1ZnAtPmJ1ZmZlcjsKLSAgCi0JdHJhbnNsYXRlID0gYnVmcC0+dHJhbnNsYXRlOwotICAKLQlORVdfU1RBVEUoc3RhdGUsIGJ1ZnAtPm51bV9yZWdpc3RlcnMpOwotCi0gIGNvbnRpbnVlX21hdGNoaW5nOgotCXN3aXRjaCAoKmNvZGUrKykKLQl7Ci0JY2FzZSBDZW5kOgotCXsKLQkJbWF0Y2hfZW5kID0gdGV4dCAtIHRleHRzdGFydDsKLQkJaWYgKG9sZF9yZWdzKQotCQl7Ci0JCQlvbGRfcmVncy0+c3RhcnRbMF0gPSBwb3M7Ci0JCQlvbGRfcmVncy0+ZW5kWzBdID0gbWF0Y2hfZW5kOwotCQkJaWYgKCFidWZwLT51c2VzX3JlZ2lzdGVycykKLQkJCXsKLQkJCQlmb3IgKGEgPSAxOyBhIDwgUkVfTlJFR1M7IGErKykKLQkJCQl7Ci0JCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IC0xOwotCQkJCQlvbGRfcmVncy0+ZW5kW2FdID0gLTE7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZvciAoYSA9IDE7IGEgPCBidWZwLT5udW1fcmVnaXN0ZXJzOyBhKyspCi0JCQkJewotCQkJCQlpZiAoKEdFVF9SRUdfU1RBUlQoc3RhdGUsIGEpID09IE5VTEwpIHx8Ci0JCQkJCSAgICAoR0VUX1JFR19FTkQoc3RhdGUsIGEpID09IE5VTEwpKQotCQkJCQl7Ci0JCQkJCQlvbGRfcmVncy0+c3RhcnRbYV0gPSAtMTsKLQkJCQkJCW9sZF9yZWdzLT5lbmRbYV0gPSAtMTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCW9sZF9yZWdzLT5zdGFydFthXSA9IEdFVF9SRUdfU1RBUlQoc3RhdGUsIGEpIC0gdGV4dHN0YXJ0OwotCQkJCQlvbGRfcmVncy0+ZW5kW2FdID0gR0VUX1JFR19FTkQoc3RhdGUsIGEpIC0gdGV4dHN0YXJ0OwotCQkJCX0KLQkJCQlmb3IgKDsgYSA8IFJFX05SRUdTOyBhKyspCi0JCQkJewotCQkJCQlvbGRfcmVncy0+c3RhcnRbYV0gPSAtMTsKLQkJCQkJb2xkX3JlZ3MtPmVuZFthXSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlGUkVFX1NUQVRFKHN0YXRlKTsKLQkJcmV0dXJuIG1hdGNoX2VuZCAtIHBvczsKLQl9Ci0JY2FzZSBDYm9sOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0IHx8IHRleHRbLTFdID09ICdcbicpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlnb3RvIGZhaWw7Ci0JfQotCWNhc2UgQ2VvbDoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRlbmQgfHwgKnRleHQgPT0gJ1xuJykKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDc2V0OgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoY29kZVtjaC84XSAmICgxPDwoY2ggJiA3KSkpCi0JCXsKLQkJCWNvZGUgKz0gMjU2Lzg7Ci0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQl9Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDZXhhY3Q6Ci0JewotCQlORVhUQ0hBUihjaCk7Ci0JCWlmIChjaCAhPSAodW5zaWduZWQgY2hhcikqY29kZSsrKQotCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENhbnljaGFyOgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoY2ggPT0gJ1xuJykKLQkJCWdvdG8gZmFpbDsKLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDc3RhcnRfbWVtb3J5OgotCXsKLQkJcmVnID0gKmNvZGUrKzsKLQkJU0VUX1JFR19TVEFSVChzdGF0ZSwgcmVnLCB0ZXh0LCBnb3RvIGVycm9yKTsKLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDZW5kX21lbW9yeToKLQl7Ci0JCXJlZyA9ICpjb2RlKys7Ci0JCVNFVF9SRUdfRU5EKHN0YXRlLCByZWcsIHRleHQsIGdvdG8gZXJyb3IpOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENtYXRjaF9tZW1vcnk6Ci0JewotCQlyZWcgPSAqY29kZSsrOwotCQlyZWdzdGFydCA9IEdFVF9SRUdfU1RBUlQoc3RhdGUsIHJlZyk7Ci0JCXJlZ2VuZCA9IEdFVF9SRUdfRU5EKHN0YXRlLCByZWcpOwotCQlpZiAoKHJlZ3N0YXJ0ID09IE5VTEwpIHx8IChyZWdlbmQgPT0gTlVMTCkpCi0JCQlnb3RvIGZhaWw7ICAvKiBvciBzaG91bGQgd2UganVzdCBtYXRjaCBub3RoaW5nPyAqLwotCQlyZWdzaXplID0gcmVnZW5kIC0gcmVnc3RhcnQ7Ci0KLQkJaWYgKHJlZ3NpemUgPiAodGV4dGVuZCAtIHRleHQpKQotCQkJZ290byBmYWlsOwotCQlpZih0cmFuc2xhdGUpCi0JCXsKLQkJCWZvciAoOyByZWdzdGFydCA8IHJlZ2VuZDsgcmVnc3RhcnQrKywgdGV4dCsrKQotCQkJCWlmICh0cmFuc2xhdGVbKnJlZ3N0YXJ0XSAhPSB0cmFuc2xhdGVbKnRleHRdKQotCQkJCQlnb3RvIGZhaWw7Ci0JCX0KLQkJZWxzZQotCQkJZm9yICg7IHJlZ3N0YXJ0IDwgcmVnZW5kOyByZWdzdGFydCsrLCB0ZXh0KyspCi0JCQkJaWYgKCpyZWdzdGFydCAhPSAqdGV4dCkKLQkJCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIEN1cGRhdGVfZmFpbHVyZV9qdW1wOgotCXsKLQkJVVBEQVRFX0ZBSUxVUkUoc3RhdGUsIHRleHQsIGdvdG8gZXJyb3IpOwotCQkvKiBmYWxsIHRvIG5leHQgY2FzZSAqLwotCX0KLQkvKiB0cmVhdCBDc3Rhcl9qdW1wIGp1c3QgbGlrZSBDanVtcCBpZiBpdCBoYXNuJ3QgYmVlbiBvcHRpbWl6ZWQgKi8KLQljYXNlIENzdGFyX2p1bXA6Ci0JY2FzZSBDanVtcDoKLQl7Ci0JCWEgPSAodW5zaWduZWQgY2hhcikqY29kZSsrOwotCQlhIHw9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKysgPDwgODsKLQkJY29kZSArPSAoaW50KVNIT1JUKGEpOwotCQlpZiAoY29kZTxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQ8Y29kZSkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2p1bXApIik7Ci0JCQlGUkVFX1NUQVRFKHN0YXRlKTsKLSAgICAgICAgICAgIAkgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgIAl9Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWNhc2UgQ2R1bW15X2ZhaWx1cmVfanVtcDoKLQl7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZmFpbHVyZWRlc3Q7Ci0JICAKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQlhID0gKGludClTSE9SVChhKTsKLQkJYXNzZXJ0KCpjb2RlID09IENmYWlsdXJlX2p1bXApOwotCQliID0gKHVuc2lnbmVkIGNoYXIpY29kZVsxXTsKLQkJYiB8PSAodW5zaWduZWQgY2hhciljb2RlWzJdIDw8IDg7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZWRlc3QgPSBjb2RlICsgKGludClTSE9SVChiKSArIDM7Ci0JCWlmIChmYWlsdXJlZGVzdDxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQgPCBmYWlsdXJlZGVzdCkgewotCQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlJlZ2V4IFZNIGp1bXAgb3V0IG9mIGJvdW5kcyAoQ2R1bW15X2ZhaWx1cmVfanVtcCBmYWlsdXJlZGVzdCkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotCQl9Ci0JCVBVU0hfRkFJTFVSRShzdGF0ZSwgZmFpbHVyZWRlc3QsIE5VTEwsIGdvdG8gZXJyb3IpOwotCQljb2RlICs9IGE7Ci0JCWlmIChjb2RlPGJ1ZnAtPmJ1ZmZlciB8fCBidWZwLT5idWZmZXIrYnVmcC0+dXNlZCA8IGNvZGUpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENkdW1teV9mYWlsdXJlX2p1bXAgY29kZSkiKTsKLQkJCUZSRUVfU1RBVEUoc3RhdGUpOwotICAgICAgICAgICAgCSAgICAgICAgcmV0dXJuIC0yOwotICAgICAgICAgCX0KLQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQl9Ci0JY2FzZSBDZmFpbHVyZV9qdW1wOgotCXsKLQkJYSA9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKys7Ci0JCWEgfD0gKHVuc2lnbmVkIGNoYXIpKmNvZGUrKyA8PCA4OwotCQlhID0gKGludClTSE9SVChhKTsKLQkJaWYgKGNvZGUrYTxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQgPCBjb2RlK2EpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENmYWlsdXJlX2p1bXApIik7Ci0JCQlGUkVFX1NUQVRFKHN0YXRlKTsKLSAgICAgICAgICAgIAkgICAgICAgIHJldHVybiAtMjsKLSAgICAgICAgIAl9Ci0JCVBVU0hfRkFJTFVSRShzdGF0ZSwgY29kZSArIGEsIHRleHQsIGdvdG8gZXJyb3IpOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENyZXBlYXQxOgotCXsKLQkJdW5zaWduZWQgY2hhciAqcGluc3Q7Ci0JCWEgPSAodW5zaWduZWQgY2hhcikqY29kZSsrOwotCQlhIHw9ICh1bnNpZ25lZCBjaGFyKSpjb2RlKysgPDwgODsKLQkJYSA9IChpbnQpU0hPUlQoYSk7Ci0JCXBpbnN0ID0gY29kZSArIGE7Ci0JCWlmIChwaW5zdDxidWZwLT5idWZmZXIgfHwgYnVmcC0+YnVmZmVyK2J1ZnAtPnVzZWQ8cGluc3QpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJSZWdleCBWTSBqdW1wIG91dCBvZiBib3VuZHMgKENyZXBlYXQxKSIpOwotCQkJRlJFRV9TVEFURShzdGF0ZSk7Ci0gICAgICAgICAgICAJICAgICAgICByZXR1cm4gLTI7Ci0gICAgICAgICAJfQotCQkvKiBwaW5zdCBpcyBzb2xlIGluc3RydWN0aW9uIGluIGxvb3AsIGFuZCBpdCBtYXRjaGVzIGEKLQkJICogc2luZ2xlIGNoYXJhY3Rlci4gIFNpbmNlIENyZXBlYXQxIHdhcyBvcmlnaW5hbGx5IGEKLQkJICogQ3VwZGF0ZV9mYWlsdXJlX2p1bXAsIHdlIGFsc28ga25vdyB0aGF0IGJhY2t0cmFja2luZwotCQkgKiBpcyB1c2VsZXNzOiBzbyBsb25nIGFzIHRoZSBzaW5nbGUtY2hhcmFjdGVyCi0JCSAqIGV4cHJlc3Npb24gbWF0Y2hlcywgaXQgbXVzdCBiZSB1c2VkLiAgQWxzbywgaW4gdGhlCi0JCSAqIGNhc2Ugb2YgKywgd2UndmUgYWxyZWFkeSBtYXRjaGVkIG9uZSBjaGFyYWN0ZXIsIHNvICsKLQkJICogY2FuJ3QgZmFpbDogbm90aGluZyBoZXJlIGNhbiBjYXVzZSBhIGZhaWx1cmUuICAqLwotCQlzd2l0Y2ggKCpwaW5zdCsrKQotCQl7Ci0JCWNhc2UgQ3NldDoKLQkJICB7Ci0JCSAgICAgICAgaWYgKHRyYW5zbGF0ZSkKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQpCi0JCQkJewotCQkJCQljaCA9IHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF07Ci0JCQkJCWlmIChwaW5zdFtjaC84XSAmICgxPDwoY2ggJiA3KSkpCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQpCi0JCQkJewotCQkJCQljaCA9ICh1bnNpZ25lZCBjaGFyKSp0ZXh0OwotCQkJCQlpZiAocGluc3RbY2gvOF0gJiAoMTw8KGNoICYgNykpKQotCQkJCQkJdGV4dCsrOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCWNhc2UgQ2V4YWN0OgotCQl7Ci0JCQljaCA9ICh1bnNpZ25lZCBjaGFyKSpwaW5zdDsKLQkJCWlmICh0cmFuc2xhdGUpCi0JCQl7Ci0JCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmCi0JCQkJICAgICAgIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF0gPT0gY2gpCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYgKHVuc2lnbmVkIGNoYXIpKnRleHQgPT0gY2gpCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ2FueWNoYXI6Ci0JCXsKLQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJiAodW5zaWduZWQgY2hhcikqdGV4dCAhPSAnXG4nKQotCQkJCXRleHQrKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ3N5bnRheHNwZWM6Ci0JCXsKLQkJCWEgPSAodW5zaWduZWQgY2hhcikqcGluc3Q7Ci0JCQlpZiAodHJhbnNsYXRlKQotCQkJewotCQkJCXdoaWxlICh0ZXh0IDwgdGV4dGVuZCAmJgotCQkJCSAgICAgICAoU1lOVEFYKHRyYW5zbGF0ZVsqdGV4dF0pICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJd2hpbGUgKHRleHQgPCB0ZXh0ZW5kICYmIChTWU5UQVgoKnRleHQpICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIENub3RzeW50YXhzcGVjOgotCQl7Ci0JCQlhID0gKHVuc2lnbmVkIGNoYXIpKnBpbnN0OwotCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYKLQkJCQkgICAgICAgIShTWU5UQVgodHJhbnNsYXRlWyp0ZXh0XSkgJiBhKSApCi0JCQkJCXRleHQrKzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl3aGlsZSAodGV4dCA8IHRleHRlbmQgJiYgIShTWU5UQVgoKnRleHQpICYgYSkgKQotCQkJCQl0ZXh0Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlkZWZhdWx0OgotCQl7Ci0JCSAgICAgICAgRlJFRV9TVEFURShzdGF0ZSk7Ci0JCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiVW5rbm93biByZWdleCBvcGNvZGU6IG1lbW9yeSBjb3JydXB0ZWQ/Iik7Ci0JCSAgICAgICAgcmV0dXJuIC0yOwotCQkJLypOT1RSRUFDSEVEKi8KLQkJfQotCQl9Ci0JCS8qIGR1ZSB0byB0aGUgZnVua3kgd2F5ICsgYW5kICogYXJlIGNvbXBpbGVkLCB0aGUgdG9wCi0JCSAqIGZhaWx1cmUtIHN0YWNrIGVudHJ5IGF0IHRoaXMgcG9pbnQgaXMgYWN0dWFsbHkgYQotCQkgKiBzdWNjZXNzIGVudHJ5IC0tIHVwZGF0ZSBpdCAmIHBvcCBpdCAqLwotCQlVUERBVEVfRkFJTFVSRShzdGF0ZSwgdGV4dCwgZ290byBlcnJvcik7Ci0JCWdvdG8gZmFpbDsgICAgICAvKiBpLmUuLCBzdWNjZWVkIDx3aW5rL3NpZ2g+ICovCi0JfQotCWNhc2UgQ2JlZ2J1ZjoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRzdGFydCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDZW5kYnVmOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDd29yZGJlZzoKLQl7Ci0JCWlmICh0ZXh0ID09IHRleHRlbmQpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghKFNZTlRBWCgqdGV4dCkgJiBTd29yZCkpIAotCQkJZ290byBmYWlsOwotCQlpZiAodGV4dCA9PSB0ZXh0c3RhcnQpCi0JCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCQlpZiAoIShTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIEN3b3JkZW5kOgotCXsKLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0KQotCQkJZ290byBmYWlsOwotCQlpZiAoIShTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpKQotCQkJZ290byBmYWlsOwotCQlpZiAodGV4dCA9PSB0ZXh0ZW5kKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJaWYgKCEoU1lOVEFYKCp0ZXh0KSAmIFN3b3JkKSkKLQkJICAgICAgICBnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDd29yZGJvdW5kOgotCXsKLQkJLyogTm90ZTogYXMgaW4gZ251IHJlZ2V4cCwgdGhpcyBhbHNvIG1hdGNoZXMgYXQgdGhlCi0JCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJ1ZmZlci4gICovCi0KLQkJaWYgKHRleHQgPT0gdGV4dHN0YXJ0IHx8IHRleHQgPT0gdGV4dGVuZCkKLQkJCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWlmICgoU1lOVEFYKHRleHRbLTFdKSAmIFN3b3JkKSBeIChTWU5UQVgoKnRleHQpICYgU3dvcmQpKQotCQkJZ290byBjb250aW51ZV9tYXRjaGluZzsKLQkJZ290byBmYWlsOwotCX0KLQljYXNlIENub3R3b3JkYm91bmQ6Ci0JewotCQkvKiBOb3RlOiBhcyBpbiBnbnUgcmVnZXhwLCB0aGlzIG5ldmVyIG1hdGNoZXMgYXQgdGhlCi0JCSAqIGJlZ2lubmluZyBhbmQgZW5kIG9mIGJ1ZmZlci4gICovCi0JCWlmICh0ZXh0ID09IHRleHRzdGFydCB8fCB0ZXh0ID09IHRleHRlbmQpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghKChTWU5UQVgodGV4dFstMV0pICYgU3dvcmQpIF4gKFNZTlRBWCgqdGV4dCkgJiBTd29yZCkpKQotICAgICAgCQkgICAgICAgIGdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JY2FzZSBDc3ludGF4c3BlYzoKLQl7Ci0JCU5FWFRDSEFSKGNoKTsKLQkJaWYgKCEoU1lOVEFYKGNoKSAmICh1bnNpZ25lZCBjaGFyKSpjb2RlKyspKQotCQkJZ290byBmYWlsOwotCQlnb3RvIGNvbnRpbnVlX21hdGNoaW5nOwotCX0KLQljYXNlIENub3RzeW50YXhzcGVjOgotCXsKLQkJTkVYVENIQVIoY2gpOwotCQlpZiAoU1lOVEFYKGNoKSAmICh1bnNpZ25lZCBjaGFyKSpjb2RlKyspCi0JCQlnb3RvIGZhaWw7Ci0JCWdvdG8gY29udGludWVfbWF0Y2hpbmc7Ci0JfQotCWRlZmF1bHQ6Ci0JewotCSAgICAgICAgRlJFRV9TVEFURShzdGF0ZSk7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbmtub3duIHJlZ2V4IG9wY29kZTogbWVtb3J5IGNvcnJ1cHRlZD8iKTsKLQkJcmV0dXJuIC0yOwotCQkvKk5PVFJFQUNIRUQqLwotCX0KLQl9Ci0JCi0JCi0KLSNpZiAwIC8qIFRoaXMgbGluZSBpcyBuZXZlciByZWFjaGVkIC0tR3VpZG8gKi8KLQlhYm9ydCgpOwotI2VuZGlmCi0JLyoKLQkgKk5PVFJFQUNIRUQKLQkgKi8KLQotCS8qIFVzaW5nICJicmVhazsiIGluIHRoZSBhYm92ZSBzd2l0Y2ggc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gImdvdG8gZmFpbDsiICovCi0gIGZhaWw6Ci0JUE9QX0ZBSUxVUkUoc3RhdGUsIGNvZGUsIHRleHQsIGdvdG8gZG9uZV9tYXRjaGluZywgZ290byBlcnJvcik7Ci0JZ290byBjb250aW51ZV9tYXRjaGluZzsKLSAgCi0gIGRvbmVfbWF0Y2hpbmc6Ci0vKiAgIGlmKHRyYW5zbGF0ZWQgIT0gTlVMTCkgKi8KLS8qICAgICAgZnJlZSh0cmFuc2xhdGVkKTsgKi8KLQlGUkVFX1NUQVRFKHN0YXRlKTsKLQlyZXR1cm4gLTE7Ci0KLSAgZXJyb3I6Ci0vKiAgIGlmICh0cmFuc2xhdGVkICE9IE5VTEwpICovCi0vKiAgICAgIGZyZWUodHJhbnNsYXRlZCk7ICovCi0JRlJFRV9TVEFURShzdGF0ZSk7Ci0JcmV0dXJuIC0yOwotfQotCQotCi0jdW5kZWYgUFJFRkVUQ0gKLSN1bmRlZiBORVhUQ0hBUgotCi1pbnQgcmVfc2VhcmNoKHJlZ2V4cF90IGJ1ZnAsIHVuc2lnbmVkIGNoYXIgKnN0cmluZywgaW50IHNpemUsIGludCBwb3MsCi0gICAgICAgICAgICAgIGludCByYW5nZSwgcmVnZXhwX3JlZ2lzdGVyc190IHJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciAqZmFzdG1hcDsKLQl1bnNpZ25lZCBjaGFyICp0cmFuc2xhdGU7Ci0JdW5zaWduZWQgY2hhciAqdGV4dDsKLQl1bnNpZ25lZCBjaGFyICpwYXJ0c3RhcnQ7Ci0JdW5zaWduZWQgY2hhciAqcGFydGVuZDsKLQlpbnQgZGlyOwotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBhbmNob3I7Ci0gIAotCWFzc2VydChzaXplID49IDAgJiYgcG9zID49IDApOwotCWFzc2VydChwb3MgKyByYW5nZSA+PSAwICYmIHBvcyArIHJhbmdlIDw9IHNpemUpOyAvKiBCdWdmaXggYnkgeWxvICovCi0gIAotCWZhc3RtYXAgPSBidWZwLT5mYXN0bWFwOwotCXRyYW5zbGF0ZSA9IGJ1ZnAtPnRyYW5zbGF0ZTsKLQlpZiAoZmFzdG1hcCAmJiAhYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSkgewotICAgICAgICAgICAgICAgIHJlX2NvbXBpbGVfZmFzdG1hcChidWZwKTsKLQkgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSByZXR1cm4gLTI7Ci0JfQotCQotCWFuY2hvciA9IGJ1ZnAtPmFuY2hvcjsKLQlpZiAoYnVmcC0+Y2FuX2JlX251bGwgPT0gMSkgLyogY2FuX2JlX251bGwgPT0gMjogY2FuIG1hdGNoIG51bGwgYXQgZW9iICovCi0JCWZhc3RtYXAgPSBOVUxMOwotCi0JaWYgKHJhbmdlIDwgMCkKLQl7Ci0JCWRpciA9IC0xOwotCQlyYW5nZSA9IC1yYW5nZTsKLQl9Ci0JZWxzZQotCQlkaXIgPSAxOwotCi0JaWYgKGFuY2hvciA9PSAyKSB7Ci0JCWlmIChwb3MgIT0gMCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmFuZ2UgPSAwOwotCX0KLQotCWZvciAoOyByYW5nZSA+PSAwOyByYW5nZS0tLCBwb3MgKz0gZGlyKQotCXsKLQkJaWYgKGZhc3RtYXApCi0JCXsKLQkJCWlmIChkaXIgPT0gMSkKLQkJCXsgLyogc2VhcmNoaW5nIGZvcndhcmRzICovCi0KLQkJCQl0ZXh0ID0gc3RyaW5nICsgcG9zOwotCQkJCXBhcnRlbmQgPSBzdHJpbmcgKyBzaXplOwotCQkJCXBhcnRzdGFydCA9IHRleHQ7Ci0JCQkJaWYgKHRyYW5zbGF0ZSkKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydGVuZCAmJgotCQkJCQkgICAgICAgIWZhc3RtYXBbKHVuc2lnbmVkIGNoYXIpIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF1dKQotCQkJCQkJdGV4dCsrOwotCQkJCWVsc2UKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydGVuZCAmJiAhZmFzdG1hcFsodW5zaWduZWQgY2hhcikqdGV4dF0pCi0JCQkJCQl0ZXh0Kys7Ci0JCQkJcG9zICs9IHRleHQgLSBwYXJ0c3RhcnQ7Ci0JCQkJcmFuZ2UgLT0gdGV4dCAtIHBhcnRzdGFydDsKLQkJCQlpZiAocG9zID09IHNpemUgJiYgYnVmcC0+Y2FuX2JlX251bGwgPT0gMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZQotCQkJeyAvKiBzZWFyY2hpbmcgYmFja3dhcmRzICovCi0JCQkJdGV4dCA9IHN0cmluZyArIHBvczsKLQkJCQlwYXJ0c3RhcnQgPSBzdHJpbmcgKyBwb3MgLSByYW5nZTsKLQkJCQlwYXJ0ZW5kID0gdGV4dDsKLQkJCQlpZiAodHJhbnNsYXRlKQotCQkJCQl3aGlsZSAodGV4dCAhPSBwYXJ0c3RhcnQgJiYKLQkJCQkJICAgICAgICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKQotCQkJCQkJICAgICAgIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikqdGV4dF1dKQotCQkJCQkJdGV4dC0tOwotCQkJCWVsc2UKLQkJCQkJd2hpbGUgKHRleHQgIT0gcGFydHN0YXJ0ICYmCi0JCQkJCSAgICAgICAhZmFzdG1hcFsodW5zaWduZWQgY2hhcikqdGV4dF0pCi0JCQkJCQl0ZXh0LS07Ci0JCQkJcG9zIC09IHBhcnRlbmQgLSB0ZXh0OwotCQkJCXJhbmdlIC09IHBhcnRlbmQgLSB0ZXh0OwotCQkJfQotCQl9Ci0JCWlmIChhbmNob3IgPT0gMSkKLQkJeyAvKiBhbmNob3JlZCB0byBiZWdsaW5lICovCi0JCQlpZiAocG9zID4gMCAmJiAoc3RyaW5nW3BvcyAtIDFdICE9ICdcbicpKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWFzc2VydChwb3MgPj0gMCAmJiBwb3MgPD0gc2l6ZSk7Ci0JCXJldCA9IHJlX21hdGNoKGJ1ZnAsIHN0cmluZywgc2l6ZSwgcG9zLCByZWdzKTsKLQkJaWYgKHJldCA+PSAwKQotCQkJcmV0dXJuIHBvczsKLQkJaWYgKHJldCA9PSAtMikKLQkJCXJldHVybiAtMjsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi0vKgotKiogTG9jYWwgVmFyaWFibGVzOgotKiogbW9kZTogYwotKiogYy1maWxlLXN0eWxlOiAicHl0aG9uIgotKiogRW5kOgotKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVnZXhwci5oIGIvTW9kdWxlcy9yZWdleHByLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWU2MmQuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9yZWdleHByLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIC0qLSBtb2RlOiBjLW1vZGU7IGMtZmlsZS1zdHlsZTogcHl0aG9uIC0qLQotICovCi0KLSNpZm5kZWYgUHlfUkVHRVhQUl9ICi0jZGVmaW5lIFB5X1JFR0VYUFJfSAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogcmVnZXhwci5oCi0gKgotICogQXV0aG9yOiBUYXR1IFlsb25lbiA8eWxvQG5ncy5maT4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgVGF0dSBZbG9uZW4sIEVzcG9vLCBGaW5sYW5kCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQotICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGlzCi0gKiBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIENyZWF0ZWQ6IFRodSBTZXAgMjYgMTc6MTU6MzYgMTk5MSB5bG8KLSAqIExhc3QgbW9kaWZpZWQ6IE1vbiBOb3YgIDQgMTU6NDk6NDYgMTk5MSB5bG8KLSAqLwotCi0vKiAkSWQkICovCi0KLSNpZm5kZWYgUkVHRVhQUl9ICi0jZGVmaW5lIFJFR0VYUFJfSAotCi0jZGVmaW5lIFJFX05SRUdTCTEwMCAgLyogbnVtYmVyIG9mIHJlZ2lzdGVycyBhdmFpbGFibGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXI7ICAgICAgICAgIC8qIGNvbXBpbGVkIHBhdHRlcm4gKi8KLQlpbnQgYWxsb2NhdGVkOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzaXplIG9mIGNvbXBpbGVkIHBhdHRlcm4gKi8KLQlpbnQgdXNlZDsgICAgICAgICAgICAgIC8qIGFjdHVhbCBsZW5ndGggb2YgY29tcGlsZWQgcGF0dGVybiAqLwotCXVuc2lnbmVkIGNoYXIgKmZhc3RtYXA7ICAgICAgICAgLyogZmFzdG1hcFtjaF0gaXMgdHJ1ZSBpZiBjaCBjYW4gc3RhcnQgcGF0dGVybiAqLwotCXVuc2lnbmVkIGNoYXIgKnRyYW5zbGF0ZTsgICAgICAgLyogdHJhbnNsYXRpb24gdG8gYXBwbHkgZHVyaW5nIGNvbXBpbGF0aW9uL21hdGNoaW5nICovCi0JdW5zaWduZWQgY2hhciBmYXN0bWFwX2FjY3VyYXRlOyAvKiB0cnVlIGlmIGZhc3RtYXAgaXMgdmFsaWQgKi8KLQl1bnNpZ25lZCBjaGFyIGNhbl9iZV9udWxsOyAgICAgIC8qIHRydWUgaWYgY2FuIG1hdGNoIGVtcHR5IHN0cmluZyAqLwotCXVuc2lnbmVkIGNoYXIgdXNlc19yZWdpc3RlcnM7ICAgLyogcmVnaXN0ZXJzIGFyZSB1c2VkIGFuZCBuZWVkIHRvIGJlIGluaXRpYWxpemVkICovCi0JaW50IG51bV9yZWdpc3RlcnM7ICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzIHVzZWQgKi8KLQl1bnNpZ25lZCBjaGFyIGFuY2hvcjsgICAgICAgICAgIC8qIGFuY2hvcjogMD1ub25lIDE9YmVnbGluZSAyPWJlZ2J1ZiAqLwotfSAqcmVnZXhwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHJlX3JlZ2lzdGVycwotewotCWludCBzdGFydFtSRV9OUkVHU107ICAvKiBzdGFydCBvZmZzZXQgb2YgcmVnaW9uICovCi0JaW50IGVuZFtSRV9OUkVHU107ICAgIC8qIGVuZCBvZmZzZXQgb2YgcmVnaW9uICovCi19ICpyZWdleHBfcmVnaXN0ZXJzX3Q7Ci0KLS8qIGJpdCBkZWZpbml0aW9ucyBmb3Igc3ludGF4ICovCi0jZGVmaW5lIFJFX05PX0JLX1BBUkVOUwkJMSAgICAvKiBubyBxdW90aW5nIGZvciBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBSRV9OT19CS19WQkFSCQkyICAgIC8qIG5vIHF1b3RpbmcgZm9yIHZlcnRpY2FsIGJhciAqLwotI2RlZmluZSBSRV9CS19QTFVTX1FNCQk0ICAgIC8qIHF1b3RpbmcgbmVlZGVkIGZvciArIGFuZCA/ICovCi0jZGVmaW5lIFJFX1RJR0hUX1ZCQVIJCTggICAgLyogfCBiaW5kcyB0aWdodGVyIHRoYW4gXiBhbmQgJCAqLwotI2RlZmluZSBSRV9ORVdMSU5FX09SCQkxNiAgIC8qIHRyZWF0IG5ld2xpbmUgYXMgb3IgKi8KLSNkZWZpbmUgUkVfQ09OVEVYVF9JTkRFUF9PUFMJMzIgICAvKiBeJD8qKyBhcmUgc3BlY2lhbCBpbiBhbGwgY29udGV4dHMgKi8KLSNkZWZpbmUgUkVfQU5TSV9IRVgJCTY0ICAgLyogYW5zaSBzZXF1ZW5jZXMgKFxuIGV0YykgYW5kIFx4aGggKi8KLSNkZWZpbmUgUkVfTk9fR05VX0VYVEVOU0lPTlMgICAxMjggICAvKiBubyBnbnUgZXh0ZW5zaW9ucyAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3Igc29tZSBjb21tb24gcmVnZXhwIHN0eWxlcyAqLwotI2RlZmluZSBSRV9TWU5UQVhfQVdLCShSRV9OT19CS19QQVJFTlN8UkVfTk9fQktfVkJBUnxSRV9DT05URVhUX0lOREVQX09QUykKLSNkZWZpbmUgUkVfU1lOVEFYX0VHUkVQCShSRV9TWU5UQVhfQVdLfFJFX05FV0xJTkVfT1IpCi0jZGVmaW5lIFJFX1NZTlRBWF9HUkVQCShSRV9CS19QTFVTX1FNfFJFX05FV0xJTkVfT1IpCi0jZGVmaW5lIFJFX1NZTlRBWF9FTUFDUwkwCi0KLSNkZWZpbmUgU3dvcmQgICAgICAgMQotI2RlZmluZSBTd2hpdGVzcGFjZSAyCi0jZGVmaW5lIFNkaWdpdCAgICAgIDQKLSNkZWZpbmUgU29jdGFsZGlnaXQgOAotI2RlZmluZSBTaGV4ZGlnaXQgICAxNgotCi0vKiBSZW5hbWUgYWxsIGV4cG9ydGVkIHN5bWJvbHMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggc2ltaWxhcmx5IG5hbWVkCi0gICBzeW1ib2xzIGluIHNvbWUgc3lzdGVtcycgc3RhbmRhcmQgQyBsaWJyYXJpZXMuLi4gKi8KLQotI2RlZmluZSByZV9zeW50YXggX1B5X3JlX3N5bnRheAotI2RlZmluZSByZV9zeW50YXhfdGFibGUgX1B5X3JlX3N5bnRheF90YWJsZQotI2RlZmluZSByZV9jb21waWxlX2luaXRpYWxpemUgX1B5X3JlX2NvbXBpbGVfaW5pdGlhbGl6ZQotI2RlZmluZSByZV9zZXRfc3ludGF4IF9QeV9yZV9zZXRfc3ludGF4Ci0jZGVmaW5lIHJlX2NvbXBpbGVfcGF0dGVybiBfUHlfcmVfY29tcGlsZV9wYXR0ZXJuCi0jZGVmaW5lIHJlX21hdGNoIF9QeV9yZV9tYXRjaAotI2RlZmluZSByZV9zZWFyY2ggX1B5X3JlX3NlYXJjaAotI2RlZmluZSByZV9jb21waWxlX2Zhc3RtYXAgX1B5X3JlX2NvbXBpbGVfZmFzdG1hcAotI2RlZmluZSByZV9jb21wIF9QeV9yZV9jb21wCi0jZGVmaW5lIHJlX2V4ZWMgX1B5X3JlX2V4ZWMKLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotCi1leHRlcm4gaW50IHJlX3N5bnRheDsKLS8qIFRoaXMgaXMgdGhlIGFjdHVhbCBzeW50YXggbWFzay4gIEl0IHdhcyBhZGRlZCBzbyB0aGF0IFB5dGhvbiBjb3VsZCBkbwotICogc3ludGF4LWRlcGVuZGVudCBtdW5naW5nIG9mIHBhdHRlcm5zIGJlZm9yZSBjb21waWxhdGlvbi4gKi8KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVfc3ludGF4X3RhYmxlWzI1Nl07Ci0KLXZvaWQgcmVfY29tcGlsZV9pbml0aWFsaXplKHZvaWQpOwotCi1pbnQgcmVfc2V0X3N5bnRheChpbnQgc3ludGF4KTsKLS8qIFRoaXMgc2V0cyB0aGUgc3ludGF4IHRvIHVzZSBhbmQgcmV0dXJucyB0aGUgcHJldmlvdXMgc3ludGF4LiAgVGhlCi0gKiBzeW50YXggaXMgc3BlY2lmaWVkIGJ5IGEgYml0IG1hc2sgb2YgdGhlIGFib3ZlIGRlZmluZWQgYml0cy4gKi8KLQotY2hhciAqcmVfY29tcGlsZV9wYXR0ZXJuKHVuc2lnbmVkIGNoYXIgKnJlZ2V4LCBpbnQgcmVnZXhfc2l6ZSwgcmVnZXhwX3QgY29tcGlsZWQpOwotLyogVGhpcyBjb21waWxlcyB0aGUgcmVnZXhwIChnaXZlbiBpbiByZWdleCBhbmQgbGVuZ3RoIGluIHJlZ2V4X3NpemUpLgotICogVGhpcyByZXR1cm5zIE5VTEwgaWYgdGhlIHJlZ2V4cCBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhbiBlcnJvcgotICogbWVzc2FnZSBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQuICBUaGUgYnVmZmVyIGZpZWxkIG11c3QgYmUKLSAqIGluaXRpYWxpemVkIHRvIGEgbWVtb3J5IGFyZWEgYWxsb2NhdGVkIGJ5IG1hbGxvYyAob3IgdG8gTlVMTCkgYmVmb3JlCi0gKiB1c2UsIGFuZCB0aGUgYWxsb2NhdGVkIGZpZWxkIG11c3QgYmUgc2V0IHRvIGl0cyBsZW5ndGggKG9yIDAgaWYKLSAqIGJ1ZmZlciBpcyBOVUxMKS4gIEFsc28sIHRoZSB0cmFuc2xhdGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gcG9pbnQgdG8gYQotICogdmFsaWQgdHJhbnNsYXRpb24gdGFibGUsIG9yIE5VTEwgaWYgaXQgaXMgbm90IHVzZWQuICovCi0KLWludCByZV9tYXRjaChyZWdleHBfdCBjb21waWxlZCwgdW5zaWduZWQgY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSwgaW50IHBvcywKLQkgICAgIHJlZ2V4cF9yZWdpc3RlcnNfdCBvbGRfcmVncyk7Ci0vKiBUaGlzIHRyaWVzIHRvIG1hdGNoIHRoZSByZWdleHAgYWdhaW5zdCB0aGUgc3RyaW5nLiAgVGhpcyByZXR1cm5zIHRoZQotICogbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHBvcnRpb24sIG9yIC0xIGlmIHRoZSBwYXR0ZXJuIGNvdWxkIG5vdCBiZQotICogbWF0Y2hlZCBhbmQgLTIgaWYgYW4gZXJyb3IgKHN1Y2ggYXMgZmFpbHVyZSBzdGFjayBvdmVyZmxvdykgaXMKLSAqIGVuY291bnRlcmVkLiAqLwotCi1pbnQgcmVfc2VhcmNoKHJlZ2V4cF90IGNvbXBpbGVkLCB1bnNpZ25lZCBjaGFyICpzdHJpbmcsIGludCBzaXplLCBpbnQgc3RhcnRwb3MsCi0JICAgICAgaW50IHJhbmdlLCByZWdleHBfcmVnaXN0ZXJzX3QgcmVncyk7Ci0vKiBUaGlzIHNlYXJjaGVzIGZvciBhIHN1YnN0cmluZyBtYXRjaGluZyB0aGUgcmVnZXhwLiAgVGhpcyByZXR1cm5zIHRoZQotICogZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBtYXRjaCBpcyBmb3VuZC4gIHJhbmdlIHNwZWNpZmllcyBhdCBob3cgbWFueQotICogcG9zaXRpb25zIHRvIHRyeSBtYXRjaGluZzsgcG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHNlYXJjaGluZwotICogZm9yd2FyZHMsIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgc2VhcmNoaW5nIGJhY2t3YXJkcy4gIG1zdG9wCi0gKiBzcGVjaWZpZXMgdGhlIG9mZnNldCBiZXlvbmQgd2hpY2ggYSBtYXRjaCBtdXN0IG5vdCBnby4gIFRoaXMgcmV0dXJucwotICogLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQsIGFuZCAtMiBpZiBhbiBlcnJvciAoc3VjaCBhcyBmYWlsdXJlIHN0YWNrCi0gKiBvdmVyZmxvdykgaXMgZW5jb3VudGVyZWQuICovCi0KLXZvaWQgcmVfY29tcGlsZV9mYXN0bWFwKHJlZ2V4cF90IGNvbXBpbGVkKTsKLS8qIFRoaXMgY29tcHV0ZXMgdGhlIGZhc3RtYXAgZm9yIHRoZSByZWdleHAuICBGb3IgdGhpcyB0byBoYXZlIGFueSBlZmZlY3QsCi0gKiB0aGUgY2FsbGluZyBwcm9ncmFtIG11c3QgaGF2ZSBpbml0aWFsaXplZCB0aGUgZmFzdG1hcCBmaWVsZCB0byBwb2ludAotICogdG8gYW4gYXJyYXkgb2YgMjU2IGNoYXJhY3RlcnMuICovCi0KLSNlbHNlIC8qIEhBVkVfUFJPVE9UWVBFUyAqLwotCi1leHRlcm4gaW50IHJlX3N5bnRheDsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHJlX3N5bnRheF90YWJsZVsyNTZdOwotdm9pZCByZV9jb21waWxlX2luaXRpYWxpemUoKTsKLWludCByZV9zZXRfc3ludGF4KCk7Ci1jaGFyICpyZV9jb21waWxlX3BhdHRlcm4oKTsKLWludCByZV9tYXRjaCgpOwotaW50IHJlX3NlYXJjaCgpOwotdm9pZCByZV9jb21waWxlX2Zhc3RtYXAoKTsKLQotI2VuZGlmIC8qIEhBVkVfUFJPVE9UWVBFUyAqLwotCi0jZW5kaWYgLyogUkVHRVhQUl9IICovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmIC8qICFQeV9SRUdFWFBSX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVzb3VyY2UuYyBiL01vZHVsZXMvcmVzb3VyY2UuYwppbmRleCA3Y2JkMmM5Li5lNzNjODc4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Jlc291cmNlLmMKKysrIGIvTW9kdWxlcy9yZXNvdXJjZS5jCkBAIC01NSw2ICs1NSw3IEBACiAJMTYJLyogbl9pbl9zZXF1ZW5jZSAqLwogfTsKIAorc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBQeVR5cGVPYmplY3QgU3RydWN0UlVzYWdlVHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTI0NCw3ICsyNDUsMTAgQEAKIAl9CiAJUHlfSU5DUkVGKFJlc291cmNlRXJyb3IpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBSZXNvdXJjZUVycm9yKTsKLSAJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7CisJaWYgKCFpbml0aWFsaXplZCkKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgCisJCQkJCSAgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7CisJUHlfSU5DUkVGKCZTdHJ1Y3RSVXNhZ2VUeXBlKTsKICAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwgCiAJCQkgICAoUHlPYmplY3QqKSAmU3RydWN0UlVzYWdlVHlwZSk7CiAKQEAgLTMyMCw0ICszMjQsNSBAQAogCWlmICh2KSB7CiAJCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUkxJTV9JTkZJTklUWSIsIHYpOwogCX0KKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwppbmRleCBjNTI2ZDc1Li5jOWRkNGEzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKQEAgLTYyLDYgKzYyLDcgQEAKICovCiAKICNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogI3VuZGVmIE1BWAogI2RlZmluZSBNQVgoeCwgeSkgKCh4KSA8ICh5KSA/ICh5KSA6ICh4KSkKQEAgLTk2Nyw3ICs5NjgsMTggQEAKIAljYXNlIEFGX1VOSVg6CiAJewogCQlzdHJ1Y3Qgc29ja2FkZHJfdW4gKmEgPSAoc3RydWN0IHNvY2thZGRyX3VuICopIGFkZHI7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGEtPnN1bl9wYXRoKTsKKyNpZmRlZiBsaW51eAorCQlpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCisJCQlhZGRybGVuIC09IChzaXplb2YoKmEpIC0gc2l6ZW9mKGEtPnN1bl9wYXRoKSk7CisJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+c3VuX3BhdGgsCisJCQkJCQkJICBhZGRybGVuKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLyogbGludXggKi8KKwkJeworCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhhLT5zdW5fcGF0aCk7CisJCX0KIAl9CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogCkBAIC0xMDk3LDE0ICsxMTA5LDI4IEBACiAJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3VuKikmKHMtPnNvY2tfYWRkcikudW47CiAJCWlmICghUHlBcmdfUGFyc2UoYXJncywgInQjIiwgJnBhdGgsICZsZW4pKQogCQkJcmV0dXJuIDA7Ci0JCWlmIChsZW4gPiBzaXplb2YgYWRkci0+c3VuX3BhdGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCXJldHVybiAwOworI2lmZGVmIGxpbnV4CisJCWlmIChsZW4gPiAwICYmIHBhdGhbMF0gPT0gMCkgeworCQkJLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLworCQkJaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisJCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZWxzZQorI2VuZGlmIC8qIGxpbnV4ICovCisgICAgICAgICAgICAgICAgeworCQkJLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisJCQlpZiAobGVuID49IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisJCQkJCQkiQUZfVU5JWCBwYXRoIHRvbyBsb25nIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlhZGRyLT5zdW5fcGF0aFtsZW5dID0gMDsKIAkJfQogCQlhZGRyLT5zdW5fZmFtaWx5ID0gcy0+c29ja19mYW1pbHk7CiAJCW1lbWNweShhZGRyLT5zdW5fcGF0aCwgcGF0aCwgbGVuKTsKLQkJYWRkci0+c3VuX3BhdGhbbGVuXSA9IDA7CiAJCSphZGRyX3JldCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQogCQkqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CkBAIC0yMjA3LDE4ICsyMjMzLDIwIEBACiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCW1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CiAJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwlpZiAoIXRpbWVvdXQpIHsKICNpZm5kZWYgTVNfV0lORE9XUwogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmICFkZWZpbmVkKFBZQ0NfR0NDKQotCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLCAmYWRkcmxlbgorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsICZhZGRybGVuKTsKICNlbHNlCi0JCQkgICAgICh2b2lkICopICZhZGRyYnVmLCAmYWRkcmxlbgorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCQkgICAgICh2b2lkICopICZhZGRyYnVmLCAmYWRkcmxlbik7CiAjZW5kaWYKICNlbHNlCi0JCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsICZhZGRybGVuCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncywKKwkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCi0JCQkpOworCX0KIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAJaWYgKHRpbWVvdXQpIHsKQEAgLTI1MDIsNiArMjUzMCwxNCBAQAogCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwogfTsKIAorLyogU29ja09iamVjdCBtZW1iZXJzICovCitzdGF0aWMgUHlNZW1iZXJEZWYgc29ja19tZW1iZXJsaXN0W10gPSB7CisgICAgICAgeyJmYW1pbHkiLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX2ZhbWlseSksIFJFQURPTkxZLCAidGhlIHNvY2tldCBmYW1pbHkifSwKKyAgICAgICB7InR5cGUiLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX3R5cGUpLCBSRUFET05MWSwgInRoZSBzb2NrZXQgdHlwZSJ9LAorICAgICAgIHsicHJvdG8iLCBUX0lOVCwgb2Zmc2V0b2YoUHlTb2NrZXRTb2NrT2JqZWN0LCBzb2NrX3Byb3RvKSwgUkVBRE9OTFksICJ0aGUgc29ja2V0IHByb3RvY29sIn0sCisgICAgICAgeyJ0aW1lb3V0IiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5U29ja2V0U29ja09iamVjdCwgc29ja190aW1lb3V0KSwgUkVBRE9OTFksICJ0aGUgc29ja2V0IHRpbWVvdXQifSwKKyAgICAgICB7MH0sCit9OwogCiAvKiBEZWFsbG9jYXRlIGEgc29ja2V0IG9iamVjdCBpbiByZXNwb25zZSB0byB0aGUgbGFzdCBQeV9ERUNSRUYoKS4KICAgIEZpcnN0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiAqLwpAQCAtMjYyNSw3ICsyNjYxLDcgQEAKIAkwLAkJCQkJLyogdHBfaXRlciAqLwogCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwogCXNvY2tfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisJc29ja19tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KIAkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCiAJMCwJCQkJCS8qIHRwX2Jhc2UgKi8KIAkwLAkJCQkJLyogdHBfZGljdCAqLwpAQCAtMzE1OSw3ICszMTk1LDggQEAKIFB5RG9jX1NUUlZBUihmcm9tZmRfZG9jLAogImZyb21mZChmZCwgZmFtaWx5LCB0eXBlWywgcHJvdG9dKSAtPiBzb2NrZXQgb2JqZWN0XG5cCiBcblwKLUNyZWF0ZSBhIHNvY2tldCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLlxuXAorQ3JlYXRlIGEgc29ja2V0IG9iamVjdCBmcm9tIGEgZHVwbGljYXRlIG9mIHRoZSBnaXZlblxuXAorZmlsZSBkZXNjcmlwdG9yLlxuXAogVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBzb2NrZXQoKS4iKTsKIAogI2VuZGlmIC8qIE5PX0RVUCAqLwpAQCAtNDAyNiw3ICs0MDYzLDEyIEBACiAJLyogICovCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVExJTksiLCBBRl9ORVRMSU5LKTsKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURSIsIE5FVExJTktfUk9VVEUpOworI2lmZGVmIE5FVExJTktfU0tJUAogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1NLSVAiLCBORVRMSU5LX1NLSVApOworI2VuZGlmCisjaWZkZWYgTkVUTElOS19XMQorCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1cxIiwgTkVUTElOS19XMSk7CisjZW5kaWYKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19VU0VSU09DSyIsIE5FVExJTktfVVNFUlNPQ0spOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ZJUkVXQUxMIiwgTkVUTElOS19GSVJFV0FMTCk7CiAjaWZkZWYgTkVUTElOS19UQ1BESUFHCkBAIC00MDM4LDEyICs0MDgwLDE4IEBACiAjaWZkZWYgTkVUTElOS19YRlJNCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfWEZSTSIsIE5FVExJTktfWEZSTSk7CiAjZW5kaWYKKyNpZmRlZiBORVRMSU5LX0FSUEQKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19BUlBEIiwgTkVUTElOS19BUlBEKTsKKyNlbmRpZgorI2lmZGVmIE5FVExJTktfUk9VVEU2CiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEU2IiwgTkVUTElOS19ST1VURTYpOworI2VuZGlmCiAJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfSVA2X0ZXIiwgTkVUTElOS19JUDZfRlcpOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ROUlRNU0ciLCBORVRMSU5LX0ROUlRNU0cpOworI2lmZGVmIE5FVExJTktfVEFQQkFTRQogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RBUEJBU0UiLCBORVRMSU5LX1RBUEJBU0UpOwogI2VuZGlmCisjZW5kaWYgLyogQUZfTkVUTElOSyAqLwogI2lmZGVmIEFGX1JPVVRFCiAJLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9VVEUiLCBBRl9ST1VURSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IDdjNjE4ZTcuLmI3YmYyMGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC01Miw2ICs1Miw3IEBACiAJOSwKIH07CiAKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cnVjdFNwd2RUeXBlOwogCiAKQEAgLTE3Myw3ICsxNzQsMTAgQEAKIAltPVB5X0luaXRNb2R1bGUzKCJzcHdkIiwgc3B3ZF9tZXRob2RzLCBzcHdkX19kb2NfXyk7CiAJaWYgKG0gPT0gTlVMTCkKIAkJcmV0dXJuOwotCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFNwd2RUeXBlLCAmc3RydWN0X3Nwd2RfdHlwZV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKQorCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RTcHdkVHlwZSwgCisJCQkJCSAgJnN0cnVjdF9zcHdkX3R5cGVfZGVzYyk7CiAJUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Nwd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKKwlpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMgYi9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKaW5kZXggY2ZmZWYzYS4uOGIwMGZlZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3Ryb3Btb2R1bGUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiB7CiAJY2hhciAqcywgKnN1YjsKIAlQeV9zc2l6ZV90IGxlbiwgbiwgajsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAKIAlXQVJOOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpyZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKQEAgLTQ0NiwxNiArNDQ2LDE2IEBACiB7CiAJY2hhciAqcywgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAJaW50IGNoYW5nZWQ7CiAKIAlXQVJOOwogCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKIAljaGFuZ2VkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC00NjcsMTEgKzQ2NywxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNDg1LDE2ICs0ODUsMTYgQEAKIHsKIAljaGFyICpzLCAqc19uZXc7CiAJUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld3N0cjsKIAlpbnQgY2hhbmdlZDsKIAogCVdBUk47CiAJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQogCQlyZXR1cm4gTlVMTDsKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld3N0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwogCWNoYW5nZWQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKQEAgLTUwNiwxMSArNTA2LDExIEBACiAJCXNfbmV3Kys7CiAJfQogCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKKwkJUHlfREVDUkVGKG5ld3N0cik7CiAJCVB5X0lOQ1JFRihhcmdzKTsKIAkJcmV0dXJuIGFyZ3M7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC01MjUsMTYgKzUyNSwxNiBAQAogewogCWNoYXIgKnMsICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ldzsKKwlQeU9iamVjdCAqbmV3c3RyOwogCWludCBjaGFuZ2VkOwogCiAJV0FSTjsKIAlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCiAJCXJldHVybiBOVUxMOwotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3c3RyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CiAJY2hhbmdlZCA9IDA7CiAJaWYgKDAgPCBuKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC01NTUsMTEgKzU1NSwxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNjQ3LDcgKzY0Nyw3IEBACiB7CiAJY2hhciAqcywgKnN1YjsKIAlQeV9zc2l6ZV90IGxlbiwgbjsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlfc3NpemVfdCBtLCByOwogCiAJV0FSTjsKQEAgLTY5MSwxNiArNjkxLDE2IEBACiB7CiAJY2hhciAqcywgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAJaW50IGNoYW5nZWQ7CiAKIAlXQVJOOwogCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKIAkJcmV0dXJuIE5VTEw7Ci0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdzdHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKIAljaGFuZ2VkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CkBAIC03MTcsMTEgKzcxNywxMSBAQAogCQlzX25ldysrOwogCX0KIAlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ldyk7CisJCVB5X0RFQ1JFRihuZXdzdHIpOwogCQlQeV9JTkNSRUYoYXJncyk7CiAJCXJldHVybiBhcmdzOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtOTQyLDcgKzk0Miw3IEBACiAJfQogCiAJdGFibGUgPSB0YWJsZTE7Ci0JaW5sZW4gPSBQeVN0cmluZ19TaXplKGlucHV0X29iaik7CisJaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOwogCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOwogCWlmIChyZXN1bHQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogCS8qIGZpbmQgbGVuZ3RoIG9mIG91dHB1dCBzdHJpbmcgKi8KIAluZm91bmQgPSBteW1lbWNudChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKTsKIAlpZiAoY291bnQgPCAwKQotCQljb3VudCA9IElOVF9NQVg7CisJCWNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CiAJZWxzZSBpZiAobmZvdW5kID4gY291bnQpCiAJCW5mb3VuZCA9IGNvdW50OwogCWlmIChuZm91bmQgPT0gMCkKQEAgLTExNDEsNyArMTE0MSw3IEBACiAJY2hhciAqc3RyLCAqcGF0LCpzdWIsKm5ld19zOwogCVB5X3NzaXplX3QgbGVuLHBhdF9sZW4sc3ViX2xlbixvdXRfbGVuOwogCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdzdHI7CiAKIAlXQVJOOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3QjfG46cmVwbGFjZSIsCkBAIC0xMTY1LDE0ICsxMTY1LDE0IEBACiAJfQogCWlmIChvdXRfbGVuID09IC0xKSB7CiAJCS8qIHdlJ3JlIHJldHVybmluZyBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyaW5nICovCi0JCW5ldyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJUHlfWElOQ1JFRihuZXcpOworCQluZXdzdHIgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisJCVB5X1hJTkNSRUYobmV3c3RyKTsKIAl9CiAJZWxzZSB7Ci0JCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5ld19zLCBvdXRfbGVuKTsKKwkJbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmV3X3MsIG91dF9sZW4pOwogCQlQeU1lbV9GUkVFKG5ld19zKTsKIAl9Ci0JcmV0dXJuIG5ldzsKKwlyZXR1cm4gbmV3c3RyOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCmluZGV4IDlhNmM1ZDguLjgzMzEzZGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwpAQCAtMjIsMjQgKzIyLDYgQEAKIAlQeVRocmVhZF90eXBlX2xvY2sgbG9ja19sb2NrOwogfSBsb2Nrb2JqZWN0OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IExvY2t0eXBlOwotCi1zdGF0aWMgbG9ja29iamVjdCAqCi1uZXdsb2Nrb2JqZWN0KHZvaWQpCi17Ci0JbG9ja29iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KGxvY2tvYmplY3QsICZMb2NrdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bG9ja19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmIChzZWxmLT5sb2NrX2xvY2sgPT0gTlVMTCkgewotCQlQeU9iamVjdF9EZWwoc2VsZik7Ci0JCXNlbGYgPSBOVUxMOwotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JfQotCXJldHVybiBzZWxmOwotfQotCiBzdGF0aWMgdm9pZAogbG9ja19kZWFsbG9jKGxvY2tvYmplY3QgKnNlbGYpCiB7CkBAIC0xNjYsNiArMTQ4LDIyIEBACiAJMCwJCQkJLyp0cF9yZXByKi8KIH07CiAKK3N0YXRpYyBsb2Nrb2JqZWN0ICoKK25ld2xvY2tvYmplY3Qodm9pZCkKK3sKKwlsb2Nrb2JqZWN0ICpzZWxmOworCXNlbGYgPSBQeU9iamVjdF9OZXcobG9ja29iamVjdCwgJkxvY2t0eXBlKTsKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlzZWxmLT5sb2NrX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisJaWYgKHNlbGYtPmxvY2tfbG9jayA9PSBOVUxMKSB7CisJCVB5T2JqZWN0X0RlbChzZWxmKTsKKwkJc2VsZiA9IE5VTEw7CisJCVB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKIC8qIFRocmVhZC1sb2NhbCBvYmplY3RzICovCiAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKQEAgLTE3OCw4ICsxNzYsNiBAQAogCVB5T2JqZWN0ICpkaWN0OwogfSBsb2NhbG9iamVjdDsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBsb2NhbHR5cGU7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewpAQCAtMzE1LDI5ICszMTEsNiBAQAogCXJldHVybiBsZGljdDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWxvY2FsX2dldGF0dHJvKGxvY2Fsb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbmFtZSkKLXsKLQlQeU9iamVjdCAqbGRpY3QsICp2YWx1ZTsKLQotCWxkaWN0ID0gX2xkaWN0KHNlbGYpOwotCWlmIChsZGljdCA9PSBOVUxMKSAKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoc2VsZi0+b2JfdHlwZSAhPSAmbG9jYWx0eXBlKQotCQkvKiB1c2UgZ2VuZXJpYyBsb29rdXAgZm9yIHN1YnR5cGVzICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKLQotCS8qIE9wdGltaXphdGlvbjoganVzdCBsb29rIGluIGRpY3Qgb3Vyc2VsdmVzICovCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbShsZGljdCwgbmFtZSk7Ci0JaWYgKHZhbHVlID09IE5VTEwpIAotCQkvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLwotCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7Ci0KLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKLX0KLQogc3RhdGljIGludAogbG9jYWxfc2V0YXR0cm8obG9jYWxvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdikKIHsKQEAgLTM2OCw2ICszNDEsOCBAQAogCXtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCAqbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKiwgUHlPYmplY3QgKik7CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgbG9jYWx0eXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogCS8qIG9iX3NpemUgICAgICAgICAgICovIDAsCkBAIC0zNzUsMTcgKzM1MCwxNyBAQAogCS8qIHRwX2Jhc2ljc2l6ZSAgICAgICovIHNpemVvZihsb2NhbG9iamVjdCksCiAJLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKIAkvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvcilsb2NhbF9kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIChwcmludGZ1bmMpMCwKLQkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAoZ2V0YXR0cmZ1bmMpMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAoc2V0YXR0cmZ1bmMpMCwKLQkvKiB0cF9jb21wYXJlICAgICAgICAqLyAoY21wZnVuYykwLAotCS8qIHRwX3JlcHIgICAgICAgICAgICovIChyZXByZnVuYykwLAorCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisJLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKwkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisJLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKIAkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAogCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCiAJLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAoaGFzaGZ1bmMpMCwKLQkvKiB0cF9jYWxsICAgICAgICAgICAqLyAodGVybmFyeWZ1bmMpMCwKLQkvKiB0cF9zdHIgICAgICAgICAgICAqLyAocmVwcmZ1bmMpMCwKKwkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisJLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKIAkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAoZ2V0YXR0cm9mdW5jKWxvY2FsX2dldGF0dHJvLAogCS8qIHRwX3NldGF0dHJvICAgICAgICovIChzZXRhdHRyb2Z1bmMpbG9jYWxfc2V0YXR0cm8sCiAJLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKQEAgLTM5MywyNSArMzY4LDQ3IEBACiAJLyogdHBfZG9jICAgICAgICAgICAgKi8gIlRocmVhZC1sb2NhbCBkYXRhIiwKIAkvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAodHJhdmVyc2Vwcm9jKWxvY2FsX3RyYXZlcnNlLAogCS8qIHRwX2NsZWFyICAgICAgICAgICovIChpbnF1aXJ5KWxvY2FsX2NsZWFyLAotCS8qIHRwX3JpY2hjb21wYXJlICAgICovIChyaWNoY21wZnVuYykwLAotCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIChsb25nKTAsCi0JLyogdHBfaXRlciAgICAgICAgICAgKi8gKGdldGl0ZXJmdW5jKTAsCi0JLyogdHBfaXRlcm5leHQgICAgICAgKi8gKGl0ZXJuZXh0ZnVuYykwLAorCS8qIHRwX3JpY2hjb21wYXJlICAgICovIDAsCisJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8gMCwKKwkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAorCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCiAJLyogdHBfbWV0aG9kcyAgICAgICAgKi8gMCwKIAkvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAogCS8qIHRwX2dldHNldCAgICAgICAgICovIGxvY2FsX2dldHNldCwKIAkvKiB0cF9iYXNlICAgICAgICAgICAqLyAwLAogCS8qIHRwX2RpY3QgICAgICAgICAgICovIDAsIC8qIGludGVybmFsIHVzZSAqLwotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIChkZXNjcmdldGZ1bmMpMCwKLQkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAoZGVzY3JzZXRmdW5jKTAsCisJLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKKwkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAogCS8qIHRwX2RpY3RvZmZzZXQgICAgICovIG9mZnNldG9mKGxvY2Fsb2JqZWN0LCBkaWN0KSwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAoaW5pdHByb2MpMCwKLQkvKiB0cF9hbGxvYyAgICAgICAgICAqLyAoYWxsb2NmdW5jKTAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gKG5ld2Z1bmMpbG9jYWxfbmV3LAorCS8qIHRwX2luaXQgICAgICAgICAgICovIDAsCisJLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKKwkvKiB0cF9uZXcgICAgICAgICAgICAqLyBsb2NhbF9uZXcsCiAJLyogdHBfZnJlZSAgICAgICAgICAgKi8gMCwgLyogTG93LWxldmVsIGZyZWUtbWVtIHJvdXRpbmUgKi8KLQkvKiB0cF9pc19nYyAgICAgICAgICAqLyAoaW5xdWlyeSkwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KKwkvKiB0cF9pc19nYyAgICAgICAgICAqLyAwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KIH07CiAKK3N0YXRpYyBQeU9iamVjdCAqCitsb2NhbF9nZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCit7CisJUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CisKKwlsZGljdCA9IF9sZGljdChzZWxmKTsKKwlpZiAobGRpY3QgPT0gTlVMTCkgCisJCXJldHVybiBOVUxMOworCisJaWYgKHNlbGYtPm9iX3R5cGUgIT0gJmxvY2FsdHlwZSkKKwkJLyogdXNlIGdlbmVyaWMgbG9va3VwIGZvciBzdWJ0eXBlcyAqLworCQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisKKwkvKiBPcHRpbWl6YXRpb246IGp1c3QgbG9vayBpbiBkaWN0IG91cnNlbHZlcyAqLworCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0obGRpY3QsIG5hbWUpOworCWlmICh2YWx1ZSA9PSBOVUxMKSAKKwkJLyogRmFsbCBiYWNrIG9uIGdlbmVyaWMgdG8gZ2V0IF9fY2xhc3NfXyBhbmQgX19kaWN0X18gKi8KKwkJcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworCisJUHlfSU5DUkVGKHZhbHVlKTsKKwlyZXR1cm4gdmFsdWU7Cit9CiAKIC8qIE1vZHVsZSBmdW5jdGlvbnMgKi8KIApAQCAtNTYwLDYgKzU1Nyw4IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGxvY2tvYmplY3QgKm5ld2xvY2tvYmplY3Qodm9pZCk7CisKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jayhQeU9iamVjdCAqc2VsZikKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGltZW1vZHVsZS5jIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKaW5kZXggYmE5Mzk1Ny4uMDhkMjhhMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aW1lbW9kdWxlLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCTksCiB9OwogCitzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RUaW1lVHlwZTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ0Myw3ICs0NDQsNyBAQAogCSAqIHdpbGwgYmUgYWhlYWQgb2YgdGltZS4uLgogCSAqLwogCWZvciAoaSA9IDEwMjQ7IDsgaSArPSBpKSB7Ci0JCW91dGJ1ZiA9IG1hbGxvYyhpKTsKKwkJb3V0YnVmID0gKGNoYXIgKiltYWxsb2MoaSk7CiAJCWlmIChvdXRidWYgPT0gTlVMTCkgewogCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAJCX0KQEAgLTgwNyw5ICs4MDgsMTMgQEAKIAloSW50ZXJydXB0RXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CiAJU2V0Q29uc29sZUN0cmxIYW5kbGVyKCBQeUN0cmxIYW5kbGVyLCBUUlVFKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0gICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLCAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLCAKKwkJCQkJICAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKKwl9CiAJUHlfSU5DUkVGKCZTdHJ1Y3RUaW1lVHlwZSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfdGltZSIsIChQeU9iamVjdCopICZTdHJ1Y3RUaW1lVHlwZSk7CisJaW5pdGlhbGl6ZWQgPSAxOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCA5ZWRhNjUzLi4yOTc2MTFjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZWNvbXApOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogZ2V0X2RlY29tcF9yZWNvcmQoUHlPYmplY3QgKnNlbGYsIFB5X1VDUzQgY29kZSwgaW50ICppbmRleCwgaW50ICpwcmVmaXgsIGludCAqY291bnQpCiB7CiAgICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApIHsKQEAgLTQ4Niw4ICs0ODYsOCBAQAogICAgIFB5X1VOSUNPREUgKmksICplbmQsICpvOwogICAgIC8qIExvbmdlc3QgZGVjb21wb3NpdGlvbiBpbiBVbmljb2RlIDMuMjogVStGREZBICovCiAgICAgUHlfVU5JQ09ERSBzdGFja1syMF07IAotICAgIGludCBzcGFjZSwgc3RhY2twdHIsIGlzaXplOwotICAgIGludCBpbmRleCwgcHJlZml4LCBjb3VudDsKKyAgICBQeV9zc2l6ZV90IHNwYWNlLCBpc2l6ZTsKKyAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgIHVuc2lnbmVkIGNoYXIgcHJldiwgY3VyOwogCQogICAgIHN0YWNrcHRyID0gMDsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24gYWRkcyB0aHJlZSBjaGFyYWN0ZXJzIGluCiAgICAgICAgICAgICAgICBhIHNpbmdsZSBzdGVwLCBzbyB3ZSBuZWVkIGF0bGVhc3QgdGhhdCBtdWNoIHJvb20uICovCiAgICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5ld3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpICsgMTA7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KSArIDEwOwogICAgICAgICAgICAgICAgIHNwYWNlICs9IDEwOwogICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc1OSw3ICs3NTksNyBAQAogICAgIHVuc2lnbmVkIGxvbmcgaCA9IDA7CiAgICAgdW5zaWduZWQgbG9uZyBpeDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgaCA9IChoICogc2NhbGUpICsgKHVuc2lnbmVkIGNoYXIpIHRvdXBwZXIoc1tpXSk7CisgICAgICAgIGggPSAoaCAqIHNjYWxlKSArICh1bnNpZ25lZCBjaGFyKSB0b3VwcGVyKFB5X0NIQVJNQVNLKHNbaV0pKTsKICAgICAgICAgaXggPSBoICYgMHhmZjAwMDAwMDsKICAgICAgICAgaWYgKGl4KQogICAgICAgICAgICAgaCA9IChoIF4gKChpeD4+MjQpICYgMHhmZikpICYgMHgwMGZmZmZmZjsKQEAgLTkwNiw3ICs5MDYsNyBAQAogICAgIGlmICghX2dldHVjbmFtZShzZWxmLCBjb2RlLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykgewotICAgICAgICBpZiAodG91cHBlcihuYW1lW2ldKSAhPSBidWZmZXJbaV0pCisgICAgICAgIGlmICh0b3VwcGVyKFB5X0NIQVJNQVNLKG5hbWVbaV0pKSAhPSBidWZmZXJbaV0pCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGJ1ZmZlcltuYW1lbGVuXSA9PSAnXDAnOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eHN1YnR5cGUuYyBiL01vZHVsZXMveHhzdWJ0eXBlLmMKaW5kZXggZmZiYzcyYi4uODhjZTZjNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eHN1YnR5cGUuYworKysgYi9Nb2R1bGVzL3h4c3VidHlwZS5jCkBAIC03OSw4ICs3OSw2IEBACiAJe05VTEwsCU5VTEx9LAogfTsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtbGlzdF90eXBlOwotCiBzdGF0aWMgaW50CiBzcGFtbGlzdF9pbml0KHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC0xNzksOCArMTc3LDYgQEAKIAl7TlVMTCwJTlVMTH0sCiB9OwogCi1zdGF0aWMgUHlUeXBlT2JqZWN0IHNwYW1kaWN0X3R5cGU7Ci0KIHN0YXRpYyBpbnQKIHNwYW1kaWN0X2luaXQoc3BhbWRpY3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemlwaW1wb3J0LmMgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCmluZGV4IDYzN2RjNDguLmQ1OWViZDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemlwaW1wb3J0LmMKKysrIGIvTW9kdWxlcy96aXBpbXBvcnQuYwpAQCAtNDAsNyArNDAsNiBAQAogCVB5T2JqZWN0ICpmaWxlczsgICAgLyogZGljdCB3aXRoIGZpbGUgaW5mbyB7cGF0aDogdG9jX2VudHJ5fSAqLwogfTsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBaaXBJbXBvcnRlcl9UeXBlOwogc3RhdGljIFB5T2JqZWN0ICpaaXBJbXBvcnRFcnJvcjsKIHN0YXRpYyBQeU9iamVjdCAqemlwX2RpcmVjdG9yeV9jYWNoZSA9IE5VTEw7CiAKQEAgLTE3MSwxMyArMTcwLDcgQEAKIHppcGltcG9ydGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpvYmosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCWludCBlcnI7Ci0KLQlpZiAoc2VsZi0+ZmlsZXMgIT0gTlVMTCkgewotCQllcnIgPSB2aXNpdChzZWxmLT5maWxlcywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKHNlbGYtPmZpbGVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTU4LDcgKzk1MSw3IEBACiAJUHlPYmplY3QgKmZpeGVkX3NvdXJjZTsKIAogCS8qIG9uZSBjaGFyIGV4dHJhIGZvciB0cmFpbGluZyBcbiBhbmQgb25lIGZvciB0ZXJtaW5hdGluZyBcMCAqLwotCWJ1ZiA9IFB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKKwlidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAogCQkJCSJ6aXBpbXBvcnQ6IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IDcyNTc1NWQuLjM1YjhjMzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC02NTQsNyArNjU0LDkgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGRlY29tcF9mbHVzaF9fZG9jX18sCi0iZmx1c2goKSAtLSBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbnkgcmVtYWluaW5nIGRlY29tcHJlc3NlZCBkYXRhLlxuIgorImZsdXNoKCBbbGVuZ3RoXSApIC0tIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFueSByZW1haW5pbmdcbiIKKyJkZWNvbXByZXNzZWQgZGF0YS4gbGVuZ3RoLCBpZiBnaXZlbiwgaXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGVcbiIKKyJvdXRwdXQgYnVmZmVyLlxuIgogIlxuIgogIlRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlciB0aGlzIGNhbGwuIik7CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvYWJzdHJhY3QuYyBiL09iamVjdHMvYWJzdHJhY3QuYwppbmRleCBjNzU1NjU0Li4xM2E5NDczIDEwMDY0NAotLS0gYS9PYmplY3RzL2Fic3RyYWN0LmMKKysrIGIvT2JqZWN0cy9hYnN0cmFjdC5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNkZWZpbmUgSEFTSU5ERVgobykgUHlUeXBlX0hhc0ZlYXR1cmUoKG8pLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpCiAKKwogLyogU2hvcnRoYW5kcyB0byByZXR1cm4gY2VydGFpbiBlcnJvcnMgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTk0MCw4ICs5NDEsOSBAQAogCQl2YWx1ZSA9IG5iLT5uYl9pbmRleChpdGVtKTsKIAl9CiAJZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAKLQkJCQkib2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmRleCIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJICAgICAiJyUuMjAwcycgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCAiCisJCQkgICAgICJhcyBhbiBpbmRleCIsIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwogCX0KIAlyZXR1cm4gdmFsdWU7CiB9CkBAIC0xMjQ1LDI0ICsxMjQ3LDYgQEAKIAlyZXR1cm4gdHlwZV9lcnJvcigidW5pbmRleGFibGUgb2JqZWN0Iik7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1zbGljZW9ial9mcm9tX2ludGludChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgaikKLXsKLQlQeU9iamVjdCAqc3RhcnQsICplbmQsICpzbGljZTsKLQlzdGFydCA9IFB5SW50X0Zyb21Mb25nKChsb25nKWkpOwotCWlmICghc3RhcnQpCi0JCXJldHVybiBOVUxMOwotCWVuZCA9IFB5SW50X0Zyb21Mb25nKChsb25nKWopOwotCWlmICghZW5kKSB7Ci0JCVB5X0RFQ1JFRihzdGFydCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzbGljZSA9IFB5U2xpY2VfTmV3KHN0YXJ0LCBlbmQsIE5VTEwpOwotCVB5X0RFQ1JFRihzdGFydCk7Ci0JUHlfREVDUkVGKGVuZCk7Ci0JcmV0dXJuIHNsaWNlOwotfQotCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQogewpAQCAtMTI4Nyw3ICsxMjcxLDcgQEAKIAkJcmV0dXJuIG0tPnNxX3NsaWNlKHMsIGkxLCBpMik7CiAJfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfc3Vic2NyaXB0KSB7CiAJCVB5T2JqZWN0ICpyZXM7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IHNsaWNlb2JqX2Zyb21faW50aW50KGkxLCBpMik7CisJCVB5T2JqZWN0ICpzbGljZSA9IF9QeVNsaWNlX0Zyb21JbmRpY2VzKGkxLCBpMik7CiAJCWlmICghc2xpY2UpCiAJCQlyZXR1cm4gTlVMTDsKIAkJcmVzID0gbXAtPm1wX3N1YnNjcmlwdChzLCBzbGljZSk7CkBAIC0xMzc5LDcgKzEzNjMsNyBAQAogCQlyZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgbyk7CiAJfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfYXNzX3N1YnNjcmlwdCkgewogCQlpbnQgcmVzOwotCQlQeU9iamVjdCAqc2xpY2UgPSBzbGljZW9ial9mcm9tX2ludGludChpMSwgaTIpOworCQlQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOwogCQlpZiAoIXNsaWNlKQogCQkJcmV0dXJuIC0xOwogCQlyZXMgPSBtcC0+bXBfYXNzX3N1YnNjcmlwdChzLCBzbGljZSwgbyk7CkBAIC0xODE1LDExICsxNzk5LDM3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCoKK2NhbGxfZnVuY3Rpb25fdGFpbChQeU9iamVjdCAqY2FsbGFibGUsIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpyZXR2YWw7CisKKwlpZiAoYXJncyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworCQlQeU9iamVjdCAqYTsKKworCQlhID0gUHlUdXBsZV9OZXcoMSk7CisJCWlmIChhID09IE5VTEwpIHsKKwkJCVB5X0RFQ1JFRihhcmdzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVB5VHVwbGVfU0VUX0lURU0oYSwgMCwgYXJncyk7CisJCWFyZ3MgPSBhOworCX0KKwlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKKworCVB5X0RFQ1JFRihhcmdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeU9iamVjdCAqY2FsbGFibGUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewogCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3MsICpyZXR2YWw7CisJUHlPYmplY3QgKmFyZ3M7CiAKIAlpZiAoY2FsbGFibGUgPT0gTlVMTCkKIAkJcmV0dXJuIG51bGxfZXJyb3IoKTsKQEAgLTE4MzIsMzEgKzE4NDIsMzQgQEAKIAllbHNlCiAJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCXJldHVybiBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOworfQogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5T2JqZWN0ICphOworUHlPYmplY3QgKgorX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVChQeU9iamVjdCAqY2FsbGFibGUsIGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJUHlPYmplY3QgKmFyZ3M7CiAKLQkJYSA9IFB5VHVwbGVfTmV3KDEpOwotCQlpZiAoYSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeVR1cGxlX1NldEl0ZW0oYSwgMCwgYXJncykgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFyZ3MgPSBhOworCWlmIChjYWxsYWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gbnVsbF9lcnJvcigpOworCisJaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisJCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOworCQlhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKwkJdmFfZW5kKHZhKTsKIAl9Ci0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisJZWxzZQorCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlQeV9ERUNSRUYoYXJncyk7Ci0KLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBjYWxsX2Z1bmN0aW9uX3RhaWwoY2FsbGFibGUsIGFyZ3MpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsTWV0aG9kKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzID0gTlVMTDsKKwlQeU9iamVjdCAqYXJnczsKIAlQeU9iamVjdCAqZnVuYyA9IE5VTEw7CiAJUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKQEAgLTE4ODIsMjQgKzE4OTUsNDkgQEAKIAllbHNlCiAJCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKIAotCWlmICghYXJncykKLQkJZ290byBleGl0OwotCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5T2JqZWN0ICphOwotCi0JCWEgPSBQeVR1cGxlX05ldygxKTsKLQkJaWYgKGEgPT0gTlVMTCkKLQkJCWdvdG8gZXhpdDsKLQkJaWYgKFB5VHVwbGVfU2V0SXRlbShhLCAwLCBhcmdzKSA8IDApCi0JCQlnb3RvIGV4aXQ7Ci0JCWFyZ3MgPSBhOwotCX0KLQotCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisJcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOwogCiAgIGV4aXQ6Ci0JUHlfWERFQ1JFRihhcmdzKTsKKwkvKiBhcmdzIGdldHMgY29uc3VtZWQgaW4gY2FsbF9mdW5jdGlvbl90YWlsICovCisJUHlfWERFQ1JFRihmdW5jKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK1B5T2JqZWN0ICoKK19QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCVB5T2JqZWN0ICphcmdzOworCVB5T2JqZWN0ICpmdW5jID0gTlVMTDsKKwlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKKworCWlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gbnVsbF9lcnJvcigpOworCisJZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7CisJaWYgKGZ1bmMgPT0gTlVMTCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKwkJdHlwZV9lcnJvcigiY2FsbCBvZiBub24tY2FsbGFibGUgYXR0cmlidXRlIik7IAorCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisJCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOworCQlhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKwkJdmFfZW5kKHZhKTsKKwl9CisJZWxzZQorCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisKKwlyZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CisKKyAgZXhpdDoKKwkvKiBhcmdzIGdldHMgY29uc3VtZWQgaW4gY2FsbF9mdW5jdGlvbl90YWlsICovCiAJUHlfWERFQ1JFRihmdW5jKTsKIAogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9PYmplY3RzL2Jvb2xvYmplY3QuYyBiL09iamVjdHMvYm9vbG9iamVjdC5jCmluZGV4IDA1Nzg0ZTUuLjc5YmUxODQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYm9vbG9iamVjdC5jCisrKyBiL09iamVjdHMvYm9vbG9iamVjdC5jCkBAIC0xMDMsNDIgKzEwMyw0MiBAQAogLyogQXJpdGhtZXRpYyBtZXRob2RzIC0tIG9ubHkgc28gd2UgY2FuIG92ZXJyaWRlICYsIHwsIF4uICovCiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYm9vbF9hc19udW1iZXIgPSB7Ci0JMCwJCQkJCS8qIG5iX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkvKiBuYl9tdWx0aXBseSAqLwotCTAsCQkJCQkvKiBuYl9yZW1haW5kZXIgKi8KLQkwLAkJCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkJCS8qIG5iX3Bvd2VyICovCi0JMCwJCQkJCS8qIG5iX25lZ2F0aXZlICovCi0JMCwJCQkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkJCS8qIG5iX2Fic29sdXRlICovCi0JMCwJCQkJCS8qIG5iX25vbnplcm8gKi8KLQkwLAkJCQkJLyogbmJfaW52ZXJ0ICovCi0JMCwJCQkJCS8qIG5iX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9yc2hpZnQgKi8KLQkoYmluYXJ5ZnVuYylib29sX2FuZCwJCQkvKiBuYl9hbmQgKi8KLQkoYmluYXJ5ZnVuYylib29sX3hvciwJCQkvKiBuYl94b3IgKi8KLQkoYmluYXJ5ZnVuYylib29sX29yLAkJCS8qIG5iX29yICovCi0JMCwJCQkJCS8qIG5iX2NvZXJjZSAqLwotCTAsCQkJCQkvKiBuYl9pbnQgKi8KLQkwLAkJCQkJLyogbmJfbG9uZyAqLwotCTAsCQkJCQkvKiBuYl9mbG9hdCAqLwotCTAsCQkJCQkvKiBuYl9vY3QgKi8KLQkwLAkJIAkJCS8qIG5iX2hleCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQkwLAkJCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JMCwJCQkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisJMCwJCQkvKiBuYl9hZGQgKi8KKwkwLAkJCS8qIG5iX3N1YnRyYWN0ICovCisJMCwJCQkvKiBuYl9tdWx0aXBseSAqLworCTAsCQkJLyogbmJfcmVtYWluZGVyICovCisJMCwJCQkvKiBuYl9kaXZtb2QgKi8KKwkwLAkJCS8qIG5iX3Bvd2VyICovCisJMCwJCQkvKiBuYl9uZWdhdGl2ZSAqLworCTAsCQkJLyogbmJfcG9zaXRpdmUgKi8KKwkwLAkJCS8qIG5iX2Fic29sdXRlICovCisJMCwJCQkvKiBuYl9ub256ZXJvICovCisJMCwJCQkvKiBuYl9pbnZlcnQgKi8KKwkwLAkJCS8qIG5iX2xzaGlmdCAqLworCTAsCQkJLyogbmJfcnNoaWZ0ICovCisJYm9vbF9hbmQsCQkvKiBuYl9hbmQgKi8KKwlib29sX3hvciwJCS8qIG5iX3hvciAqLworCWJvb2xfb3IsCQkvKiBuYl9vciAqLworCTAsCQkJLyogbmJfY29lcmNlICovCisJMCwJCQkvKiBuYl9pbnQgKi8KKwkwLAkJCS8qIG5iX2xvbmcgKi8KKwkwLAkJCS8qIG5iX2Zsb2F0ICovCisJMCwJCQkvKiBuYl9vY3QgKi8KKwkwLAkJIAkvKiBuYl9oZXggKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfYWRkICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLworCTAsCQkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLworCTAsCQkJLyogbmJfaW5wbGFjZV94b3IgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KKwkwLAkJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLworCTAsCQkJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKwkwLAkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisJMCwJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCiB9OwogCiAvKiBUaGUgdHlwZSBvYmplY3QgZm9yIGJvb2wuICBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgc3ViY2xhc3NlZCEgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCmluZGV4IGVmZjA2YWEuLmQyNTk3YjkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9idWZmZXJvYmplY3QuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJfQogCS8qIFhYWDogY2hlY2sgZm9yIG92ZXJmbG93IGluIG11bHRpcGx5ICovCiAJLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW8gPSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKCpiKSArIHNpemUpOworCW8gPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKCpiKSArIHNpemUpOwogCWlmICggbyA9PSBOVUxMICkKIAkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAJYiA9IChQeUJ1ZmZlck9iamVjdCAqKSBQeU9iamVjdF9JTklUKG8sICZQeUJ1ZmZlcl9UeXBlKTsKQEAgLTMwNSw3ICszMDUsNyBAQAogCVB5X3NzaXplX3Qgc2l6ZTsKIAlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIgKilwdHIsIHNpemUpOwogfQogCiAvKiBTZXF1ZW5jZSBtZXRob2RzICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2NlbGxvYmplY3QuYyBiL09iamVjdHMvY2VsbG9iamVjdC5jCmluZGV4IDNiODcwOTMuLmRhNDhkZWEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2VsbG9iamVjdC5jCisrKyBiL09iamVjdHMvY2VsbG9iamVjdC5jCkBAIC03MywxOSArNzMsMjkgQEAKIHN0YXRpYyBpbnQKIGNlbGxfdHJhdmVyc2UoUHlDZWxsT2JqZWN0ICpvcCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKG9wLT5vYl9yZWYpCi0JCXJldHVybiB2aXNpdChvcC0+b2JfcmVmLCBhcmcpOworCVB5X1ZJU0lUKG9wLT5vYl9yZWYpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBjZWxsX2NsZWFyKFB5Q2VsbE9iamVjdCAqb3ApCiB7Ci0JUHlfWERFQ1JFRihvcC0+b2JfcmVmKTsKLQlvcC0+b2JfcmVmID0gTlVMTDsKKwlQeV9DTEVBUihvcC0+b2JfcmVmKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2NlbGxfZ2V0X2NvbnRlbnRzKFB5Q2VsbE9iamVjdCAqb3AsIHZvaWQgKmNsb3N1cmUpCit7CisJUHlfWElOQ1JFRihvcC0+b2JfcmVmKTsKKwlyZXR1cm4gb3AtPm9iX3JlZjsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIGNlbGxfZ2V0c2V0bGlzdFtdID0geworCXsiY2VsbF9jb250ZW50cyIsIChnZXR0ZXIpY2VsbF9nZXRfY29udGVudHMsIE5VTEx9LAorCXtOVUxMfSAvKiBzZW50aW5lbCAqLworfTsKKwogUHlUeXBlT2JqZWN0IFB5Q2VsbF9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCiAJMCwKQEAgLTExMSw0ICsxMjEsMTEgQEAKICAJMCwJCQkJCS8qIHRwX2RvYyAqLwogIAkodHJhdmVyc2Vwcm9jKWNlbGxfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwogIAkoaW5xdWlyeSljZWxsX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwgCQkJCQkvKiB0cF9pdGVyICovCisJMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCisJMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KKwkwLAkJCQkJLyogdHBfbWVtYmVycyAqLworCWNlbGxfZ2V0c2V0bGlzdCwJCQkvKiB0cF9nZXRzZXQgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKaW5kZXggOTNhY2I1MC4uNTk0ZGUxMSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGFzc29iamVjdC5jCisrKyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiB7CiAJcmVnaXN0ZXIgUHlPYmplY3QgKnY7CiAJcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlQeUNsYXNzT2JqZWN0ICpjbGFzczsKKwlQeUNsYXNzT2JqZWN0ICprbGFzczsKIAlkZXNjcmdldGZ1bmMgZjsKIAogCWlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAkJCXJldHVybiB2OwogCQl9CiAJfQotCXYgPSBjbGFzc19sb29rdXAob3AsIG5hbWUsICZjbGFzcyk7CisJdiA9IGNsYXNzX2xvb2t1cChvcCwgbmFtZSwgJmtsYXNzKTsKIAlpZiAodiA9PSBOVUxMKSB7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKIAkJCSAgICAgImNsYXNzICUuNTBzIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLApAQCAtMzg4LDE1ICszODgsMTUgQEAKIAkJUHlfSU5DUkVGKG5hbWUpOwogCQlyZXR1cm4gbmFtZTsKIAl9Ci0JbSA9IFB5U3RyaW5nX1NpemUobW9kKTsKLQluID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKKwltID0gUHlTdHJpbmdfR0VUX1NJWkUobW9kKTsKKwluID0gUHlTdHJpbmdfR0VUX1NJWkUobmFtZSk7CiAJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBtKzErbik7CiAJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCWNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpOwotCQltZW1jcHkocywgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwgbSk7CisJCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzKTsKKwkJbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCBtKTsKIAkJcyArPSBtOwogCQkqcysrID0gJy4nOwotCQltZW1jcHkocywgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSksIG4pOworCQltZW1jcHkocywgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCBuKTsKIAl9CiAJcmV0dXJuIHJlczsKIH0KQEAgLTQwNCwzNyArNDA0LDEyIEBACiBzdGF0aWMgaW50CiBjbGFzc190cmF2ZXJzZShQeUNsYXNzT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCWlmIChvLT5jbF9iYXNlcykgewotCQllcnIgPSB2aXNpdChvLT5jbF9iYXNlcywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChvLT5jbF9kaWN0KSB7Ci0JCWVyciA9IHZpc2l0KG8tPmNsX2RpY3QsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoby0+Y2xfbmFtZSkgewotCQllcnIgPSB2aXNpdChvLT5jbF9uYW1lLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKG8tPmNsX2dldGF0dHIpIHsKLQkJZXJyID0gdmlzaXQoby0+Y2xfZ2V0YXR0ciwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChvLT5jbF9zZXRhdHRyKSB7Ci0JCWVyciA9IHZpc2l0KG8tPmNsX3NldGF0dHIsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoby0+Y2xfZGVsYXR0cikgewotCQllcnIgPSB2aXNpdChvLT5jbF9kZWxhdHRyLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQoby0+Y2xfYmFzZXMpOworCVB5X1ZJU0lUKG8tPmNsX2RpY3QpOworCVB5X1ZJU0lUKG8tPmNsX25hbWUpOworCVB5X1ZJU0lUKG8tPmNsX2dldGF0dHIpOworCVB5X1ZJU0lUKG8tPmNsX3NldGF0dHIpOworCVB5X1ZJU0lUKG8tPmNsX2RlbGF0dHIpOwogCXJldHVybiAwOwogfQogCkBAIC00ODEsMjMgKzQ1NiwyMyBAQAogfTsKIAogaW50Ci1QeUNsYXNzX0lzU3ViY2xhc3MoUHlPYmplY3QgKmNsYXNzLCBQeU9iamVjdCAqYmFzZSkKK1B5Q2xhc3NfSXNTdWJjbGFzcyhQeU9iamVjdCAqa2xhc3MsIFB5T2JqZWN0ICpiYXNlKQogewogCVB5X3NzaXplX3QgaSwgbjsKIAlQeUNsYXNzT2JqZWN0ICpjcDsKLQlpZiAoY2xhc3MgPT0gYmFzZSkKKwlpZiAoa2xhc3MgPT0gYmFzZSkKIAkJcmV0dXJuIDE7CiAJaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKIAkJbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZSk7CiAJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChQeUNsYXNzX0lzU3ViY2xhc3MoY2xhc3MsIFB5VHVwbGVfR0VUX0lURU0oYmFzZSwgaSkpKQorCQkJaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhrbGFzcywgUHlUdXBsZV9HRVRfSVRFTShiYXNlLCBpKSkpCiAJCQkJcmV0dXJuIDE7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQotCWlmIChjbGFzcyA9PSBOVUxMIHx8ICFQeUNsYXNzX0NoZWNrKGNsYXNzKSkKKwlpZiAoa2xhc3MgPT0gTlVMTCB8fCAhUHlDbGFzc19DaGVjayhrbGFzcykpCiAJCXJldHVybiAwOwotCWNwID0gKFB5Q2xhc3NPYmplY3QgKiljbGFzczsKKwljcCA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7CiAJbiA9IFB5VHVwbGVfU2l6ZShjcC0+Y2xfYmFzZXMpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKIAkJaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhQeVR1cGxlX0dldEl0ZW0oY3AtPmNsX2Jhc2VzLCBpKSwgYmFzZSkpCkBAIC03MTksNyArNjk0LDcgQEAKIGluc3RhbmNlX2dldGF0dHIyKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lKQogewogCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCVB5Q2xhc3NPYmplY3QgKmNsYXNzOworCVB5Q2xhc3NPYmplY3QgKmtsYXNzOwogCWRlc2NyZ2V0ZnVuYyBmOwogCiAJdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwpAQCAtNzI3LDcgKzcwMiw3IEBACiAJCVB5X0lOQ1JFRih2KTsKIAkJcmV0dXJuIHY7CiAJfQotCXYgPSBjbGFzc19sb29rdXAoaW5zdC0+aW5fY2xhc3MsIG5hbWUsICZjbGFzcyk7CisJdiA9IGNsYXNzX2xvb2t1cChpbnN0LT5pbl9jbGFzcywgbmFtZSwgJmtsYXNzKTsKIAlpZiAodiAhPSBOVUxMKSB7CiAJCVB5X0lOQ1JFRih2KTsKIAkJZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKQEAgLTc2Nyw3ICs3NDIsNyBAQAogX1B5SW5zdGFuY2VfTG9va3VwKFB5T2JqZWN0ICpwaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7CiAJUHlPYmplY3QgKnY7Ci0JUHlDbGFzc09iamVjdCAqY2xhc3M7CisJUHlDbGFzc09iamVjdCAqa2xhc3M7CiAJUHlJbnN0YW5jZU9iamVjdCAqaW5zdDsJLyogcGluc3QgY2FzdCB0byB0aGUgcmlnaHQgdHlwZSAqLwogCiAJYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2socGluc3QpKTsKQEAgLTc3Nyw3ICs3NTIsNyBAQAogCiAgCXYgPSBQeURpY3RfR2V0SXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKIAlpZiAodiA9PSBOVUxMKQotCQl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAmY2xhc3MpOworCQl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOwogCXJldHVybiB2OwogfQogCkBAIC05NzksMTcgKzk1NCw4IEBACiBzdGF0aWMgaW50CiBpbnN0YW5jZV90cmF2ZXJzZShQeUluc3RhbmNlT2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCWlmIChvLT5pbl9jbGFzcykgewotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoby0+aW5fY2xhc3MpLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKG8tPmluX2RpY3QpIHsKLQkJZXJyID0gdmlzaXQoby0+aW5fZGljdCwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKG8tPmluX2NsYXNzKTsKKwlQeV9WSVNJVChvLT5pbl9kaWN0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEyOCwyNyArMTA5NCw2IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zbGljZW9ial9mcm9tX2ludGludChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgaikKLXsKLQlQeU9iamVjdCAqc3RhcnQsICplbmQsICpyZXM7Ci0KLQlzdGFydCA9IFB5SW50X0Zyb21Mb25nKChsb25nKWkpOwotCWlmICghc3RhcnQpCi0JCXJldHVybiBOVUxMOwotCi0JZW5kID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaik7Ci0JaWYgKCFlbmQpIHsKLQkJUHlfREVDUkVGKHN0YXJ0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlcyA9IFB5U2xpY2VfTmV3KHN0YXJ0LCBlbmQsIE5VTEwpOwotCVB5X0RFQ1JFRihzdGFydCk7Ci0JUHlfREVDUkVGKGVuZCk7Ci0JcmV0dXJuIHJlczsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2Vfc2xpY2UoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGopCiB7CiAJUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CkBAIC0xMTY4LDcgKzExMTMsNyBAQAogCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKIAkJaWYgKGZ1bmMgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwotCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLCBzbGljZW9ial9mcm9tX2ludGludChpLCBqKSk7CisJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOKSIsIF9QeVNsaWNlX0Zyb21JbmRpY2VzKGksIGopKTsKIAl9IGVsc2UKIAkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uKSIsIGksIGopOwogCkBAIC0xMjM5LDcgKzExODQsNyBAQAogCQkJCXJldHVybiAtMTsKIAogCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwKLQkJCQkJICAgIHNsaWNlb2JqX2Zyb21faW50aW50KGksIGopKTsKKwkJCQkJICAgIF9QeVNsaWNlX0Zyb21JbmRpY2VzKGksIGopKTsKIAkJfSBlbHNlCiAJCQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7CiAJfQpAQCAtMTI2MCw3ICsxMjA1LDcgQEAKIAkJCQlyZXR1cm4gLTE7CiAKIAkJCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOTykiLAotCQkJCQkgICAgc2xpY2VvYmpfZnJvbV9pbnRpbnQoaSwgaiksIHZhbHVlKTsKKwkJCQkJICAgIF9QeVNsaWNlX0Zyb21JbmRpY2VzKGksIGopLCB2YWx1ZSk7CiAJCX0gZWxzZQogCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uTykiLCBpLCBqLCB2YWx1ZSk7CiAJfQpAQCAtMjA0OSw0MyArMTk5NCw0MyBAQAogCiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgaW5zdGFuY2VfYXNfbnVtYmVyID0gewotCShiaW5hcnlmdW5jKWluc3RhbmNlX2FkZCwJCS8qIG5iX2FkZCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX3N1YiwJCS8qIG5iX3N1YnRyYWN0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfbXVsLAkJLyogbmJfbXVsdGlwbHkgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9tb2QsCQkvKiBuYl9yZW1haW5kZXIgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9kaXZtb2QsCQkvKiBuYl9kaXZtb2QgKi8KLQkodGVybmFyeWZ1bmMpaW5zdGFuY2VfcG93LAkJLyogbmJfcG93ZXIgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX25lZywJCS8qIG5iX25lZ2F0aXZlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9wb3MsCQkvKiBuYl9wb3NpdGl2ZSAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfYWJzLAkJLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlpbnN0YW5jZV9ub256ZXJvLAkJLyogbmJfbm9uemVybyAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LAkJLyogbmJfaW52ZXJ0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfbHNoaWZ0LAkJLyogbmJfbHNoaWZ0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfcnNoaWZ0LAkJLyogbmJfcnNoaWZ0ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfYW5kLAkJLyogbmJfYW5kICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfeG9yLAkJLyogbmJfeG9yICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2Vfb3IsCQkvKiBuYl9vciAqLwotCShjb2VyY2lvbilpbnN0YW5jZV9jb2VyY2UsCQkvKiBuYl9jb2VyY2UgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX2ludCwJCS8qIG5iX2ludCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfbG9uZywJCS8qIG5iX2xvbmcgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX2Zsb2F0LAkJLyogbmJfZmxvYXQgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX29jdCwJCS8qIG5iX29jdCAqLwotCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaGV4LAkJLyogbmJfaGV4ICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaWFkZCwJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaXN1YiwJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9pbXVsLAkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2ltb2QsCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCSh0ZXJuYXJ5ZnVuYylpbnN0YW5jZV9pcG93LAkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2lsc2hpZnQsCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2lyc2hpZnQsCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2lhbmQsCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2l4b3IsCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2lvciwJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQkoYmluYXJ5ZnVuYylpbnN0YW5jZV9mbG9vcmRpdiwJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX3RydWVkaXYsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX2lmbG9vcmRpdiwJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpaW5zdGFuY2VfaXRydWVkaXYsCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JKGxlbmZ1bmMpaW5zdGFuY2VfaW5kZXgsCQkvKiBuYl9pbmRleCAqLworCWluc3RhbmNlX2FkZCwJCQkvKiBuYl9hZGQgKi8KKwlpbnN0YW5jZV9zdWIsCQkJLyogbmJfc3VidHJhY3QgKi8KKwlpbnN0YW5jZV9tdWwsCQkJLyogbmJfbXVsdGlwbHkgKi8KKwlpbnN0YW5jZV9tb2QsCQkJLyogbmJfcmVtYWluZGVyICovCisJaW5zdGFuY2VfZGl2bW9kLAkJLyogbmJfZGl2bW9kICovCisJaW5zdGFuY2VfcG93LAkJCS8qIG5iX3Bvd2VyICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9uZWcsCS8qIG5iX25lZ2F0aXZlICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9wb3MsCS8qIG5iX3Bvc2l0aXZlICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9hYnMsCS8qIG5iX2Fic29sdXRlICovCisJKGlucXVpcnkpaW5zdGFuY2Vfbm9uemVybywJLyogbmJfbm9uemVybyAqLworCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaW52ZXJ0LAkvKiBuYl9pbnZlcnQgKi8KKwlpbnN0YW5jZV9sc2hpZnQsCQkvKiBuYl9sc2hpZnQgKi8KKwlpbnN0YW5jZV9yc2hpZnQsCQkvKiBuYl9yc2hpZnQgKi8KKwlpbnN0YW5jZV9hbmQsCQkJLyogbmJfYW5kICovCisJaW5zdGFuY2VfeG9yLAkJCS8qIG5iX3hvciAqLworCWluc3RhbmNlX29yLAkJCS8qIG5iX29yICovCisJaW5zdGFuY2VfY29lcmNlLAkJLyogbmJfY29lcmNlICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnQsCS8qIG5iX2ludCAqLworCSh1bmFyeWZ1bmMpaW5zdGFuY2VfbG9uZywJLyogbmJfbG9uZyAqLworCSh1bmFyeWZ1bmMpaW5zdGFuY2VfZmxvYXQsCS8qIG5iX2Zsb2F0ICovCisJKHVuYXJ5ZnVuYylpbnN0YW5jZV9vY3QsCS8qIG5iX29jdCAqLworCSh1bmFyeWZ1bmMpaW5zdGFuY2VfaGV4LAkvKiBuYl9oZXggKi8KKwlpbnN0YW5jZV9pYWRkLAkJCS8qIG5iX2lucGxhY2VfYWRkICovCisJaW5zdGFuY2VfaXN1YiwJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCisJaW5zdGFuY2VfaW11bCwJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisJaW5zdGFuY2VfaW1vZCwJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworCWluc3RhbmNlX2lwb3csCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLworCWluc3RhbmNlX2lsc2hpZnQsCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworCWluc3RhbmNlX2lyc2hpZnQsCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLworCWluc3RhbmNlX2lhbmQsCQkJLyogbmJfaW5wbGFjZV9hbmQgKi8KKwlpbnN0YW5jZV9peG9yLAkJCS8qIG5iX2lucGxhY2VfeG9yICovCisJaW5zdGFuY2VfaW9yLAkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KKwlpbnN0YW5jZV9mbG9vcmRpdiwJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLworCWluc3RhbmNlX3RydWVkaXYsCQkvKiBuYl90cnVlX2RpdmlkZSAqLworCWluc3RhbmNlX2lmbG9vcmRpdiwJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisJaW5zdGFuY2VfaXRydWVkaXYsCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisJKGxlbmZ1bmMpaW5zdGFuY2VfaW5kZXgsCS8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlJbnN0YW5jZV9UeXBlID0gewpAQCAtMjE0MCw3ICsyMDg1LDcgQEAKIHN0YXRpYyBQeU1ldGhvZE9iamVjdCAqZnJlZV9saXN0OwogCiBQeU9iamVjdCAqCi1QeU1ldGhvZF9OZXcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2xhc3MpCitQeU1ldGhvZF9OZXcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqa2xhc3MpCiB7CiAJcmVnaXN0ZXIgUHlNZXRob2RPYmplY3QgKmltOwogCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewpAQCAtMjE2Miw4ICsyMTA3LDggQEAKIAlpbS0+aW1fZnVuYyA9IGZ1bmM7CiAJUHlfWElOQ1JFRihzZWxmKTsKIAlpbS0+aW1fc2VsZiA9IHNlbGY7Ci0JUHlfWElOQ1JFRihjbGFzcyk7Ci0JaW0tPmltX2NsYXNzID0gY2xhc3M7CisJUHlfWElOQ1JFRihrbGFzcyk7CisJaW0tPmltX2NsYXNzID0ga2xhc3M7CiAJX1B5T2JqZWN0X0dDX1RSQUNLKGltKTsKIAlyZXR1cm4gKFB5T2JqZWN0ICopaW07CiB9CkBAIC0yMzY1LDM1ICsyMzEwLDIyIEBACiBzdGF0aWMgaW50CiBpbnN0YW5jZW1ldGhvZF90cmF2ZXJzZShQeU1ldGhvZE9iamVjdCAqaW0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0JaWYgKGltLT5pbV9mdW5jKSB7Ci0JCWVyciA9IHZpc2l0KGltLT5pbV9mdW5jLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGltLT5pbV9zZWxmKSB7Ci0JCWVyciA9IHZpc2l0KGltLT5pbV9zZWxmLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGltLT5pbV9jbGFzcykgewotCQllcnIgPSB2aXNpdChpbS0+aW1fY2xhc3MsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChpbS0+aW1fZnVuYyk7CisJUHlfVklTSVQoaW0tPmltX3NlbGYpOworCVB5X1ZJU0lUKGltLT5pbV9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCi1nZXRjbGFzc25hbWUoUHlPYmplY3QgKmNsYXNzLCBjaGFyICpidWYsIGludCBidWZzaXplKQorZ2V0Y2xhc3NuYW1lKFB5T2JqZWN0ICprbGFzcywgY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKIHsKIAlQeU9iamVjdCAqbmFtZTsKIAogCWFzc2VydChidWZzaXplID4gMSk7CiAJc3RyY3B5KGJ1ZiwgIj8iKTsgLyogRGVmYXVsdCBvdXRjb21lICovCi0JaWYgKGNsYXNzID09IE5VTEwpCisJaWYgKGtsYXNzID09IE5VTEwpCiAJCXJldHVybjsKLQluYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjbGFzcywgIl9fbmFtZV9fIik7CisJbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoa2xhc3MsICJfX25hbWVfXyIpOwogCWlmIChuYW1lID09IE5VTEwpIHsKIAkJLyogVGhpcyBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGFuIGV4Y2VwdGlvbiAqLwogCQlQeUVycl9DbGVhcigpOwpAQCAtMjQwOSw3ICsyMzQxLDcgQEAKIHN0YXRpYyB2b2lkCiBnZXRpbnN0Y2xhc3NuYW1lKFB5T2JqZWN0ICppbnN0LCBjaGFyICpidWYsIGludCBidWZzaXplKQogewotCVB5T2JqZWN0ICpjbGFzczsKKwlQeU9iamVjdCAqa2xhc3M7CiAKIAlpZiAoaW5zdCA9PSBOVUxMKSB7CiAJCWFzc2VydChidWZzaXplID4gMCAmJiAoc2l6ZV90KWJ1ZnNpemUgPiBzdHJsZW4oIm5vdGhpbmciKSk7CkBAIC0yNDE3LDIyICsyMzQ5LDIyIEBACiAJCXJldHVybjsKIAl9CiAKLQljbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoaW5zdCwgIl9fY2xhc3NfXyIpOwotCWlmIChjbGFzcyA9PSBOVUxMKSB7CisJa2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsICJfX2NsYXNzX18iKTsKKwlpZiAoa2xhc3MgPT0gTlVMTCkgewogCQkvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCiAJCVB5RXJyX0NsZWFyKCk7Ci0JCWNsYXNzID0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpOwotCQlQeV9JTkNSRUYoY2xhc3MpOworCQlrbGFzcyA9IChQeU9iamVjdCAqKShpbnN0LT5vYl90eXBlKTsKKwkJUHlfSU5DUkVGKGtsYXNzKTsKIAl9Ci0JZ2V0Y2xhc3NuYW1lKGNsYXNzLCBidWYsIGJ1ZnNpemUpOwotCVB5X1hERUNSRUYoY2xhc3MpOworCWdldGNsYXNzbmFtZShrbGFzcywgYnVmLCBidWZzaXplKTsKKwlQeV9YREVDUkVGKGtsYXNzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKIAlQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOwotCVB5T2JqZWN0ICpjbGFzcyA9IFB5TWV0aG9kX0dFVF9DTEFTUyhmdW5jKTsKKwlQeU9iamVjdCAqa2xhc3MgPSBQeU1ldGhvZF9HRVRfQ0xBU1MoZnVuYyk7CiAJUHlPYmplY3QgKnJlc3VsdDsKIAogCWZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7CkBAIC0yNDQ1LDE0ICsyMzc3LDE0IEBACiAJCWlmIChzZWxmID09IE5VTEwpCiAJCQlvayA9IDA7CiAJCWVsc2UgewotCQkJb2sgPSBQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIGNsYXNzKTsKKwkJCW9rID0gUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCBrbGFzcyk7CiAJCQlpZiAob2sgPCAwKQogCQkJCXJldHVybiBOVUxMOwogCQl9CiAJCWlmICghb2spIHsKIAkJCWNoYXIgY2xzYnVmWzI1Nl07CiAJCQljaGFyIGluc3RidWZbMjU2XTsKLQkJCWdldGNsYXNzbmFtZShjbGFzcywgY2xzYnVmLCBzaXplb2YoY2xzYnVmKSk7CisJCQlnZXRjbGFzc25hbWUoa2xhc3MsIGNsc2J1Ziwgc2l6ZW9mKGNsc2J1ZikpOwogCQkJZ2V0aW5zdGNsYXNzbmFtZShzZWxmLCBpbnN0YnVmLCBzaXplb2YoaW5zdGJ1ZikpOwogCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKIAkJCQkgICAgICJ1bmJvdW5kIG1ldGhvZCAlcyVzIG11c3QgYmUgY2FsbGVkIHdpdGggIgpAQCAtMjUzMSw3ICsyNDYzLDcgQEAKIAkoaGFzaGZ1bmMpaW5zdGFuY2VtZXRob2RfaGFzaCwJCS8qIHRwX2hhc2ggKi8KIAlpbnN0YW5jZW1ldGhvZF9jYWxsLAkJCS8qIHRwX2NhbGwgKi8KIAkwLAkJCQkJLyogdHBfc3RyICovCi0JKGdldGF0dHJvZnVuYylpbnN0YW5jZW1ldGhvZF9nZXRhdHRybywJLyogdHBfZ2V0YXR0cm8gKi8KKwlpbnN0YW5jZW1ldGhvZF9nZXRhdHRybywJCS8qIHRwX2dldGF0dHJvICovCiAJUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KIAlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAvKiB0cF9mbGFncyAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb2JqZWN0LmMgYi9PYmplY3RzL2NvYmplY3QuYwppbmRleCBmNzY0YTFkLi5iMmNhZTlhIDEwMDY0NAotLS0gYS9PYmplY3RzL2NvYmplY3QuYworKysgYi9PYmplY3RzL2NvYmplY3QuYwpAQCAtMTM2LDI1ICsxMzYsMjYgQEAKIAogUHlUeXBlT2JqZWN0IFB5Q09iamVjdF9UeXBlID0gewogICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0gICAgMCwJCQkJCS8qb2Jfc2l6ZSovCi0gICAgIlB5Q09iamVjdCIsCQkJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoUHlDT2JqZWN0KSwJCQkvKnRwX2Jhc2ljc2l6ZSovCi0gICAgMCwJCQkJCS8qdHBfaXRlbXNpemUqLworICAgIDAsCQkJCS8qb2Jfc2l6ZSovCisgICAgIlB5Q09iamVjdCIsCQkvKnRwX25hbWUqLworICAgIHNpemVvZihQeUNPYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLworICAgIDAsCQkJCS8qdHBfaXRlbXNpemUqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilQeUNPYmplY3RfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgICAocHJpbnRmdW5jKTAsCQkJLyp0cF9wcmludCovCi0gICAgKGdldGF0dHJmdW5jKTAsCQkJLyp0cF9nZXRhdHRyKi8KLSAgICAoc2V0YXR0cmZ1bmMpMCwJCQkvKnRwX3NldGF0dHIqLwotICAgIChjbXBmdW5jKTAsCQkJCS8qdHBfY29tcGFyZSovCi0gICAgKHJlcHJmdW5jKTAsCQkJLyp0cF9yZXByKi8KLSAgICAwLAkJCQkJLyp0cF9hc19udW1iZXIqLwotICAgIDAsCQkJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLSAgICAwLAkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgICAoaGFzaGZ1bmMpMCwJCQkvKnRwX2hhc2gqLwotICAgICh0ZXJuYXJ5ZnVuYykwLAkJCS8qdHBfY2FsbCovCi0gICAgKHJlcHJmdW5jKTAsCQkJLyp0cF9zdHIqLwotCi0gICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLSAgICAwTCwwTCwwTCwwTCwKLSAgICBQeUNPYmplY3RfVHlwZV9fZG9jX18gCQkvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIChkZXN0cnVjdG9yKVB5Q09iamVjdF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsCQkJCS8qdHBfcHJpbnQqLworICAgIDAsCQkJCS8qdHBfZ2V0YXR0ciovCisgICAgMCwJCQkJLyp0cF9zZXRhdHRyKi8KKyAgICAwLAkJCQkvKnRwX2NvbXBhcmUqLworICAgIDAsCQkJCS8qdHBfcmVwciovCisgICAgMCwJCQkJLyp0cF9hc19udW1iZXIqLworICAgIDAsCQkJCS8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsCQkJCS8qdHBfYXNfbWFwcGluZyovCisgICAgMCwJCQkJLyp0cF9oYXNoKi8KKyAgICAwLAkJCQkvKnRwX2NhbGwqLworICAgIDAsCQkJCS8qdHBfc3RyKi8KKyAgICAwLAkJCQkvKnRwX2dldGF0dHJvKi8KKyAgICAwLAkJCQkvKnRwX3NldGF0dHJvKi8KKyAgICAwLAkJCQkvKnRwX2FzX2J1ZmZlciovCisgICAgMCwJCQkJLyp0cF9mbGFncyovCisgICAgUHlDT2JqZWN0X1R5cGVfX2RvY19fCS8qdHBfZG9jKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2NvZGVvYmplY3QuYyBiL09iamVjdHMvY29kZW9iamVjdC5jCmluZGV4IGY4MzI5MTEuLjhhZTIzOTkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvY29kZW9iamVjdC5jCkBAIC00NTEsMyArNDUxLDEzNiBAQAogCX0KIAlyZXR1cm4gbGluZTsKIH0KKworLyogCisgICBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCisKKyAqLworCisJLyogVGhlIHRoZW9yeSBvZiBTRVRfTElORU5PLWxlc3MgdHJhY2luZy4KKworCSAgIEluIGEgbnV0c2hlbGwsIHdlIHVzZSB0aGUgY29fbG5vdGFiIGZpZWxkIG9mIHRoZSBjb2RlIG9iamVjdAorCSAgIHRvIHRlbGwgd2hlbiBleGVjdXRpb24gaGFzIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZS4KKworCSAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhlIGJhc2ljIGlkZWEgaXMgc28gc2V0IHRoaW5ncyB1cCBzbworCSAgIHRoYXQKKworCSAgICAgICAgICppbnN0cl9sYiA8PSBmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl91YgorCisJICAgaXMgdHJ1ZSBzbyBsb25nIGFzIGV4ZWN1dGlvbiBkb2VzIG5vdCBjaGFuZ2UgbGluZXMuCisKKwkgICBUaGlzIGlzIGFsbCBmYWlybHkgc2ltcGxlLiAgRGlnZ2luZyB0aGUgaW5mb3JtYXRpb24gb3V0IG9mCisJICAgY29fbG5vdGFiIHRha2VzIHNvbWUgd29yaywgYnV0IGlzIGNvbmNlcHR1YWxseSBjbGVhci4KKworCSAgIFNvbWV3aGF0IGhhcmRlciB0byBleHBsYWluIGlzIHdoeSB3ZSBkb24ndCAqYWx3YXlzKiBjYWxsIHRoZQorCSAgIGxpbmUgdHJhY2UgZnVuY3Rpb24gd2hlbiB0aGUgYWJvdmUgdGVzdCBmYWlscy4KKworCSAgIENvbnNpZGVyIHRoaXMgY29kZToKKworCSAgIDE6IGRlZiBmKGEpOgorCSAgIDI6ICAgICBpZiBhOgorCSAgIDM6ICAgICAgICBwcmludCAxCisJICAgNDogICAgIGVsc2U6CisJICAgNTogICAgICAgIHByaW50IDIKKworCSAgIHdoaWNoIGNvbXBpbGVzIHRvIHRoaXM6CisKKwkgICAyICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorCQkgICAgICAgMyBKVU1QX0lGX0ZBTFNFICAgICAgICAgICAgOSAodG8gMTUpCisJCSAgICAgICA2IFBPUF9UT1AKKworCSAgIDMgICAgICAgICAgIDcgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisJCSAgICAgIDEwIFBSSU5UX0lURU0KKwkJICAgICAgMTEgUFJJTlRfTkVXTElORQorCQkgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgNiAodG8gMjEpCisJCSA+PiAgIDE1IFBPUF9UT1AKKworCSAgIDUgICAgICAgICAgMTYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDIpCisJCSAgICAgIDE5IFBSSU5UX0lURU0KKwkJICAgICAgMjAgUFJJTlRfTkVXTElORQorCQkgPj4gICAyMSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKwkJICAgICAgMjQgUkVUVVJOX1ZBTFVFCisKKwkgICBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0CisJICAgMTUgYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8KKwkgICBsaW5lIDMuICBUaGlzIGlzIGF0IGJlc3QgbWlzbGVhZGluZy4gIEluIHRoaXMgY2FzZSB3ZSBjb3VsZAorCSAgIGFzc29jaWF0ZSB0aGUgUE9QX1RPUCB3aXRoIGxpbmUgNCwgYnV0IHRoYXQgZG9lc24ndCBtYWtlCisJICAgc2Vuc2UgaW4gYWxsIGNhc2VzIChJIHRoaW5rKS4KKworCSAgIFdoYXQgd2UgZG8gaXMgb25seSBjYWxsIHRoZSBsaW5lIHRyYWNlIGZ1bmN0aW9uIGlmIHRoZSBjb19sbm90YWIKKwkgICBpbmRpY2F0ZXMgd2UgaGF2ZSBqdW1wZWQgdG8gdGhlICpzdGFydCogb2YgYSBsaW5lLCBpLmUuIGlmIHRoZQorCSAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gb2Zmc2V0IG1hdGNoZXMgdGhlIG9mZnNldCBnaXZlbiBmb3IgdGhlCisJICAgc3RhcnQgb2YgYSBsaW5lIGJ5IHRoZSBjb19sbm90YWIuCisKKwkgICBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlICdhJyBpcyB0cnVlLgorCSAgIEV4ZWN1dGlvbiB3aWxsIGp1bXAgZnJvbSBpbnN0cnVjdGlvbiBvZmZzZXQgMTIgdG8gb2Zmc2V0IDIxLgorCSAgIFRoZW4gdGhlIGNvX2xub3RhYiB3b3VsZCBpbXBseSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZQorCSAgIDUsIHdoaWNoIGlzIGFnYWluIG1pc2xlYWRpbmcuCisKKwkgICBXaHkgZG8gd2Ugc2V0IGZfbGluZW5vIHdoZW4gdHJhY2luZz8gIFdlbGwsIGNvbnNpZGVyIHRoZSBjb2RlCisJICAgYWJvdmUgd2hlbiAnYScgaXMgdHJ1ZS4gIElmIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyB3aXRoICduJyBpbgorCSAgIHBkYiwgeW91IHdvdWxkIHN0b3AgYXQgbGluZSAxIHdpdGggYSAiY2FsbCIgdHlwZSBldmVudCwgdGhlbgorCSAgIGxpbmUgZXZlbnRzIG9uIGxpbmVzIDIgYW5kIDMsIHRoZW4gYSAicmV0dXJuIiB0eXBlIGV2ZW50IC0tIGJ1dAorCSAgIHlvdSB3b3VsZCBiZSBzaG93biBsaW5lIDUgZHVyaW5nIHRoaXMgZXZlbnQuICBUaGlzIGlzIGEgY2hhbmdlCisJICAgZnJvbSB0aGUgYmVoYXZpb3VyIGluIDIuMiBhbmQgYmVmb3JlLCBhbmQgSSd2ZSBmb3VuZCBpdAorCSAgIGNvbmZ1c2luZyBpbiBwcmFjdGljZS4gIEJ5IHNldHRpbmcgYW5kIHVzaW5nIGZfbGluZW5vIHdoZW4KKwkgICB0cmFjaW5nLCBvbmUgY2FuIHJlcG9ydCBhIGxpbmUgbnVtYmVyIGRpZmZlcmVudCBmcm9tIHRoYXQKKwkgICBzdWdnZXN0ZWQgYnkgZl9sYXN0aSBvbiB0aGlzIG9uZSBvY2Nhc2lvbiB3aGVyZSBpdCdzIGRlc2lyYWJsZS4KKwkqLworCisKK2ludCAKK1B5Q29kZV9DaGVja0xpbmVOdW1iZXIoUHlDb2RlT2JqZWN0KiBjbywgaW50IGxhc3RpLCBQeUFkZHJQYWlyICpib3VuZHMpCit7CisgICAgICAgIGludCBzaXplLCBhZGRyLCBsaW5lOworICAgICAgICB1bnNpZ25lZCBjaGFyKiBwOworCisgICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOworICAgICAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY28tPmNvX2xub3RhYikgLyAyOworCisgICAgICAgIGFkZHIgPSAwOworICAgICAgICBsaW5lID0gY28tPmNvX2ZpcnN0bGluZW5vOworICAgICAgICBhc3NlcnQobGluZSA+IDApOworCisgICAgICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgorICAgICAgICAgICAobGlrZWx5IHRvIGJlIGEgY29tbW9uIGNhc2UpIHRoZW4gd2UgYWxyZWFkeSBrbm93CisgICAgICAgICAgIGluc3RyX2xiIC0tIGlmIHdlIHN0b3JlZCB0aGUgbWF0Y2hpbmcgdmFsdWUgb2YgcAorICAgICAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLworCisgICAgICAgIC8qIHNlZSBjb21tZW50cyBpbiBjb21waWxlLmMgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgICAgICAgICBjb19sbm90YWIuICBBIHBvaW50IHRvIHJlbWVtYmVyOiBpbmNyZW1lbnRzIHRvIHAKKyAgICAgICAgICAgc2hvdWxkIGNvbWUgaW4gcGFpcnMgLS0gYWx0aG91Z2ggd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgICAgICB0aGUgbGluZSBpbmNyZW1lbnRzIGhlcmUsIHRyZWF0aW5nIHRoZW0gYXMgYnl0ZQorICAgICAgICAgICBpbmNyZW1lbnRzIGdldHMgY29uZnVzaW5nLCB0byBzYXkgdGhlIGxlYXN0LiAqLworCisgICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGFkZHIgKz0gKnArKzsKKyAgICAgICAgICAgICAgICBpZiAoKnApIAorICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IGFkZHI7CisgICAgICAgICAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIGxhc3RpIGFuZCBhZGRyIGRvbid0IG1hdGNoIGV4YWN0bHksIHdlIGRvbid0IHdhbnQgdG8KKyAgICAgICAgICAgY2hhbmdlIHRoZSBsaW5lbm8gc2xvdCBvbiB0aGUgZnJhbWUgb3IgZXhlY3V0ZSBhIHRyYWNlCisgICAgICAgICAgIGZ1bmN0aW9uLiAgUmV0dXJuIC0xIGluc3RlYWQuCisgICAgICAgICovCisgICAgICAgIGlmIChhZGRyICE9IGxhc3RpKQorICAgICAgICAgICAgICAgIGxpbmUgPSAtMTsKKyAgICAgICAgCisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIHdoaWxlICgtLXNpemUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkciArPSAqcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gYWRkcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gSU5UX01BWDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW5lOworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwppbmRleCBmMDkxNWRkLi5jNjAyMWU5IDEwMDY0NAotLS0gYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYworKysgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwpAQCAtNjY3LDcgKzY2Nyw3IEBACiAJfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSA+PSBzaXplb2Yoc19idWZmZXIpKSB7CisJCWlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgPj0gKFB5X3NzaXplX3Qpc2l6ZW9mKHNfYnVmZmVyKSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAJCQkJICJjb21wbGV4KCkgbGl0ZXJhbCB0b28gbGFyZ2UgdG8gY29udmVydCIpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC05NDAsMTAgKzk0MCwxMCBAQAogCTAsCQkJCQkvKiBuYl9hbmQgKi8KIAkwLAkJCQkJLyogbmJfeG9yICovCiAJMCwJCQkJCS8qIG5iX29yICovCi0JKGNvZXJjaW9uKWNvbXBsZXhfY29lcmNlLAkJLyogbmJfY29lcmNlICovCi0JKHVuYXJ5ZnVuYyljb21wbGV4X2ludCwJCQkvKiBuYl9pbnQgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfbG9uZywJCS8qIG5iX2xvbmcgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfZmxvYXQsCQkvKiBuYl9mbG9hdCAqLworCWNvbXBsZXhfY29lcmNlLAkJCQkvKiBuYl9jb2VyY2UgKi8KKwljb21wbGV4X2ludCwJCQkJLyogbmJfaW50ICovCisJY29tcGxleF9sb25nLAkJCQkvKiBuYl9sb25nICovCisJY29tcGxleF9mbG9hdCwJCQkJLyogbmJfZmxvYXQgKi8KIAkwLAkJCQkJLyogbmJfb2N0ICovCiAJMCwJCQkJCS8qIG5iX2hleCAqLwogCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwpAQCAtOTY4LDcgKzk2OCw3IEBACiAJImNvbXBsZXgiLAogCXNpemVvZihQeUNvbXBsZXhPYmplY3QpLAogCTAsCi0JKGRlc3RydWN0b3IpY29tcGxleF9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLworCWNvbXBsZXhfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCiAJKHByaW50ZnVuYyljb21wbGV4X3ByaW50LAkJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKaW5kZXggOTQ5NDA2Mi4uNTYxYmE0YTUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTM3NywxMyArMzc3LDcgQEAKIGRlc2NyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlQeURlc2NyT2JqZWN0ICpkZXNjciA9IChQeURlc2NyT2JqZWN0ICopc2VsZjsKLQlpbnQgZXJyOwotCi0JaWYgKGRlc2NyLT5kX3R5cGUpIHsKLQkJZXJyID0gdmlzaXQoKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQoZGVzY3ItPmRfdHlwZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ4MCw3ICs0NzQsNyBAQAogCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCiAJMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCQkvKiB0cF9jYWxsICovCiAJMCwJCQkJCS8qIHRwX3N0ciAqLwogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KQEAgLTUxOCw3ICs1MTIsNyBAQAogCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCiAJMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCQkvKiB0cF9jYWxsICovCiAJMCwJCQkJCS8qIHRwX3N0ciAqLwogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KQEAgLTgxNCwxMyArODA4LDcgQEAKIHByb3h5X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlwcm94eW9iamVjdCAqcHAgPSAocHJveHlvYmplY3QgKilzZWxmOwotCWludCBlcnI7Ci0KLQlpZiAocHAtPmRpY3QpIHsKLQkJZXJyID0gdmlzaXQocHAtPmRpY3QsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChwcC0+ZGljdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5OSwxOCArOTg3LDggQEAKIHdyYXBwZXJfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCXdyYXBwZXJvYmplY3QgKndwID0gKHdyYXBwZXJvYmplY3QgKilzZWxmOwotCWludCBlcnI7Ci0KLQlpZiAod3AtPmRlc2NyKSB7Ci0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKSh3cC0+ZGVzY3IpLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHdwLT5zZWxmKSB7Ci0JCWVyciA9IHZpc2l0KHdwLT5zZWxmLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJUHlfVklTSVQod3AtPmRlc2NyKTsKKwlQeV9WSVNJVCh3cC0+c2VsZik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMzcsMjAgKzEyMTUsMTAgQEAKIHByb3BlcnR5X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlwcm9wZXJ0eW9iamVjdCAqcHAgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwotCWludCBlcnI7Ci0KLSNkZWZpbmUgVklTSVQoU0xPVCkgXAotCWlmIChwcC0+U0xPVCkgeyBcCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKShwcC0+U0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQotCVZJU0lUKHByb3BfZ2V0KTsKLQlWSVNJVChwcm9wX3NldCk7Ci0JVklTSVQocHJvcF9kZWwpOwotCVZJU0lUKHByb3BfZG9jKTsKLQorCVB5X1ZJU0lUKHBwLT5wcm9wX2dldCk7CisJUHlfVklTSVQocHAtPnByb3Bfc2V0KTsKKwlQeV9WSVNJVChwcC0+cHJvcF9kZWwpOworCVB5X1ZJU0lUKHBwLT5wcm9wX2RvYyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZGljdG9iamVjdC5jIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKaW5kZXggMGVjY2RiYi4uZjU3OTllZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kaWN0b2JqZWN0LmMKQEAgLTExNSw2ICsxMTUsMTQgQEAKIC8qIE9iamVjdCB1c2VkIGFzIGR1bW15IGtleSB0byBmaWxsIGRlbGV0ZWQgZW50cmllcyAqLwogc3RhdGljIFB5T2JqZWN0ICpkdW1teSA9IE5VTEw7IC8qIEluaXRpYWxpemVkIGJ5IGZpcnN0IGNhbGwgdG8gbmV3ZGljdG9iamVjdCgpICovCiAKKyNpZmRlZiBQeV9SRUZfREVCVUcKK1B5T2JqZWN0ICoKK19QeURpY3RfRHVtbXkodm9pZCkKK3sKKwlyZXR1cm4gZHVtbXk7Cit9CisjZW5kaWYKKwogLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0YXRpYyBkaWN0ZW50cnkgKgogbG9va2RpY3Rfc3RyaW5nKGRpY3RvYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOwpAQCAtMTcyNCwxNyArMTczMiwxMiBAQAogZGljdF90cmF2ZXJzZShQeU9iamVjdCAqb3AsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCVB5X3NzaXplX3QgaSA9IDA7Ci0JaW50IGVycjsKIAlQeU9iamVjdCAqcGs7CiAJUHlPYmplY3QgKnB2OwogCiAJd2hpbGUgKFB5RGljdF9OZXh0KG9wLCAmaSwgJnBrLCAmcHYpKSB7Ci0JCWVyciA9IHZpc2l0KHBrLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gdmlzaXQocHYsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQlQeV9WSVNJVChwayk7CisJCVB5X1ZJU0lUKHB2KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xODgwLDE2ICsxODgzLDE2IEBACiAKIC8qIEhhY2sgdG8gaW1wbGVtZW50ICJrZXkgaW4gZGljdCIgKi8KIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBkaWN0X2FzX3NlcXVlbmNlID0gewotCTAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCQkJLyogc3FfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotCTAsCQkJCQkvKiBzcV9pdGVtICovCi0JMCwJCQkJCS8qIHNxX3NsaWNlICovCi0JMCwJCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKVB5RGljdF9Db250YWlucywJCS8qIHNxX2NvbnRhaW5zICovCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisJMCwJCQkvKiBzcV9sZW5ndGggKi8KKwkwLAkJCS8qIHNxX2NvbmNhdCAqLworCTAsCQkJLyogc3FfcmVwZWF0ICovCisJMCwJCQkvKiBzcV9pdGVtICovCisJMCwJCQkvKiBzcV9zbGljZSAqLworCTAsCQkJLyogc3FfYXNzX2l0ZW0gKi8KKwkwLAkJCS8qIHNxX2Fzc19zbGljZSAqLworCVB5RGljdF9Db250YWlucywJLyogc3FfY29udGFpbnMgKi8KKwkwLAkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCisJMCwJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE5NjYsOCArMTk2OSw4IEBACiAJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKIAkJUHlfVFBGTEFHU19CQVNFVFlQRSwJCS8qIHRwX2ZsYWdzICovCiAJZGljdGlvbmFyeV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGljdF90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpZGljdF90cF9jbGVhciwJCQkvKiB0cF9jbGVhciAqLworCWRpY3RfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCisJZGljdF90cF9jbGVhciwJCQkJLyogdHBfY2xlYXIgKi8KIAlkaWN0X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCiAJMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAJKGdldGl0ZXJmdW5jKWRpY3RfaXRlciwJCQkvKiB0cF9pdGVyICovCkBAIC0xOTgwLDcgKzE5ODMsNyBAQAogCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KIAkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCiAJMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZGljdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KKwlkaWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KIAlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCiAJZGljdF9uZXcsCQkJCS8qIHRwX25ldyAqLwogCVB5T2JqZWN0X0dDX0RlbCwgICAgICAgIAkJLyogdHBfZnJlZSAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9lbnVtb2JqZWN0LmMgYi9PYmplY3RzL2VudW1vYmplY3QuYwppbmRleCA0ODExMjM5Li5hOGY0M2UwIDEwMDY0NAotLS0gYS9PYmplY3RzL2VudW1vYmplY3QuYworKysgYi9PYmplY3RzL2VudW1vYmplY3QuYwpAQCAtOSw4ICs5LDYgQEAKIAlQeU9iamVjdCogZW5fcmVzdWx0OwkgICAvKiByZXN1bHQgdHVwbGUgICovCiB9IGVudW1vYmplY3Q7CiAKLVB5VHlwZU9iamVjdCBQeUVudW1fVHlwZTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGVudW1fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpAQCAtNTEsMTggKzQ5LDggQEAKIHN0YXRpYyBpbnQKIGVudW1fdHJhdmVyc2UoZW51bW9iamVjdCAqZW4sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWludCBlcnI7Ci0KLQlpZiAoZW4tPmVuX3NpdCkgewotCQllcnIgPSB2aXNpdChlbi0+ZW5fc2l0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGVuLT5lbl9yZXN1bHQpIHsKLQkJZXJyID0gdmlzaXQoZW4tPmVuX3Jlc3VsdCwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKGVuLT5lbl9zaXQpOworCVB5X1ZJU0lUKGVuLT5lbl9yZXN1bHQpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDcsOCArMTk1LDcgQEAKIHN0YXRpYyBpbnQKIHJldmVyc2VkX3RyYXZlcnNlKHJldmVyc2Vkb2JqZWN0ICpybywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKHJvLT5zZXEpCi0JCXJldHVybiB2aXNpdCgoUHlPYmplY3QgKikocm8tPnNlcSksIGFyZyk7CisJUHlfVklTSVQocm8tPnNlcSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZmlsZW9iamVjdC5jIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKaW5kZXggZjk2ZWU3Yi4uNjMyYWIwNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9maWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKQEAgLTQ4LDYgKzQ4LDEwIEBACiAjZGVmaW5lIE5FV0xJTkVfTEYgMgkJLyogXG4gbmV3bGluZSBzZWVuICovCiAjZGVmaW5lIE5FV0xJTkVfQ1JMRiA0CQkvKiBcclxuIG5ld2xpbmUgc2VlbiAqLwogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIEZJTEUgKgogUHlGaWxlX0FzRmlsZShQeU9iamVjdCAqZikKIHsKQEAgLTMxMyw3ICszMTcsOCBAQAogCQkJUHlNZW1fRnJlZShmaWxlLT5mX3NldGJ1Zik7CiAJCQlmaWxlLT5mX3NldGJ1ZiA9IE5VTEw7CiAJCX0gZWxzZSB7Ci0JCQlmaWxlLT5mX3NldGJ1ZiA9IFB5TWVtX1JlYWxsb2MoZmlsZS0+Zl9zZXRidWYsIGJ1ZnNpemUpOworCQkJZmlsZS0+Zl9zZXRidWYgPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoZmlsZS0+Zl9zZXRidWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUpOwogCQl9CiAjaWZkZWYgSEFWRV9TRVRWQlVGCiAJCXNldHZidWYoZmlsZS0+Zl9mcCwgZmlsZS0+Zl9zZXRidWYsIHR5cGUsIGJ1ZnNpemUpOwpAQCAtODE4LDcgKzgyMyw3IEBACiAJCWJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCAoc2l6ZV90KTApOwogCWVsc2UKIAkJYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOwotCWlmIChidWZmZXJzaXplID4gSU5UX01BWCkgeworCWlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJInJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgaXMgbW9yZSB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTEwOTMsNyArMTA5OCw3IEBACiAJCWFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOwogCQlpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsJLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KIAkJdG90YWxfdl9zaXplICs9IGluY3JlbWVudDsKLQkJaWYgKHRvdGFsX3Zfc2l6ZSA+IElOVF9NQVgpIHsKKwkJaWYgKHRvdGFsX3Zfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKIAkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKIAkJCVB5X0RFQ1JFRih2KTsKQEAgLTEyMDQsNyArMTIwOSw3IEBACiAJCXVzZWRfdl9zaXplID0gdG90YWxfdl9zaXplOwogCQlpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsgLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KIAkJdG90YWxfdl9zaXplICs9IGluY3JlbWVudDsKLQkJaWYgKHRvdGFsX3Zfc2l6ZSA+IElOVF9NQVgpIHsKKwkJaWYgKHRvdGFsX3Zfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKIAkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKIAkJCVB5X0RFQ1JFRih2KTsKQEAgLTEzOTEsMTIgKzEzOTYsMTIgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCQl0b3RhbHJlYWQgKz0gbnJlYWQ7Ci0JCXAgPSBtZW1jaHIoYnVmZmVyK25maWxsZWQsICdcbicsIG5yZWFkKTsKKwkJcCA9IChjaGFyICopbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CiAJCWlmIChwID09IE5VTEwpIHsKIAkJCS8qIE5lZWQgYSBsYXJnZXIgYnVmZmVyIHRvIGZpdCB0aGlzIGxpbmUgKi8KIAkJCW5maWxsZWQgKz0gbnJlYWQ7CiAJCQlidWZmZXJzaXplICo9IDI7Ci0JCQlpZiAoYnVmZmVyc2l6ZSA+IElOVF9NQVgpIHsKKwkJCWlmIChidWZmZXJzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKIAkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKIAkJCQlnb3RvIGVycm9yOwpAQCAtMTQzMSw3ICsxNDM2LDcgQEAKIAkJCWlmIChlcnIgIT0gMCkKIAkJCQlnb3RvIGVycm9yOwogCQkJcSA9IHA7Ci0JCQlwID0gbWVtY2hyKHEsICdcbicsIGVuZC1xKTsKKwkJCXAgPSAoY2hhciAqKW1lbWNocihxLCAnXG4nLCBlbmQtcSk7CiAJCX0gd2hpbGUgKHAgIT0gTlVMTCk7CiAJCS8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCiAJCW5maWxsZWQgPSBlbmQtcTsKQEAgLTE3OTAsNyArMTc5NSw3IEBACiAKIC8qIE1ha2Ugc3VyZSB0aGF0IGZpbGUgaGFzIGEgcmVhZGFoZWFkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IG9uZSBieXRlCiAgICAodW5sZXNzIGF0IEVPRikgYW5kIG5vIG1vcmUgdGhhbiBidWZzaXplLiAgUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbgotICAgZXJyb3IgKi8KKyAgIGVycm9yLCB3aWxsIHNldCBNZW1vcnlFcnJvciBpZiBidWZzaXplIGJ5dGVzIGNhbm5vdCBiZSBhbGxvY2F0ZWQuICovCiBzdGF0aWMgaW50CiByZWFkYWhlYWQoUHlGaWxlT2JqZWN0ICpmLCBpbnQgYnVmc2l6ZSkKIHsKQEAgLTE4MDIsNyArMTgwNyw4IEBACiAJCWVsc2UKIAkJCWRyb3BfcmVhZGFoZWFkKGYpOwogCX0KLQlpZiAoKGYtPmZfYnVmID0gUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisJaWYgKChmLT5mX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisJCVB5RXJyX05vTWVtb3J5KCk7CiAJCXJldHVybiAtMTsKIAl9CiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwpAQCAtMTg0NCw3ICsxODUwLDcgQEAKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKIAkJCVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOwotCWJ1ZnB0ciA9IG1lbWNocihmLT5mX2J1ZnB0ciwgJ1xuJywgbGVuKTsKKwlidWZwdHIgPSAoY2hhciAqKW1lbWNocihmLT5mX2J1ZnB0ciwgJ1xuJywgbGVuKTsKIAlpZiAoYnVmcHRyICE9IE5VTEwpIHsKIAkJYnVmcHRyKys7CQkJLyogQ291bnQgdGhlICdcbicgKi8KIAkJbGVuID0gYnVmcHRyIC0gZi0+Zl9idWZwdHI7CkBAIC0yMDU2LDcgKzIwNjIsNyBAQAogCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KIAkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCiAJMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZmlsZV9pbml0LAkJCS8qIHRwX2luaXQgKi8KKwlmaWxlX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KIAlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCiAJZmlsZV9uZXcsCQkJCS8qIHRwX25ldyAqLwogCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCkBAIC0yNDMyLDMgKzI0MzgsOCBAQAogCWYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CiAJcmV0dXJuIGRzdCAtIGJ1ZjsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCmluZGV4IDIwZWQ4NmUuLjg3MDg2OTAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmxvYXRvYmplY3QuYworKysgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKQEAgLTk3LDcgKzk3LDcgQEAKIAl9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQlpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IHNpemVvZihzX2J1ZmZlcikpIHsKKwkJaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSA+PSAoUHlfc3NpemVfdClzaXplb2Yoc19idWZmZXIpKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKIAkJCQkiVW5pY29kZSBmbG9hdCgpIGxpdGVyYWwgdG9vIGxvbmcgdG8gY29udmVydCIpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC05NDAsMjEgKzk0MCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp0bXAsICpuZXc7CisJUHlPYmplY3QgKnRtcCwgKm5ld29iajsKIAogCWFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUZsb2F0X1R5cGUpKTsKIAl0bXAgPSBmbG9hdF9uZXcoJlB5RmxvYXRfVHlwZSwgYXJncywga3dkcyk7CiAJaWYgKHRtcCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlhc3NlcnQoUHlGbG9hdF9DaGVja0V4YWN0KHRtcCkpOwotCW5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChuZXcgPT0gTlVMTCkgeworCW5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChuZXdvYmogPT0gTlVMTCkgewogCQlQeV9ERUNSRUYodG1wKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCSgoUHlGbG9hdE9iamVjdCAqKW5ldyktPm9iX2Z2YWwgPSAoKFB5RmxvYXRPYmplY3QgKil0bXApLT5vYl9mdmFsOworCSgoUHlGbG9hdE9iamVjdCAqKW5ld29iaiktPm9iX2Z2YWwgPSAoKFB5RmxvYXRPYmplY3QgKil0bXApLT5vYl9mdmFsOwogCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTExMDYsMTIgKzExMDYsMTIgQEAKIAogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGZsb2F0X2FzX251bWJlciA9IHsKLQkoYmluYXJ5ZnVuYylmbG9hdF9hZGQsIC8qbmJfYWRkKi8KLQkoYmluYXJ5ZnVuYylmbG9hdF9zdWIsIC8qbmJfc3VidHJhY3QqLwotCShiaW5hcnlmdW5jKWZsb2F0X211bCwgLypuYl9tdWx0aXBseSovCi0JKGJpbmFyeWZ1bmMpZmxvYXRfcmVtLCAvKm5iX3JlbWFpbmRlciovCi0JKGJpbmFyeWZ1bmMpZmxvYXRfZGl2bW9kLCAvKm5iX2Rpdm1vZCovCi0JKHRlcm5hcnlmdW5jKWZsb2F0X3BvdywgLypuYl9wb3dlciovCisJZmxvYXRfYWRkLCAJLypuYl9hZGQqLworCWZsb2F0X3N1YiwgCS8qbmJfc3VidHJhY3QqLworCWZsb2F0X211bCwgCS8qbmJfbXVsdGlwbHkqLworCWZsb2F0X3JlbSwgCS8qbmJfcmVtYWluZGVyKi8KKwlmbG9hdF9kaXZtb2QsIAkvKm5iX2Rpdm1vZCovCisJZmxvYXRfcG93LCAJLypuYl9wb3dlciovCiAJKHVuYXJ5ZnVuYylmbG9hdF9uZWcsIC8qbmJfbmVnYXRpdmUqLwogCSh1bmFyeWZ1bmMpZmxvYXRfcG9zLCAvKm5iX3Bvc2l0aXZlKi8KIAkodW5hcnlmdW5jKWZsb2F0X2FicywgLypuYl9hYnNvbHV0ZSovCkBAIC0xMTIyLDEwICsxMTIyLDEwIEBACiAJMCwJCS8qbmJfYW5kKi8KIAkwLAkJLypuYl94b3IqLwogCTAsCQkvKm5iX29yKi8KLQkoY29lcmNpb24pZmxvYXRfY29lcmNlLCAvKm5iX2NvZXJjZSovCi0JKHVuYXJ5ZnVuYylmbG9hdF9pbnQsIC8qbmJfaW50Ki8KLQkodW5hcnlmdW5jKWZsb2F0X2xvbmcsIC8qbmJfbG9uZyovCi0JKHVuYXJ5ZnVuYylmbG9hdF9mbG9hdCwgLypuYl9mbG9hdCovCisJZmxvYXRfY29lcmNlLCAJLypuYl9jb2VyY2UqLworCWZsb2F0X2ludCwgCS8qbmJfaW50Ki8KKwlmbG9hdF9sb25nLCAJLypuYl9sb25nKi8KKwlmbG9hdF9mbG9hdCwJLypuYl9mbG9hdCovCiAJMCwJCS8qIG5iX29jdCAqLwogCTAsCQkvKiBuYl9oZXggKi8KIAkwLAkJLyogbmJfaW5wbGFjZV9hZGQgKi8KQEAgLTExNzAsNyArMTE3MCw3IEBACiAJZmxvYXRfZG9jLAkJCQkvKiB0cF9kb2MgKi8KICAJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCiAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWZsb2F0X3JpY2hjb21wYXJlLAkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwlmbG9hdF9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogCTAsCQkJCQkvKiB0cF9pdGVyICovCiAJMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggNmUzZjI5Ny4uOWFhYmM3YSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMSw0ICsxLDMgQEAKLQogLyogRnJhbWUgb2JqZWN0IGltcGxlbWVudGF0aW9uICovCiAKICNpbmNsdWRlICJQeXRob24uaCIKQEAgLTMzMyw3ICszMzIsNyBAQAogCiAJUHlfWElOQ1JFRih2KTsKIAlmLT5mX3RyYWNlID0gdjsKLQkKKwogCWlmICh2ICE9IE5VTEwpCiAJCWYtPmZfbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShmLT5mX2NvZGUsIGYtPmZfbGFzdGkpOwogCkBAIC0zOTksNyArMzk4LDcgQEAKIAkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQogCQkJUHlfWERFQ1JFRigqcCk7CiAJfQotCQorCiAJUHlfWERFQ1JFRihmLT5mX2JhY2spOwogCVB5X0RFQ1JFRihmLT5mX2NvZGUpOwogCVB5X0RFQ1JFRihmLT5mX2J1aWx0aW5zKTsKQEAgLTQyMywzMCArNDIyLDI4IEBACiBmcmFtZV90cmF2ZXJzZShQeUZyYW1lT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKIAlQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcDsKLQlpbnQgaSwgZXJyLCBzbG90czsKLSNkZWZpbmUgVklTSVQobykgaWYgKG8pIHtpZiAoKGVyciA9IHZpc2l0KChQeU9iamVjdCAqKShvKSwgYXJnKSkpIHJldHVybiBlcnI7fQorCWludCBpLCBzbG90czsKIAotCVZJU0lUKGYtPmZfYmFjayk7Ci0JVklTSVQoZi0+Zl9jb2RlKTsKLQlWSVNJVChmLT5mX2J1aWx0aW5zKTsKLQlWSVNJVChmLT5mX2dsb2JhbHMpOwotCVZJU0lUKGYtPmZfbG9jYWxzKTsKLQlWSVNJVChmLT5mX3RyYWNlKTsKLQlWSVNJVChmLT5mX2V4Y190eXBlKTsKLQlWSVNJVChmLT5mX2V4Y192YWx1ZSk7Ci0JVklTSVQoZi0+Zl9leGNfdHJhY2ViYWNrKTsKKwlQeV9WSVNJVChmLT5mX2JhY2spOworCVB5X1ZJU0lUKGYtPmZfY29kZSk7CisJUHlfVklTSVQoZi0+Zl9idWlsdGlucyk7CisJUHlfVklTSVQoZi0+Zl9nbG9iYWxzKTsKKwlQeV9WSVNJVChmLT5mX2xvY2Fscyk7CisJUHlfVklTSVQoZi0+Zl90cmFjZSk7CisJUHlfVklTSVQoZi0+Zl9leGNfdHlwZSk7CisJUHlfVklTSVQoZi0+Zl9leGNfdmFsdWUpOworCVB5X1ZJU0lUKGYtPmZfZXhjX3RyYWNlYmFjayk7CiAKIAkvKiBsb2NhbHMgKi8KIAlzbG90cyA9IGYtPmZfbmxvY2FscyArIGYtPmZfbmNlbGxzICsgZi0+Zl9uZnJlZXZhcnM7CiAJZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQlmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykgewotCQlWSVNJVCgqZmFzdGxvY2Fscyk7Ci0JfQorCWZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQorCQlQeV9WSVNJVCgqZmFzdGxvY2Fscyk7CiAKIAkvKiBzdGFjayAqLwogCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKIAkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQotCQkJVklTSVQoKnApOworCQkJUHlfVklTSVQoKnApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NCwzNyArNDUxLDMyIEBACiBzdGF0aWMgdm9pZAogZnJhbWVfY2xlYXIoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcDsKKwlQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcCwgKipvbGR0b3A7CiAJaW50IGksIHNsb3RzOwogCi0JUHlfWERFQ1JFRihmLT5mX2V4Y190eXBlKTsKLQlmLT5mX2V4Y190eXBlID0gTlVMTDsKKwkvKiBCZWZvcmUgYW55dGhpbmcgZWxzZSwgbWFrZSBzdXJlIHRoYXQgdGhpcyBmcmFtZSBpcyBjbGVhcmx5IG1hcmtlZAorICAgICAgICAgKiBhcyBiZWluZyBkZWZ1bmN0ISAgRWxzZSwgZS5nLiwgYSBnZW5lcmF0b3IgcmVhY2hhYmxlIGZyb20gdGhpcworICAgICAgICAgKiBmcmFtZSBtYXkgYWxzbyBwb2ludCB0byB0aGlzIGZyYW1lLCBiZWxpZXZlIGl0c2VsZiB0byBzdGlsbCBiZQorICAgICAgICAgKiBhY3RpdmUsIGFuZCB0cnkgY2xlYW5pbmcgdXAgdGhpcyBmcmFtZSBhZ2Fpbi4KKyAgICAgICAgICovCisJb2xkdG9wID0gZi0+Zl9zdGFja3RvcDsKKyAgICAgICAgZi0+Zl9zdGFja3RvcCA9IE5VTEw7CiAKLQlQeV9YREVDUkVGKGYtPmZfZXhjX3ZhbHVlKTsKLQlmLT5mX2V4Y192YWx1ZSA9IE5VTEw7Ci0KLQlQeV9YREVDUkVGKGYtPmZfZXhjX3RyYWNlYmFjayk7Ci0JZi0+Zl9leGNfdHJhY2ViYWNrID0gTlVMTDsKLQotCVB5X1hERUNSRUYoZi0+Zl90cmFjZSk7Ci0JZi0+Zl90cmFjZSA9IE5VTEw7CisJUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7CisJUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOworCVB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7CisJUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CiAKIAkvKiBsb2NhbHMgKi8KIAlzbG90cyA9IGYtPmZfbmxvY2FscyArIGYtPmZfbmNlbGxzICsgZi0+Zl9uZnJlZXZhcnM7CiAJZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQlmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykgewotCQlpZiAoKmZhc3Rsb2NhbHMgIT0gTlVMTCkgewotCQkJUHlfWERFQ1JFRigqZmFzdGxvY2Fscyk7Ci0JCQkqZmFzdGxvY2FscyA9IE5VTEw7Ci0JCX0KLQl9CisJZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCisJCVB5X0NMRUFSKCpmYXN0bG9jYWxzKTsKIAogCS8qIHN0YWNrICovCi0JaWYgKGYtPmZfc3RhY2t0b3AgIT0gTlVMTCkgewotCQlmb3IgKHAgPSBmLT5mX3ZhbHVlc3RhY2s7IHAgPCBmLT5mX3N0YWNrdG9wOyBwKyspIHsKLQkJCVB5X1hERUNSRUYoKnApOwotCQkJKnAgPSBOVUxMOwotCQl9CisJaWYgKG9sZHRvcCAhPSBOVUxMKSB7CisJCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IG9sZHRvcDsgcCsrKQorCQkJUHlfQ0xFQVIoKnApOwogCX0KIH0KIApAQCAtNTM0LDcgKzUyNiw3IEBACiB9CiAKIFB5RnJhbWVPYmplY3QgKgotUHlGcmFtZV9OZXcoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCBQeUNvZGVPYmplY3QgKmNvZGUsIFB5T2JqZWN0ICpnbG9iYWxzLCAKK1B5RnJhbWVfTmV3KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgUHlDb2RlT2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqZ2xvYmFscywKIAkgICAgUHlPYmplY3QgKmxvY2FscykKIHsKIAlQeUZyYW1lT2JqZWN0ICpiYWNrID0gdHN0YXRlLT5mcmFtZTsKQEAgLTU2MywxMCArNTU1LDEwIEBACiAJCQkJYnVpbHRpbnMgPSBOVUxMOwogCQl9CiAJCWlmIChidWlsdGlucyA9PSBOVUxMKSB7Ci0JCQkvKiBObyBidWlsdGlucyEgIE1ha2UgdXAgYSBtaW5pbWFsIG9uZSAKKwkJCS8qIE5vIGJ1aWx0aW5zISAgTWFrZSB1cCBhIG1pbmltYWwgb25lCiAJCQkgICBHaXZlIHRoZW0gJ05vbmUnLCBhdCBsZWFzdC4gKi8KIAkJCWJ1aWx0aW5zID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGJ1aWx0aW5zID09IE5VTEwgfHwgCisJCQlpZiAoYnVpbHRpbnMgPT0gTlVMTCB8fAogCQkJICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKAogCQkJCSAgICBidWlsdGlucywgIk5vbmUiLCBQeV9Ob25lKSA8IDApCiAJCQkJcmV0dXJuIE5VTEw7CkBAIC02MTEsNyArNjAzLDcgQEAKIAlQeV9JTkNSRUYoZ2xvYmFscyk7CiAJZi0+Zl9nbG9iYWxzID0gZ2xvYmFsczsKIAkvKiBNb3N0IGZ1bmN0aW9ucyBoYXZlIENPX05FV0xPQ0FMUyBhbmQgQ09fT1BUSU1JWkVEIHNldC4gKi8KLQlpZiAoKGNvZGUtPmNvX2ZsYWdzICYgKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpID09IAorCWlmICgoY29kZS0+Y29fZmxhZ3MgJiAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkgPT0KIAkJKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpCiAJCWxvY2FscyA9IE5VTEw7IC8qIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgd2lsbCBzZXQuICovCiAJZWxzZSBpZiAoY29kZS0+Y29fZmxhZ3MgJiBDT19ORVdMT0NBTFMpIHsKQEAgLTc0OSw3ICs3NDEsNyBAQAogCQlyZXR1cm47CiAJUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CiAJZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKLQlqID0gUHlUdXBsZV9TaXplKG1hcCk7CisJaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKIAlpZiAoaiA+IGYtPmZfbmxvY2FscykKIAkJaiA9IGYtPmZfbmxvY2FsczsKIAlpZiAoZi0+Zl9ubG9jYWxzKQpAQCAtNzU5LDEwICs3NTEsMTAgQEAKIAkJICAgICAgJiYgUHlUdXBsZV9DaGVjayhmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKSkpIHsKIAkJCXJldHVybjsKIAkJfQotCQltYXBfdG9fZGljdChmLT5mX2NvZGUtPmNvX2NlbGx2YXJzLCAKKwkJbWFwX3RvX2RpY3QoZi0+Zl9jb2RlLT5jb19jZWxsdmFycywKIAkJCSAgICBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpLAogCQkJICAgIGxvY2FscywgZmFzdCArIGYtPmZfbmxvY2FscywgMSk7Ci0JCW1hcF90b19kaWN0KGYtPmZfY29kZS0+Y29fZnJlZXZhcnMsIAorCQltYXBfdG9fZGljdChmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzLAogCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyksCiAJCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzICsgZi0+Zl9uY2VsbHMsIDEpOwogCX0KQEAgLTc4Nyw3ICs3NzksNyBAQAogCQlyZXR1cm47CiAJUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CiAJZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKLQlqID0gUHlUdXBsZV9TaXplKG1hcCk7CisJaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKIAlpZiAoaiA+IGYtPmZfbmxvY2FscykKIAkJaiA9IGYtPmZfbmxvY2FsczsKIAlpZiAoZi0+Zl9ubG9jYWxzKQpAQCAtNzk2LDEyICs3ODgsMTIgQEAKIAkJaWYgKCEoUHlUdXBsZV9DaGVjayhmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKQogCQkgICAgICAmJiBQeVR1cGxlX0NoZWNrKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpKSkKIAkJCXJldHVybjsKLQkJZGljdF90b19tYXAoZi0+Zl9jb2RlLT5jb19jZWxsdmFycywgCisJCWRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMsCiAJCQkgICAgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSwKIAkJCSAgICBsb2NhbHMsIGZhc3QgKyBmLT5mX25sb2NhbHMsIDEsIGNsZWFyKTsKLQkJZGljdF90b19tYXAoZi0+Zl9jb2RlLT5jb19mcmVldmFycywgCisJCWRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMsCiAJCQkgICAgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKSwKLQkJCSAgICBsb2NhbHMsIGZhc3QgKyBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscywgMSwgCisJCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzICsgZi0+Zl9uY2VsbHMsIDEsCiAJCQkgICAgY2xlYXIpOwogCX0KIAlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwppbmRleCAwMGFlMmViLi41OWNiNTE5IDEwMDY0NAotLS0gYS9PYmplY3RzL2Z1bmNvYmplY3QuYworKysgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwpAQCAtNDY2LDQ3ICs0NjYsMTQgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfdHJhdmVyc2UoUHlGdW5jdGlvbk9iamVjdCAqZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLQlpZiAoZi0+ZnVuY19jb2RlKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfY29kZSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX2dsb2JhbHMpIHsKLQkJZXJyID0gdmlzaXQoZi0+ZnVuY19nbG9iYWxzLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGYtPmZ1bmNfbW9kdWxlKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfbW9kdWxlLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGYtPmZ1bmNfZGVmYXVsdHMpIHsKLQkJZXJyID0gdmlzaXQoZi0+ZnVuY19kZWZhdWx0cywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX2RvYykgewotCQllcnIgPSB2aXNpdChmLT5mdW5jX2RvYywgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCWlmIChmLT5mdW5jX25hbWUpIHsKLQkJZXJyID0gdmlzaXQoZi0+ZnVuY19uYW1lLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKGYtPmZ1bmNfZGljdCkgewotCQllcnIgPSB2aXNpdChmLT5mdW5jX2RpY3QsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAoZi0+ZnVuY19jbG9zdXJlKSB7Ci0JCWVyciA9IHZpc2l0KGYtPmZ1bmNfY2xvc3VyZSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQorCVB5X1ZJU0lUKGYtPmZ1bmNfY29kZSk7CisJUHlfVklTSVQoZi0+ZnVuY19nbG9iYWxzKTsKKwlQeV9WSVNJVChmLT5mdW5jX21vZHVsZSk7CisJUHlfVklTSVQoZi0+ZnVuY19kZWZhdWx0cyk7CisJUHlfVklTSVQoZi0+ZnVuY19kb2MpOworCVB5X1ZJU0lUKGYtPmZ1bmNfbmFtZSk7CisJUHlfVklTSVQoZi0+ZnVuY19kaWN0KTsKKwlQeV9WSVNJVChmLT5mdW5jX2Nsb3N1cmUpOwogCXJldHVybiAwOwogfQogCkBAIC02NDcsMTcgKzYxNCwxNCBAQAogc3RhdGljIGludAogY21fdHJhdmVyc2UoY2xhc3NtZXRob2QgKmNtLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoIWNtLT5jbV9jYWxsYWJsZSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KGNtLT5jbV9jYWxsYWJsZSwgYXJnKTsKKwlQeV9WSVNJVChjbS0+Y21fY2FsbGFibGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBjbV9jbGVhcihjbGFzc21ldGhvZCAqY20pCiB7Ci0JUHlfWERFQ1JFRihjbS0+Y21fY2FsbGFibGUpOwotCWNtLT5jbV9jYWxsYWJsZSA9IE5VTEw7Ci0KKwlQeV9DTEVBUihjbS0+Y21fY2FsbGFibGUpOwogCXJldHVybiAwOwogfQogCkBAIC04MDgsOSArNzcyLDggQEAKIHN0YXRpYyBpbnQKIHNtX3RyYXZlcnNlKHN0YXRpY21ldGhvZCAqc20sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmICghc20tPnNtX2NhbGxhYmxlKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdmlzaXQoc20tPnNtX2NhbGxhYmxlLCBhcmcpOworCVB5X1ZJU0lUKHNtLT5zbV9jYWxsYWJsZSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL09iamVjdHMvZ2Vub2JqZWN0LmMgYi9PYmplY3RzL2dlbm9iamVjdC5jCmluZGV4IDNmNmVmODUuLjE1ZTUzZGQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZ2Vub2JqZWN0LmMKKysrIGIvT2JqZWN0cy9nZW5vYmplY3QuYwpAQCAtNSwxMSArNSwxMyBAQAogI2luY2x1ZGUgImdlbm9iamVjdC5oIgogI2luY2x1ZGUgImNldmFsLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCisjaW5jbHVkZSAib3Bjb2RlLmgiCiAKIHN0YXRpYyBpbnQKIGdlbl90cmF2ZXJzZShQeUdlbk9iamVjdCAqZ2VuLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlyZXR1cm4gdmlzaXQoKFB5T2JqZWN0ICopZ2VuLT5naV9mcmFtZSwgYXJnKTsKKwlQeV9WSVNJVCgoUHlPYmplY3QgKilnZW4tPmdpX2ZyYW1lKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTIwLDEyICsyMiwxMSBAQAogCV9QeU9iamVjdF9HQ19VTlRSQUNLKGdlbik7CiAKIAlpZiAoZ2VuLT5naV93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBnZW4pOwotCisJCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CiAKIAlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7CiAKLQlpZiAoZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCE9TlVMTCkgeworCWlmIChnZW4tPmdpX2ZyYW1lICE9IE5VTEwgJiYgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CiAJCS8qIEdlbmVyYXRvciBpcyBwYXVzZWQsIHNvIHdlIG5lZWQgdG8gY2xvc2UgKi8KIAkJZ2VuLT5vYl90eXBlLT50cF9kZWwoc2VsZik7CiAJCWlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQpAQCAtMzMsNyArMzQsNyBAQAogCX0KIAogCV9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOwotCVB5X1hERUNSRUYoZ2VuLT5naV9mcmFtZSk7CisJUHlfQ0xFQVIoZ2VuLT5naV9mcmFtZSk7CiAJUHlPYmplY3RfR0NfRGVsKGdlbik7CiB9CiAKQEAgLTUwLDE2ICs1MSwxOCBAQAogCQkJCSJnZW5lcmF0b3IgYWxyZWFkeSBleGVjdXRpbmciKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmICgoUHlPYmplY3QgKilmID09IFB5X05vbmUgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7CisJaWYgKGY9PU5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7CiAJCS8qIE9ubHkgc2V0IGV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBzZW5kKCkgKi8KLQkJaWYgKGFyZyAmJiAhZXhjKSBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworCQlpZiAoYXJnICYmICFleGMpCisJCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlpZiAoZi0+Zl9sYXN0aSA9PSAtMSkgewogCQlpZiAoYXJnICYmIGFyZyAhPSBQeV9Ob25lKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBzZW5kIG5vbi1Ob25lIHZhbHVlIHRvIGEganVzdC1zdGFydGVkIGdlbmVyYXRvciIpOworCQkJCQkiY2FuJ3Qgc2VuZCBub24tTm9uZSB2YWx1ZSB0byBhICIKKwkJCQkJImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfSBlbHNlIHsKQEAgLTkxLDIxICs5NCwyMiBAQAogCQlQeV9ERUNSRUYocmVzdWx0KTsKIAkJcmVzdWx0ID0gTlVMTDsKIAkJLyogU2V0IGV4Y2VwdGlvbiBpZiBub3QgY2FsbGVkIGJ5IGdlbl9pdGVybmV4dCgpICovCi0JCWlmIChhcmcpIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisJCWlmIChhcmcpCisJCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwogCX0KIAogCWlmICghcmVzdWx0IHx8IGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgewogCQkvKiBnZW5lcmF0b3IgY2FuJ3QgYmUgcmVydW4sIHNvIHJlbGVhc2UgdGhlIGZyYW1lICovCiAJCVB5X0RFQ1JFRihmKTsKLQkJZ2VuLT5naV9mcmFtZSA9IChQeUZyYW1lT2JqZWN0ICopUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOworCQlnZW4tPmdpX2ZyYW1lID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc2VuZF9kb2MsCi0ic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsIHJldHVybiBuZXh0IHlpZWxkZWQgdmFsdWUgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi4iKTsKKyJzZW5kKGFyZykgLT4gc2VuZCAnYXJnJyBpbnRvIGdlbmVyYXRvcixcblwKK3JldHVybiBuZXh0IHlpZWxkZWQgdmFsdWUgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9zZW5kKFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmcpCkBAIC0xMjUsMTEgKzEyOSwxMSBAQAogCWlmIChyZXR2YWwpIHsKIAkJUHlfREVDUkVGKHJldHZhbCk7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkiZ2VuZXJhdG9yIGlnbm9yZWQgR2VuZXJhdG9yRXhpdCIpOworCQkJCSJnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Iik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikgCi0JICAgICB8fCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0dlbmVyYXRvckV4aXQpICkgCisJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikKKwkgICAgfHwgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19HZW5lcmF0b3JFeGl0KSkKIAl7CiAJCVB5RXJyX0NsZWFyKCk7CS8qIGlnbm9yZSB0aGVzZSBlcnJvcnMgKi8KIAkJUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtMTQ1LDcgKzE0OSw3IEBACiAgICAgICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CiAJUHlHZW5PYmplY3QgKmdlbiA9IChQeUdlbk9iamVjdCAqKXNlbGY7CiAKLQlpZiAoKFB5T2JqZWN0ICopZ2VuLT5naV9mcmFtZSA9PSBQeV9Ob25lIHx8IGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3A9PU5VTEwpCisJaWYgKGdlbi0+Z2lfZnJhbWUgPT0gTlVMTCB8fCBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wID09IE5VTEwpCiAJCS8qIEdlbmVyYXRvciBpc24ndCBwYXVzZWQsIHNvIG5vIG5lZWQgdG8gY2xvc2UgKi8KIAkJcmV0dXJuOwogCkBAIC0xNTYsMTAgKzE2MCwxMCBAQAogICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLwogICAgICAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKIAotCXJlcyA9IGdlbl9jbG9zZSgoUHlHZW5PYmplY3QgKilzZWxmLCBOVUxMKTsKKwlyZXMgPSBnZW5fY2xvc2UoZ2VuLCBOVUxMKTsKIAogCWlmIChyZXMgPT0gTlVMTCkKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKXNlbGYpOworCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoc2VsZik7CiAJZWxzZQogCQlQeV9ERUNSRUYocmVzKTsKIApAQCAtMTgxLDcgKzE4NSw3IEBACiAgICAgICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKICAgICAgICAgICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KCFQeVR5cGVfSVNfR0Moc2VsZi0+b2JfdHlwZSkgfHwKKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9JU19HQyhzZWxmLT5vYl90eXBlKSAmJgogICAgICAgICAgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKIAogICAgICAgICAvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KQEAgLTIwMiwxMCArMjA2LDExIEBACiAKIAogUHlEb2NfU1RSVkFSKHRocm93X2RvYywKLSJ0aHJvdyh0eXBbLHZhbFssdGJdXSkgLT4gcmFpc2UgZXhjZXB0aW9uIGluIGdlbmVyYXRvciwgcmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLiIpOworInRocm93KHR5cFssdmFsWyx0Yl1dKSAtPiByYWlzZSBleGNlcHRpb24gaW4gZ2VuZXJhdG9yLFxuXAorcmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotZ2VuX3Rocm93KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmdzKSAKK2dlbl90aHJvdyhQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykKIHsKIAlQeU9iamVjdCAqdHlwOwogCVB5T2JqZWN0ICp0YiA9IE5VTEw7CkBAIC0yMTYsMTAgKzIyMSw4IEBACiAKIAkvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAogCSAgIE5VTEwuICovCi0JaWYgKHRiID09IFB5X05vbmUpIHsKLQkJUHlfREVDUkVGKHRiKTsKKwlpZiAodGIgPT0gUHlfTm9uZSkKIAkJdGIgPSBOVUxMOwotCX0KIAllbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCSJ0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0Iik7CkBAIC0yNDksNyArMjUyLDEwIEBACiAJCQlQeV9JTkNSRUYodHlwKTsKIAkJfQogCX0KLQllbHNlIHsKKworCS8qIEFsbG93IHJhaXNpbmcgYnVpbHRpbiBzdHJpbmcgZXhjZXB0aW9ucyAqLworCisJZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3QodHlwKSkgewogCQkvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICB0aHJvdygpIGZhaWxzLiAqLwogCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkJICAgICAiZXhjZXB0aW9ucyBtdXN0IGJlIGNsYXNzZXMsIG9yIGluc3RhbmNlcywgbm90ICVzIiwKQEAgLTI1Nyw3ICsyNjMsNyBAQAogCQkJZ290byBmYWlsZWRfdGhyb3c7CiAJfQogCi0JUHlFcnJfUmVzdG9yZSh0eXAsdmFsLHRiKTsKKwlQeUVycl9SZXN0b3JlKHR5cCwgdmFsLCB0Yik7CiAJcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgUHlfTm9uZSwgMSk7CiAKIGZhaWxlZF90aHJvdzoKQEAgLTMyNCw3ICszMzAsNyBAQAogCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KIAkwLAkJCQkJLyogdHBfYmFzZSAqLwogCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0gICAgICAgIAorCiAJMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwogCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KIAkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwpAQCAtMzU1LDMgKzM2MSwyMyBAQAogCV9QeU9iamVjdF9HQ19UUkFDSyhnZW4pOwogCXJldHVybiAoUHlPYmplY3QgKilnZW47CiB9CisKK2ludAorUHlHZW5fTmVlZHNGaW5hbGl6aW5nKFB5R2VuT2JqZWN0ICpnZW4pCit7CisJaW50IGk7CisJUHlGcmFtZU9iamVjdCAqZiA9IGdlbi0+Z2lfZnJhbWU7CisKKwlpZiAoZiA9PSBOVUxMIHx8IGYtPmZfc3RhY2t0b3AgPT0gTlVMTCB8fCBmLT5mX2libG9jayA8PSAwKQorCQlyZXR1cm4gMDsgLyogbm8gZnJhbWUgb3IgZW1wdHkgYmxvY2tzdGFjayA9PSBubyBmaW5hbGl6YXRpb24gKi8KKworCS8qIEFueSBibG9jayB0eXBlIGJlc2lkZXMgYSBsb29wIHJlcXVpcmVzIGNsZWFudXAuICovCisJaSA9IGYtPmZfaWJsb2NrOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoZi0+Zl9ibG9ja3N0YWNrW2ldLmJfdHlwZSAhPSBTRVRVUF9MT09QKQorCQkJcmV0dXJuIDE7CisJfQorCisJLyogTm8gYmxvY2tzIGV4Y2VwdCBsb29wcywgaXQncyBzYWZlIHRvIHNraXAgZmluYWxpemF0aW9uLiAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pbnRvYmplY3QuYyBiL09iamVjdHMvaW50b2JqZWN0LmMKaW5kZXggYzczNDg0MC4uZmIzMjIxZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9pbnRvYmplY3QuYworKysgYi9PYmplY3RzL2ludG9iamVjdC5jCkBAIC0yNTUsMTggKzI1NSwxOCBAQAogCWlmIChvcCA9PSBOVUxMIHx8IChuYiA9IG9wLT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKIAkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwogCX0KIAogCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwogCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIAlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewogCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewogCQkJdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygoUHlPYmplY3QgKilpbyk7CiAJCQlQeV9ERUNSRUYoaW8pOwogCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIAkJCXJldHVybiB2YWw7CiAJCX0KIAkJZWxzZQpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCQlQeV9ERUNSRUYoaW8pOwogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkJIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKIAkJfQogCX0KIApAQCAtMzAwLDE4ICszMDAsMTggQEAKIAlpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBvcC0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CiAJICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwogCX0KIAogCWlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOwogCWlmIChpbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwogCWlmICghUHlJbnRfQ2hlY2soaW8pKSB7CiAJCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7CiAJCQl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaygoUHlPYmplY3QgKilpbyk7CiAJCQlQeV9ERUNSRUYoaW8pOwogCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwogCQkJcmV0dXJuIHZhbDsKIAkJfQogCQllbHNlCkBAIC0zMTksNyArMzE5LDcgQEAKIAkJCVB5X0RFQ1JFRihpbyk7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCQkibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7CiAJCX0KIAl9CiAKQEAgLTMzNSw3ICszMzUsOCBAQAogewogCWNoYXIgKmVuZDsKIAlsb25nIHg7Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLworCVB5X3NzaXplX3Qgc2xlbjsKKwlQeU9iamVjdCAqc29iaiwgKnNyZXByOwogCiAJaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTM1OSw5ICszNjAsMTggQEAKIAkJZW5kKys7CiAJaWYgKCplbmQgIT0gJ1wwJykgewogICBiYWQ6Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpOiAlLjIwMHMiLCBzKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisJCXNsZW4gPSBzdHJsZW4ocykgPCAyMDAgPyBzdHJsZW4ocykgOiAyMDA7CisJCXNvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBzbGVuKTsKKwkJaWYgKHNvYmogPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlzcmVwciA9IFB5T2JqZWN0X1JlcHIoc29iaik7CisJCVB5X0RFQ1JFRihzb2JqKTsKKwkJaWYgKHNyZXByID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAlZDogJXMiLAorCQkJICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKKwkJUHlfREVDUkVGKHNyZXByKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWVsc2UgaWYgKGVycm5vICE9IDApCkBAIC0zNzYsNyArMzg2LDcgQEAKIFB5SW50X0Zyb21Vbmljb2RlKFB5X1VOSUNPREUgKnMsIFB5X3NzaXplX3QgbGVuZ3RoLCBpbnQgYmFzZSkKIHsKIAlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgKmJ1ZmZlciA9IFB5TWVtX01BTExPQyhsZW5ndGgrMSk7CisJY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOwogCiAJaWYgKGJ1ZmZlciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTk2MSw3ICs5NzEsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3OworCVB5T2JqZWN0ICp0bXAsICpuZXdvYmo7CiAJbG9uZyBpdmFsOwogCiAJYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5SW50X1R5cGUpKTsKQEAgLTk3OCwxNCArOTg4LDE0IEBACiAJCWl2YWwgPSAoKFB5SW50T2JqZWN0ICopdG1wKS0+b2JfaXZhbDsKIAl9CiAKLQluZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobmV3ID09IE5VTEwpIHsKKwluZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKwlpZiAobmV3b2JqID09IE5VTEwpIHsKIAkJUHlfREVDUkVGKHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQkoKFB5SW50T2JqZWN0ICopbmV3KS0+b2JfaXZhbCA9IGl2YWw7CisJKChQeUludE9iamVjdCAqKW5ld29iaiktPm9iX2l2YWwgPSBpdmFsOwogCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEwNDYsNyArMTA1Niw3IEBACiAJaW50X3RydWVfZGl2aWRlLAkvKiBuYl90cnVlX2RpdmlkZSAqLwogCTAsCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KIAkwLAkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KLQkobGVuZnVuYylQeUludF9Bc1NzaXplX3QsIC8qIG5iX2luZGV4ICovCisJUHlJbnRfQXNTc2l6ZV90LAkvKiBuYl9pbmRleCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5SW50X1R5cGUgPSB7CkBAIC0xMTE5LDYgKzExMjksNyBAQAogCVB5SW50T2JqZWN0ICpwOwogCVB5SW50QmxvY2sgKmxpc3QsICpuZXh0OwogCWludCBpOworCXVuc2lnbmVkIGludCBjdHI7CiAJaW50IGJjLCBiZjsJLyogYmxvY2sgY291bnQsIG51bWJlciBvZiBmcmVlZCBibG9ja3MgKi8KIAlpbnQgaXJlbSwgaXN1bTsJLyogcmVtYWluaW5nIHVuZnJlZWQgaW50cyBwZXIgYmxvY2ssIHRvdGFsICovCiAKQEAgLTExNDEsOSArMTE1Miw5IEBACiAJd2hpbGUgKGxpc3QgIT0gTlVMTCkgewogCQliYysrOwogCQlpcmVtID0gMDsKLQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCSAgICAgaSsrLCBwKyspIHsKKwkJZm9yIChjdHIgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisJCSAgICAgY3RyIDwgTl9JTlRPQkpFQ1RTOworCQkgICAgIGN0cisrLCBwKyspIHsKIAkJCWlmIChQeUludF9DaGVja0V4YWN0KHApICYmIHAtPm9iX3JlZmNudCAhPSAwKQogCQkJCWlyZW0rKzsKIAkJfQpAQCAtMTE1MSw5ICsxMTYyLDkgQEAKIAkJaWYgKGlyZW0pIHsKIAkJCWxpc3QtPm5leHQgPSBibG9ja19saXN0OwogCQkJYmxvY2tfbGlzdCA9IGxpc3Q7Ci0JCQlmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07Ci0JCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7CisJCQlmb3IgKGN0ciA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKwkJCSAgICAgY3RyIDwgTl9JTlRPQkpFQ1RTOworCQkJICAgICBjdHIrKywgcCsrKSB7CiAJCQkJaWYgKCFQeUludF9DaGVja0V4YWN0KHApIHx8CiAJCQkJICAgIHAtPm9iX3JlZmNudCA9PSAwKSB7CiAJCQkJCXAtPm9iX3R5cGUgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCkBAIC0xMTk0LDkgKzEyMDUsOSBAQAogCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKIAkJbGlzdCA9IGJsb2NrX2xpc3Q7CiAJCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fSU5UT0JKRUNUUzsKLQkJCSAgICAgaSsrLCBwKyspIHsKKwkJCWZvciAoY3RyID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworCQkJICAgICBjdHIgPCBOX0lOVE9CSkVDVFM7CisJCQkgICAgIGN0cisrLCBwKyspIHsKIAkJCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKIAkJCQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCiAJCQkJCSAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5CmRpZmYgLS1naXQgYS9PYmplY3RzL2l0ZXJvYmplY3QuYyBiL09iamVjdHMvaXRlcm9iamVjdC5jCmluZGV4IDUxZjU1MWIuLmNmODM5ZjQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvaXRlcm9iamVjdC5jCisrKyBiL09iamVjdHMvaXRlcm9iamVjdC5jCkBAIC0zOCw5ICszOCw4IEBACiBzdGF0aWMgaW50CiBpdGVyX3RyYXZlcnNlKHNlcWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoaXQtPml0X3NlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdmlzaXQoaXQtPml0X3NlcSwgYXJnKTsKKwlQeV9WSVNJVChpdC0+aXRfc2VxKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEyMyw3ICsxMjIsNyBAQAogCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwogCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWl0ZXJfaXRlcm5leHQsCQkvKiB0cF9pdGVybmV4dCAqLworCWl0ZXJfaXRlcm5leHQsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCiAJc2VxaXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KIAkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwogfTsKQEAgLTE2MiwxMSArMTYxLDggQEAKIHN0YXRpYyBpbnQKIGNhbGxpdGVyX3RyYXZlcnNlKGNhbGxpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLQlpZiAoaXQtPml0X2NhbGxhYmxlICE9IE5VTEwgJiYgKGVyciA9IHZpc2l0KGl0LT5pdF9jYWxsYWJsZSwgYXJnKSkpCi0JCXJldHVybiBlcnI7Ci0JaWYgKGl0LT5pdF9zZW50aW5lbCAhPSBOVUxMICYmIChlcnIgPSB2aXNpdChpdC0+aXRfc2VudGluZWwsIGFyZykpKQotCQlyZXR1cm4gZXJyOworCVB5X1ZJU0lUKGl0LT5pdF9jYWxsYWJsZSk7CisJUHlfVklTSVQoaXQtPml0X3NlbnRpbmVsKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0b2JqZWN0LmMgYi9PYmplY3RzL2xpc3RvYmplY3QuYwppbmRleCA5NjZkNjU5Li4xMDVkZjRjIDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3RvYmplY3QuYworKysgYi9PYmplY3RzL2xpc3RvYmplY3QuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChuID09IElOVF9NQVgpIHsKKwlpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKIAkJCSJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7CiAJCXJldHVybiAtMTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCVB5X3NzaXplX3QgbiA9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKIAogCWFzc2VydCAodiAhPSBOVUxMKTsKLQlpZiAobiA9PSBJTlRfTUFYKSB7CisJaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOwogCQlyZXR1cm4gLTE7CkBAIC0xODA1LDI4ICsxODA1LDExIEBACiAJUHlPYmplY3QgKnZhbHVlOwogfSBzb3J0d3JhcHBlcm9iamVjdDsKIAotc3RhdGljIFB5VHlwZU9iamVjdCBzb3J0d3JhcHBlcl90eXBlOwotCi1zdGF0aWMgUHlPYmplY3QgKgotc29ydHdyYXBwZXJfcmljaGNvbXBhcmUoc29ydHdyYXBwZXJvYmplY3QgKmEsIHNvcnR3cmFwcGVyb2JqZWN0ICpiLCBpbnQgb3ApCi17Ci0JaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soYiwgJnNvcnR3cmFwcGVyX3R5cGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZXhwZWN0ZWQgYSBzb3J0d3JhcHBlcm9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKGEtPmtleSwgYi0+a2V5LCBvcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zb3J0d3JhcHBlcl9kZWFsbG9jKHNvcnR3cmFwcGVyb2JqZWN0ICpzbykKLXsKLQlQeV9YREVDUkVGKHNvLT5rZXkpOwotCVB5X1hERUNSRUYoc28tPnZhbHVlKTsKLQlQeU9iamVjdF9EZWwoc28pOwotfQotCiBQeURvY19TVFJWQVIoc29ydHdyYXBwZXJfZG9jLCAiT2JqZWN0IHdyYXBwZXIgd2l0aCBhIGN1c3RvbSBzb3J0IGtleS4iKTsKK3N0YXRpYyBQeU9iamVjdCAqCitzb3J0d3JhcHBlcl9yaWNoY29tcGFyZShzb3J0d3JhcHBlcm9iamVjdCAqLCBzb3J0d3JhcHBlcm9iamVjdCAqLCBpbnQpOworc3RhdGljIHZvaWQKK3NvcnR3cmFwcGVyX2RlYWxsb2Moc29ydHdyYXBwZXJvYmplY3QgKik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc29ydHdyYXBwZXJfdHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQpAQCAtMTg1OCw2ICsxODQxLDI2IEBACiAJKHJpY2hjbXBmdW5jKXNvcnR3cmFwcGVyX3JpY2hjb21wYXJlLAkvKiB0cF9yaWNoY29tcGFyZSAqLwogfTsKIAorCitzdGF0aWMgUHlPYmplY3QgKgorc29ydHdyYXBwZXJfcmljaGNvbXBhcmUoc29ydHdyYXBwZXJvYmplY3QgKmEsIHNvcnR3cmFwcGVyb2JqZWN0ICpiLCBpbnQgb3ApCit7CisJaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soYiwgJnNvcnR3cmFwcGVyX3R5cGUpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisJCQkiZXhwZWN0ZWQgYSBzb3J0d3JhcHBlcm9iamVjdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKGEtPmtleSwgYi0+a2V5LCBvcCk7Cit9CisKK3N0YXRpYyB2b2lkCitzb3J0d3JhcHBlcl9kZWFsbG9jKHNvcnR3cmFwcGVyb2JqZWN0ICpzbykKK3sKKwlQeV9YREVDUkVGKHNvLT5rZXkpOworCVB5X1hERUNSRUYoc28tPnZhbHVlKTsKKwlQeU9iamVjdF9EZWwoc28pOworfQorCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIHNvcnR3cmFwcGVyLgogICAgQ29uc3VtZXMgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIHR3byB1bmRlcmx5aW5nIG9iamVjdHMuICovCiAKQEAgLTIyNzEsMTYgKzIyNzQsOSBAQAogbGlzdF90cmF2ZXJzZShQeUxpc3RPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqeDsKIAotCWZvciAoaSA9IG8tPm9iX3NpemU7IC0taSA+PSAwOyApIHsKLQkJeCA9IG8tPm9iX2l0ZW1baV07Ci0JCWlmICh4ICE9IE5VTEwpIHsKLQkJCWludCBlcnIgPSB2aXNpdCh4LCBhcmcpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQorCWZvciAoaSA9IG8tPm9iX3NpemU7IC0taSA+PSAwOyApCisJCVB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOwogCXJldHVybiAwOwogfQogCkBAIC0yNjk4LDc4ICsyNjk0LDExIEBACiAJUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGxpc3RpdGVyb2JqZWN0OwogCi1QeVR5cGVPYmplY3QgUHlMaXN0SXRlcl9UeXBlOwotCi1zdGF0aWMgUHlPYmplY3QgKgotbGlzdF9pdGVyKFB5T2JqZWN0ICpzZXEpCi17Ci0JbGlzdGl0ZXJvYmplY3QgKml0OwotCi0JaWYgKCFQeUxpc3RfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RpdGVyb2JqZWN0LCAmUHlMaXN0SXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gKFB5TGlzdE9iamVjdCAqKXNlcTsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3RpdGVyX2RlYWxsb2MobGlzdGl0ZXJvYmplY3QgKml0KQotewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxpc3RpdGVyX3RyYXZlcnNlKGxpc3RpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCi17Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKWl0LT5pdF9zZXEsIGFyZyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1saXN0aXRlcl9uZXh0KGxpc3RpdGVyb2JqZWN0ICppdCkKLXsKLQlQeUxpc3RPYmplY3QgKnNlcTsKLQlQeU9iamVjdCAqaXRlbTsKLQotCWFzc2VydChpdCAhPSBOVUxMKTsKLQlzZXEgPSBpdC0+aXRfc2VxOwotCWlmIChzZXEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKLQotCWlmIChpdC0+aXRfaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgewotCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKLQkJKytpdC0+aXRfaW5kZXg7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JUHlfREVDUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1saXN0aXRlcl9sZW4obGlzdGl0ZXJvYmplY3QgKml0KQotewotCVB5X3NzaXplX3QgbGVuOwotCWlmIChpdC0+aXRfc2VxKSB7Ci0JCWxlbiA9IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKLQkJaWYgKGxlbiA+PSAwKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKLX0KK3N0YXRpYyBQeU9iamVjdCAqbGlzdF9pdGVyKFB5T2JqZWN0ICopOworc3RhdGljIHZvaWQgbGlzdGl0ZXJfZGVhbGxvYyhsaXN0aXRlcm9iamVjdCAqKTsKK3N0YXRpYyBpbnQgbGlzdGl0ZXJfdHJhdmVyc2UobGlzdGl0ZXJvYmplY3QgKiwgdmlzaXRwcm9jLCB2b2lkICopOworc3RhdGljIFB5T2JqZWN0ICpsaXN0aXRlcl9uZXh0KGxpc3RpdGVyb2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICpsaXN0aXRlcl9sZW4obGlzdGl0ZXJvYmplY3QgKik7CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIApAQCAtMjgxMiw2ICsyNzQxLDc2IEBACiAJMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KIH07CiAKKworc3RhdGljIFB5T2JqZWN0ICoKK2xpc3RfaXRlcihQeU9iamVjdCAqc2VxKQoreworCWxpc3RpdGVyb2JqZWN0ICppdDsKKworCWlmICghUHlMaXN0X0NoZWNrKHNlcSkpIHsKKwkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0aXRlcm9iamVjdCwgJlB5TGlzdEl0ZXJfVHlwZSk7CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWl0LT5pdF9pbmRleCA9IDA7CisJUHlfSU5DUkVGKHNlcSk7CisJaXQtPml0X3NlcSA9IChQeUxpc3RPYmplY3QgKilzZXE7CisJX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKwlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Cit9CisKK3N0YXRpYyB2b2lkCitsaXN0aXRlcl9kZWFsbG9jKGxpc3RpdGVyb2JqZWN0ICppdCkKK3sKKwlfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisJUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKwlQeU9iamVjdF9HQ19EZWwoaXQpOworfQorCitzdGF0aWMgaW50CitsaXN0aXRlcl90cmF2ZXJzZShsaXN0aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbGlzdGl0ZXJfbmV4dChsaXN0aXRlcm9iamVjdCAqaXQpCit7CisJUHlMaXN0T2JqZWN0ICpzZXE7CisJUHlPYmplY3QgKml0ZW07CisKKwlhc3NlcnQoaXQgIT0gTlVMTCk7CisJc2VxID0gaXQtPml0X3NlcTsKKwlpZiAoc2VxID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWFzc2VydChQeUxpc3RfQ2hlY2soc2VxKSk7CisKKwlpZiAoaXQtPml0X2luZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKKwkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGl0LT5pdF9pbmRleCk7CisJCSsraXQtPml0X2luZGV4OworCQlQeV9JTkNSRUYoaXRlbSk7CisJCXJldHVybiBpdGVtOworCX0KKworCVB5X0RFQ1JFRihzZXEpOworCWl0LT5pdF9zZXEgPSBOVUxMOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbGlzdGl0ZXJfbGVuKGxpc3RpdGVyb2JqZWN0ICppdCkKK3sKKwlQeV9zc2l6ZV90IGxlbjsKKwlpZiAoaXQtPml0X3NlcSkgeworCQlsZW4gPSBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgLSBpdC0+aXRfaW5kZXg7CisJCWlmIChsZW4gPj0gMCkKKwkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOworCX0KKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7Cit9CiAvKioqKioqKioqKioqKioqKioqKioqKiogTGlzdCBSZXZlcnNlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0yODIwLDY5ICsyODE5LDExIEBACiAJUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGxpc3RyZXZpdGVyb2JqZWN0OwogCi1QeVR5cGVPYmplY3QgUHlMaXN0UmV2SXRlcl9UeXBlOwotCi1zdGF0aWMgUHlPYmplY3QgKgotbGlzdF9yZXZlcnNlZChQeUxpc3RPYmplY3QgKnNlcSwgUHlPYmplY3QgKnVudXNlZCkKLXsKLQlsaXN0cmV2aXRlcm9iamVjdCAqaXQ7Ci0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhsaXN0cmV2aXRlcm9iamVjdCwgJlB5TGlzdFJldkl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc2VxKSk7Ci0JaXQtPml0X2luZGV4ID0gUHlMaXN0X0dFVF9TSVpFKHNlcSkgLSAxOwotCVB5X0lOQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBzZXE7Ci0JUHlPYmplY3RfR0NfVHJhY2soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3RyZXZpdGVyX2RlYWxsb2MobGlzdHJldml0ZXJvYmplY3QgKml0KQotewotCVB5T2JqZWN0X0dDX1VuVHJhY2soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKLX0KLQotc3RhdGljIGludAotbGlzdHJldml0ZXJfdHJhdmVyc2UobGlzdHJldml0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKLXsKLQlpZiAoaXQtPml0X3NlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdmlzaXQoKFB5T2JqZWN0ICopaXQtPml0X3NlcSwgYXJnKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWxpc3RyZXZpdGVyX25leHQobGlzdHJldml0ZXJvYmplY3QgKml0KQotewotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgaW5kZXggPSBpdC0+aXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICpzZXEgPSBpdC0+aXRfc2VxOwotCi0JaWYgKGluZGV4Pj0wICYmIGluZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKLQkJaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGluZGV4KTsKLQkJaXQtPml0X2luZGV4LS07Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCWl0LT5pdF9pbmRleCA9IC0xOwotCWlmIChzZXEgIT0gTlVMTCkgewotCQlpdC0+aXRfc2VxID0gTlVMTDsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlfc3NpemVfdAotbGlzdHJldml0ZXJfbGVuKGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKLXsKLQlQeV9zc2l6ZV90IGxlbiA9IGl0LT5pdF9pbmRleCArIDE7Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCB8fCBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgPCBsZW4pCi0JCXJldHVybiAwOwotCXJldHVybiBsZW47Ci19CitzdGF0aWMgUHlPYmplY3QgKmxpc3RfcmV2ZXJzZWQoUHlMaXN0T2JqZWN0ICosIFB5T2JqZWN0ICopOworc3RhdGljIHZvaWQgbGlzdHJldml0ZXJfZGVhbGxvYyhsaXN0cmV2aXRlcm9iamVjdCAqKTsKK3N0YXRpYyBpbnQgbGlzdHJldml0ZXJfdHJhdmVyc2UobGlzdHJldml0ZXJvYmplY3QgKiwgdmlzaXRwcm9jLCB2b2lkICopOworc3RhdGljIFB5T2JqZWN0ICpsaXN0cmV2aXRlcl9uZXh0KGxpc3RyZXZpdGVyb2JqZWN0ICopOworc3RhdGljIFB5X3NzaXplX3QgbGlzdHJldml0ZXJfbGVuKGxpc3RyZXZpdGVyb2JqZWN0ICopOwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbGlzdHJldml0ZXJfYXNfc2VxdWVuY2UgPSB7CiAJKGxlbmZ1bmMpbGlzdHJldml0ZXJfbGVuLAkvKiBzcV9sZW5ndGggKi8KQEAgLTI5MjEsMyArMjg2Miw2NSBAQAogCShpdGVybmV4dGZ1bmMpbGlzdHJldml0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCiAJMCwKIH07CisKK3N0YXRpYyBQeU9iamVjdCAqCitsaXN0X3JldmVyc2VkKFB5TGlzdE9iamVjdCAqc2VxLCBQeU9iamVjdCAqdW51c2VkKQoreworCWxpc3RyZXZpdGVyb2JqZWN0ICppdDsKKworCWl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RyZXZpdGVyb2JqZWN0LCAmUHlMaXN0UmV2SXRlcl9UeXBlKTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJYXNzZXJ0KFB5TGlzdF9DaGVjayhzZXEpKTsKKwlpdC0+aXRfaW5kZXggPSBQeUxpc3RfR0VUX1NJWkUoc2VxKSAtIDE7CisJUHlfSU5DUkVGKHNlcSk7CisJaXQtPml0X3NlcSA9IHNlcTsKKwlQeU9iamVjdF9HQ19UcmFjayhpdCk7CisJcmV0dXJuIChQeU9iamVjdCAqKWl0OworfQorCitzdGF0aWMgdm9pZAorbGlzdHJldml0ZXJfZGVhbGxvYyhsaXN0cmV2aXRlcm9iamVjdCAqaXQpCit7CisJUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7CisJUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKwlQeU9iamVjdF9HQ19EZWwoaXQpOworfQorCitzdGF0aWMgaW50CitsaXN0cmV2aXRlcl90cmF2ZXJzZShsaXN0cmV2aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbGlzdHJldml0ZXJfbmV4dChsaXN0cmV2aXRlcm9iamVjdCAqaXQpCit7CisJUHlPYmplY3QgKml0ZW07CisJUHlfc3NpemVfdCBpbmRleCA9IGl0LT5pdF9pbmRleDsKKwlQeUxpc3RPYmplY3QgKnNlcSA9IGl0LT5pdF9zZXE7CisKKwlpZiAoaW5kZXg+PTAgJiYgaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgeworCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaW5kZXgpOworCQlpdC0+aXRfaW5kZXgtLTsKKwkJUHlfSU5DUkVGKGl0ZW0pOworCQlyZXR1cm4gaXRlbTsKKwl9CisJaXQtPml0X2luZGV4ID0gLTE7CisJaWYgKHNlcSAhPSBOVUxMKSB7CisJCWl0LT5pdF9zZXEgPSBOVUxMOworCQlQeV9ERUNSRUYoc2VxKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQeV9zc2l6ZV90CitsaXN0cmV2aXRlcl9sZW4obGlzdHJldml0ZXJvYmplY3QgKml0KQoreworCVB5X3NzaXplX3QgbGVuID0gaXQtPml0X2luZGV4ICsgMTsKKwlpZiAoaXQtPml0X3NlcSA9PSBOVUxMIHx8IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSA8IGxlbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGxlbjsKK30KKwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCA3YzVlYmM0Li4zMDczOTIzIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJaWYgKHNpZ24gPiAwKSAKIAkJcmV0dXJuIFBZX1NTSVpFX1RfTUFYOwogCWVsc2UgCi0JCXJldHVybiAtUFlfU1NJWkVfVF9NQVgtMTsKKwkJcmV0dXJuIFBZX1NTSVpFX1RfTUlOOwogfQogCiAvKiBHZXQgYSBQeV9zc2l6ZV90IGZyb20gYSBsb25nIGludCBvYmplY3QuCkBAIC0zMDEsNyArMzAxLDcgQEAKIC8qIEdldCBhIFB5X3NzaXplX3QgZnJvbSBhIGxvbmcgaW50IG9iamVjdC4KICAgIFNpbGVudGx5IHJlZHVjZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gUFlfU1NJWkVfVF9NQVggdG8gUFlfU1NJWkVfVF9NQVgsCiAgICBhbmQgc2lsZW50bHkgYm9vc3QgdmFsdWVzIGxlc3MgdGhhbiAtUFlfU1NJWkVfVF9NQVgtMSB0byAtUFlfU1NJWkVfVF9NQVgtMS4KLSAgIFJldHVybiAwIG9uIGVycm9yLCAxIG9uIHN1Y2Nlc3MuCisgICBPbiBlcnJvciwgcmV0dXJuIC0xIHdpdGggYW4gZXhjZXB0aW9uIHNldC4KICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90CkBAIC00MTksNyArNDE5LDcgQEAKIAkJZGlnaXQgbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdOwogCiAJCXJlc3VsdCA9IChuZGlnaXRzIC0gMSkgKiBTSElGVDsKLQkJaWYgKHJlc3VsdCAvIFNISUZUICE9IG5kaWdpdHMgLSAxKQorCQlpZiAocmVzdWx0IC8gU0hJRlQgIT0gKHNpemVfdCkobmRpZ2l0cyAtIDEpKQogCQkJZ290byBPdmVyZmxvdzsKIAkJZG8gewogCQkJKytyZXN1bHQ7CkBAIC03NzEsNiArNzcxLDggQEAKIFB5TG9uZ19Gcm9tVm9pZFB0cih2b2lkICpwKQogewogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKKwlpZiAoKGxvbmcpcCA8IDApCisJCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylwKTsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcCk7CiAjZWxzZQogCkBAIC03ODMsNyArNzg1LDcgQEAKIAkvKiBvcHRpbWl6ZSBudWxsIHBvaW50ZXJzICovCiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpcCk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygodW5zaWduZWQgUFlfTE9OR19MT05HKXApOwogCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORyAqLwogfQpAQCAtODAyLDggKzgwNCwxMCBAQAogCiAJaWYgKFB5SW50X0NoZWNrKHZ2KSkKIAkJeCA9IFB5SW50X0FTX0xPTkcodnYpOwotCWVsc2UKKwllbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQogCQl4ID0gUHlMb25nX0FzTG9uZyh2dik7CisJZWxzZQorCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHZ2KTsKICNlbHNlCiAKICNpZm5kZWYgSEFWRV9MT05HX0xPTkcKQEAgLTgxNiw4ICs4MjAsMTAgQEAKIAogCWlmIChQeUludF9DaGVjayh2dikpCiAJCXggPSBQeUludF9BU19MT05HKHZ2KTsKLQllbHNlCisJZWxzZSBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKIAkJeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZ2KTsKKwllbHNlCisJCXggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHZ2KTsKIAogI2VuZGlmIC8qIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcgKi8KIApAQCAtOTQ3LDcgKzk1Myw3IEBACiAKIAlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewogCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKIAl9CiAKIAlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KApAQCAtMTM5NCw2ICsxNDAwLDggQEAKIAlpbnQgc2lnbiA9IDE7CiAJY2hhciAqc3RhcnQsICpvcmlnX3N0ciA9IHN0cjsKIAlQeUxvbmdPYmplY3QgKno7CisJUHlPYmplY3QgKnN0cm9iaiwgKnN0cnJlcHI7CisJUHlfc3NpemVfdCBzbGVuOwogCiAJaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKQEAgLTE0NTksOSArMTQ2NywxOSBAQAogCXJldHVybiAoUHlPYmplY3QgKikgejsKIAogIG9uRXJyb3I6Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgbG9uZygpOiAlLjIwMHMiLCBvcmlnX3N0cik7CiAJUHlfWERFQ1JFRih6KTsKKwlzbGVuID0gc3RybGVuKG9yaWdfc3RyKSA8IDIwMCA/IHN0cmxlbihvcmlnX3N0cikgOiAyMDA7CisJc3Ryb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3JpZ19zdHIsIHNsZW4pOworCWlmIChzdHJvYmogPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RycmVwciA9IFB5T2JqZWN0X1JlcHIoc3Ryb2JqKTsKKwlQeV9ERUNSRUYoc3Ryb2JqKTsKKwlpZiAoc3RycmVwciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKwkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCisJCSAgICAgYmFzZSwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cnJlcHIpKTsKKwlQeV9ERUNSRUYoc3RycmVwcik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE0NzAsNyArMTQ4OCw3IEBACiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlfVU5JQ09ERSAqdSwgUHlfc3NpemVfdCBsZW5ndGgsIGludCBiYXNlKQogewogCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqYnVmZmVyID0gUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKKwljaGFyICpidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhsZW5ndGgrMSk7CiAKIAlpZiAoYnVmZmVyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwpAQCAtMzA2Niw3ICszMDg0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5TG9uZ09iamVjdCAqdG1wLCAqbmV3OworCVB5TG9uZ09iamVjdCAqdG1wLCAqbmV3b2JqOwogCVB5X3NzaXplX3QgaSwgbjsKIAogCWFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUxvbmdfVHlwZSkpOwpAQCAtMzA3NywxNyArMzA5NSwxNyBAQAogCW4gPSB0bXAtPm9iX3NpemU7CiAJaWYgKG4gPCAwKQogCQluID0gLW47Ci0JbmV3ID0gKFB5TG9uZ09iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkgeworCW5ld29iaiA9IChQeUxvbmdPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKKwlpZiAobmV3b2JqID09IE5VTEwpIHsKIAkJUHlfREVDUkVGKHRtcCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlhc3NlcnQoUHlMb25nX0NoZWNrKG5ldykpOwotCW5ldy0+b2Jfc2l6ZSA9IHRtcC0+b2Jfc2l6ZTsKKwlhc3NlcnQoUHlMb25nX0NoZWNrKG5ld29iaikpOworCW5ld29iai0+b2Jfc2l6ZSA9IHRtcC0+b2Jfc2l6ZTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQluZXctPm9iX2RpZ2l0W2ldID0gdG1wLT5vYl9kaWdpdFtpXTsKKwkJbmV3b2JqLT5vYl9kaWdpdFtpXSA9IHRtcC0+b2JfZGlnaXRbaV07CiAJUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ldzsKKwlyZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzExNCwyNSArMzEzMiwyNSBAQAogCShiaW5hcnlmdW5jKQlsb25nX2FkZCwJLypuYl9hZGQqLwogCShiaW5hcnlmdW5jKQlsb25nX3N1YiwJLypuYl9zdWJ0cmFjdCovCiAJKGJpbmFyeWZ1bmMpCWxvbmdfbXVsLAkvKm5iX211bHRpcGx5Ki8KLQkoYmluYXJ5ZnVuYykJbG9uZ19tb2QsCS8qbmJfcmVtYWluZGVyKi8KLQkoYmluYXJ5ZnVuYykJbG9uZ19kaXZtb2QsCS8qbmJfZGl2bW9kKi8KLQkodGVybmFyeWZ1bmMpCWxvbmdfcG93LAkvKm5iX3Bvd2VyKi8KKwkJCWxvbmdfbW9kLAkvKm5iX3JlbWFpbmRlciovCisJCQlsb25nX2Rpdm1vZCwJLypuYl9kaXZtb2QqLworCQkJbG9uZ19wb3csCS8qbmJfcG93ZXIqLwogCSh1bmFyeWZ1bmMpIAlsb25nX25lZywJLypuYl9uZWdhdGl2ZSovCiAJKHVuYXJ5ZnVuYykgCWxvbmdfcG9zLAkvKnRwX3Bvc2l0aXZlKi8KIAkodW5hcnlmdW5jKSAJbG9uZ19hYnMsCS8qdHBfYWJzb2x1dGUqLwogCShpbnF1aXJ5KQlsb25nX25vbnplcm8sCS8qdHBfbm9uemVybyovCiAJKHVuYXJ5ZnVuYykJbG9uZ19pbnZlcnQsCS8qbmJfaW52ZXJ0Ki8KLQkoYmluYXJ5ZnVuYykJbG9uZ19sc2hpZnQsCS8qbmJfbHNoaWZ0Ki8KKwkJCWxvbmdfbHNoaWZ0LAkvKm5iX2xzaGlmdCovCiAJKGJpbmFyeWZ1bmMpCWxvbmdfcnNoaWZ0LAkvKm5iX3JzaGlmdCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfYW5kLAkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfeG9yLAkvKm5iX3hvciovCi0JKGJpbmFyeWZ1bmMpCWxvbmdfb3IsCS8qbmJfb3IqLwotCShjb2VyY2lvbikJbG9uZ19jb2VyY2UsCS8qbmJfY29lcmNlKi8KLQkodW5hcnlmdW5jKQlsb25nX2ludCwJLypuYl9pbnQqLwotCSh1bmFyeWZ1bmMpCWxvbmdfbG9uZywJLypuYl9sb25nKi8KLQkodW5hcnlmdW5jKQlsb25nX2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KLQkodW5hcnlmdW5jKQlsb25nX29jdCwJLypuYl9vY3QqLwotCSh1bmFyeWZ1bmMpCWxvbmdfaGV4LAkvKm5iX2hleCovCisJCQlsb25nX2FuZCwJLypuYl9hbmQqLworCQkJbG9uZ194b3IsCS8qbmJfeG9yKi8KKwkJCWxvbmdfb3IsCS8qbmJfb3IqLworCQkJbG9uZ19jb2VyY2UsCS8qbmJfY29lcmNlKi8KKwkJCWxvbmdfaW50LAkvKm5iX2ludCovCisJCQlsb25nX2xvbmcsCS8qbmJfbG9uZyovCisJCQlsb25nX2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KKwkJCWxvbmdfb2N0LAkvKm5iX29jdCovCisJCQlsb25nX2hleCwJLypuYl9oZXgqLwogCTAsCQkJCS8qIG5iX2lucGxhY2VfYWRkICovCiAJMCwJCQkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwogCTAsCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KQEAgLTMxNDMsMTEgKzMxNjEsMTEgQEAKIAkwLAkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwogCTAsCQkJCS8qIG5iX2lucGxhY2VfeG9yICovCiAJMCwJCQkJLyogbmJfaW5wbGFjZV9vciAqLwotCShiaW5hcnlmdW5jKWxvbmdfZGl2LAkJLyogbmJfZmxvb3JfZGl2aWRlICovCisJbG9uZ19kaXYsCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCiAJbG9uZ190cnVlX2RpdmlkZSwJCS8qIG5iX3RydWVfZGl2aWRlICovCiAJMCwJCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KIAkwLAkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JKGxlbmZ1bmMpbG9uZ19pbmRleCwgICAgICAgICAgICAvKiBuYl9pbmRleCAqLworCWxvbmdfaW5kZXgsCQkJLyogbmJfaW5kZXggKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxvbmdfVHlwZSA9IHsKQEAgLTMxNTYsMTggKzMxNzQsMTggQEAKIAkibG9uZyIsCQkJCQkvKiB0cF9uYW1lICovCiAJc2l6ZW9mKFB5TG9uZ09iamVjdCkgLSBzaXplb2YoZGlnaXQpLAkvKiB0cF9iYXNpY3NpemUgKi8KIAlzaXplb2YoZGlnaXQpLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKWxvbmdfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KKwlsb25nX2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KIAkwLAkJCQkJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCiAJKGNtcGZ1bmMpbG9uZ19jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbG9uZ19yZXByLAkJCS8qIHRwX3JlcHIgKi8KKwlsb25nX3JlcHIsCQkJCS8qIHRwX3JlcHIgKi8KIAkmbG9uZ19hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCiAJMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCiAJMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KIAkoaGFzaGZ1bmMpbG9uZ19oYXNoLAkJCS8qIHRwX2hhc2ggKi8KICAgICAgICAgMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLSAgICAgICAgKHJlcHJmdW5jKWxvbmdfc3RyLAkJCS8qIHRwX3N0ciAqLworICAgICAgICBsb25nX3N0ciwJCQkJLyogdHBfc3RyICovCiAJUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwogCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwogCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMgYi9PYmplY3RzL21ldGhvZG9iamVjdC5jCmluZGV4IDhlM2JmODYuLmVjYzlhMGEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwpAQCAtMTQ5LDE3ICsxNDksOCBAQAogc3RhdGljIGludAogbWV0aF90cmF2ZXJzZShQeUNGdW5jdGlvbk9iamVjdCAqbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVycjsKLQlpZiAobS0+bV9zZWxmICE9IE5VTEwpIHsKLQkJZXJyID0gdmlzaXQobS0+bV9zZWxmLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKG0tPm1fbW9kdWxlICE9IE5VTEwpIHsKLQkJZXJyID0gdmlzaXQobS0+bV9tb2R1bGUsIGFyZyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KKwlQeV9WSVNJVChtLT5tX3NlbGYpOworCVB5X1ZJU0lUKG0tPm1fbW9kdWxlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9tb2R1bGVvYmplY3QuYyBiL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKaW5kZXggODEyNDk2OC4uZTQ1NGZjZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9tb2R1bGVvYmplY3QuYworKysgYi9PYmplY3RzL21vZHVsZW9iamVjdC5jCkBAIC0yMDQsOCArMjA0LDcgQEAKIHN0YXRpYyBpbnQKIG1vZHVsZV90cmF2ZXJzZShQeU1vZHVsZU9iamVjdCAqbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKG0tPm1kX2RpY3QgIT0gTlVMTCkKLQkJcmV0dXJuIHZpc2l0KG0tPm1kX2RpY3QsIGFyZyk7CisJUHlfVklTSVQobS0+bWRfZGljdCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JqZWN0LmMgYi9PYmplY3RzL29iamVjdC5jCmluZGV4IDliNmEzMGEuLmE3NWMxNGUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vYmplY3QuYwpAQCAtMyw5ICszLDMwIEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiAjaWZkZWYgUHlfUkVGX0RFQlVHCiBQeV9zc2l6ZV90IF9QeV9SZWZUb3RhbDsKLSNlbmRpZgorCitQeV9zc2l6ZV90CitfUHlfR2V0UmVmVG90YWwodm9pZCkKK3sKKwlQeU9iamVjdCAqbzsKKwlQeV9zc2l6ZV90IHRvdGFsID0gX1B5X1JlZlRvdGFsOworICAgICAgICAvKiBpZ25vcmUgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGR1bW15IG9iamVjdCBvZiB0aGUgZGljdHMgYW5kIHNldHMKKyAgICAgICAgICAgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVsaWFibGUgYW5kIG5vdCB1c2VmdWwgKG5vdyB0aGF0IHRoZQorICAgICAgICAgICBoYXNoIHRhYmxlIGNvZGUgaXMgd2VsbC10ZXN0ZWQpICovCisJbyA9IF9QeURpY3RfRHVtbXkoKTsKKwlpZiAobyAhPSBOVUxMKQorCQl0b3RhbCAtPSBvLT5vYl9yZWZjbnQ7CisJbyA9IF9QeVNldF9EdW1teSgpOworCWlmIChvICE9IE5VTEwpCisJCXRvdGFsIC09IG8tPm9iX3JlZmNudDsKKwlyZXR1cm4gdG90YWw7Cit9CisjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCiAKIGludCBQeV9EaXZpc2lvbldhcm5pbmdGbGFnOwogCkBAIC01MywyMyArNzQsMzAgQEAKIAogI2lmZGVmIENPVU5UX0FMTE9DUwogc3RhdGljIFB5VHlwZU9iamVjdCAqdHlwZV9saXN0OworLyogQWxsIHR5cGVzIGFyZSBhZGRlZCB0byB0eXBlX2xpc3QsIGF0IGxlYXN0IHdoZW4KKyAgIHRoZXkgZ2V0IG9uZSBvYmplY3QgY3JlYXRlZC4gVGhhdCBtYWtlcyB0aGVtCisgICBpbW1vcnRhbCwgd2hpY2ggdW5mb3J0dW5hdGVseSBjb250cmlidXRlcyB0bworICAgZ2FyYmFnZSBpdHNlbGYuIElmIHVubGlzdF90eXBlc193aXRob3V0X29iamVjdHMKKyAgIGlzIHNldCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgdHlwZV9saXN0CisgICBvbmNlIHRoZSBsYXN0IG9iamVjdCBpcyBkZWFsbG9jYXRlZC4gKi8KK2ludCB1bmxpc3RfdHlwZXNfd2l0aG91dF9vYmplY3RzOwogZXh0ZXJuIGludCB0dXBsZV96ZXJvX2FsbG9jcywgZmFzdF90dXBsZV9hbGxvY3M7CiBleHRlcm4gaW50IHF1aWNrX2ludF9hbGxvY3MsIHF1aWNrX25lZ19pbnRfYWxsb2NzOwogZXh0ZXJuIGludCBudWxsX3N0cmluZ3MsIG9uZV9zdHJpbmdzOwogdm9pZAotZHVtcF9jb3VudHModm9pZCkKK2R1bXBfY291bnRzKEZJTEUqIGYpCiB7CiAJUHlUeXBlT2JqZWN0ICp0cDsKIAogCWZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQotCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGFsbG9jJ2Q6ICVkLCBmcmVlZDogJWQsIG1heCBpbiB1c2U6ICVkXG4iLAorCQlmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlZCwgZnJlZWQ6ICVkLCBtYXggaW4gdXNlOiAlZFxuIiwKIAkJCXRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLCB0cC0+dHBfZnJlZXMsCiAJCQl0cC0+dHBfbWF4YWxsb2MpOwotCWZwcmludGYoc3RkZXJyLCAiZmFzdCB0dXBsZSBhbGxvY3M6ICVkLCBlbXB0eTogJWRcbiIsCisJZnByaW50ZihmLCAiZmFzdCB0dXBsZSBhbGxvY3M6ICVkLCBlbXB0eTogJWRcbiIsCiAJCWZhc3RfdHVwbGVfYWxsb2NzLCB0dXBsZV96ZXJvX2FsbG9jcyk7Ci0JZnByaW50ZihzdGRlcnIsICJmYXN0IGludCBhbGxvY3M6IHBvczogJWQsIG5lZzogJWRcbiIsCisJZnByaW50ZihmLCAiZmFzdCBpbnQgYWxsb2NzOiBwb3M6ICVkLCBuZWc6ICVkXG4iLAogCQlxdWlja19pbnRfYWxsb2NzLCBxdWlja19uZWdfaW50X2FsbG9jcyk7Ci0JZnByaW50ZihzdGRlcnIsICJudWxsIHN0cmluZ3M6ICVkLCAxLXN0cmluZ3M6ICVkXG4iLAorCWZwcmludGYoZiwgIm51bGwgc3RyaW5nczogJWQsIDEtc3RyaW5nczogJWRcbiIsCiAJCW51bGxfc3RyaW5ncywgb25lX3N0cmluZ3MpOwogfQogCkBAIC0xMDMsMTAgKzEzMSwxMiBAQAogdm9pZAogaW5jX2NvdW50KFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JaWYgKHRwLT50cF9hbGxvY3MgPT0gMCkgeworCWlmICh0cC0+dHBfbmV4dCA9PSBOVUxMICYmIHRwLT50cF9wcmV2ID09IE5VTEwpIHsKIAkJLyogZmlyc3QgdGltZTsgaW5zZXJ0IGluIGxpbmtlZCBsaXN0ICovCiAJCWlmICh0cC0+dHBfbmV4dCAhPSBOVUxMKSAvKiBzYW5pdHkgY2hlY2sgKi8KIAkJCVB5X0ZhdGFsRXJyb3IoIlhYWCBpbmNfY291bnQgc2FuaXR5IGNoZWNrIik7CisJCWlmICh0eXBlX2xpc3QpCisJCQl0eXBlX2xpc3QtPnRwX3ByZXYgPSB0cDsKIAkJdHAtPnRwX25leHQgPSB0eXBlX2xpc3Q7CiAJCS8qIE5vdGUgdGhhdCBhcyBvZiBQeXRob24gMi4yLCBoZWFwLWFsbG9jYXRlZCB0eXBlIG9iamVjdHMKIAkJICogY2FuIGdvIGF3YXksIGJ1dCB0aGlzIGNvZGUgcmVxdWlyZXMgdGhhdCB0aGV5IHN0YXkgYWxpdmUKQEAgLTEyOSw2ICsxNTksMjQgQEAKIAlpZiAodHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlcyA+IHRwLT50cF9tYXhhbGxvYykKIAkJdHAtPnRwX21heGFsbG9jID0gdHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlczsKIH0KKwordm9pZCBkZWNfY291bnQoUHlUeXBlT2JqZWN0ICp0cCkKK3sKKwl0cC0+dHBfZnJlZXMrKzsKKwlpZiAodW5saXN0X3R5cGVzX3dpdGhvdXRfb2JqZWN0cyAmJgorCSAgICB0cC0+dHBfYWxsb2NzID09IHRwLT50cF9mcmVlcykgeworCQkvKiB1bmxpbmsgdGhlIHR5cGUgZnJvbSB0eXBlX2xpc3QgKi8KKwkJaWYgKHRwLT50cF9wcmV2KQorCQkJdHAtPnRwX3ByZXYtPnRwX25leHQgPSB0cC0+dHBfbmV4dDsKKwkJZWxzZQorCQkJdHlwZV9saXN0ID0gdHAtPnRwX25leHQ7CisJCWlmICh0cC0+dHBfbmV4dCkKKwkJCXRwLT50cF9uZXh0LT50cF9wcmV2ID0gdHAtPnRwX3ByZXY7CisJCXRwLT50cF9uZXh0ID0gdHAtPnRwX3ByZXYgPSBOVUxMOworCQlQeV9ERUNSRUYodHApOworCX0KK30KKwogI2VuZGlmCiAKICNpZmRlZiBQeV9SRUZfREVCVUcKQEAgLTEzOCwxMSArMTg2LDEwIEBACiB7CiAJY2hhciBidWZbMzAwXTsKIAotCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQotCSAgIGF2YWlsYWJsZSAqLwogCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICAgIiVzOiVpIG9iamVjdCBhdCAlcCBoYXMgbmVnYXRpdmUgcmVmIGNvdW50ICVsZCIsCi0JCSAgICAgIGZuYW1lLCBsaW5lbm8sIG9wLCAobG9uZylvcC0+b2JfcmVmY250KTsKKwkJICAgICAgIiVzOiVpIG9iamVjdCBhdCAlcCBoYXMgbmVnYXRpdmUgcmVmIGNvdW50ICIKKwkJICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorCQkgICAgICBmbmFtZSwgbGluZW5vLCBvcCwgb3AtPm9iX3JlZmNudCk7CiAJUHlfRmF0YWxFcnJvcihidWYpOwogfQogCkBAIC0zMTcsNyArMzY0LDcgQEAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJCWlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgewogCQkJUHlPYmplY3QqIHN0cjsKLQkJCXN0ciA9IFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcocmVzKTsKKwkJCXN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcocmVzLCBOVUxMLCBOVUxMKTsKIAkJCVB5X0RFQ1JFRihyZXMpOwogCQkJaWYgKHN0cikKIAkJCQlyZXMgPSBzdHI7CkBAIC0xNzc1LDEyICsxODIyLDEyIEBACiAJIk5vbmVUeXBlIiwKIAkwLAogCTAsCi0JKGRlc3RydWN0b3Ipbm9uZV9kZWFsbG9jLAkgICAgIC8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KKwlub25lX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovIC8qbmV2ZXIgY2FsbGVkKi8KIAkwLAkJLyp0cF9wcmludCovCiAJMCwJCS8qdHBfZ2V0YXR0ciovCiAJMCwJCS8qdHBfc2V0YXR0ciovCiAJMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKW5vbmVfcmVwciwgLyp0cF9yZXByKi8KKwlub25lX3JlcHIsCS8qdHBfcmVwciovCiAJMCwJCS8qdHBfYXNfbnVtYmVyKi8KIAkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCiAJMCwJCS8qdHBfYXNfbWFwcGluZyovCkBAIC0xODA2LDEyICsxODUzLDEyIEBACiAJIk5vdEltcGxlbWVudGVkVHlwZSIsCiAJMCwKIAkwLAotCShkZXN0cnVjdG9yKW5vbmVfZGVhbGxvYywJICAgICAvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCisJbm9uZV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCiAJMCwJCS8qdHBfcHJpbnQqLwogCTAsCQkvKnRwX2dldGF0dHIqLwogCTAsCQkvKnRwX3NldGF0dHIqLwogCTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylOb3RJbXBsZW1lbnRlZF9yZXByLCAvKnRwX3JlcHIqLworCU5vdEltcGxlbWVudGVkX3JlcHIsIC8qdHBfcmVwciovCiAJMCwJCS8qdHBfYXNfbnVtYmVyKi8KIAkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCiAJMCwJCS8qdHBfYXNfbWFwcGluZyovCkBAIC0xOTAxLDkgKzE5NDgsNyBAQAogCVB5T2JqZWN0ICpvcDsKIAlmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdHM6XG4iKTsKIAlmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpIHsKLQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCi0JCSAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLwotCQlmcHJpbnRmKGZwLCAiJXAgWyVsZF0gIiwgb3AsIChsb25nKW9wLT5vYl9yZWZjbnQpOworCQlmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICIsIG9wLCBvcC0+b2JfcmVmY250KTsKIAkJaWYgKFB5T2JqZWN0X1ByaW50KG9wLCBmcCwgMCkgIT0gMCkKIAkJCVB5RXJyX0NsZWFyKCk7CiAJCXB1dGMoJ1xuJywgZnApOwpAQCAtMTkxOSwxMCArMTk2NCw4IEBACiAJUHlPYmplY3QgKm9wOwogCWZwcmludGYoZnAsICJSZW1haW5pbmcgb2JqZWN0IGFkZHJlc3NlczpcbiIpOwogCWZvciAob3AgPSByZWZjaGFpbi5fb2JfbmV4dDsgb3AgIT0gJnJlZmNoYWluOyBvcCA9IG9wLT5fb2JfbmV4dCkKLQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCi0JCSAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLwotCQlmcHJpbnRmKGZwLCAiJXAgWyVsZF0gJXNcbiIsIG9wLCAobG9uZylvcC0+b2JfcmVmY250LAotCQkJCQkgICAgb3AtPm9iX3R5cGUtPnRwX25hbWUpOworCQlmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICVzXG4iLCBvcCwKKwkJCW9wLT5vYl9yZWZjbnQsIG9wLT5vYl90eXBlLT50cF9uYW1lKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMjEwMCwzICsyMTQzLDggQEAKIAkJLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKIAl9CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCA4NzBmOTNjLi5hMzkzY2JjIDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC01MjksNyArNTI5LDcgQEAKIAkJbmJ5dGVzID0gbnVtYXJlbmFzICogc2l6ZW9mKCphcmVuYXMpOwogCQlpZiAobmJ5dGVzIC8gc2l6ZW9mKCphcmVuYXMpICE9IG51bWFyZW5hcykKIAkJCXJldHVybiBOVUxMOwkvKiBvdmVyZmxvdyAqLwotCQlhcmVuYW9iaiA9IHJlYWxsb2MoYXJlbmFzLCBuYnl0ZXMpOworCQlhcmVuYW9iaiA9IChzdHJ1Y3QgYXJlbmFfb2JqZWN0ICopcmVhbGxvYyhhcmVuYXMsIG5ieXRlcyk7CiAJCWlmIChhcmVuYW9iaiA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7CiAJCWFyZW5hcyA9IGFyZW5hb2JqOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9yYW5nZW9iamVjdC5jIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCmluZGV4IGE5YzBiNTUuLmM0OGJlZTAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvcmFuZ2VvYmplY3QuYworKysgYi9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKQEAgLTEwNCwxMyArMTA0LDYgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiByYW5nZV9sZW5ndGgocmFuZ2VvYmplY3QgKnIpCiB7Ci0jaWYgTE9OR19NQVggIT0gSU5UX01BWCAvKiBYWFggc3NpemVfdF9tYXggKi8KLQlpZiAoci0+bGVuID4gSU5UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkieHJhbmdlIG9iamVjdCBzaXplIGNhbm5vdCBiZSByZXBvcnRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIChQeV9zc2l6ZV90KShyLT5sZW4pOwogfQogCkBAIC0xNTcsNDQgKzE1MCw0NCBAQAogCiBQeVR5cGVPYmplY3QgUHlSYW5nZV9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkieHJhbmdlIiwJCQkvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLwotCXNpemVvZihyYW5nZW9iamVjdCksCQkvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLwotCTAsCQkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpcmFuZ2VfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmcmFuZ2VfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KLQlyYW5nZV9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpcmFuZ2VfaXRlciwJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmFuZ2VfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXJhbmdlX25ldywJCQkvKiB0cF9uZXcgKi8KKwkwLAkJCS8qIE51bWJlciBvZiBpdGVtcyBmb3IgdmFyb2JqZWN0ICovCisJInhyYW5nZSIsCQkvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworCXNpemVvZihyYW5nZW9iamVjdCksCS8qIEJhc2ljIG9iamVjdCBzaXplICovCisJMCwJCQkvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLworCTAsCQkJLyogdHBfcHJpbnQgKi8KKwkwLAkJCS8qIHRwX2dldGF0dHIgKi8KKwkwLAkJCS8qIHRwX3NldGF0dHIgKi8KKwkwLAkJCS8qIHRwX2NvbXBhcmUgKi8KKwkocmVwcmZ1bmMpcmFuZ2VfcmVwciwJLyogdHBfcmVwciAqLworCTAsCQkJLyogdHBfYXNfbnVtYmVyICovCisJJnJhbmdlX2FzX3NlcXVlbmNlLAkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJLyogdHBfYXNfbWFwcGluZyAqLworCTAsCQkJLyogdHBfaGFzaCAqLworCTAsCQkJLyogdHBfY2FsbCAqLworCTAsCQkJLyogdHBfc3RyICovCisJUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAvKiB0cF9nZXRhdHRybyAqLworCTAsCQkJLyogdHBfc2V0YXR0cm8gKi8KKwkwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworCVB5X1RQRkxBR1NfREVGQVVMVCwJLyogdHBfZmxhZ3MgKi8KKwlyYW5nZV9kb2MsCQkvKiB0cF9kb2MgKi8KKwkwLAkJCS8qIHRwX3RyYXZlcnNlICovCisJMCwJCQkvKiB0cF9jbGVhciAqLworCTAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKwkwLAkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJcmFuZ2VfaXRlciwJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCS8qIHRwX2l0ZXJuZXh0ICovCisJcmFuZ2VfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KKwkwLAkJCS8qIHRwX21lbWJlcnMgKi8KKwkwLAkJCS8qIHRwX2dldHNldCAqLworCTAsCQkJLyogdHBfYmFzZSAqLworCTAsCQkJLyogdHBfZGljdCAqLworCTAsCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KKwkwLAkJCS8qIHRwX2luaXQgKi8KKwkwLAkJCS8qIHRwX2FsbG9jICovCisJcmFuZ2VfbmV3LAkJLyogdHBfbmV3ICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKiogWHJhbmdlIEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjA3LDUzICsyMDAsNiBAQAogCWxvbmcJbGVuOwogfSByYW5nZWl0ZXJvYmplY3Q7CiAKLXN0YXRpYyBQeVR5cGVPYmplY3QgUHlyYW5nZWl0ZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXJhbmdlX2l0ZXIoUHlPYmplY3QgKnNlcSkKLXsKLQlyYW5nZWl0ZXJvYmplY3QgKml0OwotCi0JaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPmluZGV4ID0gMDsKLQlpdC0+c3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7Ci0JaXQtPnN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlpdC0+bGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1yYW5nZV9yZXZlcnNlKFB5T2JqZWN0ICpzZXEpCi17Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKLQlsb25nIHN0YXJ0LCBzdGVwLCBsZW47Ci0KLQlpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OwotCXN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlsZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOwotCi0JaXQtPmluZGV4ID0gMDsKLQlpdC0+c3RhcnQgPSBzdGFydCArIChsZW4tMSkgKiBzdGVwOwotCWl0LT5zdGVwID0gLXN0ZXA7Ci0JaXQtPmxlbiA9IGxlbjsKLQotCXJldHVybiAoUHlPYmplY3QgKilpdDsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlaXRlcl9uZXh0KHJhbmdlaXRlcm9iamVjdCAqcikKIHsKQEAgLTMwOCwzICsyNTQsNDggQEAKIAlyYW5nZWl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCiAJMCwKIH07CisKK3N0YXRpYyBQeU9iamVjdCAqCityYW5nZV9pdGVyKFB5T2JqZWN0ICpzZXEpCit7CisJcmFuZ2VpdGVyb2JqZWN0ICppdDsKKworCWlmICghUHlSYW5nZV9DaGVjayhzZXEpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaXQgPSBQeU9iamVjdF9OZXcocmFuZ2VpdGVyb2JqZWN0LCAmUHlyYW5nZWl0ZXJfVHlwZSk7CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWl0LT5pbmRleCA9IDA7CisJaXQtPnN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OworCWl0LT5zdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7CisJaXQtPmxlbiA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5sZW47CisJcmV0dXJuIChQeU9iamVjdCAqKWl0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorcmFuZ2VfcmV2ZXJzZShQeU9iamVjdCAqc2VxKQoreworCXJhbmdlaXRlcm9iamVjdCAqaXQ7CisJbG9uZyBzdGFydCwgc3RlcCwgbGVuOworCisJaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKKwkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGFydCA9ICgocmFuZ2VvYmplY3QgKilzZXEpLT5zdGFydDsKKwlzdGVwID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0ZXA7CisJbGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKKworCWl0LT5pbmRleCA9IDA7CisJaXQtPnN0YXJ0ID0gc3RhcnQgKyAobGVuLTEpICogc3RlcDsKKwlpdC0+c3RlcCA9IC1zdGVwOworCWl0LT5sZW4gPSBsZW47CisKKwlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Cit9CmRpZmYgLS1naXQgYS9PYmplY3RzL3NldG9iamVjdC5jIGIvT2JqZWN0cy9zZXRvYmplY3QuYwppbmRleCA4OWQ1NzRmLi4yNmEyMzJiIDEwMDY0NAotLS0gYS9PYmplY3RzL3NldG9iamVjdC5jCisrKyBiL09iamVjdHMvc2V0b2JqZWN0LmMKQEAgLTMsNyArMyw3IEBACiAgICBXcml0dGVuIGFuZCBtYWludGFpbmVkIGJ5IFJheW1vbmQgRC4gSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KICAgIERlcml2ZWQgZnJvbSBMaWIvc2V0cy5weSBhbmQgT2JqZWN0cy9kaWN0b2JqZWN0LmMuCiAKLSAgIENvcHlyaWdodCAoYykgMjAwMy01IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICAgQ29weXJpZ2h0IChjKSAyMDAzLTYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKi8KIApAQCAtMTYsNiArMTYsMTQgQEAKIC8qIE9iamVjdCB1c2VkIGFzIGR1bW15IGtleSB0byBmaWxsIGRlbGV0ZWQgZW50cmllcyAqLwogc3RhdGljIFB5T2JqZWN0ICpkdW1teSA9IE5VTEw7IC8qIEluaXRpYWxpemVkIGJ5IGZpcnN0IGNhbGwgdG8gbWFrZV9uZXdfc2V0KCkgKi8KIAorI2lmZGVmIFB5X1JFRl9ERUJVRworUHlPYmplY3QgKgorX1B5U2V0X0R1bW15KHZvaWQpCit7CisJcmV0dXJuIGR1bW15OworfQorI2VuZGlmCisKICNkZWZpbmUgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbykgZG8gewkJCQlcCiAJKHNvKS0+dGFibGUgPSAoc28pLT5zbWFsbHRhYmxlOwkJCQlcCiAJKHNvKS0+bWFzayA9IFB5U2V0X01JTlNJWkUgLSAxOwkJCQlcCkBAIC00NDUsNyArNDUzLDcgQEAKIAkJfQogI2lmZGVmIFB5X0RFQlVHCiAJCWVsc2UKLQkJCWFzc2VydChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSk7CisJCQlhc3NlcnQoZW50cnktPmtleSA9PSBOVUxMKTsKICNlbmRpZgogCX0KIApAQCAtNzE5LDggKzcyNyw2IEBACiAKIC8qKioqKiBTZXQgaXRlcmF0b3IgdHlwZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIFB5VHlwZU9iamVjdCBQeVNldEl0ZXJfVHlwZTsgLyogRm9yd2FyZCAqLwotCiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAogCVB5U2V0T2JqZWN0ICpzaV9zZXQ7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCkBAIC03MjksMjAgKzczNSw2IEBACiAJbG9uZyBsZW47CiB9IHNldGl0ZXJvYmplY3Q7CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1zZXRfaXRlcihQeVNldE9iamVjdCAqc28pCi17Ci0Jc2V0aXRlcm9iamVjdCAqc2kgPSBQeU9iamVjdF9OZXcoc2V0aXRlcm9iamVjdCwgJlB5U2V0SXRlcl9UeXBlKTsKLQlpZiAoc2kgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNvKTsKLQlzaS0+c2lfc2V0ID0gc287Ci0Jc2ktPnNpX3VzZWQgPSBzby0+dXNlZDsKLQlzaS0+c2lfcG9zID0gMDsKLQlzaS0+bGVuID0gc28tPnVzZWQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNpOwotfQotCiBzdGF0aWMgdm9pZAogc2V0aXRlcl9kZWFsbG9jKHNldGl0ZXJvYmplY3QgKnNpKQogewpAQCAtODM4LDYgKzgzMCwyMCBAQAogCTAsCiB9OwogCitzdGF0aWMgUHlPYmplY3QgKgorc2V0X2l0ZXIoUHlTZXRPYmplY3QgKnNvKQoreworCXNldGl0ZXJvYmplY3QgKnNpID0gUHlPYmplY3RfTmV3KHNldGl0ZXJvYmplY3QsICZQeVNldEl0ZXJfVHlwZSk7CisJaWYgKHNpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCVB5X0lOQ1JFRihzbyk7CisJc2ktPnNpX3NldCA9IHNvOworCXNpLT5zaV91c2VkID0gc28tPnVzZWQ7CisJc2ktPnNpX3BvcyA9IDA7CisJc2ktPmxlbiA9IHNvLT51c2VkOworCXJldHVybiAoUHlPYmplY3QgKilzaTsKK30KKwogc3RhdGljIGludAogc2V0X3VwZGF0ZV9pbnRlcm5hbChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKQEAgLTk3Miw4ICs5NzgsOCBAQAogCQlzbyA9IGZyZWVfc2V0c1tudW1fZnJlZV9zZXRzXTsKIAkJUHlPYmplY3RfR0NfRGVsKHNvKTsKIAl9Ci0JUHlfWERFQ1JFRihkdW1teSk7Ci0JUHlfWERFQ1JFRihlbXB0eWZyb3plbnNldCk7CisJUHlfQ0xFQVIoZHVtbXkpOworCVB5X0NMRUFSKGVtcHR5ZnJvemVuc2V0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE1MzEsNyArMTUzNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9ub2NtcChQeU9iamVjdCAqc2VsZikKK3NldF9ub2NtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewogCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW5ub3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIik7CiAJcmV0dXJuIC0xOwpAQCAtMTY4OCw3ICsxNjk0LDcgQEAKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHNldF9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylzZXRfbGVuLAkJLyogc3FfbGVuZ3RoICovCisJc2V0X2xlbiwJCQkvKiBzcV9sZW5ndGggKi8KIAkwLAkJCQkvKiBzcV9jb25jYXQgKi8KIAkwLAkJCQkvKiBzcV9yZXBlYXQgKi8KIAkwLAkJCQkvKiBzcV9pdGVtICovCkBAIC0xODAyLDcgKzE4MDgsNyBAQAogCShwcmludGZ1bmMpc2V0X3RwX3ByaW50LAkvKiB0cF9wcmludCAqLwogCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KIAkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpc2V0X25vY21wLAkJLyogdHBfY29tcGFyZSAqLworCXNldF9ub2NtcCwJCQkvKiB0cF9jb21wYXJlICovCiAJKHJlcHJmdW5jKXNldF9yZXByLAkJLyogdHBfcmVwciAqLwogCSZzZXRfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwogCSZzZXRfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwpAQCAtMTg5Niw3ICsxOTAyLDcgQEAKIAkocHJpbnRmdW5jKXNldF90cF9wcmludCwJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkvKiB0cF9nZXRhdHRyICovCiAJMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKXNldF9ub2NtcCwJCS8qIHRwX2NvbXBhcmUgKi8KKwlzZXRfbm9jbXAsCQkJLyogdHBfY29tcGFyZSAqLwogCShyZXByZnVuYylzZXRfcmVwciwJCS8qIHRwX3JlcHIgKi8KIAkmZnJvemVuc2V0X2FzX251bWJlciwJCS8qIHRwX2FzX251bWJlciAqLwogCSZzZXRfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwpAQCAtMTk2Niw2ICsxOTcyLDE2IEBACiB9CiAKIGludAorUHlTZXRfQ2xlYXIoUHlPYmplY3QgKnNldCkKK3sKKwlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc2V0LT5vYl90eXBlLCAmUHlTZXRfVHlwZSkpIHsKKwkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHNldF9jbGVhcl9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKilzZXQpOworfQorCitpbnQKIFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpCiB7CiAJaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7CkBAIC0xOTk1LDYgKzIwMTEsMjEgQEAKIAlyZXR1cm4gc2V0X2FkZF9rZXkoKFB5U2V0T2JqZWN0ICopc2V0LCBrZXkpOwogfQogCitpbnQKK19QeVNldF9OZXh0KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiplbnRyeSkKK3sKKwlzZXRlbnRyeSAqZW50cnlfcHRyOworCisJaWYgKCFQeUFueVNldF9DaGVjayhzZXQpKSB7CisJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilzZXQsIHBvcywgJmVudHJ5X3B0cikgPT0gMCkKKwkJcmV0dXJuIDA7CisJKmVudHJ5ID0gZW50cnlfcHRyLT5rZXk7CisJcmV0dXJuIDE7Cit9CisKIFB5T2JqZWN0ICoKIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KQogewpAQCAtMjAwNSw2ICsyMDM2LDE1IEBACiAJcmV0dXJuIHNldF9wb3AoKFB5U2V0T2JqZWN0ICopc2V0KTsKIH0KIAoraW50CitfUHlTZXRfVXBkYXRlKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICppdGVyYWJsZSkKK3sKKwlpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoc2V0LT5vYl90eXBlLCAmUHlTZXRfVHlwZSkpIHsKKwkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHNldF91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0LCBpdGVyYWJsZSk7Cit9CiAKICNpZmRlZiBQeV9ERUJVRwogCkBAIC0yMDIxLDcgKzIwNjEsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2NfYXBpKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlQeU9iamVjdCAqZWxlbSwgKmR1cCwgKnQsICpmLCAqb2IgPSAoUHlPYmplY3QgKilzbzsKKwlpbnQgY291bnQ7CisJY2hhciAqczsKKwlQeV9zc2l6ZV90IGk7CisJUHlPYmplY3QgKmVsZW0sICpkdXAsICp0LCAqZiwgKmR1cDI7CisJUHlPYmplY3QgKm9iID0gKFB5T2JqZWN0ICopc287CiAKIAkvKiBWZXJpZnkgcHJlY29uZGl0aW9ucyBhbmQgZXhlcmNpc2UgdHlwZS9zaXplIGNoZWNrcyAqLwogCWFzc2VydChQeUFueVNldF9DaGVjayhvYikpOwpAQCAtMjA1Miw2ICsyMDk2LDM1IEBACiAJYXNzZXJ0KFB5U2V0X0Rpc2NhcmQob2IsIGVsZW0pID09IDApOwogCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7CiAKKwkvKiBFeGVyY2lzZSBjbGVhciAqLworCWR1cDIgPSBQeVNldF9OZXcoZHVwKTsKKwlhc3NlcnQoUHlTZXRfQ2xlYXIoZHVwMikgPT0gMCk7CisJYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMCk7CisJUHlfREVDUkVGKGR1cDIpOworCisJLyogUmFpc2UgU3lzdGVtRXJyb3Igb24gY2xlYXIgb3IgdXBkYXRlIG9mIGZyb3plbiBzZXQgKi8KKwlmID0gUHlGcm96ZW5TZXRfTmV3KGR1cCk7CisJYXNzZXJ0UmFpc2VzKFB5U2V0X0NsZWFyKGYpID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisJYXNzZXJ0UmFpc2VzKF9QeVNldF9VcGRhdGUoZiwgZHVwKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworCVB5X0RFQ1JFRihmKTsKKworCS8qIEV4ZXJjaXNlIGRpcmVjdCBpdGVyYXRpb24gKi8KKwlpID0gMCwgY291bnQgPSAwOworCXdoaWxlIChfUHlTZXRfTmV4dCgoUHlPYmplY3QgKilkdXAsICZpLCAmZWxlbSkpIHsKKwkJcyA9IFB5U3RyaW5nX0FzU3RyaW5nKGVsZW0pOworCQlhc3NlcnQocyAmJiAoc1swXSA9PSAnYScgfHwgc1swXSA9PSAnYicgfHwgc1swXSA9PSAnYycpKTsKKwkJY291bnQrKzsKKwl9CisJYXNzZXJ0KGNvdW50ID09IDMpOworCisJLyogRXhlcmNpc2UgdXBkYXRlcyAqLworCWR1cDIgPSBQeVNldF9OZXcoTlVMTCk7CisJYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKKwlhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKKwlhc3NlcnQoX1B5U2V0X1VwZGF0ZShkdXAyLCBkdXApID09IDApOworCWFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDMpOworCVB5X0RFQ1JFRihkdXAyKTsKKwogCS8qIFJhaXNlIFN5c3RlbUVycm9yIHdoZW4gc2VsZiBhcmd1bWVudCBpcyBub3QgYSBzZXQgb3IgZnJvemVuc2V0LiAqLwogCXQgPSBQeVR1cGxlX05ldygwKTsKIAlhc3NlcnRSYWlzZXMoUHlTZXRfU2l6ZSh0KSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zbGljZW9iamVjdC5jIGIvT2JqZWN0cy9zbGljZW9iamVjdC5jCmluZGV4IDNiMzdkYmIuLjI3MWE5YWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2xpY2VvYmplY3QuYworKysgYi9PYmplY3RzL3NsaWNlb2JqZWN0LmMKQEAgLTI0LDI2ICsyNCwyNiBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RWxsaXBzaXNfVHlwZSA9IHsKIAlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCQkvKiBvYl9zaXplICovCi0JImVsbGlwc2lzIiwJCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLCAvKm5ldmVyIGNhbGxlZCovCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyllbGxpcHNpc19yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KKwkwLAkJCQkvKiBvYl9zaXplICovCisJImVsbGlwc2lzIiwJCQkvKiB0cF9uYW1lICovCisJMCwJCQkJLyogdHBfYmFzaWNzaXplICovCisJMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KKwkwLCAvKm5ldmVyIGNhbGxlZCovCQkvKiB0cF9kZWFsbG9jICovCisJMCwJCQkJLyogdHBfcHJpbnQgKi8KKwkwLAkJCQkvKiB0cF9nZXRhdHRyICovCisJMCwJCQkJLyogdHBfc2V0YXR0ciAqLworCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KKwllbGxpcHNpc19yZXByLAkJCS8qIHRwX3JlcHIgKi8KKwkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KKwkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCQkvKiB0cF9oYXNoICovCisJMCwJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLworCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCisJMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCisJUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KIH07CiAKIFB5T2JqZWN0IF9QeV9FbGxpcHNpc09iamVjdCA9IHsKQEAgLTc5LDYgKzc5LDI1IEBACiAJcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CiB9CiAKK1B5T2JqZWN0ICoKK19QeVNsaWNlX0Zyb21JbmRpY2VzKFB5X3NzaXplX3QgaXN0YXJ0LCBQeV9zc2l6ZV90IGlzdG9wKQoreworCVB5T2JqZWN0ICpzdGFydCwgKmVuZCwgKnNsaWNlOworCXN0YXJ0ID0gUHlJbnRfRnJvbVNzaXplX3QoaXN0YXJ0KTsKKwlpZiAoIXN0YXJ0KQorCQlyZXR1cm4gTlVMTDsKKwllbmQgPSBQeUludF9Gcm9tU3NpemVfdChpc3RvcCk7CisJaWYgKCFlbmQpIHsKKwkJUHlfREVDUkVGKHN0YXJ0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2xpY2UgPSBQeVNsaWNlX05ldyhzdGFydCwgZW5kLCBOVUxMKTsKKwlQeV9ERUNSRUYoc3RhcnQpOworCVB5X0RFQ1JFRihlbmQpOworCXJldHVybiBzbGljZTsKK30KKwogaW50CiBQeVNsaWNlX0dldEluZGljZXMoUHlTbGljZU9iamVjdCAqciwgUHlfc3NpemVfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXApCkBAIC04NywyMSArMTA2LDIxIEBACiAJaWYgKHItPnN0ZXAgPT0gUHlfTm9uZSkgewogCQkqc3RlcCA9IDE7CiAJfSBlbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOwotCQkqc3RlcCA9IFB5SW50X0FzTG9uZyhyLT5zdGVwKTsKKwkJaWYgKCFQeUludF9DaGVjayhyLT5zdGVwKSAmJiAhUHlMb25nX0NoZWNrKHItPnN0ZXApKSByZXR1cm4gLTE7CisJCSpzdGVwID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0ZXApOwogCX0KIAlpZiAoci0+c3RhcnQgPT0gUHlfTm9uZSkgewogCQkqc3RhcnQgPSAqc3RlcCA8IDAgPyBsZW5ndGgtMSA6IDA7CiAJfSBlbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhyLT5zdGFydCkpIHJldHVybiAtMTsKLQkJKnN0YXJ0ID0gUHlJbnRfQXNMb25nKHItPnN0YXJ0KTsKKwkJaWYgKCFQeUludF9DaGVjayhyLT5zdGFydCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworCQkqc3RhcnQgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RhcnQpOwogCQlpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ICs9IGxlbmd0aDsKIAl9CiAJaWYgKHItPnN0b3AgPT0gUHlfTm9uZSkgewogCQkqc3RvcCA9ICpzdGVwIDwgMCA/IC0xIDogbGVuZ3RoOwogCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RvcCkpIHJldHVybiAtMTsKLQkJKnN0b3AgPSBQeUludF9Bc0xvbmcoci0+c3RvcCk7CisJCWlmICghUHlJbnRfQ2hlY2soci0+c3RvcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworCQkqc3RvcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdG9wKTsKIAkJaWYgKCpzdG9wIDwgMCkgKnN0b3AgKz0gbGVuZ3RoOwogCX0KIAlpZiAoKnN0b3AgPiBsZW5ndGgpIHJldHVybiAtMTsKQEAgLTIzMyw3ICsyNTIsNyBAQAogewogCVB5X3NzaXplX3QgaWxlbiwgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOwogCi0JaWxlbiA9IFB5SW50X0FzTG9uZyhsZW4pOworCWlsZW4gPSBQeUludF9Bc1NzaXplX3QobGVuKTsKIAogCWlmIChpbGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNDQsNyArMjYzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgc3RhcnQsIHN0b3AsIHN0ZXApOworCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobm5uKSIsIHN0YXJ0LCBzdG9wLCBzdGVwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNsaWNlX2luZGljZXNfZG9jLApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKaW5kZXggMzJhYWNmNS4uMzJlODI1ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYworKysgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCkBAIC0xLDUgKzEsNiBAQAogLyogU3RyaW5nIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAqLwogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0xNiw3ICsxNyw3IEBACiAgICBXaGVuIHRoZSBpbnRlcm5lZCBzdHJpbmcgcmVhY2hlcyBhIHJlZmNudCBvZiAwIHRoZSBzdHJpbmcgZGVhbGxvY2F0aW9uCiAgICBmdW5jdGlvbiB3aWxsIGRlbGV0ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhpcyBkaWN0aW9uYXJ5LgogCi0gICBBbm90aGVyIHdheSB0byBsb29rIGF0IHRoaXMgaXMgdGhhdCB0byBzYXkgdGhhdCB0aGUgYWN0dWFsIHJlZmVyZW5jZSAKKyAgIEFub3RoZXIgd2F5IHRvIGxvb2sgYXQgdGhpcyBpcyB0aGF0IHRvIHNheSB0aGF0IHRoZSBhY3R1YWwgcmVmZXJlbmNlCiAgICBjb3VudCBvZiBhIHN0cmluZyBpczogIHMtPm9iX3JlZmNudCArIChzLT5vYl9zc3RhdGU/MjowKQogKi8KIHN0YXRpYyBQeU9iamVjdCAqaW50ZXJuZWQ7CkBAIC0xMDUsNyArMTA2LDcgQEAKIAogCWFzc2VydChzdHIgIT0gTlVMTCk7CiAJc2l6ZSA9IHN0cmxlbihzdHIpOwotCWlmIChzaXplID4gSU5UX01BWCkgeworCWlmIChzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkic3RyaW5nIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xODMsNyArMTg0LDcgQEAKIAkJCQkrK2Y7CiAJCQkvKiBsaWtld2lzZSBmb3IgJXpkICovCiAJCQlpZiAoKmYgPT0gJ3onICYmICooZisxKSA9PSAnZCcpCi0JCQkJKytmOwkJCQorCQkJCSsrZjsKIAogCQkJc3dpdGNoICgqZikgewogCQkJY2FzZSAnYyc6CkBAIC0yNzMsMTggKzI3NCw5IEBACiAJCQljYXNlICdkJzoKIAkJCQlpZiAobG9uZ2ZsYWcpCiAJCQkJCXNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwotCQkJCWVsc2UgaWYgKHNpemVfdGZsYWcpIHsKLQkJCQkJLyogSW5zdGVhZCBvZiBjaGVja2luZyB3aGV0aGVyIHRoZSBDCi0JCQkJCSAgIGxpYnJhcnkgc3VwcG9ydHMgJXpkLCBoYW5kbGUgdGhlCi0JCQkJCSAgIGNvbW1vbiBjYXNlcy4gKi8KLQkJCQkgICAgICAgICNpZiBTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9MT05HCi0JCQkJCXNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwotCQkJCQkjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCi0JCQkJCXNwcmludGYocywgIiVJZCIsIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7Ci0JCQkJCSNlbHNlCi0JCQkJCSNlcnJvciBDYW5ub3QgcHJpbnQgc2l6ZV90IHZhbHVlcwotCQkJCQkjZW5kaWYKLQkJCQl9CisJCQkJZWxzZSBpZiAoc2l6ZV90ZmxhZykKKwkJCQkJc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisJCQkJCSAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKIAkJCQllbHNlCiAJCQkJCXNwcmludGYocywgIiVkIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKIAkJCQlzICs9IHN0cmxlbihzKTsKQEAgLTU3OCw4ICs1NzAsOSBAQAogCQkJCWlmICghdykJZ290byBmYWlsZWQ7CiAKIAkJCQkvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLQkJCQlyID0gUHlTdHJpbmdfQXNTdHJpbmcodyk7Ci0JCQkJcm4gPSBQeVN0cmluZ19TaXplKHcpOworCQkJCWFzc2VydChQeVN0cmluZ19DaGVjayh3KSk7CisJCQkJciA9IFB5U3RyaW5nX0FTX1NUUklORyh3KTsKKwkJCQlybiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOwogCQkJCW1lbWNweShwLCByLCBybik7CiAJCQkJcCArPSBybjsKIAkJCQlQeV9ERUNSRUYodyk7CkBAIC02MjIsNyArNjE1LDcgQEAKIAkJCSpwKysgPSBjOwogCQkJYnJlYWs7CiAJCWNhc2UgJ3gnOgotCQkJaWYgKGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMF0pKSAKKwkJCWlmIChpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzBdKSkKIAkJCSAgICAmJiBpc3hkaWdpdChQeV9DSEFSTUFTSyhzWzFdKSkpIHsKIAkJCQl1bnNpZ25lZCBpbnQgeCA9IDA7CiAJCQkJYyA9IFB5X0NIQVJNQVNLKCpzKTsKQEAgLTY0Niw3ICs2MzksNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJaWYgKCFlcnJvcnMgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgCisJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAJCQkJCQkiaW52YWxpZCBcXHggZXNjYXBlIik7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CkBAIC03NTMsNyArNzQ2LDcgQEAKIAkqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhvYmopOwogCWlmIChsZW4gIT0gTlVMTCkKIAkJKmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7Ci0JZWxzZSBpZiAoc3RybGVuKCpzKSAhPSBQeVN0cmluZ19HRVRfU0laRShvYmopKSB7CisJZWxzZSBpZiAoc3RybGVuKCpzKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKG9iaikpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkiZXhwZWN0ZWQgc3RyaW5nIHdpdGhvdXQgbnVsbCBieXRlcyIpOwogCQlyZXR1cm4gLTE7CkBAIC04MjIsNyArODE1LDcgQEAKIAlyZWdpc3RlciBQeVN0cmluZ09iamVjdCogb3AgPSAoUHlTdHJpbmdPYmplY3QqKSBvYmo7CiAJc2l6ZV90IG5ld3NpemUgPSAyICsgNCAqIG9wLT5vYl9zaXplOwogCVB5T2JqZWN0ICp2OwotCWlmIChuZXdzaXplID4gSU5UX01BWCkgeworCWlmIChuZXdzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkic3RyaW5nIGlzIHRvbyBsYXJnZSB0byBtYWtlIHJlcHIiKTsKIAl9CkBAIC04MzgsNyArODMxLDcgQEAKIAogCQkvKiBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIHRvIHVzZTsgc2luZ2xlIGlzIHByZWZlcnJlZCAqLwogCQlxdW90ZSA9ICdcJyc7Ci0JCWlmIChzbWFydHF1b3RlcyAmJiAKKwkJaWYgKHNtYXJ0cXVvdGVzICYmCiAJCSAgICBtZW1jaHIob3AtPm9iX3N2YWwsICdcJycsIG9wLT5vYl9zaXplKSAmJgogCQkgICAgIW1lbWNocihvcC0+b2Jfc3ZhbCwgJyInLCBvcC0+b2Jfc2l6ZSkpCiAJCQlxdW90ZSA9ICciJzsKQEAgLTEwMDMsNyArOTk2LDcgQEAKIC8qIFN0cmluZyBzbGljZSBhW2k6al0gY29uc2lzdHMgb2YgY2hhcmFjdGVycyBhW2ldIC4uLiBhW2otMV0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLXN0cmluZ19zbGljZShyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCAKK3N0cmluZ19zbGljZShyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLAogCSAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBqKQogICAgICAvKiBqIC0tIG1heSBiZSBuZWdhdGl2ZSEgKi8KIHsKQEAgLTEwNDcsNyArMTA0MCw3IEBACiAKIAlpZiAobGVuX3N1YiA9PSAwKQogCQlyZXR1cm4gMTsKLQkvKiBsYXN0IHBvaW50cyB0byBvbmUgY2hhciBiZXlvbmQgdGhlIHN0YXJ0IG9mIHRoZSByaWdodG1vc3QgCisJLyogbGFzdCBwb2ludHMgdG8gb25lIGNoYXIgYmV5b25kIHRoZSBzdGFydCBvZiB0aGUgcmlnaHRtb3N0CiAJICAgc3Vic3RyaW5nLiAgV2hlbiBzPGxhc3QsIHRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGEgcG9zc2libGUgbWF0Y2gKIAkgICBhbmQgc1swXSB0aHJvdWdoIHNbbGVuX3N1Yi0xXSB3aWxsIGJlIGluIGJvdW5kcy4KIAkgICBzaG9ydHN1YiBpcyBsZW5fc3ViIG1pbnVzIHRoZSBsYXN0IGNoYXJhY3RlciB3aGljaCBpcyBjaGVja2VkCkBAIC0xMDU5LDcgKzEwNTIsNyBAQAogCWxhc3RjaGFyID0gc3ViW3Nob3J0c3ViXTsKIAlsYXN0ID0gcyArIFB5U3RyaW5nX0dFVF9TSVpFKGEpIC0gbGVuX3N1YiArIDE7CiAJd2hpbGUgKHMgPCBsYXN0KSB7Ci0JCXMgPSBtZW1jaHIocywgZmlyc3RjaGFyLCBsYXN0LXMpOworCQlzID0gKGNoYXIgKiltZW1jaHIocywgZmlyc3RjaGFyLCBsYXN0LXMpOwogCQlpZiAocyA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CiAJCWFzc2VydChzIDwgbGFzdCk7CkBAIC0xMjA3LDcgKzEyMDAsNyBAQAogCQljaGFyKiByZXN1bHRfYnVmOwogCQlQeU9iamVjdCogcmVzdWx0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgCisJCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKIAkJCQkgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCiAJCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewogCQkJcmV0dXJuIE5VTEw7CkBAIC0xMjE4LDIzICsxMjExLDIzIEBACiAJCX0KIAkJZWxzZSB7CiAJCQlzb3VyY2VfYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcoKFB5T2JqZWN0KilzZWxmKTsKLQkJCXJlc3VsdF9idWYgPSBQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOworCQkJcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuZ3RoKTsKIAkJCWlmIChyZXN1bHRfYnVmID09IE5VTEwpCiAJCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7IAorCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKIAkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewogCQkJCXJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07CiAJCQl9Ci0JCQkKLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsIAorCisJCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLAogCQkJCQkJCSAgICBzbGljZWxlbmd0aCk7CiAJCQlQeU1lbV9GcmVlKHJlc3VsdF9idWYpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQotCX0gCisJfQogCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkic3RyaW5nIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMzQwLDcgKzEzMzMsNyBAQAogCQlQeV9ERUNSRUYoc3RyKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLXNwbGl0X3doaXRlc3BhY2UoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGludCBtYXhzcGxpdCkKK3NwbGl0X3doaXRlc3BhY2UoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIFB5X3NzaXplX3QgbWF4c3BsaXQpCiB7CiAJUHlfc3NpemVfdCBpLCBqOwogCVB5T2JqZWN0ICpzdHI7CkBAIC0xMzc0LDcgKzEzNjcsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotc3BsaXRfY2hhcihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgaW50IG1heGNvdW50KQorc3BsaXRfY2hhcihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKIAlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7CiAJUHlPYmplY3QgKnN0cjsKQEAgLTE0MTUsMTQgKzE0MDgsMTQgQEAKIHsKIAlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuLCBpLCBqOwogCWludCBlcnI7Ci0JaW50IG1heHNwbGl0ID0gLTE7CisJUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7CiAJUHlPYmplY3QgKmxpc3QsICppdGVtLCAqc3Vib2JqID0gUHlfTm9uZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9pOnNwbGl0IiwgJnN1Ym9iaiwgJm1heHNwbGl0KSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCiAJCXJldHVybiBOVUxMOwogCWlmIChtYXhzcGxpdCA8IDApCi0JCW1heHNwbGl0ID0gSU5UX01BWDsKKwkJbWF4c3BsaXQgPSBQWV9TU0laRV9UX01BWDsKIAlpZiAoc3Vib2JqID09IFB5X05vbmUpCiAJCXJldHVybiBzcGxpdF93aGl0ZXNwYWNlKHMsIGxlbiwgbWF4c3BsaXQpOwogCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CkBAIC0xNDgwLDcgKzE0NzMsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotcnNwbGl0X3doaXRlc3BhY2UoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGludCBtYXhzcGxpdCkKK3JzcGxpdF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewogCVB5X3NzaXplX3QgaSwgajsKIAlQeU9iamVjdCAqc3RyOwpAQCAtMTUxNCw3ICsxNTA3LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXJzcGxpdF9jaGFyKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGNoLCBpbnQgbWF4Y291bnQpCityc3BsaXRfY2hhcihjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgY2hhciBjaCwgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKIAlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7CiAJUHlPYmplY3QgKnN0cjsKQEAgLTE1NTYsMTQgKzE1NDksMTQgQEAKIHsKIAlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuLCBpLCBqOwogCWludCBlcnI7Ci0JaW50IG1heHNwbGl0ID0gLTE7CisJUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWI7CiAJUHlPYmplY3QgKmxpc3QsICppdGVtLCAqc3Vib2JqID0gUHlfTm9uZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9pOnJzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246cnNwbGl0IiwgJnN1Ym9iaiwgJm1heHNwbGl0KSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKG1heHNwbGl0IDwgMCkKLQkJbWF4c3BsaXQgPSBJTlRfTUFYOworCQltYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOwogCWlmIChzdWJvYmogPT0gUHlfTm9uZSkKIAkJcmV0dXJuIHJzcGxpdF93aGl0ZXNwYWNlKHMsIGxlbiwgbWF4c3BsaXQpOwogCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CkBAIC0xNjYxLDcgKzE2NTQsNyBAQAogCX0KIAogCS8qIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdGhpbmdzIHRvIGpvaW4sIG9yIGVsc2Ugd2UgaGF2ZSBhIHN1YmNsYXNzCi0JICogb2YgdGhlIGJ1aWx0aW4gdHlwZXMgaW4gdGhlIHNlcXVlbmNlLiAgCisJICogb2YgdGhlIGJ1aWx0aW4gdHlwZXMgaW4gdGhlIHNlcXVlbmNlLgogCSAqIERvIGEgcHJlLXBhc3MgdG8gZmlndXJlIG91dCB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIHdlJ2xsCiAJICogbmVlZCAoc3opLCBzZWUgd2hldGhlciBhbnkgYXJndW1lbnQgaXMgYWJzdXJkLCBhbmQgZGVmZXIgdG8KIAkgKiB0aGUgVW5pY29kZSBqb2luIGlmIGFwcHJvcHJpYXRlLgpAQCAtMTY4NCwxNiArMTY3NywxNiBAQAogCQkJfQogI2VuZGlmCiAJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInNlcXVlbmNlIGl0ZW0gJWk6IGV4cGVjdGVkIHN0cmluZywiCisJCQkJICAgICAic2VxdWVuY2UgaXRlbSAlemQ6IGV4cGVjdGVkIHN0cmluZywiCiAJCQkJICAgICAiICUuODBzIGZvdW5kIiwKLQkJCQkgICAgIC8qWFhYKi8oaW50KWksIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOworCQkJCSAgICAgaSwgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCQlQeV9ERUNSRUYoc2VxKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCXN6ICs9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOwogCQlpZiAoaSAhPSAwKQogCQkJc3ogKz0gc2VwbGVuOwotCQlpZiAoc3ogPCBvbGRfc3ogfHwgc3ogPiBJTlRfTUFYKSB7CisJCWlmIChzeiA8IG9sZF9zeiB8fCBzeiA+IFBZX1NTSVpFX1RfTUFYKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKIAkJCQkiam9pbigpIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKIAkJCVB5X0RFQ1JFRihzZXEpOwpAQCAtMTc1NCw3ICsxNzQ3LDcgQEAKIHsKIAljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwogCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlfc3NpemVfdCBuLCBpID0gMCwgbGFzdCA9IElOVF9NQVg7CisJUHlfc3NpemVfdCBuLCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwogCVB5T2JqZWN0ICpzdWJvYmo7CiAKIAkvKiBYWFggc3NpemVfdCBpICovCkBAIC0xOTYwLDE3ICsxOTUzLDE0IEBACiAJCQlyZXR1cm4gcmVzOwogCQl9CiAjZW5kaWYKLQkJZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSIsCisJCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSIsCiAjZWxzZQotCQkJCSAgICAgIiVzIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyIiwKKwkJCSAgICAgIiVzIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyIiwKICNlbmRpZgotCQkJCSAgICAgU1RSSVBOQU1FKHN0cmlwdHlwZSkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGRvX3hzdHJpcChzZWxmLCBzdHJpcHR5cGUsIHNlcCk7CisJCQkgICAgIFNUUklQTkFNRShzdHJpcHR5cGUpKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcmV0dXJuIGRvX3N0cmlwKHNlbGYsIHN0cmlwdHlwZSk7CkBAIC0yMDM5LDEyICsyMDI5LDEyIEBACiB7CiAJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld29iajsKIAotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3b2JqID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwogCQlpZiAoaXN1cHBlcihjKSkgewpAQCAtMjA1Myw3ICsyMDQzLDcgQEAKIAkJCSpzX25ldyA9IGM7CiAJCXNfbmV3Kys7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogCkBAIC0yMDY3LDEyICsyMDU3LDEyIEBACiB7CiAJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld29iajsKIAotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3b2JqID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwogCQlpZiAoaXNsb3dlcihjKSkgewpAQCAtMjA4MSw3ICsyMDcxLDcgQEAKIAkJCSpzX25ldyA9IGM7CiAJCXNfbmV3Kys7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogCkBAIC0yMDk3LDEyICsyMDg3LDEyIEBACiAJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCWludCBwcmV2aW91c19pc19jYXNlZCA9IDA7Ci0JUHlPYmplY3QgKm5ldzsKKwlQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworCWlmIChuZXdvYmogPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXcpOworCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CiAJCWlmIChpc2xvd2VyKGMpKSB7CkBAIC0yMTE3LDcgKzIxMDcsNyBAQAogCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAwOwogCQkqc19uZXcrKyA9IGM7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKGNhcGl0YWxpemVfX2RvY19fLApAQCAtMjEzMSwxMiArMjEyMSwxMiBAQAogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKIAlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3OworCVB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3ID09IE5VTEwpCisJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisJaWYgKG5ld29iaiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ldyk7CisJc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOwogCWlmICgwIDwgbikgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwogCQlpZiAoaXNsb3dlcihjKSkKQEAgLTIxNTMsNyArMjE0Myw3IEBACiAJCQkqc19uZXcgPSBjOwogCQlzX25ldysrOwogCX0KLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjE2OSw3ICsyMTU5LDcgQEAKIHsKIAljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViLCAqdDsKIAlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuOwotCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBJTlRfTUFYOworCVB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKIAlQeV9zc2l6ZV90IG0sIHI7CiAJUHlPYmplY3QgKnN1Ym9iajsKIApAQCAtMjIxMCw3ICsyMjAwLDcgQEAKIAkJfQogCQlpZiAoaSA+PSBtKQogCQkJYnJlYWs7Ci0JCXQgPSBtZW1jaHIocytpLCBzdWJbMF0sIG0taSk7CisJCXQgPSAoY29uc3QgY2hhciAqKW1lbWNocihzK2ksIHN1YlswXSwgbS1pKTsKIAkJaWYgKHQgPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlpID0gdCAtIHM7CkBAIC0yMjI5LDEyICsyMjE5LDEyIEBACiB7CiAJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwogCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICpuZXc7CisJUHlPYmplY3QgKm5ld29iajsKIAotCW5ldyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXcgPT0gTlVMTCkKKwluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKwlpZiAobmV3b2JqID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3KTsKKwlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwogCQlpZiAoaXNsb3dlcihjKSkgewpAQCAtMjI0Nyw3ICsyMjM3LDcgQEAKIAkJCSpzX25ldyA9IGM7CiAJCXNfbmV3Kys7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogCkBAIC0yMzIzLDEyICsyMzEzLDEyIEBACiAJfQogCiAJdGFibGUgPSB0YWJsZTE7Ci0JaW5sZW4gPSBQeVN0cmluZ19TaXplKGlucHV0X29iaik7CisJaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOwogCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOwogCWlmIChyZXN1bHQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKLQlpbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKGlucHV0X29iaik7CisJaW5wdXQgPSBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRfb2JqKTsKIAogCWlmIChkZWxsZW4gPT0gMCkgewogCQkvKiBJZiBubyBkZWxldGlvbnMgYXJlIHJlcXVpcmVkLCB1c2UgZmFzdGVyIGNvZGUgKi8KQEAgLTI0NTcsNyArMjQ0Nyw3IEBACiAJLyogZmluZCBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyAqLwogCW5mb3VuZCA9IChwYXRfbGVuID4gMCkgPyBteW1lbWNudChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKSA6IGxlbiArIDE7CiAJaWYgKGNvdW50IDwgMCkKLQkJY291bnQgPSBJTlRfTUFYOworCQljb3VudCA9IFBZX1NTSVpFX1RfTUFYOwogCWVsc2UgaWYgKG5mb3VuZCA+IGNvdW50KQogCQluZm91bmQgPSBjb3VudDsKIAlpZiAobmZvdW5kID09IDApCkBAIC0yNTM0LDExICsyNTI0LDExIEBACiAJY2hhciAqbmV3X3M7CiAJY29uc3QgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAlQeV9zc2l6ZV90IHN1Yl9sZW4sIHJlcGxfbGVuLCBvdXRfbGVuOwotCWludCBjb3VudCA9IC0xOwotCVB5T2JqZWN0ICpuZXc7CisJUHlfc3NpemVfdCBjb3VudCA9IC0xOworCVB5T2JqZWN0ICpuZXdvYmo7CiAJUHlPYmplY3QgKnN1Ym9iaiwgKnJlcGxvYmo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfGk6cmVwbGFjZSIsCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLAogCQkJICAgICAgJnN1Ym9iaiwgJnJlcGxvYmosICZjb3VudCkpCiAJCXJldHVybiBOVUxMOwogCkBAIC0yNTc0LDIwICsyNTY0LDIwIEBACiAJaWYgKG91dF9sZW4gPT0gLTEpIHsKIAkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKIAkJCS8qIHdlJ3JlIHJldHVybmluZyBhbm90aGVyIHJlZmVyZW5jZSB0byBzZWxmICovCi0JCQluZXcgPSAoUHlPYmplY3QqKXNlbGY7Ci0JCQlQeV9JTkNSRUYobmV3KTsKKwkJCW5ld29iaiA9IChQeU9iamVjdCopc2VsZjsKKwkJCVB5X0lOQ1JFRihuZXdvYmopOwogCQl9CiAJCWVsc2UgewotCQkJbmV3ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBsZW4pOwotCQkJaWYgKG5ldyA9PSBOVUxMKQorCQkJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBsZW4pOworCQkJaWYgKG5ld29iaiA9PSBOVUxMKQogCQkJCXJldHVybiBOVUxMOwogCQl9CiAJfQogCWVsc2UgewotCQluZXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7CisJCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5ld19zLCBvdXRfbGVuKTsKIAkJUHlNZW1fRlJFRShuZXdfcyk7CiAJfQotCXJldHVybiBuZXc7CisJcmV0dXJuIG5ld29iajsKIH0KIAogCkBAIC0yNjA2LDcgKzI1OTYsNyBAQAogCWNvbnN0IGNoYXIqIHByZWZpeDsKIAlQeV9zc2l6ZV90IHBsZW47CiAJUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0JUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworCVB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlPYmplY3QgKnN1Ym9iajsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnN0YXJ0c3dpdGgiLCAmc3Vib2JqLApAQCAtMjY1Nyw3ICsyNjQ3LDcgQEAKIAljb25zdCBjaGFyKiBzdWZmaXg7CiAJUHlfc3NpemVfdCBzbGVuOwogCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwotCVB5X3NzaXplX3QgZW5kID0gSU5UX01BWDsKKwlQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCVB5T2JqZWN0ICpzdWJvYmo7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJvYmosCkBAIC0yNzExLDcgKzI3MDEsNyBAQAogICAgIGNoYXIgKmVuY29kaW5nID0gTlVMTDsKICAgICBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp2OwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c3M6ZW5jb2RlIiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgoUHlPYmplY3QgKilzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKQEAgLTI3NDgsNyArMjczOCw3IEBACiAgICAgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzczpkZWNvZGUiLCAmZW5jb2RpbmcsICZlcnJvcnMpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KChQeU9iamVjdCAqKXNlbGYsIGVuY29kaW5nLCBlcnJvcnMpOwpAQCAtMjg3MCwxMCArMjg2MCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19sanVzdChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgaW50IHdpZHRoOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxjOmxqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOmxqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CkBAIC0yODk0LDEwICsyODg0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JqdXN0KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBpbnQgd2lkdGg7CisgICAgUHlfc3NpemVfdCB3aWR0aDsKICAgICBjaGFyIGZpbGxjaGFyID0gJyAnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGM6cmp1c3QiLCAmd2lkdGgsICZmaWxsY2hhcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6cmp1c3QiLCAmd2lkdGgsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKQEAgLTI5MTksMTAgKzI5MDksMTAgQEAKIHN0cmluZ19jZW50ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5X3NzaXplX3QgbWFyZywgbGVmdDsKLSAgICBsb25nIHdpZHRoOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibHxjOmNlbnRlciIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpjZW50ZXIiLCAmd2lkdGgsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKQEAgLTI5NDgsOSArMjkzOCw5IEBACiAgICAgUHlfc3NpemVfdCBmaWxsOwogICAgIFB5T2JqZWN0ICpzOwogICAgIGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCB3aWR0aDsKIAotICAgIGxvbmcgd2lkdGg7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnpmaWxsIiwgJndpZHRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46emZpbGwiLCAmd2lkdGgpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCkgewpAQCAtMzQ2NywyMiArMzQ1NywyMiBAQAogCSJzdHIiLAogCXNpemVvZihQeVN0cmluZ09iamVjdCksCiAJc2l6ZW9mKGNoYXIpLAotIAkoZGVzdHJ1Y3RvcilzdHJpbmdfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCisgCXN0cmluZ19kZWFsbG9jLCAJCQkvKiB0cF9kZWFsbG9jICovCiAJKHByaW50ZnVuYylzdHJpbmdfcHJpbnQsIAkJLyogdHBfcHJpbnQgKi8KIAkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCiAJMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc3RyaW5nX3JlcHIsIAkJCS8qIHRwX3JlcHIgKi8KKwlzdHJpbmdfcmVwciwgCQkJCS8qIHRwX3JlcHIgKi8KIAkmc3RyaW5nX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KIAkmc3RyaW5nX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCiAJJnN0cmluZ19hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KIAkoaGFzaGZ1bmMpc3RyaW5nX2hhc2gsIAkJCS8qIHRwX2hhc2ggKi8KIAkwLAkJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylzdHJpbmdfc3RyLAkJCS8qIHRwX3N0ciAqLworCXN0cmluZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwogCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KIAkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KIAkmc3RyaW5nX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfCAKKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAogCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KIAlzdHJpbmdfZG9jLAkJCQkvKiB0cF9kb2MgKi8KIAkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KQEAgLTM2MzUsNyArMzYyNSw3IEBACiAJICAgICBsZW4gPSAxICsgNTAgKyAxICsgcHJlYyA9IDUyICsgcHJlYwogCiAJICAgSWYgcHJlYz0wIHRoZSBlZmZlY3RpdmUgcHJlY2lzaW9uIGlzIDEgKHRoZSBsZWFkaW5nIGRpZ2l0IGlzCi0JICAgYWx3YXlzIGdpdmVuKSwgdGhlcmVmb3JlIGluY3JlYXNlIHRoZSBsZW5ndGggYnkgb25lLiAKKwkgICBhbHdheXMgZ2l2ZW4pLCB0aGVyZWZvcmUgaW5jcmVhc2UgdGhlIGxlbmd0aCBieSBvbmUuCiAKIAkqLwogCWlmICgodHlwZSA9PSAnZycgJiYgYnVmbGVuIDw9IChzaXplX3QpMTAgKyAoc2l6ZV90KXByZWMpIHx8CkBAIC0zNzExLDcgKzM3MDEsNyBAQAogCX0KIAlidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwogCWxsZW4gPSBQeVN0cmluZ19TaXplKHJlc3VsdCk7Ci0JaWYgKGxsZW4gPiBJTlRfTUFYKSB7CisJaWYgKGxsZW4gPiBQWV9TU0laRV9UX01BWCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmluZyB0b28gbGFyZ2UgaW4gX1B5U3RyaW5nX0Zvcm1hdExvbmciKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDQzOSw3ICs0NDI5LDcgQEAKIAkgICBkZXRlY3RvciwgaW50ZXJuZWQgc3RyaW5ncyBhcmUgbm90IGZvcmNpYmx5IGRlYWxsb2NhdGVkOyByYXRoZXIsIHdlCiAJICAgZ2l2ZSB0aGVtIHRoZWlyIHN0b2xlbiByZWZlcmVuY2VzIGJhY2ssIGFuZCB0aGVuIGNsZWFyIGFuZCBERUNSRUYKIAkgICB0aGUgaW50ZXJuZWQgZGljdC4gKi8KLQkgICAKKwogCWZwcmludGYoc3RkZXJyLCAicmVsZWFzaW5nIGludGVybmVkIHN0cmluZ3NcbiIpOwogCW4gPSBQeUxpc3RfR0VUX1NJWkUoa2V5cyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYyBiL09iamVjdHMvc3RydWN0c2VxLmMKaW5kZXggMjE4ZDBiNC4uZTA3NDgxMCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYworKysgYi9PYmplY3RzL3N0cnVjdHNlcS5jCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCiAJJnN0cnVjdHNlcV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwogCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKXN0cnVjdHNlcV9oYXNoLCAgICAgICAgICAgICAgCS8qIHRwX2hhc2ggKi8KKwlzdHJ1Y3RzZXFfaGFzaCwJCQkJLyogdHBfaGFzaCAqLwogCTAsICAgICAgICAgICAgICAJCQkvKiB0cF9jYWxsICovCiAJMCwJCQkJCS8qIHRwX3N0ciAqLwogCTAsICAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2dldGF0dHJvICovCkBAIC0zNDksNiArMzQ5LDE0IEBACiAJUHlNZW1iZXJEZWYqIG1lbWJlcnM7CiAJaW50IG5fbWVtYmVycywgbl91bm5hbWVkX21lbWJlcnMsIGksIGs7CiAKKyNpZmRlZiBQeV9UUkFDRV9SRUZTCisJLyogaWYgdGhlIHR5cGUgb2JqZWN0IHdhcyBjaGFpbmVkLCB1bmNoYWluIGl0IGZpcnN0CisJICAgYmVmb3JlIG92ZXJ3cml0aW5nIGl0cyBzdG9yYWdlICovCisJaWYgKHR5cGUtPl9vYl9uZXh0KSB7CisJCV9QeV9Gb3JnZXRSZWZlcmVuY2UoKFB5T2JqZWN0Kil0eXBlKTsKKwl9CisjZW5kaWYKKwogCW5fdW5uYW1lZF9tZW1iZXJzID0gMDsKIAlmb3IgKGkgPSAwOyBkZXNjLT5maWVsZHNbaV0ubmFtZSAhPSBOVUxMOyArK2kpCiAJCWlmIChkZXNjLT5maWVsZHNbaV0ubmFtZSA9PSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCkKZGlmZiAtLWdpdCBhL09iamVjdHMvdHVwbGVvYmplY3QuYyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwppbmRleCAzODRiMzU1Li4yMTYxYWI5IDEwMDY0NAotLS0gYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90dXBsZW9iamVjdC5jCkBAIC00MzgsMTYgKzQzOCw5IEBACiB0dXBsZXRyYXZlcnNlKFB5VHVwbGVPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqeDsKIAotCWZvciAoaSA9IG8tPm9iX3NpemU7IC0taSA+PSAwOyApIHsKLQkJeCA9IG8tPm9iX2l0ZW1baV07Ci0JCWlmICh4ICE9IE5VTEwpIHsKLQkJCWludCBlcnIgPSB2aXNpdCh4LCBhcmcpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQorCWZvciAoaSA9IG8tPm9iX3NpemU7IC0taSA+PSAwOyApCisJCVB5X1ZJU0lUKG8tPm9iX2l0ZW1baV0pOwogCXJldHVybiAwOwogfQogCkBAIC01NDcsNyArNTQwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZV9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3LCAqaXRlbTsKKwlQeU9iamVjdCAqdG1wLCAqbmV3b2JqLCAqaXRlbTsKIAlQeV9zc2l6ZV90IGksIG47CiAKIAlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUdXBsZV9UeXBlKSk7CkBAIC01NTUsMTYgKzU0OCwxNiBAQAogCWlmICh0bXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJYXNzZXJ0KFB5VHVwbGVfQ2hlY2sodG1wKSk7Ci0JbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgbiA9IFB5VHVwbGVfR0VUX1NJWkUodG1wKSk7Ci0JaWYgKG5ldyA9PSBOVUxMKQorCW5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHRtcCkpOworCWlmIChuZXdvYmogPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTSh0bXAsIGkpOwogCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3LCBpLCBpdGVtKTsKKwkJUHlUdXBsZV9TRVRfSVRFTShuZXdvYmosIGksIGl0ZW0pOwogCX0KIAlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3OworCXJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUih0dXBsZV9kb2MsCkBAIC02MTUsNiArNjA4LDcgQEAKIAkJfQogCQllbHNlIHsKIAkJCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuZ3RoKTsKKwkJCWlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKIAogCQkJc3JjID0gc2VsZi0+b2JfaXRlbTsKIAkJCWRlc3QgPSAoKFB5VHVwbGVPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOwpAQCAtNzkwLDI3ICs3ODQsNiBAQAogCVB5VHVwbGVPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gdHVwbGVpdGVyb2JqZWN0OwogCi1QeVR5cGVPYmplY3QgUHlUdXBsZUl0ZXJfVHlwZTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXR1cGxlX2l0ZXIoUHlPYmplY3QgKnNlcSkKLXsKLQl0dXBsZWl0ZXJvYmplY3QgKml0OwotCi0JaWYgKCFQeVR1cGxlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X0dDX05ldyh0dXBsZWl0ZXJvYmplY3QsICZQeVR1cGxlSXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gKFB5VHVwbGVPYmplY3QgKilzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7Ci19Ci0KIHN0YXRpYyB2b2lkCiB0dXBsZWl0ZXJfZGVhbGxvYyh0dXBsZWl0ZXJvYmplY3QgKml0KQogewpAQCAtODIyLDkgKzc5NSw4IEBACiBzdGF0aWMgaW50CiB0dXBsZWl0ZXJfdHJhdmVyc2UodHVwbGVpdGVyb2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHZpc2l0KChQeU9iamVjdCAqKWl0LT5pdF9zZXEsIGFyZyk7CisJUHlfVklTSVQoaXQtPml0X3NlcSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC05MDAsMyArODcyLDIyIEBACiAJdHVwbGVpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwogCTAsCiB9OworCitzdGF0aWMgUHlPYmplY3QgKgordHVwbGVfaXRlcihQeU9iamVjdCAqc2VxKQoreworCXR1cGxlaXRlcm9iamVjdCAqaXQ7CisKKwlpZiAoIVB5VHVwbGVfQ2hlY2soc2VxKSkgeworCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWl0ID0gUHlPYmplY3RfR0NfTmV3KHR1cGxlaXRlcm9iamVjdCwgJlB5VHVwbGVJdGVyX1R5cGUpOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpdC0+aXRfaW5kZXggPSAwOworCVB5X0lOQ1JFRihzZXEpOworCWl0LT5pdF9zZXEgPSAoUHlUdXBsZU9iamVjdCAqKXNlcTsKKwlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOworCXJldHVybiAoUHlPYmplY3QgKilpdDsKK30KZGlmZiAtLWdpdCBhL09iamVjdHMvdHlwZW9iamVjdC5jIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKaW5kZXggYzAyZjA2MC4uNGNhZjUzOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy90eXBlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCWlmIChQeVR5cGVfSVNfR0ModHlwZSkpCiAJCW9iaiA9IF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZSk7CiAJZWxzZQotCQlvYmogPSBQeU9iamVjdF9NQUxMT0Moc2l6ZSk7CisJCW9iaiA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplKTsKIAogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CkBAIC01MjUsMjEgKzUyNSwxNSBAQAogCiAJaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gYmFzZS0+dHBfZGljdG9mZnNldCkgewogCQlQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKLQkJaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIpIHsKLQkJCWludCBlcnIgPSB2aXNpdCgqZGljdHB0ciwgYXJnKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQorCQlpZiAoZGljdHB0ciAmJiAqZGljdHB0cikKKwkJCVB5X1ZJU0lUKCpkaWN0cHRyKTsKIAl9CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7CisJaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKIAkJLyogRm9yIGEgaGVhcHR5cGUsIHRoZSBpbnN0YW5jZXMgY291bnQgYXMgcmVmZXJlbmNlcwogCQkgICB0byB0aGUgdHlwZS4gIFRyYXZlcnNlIHRoZSB0eXBlIHNvIHRoZSBjb2xsZWN0b3IKIAkJICAgY2FuIGZpbmQgY3ljbGVzIGludm9sdmluZyB0aGlzIGxpbmsuICovCi0JCWludCBlcnIgPSB2aXNpdCgoUHlPYmplY3QgKil0eXBlLCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9CisJCVB5X1ZJU0lUKHR5cGUpOwogCiAJaWYgKGJhc2V0cmF2ZXJzZSkKIAkJcmV0dXJuIGJhc2V0cmF2ZXJzZShzZWxmLCB2aXNpdCwgYXJnKTsKQEAgLTU1OSw4ICs1NTMsOCBAQAogCQkJY2hhciAqYWRkciA9IChjaGFyICopc2VsZiArIG1wLT5vZmZzZXQ7CiAJCQlQeU9iamVjdCAqb2JqID0gKihQeU9iamVjdCAqKilhZGRyOwogCQkJaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKG9iaik7CiAJCQkJKihQeU9iamVjdCAqKilhZGRyID0gTlVMTDsKKwkJCQlQeV9ERUNSRUYob2JqKTsKIAkJCX0KIAkJfQogCX0KQEAgLTExMDYsMTQgKzExMDAsMTcgQEAKIAljaGFyIGJ1ZlsxMDAwXTsKIAlQeU9iamVjdCAqaywgKnY7CiAJUHlPYmplY3QgKnNldCA9IFB5RGljdF9OZXcoKTsKKwlpZiAoIXNldCkgcmV0dXJuOwogCiAJdG9fbWVyZ2Vfc2l6ZSA9IFB5TGlzdF9HRVRfU0laRSh0b19tZXJnZSk7CiAJZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykgewogCQlQeU9iamVjdCAqTCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaSk7CiAJCWlmIChyZW1haW5baV0gPCBQeUxpc3RfR0VUX1NJWkUoTCkpIHsKIAkJCVB5T2JqZWN0ICpjID0gUHlMaXN0X0dFVF9JVEVNKEwsIHJlbWFpbltpXSk7Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2V0LCBjLCBQeV9Ob25lKSA8IDApCisJCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2V0LCBjLCBQeV9Ob25lKSA8IDApIHsKKwkJCQlQeV9ERUNSRUYoc2V0KTsKIAkJCQlyZXR1cm47CisJCQl9CiAJCX0KIAl9CiAJbiA9IFB5RGljdF9TaXplKHNldCk7CkBAIC0xMTIxLDEyICsxMTE4LDEyIEBACiAJb2ZmID0gUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQ2Fubm90IGNyZWF0ZSBhIFwKIGNvbnNpc3RlbnQgbWV0aG9kIHJlc29sdXRpb25cbm9yZGVyIChNUk8pIGZvciBiYXNlcyIpOwogCWkgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChzZXQsICZpLCAmaywgJnYpICYmIG9mZiA8IHNpemVvZihidWYpKSB7CisJd2hpbGUgKFB5RGljdF9OZXh0KHNldCwgJmksICZrLCAmdikgJiYgKHNpemVfdClvZmYgPCBzaXplb2YoYnVmKSkgewogCQlQeU9iamVjdCAqbmFtZSA9IGNsYXNzX25hbWUoayk7CiAJCW9mZiArPSBQeU9TX3NucHJpbnRmKGJ1ZiArIG9mZiwgc2l6ZW9mKGJ1ZikgLSBvZmYsICIgJXMiLAogCQkJCSAgICAgbmFtZSA/IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSA6ICI/Iik7CiAJCVB5X1hERUNSRUYobmFtZSk7Ci0JCWlmICgtLW4gJiYgb2ZmKzEgPCBzaXplb2YoYnVmKSkgeworCQlpZiAoLS1uICYmIChzaXplX3QpKG9mZisxKSA8IHNpemVvZihidWYpKSB7CiAJCQlidWZbb2ZmKytdID0gJywnOwogCQkJYnVmW29mZl0gPSAnXDAnOwogCQl9CkBAIC0xMTQ3LDcgKzExNDQsNyBAQAogCSAgIHJlbWFpbltpXSBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgYmFzZSBpbiB0b19tZXJnZVtpXQogCSAgIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIGFjYy4KIAkqLwotCXJlbWFpbiA9IFB5TWVtX01BTExPQyhTSVpFT0ZfSU5UKnRvX21lcmdlX3NpemUpOworCXJlbWFpbiA9IChpbnQgKilQeU1lbV9NQUxMT0MoU0laRU9GX0lOVCp0b19tZXJnZV9zaXplKTsKIAlpZiAocmVtYWluID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKQpAQCAtMTg5Myw3ICsxODkwLDcgQEAKIAkJUHlPYmplY3QgKmRvYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RvY19fIik7CiAJCWlmIChkb2MgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhkb2MpKSB7CiAJCQljb25zdCBzaXplX3QgbiA9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUoZG9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRwX2RvYyA9IFB5T2JqZWN0X01BTExPQyhuKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdHBfZG9jID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobisxKTsKIAkJCWlmICh0cF9kb2MgPT0gTlVMTCkgewogCQkJCVB5X0RFQ1JFRih0eXBlKTsKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTIxOTUsNTEgKzIxOTIsMzEgQEAKIHN0YXRpYyBpbnQKIHR5cGVfdHJhdmVyc2UoUHlUeXBlT2JqZWN0ICp0eXBlLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpbnQgZXJyOwotCiAJLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCiAJICAgZm9yIGhlYXB0eXBlcy4gKi8KIAlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKIAotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQotCVZJU0lUKHR5cGUtPnRwX2RpY3QpOwotCVZJU0lUKHR5cGUtPnRwX2NhY2hlKTsKLQlWSVNJVCh0eXBlLT50cF9tcm8pOwotCVZJU0lUKHR5cGUtPnRwX2Jhc2VzKTsKLQlWSVNJVCh0eXBlLT50cF9iYXNlKTsKKwlQeV9WSVNJVCh0eXBlLT50cF9kaWN0KTsKKwlQeV9WSVNJVCh0eXBlLT50cF9jYWNoZSk7CisJUHlfVklTSVQodHlwZS0+dHBfbXJvKTsKKwlQeV9WSVNJVCh0eXBlLT50cF9iYXNlcyk7CisJUHlfVklTSVQodHlwZS0+dHBfYmFzZSk7CiAKIAkvKiBUaGVyZSdzIG5vIG5lZWQgdG8gdmlzaXQgdHlwZS0+dHBfc3ViY2xhc3NlcyBvcgogCSAgICgoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGUpLT5odF9zbG90cywgYmVjYXVzZSB0aGV5IGNhbid0IGJlIGludm9sdmVkCiAJICAgaW4gY3ljbGVzOyB0cF9zdWJjbGFzc2VzIGlzIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMsCiAJICAgYW5kIHNsb3RzIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4gKi8KIAotI3VuZGVmIFZJU0lUCi0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdHlwZV9jbGVhcihQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKnRtcDsKLQogCS8qIEJlY2F1c2Ugb2YgdHlwZV9pc19nYygpLCB0aGUgY29sbGVjdG9yIG9ubHkgY2FsbHMgdGhpcwogCSAgIGZvciBoZWFwdHlwZXMuICovCiAJYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CiAKLSNkZWZpbmUgQ0xFQVIoU0xPVCkgXAotCWlmIChTTE9UKSB7IFwKLQkJdG1wID0gKFB5T2JqZWN0ICopKFNMT1QpOyBcCi0JCVNMT1QgPSBOVUxMOyBcCi0JCVB5X0RFQ1JFRih0bXApOyBcCi0JfQotCiAJLyogVGhlIG9ubHkgZmllbGQgd2UgbmVlZCB0byBjbGVhciBpcyB0cF9tcm8sIHdoaWNoIGlzIHBhcnQgb2YgYQogCSAgIGhhcmQgY3ljbGUgKGl0cyBmaXJzdCBlbGVtZW50IGlzIHRoZSBjbGFzcyBpdHNlbGYpIHRoYXQgd29uJ3QKIAkgICBiZSBicm9rZW4gb3RoZXJ3aXNlIChpdCdzIGEgdHVwbGUgYW5kIHR1cGxlcyBkb24ndCBoYXZlIGEKQEAgLTIyNjUsOSArMjI0Miw3IEBACiAJICAgICAgIEEgdHVwbGUgb2Ygc3RyaW5ncyBjYW4ndCBiZSBwYXJ0IG9mIGEgY3ljbGUuCiAJKi8KIAotCUNMRUFSKHR5cGUtPnRwX21ybyk7Ci0KLSN1bmRlZiBDTEVBUgorCVB5X0NMRUFSKHR5cGUtPnRwX21ybyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NDMsMjMgKzI0MTgsMjMgQEAKIH0KIAogc3RhdGljIGludAotY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZCwgUHlUeXBlT2JqZWN0KiBuZXcsIGNoYXIqIGF0dHIpCitjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCogb2xkdG8sIFB5VHlwZU9iamVjdCogbmV3dG8sIGNoYXIqIGF0dHIpCiB7CiAJUHlUeXBlT2JqZWN0ICpuZXdiYXNlLCAqb2xkYmFzZTsKIAotCWlmIChuZXctPnRwX2RlYWxsb2MgIT0gb2xkLT50cF9kZWFsbG9jIHx8Ci0JICAgIG5ldy0+dHBfZnJlZSAhPSBvbGQtPnRwX2ZyZWUpCisJaWYgKG5ld3RvLT50cF9kZWFsbG9jICE9IG9sZHRvLT50cF9kZWFsbG9jIHx8CisJICAgIG5ld3RvLT50cF9mcmVlICE9IG9sZHRvLT50cF9mcmVlKQogCXsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKIAkJCSAgICAgIiVzIGFzc2lnbm1lbnQ6ICIKIAkJCSAgICAgIiclcycgZGVhbGxvY2F0b3IgZGlmZmVycyBmcm9tICclcyciLAogCQkJICAgICBhdHRyLAotCQkJICAgICBuZXctPnRwX25hbWUsCi0JCQkgICAgIG9sZC0+dHBfbmFtZSk7CisJCQkgICAgIG5ld3RvLT50cF9uYW1lLAorCQkJICAgICBvbGR0by0+dHBfbmFtZSk7CiAJCXJldHVybiAwOwogCX0KLQluZXdiYXNlID0gbmV3OwotCW9sZGJhc2UgPSBvbGQ7CisJbmV3YmFzZSA9IG5ld3RvOworCW9sZGJhc2UgPSBvbGR0bzsKIAl3aGlsZSAoZXF1aXZfc3RydWN0cyhuZXdiYXNlLCBuZXdiYXNlLT50cF9iYXNlKSkKIAkJbmV3YmFzZSA9IG5ld2Jhc2UtPnRwX2Jhc2U7CiAJd2hpbGUgKGVxdWl2X3N0cnVjdHMob2xkYmFzZSwgb2xkYmFzZS0+dHBfYmFzZSkpCkBAIC0yNDcxLDggKzI0NDYsOCBAQAogCQkJICAgICAiJXMgYXNzaWdubWVudDogIgogCQkJICAgICAiJyVzJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnJXMnIiwKIAkJCSAgICAgYXR0ciwKLQkJCSAgICAgbmV3LT50cF9uYW1lLAotCQkJICAgICBvbGQtPnRwX25hbWUpOworCQkJICAgICBuZXd0by0+dHBfbmFtZSwKKwkJCSAgICAgb2xkdG8tPnRwX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI0ODIsOCArMjQ1Nyw4IEBACiBzdGF0aWMgaW50CiBvYmplY3Rfc2V0X2NsYXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlUeXBlT2JqZWN0ICpvbGQgPSBzZWxmLT5vYl90eXBlOwotCVB5VHlwZU9iamVjdCAqbmV3OworCVB5VHlwZU9iamVjdCAqb2xkdG8gPSBzZWxmLT5vYl90eXBlOworCVB5VHlwZU9iamVjdCAqbmV3dG87CiAKIAlpZiAodmFsdWUgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLApAQCAtMjQ5NiwxOCArMjQ3MSwxOCBAQAogCQkgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KLQluZXcgPSAoUHlUeXBlT2JqZWN0ICopdmFsdWU7Ci0JaWYgKCEobmV3LT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHx8Ci0JICAgICEob2xkLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorCW5ld3RvID0gKFB5VHlwZU9iamVjdCAqKXZhbHVlOworCWlmICghKG5ld3RvLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHx8CisJICAgICEob2xkdG8tPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpCiAJewogCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkJICAgICAiX19jbGFzc19fIGFzc2lnbm1lbnQ6IG9ubHkgZm9yIGhlYXAgdHlwZXMiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChuZXcsIG9sZCwgIl9fY2xhc3NfXyIpKSB7Ci0JCVB5X0lOQ1JFRihuZXcpOwotCQlzZWxmLT5vYl90eXBlID0gbmV3OwotCQlQeV9ERUNSRUYob2xkKTsKKwlpZiAoY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChuZXd0bywgb2xkdG8sICJfX2NsYXNzX18iKSkgeworCQlQeV9JTkNSRUYobmV3dG8pOworCQlzZWxmLT5vYl90eXBlID0gbmV3dG87CisJCVB5X0RFQ1JFRihvbGR0byk7CiAJCXJldHVybiAwOwogCX0KIAllbHNlIHsKQEAgLTI3ODUsNyArMjc2MCw3IEBACiAJIm9iamVjdCIsCQkJCS8qIHRwX25hbWUgKi8KIAlzaXplb2YoUHlPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwogCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKW9iamVjdF9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLworCW9iamVjdF9kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCiAJMCwJCQkJCS8qIHRwX3ByaW50ICovCiAJMCwJCQkgCQkvKiB0cF9nZXRhdHRyICovCiAJMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KQEAgLTMzMjYsNyArMzMwMSw3IEBACiB7CiAJUHlfc3NpemVfdCBpOwogCWludCByZXN1bHQ7Ci0JUHlPYmplY3QgKmxpc3QsICpyZWYsICpuZXc7CisJUHlPYmplY3QgKmxpc3QsICpyZWYsICpuZXdvYmo7CiAKIAlsaXN0ID0gYmFzZS0+dHBfc3ViY2xhc3NlczsKIAlpZiAobGlzdCA9PSBOVUxMKSB7CkBAIC0zMzM1LDE2ICszMzEwLDE2IEBACiAJCQlyZXR1cm4gLTE7CiAJfQogCWFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOwotCW5ldyA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0ICopdHlwZSwgTlVMTCk7CisJbmV3b2JqID0gUHlXZWFrcmVmX05ld1JlZigoUHlPYmplY3QgKil0eXBlLCBOVUxMKTsKIAlpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwogCXdoaWxlICgtLWkgPj0gMCkgewogCQlyZWYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CiAJCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CiAJCWlmIChQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpID09IFB5X05vbmUpCi0JCQlyZXR1cm4gUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgbmV3KTsKKwkJCXJldHVybiBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBuZXdvYmopOwogCX0KLQlyZXN1bHQgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIG5ldyk7Ci0JUHlfREVDUkVGKG5ldyk7CisJcmVzdWx0ID0gUHlMaXN0X0FwcGVuZChsaXN0LCBuZXdvYmopOworCVB5X0RFQ1JFRihuZXdvYmopOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM1MzYsMTIgKzM1MTEsMTYgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdyYXBfc3NpemVhcmdmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKK3dyYXBfaW5kZXhhcmdmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKIAlzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKKwlQeU9iamVjdCogbzsKIAlQeV9zc2l6ZV90IGk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm4iLCAmaSkpCisJaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMSwgJm8pKQorCQlyZXR1cm4gTlVMTDsKKwlpID0gUHlOdW1iZXJfSW5kZXgobyk7CisJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7CiB9CkBAIC0zNTUxLDcgKzM1MzAsNyBAQAogewogCVB5X3NzaXplX3QgaTsKIAotCWkgPSBQeUludF9Bc1NzaXplX3QoYXJnKTsKKwlpID0gUHlOdW1iZXJfSW5kZXgoYXJnKTsKIAlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogCQlyZXR1cm4gLTE7CiAJaWYgKGkgPCAwKSB7CkBAIC00MzU5LDM2ICs0MzM4LDIxIEBACiBzdGF0aWMgUHlfc3NpemVfdCAKIHNsb3RfbmJfaW5kZXgoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzOwogCXN0YXRpYyBQeU9iamVjdCAqaW5kZXhfc3RyOwotCVB5X3NzaXplX3QgcmVzdWx0ID0gLTE7CisJUHlPYmplY3QgKnRlbXAgPSBjYWxsX21ldGhvZChzZWxmLCAiX19pbmRleF9fIiwgJmluZGV4X3N0ciwgIigpIik7CisJUHlfc3NpemVfdCByZXN1bHQ7CiAKLQlmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2luZGV4X18iLCAmaW5kZXhfc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJIm9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgiKTsKLQkJfQorCWlmICh0ZW1wID09IE5VTEwpCiAJCXJldHVybiAtMTsKLSAJfQotCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlpZiAodGVtcCAhPSBOVUxMKSB7Ci0JCQlpZiAoUHlJbnRfQ2hlY2sodGVtcCkgfHwgUHlMb25nX0NoZWNrKHRlbXApKSB7Ci0JCQkJcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2luZGV4KHRlbXApOwotCQkJfQotCQkJZWxzZSB7Ci0gCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJCSAgICAiX19pbmRleF9fIG11c3QgcmV0dXJuIGFuIGludCBvciBhIGxvbmciKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQorCWlmIChQeUludF9DaGVja0V4YWN0KHRlbXApIHx8IFB5TG9uZ19DaGVja0V4YWN0KHRlbXApKSB7CisJCXJlc3VsdCA9IHRlbXAtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXgodGVtcCk7CiAJfQotCVB5X0RFQ1JFRihmdW5jKTsKKwllbHNlIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCisJCQkJIl9faW5kZXhfXyBtdXN0IHJldHVybiBhbiBpbnQgb3IgYSBsb25nIik7CisJCXJlc3VsdCA9IC0xOworCX0KKwlQeV9ERUNSRUYodGVtcCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNTAxOCw5ICs0OTgyLDkgQEAKIAkgICB0ZXN0X2Rlc2NyLm5vdGltcGxlbWVudGVkKCkgKi8KIAlTUVNMT1QoIl9fYWRkX18iLCBzcV9jb25jYXQsIE5VTEwsIHdyYXBfYmluYXJ5ZnVuYywKICAgICAgICAgICAieC5fX2FkZF9fKHkpIDw9PT4geCt5IiksCi0JU1FTTE9UKCJfX211bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX3NzaXplYXJnZnVuYywKKwlTUVNMT1QoIl9fbXVsX18iLCBzcV9yZXBlYXQsIE5VTEwsIHdyYXBfaW5kZXhhcmdmdW5jLAogICAgICAgICAgICJ4Ll9fbXVsX18obikgPD09PiB4Km4iKSwKLQlTUVNMT1QoIl9fcm11bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX3NzaXplYXJnZnVuYywKKwlTUVNMT1QoIl9fcm11bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKICAgICAgICAgICAieC5fX3JtdWxfXyhuKSA8PT0+IG4qeCIpLAogCVNRU0xPVCgiX19nZXRpdGVtX18iLCBzcV9pdGVtLCBzbG90X3NxX2l0ZW0sIHdyYXBfc3FfaXRlbSwKIAkgICAgICAgInguX19nZXRpdGVtX18oeSkgPD09PiB4W3ldIiksCkBAIC01MDQ2LDcgKzUwMTAsNyBAQAogCVNRU0xPVCgiX19pYWRkX18iLCBzcV9pbnBsYWNlX2NvbmNhdCwgTlVMTCwKICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJ4Ll9faWFkZF9fKHkpIDw9PT4geCs9eSIpLAogCVNRU0xPVCgiX19pbXVsX18iLCBzcV9pbnBsYWNlX3JlcGVhdCwgTlVMTCwKLSAgICAgICAgICB3cmFwX3NzaXplYXJnZnVuYywgInguX19pbXVsX18oeSkgPD09PiB4Kj15IiksCisgICAgICAgICAgd3JhcF9pbmRleGFyZ2Z1bmMsICJ4Ll9faW11bF9fKHkpIDw9PT4geCo9eSIpLAogCiAJTVBTTE9UKCJfX2xlbl9fIiwgbXBfbGVuZ3RoLCBzbG90X21wX2xlbmd0aCwgd3JhcF9sZW5mdW5jLAogCSAgICAgICAieC5fX2xlbl9fKCkgPD09PiBsZW4oeCkiKSwKQEAgLTUyMTEsMjEgKzUxNzUsMjEgQEAKIAogCS8qIE5vdGU6IHRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIG1lbWJlcnMgb2YgUHlIZWFwVHlwZU9iamVjdCEgKi8KIAlhc3NlcnQob2Zmc2V0ID49IDApOwotCWFzc2VydChvZmZzZXQgPCBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19idWZmZXIpKTsKLQlpZiAob2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKSkgewotCQlwdHIgPSAodm9pZCAqKXR5cGUtPnRwX2FzX3NlcXVlbmNlOworCWFzc2VydCgoc2l6ZV90KW9mZnNldCA8IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX2J1ZmZlcikpOworCWlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSkpIHsKKwkJcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19zZXF1ZW5jZTsKIAkJb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKTsKIAl9Ci0JZWxzZSBpZiAob2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX21hcHBpbmcpKSB7Ci0JCXB0ciA9ICh2b2lkICopdHlwZS0+dHBfYXNfbWFwcGluZzsKKwllbHNlIGlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19tYXBwaW5nKSkgeworCQlwdHIgPSAoY2hhciAqKXR5cGUtPnRwX2FzX21hcHBpbmc7CiAJCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19tYXBwaW5nKTsKIAl9Ci0JZWxzZSBpZiAob2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcikpIHsKLQkJcHRyID0gKHZvaWQgKil0eXBlLT50cF9hc19udW1iZXI7CisJZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbnVtYmVyKSkgeworCQlwdHIgPSAoY2hhciAqKXR5cGUtPnRwX2FzX251bWJlcjsKIAkJb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcik7CiAJfQogCWVsc2UgewotCQlwdHIgPSAodm9pZCAqKXR5cGU7CisJCXB0ciA9IChjaGFyICopdHlwZTsKIAl9CiAJaWYgKHB0ciAhPSBOVUxMKQogCQlwdHIgKz0gb2Zmc2V0OwpAQCAtNTc0Myw3ICs1NzA3LDcgQEAKIHN1cGVyX2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7CiAJc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKLQlzdXBlcm9iamVjdCAqbmV3OworCXN1cGVyb2JqZWN0ICpuZXdvYmo7CiAKIAlpZiAob2JqID09IE5VTEwgfHwgb2JqID09IFB5X05vbmUgfHwgc3UtPm9iaiAhPSBOVUxMKSB7CiAJCS8qIE5vdCBiaW5kaW5nIHRvIGFuIG9iamVjdCwgb3IgYWxyZWFkeSBib3VuZCAqLwpAQCAtNTc2MCwxNiArNTcyNCwxNiBAQAogCQlQeVR5cGVPYmplY3QgKm9ial90eXBlID0gc3VwZXJjaGVjayhzdS0+dHlwZSwgb2JqKTsKIAkJaWYgKG9ial90eXBlID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKLQkJbmV3ID0gKHN1cGVyb2JqZWN0ICopUHlTdXBlcl9UeXBlLnRwX25ldygmUHlTdXBlcl9UeXBlLAorCQluZXdvYmogPSAoc3VwZXJvYmplY3QgKilQeVN1cGVyX1R5cGUudHBfbmV3KCZQeVN1cGVyX1R5cGUsCiAJCQkJCQkJIE5VTEwsIE5VTEwpOwotCQlpZiAobmV3ID09IE5VTEwpCisJCWlmIChuZXdvYmogPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCQlQeV9JTkNSRUYoc3UtPnR5cGUpOwogCQlQeV9JTkNSRUYob2JqKTsKLQkJbmV3LT50eXBlID0gc3UtPnR5cGU7Ci0JCW5ldy0+b2JqID0gb2JqOwotCQluZXctPm9ial90eXBlID0gb2JqX3R5cGU7Ci0JCXJldHVybiAoUHlPYmplY3QgKiluZXc7CisJCW5ld29iai0+dHlwZSA9IHN1LT50eXBlOworCQluZXdvYmotPm9iaiA9IG9iajsKKwkJbmV3b2JqLT5vYmpfdHlwZSA9IG9ial90eXBlOworCQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOwogCX0KIH0KIApAQCAtNTgxMSwyMCArNTc3NSwxMCBAQAogc3VwZXJfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewogCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7Ci0JaW50IGVycjsKIAotI2RlZmluZSBWSVNJVChTTE9UKSBcCi0JaWYgKFNMT1QpIHsgXAotCQllcnIgPSB2aXNpdCgoUHlPYmplY3QgKikoU0xPVCksIGFyZyk7IFwKLQkJaWYgKGVycikgXAotCQkJcmV0dXJuIGVycjsgXAotCX0KLQotCVZJU0lUKHN1LT5vYmopOwotCVZJU0lUKHN1LT50eXBlKTsKLQlWSVNJVChzdS0+b2JqX3R5cGUpOwotCi0jdW5kZWYgVklTSVQKKwlQeV9WSVNJVChzdS0+b2JqKTsKKwlQeV9WSVNJVChzdS0+dHlwZSk7CisJUHlfVklTSVQoc3UtPm9ial90eXBlKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCA3ZmJjZTE0Li5lNjJjNzc0IDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtMzYsNiArMzYsNyBAQAogCiAqLwogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKIAogI2luY2x1ZGUgInVuaWNvZGVvYmplY3QuaCIKQEAgLTgzLDYgKzg0LDExIEBACiAKICovCiAKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiAvKiBGcmVlIGxpc3QgZm9yIFVuaWNvZGUgb2JqZWN0cyAqLwogc3RhdGljIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZV9mcmVlbGlzdDsKIHN0YXRpYyBpbnQgdW5pY29kZV9mcmVlbGlzdF9zaXplOwpAQCAtMTMwLDE0ICsxMzYsOSBAQAogICAgIC8qIFJlc2l6aW5nIHNoYXJlZCBvYmplY3QgKHVuaWNvZGVfZW1wdHkgb3Igc2luZ2xlIGNoYXJhY3RlcgogICAgICAgIG9iamVjdHMpIGluLXBsYWNlIGlzIG5vdCBhbGxvd2VkLiBVc2UgUHlVbmljb2RlX1Jlc2l6ZSgpCiAgICAgICAgaW5zdGVhZCAhICovCi0gICAgaWYgKHVuaWNvZGUgPT0gdW5pY29kZV9lbXB0eSB8fAotCSh1bmljb2RlLT5sZW5ndGggPT0gMSAmJgotICAgICAgICAgLyogTXZMIHNhaWQgdW5pY29kZS0+c3RyW10gbWF5IGJlIHNpZ25lZC4gIFB5dGhvbiBnZW5lcmFsbHkgYXNzdW1lcwotICAgICAgICAgICogYW4gaW50IGNvbnRhaW5zIGF0IGxlYXN0IDMyIGJpdHMsIGFuZCB3ZSBkb24ndCB1c2UgbW9yZSB0aGFuCi0gICAgICAgICAgKiAzMiBiaXRzIGV2ZW4gaW4gYSBVQ1M0IGJ1aWxkLCBzbyBjYXN0aW5nIHRvIHVuc2lnbmVkIGludCBzaG91bGQKLSAgICAgICAgICAqIGJlIGNvcnJlY3QuCi0gICAgICAgICAgKi8KLQkgKHVuc2lnbmVkIGludCl1bmljb2RlLT5zdHJbMF0gPCAyNTZVICYmCisgICAgaWYgKHVuaWNvZGUgPT0gdW5pY29kZV9lbXB0eSB8fCAKKwkodW5pY29kZS0+bGVuZ3RoID09IDEgJiYgCisJIHVuaWNvZGUtPnN0clswXSA8IDI1NlUgJiYKIAkgdW5pY29kZV9sYXRpbjFbdW5pY29kZS0+c3RyWzBdXSA9PSB1bmljb2RlKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmVzaXplIHNoYXJlZCB1bmljb2RlIG9iamVjdHMiKTsKQEAgLTE0OSwxMyArMTUwLDEyIEBACiAgICAgb2xkc3RyID0gdW5pY29kZS0+c3RyOwogICAgIFB5TWVtX1JFU0laRSh1bmljb2RlLT5zdHIsIFB5X1VOSUNPREUsIGxlbmd0aCArIDEpOwogICAgIGlmICghdW5pY29kZS0+c3RyKSB7Ci0JdW5pY29kZS0+c3RyID0gb2xkc3RyOworCXVuaWNvZGUtPnN0ciA9IChQeV9VTklDT0RFICopb2xkc3RyOwogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHVuaWNvZGUtPnN0cltsZW5ndGhdID0gMDsKLQlhc3NlcnQobGVuZ3RoIDwgSU5UX01BWCk7Ci0gICAgdW5pY29kZS0+bGVuZ3RoID0gKGludClsZW5ndGg7CisgICAgdW5pY29kZS0+bGVuZ3RoID0gbGVuZ3RoOwogCiAgcmVzZXQ6CiAgICAgLyogUmVzZXQgdGhlIG9iamVjdCBjYWNoZXMgKi8KQEAgLTIyNiw4ICsyMjYsNyBAQAogICAgICAqLwogICAgIHVuaWNvZGUtPnN0clswXSA9IDA7CiAgICAgdW5pY29kZS0+c3RyW2xlbmd0aF0gPSAwOwotCWFzc2VydChsZW5ndGg8SU5UX01BWCk7Ci0gICAgdW5pY29kZS0+bGVuZ3RoID0gKGludClsZW5ndGg7CisgICAgdW5pY29kZS0+bGVuZ3RoID0gbGVuZ3RoOwogICAgIHVuaWNvZGUtPmhhc2ggPSAtMTsKICAgICB1bmljb2RlLT5kZWZlbmMgPSBOVUxMOwogICAgIHJldHVybiB1bmljb2RlOwpAQCAtMzY4LDcgKzM2Nyw3IEBACiAjZWxzZQogICAgIHsKIAlyZWdpc3RlciBQeV9VTklDT0RFICp1OwotCXJlZ2lzdGVyIGludCBpOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKIAl1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7CiAJZm9yIChpID0gc2l6ZTsgaSA+IDA7IGktLSkKIAkgICAgKnUrKyA9ICp3Kys7CkBAIC0zOTYsNyArMzk1LDcgQEAKICNlbHNlCiAgICAgewogCXJlZ2lzdGVyIFB5X1VOSUNPREUgKnU7Ci0JcmVnaXN0ZXIgaW50IGk7CisJcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwogCXUgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmljb2RlKTsKIAlmb3IgKGkgPSBzaXplOyBpID4gMDsgaS0tKQogCSAgICAqdysrID0gKnUrKzsKQEAgLTEzNTgsNyArMTM1Nyw3IEBACiAgICAgUHlPYmplY3QgKnY7ICAgICAgICAvKiByZXN1bHQgc3RyaW5nIG9iamVjdCAqLwogICAgIGNoYXIgKnA7ICAgICAgICAgICAgLyogbmV4dCBmcmVlIGJ5dGUgaW4gb3V0cHV0IGJ1ZmZlciAqLwogICAgIFB5X3NzaXplX3QgbmFsbG9jYXRlZDsgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgYWxsb2NhdGVkICovCi0gICAgaW50IG5uZWVkZWQ7ICAgICAgICAvKiBudW1iZXIgb2YgcmVzdWx0IGJ5dGVzIG5lZWRlZCAqLworICAgIFB5X3NzaXplX3Qgbm5lZWRlZDsgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgbmVlZGVkICovCiAgICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiA0XTsKIAogICAgIGFzc2VydChzICE9IE5VTEwpOwpAQCAtMTQyNywxMyArMTQyNiwxMyBAQAogCiAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAvKiBUaGlzIHdhcyBzdGFjayBhbGxvY2F0ZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBQeV9TQUZFX0RPV05DQVNUKHAgLSBzdGFja2J1ZiwgbG9uZywgaW50KTsKKyAgICAgICAgbm5lZWRlZCA9IHAgLSBzdGFja2J1ZjsKICAgICAgICAgYXNzZXJ0KG5uZWVkZWQgPD0gbmFsbG9jYXRlZCk7CiAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdGFja2J1Ziwgbm5lZWRlZCk7CiAgICAgfQogICAgIGVsc2UgewogICAgIAkvKiBDdXQgYmFjayB0byBzaXplIGFjdHVhbGx5IG5lZWRlZC4gKi8KLSAgICAgICAgbm5lZWRlZCA9IFB5X1NBRkVfRE9XTkNBU1QocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbG9uZywgaW50KTsKKyAgICAgICAgbm5lZWRlZCA9IHAgLSBQeVN0cmluZ19BU19TVFJJTkcodik7CiAgICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwogICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBubmVlZGVkKTsKICAgICB9CkBAIC0xODg0LDcgKzE4ODMsNyBAQAogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtKTsKICAgICAgICAgICAgICAgICBpZiAoYXBpID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gdWNuaGFzaEVycm9yOwotICAgICAgICAgICAgICAgIHVjbmhhc2hfQ0FQSSA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIoYXBpKTsKKyAgICAgICAgICAgICAgICB1Y25oYXNoX0NBUEkgPSAoX1B5VW5pY29kZV9OYW1lX0NBUEkgKilQeUNPYmplY3RfQXNWb2lkUHRyKGFwaSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFwaSk7CiAgICAgICAgICAgICAgICAgaWYgKHVjbmhhc2hfQ0FQSSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHVjbmhhc2hFcnJvcjsKQEAgLTE5MzQsNyArMTkzMyw3IEBACiAgICAgICAgIG5leHRCeXRlOgogICAgICAgICA7CiAgICAgfQotICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgKGludCkocCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSkgPCAwKQorICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmdiwgcCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpKSA8IDApCiAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CiAgICAgUHlfWERFQ1JFRihleGMpOwpAQCAtMjAwMyw3ICsyMDAyLDcgQEAKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICAgICAgLyogTWFwIDIxLWJpdCBjaGFyYWN0ZXJzIHRvICdcVTAweHh4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAweDEwMDAwKSB7Ci0JICAgIGludCBvZmZzZXQgPSBwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpOworCSAgICBQeV9zc2l6ZV90IG9mZnNldCA9IHAgLSBQeVN0cmluZ19BU19TVFJJTkcocmVwcik7CiAKIAkgICAgLyogUmVzaXplIHRoZSBzdHJpbmcgaWYgbmVjZXNzYXJ5ICovCiAJICAgIGlmIChvZmZzZXQgKyAxMiA+IFB5U3RyaW5nX0dFVF9TSVpFKHJlcHIpKSB7CkBAIC0yMjA1LDcgKzIyMDQsNyBAQAogCW5leHRCeXRlOgogCTsKICAgICB9Ci0gICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCAoaW50KShwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpKSA8IDApCisgICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCBwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpIDwgMCkKIAlnb3RvIG9uRXJyb3I7CiAgICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKQEAgLTIzNDgsNyArMjM0Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIChpbnQpKHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkpIDwgMCkKKyAgICBpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkgPCAwKQogICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKQEAgLTI0OTksOCArMjQ5OCw4IEBACiAgICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KICAgICBQeV9zc2l6ZV90IHJlc3BvcyA9IDA7CiAgICAgUHlfc3NpemVfdCByZXNzaXplOwotICAgIGNoYXIgKmVuY29kaW5nID0gKGxpbWl0ID09IDI1NikgPyAibGF0aW4tMSIgOiAiYXNjaWkiOwotICAgIGNoYXIgKnJlYXNvbiA9IChsaW1pdCA9PSAyNTYpID8gIm9yZGluYWwgbm90IGluIHJhbmdlKDI1NikiIDogIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gKGxpbWl0ID09IDI1NikgPyAibGF0aW4tMSIgOiAiYXNjaWkiOworICAgIGNvbnN0IGNoYXIgKnJlYXNvbiA9IChsaW1pdCA9PSAyNTYpID8gIm9yZGluYWwgbm90IGluIHJhbmdlKDI1NikiIDogIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiOwogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIC8qIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBmb3IgY2FjaGluZyBzdHJpbmcgY29tcGFyaXNvbnMKQEAgLTI3MjMsNyArMjcyMiw3IEBACiAJfQogICAgIH0KICAgICBpZiAocCAtIFB5VW5pY29kZV9BU19VTklDT0RFKHYpIDwgUHlTdHJpbmdfR0VUX1NJWkUodikpCi0JaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCAoaW50KShwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpKSA8IDApCisJaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZ2LCBwIC0gUHlVbmljb2RlX0FTX1VOSUNPREUodikpIDwgMCkKIAkgICAgZ290byBvbkVycm9yOwogICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CkBAIC0yOTgyLDcgKzI5ODEsNyBAQAogCX0KICAgICB9CiAgICAgaWYgKHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSA8IFB5VW5pY29kZV9HRVRfU0laRSh2KSkKLQlpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIChpbnQpKHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkpIDwgMCkKKwlpZiAoX1B5VW5pY29kZV9SZXNpemUoJnYsIHAgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSkgPCAwKQogCSAgICBnb3RvIG9uRXJyb3I7CiAgICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKQEAgLTMzMzYsOSArMzMzNSw5IEBACiAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBlbmRwb3MsCiAgICAgUHlfc3NpemVfdCAqbmV3cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIWk7dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAodW5pY29kZSwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjt0cmFuc2xhdGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICh1bmljb2RlLCBpbnQpIHR1cGxlIjsKIAotICAgIGludCBpX25ld3BvczsKKyAgICBQeV9zc2l6ZV90IGlfbmV3cG9zOwogICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKICAgICBQeU9iamVjdCAqcmVzdW5pY29kZTsKIApAQCAtMzc5OCw3ICszNzk3LDcgQEAKIAkJIFB5X3NzaXplX3QgZW5kLAogCQkgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmcpCiB7Ci0gICAgaW50IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKIAogICAgIGlmIChzdGFydCA8IDApCiAgICAgICAgIHN0YXJ0ICs9IHNlbGYtPmxlbmd0aDsKQEAgLTQxNTcsNyArNDE1Niw3IEBACiAgICAgUHlPYmplY3QgKmZzZXE7ICAgICAgICAgIC8qIFB5U2VxdWVuY2VfRmFzdChzZXEpICovCiAgICAgUHlfc3NpemVfdCBzZXFsZW47ICAgICAgICAgICAgICAvKiBsZW4oZnNlcSkgLS0gbnVtYmVyIG9mIGl0ZW1zIGluIHNlcXVlbmNlICovCiAgICAgUHlPYmplY3QgKml0ZW07Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgZnNlcSA9IFB5U2VxdWVuY2VfRmFzdChzZXEsICIiKTsKICAgICBpZiAoZnNlcSA9PSBOVUxMKSB7CkBAIC00MjA2LDcgKzQyMDUsNyBAQAogICAgIH0KIAogICAgIC8qIEdldCBzcGFjZS4gKi8KLSAgICByZXMgPSBfUHlVbmljb2RlX05ldygoaW50KXJlc19hbGxvYyk7CisgICAgcmVzID0gX1B5VW5pY29kZV9OZXcocmVzX2FsbG9jKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICByZXNfcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyk7CkBAIC00MjIwLDcgKzQyMTksNyBAQAogCS8qIENvbnZlcnQgaXRlbSB0byBVbmljb2RlLiAqLwogCWlmICghIFB5VW5pY29kZV9DaGVjayhpdGVtKSAmJiAhIFB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CiAJICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgInNlcXVlbmNlIGl0ZW0gJWk6IGV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlLCIKKwkJCSAic2VxdWVuY2UgaXRlbSAlemQ6IGV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlLCIKIAkJCSAiICUuODBzIGZvdW5kIiwKIAkJCSBpLCBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKIAkgICAgZ290byBvbkVycm9yOwpAQCAtNDIzNiwxMSArNDIzNSwxMSBAQAogICAgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBpdGVtLiAqLwogCWl0ZW1sZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUoaXRlbSk7CiAJbmV3X3Jlc191c2VkID0gcmVzX3VzZWQgKyBpdGVtbGVuOwotCWlmIChuZXdfcmVzX3VzZWQgPCByZXNfdXNlZCB8fCAgbmV3X3Jlc191c2VkID4gSU5UX01BWCkKKwlpZiAobmV3X3Jlc191c2VkIDwgcmVzX3VzZWQgfHwgIG5ld19yZXNfdXNlZCA+IFBZX1NTSVpFX1RfTUFYKQogCSAgICBnb3RvIE92ZXJmbG93OwogCWlmIChpIDwgc2VxbGVuIC0gMSkgewogCSAgICBuZXdfcmVzX3VzZWQgKz0gc2VwbGVuOwotCSAgICBpZiAobmV3X3Jlc191c2VkIDwgcmVzX3VzZWQgfHwgIG5ld19yZXNfdXNlZCA+IElOVF9NQVgpCisJICAgIGlmIChuZXdfcmVzX3VzZWQgPCByZXNfdXNlZCB8fCAgbmV3X3Jlc191c2VkID4gUFlfU1NJWkVfVF9NQVgpCiAJCWdvdG8gT3ZlcmZsb3c7CiAJfQogCWlmIChuZXdfcmVzX3VzZWQgPiByZXNfYWxsb2MpIHsKQEAgLTQyNDgsMTAgKzQyNDcsMTAgQEAKIAkgICAgZG8gewogCSAgICAgICAgc2l6ZV90IG9sZHNpemUgPSByZXNfYWxsb2M7CiAJICAgICAgICByZXNfYWxsb2MgKz0gcmVzX2FsbG9jOwotCSAgICAgICAgaWYgKHJlc19hbGxvYyA8IG9sZHNpemUgfHwgcmVzX2FsbG9jID4gSU5UX01BWCkKKwkgICAgICAgIGlmIChyZXNfYWxsb2MgPCBvbGRzaXplIHx8IHJlc19hbGxvYyA+IFBZX1NTSVpFX1RfTUFYKQogCSAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CiAJICAgIH0gd2hpbGUgKG5ld19yZXNfdXNlZCA+IHJlc19hbGxvYyk7Ci0JICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmcmVzLCAoaW50KXJlc19hbGxvYykgPCAwKSB7CisJICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmcmVzLCByZXNfYWxsb2MpIDwgMCkgewogCQlQeV9ERUNSRUYoaXRlbSk7CiAJCWdvdG8gb25FcnJvcjsKIAkgICAgfQpAQCAtNDI1OSwxMCArNDI1OCwxMCBAQAogCX0KIAogCS8qIENvcHkgaXRlbSwgYW5kIG1heWJlIHRoZSBzZXBhcmF0b3IuICovCi0JUHlfVU5JQ09ERV9DT1BZKHJlc19wLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKSwgKGludClpdGVtbGVuKTsKKwlQeV9VTklDT0RFX0NPUFkocmVzX3AsIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pLCBpdGVtbGVuKTsKIAlyZXNfcCArPSBpdGVtbGVuOwogCWlmIChpIDwgc2VxbGVuIC0gMSkgewotCSAgICBQeV9VTklDT0RFX0NPUFkocmVzX3AsIHNlcCwgKGludClzZXBsZW4pOworCSAgICBQeV9VTklDT0RFX0NPUFkocmVzX3AsIHNlcCwgc2VwbGVuKTsKIAkgICAgcmVzX3AgKz0gc2VwbGVuOwogCX0KIAlQeV9ERUNSRUYoaXRlbSk7CkBAIC00MjcyLDcgKzQyNzEsNyBAQAogICAgIC8qIFNocmluayByZXMgdG8gbWF0Y2ggdGhlIHVzZWQgYXJlYTsgdGhpcyBwcm9iYWJseSBjYW4ndCBmYWlsLAogICAgICAqIGJ1dCBpdCdzIGNoZWFwIHRvIGNoZWNrLgogICAgICAqLwotICAgIGlmIChfUHlVbmljb2RlX1Jlc2l6ZSgmcmVzLCAoaW50KXJlc191c2VkKSA8IDApCisgICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZyZXMsIHJlc191c2VkKSA8IDApCiAJZ290byBvbkVycm9yOwogCiAgRG9uZToKQEAgLTQ2MDUsNyArNDYwNCw3IEBACiAgICAgUHlPYmplY3QgKmxpc3Q7CiAKICAgICBpZiAobWF4Y291bnQgPCAwKQotICAgICAgICBtYXhjb3VudCA9IElOVF9NQVg7CisgICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CiAKICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKICAgICBpZiAoIWxpc3QpCkBAIC00NjM0LDcgKzQ2MzMsNyBAQAogICAgIFB5T2JqZWN0ICpsaXN0OwogCiAgICAgaWYgKG1heGNvdW50IDwgMCkKLSAgICAgICAgbWF4Y291bnQgPSBJTlRfTUFYOworICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgaWYgKCFsaXN0KQpAQCAtNDY2NCwxMCArNDY2MywxMCBAQAogICAgIFB5VW5pY29kZU9iamVjdCAqdTsKIAogICAgIGlmIChtYXhjb3VudCA8IDApCi0JbWF4Y291bnQgPSBJTlRfTUFYOworCW1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CiAKICAgICBpZiAoc3RyMS0+bGVuZ3RoID09IDEgJiYgc3RyMi0+bGVuZ3RoID09IDEpIHsKLSAgICAgICAgaW50IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAogICAgICAgICAvKiByZXBsYWNlIGNoYXJhY3RlcnMgKi8KICAgICAgICAgaWYgKCFmaW5kY2hhcihzZWxmLT5zdHIsIHNlbGYtPmxlbmd0aCwgc3RyMS0+c3RyWzBdKSAmJgpAQCAtNTA4OCw3ICs1MDg3LDcgQEAKIHsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6Y291bnQiLCAmc3Vic3RyaW5nLApAQCAtNTI2NSw3ICs1MjY0LDcgQEAKIHsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZmluZCIsICZzdWJzdHJpbmcsCkBAIC01MzMxLDcgKzUzMzAsNyBAQAogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKQEAgLTU2NjksMTAgKzU2NjgsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2xqdXN0KFB5VW5pY29kZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgaW50IHdpZHRoOworICAgIFB5X3NzaXplX3Qgd2lkdGg7CiAgICAgUHlfVU5JQ09ERSBmaWxsY2hhciA9ICcgJzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxPJjpsanVzdCIsICZ3aWR0aCwgY29udmVydF91YywgJmZpbGxjaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58TyY6bGp1c3QiLCAmd2lkdGgsIGNvbnZlcnRfdWMsICZmaWxsY2hhcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHNlbGYtPmxlbmd0aCA+PSB3aWR0aCAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzZWxmKSkgewpAQCAtNTk5Niw3ICs1OTk1LDcgQEAKIHsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6cmZpbmQiLCAmc3Vic3RyaW5nLApAQCAtNjAyNCw3ICs2MDIzLDcgQEAKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKICAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IElOVF9NQVg7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOnJpbmRleCIsICZzdWJzdHJpbmcsCiAJCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQpAQCAtNjA1MywxMCArNjA1MiwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfcmp1c3QoUHlVbmljb2RlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBpbnQgd2lkdGg7CisgICAgUHlfc3NpemVfdCB3aWR0aDsKICAgICBQeV9VTklDT0RFIGZpbGxjaGFyID0gJyAnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfE8mOnJqdXN0IiwgJndpZHRoLCBjb252ZXJ0X3VjLCAmZmlsbGNoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxPJjpyanVzdCIsICZ3aWR0aCwgY29udmVydF91YywgJmZpbGxjaGFyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoc2VsZi0+bGVuZ3RoID49IHdpZHRoICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KHNlbGYpKSB7CkBAIC02MzE4LDcgKzYzMTcsNyBAQAogewogICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpzdGFydHN3aXRoIiwgJnN1YnN0cmluZywKQEAgLTYzNDksNyArNjM0OCw3IEBACiB7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmVuZHN3aXRoIiwgJnN1YnN0cmluZywKQEAgLTY0NTAsMTMgKzY0NDksMTMgQEAKIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHVuaWNvZGVfYXNfc2VxdWVuY2UgPSB7CiAgICAgKGxlbmZ1bmMpIHVuaWNvZGVfbGVuZ3RoLCAJCS8qIHNxX2xlbmd0aCAqLwotICAgIChiaW5hcnlmdW5jKSBQeVVuaWNvZGVfQ29uY2F0LCAJLyogc3FfY29uY2F0ICovCisgICAgUHlVbmljb2RlX0NvbmNhdCwJCSAJLyogc3FfY29uY2F0ICovCiAgICAgKHNzaXplYXJnZnVuYykgdW5pY29kZV9yZXBlYXQsIAkvKiBzcV9yZXBlYXQgKi8KICAgICAoc3NpemVhcmdmdW5jKSB1bmljb2RlX2dldGl0ZW0sIAkvKiBzcV9pdGVtICovCiAgICAgKHNzaXplc3NpemVhcmdmdW5jKSB1bmljb2RlX3NsaWNlLCAJLyogc3Ffc2xpY2UgKi8KICAgICAwLCAJCQkJCS8qIHNxX2Fzc19pdGVtICovCiAgICAgMCwgCQkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLSAgICAob2Jqb2JqcHJvYylQeVVuaWNvZGVfQ29udGFpbnMsIAkvKnNxX2NvbnRhaW5zKi8KKyAgICBQeVVuaWNvZGVfQ29udGFpbnMsIAkJLyogc3FfY29udGFpbnMgKi8KIH07CiAKICNkZWZpbmUgSEFTSU5ERVgobykgUHlUeXBlX0hhc0ZlYXR1cmUoKG8pLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpCkBAIC02NDg3LDcgKzY0ODYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNvdXJjZV9idWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSgoUHlPYmplY3QqKXNlbGYpOwotICAgICAgICAgICAgcmVzdWx0X2J1ZiA9IFB5TWVtX01BTExPQyhzbGljZWxlbmd0aCpzaXplb2YoUHlfVU5JQ09ERSkpOworICAgICAgICAgICAgcmVzdWx0X2J1ZiA9IChQeV9VTklDT0RFICopUHlNZW1fTUFMTE9DKHNsaWNlbGVuZ3RoKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeV9VTklDT0RFKSk7CiAJICAgIAogCSAgICBpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQogCQkgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CkBAIC03MzM2LDcgKzczMzYsNyBAQAogICAgIDAsCQkJCSAJLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsIAkJCQkJLyogdHBfc2V0YXR0ciAqLwogICAgIChjbXBmdW5jKSB1bmljb2RlX2NvbXBhcmUsIAkJLyogdHBfY29tcGFyZSAqLwotICAgIChyZXByZnVuYykgdW5pY29kZV9yZXByLCAJCS8qIHRwX3JlcHIgKi8KKyAgICB1bmljb2RlX3JlcHIsIAkJCS8qIHRwX3JlcHIgKi8KICAgICAmdW5pY29kZV9hc19udW1iZXIsIAkJLyogdHBfYXNfbnVtYmVyICovCiAgICAgJnVuaWNvZGVfYXNfc2VxdWVuY2UsIAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAmdW5pY29kZV9hc19tYXBwaW5nLCAJCS8qIHRwX2FzX21hcHBpbmcgKi8KQEAgLTc0MTYsNiArNzQxNiwxMSBAQAogICAgIHVuaWNvZGVfZnJlZWxpc3Rfc2l6ZSA9IDA7CiB9CiAKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKwogLyoKIExvY2FsIHZhcmlhYmxlczoKIGMtYmFzaWMtb2Zmc2V0OiA0CmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IDM5NTk1YWUuLjNmMmMyNjEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC0xMDksOCArMTA5LDcgQEAKIHN0YXRpYyBpbnQKIGdjX3RyYXZlcnNlKFB5V2Vha1JlZmVyZW5jZSAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgaWYgKHNlbGYtPndyX2NhbGxiYWNrICE9IE5VTEwpCi0gICAgICAgIHJldHVybiB2aXNpdChzZWxmLT53cl9jYWxsYmFjaywgYXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT53cl9jYWxsYmFjayk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM2Nyw3ICszNjYsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KLSAgICAoaW5pdHByb2Mpd2Vha3JlZl9fX2luaXRfXywgLyp0cF9pbml0Ki8KKyAgICB3ZWFrcmVmX19faW5pdF9fLCAgICAgICAgICAgLyp0cF9pbml0Ki8KICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgd2Vha3JlZl9fX25ld19fLCAgICAgICAgICAgIC8qdHBfbmV3Ki8KICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgLyp0cF9mcmVlKi8KQEAgLTU4NiwzOCArNTg1LDM4IEBACiAKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBwcm94eV9hc19udW1iZXIgPSB7Ci0gICAgKGJpbmFyeWZ1bmMpcHJveHlfYWRkLCAgICAgIC8qbmJfYWRkKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9zdWIsICAgICAgLypuYl9zdWJ0cmFjdCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfbXVsLCAgICAgIC8qbmJfbXVsdGlwbHkqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X21vZCwgICAgICAvKm5iX3JlbWFpbmRlciovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfZGl2bW9kLCAgIC8qbmJfZGl2bW9kKi8KLSAgICAodGVybmFyeWZ1bmMpcHJveHlfcG93LCAgICAgLypuYl9wb3dlciovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9uZWcsICAgICAgIC8qbmJfbmVnYXRpdmUqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfcG9zLCAgICAgICAvKm5iX3Bvc2l0aXZlKi8KLSAgICAodW5hcnlmdW5jKXByb3h5X2FicywgICAgICAgLypuYl9hYnNvbHV0ZSovCi0gICAgKGlucXVpcnkpcHJveHlfbm9uemVybywgICAgIC8qbmJfbm9uemVybyovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9pbnZlcnQsICAgIC8qbmJfaW52ZXJ0Ki8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9sc2hpZnQsICAgLypuYl9sc2hpZnQqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X3JzaGlmdCwgICAvKm5iX3JzaGlmdCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfYW5kLCAgICAgIC8qbmJfYW5kKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV94b3IsICAgICAgLypuYl94b3IqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X29yLCAgICAgICAvKm5iX29yKi8KLSAgICAoY29lcmNpb24pMCwgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfaW50LCAgICAgICAvKm5iX2ludCovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9sb25nLCAgICAgIC8qbmJfbG9uZyovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9mbG9hdCwgICAgIC8qbmJfZmxvYXQqLwotICAgICh1bmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAvKm5iX29jdCovCi0gICAgKHVuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgIC8qbmJfaGV4Ki8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9pYWRkLCAgICAgLypuYl9pbnBsYWNlX2FkZCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaXN1YiwgICAgIC8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaW11bCwgICAgIC8qbmJfaW5wbGFjZV9tdWx0aXBseSovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaW1vZCwgICAgIC8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLwotICAgICh0ZXJuYXJ5ZnVuYylwcm94eV9pcG93LCAgICAvKm5iX2lucGxhY2VfcG93ZXIqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2lsc2hpZnQsICAvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9pcnNoaWZ0LCAgLypuYl9pbnBsYWNlX3JzaGlmdCovCi0gICAgKGJpbmFyeWZ1bmMpcHJveHlfaWFuZCwgICAgIC8qbmJfaW5wbGFjZV9hbmQqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2l4b3IsICAgICAvKm5iX2lucGxhY2VfeG9yKi8KLSAgICAoYmluYXJ5ZnVuYylwcm94eV9pb3IsICAgICAgLypuYl9pbnBsYWNlX29yKi8KKyAgICBwcm94eV9hZGQsICAgICAgICAgICAgICAvKm5iX2FkZCovCisgICAgcHJveHlfc3ViLCAgICAgICAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgcHJveHlfbXVsLCAgICAgICAgICAgICAgLypuYl9tdWx0aXBseSovCisgICAgcHJveHlfbW9kLCAgICAgICAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIHByb3h5X2Rpdm1vZCwgICAgICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICBwcm94eV9wb3csICAgICAgICAgICAgICAvKm5iX3Bvd2VyKi8KKyAgICBwcm94eV9uZWcsICAgICAgICAgICAgICAvKm5iX25lZ2F0aXZlKi8KKyAgICBwcm94eV9wb3MsICAgICAgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICBwcm94eV9hYnMsICAgICAgICAgICAgICAvKm5iX2Fic29sdXRlKi8KKyAgICAoaW5xdWlyeSlwcm94eV9ub256ZXJvLCAvKm5iX25vbnplcm8qLworICAgIHByb3h5X2ludmVydCwgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICBwcm94eV9sc2hpZnQsICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgcHJveHlfcnNoaWZ0LCAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIHByb3h5X2FuZCwgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICBwcm94eV94b3IsICAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgcHJveHlfb3IsICAgICAgICAgICAgICAgLypuYl9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgIHByb3h5X2ludCwgICAgICAgICAgICAgIC8qbmJfaW50Ki8KKyAgICBwcm94eV9sb25nLCAgICAgICAgICAgICAvKm5iX2xvbmcqLworICAgIHByb3h5X2Zsb2F0LCAgICAgICAgICAgIC8qbmJfZmxvYXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qbmJfb2N0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKm5iX2hleCovCisgICAgcHJveHlfaWFkZCwgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgcHJveHlfaXN1YiwgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3N1YnRyYWN0Ki8KKyAgICBwcm94eV9pbXVsLCAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIHByb3h5X2ltb2QsICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9yZW1haW5kZXIqLworICAgIHByb3h5X2lwb3csICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9wb3dlciovCisgICAgcHJveHlfaWxzaGlmdCwgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgcHJveHlfaXJzaGlmdCwgICAgICAgICAgLypuYl9pbnBsYWNlX3JzaGlmdCovCisgICAgcHJveHlfaWFuZCwgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FuZCovCisgICAgcHJveHlfaXhvciwgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgcHJveHlfaW9yLCAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX29yKi8KIH07CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBwcm94eV9hc19zZXF1ZW5jZSA9IHsKQEAgLTYzMiw4ICs2MzEsOCBAQAogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgcHJveHlfYXNfbWFwcGluZyA9IHsKLSAgICAobGVuZnVuYylwcm94eV9sZW5ndGgsICAgICAgLyptcF9sZW5ndGgqLwotICAgIChiaW5hcnlmdW5jKXByb3h5X2dldGl0ZW0sICAvKm1wX3N1YnNjcmlwdCovCisgICAgKGxlbmZ1bmMpcHJveHlfbGVuZ3RoLCAgICAgICAgLyptcF9sZW5ndGgqLworICAgIHByb3h5X2dldGl0ZW0sICAgICAgICAgICAgICAgIC8qbXBfc3Vic2NyaXB0Ki8KICAgICAob2Jqb2JqYXJncHJvYylwcm94eV9zZXRpdGVtLCAvKm1wX2Fzc19zdWJzY3JpcHQqLwogfTsKIApAQCAtNjUxLDE0ICs2NTAsMTQgQEAKICAgICAwLAkJCQkgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAJCQkJICAgICAgICAvKiB0cF9zZXRhdHRyICovCiAgICAgcHJveHlfY29tcGFyZSwJCSAgICAgICAgLyogdHBfY29tcGFyZSAqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfcmVwciwJICAgICAgICAvKiB0cF9yZXByICovCisgICAgKHJlcHJmdW5jKXByb3h5X3JlcHIsCSAgICAgICAgLyogdHBfcmVwciAqLwogICAgICZwcm94eV9hc19udW1iZXIsCQkgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwogICAgICZwcm94eV9hc19zZXF1ZW5jZSwJCSAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAmcHJveHlfYXNfbWFwcGluZywJCSAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwogICAgIDAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgICh0ZXJuYXJ5ZnVuYykwLAkgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgICh1bmFyeWZ1bmMpcHJveHlfc3RyLAkgICAgICAgIC8qIHRwX3N0ciAqLwotICAgIChnZXRhdHRyb2Z1bmMpcHJveHlfZ2V0YXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgcHJveHlfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgcHJveHlfZ2V0YXR0ciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAoc2V0YXR0cm9mdW5jKXByb3h5X3NldGF0dHIsICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsCQkJCSAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCkBAIC02OTEsOSArNjkwLDkgQEAKICAgICAmcHJveHlfYXNfc2VxdWVuY2UsCQkgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCiAgICAgJnByb3h5X2FzX21hcHBpbmcsCQkgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KICAgICAwLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLSAgICAodGVybmFyeWZ1bmMpcHJveHlfY2FsbCwJICAgICAgICAvKiB0cF9jYWxsICovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9zdHIsCSAgICAgICAgLyogdHBfc3RyICovCi0gICAgKGdldGF0dHJvZnVuYylwcm94eV9nZXRhdHRyLCAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBwcm94eV9jYWxsLAkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgcHJveHlfc3RyLAkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBwcm94eV9nZXRhdHRyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIChzZXRhdHRyb2Z1bmMpcHJveHlfc2V0YXR0ciwgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwJCQkJICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKZGlmZiAtLWdpdCBhL1BDL1ZDNi9weXRob25jb3JlLmRzcCBiL1BDL1ZDNi9weXRob25jb3JlLmRzcAppbmRleCAwNGExMjI0Li5jZjMyMDBjIDEwMDY0NAotLS0gYS9QQy9WQzYvcHl0aG9uY29yZS5kc3AKKysrIGIvUEMvVkM2L3B5dGhvbmNvcmUuZHNwCkBAIC01MzUsMTQgKzUzNSw2IEBACiAjIEVuZCBTb3VyY2UgRmlsZQ0KICMgQmVnaW4gU291cmNlIEZpbGUNCiANCi1TT1VSQ0U9Li5cLi5cTW9kdWxlc1xyZWdleG1vZHVsZS5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQotU09VUkNFPS4uXC4uXE1vZHVsZXNccmVnZXhwci5jDQotIyBFbmQgU291cmNlIEZpbGUNCi0jIEJlZ2luIFNvdXJjZSBGaWxlDQotDQogU09VUkNFPS4uXC4uXE1vZHVsZXNccmdiaW1nbW9kdWxlLmMNCiAjIEVuZCBTb3VyY2UgRmlsZQ0KICMgQmVnaW4gU291cmNlIEZpbGUNCmRpZmYgLS1naXQgYS9QQy9fc3VicHJvY2Vzcy5jIGIvUEMvX3N1YnByb2Nlc3MuYwppbmRleCAxY2E0ZWNlLi43OGNlYjdkIDEwMDY0NAotLS0gYS9QQy9fc3VicHJvY2Vzcy5jCisrKyBiL1BDL19zdWJwcm9jZXNzLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogewogCWlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCiAJCUNsb3NlSGFuZGxlKHNlbGYtPmhhbmRsZSk7Ci0JUHlNZW1fREVMKHNlbGYpOworCVB5T2JqZWN0X0ZSRUUoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzcF9oYW5kbGVfbWV0aG9kc1tdID0gewpkaWZmIC0tZ2l0IGEvUEMvY29uZmlnLmMgYi9QQy9jb25maWcuYwppbmRleCBlZTYyZGM1Li43NWUxYTNjIDEwMDY0NAotLS0gYS9QQy9jb25maWcuYworKysgYi9QQy9jb25maWcuYwpAQCAtMjAsNyArMjAsNiBAQAogZXh0ZXJuIHZvaWQgaW5pdF9tZDUodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0bnQodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0b3BlcmF0b3Iodm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0cmVnZXgodm9pZCk7CiAjaWZuZGVmIE1TX1dJTjY0CiBleHRlcm4gdm9pZCBpbml0cmdiaW1nKHZvaWQpOwogI2VuZGlmCkBAIC05NSw3ICs5NCw2IEBACiAgICAgICAgIHsiX21kNSIsIGluaXRfbWQ1fSwKICAgICAgICAgeyJudCIsIGluaXRudH0sIC8qIFVzZSB0aGUgTlQgb3MgZnVuY3Rpb25zLCBub3QgcG9zaXggKi8KICAgICAgICAgeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCi0gICAgICAgIHsicmVnZXgiLCBpbml0cmVnZXh9LAogI2lmbmRlZiBNU19XSU42NAogICAgICAgICB7InJnYmltZyIsIGluaXRyZ2JpbWd9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9QQy9kbGxiYXNlX250LnR4dCBiL1BDL2RsbGJhc2VfbnQudHh0CmluZGV4IDk0NGVmOTUuLmMwNmU0OTcgMTAwNjQ0Ci0tLSBhL1BDL2RsbGJhc2VfbnQudHh0CisrKyBiL1BDL2RsbGJhc2VfbnQudHh0CkBAIC0zMyw2ICszMyw3IEBACiAgLSBiWjIgICAgICAgICAgICAgICAgICAgICAgIDFEMTcwMDAwIC0gMUQxODAwMDAKICAtIGRhdGV0aW1lICAgICAgICAgICAgICAgICAgMUQxODAwMDAgLSAxRDE5MDAwMCAgICBweWQgcmVtb3ZlZCBpbiAyLjQKICAtIF9jc3YgICAgICAgICAgICAgICAgICAgICAgMUQxOTAwMDAgLSAxRDFBMDAwMCAgICBweWQgcmVtb3ZlZCBpbiAyLjQKKyAtIF9jdHlwZXMgICAgICAgICAgICAgICAgICAgMUQxQTAwMDAgLSAxRDFCMDAwMAogCiBPdGhlciBleHRlbnNpb24gbW9kdWxlcwogIC0gd2luMzJhcGkgICAgICAgICAgICAgICAgICAxZTIwMDAwMCAtIDFlMjIwMDAwCmRpZmYgLS1naXQgYS9QQy9vczJlbXgvTWFrZWZpbGUgYi9QQy9vczJlbXgvTWFrZWZpbGUKaW5kZXggODQ3ZmE2Ny4uNzYyYmZkYiAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L01ha2VmaWxlCisrKyBiL1BDL29zMmVteC9NYWtlZmlsZQpAQCAtMzA0LDggKzMwNCw2IEBACiAJCU1vZHVsZXMvbWQ1bW9kdWxlLmMgXAogCQlNb2R1bGVzL29wZXJhdG9yLmMgXAogCQlNb2R1bGVzL19yYW5kb21tb2R1bGUuYyBcCi0JCU1vZHVsZXMvcmVnZXhtb2R1bGUuYyBcCi0JCU1vZHVsZXMvcmVnZXhwci5jIFwKIAkJTW9kdWxlcy9yZ2JpbWdtb2R1bGUuYyBcCiAJCU1vZHVsZXMvc2hhbW9kdWxlLmMgXAogCQlNb2R1bGVzL19zcmUuYyBcCmRpZmYgLS1naXQgYS9QQy9vczJlbXgvY29uZmlnLmMgYi9QQy9vczJlbXgvY29uZmlnLmMKaW5kZXggNWVlNDM0My4uNDBjMmNkYyAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L2NvbmZpZy5jCisrKyBiL1BDL29zMmVteC9jb25maWcuYwpAQCAtNjQsNyArNjQsNiBAQAogZXh0ZXJuIHZvaWQgaW5pdG1hdGgoKTsKIGV4dGVybiB2b2lkIGluaXRtZDUoKTsKIGV4dGVybiB2b2lkIGluaXRvcGVyYXRvcigpOwotZXh0ZXJuIHZvaWQgaW5pdHJlZ2V4KCk7CiBleHRlcm4gdm9pZCBpbml0cmdiaW1nKCk7CiBleHRlcm4gdm9pZCBpbml0c2hhKCk7CiBleHRlcm4gdm9pZCBpbml0c3Ryb3AoKTsKQEAgLTEyOCw3ICsxMjcsNiBAQAogCXsibWF0aCIsIGluaXRtYXRofSwKIAl7Im1kNSIsIGluaXRtZDV9LAogCXsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAotCXsicmVnZXgiLCBpbml0cmVnZXh9LAogCXsicmdiaW1nIiwgaW5pdHJnYmltZ30sCiAJeyJzaGEiLCBpbml0c2hhfSwKIAl7InN0cm9wIiwgaW5pdHN0cm9wfSwKZGlmZiAtLWdpdCBhL1BDL29zMmVteC9weXRob24yNC5kZWYgYi9QQy9vczJlbXgvcHl0aG9uMjQuZGVmCmluZGV4IDRmNzg5MTQuLjUzNGRmZjggMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9weXRob24yNC5kZWYKKysrIGIvUEMvb3MyZW14L3B5dGhvbjI0LmRlZgpAQCAtMTEzNCwxOSArMTEzNCw2IEBACiA7IEZyb20gcHl0aG9uMjRfcy5saWIoX3JhbmRvbW1vZHVsZSkKIDsgICJpbml0X3JhbmRvbSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHJlZ2V4bW9kdWxlKQotOyAgImluaXRyZWdleCIKLQotOyBGcm9tIHB5dGhvbjI0X3MubGliKHJlZ2V4cHIpCi07ICAiX1B5X3JlX3N5bnRheF90YWJsZSIKLTsgICJfUHlfcmVfY29tcGlsZV9pbml0aWFsaXplIgotOyAgIl9QeV9yZV9jb21waWxlX3BhdHRlcm4iCi07ICAiX1B5X3JlX21hdGNoIgotOyAgIl9QeV9yZV9zZWFyY2giCi07ICAiX1B5X3JlX3NldF9zeW50YXgiCi07ICAiX1B5X3JlX2NvbXBpbGVfZmFzdG1hcCIKLTsgICJfUHlfcmVfc3ludGF4IgotCiA7IEZyb20gcHl0aG9uMjRfcy5saWIocmdiaW1nbW9kdWxlKQogOyAgImluaXRyZ2JpbWciCiAKZGlmZiAtLWdpdCBhL1BDL29zMnZhY3BwL2NvbmZpZy5jIGIvUEMvb3MydmFjcHAvY29uZmlnLmMKaW5kZXggNzUxMmRlNS4uOWJiNTc1MiAxMDA2NDQKLS0tIGEvUEMvb3MydmFjcHAvY29uZmlnLmMKKysrIGIvUEMvb3MydmFjcHAvY29uZmlnLmMKQEAgLTI3LDcgKzI3LDYgQEAKIGV4dGVybiB2b2lkIGluaXRvczIodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0b3BlcmF0b3Iodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0cG9zaXgodm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0cmVnZXgodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0cmdiaW1nKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdHNpZ25hbCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRzZWxlY3Qodm9pZCk7CkBAIC03MCw3ICs2OSw2IEBACiAjZW5kaWYKICNlbmRpZgogICAgICAgICB7Im9wZXJhdG9yIiwgaW5pdG9wZXJhdG9yfSwKLSAgICAgICAgeyJyZWdleCIsIGluaXRyZWdleH0sCiAvLyAgICAgICAgeyJyZ2JpbWciLCBpbml0cmdiaW1nfSwKICAgICAgICAgeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKICNpZmRlZiBVU0VfU09DS0VUCmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9tYWtlZmlsZSBiL1BDL29zMnZhY3BwL21ha2VmaWxlCmluZGV4IDk5NGFjNDkuLmYzNDA0N2YgMTAwNjQ0Ci0tLSBhL1BDL29zMnZhY3BwL21ha2VmaWxlCisrKyBiL1BDL29zMnZhY3BwL21ha2VmaWxlCkBAIC05NDgsMzQgKzk0OCw2IEBACiAJICQoUFlfSU5DTFVERSlcc2xpY2VvYmplY3QuaCAkKFBZX0lOQ0xVREUpXHN0cmluZ29iamVjdC5oIFwKIAkgJChQWV9JTkNMVURFKVxzeXNtb2R1bGUuaCAkKFBZX0lOQ0xVREUpXHRyYWNlYmFjay5oICQoUFlfSU5DTFVERSlcdHVwbGVvYmplY3QuaAogCi1yZWdleG1vZHVsZS5vYmo6ICQoUFlfSU5DTFVERSlcYWJzdHJhY3QuaCAkKFBZX0lOQ0xVREUpXGNldmFsLmggXAotCSAkKFBZX0lOQ0xVREUpXGNsYXNzb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb21wbGV4b2JqZWN0LmggXAotCSBweWNvbmZpZy5oICQoUFlfSU5DTFVERSlcZGljdG9iamVjdC5oICQoUFlfSU5DTFVERSlcZmlsZW9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxmbG9hdG9iamVjdC5oICQoUFlfSU5DTFVERSlcZnVuY29iamVjdC5oICQoUFlfSU5DTFVERSlcaW1wb3J0LmggXAotCSAkKFBZX0lOQ0xVREUpXGludG9iamVjdC5oICQoUFlfSU5DTFVERSlcaW50cmNoZWNrLmggJChQWV9JTkNMVURFKVxsaXN0b2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXGxvbmdvYmplY3QuaCAkKFBZX0lOQ0xVREUpXG1ldGhvZG9iamVjdC5oIFwKLQkgJChQWV9JTkNMVURFKVxtb2RzdXBwb3J0LmggJChQWV9JTkNMVURFKVxtb2R1bGVvYmplY3QuaCAkKFBZX0lOQ0xVREUpXG15bWFsbG9jLmggXAotCSAkKFBZX0lOQ0xVREUpXG15cHJvdG8uaCAkKFBZX0lOQ0xVREUpXG9iamVjdC5oICQoUFlfSU5DTFVERSlcb2JqaW1wbC5oIFwKLQkgJChQWV9JTkNMVURFKVxweWRlYnVnLmggJChQWV9JTkNMVURFKVxweWVycm9ycy5oICQoUFlfSU5DTFVERSlccHlmcGUuaCBcCi0JICQoUFlfSU5DTFVERSlccHlzdGF0ZS5oICQoUFlfSU5DTFVERSlccHl0aG9uLmggJChQWV9JTkNMVURFKVxweXRob25ydW4uaCBcCi0JICQoUFlfSU5DTFVERSlccmFuZ2VvYmplY3QuaCAkKFBZX01PRFVMRVMpXHJlZ2V4cHIuaCAkKFBZX0lOQ0xVREUpXHNsaWNlb2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXHN0cmluZ29iamVjdC5oICQoUFlfSU5DTFVERSlcc3lzbW9kdWxlLmggJChQWV9JTkNMVURFKVx0cmFjZWJhY2suaCBcCi0JICQoUFlfSU5DTFVERSlcdHVwbGVvYmplY3QuaAotCi1yZWdleHByLm9iajogJChQWV9JTkNMVURFKVxhYnN0cmFjdC5oICQoUFlfSU5DTFVERSlcY2V2YWwuaCBcCi0JICQoUFlfSU5DTFVERSlcY2xhc3NvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGNvYmplY3QuaCAkKFBZX0lOQ0xVREUpXGNvbXBsZXhvYmplY3QuaCBcCi0JIHB5Y29uZmlnLmggJChQWV9JTkNMVURFKVxkaWN0b2JqZWN0LmggJChQWV9JTkNMVURFKVxmaWxlb2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXGZsb2F0b2JqZWN0LmggJChQWV9JTkNMVURFKVxmdW5jb2JqZWN0LmggJChQWV9JTkNMVURFKVxpbXBvcnQuaCBcCi0JICQoUFlfSU5DTFVERSlcaW50b2JqZWN0LmggJChQWV9JTkNMVURFKVxpbnRyY2hlY2suaCAkKFBZX0lOQ0xVREUpXGxpc3RvYmplY3QuaCBcCi0JICQoUFlfSU5DTFVERSlcbG9uZ29iamVjdC5oICQoUFlfSU5DTFVERSlcbWV0aG9kb2JqZWN0LmggXAotCSAkKFBZX0lOQ0xVREUpXG1vZHN1cHBvcnQuaCAkKFBZX0lOQ0xVREUpXG1vZHVsZW9iamVjdC5oICQoUFlfSU5DTFVERSlcbXltYWxsb2MuaCBcCi0JICQoUFlfSU5DTFVERSlcbXlwcm90by5oICQoUFlfSU5DTFVERSlcb2JqZWN0LmggJChQWV9JTkNMVURFKVxvYmppbXBsLmggXAotCSAkKFBZX0lOQ0xVREUpXHB5ZGVidWcuaCAkKFBZX0lOQ0xVREUpXHB5ZXJyb3JzLmggJChQWV9JTkNMVURFKVxweWZwZS5oIFwKLQkgJChQWV9JTkNMVURFKVxweXN0YXRlLmggJChQWV9JTkNMVURFKVxweXRob24uaCAkKFBZX0lOQ0xVREUpXHB5dGhvbnJ1bi5oIFwKLQkgJChQWV9JTkNMVURFKVxyYW5nZW9iamVjdC5oICQoUFlfTU9EVUxFUylccmVnZXhwci5oICQoUFlfSU5DTFVERSlcc2xpY2VvYmplY3QuaCBcCi0JICQoUFlfSU5DTFVERSlcc3RyaW5nb2JqZWN0LmggJChQWV9JTkNMVURFKVxzeXNtb2R1bGUuaCAkKFBZX0lOQ0xVREUpXHRyYWNlYmFjay5oIFwKLQkgJChQWV9JTkNMVURFKVx0dXBsZW9iamVjdC5oCi0KIHJlc291cmNlLm9iajogJChQWV9JTkNMVURFKVxhYnN0cmFjdC5oICQoT1MyVENQSVApXEluY2x1ZGVcc3lzXHRpbWUuaCAkKFBZX0lOQ0xVREUpXGNldmFsLmggXAogCSAkKFBZX0lOQ0xVREUpXGNsYXNzb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb2JqZWN0LmggJChQWV9JTkNMVURFKVxjb21wbGV4b2JqZWN0LmggXAogCSBweWNvbmZpZy5oICQoUFlfSU5DTFVERSlcZGljdG9iamVjdC5oICQoUFlfSU5DTFVERSlcZmlsZW9iamVjdC5oIFwKZGlmZiAtLWdpdCBhL1BDL29zMnZhY3BwL21ha2VmaWxlLm9tayBiL1BDL29zMnZhY3BwL21ha2VmaWxlLm9tawppbmRleCAwZDExYjZhLi45NTgyMzM4IDEwMDY0NAotLS0gYS9QQy9vczJ2YWNwcC9tYWtlZmlsZS5vbWsKKysrIGIvUEMvb3MydmFjcHAvbWFrZWZpbGUub21rCkBAIC02OTksMzAgKzY5OSw2IEBACiAJIHB5dGhvbnJ1bi5oIHJhbmdlb2JqZWN0Lmggc2xpY2VvYmplY3QuaCBzdHJpbmdvYmplY3QuaCBzeXNtb2R1bGUuaCBcCiAJIHRyYWNlYmFjay5oIHR1cGxlb2JqZWN0LmgKIAotcmVnZXhtb2R1bGUub2JqOiBhYnN0cmFjdC5oIGNldmFsLmggY2xhc3NvYmplY3QuaCBjb2JqZWN0LmggY29tcGxleG9iamVjdC5oIFwKLQkgcHljb25maWcuaCBkaWN0b2JqZWN0LmggZmlsZW9iamVjdC5oIGZsb2F0b2JqZWN0LmggZnVuY29iamVjdC5oIFwKLQkgaW1wb3J0LmggaW50b2JqZWN0LmggaW50cmNoZWNrLmggbGlzdG9iamVjdC5oIGxvbmdvYmplY3QuaCBcCi0JIG1ldGhvZG9iamVjdC5oIG1vZHN1cHBvcnQuaCBtb2R1bGVvYmplY3QuaCBteW1hbGxvYy5oIG15cHJvdG8uaCBcCi0JIG9iamVjdC5oIG9iamltcGwuaCBweWRlYnVnLmggcHllcnJvcnMuaCBweWZwZS5oIHB5c3RhdGUuaCBweXRob24uaCBcCi0JIHB5dGhvbnJ1bi5oIHJhbmdlb2JqZWN0LmggcmVnZXhwci5oIHNsaWNlb2JqZWN0Lmggc3RyaW5nb2JqZWN0LmggXAotCSBzeXNtb2R1bGUuaCB0cmFjZWJhY2suaCB0dXBsZW9iamVjdC5oCi0KLXJlZ2V4cHIub2JqOiBhYnN0cmFjdC5oIGNldmFsLmggY2xhc3NvYmplY3QuaCBjb2JqZWN0LmggXAotCSBjb21wbGV4b2JqZWN0LmggcHljb25maWcuaCBkaWN0b2JqZWN0LmggZmlsZW9iamVjdC5oIGZsb2F0b2JqZWN0LmggXAotCSBmdW5jb2JqZWN0LmggaW1wb3J0LmggaW50b2JqZWN0LmggaW50cmNoZWNrLmggbGlzdG9iamVjdC5oIFwKLQkgbG9uZ29iamVjdC5oIG1ldGhvZG9iamVjdC5oIG1vZHN1cHBvcnQuaCBtb2R1bGVvYmplY3QuaCBteW1hbGxvYy5oIFwKLQkgbXlwcm90by5oIG9iamVjdC5oIG9iamltcGwuaCBweWRlYnVnLmggcHllcnJvcnMuaCBweWZwZS5oIFwKLQkgcHlzdGF0ZS5oIHB5dGhvbi5oIHB5dGhvbnJ1bi5oIHJhbmdlb2JqZWN0LmggcmVnZXhwci5oIFwKLQkgc2xpY2VvYmplY3QuaCBzdHJpbmdvYmplY3QuaCBzeXNtb2R1bGUuaCB0cmFjZWJhY2suaCB0dXBsZW9iamVjdC5oCi0KLXJlb3Btb2R1bGUub2JqOiBhYnN0cmFjdC5oIGNldmFsLmggY2xhc3NvYmplY3QuaCBjb2JqZWN0LmggY29tcGxleG9iamVjdC5oIFwKLQkgcHljb25maWcuaCBkaWN0b2JqZWN0LmggZmlsZW9iamVjdC5oIGZsb2F0b2JqZWN0LmggZnVuY29iamVjdC5oIFwKLQkgaW1wb3J0LmggaW50b2JqZWN0LmggaW50cmNoZWNrLmggbGlzdG9iamVjdC5oIGxvbmdvYmplY3QuaCBcCi0JIG1ldGhvZG9iamVjdC5oIG1vZHN1cHBvcnQuaCBtb2R1bGVvYmplY3QuaCBteW1hbGxvYy5oIG15cHJvdG8uaCBcCi0JIG9iamVjdC5oIG9iamltcGwuaCBweWRlYnVnLmggcHllcnJvcnMuaCBweWZwZS5oIHB5c3RhdGUuaCBweXRob24uaCBcCi0JIHB5dGhvbnJ1bi5oIHJhbmdlb2JqZWN0LmggcmVnZXhwci5oIHNsaWNlb2JqZWN0Lmggc3RyaW5nb2JqZWN0LmggXAotCSBzeXNtb2R1bGUuaCB0cmFjZWJhY2suaCB0dXBsZW9iamVjdC5oCi0KIHJlc291cmNlLm9iajogYWJzdHJhY3QuaCBjOlxtcHRuXGluY2x1ZGVcc3lzXHRpbWUuaCBjZXZhbC5oIGNsYXNzb2JqZWN0LmggXAogCSBjb2JqZWN0LmggY29tcGxleG9iamVjdC5oIHB5Y29uZmlnLmggZGljdG9iamVjdC5oIGZpbGVvYmplY3QuaCBcCiAJIGZsb2F0b2JqZWN0LmggZnVuY29iamVjdC5oIGltcG9ydC5oIGludG9iamVjdC5oIGludHJjaGVjay5oIFwKZGlmZiAtLWdpdCBhL1BDL29zMnZhY3BwL3B5dGhvbi5kZWYgYi9QQy9vczJ2YWNwcC9weXRob24uZGVmCmluZGV4IGJjNzNmYWMuLjc5ZDA1YjAgMTAwNjQ0Ci0tLSBhL1BDL29zMnZhY3BwL3B5dGhvbi5kZWYKKysrIGIvUEMvb3MydmFjcHAvcHl0aG9uLmRlZgpAQCAtNDY0LDEyICs0NjQsNiBAQAogOyAgICAgICAgICAgICAgIF9QeV9tZXJnZWJpdHNldAogOyAgICAgICAgICAgICAgIF9QeV9tZXRhX2dyYW1tYXIKIDsgICAgICAgICAgICAgICBfUHlfbmV3Yml0c2V0Ci0gICAgICAgICAgICAgICBfUHlfcmVfY29tcGlsZV9mYXN0bWFwCi0gICAgICAgICAgICAgICBfUHlfcmVfY29tcGlsZV9pbml0aWFsaXplCi0gICAgICAgICAgICAgICBfUHlfcmVfY29tcGlsZV9wYXR0ZXJuCi0gICAgICAgICAgICAgICBfUHlfcmVfbWF0Y2gKLSAgICAgICAgICAgICAgIF9QeV9yZV9zZWFyY2gKLSAgICAgICAgICAgICAgIF9QeV9yZV9zZXRfc3ludGF4CiA7ICAgICAgICAgICAgICAgX1B5X3NhbWViaXRzZXQKICAgICAgICAgICAgICAgIFB5QnVmZmVyX1R5cGUKICAgICAgICAgICAgICAgIFB5QnVmZmVyX0Zyb21PYmplY3QKZGlmZiAtLWdpdCBhL1BDL3Rlc3RweS5weSBiL1BDL3Rlc3RweS5weQppbmRleCBmODc0NmEzLi43OGFkNjNjIDEwMDY0NAotLS0gYS9QQy90ZXN0cHkucHkKKysrIGIvUEMvdGVzdHB5LnB5CkBAIC01LDIzICs1LDIzIEBACiAjIGNoYW5nZSB0aGlzIG1vZHVsZSB0b28uCiAKIHRyeToKLSAgICBpbXBvcnQgc3RyaW5nCisgICAgaW1wb3J0IG9zCiBleGNlcHQ6Ci0gICAgcHJpbnQgIiIiQ291bGQgbm90IGltcG9ydCB0aGUgc3RhbmRhcmQgInN0cmluZyIgbW9kdWxlLgorICAgIHByaW50ICIiIkNvdWxkIG5vdCBpbXBvcnQgdGhlIHN0YW5kYXJkICJvcyIgbW9kdWxlLgogICBQbGVhc2UgY2hlY2sgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiIiIgogICAgIHN5cy5leGl0KDEpCiAKIHRyeToKLSAgICBpbXBvcnQgcmVnZXhfc3ludGF4CisgICAgaW1wb3J0IHN5bWJvbAogZXhjZXB0OgotICAgIHByaW50ICIiIkNvdWxkIG5vdCBpbXBvcnQgdGhlIHN0YW5kYXJkICJyZWdleF9zeW50YXgiIG1vZHVsZS4gIElmIHRoaXMgaXMKKyAgICBwcmludCAiIiJDb3VsZCBub3QgaW1wb3J0IHRoZSBzdGFuZGFyZCAic3ltYm9sIiBtb2R1bGUuICBJZiB0aGlzIGlzCiAgIGEgUEMsIHlvdSBzaG91bGQgYWRkIHRoZSBkb3NfOHgzIGRpcmVjdG9yeSB0byB5b3VyIFBZVEhPTlBBVEguIiIiCiAgICAgc3lzLmV4aXQoMSkKIAogaW1wb3J0IG9zCiAKIGZvciBkaXIgaW4gc3lzLnBhdGg6Ci0gICAgZmlsZSA9IG9zLnBhdGguam9pbihkaXIsICJzdHJpbmcucHkiKQorICAgIGZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCAib3MucHkiKQogICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGUpOgogICAgICAgICB0ZXN0ID0gb3MucGF0aC5qb2luKGRpciwgInRlc3QiKQogICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRlc3QpOgpkaWZmIC0tZ2l0IGEvUEMvdGl4LmRpZmYgYi9QQy90aXguZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhMjcxZi4uMDAwMDAwMAotLS0gYS9QQy90aXguZGlmZgorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1kaWZmIC11ciB0aXgtOC4xLjQvd2luL2NvbW1vbi5tYWsgdGl4LTguMS40Lm5ldy93aW4vY29tbW9uLm1hawotLS0tIHRpeC04LjEuNC93aW4vY29tbW9uLm1hawkyMDAyLTEyLTExIDA3OjE5OjQyLjAwMDAwMDAwMCArMDEwMAotKysrIHRpeC04LjEuNC5uZXcvd2luL2NvbW1vbi5tYWsJMjAwNC0wOC0wMyAyMTo0NTowOS44NTkzNzUwMDAgKzAyMDAKLUBAIC0xOCwxMCArMTgsMTAgQEAKLSAjCSAgICBzdXBwb3J0IGZpbGVzCi0gIwotICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tVENMX1ZFUiAgICAgICAgICA9IDguMwotK1RDTF9WRVIgICAgICAgICAgPSA4LjQKLSBJVENMX1ZFUiAgICAgICAgICA9IAotIAotLUlOU1RBTExESVIgICAgICA9IEM6XHByb2dyYX4xXHRjbAotK0lOU1RBTExESVIgICAgICA9IC4uXC4uXHRjbHRrCi0gCi0gIUlGTkRFRiBUSVhfREVCVUcKLSBOT0RFQlVHID0gMQotQEAgLTYxLDcgKzYxLDcgQEAKLSAhSUYgIiQoVENMX1ZFUikiID09ICI4LjQiCi0gVENMTUFKT1I9OAotIFRDTE1JTk9SPTQKLS1UQ0xQQVRDSD0xCi0rVENMUEFUQ0g9NwotIFRNUERJUiAgICAgICAgICA9IHRrJChUQ0xfVkVSKQotICFFTkRJRgotIAotQEAgLTE3NiwxNCArMTc2LDE0IEBACi0gCSQoVE1QRElSKVx0aXhXaW5XbS5vYmoKLSAKLSBSTURJUgkJPSAkKFRDTERJUilcd2luXHJtZC5iYXQKLS1NS0RJUgkJPSAkKFRDTERJUilcd2luXG1rZC5iYXQKLStNS0RJUgkJPSBta2RpcgotIFJNCQk9IGRlbAotIAotIGluc3RhbGw6ICAgIGluc3RhbGwtYmluYXJpZXMgaW5zdGFsbC1saWJyYXJpZXMKLSAKLSBpbnN0YWxsLWJpbmFyaWVzOiAkKFRDTFNIKQotLQkkKE1LRElSKSAiJChCSU5fSU5TVEFMTF9ESVIpIgotLQkkKE1LRElSKSAiJChMSUJfSU5TVEFMTF9ESVIpIgotKwktJChNS0RJUikgIiQoQklOX0lOU1RBTExfRElSKSIKLSsJLSQoTUtESVIpICIkKExJQl9JTlNUQUxMX0RJUikiCi0gCUBlY2hvIGluc3RhbGxpbmcgJChUSVhETEwpCi0gCUBjb3B5ICIkKFRJWERMTCkiICIkKEJJTl9JTlNUQUxMX0RJUikiCi0gCUBjb3B5ICIkKFRJWExJQikiICIkKExJQl9JTlNUQUxMX0RJUikiCi1kaWZmIC11ciB0aXgtOC4xLjQvd2luL21ha2VmaWxlLnZjIHRpeC04LjEuNC5uZXcvd2luL21ha2VmaWxlLnZjCi0tLS0gdGl4LTguMS40L3dpbi9tYWtlZmlsZS52YwkyMDAyLTEyLTAyIDA0OjAyOjU0LjAwMDAwMDAwMCArMDEwMAotKysrIHRpeC04LjEuNC5uZXcvd2luL21ha2VmaWxlLnZjCTIwMDQtMDgtMDMgMjE6NDI6MDcuOTUzMTI1MDAwICswMjAwCi1AQCAtNTQsMTIgKzU0LDExIEBACi0gREJHWCA9IGQKLSAhRU5ESUYKLSAKLS1jYzMyICAgPSAiJChUT09MUzMyKVxiaW5cY2wuZXhlIgotLXJjMzIgICA9ICIkKFRPT0xTMzJfcmMpXGJpblxyYy5leGUiCi0tbGluazMyID0gIiQoVE9PTFMzMilcYmluXGxpbmsuZXhlIgotLWluY2x1ZGUzMiA9IC1JIiQoVE9PTFMzMilcaW5jbHVkZSIKLStjYzMyICAgPSAiY2wuZXhlIgotK3JjMzIgICA9ICJyYy5leGUiCi0rbGluazMyID0gImxpbmsuZXhlIgotIAotLVRJWF9JTkNMVURFUyA9ICQoaW5jbHVkZTMyKSBcCi0rVElYX0lOQ0xVREVTID0gXAotIAktSSQoUk9PVClcd2luIC1JJChST09UKVxnZW5lcmljIFwKLSAJLUkkKFRLRElSKVxnZW5lcmljIC1JJChUS0RJUilcd2luIC1JJChUS0RJUilceGxpYiBcCi0gCS1JJChUQ0xESVIpXGdlbmVyaWMgJChJVENMX0NGTEFHUykKLUBAIC0xNzEsNyArMTcwLDcgQEAKLSAjCi0gY3ZhcnNkbGwgID0gLURfWDg2Xz0xIC1EV0lOMzIgLURfV0lOMzIgLURfTVQgLURfRExMCi0gY2ZsYWdzZGxsID0gJChjdmFyc2RsbCkgLWMgLVczIC1ub2xvZ28gLUZwJChUTVBESVIpXCAtWVggLU1EIFwKLS0JICAgIC1PdGkgLUdzIC1HRAotKwkgICAgLU90aSAtR3MgLUdkCi0gCi0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICMgUHJvamVjdCBzcGVjaWZpYyB0YXJnZXRzCi1AQCAtMTgxLDcgKzE4MCw2IEBACi0gCi0gJChEVU1QRVhUUyk6ICQoV0lORElSKVx3aW5EdW1wRXh0cy5jCi0gCSQoY2MzMikgJChDT05fQ0ZMQUdTKSAtRm8kKFRNUERJUilcIC9jICQ/Ci0tCXNldCBMSUI9IiQoVE9PTFMzMilcbGliIgotIAkkKGxpbmszMikgJChsZGVidWcpICQoY29ubGZsYWdzKSAkKGd1aWxpYnMpIC1vdXQ6JEAgXAotIAkJJChUTVBESVIpXHdpbkR1bXBFeHRzLm9iaiAKLSAKLUBAIC0xOTMsNyArMTkxLDYgQEAKLSAjIChUb0RvKSAkKFRJWERMTCkgZG9lc24ndCBoYXZlIHJlc291cmNlcyB0byBkZWZpbmUgaXRzIGljb24sIGV0Yy4KLSAjCi0gJChUSVhETEwpOiAkKFRJWE9CSlMpICQoVE1QRElSKVx0aXh2Yy5kZWYKLS0Jc2V0IExJQj0iJChUT09MUzMyKVxsaWIiCi0gCSQobGluazMyKSAkKGxkZWJ1ZykgJChkbGxsZmxhZ3MpIC1kZWY6JChUTVBESVIpXHRpeHZjLmRlZiBcCi0gCQkkKFRLTElCRElSKVwkKFRLTElCKSAkKFRDTExJQkRJUilcJChUQ0xMSUIpICQoZ3VpbGlic2RsbCkgXAotIAkJJChJVENMX0xJQlMpIC1vdXQ6JEAgQDw8Ci1AQCAtMjAyLDcgKzE5OSw2IEBACi0gCi0gCi0gJChUSVhXSVNIKTogJChXSVNIT0JKUykgJChUSVhPQkpTKSAkKFRJWExJQikgJChUTVBESVIpXHRpeHdpc2gucmVzCi0tCXNldCBMSUI9IiQoVE9PTFMzMilcbGliIgotIAkkKGxpbmszMikgJChsZGVidWcpICQoZ3VpbGZsYWdzKSBcCi0gCQkkKFdJU0hPQkpTKSAkKFRNUERJUilcdGl4d2lzaC5yZXMgJChUSVhMSUIpIFwKLSAJCSQoVEtMSUJESVIpXCQoVEtMSUIpICQoVENMTElCRElSKVwkKFRDTExJQikgJChndWlsaWJzZGxsKSBcCi1kaWZmIC11ciB0aXgtOC4xLjQvd2luL3RrOC40L3BrZ0luZGV4LnRjbCB0aXgtOC4xLjQubmV3L3dpbi90azguNC9wa2dJbmRleC50Y2wKLS0tLSB0aXgtOC4xLjQvd2luL3RrOC40L3BrZ0luZGV4LnRjbAkyMDAyLTEyLTE1IDA0OjIxOjU0LjAwMDAwMDAwMCArMDEwMAotKysrIHRpeC04LjEuNC5uZXcvd2luL3RrOC40L3BrZ0luZGV4LnRjbAkyMDA0LTA4LTMxIDA4OjM4OjQzLjkyMTg3NTAwMCArMDIwMAotQEAgLTE1LDcgKzE1LDcgQEAKLSAjIFdlIGxvb2sgaW4gdGhlIC4uLy4uL2JpbiBkaXJlY3RvcnkgKGFuIGluc3RhbGxlZCBUY2wpCi0gbGFwcGVuZCBkaXJzIC4uLy4uL2JpbgotICMgV2UgbG9vayBpbiB0aGUgLi4vLi4vRExMcyBkaXJlY3RvcnkgKGFuIGluc3RhbGxlZCBQeXRob24pCi0tbGFwcGVuZCBkaXJzIC4uLy4uL0RsbHMKLStsYXBwZW5kIGRpcnMgW2ZpbGUgam9pbiBbZmlsZSBkaXJuYW1lIFtpbmZvIG5hbWVvZmV4ZV1dIERMTHNdCi0gIyBJZiBub3QsIHRoaXMgcGtnSW5kZXgudGNsIHdpbGwgcHJvYmFibHkgZmFpbC4KLSAKLSAKZGlmZiAtLWdpdCBhL1BDYnVpbGQvX2N0eXBlcy52Y3Byb2ogYi9QQ2J1aWxkL19jdHlwZXMudmNwcm9qCmluZGV4IDc2NTE4ZTYuLjQ5OTBjOWUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX2N0eXBlcy52Y3Byb2oKKysrIGIvUENidWlsZC9fY3R5cGVzLnZjcHJvagpAQCAtMzMsMTIgKzMzLDE0IEBACiAJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvRVhQT1JUOkRsbEdldENsYXNzT2JqZWN0LFBSSVZBVEUgL0VYUE9SVDpEbGxDYW5VbmxvYWROb3csUFJJVkFURSIKIAkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXNfZC5weWQiCiAJCQkJTGlua0luY3JlbWVudGFsPSIxIgogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKIAkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCiAJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19jdHlwZXNfZC5wZGIiCiAJCQkJU3ViU3lzdGVtPSIwIgorCQkJCUJhc2VBZGRyZXNzPSIweDFEMUEwMDAwIgogCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fY3R5cGVzX2QubGliIgogCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KIAkJCTxUb29sCkBAIC04NSw2ICs4Nyw3IEBACiAJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvRVhQT1JUOkRsbEdldENsYXNzT2JqZWN0LFBSSVZBVEUgL0VYUE9SVDpEbGxDYW5VbmxvYWROb3csUFJJVkFURSIKIAkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXMucHlkIgogCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCkBAIC05Myw2ICs5Niw3IEBACiAJCQkJU3ViU3lzdGVtPSIwIgogCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMCIKIAkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIwIgorCQkJCUJhc2VBZGRyZXNzPSIweDFEMUEwMDAwIgogCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fY3R5cGVzLmxpYiIKIAkJCQlUYXJnZXRNYWNoaW5lPSIxIi8+CiAJCQk8VG9vbApAQCAtMTQyLDcgKzE0Niw3IEBACiAJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgotCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIC9FWFBPUlQ6RGxsR2V0Q2xhc3NPYmplY3QsUFJJVkFURSAvRVhQT1JUOkRsbENhblVubG9hZE5vdyxQUklWQVRFIgogCQkJCU91dHB1dEZpbGU9Ii4vX2N0eXBlcy5weWQiCiAJCQkJTGlua0luY3JlbWVudGFsPSIxIgogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKQEAgLTE1MSw2ICsxNTUsNyBAQAogCQkJCVN1YlN5c3RlbT0iMCIKIAkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjAiCiAJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMCIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCIKIAkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlcy5saWIiCiAJCQkJVGFyZ2V0TWFjaGluZT0iMCIvPgogCQkJPFRvb2wKQEAgLTIwMCw3ICsyMDUsNyBAQAogCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsgL0VYUE9SVDpEbGxHZXRDbGFzc09iamVjdCxQUklWQVRFIC9FWFBPUlQ6RGxsQ2FuVW5sb2FkTm93LFBSSVZBVEUiCiAJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzLnB5ZCIKIAkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgpAQCAtMjA5LDYgKzIxNCw3IEBACiAJCQkJU3ViU3lzdGVtPSIwIgogCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMCIKIAkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIwIgorCQkJCUJhc2VBZGRyZXNzPSIweDFEMUEwMDAwIgogCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fY3R5cGVzLmxpYiIKIAkJCQlUYXJnZXRNYWNoaW5lPSIwIi8+CiAJCQk8VG9vbApkaWZmIC0tZ2l0IGEvUENidWlsZC9fc3FsaXRlMy52Y3Byb2ogYi9QQ2J1aWxkL19zcWxpdGUzLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGIxYTliCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZC9fc3FsaXRlMy52Y3Byb2oKQEAgLTAsMCArMSwyODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI3LjEwIgorCU5hbWU9Il9zcWxpdGUzIgorCVByb2plY3RHVUlEPSJ7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fSIKKwlTY2NQcm9qZWN0TmFtZT0iX3NxbGl0ZTMiCisJU2NjTG9jYWxQYXRoPSIuLiI+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIvPgorCTwvUGxhdGZvcm1zPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcX3NxbGl0ZTMiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZTsuLlxQQzsuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1M7TU9EVUxFX05BTUU9XCZxdW90O3NxbGl0ZTNcJnF1b3Q7IgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHNxbGl0ZS1zb3VyY2UtMy4zLjRcc3FsaXRlMy5saWIiCisJCQkJT3V0cHV0RmlsZT0iLi9fc3FsaXRlM19kLnB5ZCIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249IlRSVUUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zcWxpdGUzX2QucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NxbGl0ZTNfZC5saWIiCisJCQkJVGFyZ2V0TWFjaGluZT0iMSIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0F1eGlsaWFyeU1hbmFnZWRXcmFwcGVyR2VuZXJhdG9yVG9vbCIvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxfc3FsaXRlMyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlOy4uXFBDOy4uXC4uXHNxbGl0ZS1zb3VyY2UtMy4zLjQiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztNT0RVTEVfTkFNRT1cJnF1b3Q7c3FsaXRlM1wmcXVvdDsiCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0iVFJVRSIKKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40XHNxbGl0ZTMubGliIgorCQkJCU91dHB1dEZpbGU9Ii4vX3NxbGl0ZTMucHlkIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NxbGl0ZTMucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NxbGl0ZTMubGliIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZUl0YW5pdW18V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxfc3FsaXRlMyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IntNU1NES1BBVEh9XGluY2x1ZGVcV2luNjRcYXRsO3tNU1NES1BBVEh9XGluY2x1ZGVcV2luNjRcY3J0O3tNU1NES1BBVEh9XGluY2x1ZGVcV2luNjRcY3J0XHN5czt7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XG1mYzsuLlxJbmNsdWRlOy4uXFBDOy4uXC4uXHNxbGl0ZS1zb3VyY2UtMy4zLjQiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztNT0RVTEVfTkFNRT1cJnF1b3Q7c3FsaXRlM1wmcXVvdDsiCisJCQkJU3RyaW5nUG9vbGluZz0iVFJVRSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iRkFMU0UiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9IlRSVUUiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9IlRSVUUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxpYTY0XHNxbGl0ZTMubGliIgorCQkJCU91dHB1dEZpbGU9Ii4vX3NxbGl0ZTMucHlkIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NxbGl0ZTMucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NxbGl0ZTMubGliIgorCQkJCVRhcmdldE1hY2hpbmU9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcX3NxbGl0ZTMiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCU9wdGltaXphdGlvbj0iMiIKKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSJ7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGF0bFxhbWQ2NDt7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGNydFxhbWQ2NDt7TVNTREtQQVRIfVxpbmNsdWRlXFdpbjY0XGNydFxhbWQ2NFxzeXM7e01TU0RLUEFUSH1caW5jbHVkZVxXaW42NFxtZmNcYW1kNjQ7Li5cSW5jbHVkZTsuLlxQQzsuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40IgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1M7TU9EVUxFX05BTUU9XCZxdW90O3NxbGl0ZTNcJnF1b3Q7IgorCQkJCVN0cmluZ1Bvb2xpbmc9IlRSVUUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9IkZBTFNFIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJUUlVFIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIyIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJUUlVFIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40XGFtZDY0XHNxbGl0ZTMubGliIgorCQkJCU91dHB1dEZpbGU9Ii4vX3NxbGl0ZTMucHlkIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NxbGl0ZTMucGRiIgorCQkJCVN1YlN5c3RlbT0iMiIKKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCIKKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NxbGl0ZTMubGliIgorCQkJCVRhcmdldE1hY2hpbmU9IjAiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIi8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBdXhpbGlhcnlNYW5hZ2VkV3JhcHBlckdlbmVyYXRvclRvb2wiLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGFkYXB0ZXJzLmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxjYWNoZS5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY29ubmVjdGlvbi5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY29udmVydGVycy5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY3Vyc29yLmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxtaWNyb3Byb3RvY29scy5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcbW9kdWxlLmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxwcmVwYXJlX3Byb3RvY29sLmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxyb3cuYyI+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXHN0YXRlbWVudC5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcdXRpbC5jIj4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC9fc3NsLm1hayBiL1BDYnVpbGQvX3NzbC5tYWsKaW5kZXggYzE1MGQ2NS4uMmM0N2M2YiAxMDA2NDQKLS0tIGEvUENidWlsZC9fc3NsLm1haworKysgYi9QQ2J1aWxkL19zc2wubWFrCkBAIC0yLDE3ICsyLDE3IEBACiAhSUZERUYgREVCVUcKIE1PRFVMRT1fc3NsX2QucHlkCiBURU1QX0RJUj14ODYtdGVtcC1kZWJ1Zy9fc3NsCi1DRkxBR1M9L09kIC9aaSAvTURkIC9MRGQgL0RERUJVRyAvRF9ERUJVRworQ0ZMQUdTPS9PZCAvWmkgL01EZCAvTERkIC9EREVCVUcgL0RfREVCVUcgL0RXSU4zMgogU1NMX0xJQl9ESVI9JChTU0xfRElSKS9vdXQzMi5kYmcKICFFTFNFCiBNT0RVTEU9X3NzbC5weWQKIFRFTVBfRElSPXg4Ni10ZW1wLXJlbGVhc2UvX3NzbAotQ0ZMQUdTPS9PeCAvTUQgL0xECitDRkxBR1M9L094IC9NRCAvTEQgL0RXSU4zMgogU1NMX0xJQl9ESVI9JChTU0xfRElSKS9vdXQzMgogIUVORElGCiAKIElOQ0xVREVTPS1JIC4uL0luY2x1ZGUgLUkgLi4vUEMgLUkgJChTU0xfRElSKS9pbmMzMgotTElCUz1nZGkzMi5saWIgd3NvY2szMi5saWIgL2xpYnBhdGg6JChTU0xfTElCX0RJUikgbGliZWF5MzIubGliIHNzbGVheTMyLmxpYgorTElCUz1nZGkzMi5saWIgd3NvY2szMi5saWIgdXNlcjMyLmxpYiBhZHZhcGkzMi5saWIgL2xpYnBhdGg6JChTU0xfTElCX0RJUikgbGliZWF5MzIubGliIHNzbGVheTMyLmxpYgogCiBTT1VSQ0U9Li4vTW9kdWxlcy9fc3NsLmMgJChTU0xfTElCX0RJUikvbGliZWF5MzIubGliICQoU1NMX0xJQl9ESVIpL3NzbGVheTMyLmxpYgogCmRpZmYgLS1naXQgYS9QQ2J1aWxkL2RiLmJ1aWxkIGIvUENidWlsZC9kYi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg3Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZC9kYi5idWlsZApAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxwcm9qZWN0PgorIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRhcmdldHMuIj4KKyAgIDxzb2x1dGlvbiBjb25maWd1cmF0aW9uPSJyZWxlYXNlIj4KKyAgICAgPHByb2plY3RzPgorICAgICAgIDxpbmNsdWRlIG5hbWU9ImRiX3N0YXRpYy52Y3Byb2oiIC8+CisgICAgIDwvcHJvamVjdHM+CisgICA8L3NvbHV0aW9uPgorIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jIGIvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jCmluZGV4IDlkMmY5ZjAuLjRjZWJmNDUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYworKysgYi9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMKQEAgLTI3LDYgKzI3LDkgQEAKIAlEV09SRCB0eXBlLCBzaXplOwogCWlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQogCQlyZXR1cm4gMDsKKwkvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KKwlpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQorCQlyZXR1cm4gMDsKIAlpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCiAJICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQogCQkvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3BjYnVpbGQuc2xuIGIvUENidWlsZC9wY2J1aWxkLnNsbgppbmRleCA4OGQ4YzQ1Li4yMGQzZWNmIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3BjYnVpbGQuc2xuCisrKyBiL1BDYnVpbGQvcGNidWlsZC5zbG4KQEAgLTk2LDYgKzk2LDEyIEBACiBFbmRQcm9qZWN0CiBQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIl9jdHlwZXNfdGVzdCIsICJfY3R5cGVzX3Rlc3QudmNwcm9qIiwgIns4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9IgogCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QKKwkJe0YyMkY0MEY0LUQzMTgtNDBEQy05NkIzLTg4REM4MUNFMDg5NH0gPSB7RjIyRjQwRjQtRDMxOC00MERDLTk2QjMtODhEQzgxQ0UwODk0fQorCUVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIl9zcWxpdGUzIiwgIl9zcWxpdGUzLnZjcHJvaiIsICJ7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fSIKKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9ID0ge0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0KIAlFbmRQcm9qZWN0U2VjdGlvbgogRW5kUHJvamVjdAogR2xvYmFsCkBAIC0yNjAsNiArMjY2LDE0IEBACiAJCXs4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKIAkJezhDRjMzNEQ5LTRGODItNDJFQi05N0FGLTgzNTkyQzVBRkQyRn0uUmVsZWFzZUFNRDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VBTUQ2NHxXaW4zMgogCQl7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfS5SZWxlYXNlSXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzIKKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZUFNRDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VBTUQ2NHxXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlQU1ENjQuQnVpbGQuMCA9IFJlbGVhc2VBTUQ2NHxXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlSXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMgorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlSXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZUl0YW5pdW18V2luMzIKIAlFbmRHbG9iYWxTZWN0aW9uCiAJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkl0ZW1zKSA9IHBvc3RTb2x1dGlvbgogCQkuLlxNb2R1bGVzXGdldGJ1aWxkaW5mby5jID0gLi5cTW9kdWxlc1xnZXRidWlsZGluZm8uYwpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob24uYnVpbGQgYi9QQ2J1aWxkL3B5dGhvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWJiZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZC9weXRob24uYnVpbGQKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdD4KKyA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0YXJnZXRzLiI+CisgICA8c29sdXRpb24gY29uZmlndXJhdGlvbj0icmVsZWFzZSI+CisgICAgIDxwcm9qZWN0cz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJtYWtlX3ZlcnNpb25pbmZvLnZjcHJvaiIgLz4KKyAgICAgPC9wcm9qZWN0cz4KKyAgIDwvc29sdXRpb24+CisgICA8ZXhlYyBwcm9ncmFtPSJtYWtlX3ZlcnNpb25pbmZvIiBvdXRwdXQ9InB5dGhvbm50X3JjLmgiIC8+CisKKyAgIDxzb2x1dGlvbiBjb25maWd1cmF0aW9uPSJyZWxlYXNlIiBzb2x1dGlvbmZpbGU9InBjYnVpbGQuc2xuIj4KKyAgICAgPGV4Y2x1ZGVwcm9qZWN0cz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfdGtpbnRlci52Y3Byb2oiIC8+CisgICAgICAgPGluY2x1ZGUgbmFtZT0iYnoyLnZjcHJvaiIgLz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfYnNkZGIudmNwcm9qIiAvPgorICAgICAgIDxpbmNsdWRlIG5hbWU9Il9zcWxpdGUzLnZjcHJvaiIgLz4KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfc3NsLnZjcHJvaiIgLz4KKyAgICAgPC9leGNsdWRlcHJvamVjdHM+CisgICA8L3NvbHV0aW9uPgorIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob25jb3JlLnZjcHJvaiBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKaW5kZXggYTFiYjBlZC4uM2JkNzQwZiAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjcHJvagorKysgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCkBAIC0zLDcgKzMsNyBAQAogCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgogCVZlcnNpb249IjcuMTAiCiAJTmFtZT0icHl0aG9uY29yZSIKLQlQcm9qZWN0R1VJRD0iezdBRkExRjBCLUE4QTEtNDU1QS1BODMyLUJGMjYzNDA0QkJFRn0iCisJUHJvamVjdEdVSUQ9IntDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9IgogCVJvb3ROYW1lc3BhY2U9InB5dGhvbmNvcmUiCiAJU2NjUHJvamVjdE5hbWU9InB5dGhvbmNvcmUiCiAJU2NjTG9jYWxQYXRoPSIuLiI+CkBAIC02MjMsNyArNjIzLDcgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xtYXRobW9kdWxlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1Yy5jIj4KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xtZDUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xtZDVtb2R1bGUuYyI+CkBAIC03MDcsMTIgKzcwNyw2IEBACiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNccmFuZ2VvYmplY3QuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xyZWdleG1vZHVsZS5jIj4KLQkJPC9GaWxlPgotCQk8RmlsZQotCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHJlZ2V4cHIuYyI+Ci0JCTwvRmlsZT4KLQkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xyZ2JpbWdtb2R1bGUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKZGlmZiAtLWdpdCBhL1BDYnVpbGQvcmVhZG1lLnR4dCBiL1BDYnVpbGQvcmVhZG1lLnR4dAppbmRleCA3NmMzMTRkLi5lMzAzMzEzIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3JlYWRtZS50eHQKKysrIGIvUENidWlsZC9yZWFkbWUudHh0CkBAIC02NCwyNyArNjQsMjEgQEAKIAogX3RraW50ZXIKICAgICBQeXRob24gd3JhcHBlciBmb3IgdGhlIFRrIHdpbmRvd2luZyBzeXN0ZW0uICBSZXF1aXJlcyBidWlsZGluZwotICAgIFRjbC9UayBmaXJzdC4gIEZvbGxvd2luZyBhcmUgaW5zdHJ1Y3Rpb25zIGZvciBUY2wvVGsgOC40Ljc7IHRoZXNlCi0gICAgc2hvdWxkIHdvcmsgZm9yIHZlcnNpb24gOC40LjYgdG9vLCB3aXRoIHN1aXRhYmxlIHN1YnN0aXR1dGlvbnM6CisgICAgVGNsL1RrIGZpcnN0LiAgRm9sbG93aW5nIGFyZSBpbnN0cnVjdGlvbnMgZm9yIFRjbC9UayA4LjQuMTIuCiAKICAgICBHZXQgc291cmNlCiAgICAgLS0tLS0tLS0tLQotICAgIEdvIHRvCi0gICAgICAgIGh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvdGNsLwotICAgIGFuZCBkb3dubG9hZAotICAgICAgICB0Y2w4NDctc3JjLnppcAotICAgICAgICB0azg0Ny1zcmMuemlwCi0gICAgVW56aXAgaW50bwotICAgICAgICBkaXN0XHRjbDguNC43XAotICAgICAgICBkaXN0XHRrOC40LjdcCi0gICAgcmVzcGVjdGl2ZWx5LgorICAgIEluIHRoZSBkaXN0IGRpcmVjdG9yeSwgcnVuCisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGNsOC40LjEyCisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGs4LjQuMTIKKyAgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90aXgtOC40LjAKIAogICAgIEJ1aWxkIFRjbCBmaXJzdCAoZG9uZSBoZXJlIHcvIE1TVkMgNy4xIG9uIFdpbmRvd3MgWFApCiAgICAgLS0tLS0tLS0tLS0tLS0tCiAgICAgVXNlICJTdGFydCAtPiBBbGwgUHJvZ3JhbXMgLT4gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzCiAgICAgICAgICAtPiBWaXN1YWwgU3R1ZGlvIC5ORVQgVG9vbHMgLT4gVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDMgQ29tbWFuZCBQcm9tcHQiCiAgICAgdG8gZ2V0IGEgc2hlbGwgd2luZG93IHdpdGggdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQgc2V0dGluZ3MKLSAgICBjZCBkaXN0XHRjbDguNC43XHdpbgorICAgIGNkIGRpc3RcdGNsOC40LjEyXHdpbgogICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjCiAgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsCiAKQEAgLTk5LDkgKzkzLDkgQEAKIAogICAgIEJ1aWxkIFRrCiAgICAgLS0tLS0tLS0KLSAgICBjZCBkaXN0XHRrOC40Ljdcd2luCi0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC43Ci0gICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC43IElOU1RBTExESVI9Li5cLi5cdGNsdGsgaW5zdGFsbAorICAgIGNkIGRpc3RcdGs4LjQuMTJcd2luCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC4xMgorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsCiAKICAgICBYWFggU2hvdWxkIHdlIGNvbXBpbGUgd2l0aCBPUFRTPXRocmVhZHM/CiAKQEAgLTEwOSw3ICsxMDMsNyBAQAogICAgIFhYWCBkaXJlY3RvcnkuICBJcyBhbGwgb2YgdGhhdCByZWFsbHkgbmVlZGVkIGZvciBQeXRob24gdXNlIG9mIFRjbC9Uaz8KIAogICAgIE9wdGlvbmFsOiAgcnVuIHRlc3RzLCB2aWEKLSAgICAgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC43IHRlc3QKKyAgICAgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC4xMiB0ZXN0CiAKICAgICAgICAgT24gV2luWFAgUHJvLCB3aG9sbHkgdXAgdG8gZGF0ZSBhcyBvZiAzMC1BdWctMjAwNDoKICAgICAgICAgYWxsLnRjbDogICAgICAgIFRvdGFsICAgODQyMCAgICBQYXNzZWQgIDY4MjYgICAgU2tpcHBlZCAxNTgxICAgIEZhaWxlZCAgMTMKQEAgLTExOCwxMiArMTEyLDkgQEAKIAogICAgQnVpbHQgVGl4CiAgICAtLS0tLS0tLS0KLSAgIERvd25sb2FkIGZyb20gaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC90aXgvdGl4LTguMS40LnRhci5negotICAgY2QgZGlzdFx0aXgtOC4xLjQKLSAgIFtjeWd3aW5dcGF0Y2ggLXAxIDwgLi5cLi5ccHl0aG9uXFBDXHRpeC5kaWZmCi0gICBjZCB3aW4KLSAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjCi0gICBubWFrZSAtZiBtYWtlZmlsZS52YyBpbnN0YWxsCisgICBjZCBkaXN0XHRpeC04LjQuMFx3aW4KKyAgIG5tYWtlIC1mIHB5dGhvbi5tYWsKKyAgIG5tYWtlIC1mIHB5dGhvbi5tYWsgaW5zdGFsbAogCiBiejIKICAgICBQeXRob24gd3JhcHBlciBmb3IgdGhlIGxpYmJ6MiBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgSG9tZXBhZ2UKQEAgLTIyMywyMyArMjE0LDI0IEBACiAgICAgICB0YXJnZXQgKCJSZWxlYXNlIElBNjQiIGZvciBJdGFuaXVtLCAiUmVsZWFzZSBBTUQ2NCIgZm9yIEFNRDY0KSwgZS5nLgogICAgIGRldmVudiBkYi00LjQuMjBcYnVpbGRfd2luMzJcQmVya2VsZXlfREIuc2xuIC9idWlsZCAiUmVsZWFzZSBBTUQ2NCIgL3Byb2plY3QgZGJfc3RhdGljIC91c2VlbnYKIAorX3NxbGl0ZTMKKyAgICBQeXRob24gd3JhcHBlciBmb3IgU1FMaXRlIGxpYnJhcnkuCisgICAgCisgICAgR2V0IHRoZSBzb3VyY2UgY29kZSB0aHJvdWdoCisgICAgCisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvc3FsaXRlLXNvdXJjZS0zLjMuNAorICAgIAorICAgIFRvIHVzZSB0aGUgZXh0ZW5zaW9uIG1vZHVsZSBpbiBhIFB5dGhvbiBidWlsZCB0cmVlLCBjb3B5IHNxbGl0ZTMuZGxsIGludG8KKyAgICB0aGUgUENidWlsZCBmb2xkZXIuCiAKIF9zc2wKICAgICBQeXRob24gd3JhcHBlciBmb3IgdGhlIHNlY3VyZSBzb2NrZXRzIGxpYnJhcnkuCiAKLSAgICBHZXQgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSBmb3IgT3BlblNTTCBmcm9tCi0gICAgICAgIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcKKyAgICBHZXQgdGhlIHNvdXJjZSBjb2RlIHRocm91Z2gKIAotICAgIFlvdSAocHJvYmFibHkpIGRvbid0IHdhbnQgdGhlICJlbmdpbmUiIGNvZGUuICBGb3IgZXhhbXBsZSwgZ2V0Ci0gICAgICAgIG9wZW5zc2wtMC45LjdkLnRhci5negotICAgIG5vdAotICAgICAgICBvcGVuc3NsLWVuZ2luZS0wLjkuN2QudGFyLmd6CisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvb3BlbnNzbC0wLjkuOGEKIAotICAgIChzZWUgIzEyMzMwNDkgZm9yIHVzaW5nIDAuOS44KS4KLSAgICBVbnBhY2sgaW50byB0aGUgImRpc3QiIGRpcmVjdG9yeSwgcmV0YWluaW5nIHRoZSBmb2xkZXIgbmFtZSBmcm9tCi0gICAgdGhlIGFyY2hpdmUgLSBmb3IgZXhhbXBsZSwgdGhlIGxhdGVzdCBzdGFibGUgT3BlblNTTCB3aWxsIGluc3RhbGwgYXMKLSAgICAgICAgZGlzdC9vcGVuc3NsLTAuOS43ZAotCisgICAgQWx0ZXJuYXRpdmVseSwgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcuCiAgICAgWW91IGNhbiAodGhlb3JldGljYWxseSkgdXNlIGFueSB2ZXJzaW9uIG9mIE9wZW5TU0wgeW91IGxpa2UgLSB0aGUKICAgICBidWlsZCBwcm9jZXNzIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uLgogCkBAIC0yODEsNiArMjczLDE0MyBAQAogdG8gdGhlIEl0YW5pdW0gY29uZmlndXJhdGlvbjsgbWFrZSBzdXJlIHlvdSB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mCiB2c2V4dGNvbXAuCiAKK0J1aWxkaW5nIFB5dGhvbiBVc2luZyB0aGUgZnJlZSBNUyBUb29sa2l0IENvbXBpbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYnVpbGQgcHJvY2VzcyBmb3IgVmlzdWFsIEMrKyBjYW4gYmUgdXNlZCBhbG1vc3QgdW5jaGFuZ2VkIHdpdGggdGhlIGZyZWUgTVMKK1Rvb2xraXQgQ29tcGlsZXIuIFRoaXMgcHJvdmlkZXMgYSB3YXkgb2YgYnVpbGRpbmcgUHl0aG9uIHVzaW5nIGZyZWVseQorYXZhaWxhYmxlIHNvZnR3YXJlLgorCitSZXF1aXJlbWVudHMKKworICAgIFRvIGJ1aWxkIFB5dGhvbiwgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgcmVxdWlyZWQ6CisKKyAgICAqIFRoZSBWaXN1YWwgQysrIFRvb2xraXQgQ29tcGlsZXIKKyAgICAgICAgZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3Zpc3VhbGMvdmN0b29sa2l0MjAwMy8KKyAgICAqIEEgcmVjZW50IFBsYXRmb3JtIFNESworICAgICAgICBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvZGV0YWlscy5hc3B4P0ZhbWlseUlEPTQ4NDI2OWUyLTNiODktNDdlMy04ZWI3LTFmMmJlNmQ3MTIzYQorICAgICogVGhlIC5ORVQgMS4xIFNESworICAgICAgICBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvZGV0YWlscy5hc3B4P0ZhbWlseUlEPTliM2EyY2E2LTM2NDctNDA3MC05ZjQxLWEzMzNjNmI5MTgxZAorCisgICAgW0RvZXMgYW55b25lIGhhdmUgYmV0dGVyIFVSTHMgZm9yIHRoZSBsYXN0IDIgb2YgdGhlc2U/XQorCisgICAgVGhlIHRvb2xraXQgY29tcGlsZXIgaXMgbmVlZGVkIGFzIGl0IGlzIGFuIG9wdGltaXNpbmcgY29tcGlsZXIgKHRoZQorICAgIGNvbXBpbGVyIHN1cHBsaWVkIHdpdGggdGhlIC5ORVQgU0RLIGlzIGEgbm9uLW9wdGltaXNpbmcgdmVyc2lvbikuIFRoZQorICAgIHBsYXRmb3JtIFNESyBpcyBuZWVkZWQgdG8gcHJvdmlkZSB0aGUgV2luZG93cyBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcworICAgICh0aGUgV2luZG93cyAyMDAzIFNlcnZlciBTUDEgZWRpdGlvbiwgdHlwaWNhbCBpbnN0YWxsLCBpcyBrbm93biB0byB3b3JrIC0KKyAgICBvdGhlciBjb25maWd1cmF0aW9ucyBvciB2ZXJzaW9ucyBhcmUgcHJvYmFibHkgZmluZSBhcyB3ZWxsKS4gVGhlIC5ORVQgMS4xCisgICAgU0RLIGlzIG5lZWRlZCBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgdmVyc2lvbiBvZiBtc3ZjcnQuZGxsIHdoaWNoIGxpbmtzIHRvCisgICAgdGhlIG1zdmNyNzEuZGxsIENSVC4gTm90ZSB0aGF0IHRoZSAuTkVUIDIuMCBTREsgaXMgTk9UIGFjY2VwdGFibGUsIGFzIGl0CisgICAgcmVmZXJlbmNlcyBtc3ZjcjgwLmRsbC4KKworICAgIEFsbCBvZiB0aGUgYWJvdmUgaXRlbXMgc2hvdWxkIGJlIGluc3RhbGxlZCBhcyBub3JtYWwuCisKKyAgICBJZiB5b3UgaW50ZW5kIHRvIGJ1aWxkIHRoZSBvcGVuc3NsIChuZWVkZWQgZm9yIHRoZSBfc3NsIGV4dGVuc2lvbikgeW91CisgICAgd2lsbCBuZWVkIHRoZSBDIHJ1bnRpbWUgc291cmNlcyBpbnN0YWxsZWQgYXMgcGFydCBvZiB0aGUgcGxhdGZvcm0gU0RLLgorCisgICAgSW4gYWRkaXRpb24sIHlvdSB3aWxsIG5lZWQgTmFudCwgYXZhaWxhYmxlIGZyb20KKyAgICBodHRwOi8vbmFudC5zb3VyY2Vmb3JnZS5uZXQuIFRoZSAwLjg1IHJlbGVhc2UgY2FuZGlkYXRlIDMgdmVyc2lvbiBpcyBrbm93bgorICAgIHRvIHdvcmsuIFRoaXMgaXMgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuIExhdGVyCisgICAgIm5pZ2h0bHkgYnVpbGQiIHZlcnNpb25zIGFyZSBrbm93biBOT1QgdG8gd29yayAtIGl0IGlzIG5vdCBjbGVhciBhdAorICAgIHByZXNlbnQgd2hldGhlciBmdXR1cmUgcmVsZWFzZWQgdmVyc2lvbnMgd2lsbCB3b3JrLgorCitTZXR0aW5nIHVwIHRoZSBlbnZpcm9ubWVudAorCisgICAgU3RhcnQgYSBwbGF0Zm9ybSBTREsgImJ1aWxkIGVudmlyb25tZW50IHdpbmRvdyIgZnJvbSB0aGUgc3RhcnQgbWVudS4gVGhlCisgICAgIldpbmRvd3MgWFAgMzItYml0IHJldGFpbCIgdmVyc2lvbiBpcyBrbm93biB0byB3b3JrLgorCisgICAgQWRkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgdG8geW91ciBQQVRIOgorICAgICAgICAqIFRoZSB0b29sa2l0IGNvbXBpbGVyIGRpcmVjdG9yeQorICAgICAgICAqIFRoZSBTREsgIldpbjY0IiBiaW5hcmllcyBkaXJlY3RvcnkKKwkqIFRoZSBOYW50IGRpcmVjdG9yeQorICAgIEFkZCB0byB5b3VyIElOQ0xVREUgZW52aXJvbm1lbnQgdmFyaWFibGU6CisgICAgICAgICogVGhlIHRvb2xraXQgY29tcGlsZXIgSU5DTFVERSBkaXJlY3RvcnkKKyAgICBBZGQgdG8geW91ciBMSUIgZW52aXJvbm1lbnQgdmFyaWFibGU6CisgICAgICAgICogVGhlIHRvb2xraXQgY29tcGlsZXIgTElCIGRpcmVjdG9yeQorCSogVGhlIC5ORVQgU0RLIFZpc3VhbCBTdHVkaW8gMjAwMyBWQzdcbGliIGRpcmVjdG9yeQorCisgICAgVGhlIGZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgc2V0IHRoaW5ncyB1cCBhcyB5b3UgbmVlZCB0aGVtOgorCisgICAgICAgIHJlbSBTZXQgdGhlc2UgdmFsdWVzIGFjY29yZGluZyB0byB3aGVyZSB5b3UgaW5zdGFsbGVkIHRoZSBzb2Z0d2FyZQorICAgICAgICBzZXQgVE9PTEtJVD1DOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBWaXN1YWwgQysrIFRvb2xraXQgMjAwMworICAgICAgICBzZXQgU0RLPUM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFBsYXRmb3JtIFNESworICAgICAgICBzZXQgTkVUPUM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzCisgICAgICAgIHNldCBOQU5UPUM6XFV0aWxzXE5hbnQKKworICAgICAgICBzZXQgUEFUSD0lVE9PTEtJVCVcYmluOyVQQVRIJTslU0RLJVxCaW5cd2luNjQ7JU5BTlQlXGJpbgorICAgICAgICBzZXQgSU5DTFVERT0lVE9PTEtJVCVcaW5jbHVkZTslSU5DTFVERSUKKyAgICAgICAgc2V0IExJQj0lVE9PTEtJVCVcbGliOyVORVQlXFZDN1xsaWI7JUxJQiUKKworICAgIFRoZSAid2luNjQiIGRpcmVjdG9yeSBmcm9tIHRoZSBTREsgaXMgYWRkZWQgdG8gc3VwcGx5IGV4ZWN1dGFibGVzIHN1Y2ggYXMKKyAgICAiY3Z0cmVzIiBhbmQgImxpYiIsIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIGVsc2V3aGVyZS4gVGhlIHZlcnNpb25zIGluIHRoZQorICAgICJ3aW42NCIgZGlyZWN0b3J5IGFyZSAzMi1iaXQgcHJvZ3JhbXMsIHNvIHRoZXkgYXJlIGZpbmUgdG8gdXNlIGhlcmUuCisKKyAgICBUaGF0J3MgaXQuIFRvIGJ1aWxkIFB5dGhvbiAodGhlIGNvcmUgb25seSwgbm8gYmluYXJ5IGV4dGVuc2lvbnMgd2hpY2gKKyAgICBkZXBlbmQgb24gZXh0ZXJuYWwgbGlicmFyaWVzKSB5b3UganVzdCBuZWVkIHRvIGlzc3VlIHRoZSBjb21tYW5kCisKKyAgICAgICAgbmFudCAtYnVpbGRmaWxlOnB5dGhvbi5idWlsZCBhbGwKKworICAgIGZyb20gd2l0aGluIHRoZSBQQ0J1aWxkIGRpcmVjdG9yeS4KKworRXh0ZW5zaW9uIG1vZHVsZXMKKworICAgIFRvIGJ1aWxkIHRob3NlIGV4dGVuc2lvbiBtb2R1bGVzIHdoaWNoIHJlcXVpcmUgZXh0ZXJuYWwgbGlicmFyaWVzCisgICAgKF90a2ludGVyLCBiejIsIF9ic2RkYiwgX3NxbGl0ZTMsIF9zc2wpIHlvdSBjYW4gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKKyAgICBmb3IgdGhlIFZpc3VhbCBTdHVkaW8gYnVpbGQgYWJvdmUsIHdpdGggYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucy4gVGhlc2UKKyAgICBpbnN0cnVjdGlvbnMgaGF2ZSBvbmx5IGJlZW4gdGVzdGVkIHVzaW5nIHRoZSBzb3VyY2VzIGluIHRoZSBQeXRob24KKyAgICBzdWJ2ZXJzaW9uIHJlcG9zaXRvcnkgLSBidWlsZGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZXMgc2hvdWxkIHdvcmssIGJ1dAorICAgIGhhcyBub3QgYmVlbiB0ZXN0ZWQuCisKKyAgICBGb3IgZWFjaCBleHRlbnNpb24gbW9kdWxlIHlvdSB3aXNoIHRvIGJ1aWxkLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUKKyAgICBhc3NvY2lhdGVkIGluY2x1ZGUgbGluZSBmcm9tIHRoZSBleGNsdWRlcHJvamVjdHMgc2VjdGlvbiBvZiBwYy5idWlsZC4KKworICAgIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKKworICAgIF90a2ludGVyCisgICAgICAgIFRoZSB0aXggbWFrZWZpbGUgKHRpeC04LjQuMFx3aW5cbWFrZWZpbGUudmMpIG11c3QgYmUgbW9kaWZpZWQgdG8KKwlyZW1vdmUgcmVmZXJlbmNlcyB0byBUT09MUzMyLiBUaGUgcmVsZXZhbnQgbGluZXMgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKwlyZWFkOgorICAgICAgICAgICAgY2MzMiA9IGNsLmV4ZQorICAgICAgICAgICAgbGluazMyID0gbGluay5leGUKKyAgICAgICAgICAgIGluY2x1ZGUzMiA9IAorCVRoZSByZW1haW5kZXIgb2YgdGhlIGJ1aWxkIGluc3RydWN0aW9ucyB3aWxsIHdvcmsgYXMgZ2l2ZW4uCisKKyAgICBiejIKKyAgICAgICAgTm8gY2hhbmdlcyBhcmUgbmVlZGVkCisKKyAgICBfYnNkZGIKKyAgICAgICAgVGhlIGZpbGUgZGIuYnVpbGQgc2hvdWxkIGJlIGNvcGllZCBmcm9tIHRoZSBQeXRob24gUENCdWlsZCBkaXJlY3RvcnkKKwl0byB0aGUgZGlyZWN0b3J5IGRiLTQuNC4yMFxidWlsZF93aW4zMi4KKworCVRoZSBmaWxlIGRiX3N0YXRpYy52Y3Byb2ogaW4gZGItNC40LjIwXGJ1aWxkX3dpbjMyIHNob3VsZCBiZSBlZGl0ZWQgdG8KKwlyZW1vdmUgdGhlIHN0cmluZyAiJChTb2x1dGlvbkRpcikiIC0gdGhpcyBvY2N1cnMgaW4gMiBwbGFjZXMsIG9ubHkKKwlyZWxldmFudCBmb3IgNjQtYml0IGJ1aWxkcy4gKFRoZSBlZGl0IGlzIHJlcXVpcmVkIGFzIG90aGVyd2lzZSwgbmFudAorCXdhbnRzIHRvIHJlYWQgdGhlIHNvbHV0aW9uIGZpbGUsIHdoaWNoIGlzIG5vdCBpbiBhIHN1aXRhYmxlIGZvcm0pLgorCisJVGhlIGJzZGRiIGxpYnJhcnkgY2FuIHRoZW4gYmUgYnVpbGQgd2l0aCB0aGUgY29tbWFuZAorCSAgICBuYW50IC1idWlsZGZpbGU6ZGIuYnVpbGQgYWxsCisJcnVuIGZyb20gdGhlIGRiLTQuNC4yMFxidWlsZF93aW4zMiBkaXJlY3RvcnkuCisKKyAgICBfc3FsaXRlMworICAgICAgICBObyBjaGFuZ2VzIGFyZSBuZWVkZWQuIEhvd2V2ZXIsIGluIG9yZGVyIGZvciB0aGUgdGVzdHMgdG8gc3VjY2VlZCwgYQorCWNvcHkgb2Ygc3FsaXRlMy5kbGwgbXVzdCBiZSBkb3dubG9hZGVkLCBhbmQgcGxhY2VkIGFsb25nc2lkZQorCXB5dGhvbi5leGUuCisKKyAgICBfc3NsCisgICAgICAgIFRoZSBkb2N1bWVudGVkIGJ1aWxkIHByb2Nlc3Mgd29ya3MgYXMgd3JpdHRlbi4gSG93ZXZlciwgaXQgbmVlZHMgYQorCWNvcHkgb2YgdGhlIGZpbGUgc2V0YXJndi5vYmosIHdoaWNoIGlzIG5vdCBzdXBwbGllZCBpbiB0aGUgcGxhdGZvcm0KKwlTREsuIEhvd2V2ZXIsIHRoZSBzb3VyY2VzIGFyZSBhdmFpbGFibGUgKGluIHRoZSBjcnQgc291cmNlIGNvZGUpLiBUbworCWJ1aWxkIHNldGFyZ3Yub2JqLCBwcm9jZWVkIGFzIGZvbGxvd3M6CisKKyAgICAgICAgQ29weSBzZXRhcmd2LmMsIGNydW50aW1lLmggYW5kIGludGVybmFsLmggZnJvbSAlU0RLJVxzcmNcY3J0IHRvIGEKKwl0ZW1wb3JhcnkgZGlyZWN0b3J5LgorCUNvbXBpbGUgdXNpbmcgImNsIC9jIC9JLiAvTUQgL0RfQ1JUQkxEIHNldGFyZ3YuYyIKKwlDb3B5IHRoZSByZXN1bHRpbmcgc2V0YXJndi5vYmogdG8gc29tZXdoZXJlIG9uIHlvdXIgTElCIGVudmlyb25tZW50CisJKCVTREslXGxpYiBpcyBhIHJlYXNvbmFibGUgcGxhY2UpLgorCisJV2l0aCBzZXRhcmd2Lm9iaiBpbiBwbGFjZSwgdGhlIHN0YW5kYXJkIGJ1aWxkIHByb2Nlc3Mgc2hvdWxkIHdvcmsKKwlmaW5lLgorCiBZT1VSIE9XTiBFWFRFTlNJT04gRExMcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElmIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBleHRlbnNpb24gbW9kdWxlIERMTCwgdGhlcmUncyBhbiBleGFtcGxlCmRpZmYgLS1naXQgYS9QYXJzZXIvUHl0aG9uLmFzZGwgYi9QYXJzZXIvUHl0aG9uLmFzZGwKaW5kZXggNDM5N2Q4OS4uMDBkZTM4MSAxMDA2NDQKLS0tIGEvUGFyc2VyL1B5dGhvbi5hc2RsCisrKyBiL1BhcnNlci9QeXRob24uYXNkbApAQCAtOTgsOCArOTgsMTEgQEAKIAljb21wcmVoZW5zaW9uID0gKGV4cHIgdGFyZ2V0LCBleHByIGl0ZXIsIGV4cHIqIGlmcykKIAogCS0tIG5vdCBzdXJlIHdoYXQgdG8gY2FsbCB0aGUgZmlyc3QgYXJndW1lbnQgZm9yIHJhaXNlIGFuZCBleGNlcHQKLQotCWV4Y2VwdGhhbmRsZXIgPSAoZXhwcj8gdHlwZSwgZXhwcj8gbmFtZSwgc3RtdCogYm9keSkKKwktLSBUT0RPKGpoeWx0b24pOiBGaWd1cmUgb3V0IGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheSB0byBoYW5kbGUKKwktLSAgICAgICAgICAgICAgICBsaW5lbm8gYW5kIGNvbF9vZmZzZXQgZmllbGRzLCBwYXJ0aWN1bGFybHkgd2hlbgorICAgICAgICAtLSAgICAgICAgICAgICAgICBhc3QgaXMgZXhwb3NlZCB0byBQeXRob24uCisJZXhjZXB0aGFuZGxlciA9IChleHByPyB0eXBlLCBleHByPyBuYW1lLCBzdG10KiBib2R5LCBpbnQgbGluZW5vLAorCSAgICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQpCiAKIAlhcmd1bWVudHMgPSAoZXhwciogYXJncywgaWRlbnRpZmllcj8gdmFyYXJnLCAKIAkJICAgICBpZGVudGlmaWVyPyBrd2FyZywgZXhwciogZGVmYXVsdHMpCmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbF9jLnB5IGIvUGFyc2VyL2FzZGxfYy5weQppbmRleCBhZDIyMDlkLi5iNmQ5ODMwIDEwMDc1NQotLS0gYS9QYXJzZXIvYXNkbF9jLnB5CisrKyBiL1BhcnNlci9hc2RsX2MucHkKQEAgLTE1NSw4ICsxNTUsMTAgQEAKICAgICAgICAgICAgIHR5cGUgPSBzdW0udHlwZXNbaV0KICAgICAgICAgICAgIGVudW0uYXBwZW5kKCIlc19raW5kPSVkIiAlICh0eXBlLm5hbWUsIGkgKyAxKSkKIAorICAgICAgICBlbWl0KCJlbnVtIF8lKG5hbWUpc19raW5kIHsiICsgIiwgIi5qb2luKGVudW0pICsgIn07IikKKwogICAgICAgICBlbWl0KCJzdHJ1Y3QgXyUobmFtZSlzIHsiKQotICAgICAgICBlbWl0KCJlbnVtIHsgIiArICIsICIuam9pbihlbnVtKSArICIgfSBraW5kOyIsIGRlcHRoICsgMSkKKyAgICAgICAgZW1pdCgiZW51bSBfJShuYW1lKXNfa2luZCBraW5kOyIsIGRlcHRoICsgMSkKICAgICAgICAgZW1pdCgidW5pb24geyIsIGRlcHRoICsgMSkKICAgICAgICAgZm9yIHQgaW4gc3VtLnR5cGVzOgogICAgICAgICAgICAgc2VsZi52aXNpdCh0LCBkZXB0aCArIDIpCkBAIC0xODYsNyArMTg4LDEwIEBACiAgICAgICAgIGN0eXBlID0gZ2V0X2NfdHlwZShmaWVsZC50eXBlKQogICAgICAgICBuYW1lID0gZmllbGQubmFtZQogICAgICAgICBpZiBmaWVsZC5zZXE6Ci0gICAgICAgICAgICBzZWxmLmVtaXQoImFzZGxfc2VxIColKG5hbWUpczsiICUgbG9jYWxzKCksIGRlcHRoKQorICAgICAgICAgICAgaWYgZmllbGQudHlwZS52YWx1ZSBpbiAoJ2NtcG9wJywpOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiYXNkbF9pbnRfc2VxIColKG5hbWUpczsiICUgbG9jYWxzKCksIGRlcHRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImFzZGxfc2VxIColKG5hbWUpczsiICUgbG9jYWxzKCksIGRlcHRoKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5lbWl0KCIlKGN0eXBlKXMgJShuYW1lKXM7IiAlIGxvY2FscygpLCBkZXB0aCkKIApAQCAtMjMyLDcgKzIzNywxMCBAQAogICAgICAgICAgICAgICAgIG5hbWUgPSBmLm5hbWUKICAgICAgICAgICAgICMgWFhYIHNob3VsZCBleHRlbmQgZ2V0X2NfdHlwZSgpIHRvIGhhbmRsZSB0aGlzCiAgICAgICAgICAgICBpZiBmLnNlcToKLSAgICAgICAgICAgICAgICBjdHlwZSA9ICJhc2RsX3NlcSAqIgorICAgICAgICAgICAgICAgIGlmIGYudHlwZS52YWx1ZSBpbiAoJ2NtcG9wJywpOgorICAgICAgICAgICAgICAgICAgICBjdHlwZSA9ICJhc2RsX2ludF9zZXEgKiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjdHlwZSA9ICJhc2RsX3NlcSAqIgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBjdHlwZSA9IGdldF9jX3R5cGUoZi50eXBlKQogICAgICAgICAgICAgYXJncy5hcHBlbmQoKGN0eXBlLCBuYW1lLCBmLm9wdCBvciBmLnNlcSkpCkBAIC0yNzYsNyArMjg0LDcgQEAKICAgICAgICAgZW1pdCgiJXMgcDsiICUgY3R5cGUsIDEpCiAgICAgICAgIGZvciBhcmd0eXBlLCBhcmduYW1lLCBvcHQgaW4gYXJnczoKICAgICAgICAgICAgICMgWFhYIGhhY2sgYWxlcnQ6IGZhbHNlIGlzIGFsbG93ZWQgZm9yIGEgYm9vbAotICAgICAgICAgICAgaWYgbm90IG9wdCBhbmQgbm90IGFyZ3R5cGUgPT0gImJvb2wiOgorICAgICAgICAgICAgaWYgbm90IG9wdCBhbmQgbm90IChhcmd0eXBlID09ICJib29sIiBvciBhcmd0eXBlID09ICJpbnQiKToKICAgICAgICAgICAgICAgICBlbWl0KCJpZiAoISVzKSB7IiAlIGFyZ25hbWUsIDEpCiAgICAgICAgICAgICAgICAgZW1pdCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIiwgMikKICAgICAgICAgICAgICAgICBtc2cgPSAiZmllbGQgJXMgaXMgcmVxdWlyZWQgZm9yICVzIiAlIChhcmduYW1lLCBuYW1lKQpAQCAtNDEzLDEwICs0MjEsMTAgQEAKIAogc3RhdGljIGludCBhZGRfYXR0cmlidXRlcyhQeVR5cGVPYmplY3QqIHR5cGUsIGNoYXIqKmF0dHJzLCBpbnQgbnVtX2ZpZWxkcykKIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmVzdWx0OwogICAgIFB5T2JqZWN0ICpzLCAqbCA9IFB5TGlzdF9OZXcobnVtX2ZpZWxkcyk7CiAgICAgaWYgKCFsKSByZXR1cm4gMDsKLSAgICBmb3IoaT0wOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgbnVtX2ZpZWxkczsgaSsrKSB7CiAgICAgICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGF0dHJzW2ldKTsKICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYobCk7CkBAIC00MjQsNyArNDMyLDkgQEAKICAgICAgICAgfQogICAgICAgICBQeUxpc3RfU0VUX0lURU0obCwgaSwgcyk7CiAgICAgfQotICAgIHJldHVybiBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCopdHlwZSwgIl9hdHRyaWJ1dGVzIiwgbCkgPj0wOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0Kil0eXBlLCAiX2F0dHJpYnV0ZXMiLCBsKSA+PSAwOworICAgIFB5X0RFQ1JFRihsKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqIGFzdDJvYmpfbGlzdChhc2RsX3NlcSAqc2VxLCBQeU9iamVjdCogKCpmdW5jKSh2b2lkKikpCkBAIC00NjUsOSArNDc1LDkgQEAKIH0KICIiIiwgMCwgcmVmbG93PUZhbHNlKQogCi0gICAgICAgIHNlbGYuZW1pdCgic3RhdGljIGludCBpbml0aWFsaXplZDsiLCAwKQogICAgICAgICBzZWxmLmVtaXQoInN0YXRpYyBpbnQgaW5pdF90eXBlcyh2b2lkKSIsMCkKICAgICAgICAgc2VsZi5lbWl0KCJ7IiwgMCkKKyAgICAgICAgc2VsZi5lbWl0KCJzdGF0aWMgaW50IGluaXRpYWxpemVkOyIsIDEpCiAgICAgICAgIHNlbGYuZW1pdCgiaWYgKGluaXRpYWxpemVkKSByZXR1cm4gMTsiLCAxKQogICAgICAgICBzZWxmLmVtaXQoJ0FTVF90eXBlID0gbWFrZV90eXBlKCJBU1QiLCAmUHlCYXNlT2JqZWN0X1R5cGUsIE5VTEwsIDApOycsIDEpCiAgICAgICAgIGZvciBkZm4gaW4gbW9kLmRmbnM6CkBAIC01NDMsNyArNTUzLDcgQEAKICAgICAgICAgc2VsZi5hZGRPYmooY29ucy5uYW1lKQogCiAgICAgZGVmIGFkZE9iaihzZWxmLCBuYW1lKToKLSAgICAgICAgc2VsZi5lbWl0KCdpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiJXMiLCAoUHlPYmplY3QqKSVzX3R5cGUpIDwgMCkgcmV0dXJuOycgJSAobmFtZSwgbmFtZSksIDEpCisgICAgICAgIHNlbGYuZW1pdCgnaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICIlcyIsIChQeU9iamVjdCopJXNfdHlwZSkgPCAwKSByZXR1cm47JyAlIChuYW1lLCBuYW1lKSwgMSkKIAogX1NQRUNJQUxJWkVEX1NFUVVFTkNFUyA9ICgnc3RtdCcsICdleHByJykKIApAQCAtNjc3LDggKzY4Nyw4IEBACiAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsiLCBkZXB0aCsxKQogICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSIsIGRlcHRoKzEpCiAgICAgICAgICAgICAgICAgIyBUaGlzIGNhbm5vdCBmYWlsLCBzbyBubyBuZWVkIGZvciBlcnJvciBoYW5kbGluZwotICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiUHlMaXN0X1NFVF9JVEVNKHZhbHVlLCBpLCBhc3Qyb2JqXyVzKCglc190eSlhc2RsX3NlcV9HRVQoJXMsIGkpKSk7IiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZC50eXBlLCBmaWVsZC50eXBlLCB2YWx1ZSksIGRlcHRoKzIsIHJlZmxvdz1GYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoIlB5TGlzdF9TRVRfSVRFTSh2YWx1ZSwgaSwgYXN0Mm9ial9jbXBvcCgoY21wb3BfdHkpYXNkbF9zZXFfR0VUKCVzLCBpKSkpOyIgJSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgrMiwgcmVmbG93PUZhbHNlKQogICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgifSIsIGRlcHRoKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoInZhbHVlID0gYXN0Mm9ial9saXN0KCVzLCBhc3Qyb2JqXyVzKTsiICUgKHZhbHVlLCBmaWVsZC50eXBlKSwgZGVwdGgpCkBAIC03MTYsMzkgKzcyNiwzNSBAQAogICAgICAgICBzeXMuZXhpdCgxKQogICAgIGlmIElOQ19ESVI6CiAgICAgICAgIHAgPSAiJXMvJXMtYXN0LmgiICUgKElOQ19ESVIsIG1vZC5uYW1lKQotICAgIGVsc2U6Ci0gICAgICAgIHAgPSAiJXMtYXN0LmgiICUgbW9kLm5hbWUKLSAgICBmID0gb3BlbihwLCAid2IiKQotICAgIHByaW50ID4+IGYsIGF1dG9fZ2VuX21zZwotICAgIHByaW50ID4+IGYsICcjaW5jbHVkZSAiYXNkbC5oIlxuJwotICAgIGMgPSBDaGFpbk9mVmlzaXRvcnMoVHlwZURlZlZpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJ1Y3RWaXNpdG9yKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG90eXBlVmlzaXRvcihmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICBjLnZpc2l0KG1vZCkKLSAgICBwcmludCA+PmYsICJQeU9iamVjdCogUHlBU1RfbW9kMm9iaihtb2RfdHkgdCk7IgotICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihwLCAid2IiKQorICAgICAgICBwcmludCA+PiBmLCBhdXRvX2dlbl9tc2cKKyAgICAgICAgcHJpbnQgPj4gZiwgJyNpbmNsdWRlICJhc2RsLmgiXG4nCisgICAgICAgIGMgPSBDaGFpbk9mVmlzaXRvcnMoVHlwZURlZlZpc2l0b3IoZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0VmlzaXRvcihmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b3R5cGVWaXNpdG9yKGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgYy52aXNpdChtb2QpCisgICAgICAgIHByaW50ID4+ZiwgIlB5T2JqZWN0KiBQeUFTVF9tb2Qyb2JqKG1vZF90eSB0KTsiCisgICAgICAgIGYuY2xvc2UoKQogCiAgICAgaWYgU1JDX0RJUjoKLSAgICAgICAgcCA9ICIlcy8lcy1hc3QuYyIgJSAoU1JDX0RJUiwgbW9kLm5hbWUpCi0gICAgZWxzZToKLSAgICAgICAgcCA9ICIlcy1hc3QuYyIgJSBtb2QubmFtZQotICAgIGYgPSBvcGVuKHAsICJ3YiIpCi0gICAgcHJpbnQgPj4gZiwgYXV0b19nZW5fbXNnCi0gICAgcHJpbnQgPj4gZiwgJyNpbmNsdWRlICJQeXRob24uaCInCi0gICAgcHJpbnQgPj4gZiwgJyNpbmNsdWRlICIlcy1hc3QuaCInICUgbW9kLm5hbWUKLSAgICBwcmludCA+PiBmCi0gICAgcHJpbnQgPj5mLCAic3RhdGljIFB5VHlwZU9iamVjdCogQVNUX3R5cGU7IgotICAgIHYgPSBDaGFpbk9mVmlzaXRvcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBQeVR5cGVzRGVjbGFyZVZpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICBQeVR5cGVzVmlzaXRvcihmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVmlzaXRvcihmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9ialZpc2l0b3IoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICBBU1RNb2R1bGVWaXNpdG9yKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFydGluZ1Nob3RzKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgIHYudmlzaXQobW9kKQotICAgIGYuY2xvc2UoKQorICAgICAgICBwID0gb3MucGF0aC5qb2luKFNSQ19ESVIsIHN0cihtb2QubmFtZSkgKyAiLWFzdC5jIikKKyAgICAgICAgZiA9IG9wZW4ocCwgIndiIikKKyAgICAgICAgcHJpbnQgPj4gZiwgYXV0b19nZW5fbXNnCisgICAgICAgIHByaW50ID4+IGYsICcjaW5jbHVkZSAiUHl0aG9uLmgiJworICAgICAgICBwcmludCA+PiBmLCAnI2luY2x1ZGUgIiVzLWFzdC5oIicgJSBtb2QubmFtZQorICAgICAgICBwcmludCA+PiBmCisgICAgICAgIHByaW50ID4+ZiwgInN0YXRpYyBQeVR5cGVPYmplY3QqIEFTVF90eXBlOyIKKyAgICAgICAgdiA9IENoYWluT2ZWaXNpdG9ycygKKyAgICAgICAgICAgIFB5VHlwZXNEZWNsYXJlVmlzaXRvcihmKSwKKyAgICAgICAgICAgIFB5VHlwZXNWaXNpdG9yKGYpLAorICAgICAgICAgICAgRnVuY3Rpb25WaXNpdG9yKGYpLAorICAgICAgICAgICAgT2JqVmlzaXRvcihmKSwKKyAgICAgICAgICAgIEFTVE1vZHVsZVZpc2l0b3IoZiksCisgICAgICAgICAgICBQYXJ0aW5nU2hvdHMoZiksCisgICAgICAgICAgICApCisgICAgICAgIHYudmlzaXQobW9kKQorICAgICAgICBmLmNsb3NlKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgc3lzCkBAIC03NTcsNiArNzYzLDkgQEAKICAgICBJTkNfRElSID0gJycKICAgICBTUkNfRElSID0gJycKICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJoOmM6IikKKyAgICBpZiBsZW4ob3B0cykgIT0gMToKKyAgICAgICAgcHJpbnQgIk11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBvdXRwdXQgZmlsZSIKKyAgICAgICAgc3lzLmV4aXQoMSkKICAgICBmb3IgbywgdiBpbiBvcHRzOgogICAgICAgICBpZiBvID09ICctaCc6CiAgICAgICAgICAgICBJTkNfRElSID0gdgpAQCAtNzY0LDQgKzc3Myw1IEBACiAgICAgICAgICAgICBTUkNfRElSID0gdgogICAgIGlmIGxlbihhcmdzKSAhPSAxOgogICAgICAgICBwcmludCAiTXVzdCBzcGVjaWZ5IHNpbmdsZSBpbnB1dCBmaWxlIgorICAgICAgICBzeXMuZXhpdCgxKQogICAgIG1haW4oYXJnc1swXSkKZGlmZiAtLWdpdCBhL1BhcnNlci9iaXRzZXQuYyBiL1BhcnNlci9iaXRzZXQuYwppbmRleCAzODM0ZTE5Li5iNTU0M2I4IDEwMDY0NAotLS0gYS9QYXJzZXIvYml0c2V0LmMKKysrIGIvUGFyc2VyL2JpdHNldC5jCkBAIC04LDcgKzgsNyBAQAogbmV3Yml0c2V0KGludCBuYml0cykKIHsKIAlpbnQgbmJ5dGVzID0gTkJZVEVTKG5iaXRzKTsKLQliaXRzZXQgc3MgPSBQeU1lbV9ORVcoQllURSwgbmJ5dGVzKTsKKwliaXRzZXQgc3MgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoQllURSkgKiAgbmJ5dGVzKTsKIAkKIAlpZiAoc3MgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBiaXRzZXQiKTsKQEAgLTIyLDcgKzIyLDcgQEAKIHZvaWQKIGRlbGJpdHNldChiaXRzZXQgc3MpCiB7Ci0JUHlNZW1fREVMKHNzKTsKKwlQeU9iamVjdF9GUkVFKHNzKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9QYXJzZXIvZmlyc3RzZXRzLmMgYi9QYXJzZXIvZmlyc3RzZXRzLmMKaW5kZXggMGY0ZTA5ZC4uMDA0NjdiMyAxMDA2NDQKLS0tIGEvUGFyc2VyL2ZpcnN0c2V0cy5jCisrKyBiL1BhcnNlci9maXJzdHNldHMuYwpAQCAtNTksNyArNTksNyBAQAogCW5iaXRzID0gZy0+Z19sbC5sbF9ubGFiZWxzOwogCXJlc3VsdCA9IG5ld2JpdHNldChuYml0cyk7CiAJCi0Jc3ltID0gUHlNZW1fTkVXKGludCwgMSk7CisJc3ltID0gKGludCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoaW50KSk7CiAJaWYgKHN5bSA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7CiAJbnN5bXMgPSAxOwpAQCAtNzMsNyArNzMsOCBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChqID49IG5zeW1zKSB7IC8qIE5ldyBsYWJlbCAqLwotCQkJUHlNZW1fUkVTSVpFKHN5bSwgaW50LCBuc3ltcyArIDEpOworCQkJc3ltID0gKGludCAqKVB5T2JqZWN0X1JFQUxMT0Moc3ltLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogKG5zeW1zICsgMSkpOwogCQkJaWYgKHN5bSA9PSBOVUxMKQogCQkJCVB5X0ZhdGFsRXJyb3IoCiAJCQkJICAgICJubyBtZW0gdG8gcmVzaXplIHN5bSBpbiBjYWxjZmlyc3RzZXQiKTsKQEAgLTEwOCw1ICsxMDksNSBAQAogCQlwcmludGYoIiB9XG4iKTsKIAl9CiAKLQlQeU1lbV9GUkVFKHN5bSk7CisJUHlPYmplY3RfRlJFRShzeW0pOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2dyYW1tYXIuYyBiL1BhcnNlci9ncmFtbWFyLmMKaW5kZXggZDhlMzg5Ny4uYjBkYWZlNyAxMDA2NDQKLS0tIGEvUGFyc2VyL2dyYW1tYXIuYworKysgYi9QYXJzZXIvZ3JhbW1hci5jCkBAIC0yMCw3ICsyMCw3IEBACiB7CiAJZ3JhbW1hciAqZzsKIAkKLQlnID0gUHlNZW1fTkVXKGdyYW1tYXIsIDEpOworCWcgPSAoZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoZ3JhbW1hcikpOwogCWlmIChnID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IGdyYW1tYXIiKTsKIAlnLT5nX25kZmFzID0gMDsKQEAgLTM3LDcgKzM3LDggQEAKIHsKIAlkZmEgKmQ7CiAJCi0JUHlNZW1fUkVTSVpFKGctPmdfZGZhLCBkZmEsIGctPmdfbmRmYXMgKyAxKTsKKwlnLT5nX2RmYSA9IChkZmEgKilQeU9iamVjdF9SRUFMTE9DKGctPmdfZGZhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRmYSkgKiAoZy0+Z19uZGZhcyArIDEpKTsKIAlpZiAoZy0+Z19kZmEgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBkZmEgaW4gYWRkZGZhIik7CiAJZCA9ICZnLT5nX2RmYVtnLT5nX25kZmFzKytdOwpAQCAtNTUsNyArNTYsOCBAQAogewogCXN0YXRlICpzOwogCQotCVB5TWVtX1JFU0laRShkLT5kX3N0YXRlLCBzdGF0ZSwgZC0+ZF9uc3RhdGVzICsgMSk7CisJZC0+ZF9zdGF0ZSA9IChzdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MoZC0+ZF9zdGF0ZSwKKwkJCQkgICAgICBzaXplb2Yoc3RhdGUpICogKGQtPmRfbnN0YXRlcyArIDEpKTsKIAlpZiAoZC0+ZF9zdGF0ZSA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIHN0YXRlIGluIGFkZHN0YXRlIik7CiAJcyA9ICZkLT5kX3N0YXRlW2QtPmRfbnN0YXRlcysrXTsKQEAgLTc4LDcgKzgwLDcgQEAKIAlhc3NlcnQoMCA8PSB0byAmJiB0byA8IGQtPmRfbnN0YXRlcyk7CiAJCiAJcyA9ICZkLT5kX3N0YXRlW2Zyb21dOwotCVB5TWVtX1JFU0laRShzLT5zX2FyYywgYXJjLCBzLT5zX25hcmNzICsgMSk7CisJcy0+c19hcmMgPSAoYXJjICopUHlPYmplY3RfUkVBTExPQyhzLT5zX2FyYywgc2l6ZW9mKGFyYykgKiAocy0+c19uYXJjcyArIDEpKTsKIAlpZiAocy0+c19hcmMgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBhcmMgbGlzdCBpbiBhZGRhcmMiKTsKIAlhID0gJnMtPnNfYXJjW3MtPnNfbmFyY3MrK107CkBAIC05Nyw3ICs5OSw4IEBACiAJCQlzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKQogCQkJcmV0dXJuIGk7CiAJfQotCVB5TWVtX1JFU0laRShsbC0+bGxfbGFiZWwsIGxhYmVsLCBsbC0+bGxfbmxhYmVscyArIDEpOworCWxsLT5sbF9sYWJlbCA9IChsYWJlbCAqKVB5T2JqZWN0X1JFQUxMT0MobGwtPmxsX2xhYmVsLAorCQkJCQlzaXplb2YobGFiZWwpICogKGxsLT5sbF9ubGFiZWxzICsgMSkpOwogCWlmIChsbC0+bGxfbGFiZWwgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBsYWJlbGxpc3QgaW4gYWRkbGFiZWwiKTsKIAlsYiA9ICZsbC0+bGxfbGFiZWxbbGwtPmxsX25sYWJlbHMrK107CkBAIC0xOTUsNyArMTk4LDcgQEAKIAkJCQluYW1lX2xlbiA9IHAgLSBzcmM7CiAJCQllbHNlCiAJCQkJbmFtZV9sZW4gPSBzdHJsZW4oc3JjKTsKLQkJCWRlc3QgPSBtYWxsb2MobmFtZV9sZW4gKyAxKTsKKwkJCWRlc3QgPSAoY2hhciAqKW1hbGxvYyhuYW1lX2xlbiArIDEpOwogCQkJc3RybmNweShkZXN0LCBzcmMsIG5hbWVfbGVuKTsKIAkJCWRlc3RbbmFtZV9sZW5dID0gJ1wwJzsKIAkJCWZyZWUobGItPmxiX3N0cik7CmRpZmYgLS1naXQgYS9QYXJzZXIvbXlyZWFkbGluZS5jIGIvUGFyc2VyL215cmVhZGxpbmUuYwppbmRleCBhOTMyYTg3Li4zMmExMDg4IDEwMDY0NAotLS0gYS9QYXJzZXIvbXlyZWFkbGluZS5jCisrKyBiL1BhcnNlci9teXJlYWRsaW5lLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCXNpemVfdCBuOwogCWNoYXIgKnA7CiAJbiA9IDEwMDsKLQlpZiAoKHAgPSBQeU1lbV9NQUxMT0MobikpID09IE5VTEwpCisJaWYgKChwID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobikpID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWZmbHVzaChzeXNfc3Rkb3V0KTsKICNpZm5kZWYgUklTQ09TCkBAIC0xNDEsNyArMTQxLDcgQEAKIAluID0gc3RybGVuKHApOwogCXdoaWxlIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykgewogCQlzaXplX3QgaW5jciA9IG4rMjsKLQkJcCA9IFB5TWVtX1JFQUxMT0MocCwgbiArIGluY3IpOworCQlwID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4gKyBpbmNyKTsKIAkJaWYgKHAgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwogCQlpZiAoaW5jciA+IElOVF9NQVgpIHsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCQkJYnJlYWs7CiAJCW4gKz0gc3RybGVuKHArbik7CiAJfQotCXJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CisJcmV0dXJuIChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuKzEpOwogfQogCiAKZGlmZiAtLWdpdCBhL1BhcnNlci9ub2RlLmMgYi9QYXJzZXIvbm9kZS5jCmluZGV4IDdlZDZjMGUuLjk3Zjg4N2EgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ub2RlLmMKKysrIGIvUGFyc2VyL25vZGUuYwpAQCAtNjIsNyArNjIsNyBAQAogICogV2luOTgpLgogICoKICAqIEluIGEgcnVuIG9mIGNvbXBpbGVhbGwgYWNyb3NzIHRoZSAyLjNhMCBMaWIgZGlyZWN0b3J5LCBBbmRyZXcgTWFjSW50eXJlCi0gKiByZXBvcnRlZCB0aGF0LCB3aXRoIHRoaXMgc2NoZW1lLCA4OSUgb2YgUHlNZW1fUkVTSVpFIGNhbGxzIGluCisgKiByZXBvcnRlZCB0aGF0LCB3aXRoIHRoaXMgc2NoZW1lLCA4OSUgb2YgUHlPYmplY3RfUkVBTExPQyBjYWxscyBpbgogICogUHlOb2RlX0FkZENoaWxkIHBhc3NlZCAxIGZvciB0aGUgc2l6ZSwgYW5kIDklIHBhc3NlZCA0LiAgU28gdGhpcyB1c3VhbGx5CiAgKiB3YXN0ZXMgdmVyeSBsaXR0bGUgbWVtb3J5LCBidXQgaXMgdmVyeSBlZmZlY3RpdmUgYXQgc2lkZXN0ZXBwaW5nCiAgKiBwbGF0Zm9ybS1yZWFsbG9jIGRpc2FzdGVycyBvbiB2dWxuZXJuYWJsZSBwbGF0Zm9ybXMuCmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2VyLmMgYi9QYXJzZXIvcGFyc2VyLmMKaW5kZXggMjEzNDEwYy4uNDUzMDJlZCAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNlci5jCisrKyBiL1BhcnNlci9wYXJzZXIuYwpAQCAtNzUsNyArNzUsNyBAQAogCQogCWlmICghZy0+Z19hY2NlbCkKIAkJUHlHcmFtbWFyX0FkZEFjY2VsZXJhdG9ycyhnKTsKLQlwcyA9IFB5TWVtX05FVyhwYXJzZXJfc3RhdGUsIDEpOworCXBzID0gKHBhcnNlcl9zdGF0ZSAqKVB5TWVtX01BTExPQyhzaXplb2YocGFyc2VyX3N0YXRlKSk7CiAJaWYgKHBzID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXBzLT5wX2dyYW1tYXIgPSBnOwpAQCAtODQsNyArODQsNyBAQAogI2VuZGlmCiAJcHMtPnBfdHJlZSA9IFB5Tm9kZV9OZXcoc3RhcnQpOwogCWlmIChwcy0+cF90cmVlID09IE5VTEwpIHsKLQkJUHlNZW1fREVMKHBzKTsKKwkJUHlNZW1fRlJFRShwcyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzX3Jlc2V0KCZwcy0+cF9zdGFjayk7CkBAIC05OCw3ICs5OCw3IEBACiAJLyogTkIgSWYgeW91IHdhbnQgdG8gc2F2ZSB0aGUgcGFyc2UgdHJlZSwKIAkgICB5b3UgbXVzdCBzZXQgcF90cmVlIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcgZGVscGFyc2VyISAqLwogCVB5Tm9kZV9GcmVlKHBzLT5wX3RyZWUpOwotCVB5TWVtX0RFTChwcyk7CisJUHlNZW1fRlJFRShwcyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW4uYyBiL1BhcnNlci9wZ2VuLmMKaW5kZXggZTY0M2QzMy4uZGZlN2NhYyAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW4uYworKysgYi9QYXJzZXIvcGdlbi5jCkBAIC00OSw3ICs0OSw4IEBACiB7CiAJbmZhc3RhdGUgKnN0OwogCQotCVB5TWVtX1JFU0laRShuZi0+bmZfc3RhdGUsIG5mYXN0YXRlLCBuZi0+bmZfbnN0YXRlcyArIDEpOworCW5mLT5uZl9zdGF0ZSA9IChuZmFzdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MobmYtPm5mX3N0YXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFzdGF0ZSkgKiAobmYtPm5mX25zdGF0ZXMgKyAxKSk7CiAJaWYgKG5mLT5uZl9zdGF0ZSA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CiAJc3QgPSAmbmYtPm5mX3N0YXRlW25mLT5uZl9uc3RhdGVzKytdOwpAQCAtNjUsNyArNjYsOCBAQAogCW5mYWFyYyAqYXI7CiAJCiAJc3QgPSAmbmYtPm5mX3N0YXRlW2Zyb21dOwotCVB5TWVtX1JFU0laRShzdC0+c3RfYXJjLCBuZmFhcmMsIHN0LT5zdF9uYXJjcyArIDEpOworCXN0LT5zdF9hcmMgPSAobmZhYXJjICopUHlPYmplY3RfUkVBTExPQyhzdC0+c3RfYXJjLAorCQkJCSAgICAgIHNpemVvZihuZmFhcmMpICogKHN0LT5zdF9uYXJjcyArIDEpKTsKIAlpZiAoc3QtPnN0X2FyYyA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CiAJYXIgPSAmc3QtPnN0X2FyY1tzdC0+c3RfbmFyY3MrK107CkBAIC03OSw3ICs4MSw3IEBACiAJbmZhICpuZjsKIAlzdGF0aWMgaW50IHR5cGUgPSBOVF9PRkZTRVQ7IC8qIEFsbCB0eXBlcyB3aWxsIGJlIGRpc2p1bmN0ICovCiAJCi0JbmYgPSBQeU1lbV9ORVcobmZhLCAxKTsKKwluZiA9IChuZmEgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYSkpOwogCWlmIChuZiA9PSBOVUxMKQogCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBuZmEiKTsKIAluZi0+bmZfdHlwZSA9IHR5cGUrKzsKQEAgLTEwNCw3ICsxMDYsNyBAQAogewogCW5mYWdyYW1tYXIgKmdyOwogCQotCWdyID0gUHlNZW1fTkVXKG5mYWdyYW1tYXIsIDEpOworCWdyID0gKG5mYWdyYW1tYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYWdyYW1tYXIpKTsKIAlpZiAoZ3IgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIGdyYW1tYXIiKTsKIAlnci0+Z3Jfbm5mYXMgPSAwOwpAQCAtMTIxLDcgKzEyMyw4IEBACiAJbmZhICpuZjsKIAkKIAluZiA9IG5ld25mYShuYW1lKTsKLQlQeU1lbV9SRVNJWkUoZ3ItPmdyX25mYSwgbmZhICosIGdyLT5ncl9ubmZhcyArIDEpOworCWdyLT5ncl9uZmEgPSAobmZhICoqKVB5T2JqZWN0X1JFQUxMT0MoZ3ItPmdyX25mYSwKKwkJCQkgICAgICBzaXplb2YobmZhKSAqIChnci0+Z3Jfbm5mYXMgKyAxKSk7CiAJaWYgKGdyLT5ncl9uZmEgPT0gTlVMTCkKIAkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwogCWdyLT5ncl9uZmFbZ3ItPmdyX25uZmFzKytdID0gbmY7CkBAIC0zNjEsNyArMzY0LDcgQEAKIHR5cGVkZWYgc3RydWN0IF9zc19zdGF0ZSB7CiAJYml0c2V0CXNzX3NzOwogCWludAlzc19uYXJjczsKLQlzc19hcmMJKnNzX2FyYzsKKwlzdHJ1Y3QgX3NzX2FyYwkqc3NfYXJjOwogCWludAlzc19kZWxldGVkOwogCWludAlzc19maW5pc2g7CiAJaW50CXNzX3JlbmFtZTsKQEAgLTM5Miw3ICszOTUsNyBAQAogCQogCXNzID0gbmV3Yml0c2V0KG5iaXRzKTsKIAlhZGRjbG9zdXJlKHNzLCBuZiwgbmYtPm5mX3N0YXJ0KTsKLQl4eF9zdGF0ZSA9IFB5TWVtX05FVyhzc19zdGF0ZSwgMSk7CisJeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKHNzX3N0YXRlKSk7CiAJaWYgKHh4X3N0YXRlID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgeHhfc3RhdGUgaW4gbWFrZWRmYSIpOwogCXh4X25zdGF0ZXMgPSAxOwpAQCAtNDExLDYgKzQxNCw3IEBACiAKIAkvKiBGb3IgZWFjaCB1bm1hcmtlZCBzdGF0ZS4uLiAqLwogCWZvciAoaXN0YXRlID0gMDsgaXN0YXRlIDwgeHhfbnN0YXRlczsgKytpc3RhdGUpIHsKKwkJc2l6ZV90IHNpemU7CiAJCXl5ID0gJnh4X3N0YXRlW2lzdGF0ZV07CiAJCXNzID0geXktPnNzX3NzOwogCQkvKiBGb3IgYWxsIGl0cyBzdGF0ZXMuLi4gKi8KQEAgLTQzMCw4ICs0MzQsOSBAQAogCQkJCQkJZ290byBmb3VuZDsKIAkJCQl9CiAJCQkJLyogQWRkIG5ldyBhcmMgZm9yIHRoaXMgc3RhdGUgKi8KLQkJCQlQeU1lbV9SRVNJWkUoeXktPnNzX2FyYywgc3NfYXJjLAotCQkJCQkgICAgIHl5LT5zc19uYXJjcyArIDEpOworCQkJCXNpemUgPSBzaXplb2Yoc3NfYXJjKSAqICh5eS0+c3NfbmFyY3MgKyAxKTsKKwkJCQl5eS0+c3NfYXJjID0gKHNzX2FyYyAqKVB5T2JqZWN0X1JFQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eS0+c3NfYXJjLCBzaXplKTsKIAkJCQlpZiAoeXktPnNzX2FyYyA9PSBOVUxMKQogCQkJCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CiAJCQkJenogPSAmeXktPnNzX2FyY1t5eS0+c3NfbmFyY3MrK107CkBAIC00NTMsNyArNDU4LDkgQEAKIAkJCQkJZ290byBkb25lOwogCQkJCX0KIAkJCX0KLQkJCVB5TWVtX1JFU0laRSh4eF9zdGF0ZSwgc3Nfc3RhdGUsIHh4X25zdGF0ZXMgKyAxKTsKKwkJCXNpemUgPSBzaXplb2Yoc3Nfc3RhdGUpICogKHh4X25zdGF0ZXMgKyAxKTsKKwkJCXh4X3N0YXRlID0gKHNzX3N0YXRlICopUHlPYmplY3RfUkVBTExPQyh4eF9zdGF0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwogCQkJaWYgKHh4X3N0YXRlID09IE5VTEwpCiAJCQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwogCQkJenotPnNhX2Fycm93ID0geHhfbnN0YXRlczsKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VubWFpbi5jIGIvUGFyc2VyL3BnZW5tYWluLmMKaW5kZXggNjk1ZTJiNy4uZmMyN2EyYyAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW5tYWluLmMKKysrIGIvUGFyc2VyL3BnZW5tYWluLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQkJCQlwdXRjKCcgJywgc3RkZXJyKTsKIAkJCX0KIAkJCWZwcmludGYoc3RkZXJyLCAiXlxuIik7Ci0JCQlQeU1lbV9ERUwoZXJyLnRleHQpOworCQkJUHlPYmplY3RfRlJFRShlcnIudGV4dCk7CiAJCX0KIAkJUHlfRXhpdCgxKTsKIAl9CkBAIC0xMzYsNyArMTM2LDcgQEAKIFB5T1NfUmVhZGxpbmUoRklMRSAqc3lzX3N0ZGluLCBGSUxFICpzeXNfc3Rkb3V0LCBjaGFyICpwcm9tcHQpCiB7CiAJc2l6ZV90IG4gPSAxMDAwOwotCWNoYXIgKnAgPSBQeU1lbV9NQUxMT0Mobik7CisJY2hhciAqcCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pOwogCWNoYXIgKnE7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAluID0gc3RybGVuKHApOwogCWlmIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykKIAkJcFtuLTFdID0gJ1xuJzsKLQlyZXR1cm4gUHlNZW1fUkVBTExPQyhwLCBuKzEpOworCXJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKIH0KIAogLyogTm8tbm9uc2Vuc2UgZmdldHMgKi8KZGlmZiAtLWdpdCBhL1BhcnNlci90b2tlbml6ZXIuYyBiL1BhcnNlci90b2tlbml6ZXIuYwppbmRleCAwNjMxY2EzLi5kOWRjYzQxIDEwMDY0NAotLS0gYS9QYXJzZXIvdG9rZW5pemVyLmMKKysrIGIvUGFyc2VyL3Rva2VuaXplci5jCkBAIC0xMDUsNyArMTA1LDggQEAKIHN0YXRpYyBzdHJ1Y3QgdG9rX3N0YXRlICoKIHRva19uZXcodm9pZCkKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSBQeU1lbV9ORVcoc3RydWN0IHRva19zdGF0ZSwgMSk7CisJc3RydWN0IHRva19zdGF0ZSAqdG9rID0gKHN0cnVjdCB0b2tfc3RhdGUgKilQeU1lbV9NQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHRva19zdGF0ZSkpOwogCWlmICh0b2sgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSB0b2stPnN0YXJ0ID0gTlVMTDsKQEAgLTE2Myw3ICsxNjQsNyBAQAogewogCXRvay0+ZGVjb2RpbmdfZXJyZWQgPSAxOwogCWlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkgLyogc2VlIFB5VG9rZW5pemVyX0ZyZWUgKi8KLQkJUHlNZW1fREVMKHRvay0+YnVmKTsKKwkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7CiAJdG9rLT5idWYgPSBOVUxMOwogCXJldHVybiBOVUxMOwkJLyogYXMgaWYgaXQgd2VyZSBFT0YgKi8KIH0KQEAgLTE3MSw3ICsxNzIsNyBAQAogc3RhdGljIGNoYXIgKgogbmV3X3N0cmluZyhjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKLQljaGFyKiByZXN1bHQgPSBQeU1lbV9ORVcoY2hhciwgbGVuICsgMSk7CisJY2hhciogcmVzdWx0ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuICsgMSk7CiAJaWYgKHJlc3VsdCAhPSBOVUxMKSB7CiAJCW1lbWNweShyZXN1bHQsIHMsIGxlbik7CiAJCXJlc3VsdFtsZW5dID0gJ1wwJzsKQEAgLTIzNiw3ICsyMzcsNyBAQAogCQkJCWNoYXIqIHIgPSBuZXdfc3RyaW5nKGJlZ2luLCB0IC0gYmVnaW4pOwogCQkJCWNoYXIqIHEgPSBnZXRfbm9ybWFsX25hbWUocik7CiAJCQkJaWYgKHIgIT0gcSkgewotCQkJCQlQeU1lbV9ERUwocik7CisJCQkJCVB5TWVtX0ZSRUUocik7CiAJCQkJCXIgPSBuZXdfc3RyaW5nKHEsIHN0cmxlbihxKSk7CiAJCQkJfQogCQkJCXJldHVybiByOwpAQCAtMjc3LDE4ICsyNzgsMTggQEAKIAkJCQkJdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOwogCQkJCX0KIAkJCQllbHNlCi0JCQkJCVB5TWVtX0RFTChjcyk7CisJCQkJCVB5TWVtX0ZSRUUoY3MpOwogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHdlIGNhbm5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRoZSBjb2Rpbmcgc3BlYy4gU2luY2UgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgYW55IFVuaWNvZGUgbGl0ZXJhbHMsIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgbWF0dGVyLiAqLwotCQkJCVB5TWVtX0RFTChjcyk7CisJCQkJUHlNZW1fRlJFRShjcyk7CiAjZW5kaWYKIAkJCX0KIAkJfSBlbHNlIHsJLyogdGhlbiwgY29tcGFyZSBjcyB3aXRoIEJPTSAqLwogCQkJciA9IChzdHJjbXAodG9rLT5lbmNvZGluZywgY3MpID09IDApOwotCQkJUHlNZW1fREVMKGNzKTsKKwkJCVB5TWVtX0ZSRUUoY3MpOwogCQl9CiAJfQogCWlmICghcikgewpAQCAtMzM0LDcgKzMzNSw3IEBACiAJCXJldHVybiAxOwogCX0KIAlpZiAodG9rLT5lbmNvZGluZyAhPSBOVUxMKQotCQlQeU1lbV9ERUwodG9rLT5lbmNvZGluZyk7CisJCVB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CiAJdG9rLT5lbmNvZGluZyA9IG5ld19zdHJpbmcoInV0Zi04IiwgNSk7CS8qIHJlc3VsdGluZyBpcyBpbiB1dGYtOCAqLwogCXJldHVybiAxOwogICBOT05fQk9NOgpAQCAtMzQ1LDcgKzM0Niw3IEBACiAKIC8qIFJlYWQgYSBsaW5lIG9mIHRleHQgZnJvbSBUT0sgaW50byBTLCB1c2luZyB0aGUgc3RyZWFtIGluIFRPSy4KICAgIFJldHVybiBOVUxMIG9uIGZhaWx1cmUsIGVsc2UgUy4KLSAgIAorCiAgICBPbiBlbnRyeSwgdG9rLT5kZWNvZGluZ19idWZmZXIgd2lsbCBiZSBvbmUgb2Y6CiAgICAgIDEpIE5VTEw6IG5lZWQgdG8gY2FsbCB0b2stPmRlY29kaW5nX3JlYWRsaW5lIHRvIGdldCBhIG5ldyBsaW5lCiAgICAgIDIpIFB5VW5pY29kZU9iamVjdCAqOiBkZWNvZGluZ19mZW9mIGhhcyBjYWxsZWQgdG9rLT5kZWNvZGluZ19yZWFkbGluZSBhbmQKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgICAgICAgICAoaW4gdGhlIHMgYnVmZmVyKSB0byBjb3B5IGVudGlyZSBjb250ZW50cyBvZiB0aGUgbGluZSByZWFkCiAgICAgICAgICAgIGJ5IHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUuICB0b2stPmRlY29kaW5nX2J1ZmZlciBoYXMgdGhlIG92ZXJmbG93LgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGZwX3JlYWRsIGlzIGNhbGxlZCBpbiBhIGxvb3AgKHdpdGggYW4gZXhwYW5kZWQgYnVmZmVyKQotICAgICAgICAgICB1bnRpbCB0aGUgYnVmZmVyIGVuZHMgd2l0aCBhICdcbicgKG9yIHVudGlsIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgCisgICAgICAgICAgIHVudGlsIHRoZSBidWZmZXIgZW5kcyB3aXRoIGEgJ1xuJyAob3IgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcwogICAgICAgICAgICByZWFjaGVkKTogc2VlIHRva19uZXh0YyBhbmQgaXRzIGNhbGxzIHRvIGRlY29kaW5nX2ZnZXRzLgogKi8KIApAQCAtNDcwLDcgKzQ3MSw3IEBACiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICh0b2stPmRlY29kaW5nX3N0YXRlID4gMCkgewogCQkJLyogV2Ugd2FudCBhICdyYXcnIHJlYWQuICovCi0JCQlsaW5lID0gUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKHMsIHNpemUsIAorCQkJbGluZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhzLCBzaXplLAogCQkJCQkJCXRvay0+ZnAsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0gZWxzZSB7CkBAIC01MDIsMTEgKzUwMywxMSBAQAogCQljaGFyIGJ1Zls1MDBdOwogCQkvKiBOZWVkIHRvIGFkZCAxIHRvIHRoZSBsaW5lIG51bWJlciwgc2luY2UgdGhpcyBsaW5lCiAJCSAgIGhhcyBub3QgYmVlbiBjb3VudGVkLCB5ZXQuICAqLwotCQlzcHJpbnRmKGJ1ZiwgCisJCXNwcmludGYoYnVmLAogCQkJIk5vbi1BU0NJSSBjaGFyYWN0ZXIgJ1xceCUuMngnICIKIAkJCSJpbiBmaWxlICUuMjAwcyBvbiBsaW5lICVpLCAiCiAJCQkiYnV0IG5vIGVuY29kaW5nIGRlY2xhcmVkOyAiCi0JCQkic2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL3BlcC0wMjYzLmh0bWwgZm9yIGRldGFpbHMiLCAKKwkJCSJzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BlcHMvcGVwLTAyNjMuaHRtbCBmb3IgZGV0YWlscyIsCiAJCQliYWRjaGFyLCB0b2stPmZpbGVuYW1lLCB0b2stPmxpbmVubyArIDEpOwogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIGJ1Zik7CiAJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKQEAgLTUzNywxMyArNTM4LDE1IEBACiAKIC8qIEZldGNoIGEgYnl0ZSBmcm9tIFRPSywgdXNpbmcgdGhlIHN0cmluZyBidWZmZXIuICovCiAKLXN0YXRpYyBpbnQgYnVmX2dldGMoc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7CitzdGF0aWMgaW50CitidWZfZ2V0YyhzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKIAlyZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+c3RyKyspOwogfQogCiAvKiBVbmZldGNoIGEgYnl0ZSBmcm9tIFRPSywgdXNpbmcgdGhlIHN0cmluZyBidWZmZXIuICovCiAKLXN0YXRpYyB2b2lkIGJ1Zl91bmdldGMoaW50IGMsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgeworc3RhdGljIHZvaWQKK2J1Zl91bmdldGMoaW50IGMsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgewogCXRvay0+c3RyLS07CiAJYXNzZXJ0KFB5X0NIQVJNQVNLKCp0b2stPnN0cikgPT0gYyk7CS8qIHRvay0+Y3VyIG1heSBwb2ludCB0byByZWFkLW9ubHkgc2VnbWVudCAqLwogfQpAQCAtNTUxLDcgKzU1NCw4IEBACiAvKiBTZXQgdGhlIHJlYWRsaW5lIGZ1bmN0aW9uIGZvciBUT0sgdG8gRU5DLiBGb3IgdGhlIHN0cmluZy1iYXNlZAogICAgdG9rZW5pemVyLCB0aGlzIG1lYW5zIHRvIGp1c3QgcmVjb3JkIHRoZSBlbmNvZGluZy4gKi8KIAotc3RhdGljIGludCBidWZfc2V0cmVhZGwoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjb25zdCBjaGFyKiBlbmMpIHsKK3N0YXRpYyBpbnQKK2J1Zl9zZXRyZWFkbChzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNvbnN0IGNoYXIqIGVuYykgewogCXRvay0+ZW5jID0gZW5jOwogCXJldHVybiAxOwogfQpAQCAtNjUzLDcgKzY1Nyw3IEBACiAJc3RydWN0IHRva19zdGF0ZSAqdG9rID0gdG9rX25ldygpOwogCWlmICh0b2sgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKCh0b2stPmJ1ZiA9IFB5TWVtX05FVyhjaGFyLCBCVUZTSVopKSA9PSBOVUxMKSB7CisJaWYgKCh0b2stPmJ1ZiA9IChjaGFyICopUHlNZW1fTUFMTE9DKEJVRlNJWikpID09IE5VTEwpIHsKIAkJUHlUb2tlbml6ZXJfRnJlZSh0b2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC02NzIsMTQgKzY3NiwxNCBAQAogUHlUb2tlbml6ZXJfRnJlZShzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7CiAJaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHRvay0+ZW5jb2RpbmcpOworCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOwogI2lmbmRlZiBQR0VOCiAJUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX3JlYWRsaW5lKTsKIAlQeV9YREVDUkVGKHRvay0+ZGVjb2RpbmdfYnVmZmVyKTsKICNlbmRpZgogCWlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHRvay0+YnVmKTsKLQlQeU1lbV9ERUwodG9rKTsKKwkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisJUHlNZW1fRlJFRSh0b2spOwogfQogCiAjaWYgIWRlZmluZWQoUEdFTikgJiYgZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKQpAQCAtNzExLDcgKzcxNSw5IEBACiAJaWYgKHV0ZjggPT0gTlVMTCkKIAkJZ290byBlcnJvcl9jbGVhcjsKIAotCWNvbnZlcnRlZCA9IG5ld19zdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcodXRmOCksIFB5U3RyaW5nX1NpemUodXRmOCkpOworCWFzc2VydChQeVN0cmluZ19DaGVjayh1dGY4KSk7CisJY29udmVydGVkID0gbmV3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksCisJCQkgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUodXRmOCkpOwogCVB5X0RFQ1JFRih1dGY4KTsKIAlpZiAoY29udmVydGVkID09IE5VTEwpCiAJCWdvdG8gZXJyb3Jfbm9tZW07CkBAIC03MTksNyArNzI1LDcgQEAKIAlQeU1lbV9GUkVFKCppbnApOwogCSppbnAgPSBjb252ZXJ0ZWQ7CiAJaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKLQkJUHlNZW1fREVMKHRvay0+ZW5jb2RpbmcpOworCQlQeU1lbV9GUkVFKHRvay0+ZW5jb2RpbmcpOwogCXRvay0+ZW5jb2RpbmcgPSBuZXdfc3RyaW5nKGVuY29kaW5nLCBzdHJsZW4oZW5jb2RpbmcpKTsKIAlpZiAodG9rLT5lbmNvZGluZyA9PSBOVUxMKQogCQlnb3RvIGVycm9yX25vbWVtOwpAQCAtNzcwLDM4ICs3NzYsMzggQEAKIAkJCXJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5jdXIrKyk7CiAJCX0KIAkJaWYgKHRvay0+cHJvbXB0ICE9IE5VTEwpIHsKLQkJCWNoYXIgKm5ldyA9IFB5T1NfUmVhZGxpbmUoc3RkaW4sIHN0ZG91dCwgdG9rLT5wcm9tcHQpOworCQkJY2hhciAqbmV3dG9rID0gUHlPU19SZWFkbGluZShzdGRpbiwgc3Rkb3V0LCB0b2stPnByb21wdCk7CiAJCQlpZiAodG9rLT5uZXh0cHJvbXB0ICE9IE5VTEwpCiAJCQkJdG9rLT5wcm9tcHQgPSB0b2stPm5leHRwcm9tcHQ7Ci0JCQlpZiAobmV3ID09IE5VTEwpCisJCQlpZiAobmV3dG9rID09IE5VTEwpCiAJCQkJdG9rLT5kb25lID0gRV9JTlRSOwotCQkJZWxzZSBpZiAoKm5ldyA9PSAnXDAnKSB7Ci0JCQkJUHlNZW1fRlJFRShuZXcpOworCQkJZWxzZSBpZiAoKm5ld3RvayA9PSAnXDAnKSB7CisJCQkJUHlNZW1fRlJFRShuZXd0b2spOwogCQkJCXRvay0+ZG9uZSA9IEVfRU9GOwogCQkJfQogI2lmICFkZWZpbmVkKFBHRU4pICYmIGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkKLQkJCWVsc2UgaWYgKHRva19zdGRpbl9kZWNvZGUodG9rLCAmbmV3KSAhPSAwKQotCQkJCVB5TWVtX0ZSRUUobmV3KTsKKwkJCWVsc2UgaWYgKHRva19zdGRpbl9kZWNvZGUodG9rLCAmbmV3dG9rKSAhPSAwKQorCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKICNlbmRpZgogCQkJZWxzZSBpZiAodG9rLT5zdGFydCAhPSBOVUxMKSB7CiAJCQkJc2l6ZV90IHN0YXJ0ID0gdG9rLT5zdGFydCAtIHRvay0+YnVmOwogCQkJCXNpemVfdCBvbGRsZW4gPSB0b2stPmN1ciAtIHRvay0+YnVmOwotCQkJCXNpemVfdCBuZXdsZW4gPSBvbGRsZW4gKyBzdHJsZW4obmV3KTsKKwkJCQlzaXplX3QgbmV3bGVuID0gb2xkbGVuICsgc3RybGVuKG5ld3Rvayk7CiAJCQkJY2hhciAqYnVmID0gdG9rLT5idWY7Ci0JCQkJUHlNZW1fUkVTSVpFKGJ1ZiwgY2hhciwgbmV3bGVuKzEpOworCQkJCWJ1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhidWYsIG5ld2xlbisxKTsKIAkJCQl0b2stPmxpbmVubysrOwogCQkJCWlmIChidWYgPT0gTlVMTCkgewotCQkJCQlQeU1lbV9ERUwodG9rLT5idWYpOworCQkJCQlQeU1lbV9GUkVFKHRvay0+YnVmKTsKIAkJCQkJdG9rLT5idWYgPSBOVUxMOwotCQkJCQlQeU1lbV9GUkVFKG5ldyk7CisJCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKIAkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKIAkJCQkJcmV0dXJuIEVPRjsKIAkJCQl9CiAJCQkJdG9rLT5idWYgPSBidWY7CiAJCQkJdG9rLT5jdXIgPSB0b2stPmJ1ZiArIG9sZGxlbjsKIAkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKLQkJCQlzdHJjcHkodG9rLT5idWYgKyBvbGRsZW4sIG5ldyk7Ci0JCQkJUHlNZW1fRlJFRShuZXcpOworCQkJCXN0cmNweSh0b2stPmJ1ZiArIG9sZGxlbiwgbmV3dG9rKTsKKwkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7CiAJCQkJdG9rLT5pbnAgPSB0b2stPmJ1ZiArIG5ld2xlbjsKIAkJCQl0b2stPmVuZCA9IHRvay0+aW5wICsgMTsKIAkJCQl0b2stPnN0YXJ0ID0gdG9rLT5idWYgKyBzdGFydDsKQEAgLTgwOSw4ICs4MTUsOCBAQAogCQkJZWxzZSB7CiAJCQkJdG9rLT5saW5lbm8rKzsKIAkJCQlpZiAodG9rLT5idWYgIT0gTlVMTCkKLQkJCQkJUHlNZW1fREVMKHRvay0+YnVmKTsKLQkJCQl0b2stPmJ1ZiA9IG5ldzsKKwkJCQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisJCQkJdG9rLT5idWYgPSBuZXd0b2s7CiAJCQkJdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7CiAJCQkJdG9rLT5jdXIgPSB0b2stPmJ1ZjsKIAkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmJ1ZjsKQEAgLTgyNCw3ICs4MzAsOCBAQAogCQkJY2hhciAqcHQ7CiAJCQlpZiAodG9rLT5zdGFydCA9PSBOVUxMKSB7CiAJCQkJaWYgKHRvay0+YnVmID09IE5VTEwpIHsKLQkJCQkJdG9rLT5idWYgPSBQeU1lbV9ORVcoY2hhciwgQlVGU0laKTsKKwkJCQkJdG9rLT5idWYgPSAoY2hhciAqKQorCQkJCQkJUHlNZW1fTUFMTE9DKEJVRlNJWik7CiAJCQkJCWlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7CiAJCQkJCQl0b2stPmRvbmUgPSBFX05PTUVNOwogCQkJCQkJcmV0dXJuIEVPRjsKQEAgLTg1OSw3ICs4NjYsOCBAQAogCQkJCVB5X3NzaXplX3QgY3VydmFsaWQgPSB0b2stPmlucCAtIHRvay0+YnVmOwogCQkJCVB5X3NzaXplX3QgbmV3c2l6ZSA9IGN1cnZhbGlkICsgQlVGU0laOwogCQkJCWNoYXIgKm5ld2J1ZiA9IHRvay0+YnVmOwotCQkJCVB5TWVtX1JFU0laRShuZXdidWYsIGNoYXIsIG5ld3NpemUpOworCQkJCW5ld2J1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhuZXdidWYsCisJCQkJCQkJICAgICAgIG5ld3NpemUpOwogCQkJCWlmIChuZXdidWYgPT0gTlVMTCkgewogCQkJCQl0b2stPmRvbmUgPSBFX05PTUVNOwogCQkJCQl0b2stPmN1ciA9IHRvay0+aW5wOwpAQCAtMTE4Miw5ICsxMTkwLDkgQEAKIAkJCX0KIAkJfQogCX0KLQkKKwogCXRvay0+c3RhcnQgPSB0b2stPmN1cjsKLQkKKwogCS8qIFJldHVybiBwZW5kaW5nIGluZGVudHMvZGVkZW50cyAqLwogCWlmICh0b2stPnBlbmRpbiAhPSAwKSB7CiAJCWlmICh0b2stPnBlbmRpbiA8IDApIHsKQEAgLTExOTYsMjcgKzEyMDQsMjcgQEAKIAkJCXJldHVybiBJTkRFTlQ7CiAJCX0KIAl9Ci0JCisKICBhZ2FpbjoKIAl0b2stPnN0YXJ0ID0gTlVMTDsKIAkvKiBTa2lwIHNwYWNlcyAqLwogCWRvIHsKIAkJYyA9IHRva19uZXh0Yyh0b2spOwogCX0gd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcMDE0Jyk7Ci0JCisKIAkvKiBTZXQgc3RhcnQgb2YgY3VycmVudCB0b2tlbiAqLwogCXRvay0+c3RhcnQgPSB0b2stPmN1ciAtIDE7Ci0JCisKIAkvKiBTa2lwIGNvbW1lbnQgKi8KIAlpZiAoYyA9PSAnIycpCiAJCXdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCiAJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCisKIAkvKiBDaGVjayBmb3IgRU9GIGFuZCBlcnJvcnMgbm93ICovCiAJaWYgKGMgPT0gRU9GKSB7CiAJCXJldHVybiB0b2stPmRvbmUgPT0gRV9FT0YgPyBFTkRNQVJLRVIgOiBFUlJPUlRPS0VOOwogCX0KLQkKKwogCS8qIElkZW50aWZpZXIgKG1vc3QgZnJlcXVlbnQgdG9rZW4hKSAqLwogCWlmIChpc2FscGhhKGMpIHx8IGMgPT0gJ18nKSB7CiAJCS8qIFByb2Nlc3MgciIiLCB1IiIgYW5kIHVyIiIgKi8KQEAgLTEyNDQsNyArMTI1Miw3IEBACiAJCSpwX2VuZCA9IHRvay0+Y3VyOwogCQlyZXR1cm4gTkFNRTsKIAl9Ci0JCisKIAkvKiBOZXdsaW5lICovCiAJaWYgKGMgPT0gJ1xuJykgewogCQl0b2stPmF0Ym9sID0gMTsKQEAgLTEyNTUsNyArMTI2Myw3IEBACiAgICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAwOwogCQlyZXR1cm4gTkVXTElORTsKIAl9Ci0JCisKIAkvKiBQZXJpb2Qgb3IgbnVtYmVyIHN0YXJ0aW5nIHdpdGggcGVyaW9kPyAqLwogCWlmIChjID09ICcuJykgewogCQljID0gdG9rX25leHRjKHRvayk7CkBAIC0xNDE4LDcgKzE0MjYsNyBAQAogCQkqcF9lbmQgPSB0b2stPmN1cjsKIAkJcmV0dXJuIFNUUklORzsKIAl9Ci0JCisKIAkvKiBMaW5lIGNvbnRpbnVhdGlvbiAqLwogCWlmIChjID09ICdcXCcpIHsKIAkJYyA9IHRva19uZXh0Yyh0b2spOwpAQCAtMTQzMCw3ICsxNDM4LDcgQEAKICAgICAgICAgICAgICAgICB0b2stPmNvbnRfbGluZSA9IDE7CiAJCWdvdG8gYWdhaW47IC8qIFJlYWQgbmV4dCBsaW5lICovCiAJfQotCQorCiAJLyogQ2hlY2sgZm9yIHR3by1jaGFyYWN0ZXIgdG9rZW4gKi8KIAl7CiAJCWludCBjMiA9IHRva19uZXh0Yyh0b2spOwpAQCAtMTQ0OSw3ICsxNDU3LDcgQEAKIAkJfQogCQl0b2tfYmFja3VwKHRvaywgYzIpOwogCX0KLQkKKwogCS8qIEtlZXAgdHJhY2sgb2YgcGFyZW50aGVzZXMgbmVzdGluZyBsZXZlbCAqLwogCXN3aXRjaCAoYykgewogCWNhc2UgJygnOgpAQCAtMTQ2Myw3ICsxNDcxLDcgQEAKIAkJdG9rLT5sZXZlbC0tOwogCQlicmVhazsKIAl9Ci0JCisKIAkvKiBQdW5jdHVhdGlvbiBjaGFyYWN0ZXIgKi8KIAkqcF9zdGFydCA9IHRvay0+c3RhcnQ7CiAJKnBfZW5kID0gdG9rLT5jdXI7CmRpZmYgLS1naXQgYS9QeXRob24vUHl0aG9uLWFzdC5jIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwppbmRleCAzZjgzNDVlLi4yNDlmNzBlIDEwMDY0NAotLS0gYS9QeXRob24vUHl0aG9uLWFzdC5jCisrKyBiL1B5dGhvbi9QeXRob24tYXN0LmMKQEAgLTMzMSw2ICszMzEsOCBAQAogICAgICAgICAidHlwZSIsCiAgICAgICAgICJuYW1lIiwKICAgICAgICAgImJvZHkiLAorICAgICAgICAibGluZW5vIiwKKyAgICAgICAgImNvbF9vZmZzZXQiLAogfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmFyZ3VtZW50c190eXBlOwogc3RhdGljIFB5T2JqZWN0KiBhc3Qyb2JqX2FyZ3VtZW50cyh2b2lkKik7CkBAIC0zODEsMTAgKzM4MywxMCBAQAogCiBzdGF0aWMgaW50IGFkZF9hdHRyaWJ1dGVzKFB5VHlwZU9iamVjdCogdHlwZSwgY2hhcioqYXR0cnMsIGludCBudW1fZmllbGRzKQogewotICAgIGludCBpOworICAgIGludCBpLCByZXN1bHQ7CiAgICAgUHlPYmplY3QgKnMsICpsID0gUHlMaXN0X05ldyhudW1fZmllbGRzKTsKICAgICBpZiAoIWwpIHJldHVybiAwOwotICAgIGZvcihpPTA7IGkgPCBudW1fZmllbGRzOyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBudW1fZmllbGRzOyBpKyspIHsKICAgICAgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXR0cnNbaV0pOwogICAgICAgICBpZiAoIXMpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihsKTsKQEAgLTM5Miw3ICszOTQsOSBAQAogICAgICAgICB9CiAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsLCBpLCBzKTsKICAgICB9Ci0gICAgcmV0dXJuIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0Kil0eXBlLCAiX2F0dHJpYnV0ZXMiLCBsKSA+PTA7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QqKXR5cGUsICJfYXR0cmlidXRlcyIsIGwpID49IDA7CisgICAgUHlfREVDUkVGKGwpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCogYXN0Mm9ial9saXN0KGFzZGxfc2VxICpzZXEsIFB5T2JqZWN0KiAoKmZ1bmMpKHZvaWQqKSkKQEAgLTQzMiw5ICs0MzYsOSBAQAogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhiKTsKIH0KIAotc3RhdGljIGludCBpbml0aWFsaXplZDsKIHN0YXRpYyBpbnQgaW5pdF90eXBlcyh2b2lkKQogeworICAgICAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkOwogICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHJldHVybiAxOwogICAgICAgICBBU1RfdHlwZSA9IG1ha2VfdHlwZSgiQVNUIiwgJlB5QmFzZU9iamVjdF9UeXBlLCBOVUxMLCAwKTsKICAgICAgICAgbW9kX3R5cGUgPSBtYWtlX3R5cGUoIm1vZCIsIEFTVF90eXBlLCBOVUxMLCAwKTsKQEAgLTcxMCw3ICs3MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlaGVuc2lvbl9maWVsZHMsIDMpOwogICAgICAgICBpZiAoIWNvbXByZWhlbnNpb25fdHlwZSkgcmV0dXJuIDA7CiAgICAgICAgIGV4Y2VwdGhhbmRsZXJfdHlwZSA9IG1ha2VfdHlwZSgiZXhjZXB0aGFuZGxlciIsIEFTVF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aGFuZGxlcl9maWVsZHMsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aGFuZGxlcl9maWVsZHMsIDUpOwogICAgICAgICBpZiAoIWV4Y2VwdGhhbmRsZXJfdHlwZSkgcmV0dXJuIDA7CiAgICAgICAgIGFyZ3VtZW50c190eXBlID0gbWFrZV90eXBlKCJhcmd1bWVudHMiLCBBU1RfdHlwZSwgYXJndW1lbnRzX2ZpZWxkcywgNCk7CiAgICAgICAgIGlmICghYXJndW1lbnRzX3R5cGUpIHJldHVybiAwOwpAQCAtMTQ5OSw4ICsxNTAzLDggQEAKIH0KIAogZXhwcl90eQotQ29tcGFyZShleHByX3R5IGxlZnQsIGFzZGxfc2VxICogb3BzLCBhc2RsX3NlcSAqIGNvbXBhcmF0b3JzLCBpbnQgbGluZW5vLCBpbnQKLSAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCitDb21wYXJlKGV4cHJfdHkgbGVmdCwgYXNkbF9pbnRfc2VxICogb3BzLCBhc2RsX3NlcSAqIGNvbXBhcmF0b3JzLCBpbnQgbGluZW5vLAorICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCiB7CiAgICAgICAgIGV4cHJfdHkgcDsKICAgICAgICAgaWYgKCFsZWZ0KSB7CkBAIC0xODQxLDcgKzE4NDUsOCBAQAogfQogCiBleGNlcHRoYW5kbGVyX3R5Ci1leGNlcHRoYW5kbGVyKGV4cHJfdHkgdHlwZSwgZXhwcl90eSBuYW1lLCBhc2RsX3NlcSAqIGJvZHksIFB5QXJlbmEgKmFyZW5hKQorZXhjZXB0aGFuZGxlcihleHByX3R5IHR5cGUsIGV4cHJfdHkgbmFtZSwgYXNkbF9zZXEgKiBib2R5LCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCiB7CiAgICAgICAgIGV4Y2VwdGhhbmRsZXJfdHkgcDsKICAgICAgICAgcCA9IChleGNlcHRoYW5kbGVyX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKQEAgLTE4NTIsNiArMTg1Nyw4IEBACiAgICAgICAgIHAtPnR5cGUgPSB0eXBlOwogICAgICAgICBwLT5uYW1lID0gbmFtZTsKICAgICAgICAgcC0+Ym9keSA9IGJvZHk7CisgICAgICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICAgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CiAgICAgICAgIHJldHVybiBwOwogfQogCkBAIC0yOTE1LDYgKzI5MjIsMTYgQEAKICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcocmVzdWx0LCAiYm9keSIsIHZhbHVlKSA9PSAtMSkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2ludChvLT5saW5lbm8pOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcocmVzdWx0LCAibGluZW5vIiwgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfaW50KG8tPmNvbF9vZmZzZXQpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcocmVzdWx0LCAiY29sX29mZnNldCIsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKIGZhaWxlZDoKICAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CkBAIC0zMDMzLDE0NiArMzA1MCwxNDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiX192ZXJzaW9uX18iLCAiNDI3NTMiKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibW9kIiwgKFB5T2JqZWN0Kiltb2RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNb2R1bGUiLCAoUHlPYmplY3QqKU1vZHVsZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkludGVyYWN0aXZlIiwgKFB5T2JqZWN0KilJbnRlcmFjdGl2ZV90eXBlKQotICAgICAgICAgICA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4cHJlc3Npb24iLCAoUHlPYmplY3QqKUV4cHJlc3Npb25fdHlwZSkgPAotICAgICAgICAgICAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWl0ZSIsIChQeU9iamVjdCopU3VpdGVfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdG10IiwgKFB5T2JqZWN0KilzdG10X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRnVuY3Rpb25EZWYiLCAoUHlPYmplY3QqKUZ1bmN0aW9uRGVmX3R5cGUpCi0gICAgICAgICAgIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ2xhc3NEZWYiLCAoUHlPYmplY3QqKUNsYXNzRGVmX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmV0dXJuIiwgKFB5T2JqZWN0KilSZXR1cm5fdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEZWxldGUiLCAoUHlPYmplY3QqKURlbGV0ZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFzc2lnbiIsIChQeU9iamVjdCopQXNzaWduX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnQXNzaWduIiwgKFB5T2JqZWN0KilBdWdBc3NpZ25fdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQcmludCIsIChQeU9iamVjdCopUHJpbnRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3IiLCAoUHlPYmplY3QqKUZvcl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIldoaWxlIiwgKFB5T2JqZWN0KilXaGlsZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklmIiwgKFB5T2JqZWN0KilJZl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIldpdGgiLCAoUHlPYmplY3QqKVdpdGhfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSYWlzZSIsIChQeU9iamVjdCopUmFpc2VfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUcnlFeGNlcHQiLCAoUHlPYmplY3QqKVRyeUV4Y2VwdF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRyeUZpbmFsbHkiLCAoUHlPYmplY3QqKVRyeUZpbmFsbHlfdHlwZSkgPAotICAgICAgICAgICAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBc3NlcnQiLCAoUHlPYmplY3QqKUFzc2VydF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkltcG9ydCIsIChQeU9iamVjdCopSW1wb3J0X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW1wb3J0RnJvbSIsIChQeU9iamVjdCopSW1wb3J0RnJvbV90eXBlKSA8Ci0gICAgICAgICAgIDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4ZWMiLCAoUHlPYmplY3QqKUV4ZWNfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHbG9iYWwiLCAoUHlPYmplY3QqKUdsb2JhbF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4cHIiLCAoUHlPYmplY3QqKUV4cHJfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQYXNzIiwgKFB5T2JqZWN0KilQYXNzX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQnJlYWsiLCAoUHlPYmplY3QqKUJyZWFrX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ29udGludWUiLCAoUHlPYmplY3QqKUNvbnRpbnVlX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXhwciIsIChQeU9iamVjdCopZXhwcl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJvb2xPcCIsIChQeU9iamVjdCopQm9vbE9wX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQmluT3AiLCAoUHlPYmplY3QqKUJpbk9wX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVW5hcnlPcCIsIChQeU9iamVjdCopVW5hcnlPcF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxhbWJkYSIsIChQeU9iamVjdCopTGFtYmRhX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSWZFeHAiLCAoUHlPYmplY3QqKUlmRXhwX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRGljdCIsIChQeU9iamVjdCopRGljdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxpc3RDb21wIiwgKFB5T2JqZWN0KilMaXN0Q29tcF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdlbmVyYXRvckV4cCIsCi0gICAgICAgICAgIChQeU9iamVjdCopR2VuZXJhdG9yRXhwX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWWllbGQiLCAoUHlPYmplY3QqKVlpZWxkX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ29tcGFyZSIsIChQeU9iamVjdCopQ29tcGFyZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNhbGwiLCAoUHlPYmplY3QqKUNhbGxfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSZXByIiwgKFB5T2JqZWN0KilSZXByX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTnVtIiwgKFB5T2JqZWN0KilOdW1fdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdHIiLCAoUHlPYmplY3QqKVN0cl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF0dHJpYnV0ZSIsIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3Vic2NyaXB0IiwgKFB5T2JqZWN0KilTdWJzY3JpcHRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOYW1lIiwgKFB5T2JqZWN0KilOYW1lX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTGlzdCIsIChQeU9iamVjdCopTGlzdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlR1cGxlIiwgKFB5T2JqZWN0KilUdXBsZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImV4cHJfY29udGV4dCIsCi0gICAgICAgICAgIChQeU9iamVjdCopZXhwcl9jb250ZXh0X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTG9hZCIsIChQeU9iamVjdCopTG9hZF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0b3JlIiwgKFB5T2JqZWN0KilTdG9yZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRlbCIsIChQeU9iamVjdCopRGVsX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnTG9hZCIsIChQeU9iamVjdCopQXVnTG9hZF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF1Z1N0b3JlIiwgKFB5T2JqZWN0KilBdWdTdG9yZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBhcmFtIiwgKFB5T2JqZWN0KilQYXJhbV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInNsaWNlIiwgKFB5T2JqZWN0KilzbGljZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVsbGlwc2lzIiwgKFB5T2JqZWN0KilFbGxpcHNpc190eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNsaWNlIiwgKFB5T2JqZWN0KilTbGljZV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4dFNsaWNlIiwgKFB5T2JqZWN0KilFeHRTbGljZV90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkluZGV4IiwgKFB5T2JqZWN0KilJbmRleF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImJvb2xvcCIsIChQeU9iamVjdCopYm9vbG9wX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQW5kIiwgKFB5T2JqZWN0KilBbmRfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPciIsIChQeU9iamVjdCopT3JfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJvcGVyYXRvciIsIChQeU9iamVjdCopb3BlcmF0b3JfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBZGQiLCAoUHlPYmplY3QqKUFkZF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YiIsIChQeU9iamVjdCopU3ViX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTXVsdCIsIChQeU9iamVjdCopTXVsdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRpdiIsIChQeU9iamVjdCopRGl2X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTW9kIiwgKFB5T2JqZWN0KilNb2RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQb3ciLCAoUHlPYmplY3QqKVBvd190eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxTaGlmdCIsIChQeU9iamVjdCopTFNoaWZ0X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlNoaWZ0IiwgKFB5T2JqZWN0KilSU2hpZnRfdHlwZSkgPCAwKQotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaXRPciIsIChQeU9iamVjdCopQml0T3JfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaXRYb3IiLCAoUHlPYmplY3QqKUJpdFhvcl90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJpdEFuZCIsIChQeU9iamVjdCopQml0QW5kX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRmxvb3JEaXYiLCAoUHlPYmplY3QqKUZsb29yRGl2X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAidW5hcnlvcCIsIChQeU9iamVjdCopdW5hcnlvcF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkludmVydCIsIChQeU9iamVjdCopSW52ZXJ0X3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTm90IiwgKFB5T2JqZWN0KilOb3RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVQWRkIiwgKFB5T2JqZWN0KilVQWRkX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVVN1YiIsIChQeU9iamVjdCopVVN1Yl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNtcG9wIiwgKFB5T2JqZWN0KiljbXBvcF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVxIiwgKFB5T2JqZWN0KilFcV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5vdEVxIiwgKFB5T2JqZWN0KilOb3RFcV90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkx0IiwgKFB5T2JqZWN0KilMdF90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkx0RSIsIChQeU9iamVjdCopTHRFX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR3QiLCAoUHlPYmplY3QqKUd0X3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR3RFIiwgKFB5T2JqZWN0KilHdEVfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJcyIsIChQeU9iamVjdCopSXNfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJc05vdCIsIChQeU9iamVjdCopSXNOb3RfdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbiIsIChQeU9iamVjdCopSW5fdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOb3RJbiIsIChQeU9iamVjdCopTm90SW5fdHlwZSkgPCAwKSByZXR1cm47Ci0gICAgICAgIGlmKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjb21wcmVoZW5zaW9uIiwKLSAgICAgICAgICAgKFB5T2JqZWN0Kiljb21wcmVoZW5zaW9uX3R5cGUpIDwgMCkgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXhjZXB0aGFuZGxlciIsCi0gICAgICAgICAgIChQeU9iamVjdCopZXhjZXB0aGFuZGxlcl90eXBlKSA8IDApIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImFyZ3VtZW50cyIsIChQeU9iamVjdCopYXJndW1lbnRzX3R5cGUpIDwgMCkKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZihQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAia2V5d29yZCIsIChQeU9iamVjdCopa2V5d29yZF90eXBlKSA8IDApCi0gICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImFsaWFzIiwgKFB5T2JqZWN0KilhbGlhc190eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtb2QiLCAoUHlPYmplY3QqKW1vZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNb2R1bGUiLCAoUHlPYmplY3QqKU1vZHVsZV90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW50ZXJhY3RpdmUiLCAoUHlPYmplY3QqKUludGVyYWN0aXZlX3R5cGUpCisgICAgICAgICAgICA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFeHByZXNzaW9uIiwgKFB5T2JqZWN0KilFeHByZXNzaW9uX3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWl0ZSIsIChQeU9iamVjdCopU3VpdGVfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RtdCIsIChQeU9iamVjdCopc3RtdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGdW5jdGlvbkRlZiIsIChQeU9iamVjdCopRnVuY3Rpb25EZWZfdHlwZSkKKyAgICAgICAgICAgIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNsYXNzRGVmIiwgKFB5T2JqZWN0KilDbGFzc0RlZl90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmV0dXJuIiwgKFB5T2JqZWN0KilSZXR1cm5fdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRlbGV0ZSIsIChQeU9iamVjdCopRGVsZXRlX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBc3NpZ24iLCAoUHlPYmplY3QqKUFzc2lnbl90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXVnQXNzaWduIiwgKFB5T2JqZWN0KilBdWdBc3NpZ25fdHlwZSkgPAorICAgICAgICAgICAgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlByaW50IiwgKFB5T2JqZWN0KilQcmludF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3IiLCAoUHlPYmplY3QqKUZvcl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJXaGlsZSIsIChQeU9iamVjdCopV2hpbGVfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSWYiLCAoUHlPYmplY3QqKUlmX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIldpdGgiLCAoUHlPYmplY3QqKVdpdGhfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmFpc2UiLCAoUHlPYmplY3QqKVJhaXNlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRyeUV4Y2VwdCIsIChQeU9iamVjdCopVHJ5RXhjZXB0X3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUcnlGaW5hbGx5IiwgKFB5T2JqZWN0KilUcnlGaW5hbGx5X3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBc3NlcnQiLCAoUHlPYmplY3QqKUFzc2VydF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSW1wb3J0IiwgKFB5T2JqZWN0KilJbXBvcnRfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkltcG9ydEZyb20iLCAoUHlPYmplY3QqKUltcG9ydEZyb21fdHlwZSkgPAorICAgICAgICAgICAgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4ZWMiLCAoUHlPYmplY3QqKUV4ZWNfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR2xvYmFsIiwgKFB5T2JqZWN0KilHbG9iYWxfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkV4cHIiLCAoUHlPYmplY3QqKUV4cHJfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUGFzcyIsIChQeU9iamVjdCopUGFzc190eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCcmVhayIsIChQeU9iamVjdCopQnJlYWtfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ29udGludWUiLCAoUHlPYmplY3QqKUNvbnRpbnVlX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJleHByIiwgKFB5T2JqZWN0KilleHByX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJvb2xPcCIsIChQeU9iamVjdCopQm9vbE9wX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaW5PcCIsIChQeU9iamVjdCopQmluT3BfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVW5hcnlPcCIsIChQeU9iamVjdCopVW5hcnlPcF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTGFtYmRhIiwgKFB5T2JqZWN0KilMYW1iZGFfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklmRXhwIiwgKFB5T2JqZWN0KilJZkV4cF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEaWN0IiwgKFB5T2JqZWN0KilEaWN0X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxpc3RDb21wIiwgKFB5T2JqZWN0KilMaXN0Q29tcF90eXBlKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR2VuZXJhdG9yRXhwIiwKKyAgICAgICAgICAgIChQeU9iamVjdCopR2VuZXJhdG9yRXhwX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllpZWxkIiwgKFB5T2JqZWN0KilZaWVsZF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDb21wYXJlIiwgKFB5T2JqZWN0KilDb21wYXJlX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDYWxsIiwgKFB5T2JqZWN0KilDYWxsX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJlcHIiLCAoUHlPYmplY3QqKVJlcHJfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTnVtIiwgKFB5T2JqZWN0KilOdW1fdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU3RyIiwgKFB5T2JqZWN0KilTdHJfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXR0cmlidXRlIiwgKFB5T2JqZWN0KilBdHRyaWJ1dGVfdHlwZSkgPAorICAgICAgICAgICAgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YnNjcmlwdCIsIChQeU9iamVjdCopU3Vic2NyaXB0X3R5cGUpIDwKKyAgICAgICAgICAgIDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOYW1lIiwgKFB5T2JqZWN0KilOYW1lX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxpc3QiLCAoUHlPYmplY3QqKUxpc3RfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVHVwbGUiLCAoUHlPYmplY3QqKVR1cGxlX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImV4cHJfY29udGV4dCIsCisgICAgICAgICAgICAoUHlPYmplY3QqKWV4cHJfY29udGV4dF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMb2FkIiwgKFB5T2JqZWN0KilMb2FkX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0b3JlIiwgKFB5T2JqZWN0KilTdG9yZV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEZWwiLCAoUHlPYmplY3QqKURlbF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBdWdMb2FkIiwgKFB5T2JqZWN0KilBdWdMb2FkX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBdWdTdG9yZSIsIChQeU9iamVjdCopQXVnU3RvcmVfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBhcmFtIiwgKFB5T2JqZWN0KilQYXJhbV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzbGljZSIsIChQeU9iamVjdCopc2xpY2VfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRWxsaXBzaXMiLCAoUHlPYmplY3QqKUVsbGlwc2lzX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTbGljZSIsIChQeU9iamVjdCopU2xpY2VfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXh0U2xpY2UiLCAoUHlPYmplY3QqKUV4dFNsaWNlX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbmRleCIsIChQeU9iamVjdCopSW5kZXhfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYm9vbG9wIiwgKFB5T2JqZWN0Kilib29sb3BfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFuZCIsIChQeU9iamVjdCopQW5kX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9yIiwgKFB5T2JqZWN0KilPcl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJvcGVyYXRvciIsIChQeU9iamVjdCopb3BlcmF0b3JfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFkZCIsIChQeU9iamVjdCopQWRkX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YiIsIChQeU9iamVjdCopU3ViX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk11bHQiLCAoUHlPYmplY3QqKU11bHRfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRGl2IiwgKFB5T2JqZWN0KilEaXZfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTW9kIiwgKFB5T2JqZWN0KilNb2RfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUG93IiwgKFB5T2JqZWN0KilQb3dfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTFNoaWZ0IiwgKFB5T2JqZWN0KilMU2hpZnRfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJTaGlmdCIsIChQeU9iamVjdCopUlNoaWZ0X3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCaXRPciIsIChQeU9iamVjdCopQml0T3JfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQml0WG9yIiwgKFB5T2JqZWN0KilCaXRYb3JfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJpdEFuZCIsIChQeU9iamVjdCopQml0QW5kX3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGbG9vckRpdiIsIChQeU9iamVjdCopRmxvb3JEaXZfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInVuYXJ5b3AiLCAoUHlPYmplY3QqKXVuYXJ5b3BfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkludmVydCIsIChQeU9iamVjdCopSW52ZXJ0X3R5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOb3QiLCAoUHlPYmplY3QqKU5vdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVQWRkIiwgKFB5T2JqZWN0KilVQWRkX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVTdWIiLCAoUHlPYmplY3QqKVVTdWJfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY21wb3AiLCAoUHlPYmplY3QqKWNtcG9wX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVxIiwgKFB5T2JqZWN0KilFcV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOb3RFcSIsIChQeU9iamVjdCopTm90RXFfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTHQiLCAoUHlPYmplY3QqKUx0X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkx0RSIsIChQeU9iamVjdCopTHRFX3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkd0IiwgKFB5T2JqZWN0KilHdF90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHdEUiLCAoUHlPYmplY3QqKUd0RV90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJcyIsIChQeU9iamVjdCopSXNfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXNOb3QiLCAoUHlPYmplY3QqKUlzTm90X3R5cGUpIDwgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkluIiwgKFB5T2JqZWN0KilJbl90eXBlKSA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOb3RJbiIsIChQeU9iamVjdCopTm90SW5fdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY29tcHJlaGVuc2lvbiIsCisgICAgICAgICAgICAoUHlPYmplY3QqKWNvbXByZWhlbnNpb25fdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXhjZXB0aGFuZGxlciIsCisgICAgICAgICAgICAoUHlPYmplY3QqKWV4Y2VwdGhhbmRsZXJfdHlwZSkgPCAwKSByZXR1cm47CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXJndW1lbnRzIiwgKFB5T2JqZWN0Kilhcmd1bWVudHNfdHlwZSkgPAorICAgICAgICAgICAgMCkgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImtleXdvcmQiLCAoUHlPYmplY3QqKWtleXdvcmRfdHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImFsaWFzIiwgKFB5T2JqZWN0KilhbGlhc190eXBlKSA8IDApIHJldHVybjsKIH0KIAogCmRpZmYgLS1naXQgYS9QeXRob24vYXNkbC5jIGIvUHl0aG9uL2FzZGwuYwppbmRleCAyMjVkZjZlLi43MjMyOWI5IDEwMDY0NAotLS0gYS9QeXRob24vYXNkbC5jCisrKyBiL1B5dGhvbi9hc2RsLmMKQEAgLTgsNyArOCwyNCBAQAogCXNpemVfdCBuID0gc2l6ZW9mKGFzZGxfc2VxKSArCiAJCQkoc2l6ZSA/IChzaXplb2Yodm9pZCAqKSAqIChzaXplIC0gMSkpIDogMCk7CiAKLSAgICBzZXEgPSAoYXNkbF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7CisJc2VxID0gKGFzZGxfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOworCWlmICghc2VxKSB7CisJCVB5RXJyX05vTWVtb3J5KCk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoc2VxLCAwLCBuKTsKKwlzZXEtPnNpemUgPSBzaXplOworCXJldHVybiBzZXE7Cit9CisKK2FzZGxfaW50X3NlcSAqCithc2RsX2ludF9zZXFfbmV3KGludCBzaXplLCBQeUFyZW5hICphcmVuYSkKK3sKKwlhc2RsX2ludF9zZXEgKnNlcSA9IE5VTEw7CisJc2l6ZV90IG4gPSBzaXplb2YoYXNkbF9zZXEpICsKKwkJCShzaXplID8gKHNpemVvZihpbnQpICogKHNpemUgLSAxKSkgOiAwKTsKKworCXNlcSA9IChhc2RsX2ludF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7CiAJaWYgKCFzZXEpIHsKIAkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggYmIxNzc0Yi4uMGIzYjQ4NSAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMzEsNyArMzEsNyBAQAogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl9leHByKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqKTsKIHN0YXRpYyBzdG10X3R5IGFzdF9mb3Jfc3RtdChzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKik7CiBzdGF0aWMgYXNkbF9zZXEgKmFzdF9mb3Jfc3VpdGUoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICopOwotc3RhdGljIGFzZGxfc2VxICphc3RfZm9yX2V4cHJsaXN0KHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBpbnQpOworc3RhdGljIGFzZGxfc2VxICphc3RfZm9yX2V4cHJsaXN0KHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBleHByX2NvbnRleHRfdHkpOwogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl90ZXN0bGlzdChzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKik7CiBzdGF0aWMgZXhwcl90eSBhc3RfZm9yX3Rlc3RsaXN0X2dleHAoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICopOwogCkBAIC0xOTEsNiArMTkxLDEwIEBACiAKICAgICBpZiAoZmxhZ3MgJiYgZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9TT1VSQ0VfSVNfVVRGOCkgewogICAgICAgICBjLmNfZW5jb2RpbmcgPSAidXRmLTgiOworICAgICAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7CisgICAgICAgICAgICAgICAgYXN0X2Vycm9yKG4sICJlbmNvZGluZyBkZWNsYXJhdGlvbiBpbiBVbmljb2RlIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKFRZUEUobikgPT0gZW5jb2RpbmdfZGVjbCkgewogICAgICAgICBjLmNfZW5jb2RpbmcgPSBTVFIobik7CiAgICAgICAgIG4gPSBDSElMRChuLCAwKTsKQEAgLTI0Myw3ICsyNDcsOCBAQAogICAgICAgICAgICAgICAgIHN0bXRzID0gYXNkbF9zZXFfbmV3KDEsIGFyZW5hKTsKICAgICAgICAgICAgICAgICBpZiAoIXN0bXRzKQogCQkgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoc3RtdHMsIDAsIFBhc3Mobi0+bl9saW5lbm8sIG4tPm5fY29sX29mZnNldCwgYXJlbmEpKTsKKyAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoc3RtdHMsIDAsIFBhc3Mobi0+bl9saW5lbm8sIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbmEpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3RpdmUoc3RtdHMsIGFyZW5hKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMzExLDcgKzMxNiw3IEBACiAgICAgICAgIGNhc2UgUEVSQ0VOVDoKICAgICAgICAgICAgIHJldHVybiBNb2Q7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiAob3BlcmF0b3JfdHkpMDsKICAgICB9CiB9CiAKQEAgLTQxOSw3ICs0MjQsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzKTsgaSsrKSB7Ci0JICAgIGlmICghc2V0X2NvbnRleHQoYXNkbF9zZXFfR0VUKHMsIGkpLCBjdHgsIG4pKQorCSAgICBpZiAoIXNldF9jb250ZXh0KChleHByX3R5KWFzZGxfc2VxX0dFVChzLCBpKSwgY3R4LCBuKSkKIAkJcmV0dXJuIDA7CiAJfQogICAgIH0KQEAgLTQ2MCw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBNdWx0OwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiaW52YWxpZCBhdWdhc3NpZ246ICVzIiwgU1RSKG4pKTsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIChvcGVyYXRvcl90eSkwOwogICAgIH0KIH0KIApAQCAtNDk0LDcgKzQ5OSw3IEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImludmFsaWQgY29tcF9vcDogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFIobikpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHJldHVybiAoY21wb3BfdHkpMDsKIAl9CiAgICAgfQogICAgIGVsc2UgaWYgKE5DSChuKSA9PSAyKSB7CkBAIC01MDgsMTIgKzUxMywxMiBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJpbnZhbGlkIGNvbXBfb3A6ICVzICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSKENISUxEKG4sIDApKSwgU1RSKENISUxEKG4sIDEpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbXBvcF90eSkwOwogCX0KICAgICB9CiAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiaW52YWxpZCBjb21wX29wOiBoYXMgJWQgY2hpbGRyZW4iLAogICAgICAgICAgICAgICAgICBOQ0gobikpOwotICAgIHJldHVybiAwOworICAgIHJldHVybiAoY21wb3BfdHkpMDsKIH0KIAogc3RhdGljIGFzZGxfc2VxICoKQEAgLTU2NCw4ICs1NjksOCBAQAogCSAgICAJCWFzdF9lcnJvcihjaGlsZCwgImFzc2lnbm1lbnQgdG8gTm9uZSIpOwogCQkgICAgCXJldHVybiBOVUxMOwogCQkgICAgfSAgIAotICAgICAgICAgICAgYXJnID0gTmFtZShORVdfSURFTlRJRklFUihjaGlsZCksIFN0b3JlLCBMSU5FTk8oY2hpbGQpLCBjaGlsZC0+bl9jb2xfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgIGFyZyA9IE5hbWUoTkVXX0lERU5USUZJRVIoY2hpbGQpLCBTdG9yZSwgTElORU5PKGNoaWxkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAJICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhcmcgPSBjb21waWxlcl9jb21wbGV4X2FyZ3MoYywgQ0hJTEQoQ0hJTEQobiwgMippKSwgMSkpOwpAQCAtNjQxLDE3ICs2NDYsMjUgQEAKIAkJICAgIGdvdG8gZXJyb3I7CiAJCX0KICAgICAgICAgICAgICAgICBpZiAoTkNIKGNoKSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhcmdzLCBrKyssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfY29tcGxleF9hcmdzKGMsIENISUxEKGNoLCAxKSkpOyAKLQkJfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQoY2gsIDApKSA9PSBOQU1FKSB7CisJCSAgICBjaCA9IENISUxEKGNoLCAxKTsKKwkJICAgIC8qIGRlZiBmb28oKHgpKTogaXMgbm90IGNvbXBsZXgsIHNwZWNpYWwgY2FzZS4gKi8KKwkJICAgIGlmIChOQ0goY2gpICE9IDEpIHsKKwkJCS8qIFdlIGhhdmUgY29tcGxleCBhcmd1bWVudHMsIHNldHVwIGZvciB1bnBhY2tpbmcuICovCisJCQlhc2RsX3NlcV9TRVQoYXJncywgaysrLCBjb21waWxlcl9jb21wbGV4X2FyZ3MoYywgY2gpKTsKKwkJICAgIH0gZWxzZSB7CisJCQkvKiBkZWYgZm9vKCh4KSk6IHNldHVwIGZvciBjaGVja2luZyBOQU1FIGJlbG93LiAqLworCQkJY2ggPSBDSElMRChjaCwgMCk7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChUWVBFKENISUxEKGNoLCAwKSkgPT0gTkFNRSkgewogCQkgICAgZXhwcl90eSBuYW1lOwogCQkgICAgaWYgKCFzdHJjbXAoU1RSKENISUxEKGNoLCAwKSksICJOb25lIikpIHsKIAkJCSAgICBhc3RfZXJyb3IoQ0hJTEQoY2gsIDApLCAiYXNzaWdubWVudCB0byBOb25lIik7CiAJCQkgICAgZ290byBlcnJvcjsKIAkJICAgIH0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5hbWUoTkVXX0lERU5USUZJRVIoQ0hJTEQoY2gsIDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0sIExJTkVOTyhjaCksIGNoLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhcmdzLCBrKyssIG5hbWUpOwpAQCAtNzQzLDcgKzc1Niw4IEBACiAJbmFtZV9leHByID0gTlVMTDsKICAgICB9CiAgICAgZWxzZSBpZiAoTkNIKG4pID09IDUpIHsgLyogQ2FsbCB3aXRoIG5vIGFyZ3VtZW50cyAqLwotCWQgPSBDYWxsKG5hbWVfZXhwciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworCWQgPSBDYWxsKG5hbWVfZXhwciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogCWlmICghZCkKIAkgICAgcmV0dXJuIE5VTEw7CiAJbmFtZV9leHByID0gTlVMTDsKQEAgLTgxNSw3ICs4MjksOCBAQAogICAgIGlmICghYm9keSkKIAlyZXR1cm4gTlVMTDsKIAotICAgIHJldHVybiBGdW5jdGlvbkRlZihuYW1lLCBhcmdzLCBib2R5LCBkZWNvcmF0b3Jfc2VxLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgcmV0dXJuIEZ1bmN0aW9uRGVmKG5hbWUsIGFyZ3MsIGJvZHksIGRlY29yYXRvcl9zZXEsIExJTkVOTyhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKIH0KIAogc3RhdGljIGV4cHJfdHkKQEAgLTg2MSw3ICs4NzYsOCBAQAogICAgIG9yZWxzZSA9IGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCA0KSk7CiAgICAgaWYgKCFvcmVsc2UpCiAJcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIElmRXhwKGV4cHJlc3Npb24sIGJvZHksIG9yZWxzZSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIHJldHVybiBJZkV4cChleHByZXNzaW9uLCBib2R5LCBvcmVsc2UsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKIH0KIAogLyogQ291bnQgdGhlIG51bWJlciBvZiAnZm9yJyBsb29wIGluIGEgbGlzdCBjb21wcmVoZW5zaW9uLgpAQCAtOTY5LDEwICs5ODUsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAJaWYgKGFzZGxfc2VxX0xFTih0KSA9PSAxKQotCSAgICBsYyA9IGNvbXByZWhlbnNpb24oYXNkbF9zZXFfR0VUKHQsIDApLCBleHByZXNzaW9uLCBOVUxMLAorCSAgICBsYyA9IGNvbXByZWhlbnNpb24oKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHQsIDApLCBleHByZXNzaW9uLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogCWVsc2UKLQkgICAgbGMgPSBjb21wcmVoZW5zaW9uKFR1cGxlKHQsIFN0b3JlLCBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKSwKKwkgICAgbGMgPSBjb21wcmVoZW5zaW9uKFR1cGxlKHQsIFN0b3JlLCBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sIE5VTEwsIGMtPmNfYXJlbmEpOwogICAgICAgICBpZiAoIWxjKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTE0LDEwICsxMTMxLDExIEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgICBpZiAoYXNkbF9zZXFfTEVOKHQpID09IDEpCi0gICAgICAgICAgICBnZSA9IGNvbXByZWhlbnNpb24oYXNkbF9zZXFfR0VUKHQsIDApLCBleHByZXNzaW9uLAorICAgICAgICAgICAgZ2UgPSBjb21wcmVoZW5zaW9uKChleHByX3R5KWFzZGxfc2VxX0dFVCh0LCAwKSwgZXhwcmVzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjLT5jX2FyZW5hKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2UgPSBjb21wcmVoZW5zaW9uKFR1cGxlKHQsIFN0b3JlLCBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKSwKKyAgICAgICAgICAgIGdlID0gY29tcHJlaGVuc2lvbihUdXBsZSh0LCBTdG9yZSwgTElORU5PKGNoKSwgY2gtPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBOVUxMLCBjLT5jX2FyZW5hKTsKIAogICAgICAgICBpZiAoIWdlKQpAQCAtMTMxNywxNiArMTMzNSwyMCBAQAogCiAgICAgY2ggPSBDSElMRChuLCBOQ0gobikgLSAxKTsKICAgICBpZiAoVFlQRShjaCkgPT0gc2xpY2VvcCkgewotCWlmIChOQ0goY2gpID09IDEpCi0gICAgICAgICAgICAvKiBYWFg6IElmIG9ubHkgMSBjaGlsZCwgdGhlbiBzaG91bGQganVzdCBiZSBhIGNvbG9uLiAgU2hvdWxkIHdlCi0gICAgICAgICAgICAgICBqdXN0IHNraXAgYXNzaWduaW5nIGFuZCBqdXN0IGdldCB0byB0aGUgcmV0dXJuPyAqLwotCSAgICBjaCA9IENISUxEKGNoLCAwKTsKLQllbHNlCi0JICAgIGNoID0gQ0hJTEQoY2gsIDEpOwotCWlmIChUWVBFKGNoKSA9PSB0ZXN0KSB7Ci0JICAgIHN0ZXAgPSBhc3RfZm9yX2V4cHIoYywgY2gpOworICAgICAgICBpZiAoTkNIKGNoKSA9PSAxKSB7CisgICAgICAgICAgICAvKiBObyBleHByZXNzaW9uLCBzbyBzdGVwIGlzIE5vbmUgKi8KKyAgICAgICAgICAgIGNoID0gQ0hJTEQoY2gsIDApOworICAgICAgICAgICAgc3RlcCA9IE5hbWUobmV3X2lkZW50aWZpZXIoIk5vbmUiLCBjLT5jX2FyZW5hKSwgTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExJTkVOTyhjaCksIGNoLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgICAgICAgICAgaWYgKCFzdGVwKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2ggPSBDSElMRChjaCwgMSk7CisgICAgICAgICAgICBpZiAoVFlQRShjaCkgPT0gdGVzdCkgeworICAgICAgICAgICAgICAgIHN0ZXAgPSBhc3RfZm9yX2V4cHIoYywgY2gpOworICAgICAgICAgICAgICAgIGlmICghc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzNDMsNyArMTM2NSw3IEBACiAKIAlpbnQgaSwgbm9wczsKIAlleHByX3R5IGV4cHIxLCBleHByMiwgcmVzdWx0OwotICAgICAgICBvcGVyYXRvcl90eSBvcGVyYXRvcjsKKyAgICAgICAgb3BlcmF0b3JfdHkgbmV3b3BlcmF0b3I7CiAKICAgICAgICAgZXhwcjEgPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgMCkpOwogICAgICAgICBpZiAoIWV4cHIxKQpAQCAtMTM1MywxMSArMTM3NSwxMiBAQAogICAgICAgICBpZiAoIWV4cHIyKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgb3BlcmF0b3IgPSBnZXRfb3BlcmF0b3IoQ0hJTEQobiwgMSkpOwotICAgICAgICBpZiAoIW9wZXJhdG9yKQorICAgICAgICBuZXdvcGVyYXRvciA9IGdldF9vcGVyYXRvcihDSElMRChuLCAxKSk7CisgICAgICAgIGlmICghbmV3b3BlcmF0b3IpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IEJpbk9wKGV4cHIxLCBvcGVyYXRvciwgZXhwcjIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKwlyZXN1bHQgPSBCaW5PcChleHByMSwgbmV3b3BlcmF0b3IsIGV4cHIyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CiAJaWYgKCFyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTM2NiwxNiArMTM4OSwxNyBAQAogCQlleHByX3R5IHRtcF9yZXN1bHQsIHRtcDsKIAkJY29uc3Qgbm9kZSogbmV4dF9vcGVyID0gQ0hJTEQobiwgaSAqIDIgKyAxKTsKIAotCQlvcGVyYXRvciA9IGdldF9vcGVyYXRvcihuZXh0X29wZXIpOwotICAgICAgICAgICAgICAgIGlmICghb3BlcmF0b3IpCisJCW5ld29wZXJhdG9yID0gZ2V0X29wZXJhdG9yKG5leHRfb3Blcik7CisgICAgICAgICAgICAgICAgaWYgKCFuZXdvcGVyYXRvcikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAgICAgICAgICAgICB0bXAgPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgaSAqIDIgKyAyKSk7CiAgICAgICAgICAgICAgICAgaWYgKCF0bXApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9IEJpbk9wKHJlc3VsdCwgb3BlcmF0b3IsIHRtcCwgCi0JCQkJICAgTElORU5PKG5leHRfb3BlciksIG5leHRfb3Blci0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gQmluT3AocmVzdWx0LCBuZXdvcGVyYXRvciwgdG1wLCAKKwkJCQkgICBMSU5FTk8obmV4dF9vcGVyKSwgbmV4dF9vcGVyLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogCQlpZiAoIXRtcCkgCiAJCQlyZXR1cm4gTlVMTDsKIAkJcmVzdWx0ID0gdG1wX3Jlc3VsdDsKQEAgLTEzOTMsNyArMTQxNyw4IEBACiAgICAgUkVRKG4sIHRyYWlsZXIpOwogICAgIGlmIChUWVBFKENISUxEKG4sIDApKSA9PSBMUEFSKSB7CiAgICAgICAgIGlmIChOQ0gobikgPT0gMikKLSAgICAgICAgICAgIHJldHVybiBDYWxsKGxlZnRfZXhwciwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgcmV0dXJuIENhbGwobGVmdF9leHByLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm4gYXN0X2Zvcl9jYWxsKGMsIENISUxEKG4sIDEpLCBsZWZ0X2V4cHIpOwogICAgIH0KQEAgLTE0MDksNyArMTQzNCw4IEBACiAgICAgICAgICAgICBzbGljZV90eSBzbGMgPSBhc3RfZm9yX3NsaWNlKGMsIENISUxEKG4sIDApKTsKICAgICAgICAgICAgIGlmICghc2xjKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdChsZWZ0X2V4cHIsIHNsYywgTG9hZCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdChsZWZ0X2V4cHIsIHNsYywgTG9hZCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogVGhlIGdyYW1tYXIgaXMgYW1iaWd1b3VzIGhlcmUuIFRoZSBhbWJpZ3VpdHkgaXMgcmVzb2x2ZWQgCkBAIC0xNTUwLDcgKzE1NzYsOCBAQAogICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChzZXEsIGkgLyAyLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghc3RyY21wKFNUUihDSElMRChuLCAxKSksICJhbmQiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbE9wKEFuZCwgc2VxLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xPcChBbmQsIHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKICAgICAgICAgICAgIGFzc2VydCghc3RyY21wKFNUUihDSElMRChuLCAxKSksICJvciIpKTsKICAgICAgICAgICAgIHJldHVybiBCb29sT3AoT3IsIHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgICAgICBjYXNlIG5vdF90ZXN0OgpAQCAtMTU2Myw3ICsxNTkwLDggQEAKICAgICAgICAgICAgICAgICBpZiAoIWV4cHJlc3Npb24pCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoTm90LCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoTm90LCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBjb21wYXJpc29uOgogICAgICAgICAgICAgaWYgKE5DSChuKSA9PSAxKSB7CkBAIC0xNTcyLDggKzE2MDAsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgZXhwcl90eSBleHByZXNzaW9uOwotICAgICAgICAgICAgICAgIGFzZGxfc2VxICpvcHMsICpjbXBzOwotICAgICAgICAgICAgICAgIG9wcyA9IGFzZGxfc2VxX25ldyhOQ0gobikgLyAyLCBjLT5jX2FyZW5hKTsKKyAgICAgICAgICAgICAgICBhc2RsX2ludF9zZXEgKm9wczsKKwkJYXNkbF9zZXEgKmNtcHM7CisgICAgICAgICAgICAgICAgb3BzID0gYXNkbF9pbnRfc2VxX25ldyhOQ0gobikgLyAyLCBjLT5jX2FyZW5hKTsKICAgICAgICAgICAgICAgICBpZiAoIW9wcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgY21wcyA9IGFzZGxfc2VxX25ldyhOQ0gobikgLyAyLCBjLT5jX2FyZW5hKTsKQEAgLTE1ODEsMTEgKzE2MTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBOQ0gobik7IGkgKz0gMikgewotICAgICAgICAgICAgICAgICAgICAvKiBYWFggY21wb3BfdHkgaXMganVzdCBhbiBlbnVtICovCi0gICAgICAgICAgICAgICAgICAgIGNtcG9wX3R5IG9wZXJhdG9yOworICAgICAgICAgICAgICAgICAgICBjbXBvcF90eSBuZXdvcGVyYXRvcjsKIAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGFzdF9mb3JfY29tcF9vcChDSElMRChuLCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3BlcmF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3b3BlcmF0b3IgPSBhc3RfZm9yX2NvbXBfb3AoQ0hJTEQobiwgaSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld29wZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAkJICAgIH0KIApAQCAtMTU5NCw3ICsxNjIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCQkgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChvcHMsIGkgLyAyLCAodm9pZCAqKShQeV91aW50cHRyX3Qpb3BlcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQob3BzLCBpIC8gMiwgbmV3b3BlcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoY21wcywgaSAvIDIsIGV4cHJlc3Npb24pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDApKTsKQEAgLTE2MDIsNyArMTYzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCQl9CiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBDb21wYXJlKGV4cHJlc3Npb24sIG9wcywgY21wcywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICAgICAgICAgIHJldHVybiBDb21wYXJlKGV4cHJlc3Npb24sIG9wcywgY21wcywgTElORU5PKG4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMTg1Myw3ICsxODgyLDcgQEAKICAgICB9CiAgICAgZWxzZSBpZiAoVFlQRShDSElMRChuLCAxKSkgPT0gYXVnYXNzaWduKSB7CiAgICAgICAgIGV4cHJfdHkgZXhwcjEsIGV4cHIyOwotICAgICAgICBvcGVyYXRvcl90eSBvcGVyYXRvcjsKKyAgICAgICAgb3BlcmF0b3JfdHkgbmV3b3BlcmF0b3I7CiAJbm9kZSAqY2ggPSBDSElMRChuLCAwKTsKIAogCWlmIChUWVBFKGNoKSA9PSB0ZXN0bGlzdCkKQEAgLTE4OTUsMTEgKzE5MjQsMTEgQEAKICAgICAgICAgaWYgKCFleHByMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIG9wZXJhdG9yID0gYXN0X2Zvcl9hdWdhc3NpZ24oQ0hJTEQobiwgMSkpOwotICAgICAgICBpZiAoIW9wZXJhdG9yKQorICAgICAgICBuZXdvcGVyYXRvciA9IGFzdF9mb3JfYXVnYXNzaWduKENISUxEKG4sIDEpKTsKKyAgICAgICAgaWYgKCFuZXdvcGVyYXRvcikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIEF1Z0Fzc2lnbihleHByMSwgb3BlcmF0b3IsIGV4cHIyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisJcmV0dXJuIEF1Z0Fzc2lnbihleHByMSwgbmV3b3BlcmF0b3IsIGV4cHIyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQogICAgIGVsc2UgewogCWludCBpOwpAQCAtMTk3Myw3ICsyMDAyLDcgQEAKIH0KIAogc3RhdGljIGFzZGxfc2VxICoKLWFzdF9mb3JfZXhwcmxpc3Qoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50IGNvbnRleHQpCithc3RfZm9yX2V4cHJsaXN0KHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGV4cHJfY29udGV4dF90eSBjb250ZXh0KQogewogICAgIGFzZGxfc2VxICpzZXE7CiAgICAgaW50IGk7CkBAIC0yNTEyLDggKzI1NDEsOCBAQAogCSAgICBpbnQgb2ZmID0gNSArIChuX2VsaWYgLSBpIC0gMSkgKiA0OwogICAgICAgICAgICAgZXhwcl90eSBleHByZXNzaW9uOwogICAgICAgICAgICAgYXNkbF9zZXEgKnN1aXRlX3NlcTsKLQkgICAgYXNkbF9zZXEgKm5ldyA9IGFzZGxfc2VxX25ldygxLCBjLT5jX2FyZW5hKTsKLQkgICAgaWYgKCFuZXcpCisJICAgIGFzZGxfc2VxICpuZXdvYmogPSBhc2RsX3NlcV9uZXcoMSwgYy0+Y19hcmVuYSk7CisJICAgIGlmICghbmV3b2JqKQogCQlyZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgb2ZmKSk7CiAgICAgICAgICAgICBpZiAoIWV4cHJlc3Npb24pCkBAIC0yNTIyLDEwICsyNTUxLDEwIEBACiAgICAgICAgICAgICBpZiAoIXN1aXRlX3NlcSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCSAgICBhc2RsX3NlcV9TRVQobmV3LCAwLAorCSAgICBhc2RsX3NlcV9TRVQobmV3b2JqLCAwLAogCQkJIElmKGV4cHJlc3Npb24sIHN1aXRlX3NlcSwgb3JlbHNlLCAKIAkJCSAgICBMSU5FTk8oQ0hJTEQobiwgb2ZmKSksIENISUxEKG4sIG9mZiktPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSkpOwotCSAgICBvcmVsc2UgPSBuZXc7CisJICAgIG9yZWxzZSA9IG5ld29iajsKIAl9CiAJcmV0dXJuIElmKGFzdF9mb3JfZXhwcihjLCBDSElMRChuLCAxKSksCiAJCSAgYXN0X2Zvcl9zdWl0ZShjLCBDSElMRChuLCAzKSksCkBAIC0yNTk3LDcgKzI2MjYsNyBAQAogICAgIGlmICghX3RhcmdldCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGFzZGxfc2VxX0xFTihfdGFyZ2V0KSA9PSAxKQotCXRhcmdldCA9IGFzZGxfc2VxX0dFVChfdGFyZ2V0LCAwKTsKKwl0YXJnZXQgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoX3RhcmdldCwgMCk7CiAgICAgZWxzZQogCXRhcmdldCA9IFR1cGxlKF90YXJnZXQsIFN0b3JlLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAKQEAgLTI2MDgsNyArMjYzNyw4IEBACiAgICAgaWYgKCFzdWl0ZV9zZXEpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcmV0dXJuIEZvcih0YXJnZXQsIGV4cHJlc3Npb24sIHN1aXRlX3NlcSwgc2VxLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgcmV0dXJuIEZvcih0YXJnZXQsIGV4cHJlc3Npb24sIHN1aXRlX3NlcSwgc2VxLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwogfQogCiBzdGF0aWMgZXhjZXB0aGFuZGxlcl90eQpAQCAtMjYyMyw3ICsyNjUzLDggQEAKICAgICAgICAgaWYgKCFzdWl0ZV9zZXEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBleGNlcHRoYW5kbGVyKE5VTEwsIE5VTEwsIHN1aXRlX3NlcSwgYy0+Y19hcmVuYSk7CisJcmV0dXJuIGV4Y2VwdGhhbmRsZXIoTlVMTCwgTlVMTCwgc3VpdGVfc2VxLCBMSU5FTk8oZXhjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KICAgICBlbHNlIGlmIChOQ0goZXhjKSA9PSAyKSB7CiAgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbjsKQEAgLTI2MzYsNyArMjY2Nyw4IEBACiAgICAgICAgIGlmICghc3VpdGVfc2VxKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZXhjZXB0aGFuZGxlcihleHByZXNzaW9uLCBOVUxMLCBzdWl0ZV9zZXEsIGMtPmNfYXJlbmEpOworCXJldHVybiBleGNlcHRoYW5kbGVyKGV4cHJlc3Npb24sIE5VTEwsIHN1aXRlX3NlcSwgTElORU5PKGV4YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAgICAgZWxzZSBpZiAoTkNIKGV4YykgPT0gNCkgewogICAgICAgICBhc2RsX3NlcSAqc3VpdGVfc2VxOwpAQCAtMjY1Myw3ICsyNjg1LDggQEAKICAgICAgICAgaWYgKCFzdWl0ZV9zZXEpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBleGNlcHRoYW5kbGVyKGV4cHJlc3Npb24sIGUsIHN1aXRlX3NlcSwgYy0+Y19hcmVuYSk7CisJcmV0dXJuIGV4Y2VwdGhhbmRsZXIoZXhwcmVzc2lvbiwgZSwgc3VpdGVfc2VxLCBMSU5FTk8oZXhjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KIAogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKQEAgLTI3MjIsNyArMjc1NSw4IEBACiAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoaGFuZGxlcnMsIGksIGUpOwogICAgICAgICB9CiAKLQlleGNlcHRfc3QgPSBUcnlFeGNlcHQoYm9keSwgaGFuZGxlcnMsIG9yZWxzZSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworCWV4Y2VwdF9zdCA9IFRyeUV4Y2VwdChib2R5LCBoYW5kbGVycywgb3JlbHNlLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgICAgICBpZiAoIWZpbmFsbHkpCiAJICAgIHJldHVybiBleGNlcHRfc3Q7CiAKQEAgLTI3OTcsMTYgKzI4MzEsMTYgQEAKICAgICAgICAgcyA9IGFzdF9mb3Jfc3VpdGUoYywgQ0hJTEQobiwgMykpOwogICAgICAgICBpZiAoIXMpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBOVUxMLCBzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworCXJldHVybiBDbGFzc0RlZihORVdfSURFTlRJRklFUihDSElMRChuLCAxKSksIE5VTEwsIHMsIExJTkVOTyhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQogICAgIC8qIGNoZWNrIGZvciBlbXB0eSBiYXNlIGxpc3QgKi8KICAgICBpZiAoVFlQRShDSElMRChuLDMpKSA9PSBSUEFSKSB7CiAJcyA9IGFzdF9mb3Jfc3VpdGUoYywgQ0hJTEQobiw1KSk7CiAJaWYgKCFzKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBOVUxMLCBzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworCXJldHVybiBDbGFzc0RlZihORVdfSURFTlRJRklFUihDSElMRChuLCAxKSksIE5VTEwsIHMsIExJTkVOTyhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQogCiAgICAgLyogZWxzZSBoYW5kbGUgdGhlIGJhc2UgY2xhc3MgbGlzdCAqLwpAQCAtMjgxNyw4ICsyODUxLDggQEAKICAgICBzID0gYXN0X2Zvcl9zdWl0ZShjLCBDSElMRChuLCA2KSk7CiAgICAgaWYgKCFzKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gQ2xhc3NEZWYoTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMSkpLCBiYXNlcywgcywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgIHJldHVybiBDbGFzc0RlZihORVdfSURFTlRJRklFUihDSElMRChuLCAxKSksIGJhc2VzLCBzLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiB9CiAKIHN0YXRpYyBzdG10X3R5CkBAIC0zMDkwLDcgKzMxMjQsOCBAQAogI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCiAJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIC0gd2UgbmV2ZXIgc2VlIGFueSBvdGhlcgogCQkJICAgZW5jb2RpbmcuICovCi0JCQlQeV9GYXRhbEVycm9yKCJjYW5ub3QgZGVhbCB3aXRoIGVuY29kaW5ncyBpbiB0aGlzIGJ1aWxkLiIpOworCQkJUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGRlYWwgd2l0aCBlbmNvZGluZ3MgaW4gdGhpcyBidWlsZC4iKTsKICNlbHNlCiAJCQlQeU9iamVjdCAqdiwgKnUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sIE5VTEwpOwogCQkJaWYgKHUgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKaW5kZXggMzQyYzJkYi4uOTE0ZTBkMSAxMDA2NDQKLS0tIGEvUHl0aG9uL2JsdGlubW9kdWxlLmMKKysrIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKQEAgLTMxLDIzICszMSwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICpmaWx0ZXJ0dXBsZSAoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1idWlsdGluX19faW1wb3J0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnVpbHRpbl9fX2ltcG9ydF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImdsb2JhbHMiLCAibG9jYWxzIiwgImZyb21saXN0IiwKKwkJCQkgImxldmVsIiwgMH07CiAJY2hhciAqbmFtZTsKIAlQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7CiAJUHlPYmplY3QgKmxvY2FscyA9IE5VTEw7CiAJUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKIAlpbnQgbGV2ZWwgPSAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPT09pOl9faW1wb3J0X18iLAotCQkJJm5hbWUsICZnbG9iYWxzLCAmbG9jYWxzLCAmZnJvbWxpc3QsICZsZXZlbCkpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInN8T09PaTpfX2ltcG9ydF9fIiwKKwkJCWt3bGlzdCwgJm5hbWUsICZnbG9iYWxzLCAmbG9jYWxzLCAmZnJvbWxpc3QsICZsZXZlbCkpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChuYW1lLCBnbG9iYWxzLCBsb2NhbHMsCiAJCQkJCSAgZnJvbWxpc3QsIGxldmVsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGltcG9ydF9kb2MsCi0iX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZyb21saXN0KSAtPiBtb2R1bGVcblwKKyJfX2ltcG9ydF9fKG5hbWUsIGdsb2JhbHM9e30sIGxvY2Fscz17fSwgZnJvbWxpc3Q9W10sIGxldmVsPS0xKSAtPiBtb2R1bGVcblwKIFxuXAogSW1wb3J0IGEgbW9kdWxlLiAgVGhlIGdsb2JhbHMgYXJlIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XG5cCiB0aGV5IGFyZSBub3QgbW9kaWZpZWQuICBUaGUgbG9jYWxzIGFyZSBjdXJyZW50bHkgdW51c2VkLiAgVGhlIGZyb21saXN0XG5cCkBAIC01NSw3ICs1NywxMCBAQAogZW1wdHkgbGlzdCB0byBlbXVsYXRlIGBgaW1wb3J0IG5hbWUnJy5cblwKIFdoZW4gaW1wb3J0aW5nIGEgbW9kdWxlIGZyb20gYSBwYWNrYWdlLCBub3RlIHRoYXQgX19pbXBvcnRfXygnQS5CJywgLi4uKVxuXAogcmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXG5cCi1mcm9tbGlzdCBpcyBub3QgZW1wdHkuIik7Citmcm9tbGlzdCBpcyBub3QgZW1wdHkuICBMZXZlbCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBlcmZvcm0gXG5cCithYnNvbHV0ZSBvciByZWxhdGl2ZSBpbXBvcnRzLiAgLTEgaXMgdGhlIG9yaWdpbmFsIHN0cmF0ZWd5IG9mIGF0dGVtcHRpbmdcblwKK2JvdGggYWJzb2x1dGUgYW5kIHJlbGF0aXZlIGltcG9ydHMsIDAgaXMgYWJzb2x1dGUsIGEgcG9zaXRpdmUgbnVtYmVyXG5cCitpcyB0aGUgbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcyB0byBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlLiIpOwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzA0LDMyICsxNzA5LDM0IEBACiAKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ1aWx0aW5fcm91bmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnVpbHRpbl9yb3VuZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWRvdWJsZSB4OworCWRvdWJsZSBudW1iZXI7CiAJZG91YmxlIGY7CiAJaW50IG5kaWdpdHMgPSAwOwogCWludCBpOworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibnVtYmVyIiwgIm5kaWdpdHMiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZHxpOnJvdW5kIiwgJngsICZuZGlnaXRzKSkKLQkJCXJldHVybiBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJkfGk6cm91bmQiLAorICAgICAgICAgICAgICAgIGt3bGlzdCwgJm51bWJlciwgJm5kaWdpdHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCWYgPSAxLjA7CiAJaSA9IGFicyhuZGlnaXRzKTsKIAl3aGlsZSAgKC0taSA+PSAwKQogCQlmID0gZioxMC4wOwogCWlmIChuZGlnaXRzIDwgMCkKLQkJeCAvPSBmOworCQludW1iZXIgLz0gZjsKIAllbHNlCi0JCXggKj0gZjsKLQlpZiAoeCA+PSAwLjApCi0JCXggPSBmbG9vcih4ICsgMC41KTsKKwkJbnVtYmVyICo9IGY7CisJaWYgKG51bWJlciA+PSAwLjApCisJCW51bWJlciA9IGZsb29yKG51bWJlciArIDAuNSk7CiAJZWxzZQotCQl4ID0gY2VpbCh4IC0gMC41KTsKKwkJbnVtYmVyID0gY2VpbChudW1iZXIgLSAwLjUpOwogCWlmIChuZGlnaXRzIDwgMCkKLQkJeCAqPSBmOworCQludW1iZXIgKj0gZjsKIAllbHNlCi0JCXggLz0gZjsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworCQludW1iZXIgLz0gZjsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG51bWJlcik7CiB9CiAKIFB5RG9jX1NUUlZBUihyb3VuZF9kb2MsCkBAIC0yMDQyLDcgKzIwNDksNyBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBidWlsdGluX21ldGhvZHNbXSA9IHsKLSAJeyJfX2ltcG9ydF9fIiwJYnVpbHRpbl9fX2ltcG9ydF9fLCBNRVRIX1ZBUkFSR1MsIGltcG9ydF9kb2N9LAorIAl7Il9faW1wb3J0X18iLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9fX2ltcG9ydF9fLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBpbXBvcnRfZG9jfSwKICAJeyJhYnMiLAkJYnVpbHRpbl9hYnMsICAgICAgICBNRVRIX08sIGFic19kb2N9LAogIAl7ImFsbCIsCQlidWlsdGluX2FsbCwgICAgICAgIE1FVEhfTywgYWxsX2RvY30sCiAgCXsiYW55IiwJCWJ1aWx0aW5fYW55LCAgICAgICAgTUVUSF9PLCBhbnlfZG9jfSwKQEAgLTIwNzksNyArMjA4Niw3IEBACiAgCXsicmVkdWNlIiwJYnVpbHRpbl9yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAogIAl7InJlbG9hZCIsCWJ1aWx0aW5fcmVsb2FkLCAgICAgTUVUSF9PLCByZWxvYWRfZG9jfSwKICAJeyJyZXByIiwJYnVpbHRpbl9yZXByLCAgICAgICBNRVRIX08sIHJlcHJfZG9jfSwKLSAJeyJyb3VuZCIsCWJ1aWx0aW5fcm91bmQsICAgICAgTUVUSF9WQVJBUkdTLCByb3VuZF9kb2N9LAorIAl7InJvdW5kIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fcm91bmQsICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgcm91bmRfZG9jfSwKICAJeyJzZXRhdHRyIiwJYnVpbHRpbl9zZXRhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIHNldGF0dHJfZG9jfSwKICAJeyJzb3J0ZWQiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9zb3J0ZWQsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBzb3J0ZWRfZG9jfSwKICAJeyJzdW0iLAkJYnVpbHRpbl9zdW0sICAgICAgICBNRVRIX1ZBUkFSR1MsIHN1bV9kb2N9LApkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA2Zjc2NzgxLi42YzhhZmJhIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtNTA3LDcgKzUwNyw3IEBACiB9CiAKIFB5T2JqZWN0ICoKLVB5RXZhbF9FdmFsRnJhbWVFeChQeUZyYW1lT2JqZWN0ICpmLCBpbnQgdGhyb3cpCitQeUV2YWxfRXZhbEZyYW1lRXgoUHlGcmFtZU9iamVjdCAqZiwgaW50IHRocm93ZmxhZykKIHsKICNpZmRlZiBEWFBBSVJTCiAJaW50IGxhc3RvcGNvZGUgPSAwOwpAQCAtNzU2LDcgKzc1Niw3IEBACiAJeCA9IFB5X05vbmU7CS8qIE5vdCBhIHJlZmVyZW5jZSwganVzdCBhbnl0aGluZyBub24tTlVMTCAqLwogCXcgPSBOVUxMOwogCi0JaWYgKHRocm93KSB7IC8qIHN1cHBvcnQgZm9yIGdlbmVyYXRvci50aHJvdygpICovCisJaWYgKHRocm93ZmxhZykgeyAvKiBzdXBwb3J0IGZvciBnZW5lcmF0b3IudGhyb3coKSAqLwogCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwogCQlnb3RvIG9uX2Vycm9yOwogCX0KQEAgLTIxNTMsNiArMjE1Myw5IEBACiAJCWNhc2UgU0VUVVBfTE9PUDoKIAkJY2FzZSBTRVRVUF9FWENFUFQ6CiAJCWNhc2UgU0VUVVBfRklOQUxMWToKKwkJCS8qIE5PVEU6IElmIHlvdSBhZGQgYW55IG5ldyBibG9jay1zZXR1cCBvcGNvZGVzIHRoYXQgYXJlIG5vdCB0cnkvZXhjZXB0L2ZpbmFsbHkKKwkJCSAgIGhhbmRsZXJzLCB5b3UgbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKSBmdW5jdGlvbi4gKi8KKwogCQkJUHlGcmFtZV9CbG9ja1NldHVwKGYsIG9wY29kZSwgSU5TVFJfT0ZGU0VUKCkgKyBvcGFyZywKIAkJCQkJICAgU1RBQ0tfTEVWRUwoKSk7CiAJCQljb250aW51ZTsKQEAgLTMxODAsMTMyICszMTgzLDI5IEBACiAJCSAgICAgIFB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgKmluc3RyX2xiLCBpbnQgKmluc3RyX3ViLAogCQkgICAgICBpbnQgKmluc3RyX3ByZXYpCiB7Ci0JLyogVGhlIHRoZW9yeSBvZiBTRVRfTElORU5PLWxlc3MgdHJhY2luZy4KLQotCSAgIEluIGEgbnV0c2hlbGwsIHdlIHVzZSB0aGUgY29fbG5vdGFiIGZpZWxkIG9mIHRoZSBjb2RlIG9iamVjdAotCSAgIHRvIHRlbGwgd2hlbiBleGVjdXRpb24gaGFzIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZS4KLQotCSAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhlIGJhc2ljIGlkZWEgaXMgc28gc2V0IHRoaW5ncyB1cCBzbwotCSAgIHRoYXQKLQotCSAgICAgICAgICppbnN0cl9sYiA8PSBmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl91YgotCi0JICAgaXMgdHJ1ZSBzbyBsb25nIGFzIGV4ZWN1dGlvbiBkb2VzIG5vdCBjaGFuZ2UgbGluZXMuCi0KLQkgICBUaGlzIGlzIGFsbCBmYWlybHkgc2ltcGxlLiAgRGlnZ2luZyB0aGUgaW5mb3JtYXRpb24gb3V0IG9mCi0JICAgY29fbG5vdGFiIHRha2VzIHNvbWUgd29yaywgYnV0IGlzIGNvbmNlcHR1YWxseSBjbGVhci4KLQotCSAgIFNvbWV3aGF0IGhhcmRlciB0byBleHBsYWluIGlzIHdoeSB3ZSBkb24ndCAqYWx3YXlzKiBjYWxsIHRoZQotCSAgIGxpbmUgdHJhY2UgZnVuY3Rpb24gd2hlbiB0aGUgYWJvdmUgdGVzdCBmYWlscy4KLQotCSAgIENvbnNpZGVyIHRoaXMgY29kZToKLQotCSAgIDE6IGRlZiBmKGEpOgotCSAgIDI6ICAgICBpZiBhOgotCSAgIDM6ICAgICAgICBwcmludCAxCi0JICAgNDogICAgIGVsc2U6Ci0JICAgNTogICAgICAgIHByaW50IDIKLQotCSAgIHdoaWNoIGNvbXBpbGVzIHRvIHRoaXM6Ci0KLQkgICAyICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQotCQkgICAgICAgMyBKVU1QX0lGX0ZBTFNFICAgICAgICAgICAgOSAodG8gMTUpCi0JCSAgICAgICA2IFBPUF9UT1AKLQotCSAgIDMgICAgICAgICAgIDcgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0JCSAgICAgIDEwIFBSSU5UX0lURU0KLQkJICAgICAgMTEgUFJJTlRfTkVXTElORQotCQkgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgNiAodG8gMjEpCi0JCSA+PiAgIDE1IFBPUF9UT1AKLQotCSAgIDUgICAgICAgICAgMTYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDIpCi0JCSAgICAgIDE5IFBSSU5UX0lURU0KLQkJICAgICAgMjAgUFJJTlRfTkVXTElORQotCQkgPj4gICAyMSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLQkJICAgICAgMjQgUkVUVVJOX1ZBTFVFCi0KLQkgICBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0Ci0JICAgMTUgYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8KLQkgICBsaW5lIDMuICBUaGlzIGlzIGF0IGJlc3QgbWlzbGVhZGluZy4gIEluIHRoaXMgY2FzZSB3ZSBjb3VsZAotCSAgIGFzc29jaWF0ZSB0aGUgUE9QX1RPUCB3aXRoIGxpbmUgNCwgYnV0IHRoYXQgZG9lc24ndCBtYWtlCi0JICAgc2Vuc2UgaW4gYWxsIGNhc2VzIChJIHRoaW5rKS4KLQotCSAgIFdoYXQgd2UgZG8gaXMgb25seSBjYWxsIHRoZSBsaW5lIHRyYWNlIGZ1bmN0aW9uIGlmIHRoZSBjb19sbm90YWIKLQkgICBpbmRpY2F0ZXMgd2UgaGF2ZSBqdW1wZWQgdG8gdGhlICpzdGFydCogb2YgYSBsaW5lLCBpLmUuIGlmIHRoZQotCSAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gb2Zmc2V0IG1hdGNoZXMgdGhlIG9mZnNldCBnaXZlbiBmb3IgdGhlCi0JICAgc3RhcnQgb2YgYSBsaW5lIGJ5IHRoZSBjb19sbm90YWIuCi0KLQkgICBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlICdhJyBpcyB0cnVlLgotCSAgIEV4ZWN1dGlvbiB3aWxsIGp1bXAgZnJvbSBpbnN0cnVjdGlvbiBvZmZzZXQgMTIgdG8gb2Zmc2V0IDIxLgotCSAgIFRoZW4gdGhlIGNvX2xub3RhYiB3b3VsZCBpbXBseSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZQotCSAgIDUsIHdoaWNoIGlzIGFnYWluIG1pc2xlYWRpbmcuCi0KLQkgICBXaHkgZG8gd2Ugc2V0IGZfbGluZW5vIHdoZW4gdHJhY2luZz8gIFdlbGwsIGNvbnNpZGVyIHRoZSBjb2RlCi0JICAgYWJvdmUgd2hlbiAnYScgaXMgdHJ1ZS4gIElmIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyB3aXRoICduJyBpbgotCSAgIHBkYiwgeW91IHdvdWxkIHN0b3AgYXQgbGluZSAxIHdpdGggYSAiY2FsbCIgdHlwZSBldmVudCwgdGhlbgotCSAgIGxpbmUgZXZlbnRzIG9uIGxpbmVzIDIgYW5kIDMsIHRoZW4gYSAicmV0dXJuIiB0eXBlIGV2ZW50IC0tIGJ1dAotCSAgIHlvdSB3b3VsZCBiZSBzaG93biBsaW5lIDUgZHVyaW5nIHRoaXMgZXZlbnQuICBUaGlzIGlzIGEgY2hhbmdlCi0JICAgZnJvbSB0aGUgYmVoYXZpb3VyIGluIDIuMiBhbmQgYmVmb3JlLCBhbmQgSSd2ZSBmb3VuZCBpdAotCSAgIGNvbmZ1c2luZyBpbiBwcmFjdGljZS4gIEJ5IHNldHRpbmcgYW5kIHVzaW5nIGZfbGluZW5vIHdoZW4KLQkgICB0cmFjaW5nLCBvbmUgY2FuIHJlcG9ydCBhIGxpbmUgbnVtYmVyIGRpZmZlcmVudCBmcm9tIHRoYXQKLQkgICBzdWdnZXN0ZWQgYnkgZl9sYXN0aSBvbiB0aGlzIG9uZSBvY2Nhc2lvbiB3aGVyZSBpdCdzIGRlc2lyYWJsZS4KLQkqLwotCiAJaW50IHJlc3VsdCA9IDA7CiAKKyAgICAgICAgLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgaW5zdHJ1Y3Rpb24gd2luZG93LCByZXNldCB0aGUgd2luZG93LiAgSWYgdGhlIGxhc3QKKyAgICAgICAgICAgaW5zdHJ1Y3Rpb24gaGFwcGVucyB0byBmYWxsIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb3IgaWYgaXQKKyAgICAgICAgICAgcmVwcmVzZW50cyBhIGp1bXAgYmFja3dhcmRzLCBjYWxsIHRoZSB0cmFjZSBmdW5jdGlvbi4KKyAgICAgICAgKi8KIAlpZiAoKGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpID49ICppbnN0cl91YikpIHsKLQkJUHlDb2RlT2JqZWN0KiBjbyA9IGZyYW1lLT5mX2NvZGU7Ci0JCWludCBzaXplLCBhZGRyLCBsaW5lOwotCQl1bnNpZ25lZCBjaGFyKiBwOworICAgICAgICAgICAgICAgIGludCBsaW5lOworICAgICAgICAgICAgICAgIFB5QWRkclBhaXIgYm91bmRzOwogCi0JCXNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjby0+Y29fbG5vdGFiKSAvIDI7Ci0JCXAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOwotCi0JCWFkZHIgPSAwOwotCQlsaW5lID0gY28tPmNvX2ZpcnN0bGluZW5vOwotCi0JCS8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgotCQkgICAobGlrZWx5IHRvIGJlIGEgY29tbW9uIGNhc2UpIHRoZW4gd2UgYWxyZWFkeSBrbm93Ci0JCSAgIGluc3RyX2xiIC0tIGlmIHdlIHN0b3JlZCB0aGUgbWF0Y2hpbmcgdmFsdWUgb2YgcAotCQkgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLwotCi0JCS8qIHNlZSBjb21tZW50cyBpbiBjb21waWxlLmMgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZgotCQkgICBjb19sbm90YWIuICBBIHBvaW50IHRvIHJlbWVtYmVyOiBpbmNyZW1lbnRzIHRvIHAKLQkJICAgc2hvdWxkIGNvbWUgaW4gcGFpcnMgLS0gYWx0aG91Z2ggd2UgZG9uJ3QgY2FyZSBhYm91dAotCQkgICB0aGUgbGluZSBpbmNyZW1lbnRzIGhlcmUsIHRyZWF0aW5nIHRoZW0gYXMgYnl0ZQotCQkgICBpbmNyZW1lbnRzIGdldHMgY29uZnVzaW5nLCB0byBzYXkgdGhlIGxlYXN0LiAqLwotCi0JCXdoaWxlIChzaXplID4gMCkgewotCQkJaWYgKGFkZHIgKyAqcCA+IGZyYW1lLT5mX2xhc3RpKQotCQkJCWJyZWFrOwotCQkJYWRkciArPSAqcCsrOwotCQkJaWYgKCpwKSAqaW5zdHJfbGIgPSBhZGRyOwotCQkJbGluZSArPSAqcCsrOwotCQkJLS1zaXplOwotCQl9Ci0KLQkJaWYgKGFkZHIgPT0gZnJhbWUtPmZfbGFzdGkpIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gUHlDb2RlX0NoZWNrTGluZU51bWJlcihmcmFtZS0+Zl9jb2RlLCBmcmFtZS0+Zl9sYXN0aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA+PSAwKSB7CiAJCQlmcmFtZS0+Zl9saW5lbm8gPSBsaW5lOwogCQkJcmVzdWx0ID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLAogCQkJCQkgICAgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKLQkJfQotCi0JCWlmIChzaXplID4gMCkgewotCQkJd2hpbGUgKC0tc2l6ZSA+PSAwKSB7Ci0JCQkJYWRkciArPSAqcCsrOwotCQkJCWlmICgqcCsrKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCSppbnN0cl91YiA9IGFkZHI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkqaW5zdHJfdWIgPSBJTlRfTUFYOwotCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnN0cl9sYiA9IGJvdW5kcy5hcF9sb3dlcjsKKyAgICAgICAgICAgICAgICAqaW5zdHJfdWIgPSBib3VuZHMuYXBfdXBwZXI7CiAJfQogCWVsc2UgaWYgKGZyYW1lLT5mX2xhc3RpIDw9ICppbnN0cl9wcmV2KSB7Ci0JCS8qIGp1bXBpbmcgYmFjayBpbiB0aGUgc2FtZSBsaW5lIGZvcmNlcyBhIHRyYWNlIGV2ZW50ICovCi0JCXJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwKLQkJCQkgICAgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKKwkJcmVzdWx0ID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLCBQeVRyYWNlX0xJTkUsIFB5X05vbmUpOwogCX0KIAkqaW5zdHJfcHJldiA9IGZyYW1lLT5mX2xhc3RpOwogCXJldHVybiByZXN1bHQ7CkBAIC0zNjIzLDkgKzM1MjMsOSBAQAogCQlQeV9ERUNSRUYoZnVuYyk7CiAJfQogCi0JLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgYW5kIHRoZSBhcmd1bWVudHMsCi0JICAgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgY29uc3VtZWQgYWxyZWFkeS4KLQkgICBYWFgodHdvdXRlcnMpIHdoZW4gYXJlIHRoZXkgbm90IGNvbnN1bWVkIGFscmVhZHk/CisJLyogQ2xlYXIgdGhlIHN0YWNrIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBBbHNvIHJlbW92ZXMKKyAgICAgICAgICAgdGhlIGFyZ3VtZW50cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCBjb25zdW1lZCBhbHJlYWR5CisgICAgICAgICAgIChmYXN0X2Z1bmN0aW9uKCkgYW5kIGVycl9hcmdzKCkgbGVhdmUgdGhlbSBvbiB0aGUgc3RhY2spLgogCSAqLwogCXdoaWxlICgoKnBwX3N0YWNrKSA+IHBmdW5jKSB7CiAJCXcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CkBAIC0zODk5LDcgKzM3OTksNyBAQAogCWlmICh2ICE9IE5VTEwpIHsKIAkJUHlfc3NpemVfdCB4OwogCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJCXggPSBQeUludF9Bc0xvbmcodik7CisJCQl4ID0gUHlJbnRfQXNTc2l6ZV90KHYpOwogCQl9IAogCQllbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKIAkJCSBQeVR5cGVfSGFzRmVhdHVyZSh2LT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpCkBAIC00MzAyLDggKzQyMDIsOCBAQAogCQkvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKIAkJICogaW4tcGxhY2UuCiAJCSAqLwotCQlpbnQgdl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJaW50IHdfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7CisJCVB5X3NzaXplX3Qgdl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKwkJUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOwogCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdl9sZW4gKyB3X2xlbikgIT0gMCkgewogCQkJLyogWFhYIGlmIF9QeVN0cmluZ19SZXNpemUoKSBmYWlscywgJ3YnIGhhcyBiZWVuCiAJCQkgKiBkZWFsbG9jYXRlZCBzbyBpdCBjYW5ub3QgYmUgcHV0IGJhY2sgaW50byAndmFyaWFibGUnLgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvZGVjcy5jIGIvUHl0aG9uL2NvZGVjcy5jCmluZGV4IDBlOGMzNzQuLjIxMjQ4MjQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb2RlY3MuYworKysgYi9QeXRob24vY29kZWNzLmMKQEAgLTU2LDEyICs1NiwxMiBAQAogICAgIGNoYXIgKnA7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgCi0JaWYgKGxlbiA+IElOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVgpIHsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbGFyZ2UiKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CiAJCi0gICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChpbnQpbGVuKTsKKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKICAgICBpZiAodiA9PSBOVUxMKQogCXJldHVybiBOVUxMOwogICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcodik7CkBAIC0yMDAsMjQgKzIwMCw2NSBAQAogICAgIHJldHVybiBhcmdzOwogfQogCi0vKiBCdWlsZCBhIGNvZGVjIGJ5IGNhbGxpbmcgZmFjdG9yeShzdHJlYW1bLGVycm9yc10pIG9yIGp1c3QKLSAgIGZhY3RvcnkoZXJyb3JzKSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhcmUKLSAgIG5vbi1OVUxMLiAqLworLyogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhIGNvZGVjIGl0ZW0gKi8KIAogc3RhdGljCi1QeU9iamVjdCAqYnVpbGRfc3RyZWFtX2NvZGVjKFB5T2JqZWN0ICpmYWN0b3J5LAotCQkJICAgICBQeU9iamVjdCAqc3RyZWFtLAotCQkJICAgICBjb25zdCBjaGFyICplcnJvcnMpCitQeU9iamVjdCAqY29kZWNfZ2V0aXRlbShjb25zdCBjaGFyICplbmNvZGluZywgaW50IGluZGV4KQogewotICAgIFB5T2JqZWN0ICphcmdzLCAqY29kZWM7CisgICAgUHlPYmplY3QgKmNvZGVjczsKKyAgICBQeU9iamVjdCAqdjsKIAotICAgIGFyZ3MgPSBhcmdzX3R1cGxlKHN0cmVhbSwgZXJyb3JzKTsKLSAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CisgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQogCXJldHVybiBOVUxMOwotICAgIAotICAgIGNvZGVjID0gUHlFdmFsX0NhbGxPYmplY3QoZmFjdG9yeSwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIHJldHVybiBjb2RlYzsKKyAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KTsKKyAgICBQeV9ERUNSRUYoY29kZWNzKTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW5jcmVtZW50YWwgY29kZWMuICovCisKK3N0YXRpYworUHlPYmplY3QgKmNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoY29uc3QgY2hhciAqZW5jb2RpbmcsCisJCQkJICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKwkJCQkgICAgY29uc3QgY2hhciAqYXR0cm5hbWUpCit7CisgICAgUHlPYmplY3QgKmNvZGVjcywgKnJldCwgKmluY2NvZGVjOworCisgICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKKyAgICBpZiAoY29kZWNzID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgaW5jY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvZGVjcywgYXR0cm5hbWUpOworICAgIFB5X0RFQ1JFRihjb2RlY3MpOworICAgIGlmIChpbmNjb2RlYyA9PSBOVUxMKQorCXJldHVybiBOVUxMOworICAgIGlmIChlcnJvcnMpCisJcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGluY2NvZGVjLCAicyIsIGVycm9ycyk7CisgICAgZWxzZQorCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgTlVMTCk7CisgICAgUHlfREVDUkVGKGluY2NvZGVjKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgc3RyZWFtIGNvZGVjLiAqLworCitzdGF0aWMKK1B5T2JqZWN0ICpjb2RlY19nZXRzdHJlYW1jb2RlYyhjb25zdCBjaGFyICplbmNvZGluZywKKwkJCSAgICAgICBQeU9iamVjdCAqc3RyZWFtLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKKwkJCSAgICAgICBjb25zdCBpbnQgaW5kZXgpCit7CisgICAgUHlPYmplY3QgKmNvZGVjcywgKnN0cmVhbWNvZGVjOworCisgICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKKyAgICBpZiAoY29kZWNzID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICBzdHJlYW1jb2RlYyA9IFB5RXZhbF9DYWxsRnVuY3Rpb24oCisJUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KSwgIk9zIiwgc3RyZWFtLCBlcnJvcnMpOworICAgIFB5X0RFQ1JFRihjb2RlY3MpOworICAgIHJldHVybiBzdHJlYW1jb2RlYzsKIH0KIAogLyogQ29udmVuaWVuY2UgQVBJcyB0byBxdWVyeSB0aGUgQ29kZWMgcmVnaXN0cnkuIApAQCAtMjI4LDEyMCArMjY5LDM4IEBACiAKIFB5T2JqZWN0ICpQeUNvZGVjX0VuY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjczsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7Ci0gICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsMCk7Ci0gICAgUHlfREVDUkVGKGNvZGVjcyk7Ci0gICAgUHlfSU5DUkVGKHYpOwotICAgIHJldHVybiB2OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0aXRlbShlbmNvZGluZywgMCk7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0RlY29kZXIoY29uc3QgY2hhciAqZW5jb2RpbmcpCiB7Ci0gICAgUHlPYmplY3QgKmNvZGVjczsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7Ci0gICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsMSk7Ci0gICAgUHlfREVDUkVGKGNvZGVjcyk7Ci0gICAgUHlfSU5DUkVGKHYpOwotICAgIHJldHVybiB2OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0aXRlbShlbmNvZGluZywgMSk7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywKIAkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqY29kZWNzLCAqcmV0LCAqZW5jb2RlcjsKLQotICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7Ci0gICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICBlbmNvZGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb2RlY3MsICJpbmNyZW1lbnRhbGVuY29kZXIiKTsKLSAgICBpZiAoZW5jb2RlciA9PSBOVUxMKSB7Ci0JUHlfREVDUkVGKGNvZGVjcyk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChlcnJvcnMpCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGVuY29kZXIsICJPIiwgZXJyb3JzKTsKLSAgICBlbHNlCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGVuY29kZXIsIE5VTEwpOwotICAgIFB5X0RFQ1JFRihlbmNvZGVyKTsKLSAgICBQeV9ERUNSRUYoY29kZWNzKTsKLSAgICByZXR1cm4gcmV0OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0aW5jcmVtZW50YWxjb2RlYyhlbmNvZGluZywgZXJyb3JzLCAiaW5jcmVtZW50YWxlbmNvZGVyIik7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywKIAkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqY29kZWNzLCAqcmV0LCAqZGVjb2RlcjsKLQotICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7Ci0gICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICBkZWNvZGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb2RlY3MsICJpbmNyZW1lbnRhbGRlY29kZXIiKTsKLSAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7Ci0JUHlfREVDUkVGKGNvZGVjcyk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChlcnJvcnMpCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGRlY29kZXIsICJPIiwgZXJyb3JzKTsKLSAgICBlbHNlCi0JcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGRlY29kZXIsIE5VTEwpOwotICAgIFB5X0RFQ1JFRihkZWNvZGVyKTsKLSAgICBQeV9ERUNSRUYoY29kZWNzKTsKLSAgICByZXR1cm4gcmV0OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0aW5jcmVtZW50YWxjb2RlYyhlbmNvZGluZywgZXJyb3JzLCAiaW5jcmVtZW50YWxkZWNvZGVyIik7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX1N0cmVhbVJlYWRlcihjb25zdCBjaGFyICplbmNvZGluZywKIAkJCSAgICAgICBQeU9iamVjdCAqc3RyZWFtLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqY29kZWNzLCAqcmV0OwotCi0gICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKLSAgICBpZiAoY29kZWNzID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotICAgIHJldCA9IGJ1aWxkX3N0cmVhbV9jb2RlYyhQeVR1cGxlX0dFVF9JVEVNKGNvZGVjcywyKSxzdHJlYW0sZXJyb3JzKTsKLSAgICBQeV9ERUNSRUYoY29kZWNzKTsKLSAgICByZXR1cm4gcmV0OwotCi0gb25FcnJvcjoKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY29kZWNfZ2V0c3RyZWFtY29kZWMoZW5jb2RpbmcsIHN0cmVhbSwgZXJyb3JzLCAyKTsKIH0KIAogUHlPYmplY3QgKlB5Q29kZWNfU3RyZWFtV3JpdGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLAogCQkJICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCiAJCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewotICAgIFB5T2JqZWN0ICpjb2RlY3MsICpyZXQ7Ci0KLSAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwotICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgcmV0ID0gYnVpbGRfc3RyZWFtX2NvZGVjKFB5VHVwbGVfR0VUX0lURU0oY29kZWNzLDMpLHN0cmVhbSxlcnJvcnMpOwotICAgIFB5X0RFQ1JFRihjb2RlY3MpOwotICAgIHJldHVybiByZXQ7Ci0KLSBvbkVycm9yOgotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBjb2RlY19nZXRzdHJlYW1jb2RlYyhlbmNvZGluZywgc3RyZWFtLCBlcnJvcnMsIDMpOwogfQogCiAvKiBFbmNvZGUgYW4gb2JqZWN0IChlLmcuIGFuIFVuaWNvZGUgb2JqZWN0KSB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IGI5MmZiNjIuLjEyYjE5MGEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtNTgsOCArNTgsOSBAQAogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgYmFzaWNibG9ja18gewotCS8qIG5leHQgYmxvY2sgaW4gdGhlIGxpc3Qgb2YgYmxvY2tzIGZvciBhIHVuaXQgKGRvbid0IGNvbmZ1c2Ugd2l0aAotCSAqIGJfbmV4dCkgKi8KKyAgICAvKiBFYWNoIGJhc2ljYmxvY2sgaW4gYSBjb21waWxhdGlvbiB1bml0IGlzIGxpbmtlZCB2aWEgYl9saXN0IGluIHRoZQorICAgICAgIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGUgYmxvY2sgYXJlIGFsbG9jYXRlZC4gIGJfbGlzdCBwb2ludHMgdG8gdGhlIG5leHQKKyAgICAgICBibG9jaywgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYl9uZXh0LCB3aGljaCBpcyBuZXh0IGJ5IGNvbnRyb2wgZmxvdy4gKi8KIAlzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbGlzdDsKIAkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgKi8KIAlpbnQgYl9pdXNlZDsKQEAgLTExNCw3ICsxMTUsOSBAQAogCVB5T2JqZWN0ICp1X3ByaXZhdGU7CS8qIGZvciBwcml2YXRlIG5hbWUgbWFuZ2xpbmcgKi8KIAogCWludCB1X2FyZ2NvdW50OwkgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jayAqLyAKLQliYXNpY2Jsb2NrICp1X2Jsb2NrczsgLyogcG9pbnRlciB0byBsaXN0IG9mIGJsb2NrcyAqLworICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrLiAgQnkgZm9sbG93aW5nIGJfbGlzdAorICAgICAgIG1lbWJlcnMsIHlvdSBjYW4gcmVhY2ggYWxsIGVhcmx5IGFsbG9jYXRlZCBibG9ja3MuICovCisJYmFzaWNibG9jayAqdV9ibG9ja3M7CiAJYmFzaWNibG9jayAqdV9jdXJibG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGJsb2NrICovCiAJaW50IHVfdG1wbmFtZTsJICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyBmb3IgbGlzdCBjb21wcyAqLwogCkBAIC0xOTQsMTkgKzE5NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICpfX2RvY19fOwogCiBQeU9iamVjdCAqCi1fUHlfTWFuZ2xlKFB5T2JqZWN0ICpwcml2YXRlLCBQeU9iamVjdCAqaWRlbnQpCitfUHlfTWFuZ2xlKFB5T2JqZWN0ICpwcml2YXRlb2JqLCBQeU9iamVjdCAqaWRlbnQpCiB7CiAJLyogTmFtZSBtYW5nbGluZzogX19wcml2YXRlIGJlY29tZXMgX2NsYXNzbmFtZV9fcHJpdmF0ZS4KIAkgICBUaGlzIGlzIGluZGVwZW5kZW50IGZyb20gaG93IHRoZSBuYW1lIGlzIHVzZWQuICovCiAJY29uc3QgY2hhciAqcCwgKm5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhpZGVudCk7CiAJY2hhciAqYnVmZmVyOwogCXNpemVfdCBubGVuLCBwbGVuOwotCWlmIChwcml2YXRlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gIT0gJ18nIHx8CisJaWYgKHByaXZhdGVvYmogPT0gTlVMTCB8fCBuYW1lID09IE5VTEwgfHwgbmFtZVswXSAhPSAnXycgfHwKICAgICAgICAgICAgIG5hbWVbMV0gIT0gJ18nKSB7CiAJCVB5X0lOQ1JFRihpZGVudCk7CiAJCXJldHVybiBpZGVudDsKIAl9Ci0JcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHByaXZhdGUpOworCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhwcml2YXRlb2JqKTsKIAlubGVuID0gc3RybGVuKG5hbWUpOwogCWlmIChuYW1lW25sZW4tMV0gPT0gJ18nICYmIG5hbWVbbmxlbi0yXSA9PSAnXycpIHsKIAkJUHlfSU5DUkVGKGlkZW50KTsKQEAgLTMxMSw3ICszMTQsNyBAQAogCWlmIChjLT5jX3N0KQogCQlQeVN5bXRhYmxlX0ZyZWUoYy0+Y19zdCk7CiAJaWYgKGMtPmNfZnV0dXJlKQotCQlQeU1lbV9GcmVlKGMtPmNfZnV0dXJlKTsKKwkJUHlPYmplY3RfRnJlZShjLT5jX2Z1dHVyZSk7CiAJUHlfREVDUkVGKGMtPmNfc3RhY2spOwogfQogCkBAIC0zMTksNyArMzIyLDkgQEAKIGxpc3QyZGljdChQeU9iamVjdCAqbGlzdCkKIHsKIAlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKnYsICprLCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKwlQeU9iamVjdCAqdiwgKms7CisJUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7CisJaWYgKCFkaWN0KSByZXR1cm4gTlVMTDsKIAogCW4gPSBQeUxpc3RfU2l6ZShsaXN0KTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CkBAIC02MDIsNyArNjA3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKgogbWFya2Jsb2Nrcyh1bnNpZ25lZCBjaGFyICpjb2RlLCBpbnQgbGVuKQogewotCXVuc2lnbmVkIGludCAqYmxvY2tzID0gUHlNZW1fTWFsbG9jKGxlbipzaXplb2YoaW50KSk7CisJdW5zaWduZWQgaW50ICpibG9ja3MgPSAodW5zaWduZWQgaW50ICopUHlNZW1fTWFsbG9jKGxlbipzaXplb2YoaW50KSk7CiAJaW50IGksaiwgb3Bjb2RlLCBibG9ja2NudCA9IDA7CiAKIAlpZiAoYmxvY2tzID09IE5VTEwpCkBAIC02ODMsMTAgKzY4OCwxMSBAQAogCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKIAkvKiBNYWtlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHRoZSBjb2RlIHN0cmluZyAqLwotCWNvZGVzdHIgPSBQeU1lbV9NYWxsb2MoY29kZWxlbik7CisJY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGNvZGVsZW4pOwogCWlmIChjb2Rlc3RyID09IE5VTEwpCiAJCWdvdG8gZXhpdFVuY2hhbmdlZDsKLQljb2Rlc3RyID0gbWVtY3B5KGNvZGVzdHIsIFB5U3RyaW5nX0FTX1NUUklORyhjb2RlKSwgY29kZWxlbik7CisJY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopbWVtY3B5KGNvZGVzdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjb2RlKSwgY29kZWxlbik7CiAKIAkvKiBWZXJpZnkgdGhhdCBSRVRVUk5fVkFMVUUgdGVybWluYXRlcyB0aGUgY29kZXN0cmluZy4JVGhpcyBhbGxvd3MKIAkgICB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbiBwYXR0ZXJucyB0byBsb29rIGFoZWFkIHNldmVyYWwKQEAgLTY5Nyw3ICs3MDMsNyBAQAogCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKIAkvKiBNYXBwaW5nIHRvIG5ldyBqdW1wIHRhcmdldHMgYWZ0ZXIgTk9QcyBhcmUgcmVtb3ZlZCAqLwotCWFkZHJtYXAgPSBQeU1lbV9NYWxsb2MoY29kZWxlbiAqIHNpemVvZihpbnQpKTsKKwlhZGRybWFwID0gKGludCAqKVB5TWVtX01hbGxvYyhjb2RlbGVuICogc2l6ZW9mKGludCkpOwogCWlmIChhZGRybWFwID09IE5VTEwpCiAJCWdvdG8gZXhpdFVuY2hhbmdlZDsKIApAQCAtMTA3Nyw3ICsxMDgzLDggQEAKIHsKIAlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKIAotCXUgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21waWxlcl91bml0KSk7CisJdSA9IChzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwogCWlmICghdSkgewogCQlQeUVycl9Ob01lbW9yeSgpOwogCQlyZXR1cm4gMDsKQEAgLTExODcsNyArMTE5NCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAltZW1zZXQoKHZvaWQgKiliLCAwLCBzaXplb2YoYmFzaWNibG9jaykpOwotCWFzc2VydCAoYi0+Yl9uZXh0ID09IE5VTEwpOworICAgIC8qIEV4dGVuZCB0aGUgc2luZ2x5IGxpbmtlZCBsaXN0IG9mIGJsb2NrcyB3aXRoIG5ldyBibG9jay4gKi8KIAliLT5iX2xpc3QgPSB1LT51X2Jsb2NrczsKIAl1LT51X2Jsb2NrcyA9IGI7CiAJcmV0dXJuIGI7CkBAIC0xMjMzLDggKzEyNDAsOCBAQAogewogCWFzc2VydChiICE9IE5VTEwpOwogCWlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKLQkJYi0+Yl9pbnN0ciA9IFB5T2JqZWN0X01hbGxvYyhzaXplb2Yoc3RydWN0IGluc3RyKSAqCi0JCQkJCSAgICAgREVGQVVMVF9CTE9DS19TSVpFKTsKKwkJYi0+Yl9pbnN0ciA9IChzdHJ1Y3QgaW5zdHIgKilQeU9iamVjdF9NYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7CiAJCWlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKIAkJCVB5RXJyX05vTWVtb3J5KCk7CiAJCQlyZXR1cm4gLTE7CkBAIC0xMjUyLDcgKzEyNTksOCBAQAogCQkJcmV0dXJuIC0xOwogCQl9CiAJCWItPmJfaWFsbG9jIDw8PSAxOwotCQliLT5iX2luc3RyID0gUHlPYmplY3RfUmVhbGxvYygodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOworCQliLT5iX2luc3RyID0gKHN0cnVjdCBpbnN0ciAqKVB5T2JqZWN0X1JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOwogCQlpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCQltZW1zZXQoKGNoYXIgKiliLT5iX2luc3RyICsgb2xkc2l6ZSwgMCwgbmV3c2l6ZSAtIG9sZHNpemUpOwpAQCAtMTI2MCw2ICsxMjY4LDEzIEBACiAJcmV0dXJuIGItPmJfaXVzZWQrKzsKIH0KIAorLyogU2V0IHRoZSBpX2xpbmVubyBtZW1iZXIgb2YgdGhlIGluc3RydWN0aW9uIGF0IG9mZnNlIG9mZiBpZiB0aGUKKyAgIGxpbmUgbnVtYmVyIGZvciB0aGUgY3VycmVudCBleHByZXNzaW9uL3N0YXRlbWVudCAoPykgaGFzIG5vdAorICAgYWxyZWFkeSBiZWVuIHNldC4gIElmIGl0IGhhcyBiZWVuIHNldCwgdGhlIGNhbGwgaGFzIG5vIGVmZmVjdC4KKworICAgRXZlcnkgdGltZSBhIG5ldyBub2RlIGlzIGIKKyAgICovCisKIHN0YXRpYyB2b2lkCiBjb21waWxlcl9zZXRfbGluZW5vKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9mZikKIHsKQEAgLTE2MDAsNyArMTYxNSw2IEBACiAJb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKIAlpZiAob2ZmIDwgMCkKIAkJcmV0dXJuIDA7Ci0JY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwogCWkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwogCWktPmlfb3Bjb2RlID0gb3Bjb2RlOwogCWktPmlfdGFyZ2V0ID0gYjsKQEAgLTE2MDksNiArMTYyMyw3IEBACiAJCWktPmlfamFicyA9IDE7CiAJZWxzZQogCQlpLT5pX2pyZWwgPSAxOworCWNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY5NSw3ICsxNzEwLDcgQEAKIAlpbnQgX2k7IFwKIAlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAogCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gYXNkbF9zZXFfR0VUKHNlcSwgX2kpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKIAkJaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIGVsdCkpIFwKIAkJCXJldHVybiAwOyBcCiAJfSBcCkBAIC0xNzA1LDcgKzE3MjAsNyBAQAogCWludCBfaTsgXAogCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCiAJZm9yIChfaSA9IDA7IF9pIDwgYXNkbF9zZXFfTEVOKHNlcSk7IF9pKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSBhc2RsX3NlcV9HRVQoc2VxLCBfaSk7IFwKKwkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAogCQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgeyBcCiAJCQljb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCiAJCQlyZXR1cm4gMDsgXApAQCAtMTczMSw3ICsxNzQ2LDcgQEAKIAogCWlmICghYXNkbF9zZXFfTEVOKHN0bXRzKSkKIAkJcmV0dXJuIDE7Ci0Jc3QgPSBhc2RsX3NlcV9HRVQoc3RtdHMsIDApOworCXN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHN0bXRzLCAwKTsKIAlpZiAoY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpKSB7CiAJCWkgPSAxOwogCQlWSVNJVChjLCBleHByLCBzdC0+di5FeHByLnZhbHVlKTsKQEAgLTE3MzksNyArMTc1NCw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAJZm9yICg7IGkgPCBhc2RsX3NlcV9MRU4oc3RtdHMpOyBpKyspCi0JICAgIFZJU0lUKGMsIHN0bXQsIGFzZGxfc2VxX0dFVChzdG10cywgaSkpOworCSAgICBWSVNJVChjLCBzdG10LCAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIGkpKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTc2NSw3ICsxNzgwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJbnRlcmFjdGl2ZV9raW5kOgogCQljLT5jX2ludGVyYWN0aXZlID0gMTsKLQkJVklTSVRfU0VRX0lOX1NDT1BFKGMsIHN0bXQsIG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KTsKKwkJVklTSVRfU0VRX0lOX1NDT1BFKGMsIHN0bXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KTsKIAkJYnJlYWs7CiAJY2FzZSBFeHByZXNzaW9uX2tpbmQ6CiAJCVZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpOwpAQCAtMTg4Miw3ICsxODk4LDcgQEAKIAkJcmV0dXJuIDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIGFzZGxfc2VxX0dFVChkZWNvcywgaSkpOworCQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZGVjb3MsIGkpKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC0xODk0LDcgKzE5MTAsNyBAQAogCWludCBuID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOwogCS8qIENvcnJlY3RseSBoYW5kbGUgbmVzdGVkIGFyZ3VtZW50IGxpc3RzICovCiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGFyZyA9IGFzZGxfc2VxX0dFVChhcmdzLT5hcmdzLCBpKTsKKwkJZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncy0+YXJncywgaSk7CiAJCWlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCkgewogCQkJUHlPYmplY3QgKmlkID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiLiVkIiwgaSk7CiAJCQlpZiAoaWQgPT0gTlVMTCkgewpAQCAtMTkzMSw3ICsxOTQ3LDcgQEAKIAkJCQkgIHMtPmxpbmVubykpCiAJCXJldHVybiAwOwogCi0Jc3QgPSBhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCAwKTsKKwlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIDApOwogCWRvY3N0cmluZyA9IGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KTsKIAlpZiAoZG9jc3RyaW5nKQogCSAgICBmaXJzdF9jb25zdCA9IHN0LT52LkV4cHIudmFsdWUtPnYuU3RyLnM7CkBAIC0xOTQ3LDcgKzE5NjMsNyBAQAogCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5GdW5jdGlvbkRlZi5ib2R5KTsKIAkvKiBpZiB0aGVyZSB3YXMgYSBkb2NzdHJpbmcsIHdlIG5lZWQgdG8gc2tpcCB0aGUgZmlyc3Qgc3RhdGVtZW50ICovCiAJZm9yIChpID0gZG9jc3RyaW5nOyBpIDwgbjsgaSsrKSB7Ci0JCXN0bXRfdHkgczIgPSBhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCBpKTsKKwkJc3RtdF90eSBzMiA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIGkpOwogCQlpZiAoaSA9PSAwICYmIHMyLT5raW5kID09IEV4cHJfa2luZCAmJgogCQkgICAgczItPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZCkKIAkJCWNvbnRpbnVlOwpAQCAtMjIyMSw3ICsyMjM3LDcgQEAKIAkJQURET1AoYywgUE9QX0JMT0NLKTsKIAl9CiAJY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBsb29wKTsKLQlpZiAob3JlbHNlICE9IE5VTEwpCisJaWYgKG9yZWxzZSAhPSBOVUxMKSAvKiB3aGF0IGlmIG9yZWxzZSBpcyBqdXN0IHBhc3M/ICovCiAJCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7CiAJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKIApAQCAtMjM3NSwxMCArMjM5MSwxMiBAQAogCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5UcnlFeGNlcHQuaGFuZGxlcnMpOwogCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGV4Y2VwdCk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleGNlcHRoYW5kbGVyX3R5IGhhbmRsZXIgPSBhc2RsX3NlcV9HRVQoCisJCWV4Y2VwdGhhbmRsZXJfdHkgaGFuZGxlciA9IChleGNlcHRoYW5kbGVyX3R5KWFzZGxfc2VxX0dFVCgKIAkJCQkJCXMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzLCBpKTsKIAkJaWYgKCFoYW5kbGVyLT50eXBlICYmIGkgPCBuLTEpCiAJCSAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdCIpOworICAgICAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICAgICAgYy0+dS0+dV9saW5lbm8gPSBoYW5kbGVyLT5saW5lbm87CiAJCWV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKIAkJaWYgKGV4Y2VwdCA9PSBOVUxMKQogCQkJcmV0dXJuIDA7CkBAIC0yNDUzLDcgKzI0NzEsNyBAQAogCWludCBpLCBuID0gYXNkbF9zZXFfTEVOKHMtPnYuSW1wb3J0Lm5hbWVzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJYWxpYXNfdHkgYWxpYXMgPSBhc2RsX3NlcV9HRVQocy0+di5JbXBvcnQubmFtZXMsIGkpOworCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnQubmFtZXMsIGkpOwogCQlpbnQgcjsKIAkJUHlPYmplY3QgKmxldmVsOwogCkBAIC0yNTA4LDcgKzI1MjYsNyBAQAogCiAJLyogYnVpbGQgdXAgdGhlIG5hbWVzICovCiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlhbGlhc190eSBhbGlhcyA9IGFzZGxfc2VxX0dFVChzLT52LkltcG9ydEZyb20ubmFtZXMsIGkpOworCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKIAkJUHlfSU5DUkVGKGFsaWFzLT5uYW1lKTsKIAkJUHlUdXBsZV9TRVRfSVRFTShuYW1lcywgaSwgYWxpYXMtPm5hbWUpOwogCX0KQEAgLTI1MzEsNyArMjU0OSw3IEBACiAJUHlfREVDUkVGKG5hbWVzKTsKIAlBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBzLT52LkltcG9ydEZyb20ubW9kdWxlLCBuYW1lcyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlhbGlhc190eSBhbGlhcyA9IGFzZGxfc2VxX0dFVChzLT52LkltcG9ydEZyb20ubmFtZXMsIGkpOworCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKIAkJaWRlbnRpZmllciBzdG9yZV9uYW1lOwogCiAJCWlmIChpID09IDAgJiYgKlB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSkgPT0gJyonKSB7CkBAIC0yNTkyLDggKzI2MTAsMTAgQEAKIHsKIAlpbnQgaSwgbjsKIAorICAgIC8qIEFsd2F5cyBhc3NpZ24gYSBsaW5lbm8gdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gZm9yIGEgc3RtdC4gKi8KIAljLT51LT51X2xpbmVubyA9IHMtPmxpbmVubzsKIAljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKwogCXN3aXRjaCAocy0+a2luZCkgewogCWNhc2UgRnVuY3Rpb25EZWZfa2luZDoKIAkJcmV0dXJuIGNvbXBpbGVyX2Z1bmN0aW9uKGMsIHMpOwpAQCAtMjk2MiwxMSArMjk4MiwxMSBAQAogCXMgPSBlLT52LkJvb2xPcC52YWx1ZXM7CiAJbiA9IGFzZGxfc2VxX0xFTihzKSAtIDE7CiAJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQocywgaSkpOworCQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSkpOwogCQlBRERPUF9KUkVMKGMsIGp1bXBpLCBlbmQpOwogCQlBRERPUChjLCBQT1BfVE9QKQogCX0KLQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQocywgbikpOworCVZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChzLCBuKSk7CiAJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTMwMTMsMjQgKzMwMzMsMjUgQEAKIAkJY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKIAkJaWYgKGNsZWFudXAgPT0gTlVMTCkKIAkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCAwKSk7CisJCVZJU0lUKGMsIGV4cHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgMCkpOwogCX0KIAlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAJCUFERE9QKGMsIERVUF9UT1ApOwogCQlBRERPUChjLCBST1RfVEhSRUUpOwotCQkvKiBYWFggV2UncmUgY2FzdGluZyBhIHZvaWQqIHRvIGNtcG9wX3R5IGluIHRoZSBuZXh0IHN0bXQuICovCiAJCUFERE9QX0koYywgQ09NUEFSRV9PUCwKLQkJCWNtcG9wKChjbXBvcF90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLm9wcywgaSAtIDEpKSk7CisJCQljbXBvcCgoY21wb3BfdHkpKGFzZGxfc2VxX0dFVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5Db21wYXJlLm9wcywgaSAtIDEpKSkpOwogCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGNsZWFudXApOwogCQlORVhUX0JMT0NLKGMpOwogCQlBRERPUChjLCBQT1BfVE9QKTsKIAkJaWYgKGkgPCAobiAtIDEpKQotCQkgICAgVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgaSkpOworCQkgICAgVklTSVQoYywgZXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgaSkpOwogCX0KLQlWSVNJVChjLCBleHByLCBhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCBuIC0gMSkpOworCVZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIG4gLSAxKSk7CiAJQURET1BfSShjLCBDT01QQVJFX09QLAotCQkvKiBYWFggV2UncmUgY2FzdGluZyBhIHZvaWQqIHRvIGNtcG9wX3R5IGluIHRoZSBuZXh0IHN0bXQuICovCi0JICAgICAgIGNtcG9wKChjbXBvcF90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLm9wcywgbiAtIDEpKSk7CisJICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpKTsKIAlpZiAobiA+IDEpIHsKIAkJYmFzaWNibG9jayAqZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwogCQlpZiAoZW5kID09IE5VTEwpCkBAIC0zMDQzLDYgKzMwNjQsNyBAQAogCX0KIAlyZXR1cm4gMTsKIH0KKyN1bmRlZiBDTVBDQVNUCiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NhbGwoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCkBAIC0zMTAyLDcgKzMxMjQsNyBAQAogCQlhbmNob3IgPT0gTlVMTCkKIAkgICAgcmV0dXJuIDA7CiAKLQlsID0gYXNkbF9zZXFfR0VUKGdlbmVyYXRvcnMsIGdlbl9pbmRleCk7CisJbCA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOwogCVZJU0lUKGMsIGV4cHIsIGwtPml0ZXIpOwogCUFERE9QKGMsIEdFVF9JVEVSKTsKIAljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7CkBAIC0zMTEzLDcgKzMxMzUsNyBAQAogCS8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KIAluID0gYXNkbF9zZXFfTEVOKGwtPmlmcyk7CiAJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGUgPSBhc2RsX3NlcV9HRVQobC0+aWZzLCBpKTsKKwkJZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGwtPmlmcywgaSk7CiAJCVZJU0lUKGMsIGV4cHIsIGUpOwogCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOwogCQlORVhUX0JMT0NLKGMpOwpAQCAtMzE5OCw3ICszMjIwLDcgQEAKIAkgICAgYW5jaG9yID09IE5VTEwgfHwgZW5kID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JZ2UgPSBhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKKwlnZSA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOwogCUFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKIAlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KSkKIAkJcmV0dXJuIDA7CkBAIC0zMjIxLDcgKzMyNDMsNyBAQAogCS8qIFhYWCB0aGlzIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuLi5hIGxvdCEgKi8KIAluID0gYXNkbF9zZXFfTEVOKGdlLT5pZnMpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZXhwcl90eSBlID0gYXNkbF9zZXFfR0VUKGdlLT5pZnMsIGkpOworCQlleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZ2UtPmlmcywgaSk7CiAJCVZJU0lUKGMsIGV4cHIsIGUpOwogCQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOwogCQlORVhUX0JMT0NLKGMpOwpAQCAtMzQ2Miw2ICszNDg0LDkgQEAKIHsKIAlpbnQgaSwgbjsKIAorICAgIC8qIElmIGV4cHIgZSBoYXMgYSBkaWZmZXJlbnQgbGluZSBudW1iZXIgdGhhbiB0aGUgbGFzdCBleHByL3N0bXQsCisgICAgICAgc2V0IGEgbmV3IGxpbmUgbnVtYmVyIGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICAgICAqLwogCWlmIChlLT5saW5lbm8gPiBjLT51LT51X2xpbmVubykgewogCQljLT51LT51X2xpbmVubyA9IGUtPmxpbmVubzsKIAkJYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CkBAIC0zNDkwLDkgKzM1MTUsMTEgQEAKIAkJICAgSXQgd2FudHMgdGhlIHN0YWNrIHRvIGxvb2sgbGlrZSAodmFsdWUpIChkaWN0KSAoa2V5KSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJCVZJU0lUKGMsIGV4cHIsIGFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CisJCQlWSVNJVChjLCBleHByLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKIAkJCUFERE9QKGMsIFJPVF9UV08pOwotCQkJVklTSVQoYywgZXhwciwgYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisJCQlWSVNJVChjLCBleHByLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CiAJCQlBRERPUChjLCBTVE9SRV9TVUJTQ1IpOwogCQl9CiAJCWJyZWFrOwpAQCAtMzg1OSw3ICszODg2LDggQEAKIAkJaWYgKGN0eCAhPSBBdWdTdG9yZSkgewogCQkJaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5FeHRTbGljZS5kaW1zKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlzbGljZV90eSBzdWIgPSBhc2RsX3NlcV9HRVQocy0+di5FeHRTbGljZS5kaW1zLCBpKTsKKwkJCQlzbGljZV90eSBzdWIgPSAoc2xpY2VfdHkpYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnYuRXh0U2xpY2UuZGltcywgaSk7CiAJCQkJaWYgKCFjb21waWxlcl92aXNpdF9uZXN0ZWRfc2xpY2UoYywgc3ViLCBjdHgpKQogCQkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTQwNDgsNyArNDA3Niw3IEBACiB7CiAJaW50IGRfYnl0ZWNvZGUsIGRfbGluZW5vOwogCWludCBsZW47Ci0JY2hhciAqbG5vdGFiOworCXVuc2lnbmVkIGNoYXIgKmxub3RhYjsKIAogCWRfYnl0ZWNvZGUgPSBhLT5hX29mZnNldCAtIGEtPmFfbGluZW5vX29mZjsKIAlkX2xpbmVubyA9IGktPmlfbGluZW5vIC0gYS0+YV9saW5lbm87CkBAIC00MDcxLDcgKzQwOTksOCBAQAogCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4pIDwgMCkKIAkJCQlyZXR1cm4gMDsKIAkJfQotCQlsbm90YWIgPSBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOworCQlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQorCQkJICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKIAkJZm9yIChqID0gMDsgaiA8IG5jb2RlczsgaisrKSB7CiAJCQkqbG5vdGFiKysgPSAyNTU7CiAJCQkqbG5vdGFiKysgPSAwOwpAQCAtNDA5Miw3ICs0MTIxLDggQEAKIAkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCiAJCQkJcmV0dXJuIDA7CiAJCX0KLQkJbG5vdGFiID0gUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKKwkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJCSAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7CiAJCSpsbm90YWIrKyA9IDI1NTsKIAkJKmxub3RhYisrID0gZF9ieXRlY29kZTsKIAkJZF9ieXRlY29kZSA9IDA7CkBAIC00MTA5LDcgKzQxMzksOCBAQAogCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9sbm90YWIsIGxlbiAqIDIpIDwgMCkKIAkJCXJldHVybiAwOwogCX0KLQlsbm90YWIgPSBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOworCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCisJCQlQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwogCiAJYS0+YV9sbm90YWJfb2ZmICs9IDI7CiAJaWYgKGRfYnl0ZWNvZGUpIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggNmU4ZjgyMi4uMzY3NDZlMiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTExLDEwICsxMSwxNiBAQAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKICNpZmRlZiBfREVCVUcKIAl7Il9kLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKKwkvKiBUZW1wb3JhcmlseSBkaXNhYmxlIC5kbGwsIHRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIHNxbGl0ZTMuZGxsCisJICAgYW5kIHRoZSBzcWxpdGUzIHBhY2thZ2UuIElmIHRoaXMgbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQgZm9yIDIuNSwKKwkgICBzb21lIG90aGVyIHNvbHV0aW9uIGZvciB0aGUgbmFtaW5nIGNvbmZsaWN0IG11c3QgYmUgZm91bmQuCiAJeyJfZC5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisJKi8KICNlbHNlCiAJeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorCS8qIExpa2V3aXNlCiAJeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorCSovCiAjZW5kaWYKIAl7MCwgMH0KIH07CmRpZmYgLS1naXQgYS9QeXRob24vZXJyb3JzLmMgYi9QeXRob24vZXJyb3JzLmMKaW5kZXggNjdmODZlZC4uMmFlMDYyZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2Vycm9ycy5jCisrKyBiL1B5dGhvbi9lcnJvcnMuYwpAQCAtMTYsNiArMTYsMTEgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCiB2b2lkCiBQeUVycl9SZXN0b3JlKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0cmFjZWJhY2spCiB7CkBAIC02MDksNiArNjE0LDcgQEAKIAkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjogIiwgZik7CiAJCQkJUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIDApOwogCQkJfQorCQkJUHlfWERFQ1JFRihtb2R1bGVOYW1lKTsKIAkJfQogCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiBpbiAiLCBmKTsKIAkJUHlGaWxlX1dyaXRlT2JqZWN0KG9iaiwgZiwgMCk7CkBAIC03OTYsMyArODAyLDggQEAKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9leGNlcHRpb25zLmMgYi9QeXRob24vZXhjZXB0aW9ucy5jCmluZGV4IGIxNDZjOTcuLjVjODI0ZTYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9leGNlcHRpb25zLmMKKysrIGIvUHl0aG9uL2V4Y2VwdGlvbnMuYwpAQCAtMTQsNiArMTQsNyBAQAogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgIm9zZGVmcy5oIgogCkBAIC04OTMsNyArODk0LDcgQEAKIAkgICAgaWYgKGhhdmVfZmlsZW5hbWUpCiAJCWJ1ZnNpemUgKz0gUHlTdHJpbmdfR0VUX1NJWkUoZmlsZW5hbWUpOwogCi0JICAgIGJ1ZmZlciA9IFB5TWVtX01BTExPQyhidWZzaXplKTsKKwkgICAgYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoYnVmc2l6ZSk7CiAJICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogCQlpZiAoaGF2ZV9maWxlbmFtZSAmJiBoYXZlX2xpbmVubykKIAkJICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZzaXplLCAiJXMgKCVzLCBsaW5lICVsZCkiLApAQCAtMTQ1MCw4ICsxNDUxLDggQEAKIAlhc3NlcnQobGVuZ3RoIDwgSU5UX01BWCk7CiAJYXNzZXJ0KHN0YXJ0IDwgSU5UX01BWCk7CiAJYXNzZXJ0KGVuZCA8IElOVF9NQVgpOwotICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfVW5pY29kZURlY29kZUVycm9yLCAic3MjaWlzIiwKLQllbmNvZGluZywgb2JqZWN0LCAoaW50KWxlbmd0aCwgKGludClzdGFydCwgKGludCllbmQsIHJlYXNvbik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IsICJzcyNubnMiLAorCWVuY29kaW5nLCBvYmplY3QsIGxlbmd0aCwgc3RhcnQsIGVuZCwgcmVhc29uKTsKIH0KIAogCkBAIC0xNTY1LDcgKzE1NjYsNyBAQAogCWNvbnN0IFB5X1VOSUNPREUgKm9iamVjdCwgUHlfc3NpemVfdCBsZW5ndGgsCiAJUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKLSAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciwgInUjaWlzIiwKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciwgInUjbm5zIiwKIAlvYmplY3QsIGxlbmd0aCwgc3RhcnQsIGVuZCwgcmVhc29uKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Z1dHVyZS5jIGIvUHl0aG9uL2Z1dHVyZS5jCmluZGV4IDE5MDJmMWQuLmQyM2ZhZDYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mdXR1cmUuYworKysgYi9QeXRob24vZnV0dXJlLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogCW5hbWVzID0gcy0+di5JbXBvcnRGcm9tLm5hbWVzOwogCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obmFtZXMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhbGlhc190eSBuYW1lID0gYXNkbF9zZXFfR0VUKG5hbWVzLCBpKTsKKyAgICAgICAgICAgICAgICBhbGlhc190eSBuYW1lID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChuYW1lcywgaSk7CiAJCWNvbnN0IGNoYXIgKmZlYXR1cmUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lLT5uYW1lKTsKIAkJaWYgKCFmZWF0dXJlKQogCQkJcmV0dXJuIDA7CkBAIC0yOSw3ICsyOSw3IEBACiAJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0RJVklTSU9OKSA9PSAwKSB7CiAJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0FCU0lNUE9SVCkgPT0gMCkgeworCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSA9PSAwKSB7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSA9PSAwKSB7CiAJCQljb250aW51ZTsKQEAgLTczLDcgKzczLDcgQEAKIAkgICAKIAogCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obW9kLT52Lk1vZHVsZS5ib2R5KTsgaSsrKSB7Ci0JCXN0bXRfdHkgcyA9IGFzZGxfc2VxX0dFVChtb2QtPnYuTW9kdWxlLmJvZHksIGkpOworCQlzdG10X3R5IHMgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKIAogCQlpZiAoZG9uZSAmJiBzLT5saW5lbm8gPiBwcmV2X2xpbmUpCiAJCQlyZXR1cm4gMTsKQEAgLTEyMCwxNCArMTIwLDE0IEBACiB7CiAJUHlGdXR1cmVGZWF0dXJlcyAqZmY7CiAKLQlmZiA9IChQeUZ1dHVyZUZlYXR1cmVzICopUHlNZW1fTWFsbG9jKHNpemVvZihQeUZ1dHVyZUZlYXR1cmVzKSk7CisJZmYgPSAoUHlGdXR1cmVGZWF0dXJlcyAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoUHlGdXR1cmVGZWF0dXJlcykpOwogCWlmIChmZiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlmZi0+ZmZfZmVhdHVyZXMgPSAwOwogCWZmLT5mZl9saW5lbm8gPSAtMTsKIAogCWlmICghZnV0dXJlX3BhcnNlKGZmLCBtb2QsIGZpbGVuYW1lKSkgewotCQlQeU1lbV9GcmVlKCh2b2lkICopZmYpOworCQlQeU9iamVjdF9GcmVlKGZmKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBmZjsKZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRhcmdzLmMgYi9QeXRob24vZ2V0YXJncy5jCmluZGV4IGZhYzBiNmYuLmIwNzE1YmEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRhcmdzLmMKKysrIGIvUHl0aG9uL2dldGFyZ3MuYwpAQCAtNiw2ICs2LDkgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IAorI2VuZGlmCiBpbnQgUHlBcmdfUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IFB5QXJnX1BhcnNlVHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IFB5QXJnX1ZhUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKQEAgLTE1LDYgKzE4LDE4IEBACiBpbnQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKIAkJCQljb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QpOwogCisjaWZkZWYgSEFWRV9ERUNMU1BFQ19ETEwKKy8qIEV4cG9ydCBmdW5jdGlvbnMgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKKyNlbmRpZgorCiAjZGVmaW5lIEZMQUdfQ09NUEFUIDEKICNkZWZpbmUgRkxBR19TSVpFX1QgMgogCkBAIC02MzEsOCArNjQ2LDggQEAKIAkJdW5zaWduZWQgaW50IGl2YWw7CiAJCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQogCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8ST4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKLQkJaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJaXZhbCA9ICh1bnNpZ25lZCBpbnQpUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisJCWlmIChpdmFsID09ICh1bnNpZ25lZCBpbnQpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKIAkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCQllbHNlCiAJCQkqcCA9IGl2YWw7CkBAIC02NDUsMTAgKzY2MCwxMCBAQAogCQlQeV9zc2l6ZV90ICpwID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90ICopOwogCQlQeV9zc2l6ZV90IGl2YWw7CiAJCWlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisJCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAkJaXZhbCA9IFB5SW50X0FzU3NpemVfdChhcmcpOwogCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisJCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAkJKnAgPSBpdmFsOwogCQlicmVhazsKIAl9CkBAIC0xMDQwLDExICsxMDU1LDggQEAKIAkJCQlTVE9SRV9TSVpFKFB5VW5pY29kZV9HRVRfU0laRShhcmcpKTsKIAkJCX0KIAkJCWVsc2UgewotCQkJY2hhciAqYnVmOwotCQkJUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKLQkJCWlmIChjb3VudCA8IDApCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlTVE9SRV9TSVpFKGNvdW50LyhzaXplb2YoUHlfVU5JQ09ERSkpKTsgCisJCQkJcmV0dXJuIGNvbnZlcnRlcnIoImNhbm5vdCBjb252ZXJ0IHJhdyBidWZmZXJzIiwKKwkJCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCQkJfQogCQkJZm9ybWF0Kys7CiAJCX0gZWxzZSB7CkBAIC0xNzQzLDMgKzE3NTUsNiBAQAogCQkJZnVuY25hbWUpOwogCXJldHVybiAwOwogfQorI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0bXRpbWUuYyBiL1B5dGhvbi9nZXRtdGltZS5jCmluZGV4IGYwYWM4OTkuLjU0ZWRiNTMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRtdGltZS5jCisrKyBiL1B5dGhvbi9nZXRtdGltZS5jCkBAIC02LDYgKzYsMTAgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJweWNvbmZpZy5oIgogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKIHRpbWVfdAogUHlPU19HZXRMYXN0TW9kaWZpY2F0aW9uVGltZShjaGFyICpwYXRoLCBGSUxFICpmcCkKIHsKQEAgLTE1LDMgKzE5LDggQEAKIAllbHNlCiAJCXJldHVybiBzdC5zdF9tdGltZTsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldG9wdC5jIGIvUHl0aG9uL2dldG9wdC5jCmluZGV4IGQ4MGY2MDcuLjU0MjlmYWM1IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0b3B0LmMKKysrIGIvUHl0aG9uL2dldG9wdC5jCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogaW50IF9QeU9TX29wdGVyciA9IDE7ICAgICAgICAgIC8qIGdlbmVyYXRlIGVycm9yIG1lc3NhZ2VzICovCiBpbnQgX1B5T1Nfb3B0aW5kID0gMTsgICAgICAgICAgLyogaW5kZXggaW50byBhcmd2IGFycmF5ICAgKi8KIGNoYXIgKl9QeU9TX29wdGFyZyA9IE5VTEw7ICAgICAvKiBvcHRpb25hbCBhcmd1bWVudCAgICAgICAqLwpAQCAtODEsMyArODUsOCBAQAogCiAJcmV0dXJuIG9wdGlvbjsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dyYW1pbml0LmMgYi9QeXRob24vZ3JhbWluaXQuYwppbmRleCA0MGYxNzcwLi5hNmFjMTI0IDEwMDY0NAotLS0gYS9QeXRob24vZ3JhbWluaXQuYworKysgYi9QeXRob24vZ3JhbWluaXQuYwpAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIAl7OTEsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc183N18xWzFdID0gewotCXsyNiwgMn0sCisJezEwNSwgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzc3XzJbMl0gPSB7CiAJezE2MiwgM30sCkBAIC0xNzMyLDcgKzE3MzIsNyBAQAogCXs5MSwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzgwXzFbMV0gPSB7Ci0JezI2LCAyfSwKKwl7MTA1LCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfODBfMlsyXSA9IHsKIAl7MTY0LCAzfSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBiNjQ1OTRkLi5kYWFlMTVmIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0xNyw2ICsxNyw5IEBACiAjaWZkZWYgSEFWRV9GQ05UTF9ICiAjaW5jbHVkZSA8ZmNudGwuaD4KICNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgCisjZW5kaWYKIAogZXh0ZXJuIHRpbWVfdCBQeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lKGNoYXIgKiwgRklMRSAqKTsKIAkJCQkJCS8qIEluIGdldG10aW1lLmMgKi8KQEAgLTQwLDYgKzQzLDcgQEAKICAgICAgICBQeXRob24gMS41OiAgIDIwMTIxCiAgICAgICAgUHl0aG9uIDEuNS4xOiAyMDEyMQogICAgICAgIFB5dGhvbiAxLjUuMjogMjAxMjEKKyAgICAgICBQeXRob24gMS42OiAgIDUwNDI4CiAgICAgICAgUHl0aG9uIDIuMDogICA1MDgyMwogICAgICAgIFB5dGhvbiAyLjAuMTogNTA4MjMKICAgICAgICBQeXRob24gMi4xOiAgIDYwMjAyCkBAIC0xMjE3LDEyICsxMjIxLDEyIEBACiAjZW5kaWYKIAkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKIAkJCWNvbnRpbnVlOwotCQlsZW4gPSBQeVN0cmluZ19TaXplKHYpOworCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKIAkJaWYgKGxlbiArIDIgKyBuYW1lbGVuICsgTUFYU1VGRklYU0laRSA+PSBidWZsZW4pIHsKIAkJCVB5X1hERUNSRUYoY29weSk7CiAJCQljb250aW51ZTsgLyogVG9vIGxvbmcgKi8KIAkJfQotCQlzdHJjcHkoYnVmLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7CisJCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyh2KSk7CiAJCWlmIChzdHJsZW4oYnVmKSAhPSBsZW4pIHsKIAkJCVB5X1hERUNSRUYoY29weSk7CiAJCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCkBAIC0xOTM0LDYgKzE5MzgsMTYgQEAKIAkJfQogCQl0YWlsID0gbmV4dDsKIAl9CisJaWYgKHRhaWwgPT0gUHlfTm9uZSkgeworCQkvKiBJZiB0YWlsIGlzIFB5X05vbmUsIGJvdGggZ2V0X3BhcmVudCBhbmQgbG9hZF9uZXh0IGZvdW5kCisJCSAgIGFuIGVtcHR5IG1vZHVsZSBuYW1lOiBzb21lb25lIGNhbGxlZCBfX2ltcG9ydF9fKCIiKSBvcgorCQkgICBkb2N0b3JlZCBmYXVsdHkgYnl0ZWNvZGUgKi8KKwkJUHlfREVDUkVGKHRhaWwpOworCQlQeV9ERUNSRUYoaGVhZCk7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorCQkJCSJFbXB0eSBtb2R1bGUgbmFtZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlpZiAoZnJvbWxpc3QgIT0gTlVMTCkgewogCQlpZiAoZnJvbWxpc3QgPT0gUHlfTm9uZSB8fCAhUHlPYmplY3RfSXNUcnVlKGZyb21saXN0KSkKQEAgLTIwOTQsNyArMjEwOCw4IEBACiAJUHlPYmplY3QgKnJlc3VsdDsKIAogCWlmIChzdHJsZW4obmFtZSkgPT0gMCkgewotCQkvKiBlbXB0eSBtb2R1bGUgbmFtZSBvbmx5IGhhcHBlbnMgaW4gJ2Zyb20gLiBpbXBvcnQnICovCisJCS8qIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCisJCSAgICdmcm9tIC4gaW1wb3J0JyAob3IgJ19faW1wb3J0X18oIiIpJykqLwogCQlQeV9JTkNSRUYobW9kKTsKIAkJKnBfbmFtZSA9IE5VTEw7CiAJCXJldHVybiBtb2Q7CkBAIC0yOTM2LDMgKzI5NTEsNyBAQAogCiAJcmV0dXJuIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIobmV3dGFiKTsKIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKaW5kZXggN2YwNjI3ZS4uMGFhMmNmZCAxMDA2NDQKLS0tIGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKKysrIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkvKiBmb3IgbnRvaGwsIGh0b25sICovCiAKIAogLyogTGlrZSBzdHJlcnJvcigpIGJ1dCBmb3IgTWFjIE9TIGVycm9yIG51bWJlcnMgKi8KQEAgLTE1NiwxMiArMTU3LDE0IEBACiBpbnQKIFB5TWFjX0dldE9TVHlwZShQeU9iamVjdCAqdiwgT1NUeXBlICpwcikKIHsKKwl1aW50MzJfdCB0bXA7CiAJaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDQpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCSJPU1R5cGUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIDQgY2hhcnMiKTsKIAkJcmV0dXJuIDA7CiAJfQotCW1lbWNweSgoY2hhciAqKXByLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgNCk7CisJbWVtY3B5KChjaGFyICopJnRtcCwgUHlTdHJpbmdfQXNTdHJpbmcodiksIDQpOworCSpwciA9IChPU1R5cGUpbnRvaGwodG1wKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY5LDcgKzE3Miw4IEBACiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZE9TVHlwZShPU1R5cGUgdCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmdCwgNCk7CisJdWludDMyX3QgdG1wID0gaHRvbmwoKHVpbnQzMl90KXQpOworCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZ0bXAsIDQpOwogfQogCiAvKiBDb252ZXJ0IGFuIE51bVZlcnNpb24gdmFsdWUgdG8gYSA0LWVsZW1lbnQgdHVwbGUgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IGNiNmJkZmQuLmUyOTEwMTQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMyw4ICszLDExIEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKIAorI2RlZmluZSBGTEFHX1NJWkVfVCAxCiB0eXBlZGVmIGRvdWJsZSB2YV9kb3VibGU7CiAKK3N0YXRpYyBQeU9iamVjdCAqdmFfYnVpbGRfdmFsdWUoY29uc3QgY2hhciAqLCB2YV9saXN0LCBpbnQpOworCiAvKiBQYWNrYWdlIGNvbnRleHQgLS0gdGhlIGZ1bGwgbW9kdWxlIG5hbWUgZm9yIHBhY2thZ2UgaW1wb3J0cyAqLwogY2hhciAqX1B5X1BhY2thZ2VDb250ZXh0ID0gTlVMTDsKIApAQCAtMTQ2LDE0ICsxNDksMTQgQEAKIC8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gY3JlYXRlIGEgdmFsdWUgLS0gdGhlIGludmVyc2Ugb2YgZ2V0YXJncygpICovCiAvKiBBZnRlciBhbiBvcmlnaW5hbCBpZGVhIGFuZCBmaXJzdCBpbXBsZW1lbnRhdGlvbiBieSBTdGV2ZW4gTWlhbGUgKi8KIAotc3RhdGljIFB5T2JqZWN0ICpkb19ta3R1cGxlKGNvbnN0IGNoYXIqKiwgdmFfbGlzdCAqLCBpbnQsIGludCk7Ci1zdGF0aWMgUHlPYmplY3QgKmRvX21rbGlzdChjb25zdCBjaGFyKiosIHZhX2xpc3QgKiwgaW50LCBpbnQpOwotc3RhdGljIFB5T2JqZWN0ICpkb19ta2RpY3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqZG9fbWt2YWx1ZShjb25zdCBjaGFyKiosIHZhX2xpc3QgKik7CitzdGF0aWMgUHlPYmplY3QgKmRvX21rdHVwbGUoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta2xpc3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta2RpY3QoY29uc3QgY2hhcioqLCB2YV9saXN0ICosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICpkb19ta3ZhbHVlKGNvbnN0IGNoYXIqKiwgdmFfbGlzdCAqLCBpbnQpOwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb19ta2RpY3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4pCitkb19ta2RpY3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4sIGludCBmbGFncykKIHsKIAlQeU9iamVjdCAqZDsKIAlpbnQgaTsKQEAgLTE2NywxMyArMTcwLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IG47IGkrPSAyKSB7CiAJCVB5T2JqZWN0ICprLCAqdjsKIAkJaW50IGVycjsKLQkJayA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEpOworCQlrID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAoayA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCWsgPSBQeV9Ob25lOwogCQl9Ci0JCXYgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhKTsKKwkJdiA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKIAkJaWYgKHYgPT0gTlVMTCkgewogCQkJaXRlbWZhaWxlZCA9IDE7CiAJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0xOTksNyArMjAyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRvX21rbGlzdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbikKK2RvX21rbGlzdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewogCVB5T2JqZWN0ICp2OwogCWludCBpOwpAQCAtMjEyLDEzICsyMTUsMTMgQEAKIAkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawogCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSk7CisJCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAodyA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXcgPSBQeV9Ob25lOwogCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOworCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CiAJfQogCiAJaWYgKGl0ZW1mYWlsZWQpIHsKQEAgLTIzMiw3ICsyMzUsNiBAQAogCQkJCSJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CiAJCXJldHVybiBOVUxMOwogCX0KLQogCWlmIChlbmRjaGFyKQogCQkrKypwX2Zvcm1hdDsKIAlyZXR1cm4gdjsKQEAgLTI1MCw3ICsyNTIsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb19ta3R1cGxlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGVuZGNoYXIsIGludCBuKQorZG9fbWt0dXBsZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewogCVB5T2JqZWN0ICp2OwogCWludCBpOwpAQCAtMjYyLDQ1ICsyNjQsNDYgQEAKIAkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawogCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSk7CisJCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwogCQlpZiAodyA9PSBOVUxMKSB7CiAJCQlpdGVtZmFpbGVkID0gMTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXcgPSBQeV9Ob25lOwogCQl9Ci0JCVB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKKwkJUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCB3KTsKIAl9Ci0JaWYgKHYgIT0gTlVMTCAmJiAqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKwlpZiAoaXRlbWZhaWxlZCkgeworCQkvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KIAkJUHlfREVDUkVGKHYpOwotCQl2ID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKwkJUHlfREVDUkVGKHYpOwogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCiAJCQkJIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQotCWVsc2UgaWYgKGVuZGNoYXIpCisJaWYgKGVuZGNoYXIpCiAJCSsrKnBfZm9ybWF0OwotCWlmIChpdGVtZmFpbGVkKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJdiA9IE5VTEw7Ci0JfQogCXJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZG9fbWt2YWx1ZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEpCitkb19ta3ZhbHVlKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewogCWZvciAoOzspIHsKIAkJc3dpdGNoICgqKCpwX2Zvcm1hdCkrKykgewogCQljYXNlICcoJzoKIAkJCXJldHVybiBkb19ta3R1cGxlKHBfZm9ybWF0LCBwX3ZhLCAnKScsCi0JCQkJCSAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnKScpKTsKKwkJCQkJICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICcpJyksIGZsYWdzKTsKIAogCQljYXNlICdbJzoKIAkJCXJldHVybiBkb19ta2xpc3QocF9mb3JtYXQsIHBfdmEsICddJywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ10nKSk7CisJCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICddJyksIGZsYWdzKTsKIAogCQljYXNlICd7JzoKIAkJCXJldHVybiBkb19ta2RpY3QocF9mb3JtYXQsIHBfdmEsICd9JywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ30nKSk7CisJCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICd9JyksIGZsYWdzKTsKIAogCQljYXNlICdiJzoKIAkJY2FzZSAnQic6CkBAIC0zNTEsMTAgKzM1NCwxMyBAQAogCQl7CiAJCQlQeU9iamVjdCAqdjsKIAkJCVB5X1VOSUNPREUgKnUgPSB2YV9hcmcoKnBfdmEsIFB5X1VOSUNPREUgKik7Ci0JCQlpbnQgbjsKKwkJCVB5X3NzaXplX3QgbjsJCiAJCQlpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKIAkJCQkrKypwX2Zvcm1hdDsKLQkJCQluID0gdmFfYXJnKCpwX3ZhLCBpbnQpOworCQkJCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKQorCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKKwkJCQllbHNlCisJCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7CiAJCQl9CiAJCQllbHNlCiAJCQkJbiA9IC0xOwpAQCAtMzkzLDEwICszOTksMTMgQEAKIAkJewogCQkJUHlPYmplY3QgKnY7CiAJCQljaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7Ci0JCQlpbnQgbjsKKwkJCVB5X3NzaXplX3QgbjsKIAkJCWlmICgqKnBfZm9ybWF0ID09ICcjJykgewogCQkJCSsrKnBfZm9ybWF0OwotCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7CisJCQkJaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpCisJCQkJCW4gPSB2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpOworCQkJCWVsc2UKKwkJCQkJbiA9IHZhX2FyZygqcF92YSwgaW50KTsKIAkJCX0KIAkJCWVsc2UKIAkJCQluID0gLTE7CkBAIC00MDcsNyArNDE2LDcgQEAKIAkJCWVsc2UgewogCQkJCWlmIChuIDwgMCkgewogCQkJCQlzaXplX3QgbSA9IHN0cmxlbihzdHIpOwotCQkJCQlpZiAobSA+IElOVF9NQVgpIHsKKwkJCQkJaWYgKG0gPiBQWV9TU0laRV9UX01BWCkgewogCQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkJCQkJInN0cmluZyB0b28gbG9uZyBmb3IgUHl0aG9uIHN0cmluZyIpOwogCQkJCQkJcmV0dXJuIE5VTEw7CkBAIC00NzIsNyArNDgxLDE4IEBACiAJdmFfbGlzdCB2YTsKIAlQeU9iamVjdCogcmV0dmFsOwogCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKwlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCAwKTsKKwl2YV9lbmQodmEpOworCXJldHVybiByZXR2YWw7Cit9CisKK1B5T2JqZWN0ICoKK19QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisJUHlPYmplY3QqIHJldHZhbDsKKwl2YV9zdGFydCh2YSwgZm9ybWF0KTsKKwlyZXR2YWwgPSB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7CiAJdmFfZW5kKHZhKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDgwLDYgKzUwMCwxOCBAQAogUHlPYmplY3QgKgogUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKKwlyZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7Cit9CisKK1B5T2JqZWN0ICoKK19QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQoreworCXJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit2YV9idWlsZF92YWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEsIGludCBmbGFncykKK3sKIAljb25zdCBjaGFyICpmID0gZm9ybWF0OwogCWludCBuID0gY291bnRmb3JtYXQoZiwgJ1wwJyk7CiAJdmFfbGlzdCBsdmE7CkBAIC01MDEsOCArNTMzLDggQEAKIAkJcmV0dXJuIFB5X05vbmU7CiAJfQogCWlmIChuID09IDEpCi0JCXJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhKTsKLQlyZXR1cm4gZG9fbWt0dXBsZSgmZiwgJmx2YSwgJ1wwJywgbik7CisJCXJldHVybiBkb19ta3ZhbHVlKCZmLCAmbHZhLCBmbGFncyk7CisJcmV0dXJuIGRvX21rdHVwbGUoJmYsICZsdmEsICdcMCcsIG4sIGZsYWdzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9QeXRob24vcHlhcmVuYS5jIGIvUHl0aG9uL3B5YXJlbmEuYwppbmRleCAyNDJjYTFkLi5mMTFhOTA1IDEwMDY0NAotLS0gYS9QeXRob24vcHlhcmVuYS5jCisrKyBiL1B5dGhvbi9weWFyZW5hLmMKQEAgLTYsOSArNiwxNiBAQAogICAgTWVhc3VyZW1lbnRzIHdpdGggc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzIHN1Z2dlc3QgdGhlIGF2ZXJhZ2UKICAgIGFsbG9jYXRpb24gaXMgYWJvdXQgMjAgYnl0ZXMgYW5kIHRoYXQgbW9zdCBjb21waWxlcyB1c2UgYSBzaW5nbGUKICAgIGJsb2NrLgorCisgICBUT0RPKGpoeWx0b24pOiBUaGluayBhYm91dCBhIHJlYWxsb2MgQVBJLCBtYXliZSBqdXN0IGZvciB0aGUgbGFzdAorICAgYWxsb2NhdGlvbj8KICovCiAKICNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDgxOTIKKyNkZWZpbmUgQUxJR05NRU5UCQk4CisjZGVmaW5lIEFMSUdOTUVOVF9NQVNLCQkoQUxJR05NRU5UIC0gMSkKKyNkZWZpbmUgUk9VTkRVUCh4KQkJKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCisKIHR5cGVkZWYgc3RydWN0IF9ibG9jayB7CiAJLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIG93bmVkIGJ5IHRoaXMgYmxvY2sgYXZhaWxhYmxlIHRvIHBhc3Mgb3V0LgogCSAqIFJlYWQtb25seSBhZnRlciBpbml0aWFsaXphdGlvbi4gIFRoZSBmaXJzdCBzdWNoIGJ5dGUgc3RhcnRzIGF0CkBAIC0zOSw5ICs0NiwyNSBAQAogKi8KIAogc3RydWN0IF9hcmVuYSB7CisgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBmb3IgdGhlIGFyZW5hLCBuZXZlciBOVUxMLgorICAgICAgICAgICBJdCBpcyB1c2VkIG9ubHkgdG8gZmluZCB0aGUgZmlyc3QgYmxvY2sgd2hlbiB0aGUgYXJlbmEgaXMKKyAgICAgICAgICAgYmVpbmcgZnJlZWQuCisgICAgICAgICAqLwogCWJsb2NrICphX2hlYWQ7CisKKyAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYmxvY2sgY3VycmVudGx5IHVzZWQgZm9yIGFsbG9jYXRpb24uICBJdCdzCisgICAgICAgICAgIGFiX25leHQgZmllbGQgc2hvdWxkIGJlIE5VTEwuICBJZiBpdCBpcyBub3QtbnVsbCBhZnRlciBhCisgICAgICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgICAgIGFuZCBhX2N1ciBzaG91bGQgYmUgcmVzZXQgdG8gcG9pbnQgaXQuCisgICAgICAgICAqLwogCWJsb2NrICphX2N1cjsKKworICAgICAgICAvKiBBIFB5dGhvbiBsaXN0IG9iamVjdCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBQeU9iamVjdAorICAgICAgICAgICBwb2ludGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhcmVhLiAgVGhleSB3aWxsIGJlIERFQ1JFRmVkCisgICAgICAgICAgIHdoZW4gdGhlIGFyZW5hIGlzIGZyZWVkLgorICAgICAgICAqLwogICAgICAgICBQeU9iamVjdCAqYV9vYmplY3RzOworCiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgLyogRGVidWcgb3V0cHV0ICovCiAgICAgICAgIHNpemVfdCB0b3RhbF9hbGxvY3M7CkBAIC02Myw3ICs4Niw4IEBACiAJYi0+YWJfc2l6ZSA9IHNpemU7CiAJYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOwogCWItPmFiX25leHQgPSBOVUxMOwotCWItPmFiX29mZnNldCA9IDA7CisJYi0+YWJfb2Zmc2V0ID0gUk9VTkRVUCgoUHlfdWludHB0cl90KShiLT5hYl9tZW0pKSAtIAorCSAgKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKTsKIAlyZXR1cm4gYjsKIH0KIApAQCAtODEsMTkgKzEwNSwyMCBAQAogewogCXZvaWQgKnA7CiAJYXNzZXJ0KGIpOworCXNpemUgPSBST1VORFVQKHNpemUpOwogCWlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgewogCQkvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KIAkJICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCiAJCSAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCiAJCS8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLwotCQlibG9jayAqbmV3ID0gYmxvY2tfbmV3KAorCQlibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCiAJCQkJc2l6ZSA8IERFRkFVTFRfQkxPQ0tfU0laRSA/CiAJCQkJREVGQVVMVF9CTE9DS19TSVpFIDogc2l6ZSk7Ci0JCWlmICghbmV3KQorCQlpZiAoIW5ld2JsKQogCQkJcmV0dXJuIE5VTEw7CiAJCWFzc2VydCghYi0+YWJfbmV4dCk7Ci0JCWItPmFiX25leHQgPSBuZXc7Ci0JCWIgPSBuZXc7CisJCWItPmFiX25leHQgPSBuZXdibDsKKwkJYiA9IG5ld2JsOwogCX0KIAogCWFzc2VydChiLT5hYl9vZmZzZXQgKyBzaXplIDw9IGItPmFiX3NpemUpOwpAQCAtMTM0LDYgKzE1OSw3IEBACiB2b2lkCiBQeUFyZW5hX0ZyZWUoUHlBcmVuYSAqYXJlbmEpCiB7CisgICAgICAgIGludCByOwogCWFzc2VydChhcmVuYSk7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgLyoKQEAgLTE0NSw3ICsxNzEsMTcgQEAKICAgICAgICAgKi8KICNlbmRpZgogCWJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7CisJLyogVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBob2xkcywgZXhjZXB0IHdoZW4gdGhlIGNvZGUgYmVpbmcgY29tcGlsZWQKKwkgICBpcyBzeXMuZ2V0b2JqZWN0cygwKSwgaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGJlIHR3byByZWZlcmVuY2VzLgogICAgICAgICBhc3NlcnQoYXJlbmEtPmFfb2JqZWN0cy0+b2JfcmVmY250ID09IDEpOworCSovCisKKyAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgICAgICAgdG8gZ3VhcmFudGVlIHRoYXQgdGhleSB3aWxsIGJlIERFQ1JFRmVkLiAqLworICAgICAgICByID0gUHlMaXN0X1NldFNsaWNlKGFyZW5hLT5hX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHIgPT0gMCk7CisgICAgICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUoYXJlbmEtPmFfb2JqZWN0cykgPT0gMCk7CiAgICAgICAgIFB5X0RFQ1JFRihhcmVuYS0+YV9vYmplY3RzKTsKIAlmcmVlKGFyZW5hKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IDg2NzMzNGUuLmI4ZjQ2MGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtMjMsMTMgKzIzLDYgQEAKICNlbmRpZgogCiAKLSNkZWZpbmUgWkFQKHgpIHsgXAotCVB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikoeCk7IFwKLQkoeCkgPSBOVUxMOyBcCi0JUHlfWERFQ1JFRih0bXApOyBcCi19Ci0KLQogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKIHN0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgaGVhZF9tdXRleCA9IE5VTEw7IC8qIFByb3RlY3RzIGludGVycC0+dHN0YXRlX2hlYWQgKi8KQEAgLTM3LDYgKzMwLDEwIEBACiAjZGVmaW5lIEhFQURfTE9DSygpIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhoZWFkX211dGV4LCBXQUlUX0xPQ0spCiAjZGVmaW5lIEhFQURfVU5MT0NLKCkgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGhlYWRfbXV0ZXgpCiAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwogLyogVGhlIHNpbmdsZSBQeUludGVycHJldGVyU3RhdGUgdXNlZCBieSB0aGlzIHByb2Nlc3MnCiAgICBHSUxTdGF0ZSBpbXBsZW1lbnRhdGlvbgogKi8KQEAgLTEwMiwxMiArOTksMTIgQEAKIAlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQogCQlQeVRocmVhZFN0YXRlX0NsZWFyKHApOwogCUhFQURfVU5MT0NLKCk7Ci0JWkFQKGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGgpOwotCVpBUChpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7Ci0JWkFQKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpOwotCVpBUChpbnRlcnAtPm1vZHVsZXMpOwotCVpBUChpbnRlcnAtPnN5c2RpY3QpOwotCVpBUChpbnRlcnAtPmJ1aWx0aW5zKTsKKwlQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoKTsKKwlQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7CisJUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSk7CisJUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzKTsKKwlQeV9DTEVBUihpbnRlcnAtPnN5c2RpY3QpOworCVB5X0NMRUFSKGludGVycC0+YnVpbHRpbnMpOwogfQogCiAKQEAgLTIxMSwyMyArMjA4LDIzIEBACiAJCWZwcmludGYoc3RkZXJyLAogCQkgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOwogCi0JWkFQKHRzdGF0ZS0+ZnJhbWUpOworCVB5X0NMRUFSKHRzdGF0ZS0+ZnJhbWUpOwogCi0JWkFQKHRzdGF0ZS0+ZGljdCk7Ci0JWkFQKHRzdGF0ZS0+YXN5bmNfZXhjKTsKKwlQeV9DTEVBUih0c3RhdGUtPmRpY3QpOworCVB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKIAotCVpBUCh0c3RhdGUtPmN1cmV4Y190eXBlKTsKLQlaQVAodHN0YXRlLT5jdXJleGNfdmFsdWUpOwotCVpBUCh0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOworCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOworCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKKwlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOwogCi0JWkFQKHRzdGF0ZS0+ZXhjX3R5cGUpOwotCVpBUCh0c3RhdGUtPmV4Y192YWx1ZSk7Ci0JWkFQKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CisJUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7CisJUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOworCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CiAKIAl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOwogCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCVpBUCh0c3RhdGUtPmNfcHJvZmlsZW9iaik7Ci0JWkFQKHRzdGF0ZS0+Y190cmFjZW9iaik7CisJUHlfQ0xFQVIodHN0YXRlLT5jX3Byb2ZpbGVvYmopOworCVB5X0NMRUFSKHRzdGF0ZS0+Y190cmFjZW9iaik7CiB9CiAKIApAQCAtMjk3LDIzICsyOTQsMjMgQEAKIAogCiBQeVRocmVhZFN0YXRlICoKLVB5VGhyZWFkU3RhdGVfU3dhcChQeVRocmVhZFN0YXRlICpuZXcpCitQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqbmV3dHMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqb2xkID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKwlQeVRocmVhZFN0YXRlICpvbGR0cyA9IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiAKLQlfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID0gbmV3OworCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBuZXd0czsKIAkvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBtb3JlIHRoYW4gb25lIHRocmVhZCBzdGF0ZQogCSAgIHRvIGJlIHVzZWQgZm9yIGEgdGhyZWFkLiAgQ2hlY2sgdGhpcyB0aGUgYmVzdCB3ZSBjYW4gaW4gZGVidWcKIAkgICBidWlsZHMuCiAJKi8KICNpZiBkZWZpbmVkKFB5X0RFQlVHKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKQotCWlmIChuZXcpIHsKKwlpZiAobmV3dHMpIHsKIAkJUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwotCQlpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXctPmludGVycCAmJiBjaGVjayAhPSBuZXcpCisJCWlmIChjaGVjayAmJiBjaGVjay0+aW50ZXJwID09IG5ld3RzLT5pbnRlcnAgJiYgY2hlY2sgIT0gbmV3dHMpCiAJCQlQeV9GYXRhbEVycm9yKCJJbnZhbGlkIHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQiKTsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gb2xkOworCXJldHVybiBvbGR0czsKIH0KIAogLyogQW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBzdG9yZSBhcmJpdHJhcnkgYWRkaXRpb25hbCBwZXItdGhyZWFkIHN0YXRlLgpAQCAtMzU2LDcgKzM1Myw3IEBACiAJZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewogCQlpZiAocC0+dGhyZWFkX2lkICE9IGlkKQogCQkJY29udGludWU7Ci0JCVpBUChwLT5hc3luY19leGMpOworCQlQeV9DTEVBUihwLT5hc3luY19leGMpOwogCQlQeV9YSU5DUkVGKGV4Yyk7CiAJCXAtPmFzeW5jX2V4YyA9IGV4YzsKIAkJY291bnQgKz0gMTsKQEAgLTQ5MSw3ICs0ODgsNyBAQAogCSAgIGNhbGxlZCBQeV9Jbml0aWFsaXplKCkgYW5kIHVzdWFsbHkgUHlFdmFsX0luaXRUaHJlYWRzKCkuCiAJKi8KIAlhc3NlcnQoYXV0b0ludGVycHJldGVyU3RhdGUpOyAvKiBQeV9Jbml0aWFsaXplKCkgaGFzbid0IGJlZW4gY2FsbGVkISAqLwotCXRjdXIgPSBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOworCXRjdXIgPSAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CiAJaWYgKHRjdXIgPT0gTlVMTCkgewogCQkvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLwogCQl0Y3VyID0gUHlUaHJlYWRTdGF0ZV9OZXcoYXV0b0ludGVycHJldGVyU3RhdGUpOwpAQCAtNTE4LDcgKzUxNSw4IEBACiB2b2lkCiBQeUdJTFN0YXRlX1JlbGVhc2UoUHlHSUxTdGF0ZV9TVEFURSBvbGRzdGF0ZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0Y3VyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KTsKKwlQeVRocmVhZFN0YXRlICp0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9UTFNrZXkpOwogCWlmICh0Y3VyID09IE5VTEwpCiAJCVB5X0ZhdGFsRXJyb3IoImF1dG8tcmVsZWFzaW5nIHRocmVhZC1zdGF0ZSwgIgogCQkgICAgICAgICAgICAgICJidXQgbm8gdGhyZWFkLXN0YXRlIGZvciB0aGlzIHRocmVhZCIpOwpAQCAtNTUxLDQgKzU0OSwxMSBAQAogCWVsc2UgaWYgKG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpCiAJCVB5RXZhbF9TYXZlVGhyZWFkKCk7CiB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLworCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cnRvZC5jIGIvUHl0aG9uL3B5c3RydG9kLmMKaW5kZXggODNlNzkyZC4uZGI0Y2FkMSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RydG9kLmMKKysrIGIvUHl0aG9uL3B5c3RydG9kLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQljaGFyICpjb3B5LCAqYzsKIAogCQkvKiBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlICcuJyB0byB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwgcG9pbnQgKi8KLQkJY29weSA9IG1hbGxvYyhlbmQgLSBucHRyICsgMSArIGRlY2ltYWxfcG9pbnRfbGVuKTsKKwkJY29weSA9IChjaGFyICopbWFsbG9jKGVuZCAtIG5wdHIgKyAxICsgZGVjaW1hbF9wb2ludF9sZW4pOwogCiAJCWMgPSBjb3B5OwogCQltZW1jcHkoYywgbnB0ciwgZGVjaW1hbF9wb2ludF9wb3MgLSBucHRyKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCAyYzU0MDBkLi45OWQ2ZDlkIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC0zMCwxNCArMzAsMTUgQEAKICNlbmRpZgogCiAjaWZuZGVmIFB5X1JFRl9ERUJVRwotIyAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKQorI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkKICNlbHNlIC8qIFB5X1JFRl9ERUJVRyAqLwotIyAgaWYgZGVmaW5lZChNU19XSU42NCkKLSMgICAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgIlslSWQgcmVmc11cbiIsIF9QeV9SZWZUb3RhbCk7Ci0jICBlbHNlIC8qICEgTVNfV0lONjQgKi8KLSMgICAgZGVmaW5lIFBSSU5UX1RPVEFMX1JFRlMoKSBmcHJpbnRmKHN0ZGVyciwgIlslbGQgcmVmc11cbiIsIFwKLQkJCVB5X1NBRkVfRE9XTkNBU1QoX1B5X1JlZlRvdGFsLCBQeV9zc2l6ZV90LCBsb25nKSk7Ci0jICBlbmRpZiAvKiBNU19XSU42NCAqLworI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkgZnByaW50ZihzdGRlcnIsCQkJCVwKKwkJCQkgICAiWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgcmVmc11cbiIsCVwKKwkJCQkgICBfUHlfR2V0UmVmVG90YWwoKSkKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKIGV4dGVybiBjaGFyICpQeV9HZXRQYXRoKHZvaWQpOwpAQCAtMjgwLDYgKzI4MSwxNiBAQAogCQl9CiAJCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CiAKKwkJc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisJCXN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7CisJCWlmICghc3lzX2lzYXR0eSkKKwkJCVB5RXJyX0NsZWFyKCk7CisJCWlmKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSB7CisJCQlpZiAoIVB5RmlsZV9TZXRFbmNvZGluZyhzeXNfc3RyZWFtLCBjb2Rlc2V0KSkKKwkJCQlQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkZXJyIik7CisJCX0KKwkJUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKKwogCQlpZiAoIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpCiAJCQlQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nID0gY29kZXNldDsKIAkJZWxzZQpAQCAtMjk2LDcgKzMwNyw3IEBACiAKIAogI2lmZGVmIENPVU5UX0FMTE9DUwotZXh0ZXJuIHZvaWQgZHVtcF9jb3VudHModm9pZCk7CitleHRlcm4gdm9pZCBkdW1wX2NvdW50cyhGSUxFKik7CiAjZW5kaWYKIAogLyogVW5kbyB0aGUgZWZmZWN0IG9mIFB5X0luaXRpYWxpemUoKS4KQEAgLTM1OCw2ICszNjksMTMgQEAKIAkgKiBYWFggSSBoYXZlbid0IHNlZW4gYSByZWFsLWxpZmUgcmVwb3J0IG9mIGVpdGhlciBvZiB0aGVzZS4KIAkgKi8KIAlQeUdDX0NvbGxlY3QoKTsKKyNpZmRlZiBDT1VOVF9BTExPQ1MKKwkvKiBXaXRoIENPVU5UX0FMTE9DUywgaXQgaGVscHMgdG8gcnVuIEdDIG11bHRpcGxlIHRpbWVzOgorCSAgIGVhY2ggY29sbGVjdGlvbiBtaWdodCByZWxlYXNlIHNvbWUgdHlwZXMgZnJvbSB0aGUgdHlwZQorCSAgIGxpc3QsIHNvIHRoZXkgYmVjb21lIGdhcmJhZ2UuICovCisJd2hpbGUgKFB5R0NfQ29sbGVjdCgpID4gMCkKKwkJLyogbm90aGluZyAqLzsKKyNlbmRpZgogCiAJLyogRGVzdHJveSBhbGwgbW9kdWxlcyAqLwogCVB5SW1wb3J0X0NsZWFudXAoKTsKQEAgLTM4NiwxMCArNDA0LDEwIEBACiAKIAkvKiBEZWJ1Z2dpbmcgc3R1ZmYgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQlkdW1wX2NvdW50cygpOworCWR1bXBfY291bnRzKHN0ZG91dCk7CiAjZW5kaWYKIAotCVBSSU5UX1RPVEFMX1JFRlMoKQorCVBSSU5UX1RPVEFMX1JFRlMoKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKIAkvKiBEaXNwbGF5IGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlIC0tIHRoaXMgY2FuIGludm9rZSBhcmJpdHJhcnkKQEAgLTY3OSw3ICs2OTcsNyBAQAogCX0KIAlmb3IgKDs7KSB7CiAJCXJldCA9IFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7Ci0JCVBSSU5UX1RPVEFMX1JFRlMoKQorCQlQUklOVF9UT1RBTF9SRUZTKCk7CiAJCWlmIChyZXQgPT0gRV9FT0YpCiAJCQlyZXR1cm4gMDsKIAkJLyoKQEAgLTE0NTEsNyArMTQ2OSw3IEBACiAJdiA9IFB5X0J1aWxkVmFsdWUoIih6aWl6KSIsIGVyci0+ZmlsZW5hbWUsCiAJCQkgIGVyci0+bGluZW5vLCBlcnItPm9mZnNldCwgZXJyLT50ZXh0KTsKIAlpZiAoZXJyLT50ZXh0ICE9IE5VTEwpIHsKLQkJUHlNZW1fREVMKGVyci0+dGV4dCk7CisJCVB5T2JqZWN0X0ZSRUUoZXJyLT50ZXh0KTsKIAkJZXJyLT50ZXh0ID0gTlVMTDsKIAl9CiAJdyA9IE5VTEw7CkBAIC0xNjY2LDE2ICsxNjg0LDExMyBAQAogLyogRGVwcmVjYXRlZCBDIEFQSSBmdW5jdGlvbnMgc3RpbGwgcHJvdmlkZWQgZm9yIGJpbmFyeSBjb21wYXRpYmxpdHkgKi8KIAogI3VuZGVmIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZQotI3VuZGVmIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nCi0KLW5vZGUgKgorUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQpCiB7CiAJcmV0dXJuIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgc3RhcnQsIDApOwogfQogCi1ub2RlICoKKyN1bmRlZiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZworUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCkKIHsKIAlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKIH0KKworI3VuZGVmIFB5UnVuX0FueUZpbGUKK1B5QVBJX0ZVTkMoaW50KQorUHlSdW5fQW55RmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fQW55RmlsZUV4CitQeUFQSV9GVU5DKGludCkKK1B5UnVuX0FueUZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGNsb3NlaXQpCit7CisJcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX0FueUZpbGVGbGFncworUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9BbnlGaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKm5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCit7CisJcmV0dXJuIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCAwLCBmbGFncyk7Cit9CisKKyN1bmRlZiBQeVJ1bl9GaWxlCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpwLCBpbnQgcywgUHlPYmplY3QgKmcsIFB5T2JqZWN0ICpsKQoreworICAgICAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fRmlsZUV4CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlRXgoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsIGludCBjKQoreworICAgICAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGMsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fRmlsZUZsYWdzCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsCisJCVB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCit7CisgICAgICAgIHJldHVybiBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgZmxhZ3MpOworfQorCisjdW5kZWYgUHlSdW5fU2ltcGxlRmlsZQorUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9TaW1wbGVGaWxlKEZJTEUgKmYsIGNvbnN0IGNoYXIgKnApCit7CisJcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIDAsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fU2ltcGxlRmlsZUV4CitQeUFQSV9GVU5DKGludCkKK1B5UnVuX1NpbXBsZUZpbGVFeChGSUxFICpmLCBjb25zdCBjaGFyICpwLCBpbnQgYykKK3sKKwlyZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCk7Cit9CisKKworI3VuZGVmIFB5UnVuX1N0cmluZworUHlBUElfRlVOQyhQeU9iamVjdCAqKQorUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKK3sKKwlyZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX1NpbXBsZVN0cmluZworUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9TaW1wbGVTdHJpbmcoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCk7Cit9CisKKyN1bmRlZiBQeV9Db21waWxlU3RyaW5nCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitQeV9Db21waWxlU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcCwgaW50IHMpCit7CisJcmV0dXJuIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIHAsIHMsIE5VTEwpOworfQorCisjdW5kZWYgUHlSdW5fSW50ZXJhY3RpdmVPbmUKK1B5QVBJX0ZVTkMoaW50KQorUHlSdW5fSW50ZXJhY3RpdmVPbmUoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKTsKK30KKworI3VuZGVmIFB5UnVuX0ludGVyYWN0aXZlTG9vcAorUHlBUElfRlVOQyhpbnQpCitQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoRklMRSAqZiwgY29uc3QgY2hhciAqcCkKK3sKKwlyZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL1B5dGhvbi9zeW10YWJsZS5jIGIvUHl0aG9uL3N5bXRhYmxlLmMKaW5kZXggYzhlYWI1OC4uMTg0NzIzZCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5bXRhYmxlLmMKKysrIGIvUHl0aG9uL3N5bXRhYmxlLmMKQEAgLTIyNyw3ICsyMjcsOCBAQAogCWNhc2UgTW9kdWxlX2tpbmQ6CiAJCXNlcSA9IG1vZC0+di5Nb2R1bGUuYm9keTsKIAkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIGFzZGxfc2VxX0dFVChzZXEsIGkpKSkKKwkJCWlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKSkpCiAJCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBFeHByZXNzaW9uX2tpbmQ6CkBAIC0yMzcsNyArMjM4LDggQEAKIAljYXNlIEludGVyYWN0aXZlX2tpbmQ6CiAJCXNlcSA9IG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5OwogCQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykKLQkJCWlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwgYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQorCQkJaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKIAkJCQlnb3RvIGVycm9yOwogCQlicmVhazsKIAljYXNlIFN1aXRlX2tpbmQ6CkBAIC01MDYsNyArNTA4LDcgQEAKICovCiBzdGF0aWMgaW50CiB1cGRhdGVfc3ltYm9scyhQeU9iamVjdCAqc3ltYm9scywgUHlPYmplY3QgKnNjb3BlLCAKLSAgICAgICAgICAgICAgIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsIGludCBjbGFzcykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsIGludCBjbGFzc2ZsYWcpCiB7CiAJUHlPYmplY3QgKm5hbWUsICp2LCAqdSwgKncsICpmcmVlX3ZhbHVlID0gTlVMTDsKIAlQeV9zc2l6ZV90IHBvcyA9IDA7CkBAIC01NDEsNyArNTQzLDcgQEAKIAkJCSAgIHRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwKIAkJCSAgIG9yIGdsb2JhbCBpbiB0aGUgY2xhc3Mgc2NvcGUuCiAJCQkqLwotCQkJaWYgIChjbGFzcyAmJiAKKwkJCWlmICAoY2xhc3NmbGFnICYmIAogCQkJICAgICBQeUludF9BU19MT05HKG8pICYgKERFRl9CT1VORCB8IERFRl9HTE9CQUwpKSB7CiAJCQkJbG9uZyBpID0gUHlJbnRfQVNfTE9ORyhvKSB8IERFRl9GUkVFX0NMQVNTOwogCQkJCW8gPSBQeUludF9Gcm9tTG9uZyhpKTsKQEAgLTg1MSw3ICs4NTMsNyBAQAogCWludCBpOyBcCiAJYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAogCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKIAkJCXJldHVybiAwOyBcCiAJfSBcCkBAIC04NjEsNyArODYzLDcgQEAKIAlpbnQgaTsgXAogCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKIAkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKIAkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAogCQkJcmV0dXJuIDA7IFwKQEAgLTg3Myw3ICs4NzUsNyBAQAogCWludCBpOyBcCiAJYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKIAlmb3IgKGkgPSAoU1RBUlQpOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IGFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisJCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAogCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKIAkJCXJldHVybiAwOyBcCiAJfSBcCkBAIC04ODMsNyArODg1LDcgQEAKIAlpbnQgaTsgXAogCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCiAJZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKIAkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKIAkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAogCQkJcmV0dXJuIDA7IFwKQEAgLTEwMzYsNyArMTAzOCw3IEBACiAJCWludCBpOwogCQlhc2RsX3NlcSAqc2VxID0gcy0+di5HbG9iYWwubmFtZXM7CiAJCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7Ci0JCQlpZGVudGlmaWVyIG5hbWUgPSBhc2RsX3NlcV9HRVQoc2VxLCBpKTsKKwkJCWlkZW50aWZpZXIgbmFtZSA9IChpZGVudGlmaWVyKWFzZGxfc2VxX0dFVChzZXEsIGkpOwogCQkJY2hhciAqY19uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOwogCQkJbG9uZyBjdXIgPSBzeW10YWJsZV9sb29rdXAoc3QsIG5hbWUpOwogCQkJaWYgKGN1ciA8IDApCkBAIC0xMjAwLDcgKzEyMDIsNyBAQAogCQogICAgICAgICAvKiBnbyB0aHJvdWdoIGFsbCB0aGUgdG9wbGV2ZWwgYXJndW1lbnRzIGZpcnN0ICovCiAJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihhcmdzKTsgaSsrKSB7Ci0JCWV4cHJfdHkgYXJnID0gYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOworCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKIAkJaWYgKGFyZy0+a2luZCA9PSBOYW1lX2tpbmQpIHsKIAkJCWFzc2VydChhcmctPnYuTmFtZS5jdHggPT0gUGFyYW0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJnLT52Lk5hbWUuY3R4ID09IFN0b3JlICYmICF0b3BsZXZlbCkpOwpAQCAtMTIzNiw3ICsxMjM4LDcgQEAKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKLQkJZXhwcl90eSBhcmcgPSBhc2RsX3NlcV9HRVQoYXJncywgaSk7CisJCWV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOwogCQlpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQgJiYKIAkJICAgICFzeW10YWJsZV92aXNpdF9wYXJhbXMoc3QsIGFyZy0+di5UdXBsZS5lbHRzLCAwKSkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDg3NWY3M2YuLmM2ZWI5MWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTYwMCwxMCArNjAwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0dG90YWxyZWZjb3VudChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X1JlZlRvdGFsKTsKKwlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoX1B5X0dldFJlZlRvdGFsKCkpOwogfQotCi0jZW5kaWYgLyogUHlfVFJBQ0VfUkVGUyAqLworI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiBQeURvY19TVFJWQVIoZ2V0cmVmY291bnRfZG9jLAogImdldHJlZmNvdW50KG9iamVjdCkgLT4gaW50ZWdlclxuXApAQCAtNjk3LDYgKzY5NiwxMCBAQAogMTAuIE51bWJlciBvZiBzdGFjayBwb3BzIHBlcmZvcm1lZCBieSBjYWxsX2Z1bmN0aW9uKCkiCiApOwogCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKICNpZmRlZiBQeV9UUkFDRV9SRUZTCiAvKiBEZWZpbmVkIGluIG9iamVjdHMuYyBiZWNhdXNlIGl0IHVzZXMgc3RhdGljIGdsb2JhbHMgaWYgdGhhdCBmaWxlICovCiBleHRlcm4gUHlPYmplY3QgKl9QeV9HZXRPYmplY3RzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwpAQCAtNzA3LDYgKzcxMCwxMCBAQAogZXh0ZXJuIFB5T2JqZWN0ICpfUHlfR2V0RFhQcm9maWxlKFB5T2JqZWN0ICosICBQeU9iamVjdCAqKTsKICNlbmRpZgogCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCiBzdGF0aWMgUHlNZXRob2REZWYgc3lzX21ldGhvZHNbXSA9IHsKIAkvKiBNaWdodCBhcyB3ZWxsIGtlZXAgdGhpcyBpbiBhbHBoYWJldGljIG9yZGVyICovCiAJeyJjYWxsc3RhdHMiLCAoUHlDRnVuY3Rpb24pUHlFdmFsX0dldENhbGxTdGF0cywgTUVUSF9OT0FSR1MsCkBAIC0xMDY1LDYgKzEwNzIsMTEgQEAKIAkJaWYgKCFQeUZpbGVfU2V0RW5jb2Rpbmcoc3lzb3V0LCBidWYpKQogCQkJcmV0dXJuIE5VTEw7CiAJfQorCWlmKGlzYXR0eShfZmlsZW5vKHN0ZGVycikpKSB7CisJCXNwcmludGYoYnVmLCAiY3AlZCIsIEdldENvbnNvbGVPdXRwdXRDUCgpKTsKKwkJaWYgKCFQeUZpbGVfU2V0RW5jb2Rpbmcoc3lzZXJyLCBidWYpKQorCQkJcmV0dXJuIE5VTEw7CisJfQogI2VuZGlmCiAKIAlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkaW4iLCBzeXNpbik7CkBAIC0xNDA2LDcgKzE0MTgsNyBAQAogCQkJUHlFcnJfQ2xlYXIoKTsKIAkJCWZwdXRzKGJ1ZmZlciwgZnApOwogCQl9Ci0JCWlmICh3cml0dGVuIDwgMCB8fCB3cml0dGVuID49IHNpemVvZihidWZmZXIpKSB7CisJCWlmICh3cml0dGVuIDwgMCB8fCAoc2l6ZV90KXdyaXR0ZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKIAkJCWNvbnN0IGNoYXIgKnRydW5jYXRlZCA9ICIuLi4gdHJ1bmNhdGVkIjsKIAkJCWlmIChQeUZpbGVfV3JpdGVTdHJpbmcodHJ1bmNhdGVkLCBmaWxlKSAhPSAwKSB7CiAJCQkJUHlFcnJfQ2xlYXIoKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKaW5kZXggNzgxNDY3Zi4uYzI5YTYxYyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmgKQEAgLTI2LDYgKzI2LDE2IEBACiAjZW5kaWYKICNlbmRpZgogCisvKiBCZWZvcmUgRnJlZUJTRCA1LjQsIHN5c3RlbSBzY29wZSB0aHJlYWRzIHdhcyB2ZXJ5IGxpbWl0ZWQgcmVzb3VyY2UKKyAgIGluIGRlZmF1bHQgc2V0dGluZy4gIFNvIHRoZSBwcm9jZXNzIHNjb3BlIGlzIHByZWZlcnJlZCB0byBnZXQKKyAgIGVub3VnaCBudW1iZXIgb2YgdGhyZWFkcyB0byB3b3JrLiAqLworI2lmZGVmIF9fRnJlZUJTRF9fCisjaW5jbHVkZSA8b3NyZWxkYXRlLmg+CisjaWYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDAwICYmIF9fRnJlZUJTRF92ZXJzaW9uIDwgNTA0MTAxCisjdW5kZWYgUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZgorCiAjaWYgIWRlZmluZWQocHRocmVhZF9hdHRyX2RlZmF1bHQpCiAjICBkZWZpbmUgcHRocmVhZF9hdHRyX2RlZmF1bHQgKChwdGhyZWFkX2F0dHJfdCAqKU5VTEwpCiAjZW5kaWYKQEAgLTEzOCw3ICsxNDgsNyBAQAogI2lmZGVmIFRIUkVBRF9TVEFDS19TSVpFCiAJcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIFRIUkVBRF9TVEFDS19TSVpFKTsKICNlbmRpZgotI2lmIGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpZiBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKICAgICAgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCA2YzExY2Y1Li5jZmJkODMzIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0zOSwyNCArMzksMTYgQEAKIHN0YXRpYyBpbnQKIHRiX3RyYXZlcnNlKFB5VHJhY2ViYWNrT2JqZWN0ICp0YiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaW50IGVyciA9IDA7Ci0JaWYgKHRiLT50Yl9uZXh0KSB7Ci0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKXRiLT50Yl9uZXh0LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JaWYgKHRiLT50Yl9mcmFtZSkgCi0JCWVyciA9IHZpc2l0KChQeU9iamVjdCAqKXRiLT50Yl9mcmFtZSwgYXJnKTsKLQlyZXR1cm4gZXJyOworCVB5X1ZJU0lUKHRiLT50Yl9uZXh0KTsKKwlQeV9WSVNJVCh0Yi0+dGJfZnJhbWUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogdGJfY2xlYXIoUHlUcmFjZWJhY2tPYmplY3QgKnRiKQogewotCVB5X1hERUNSRUYodGItPnRiX25leHQpOwotCVB5X1hERUNSRUYodGItPnRiX2ZyYW1lKTsKLQl0Yi0+dGJfbmV4dCA9IE5VTEw7Ci0JdGItPnRiX2ZyYW1lID0gTlVMTDsKKwlQeV9DTEVBUih0Yi0+dGJfbmV4dCk7CisJUHlfQ0xFQVIodGItPnRiX2ZyYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5VHJhY2VCYWNrX1R5cGUgPSB7CkBAIC0xNjUsNyArMTU3LDcgQEAKIAkJCQl9CiAJCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJCQkJCXNpemVfdCBsZW47Ci0JCQkJCWxlbiA9IFB5U3RyaW5nX1NpemUodik7CisJCQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwogCQkJCQlpZiAobGVuICsgMSArIHRhaWxsZW4gPj0gTUFYUEFUSExFTikKIAkJCQkJCWNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLwogCQkJCQlzdHJjcHkobmFtZWJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcodikpOwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDkxOWFmNGMuLjFkYTU0MzAgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTg5LDcgKzg5LDcgQEAKIGF1dGhvcnMsIHRyYW5zbGF0b3JzLCBhbmQgcGVvcGxlIHdpdGggc3BlY2lhbCBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cy4KIAogVW5mb3J0dW5hdGVseSwgbmV3LXN0eWxlIGNsYXNzZXMgKG5ldyBpbiBQeXRob24gMi4yKSBoYXZlIG5vdCB5ZXQgYmVlbgotaW50ZWdyYXRlZCBpbnRvIFB5dGhvbidzIHN0YW5kYXJkIGRvY3VtZW50aW9uLiAgQSBjb2xsZWN0aW9uIG9mCitpbnRlZ3JhdGVkIGludG8gUHl0aG9uJ3Mgc3RhbmRhcmQgZG9jdW1lbnRhdGlvbi4gIEEgY29sbGVjdGlvbiBvZgogcG9pbnRlcnMgdG8gd2hhdCBoYXMgYmVlbiB3cml0dGVuIGlzIGF0OgogCiAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9uZXdzdHlsZS5odG1sCkBAIC0xMTQsNyArMTE0LDcgQEAKIG1haWxpbmcgbGlzdHM6IHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L2xpc3RzLmh0bWwgZm9yIGFuCiBvdmVydmlldyBvZiB0aGVzZSBhbmQgbWFueSBvdGhlciBQeXRob24tcmVsYXRlZCBtYWlsaW5nIGxpc3RzLgogCi1BcmNoaXZlcyBhcmUgYWNjZXNzaWJsZSB2aWEgdGhlIEdvb2dsZSBHcm91cHMgdXNlbmV0IGFyY2hpdmU7IHNlZQorQXJjaGl2ZXMgYXJlIGFjY2Vzc2libGUgdmlhIHRoZSBHb29nbGUgR3JvdXBzIFVzZW5ldCBhcmNoaXZlOyBzZWUKIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS8uICBUaGUgbWFpbGluZyBsaXN0cyBhcmUgYWxzbyBhcmNoaXZlZCwgc2VlCiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L2xpc3RzLmh0bWwgZm9yIGRldGFpbHMuCiAKQEAgLTI1NywyOCArMjU3LDI4IEBACiBhYm92ZSkgc28gd2UgY2FuIHJlbW92ZSB0aGVtISkKIAogVW5peCBwbGF0Zm9ybXM6IElmIHlvdXIgdmVuZG9yIHN0aWxsIHNoaXBzIChhbmQgeW91IHN0aWxsIHVzZSkgQmVya2VsZXkgREIKLQkxLjg1IHlvdSB3aWxsIG5lZWQgdG8gZWRpdCBNb2R1bGVzL1NldHVwIHRvIGJ1aWxkIHRoZSBic2RkYjE4NQotCW1vZHVsZSBhbmQgYWRkIGEgbGluZSB0byBzaXRlY3VzdG9taXplLnB5IHdoaWNoIG1ha2VzIGl0IHRoZQotCWRlZmF1bHQuICBJbiBNb2R1bGVzL1NldHVwIGEgbGluZSBsaWtlCisgICAgICAgIDEuODUgeW91IHdpbGwgbmVlZCB0byBlZGl0IE1vZHVsZXMvU2V0dXAgdG8gYnVpbGQgdGhlIGJzZGRiMTg1CisgICAgICAgIG1vZHVsZSBhbmQgYWRkIGEgbGluZSB0byBzaXRlY3VzdG9taXplLnB5IHdoaWNoIG1ha2VzIGl0IHRoZQorICAgICAgICBkZWZhdWx0LiAgSW4gTW9kdWxlcy9TZXR1cCBhIGxpbmUgbGlrZQogCi0JICAgIGJzZGRiMTg1IGJzZGRibW9kdWxlLmMKKyAgICAgICAgICAgIGJzZGRiMTg1IGJzZGRibW9kdWxlLmMKIAotCXNob3VsZCB3b3JrLiAgKFlvdSBtYXkgbmVlZCB0byBhZGQgLUksIC1MIG9yIC1sIGZsYWdzIHRvIGRpcmVjdCB0aGUKLQljb21waWxlciBhbmQgbGlua2VyIHRvIHlvdXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzLikKKyAgICAgICAgc2hvdWxkIHdvcmsuICAoWW91IG1heSBuZWVkIHRvIGFkZCAtSSwgLUwgb3IgLWwgZmxhZ3MgdG8gZGlyZWN0IHRoZQorICAgICAgICBjb21waWxlciBhbmQgbGlua2VyIHRvIHlvdXIgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzLikKIAogWFhYIEkgdGhpbmsgdGhpcyBuZXh0IGJpdCBpcyBvdXQgb2YgZGF0ZToKIAogNjQtYml0IHBsYXRmb3JtczogVGhlIG1vZHVsZXMgYXVkaW9vcCwgaW1hZ2VvcCBhbmQgcmdiaW1nIGRvbid0IHdvcmsuCi0JVGhlIHNldHVwLnB5IHNjcmlwdCBkaXNhYmxlcyB0aGVtIG9uIDY0LWJpdCBpbnN0YWxsYXRpb25zLgotCURvbid0IHRyeSB0byBlbmFibGUgdGhlbSBpbiB0aGUgTW9kdWxlcy9TZXR1cCBmaWxlLiAgVGhleQotCWNvbnRhaW4gY29kZSB0aGF0IGlzIHF1aXRlIHdvcmRzaXplIHNlbnNpdGl2ZS4gIChJZiB5b3UgaGF2ZSBhCi0JZml4LCBsZXQgdXMga25vdyEpCisgICAgICAgIFRoZSBzZXR1cC5weSBzY3JpcHQgZGlzYWJsZXMgdGhlbSBvbiA2NC1iaXQgaW5zdGFsbGF0aW9ucy4KKyAgICAgICAgRG9uJ3QgdHJ5IHRvIGVuYWJsZSB0aGVtIGluIHRoZSBNb2R1bGVzL1NldHVwIGZpbGUuICBUaGV5CisgICAgICAgIGNvbnRhaW4gY29kZSB0aGF0IGlzIHF1aXRlIHdvcmRzaXplIHNlbnNpdGl2ZS4gIChJZiB5b3UgaGF2ZSBhCisgICAgICAgIGZpeCwgbGV0IHVzIGtub3chKQogCiBTb2xhcmlzOiBXaGVuIHVzaW5nIFN1bidzIEMgY29tcGlsZXIgd2l0aCB0aHJlYWRzLCBhdCBsZWFzdCBvbiBTb2xhcmlzCi0JMi41LjEsIHlvdSBuZWVkIHRvIGFkZCB0aGUgIi1tdCIgY29tcGlsZXIgb3B0aW9uICh0aGUgc2ltcGxlc3QKLQl3YXkgaXMgcHJvYmFibHkgdG8gc3BlY2lmeSB0aGUgY29tcGlsZXIgd2l0aCB0aGlzIG9wdGlvbiBhcwotCXRoZSAiQ0MiIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyB0aGUgY29uZmlndXJlCi0Jc2NyaXB0KS4KKyAgICAgICAgMi41LjEsIHlvdSBuZWVkIHRvIGFkZCB0aGUgIi1tdCIgY29tcGlsZXIgb3B0aW9uICh0aGUgc2ltcGxlc3QKKyAgICAgICAgd2F5IGlzIHByb2JhYmx5IHRvIHNwZWNpZnkgdGhlIGNvbXBpbGVyIHdpdGggdGhpcyBvcHRpb24gYXMKKyAgICAgICAgdGhlICJDQyIgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIHRoZSBjb25maWd1cmUKKyAgICAgICAgc2NyaXB0KS4KIAogICAgICAgICBXaGVuIHVzaW5nIEdDQyBvbiBTb2xhcmlzLCBiZXdhcmUgb2YgYmludXRpbHMgMi4xMyBvciBHQ0MKICAgICAgICAgdmVyc2lvbnMgYnVpbHQgdXNpbmcgaXQuICBUaGlzIG1pc3Rha2VubHkgZW5hYmxlcyB0aGUKQEAgLTI5MCwxMzYgKzI5MCwxMzYgQEAKICAgICAgICAgYW5kIDIuOCwgYnV0IG1heSBhbHNvIGFmZmVjdCBlYXJsaWVyIGFuZCBsYXRlciB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgT1MuCiAKLQlXaGVuIHRoZSBkeW5hbWljIGxvYWRlciBjb21wbGFpbnMgYWJvdXQgZXJyb3JzIGZpbmRpbmcgc2hhcmVkCi0JbGlicmFyaWVzLCBzdWNoIGFzCisgICAgICAgIFdoZW4gdGhlIGR5bmFtaWMgbG9hZGVyIGNvbXBsYWlucyBhYm91dCBlcnJvcnMgZmluZGluZyBzaGFyZWQKKyAgICAgICAgbGlicmFyaWVzLCBzdWNoIGFzCiAKLQlsZC5zby4xOiAuL3B5dGhvbjogZmF0YWw6IGxpYnN0ZGMrKy5zby41OiBvcGVuIGZhaWxlZDoKLQlObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgICAgICAgIGxkLnNvLjE6IC4vcHl0aG9uOiBmYXRhbDogbGlic3RkYysrLnNvLjU6IG9wZW4gZmFpbGVkOgorICAgICAgICBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAKLQl5b3UgbmVlZCB0byBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyeSBpcyBhdmFpbGFibGUgb24KLQl5b3VyIHN5c3RlbS4gVGhlbiwgeW91IG5lZWQgdG8gaW5zdHJ1Y3QgdGhlIGR5bmFtaWMgbG9hZGVyIGhvdwotCXRvIGZpbmQgaXQuIFlvdSBjYW4gY2hvb3NlIGFueSBvZiB0aGUgZm9sbG93aW5nIHN0cmF0ZWdpZXM6CisgICAgICAgIHlvdSBuZWVkIHRvIGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBvbgorICAgICAgICB5b3VyIHN5c3RlbS4gVGhlbiwgeW91IG5lZWQgdG8gaW5zdHJ1Y3QgdGhlIGR5bmFtaWMgbG9hZGVyIGhvdworICAgICAgICB0byBmaW5kIGl0LiBZb3UgY2FuIGNob29zZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOgogCi0JMS4gV2hlbiBjb21waWxpbmcgUHl0aG9uLCBzZXQgTERfUlVOX1BBVEggdG8gdGhlIGRpcmVjdG9yaWVzCi0JICAgY29udGFpbmluZyBtaXNzaW5nIGxpYnJhcmllcy4KLQkyLiBXaGVuIHJ1bm5pbmcgUHl0aG9uLCBzZXQgTERfTElCUkFSWV9QQVRIIHRvIHRoZXNlIGRpcmVjdG9yaWVzLgotCTMuIFVzZSBjcmxlKDgpIHRvIGV4dGVuZCB0aGUgc2VhcmNoIHBhdGggb2YgdGhlIGxvYWRlci4KLQk0LiBNb2RpZnkgdGhlIGluc3RhbGxlZCBHQ0Mgc3BlY3MgZmlsZSwgYWRkaW5nIC1SIG9wdGlvbnMgaW50byB0aGUKLQkgICAqbGluazogc2VjdGlvbi4KKyAgICAgICAgMS4gV2hlbiBjb21waWxpbmcgUHl0aG9uLCBzZXQgTERfUlVOX1BBVEggdG8gdGhlIGRpcmVjdG9yaWVzCisgICAgICAgICAgIGNvbnRhaW5pbmcgbWlzc2luZyBsaWJyYXJpZXMuCisgICAgICAgIDIuIFdoZW4gcnVubmluZyBQeXRob24sIHNldCBMRF9MSUJSQVJZX1BBVEggdG8gdGhlc2UgZGlyZWN0b3JpZXMuCisgICAgICAgIDMuIFVzZSBjcmxlKDgpIHRvIGV4dGVuZCB0aGUgc2VhcmNoIHBhdGggb2YgdGhlIGxvYWRlci4KKyAgICAgICAgNC4gTW9kaWZ5IHRoZSBpbnN0YWxsZWQgR0NDIHNwZWNzIGZpbGUsIGFkZGluZyAtUiBvcHRpb25zIGludG8gdGhlCisgICAgICAgICAgICpsaW5rOiBzZWN0aW9uLgogCiAgICAgICAgIFRoZSBjb21wbGV4IG9iamVjdCBmYWlscyB0byBjb21waWxlIG9uIFNvbGFyaXMgMTAgd2l0aCBnY2MgMy40IChhdAogICAgICAgICBsZWFzdCB1cCB0byAzLjQuMykuICBUbyB3b3JrIGFyb3VuZCBpdCwgZGVmaW5lIFB5X0hVR0VfVkFMIGFzCiAgICAgICAgIEhVR0VfVkFMKCksIGUuZy46CiAKICAgICAgICAgICBtYWtlIENQUEZMQUdTPSctRCJQeV9IVUdFX1ZBTD1IVUdFX1ZBTCgpIiAtSS4gLUkkKHNyY2RpcikvSW5jbHVkZScKLQkgIC4vcHl0aG9uIHNldHVwLnB5IENQUEZMQUdTPSctRCJQeV9IVUdFX1ZBTD1IVUdFX1ZBTCgpIicKKyAgICAgICAgICAuL3B5dGhvbiBzZXR1cC5weSBDUFBGTEFHUz0nLUQiUHlfSFVHRV9WQUw9SFVHRV9WQUwoKSInCiAKIExpbnV4OiAgQSBwcm9ibGVtIHdpdGggdGhyZWFkcyBhbmQgZm9yaygpIHdhcyB0cmFja2VkIGRvd24gdG8gYSBidWcgaW4KLQl0aGUgcHRocmVhZHMgY29kZSBpbiBnbGliYyB2ZXJzaW9uIDIuMC41OyBnbGliYyB2ZXJzaW9uIDIuMC43Ci0Jc29sdmVzIHRoZSBwcm9ibGVtLiAgVGhpcyBjYXVzZXMgdGhlIHBvcGVuMiB0ZXN0IHRvIGZhaWw7Ci0JcHJvYmxlbSBhbmQgc29sdXRpb24gcmVwb3J0ZWQgYnkgUGFibG8gQmxleWVyLgorICAgICAgICB0aGUgcHRocmVhZHMgY29kZSBpbiBnbGliYyB2ZXJzaW9uIDIuMC41OyBnbGliYyB2ZXJzaW9uIDIuMC43CisgICAgICAgIHNvbHZlcyB0aGUgcHJvYmxlbS4gIFRoaXMgY2F1c2VzIHRoZSBwb3BlbjIgdGVzdCB0byBmYWlsOworICAgICAgICBwcm9ibGVtIGFuZCBzb2x1dGlvbiByZXBvcnRlZCBieSBQYWJsbyBCbGV5ZXIuCiAKIFJlZCBIYXQgTGludXg6IFJlZCBIYXQgOSBidWlsdCBQeXRob24yLjIgaW4gVUNTLTQgbW9kZSBhbmQgaGFja2VkCi0JVGNsIHRvIHN1cHBvcnQgaXQuIFRvIGNvbXBpbGUgUHl0aG9uMi4zIHdpdGggVGtpbnRlciwgeW91IHdpbGwKLQluZWVkIHRvIHBhc3MgLS1lbmFibGUtdW5pY29kZT11Y3M0IGZsYWcgdG8gLi9jb25maWd1cmUuCisgICAgICAgIFRjbCB0byBzdXBwb3J0IGl0LiBUbyBjb21waWxlIFB5dGhvbjIuMyB3aXRoIFRraW50ZXIsIHlvdSB3aWxsCisgICAgICAgIG5lZWQgdG8gcGFzcyAtLWVuYWJsZS11bmljb2RlPXVjczQgZmxhZyB0byAuL2NvbmZpZ3VyZS4KIAotCVRoZXJlJ3MgYW4gZXhlY3V0YWJsZSAvdXNyL2Jpbi9weXRob24gd2hpY2ggaXMgUHl0aG9uCi0JMS41LjIgb24gbW9zdCBvbGRlciBSZWQgSGF0IGluc3RhbGxhdGlvbnM7IHNldmVyYWwga2V5IFJlZCBIYXQgdG9vbHMKLQlyZXF1aXJlIHRoaXMgdmVyc2lvbi4gIFB5dGhvbiAyLjEueCBtYXkgYmUgaW5zdGFsbGVkIGFzCi0JL3Vzci9iaW4vcHl0aG9uMi4gIFRoZSBNYWtlZmlsZSBpbnN0YWxscyBQeXRob24gYXMKLQkvdXNyL2xvY2FsL2Jpbi9weXRob24sIHdoaWNoIG1heSBvciBtYXkgbm90IHRha2UgcHJlY2VkZW5jZQotCW92ZXIgL3Vzci9iaW4vcHl0aG9uLCBkZXBlbmRpbmcgb24gaG93IHlvdSBoYXZlIHNldCB1cCAkUEFUSC4KKyAgICAgICAgVGhlcmUncyBhbiBleGVjdXRhYmxlIC91c3IvYmluL3B5dGhvbiB3aGljaCBpcyBQeXRob24KKyAgICAgICAgMS41LjIgb24gbW9zdCBvbGRlciBSZWQgSGF0IGluc3RhbGxhdGlvbnM7IHNldmVyYWwga2V5IFJlZCBIYXQgdG9vbHMKKyAgICAgICAgcmVxdWlyZSB0aGlzIHZlcnNpb24uICBQeXRob24gMi4xLnggbWF5IGJlIGluc3RhbGxlZCBhcworICAgICAgICAvdXNyL2Jpbi9weXRob24yLiAgVGhlIE1ha2VmaWxlIGluc3RhbGxzIFB5dGhvbiBhcworICAgICAgICAvdXNyL2xvY2FsL2Jpbi9weXRob24sIHdoaWNoIG1heSBvciBtYXkgbm90IHRha2UgcHJlY2VkZW5jZQorICAgICAgICBvdmVyIC91c3IvYmluL3B5dGhvbiwgZGVwZW5kaW5nIG9uIGhvdyB5b3UgaGF2ZSBzZXQgdXAgJFBBVEguCiAKIEZyZWVCU0QgMy54IGFuZCBwcm9iYWJseSBwbGF0Zm9ybXMgd2l0aCBOQ3Vyc2VzIHRoYXQgdXNlIGxpYm15dGluZm8gb3IKLQlzaW1pbGFyOiBXaGVuIHVzaW5nIGN1cnNlc21vZHVsZSwgdGhlIGxpbmtpbmcgaXMgbm90IGRvbmUgaW4KLQl0aGUgY29ycmVjdCBvcmRlciB3aXRoIHRoZSBkZWZhdWx0cy4gIFJlbW92ZSAiLWx0ZXJtY2FwIiBmcm9tCi0JdGhlIHJlYWRsaW5lIGVudHJ5IGluIFNldHVwLCBhbmQgdXNlIGFzIGN1cnNlcyBlbnRyeTogImN1cnNlcwotCWN1cnNlc21vZHVsZS5jIC1sbXl0aW5mbyAtbG5jdXJzZXMgLWx0ZXJtY2FwIiAtICJteXRpbmZvIiAoc28KLQljYWxsZWQgb24gRnJlZUJTRCkgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBhdXhpbGlhcnkgbGlicmFyeQotCXJlcXVpcmVkIG9uIHlvdXIgcGxhdGZvcm0uICBOb3JtYWxseSwgaXQgd291bGQgYmUgbGlua2VkCi0JYXV0b21hdGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgc2ltaWxhcjogV2hlbiB1c2luZyBjdXJzZXNtb2R1bGUsIHRoZSBsaW5raW5nIGlzIG5vdCBkb25lIGluCisgICAgICAgIHRoZSBjb3JyZWN0IG9yZGVyIHdpdGggdGhlIGRlZmF1bHRzLiAgUmVtb3ZlICItbHRlcm1jYXAiIGZyb20KKyAgICAgICAgdGhlIHJlYWRsaW5lIGVudHJ5IGluIFNldHVwLCBhbmQgdXNlIGFzIGN1cnNlcyBlbnRyeTogImN1cnNlcworICAgICAgICBjdXJzZXNtb2R1bGUuYyAtbG15dGluZm8gLWxuY3Vyc2VzIC1sdGVybWNhcCIgLSAibXl0aW5mbyIgKHNvCisgICAgICAgIGNhbGxlZCBvbiBGcmVlQlNEKSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGF1eGlsaWFyeSBsaWJyYXJ5CisgICAgICAgIHJlcXVpcmVkIG9uIHlvdXIgcGxhdGZvcm0uICBOb3JtYWxseSwgaXQgd291bGQgYmUgbGlua2VkCisgICAgICAgIGF1dG9tYXRpY2FsbHksIGJ1dCBub3QgbmVjZXNzYXJpbHkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCiAKLUJTREk6CUJTREkgdmVyc2lvbnMgYmVmb3JlIDQuMSBoYXZlIGtub3duIHByb2JsZW1zIHdpdGggdGhyZWFkcywKLQl3aGljaCBjYW4gY2F1c2Ugc3RyYW5nZSBlcnJvcnMgaW4gYSBudW1iZXIgb2YgbW9kdWxlcyAoZm9yCi0JaW5zdGFuY2UsIHRoZSAndGVzdF9zaWduYWwnIHRlc3Qgc2NyaXB0IHdpbGwgaGFuZyBmb3JldmVyLikKLQlUdXJuaW5nIG9mZiB0aHJlYWRzICh3aXRoIC0td2l0aC10aHJlYWRzPW5vKSBvciB1cGdyYWRpbmcgdG8KLQlCU0RJIDQuMSBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorQlNESTogICBCU0RJIHZlcnNpb25zIGJlZm9yZSA0LjEgaGF2ZSBrbm93biBwcm9ibGVtcyB3aXRoIHRocmVhZHMsCisgICAgICAgIHdoaWNoIGNhbiBjYXVzZSBzdHJhbmdlIGVycm9ycyBpbiBhIG51bWJlciBvZiBtb2R1bGVzIChmb3IKKyAgICAgICAgaW5zdGFuY2UsIHRoZSAndGVzdF9zaWduYWwnIHRlc3Qgc2NyaXB0IHdpbGwgaGFuZyBmb3JldmVyLikKKyAgICAgICAgVHVybmluZyBvZmYgdGhyZWFkcyAod2l0aCAtLXdpdGgtdGhyZWFkcz1ubykgb3IgdXBncmFkaW5nIHRvCisgICAgICAgIEJTREkgNC4xIHNvbHZlcyB0aGlzIHByb2JsZW0uCiAKIERFQyBVbml4OiBSdW4gY29uZmlndXJlIHdpdGggLS13aXRoLWRlYy10aHJlYWRzLCBvciB3aXRoCi0JLS13aXRoLXRocmVhZHM9bm8gaWYgbm8gdGhyZWFkcyBhcmUgZGVzaXJlZCAodGhyZWFkcyBhcmUgb24gYnkKLQlkZWZhdWx0KS4gIFdoZW4gdXNpbmcgR0NDLCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYW4gaW50ZXJuYWwKLQljb21waWxlciBlcnJvciBpZiBvcHRpbWl6YXRpb24gaXMgdXNlZC4gIFRoaXMgd2FzIHJlcG9ydGVkIGZvcgotCUdDQyAyLjcuMi4zIG9uIHNlbGVjdG1vZHVsZS5jLiAgTWFudWFsbHkgY29tcGlsZSB0aGUgYWZmZWN0ZWQKLQlmaWxlIHdpdGhvdXQgb3B0aW1pemF0aW9uIHRvIHNvbHZlIHRoZSBwcm9ibGVtLgorICAgICAgICAtLXdpdGgtdGhyZWFkcz1ubyBpZiBubyB0aHJlYWRzIGFyZSBkZXNpcmVkICh0aHJlYWRzIGFyZSBvbiBieQorICAgICAgICBkZWZhdWx0KS4gIFdoZW4gdXNpbmcgR0NDLCBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYW4gaW50ZXJuYWwKKyAgICAgICAgY29tcGlsZXIgZXJyb3IgaWYgb3B0aW1pemF0aW9uIGlzIHVzZWQuICBUaGlzIHdhcyByZXBvcnRlZCBmb3IKKyAgICAgICAgR0NDIDIuNy4yLjMgb24gc2VsZWN0bW9kdWxlLmMuICBNYW51YWxseSBjb21waWxlIHRoZSBhZmZlY3RlZAorICAgICAgICBmaWxlIHdpdGhvdXQgb3B0aW1pemF0aW9uIHRvIHNvbHZlIHRoZSBwcm9ibGVtLgogCiBERUMgVWx0cml4OiBjb21waWxlIHdpdGggR0NDIHRvIGF2b2lkIGJ1Z3MgaW4gdGhlIG5hdGl2ZSBjb21waWxlciwKLQlhbmQgcGFzcyBTSEVMTD0vYmluL3NoNSB0byBNYWtlIHdoZW4gaW5zdGFsbGluZy4KKyAgICAgICAgYW5kIHBhc3MgU0hFTEw9L2Jpbi9zaDUgdG8gTWFrZSB3aGVuIGluc3RhbGxpbmcuCiAKLUFJWDoJQSBjb21wbGV0ZSBvdmVyaGF1bCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBpcyBub3cgaW4KLQlwbGFjZS4gIFNlZSBNaXNjL0FJWC1OT1RFUyBmb3Igc29tZSBub3RlcyBvbiBob3cgaXQncyBkb25lLgotCShUaGUgb3B0aW1pemVyIGJ1ZyByZXBvcnRlZCBhdCB0aGlzIHBsYWNlIGluIHByZXZpb3VzIHJlbGVhc2VzCi0JaGFzIGJlZW4gd29ya2VkIGFyb3VuZCBieSBhIG1pbmltYWwgY29kZSBjaGFuZ2UuKSBJZiB5b3UgZ2V0Ci0JZXJyb3JzIGFib3V0IHB0aHJlYWRfKiBmdW5jdGlvbnMsIGR1cmluZyBjb21waWxlIG9yIGR1cmluZwotCXRlc3RpbmcsIHRyeSBzZXR0aW5nIENDIHRvIGEgdGhyZWFkLXNhZmUgKHJlZW50cmFudCkgY29tcGlsZXIsCi0JbGlrZSAiY2NfciIuICBGb3IgZnVsbCBDKysgbW9kdWxlIHN1cHBvcnQsIHNldCBDQz0ieGxDX3IiIChvcgotCUNDPSJ4bEMiIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQpLgorQUlYOiAgICBBIGNvbXBsZXRlIG92ZXJoYXVsIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGlzIG5vdyBpbgorICAgICAgICBwbGFjZS4gIFNlZSBNaXNjL0FJWC1OT1RFUyBmb3Igc29tZSBub3RlcyBvbiBob3cgaXQncyBkb25lLgorICAgICAgICAoVGhlIG9wdGltaXplciBidWcgcmVwb3J0ZWQgYXQgdGhpcyBwbGFjZSBpbiBwcmV2aW91cyByZWxlYXNlcworICAgICAgICBoYXMgYmVlbiB3b3JrZWQgYXJvdW5kIGJ5IGEgbWluaW1hbCBjb2RlIGNoYW5nZS4pIElmIHlvdSBnZXQKKyAgICAgICAgZXJyb3JzIGFib3V0IHB0aHJlYWRfKiBmdW5jdGlvbnMsIGR1cmluZyBjb21waWxlIG9yIGR1cmluZworICAgICAgICB0ZXN0aW5nLCB0cnkgc2V0dGluZyBDQyB0byBhIHRocmVhZC1zYWZlIChyZWVudHJhbnQpIGNvbXBpbGVyLAorICAgICAgICBsaWtlICJjY19yIi4gIEZvciBmdWxsIEMrKyBtb2R1bGUgc3VwcG9ydCwgc2V0IENDPSJ4bENfciIgKG9yCisgICAgICAgIENDPSJ4bEMiIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQpLgogCiBBSVggNS4zOiBUbyBidWlsZCBhIDY0LWJpdCB2ZXJzaW9uIHdpdGggSUJNJ3MgY29tcGlsZXIsIEkgdXNlZCB0aGUKICAgICAgICAgZm9sbG93aW5nOgogCiAgICAgICAgIGV4cG9ydCBQQVRIPS91c3IvYmluOi91c3IvdmFjcHAvYmluCi0JLi9jb25maWd1cmUgLS13aXRoLWdjYz0ieGxjX3IgLXE2NCIgLS13aXRoLWN4eD0ieGxDX3IgLXE2NCIgXAorICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtZ2NjPSJ4bGNfciAtcTY0IiAtLXdpdGgtY3h4PSJ4bENfciAtcTY0IiBcCiAgICAgICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1pcHY2IEFSPSJhciAtWDY0IgotCW1ha2UKKyAgICAgICAgbWFrZQogCiBIUC1VWDogIFdoZW4gdXNpbmcgdGhyZWFkaW5nLCB5b3UgbWF5IGhhdmUgdG8gYWRkIC1EX1JFRU5UUkFOVCB0byB0aGUKLQlPUFQgdmFyaWFibGUgaW4gdGhlIHRvcC1sZXZlbCBNYWtlZmlsZTsgcmVwb3J0ZWQgYnkgUGF0IEtuaWdodCwKLQl0aGlzIHNlZW1zIHRvIG1ha2UgYSBkaWZmZXJlbmNlIChhdCBsZWFzdCBmb3IgSFAtVVggMTAuMjApCi0JZXZlbiB0aG91Z2ggcHljb25maWcuaCBkZWZpbmVzIGl0LiBUaGlzIHNlZW1zIHVubmVjZXNzYXJ5IHdoZW4KLQl1c2luZyBIUC9VWCAxMSBhbmQgbGF0ZXIgLSB0aHJlYWRpbmcgc2VlbXMgdG8gd29yayAib3V0IG9mIHRoZQotCWJveCIuCisgICAgICAgIE9QVCB2YXJpYWJsZSBpbiB0aGUgdG9wLWxldmVsIE1ha2VmaWxlOyByZXBvcnRlZCBieSBQYXQgS25pZ2h0LAorICAgICAgICB0aGlzIHNlZW1zIHRvIG1ha2UgYSBkaWZmZXJlbmNlIChhdCBsZWFzdCBmb3IgSFAtVVggMTAuMjApCisgICAgICAgIGV2ZW4gdGhvdWdoIHB5Y29uZmlnLmggZGVmaW5lcyBpdC4gVGhpcyBzZWVtcyB1bm5lY2Vzc2FyeSB3aGVuCisgICAgICAgIHVzaW5nIEhQL1VYIDExIGFuZCBsYXRlciAtIHRocmVhZGluZyBzZWVtcyB0byB3b3JrICJvdXQgb2YgdGhlCisgICAgICAgIGJveCIuCiAKIEhQLVVYIGlhNjQ6IFdoZW4gYnVpbGRpbmcgb24gdGhlIGlhNjQgKEl0YW5pdW0pIHBsYXRmb3JtIHVzaW5nIEhQJ3MKLQljb21waWxlciwgc29tZSBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHRoZSBjb21waWxlcidzCi0Jb3B0aW1pc2VyIHByb2R1Y2VzIGEgY29tcGxldGVseSBicm9rZW4gdmVyc2lvbiBvZiBweXRob24KLQkoc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi84MTQ5NzYpLiBUbyB3b3JrIGFyb3VuZCB0aGlzLAotCWVkaXQgdGhlIE1ha2VmaWxlIGFuZCByZW1vdmUgLU8gZnJvbSB0aGUgT1BUIGxpbmUuCisgICAgICAgIGNvbXBpbGVyLCBzb21lIGV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgdGhlIGNvbXBpbGVyJ3MKKyAgICAgICAgb3B0aW1pc2VyIHByb2R1Y2VzIGEgY29tcGxldGVseSBicm9rZW4gdmVyc2lvbiBvZiBweXRob24KKyAgICAgICAgKHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODE0OTc2KS4gVG8gd29yayBhcm91bmQgdGhpcywKKyAgICAgICAgZWRpdCB0aGUgTWFrZWZpbGUgYW5kIHJlbW92ZSAtTyBmcm9tIHRoZSBPUFQgbGluZS4KIAotCVRvIGJ1aWxkIGEgNjQtYml0IGV4ZWN1dGFibGUgb24gYW4gSXRhbml1bSAyIHN5c3RlbSB1c2luZyBIUCdzCi0JY29tcGlsZXIsIHVzZSB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CisgICAgICAgIFRvIGJ1aWxkIGEgNjQtYml0IGV4ZWN1dGFibGUgb24gYW4gSXRhbml1bSAyIHN5c3RlbSB1c2luZyBIUCdzCisgICAgICAgIGNvbXBpbGVyLCB1c2UgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzOgogCi0JCUNDPWNjCi0JCUNYWD1hQ0MKLQkJQkFTRUNGTEFHUz0iK0RENjQiCi0JCUxERkxBR1M9IitERDY0IC1seG5ldCIKKyAgICAgICAgICAgICAgICBDQz1jYworICAgICAgICAgICAgICAgIENYWD1hQ0MKKyAgICAgICAgICAgICAgICBCQVNFQ0ZMQUdTPSIrREQ2NCIKKyAgICAgICAgICAgICAgICBMREZMQUdTPSIrREQ2NCAtbHhuZXQiCiAKLQlhbmQgY2FsbCBjb25maWd1cmUgYXM6CisgICAgICAgIGFuZCBjYWxsIGNvbmZpZ3VyZSBhczoKIAotCQkuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtZ2NjCisgICAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LWdjYwogCi0JdGhlbiAqdW5zZXQqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYWdhaW4gYmVmb3JlIHJ1bm5pbmcKLQltYWtlLiAgKEF0IGxlYXN0IG9uZSBvZiB0aGVzZSBmbGFncyBjYXVzZXMgdGhlIGJ1aWxkIHRvIGZhaWwKLQlpZiBpdCByZW1haW5zIHNldC4pICBZb3Ugc3RpbGwgaGF2ZSB0byBlZGl0IHRoZSBNYWtlZmlsZSBhbmQKLQlyZW1vdmUgLU8gZnJvbSB0aGUgT1BUIGxpbmUuCisgICAgICAgIHRoZW4gKnVuc2V0KiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFnYWluIGJlZm9yZSBydW5uaW5nCisgICAgICAgIG1ha2UuICAoQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGZsYWdzIGNhdXNlcyB0aGUgYnVpbGQgdG8gZmFpbAorICAgICAgICBpZiBpdCByZW1haW5zIHNldC4pICBZb3Ugc3RpbGwgaGF2ZSB0byBlZGl0IHRoZSBNYWtlZmlsZSBhbmQKKyAgICAgICAgcmVtb3ZlIC1PIGZyb20gdGhlIE9QVCBsaW5lLgogCiBIUCBQQS1SSVNDIDIuMDogQSByZWNlbnQgYnVnIHJlcG9ydCAoaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzU0NjExNykKLQlzdWdnZXN0cyB0aGF0IHRoZSBDIGNvbXBpbGVyIGluIHRoaXMgNjQtYml0IHN5c3RlbSBoYXMgYnVncwotCWluIHRoZSBvcHRpbWl6ZXIgdGhhdCBicmVhayBQeXRob24uICBDb21waWxpbmcgd2l0aG91dAotCW9wdGltaXphdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW1zLgorICAgICAgICBzdWdnZXN0cyB0aGF0IHRoZSBDIGNvbXBpbGVyIGluIHRoaXMgNjQtYml0IHN5c3RlbSBoYXMgYnVncworICAgICAgICBpbiB0aGUgb3B0aW1pemVyIHRoYXQgYnJlYWsgUHl0aG9uLiAgQ29tcGlsaW5nIHdpdGhvdXQKKyAgICAgICAgb3B0aW1pemF0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbXMuCiAKLVNDTzoJVGhlIGZvbGxvd2luZyBhcHBseSB0byBTQ08gMyBvbmx5OyBQeXRob24gYnVpbGRzIG91dCBvZiB0aGUgYm94Ci0Jb24gU0NPIDUgKG9yIHNvIHdlJ3ZlIGhlYXJkKS4KK1NDTzogICAgVGhlIGZvbGxvd2luZyBhcHBseSB0byBTQ08gMyBvbmx5OyBQeXRob24gYnVpbGRzIG91dCBvZiB0aGUgYm94CisgICAgICAgIG9uIFNDTyA1IChvciBzbyB3ZSd2ZSBoZWFyZCkuCiAKLQkxKSBFdmVyeXRoaW5nIHdvcmtzIG11Y2ggYmV0dGVyIGlmIHlvdSBhZGQgLVVfX1NURENfXyB0byB0aGUKLQlkZWZzLiAgVGhpcyBpcyBiZWNhdXNlIGFsbCB0aGUgU0NPIGhlYWRlciBmaWxlcyBhcmUgYnJva2VuLgotCUFueXRoaW5nIHRoYXQgaXNuJ3QgbWVudGlvbmVkIGluIHRoZSBDIHN0YW5kYXJkIGlzCi0JY29uZGl0aW9uYWxseSBleGNsdWRlZCB3aGVuIF9fU1REQ19fIGlzIGRlZmluZWQuCisgICAgICAgIDEpIEV2ZXJ5dGhpbmcgd29ya3MgbXVjaCBiZXR0ZXIgaWYgeW91IGFkZCAtVV9fU1REQ19fIHRvIHRoZQorICAgICAgICBkZWZzLiAgVGhpcyBpcyBiZWNhdXNlIGFsbCB0aGUgU0NPIGhlYWRlciBmaWxlcyBhcmUgYnJva2VuLgorICAgICAgICBBbnl0aGluZyB0aGF0IGlzbid0IG1lbnRpb25lZCBpbiB0aGUgQyBzdGFuZGFyZCBpcworICAgICAgICBjb25kaXRpb25hbGx5IGV4Y2x1ZGVkIHdoZW4gX19TVERDX18gaXMgZGVmaW5lZC4KIAotCTIpIER1ZSB0byB0aGUgVS5TLiBleHBvcnQgcmVzdHJpY3Rpb25zLCBTQ08gYnJva2UgdGhlIGNyeXB0Ci0Jc3R1ZmYgb3V0IGludG8gYSBzZXBhcmF0ZSBsaWJyYXJ5LCBsaWJjcnlwdF9pLmEgc28gdGhlIExJQlMKLQluZWVkZWQgYmUgc2V0IHRvOgorICAgICAgICAyKSBEdWUgdG8gdGhlIFUuUy4gZXhwb3J0IHJlc3RyaWN0aW9ucywgU0NPIGJyb2tlIHRoZSBjcnlwdAorICAgICAgICBzdHVmZiBvdXQgaW50byBhIHNlcGFyYXRlIGxpYnJhcnksIGxpYmNyeXB0X2kuYSBzbyB0aGUgTElCUworICAgICAgICBuZWVkZWQgYmUgc2V0IHRvOgogCi0JCUxJQlM9JyAtbHNvY2tldCAtbGNyeXB0X2knCisgICAgICAgICAgICAgICAgTElCUz0nIC1sc29ja2V0IC1sY3J5cHRfaScKIAogVW5peFdhcmU6IFRoZXJlIGFyZSBrbm93biBidWdzIGluIHRoZSBtYXRoIGxpYnJhcnkgb2YgdGhlIHN5c3RlbSwgYXMgd2VsbCBhcwogICAgICAgICBwcm9ibGVtcyBpbiB0aGUgaGFuZGxpbmcgb2YgdGhyZWFkcyAoY2FsbGluZyBmb3JrIGluIG9uZQpAQCAtNDI3LDYxICs0MjcsNjEgQEAKICAgICAgICAgdGVzdHMgaW52b2x2aW5nIHRocmVhZHMgd2lsbCBmYWlsIHVudGlsIHRob3NlIHByb2JsZW1zIGFyZSBmaXhlZC4KIAogU3VuT1MgNC54OiBXaGVuIHVzaW5nIHRoZSBTdW5Qcm8gQyBjb21waWxlciwgeW91IG1heSB3YW50IHRvIHVzZSB0aGUKLQknLVhhJyBvcHRpb24gaW5zdGVhZCBvZiAnLVhjJywgdG8gZW5hYmxlIHNvbWUgbmVlZGVkIG5vbi1BTlNJCi0JU3VuaXNtcy4KLQlUSElTIFNZU1RFTSBJUyBOTyBMT05HRVIgU1VQUE9SVEVELgorICAgICAgICAnLVhhJyBvcHRpb24gaW5zdGVhZCBvZiAnLVhjJywgdG8gZW5hYmxlIHNvbWUgbmVlZGVkIG5vbi1BTlNJCisgICAgICAgIFN1bmlzbXMuCisgICAgICAgIFRISVMgU1lTVEVNIElTIE5PIExPTkdFUiBTVVBQT1JURUQuCiAKIE5lWFQ6ICAgTm90IHN1cHBvcnRlZCBhbnltb3JlLiBTdGFydCB3aXRoIHRoZSBNYWNPU1gvRGFyd2luIGNvZGUgaWYgeW91Ci0Jd2FudCB0byByZXZpdmUgaXQuCisgICAgICAgIHdhbnQgdG8gcmV2aXZlIGl0LgogCi1RTlg6CUNocmlzIEhlcmJvcnRoIChjaHJpc2hAcW54LmNvbSkgd3JpdGVzOgotCWNvbmZpZ3VyZSB3b3JrcyBiZXN0IGlmIHlvdSB1c2UgR05VIGJhc2g7IGEgcG9ydCBpcyBhdmFpbGFibGUgb24KLQlmdHAucW54LmNvbSBpbiAvdXNyL2ZyZWUuICBJIHVzZWQgdGhlIGZvbGxvd2luZyBwcm9jZXNzIHRvIGJ1aWxkLAotCXRlc3QgYW5kIGluc3RhbGwgUHl0aG9uIDEuNS54IHVuZGVyIFFOWDoKK1FOWDogICAgQ2hyaXMgSGVyYm9ydGggKGNocmlzaEBxbnguY29tKSB3cml0ZXM6CisgICAgICAgIGNvbmZpZ3VyZSB3b3JrcyBiZXN0IGlmIHlvdSB1c2UgR05VIGJhc2g7IGEgcG9ydCBpcyBhdmFpbGFibGUgb24KKyAgICAgICAgZnRwLnFueC5jb20gaW4gL3Vzci9mcmVlLiAgSSB1c2VkIHRoZSBmb2xsb3dpbmcgcHJvY2VzcyB0byBidWlsZCwKKyAgICAgICAgdGVzdCBhbmQgaW5zdGFsbCBQeXRob24gMS41LnggdW5kZXIgUU5YOgogCi0JMSkgQ09ORklHX1NIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggQ0M9Y2MgUkFOTElCPTogXAotCSAgICAuL2NvbmZpZ3VyZSAtLXZlcmJvc2UgLS13aXRob3V0LWdjYyAtLXdpdGgtbGlibT0iIgorICAgICAgICAxKSBDT05GSUdfU0hFTEw9L3Vzci9sb2NhbC9iaW4vYmFzaCBDQz1jYyBSQU5MSUI9OiBcCisgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXZlcmJvc2UgLS13aXRob3V0LWdjYyAtLXdpdGgtbGlibT0iIgogCi0JMikgZWRpdCBNb2R1bGVzL1NldHVwIHRvIGFjdGl2YXRlIGV2ZXJ5dGhpbmcgdGhhdCBtYWtlcyBzZW5zZSBmb3IKLQkgICB5b3VyIHN5c3RlbS4uLiB0ZXN0ZWQgaGVyZSBhdCBRTlggd2l0aCB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisgICAgICAgIDIpIGVkaXQgTW9kdWxlcy9TZXR1cCB0byBhY3RpdmF0ZSBldmVyeXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UgZm9yCisgICAgICAgICAgIHlvdXIgc3lzdGVtLi4uIHRlc3RlZCBoZXJlIGF0IFFOWCB3aXRoIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKIAotCQlhcnJheSwgYXVkaW9vcCwgYmluYXNjaWksIGNQaWNrbGUsIGNTdHJpbmdJTywgY21hdGgsCi0JCWNyeXB0LCBjdXJzZXMsIGVycm5vLCBmY250bCwgZ2RibSwgZ3JwLCBpbWFnZW9wLAotCQlfbG9jYWxlLCBtYXRoLCBtZDUsIG5ldywgb3BlcmF0b3IsIHBhcnNlciwgcGNyZSwKLQkJcG9zaXgsIHB3ZCwgcmVhZGxpbmUsIHJlZ2V4LCByZW9wLCByZ2JpbWcsIHJvdG9yLAotCQlzZWxlY3QsIHNpZ25hbCwgc29ja2V0LCBzb3VuZGV4LCBzdHJvcCwgc3RydWN0LAotCQlzeXNsb2csIHRlcm1pb3MsIHRpbWUsIHRpbWluZywgemxpYiwgYXVkaW9vcCwgaW1hZ2VvcCwgcmdiaW1nCisgICAgICAgICAgICAgICAgYXJyYXksIGF1ZGlvb3AsIGJpbmFzY2lpLCBjUGlja2xlLCBjU3RyaW5nSU8sIGNtYXRoLAorICAgICAgICAgICAgICAgIGNyeXB0LCBjdXJzZXMsIGVycm5vLCBmY250bCwgZ2RibSwgZ3JwLCBpbWFnZW9wLAorICAgICAgICAgICAgICAgIF9sb2NhbGUsIG1hdGgsIG1kNSwgbmV3LCBvcGVyYXRvciwgcGFyc2VyLCBwY3JlLAorICAgICAgICAgICAgICAgIHBvc2l4LCBwd2QsIHJlYWRsaW5lLCByZWdleCwgcmVvcCwgcmdiaW1nLCByb3RvciwKKyAgICAgICAgICAgICAgICBzZWxlY3QsIHNpZ25hbCwgc29ja2V0LCBzb3VuZGV4LCBzdHJvcCwgc3RydWN0LAorICAgICAgICAgICAgICAgIHN5c2xvZywgdGVybWlvcywgdGltZSwgdGltaW5nLCB6bGliLCBhdWRpb29wLCBpbWFnZW9wLCByZ2JpbWcKIAotCTMpIG1ha2UgU0hFTEw9L3Vzci9sb2NhbC9iaW4vYmFzaAorICAgICAgICAzKSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2gKIAotCSAgIG9yLCBpZiB5b3UgZmVlbCB0aGUgbmVlZCBmb3Igc3BlZWQ6CisgICAgICAgICAgIG9yLCBpZiB5b3UgZmVlbCB0aGUgbmVlZCBmb3Igc3BlZWQ6CiAKLQkgICBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggT1BUPSItNSAtT2lsK25ydCIKKyAgICAgICAgICAgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIE9QVD0iLTUgLU9pbCtucnQiCiAKLQk0KSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggdGVzdAorICAgICAgICA0KSBtYWtlIFNIRUxMPS91c3IvbG9jYWwvYmluL2Jhc2ggdGVzdAogCi0JICAgVXNpbmcgR05VIHJlYWRsaW5lIDIuMiBzZWVtcyB0byBiZWhhdmUgc3RyYW5nZWx5LCBidXQgSQotCSAgIHRoaW5rIHRoYXQncyBhIHByb2JsZW0gd2l0aCBteSByZWFkbGluZSAyLjIgcG9ydC4gIDotXAorICAgICAgICAgICBVc2luZyBHTlUgcmVhZGxpbmUgMi4yIHNlZW1zIHRvIGJlaGF2ZSBzdHJhbmdlbHksIGJ1dCBJCisgICAgICAgICAgIHRoaW5rIHRoYXQncyBhIHByb2JsZW0gd2l0aCBteSByZWFkbGluZSAyLjIgcG9ydC4gIDotXAogCi0JNSkgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIGluc3RhbGwKKyAgICAgICAgNSkgbWFrZSBTSEVMTD0vdXNyL2xvY2FsL2Jpbi9iYXNoIGluc3RhbGwKIAotCUlmIHlvdSBnZXQgU0lHU0VHVnMgd2hpbGUgcnVubmluZyBQeXRob24gKEkgaGF2ZW4ndCB5ZXQsIGJ1dAotCUkndmUgb25seSBydW4gc21hbGwgcHJvZ3JhbXMgYW5kIHRoZSB0ZXN0IGNhc2VzKSwgeW91J3JlCi0JcHJvYmFibHkgcnVubmluZyBvdXQgb2Ygc3RhY2s7IHRoZSBkZWZhdWx0IDMyayBjb3VsZCBiZSBhCi0JbGl0dGxlIHRpZ2h0LiAgVG8gaW5jcmVhc2UgdGhlIHN0YWNrIHNpemUsIGVkaXQgdGhlIE1ha2VmaWxlCi0JdG8gcmVhZDogTERGTEFHUyA9IC1OIDQ4aworICAgICAgICBJZiB5b3UgZ2V0IFNJR1NFR1ZzIHdoaWxlIHJ1bm5pbmcgUHl0aG9uIChJIGhhdmVuJ3QgeWV0LCBidXQKKyAgICAgICAgSSd2ZSBvbmx5IHJ1biBzbWFsbCBwcm9ncmFtcyBhbmQgdGhlIHRlc3QgY2FzZXMpLCB5b3UncmUKKyAgICAgICAgcHJvYmFibHkgcnVubmluZyBvdXQgb2Ygc3RhY2s7IHRoZSBkZWZhdWx0IDMyayBjb3VsZCBiZSBhCisgICAgICAgIGxpdHRsZSB0aWdodC4gIFRvIGluY3JlYXNlIHRoZSBzdGFjayBzaXplLCBlZGl0IHRoZSBNYWtlZmlsZQorICAgICAgICB0byByZWFkOiBMREZMQUdTID0gLU4gNDhrCiAKLUJlT1M6CVNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIG5vdGVzIGFib3V0IGNvbXBpbGluZy9pbnN0YWxsaW5nCi0JUHl0aG9uIG9uIEJlT1MgUjMgb3IgbGF0ZXIuICBOb3RlIHRoYXQgb25seSB0aGUgUG93ZXJQQwotCXBsYXRmb3JtIGlzIHN1cHBvcnRlZCBmb3IgUjM7IGJvdGggUG93ZXJQQyBhbmQgeDg2IGFyZQotCXN1cHBvcnRlZCBmb3IgUjQuCitCZU9TOiAgIFNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIG5vdGVzIGFib3V0IGNvbXBpbGluZy9pbnN0YWxsaW5nCisgICAgICAgIFB5dGhvbiBvbiBCZU9TIFIzIG9yIGxhdGVyLiAgTm90ZSB0aGF0IG9ubHkgdGhlIFBvd2VyUEMKKyAgICAgICAgcGxhdGZvcm0gaXMgc3VwcG9ydGVkIGZvciBSMzsgYm90aCBQb3dlclBDIGFuZCB4ODYgYXJlCisgICAgICAgIHN1cHBvcnRlZCBmb3IgUjQuCiAKIENyYXkgVDNFOiBNYXJrIEhhZGZpZWxkIChtLmhhZGZpZWxkQG5pd2EuY28ubnopIHdyaXRlczoKLQlQeXRob24gY2FuIGJlIGJ1aWx0IHNhdGlzZmFjdG9yaWx5IG9uIGEgQ3JheSBUM0UgYnV0IGJhc2VkIG9uCi0JbXkgZXhwZXJpZW5jZSB3aXRoIHRoZSBOSVdBIFQzRSAoMjAwMi0wNS0yMiwgdmVyc2lvbiAyLjIuMSkKLQl0aGVyZSBhcmUgYSBmZXcgYnVncyBhbmQgZ290Y2hhcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIGEKLQl0aHJlYWQgb24gY29tcC5sYW5nLnB5dGhvbiBpbiBNYXkgMjAwMiBlbnRpdGxlZCAiQnVpbGRpbmcKLQlQeXRob24gb24gQ3JheSBUM0UiLgorICAgICAgICBQeXRob24gY2FuIGJlIGJ1aWx0IHNhdGlzZmFjdG9yaWx5IG9uIGEgQ3JheSBUM0UgYnV0IGJhc2VkIG9uCisgICAgICAgIG15IGV4cGVyaWVuY2Ugd2l0aCB0aGUgTklXQSBUM0UgKDIwMDItMDUtMjIsIHZlcnNpb24gMi4yLjEpCisgICAgICAgIHRoZXJlIGFyZSBhIGZldyBidWdzIGFuZCBnb3RjaGFzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgYQorICAgICAgICB0aHJlYWQgb24gY29tcC5sYW5nLnB5dGhvbiBpbiBNYXkgMjAwMiBlbnRpdGxlZCAiQnVpbGRpbmcKKyAgICAgICAgUHl0aG9uIG9uIENyYXkgVDNFIi4KIAogICAgICAgICAxKSBVc2UgQ3JheSdzIGNjIGFuZCBub3QgZ2NjLiBUaGUgbGF0dGVyIHdhcyByZXBvcnRlZCBub3QgdG8KICAgICAgICAgICAgd29yayBieSBLb25yYWQgSGluc2VuLiBJdCBtYXkgd29yayBub3csIGJ1dCBpdCBtYXkgbm90LgpAQCAtNDkxLDE2ICs0OTEsMTYgQEAKIAogICAgICAgICAgICAgIE1BQ0hERVA9dW5pY29zbWsKIAotCTIpIFJ1biBjb25maWd1cmUgd2l0aCBvcHRpb24gIi0tZW5hYmxlLXVuaWNvZGU9dWNzNCIuCisgICAgICAgIDIpIFJ1biBjb25maWd1cmUgd2l0aCBvcHRpb24gIi0tZW5hYmxlLXVuaWNvZGU9dWNzNCIuCiAKLQkzKSBUaGUgQ3JheSBUM0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcsIHNvIGV4dGVuc2lvbgotCSAgIG1vZHVsZXMgaGF2ZSB0byBiZSBidWlsdCBieSBhZGRpbmcgKG9yIHVuY29tbWVudGluZykgbGluZXMKLQkgICBpbiBNb2R1bGVzL1NldHVwLiBUaGUgbWluaW11bSBzZXQgb2YgbW9kdWxlcyBpcworICAgICAgICAzKSBUaGUgQ3JheSBUM0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcsIHNvIGV4dGVuc2lvbgorICAgICAgICAgICBtb2R1bGVzIGhhdmUgdG8gYmUgYnVpbHQgYnkgYWRkaW5nIChvciB1bmNvbW1lbnRpbmcpIGxpbmVzCisgICAgICAgICAgIGluIE1vZHVsZXMvU2V0dXAuIFRoZSBtaW5pbXVtIHNldCBvZiBtb2R1bGVzIGlzCiAKLQkgICAgIHBvc2l4LCBuZXcsIF9zcmUsIHVuaWNvZGVkYXRhCisgICAgICAgICAgICAgcG9zaXgsIG5ldywgX3NyZSwgdW5pY29kZWRhdGEKIAotCSAgIE9uIE5JV0EncyB2YW5pbGxhIFQzRSBzeXN0ZW0gdGhlIGZvbGxvd2luZyBoYXZlIGFsc28gYmVlbgotCSAgIGluY2x1ZGVkIHN1Y2Nlc3NmdWxseToKKyAgICAgICAgICAgT24gTklXQSdzIHZhbmlsbGEgVDNFIHN5c3RlbSB0aGUgZm9sbG93aW5nIGhhdmUgYWxzbyBiZWVuCisgICAgICAgICAgIGluY2x1ZGVkIHN1Y2Nlc3NmdWxseToKIAogCSAgICAgX2NvZGVjcywgX2xvY2FsZSwgX3NvY2tldCwgX3N5bXRhYmxlLCBfdGVzdGNhcGksIF93ZWFrcmVmCiAJICAgICBhcnJheSwgYmluYXNjaWksIGNtYXRoLCBjUGlja2xlLCBjcnlwdCwgY1N0cmluZ0lPLCBkYm0KQEAgLTUwOCwyOCArNTA4LDI4IEBACiAJICAgICByb3Rvciwgc2VsZWN0LCBzdHJ1Y3QsIHN0cm9wLCBzeXNsb2csIHRlcm1pb3MsCiAJICAgICB0aW1lLCB0aW1pbmcKIAotCTQpIE9uY2UgdGhlIHB5dGhvbiBleGVjdXRhYmxlIGFuZCBsaWJyYXJ5IGhhdmUgYmVlbiBidWlsdCwgbWFrZQotCSAgIHdpbGwgZXhlY3V0ZSBzZXR1cC5weSwgd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGJ1aWxkIHJlbWFpbmluZwotCSAgIGV4dGVuc2lvbnMgYW5kIGxpbmsgdGhlbSBkeW5hbWljYWxseS4gRWFjaCBvZiB0aGVzZSBhdHRlbXB0cwotCSAgIHdpbGwgZmFpbCBidXQgc2hvdWxkIG5vdCBoYWx0IHRoZSBtYWtlIHByb2Nlc3MuIFRoaXMgaXMKLQkgICBub3JtYWwuCisgICAgICAgIDQpIE9uY2UgdGhlIHB5dGhvbiBleGVjdXRhYmxlIGFuZCBsaWJyYXJ5IGhhdmUgYmVlbiBidWlsdCwgbWFrZQorICAgICAgICAgICB3aWxsIGV4ZWN1dGUgc2V0dXAucHksIHdoaWNoIHdpbGwgYXR0ZW1wdCB0byBidWlsZCByZW1haW5pbmcKKyAgICAgICAgICAgZXh0ZW5zaW9ucyBhbmQgbGluayB0aGVtIGR5bmFtaWNhbGx5LiBFYWNoIG9mIHRoZXNlIGF0dGVtcHRzCisgICAgICAgICAgIHdpbGwgZmFpbCBidXQgc2hvdWxkIG5vdCBoYWx0IHRoZSBtYWtlIHByb2Nlc3MuIFRoaXMgaXMKKyAgICAgICAgICAgbm9ybWFsLgogCi0JNSkgUnVubmluZyAibWFrZSB0ZXN0IiB1c2VzIGEgbG90IG9mIHJlc291cmNlcyBhbmQgY2F1c2VzCi0JICAgcHJvYmxlbXMgb24gb3VyIHN5c3RlbS4gWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHJ1bm5pbmcgdGVzdHMKLQkgICBzaW5nbHkgb3IgaW4gc21hbGwgZ3JvdXBzLgorICAgICAgICA1KSBSdW5uaW5nICJtYWtlIHRlc3QiIHVzZXMgYSBsb3Qgb2YgcmVzb3VyY2VzIGFuZCBjYXVzZXMKKyAgICAgICAgICAgcHJvYmxlbXMgb24gb3VyIHN5c3RlbS4gWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHJ1bm5pbmcgdGVzdHMKKyAgICAgICAgICAgc2luZ2x5IG9yIGluIHNtYWxsIGdyb3Vwcy4KIAotU0dJOglTR0kncyBzdGFuZGFyZCAibWFrZSIgdXRpbGl0eSAoL2Jpbi9tYWtlIG9yIC91c3IvYmluL21ha2UpCi0JZG9lcyBub3QgY2hlY2sgd2hldGhlciBhIGNvbW1hbmQgYWN0dWFsbHkgY2hhbmdlZCB0aGUgZmlsZSBpdAotCWlzIHN1cHBvc2VkIHRvIGJ1aWxkLiAgVGhpcyBtZWFucyB0aGF0IHdoZW5ldmVyIHlvdSBzYXkgIm1ha2UiCi0JaXQgd2lsbCByZWRvIHRoZSBsaW5rIHN0ZXAuICBUaGUgcmVtZWR5IGlzIHRvIHVzZSBTR0kncyBtdWNoCi0Jc21hcnRlciAic21ha2UiIHV0aWxpdHkgKC91c3Ivc2Jpbi9zbWFrZSksIG9yIEdOVSBtYWtlLiAgSWYKLQl5b3Ugc2V0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBNYWtlZmlsZSB0byAjIS91c3Ivc2Jpbi9zbWFrZQotCXNtYWtlIHdpbGwgYmUgaW52b2tlZCBieSBtYWtlIChsaWtld2lzZSBmb3IgR05VIG1ha2UpLgorU0dJOiAgICBTR0kncyBzdGFuZGFyZCAibWFrZSIgdXRpbGl0eSAoL2Jpbi9tYWtlIG9yIC91c3IvYmluL21ha2UpCisgICAgICAgIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgYSBjb21tYW5kIGFjdHVhbGx5IGNoYW5nZWQgdGhlIGZpbGUgaXQKKyAgICAgICAgaXMgc3VwcG9zZWQgdG8gYnVpbGQuICBUaGlzIG1lYW5zIHRoYXQgd2hlbmV2ZXIgeW91IHNheSAibWFrZSIKKyAgICAgICAgaXQgd2lsbCByZWRvIHRoZSBsaW5rIHN0ZXAuICBUaGUgcmVtZWR5IGlzIHRvIHVzZSBTR0kncyBtdWNoCisgICAgICAgIHNtYXJ0ZXIgInNtYWtlIiB1dGlsaXR5ICgvdXNyL3NiaW4vc21ha2UpLCBvciBHTlUgbWFrZS4gIElmCisgICAgICAgIHlvdSBzZXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIE1ha2VmaWxlIHRvICMhL3Vzci9zYmluL3NtYWtlCisgICAgICAgIHNtYWtlIHdpbGwgYmUgaW52b2tlZCBieSBtYWtlIChsaWtld2lzZSBmb3IgR05VIG1ha2UpLgogCi0JV0FSTklORzogVGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIG9wdGltaXplciBvZiBzb21lIHZlcnNpb25zIG9mCi0JU0dJJ3MgY29tcGlsZXJzIHRoYXQgY2FuIGNhdXNlIGJ1cyBlcnJvcnMgb3Igb3RoZXIgc3RyYW5nZQotCWJlaGF2aW9yLCBlc3BlY2lhbGx5IG9uIG51bWVyaWNhbCBvcGVyYXRpb25zLiAgVG8gYXZvaWQgdGhpcywKLQl0cnkgYnVpbGRpbmcgd2l0aCAibWFrZSBPUFQ9Ii4KKyAgICAgICAgV0FSTklORzogVGhlcmUgYXJlIGJ1Z3MgaW4gdGhlIG9wdGltaXplciBvZiBzb21lIHZlcnNpb25zIG9mCisgICAgICAgIFNHSSdzIGNvbXBpbGVycyB0aGF0IGNhbiBjYXVzZSBidXMgZXJyb3JzIG9yIG90aGVyIHN0cmFuZ2UKKyAgICAgICAgYmVoYXZpb3IsIGVzcGVjaWFsbHkgb24gbnVtZXJpY2FsIG9wZXJhdGlvbnMuICBUbyBhdm9pZCB0aGlzLAorICAgICAgICB0cnkgYnVpbGRpbmcgd2l0aCAibWFrZSBPUFQ9Ii4KIAogT1MvMjogICBJZiB5b3UgYXJlIHJ1bm5pbmcgV2FycDMgb3IgV2FycDQgYW5kIGhhdmUgSUJNJ3MgVmlzdWFsQWdlIEMvQysrCiAgICAgICAgIGNvbXBpbGVyIGluc3RhbGxlZCwganVzdCBjaGFuZ2UgaW50byB0aGUgcGNcb3MydmFjcHAgZGlyZWN0b3J5CkBAIC01NjksOCArNTY5LDggQEAKICAgICAgICAgYWRkaXRpb25zLgogCiAgICAgICAgIFNvbWUgcGVvcGxlIGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgYnVpbGRpbmcgUHl0aG9uIGFmdGVyIHVzaW5nICJmaW5rIgotICAgICAgICB0byBpbnN0YWxsIGFkZGl0aW9uYWwgdW5peCBzb2Z0d2FyZS4gRGlzYWJsaW5nIGZpbmsgKHJlbW92ZSBhbGwgcmVmZXJlbmNlcwotICAgICAgICB0byAvc3cgZnJvbSB5b3VyIC5wcm9maWxlIG9yIC5sb2dpbikgc2hvdWxkIHNvbHZlIHRoaXMuCisgICAgICAgIHRvIGluc3RhbGwgYWRkaXRpb25hbCB1bml4IHNvZnR3YXJlLiBEaXNhYmxpbmcgZmluayAocmVtb3ZlIGFsbCAKKyAgICAgICAgcmVmZXJlbmNlcyB0byAvc3cgZnJvbSB5b3VyIC5wcm9maWxlIG9yIC5sb2dpbikgc2hvdWxkIHNvbHZlIHRoaXMuCiAKICAgICAgICAgWW91IG1heSB3YW50IHRvIHRyeSB0aGUgY29uZmlndXJlIG9wdGlvbiAiLS1lbmFibGUtZnJhbWV3b3JrIgogICAgICAgICB3aGljaCBpbnN0YWxscyBQeXRob24gYXMgYSBmcmFtZXdvcmsuIFRoZSBsb2NhdGlvbiBjYW4gYmUgc2V0CkBAIC02MDIsOCArNjAyLDggQEAKIAogICAgICAgICAjU1NMPS91c3IvbG9jYWwvc3NsCiAgICAgICAgICNfc29ja2V0IHNvY2tldG1vZHVsZS5jIFwKLSAgICAgICAgIwktRFVTRV9TU0wgLUkkKFNTTCkvaW5jbHVkZSAtSSQoU1NMKS9pbmNsdWRlL29wZW5zc2wgXAotICAgICAgICAjCS1MJChTU0wpL2xpYiAtbHNzbCAtbGNyeXB0bworICAgICAgICAjICAgICAgIC1EVVNFX1NTTCAtSSQoU1NMKS9pbmNsdWRlIC1JJChTU0wpL2luY2x1ZGUvb3BlbnNzbCBcCisgICAgICAgICMgICAgICAgLUwkKFNTTCkvbGliIC1sc3NsIC1sY3J5cHRvCiAKICAgICAgICAgYW5kIHJlbW92ZSAibG9jYWwvIiBmcm9tIHRoZSBTU0wgdmFyaWFibGUuICBGaW5hbGx5LCBqdXN0IHJ1bgogICAgICAgICAibWFrZSIhCkBAIC02NDgsNjkgKzY0OCw2OSBAQAogCiBBdGhlT1M6IEZyb20gT2N0YXZpYW4gQ2VybmEgPHRhdnkgYXQgeWxhYnMuY29tPjoKIAotCUJlZm9yZSBidWlsZGluZzoKKyAgICAgICAgQmVmb3JlIGJ1aWxkaW5nOgogCi0JICAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBzaGFyZWQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcyB5b3UKLQkgICAgd2FudCB0byB1c2Ugd2l0aCBQeXRob24uIFlvdSB3aWxsIGhhdmUgdG8gY29tcGlsZSB0aGVtCi0JICAgIHlvdXJzZWxmLCBvciBkb3dubG9hZCBwcmVjb21waWxlZCBwYWNrYWdlcy4KKyAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBzaGFyZWQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcyB5b3UKKyAgICAgICAgICAgIHdhbnQgdG8gdXNlIHdpdGggUHl0aG9uLiBZb3Ugd2lsbCBoYXZlIHRvIGNvbXBpbGUgdGhlbQorICAgICAgICAgICAgeW91cnNlbGYsIG9yIGRvd25sb2FkIHByZWNvbXBpbGVkIHBhY2thZ2VzLgogCi0JICAgIFJlY29tbWVuZGVkIGxpYnJhcmllczoKKyAgICAgICAgICAgIFJlY29tbWVuZGVkIGxpYnJhcmllczoKIAotCQluY3Vyc2VzLTQuMgotCQlyZWFkbGluZS00LjJhCi0JCXpsaWItMS4xLjQKKyAgICAgICAgICAgICAgICBuY3Vyc2VzLTQuMgorICAgICAgICAgICAgICAgIHJlYWRsaW5lLTQuMmEKKyAgICAgICAgICAgICAgICB6bGliLTEuMS40CiAKLQlCdWlsZDoKKyAgICAgICAgQnVpbGQ6CiAKLQkgICAgJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyL3B5dGhvbgotCSAgICAkIG1ha2UKKyAgICAgICAgICAgICQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3Vzci9weXRob24KKyAgICAgICAgICAgICQgbWFrZQogCi0JICAgIFB5dGhvbiBpcyBhbHdheXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgb3RoZXJ3aXNlCi0JICAgIGR5bmFtaWMgbG9hZGluZyB3b3VsZCBub3Qgd29yay4KKyAgICAgICAgICAgIFB5dGhvbiBpcyBhbHdheXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeSwgb3RoZXJ3aXNlCisgICAgICAgICAgICBkeW5hbWljIGxvYWRpbmcgd291bGQgbm90IHdvcmsuCiAKLQlUZXN0aW5nOgorICAgICAgICBUZXN0aW5nOgogCi0JICAgICQgbWFrZSB0ZXN0CisgICAgICAgICAgICAkIG1ha2UgdGVzdAogCi0JSW5zdGFsbDoKKyAgICAgICAgSW5zdGFsbDoKIAotCSAgICAjIG1ha2UgaW5zdGFsbAotCSAgICAjIHBrZ21hbmFnZXIgLWEgL3Vzci9weXRob24KKyAgICAgICAgICAgICMgbWFrZSBpbnN0YWxsCisgICAgICAgICAgICAjIHBrZ21hbmFnZXIgLWEgL3Vzci9weXRob24KIAogCi0JQXRoZU9TIGlzc3VlczoKKyAgICAgICAgQXRoZU9TIGlzc3VlczoKIAotCSAgICAtIGxhcmdlIGZpbGUgc3VwcG9ydDogZHVlIHRvIGEgc3RkaW8gYnVnIGluIGdsaWJjL2xpYmlvLAotCSAgICAgIGFjY2VzcyB0byBsYXJnZSBmaWxlcyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiAgZnNlZWtvKCkKLQkgICAgICB0cmllcyB0byBzZWVrIHRvIGEgbmVnYXRpdmUgb2Zmc2V0LiAgZnRlbGxvKCkgcmV0dXJucyBhCi0JICAgICAgbmVnYXRpdmUgb2Zmc2V0LCBpdCBsb29rcyBsaWtlIGEgMzItPjY0Yml0Ci0JICAgICAgc2lnbi1leHRlbnNpb24gaXNzdWUuICBUaGUgbG93bGV2ZWwgZnVuY3Rpb25zIChvcGVuLAotCSAgICAgIGxzZWVrLCBldGMpIGFyZSBPSy4KLQkgICAgLSBzb2NrZXRzOiBBRl9VTklYIGlzIGRlZmluZWQgaW4gdGhlIEMgbGlicmFyeSBhbmQgaW4KLQkgICAgICBQeXRob24sIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHN5c3RlbS4KLQkgICAgLSBzZWxlY3Q6IHBvbGwgaXMgYXZhaWxhYmxlIGluIHRoZSBDIGxpYnJhcnksIGJ1dCBkb2VzIG5vdAotCSAgICAgIHdvcmsgKEl0IGRvZXMgbm90IHJldHVybiBQT0xMTlZBTCBmb3IgYmFkIGZkcyBhbmQKLQkgICAgICBoYW5ncykuCi0JICAgIC0gcG9zaXg6IHN0YXR2ZnMgYW5kIGZzdGF0dmZzIGFsd2F5cyByZXR1cm4gRU5PU1lTLgotCSAgICAtIGRpc2FibGVkIG1vZHVsZXM6Ci0JCS0gbW1hcDogbm90IHlldCBpbXBsZW1lbnRlZCBpbiBBdGhlT1MKLQkJLSBuaXM6IGJyb2tlbiAob24gYW4gdW5jb25maWd1cmVkIHN5c3RlbQotCQkgIHlwX2dldF9kZWZhdWx0X2RvbWFpbigpIHJldHVybnMganVuayBpbnN0ZWFkIG9mCi0JCSAgZXJyb3IpCi0JCS0gZGw6IGR5bmFtaWMgbG9hZGluZyBkb2Vzbid0IHdvcmsgdmlhIGRsb3BlbigpCi0JCS0gcmVzb3VyY2U6IGdldHJpbWl0IGFuZCBzZXRybGltaXQgYXJlIG5vdCB5ZXQKLQkJICBpbXBsZW1lbnRlZAorICAgICAgICAgICAgLSBsYXJnZSBmaWxlIHN1cHBvcnQ6IGR1ZSB0byBhIHN0ZGlvIGJ1ZyBpbiBnbGliYy9saWJpbywKKyAgICAgICAgICAgICAgYWNjZXNzIHRvIGxhcmdlIGZpbGVzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuICBmc2Vla28oKQorICAgICAgICAgICAgICB0cmllcyB0byBzZWVrIHRvIGEgbmVnYXRpdmUgb2Zmc2V0LiAgZnRlbGxvKCkgcmV0dXJucyBhCisgICAgICAgICAgICAgIG5lZ2F0aXZlIG9mZnNldCwgaXQgbG9va3MgbGlrZSBhIDMyLT42NGJpdAorICAgICAgICAgICAgICBzaWduLWV4dGVuc2lvbiBpc3N1ZS4gIFRoZSBsb3dsZXZlbCBmdW5jdGlvbnMgKG9wZW4sCisgICAgICAgICAgICAgIGxzZWVrLCBldGMpIGFyZSBPSy4KKyAgICAgICAgICAgIC0gc29ja2V0czogQUZfVU5JWCBpcyBkZWZpbmVkIGluIHRoZSBDIGxpYnJhcnkgYW5kIGluCisgICAgICAgICAgICAgIFB5dGhvbiwgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgc3lzdGVtLgorICAgICAgICAgICAgLSBzZWxlY3Q6IHBvbGwgaXMgYXZhaWxhYmxlIGluIHRoZSBDIGxpYnJhcnksIGJ1dCBkb2VzIG5vdAorICAgICAgICAgICAgICB3b3JrIChJdCBkb2VzIG5vdCByZXR1cm4gUE9MTE5WQUwgZm9yIGJhZCBmZHMgYW5kCisgICAgICAgICAgICAgIGhhbmdzKS4KKyAgICAgICAgICAgIC0gcG9zaXg6IHN0YXR2ZnMgYW5kIGZzdGF0dmZzIGFsd2F5cyByZXR1cm4gRU5PU1lTLgorICAgICAgICAgICAgLSBkaXNhYmxlZCBtb2R1bGVzOgorICAgICAgICAgICAgICAgIC0gbW1hcDogbm90IHlldCBpbXBsZW1lbnRlZCBpbiBBdGhlT1MKKyAgICAgICAgICAgICAgICAtIG5pczogYnJva2VuIChvbiBhbiB1bmNvbmZpZ3VyZWQgc3lzdGVtCisgICAgICAgICAgICAgICAgICB5cF9nZXRfZGVmYXVsdF9kb21haW4oKSByZXR1cm5zIGp1bmsgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICAgICAgICAgICAgLSBkbDogZHluYW1pYyBsb2FkaW5nIGRvZXNuJ3Qgd29yayB2aWEgZGxvcGVuKCkKKyAgICAgICAgICAgICAgICAtIHJlc291cmNlOiBnZXRyaW1pdCBhbmQgc2V0cmxpbWl0IGFyZSBub3QgeWV0CisgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZAogCi0JICAgIC0gaWYgeW91IGFyZSBnZXR0aW5nIHNlZ21lbnRhdGlvbiBmYXVsdHMsIHlvdSBwcm9iYWJseSBhcmUKLQkgICAgICBsb3cgb24gbWVtb3J5LiAgQXRoZU9TIGRvZXNuJ3QgaGFuZGxlIHZlcnkgd2VsbCBhbgotCSAgICAgIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uIGFuZCBzaW1wbHkgU0VHVnMgdGhlIHByb2Nlc3MuCisgICAgICAgICAgICAtIGlmIHlvdSBhcmUgZ2V0dGluZyBzZWdtZW50YXRpb24gZmF1bHRzLCB5b3UgcHJvYmFibHkgYXJlCisgICAgICAgICAgICAgIGxvdyBvbiBtZW1vcnkuICBBdGhlT1MgZG9lc24ndCBoYW5kbGUgdmVyeSB3ZWxsIGFuCisgICAgICAgICAgICAgIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uIGFuZCBzaW1wbHkgU0VHVnMgdGhlIHByb2Nlc3MuCiAKLQlUZXN0ZWQgb246CisgICAgICAgIFRlc3RlZCBvbjoKIAotCSAgICBBdGhlT1MtMC4zLjcKLQkgICAgZ2NjLTIuOTUKLQkgICAgYmludXRpbHMtMi4xMAotCSAgICBtYWtlLTMuNzgKKyAgICAgICAgICAgIEF0aGVPUy0wLjMuNworICAgICAgICAgICAgZ2NjLTIuOTUKKyAgICAgICAgICAgIGJpbnV0aWxzLTIuMTAKKyAgICAgICAgICAgIG1ha2UtMy43OAogCiAKIENvbmZpZ3VyaW5nIHRoZSBic2RkYiBhbmQgZGJtIG1vZHVsZXMKQEAgLTcxOSwxNSArNzE5LDI1IEBACiBCZWdpbm5pbmcgd2l0aCBQeXRob24gdmVyc2lvbiAyLjMsIHRoZSBQeUJzZGRiIHBhY2thZ2UKIDxodHRwOi8vcHlic2RkYi5zZi5uZXQvPiB3YXMgYWRvcHRlZCBpbnRvIFB5dGhvbiBhcyB0aGUgYnNkZGIgcGFja2FnZSwKIGV4cG9zaW5nIGEgc2V0IG9mIHBhY2thZ2UtbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHByb3ZpZGUKLWJhY2t3YXJkcy1jb21wYXRpYmxlIGJlaGF2aW9yLiAgT25seSB2ZXJzaW9ucyAzLjEgdGhyb3VnaCA0LjEgb2YKK2JhY2t3YXJkcy1jb21wYXRpYmxlIGJlaGF2aW9yLiAgT25seSB2ZXJzaW9ucyAzLjMgdGhyb3VnaCA0LjQgb2YKIFNsZWVweWNhdCdzIGxpYnJhcmllcyBwcm92aWRlIHRoZSBuZWNlc3NhcnkgQVBJLCBzbyBvbGRlciB2ZXJzaW9ucwogYXJlbid0IHN1cHBvcnRlZCB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLiAgVGhlIG9sZCBic2RkYiBtb2R1bGUgaGFzCiBiZWVuIHJldGFpbmVkIGFzIGJzZGRiMTg1LCB0aG91Z2ggaXQgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQuICBVc2Vycwogd2lzaGluZyB0byB1c2UgaXQgd2lsbCBoYXZlIHRvIHR3ZWFrIE1vZHVsZXMvU2V0dXAgdG8gYnVpbGQgaXQuICBUaGUKIGRibSBtb2R1bGUgd2lsbCBzdGlsbCBiZSBidWlsdCBhZ2FpbnN0IHRoZSBTbGVlcHljYXQgbGlicmFyaWVzIGlmCi1vdGhlciBwcmVmZXJyZWQgYWx0ZXJuYXRpdmVzIChuZGJtLCBnZGJtKSBhcmUgbm90IGZvdW5kLCB0aG91Z2gKLXZlcnNpb25zIG9mIHRoZSBTbGVlcHljYXQgbGlicmFyeSBwcmlvciB0byAzLjEgYXJlIG5vdCBjb25zaWRlcmVkLgorb3RoZXIgcHJlZmVycmVkIGFsdGVybmF0aXZlcyAobmRibSwgZ2RibSkgYXJlIG5vdCBmb3VuZC4KIAorQnVpbGRpbmcgdGhlIHNxbGl0ZTMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYnVpbGQgdGhlIHNxbGl0ZTMgbW9kdWxlLCB5b3UnbGwgbmVlZCB0aGUgc3FsaXRlMyBvciBsaWJzcWxpdGUzCitwYWNrYWdlcyBpbnN0YWxsZWQsIGluY2x1ZGluZyB0aGUgaGVhZGVyIGZpbGVzLiBNYW55IG1vZGVybiBvcGVyYXRpbmcKK3N5c3RlbXMgZGlzdHJpYnV0ZSB0aGUgaGVhZGVycyBpbiBhIHNlcGFyYXRlIHBhY2thZ2UgdG8gdGhlIGxpYnJhcnkgLQorb2Z0ZW4gaXQgd2lsbCBiZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtYWluIHBhY2thZ2UsIGJ1dCB3aXRoIGEgLWRldiBvcgorLWRldmVsIHN1ZmZpeC4gCisKK1RoZSB2ZXJzaW9uIG9mIHB5c3FsaXRlMiB0aGF0J3MgaW5jbHVkaW5nIGluIFB5dGhvbiBuZWVkcyBzcWxpdGUzIDMuMC44CitvciBsYXRlci4gc2V0dXAucHkgYXR0ZW1wdHMgdG8gY2hlY2sgdGhhdCBpdCBjYW4gZmluZCBhIGNvcnJlY3QgdmVyc2lvbi4KIAogQ29uZmlndXJpbmcgdGhyZWFkcwogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzU3LDE3ICs3NjcsMTcgQEAKICAgICBTdW5PUyA1LnsxLTV9L3tnY2MsU3VuUHJvIGNjfS9zb2xhcmlzICAgLW10CiAgICAgU3VuT1MgNS41L3tnY2MsU3VuUHJvIGNjfS9QT1NJWCAgICAgICAgIChub3RoaW5nKQogICAgIERFQyBPU0YvMSAzLngvY2MvRENFICAgICAgICAgICAgICAgICAgICAtdGhyZWFkcwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9jYy9EQ0UgICAgICAgICAgICAgICAgIC10aHJlYWRzCi0JICAgIChidXRlbmhvZkB6a28uZGVjLmNvbSkKKyAgICAgICAgICAgIChidXRlbmhvZkB6a28uZGVjLmNvbSkKICAgICBEaWdpdGFsIFVOSVggNC54L2NjL1BPU0lYICAgICAgICAgICAgICAgLXB0aHJlYWQKLQkgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQorICAgICAgICAgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQogICAgIEFJWCA0LjEuNC9jY19yL2Q3ICAgICAgICAgICAgICAgICAgICAgICAobm90aGluZykKLQkgICAgKGJ1aHJ0QGlxdWVzdC5uZXQpCisgICAgICAgICAgICAoYnVocnRAaXF1ZXN0Lm5ldCkKICAgICBBSVggNC4xLjQvY2NfcjQvRENFICAgICAgICAgICAgICAgICAgICAgKG5vdGhpbmcpCi0JICAgIChidWhydEBpcXVlc3QubmV0KQorICAgICAgICAgICAgKGJ1aHJ0QGlxdWVzdC5uZXQpCiAgICAgSVJJWCA2LjIvY2MvUE9TSVggICAgICAgICAgICAgICAgICAgICAgIChub3RoaW5nKQotCSAgICAocm9iZXJ0bEBjd2kubmwpCisgICAgICAgICAgICAocm9iZXJ0bEBjd2kubmwpCiAKIAogTGlua2VyIChsZCkgbGlicmFyaWVzIGFuZCBmbGFncyBmb3IgdGhyZWFkcwpAQCAtNzc4LDE1ICs3ODgsMTUgQEAKICAgICBTdW5PUyA1LnsxLTV9L3NvbGFyaXMgICAgICAgICAgICAgICAtbHRocmVhZAogICAgIFN1bk9TIDUuNS9QT1NJWCAgICAgICAgICAgICAgICAgICAgIC1scHRocmVhZAogICAgIERFQyBPU0YvMSAzLngvRENFICAgICAgICAgICAgICAgICAgIC1scHRocmVhZHMgLWxtYWNoIC1sY19yIC1sYwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9EQ0UgICAgICAgICAgICAgICAgLWxwdGhyZWFkcyAtbHB0aHJlYWQgLWxtYWNoIC1sZXhjIC1sYwotCSAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCisgICAgICAgICAgICAoYnV0ZW5ob2ZAemtvLmRlYy5jb20pCiAgICAgRGlnaXRhbCBVTklYIDQueC9QT1NJWCAgICAgICAgICAgICAgLWxwdGhyZWFkIC1sbWFjaCAtbGV4YyAtbGMKLQkgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQorICAgICAgICAgICAgKGJ1dGVuaG9mQHprby5kZWMuY29tKQogICAgIEFJWCA0LjEuNC97ZHJhZnQ3LERDRX0gICAgICAgICAgICAgIChub3RoaW5nKQotCSAgICAoYnVocnRAaXF1ZXN0Lm5ldCkKKyAgICAgICAgICAgIChidWhydEBpcXVlc3QubmV0KQogICAgIElSSVggNi4yL1BPU0lYICAgICAgICAgICAgICAgICAgICAgIC1scHRocmVhZAotCSAgICAoanBoQGVtaWxpYS5lbmdyLnNnaS5jb20pCisgICAgICAgICAgICAoanBoQGVtaWxpYS5lbmdyLnNnaS5jb20pCiAKIAogQnVpbGRpbmcgYSBzaGFyZWQgbGlicHl0aG9uCkBAIC04OTYsNyArOTA2LDcgQEAKICpkb24ndCogaW5jbHVkZSB0aGUgb3V0cHV0IG9mICJtYWtlIHRlc3QiLiAgSXQgaXMgdXNlbGVzcy4gIFJ1biB0aGUKIGZhaWxpbmcgdGVzdCBtYW51YWxseSwgYXMgZm9sbG93czoKIAotCS4vcHl0aG9uIC4vTGliL3Rlc3QvdGVzdF93aGF0ZXZlci5weQorICAgICAgICAuL3B5dGhvbiAuL0xpYi90ZXN0L3Rlc3Rfd2hhdGV2ZXIucHkKIAogKHN1YnN0aXR1dGluZyB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSBmb3IgJy4nIGlmIHlvdSBidWlsdCBpbiBhCiBkaWZmZXJlbnQgZGlyZWN0b3J5KS4gIFRoaXMgcnVucyB0aGUgdGVzdCBpbiB2ZXJib3NlIG1vZGUuCkBAIC05MDksNyArOTE5LDcgQEAKIChzZWUgYmVsb3cpLCBpbmNsdWRlIGZpbGVzLCBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgdGhlIG1hbnVhbCBwYWdlLAoganVzdCB0eXBlCiAKLQltYWtlIGluc3RhbGwKKyAgICAgICAgbWFrZSBpbnN0YWxsCiAKIFRoaXMgd2lsbCBpbnN0YWxsIGFsbCBwbGF0Zm9ybS1pbmRlcGVuZGVudCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyBvZgogdGhlIGRpcmVjdG9yeSBnaXZlbiB3aXRoIHRoZSAtLXByZWZpeCBvcHRpb24gdG8gY29uZmlndXJlIG9yIHRvIHRoZQpAQCAtOTM0LDcgKzk0NCw3IEBACiBJZiB5b3UgaGF2ZSBhIHByZXZpb3VzIGluc3RhbGxhdGlvbiBvZiBQeXRob24gdGhhdCB5b3UgZG9uJ3QKIHdhbnQgdG8gcmVwbGFjZSB5ZXQsIHVzZQogCi0JbWFrZSBhbHRpbnN0YWxsCisgICAgICAgIG1ha2UgYWx0aW5zdGFsbAogCiBUaGlzIGluc3RhbGxzIHRoZSBzYW1lIHNldCBvZiBmaWxlcyBhcyAibWFrZSBpbnN0YWxsIiBleGNlcHQgaXQKIGRvZXNuJ3QgY3JlYXRlIHRoZSBoYXJkIGxpbmsgdG8gInB5dGhvbjx2ZXJzaW9uPiIgbmFtZWQgInB5dGhvbiIgYW5kCkBAIC05NjMsMTA0ICs5NzMsMTI0IEBACiBNb2R1bGVzL2dldHBhdGguby4KIAogLS13aXRoKG91dCktZ2NjOiBUaGUgY29uZmlndXJlIHNjcmlwdCB1c2VzIGdjYyAodGhlIEdOVSBDIGNvbXBpbGVyKSBpZgotCWl0IGZpbmRzIGl0LiAgSWYgeW91IGRvbid0IHdhbnQgdGhpcywgb3IgaWYgdGhpcyBjb21waWxlciBpcwotCWluc3RhbGxlZCBidXQgYnJva2VuIG9uIHlvdXIgcGxhdGZvcm0sIHBhc3MgdGhlIG9wdGlvbgotCS0td2l0aG91dC1nY2MuICBZb3UgY2FuIGFsc28gcGFzcyAiQ0M9Y2MiIChvciB3aGF0ZXZlciB0aGUKLQluYW1lIG9mIHRoZSBwcm9wZXIgQyBjb21waWxlciBpcykgaW4gdGhlIGVudmlyb25tZW50LCBidXQgdGhlCi0JYWR2YW50YWdlIG9mIHVzaW5nIC0td2l0aG91dC1nY2MgaXMgdGhhdCB0aGlzIG9wdGlvbiBpcwotCXJlbWVtYmVyZWQgYnkgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGZvciBpdHMgLS1yZWNoZWNrCi0Jb3B0aW9uLgorICAgICAgICBpdCBmaW5kcyBpdC4gIElmIHlvdSBkb24ndCB3YW50IHRoaXMsIG9yIGlmIHRoaXMgY29tcGlsZXIgaXMKKyAgICAgICAgaW5zdGFsbGVkIGJ1dCBicm9rZW4gb24geW91ciBwbGF0Zm9ybSwgcGFzcyB0aGUgb3B0aW9uCisgICAgICAgIC0td2l0aG91dC1nY2MuICBZb3UgY2FuIGFsc28gcGFzcyAiQ0M9Y2MiIChvciB3aGF0ZXZlciB0aGUKKyAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVyIEMgY29tcGlsZXIgaXMpIGluIHRoZSBlbnZpcm9ubWVudCwgYnV0IHRoZQorICAgICAgICBhZHZhbnRhZ2Ugb2YgdXNpbmcgLS13aXRob3V0LWdjYyBpcyB0aGF0IHRoaXMgb3B0aW9uIGlzCisgICAgICAgIHJlbWVtYmVyZWQgYnkgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGZvciBpdHMgLS1yZWNoZWNrCisgICAgICAgIG9wdGlvbi4KIAogLS1wcmVmaXgsIC0tZXhlYy1wcmVmaXg6IElmIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIGJpbmFyaWVzIGFuZCB0aGUKLQlQeXRob24gbGlicmFyeSBzb21ld2hlcmUgZWxzZSB0aGFuIGluIC91c3IvbG9jYWwve2JpbixsaWJ9LAotCXlvdSBjYW4gcGFzcyB0aGUgb3B0aW9uIC0tcHJlZml4PURJUkVDVE9SWTsgdGhlIGludGVycHJldGVyCi0JYmluYXJ5IHdpbGwgYmUgaW5zdGFsbGVkIGFzIERJUkVDVE9SWS9iaW4vcHl0aG9uIGFuZCB0aGUKLQlsaWJyYXJ5IGZpbGVzIGFzIERJUkVDVE9SWS9saWIvcHl0aG9uLyouICBJZiB5b3UgcGFzcwotCS0tZXhlYy1wcmVmaXg9RElSRUNUT1JZIChhcyB3ZWxsKSB0aGlzIG92ZXJyaWRlcyB0aGUKLQlpbnN0YWxsYXRpb24gcHJlZml4IGZvciBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIChsaWtlIHRoZQotCWludGVycHJldGVyIGJpbmFyeSkuICBOb3RlIHRoYXQgLS1wcmVmaXg9RElSRUNUT1JZIGFsc28KLQlhZmZlY3RzIHRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpLCB3aGVuCi0JTW9kdWxlcy9jb25maWcuYyBpcyBjb21waWxlZC4gIFBhc3NpbmcgbWFrZSB0aGUgb3B0aW9uCi0JcHJlZml4PURJUkVDVE9SWSAoYW5kL29yIGV4ZWNfcHJlZml4PURJUkVDVE9SWSkgb3ZlcnJpZGVzIHRoZQotCXByZWZpeCBzZXQgYXQgY29uZmlndXJhdGlvbiB0aW1lOyB0aGlzIG1heSBiZSBtb3JlIGNvbnZlbmllbnQKLQl0aGFuIHJlLXJ1bm5pbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgeW91IGNoYW5nZSB5b3VyIG1pbmQKLQlhYm91dCB0aGUgaW5zdGFsbCBwcmVmaXguCisgICAgICAgIFB5dGhvbiBsaWJyYXJ5IHNvbWV3aGVyZSBlbHNlIHRoYW4gaW4gL3Vzci9sb2NhbC97YmluLGxpYn0sCisgICAgICAgIHlvdSBjYW4gcGFzcyB0aGUgb3B0aW9uIC0tcHJlZml4PURJUkVDVE9SWTsgdGhlIGludGVycHJldGVyCisgICAgICAgIGJpbmFyeSB3aWxsIGJlIGluc3RhbGxlZCBhcyBESVJFQ1RPUlkvYmluL3B5dGhvbiBhbmQgdGhlCisgICAgICAgIGxpYnJhcnkgZmlsZXMgYXMgRElSRUNUT1JZL2xpYi9weXRob24vKi4gIElmIHlvdSBwYXNzCisgICAgICAgIC0tZXhlYy1wcmVmaXg9RElSRUNUT1JZIChhcyB3ZWxsKSB0aGlzIG92ZXJyaWRlcyB0aGUKKyAgICAgICAgaW5zdGFsbGF0aW9uIHByZWZpeCBmb3IgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyAobGlrZSB0aGUKKyAgICAgICAgaW50ZXJwcmV0ZXIgYmluYXJ5KS4gIE5vdGUgdGhhdCAtLXByZWZpeD1ESVJFQ1RPUlkgYWxzbworICAgICAgICBhZmZlY3RzIHRoZSBkZWZhdWx0IG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpLCB3aGVuCisgICAgICAgIE1vZHVsZXMvY29uZmlnLmMgaXMgY29tcGlsZWQuICBQYXNzaW5nIG1ha2UgdGhlIG9wdGlvbgorICAgICAgICBwcmVmaXg9RElSRUNUT1JZIChhbmQvb3IgZXhlY19wcmVmaXg9RElSRUNUT1JZKSBvdmVycmlkZXMgdGhlCisgICAgICAgIHByZWZpeCBzZXQgYXQgY29uZmlndXJhdGlvbiB0aW1lOyB0aGlzIG1heSBiZSBtb3JlIGNvbnZlbmllbnQKKyAgICAgICAgdGhhbiByZS1ydW5uaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0IGlmIHlvdSBjaGFuZ2UgeW91ciBtaW5kCisgICAgICAgIGFib3V0IHRoZSBpbnN0YWxsIHByZWZpeC4KIAogLS13aXRoLXJlYWRsaW5lOiBUaGlzIG9wdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgR05VCi0JcmVhZGxpbmUgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGJ5IHNldHVwLnB5IHdoZW4gcHJlc2VudC4KKyAgICAgICAgcmVhZGxpbmUgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGJ5IHNldHVwLnB5IHdoZW4gcHJlc2VudC4KIAogLS13aXRoLXRocmVhZHM6IE9uIG1vc3QgVW5peCBzeXN0ZW1zLCB5b3UgY2FuIG5vdyB1c2UgbXVsdGlwbGUKLQl0aHJlYWRzLCBhbmQgc3VwcG9ydCBmb3IgdGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuICBUbwotCWRpc2FibGUgdGhpcywgcGFzcyAtLXdpdGgtdGhyZWFkcz1uby4gIElmIHRoZSBsaWJyYXJ5IHJlcXVpcmVkCi0JZm9yIHRocmVhZHMgbGl2ZXMgaW4gYSBwZWN1bGlhciBwbGFjZSwgeW91IGNhbiB1c2UKLQktLXdpdGgtdGhyZWFkPURJUkVDVE9SWS4gIElNUE9SVEFOVDogcnVuICJtYWtlIGNsZWFuIiBhZnRlcgotCWNoYW5naW5nIChlaXRoZXIgZW5hYmxpbmcgb3IgZGlzYWJsaW5nKSB0aGlzIG9wdGlvbiwgb3IgeW91Ci0Jd2lsbCBnZXQgbGluayBlcnJvcnMhICBOb3RlOiBmb3IgREVDIFVuaXggdXNlCi0JLS13aXRoLWRlYy10aHJlYWRzIGluc3RlYWQuCisgICAgICAgIHRocmVhZHMsIGFuZCBzdXBwb3J0IGZvciB0aGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFRvCisgICAgICAgIGRpc2FibGUgdGhpcywgcGFzcyAtLXdpdGgtdGhyZWFkcz1uby4gIElmIHRoZSBsaWJyYXJ5IHJlcXVpcmVkCisgICAgICAgIGZvciB0aHJlYWRzIGxpdmVzIGluIGEgcGVjdWxpYXIgcGxhY2UsIHlvdSBjYW4gdXNlCisgICAgICAgIC0td2l0aC10aHJlYWQ9RElSRUNUT1JZLiAgSU1QT1JUQU5UOiBydW4gIm1ha2UgY2xlYW4iIGFmdGVyCisgICAgICAgIGNoYW5naW5nIChlaXRoZXIgZW5hYmxpbmcgb3IgZGlzYWJsaW5nKSB0aGlzIG9wdGlvbiwgb3IgeW91CisgICAgICAgIHdpbGwgZ2V0IGxpbmsgZXJyb3JzISAgTm90ZTogZm9yIERFQyBVbml4IHVzZQorICAgICAgICAtLXdpdGgtZGVjLXRocmVhZHMgaW5zdGVhZC4KIAogLS13aXRoLXNnaS1kbDogT24gU0dJIElSSVggNCwgZHluYW1pYyBsb2FkaW5nIG9mIGV4dGVuc2lvbiBtb2R1bGVzIGlzCi0Jc3VwcG9ydGVkIGJ5IHRoZSAiZGwiIGxpYnJhcnkgYnkgSmFjayBKYW5zZW4sIHdoaWNoIGlzCi0JZnRwJ2FibGUgZnJvbSBmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLTEuNi50YXIuWi4KLQlUaGlzIGlzIGVuYWJsZWQgKGFmdGVyIHlvdSd2ZSBmdHAnZWQgYW5kIGNvbXBpbGVkIHRoZSBkbAotCWxpYnJhcnkpIGJ5IHBhc3NpbmcgLS13aXRoLXNnaS1kbD1ESVJFQ1RPUlkgd2hlcmUgRElSRUNUT1JZCi0JaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBkbCBsaWJyYXJ5LiAgKERvbid0IGJvdGhlciBvbgotCUlSSVggNSwgaXQgYWxyZWFkeSBoYXMgZHluYW1pYyBsaW5raW5nIHVzaW5nIFN1bk9TIHN0eWxlCi0Jc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KKyAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSAiZGwiIGxpYnJhcnkgYnkgSmFjayBKYW5zZW4sIHdoaWNoIGlzCisgICAgICAgIGZ0cCdhYmxlIGZyb20gZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbC0xLjYudGFyLlouCisgICAgICAgIFRoaXMgaXMgZW5hYmxlZCAoYWZ0ZXIgeW91J3ZlIGZ0cCdlZCBhbmQgY29tcGlsZWQgdGhlIGRsCisgICAgICAgIGxpYnJhcnkpIGJ5IHBhc3NpbmcgLS13aXRoLXNnaS1kbD1ESVJFQ1RPUlkgd2hlcmUgRElSRUNUT1JZCisgICAgICAgIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgZGwgbGlicmFyeS4gIChEb24ndCBib3RoZXIgb24KKyAgICAgICAgSVJJWCA1LCBpdCBhbHJlYWR5IGhhcyBkeW5hbWljIGxpbmtpbmcgdXNpbmcgU3VuT1Mgc3R5bGUKKyAgICAgICAgc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KIAogLS13aXRoLWRsLWRsZDogRHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMgaXMgcnVtb3JlZCB0byBiZSBzdXBwb3J0ZWQKLQlvbiBzb21lIG90aGVyIHN5c3RlbXM6IFZBWCAoVWx0cml4KSwgU3VuMyAoU3VuT1MgMy40KSwgU2VxdWVudAotCVN5bW1ldHJ5IChEeW5peCksIGFuZCBBdGFyaSBTVC4gIFRoaXMgaXMgZG9uZSB1c2luZyBhCi0JY29tYmluYXRpb24gb2YgdGhlIEdOVSBkeW5hbWljIGxvYWRpbmcgcGFja2FnZQotCShmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLWRsZC0xLjEudGFyLlopIGFuZCBhbgotCWVtdWxhdGlvbiBvZiB0aGUgU0dJIGRsIGxpYnJhcnkgbWVudGlvbmVkIGFib3ZlICh0aGUgZW11bGF0aW9uCi0JY2FuIGJlIGZvdW5kIGF0Ci0JZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbGQtMy4yLjMudGFyLlopLiAgVG8KLQllbmFibGUgdGhpcywgZnRwIGFuZCBjb21waWxlIGJvdGggbGlicmFyaWVzLCB0aGVuIGNhbGwKLQljb25maWd1cmUsIHBhc3NpbmcgaXQgdGhlIG9wdGlvbgotCS0td2l0aC1kbC1kbGQ9RExfRElSRUNUT1JZLERMRF9ESVJFQ1RPUlkgd2hlcmUgRExfRElSRUNUT1JZIGlzCi0JdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBkbCBlbXVsYXRpb24gbGlicmFyeSBhbmQKLQlETERfRElSRUNUT1JZIGlzIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgR05VIGRsZCBsaWJyYXJ5LgotCShEb24ndCBib3RoZXIgb24gU3VuT1MgNCBvciA1LCB0aGV5IGFscmVhZHkgaGF2ZSBkeW5hbWljCi0JbGlua2luZyB1c2luZyBzaGFyZWQgbGlicmFyaWVzLikgIFRISVMgT1BUSU9OIElTIFVOU1VQUE9SVEVELgorICAgICAgICBvbiBzb21lIG90aGVyIHN5c3RlbXM6IFZBWCAoVWx0cml4KSwgU3VuMyAoU3VuT1MgMy40KSwgU2VxdWVudAorICAgICAgICBTeW1tZXRyeSAoRHluaXgpLCBhbmQgQXRhcmkgU1QuICBUaGlzIGlzIGRvbmUgdXNpbmcgYQorICAgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgR05VIGR5bmFtaWMgbG9hZGluZyBwYWNrYWdlCisgICAgICAgIChmdHA6Ly9mdHAuY3dpLm5sL3B1Yi9keW5sb2FkL2RsLWRsZC0xLjEudGFyLlopIGFuZCBhbgorICAgICAgICBlbXVsYXRpb24gb2YgdGhlIFNHSSBkbCBsaWJyYXJ5IG1lbnRpb25lZCBhYm92ZSAodGhlIGVtdWxhdGlvbgorICAgICAgICBjYW4gYmUgZm91bmQgYXQKKyAgICAgICAgZnRwOi8vZnRwLmN3aS5ubC9wdWIvZHlubG9hZC9kbGQtMy4yLjMudGFyLlopLiAgVG8KKyAgICAgICAgZW5hYmxlIHRoaXMsIGZ0cCBhbmQgY29tcGlsZSBib3RoIGxpYnJhcmllcywgdGhlbiBjYWxsCisgICAgICAgIGNvbmZpZ3VyZSwgcGFzc2luZyBpdCB0aGUgb3B0aW9uCisgICAgICAgIC0td2l0aC1kbC1kbGQ9RExfRElSRUNUT1JZLERMRF9ESVJFQ1RPUlkgd2hlcmUgRExfRElSRUNUT1JZIGlzCisgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgZGwgZW11bGF0aW9uIGxpYnJhcnkgYW5kCisgICAgICAgIERMRF9ESVJFQ1RPUlkgaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBHTlUgZGxkIGxpYnJhcnkuCisgICAgICAgIChEb24ndCBib3RoZXIgb24gU3VuT1MgNCBvciA1LCB0aGV5IGFscmVhZHkgaGF2ZSBkeW5hbWljCisgICAgICAgIGxpbmtpbmcgdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4pICBUSElTIE9QVElPTiBJUyBVTlNVUFBPUlRFRC4KIAogLS13aXRoLWxpYm0sIC0td2l0aC1saWJjOiBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGFsdGVybmF0aXZlCi0JdmVyc2lvbnMgZm9yIHRoZSBNYXRoIGxpYnJhcnkgKGRlZmF1bHQgLWxtKSBhbmQgdGhlIEMgbGlicmFyeQotCShkZWZhdWx0IHRoZSBlbXB0eSBzdHJpbmcpIHVzaW5nIHRoZSBvcHRpb25zCi0JLS13aXRoLWxpYm09U1RSSU5HIGFuZCAtLXdpdGgtbGliYz1TVFJJTkcsIHJlc3BlY3RpdmVseS4gIEZvcgotCWV4YW1wbGUsIGlmIHlvdXIgc3lzdGVtIHJlcXVpcmVzIHRoYXQgeW91IHBhc3MgLWxjX3MgdG8gdGhlIEMKLQljb21waWxlciB0byB1c2UgdGhlIHNoYXJlZCBDIGxpYnJhcnksIHlvdSBjYW4gcGFzcwotCS0td2l0aC1saWJjPS1sY19zLiBUaGVzZSBsaWJyYXJpZXMgYXJlIHBhc3NlZCBhZnRlciBhbGwgb3RoZXIKLQlsaWJyYXJpZXMsIHRoZSBDIGxpYnJhcnkgbGFzdC4KKyAgICAgICAgdmVyc2lvbnMgZm9yIHRoZSBNYXRoIGxpYnJhcnkgKGRlZmF1bHQgLWxtKSBhbmQgdGhlIEMgbGlicmFyeQorICAgICAgICAoZGVmYXVsdCB0aGUgZW1wdHkgc3RyaW5nKSB1c2luZyB0aGUgb3B0aW9ucworICAgICAgICAtLXdpdGgtbGlibT1TVFJJTkcgYW5kIC0td2l0aC1saWJjPVNUUklORywgcmVzcGVjdGl2ZWx5LiAgRm9yCisgICAgICAgIGV4YW1wbGUsIGlmIHlvdXIgc3lzdGVtIHJlcXVpcmVzIHRoYXQgeW91IHBhc3MgLWxjX3MgdG8gdGhlIEMKKyAgICAgICAgY29tcGlsZXIgdG8gdXNlIHRoZSBzaGFyZWQgQyBsaWJyYXJ5LCB5b3UgY2FuIHBhc3MKKyAgICAgICAgLS13aXRoLWxpYmM9LWxjX3MuIFRoZXNlIGxpYnJhcmllcyBhcmUgcGFzc2VkIGFmdGVyIGFsbCBvdGhlcgorICAgICAgICBsaWJyYXJpZXMsIHRoZSBDIGxpYnJhcnkgbGFzdC4KIAogLS13aXRoLWxpYnM9J2xpYnMnOiBBZGQgJ2xpYnMnIHRvIHRoZSBMSUJTIHRoYXQgdGhlIHB5dGhvbiBpbnRlcnByZXRlcgotCWlzIGxpbmtlZCBhZ2FpbnN0LgorICAgICAgICBpcyBsaW5rZWQgYWdhaW5zdC4KIAotLS13aXRoLWN4eD08Y29tcGlsZXI+OiBTb21lIEMrKyBjb21waWxlcnMgcmVxdWlyZSB0aGF0IG1haW4oKSBpcwotICAgICAgICBjb21waWxlZCB3aXRoIHRoZSBDKysgaWYgdGhlcmUgaXMgYW55IEMrKyBjb2RlIGluIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgU3BlY2lmaWNhbGx5LCBnKysgb24gYS5vdXQgc3lzdGVtcyBtYXkgcmVxdWlyZSB0aGF0IHRvIHN1cHBvcnQKLSAgICAgICAgY29uc3RydWN0aW9uIG9mIGdsb2JhbCBvYmplY3RzLiBXaXRoIHRoaXMgb3B0aW9uLCB0aGUgbWFpbigpIGZ1bmN0aW9uCi0gICAgICAgIG9mIFB5dGhvbiB3aWxsIGJlIGNvbXBpbGVkIHdpdGggPGNvbXBpbGVyPjsgdXNlIHRoYXQgb25seSBpZiB5b3UKLSAgICAgICAgcGxhbiB0byB1c2UgQysrIGV4dGVuc2lvbiBtb2R1bGVzLCBhbmQgaWYgeW91ciBjb21waWxlciByZXF1aXJlcwotICAgICAgICBjb21waWxhdGlvbiBvZiBtYWluKCkgYXMgYSBDKysgcHJvZ3JhbS4KKy0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+OiBJZiB5b3UgcGxhbiB0byB1c2UgQysrIGV4dGVuc2lvbiBtb2R1bGVzLAorICAgICAgICB0aGVuIC0tIG9uIHNvbWUgcGxhdGZvcm1zIC0tIHlvdSBuZWVkIHRvIGNvbXBpbGUgcHl0aG9uJ3MgbWFpbigpCisgICAgICAgIGZ1bmN0aW9uIHdpdGggdGhlIEMrKyBjb21waWxlci4gV2l0aCB0aGlzIG9wdGlvbiwgbWFrZSB3aWxsIHVzZQorICAgICAgICA8Y29tcGlsZXI+IHRvIGNvbXBpbGUgbWFpbigpICphbmQqIHRvIGxpbmsgdGhlIHB5dGhvbiBleGVjdXRhYmxlLgorICAgICAgICBJdCBpcyBsaWtlbHkgdGhhdCB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgZGVwZW5kcyBvbiB0aGUgQysrCisgICAgICAgIHJ1bnRpbWUgbGlicmFyeSBvZiA8Y29tcGlsZXI+LiAoVGhlIGRlZmF1bHQgaXMgLS13aXRob3V0LWN4eC1tYWluLikKKworICAgICAgICBUaGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHJlcXVpcmUgeW91IHRvIGJ1aWxkIFB5dGhvbgorICAgICAgICB3aXRoIGEgQysrIGNvbXBpbGVyIGluIG9yZGVyIHRvIHVzZSBDKysgZXh0ZW5zaW9uIG1vZHVsZXMuCisgICAgICAgIEUuZy4sIHg4NiBMaW51eCB3aXRoIEVMRiBzaGFyZWQgYmluYXJpZXMgYW5kIEdDQyAzLngsIDQueCBpcyBzdWNoCisgICAgICAgIGEgcGxhdGZvcm0uIFdlIHJlY29tbWVuZCB0aGF0IHlvdSBjb25maWd1cmUgUHl0aG9uCisgICAgICAgIC0td2l0aG91dC1jeHgtbWFpbiBvbiB0aG9zZSBwbGF0Zm9ybXMgYmVjYXVzZSBhIG1pc21hdGNoCisgICAgICAgIGJldHdlZW4gdGhlIEMrKyBjb21waWxlciB2ZXJzaW9uIHVzZWQgdG8gYnVpbGQgUHl0aG9uIGFuZCB0bworICAgICAgICBidWlsZCBhIEMrKyBleHRlbnNpb24gbW9kdWxlIGlzIGxpa2VseSB0byBjYXVzZSBhIGNyYXNoIGF0CisgICAgICAgIHJ1bnRpbWUuCisKKyAgICAgICAgVGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gYWxzbyBzdG9yZXMgdGhlIHZhcmlhYmxlIENYWCB0aGF0CisgICAgICAgIGRldGVybWluZXMsIGUuZy4sIHRoZSBDKysgY29tcGlsZXIgZGlzdHV0aWxzIGNhbGxzIGJ5IGRlZmF1bHQKKyAgICAgICAgdG8gYnVpbGQgQysrIGV4dGVuc2lvbnMuIElmIHlvdSBzZXQgQ1hYIG9uIHRoZSBjb25maWd1cmUgY29tbWFuZAorICAgICAgICBsaW5lIHRvIGFueSBzdHJpbmcgb2Ygbm9uLXplcm8gbGVuZ3RoLCB0aGVuIGNvbmZpZ3VyZSB3b24ndAorICAgICAgICBjaGFuZ2UgQ1hYLiBJZiB5b3UgZG8gbm90IHByZXNldCBDWFggYnV0IHBhc3MKKyAgICAgICAgLS13aXRoLWN4eC1tYWluPTxjb21waWxlcj4sIHRoZW4gY29uZmlndXJlIHNldHMgQ1hYPTxjb21waWxlcj4uCisgICAgICAgIEluIGFsbCBvdGhlciBjYXNlcywgY29uZmlndXJlIGxvb2tzIGZvciBhIEMrKyBjb21waWxlciBieQorICAgICAgICBzb21lIGNvbW1vbiBuYW1lcyAoYysrLCBnKyssIGdjYywgQ0MsIGN4eCwgY2MrKywgY2wpIGFuZCBzZXRzCisgICAgICAgIENYWCB0byB0aGUgZmlyc3QgY29tcGlsZXIgaXQgZmluZHMuIElmIGl0IGRvZXMgbm90IGZpbmQgYW55CisgICAgICAgIEMrKyBjb21waWxlciwgdGhlbiBpdCBzZXRzIENYWD0iIi4KKworICAgICAgICBTaW1pbGFybHksIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgY29tbWFuZCB1c2VkIHRvIGxpbmsgdGhlCisgICAgICAgIHB5dGhvbiBleGVjdXRhYmxlLCB0aGVuIHNldCBMSU5LQ0Mgb24gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCiAKIAogLS13aXRoLXB5ZGVidWc6ICBFbmFibGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgY29kZSB0byBoZWxwIHRyYWNrIGRvd24KLQltZW1vcnkgbWFuYWdlbWVudCBwcm9ibGVtcy4gIFRoaXMgYWxsb3dzIHByaW50aW5nIGEgbGlzdCBvZiBhbGwKLQlsaXZlIG9iamVjdHMgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcy4KKyAgICAgICAgbWVtb3J5IG1hbmFnZW1lbnQgcHJvYmxlbXMuICBUaGlzIGFsbG93cyBwcmludGluZyBhIGxpc3Qgb2YgYWxsCisgICAgICAgIGxpdmUgb2JqZWN0cyB3aGVuIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzLgogCiAtLXdpdGgob3V0KS11bml2ZXJzYWwtbmV3bGluZXM6IGVuYWJsZSByZWFkaW5nIG9mIHRleHQgZmlsZXMgd2l0aAotCWZvcmVpZ24gbmV3bGluZSBjb252ZW50aW9uIChkZWZhdWx0OiBlbmFibGVkKS4gSW4gb3RoZXIgd29yZHMsCi0JYW55IG9mIFxyLCBcbiBvciBcclxuIGlzIGFjY2VwdGFibGUgYXMgZW5kLW9mLWxpbmUgY2hhcmFjdGVyLgotCUlmIGVuYWJsZWQgaW1wb3J0IGFuZCBleGVjZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGFueSBuZXdsaW5lCi0JaW4gZmlsZXMuIFB5dGhvbiBjb2RlIGNhbiBvcGVuIGEgZmlsZSB3aXRoIG9wZW4oZmlsZSwgJ1UnKSB0bwotCXJlYWQgaXQgaW4gdW5pdmVyc2FsIG5ld2xpbmUgbW9kZS4gVEhJUyBPUFRJT04gSVMgVU5TVVBQT1JURUQuCisgICAgICAgIGZvcmVpZ24gbmV3bGluZSBjb252ZW50aW9uIChkZWZhdWx0OiBlbmFibGVkKS4gSW4gb3RoZXIgd29yZHMsCisgICAgICAgIGFueSBvZiBcciwgXG4gb3IgXHJcbiBpcyBhY2NlcHRhYmxlIGFzIGVuZC1vZi1saW5lIGNoYXJhY3Rlci4KKyAgICAgICAgSWYgZW5hYmxlZCBpbXBvcnQgYW5kIGV4ZWNmaWxlIHdpbGwgYXV0b21hdGljYWxseSBhY2NlcHQgYW55IG5ld2xpbmUKKyAgICAgICAgaW4gZmlsZXMuIFB5dGhvbiBjb2RlIGNhbiBvcGVuIGEgZmlsZSB3aXRoIG9wZW4oZmlsZSwgJ1UnKSB0bworICAgICAgICByZWFkIGl0IGluIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUuIFRISVMgT1BUSU9OIElTIFVOU1VQUE9SVEVELgogCiAtLXdpdGgtdHNjOiBQcm9maWxlIHVzaW5nIHRoZSBQZW50aXVtIHRpbWVzdGFtcGluZyBjb3VudGVyIChUU0MpLgogCi0tLXdpdGgtZnBlY3RsOiAgRW5hYmxlIGJ1aWxkaW5nIHRoZSBgYGZwZWN0bCcnIG1vZHVsZSB3aGljaCBjYW4gYmUgdXNlZAotCXRvIGNvbnRyb2wgdGhlIGdlbmVyYXRpb24gb2YgU0lHRlBFIGFuZCBpdHMgY29udmVyc2lvbiBpbnRvIGEKLQlQeXRob24gZXhjZXB0aW9uLiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBkYW5nZXJvdXMgb3IgdXNlbGVzcwotCWV4Y2VwdCBpbiB0aGUgaGFuZHMgb2YgZXhwZXJ0cy4KKy0td2l0aC1zeXN0ZW0tZmZpOiAgQnVpbGQgdGhlIF9jdHlwZXMgZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBhbiBmZmkKKwlsaWJyYXJ5IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLgogCiAKIEJ1aWxkaW5nIGZvciBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzICh1c2luZyB0aGUgVlBBVEggZmVhdHVyZSkKQEAgLTEwODEsMTMgKzExMTEsMTMgQEAKIGluIC91c3IvdG1wL3B5dGhvbiAoYXNzdW1pbmcgfmd1aWRvL3NyYy9weXRob24gaXMgdGhlIHRvcGxldmVsCiBkaXJlY3RvcnkgYW5kIHlvdSB3YW50IHRvIGJ1aWxkIGluIC91c3IvdG1wL3B5dGhvbik6CiAKLQkkIG1rZGlyIC91c3IvdG1wL3B5dGhvbgotCSQgY2QgL3Vzci90bXAvcHl0aG9uCi0JJCB+Z3VpZG8vc3JjL3B5dGhvbi9jb25maWd1cmUKLQlbLi4uXQotCSQgbWFrZQotCVsuLi5dCi0JJAorICAgICAgICAkIG1rZGlyIC91c3IvdG1wL3B5dGhvbgorICAgICAgICAkIGNkIC91c3IvdG1wL3B5dGhvbgorICAgICAgICAkIH5ndWlkby9zcmMvcHl0aG9uL2NvbmZpZ3VyZQorICAgICAgICBbLi4uXQorICAgICAgICAkIG1ha2UKKyAgICAgICAgWy4uLl0KKyAgICAgICAgJAogCiBOb3RlIHRoYXQgY29uZmlndXJlIGNvcGllcyB0aGUgb3JpZ2luYWwgU2V0dXAgZmlsZSB0byB0aGUgYnVpbGQKIGRpcmVjdG9yeSBpZiBpdCBmaW5kcyBubyBTZXR1cCBmaWxlIHRoZXJlLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4KQEAgLTExODQsMTMgKzEyMTQsMTIgQEAKIE1vc3Qgc3ViZGlyZWN0b3JpZXMgaGF2ZSB0aGVpciBvd24gUkVBRE1FIGZpbGVzLiAgTW9zdCBmaWxlcyBoYXZlCiBjb21tZW50cy4KIAotLmN2c2lnbm9yZQlBZGRpdGlvbmFsIGZpbGVuYW1lIG1hdGNoaW5nIHBhdHRlcm5zIGZvciBDVlMgdG8gaWdub3JlCi1CZU9TLwkJRmlsZXMgc3BlY2lmaWMgdG8gdGhlIEJlT1MgcG9ydAorQmVPUy8gICAgICAgICAgIEZpbGVzIHNwZWNpZmljIHRvIHRoZSBCZU9TIHBvcnQKIERlbW8vICAgICAgICAgICBEZW1vbnN0cmF0aW9uIHNjcmlwdHMsIG1vZHVsZXMgYW5kIHByb2dyYW1zCi1Eb2MvCQlEb2N1bWVudGF0aW9uIHNvdXJjZXMgKExhVGVYKQorRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24gc291cmNlcyAoTGFUZVgpCiBHcmFtbWFyLyAgICAgICAgSW5wdXQgZm9yIHRoZSBwYXJzZXIgZ2VuZXJhdG9yCiBJbmNsdWRlLyAgICAgICAgUHVibGljIGhlYWRlciBmaWxlcwotTElDRU5TRQkJTGljZW5zaW5nIGluZm9ybWF0aW9uCitMSUNFTlNFICAgICAgICAgTGljZW5zaW5nIGluZm9ybWF0aW9uCiBMaWIvICAgICAgICAgICAgUHl0aG9uIGxpYnJhcnkgbW9kdWxlcwogTWFjLyAgICAgICAgICAgIE1hY2ludG9zaCBzcGVjaWZpYyByZXNvdXJjZXMKIE1ha2VmaWxlLnByZS5pbiBTb3VyY2UgZnJvbSB3aGljaCBjb25maWcuc3RhdHVzIGNyZWF0ZXMgdGhlIE1ha2VmaWxlLnByZQpAQCAtMTE5OCw3ICsxMjI3LDcgQEAKIE1vZHVsZXMvICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBtb3N0IGJ1aWx0LWluIG1vZHVsZXMKIE9iamVjdHMvICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBtb3N0IGJ1aWx0LWluIG9iamVjdCB0eXBlcwogUEMvICAgICAgICAgICAgIEZpbGVzIHNwZWNpZmljIHRvIFBDIHBvcnRzIChET1MsIFdpbmRvd3MsIE9TLzIpCi1QQ2J1aWxkLwlCdWlsZCBkaXJlY3RvcnkgZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrCitQQ2J1aWxkLyAgICAgICAgQnVpbGQgZGlyZWN0b3J5IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKwogUGFyc2VyLyAgICAgICAgIFRoZSBwYXJzZXIgYW5kIHRva2VuaXplciBhbmQgdGhlaXIgaW5wdXQgaGFuZGxpbmcKIFB5dGhvbi8gICAgICAgICBUaGUgYnl0ZS1jb21waWxlciBhbmQgaW50ZXJwcmV0ZXIKIFJFQURNRSAgICAgICAgICBUaGUgZmlsZSB5b3UncmUgcmVhZGluZyBub3cKQEAgLTEyMDcsNiArMTIzNiw3IEBACiBjb25maWd1cmUgICAgICAgQ29uZmlndXJhdGlvbiBzaGVsbCBzY3JpcHQgKEdOVSBhdXRvY29uZiBvdXRwdXQpCiBjb25maWd1cmUuaW4gICAgQ29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uIChpbnB1dCBmb3IgR05VIGF1dG9jb25mKQogaW5zdGFsbC1zaCAgICAgIFNoZWxsIHNjcmlwdCB1c2VkIHRvIGluc3RhbGwgZmlsZXMKK3NldHVwLnB5ICAgICAgICBQeXRob24gc2NyaXB0IHVzZWQgdG8gYnVpbGQgZXh0ZW5zaW9uIG1vZHVsZXMKIAogVGhlIGZvbGxvd2luZyBmaWxlcyB3aWxsIChtYXkpIGJlIGNyZWF0ZWQgaW4gdGhlIHRvcGxldmVsIGRpcmVjdG9yeSBieQogdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIHByb2Nlc3NlczoKQEAgLTEyMTgsOCArMTI0OCw4IEBACiBweWNvbmZpZy5oICAgICAgQ29uZmlndXJhdGlvbiBoZWFkZXIKIGNvbmZpZy5sb2cgICAgICBMb2cgZnJvbSBsYXN0IGNvbmZpZ3VyZSBydW4KIGNvbmZpZy5zdGF0dXMgICBTdGF0dXMgZnJvbSBsYXN0IHJ1biBvZiB0aGUgY29uZmlndXJlIHNjcmlwdAotZ2V0YnVpbGRpbmZvLm8JT2JqZWN0IGZpbGUgZnJvbSBNb2R1bGVzL2dldGJ1aWxkaW5mby5jCi1saWJweXRob248dmVyc2lvbj4uYQlUaGUgbGlicmFyeSBhcmNoaXZlCitnZXRidWlsZGluZm8ubyAgT2JqZWN0IGZpbGUgZnJvbSBNb2R1bGVzL2dldGJ1aWxkaW5mby5jCitsaWJweXRob248dmVyc2lvbj4uYSAgICBUaGUgbGlicmFyeSBhcmNoaXZlCiBweXRob24gICAgICAgICAgVGhlIGV4ZWN1dGFibGUgaW50ZXJwcmV0ZXIKIHRhZ3MsIFRBR1MgICAgICBUYWdzIGZpbGVzIGZvciB2aSBhbmQgRW1hY3MKIApkaWZmIC0tZ2l0IGEvUklTQ09TL01ha2VmaWxlIGIvUklTQ09TL01ha2VmaWxlCmluZGV4IDkyZjUyNzIuLjE3ODhiNWMgMTAwNjQ0Ci0tLSBhL1JJU0NPUy9NYWtlZmlsZQorKysgYi9SSVNDT1MvTWFrZWZpbGUKQEAgLTc0LDcgKzc0LDYgQEAKIAlALl4uTGliLm1kNS9weWRcCiAJQC5eLkxpYi5vcGVyYXRvci9weWRcCiAJQC5eLkxpYi5wYXJzZXIvcHlkXAotCUAuXi5MaWIucmVnZXgvcHlkXAogCUAuXi5MaWIucmdiaW1nL3B5ZFwKIAlALl4uTGliLnNoYS9weWRcCiAJQC5eLkxpYi5zaWduYWwvcHlkXApAQCAtMjg0LDEwICsyODMsNiBAQAogQC5eLkxpYi5wYXJzZXIvcHlkOiBALl4uTW9kdWxlcy5vLnBhcnNlcm1vZHVsZSBzLmxpbmt0YWIKIAkkKE1BS0VETEspIC1kIEAuXi5MaWIucGFyc2VyL3B5ZCAtcyBzLmxpbmt0YWIgLW8gQC5eLk1vZHVsZXMuby5wYXJzZXJtb2R1bGUgLWUgaW5pdHBhcnNlcgogCi1ALl4uTGliLnJlZ2V4L3B5ZDogQC5eLk1vZHVsZXMuby5yZWdleG1vZHVsZSBALl4uTW9kdWxlcy5vLnJlZ2V4cHIgcy5saW5rdGFiCi0JJChMSU5LKSAtYW9mIC1vIEAuXi5Nb2R1bGVzLm8ucmVnZXhsaW5rIEAuXi5Nb2R1bGVzLm8ucmVnZXhtb2R1bGUgQC5eLk1vZHVsZXMuby5yZWdleHByCi0JJChNQUtFRExLKSAtZCBALl4uTGliLnJlZ2V4L3B5ZCAtcyBzLmxpbmt0YWIgLW8gQC5eLk1vZHVsZXMuby5yZWdleGxpbmsgLWUgaW5pdHJlZ2V4Ci0KIEAuXi5MaWIucmdiaW1nL3B5ZDogQC5eLk1vZHVsZXMuby5yZ2JpbWdtb2R1bGUgcy5saW5rdGFiCiAJJChNQUtFRExLKSAtZCBALl4uTGliLnJnYmltZy9weWQgLXMgcy5saW5rdGFiIC1vIEAuXi5Nb2R1bGVzLm8ucmdiaW1nbW9kdWxlIC1lIGluaXRyZ2JpbWcKIApkaWZmIC0tZ2l0IGEvVG9vbHMvYmdlbi9iZ2VuL2JnZW5PYmplY3REZWZpbml0aW9uLnB5IGIvVG9vbHMvYmdlbi9iZ2VuL2JnZW5PYmplY3REZWZpbml0aW9uLnB5CmluZGV4IGE4MDJmOTMuLjZmOWJkNTMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2JnZW4vYmdlbi9iZ2VuT2JqZWN0RGVmaW5pdGlvbi5weQorKysgYi9Ub29scy9iZ2VuL2JnZW4vYmdlbk9iamVjdERlZmluaXRpb24ucHkKQEAgLTM4Myw2ICszODMsOCBAQAogICAgICAgICBPdXRwdXQoIiVzX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8iLCBzZWxmLnByZWZpeCkKIAogICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHlfYmFzZWNhbGwoc2VsZik6CisgICAgICAgICIiIklmIGEgdHlwZSBzaGFyZXMgaXRzIGluaXQgY2FsbCB3aXRoIGl0cyBiYXNlIHR5cGUgc2V0IG91dHB1dF90cF9pbml0Qm9keQorICAgICAgICB0byBvdXRwdXRfdHBfaW5pdEJvZHlfYmFzZWNhbGwiIiIKICAgICAgICAgaWYgc2VsZi5iYXNldHlwZToKICAgICAgICAgICAgIE91dHB1dCgiaWYgKCVzLnRwX2luaXQpIiwgc2VsZi5iYXNldHlwZSkKICAgICAgICAgICAgIE91dExicmFjZSgpCkBAIC0zOTUsNyArMzk3LDYgQEAKICAgICAgICAgaWYgc2VsZi5vdXRwdXRfdHBfaW5pdEJvZHk6CiAgICAgICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKSIsIHNlbGYucHJlZml4KQogICAgICAgICAgICAgT3V0TGJyYWNlKCkKLSAgICAgICAgICAgIHNlbGYub3V0cHV0X3RwX2luaXRCb2R5X2Jhc2VjYWxsKCkKICAgICAgICAgICAgIHNlbGYub3V0cHV0X3RwX2luaXRCb2R5KCkKICAgICAgICAgICAgIE91dFJicmFjZSgpCiAgICAgICAgIGVsc2U6CkBAIC00MjUsNyArNDI2LDcgQEAKICAgICAgICAgaWYgc2VsZi5iYXNldHlwZToKICAgICAgICAgICAgIE91dHB1dCgiaWYgKCVzLnRwX25ldykiLCBzZWxmLmJhc2V0eXBlKQogICAgICAgICAgICAgT3V0TGJyYWNlKCkKLSAgICAgICAgICAgIE91dHB1dCgiaWYgKCAoKiVzLnRwX2luaXQpKF9zZWxmLCBfYXJncywgX2t3ZHMpID09IE5VTEwpIHJldHVybiBOVUxMOyIsIHNlbGYuYmFzZXR5cGUpCisgICAgICAgICAgICBPdXRwdXQoImlmICggKColcy50cF9uZXcpKHR5cGUsIF9hcmdzLCBfa3dkcykgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Iiwgc2VsZi5iYXNldHlwZSkKICAgICAgICAgICAgIERlZGVudCgpCiAgICAgICAgICAgICBPdXRwdXQoIn0gZWxzZSB7IikKICAgICAgICAgICAgIEluZGVudCgpCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC9idWlsZC5iYXQgYi9Ub29scy9idWlsZGJvdC9idWlsZC5iYXQKaW5kZXggZTNiNzdiZS4uZTk2MzIzYyAxMDA2NDQKLS0tIGEvVG9vbHMvYnVpbGRib3QvYnVpbGQuYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L2J1aWxkLmJhdApAQCAtMSw0ICsxLDUgQEAKIEByZW0gVXNlZCBieSB0aGUgYnVpbGRib3QgImNvbXBpbGUiIHN0ZXAuCiBjbWQgL2MgVG9vbHNcYnVpbGRib3RcZXh0ZXJuYWwuYmF0CiBjYWxsICIlVlM3MUNPTU5UT09MUyV2c3ZhcnMzMi5iYXQiCitjbWQgL3EvYyBUb29sc1xidWlsZGJvdFxraWxsX3B5dGhvbi5iYXQKIGRldmVudi5jb20gL3VzZWVudiAvYnVpbGQgRGVidWcgUENidWlsZFxwY2J1aWxkLnNsbgpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwuYmF0IGIvVG9vbHMvYnVpbGRib3QvZXh0ZXJuYWwuYmF0CmluZGV4IDFiMDMyYWUuLmM2ZDI1MmQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L2V4dGVybmFsLmJhdAorKysgYi9Ub29scy9idWlsZGJvdC9leHRlcm5hbC5iYXQKQEAgLTEyLDMgKzEyLDI0IEBACiBpZiBub3QgZXhpc3QgZGItNC40LjIwXGJ1aWxkX3dpbjMyXGRlYnVnXGxpYmRiNDRzZC5saWIgKA0KICAgIGRldmVudiBkYi00LjQuMjBcYnVpbGRfd2luMzJcQmVya2VsZXlfREIuc2xuIC9idWlsZCBEZWJ1ZyAvcHJvamVjdCBkYl9zdGF0aWMNCiApDQorDQorQHJlbSBPcGVuU1NMDQoraWYgbm90IGV4aXN0IG9wZW5zc2wtMC45LjhhIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMC45LjhhDQorDQorQHJlbSB0Y2x0aw0KK2lmIG5vdCBleGlzdCB0Y2w4LjQuMTIgKA0KKyAgIGlmIGV4aXN0IHRjbHRrIHJkIC9zL3EgdGNsdGsNCisgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90Y2w4LjQuMTINCisgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC90azguNC4xMg0KKyAgIGNkIHRjbDguNC4xMlx3aW4NCisgICBubWFrZSAtZiBtYWtlZmlsZS52Yw0KKyAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIElOU1RBTExESVI9Li5cLi5cdGNsdGsgaW5zdGFsbA0KKyAgIGNkIC4uXC4uDQorICAgY2QgdGs4LjQuMTJcd2luDQorICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC4xMg0KKyAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsDQorKQ0KKw0KK0ByZW0gc3FsaXRlDQoraWYgbm90IGV4aXN0IHNxbGl0ZS1zb3VyY2UtMy4zLjQgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvc3FsaXRlLXNvdXJjZS0zLjMuNA0KK2lmIG5vdCBleGlzdCBidWlsZFxQQ2J1aWxkXHNxbGl0ZTMuZGxsIGNvcHkgc3FsaXRlLXNvdXJjZS0zLjMuNFxzcWxpdGUzLmRsbCBidWlsZFxQQ2J1aWxkDQpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYmF0IGIvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGI2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5iYXQKQEAgLTAsMCArMSwzIEBACitjZCBUb29sc1xidWlsZGJvdAorbm1ha2UgL0MgL1MgL2Yga2lsbF9weXRob24ubWFrCitraWxsX3B5dGhvbi5leGUKZGlmZiAtLWdpdCBhL1Rvb2xzL2J1aWxkYm90L2tpbGxfcHl0aG9uLmMgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIFRoaXMgcHJvZ3JhbSBsb29rcyBmb3IgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgYnVpbGRcUENidWlsZFxweXRob24uZXhlCisgICBpbiB0aGVpciBwYXRoIGFuZCB0ZXJtaW5hdGVzIHRoZW0uICovCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHBzYXBpLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oKQoreworCURXT1JEIHBpZHNbMTAyNF0sIGNiTmVlZGVkOworCWludCBpLCBudW1fcHJvY2Vzc2VzOworCWlmICghRW51bVByb2Nlc3NlcyhwaWRzLCBzaXplb2YocGlkcyksICZjYk5lZWRlZCkpIHsKKwkJcHJpbnRmKCJFbnVtUHJvY2Vzc2VzIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKwludW1fcHJvY2Vzc2VzID0gY2JOZWVkZWQvc2l6ZW9mKHBpZHNbMF0pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcHJvY2Vzc2VzOyBpKyspIHsKKwkJSEFORExFIGhQcm9jZXNzOworCQljaGFyIHBhdGhbTUFYX1BBVEhdOworCQlITU9EVUxFIG1vZHNbMTAyNF07CisJCWludCBrLCBudW1fbW9kczsKKwkJaFByb2Nlc3MgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OIAorCQkJCQl8IFBST0NFU1NfVk1fUkVBRCAKKwkJCQkJfCAgUFJPQ0VTU19URVJNSU5BVEUgLAorCQkJCQlGQUxTRSwgcGlkc1tpXSk7CisJCWlmICghaFByb2Nlc3MpCisJCQkvKiBwcm9jZXNzIG5vdCBhY2Nlc3NpYmxlICovCisJCQljb250aW51ZTsKKwkJaWYgKCFFbnVtUHJvY2Vzc01vZHVsZXMoaFByb2Nlc3MsIG1vZHMsIHNpemVvZihtb2RzKSwgJmNiTmVlZGVkKSkgeworCQkJLyogRm9yIHVua25vd24gcmVhc29ucywgdGhpcyBzb21ldGltZXMgcmV0dXJucyBFUlJPUl9QQVJUSUFMX0NPUFk7CisJCQkgICB0aGlzIGFwcGFyZW50bHkgbWVhbnMgd2UgYXJlIG5vdCBzdXBwb3NlZCB0byByZWFkIHRoZSBwcm9jZXNzLiAqLworCQkJaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX1BBUlRJQUxfQ09QWSkgeworCQkJCUNsb3NlSGFuZGxlKGhQcm9jZXNzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ZigiRW51bVByb2Nlc3NNb2R1bGVzIGZhaWxlZDogJWRcbiIsIEdldExhc3RFcnJvcigpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICghR2V0TW9kdWxlRmlsZU5hbWVFeChoUHJvY2VzcywgTlVMTCwgcGF0aCwgc2l6ZW9mKHBhdGgpKSkgeworCQkJcHJpbnRmKCJHZXRQcm9jZXNzSW1hZ2VGaWxlTmFtZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlfc3RybHdyKHBhdGgpOworCQkvKiBwcmludGYoIiVzXG4iLCBwYXRoKTsgKi8KKwkJaWYgKHN0cnN0cihwYXRoLCAiYnVpbGRcXHBjYnVpbGRcXHB5dGhvbl9kLmV4ZSIpICE9IE5VTEwpIHsKKwkJCXByaW50ZigiVGVybWluYXRpbmcgJXMgKHBpZCAlZClcbiIsIHBhdGgsIHBpZHNbaV0pOworCQkJaWYgKCFUZXJtaW5hdGVQcm9jZXNzKGhQcm9jZXNzLCAxKSkgeworCQkJCXByaW50ZigiVGVybWluYXRpb24gZmFpbGVkOiAlZFxuIiwgR2V0TGFzdEVycm9yKCkpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQlDbG9zZUhhbmRsZShoUHJvY2Vzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24ubWFrIGIvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24ubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjdkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5tYWsKQEAgLTAsMCArMSwyIEBACitraWxsX3B5dGhvbi5leGU6CWtpbGxfcHl0aG9uLmMKKwkJY2wgLW5vbG9nbyAtbyBraWxsX3B5dGhvbi5leGUga2lsbF9weXRob24uYyBwc2FwaS5saWIKZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vbXNnZm10LnB5IGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKaW5kZXggYjRhZTNlOS4uNjQzMzEzMSAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9tc2dmbXQucHkKKysrIGIvVG9vbHMvaTE4bi9tc2dmbXQucHkKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAgICAgc2VjdGlvbiA9IE5vbmUKICAgICAgICAgICAgIGZ1enp5ID0gMAogICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsKLSAgICAgICAgaWYgbFs6Ml0gPT0gJyMsJyBhbmQgbC5maW5kKCdmdXp6eScpOgorICAgICAgICBpZiBsWzoyXSA9PSAnIywnIGFuZCAnZnV6enknIGluIGw6CiAgICAgICAgICAgICBmdXp6eSA9IDEKICAgICAgICAgIyBTa2lwIGNvbW1lbnRzCiAgICAgICAgIGlmIGxbMF0gPT0gJyMnOgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL21zaS5weSBiL1Rvb2xzL21zaS9tc2kucHkKaW5kZXggNjY2NWQzNi4uZWZhMTY5NiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL21zaS5weQorKysgYi9Ub29scy9tc2kvbXNpLnB5CkBAIC02LDYgKzYsNyBAQAogaW1wb3J0IHVpc2FtcGxlCiBmcm9tIHdpbjMyY29tLmNsaWVudCBpbXBvcnQgY29uc3RhbnRzCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCitmcm9tIHV1aWRzIGltcG9ydCBwcm9kdWN0X2NvZGVzCiAKICMgU2V0dGluZ3MgY2FuIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlnLnB5IGJlbG93CiAjIDAgZm9yIG9mZmljaWFsIHB5dGhvbi5vcmcgcmVsZWFzZXMKQEAgLTIzLDYgKzI0LDggQEAKIGZ1bGxfY3VycmVudF92ZXJzaW9uID0gTm9uZQogIyBJcyBUY2wgYXZhaWxhYmxlIGF0IGFsbD8KIGhhdmVfdGNsID0gVHJ1ZQorIyBXaGVyZSBpcyBzcWxpdGUzLmRsbCBsb2NhdGVkLCByZWxhdGl2ZSB0byBzcmNkaXI/CitzcWxpdGVfZGlyID0gIi4uL3NxbGl0ZS1zb3VyY2UtMy4zLjQiCiAKIHRyeToKICAgICBmcm9tIGNvbmZpZyBpbXBvcnQgKgpAQCAtNjIsMzAgKzY1LDYgQEAKIHVwZ3JhZGVfY29kZV9zbmFwc2hvdD0nezkyQTI0NDgxLTNFQ0ItNDBGQy04ODM2LTA0Qjc5NjZFQzBENX0nCiB1cGdyYWRlX2NvZGU9J3s2NUU2REU0OC1BMzU4LTQzNEQtQUE0Ri00QUY3MkRCNDcxOEZ9JwogCi0jIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIFB5dGhvbiByZWxlYXNlLgotIyBUaGUgcHJvZHVjdCBjb2RlIG11c3QgY2hhbmdlIHdoZW5ldmVyIHRoZSBuYW1lIG9mIHRoZSBNU0kgZmlsZQotIyBjaGFuZ2VzLCBhbmQgd2hlbiBuZXcgY29tcG9uZW50IGNvZGVzIGFyZSBpc3N1ZWQgZm9yIGV4aXN0aW5nCi0jIGNvbXBvbmVudHMuIFNlZSAiQ2hhbmdpbmcgdGhlIFByb2R1Y3QgQ29kZSIuIEFzIHdlIGNoYW5nZSB0aGUKLSMgY29tcG9uZW50IGNvZGVzIHdpdGggZXZlcnkgYnVpbGQsIHdlIG5lZWQgYSBuZXcgcHJvZHVjdCBjb2RlCi0jIGVhY2ggdGltZS4gRm9yIGludGVybWVkaWF0ZSAoc25hcHNob3QpIHJlbGVhc2VzLCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5Ci0jIGdlbmVyYXRlZC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzLCB3ZSByZWNvcmQgdGhlIHByb2R1Y3QgY29kZXMsCi0jIHNvIHBlb3BsZSBjYW4gcmVmZXIgdG8gdGhlbS4KLXByb2R1Y3RfY29kZXMgPSB7Ci0gICAgJzIuNC4xMDEnOiAnezBlOWI0ZDhlLTZjZGEtNDQ2ZS1hMjA4LTdiOTJmM2RkZmZhMH0nLCAjIDIuNGExLCByZWxlYXNlZCBhcyBhIHNuYXBzaG90Ci0gICAgJzIuNC4xMDInOiAnezFiOTk4NzQ1LTQ5MDEtNGVkYi1iYzUyLTIxMzY4OWUxYjkyMn0nLCAjIDIuNGEyCi0gICAgJzIuNC4xMDMnOiAnezMzZmM4YmQyLTFlOGYtNGFkZC1hNDBhLWFkZTI3MjhkNTk0Mn0nLCAjIDIuNGEzCi0gICAgJzIuNC4xMTEnOiAnezUxYTdlMmE4LTIwMjUtNGVmMC04NmZmLWU2YWFiNzQyZDFmYX0nLCAjIDIuNGIxCi0gICAgJzIuNC4xMTInOiAnezRhNWU3YzFkLWM2NTktNGZlMy1iOGM5LTdjNjViZDljOTVhNX0nLCAjIDIuNGIyCi0gICAgJzIuNC4xMjEnOiAnezc1NTA4ODIxLWE4ZTktNDBhOC05NWJkLWRiZTYwMzNkZGJlYX0nLCAjIDIuNGMxCi0gICAgJzIuNC4xMjInOiAnezgzYTkxMThiLTRiZGQtNDczYi1hZmMzLWJjYjE0MmZlY2E5ZX0nLCAjIDIuNGMyCi0gICAgJzIuNC4xNTAnOiAnezgyZDkzMDJlLWYyMDktNDgwNS1iNTQ4LTUyMDg3MDQ3NDgzYX0nLCAjIDIuNC4wCi0gICAgJzIuNC4xMTIxJzone2JlMDI3NDExLThlNmItNDQ0MC1hMjliLWIwN2RmMDY5MDIzMH0nLCAjIDIuNC4xYzEKLSAgICAnMi40LjExMjInOid7MDI4MTg3NTItNDhiZi00MDc0LWEyODEtN2E0MTE0YzRmMWIxfScsICMgMi40LjFjMgotICAgICcyLjQuMTE1MCc6J3s0ZDRmNTM0Ni03ZTRhLTQwYjUtOTM4Ny1mZGI2MTgxMzU3ZmN9JywgIyAyLjQuMQotICAgICcyLjQuMjEyMSc6J3s1ZWY5ZDZiNi1kZjc4LTQ1ZDItYWIwOS0xNDc4NmEzYzVhOTl9JywgIyAyLjQuMmMxCi0gICAgJzIuNC4yMTUwJzone2IxOTFlNDljLWVhMjMtNDNiMi1iMjhhLTE0ZTA3ODQwNjliOH0nLCAjIDIuNC4yCi19Ci0KIGlmIHNuYXBzaG90OgogICAgIGN1cnJlbnRfdmVyc2lvbiA9ICIlcy4lcy4lcyIgJSAobWFqb3IsIG1pbm9yLCBpbnQodGltZS50aW1lKCkvMzYwMC8yNCkpCiAgICAgcHJvZHVjdF9jb2RlID0gbXNpbGliLmdlbl91dWlkKCkKQEAgLTEwOSwxNCArODgsMTAgQEAKICAgICAnX3RraW50ZXIucHlkJywKICAgICAnX21zaS5weWQnLAogICAgICdfY3R5cGVzLnB5ZCcsCi0gICAgJ19jdHlwZXNfdGVzdC5weWQnCisgICAgJ19jdHlwZXNfdGVzdC5weWQnLAorICAgICdfc3FsaXRlMy5weWQnCiBdCiAKLWlmIG1ham9yK21pbm9yIDw9ICIyNCI6Ci0gICAgZXh0ZW5zaW9ucy5leHRlbmQoWwotICAgICd6bGliLnB5ZCcsCi0gICAgXSkKLQogIyBXZWxsLWtub3duIGNvbXBvbmVudCBVVUlEcwogIyBUaGVzZSBhcmUgbmVlZGVkIGZvciBTaGFyZWRETExzIHJlZmVyZW5jZSBjb3VudGVyOyBpZgogIyBhIGRpZmZlcmVudCBVVUlEIHdhcyB1c2VkIGZvciBlYWNoIGluY2FybmF0aW9uIG9mLCBzYXksCkBAIC0zOTIsNyArMzY3LDcgQEAKICAgICAgICAgICAgICAgKCJWZXJkYW5hUmVkOSIsICJWZXJkYW5hIiwgOSwgMjU1LCAwKSwKICAgICAgICAgICAgICBdKQogCi0gICAgY29tcGlsZWFyZ3MgPSByIi1XaSBbVEFSR0VURElSXUxpYlxjb21waWxlYWxsLnB5IC1mIC14IGJhZHN5bnRheCBbVEFSR0VURElSXUxpYiIKKyAgICBjb21waWxlYXJncyA9IHIiLVdpIFtUQVJHRVRESVJdTGliXGNvbXBpbGVhbGwucHkgLWYgLXggYmFkX2NvZGluZ3xiYWRzeW50YXh8c2l0ZS1wYWNrYWdlcyBbVEFSR0VURElSXUxpYiIKICAgICAjIFNlZSAiQ3VzdG9tQWN0aW9uIFRhYmxlIgogICAgIGFkZF9kYXRhKGRiLCAiQ3VzdG9tQWN0aW9uIiwgWwogICAgICAgICAjIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZUZpcnN0U2VxdWVuY2UgKyBtc2lkYkN1c3RvbUFjdGlvblR5cGVUZXh0RGF0YSArIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZVByb3BlcnR5CkBAIC00OTEsNyArNDY2LDcgQEAKICAgICBjID0gZXhpdF9kaWFsb2cudGV4dCgid2FybmluZyIsIDEzNSwgMjAwLCAyMjAsIDQwLCAweDMwMDAzLAogICAgICAgICAgICAgIntcXFZlcmRhbmFSZWQ5fVdhcm5pbmc6IFB5dGhvbiAyLjUueCBpcyB0aGUgbGFzdCAiCiAgICAgICAgICAgICAiUHl0aG9uIHJlbGVhc2UgZm9yIFdpbmRvd3MgOXguIikKLSAgICBjLmNvbmRpdGlvbigiSGlkZSIsICJOT1QgVmVyc2lvbjl4IikKKyAgICBjLmNvbmRpdGlvbigiSGlkZSIsICJOT1QgVmVyc2lvbjlYIikKIAogICAgIGV4aXRfZGlhbG9nLnRleHQoIkRlc2NyaXB0aW9uIiwgMTM1LCAyMzUsIDIyMCwgMjAsIDB4MzAwMDMsCiAgICAgICAgICAgICAgICAiQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGUgSW5zdGFsbGVyLiIpCkBAIC05MTQsNyArODg5LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgdGNsdGsuc2V0X2N1cnJlbnQoKQogICAgICAgICBlbGlmIGRpciBpbiBbJ3Rlc3QnLCAndGVzdHMnLCAnZGF0YScsICdvdXRwdXQnXToKLSAgICAgICAgICAgICMgdGVzdDogTGliLCBMaWIvZW1haWwsIExpYi9ic2RkYgorICAgICAgICAgICAgIyB0ZXN0OiBMaWIsIExpYi9lbWFpbCwgTGliL2JzZGRiLCBMaWIvY3R5cGVzLCBMaWIvc3FsaXRlMwogICAgICAgICAgICAgIyB0ZXN0czogTGliL2Rpc3R1dGlscwogICAgICAgICAgICAgIyBkYXRhOiBMaWIvZW1haWwvdGVzdAogICAgICAgICAgICAgIyBvdXRwdXQ6IExpYi90ZXN0CkBAIC05NDEsNiArOTE2LDggQEAKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgidGVzdC54bWwub3V0IikKICAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgidGVzdHRhci50YXIiKQogICAgICAgICAgICAgbGliLmFkZF9maWxlKCJ0ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwiKQorICAgICAgICAgICAgbGliLmFkZF9maWxlKCJjaGVja19zb3VuZGNhcmQudmJzIikKKyAgICAgICAgICAgIGxpYi5hZGRfZmlsZSgiZW1wdHkudmJzIikKICAgICAgICAgICAgIGxpYi5nbG9iKCIqLnV1ZSIpCiAgICAgICAgICAgICBsaWIuYWRkX2ZpbGUoInJlYWRtZS50eHQiLCBzcmM9IlJFQURNRSIpCiAgICAgICAgIGlmIGRpcj09J2RlY2ltYWx0ZXN0ZGF0YSc6CkBAIC05OTAsNiArOTY3LDE0IEBACiAgICAgICAgICAgICB0Y2xkaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHNyY2RpcisiLy4uL3RjbHRrL2JpbiIpCiAgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2IxKHRjbGRpciwgIiouZGxsIik6CiAgICAgICAgICAgICAgICAgbGliLmFkZF9maWxlKGYsIHNyYz1vcy5wYXRoLmpvaW4odGNsZGlyLCBmKSkKKyAgICAjIEFkZCBzcWxpdGUKKyAgICBpZiBtc2lsaWIubXNpX3R5cGU9PSJJbnRlbDY0OzEwMzMiOgorICAgICAgICBzcWxpdGVfYXJjaCA9ICIvaWE2NCIKKyAgICBlbGlmIG1zaWxpYi5tc2lfdHlwZT09Ing2NDsxMDMzIjoKKyAgICAgICAgc3FsaXRlX2FyY2ggPSAiL2FtZDY0IgorICAgIGVsc2U6CisgICAgICAgIHNxbGl0ZV9hcmNoID0gIiIKKyAgICBsaWIuYWRkX2ZpbGUoc3JjZGlyKyIvIitzcWxpdGVfZGlyK3NxbGl0ZV9hcmNoKyIvc3FsaXRlMy5kbGwiKQogICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHVua25vd24gZXh0ZW5zaW9ucwogICAgIGZvciBmIGluIGdsb2IuZ2xvYjEoc3JjZGlyKyIvUENCdWlsZCIsICIqLnB5ZCIpOgogICAgICAgICBpZiBmLmVuZHN3aXRoKCJfZC5weWQiKTogY29udGludWUgIyBkZWJ1ZyB2ZXJzaW9uCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdXVpZHMucHkgYi9Ub29scy9tc2kvdXVpZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3ZTYwNAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS91dWlkcy5weQpAQCAtMCwwICsxLDMzIEBACisjIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIFB5dGhvbiByZWxlYXNlLgorIyBUaGUgcHJvZHVjdCBjb2RlIG11c3QgY2hhbmdlIHdoZW5ldmVyIHRoZSBuYW1lIG9mIHRoZSBNU0kgZmlsZQorIyBjaGFuZ2VzLCBhbmQgd2hlbiBuZXcgY29tcG9uZW50IGNvZGVzIGFyZSBpc3N1ZWQgZm9yIGV4aXN0aW5nCisjIGNvbXBvbmVudHMuIFNlZSAiQ2hhbmdpbmcgdGhlIFByb2R1Y3QgQ29kZSIuIEFzIHdlIGNoYW5nZSB0aGUKKyMgY29tcG9uZW50IGNvZGVzIHdpdGggZXZlcnkgYnVpbGQsIHdlIG5lZWQgYSBuZXcgcHJvZHVjdCBjb2RlCisjIGVhY2ggdGltZS4gRm9yIGludGVybWVkaWF0ZSAoc25hcHNob3QpIHJlbGVhc2VzLCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5CisjIGdlbmVyYXRlZC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzLCB3ZSByZWNvcmQgdGhlIHByb2R1Y3QgY29kZXMsCisjIHNvIHBlb3BsZSBjYW4gcmVmZXIgdG8gdGhlbS4KK3Byb2R1Y3RfY29kZXMgPSB7CisgICAgJzIuNC4xMDEnOiAnezBlOWI0ZDhlLTZjZGEtNDQ2ZS1hMjA4LTdiOTJmM2RkZmZhMH0nLCAjIDIuNGExLCByZWxlYXNlZCBhcyBhIHNuYXBzaG90CisgICAgJzIuNC4xMDInOiAnezFiOTk4NzQ1LTQ5MDEtNGVkYi1iYzUyLTIxMzY4OWUxYjkyMn0nLCAjIDIuNGEyCisgICAgJzIuNC4xMDMnOiAnezMzZmM4YmQyLTFlOGYtNGFkZC1hNDBhLWFkZTI3MjhkNTk0Mn0nLCAjIDIuNGEzCisgICAgJzIuNC4xMTEnOiAnezUxYTdlMmE4LTIwMjUtNGVmMC04NmZmLWU2YWFiNzQyZDFmYX0nLCAjIDIuNGIxCisgICAgJzIuNC4xMTInOiAnezRhNWU3YzFkLWM2NTktNGZlMy1iOGM5LTdjNjViZDljOTVhNX0nLCAjIDIuNGIyCisgICAgJzIuNC4xMjEnOiAnezc1NTA4ODIxLWE4ZTktNDBhOC05NWJkLWRiZTYwMzNkZGJlYX0nLCAjIDIuNGMxCisgICAgJzIuNC4xMjInOiAnezgzYTkxMThiLTRiZGQtNDczYi1hZmMzLWJjYjE0MmZlY2E5ZX0nLCAjIDIuNGMyCisgICAgJzIuNC4xNTAnOiAnezgyZDkzMDJlLWYyMDktNDgwNS1iNTQ4LTUyMDg3MDQ3NDgzYX0nLCAjIDIuNC4wCisgICAgJzIuNC4xMTIxJzone2JlMDI3NDExLThlNmItNDQ0MC1hMjliLWIwN2RmMDY5MDIzMH0nLCAjIDIuNC4xYzEKKyAgICAnMi40LjExMjInOid7MDI4MTg3NTItNDhiZi00MDc0LWEyODEtN2E0MTE0YzRmMWIxfScsICMgMi40LjFjMgorICAgICcyLjQuMTE1MCc6J3s0ZDRmNTM0Ni03ZTRhLTQwYjUtOTM4Ny1mZGI2MTgxMzU3ZmN9JywgIyAyLjQuMQorICAgICcyLjQuMjEyMSc6J3s1ZWY5ZDZiNi1kZjc4LTQ1ZDItYWIwOS0xNDc4NmEzYzVhOTl9JywgIyAyLjQuMmMxCisgICAgJzIuNC4yMTUwJzone2IxOTFlNDljLWVhMjMtNDNiMi1iMjhhLTE0ZTA3ODQwNjliOH0nLCAjIDIuNC4yCisgICAgJzIuNC4zMTIxJzone2Y2NjllZDRkLTFkY2UtNDFjNC05NjE3LWQ5ODUzOTcxODdhMX0nLCAjIDIuNC4zYzEKKyAgICAnMi40LjMxNTAnOid7NzVlNzFhZGQtMDQyYy00ZjMwLWJmYWMtYTllYzQyMzUxMzEzfScsICMgMi40LjMKKyAgICAnMi41LjEwMSc6ICd7YmMxNGNlM2UtNWU3Mi00YTY0LWFjMWYtYmY1OWE1NzE4OThjfScsICMgMi41YTEKKyAgICAnMi41LjEwMic6ICd7NWVlZDUxYzEtOGU5ZC00MDcxLTk0YzUtYjQwZGU1ZDQ5YmE1fScsICMgMi41YTIKKyAgICAnMi41LjEwMyc6ICd7NzNkY2Q5NjYtZmZlYy00MTVmLWJiMzktODM0MmMxZjQ3MDE3fScsICMgMi41YTMKKyAgICAnMi41LjExMSc6ICd7Yzc5N2VjZjgtYThlNi00ZmVjLWJiOTktNTI2YjY1ZjI4NjI2fScsICMgMi41YjEKKyAgICAnMi41LjExMic6ICd7MzJiZWI3NzQtZjYyNS00MzlkLWI1ODctNzE4NzQ4N2JhZjE1fScsICMgMi41YjIKKyAgICAnMi41LjEyMSc6ICd7OGU5MzIxYmMtNmIyNC00OGEzLThmZDQtYzk1ZjhlNTMxZTVmfScsICMgMi41YzEKKyAgICAnMi41LjEyMic6ICd7YTZjZDUwOGQtOTU5OS00NWRhLWE0NDEtY2JmZmE5ZjdlMDcwfScsICMgMi41YzIKKyAgICAnMi41LjE1MCc6ICd7MGEyYzU4NTQtNTU3ZS00OGM4LTgzNWEtM2I5ZjA3NGJkY2FhfScsICMgMi41LjAKK30KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weSBiL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVjMzBhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5CkBAIC0wLDAgKzEsNzc4IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgU2ltcGxlSW50ZWdlckFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDEyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMworCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMworICAgICAgICAgICAgYyA9IDMKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMworCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNpbXBsZUZsb2F0QXJpdGhtZXRpYyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSAqICgzICsgNSArIDUgKyAzICsgMyArIDMpCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMi4xCisgICAgICAgICAgICBiID0gMy4zMzMyCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDEyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzLjE0MTU5CisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICBiID0gMworICAgICAgICAgICAgYyA9IDMuMTQxNTkKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIKKyAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICBjID0gMy4xNDE1OQorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgYiA9IDMKKyAgICAgICAgICAgIGMgPSAzLjE0MTU5CisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgU2ltcGxlTG9uZ0FyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDMwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMjIyMDAwMUwKKyAgICAgICAgICAgIGIgPSAxMDAwMDFMCisgICAgICAgICAgICBjID0gMzAwMDVMCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyMjIwMDAxTAorICAgICAgICAgICAgYiA9IDEwMDAwMUwKKyAgICAgICAgICAgIGMgPSAzMDAwNUwKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIyMjAwMDFMCisgICAgICAgICAgICBiID0gMTAwMDAxTAorICAgICAgICAgICAgYyA9IDMwMDA1TAorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMjIyMDAwMUwKKyAgICAgICAgICAgIGIgPSAxMDAwMDFMCisgICAgICAgICAgICBjID0gMzAwMDVMCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyMjIwMDAxTAorICAgICAgICAgICAgYiA9IDEwMDAwMUwKKyAgICAgICAgICAgIGMgPSAzMDAwNUwKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU2ltcGxlQ29tcGxleEFyaXRobWV0aWMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQorICAgIHJvdW5kcyA9IDQwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBhID0gMiArIDNqCisgICAgICAgICAgICBiID0gMi41ICsgNC41agorICAgICAgICAgICAgYyA9IDEuMiArIDYuMmoKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIgKyAzagorICAgICAgICAgICAgYiA9IDIuNSArIDQuNWoKKyAgICAgICAgICAgIGMgPSAxLjIgKyA2LjJqCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGEgPSAyICsgM2oKKyAgICAgICAgICAgIGIgPSAyLjUgKyA0LjVqCisgICAgICAgICAgICBjID0gMS4yICsgNi4yagorCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworICAgICAgICAgICAgYyA9IGMgKyBhCisgICAgICAgICAgICBjID0gYSArIGIKKyAgICAgICAgICAgIGMgPSBiICsgYworCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBhIC0gYgorICAgICAgICAgICAgYyA9IGIgLSBjCisgICAgICAgICAgICBjID0gYyAtIGEKKyAgICAgICAgICAgIGMgPSBiIC0gYworCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICAgICAgICAgIGMgPSBhICogYgorICAgICAgICAgICAgYyA9IGIgKiBhCisgICAgICAgICAgICBjID0gYyAqIGIKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBhID0gMiArIDNqCisgICAgICAgICAgICBiID0gMi41ICsgNC41agorICAgICAgICAgICAgYyA9IDEuMiArIDYuMmoKKworICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKyAgICAgICAgICAgIGMgPSBjICsgYQorICAgICAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICAgICBjID0gYiArIGMKKworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYSAtIGIKKyAgICAgICAgICAgIGMgPSBiIC0gYworICAgICAgICAgICAgYyA9IGMgLSBhCisgICAgICAgICAgICBjID0gYiAtIGMKKworICAgICAgICAgICAgYyA9IGEgLyBiCisgICAgICAgICAgICBjID0gYiAvIGEKKyAgICAgICAgICAgIGMgPSBjIC8gYgorCisgICAgICAgICAgICBjID0gYSAqIGIKKyAgICAgICAgICAgIGMgPSBiICogYQorICAgICAgICAgICAgYyA9IGMgKiBiCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYSA9IDIgKyAzagorICAgICAgICAgICAgYiA9IDIuNSArIDQuNWoKKyAgICAgICAgICAgIGMgPSAxLjIgKyA2LjJqCisKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisgICAgICAgICAgICBjID0gYyArIGEKKyAgICAgICAgICAgIGMgPSBhICsgYgorICAgICAgICAgICAgYyA9IGIgKyBjCisKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGEgLSBiCisgICAgICAgICAgICBjID0gYiAtIGMKKyAgICAgICAgICAgIGMgPSBjIC0gYQorICAgICAgICAgICAgYyA9IGIgLSBjCisKKyAgICAgICAgICAgIGMgPSBhIC8gYgorICAgICAgICAgICAgYyA9IGIgLyBhCisgICAgICAgICAgICBjID0gYyAvIGIKKworICAgICAgICAgICAgYyA9IGEgKiBiCisgICAgICAgICAgICBjID0gYiAqIGEKKyAgICAgICAgICAgIGMgPSBjICogYgorCisgICAgICAgICAgICBjID0gYSAvIGIKKyAgICAgICAgICAgIGMgPSBiIC8gYQorICAgICAgICAgICAgYyA9IGMgLyBiCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTdhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5CkBAIC0wLDAgKzEsNDEwIEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgUHl0aG9uRnVuY3Rpb25DYWxscyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMSs0KzQrMikKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYsZjEsZyxoCisKKyAgICAgICAgIyBkZWZpbmUgZnVuY3Rpb25zCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGYxKHgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBnKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiBhLGIsYworCisgICAgICAgIGRlZiBoKGEsYixjLGQ9MSxlPTIsZj0zKToKKyAgICAgICAgICAgIHJldHVybiBkLGUsZgorCisgICAgICAgICMgZG8gY2FsbHMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGcoaSxpLGkpCisgICAgICAgICAgICBnKGksaSxpKQorICAgICAgICAgICAgZyhpLGksaSkKKyAgICAgICAgICAgIGgoaSxpLDMsaSxpKQorICAgICAgICAgICAgaChpLGksaSwyLGksMykKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYsZjEsZyxoCisKKyAgICAgICAgIyBkZWZpbmUgZnVuY3Rpb25zCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGYxKHgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBnKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiBhLGIsYworCisgICAgICAgIGRlZiBoKGEsYixjLGQ9MSxlPTIsZj0zKToKKyAgICAgICAgICAgIHJldHVybiBkLGUsZgorCisgICAgICAgICMgZG8gY2FsbHMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworIyMjCisKK2NsYXNzIEJ1aWx0aW5GdW5jdGlvbkNhbGxzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuNAorICAgIG9wZXJhdGlvbnMgPSA1KigyKzUrNSs1KQorICAgIHJvdW5kcyA9IDMwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIGxvY2FsaXplIGZ1bmN0aW9ucworICAgICAgICBmMCA9IGdsb2JhbHMKKyAgICAgICAgZjEgPSBoYXNoCisgICAgICAgIGYyID0gY21wCisgICAgICAgIGYzID0gcmFuZ2UKKworICAgICAgICAjIGRvIGNhbGxzCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKworICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorCisgICAgICAgICAgICBmMCgpCisgICAgICAgICAgICBmMCgpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYyKDEsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYwKCkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjIoMSwyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKworICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjAoKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMShpKQorICAgICAgICAgICAgZjEoaSkKKyAgICAgICAgICAgIGYxKGkpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMigxLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorICAgICAgICAgICAgZjMoMSwzLDIpCisgICAgICAgICAgICBmMygxLDMsMikKKyAgICAgICAgICAgIGYzKDEsMywyKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICAjIGxvY2FsaXplIGZ1bmN0aW9ucworICAgICAgICBmMCA9IGRpcgorICAgICAgICBmMSA9IGhhc2gKKyAgICAgICAgZjIgPSByYW5nZQorICAgICAgICBmMyA9IHJhbmdlCisKKyAgICAgICAgIyBkbyBjYWxscworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisjIyMKKworY2xhc3MgUHl0aG9uTWV0aG9kQ2FsbHMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA1ICsgNCkKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKworICAgICAgICAgICAgeCA9IDIKKyAgICAgICAgICAgIHMgPSAnc3RyaW5nJworCisgICAgICAgICAgICBkZWYgZihzZWxmKToKKworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLngKKworICAgICAgICAgICAgZGVmIGooc2VsZixhLGIpOgorCisgICAgICAgICAgICAgICAgc2VsZi55ID0gYQorICAgICAgICAgICAgICAgIHNlbGYudCA9IGIKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi55CisKKyAgICAgICAgICAgIGRlZiBrKHNlbGYsYSxiLGM9Myk6CisKKyAgICAgICAgICAgICAgICBzZWxmLnkgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5zID0gYgorICAgICAgICAgICAgICAgIHNlbGYudCA9IGMKKworICAgICAgICBvID0gYygpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaigyLDIpCisgICAgICAgICAgICBvLmsoaSxpKQorICAgICAgICAgICAgby5rKGksMikKKyAgICAgICAgICAgIG8uayhpLDIsMykKKyAgICAgICAgICAgIG8uayhpLGksYz00KQorCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKDIsMikKKyAgICAgICAgICAgIG8uayhpLGkpCisgICAgICAgICAgICBvLmsoaSwyKQorICAgICAgICAgICAgby5rKGksMiwzKQorICAgICAgICAgICAgby5rKGksaSxjPTQpCisKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooMiwyKQorICAgICAgICAgICAgby5rKGksaSkKKyAgICAgICAgICAgIG8uayhpLDIpCisgICAgICAgICAgICBvLmsoaSwyLDMpCisgICAgICAgICAgICBvLmsoaSxpLGM9NCkKKworICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLGkpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKGksMikKKyAgICAgICAgICAgIG8uaigyLDIpCisgICAgICAgICAgICBvLmsoaSxpKQorICAgICAgICAgICAgby5rKGksMikKKyAgICAgICAgICAgIG8uayhpLDIsMykKKyAgICAgICAgICAgIG8uayhpLGksYz00KQorCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmYoKQorICAgICAgICAgICAgby5mKCkKKyAgICAgICAgICAgIG8uZigpCisgICAgICAgICAgICBvLmooaSxpKQorICAgICAgICAgICAgby5qKGksaSkKKyAgICAgICAgICAgIG8uaihpLDIpCisgICAgICAgICAgICBvLmooaSwyKQorICAgICAgICAgICAgby5qKDIsMikKKyAgICAgICAgICAgIG8uayhpLGkpCisgICAgICAgICAgICBvLmsoaSwyKQorICAgICAgICAgICAgby5rKGksMiwzKQorICAgICAgICAgICAgby5rKGksaSxjPTQpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisKKyAgICAgICAgICAgIHggPSAyCisgICAgICAgICAgICBzID0gJ3N0cmluZycKKworICAgICAgICAgICAgZGVmIGYoc2VsZik6CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54CisKKyAgICAgICAgICAgIGRlZiBqKHNlbGYsYSxiKToKKworICAgICAgICAgICAgICAgIHNlbGYueSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLnQgPSBiCisKKyAgICAgICAgICAgIGRlZiBrKHNlbGYsYSxiLGM9Myk6CisKKyAgICAgICAgICAgICAgICBzZWxmLnkgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5zID0gYgorICAgICAgICAgICAgICAgIHNlbGYudCA9IGMKKworICAgICAgICBvID0gYworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKyMjIworCitjbGFzcyBSZWN1cnNpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUKKyAgICByb3VuZHMgPSA1MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZ2xvYmFsIGYKKworICAgICAgICBkZWYgZih4KToKKworICAgICAgICAgICAgaWYgeCA+IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYoeC0xKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgZigxMCkKKyAgICAgICAgICAgIGYoMTApCisgICAgICAgICAgICBmKDEwKQorICAgICAgICAgICAgZigxMCkKKyAgICAgICAgICAgIGYoMTApCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGdsb2JhbCBmCisKKyAgICAgICAgZGVmIGYoeCk6CisKKyAgICAgICAgICAgIGlmIHggPiAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmKHgtMSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weSBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3ZTA3YgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKQEAgLTAsMCArMSw2MzQgQEAKKyIiIiBDb21tYW5kTGluZSAtIEdldCBhbmQgcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKKworICAgIE5PVEU6IFRoaXMgc3RpbGwgaXMgdmVyeSBtdWNoIHdvcmsgaW4gcHJvZ3Jlc3MgISEhCisKKyAgICBEaWZmZXJlbnQgdmVyc2lvbiBhcmUgbGlrZWx5IHRvIGJlIGluY29tcGF0aWJsZS4KKworICAgIFRPRE86CisKKyAgICAqIEluY29ycG9yYXRlIHRoZSBjaGFuZ2VzIG1hZGUgYnkgKHNlZSBJbmJveCkKKyAgICAqIEFkZCBudW1iZXIgcmFuZ2Ugb3B0aW9uIHVzaW5nIHNyYW5nZSgpIAorCisiIiIKKworX19jb3B5cmlnaHRfXyA9ICIiIlwKK0NvcHlyaWdodCAoYyksIDE5OTctMjAwNiwgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pCitDb3B5cmlnaHQgKGMpLCAyMDAwLTIwMDYsIGVHZW5peC5jb20gU29mdHdhcmUgR21iSCAoaW5mb0BlZ2VuaXguY29tKQorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGNvcHlyaWdodHMsCitvciBjb250YWN0IHRoZSBhdXRob3IuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisiIiIKKworX192ZXJzaW9uX18gPSAnMS4yJworCitpbXBvcnQgc3lzLCBnZXRvcHQsIHN0cmluZywgZ2xvYiwgb3MsIHJlLCBleGNlcHRpb25zLCB0cmFjZWJhY2sKKworIyMjIEhlbHBlcnMKKworZGVmIF9nZXRvcHRfZmxhZ3Mob3B0aW9ucyk6CisKKyAgICAiIiIgQ29udmVydCB0aGUgb3B0aW9uIGxpc3QgdG8gYSBnZXRvcHQgZmxhZyBzdHJpbmcgYW5kIGxvbmcgb3B0CisgICAgICAgIGxpc3QKKworICAgICIiIgorICAgIHMgPSBbXQorICAgIGwgPSBbXQorICAgIGZvciBvIGluIG9wdGlvbnM6CisgICAgICAgIGlmIG8ucHJlZml4ID09ICctJzoKKyAgICAgICAgICAgICMgc2hvcnQgb3B0aW9uCisgICAgICAgICAgICBzLmFwcGVuZChvLm5hbWUpCisgICAgICAgICAgICBpZiBvLnRha2VzX2FyZ3VtZW50OgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCc6JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbG9uZyBvcHRpb24KKyAgICAgICAgICAgIGlmIG8udGFrZXNfYXJndW1lbnQ6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoby5uYW1lKyc9JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoby5uYW1lKQorICAgIHJldHVybiBzdHJpbmcuam9pbihzLCcnKSxsCisKK2RlZiBpbnZpc2libGVfaW5wdXQocHJvbXB0PSc+Pj4gJyk6CisKKyAgICAiIiIgR2V0IHJhdyBpbnB1dCBmcm9tIGEgdGVybWluYWwgd2l0aG91dCBlY2hvaW5nIHRoZSBjaGFyYWN0ZXJzIHRvCisgICAgICAgIHRoZSB0ZXJtaW5hbCwgZS5nLiBmb3IgcGFzc3dvcmQgcXVlcmllcy4KKworICAgICIiIgorICAgIGltcG9ydCBnZXRwYXNzCisgICAgZW50cnkgPSBnZXRwYXNzLmdldHBhc3MocHJvbXB0KQorICAgIGlmIGVudHJ5IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgcmV0dXJuIGVudHJ5CisKK2RlZiBmaWxlb3BlbihuYW1lLCBtb2RlPSd3YicsIGVuY29kaW5nPU5vbmUpOgorCisgICAgIiIiIE9wZW4gYSBmaWxlIHVzaW5nIG1vZGUuCisKKyAgICAgICAgRGVmYXVsdCBtb2RlIGlzICd3YicgbWVhbmluZyB0byBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nIGluCisgICAgICAgIGJpbmFyeSBtb2RlLiBJZiBlbmNvZGluZyBpcyBnaXZlbiwgSS9PIHRvIGFuZCBmcm9tIHRoZSBmaWxlIGlzCisgICAgICAgIHRyYW5zcGFyZW50bHkgZW5jb2RlZCB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuCisKKyAgICAgICAgRmlsZXMgb3BlbmVkIGZvciB3cml0aW5nIGFyZSBjaG1vZCgpZWQgdG8gMDYwMC4KKworICAgICIiIgorICAgIGlmIG5hbWUgPT0gJ3N0ZG91dCc6CisgICAgICAgIHJldHVybiBzeXMuc3Rkb3V0CisgICAgZWxpZiBuYW1lID09ICdzdGRlcnInOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorICAgIGVsaWYgbmFtZSA9PSAnc3RkaW4nOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZWxzZToKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgY29kZWNzCisgICAgICAgICAgICBmID0gY29kZWNzLm9wZW4obmFtZSwgbW9kZSwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmID0gb3BlbihuYW1lLCBtb2RlKQorICAgICAgICBpZiAndycgaW4gbW9kZToKKyAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIDA2MDApCisgICAgICAgIHJldHVybiBmCisKK2RlZiBvcHRpb25fZGljdChvcHRpb25zKToKKworICAgICIiIiBSZXR1cm4gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvIE9wdGlvbiBpbnN0YW5jZXMuCisgICAgIiIiCisgICAgZCA9IHt9CisgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25zOgorICAgICAgICBkW29wdGlvbi5uYW1lXSA9IG9wdGlvbgorICAgIHJldHVybiBkCisKKyMgQWxpYXMKK2dldHBhc3N3ZCA9IGludmlzaWJsZV9pbnB1dAorCitfaW50ZWdlclJFID0gcmUuY29tcGlsZSgnXHMqKC0/XGQrKVxzKiQnKQorX2ludGVnZXJSYW5nZVJFID0gcmUuY29tcGlsZSgnXHMqKC0/XGQrKVxzKi1ccyooLT9cZCspXHMqJCcpCisKK2RlZiBzcmFuZ2UocywKKworICAgICAgICAgICBzcGxpdD1zdHJpbmcuc3BsaXQsaW50ZWdlcj1faW50ZWdlclJFLAorICAgICAgICAgICBpbnRlZ2VyUmFuZ2U9X2ludGVnZXJSYW5nZVJFKToKKworICAgICIiIiBDb252ZXJ0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgaW50ZWdlciBudW1iZXJzIGFuZCByYW5nZXMKKyAgICAgICAgdG8gYSBQeXRob24gbGlzdC4KKworICAgICAgICBTdXBwb3J0ZWQgZm9ybWF0czogMiwzLDQsMi0xMCwtMSAtIC0zLCA1IC0gLTIKKworICAgICAgICBWYWx1ZXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBjcmVhdGVkIGxpc3QgaW4gdGhlIG9yZGVyIHNwZWNpZmllZAorICAgICAgICBpbiB0aGUgc3RyaW5nLgorCisgICAgIiIiCisgICAgbCA9IFtdCisgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICBmb3IgZW50cnkgaW4gc3BsaXQocywnLCcpOgorICAgICAgICBtID0gaW50ZWdlci5tYXRjaChlbnRyeSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGFwcGVuZChpbnQobS5ncm91cHMoKVswXSkpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBtID0gaW50ZWdlclJhbmdlLm1hdGNoKGVudHJ5KQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgc3RhcnQsZW5kID0gbWFwKGludCxtLmdyb3VwcygpKQorICAgICAgICAgICAgbFtsZW4obCk6XSA9IHJhbmdlKHN0YXJ0LGVuZCsxKQorICAgIHJldHVybiBsCisKK2RlZiBhYnNwYXRoKHBhdGgsCisKKyAgICAgICAgICAgIGV4cGFuZHZhcnM9b3MucGF0aC5leHBhbmR2YXJzLGV4cGFuZHVzZXI9b3MucGF0aC5leHBhbmR1c2VyLAorICAgICAgICAgICAgam9pbj1vcy5wYXRoLmpvaW4sZ2V0Y3dkPW9zLmdldGN3ZCk6CisKKyAgICAiIiIgUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFic29sdXRlIHBhdGggZm9yIHBhdGguCisKKyAgICAgICAgcGF0aCBpcyBleHBhbmRlZCBpbiB0aGUgdXN1YWwgc2hlbGwgd2F5cyBiZWZvcmUKKyAgICAgICAgam9pbmluZyBpdCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBwYXRoID0gZXhwYW5kdmFycyhwYXRoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgcGF0aCA9IGV4cGFuZHVzZXIocGF0aCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gam9pbihnZXRjd2QoKSwgcGF0aCkKKworIyMjIE9wdGlvbiBjbGFzc2VzCisKK2NsYXNzIE9wdGlvbjoKKworICAgICIiIiBPcHRpb24gYmFzZSBjbGFzcy4gVGFrZXMgbm8gYXJndW1lbnQuCisKKyAgICAiIiIKKyAgICBkZWZhdWx0ID0gTm9uZQorICAgIGhlbHB0ZXh0ID0gJycKKyAgICBwcmVmaXggPSAnLScKKyAgICB0YWtlc19hcmd1bWVudCA9IDAKKyAgICBoYXNfZGVmYXVsdCA9IDAKKyAgICB0YWIgPSAxNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxoZWxwPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBuYW1lWzoxXSA9PSAnLSc6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsJ29wdGlvbiBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggIi0iJworICAgICAgICBpZiBuYW1lWzE6Ml0gPT0gJy0nOgorICAgICAgICAgICAgc2VsZi5wcmVmaXggPSAnLS0nCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lWzI6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZVsxOl0KKyAgICAgICAgaWYgaGVscDoKKyAgICAgICAgICAgIHNlbGYuaGVscCA9IGhlbHAKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorCisgICAgICAgIG8gPSBzZWxmCisgICAgICAgIG5hbWUgPSBvLnByZWZpeCArIG8ubmFtZQorICAgICAgICBpZiBvLnRha2VzX2FyZ3VtZW50OgorICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnIGFyZycKKyAgICAgICAgaWYgbGVuKG5hbWUpID4gc2VsZi50YWI6CisgICAgICAgICAgICBuYW1lID0gbmFtZSArICdcbicgKyAnICcgKiAoc2VsZi50YWIgKyAxICsgbGVuKG8ucHJlZml4KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAnJS0qcyAnICUgKHNlbGYudGFiLCBuYW1lKQorICAgICAgICBkZXNjcmlwdGlvbiA9IG8uaGVscAorICAgICAgICBpZiBvLmhhc19kZWZhdWx0OgorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiArICcgKCVzKScgJSBvLmRlZmF1bHQKKyAgICAgICAgcmV0dXJuICclcyAlcycgJSAobmFtZSwgZGVzY3JpcHRpb24pCisKK2NsYXNzIEFyZ3VtZW50T3B0aW9uKE9wdGlvbik6CisKKyAgICAiIiIgT3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQuCisKKyAgICAgICAgQW4gb3B0aW9uYWwgZGVmYXVsdCBhcmd1bWVudCBjYW4gYmUgZ2l2ZW4uCisgICAgICAgIAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUsaGVscD1Ob25lLGRlZmF1bHQ9Tm9uZSk6CisKKyAgICAgICAgIyBCYXNlbWV0aG9kCisgICAgICAgIE9wdGlvbi5fX2luaXRfXyhzZWxmLG5hbWUsaGVscCkKKworICAgICAgICBpZiBkZWZhdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgICAgICAgc2VsZi5oYXNfZGVmYXVsdCA9IDEKKyAgICAgICAgc2VsZi50YWtlc19hcmd1bWVudCA9IDEKKworY2xhc3MgU3dpdGNoT3B0aW9uKE9wdGlvbik6CisKKyAgICAiIiIgT3B0aW9ucyB0aGF0IGNhbiBiZSBvbiBvciBvZmYuIEhhcyBhbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsbmFtZSxoZWxwPU5vbmUsZGVmYXVsdD1Ob25lKToKKworICAgICAgICAjIEJhc2VtZXRob2QKKyAgICAgICAgT3B0aW9uLl9faW5pdF9fKHNlbGYsbmFtZSxoZWxwKQorCisgICAgICAgIGlmIGRlZmF1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0CisgICAgICAgICAgICBzZWxmLmhhc19kZWZhdWx0ID0gMQorCisjIyMgQXBwbGljYXRpb24gYmFzZWNsYXNzCisKK2NsYXNzIEFwcGxpY2F0aW9uOgorCisgICAgIiIiIENvbW1hbmQgbGluZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugd2l0aCBidWlsdGluIGFyZ3VtZW50CisgICAgICAgIHBhcnNpbmcuCisKKyAgICAiIiIKKyAgICAjIE9wdGlvbnMgdGhlIHByb2dyYW0gYWNjZXB0cyAoT3B0aW9uIGluc3RhbmNlcykKKyAgICBvcHRpb25zID0gW10KKworICAgICMgU3RhbmRhcmQgc2V0dGluZ3M7IHRoZXNlIGFyZSBhcHBlbmRlZCB0byBvcHRpb25zIGluIF9faW5pdF9fCisgICAgcHJlc2V0X29wdGlvbnMgPSBbU3dpdGNoT3B0aW9uKCctdicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW5lcmF0ZSB2ZXJib3NlIG91dHB1dCcpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLWgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyB0aGlzIGhlbHAgdGV4dCcpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS1oZWxwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3cgdGhpcyBoZWxwIHRleHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tZGVidWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlIGRlYnVnZ2luZycpLAorICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS1jb3B5cmlnaHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyBjb3B5cmlnaHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tZXhhbXBsZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdyBleGFtcGxlcyBvZiB1c2FnZScpXQorCisgICAgIyBUaGUgaGVscCBsYXlvdXQgbG9va3MgbGlrZSB0aGlzOgorICAgICMgW2hlYWRlcl0gICAtIGRlZmF1bHRzIHRvICcnCisgICAgIworICAgICMgW3N5bm9wc2lzXSAtIGZvcm1hdHRlZCBhcyAnPHNlbGYubmFtZT4gJXMnICUgc2VsZi5zeW5vcHNpcworICAgICMKKyAgICAjIG9wdGlvbnM6CisgICAgIyBbb3B0aW9uc10gIC0gZm9ybWF0dGVkIGZyb20gc2VsZi5vcHRpb25zCisgICAgIworICAgICMgW3ZlcnNpb25dICAtIGZvcm1hdHRlZCBhcyAnVmVyc2lvbjpcbiAlcycgJSBzZWxmLnZlcnNpb24sIGlmIGdpdmVuCisgICAgIworICAgICMgW2Fib3V0XSAgICAtIGRlZmF1bHRzIHRvICcnCisgICAgIworICAgICMgTm90ZTogYWxsIGZpZWxkcyB0aGF0IGRvIG5vdCBiZWhhdmUgYXMgdGVtcGxhdGUgYXJlIGZvcm1hdHRlZAorICAgICMgICAgICAgdXNpbmcgdGhlIGluc3RhbmNlcyBkaWN0aW9uYXJ5IGFzIHN1YnN0aXR1dGlvbiBuYW1lc3BhY2UsCisgICAgIyAgICAgICBlLmcuICUobmFtZSlzIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGFwcGxpY2F0aW9ucyBuYW1lLgorICAgICMKKworICAgICMgSGVhZGVyIChkZWZhdWx0IHRvIHByb2dyYW0gbmFtZSkKKyAgICBoZWFkZXIgPSAnJworCisgICAgIyBOYW1lIChkZWZhdWx0cyB0byBwcm9ncmFtIG5hbWUpCisgICAgbmFtZSA9ICcnCisKKyAgICAjIFN5bm9wc2lzICglKG5hbWUpcyBpcyByZXBsYWNlZCBieSB0aGUgcHJvZ3JhbSBuYW1lKQorICAgIHN5bm9wc2lzID0gJyUobmFtZSlzIFtvcHRpb25dIGZpbGVzLi4uJworCisgICAgIyBWZXJzaW9uIChvcHRpb25hbCkKKyAgICB2ZXJzaW9uID0gJycKKworICAgICMgR2VuZXJhbCBpbmZvcm1hdGlvbiBwcmludGVkIGFmdGVyIHRoZSBwb3NzaWJsZSBvcHRpb25zIChvcHRpb25hbCkKKyAgICBhYm91dCA9ICcnCisKKyAgICAjIEV4YW1wbGVzIG9mIHVzYWdlIHRvIHNob3cgd2hlbiB0aGUgLS1leGFtcGxlcyBvcHRpb24gaXMgZ2l2ZW4gKG9wdGlvbmFsKQorICAgIGV4YW1wbGVzID0gJycKKworICAgICMgQ29weXJpZ2h0IHRvIHNob3cKKyAgICBjb3B5cmlnaHQgPSBfX2NvcHlyaWdodF9fCisKKyAgICAjIEFwcGx5IGZpbGUgZ2xvYmJpbmcgPworICAgIGdsb2JiaW5nID0gMQorCisgICAgIyBHZW5lcmF0ZSBkZWJ1ZyBvdXRwdXQgPworICAgIGRlYnVnID0gMAorCisgICAgIyBHZW5lcmF0ZSB2ZXJib3NlIG91dHB1dCA/CisgICAgdmVyYm9zZSA9IDAKKworICAgICMgSW50ZXJuYWwgZXJyb3JzIHRvIGNhdGNoCisgICAgSW50ZXJuYWxFcnJvciA9IGV4Y2VwdGlvbnMuRXhjZXB0aW9uCisKKyAgICAjIEluc3RhbmNlIHZhcmlhYmxlczoKKyAgICB2YWx1ZXMgPSBOb25lICAgICAgICMgRGljdGlvbmFyeSBvZiBwYXNzZWQgb3B0aW9ucyAob3IgZGVmYXVsdCB2YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4ZWQgYnkgdGhlIG9wdGlvbnMgbmFtZSwgZS5nLiAnLWgnCisgICAgZmlsZXMgPSBOb25lICAgICAgICAjIExpc3Qgb2YgcGFzc2VkIGZpbGVuYW1lcworICAgIG9wdGlvbmxpc3QgPSBOb25lCSMgTGlzdCBvZiBwYXNzZWQgb3B0aW9ucworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsYXJndj1Ob25lKToKKworICAgICAgICAjIFNldHVwIGFwcGxpY2F0aW9uIHNwZWNzCisgICAgICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZ3YgPSBzeXMuYXJndgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChhcmd2WzBdKVsxXQorICAgICAgICBpZiBub3Qgc2VsZi5uYW1lOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmZpbGVuYW1lKVsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcjoKKyAgICAgICAgICAgIHNlbGYuaGVhZGVyID0gc2VsZi5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhlYWRlciA9IHNlbGYuaGVhZGVyCisKKyAgICAgICAgIyBJbml0IC5hcmd1bWVudHMgbGlzdAorICAgICAgICBzZWxmLmFyZ3VtZW50cyA9IGFyZ3ZbMTpdCisgICAgICAgIAorICAgICAgICAjIFNldHVwIE9wdGlvbiBtYXBwaW5nCisgICAgICAgIHNlbGYub3B0aW9uX21hcCA9IG9wdGlvbl9kaWN0KHNlbGYub3B0aW9ucykKKyAgICAgICAgCisgICAgICAgICMgQXBwZW5kIHByZXNldCBvcHRpb25zCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5wcmVzZXRfb3B0aW9uczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbl9tYXAuaGFzX2tleShvcHRpb24ubmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfb3B0aW9uKG9wdGlvbikKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgIyBJbml0IC5maWxlcyBsaXN0CisgICAgICAgIHNlbGYuZmlsZXMgPSBbXQorCisgICAgICAgICMgU3RhcnQgQXBwbGljYXRpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQcm9jZXNzIHN0YXJ0dXAKKyAgICAgICAgICAgIHJjID0gc2VsZi5zdGFydHVwKCkKKyAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIyBQYXJzZSBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgIHJjID0gc2VsZi5wYXJzZSgpCisgICAgICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LHJjCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgU3RhcnQgYXBwbGljYXRpb24KKyAgICAgICAgICAgIHJjID0gc2VsZi5tYWluKCkKKyAgICAgICAgICAgIGlmIHJjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmMgPSAwCisKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQscmM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICcqIFVzZXIgQnJlYWsnCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcmMgPSAxCisKKyAgICAgICAgZXhjZXB0IHNlbGYuSW50ZXJuYWxFcnJvcjoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnKiBJbnRlcm5hbCBFcnJvcicKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKDIwLCBzeXMuc3Rkb3V0KQorICAgICAgICAgICAgZWxpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyAgJXM6ICVzJyAlIHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHJjID0gMQorCisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKKworICAgIGRlZiBhZGRfb3B0aW9uKHNlbGYsIG9wdGlvbik6CisKKyAgICAgICAgIiIiIEFkZCBhIG5ldyBPcHRpb24gaW5zdGFuY2UgdG8gdGhlIEFwcGxpY2F0aW9uIGR5bmFtaWNhbGx5LgorCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBoYXMgdG8gYmUgZG9uZSAqYmVmb3JlKiAucGFyc2UoKSBpcyBiZWluZworICAgICAgICAgICAgZXhlY3V0ZWQuCisgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5vcHRpb25zLmFwcGVuZChvcHRpb24pCisgICAgICAgIHNlbGYub3B0aW9uX21hcFtvcHRpb24ubmFtZV0gPSBvcHRpb24KKworICAgIGRlZiBzdGFydHVwKHNlbGYpOgorCisgICAgICAgICIiIiBTZXQgdXNlciBkZWZpbmVkIGluc3RhbmNlIHZhcmlhYmxlcy4KKworICAgICAgICAgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHRoZQorICAgICAgICAgICAgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBhcyBleGl0IGNvZGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZXhpdChzZWxmLCByYz0wKToKKworICAgICAgICAiIiIgRXhpdCB0aGUgcHJvZ3JhbS4KKworICAgICAgICAgICAgcmMgaXMgdXNlZCBhcyBleGl0IGNvZGUgYW5kIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsaW5nCisgICAgICAgICAgICBwcm9ncmFtLiBJdCBkZWZhdWx0cyB0byAwIHdoaWNoIHVzdWFsbHkgbWVhbnM6IE9LLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCByYworCisgICAgZGVmIHBhcnNlKHNlbGYpOgorCisgICAgICAgICIiIiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFuZCBmaWxsIGluIHNlbGYudmFsdWVzIGFuZCBzZWxmLmZpbGVzLgorCisgICAgICAgICAgICBBZnRlciBoYXZpbmcgcGFyc2VkIHRoZSBvcHRpb25zLCB0aGUgcmVtYWluaW5nIGNvbW1hbmQgbGluZQorICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBmaWxlcyBhbmQgcGFzc2VkIHRvIC5oYW5kbGVfZmlsZXMoKQorICAgICAgICAgICAgZm9yIHByb2Nlc3NpbmcuCisKKyAgICAgICAgICAgIEFzIGZpbmFsIHN0ZXAgdGhlIG9wdGlvbiBoYW5kbGVycyBhcmUgY2FsbGVkIGluIHRoZSBvcmRlcgorICAgICAgICAgICAgb2YgdGhlIG9wdGlvbnMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBQYXJzZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi52YWx1ZXMgPSB2YWx1ZXMgPSB7fQorICAgICAgICBmb3IgbyBpbiBzZWxmLm9wdGlvbnM6CisgICAgICAgICAgICBpZiBvLmhhc19kZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbHVlc1tvLnByZWZpeCtvLm5hbWVdID0gby5kZWZhdWx0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlc1tvLnByZWZpeCtvLm5hbWVdID0gMAorICAgICAgICBmbGFncyxsZmxhZ3MgPSBfZ2V0b3B0X2ZsYWdzKHNlbGYub3B0aW9ucykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0bGlzdCxmaWxlcyA9IGdldG9wdC5nZXRvcHQoc2VsZi5hcmd1bWVudHMsZmxhZ3MsbGZsYWdzKQorICAgICAgICAgICAgaWYgc2VsZi5nbG9iYmluZzoKKyAgICAgICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgZ2YgPSBnbG9iLmdsb2IoZikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdmOgorICAgICAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxbbGVuKGwpOl0gPSBnZgorICAgICAgICAgICAgICAgIGZpbGVzID0gbAorICAgICAgICAgICAgc2VsZi5vcHRpb25saXN0ID0gb3B0bGlzdAorICAgICAgICAgICAgc2VsZi5maWxlcyA9IGZpbGVzICsgc2VsZi5maWxlcworICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yLHdoeToKKyAgICAgICAgICAgIHNlbGYuaGVscCh3aHkpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgICMgQ2FsbCBmaWxlIGhhbmRsZXIKKyAgICAgICAgcmMgPSBzZWxmLmhhbmRsZV9maWxlcyhzZWxmLmZpbGVzKQorICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN5cy5leGl0KHJjKQorCisgICAgICAgICMgQ2FsbCBvcHRpb24gaGFuZGxlcnMKKyAgICAgICAgZm9yIG9wdGlvbm5hbWUsIHZhbHVlIGluIG9wdGxpc3Q6CisKKyAgICAgICAgICAgICMgVHJ5IHRvIGNvbnZlcnQgdmFsdWUgdG8gaW50ZWdlcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLmF0b2kodmFsdWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICMgRmluZCBoYW5kbGVyIGFuZCBjYWxsIGl0IChvciBjb3VudCB0aGUgbnVtYmVyIG9mIG9wdGlvbgorICAgICAgICAgICAgIyBpbnN0YW5jZXMgb24gdGhlIGNvbW1hbmQgbGluZSkKKyAgICAgICAgICAgIGhhbmRsZXJuYW1lID0gJ2hhbmRsZScgKyBzdHJpbmcucmVwbGFjZShvcHRpb25uYW1lLCAnLScsICdfJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBoYW5kbGVybmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgIyBjb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VyYW5jZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWVzLmhhc19rZXkob3B0aW9ubmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbb3B0aW9ubmFtZV0gPSB2YWx1ZXNbb3B0aW9ubmFtZV0gKyAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbb3B0aW9ubmFtZV0gPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzW29wdGlvbm5hbWVdID0gdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmMgPSBoYW5kbGVyKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCByYworCisgICAgICAgICMgQXBwbHkgZmluYWwgZmlsZSBjaGVjayAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisgICAgICAgIHJjID0gc2VsZi5jaGVja19maWxlcyhzZWxmLmZpbGVzKQorICAgICAgICBpZiByYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN5cy5leGl0KHJjKQorCisgICAgZGVmIGNoZWNrX2ZpbGVzKHNlbGYsZmlsZWxpc3QpOgorCisgICAgICAgICIiIiBBcHBseSBzb21lIHVzZXIgZGVmaW5lZCBjaGVja3Mgb24gdGhlIGZpbGVzIGdpdmVuIGluIGZpbGVsaXN0LgorCisgICAgICAgICAgICBUaGlzIG1heSBtb2RpZnkgZmlsZWxpc3QgaW4gcGxhY2UuIEEgdHlwaWNhbCBhcHBsaWNhdGlvbgorICAgICAgICAgICAgaXMgY2hlY2tpbmcgdGhhdCBhdCBsZWFzdCBuIGZpbGVzIGFyZSBnaXZlbi4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgSWYgdGhpcyBtZXRob2QgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHRoZQorICAgICAgICAgICAgcHJvY2VzcyBpcyB0ZXJtaW5hdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBhcyBleGl0IGNvZGUuCisgICAgICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaGVscChzZWxmLG5vdGU9JycpOgorCisgICAgICAgIHNlbGYucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgaWYgc2VsZi5zeW5vcHNpczoKKyAgICAgICAgICAgIHByaW50ICdTeW5vcHNpczonCisgICAgICAgICAgICAjIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5bm9wc2lzID0gc2VsZi5zeW5vcHNpcyAlIHNlbGYubmFtZQorICAgICAgICAgICAgZXhjZXB0IChOYW1lRXJyb3IsIEtleUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHN5bm9wc2lzID0gc2VsZi5zeW5vcHNpcyAlIHNlbGYuX19kaWN0X18KKyAgICAgICAgICAgIHByaW50ICcgJyArIHN5bm9wc2lzCisgICAgICAgIHByaW50CisgICAgICAgIHNlbGYucHJpbnRfb3B0aW9ucygpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHByaW50ICdWZXJzaW9uOicKKyAgICAgICAgICAgIHByaW50ICcgJXMnICUgc2VsZi52ZXJzaW9uCisgICAgICAgICAgICBwcmludAorICAgICAgICBpZiBzZWxmLmFib3V0OgorICAgICAgICAgICAgcHJpbnQgc3RyaW5nLnN0cmlwKHNlbGYuYWJvdXQgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgaWYgbm90ZToKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgcHJpbnQgJ05vdGU6Jyxub3RlCisgICAgICAgICAgICBwcmludAorCisgICAgZGVmIG5vdGljZShzZWxmLG5vdGUpOgorCisgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICBwcmludCAnTm90ZTonLG5vdGUKKyAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgIHByaW50CisKKyAgICBkZWYgcHJpbnRfaGVhZGVyKHNlbGYpOgorCisgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICBwcmludCBzZWxmLmhlYWRlciAlIHNlbGYuX19kaWN0X18KKyAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgIHByaW50CisKKyAgICBkZWYgcHJpbnRfb3B0aW9ucyhzZWxmKToKKworICAgICAgICBvcHRpb25zID0gc2VsZi5vcHRpb25zCisgICAgICAgIHByaW50ICdPcHRpb25zIGFuZCBkZWZhdWx0IHNldHRpbmdzOicKKyAgICAgICAgaWYgbm90IG9wdGlvbnM6CisgICAgICAgICAgICBwcmludCAnICBOb25lJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxvbmcgPSBmaWx0ZXIobGFtYmRhIHg6IHgucHJlZml4ID09ICctLScsIG9wdGlvbnMpCisgICAgICAgIHNob3J0ID0gZmlsdGVyKGxhbWJkYSB4OiB4LnByZWZpeCA9PSAnLScsIG9wdGlvbnMpCisgICAgICAgIGl0ZW1zID0gc2hvcnQgKyBsb25nCisgICAgICAgIGZvciBvIGluIG9wdGlvbnM6CisgICAgICAgICAgICBwcmludCAnICcsbworICAgICAgICBwcmludAorCisgICAgIworICAgICMgRXhhbXBsZSBoYW5kbGVyczoKKyAgICAjCisgICAgIyBJZiBhIGhhbmRsZXIgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuIE5vbmUsIHByb2Nlc3Npbmcgc3RvcHMKKyAgICAjIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBzeXMuZXhpdCgpIGFzIGFyZ3VtZW50LgorICAgICMKKworICAgICMgRmlsZSBoYW5kbGVyCisgICAgZGVmIGhhbmRsZV9maWxlcyhzZWxmLGZpbGVzKToKKworICAgICAgICAiIiIgVGhpcyBtYXkgcHJvY2VzcyB0aGUgZmlsZXMgbGlzdCBpbiBwbGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIAorICAgICMgU2hvcnQgb3B0aW9uIGhhbmRsZXIKKyAgICBkZWYgaGFuZGxlX2goc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYuaGVscCgpCisgICAgICAgIHJldHVybiAwCisgICAgCisgICAgZGVmIGhhbmRsZV92KHNlbGYsIHZhbHVlKToKKworICAgICAgICAiIiIgVHVybiBvbiB2ZXJib3NlIG91dHB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudmVyYm9zZSA9IDEKKyAgICAgICAgCisgICAgIyBIYW5kbGVycyBmb3IgbG9uZyBvcHRpb25zIGhhdmUgdHdvIHVuZGVyc2NvcmVzIGluIHRoZWlyIG5hbWUKKyAgICBkZWYgaGFuZGxlX19oZWxwKHNlbGYsYXJnKToKKworICAgICAgICBzZWxmLmhlbHAoKQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9fZGVidWcoc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYuZGVidWcgPSAxCisgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0byBjYXRjaCBpbnRlcm5hbCBlcnJvcnM6CisgICAgICAgIHNlbGYuSW50ZXJuYWxFcnJvciA9IE5vbmUKKworICAgIGRlZiBoYW5kbGVfX2NvcHlyaWdodChzZWxmLGFyZyk6CisKKyAgICAgICAgc2VsZi5wcmludF9oZWFkZXIoKQorICAgICAgICBwcmludCBzdHJpbmcuc3RyaXAoc2VsZi5jb3B5cmlnaHQgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICBwcmludAorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9fZXhhbXBsZXMoc2VsZixhcmcpOgorCisgICAgICAgIHNlbGYucHJpbnRfaGVhZGVyKCkKKyAgICAgICAgaWYgc2VsZi5leGFtcGxlczoKKyAgICAgICAgICAgIHByaW50ICdFeGFtcGxlczonCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgc3RyaW5nLnN0cmlwKHNlbGYuZXhhbXBsZXMgJSBzZWxmLl9fZGljdF9fKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdObyBleGFtcGxlcyBhdmFpbGFibGUuJworICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBtYWluKHNlbGYpOgorCisgICAgICAgICIiIiBPdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBwcm9ncmFtIGVudHJ5IHBvaW50LgorCisgICAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHBhc3NlZCB0byBzeXMuZXhpdCgpIGFzIGFyZ3VtZW50LiAgSWYKKyAgICAgICAgICAgIGl0IGlzIE5vbmUsIDAgaXMgYXNzdW1lZCAobWVhbmluZyBPSykuIFVuaGFuZGxlZAorICAgICAgICAgICAgZXhjZXB0aW9ucyBhcmUgcmVwb3J0ZWQgd2l0aCBleGl0IHN0YXR1cyBjb2RlIDEgKHNlZQorICAgICAgICAgICAgX19pbml0X18gZm9yIGZ1cnRoZXIgZGV0YWlscykuCisgICAgICAgICAgICAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyMgQWxpYXMKK0NvbW1hbmRMaW5lID0gQXBwbGljYXRpb24KKworZGVmIF90ZXN0KCk6CisKKyAgICBjbGFzcyBNeUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKToKKyAgICAgICAgaGVhZGVyID0gJ1Rlc3QgQXBwbGljYXRpb24nCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXworICAgICAgICBvcHRpb25zID0gW09wdGlvbignLXYnLCd2ZXJib3NlJyldCisgICAgICAgIAorICAgICAgICBkZWYgaGFuZGxlX3Yoc2VsZixhcmcpOgorICAgICAgICAgICAgcHJpbnQgJ1ZFUkJPU0UsIFllYWggIScKKworICAgIGNtZCA9IE15QXBwbGljYXRpb24oKQorICAgIGlmIG5vdCBjbWQudmFsdWVzWyctaCddOgorICAgICAgICBjbWQuaGVscCgpCisgICAgcHJpbnQgJ2ZpbGVzOicsY21kLmZpbGVzCisgICAgcHJpbnQgJ0J5ZS4uLicKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkgYi9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhODg4ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weQpAQCAtMCwwICsxLDU2NSBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIElmVGhlbkVsc2UoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zMQorICAgIG9wZXJhdGlvbnMgPSAzMCozICMgaGFyZCB0byBzYXkuLi4KKyAgICByb3VuZHMgPSAxNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGEsYixjID0gMSwyLDMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgICAgICAgICAgaWYgYSA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYyAhPSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMgorICAgICAgICAgICAgICAgIGVsaWYgYiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgICAgICBhID0gMgorICAgICAgICAgICAgZWxpZiBhID09IDI6CisgICAgICAgICAgICAgICAgYSA9IDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9IDEKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgYSxiLGMgPSAxLDIsMworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBOZXN0ZWRGb3JMb29wcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gMTAwMCoxMCo1CisgICAgcm91bmRzID0gMTUwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsMSA9IHJhbmdlKDEwMDApCisgICAgICAgIGwyID0gcmFuZ2UoMTApCisgICAgICAgIGwzID0gcmFuZ2UoNSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIGZvciBqIGluIGwyOgorICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBsMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgbDEgPSByYW5nZSgxMDAwKQorICAgICAgICBsMiA9IHJhbmdlKDEwKQorICAgICAgICBsMyA9IHJhbmdlKDUpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIEZvckxvb3BzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNQorICAgIHJvdW5kcyA9IDgwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGwxID0gcmFuZ2UoMTAwKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBpIGluIGwxOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGkgaW4gbDE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgaSBpbiBsMToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGwxID0gcmFuZ2UoMTAwMCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9EaWN0LnB5IGIvVG9vbHMvcHliZW5jaC9EaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2Q4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL0RpY3QucHkKQEAgLTAsMCArMSw1MDMgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBEaWN0Q3JlYXRpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDUgKyA1KQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBkMSA9IHt9CisgICAgICAgICAgICBkMiA9IHt9CisgICAgICAgICAgICBkMyA9IHt9CisgICAgICAgICAgICBkNCA9IHt9CisgICAgICAgICAgICBkNSA9IHt9CisKKyAgICAgICAgICAgIGQxID0gezE6MiwzOjQsNTo2fQorICAgICAgICAgICAgZDIgPSB7MjozLDQ6NSw2Ojd9CisgICAgICAgICAgICBkMyA9IHszOjQsNTo2LDc6OH0KKyAgICAgICAgICAgIGQ0ID0gezQ6NSw2OjcsODo5fQorICAgICAgICAgICAgZDUgPSB7Njo3LDg6OSwxMDoxMX0KKworICAgICAgICAgICAgZDEgPSB7fQorICAgICAgICAgICAgZDIgPSB7fQorICAgICAgICAgICAgZDMgPSB7fQorICAgICAgICAgICAgZDQgPSB7fQorICAgICAgICAgICAgZDUgPSB7fQorCisgICAgICAgICAgICBkMSA9IHsxOjIsMzo0LDU6Nn0KKyAgICAgICAgICAgIGQyID0gezI6Myw0OjUsNjo3fQorICAgICAgICAgICAgZDMgPSB7Mzo0LDU6Niw3Ojh9CisgICAgICAgICAgICBkNCA9IHs0OjUsNjo3LDg6OX0KKyAgICAgICAgICAgIGQ1ID0gezY6Nyw4OjksMTA6MTF9CisKKyAgICAgICAgICAgIGQxID0ge30KKyAgICAgICAgICAgIGQyID0ge30KKyAgICAgICAgICAgIGQzID0ge30KKyAgICAgICAgICAgIGQ0ID0ge30KKyAgICAgICAgICAgIGQ1ID0ge30KKworICAgICAgICAgICAgZDEgPSB7MToyLDM6NCw1OjZ9CisgICAgICAgICAgICBkMiA9IHsyOjMsNDo1LDY6N30KKyAgICAgICAgICAgIGQzID0gezM6NCw1OjYsNzo4fQorICAgICAgICAgICAgZDQgPSB7NDo1LDY6Nyw4Ojl9CisgICAgICAgICAgICBkNSA9IHs2OjcsODo5LDEwOjExfQorCisgICAgICAgICAgICBkMSA9IHt9CisgICAgICAgICAgICBkMiA9IHt9CisgICAgICAgICAgICBkMyA9IHt9CisgICAgICAgICAgICBkNCA9IHt9CisgICAgICAgICAgICBkNSA9IHt9CisKKyAgICAgICAgICAgIGQxID0gezE6MiwzOjQsNTo2fQorICAgICAgICAgICAgZDIgPSB7MjozLDQ6NSw2Ojd9CisgICAgICAgICAgICBkMyA9IHszOjQsNTo2LDc6OH0KKyAgICAgICAgICAgIGQ0ID0gezQ6NSw2OjcsODo5fQorICAgICAgICAgICAgZDUgPSB7Njo3LDg6OSwxMDoxMX0KKworICAgICAgICAgICAgZDEgPSB7fQorICAgICAgICAgICAgZDIgPSB7fQorICAgICAgICAgICAgZDMgPSB7fQorICAgICAgICAgICAgZDQgPSB7fQorICAgICAgICAgICAgZDUgPSB7fQorCisgICAgICAgICAgICBkMSA9IHsxOjIsMzo0LDU6Nn0KKyAgICAgICAgICAgIGQyID0gezI6Myw0OjUsNjo3fQorICAgICAgICAgICAgZDMgPSB7Mzo0LDU6Niw3Ojh9CisgICAgICAgICAgICBkNCA9IHs0OjUsNjo3LDg6OX0KKyAgICAgICAgICAgIGQ1ID0gezY6Nyw4OjksMTA6MTF9CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIERpY3RXaXRoU3RyaW5nS2V5cyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSooNiArIDYpCisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBkID0ge30KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBkWydhYmMnXSA9IDEKKyAgICAgICAgICAgIGRbJ2RlZiddID0gMgorICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCisgICAgICAgICAgICBkWydqa2wnXSA9IDQKKyAgICAgICAgICAgIGRbJ21ubyddID0gNQorICAgICAgICAgICAgZFsncHFyJ10gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10KKyAgICAgICAgICAgIGRbJ2RlZiddCisgICAgICAgICAgICBkWydnaGknXQorICAgICAgICAgICAgZFsnamtsJ10KKyAgICAgICAgICAgIGRbJ21ubyddCisgICAgICAgICAgICBkWydwcXInXQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddID0gMQorICAgICAgICAgICAgZFsnZGVmJ10gPSAyCisgICAgICAgICAgICBkWydnaGknXSA9IDMKKyAgICAgICAgICAgIGRbJ2prbCddID0gNAorICAgICAgICAgICAgZFsnbW5vJ10gPSA1CisgICAgICAgICAgICBkWydwcXInXSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXQorICAgICAgICAgICAgZFsnZGVmJ10KKyAgICAgICAgICAgIGRbJ2doaSddCisgICAgICAgICAgICBkWydqa2wnXQorICAgICAgICAgICAgZFsnbW5vJ10KKyAgICAgICAgICAgIGRbJ3BxciddCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10gPSAxCisgICAgICAgICAgICBkWydkZWYnXSA9IDIKKyAgICAgICAgICAgIGRbJ2doaSddID0gMworICAgICAgICAgICAgZFsnamtsJ10gPSA0CisgICAgICAgICAgICBkWydtbm8nXSA9IDUKKyAgICAgICAgICAgIGRbJ3BxciddID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddCisgICAgICAgICAgICBkWydkZWYnXQorICAgICAgICAgICAgZFsnZ2hpJ10KKyAgICAgICAgICAgIGRbJ2prbCddCisgICAgICAgICAgICBkWydtbm8nXQorICAgICAgICAgICAgZFsncHFyJ10KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXSA9IDEKKyAgICAgICAgICAgIGRbJ2RlZiddID0gMgorICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCisgICAgICAgICAgICBkWydqa2wnXSA9IDQKKyAgICAgICAgICAgIGRbJ21ubyddID0gNQorICAgICAgICAgICAgZFsncHFyJ10gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsnYWJjJ10KKyAgICAgICAgICAgIGRbJ2RlZiddCisgICAgICAgICAgICBkWydnaGknXQorICAgICAgICAgICAgZFsnamtsJ10KKyAgICAgICAgICAgIGRbJ21ubyddCisgICAgICAgICAgICBkWydwcXInXQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbJ2FiYyddID0gMQorICAgICAgICAgICAgZFsnZGVmJ10gPSAyCisgICAgICAgICAgICBkWydnaGknXSA9IDMKKyAgICAgICAgICAgIGRbJ2prbCddID0gNAorICAgICAgICAgICAgZFsnbW5vJ10gPSA1CisgICAgICAgICAgICBkWydwcXInXSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWydhYmMnXQorICAgICAgICAgICAgZFsnZGVmJ10KKyAgICAgICAgICAgIGRbJ2doaSddCisgICAgICAgICAgICBkWydqa2wnXQorICAgICAgICAgICAgZFsnbW5vJ10KKyAgICAgICAgICAgIGRbJ3BxciddCisgICAgICAgICAgICAgIAorICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgRGljdFdpdGhGbG9hdEtleXMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQorICAgIHJvdW5kcyA9IDIwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZFsxLjIzNF0gPSAxCisgICAgICAgICAgICBkWzIuMzQ1XSA9IDIKKyAgICAgICAgICAgIGRbMy40NTZdID0gMworICAgICAgICAgICAgZFs0LjU2N10gPSA0CisgICAgICAgICAgICBkWzUuNjc4XSA9IDUKKyAgICAgICAgICAgIGRbNi43ODldID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdCisgICAgICAgICAgICBkWzIuMzQ1XQorICAgICAgICAgICAgZFszLjQ1Nl0KKyAgICAgICAgICAgIGRbNC41NjddCisgICAgICAgICAgICBkWzUuNjc4XQorICAgICAgICAgICAgZFs2Ljc4OV0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XSA9IDEKKyAgICAgICAgICAgIGRbMi4zNDVdID0gMgorICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCisgICAgICAgICAgICBkWzQuNTY3XSA9IDQKKyAgICAgICAgICAgIGRbNS42NzhdID0gNQorICAgICAgICAgICAgZFs2Ljc4OV0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0KKyAgICAgICAgICAgIGRbMi4zNDVdCisgICAgICAgICAgICBkWzMuNDU2XQorICAgICAgICAgICAgZFs0LjU2N10KKyAgICAgICAgICAgIGRbNS42NzhdCisgICAgICAgICAgICBkWzYuNzg5XQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdID0gMQorICAgICAgICAgICAgZFsyLjM0NV0gPSAyCisgICAgICAgICAgICBkWzMuNDU2XSA9IDMKKyAgICAgICAgICAgIGRbNC41NjddID0gNAorICAgICAgICAgICAgZFs1LjY3OF0gPSA1CisgICAgICAgICAgICBkWzYuNzg5XSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XQorICAgICAgICAgICAgZFsyLjM0NV0KKyAgICAgICAgICAgIGRbMy40NTZdCisgICAgICAgICAgICBkWzQuNTY3XQorICAgICAgICAgICAgZFs1LjY3OF0KKyAgICAgICAgICAgIGRbNi43ODldCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0gPSAxCisgICAgICAgICAgICBkWzIuMzQ1XSA9IDIKKyAgICAgICAgICAgIGRbMy40NTZdID0gMworICAgICAgICAgICAgZFs0LjU2N10gPSA0CisgICAgICAgICAgICBkWzUuNjc4XSA9IDUKKyAgICAgICAgICAgIGRbNi43ODldID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMS4yMzRdCisgICAgICAgICAgICBkWzIuMzQ1XQorICAgICAgICAgICAgZFszLjQ1Nl0KKyAgICAgICAgICAgIGRbNC41NjddCisgICAgICAgICAgICBkWzUuNjc4XQorICAgICAgICAgICAgZFs2Ljc4OV0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzEuMjM0XSA9IDEKKyAgICAgICAgICAgIGRbMi4zNDVdID0gMgorICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCisgICAgICAgICAgICBkWzQuNTY3XSA9IDQKKyAgICAgICAgICAgIGRbNS42NzhdID0gNQorICAgICAgICAgICAgZFs2Ljc4OV0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxLjIzNF0KKyAgICAgICAgICAgIGRbMi4zNDVdCisgICAgICAgICAgICBkWzMuNDU2XQorICAgICAgICAgICAgZFs0LjU2N10KKyAgICAgICAgICAgIGRbNS42NzhdCisgICAgICAgICAgICBkWzYuNzg5XQorICAgICAgICAgICAgICAKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIERpY3RXaXRoSW50ZWdlcktleXMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQorICAgIHJvdW5kcyA9IDIwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgICAgIGRbMl0gPSAyCisgICAgICAgICAgICBkWzNdID0gMworICAgICAgICAgICAgZFs0XSA9IDQKKyAgICAgICAgICAgIGRbNV0gPSA1CisgICAgICAgICAgICBkWzZdID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0KKyAgICAgICAgICAgIGRbMl0KKyAgICAgICAgICAgIGRbM10KKyAgICAgICAgICAgIGRbNF0KKyAgICAgICAgICAgIGRbNV0KKyAgICAgICAgICAgIGRbNl0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdID0gMQorICAgICAgICAgICAgZFsyXSA9IDIKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIGRbNl0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXQorICAgICAgICAgICAgZFsyXQorICAgICAgICAgICAgZFszXQorICAgICAgICAgICAgZFs0XQorICAgICAgICAgICAgZFs1XQorICAgICAgICAgICAgZFs2XQorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0gPSAxCisgICAgICAgICAgICBkWzJdID0gMgorICAgICAgICAgICAgZFszXSA9IDMKKyAgICAgICAgICAgIGRbNF0gPSA0CisgICAgICAgICAgICBkWzVdID0gNQorICAgICAgICAgICAgZFs2XSA9IDYKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdCisgICAgICAgICAgICBkWzJdCisgICAgICAgICAgICBkWzNdCisgICAgICAgICAgICBkWzRdCisgICAgICAgICAgICBkWzVdCisgICAgICAgICAgICBkWzZdCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgICAgIGRbMl0gPSAyCisgICAgICAgICAgICBkWzNdID0gMworICAgICAgICAgICAgZFs0XSA9IDQKKyAgICAgICAgICAgIGRbNV0gPSA1CisgICAgICAgICAgICBkWzZdID0gNgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRbMV0KKyAgICAgICAgICAgIGRbMl0KKyAgICAgICAgICAgIGRbM10KKyAgICAgICAgICAgIGRbNF0KKyAgICAgICAgICAgIGRbNV0KKyAgICAgICAgICAgIGRbNl0KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICBkWzFdID0gMQorICAgICAgICAgICAgZFsyXSA9IDIKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIGRbNl0gPSA2CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgZFsxXQorICAgICAgICAgICAgZFsyXQorICAgICAgICAgICAgZFszXQorICAgICAgICAgICAgZFs0XQorICAgICAgICAgICAgZFs1XQorICAgICAgICAgICAgZFs2XQorICAgICAgICAgICAgICAKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNpbXBsZURpY3RNYW5pcHVsYXRpb24oVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2ICsgNiArIDYpCisgICAgcm91bmRzID0gNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICAgICAgICAgIGRbMF0gPSAzCisgICAgICAgICAgICBkWzFdID0gNAorICAgICAgICAgICAgZFsyXSA9IDUKKyAgICAgICAgICAgIGRbM10gPSAzCisgICAgICAgICAgICBkWzRdID0gNAorICAgICAgICAgICAgZFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGRbMF0KKyAgICAgICAgICAgIHggPSBkWzFdCisgICAgICAgICAgICB4ID0gZFsyXQorICAgICAgICAgICAgeCA9IGRbM10KKyAgICAgICAgICAgIHggPSBkWzRdCisgICAgICAgICAgICB4ID0gZFs1XQorCisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgICAgIGQuaGFzX2tleSgyKQorICAgICAgICAgICAgZC5oYXNfa2V5KDQpCisgICAgICAgICAgICBkLmhhc19rZXkoNikKKyAgICAgICAgICAgIGQuaGFzX2tleSg4KQorICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorCisgICAgICAgICAgICBkZWwgZFswXQorICAgICAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgICAgIGRlbCBkWzJdCisgICAgICAgICAgICBkZWwgZFszXQorICAgICAgICAgICAgZGVsIGRbNF0KKyAgICAgICAgICAgIGRlbCBkWzVdCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGQgPSB7fQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weSBiL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVjODNhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9FeGNlcHRpb25zLnB5CkBAIC0wLDAgKzEsNjgxIEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgVHJ5UmFpc2VFeGNlcHQoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDIgKyAzCisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGVycm9yID0gVmFsdWVFcnJvcgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsInNvbWV0aGluZyIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGVycm9yID0gVmFsdWVFcnJvcgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgVHJ5RXhjZXB0KFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxNSAqIDEwCisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkgYi9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0NThiNAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvSW1wb3J0cy5weQpAQCAtMCwwICsxLDEzOSBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKKyMgRmlyc3QgaW1wb3J0czoKK2ltcG9ydCBvcworaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisKK2NsYXNzIFNlY29uZEltcG9ydChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDUKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wb3J0IG9zCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgU2Vjb25kUGFja2FnZUltcG9ydChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDUKKyAgICByb3VuZHMgPSAyMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2UKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorY2xhc3MgU2Vjb25kU3VibW9kdWxlSW1wb3J0KFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNQorICAgIHJvdW5kcyA9IDIwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKyAgICAgICAgICAgIGltcG9ydCBwYWNrYWdlLnN1Ym1vZHVsZQorICAgICAgICAgICAgaW1wb3J0IHBhY2thZ2Uuc3VibW9kdWxlCisgICAgICAgICAgICBpbXBvcnQgcGFja2FnZS5zdWJtb2R1bGUKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9JbnN0YW5jZXMucHkgYi9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYzZTIzCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9JbnN0YW5jZXMucHkKQEAgLTAsMCArMSw2OCBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIENyZWF0ZUluc3RhbmNlcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjIKKyAgICBvcGVyYXRpb25zID0gMyArIDcgKyA0CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgICAgIHNlbGYuYyA9IGMKKworICAgICAgICBjbGFzcyBlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGM9NCk6CisgICAgICAgICAgICAgICAgc2VsZi5hID0gYQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmMgPSBjCisgICAgICAgICAgICAgICAgc2VsZi5kID0gYQorICAgICAgICAgICAgICAgIHNlbGYuZSA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmYgPSBjCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIG8gPSBjKCkKKyAgICAgICAgICAgIG8xID0gYygpCisgICAgICAgICAgICBvMiA9IGMoKQorICAgICAgICAgICAgcCA9IGQoaSxpLDMpCisgICAgICAgICAgICBwMSA9IGQoaSxpLDMpCisgICAgICAgICAgICBwMiA9IGQoaSwzLDMpCisgICAgICAgICAgICBwMyA9IGQoMyxpLDMpCisgICAgICAgICAgICBwNCA9IGQoaSxpLGkpCisgICAgICAgICAgICBwNSA9IGQoMyxpLDMpCisgICAgICAgICAgICBwNiA9IGQoaSxpLGkpCisgICAgICAgICAgICBxID0gZShpLGksMykKKyAgICAgICAgICAgIHExID0gZShpLGksMykKKyAgICAgICAgICAgIHEyID0gZShpLGksMykKKyAgICAgICAgICAgIHEzID0gZShpLGkpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgICAgIHNlbGYuYyA9IGMKKworICAgICAgICBjbGFzcyBlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGM9NCk6CisgICAgICAgICAgICAgICAgc2VsZi5hID0gYQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmMgPSBjCisgICAgICAgICAgICAgICAgc2VsZi5kID0gYQorICAgICAgICAgICAgICAgIHNlbGYuZSA9IGIKKyAgICAgICAgICAgICAgICBzZWxmLmYgPSBjCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0xJQ0VOU0UgYi9Ub29scy9weWJlbmNoL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjNmE2YgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTElDRU5TRQpAQCAtMCwwICsxLDI1IEBACitweWJlbmNoIExpY2Vuc2UKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UgYXBwbGllcyB0byBhbGwgZmlsZXMgaW4gdGhlIHB5YmVuY2gKK2RpcmVjdG9yeSBvZiB0aGUgcHliZW5jaCBkaXN0cmlidXRpb24uCisKK0NvcHlyaWdodCAoYyksIDE5OTctMjAwNiwgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pCitDb3B5cmlnaHQgKGMpLCAyMDAwLTIwMDYsIGVHZW5peC5jb20gU29mdHdhcmUgR21iSCAoaW5mb0BlZ2VuaXguY29tKQorCisgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkKK2dyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMKK2FuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgoraW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZworbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZS4KKworVEhFIEFVVEhPUiBNQVJDLUFORFJFIExFTUJVUkcgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCitUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCitJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKK0ZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUgIQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9MaXN0cy5weSBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2YjQ0YwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKQEAgLTAsMCArMSwyOTIgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KiAoNiArIDYgKyA2KQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsID0gW10KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgeCA9IGxbMF0KKyAgICAgICAgICAgIHggPSBsWzFdCisgICAgICAgICAgICB4ID0gbFsyXQorICAgICAgICAgICAgeCA9IGxbM10KKyAgICAgICAgICAgIHggPSBsWzRdCisgICAgICAgICAgICB4ID0gbFs1XQorCisgICAgICAgICAgICBpZiBsZW4obCkgPiAxMDAwMDoKKyAgICAgICAgICAgICAgICAjIGN1dCBkb3duIHRoZSBzaXplCisgICAgICAgICAgICAgICAgZGVsIGxbOl0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgbCA9IFtdCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgTGlzdFNsaWNpbmcoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC40CisgICAgb3BlcmF0aW9ucyA9IDI1KigzKzErMisxKQorICAgIHJvdW5kcyA9IDQwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgbiA9IHJhbmdlKDEwMCkKKyAgICAgICAgciA9IHJhbmdlKDI1KQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGwgPSByYW5nZSgxMDApCisKKyAgICAgICAgICAgIGZvciBqIGluIHI6CisKKyAgICAgICAgICAgICAgICBtID0gbFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IGxbOjI1XQorICAgICAgICAgICAgICAgIG0gPSBsWzUwOjU1XQorICAgICAgICAgICAgICAgIGxbOjNdID0gbgorICAgICAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgICAgICBsWy0xOl0gPSBuCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIG4gPSByYW5nZSgxMDApCisgICAgICAgIHIgPSByYW5nZSgyNSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBsID0gcmFuZ2UoMTAwKQorCisgICAgICAgICAgICBmb3IgaiBpbiByOgorICAgICAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU21hbGxMaXN0cyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMSsgNiArIDYgKyAzICsgMSkKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgbCA9IFtdCisKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKworICAgICAgICAgICAgbFswXSA9IDMKKyAgICAgICAgICAgIGxbMV0gPSA0CisgICAgICAgICAgICBsWzJdID0gNQorICAgICAgICAgICAgbFszXSA9IDMKKyAgICAgICAgICAgIGxbNF0gPSA0CisgICAgICAgICAgICBsWzVdID0gNQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWzozXSA9IFsxLDIsM10KKyAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgIG0gPSBsWzE6XQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCisKKyAgICAgICAgICAgIGwgPSBbXQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCisgICAgICAgICAgICBtID0gbFs6LTFdCisgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQorCisgICAgICAgICAgICBsID0gW10KKworICAgICAgICAgICAgbC5hcHBlbmQoMikKKyAgICAgICAgICAgIGwuYXBwZW5kKDMpCisgICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgbC5hcHBlbmQoMikKKyAgICAgICAgICAgIGwuYXBwZW5kKDMpCisgICAgICAgICAgICBsLmFwcGVuZCg0KQorCisgICAgICAgICAgICBsWzBdID0gMworICAgICAgICAgICAgbFsxXSA9IDQKKyAgICAgICAgICAgIGxbMl0gPSA1CisgICAgICAgICAgICBsWzNdID0gMworICAgICAgICAgICAgbFs0XSA9IDQKKyAgICAgICAgICAgIGxbNV0gPSA1CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxbOjNdID0gWzEsMiwzXQorICAgICAgICAgICAgbSA9IGxbOi0xXQorICAgICAgICAgICAgbSA9IGxbMTpdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxbLTE6XSA9IFs0LDUsNl0KKworICAgICAgICAgICAgbCA9IFtdCisKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGwuYXBwZW5kKDIpCisgICAgICAgICAgICBsLmFwcGVuZCgzKQorICAgICAgICAgICAgbC5hcHBlbmQoNCkKKworICAgICAgICAgICAgbFswXSA9IDMKKyAgICAgICAgICAgIGxbMV0gPSA0CisgICAgICAgICAgICBsWzJdID0gNQorICAgICAgICAgICAgbFszXSA9IDMKKyAgICAgICAgICAgIGxbNF0gPSA0CisgICAgICAgICAgICBsWzVdID0gNQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWzozXSA9IFsxLDIsM10KKyAgICAgICAgICAgIG0gPSBsWzotMV0KKyAgICAgICAgICAgIG0gPSBsWzE6XQorICAgICAgICAgICAgCisgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCisKKyAgICAgICAgICAgIGwgPSBbXQorCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBsLmFwcGVuZCgyKQorICAgICAgICAgICAgbC5hcHBlbmQoMykKKyAgICAgICAgICAgIGwuYXBwZW5kKDQpCisKKyAgICAgICAgICAgIGxbMF0gPSAzCisgICAgICAgICAgICBsWzFdID0gNAorICAgICAgICAgICAgbFsyXSA9IDUKKyAgICAgICAgICAgIGxbM10gPSAzCisgICAgICAgICAgICBsWzRdID0gNAorICAgICAgICAgICAgbFs1XSA9IDUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCisgICAgICAgICAgICBtID0gbFs6LTFdCisgICAgICAgICAgICBtID0gbFsxOl0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgbCA9IFtdCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weSBiL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJjMGVkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5CkBAIC0wLDAgKzEsOTQ2IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgU3BlY2lhbENsYXNzQXR0cmlidXRlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQorICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICBjLl9fYSA9IDIKKyAgICAgICAgICAgIGMuX19iID0gMworICAgICAgICAgICAgYy5fX2MgPSA0CisKKyAgICAgICAgICAgIGMuX19hID0gMgorICAgICAgICAgICAgYy5fX2IgPSAzCisgICAgICAgICAgICBjLl9fYyA9IDQKKworICAgICAgICAgICAgYy5fX2EgPSAyCisgICAgICAgICAgICBjLl9fYiA9IDMKKyAgICAgICAgICAgIGMuX19jID0gNAorCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICAgICAgICAgIHggPSBjLl9fYQorICAgICAgICAgICAgeCA9IGMuX19iCisgICAgICAgICAgICB4ID0gYy5fX2MKKworICAgICAgICAgICAgeCA9IGMuX19hCisgICAgICAgICAgICB4ID0gYy5fX2IKKyAgICAgICAgICAgIHggPSBjLl9fYworCisgICAgICAgICAgICB4ID0gYy5fX2EKKyAgICAgICAgICAgIHggPSBjLl9fYgorICAgICAgICAgICAgeCA9IGMuX19jCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgTm9ybWFsQ2xhc3NBdHRyaWJ1dGUoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4zCisgICAgb3BlcmF0aW9ucyA9IDUqKDEyICsgMTIpCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBjbGFzcyBjOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworICAgICAgICAgICAgYy5hID0gMgorICAgICAgICAgICAgYy5iID0gMworICAgICAgICAgICAgYy5jID0gNAorCisgICAgICAgICAgICBjLmEgPSAyCisgICAgICAgICAgICBjLmIgPSAzCisgICAgICAgICAgICBjLmMgPSA0CisKKyAgICAgICAgICAgIGMuYSA9IDIKKyAgICAgICAgICAgIGMuYiA9IDMKKyAgICAgICAgICAgIGMuYyA9IDQKKworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICAgICAgICAgIHggPSBjLmEKKyAgICAgICAgICAgIHggPSBjLmIKKyAgICAgICAgICAgIHggPSBjLmMKKworICAgICAgICAgICAgeCA9IGMuYQorICAgICAgICAgICAgeCA9IGMuYgorICAgICAgICAgICAgeCA9IGMuYworCisgICAgICAgICAgICB4ID0gYy5hCisgICAgICAgICAgICB4ID0gYy5iCisgICAgICAgICAgICB4ID0gYy5jCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxMiArIDEyKQorICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbyA9IGMoKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworICAgICAgICAgICAgby5fX2FfXyA9IDIKKyAgICAgICAgICAgIG8uX19iX18gPSAzCisgICAgICAgICAgICBvLl9fY19fID0gNAorCisgICAgICAgICAgICBvLl9fYV9fID0gMgorICAgICAgICAgICAgby5fX2JfXyA9IDMKKyAgICAgICAgICAgIG8uX19jX18gPSA0CisKKyAgICAgICAgICAgIG8uX19hX18gPSAyCisgICAgICAgICAgICBvLl9fYl9fID0gMworICAgICAgICAgICAgby5fX2NfXyA9IDQKKworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICAgICAgICAgIHggPSBvLl9fYV9fCisgICAgICAgICAgICB4ID0gby5fX2JfXworICAgICAgICAgICAgeCA9IG8uX19jX18KKworICAgICAgICAgICAgeCA9IG8uX19hX18KKyAgICAgICAgICAgIHggPSBvLl9fYl9fCisgICAgICAgICAgICB4ID0gby5fX2NfXworCisgICAgICAgICAgICB4ID0gby5fX2FfXworICAgICAgICAgICAgeCA9IG8uX19iX18KKyAgICAgICAgICAgIHggPSBvLl9fY19fCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG8gPSBjKCkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZShUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGNsYXNzIGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG8gPSBjKCkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKyAgICAgICAgICAgIG8uYSA9IDIKKyAgICAgICAgICAgIG8uYiA9IDMKKyAgICAgICAgICAgIG8uYyA9IDQKKworICAgICAgICAgICAgby5hID0gMgorICAgICAgICAgICAgby5iID0gMworICAgICAgICAgICAgby5jID0gNAorCisgICAgICAgICAgICBvLmEgPSAyCisgICAgICAgICAgICBvLmIgPSAzCisgICAgICAgICAgICBvLmMgPSA0CisKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgICAgICAgICB4ID0gby5hCisgICAgICAgICAgICB4ID0gby5iCisgICAgICAgICAgICB4ID0gby5jCisKKyAgICAgICAgICAgIHggPSBvLmEKKyAgICAgICAgICAgIHggPSBvLmIKKyAgICAgICAgICAgIHggPSBvLmMKKworICAgICAgICAgICAgeCA9IG8uYQorICAgICAgICAgICAgeCA9IG8uYgorICAgICAgICAgICAgeCA9IG8uYworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBjbGFzcyBjOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvID0gYygpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgQnVpbHRpbk1ldGhvZExvb2t1cChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjMKKyAgICBvcGVyYXRpb25zID0gNSooMyo1ICsgMyo1KQorICAgIHJvdW5kcyA9IDcwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBsID0gW10KKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorCisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorCisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKworICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKworICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorCisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKworICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKworICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworICAgICAgICAgICAgZC5pdGVtcworCisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKworICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorCisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorCisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisgICAgICAgICAgICBkLml0ZW1zCisKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKyAgICAgICAgICAgIGwuYXBwZW5kCisgICAgICAgICAgICBsLmFwcGVuZAorICAgICAgICAgICAgbC5hcHBlbmQKKworICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisgICAgICAgICAgICBsLmluc2VydAorICAgICAgICAgICAgbC5pbnNlcnQKKyAgICAgICAgICAgIGwuaW5zZXJ0CisKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisgICAgICAgICAgICBsLnNvcnQKKyAgICAgICAgICAgIGwuc29ydAorICAgICAgICAgICAgbC5zb3J0CisKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisgICAgICAgICAgICBkLmhhc19rZXkKKyAgICAgICAgICAgIGQuaGFzX2tleQorICAgICAgICAgICAgZC5oYXNfa2V5CisKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKyAgICAgICAgICAgIGQuaXRlbXMKKworICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisgICAgICAgICAgICBkLmdldAorICAgICAgICAgICAgZC5nZXQKKyAgICAgICAgICAgIGQuZ2V0CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGwgPSBbXQorICAgICAgICBkID0ge30KKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL051bWJlcnMucHkgYi9Ub29scy9weWJlbmNoL051bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjZjJlZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weQpAQCAtMCwwICsxLDc4NCBAQAorZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0CisKK2NsYXNzIENvbXBhcmVJbnRlZ2VycyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMzAgKiA1CisgICAgcm91bmRzID0gMTIwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIENvbXBhcmVGbG9hdHMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDMwICogNQorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorICAgICAgICAgICAgCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIENvbXBhcmVGbG9hdHNJbnRlZ2VycyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMzAgKiA1CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDIuMSA8IDQKKyAgICAgICAgICAgIDIuMSA+IDQKKyAgICAgICAgICAgIDIuMSA9PSA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPCA0CisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgQ29tcGFyZUxvbmdzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAzMCAqIDUKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKKyAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvUkVBRE1FIGIvVG9vbHMvcHliZW5jaC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZTQxYgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvUkVBRE1FCkBAIC0wLDAgKzEsMzcyIEBACitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworUFlCRU5DSCAtIEEgUHl0aG9uIEJlbmNobWFyayBTdWl0ZQorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAgRXh0ZW5kYWJsZSBzdWl0ZSBvZiBvZiBsb3ctbGV2ZWwgYmVuY2htYXJrcyBmb3IgbWVhc3VyaW5nCisgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gCisgICAgICAgICAgICAgICAgIChpbnRlcnByZXRlciwgY29tcGlsZXIgb3IgVk0pLgorCitweWJlbmNoIGlzIGEgY29sbGVjdGlvbiBvZiB0ZXN0cyB0aGF0IHByb3ZpZGVzIGEgc3RhbmRhcmRpemVkIHdheSB0bworbWVhc3VyZSB0aGUgcGVyZm9ybWFuY2Ugb2YgUHl0aG9uIGltcGxlbWVudGF0aW9ucy4gSXQgdGFrZXMgYSB2ZXJ5CitjbG9zZSBsb29rIGF0IGRpZmZlcmVudCBhc3BlY3RzIG9mIFB5dGhvbiBwcm9ncmFtcyBhbmQgbGV0J3MgeW91CitkZWNpZGUgd2hpY2ggZmFjdG9ycyBhcmUgbW9yZSBpbXBvcnRhbnQgdG8geW91IHRoYW4gb3RoZXJzLCByYXRoZXIKK3RoYW4gd3JhcHBpbmcgZXZlcnl0aGluZyB1cCBpbiBvbmUgbnVtYmVyLCBsaWtlIHRoZSBvdGhlciBwZXJmb3JtYW5jZQordGVzdHMgZG8gKGUuZy4gcHlzdG9uZSB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgUHl0aG9uIFN0YW5kYXJkCitMaWJyYXJ5KS4KKworcHliZW5jaCBoYXMgYmVlbiB1c2VkIGluIHRoZSBwYXN0IGJ5IHNldmVyYWwgUHl0aG9uIGRldmVsb3BlcnMgdG8KK3RyYWNrIGRvd24gcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3IgdG8gZGVtb25zdHJhdGUgdGhlIGltcGFjdCBvZgorb3B0aW1pemF0aW9ucyBhbmQgbmV3IGZlYXR1cmVzIGluIFB5dGhvbi4KKworVGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIHB5YmVuY2ggaXMgdGhlIGZpbGUgcHliZW5jaC5weS4gUnVuCit0aGlzIHNjcmlwdCB3aXRoIG9wdGlvbiAnLS1oZWxwJyB0byBnZXQgYSBsaXN0aW5nIG9mIHRoZSBwb3NzaWJsZQorb3B0aW9ucy4gV2l0aG91dCBvcHRpb25zLCBweWJlbmNoIHdpbGwgc2ltcGx5IGV4ZWN1dGUgdGhlIGJlbmNobWFyaworYW5kIHRoZW4gcHJpbnQgb3V0IGEgcmVwb3J0IHRvIHN0ZG91dC4KKworCitNaWNyby1NYW51YWwKKy0tLS0tLS0tLS0tLQorCitSdW4gJ3B5YmVuY2gucHkgLWgnIHRvIHNlZSB0aGUgaGVscCBzY3JlZW4uCitSdW4gJ3B5YmVuY2gucHknIHRvIGp1c3QgbGV0IHRoZSBiZW5jaG1hcmsgc3VpdGUgZG8gaXQncyB0aGluZyBhbmQKKydweWJlbmNoLnB5IC1mIDxmaWxlPicgdG8gaGF2ZSBpdCBzdG9yZSB0aGUgcmVzdWx0cyBpbiBhIGZpbGUgdG9vLgorCitUaGlzIGlzIHRoZSBjdXJyZW50IG91dHB1dCBvZiBweWJlbmNoLnB5IC0taGVscDoKKworU3lub3BzaXM6CisgcHliZW5jaC5weSBbb3B0aW9uXSBmaWxlcy4uLgorCitPcHRpb25zIGFuZCBkZWZhdWx0IHNldHRpbmdzOgorICAtbiBhcmcgICAgICAgICAgIG51bWJlciBvZiByb3VuZHMgKDEwKQorICAtZiBhcmcgICAgICAgICAgIHNhdmUgYmVuY2htYXJrIHRvIGZpbGUgYXJnICgpCisgIC1jIGFyZyAgICAgICAgICAgY29tcGFyZSBiZW5jaG1hcmsgd2l0aCB0aGUgb25lIGluIGZpbGUgYXJnICgpCisgIC1zIGFyZyAgICAgICAgICAgc2hvdyBiZW5jaG1hcmsgaW4gZmlsZSBhcmcsIHRoZW4gZXhpdCAoKQorICAtUyAgICAgICAgICAgICAgIHNob3cgc3RhdGlzdGljcyBvZiBiZW5jaG1hcmtzICgwKQorICAtdyBhcmcgICAgICAgICAgIHNldCB3YXJwIGZhY3RvciB0byBhcmcgKDIwKQorICAtZCAgICAgICAgICAgICAgIGhpZGUgbm9pc2UgaW4gY29tcGFyZXMgKDApCisgIC0tbm8tZ2MgICAgICAgICAgZGlzYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gKDApCisgIC12ICAgICAgICAgICAgICAgZ2VuZXJhdGUgdmVyYm9zZSBvdXRwdXQKKyAgLWggICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCB0ZXh0CisgIC0taGVscCAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgdGV4dAorICAtLWRlYnVnICAgICAgICAgIGVuYWJsZSBkZWJ1Z2dpbmcKKyAgLS1jb3B5cmlnaHQgICAgICBzaG93IGNvcHlyaWdodAorICAtLWV4YW1wbGVzICAgICAgIHNob3cgZXhhbXBsZXMgb2YgdXNhZ2UKKworVmVyc2lvbjoKKyAxLjMKKworVGhlIG5vcm1hbCBvcGVyYXRpb24gaXMgdG8gcnVuIHRoZSBzdWl0ZSBhbmQgZGlzcGxheSB0aGUKK3Jlc3VsdHMuIFVzZSAtZiB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHJldXNlIG9yIGNvbXBhcmlzbXMuCisKK0V4YW1wbGVzOgorCitweXRob24xLjUgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE1CitweXRob24xLjQgcHliZW5jaC5weSAtdyAxMDAgLWYgcDE0CitweXRob24gcHliZW5jaC5weSAtcyBwMTUgLWMgcDE0CisKKworTGljZW5zZQorLS0tLS0tLQorCitTZWUgTElDRU5TRSBmaWxlLgorCisKK1NhbXBsZSBvdXRwdXQKKy0tLS0tLS0tLS0tLS0KKworUFlCRU5DSCAxLjMKKworTWFjaGluZSBEZXRhaWxzOgorICAgUGxhdGZvcm0gSUQ6ICBMaW51eC0yLjYuOC0yNC4xOS1kZWZhdWx0LXg4Nl82NC13aXRoLVN1U0UtOS4yLXg4Ni02NAorICAgRXhlY3V0YWJsZTogICAvaG9tZS9sZW1idXJnL3Byb2plY3RzL1B5dGhvbi9JbnN0YWxsYXRpb24vYmluL3B5dGhvbgorICAgUHl0aG9uOiAgICAgICAyLjVhMS4wCisgICBDb21waWxlcjogICAgIEdDQyAzLjMuNCAocHJlIDMuMy41IDIwMDQwODA5KQorICAgQnVpbGQ6ICAgICAgICBBcHIgIDkgMjAwNiAwMTo1MDo1NyAoI3RydW5rKQorCitTZWFyY2hpbmcgZm9yIHRlc3RzLi4uCisgICBCdWlsdGluRnVuY3Rpb25DYWxscworICAgQnVpbHRpbk1ldGhvZExvb2t1cAorICAgQ29tcGFyZUZsb2F0cworICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzCisgICBDb21wYXJlSW50ZWdlcnMKKyAgIENvbXBhcmVJbnRlcm5lZFN0cmluZ3MKKyAgIENvbXBhcmVMb25ncworICAgQ29tcGFyZVN0cmluZ3MKKyAgIENvbXBhcmVVbmljb2RlCisgICBDb25jYXRTdHJpbmdzCisgICBDb25jYXRVbmljb2RlCisgICBDcmVhdGVJbnN0YW5jZXMKKyAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0CisgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdAorICAgRGljdENyZWF0aW9uCisgICBEaWN0V2l0aEZsb2F0S2V5cworICAgRGljdFdpdGhJbnRlZ2VyS2V5cworICAgRGljdFdpdGhTdHJpbmdLZXlzCisgICBGb3JMb29wcworICAgSWZUaGVuRWxzZQorICAgTGlzdFNsaWNpbmcKKyAgIE5lc3RlZEZvckxvb3BzCisgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZQorICAgTm9ybWFsSW5zdGFuY2VBdHRyaWJ1dGUKKyAgIFB5dGhvbkZ1bmN0aW9uQ2FsbHMKKyAgIFB5dGhvbk1ldGhvZENhbGxzCisgICBSZWN1cnNpb24KKyAgIFNlY29uZEltcG9ydAorICAgU2Vjb25kUGFja2FnZUltcG9ydAorICAgU2Vjb25kU3VibW9kdWxlSW1wb3J0CisgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYworICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbgorICAgU2ltcGxlRmxvYXRBcml0aG1ldGljCisgICBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMKKyAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljCisgICBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uCisgICBTaW1wbGVMb25nQXJpdGhtZXRpYworICAgU21hbGxMaXN0cworICAgU21hbGxUdXBsZXMKKyAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZQorICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlCisgICBTdHJpbmdNYXBwaW5ncworICAgU3RyaW5nUHJlZGljYXRlcworICAgU3RyaW5nU2xpY2luZworICAgVHJ5RXhjZXB0CisgICBUcnlSYWlzZUV4Y2VwdAorICAgVHVwbGVTbGljaW5nCisgICBVbmljb2RlTWFwcGluZ3MKKyAgIFVuaWNvZGVQcmVkaWNhdGVzCisgICBVbmljb2RlUHJvcGVydGllcworICAgVW5pY29kZVNsaWNpbmcKKworUnVubmluZyAxMCByb3VuZChzKSBvZiB0aGUgc3VpdGU6CisKKy4uLgorCisgUm91bmQgMTAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCAgIGFicyAgICBvdmVyaGVhZAorICAgICAgICAgIEJ1aWx0aW5GdW5jdGlvbkNhbGxzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgIEJ1aWx0aW5NZXRob2RMb29rdXA6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICBDb21wYXJlSW50ZWdlcnM6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KKyAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAwLjAzOXIgMC4wNDBhIDAuMDAxbworICAgICAgICAgICAgICAgICAgQ29tcGFyZUxvbmdzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgQ29tcGFyZVN0cmluZ3M6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICAgICAgICBDb25jYXRTdHJpbmdzOiAgIDAuMDQwciAwLjA0MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgIENvbmNhdFVuaWNvZGU6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0OiAgIDAuMDI5ciAwLjAzMGEgMC4wMDFvCisgICAgICAgQ3JlYXRlVW5pY29kZVdpdGhDb25jYXQ6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAwLjA0MHIgMC4wNDBhIDAuMDAwbworICAgICAgICAgICAgIERpY3RXaXRoRmxvYXRLZXlzOiAgIDAuMDg5ciAwLjA5MGEgMC4wMDBvCisgICAgICAgICAgIERpY3RXaXRoSW50ZWdlcktleXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAwLjA3MHIgMC4wNzBhIDAuMDAxbworICAgICAgICAgICAgICAgICAgICAgIEZvckxvb3BzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCisgICAgICAgICAgICAgICAgICAgIElmVGhlbkVsc2U6ICAgMC4wNzByIDAuMDcwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAwLjAzMHIgMC4wMzBhIDAuMDAwbworICAgICAgICAgICAgICAgIE5lc3RlZEZvckxvb3BzOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgTm9ybWFsQ2xhc3NBdHRyaWJ1dGU6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICBQeXRob25GdW5jdGlvbkNhbGxzOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICAgICAgICAgUHl0aG9uTWV0aG9kQ2FsbHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgICAgICAgICAgU2Vjb25kSW1wb3J0OiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgIFNlY29uZFBhY2thZ2VJbXBvcnQ6ICAgMC4wMzByIDAuMDMwYSAwLjAwMG8KKyAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAwLjA0MHIgMC4wNDBhIDAuMDAwbworICAgICAgIFNpbXBsZUNvbXBsZXhBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgIFNpbXBsZURpY3RNYW5pcHVsYXRpb246ICAgMC4wNDByIDAuMDQwYSAwLjAwMG8KKyAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAwLjA1MHIgMC4wNTBhIDAuMDAxbworICAgICAgU2ltcGxlSW50RmxvYXRBcml0aG1ldGljOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICAgU2ltcGxlSW50ZWdlckFyaXRobWV0aWM6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KKyAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAwLjAzMHIgMC4wMzBhIDAuMDAwbworICAgICAgICAgIFNpbXBsZUxvbmdBcml0aG1ldGljOiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCisgICAgICAgICAgICAgICAgICAgIFNtYWxsTGlzdHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgU3BlY2lhbENsYXNzQXR0cmlidXRlOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCisgICAgICBTcGVjaWFsSW5zdGFuY2VBdHRyaWJ1dGU6ICAgMC4wNzlyIDAuMDgwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAwLjA2MHIgMC4wNjBhIDAuMDAwbworICAgICAgICAgICAgICBTdHJpbmdQcmVkaWNhdGVzOiAgIDAuMDQ5ciAwLjA1MGEgMC4wMDFvCisgICAgICAgICAgICAgICAgIFN0cmluZ1NsaWNpbmc6ICAgMC4wMzlyIDAuMDQwYSAwLjAwMG8KKyAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAwLjA3OXIgMC4wODBhIDAuMDAxbworICAgICAgICAgICAgICAgIFRyeVJhaXNlRXhjZXB0OiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCisgICAgICAgICAgICAgICAgICBUdXBsZVNsaWNpbmc6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KKyAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAwLjA3MHIgMC4wNzBhIDAuMDAxbworICAgICAgICAgICAgIFVuaWNvZGVQcmVkaWNhdGVzOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCisgICAgICAgICAgICAgVW5pY29kZVByb3BlcnRpZXM6ICAgMC4wNTlyIDAuMDYwYSAwLjAwMW8KKyAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAwLjA1MHIgMC4wNTBhIDAuMDAwbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgIDIuOTM3IHNlY29uZHMKKworCitUZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXIgcnVuICAgIHBlciBvcGVyLiAgIG92ZXJoZWFkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBCdWlsdGluRnVuY3Rpb25DYWxsczogICAgICAyOS44NSBtcyAgICAwLjIzIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgQnVpbHRpbk1ldGhvZExvb2t1cDogICAgICA2Ni44NSBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAgICA0My4wMCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgIENvbXBhcmVGbG9hdHNJbnRlZ2VyczogICAgICA1MS44MCBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgIENvbXBhcmVJbnRlZ2VyczogICAgICA3MC43MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKKyAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAgICA0MS40MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgIENvbXBhcmVMb25nczogICAgICA0Ny45MCBtcyAgICAwLjExIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICBDb21wYXJlU3RyaW5nczogICAgICA1OC41MCBtcyAgICAwLjEyIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAgICA1Ni41NSBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0U3RyaW5nczogICAgICA0NC43NSBtcyAgICAwLjMwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0VW5pY29kZTogICAgICA1NC41NSBtcyAgICAwLjM2IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAgICA1MC45NSBtcyAgICAxLjIxIHVzICAgIDAuMDAgbXMKKyAgICAgICBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdDogICAgICAyOC44NSBtcyAgICAwLjE0IHVzICAgIDAuNTAgbXMKKyAgICAgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdDogICAgICA1My43NSBtcyAgICAwLjI3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAgICA0MS45MCBtcyAgICAwLjI4IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICBEaWN0V2l0aEZsb2F0S2V5czogICAgICA4OC41MCBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgRGljdFdpdGhJbnRlZ2VyS2V5czogICAgICA2Mi41NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAgICA2MC41MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgICBGb3JMb29wczogICAgICA0Ni45MCBtcyAgICA0LjY5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICAgSWZUaGVuRWxzZTogICAgICA2MC41NSBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAgICAyOS45MCBtcyAgICA4LjU0IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICBOZXN0ZWRGb3JMb29wczogICAgICAzMy45NSBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2Mi43NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA2MS44MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgUHl0aG9uRnVuY3Rpb25DYWxsczogICAgICA2MC4wMCBtcyAgICAwLjM2IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICBQeXRob25NZXRob2RDYWxsczogICAgICA1MC4wMCBtcyAgICAwLjY3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAgICA0Ni44NSBtcyAgICAzLjc1IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgIFNlY29uZEltcG9ydDogICAgICAzNS4wMCBtcyAgICAxLjQwIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgU2Vjb25kUGFja2FnZUltcG9ydDogICAgICAzMi4wMCBtcyAgICAxLjI4IHVzICAgIDAuMDAgbXMKKyAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAgICAzOC4wMCBtcyAgICAxLjUyIHVzICAgIDAuMDAgbXMKKyAgICAgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYzogICAgICAyNi44NSBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKKyAgICAgICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbjogICAgICA0MC44NSBtcyAgICAwLjE0IHVzICAgIDAuMDAgbXMKKyAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAgICA0OC43MCBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKKyAgICAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYzogICAgICA1Ny43MCBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKKyAgICAgICBTaW1wbGVJbnRlZ2VyQXJpdGhtZXRpYzogICAgICA1OC43NSBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKKyAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAgICAzNC44MCBtcyAgICAwLjEzIHVzICAgIDAuMDAgbXMKKyAgICAgICAgICBTaW1wbGVMb25nQXJpdGhtZXRpYzogICAgICAzMC45NSBtcyAgICAwLjE5IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgU21hbGxMaXN0czogICAgICA0Ny42MCBtcyAgICAwLjE5IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAgICA0OC44MCBtcyAgICAwLjIwIHVzICAgIDAuNTAgbXMKKyAgICAgICAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2MS43MCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKKyAgICAgIFNwZWNpYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA3Ni43MCBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAgICA1OC43MCBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgU3RyaW5nUHJlZGljYXRlczogICAgICA1MC4wMCBtcyAgICAwLjE4IHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICAgICAgU3RyaW5nU2xpY2luZzogICAgICAzOS42NSBtcyAgICAwLjIzIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAgICA4NC40NSBtcyAgICAwLjA2IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICBUcnlSYWlzZUV4Y2VwdDogICAgICA2MS43NSBtcyAgICA0LjEyIHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICAgICAgIFR1cGxlU2xpY2luZzogICAgICA0OC45NSBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKKyAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAgICA3MS41MCBtcyAgICAzLjk3IHVzICAgIDAuNTAgbXMKKyAgICAgICAgICAgICBVbmljb2RlUHJlZGljYXRlczogICAgICA1Mi43NSBtcyAgICAwLjIzIHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICBVbmljb2RlUHJvcGVydGllczogICAgICA2MS45MCBtcyAgICAwLjMxIHVzICAgIDEuMDAgbXMKKyAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAgICA1My43NSBtcyAgICAwLjMxIHVzICAgIDAuNTAgbXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAyOTM3LjAwIG1zCisKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCitXcml0aW5nIE5ldyBUZXN0cworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK3B5YmVuY2ggdGVzdHMgYXJlIHNpbXBsZSBtb2R1bGVzIGRlZmluaW5nIG9uZSBvciBtb3JlIHB5YmVuY2guVGVzdAorc3ViY2xhc3Nlcy4KKworV3JpdGluZyBhIHRlc3QgZXNzZW50aWFsbHkgYm9pbHMgZG93biB0byBwcm92aWRpbmcgdHdvIG1ldGhvZHM6CisudGVzdCgpIHdoaWNoIHJ1bnMgLnJvdW5kcyBudW1iZXIgb2YgLm9wZXJhdGlvbnMgdGVzdCBvcGVyYXRpb25zIGVhY2gKK2FuZCAuY2FsaWJyYXRlKCkgd2hpY2ggZG9lcyB0aGUgc2FtZSBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFjdHVhbGx5CitleGVjdXRlIHRoZSBvcGVyYXRpb25zLgorCisKK0hlcmUncyBhbiBleGFtcGxlOgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBJbnRlZ2VyQ291bnRpbmcoVGVzdCk6CisKKyAgICAjIFZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZXN0IGFzIGZsb2F0ICh4Lnl5KTsgdGhpcyBpcyBpbXBvcnRhbnQKKyAgICAjIGZvciBjb21wYXJpc29ucyBvZiBiZW5jaG1hcmsgcnVucyAtIHRlc3RzIHdpdGggdW5lcXVhbCB2ZXJzaW9uCisgICAgIyBudW1iZXIgd2lsbCBub3QgZ2V0IGNvbXBhcmVkLgorICAgIHZlcnNpb24gPSAxLjAKKyAgICAKKyAgICAjIFRoZSBudW1iZXIgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBkb25lIGluIGVhY2ggcm91bmQgb2YgdGhlCisgICAgIyB0ZXN0LiBBbiBvcGVyYXRpb24gaXMgdGhlIGJhc2ljIHVuaXQgb2Ygd2hhdCB5b3Ugd2FudCB0bworICAgICMgbWVhc3VyZS4gVGhlIGJlbmNobWFyayB3aWxsIG91dHB1dCB0aGUgYW1vdW50IG9mIHJ1bi10aW1lIHBlcgorICAgICMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gcmFpc2UgdGhlIG1lYXN1cmVkIHRpbWluZ3MKKyAgICAjIHNpZ25pZmljYW50bHkgYWJvdmUgbm9pc2UgbGV2ZWwsIGl0IGlzIG9mdGVuIHJlcXVpcmVkIHRvIHJlcGVhdAorICAgICMgc2V0cyBvZiBvcGVyYXRpb25zIG1vcmUgdGhhbiBvbmNlIHBlciB0ZXN0IHJvdW5kLiBUaGUgbWVhc3VyZWQKKyAgICAjIG92ZXJoZWFkIHBlciB0ZXN0IHJvdW5kIHNob3VsZCBiZSBsZXNzIHRoYW4gMSBzZWNvbmQuCisgICAgb3BlcmF0aW9ucyA9IDIwCisKKyAgICAjIE51bWJlciBvZiByb3VuZHMgdG8gZXhlY3V0ZSBwZXIgdGVzdCBydW4uIFRoaXMgc2hvdWxkIGJlCisgICAgIyBhZGp1c3RlZCB0byBhIGZpZ3VyZSB0aGF0IHJlc3VsdHMgaW4gYSB0ZXN0IHJ1bi10aW1lIG9mIGJldHdlZW4KKyAgICAjIDIwLTUwIHNlY29uZHMuCisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworCSIiIiBSdW4gdGhlIHRlc3QuCisKKwkgICAgVGhlIHRlc3QgbmVlZHMgdG8gcnVuIHNlbGYucm91bmRzIGV4ZWN1dGluZworCSAgICBzZWxmLm9wZXJhdGlvbnMgbnVtYmVyIG9mIG9wZXJhdGlvbnMgZWFjaC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBJbml0IHRoZSB0ZXN0CisgICAgICAgIGEgPSAxCisKKyAgICAgICAgIyBSdW4gdGVzdCByb3VuZHMKKwkjCisgICAgICAgICMgTk9URTogVXNlIHhyYW5nZSgpIGZvciBhbGwgdGVzdCBsb29wcyB1bmxlc3MgeW91IHdhbnQgdG8gZmFjZQorCSMgYSAyME1CIHByb2Nlc3MgIQorCSMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgIyBSZXBlYXQgdGhlIG9wZXJhdGlvbnMgcGVyIHJvdW5kIHRvIHJhaXNlIHRoZSBydW4tdGltZQorICAgICAgICAgICAgIyBwZXIgb3BlcmF0aW9uIHNpZ25pZmljYW50bHkgYWJvdmUgdGhlIG5vaXNlIGxldmVsIG9mIHRoZQorICAgICAgICAgICAgIyBmb3ItbG9vcCBvdmVyaGVhZC4gCisKKwkgICAgIyBFeGVjdXRlIDIwIG9wZXJhdGlvbnMgKGEgKz0gMSk6CisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorICAgICAgICAgICAgYSArPSAxCisgICAgICAgICAgICBhICs9IDEKKyAgICAgICAgICAgIGEgKz0gMQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworCSIiIiBDYWxpYnJhdGUgdGhlIHRlc3QuCisKKwkgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGV4ZWN1dGUgZXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZCB0bworCSAgICBzZXR1cCBhbmQgcnVuIHRoZSB0ZXN0IC0gZXhjZXB0IGZvciB0aGUgYWN0dWFsIG9wZXJhdGlvbnMKKwkgICAgdGhhdCB5b3UgaW50ZW5kIHRvIG1lYXN1cmUuIHB5YmVuY2ggdXNlcyB0aGlzIG1ldGhvZCB0bworICAgICAgICAgICAgbWVhc3VyZSB0aGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvdmVyaGVhZC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBJbml0IHRoZSB0ZXN0CisgICAgICAgIGEgPSAxCisKKyAgICAgICAgIyBSdW4gdGVzdCByb3VuZHMgKHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgYW55IG9wZXJhdGlvbikKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworCSAgICAjIFNraXAgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbnMsIHNpbmNlIHdlCisJICAgICMgb25seSB3YW50IHRvIG1lYXN1cmUgdGhlIHRlc3QncyBhZG1pbmlzdHJhdGlvbiBvdmVyaGVhZC4KKyAgICAgICAgICAgIHBhc3MKKworUmVnaXN0ZXJpbmcgYSBuZXcgdGVzdCBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJlZ2lzdGVyIGEgdGVzdCBtb2R1bGUgd2l0aCBweWJlbmNoLCB0aGUgY2xhc3NlcyBuZWVkIHRvIGJlCitpbXBvcnRlZCBpbnRvIHRoZSBweWJlbmNoLlNldHVwIG1vZHVsZS4gcHliZW5jaCB3aWxsIHRoZW4gc2NhbiBhbGwgdGhlCitzeW1ib2xzIGRlZmluZWQgaW4gdGhhdCBtb2R1bGUgZm9yIHN1YmNsYXNzZXMgb2YgcHliZW5jaC5UZXN0IGFuZAorYXV0b21hdGljYWxseSBhZGQgdGhlbSB0byB0aGUgYmVuY2htYXJrIHN1aXRlLgorCisKK0hhdmUgZnVuLAorLS0KK01hcmMtQW5kcmUgTGVtYnVyZworbWFsQGxlbWJ1cmcuY29tCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1NldHVwLnB5IGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZhMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvcHliZW5jaC9TZXR1cC5weQpAQCAtMCwwICsxLDM1IEBACisjIXB5dGhvbgorCisjIFNldHVwIGZpbGUgZm9yIHB5YmVuY2gKKyMKKyMgVGhpcyBmaWxlIGhhcyB0byBpbXBvcnQgYWxsIHRlc3RzIHRvIGJlIHJ1bjsgaXQgaXMgZXhlY3V0ZWQgYXMKKyMgUHl0aG9uIHNvdXJjZSBmaWxlLCBzbyB5b3UgY2FuIGRvIGFsbCBraW5kcyBvZiBtYW5pcHVsYXRpb25zIGhlcmUKKyMgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGVkaXQgdGhlIHRlc3RzIHRoZW1zZWx2ZXMuCisjCisjIE5vdGU6IFBsZWFzZSBrZWVwIHRoaXMgbW9kdWxlIGNvbXBhdGlibGUgdG8gUHl0aG9uIDEuNS4yLgorIworIyBUZXN0cyBtYXkgaW5jbHVkZSBmZWF0dXJlcyBpbiBsYXRlciBQeXRob24gdmVyc2lvbnMsIGJ1dCB0aGVzZQorIyBzaG91bGQgdGhlbiBiZSBlbWJlZGRlZCBpbiB0cnktZXhjZXB0IGNsYXVzZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uCisjIG1vZHVsZS4KKworIyBEZWZhdWx0cworTnVtYmVyX29mX3JvdW5kcyA9IDEwCitXYXJwX2ZhY3RvciA9IDIwCisKKyMgSW1wb3J0IHRlc3RzCitmcm9tIEFyaXRobWV0aWMgaW1wb3J0ICoKK2Zyb20gQ2FsbHMgaW1wb3J0ICoKK2Zyb20gQ29uc3RydWN0cyBpbXBvcnQgKgorZnJvbSBMb29rdXBzIGltcG9ydCAqCitmcm9tIEluc3RhbmNlcyBpbXBvcnQgKgorZnJvbSBMaXN0cyBpbXBvcnQgKgorZnJvbSBUdXBsZXMgaW1wb3J0ICoKK2Zyb20gRGljdCBpbXBvcnQgKgorZnJvbSBFeGNlcHRpb25zIGltcG9ydCAqCitmcm9tIEltcG9ydHMgaW1wb3J0ICoKK2Zyb20gU3RyaW5ncyBpbXBvcnQgKgorZnJvbSBOdW1iZXJzIGltcG9ydCAqCit0cnk6CisgICAgZnJvbSBVbmljb2RlIGltcG9ydCAqCitleGNlcHQgKEltcG9ydEVycm9yLCBTeW50YXhFcnJvcik6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5IGIvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYjQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkKQEAgLTAsMCArMSw1NjQgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorZnJvbSBzdHJpbmcgaW1wb3J0IGpvaW4KKworY2xhc3MgQ29uY2F0U3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gNjAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSAqbm90KiBpbnRlcm5lZAorICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEsMTAxKSkpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEsMTAxKSkpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBDb21wYXJlU3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjIKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3RyaW5ncyBhcmUgKm5vdCogaW50ZXJuZWQKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKQorICAgICAgICB0ID0gam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpICsgImFiYyIKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBzID0gam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpCisgICAgICAgIHQgPSBqb2luKG1hcChzdHIscmFuZ2UoMTApKSkgKyAiYWJjIgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgQ29tcGFyZUludGVybmVkU3RyaW5ncyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gMjAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3RyaW5ncyAqYXJlKiBpbnRlcm5lZAorICAgICAgICBzID0gaW50ZXJuKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSkKKyAgICAgICAgdCA9IHMKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID49IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPj0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSBpbnRlcm4oam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpKQorICAgICAgICB0ID0gcworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgQ3JlYXRlU3RyaW5nc1dpdGhDb25jYXQoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDEwICogNQorICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcyA9ICdvbScKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyAneGF4JworICAgICAgICAgICAgcyA9IHMgKyAneGJ4JworICAgICAgICAgICAgcyA9IHMgKyAneGN4JworICAgICAgICAgICAgcyA9IHMgKyAneGR4JworICAgICAgICAgICAgcyA9IHMgKyAneGV4JworCisgICAgICAgICAgICBzID0gcyArICd4YXgnCisgICAgICAgICAgICBzID0gcyArICd4YngnCisgICAgICAgICAgICBzID0gcyArICd4Y3gnCisgICAgICAgICAgICBzID0gcyArICd4ZHgnCisgICAgICAgICAgICBzID0gcyArICd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgJ3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgJ3hleCcKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBTdHJpbmdTbGljaW5nKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSA1ICogNworICAgIHJvdW5kcyA9IDEwMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgICAgICBzWzExOi0xMV0KKworICAgICAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgICAgICBzWzExOi0xMV0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCisjIyMgU3RyaW5nIG1ldGhvZHMKKworaWYgaGFzYXR0cignJywgJ2xvd2VyJyk6CisKKyAgICBjbGFzcyBTdHJpbmdNYXBwaW5ncyhUZXN0KToKKworICAgICAgICB2ZXJzaW9uID0gMC4xCisgICAgICAgIG9wZXJhdGlvbnMgPSAzICogKDUgKyA0ICsgMiArIDEpCisgICAgICAgIHJvdW5kcyA9IDcwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIHMgPSBqb2luKG1hcChjaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgICAgIHQgPSBqb2luKG1hcChjaHIscmFuZ2UoNTApKSwnJykKKyAgICAgICAgICAgIHUgPSBqb2luKG1hcChjaHIscmFuZ2UoMTAwKSksJycpCisgICAgICAgICAgICB2ID0gam9pbihtYXAoY2hyLHJhbmdlKDI1NikpLCcnKQorCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICAgICAgcy5sb3dlcigpCisKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBzLnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgICAgIHMudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICAgICAgdC5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB0LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgICAgIHQudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdS5sb3dlcigpCisgICAgICAgICAgICAgICAgdS5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB1LnVwcGVyKCkKKyAgICAgICAgICAgICAgICB1LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHUudGl0bGUoKQorICAgICAgICAgICAgICAgIHUudGl0bGUoKQorCisgICAgICAgICAgICAgICAgdi5sb3dlcigpCisKKyAgICAgICAgICAgICAgICB2LnVwcGVyKCkKKworICAgICAgICAgICAgICAgIHYudGl0bGUoKQorCisgICAgICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgICAgIHMgPSBqb2luKG1hcChjaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgICAgIHQgPSBqb2luKG1hcChjaHIscmFuZ2UoNTApKSwnJykKKyAgICAgICAgICAgIHUgPSBqb2luKG1hcChjaHIscmFuZ2UoMTAwKSksJycpCisgICAgICAgICAgICB2ID0gam9pbihtYXAoY2hyLHJhbmdlKDI1NikpLCcnKQorCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGNsYXNzIFN0cmluZ1ByZWRpY2F0ZXMoVGVzdCk6CisKKyAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICBvcGVyYXRpb25zID0gMTAgKiA3CisgICAgICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAoJ2FiYycsICcxMjMnLCAnICAgJywgJ1x4ZTRceGY2XHhmYycsICdceGRmJyoxMCkKKyAgICAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICAgICAgICAgIHMuaXNhbG51bSgpCisgICAgICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgICAgICBzLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIHMuaXNsb3dlcigpCisgICAgICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgICAgICBzLmlzdGl0bGUoKQorICAgICAgICAgICAgICAgIHMuaXN1cHBlcigpCisKKyAgICAgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgICAgIHMuaXNhbHBoYSgpCisgICAgICAgICAgICAgICAgcy5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgICAgIHMuaXNzcGFjZSgpCisgICAgICAgICAgICAgICAgcy5pc3RpdGxlKCkKKyAgICAgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICAgICAgcy5pc2FsbnVtKCkKKyAgICAgICAgICAgICAgICBzLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICAgICAgcy5pc2xvd2VyKCkKKyAgICAgICAgICAgICAgICBzLmlzc3BhY2UoKQorICAgICAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICAgICAgcy5pc3VwcGVyKCkKKworICAgICAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgICAgICBkYXRhID0gKCdhYmMnLCAnMTIzJywgJyAgICcsICdcdTEyMzRcdTIzNDVcdTM0NTYnLCAnXHVGRkZGJyoxMCkKKyAgICAgICAgICAgIGRhdGEgPSAoJ2FiYycsICcxMjMnLCAnICAgJywgJ1x4ZTRceGY2XHhmYycsICdceGRmJyoxMCkKKyAgICAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5IGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NGRlZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5CkBAIC0wLDAgKzEsMzY1IEBACitmcm9tIHB5YmVuY2ggaW1wb3J0IFRlc3QKKworY2xhc3MgVHVwbGVTbGljaW5nKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMzEKKyAgICBvcGVyYXRpb25zID0gMyAqIDI1ICogMTAgKiA3CisgICAgcm91bmRzID0gNDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICByID0gcmFuZ2UoMjUpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKworICAgICAgICAgICAgdCA9IHR1cGxlKHJhbmdlKDEwMCkpCisKKyAgICAgICAgICAgIGZvciBqIGluIHI6CisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICAgICAgICAgICAgICBtID0gdFs1MDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjI1XQorICAgICAgICAgICAgICAgIG0gPSB0WzUwOjU1XQorICAgICAgICAgICAgICAgIG0gPSB0WzotMV0KKyAgICAgICAgICAgICAgICBtID0gdFsxOl0KKyAgICAgICAgICAgICAgICBtID0gdFstMTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoxMF0KKworICAgICAgICAgICAgICAgIG0gPSB0WzUwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MjVdCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6NTVdCisgICAgICAgICAgICAgICAgbSA9IHRbOi0xXQorICAgICAgICAgICAgICAgIG0gPSB0WzE6XQorICAgICAgICAgICAgICAgIG0gPSB0Wy0xMDpdCisgICAgICAgICAgICAgICAgbSA9IHRbOjEwXQorCisgICAgICAgICAgICAgICAgbSA9IHRbNTA6XQorICAgICAgICAgICAgICAgIG0gPSB0WzoyNV0KKyAgICAgICAgICAgICAgICBtID0gdFs1MDo1NV0KKyAgICAgICAgICAgICAgICBtID0gdFs6LTFdCisgICAgICAgICAgICAgICAgbSA9IHRbMTpdCisgICAgICAgICAgICAgICAgbSA9IHRbLTEwOl0KKyAgICAgICAgICAgICAgICBtID0gdFs6MTBdCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHIgPSByYW5nZSgyNSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKKworICAgICAgICAgICAgZm9yIGogaW4gcjoKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFNtYWxsVHVwbGVzKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMworICAgIG9wZXJhdGlvbnMgPSA1KigxICsgMyArIDYgKyAyKQorICAgIHJvdW5kcyA9IDgwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgICAgICAgICB0ID0gKDEsMiwzLDQsNSw2KQorCisgICAgICAgICAgICBhLGIsYyxkLGUsZiA9IHQKKyAgICAgICAgICAgIGEsYixjLGQsZSxmID0gdAorICAgICAgICAgICAgYSxiLGMsZCxlLGYgPSB0CisKKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKyAgICAgICAgICAgIGEsYixjID0gdFs6M10KKworICAgICAgICAgICAgbCA9IGxpc3QodCkKKyAgICAgICAgICAgIHQgPSB0dXBsZShsKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkgYi9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1ZmNmMgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weQpAQCAtMCwwICsxLDU0MiBAQAordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IKKworZnJvbSBweWJlbmNoIGltcG9ydCBUZXN0Citmcm9tIHN0cmluZyBpbXBvcnQgam9pbgorCitjbGFzcyBDb25jYXRVbmljb2RlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKKyAgICByb3VuZHMgPSA2MDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN0cmluZ3MgYXJlICpub3QqIGludGVybmVkCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxLDEwMSkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisgICAgICAgICAgICB0ICsgcworICAgICAgICAgICAgdCArIHMKKyAgICAgICAgICAgIHQgKyBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMDApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxLDEwMSkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgCisKK2NsYXNzIENvbXBhcmVVbmljb2RlKFRlc3QpOgorCisgICAgdmVyc2lvbiA9IDAuMQorICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKKyAgICByb3VuZHMgPSAxNTAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSAqbm90KiBpbnRlcm5lZAorICAgICAgICBzID0gdW5pY29kZShqb2luKG1hcChzdHIscmFuZ2UoMTApKSkpCisgICAgICAgIHQgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSArICJhYmMiKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICAgICAgICAgIHQgPCBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA9PSBzCisgICAgICAgICAgICB0ID4gcworICAgICAgICAgICAgdCA8IHMKKworICAgICAgICAgICAgdCA8IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0ID09IHMKKyAgICAgICAgICAgIHQgPiBzCisgICAgICAgICAgICB0IDwgcworCisgICAgICAgICAgICB0IDwgcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPT0gcworICAgICAgICAgICAgdCA+IHMKKyAgICAgICAgICAgIHQgPCBzCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSB1bmljb2RlKGpvaW4obWFwKHN0cixyYW5nZSgxMCkpKSkKKyAgICAgICAgdCA9IHVuaWNvZGUoam9pbihtYXAoc3RyLHJhbmdlKDEwKSkpICsgImFiYyIpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIAorCitjbGFzcyBDcmVhdGVVbmljb2RlV2l0aENvbmNhdChUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gMTAgKiA1CisgICAgcm91bmRzID0gODAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBzID0gdSdvbScKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YXgnCisgICAgICAgICAgICBzID0gcyArIHUneGJ4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hjeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZHgnCisgICAgICAgICAgICBzID0gcyArIHUneGV4JworCisgICAgICAgICAgICBzID0gcyArIHUneGF4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hieCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4Y3gnCisgICAgICAgICAgICBzID0gcyArIHUneGR4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hleCcKKworICAgICAgICAgICAgcyA9IHMgKyB1J3hheCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4YngnCisgICAgICAgICAgICBzID0gcyArIHUneGN4JworICAgICAgICAgICAgcyA9IHMgKyB1J3hkeCcKKyAgICAgICAgICAgIHMgPSBzICsgdSd4ZXgnCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAKKworY2xhc3MgVW5pY29kZVNsaWNpbmcoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDUgKiA3CisgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBzID0gdW5pY29kZShqb2luKG1hcChzdHIscmFuZ2UoMTAwKSkpKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICBzWzExOi0xMV0KKworICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgc1sxMTotMTFdCisKKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQorCisgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICBzWzExOi0xMV0KKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgcyA9IHVuaWNvZGUoam9pbihtYXAoc3RyLHJhbmdlKDEwMCkpKSkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAKKyMjIyBTdHJpbmcgbWV0aG9kcworCitjbGFzcyBVbmljb2RlTWFwcGluZ3MoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDMgKiAoNSArIDQgKyAyICsgMSkKKyAgICByb3VuZHMgPSAxMDAwMAorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgcyA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgyMCkpLCcnKQorICAgICAgICB0ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMCkpLCcnKQorICAgICAgICB1ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDUwMCkpLCcnKQorICAgICAgICB2ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMDApKSwnJykKKyAgICAgICAgCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisKKyAgICAgICAgICAgIHMubG93ZXIoKQorICAgICAgICAgICAgcy5sb3dlcigpCisgICAgICAgICAgICBzLmxvd2VyKCkKKyAgICAgICAgICAgIHMubG93ZXIoKQorICAgICAgICAgICAgcy5sb3dlcigpCisKKyAgICAgICAgICAgIHMudXBwZXIoKQorICAgICAgICAgICAgcy51cHBlcigpCisgICAgICAgICAgICBzLnVwcGVyKCkKKyAgICAgICAgICAgIHMudXBwZXIoKQorICAgICAgICAgICAgcy51cHBlcigpCisKKyAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgcy50aXRsZSgpCisgICAgICAgICAgICBzLnRpdGxlKCkKKyAgICAgICAgICAgIHMudGl0bGUoKQorICAgICAgICAgICAgcy50aXRsZSgpCisKKyAgICAgICAgICAgIHQubG93ZXIoKQorICAgICAgICAgICAgdC5sb3dlcigpCisgICAgICAgICAgICB0Lmxvd2VyKCkKKyAgICAgICAgICAgIHQubG93ZXIoKQorCisgICAgICAgICAgICB0LnVwcGVyKCkKKyAgICAgICAgICAgIHQudXBwZXIoKQorICAgICAgICAgICAgdC51cHBlcigpCisgICAgICAgICAgICB0LnVwcGVyKCkKKworICAgICAgICAgICAgdC50aXRsZSgpCisgICAgICAgICAgICB0LnRpdGxlKCkKKyAgICAgICAgICAgIHQudGl0bGUoKQorICAgICAgICAgICAgdC50aXRsZSgpCisKKyAgICAgICAgICAgIHUubG93ZXIoKQorICAgICAgICAgICAgdS5sb3dlcigpCisKKyAgICAgICAgICAgIHUudXBwZXIoKQorICAgICAgICAgICAgdS51cHBlcigpCisKKyAgICAgICAgICAgIHUudGl0bGUoKQorICAgICAgICAgICAgdS50aXRsZSgpCisKKyAgICAgICAgICAgIHYubG93ZXIoKQorCisgICAgICAgICAgICB2LnVwcGVyKCkKKworICAgICAgICAgICAgdi50aXRsZSgpCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgorCisgICAgICAgIHMgPSBqb2luKG1hcCh1bmljaHIscmFuZ2UoMjApKSwnJykKKyAgICAgICAgdCA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDApKSwnJykKKyAgICAgICAgdSA9IGpvaW4obWFwKHVuaWNocixyYW5nZSg1MDApKSwnJykKKyAgICAgICAgdiA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDAwKSksJycpCisgICAgICAgIAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBVbmljb2RlUHJlZGljYXRlcyhUZXN0KToKKworICAgIHZlcnNpb24gPSAwLjEKKyAgICBvcGVyYXRpb25zID0gNSAqIDkKKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIGRhdGEgPSAodSdhYmMnLCB1JzEyMycsIHUnICAgJywgdSdcdTEyMzRcdTIzNDVcdTM0NTYnLCB1J1x1RkZGRicqMTApCisgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCisgICAgICAgIAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgICAgICAgICBzLmlzYWxudW0oKQorICAgICAgICAgICAgcy5pc2FscGhhKCkKKyAgICAgICAgICAgIHMuaXNkZWNpbWFsKCkKKyAgICAgICAgICAgIHMuaXNkaWdpdCgpCisgICAgICAgICAgICBzLmlzbG93ZXIoKQorICAgICAgICAgICAgcy5pc251bWVyaWMoKQorICAgICAgICAgICAgcy5pc3NwYWNlKCkKKyAgICAgICAgICAgIHMuaXN0aXRsZSgpCisgICAgICAgICAgICBzLmlzdXBwZXIoKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBkYXRhID0gKHUnYWJjJywgdScxMjMnLCB1JyAgICcsIHUnXHUxMjM0XHUyMzQ1XHUzNDU2JywgdSdcdUZGRkYnKjEwKQorICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKKyAgICAgICAgICAgIHMgPSBkYXRhW2kgJSBsZW5fZGF0YV0KKwordHJ5OgorICAgIGltcG9ydCB1bmljb2RlZGF0YQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgVW5pY29kZVByb3BlcnRpZXMoVGVzdCk6CisKKyAgICAgICAgdmVyc2lvbiA9IDAuMQorICAgICAgICBvcGVyYXRpb25zID0gNSAqIDgKKyAgICAgICAgcm91bmRzID0gMTAwMDAwCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAodSdhJywgdScxJywgdScgJywgdSdcdTEyMzQnLCB1J1x1RkZGRicpCisgICAgICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAgICAgZGlnaXQgPSB1bmljb2RlZGF0YS5kaWdpdAorICAgICAgICAgICAgbnVtZXJpYyA9IHVuaWNvZGVkYXRhLm51bWVyaWMKKyAgICAgICAgICAgIGRlY2ltYWwgPSB1bmljb2RlZGF0YS5kZWNpbWFsCisgICAgICAgICAgICBjYXRlZ29yeSA9IHVuaWNvZGVkYXRhLmNhdGVnb3J5CisgICAgICAgICAgICBiaWRpcmVjdGlvbmFsID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbAorICAgICAgICAgICAgZGVjb21wb3NpdGlvbiA9IHVuaWNvZGVkYXRhLmRlY29tcG9zaXRpb24KKyAgICAgICAgICAgIG1pcnJvcmVkID0gdW5pY29kZWRhdGEubWlycm9yZWQKKyAgICAgICAgICAgIGNvbWJpbmluZyA9IHVuaWNvZGVkYXRhLmNvbWJpbmluZworCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgYyA9IGRhdGFbaSAlIGxlbl9kYXRhXQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgICAgICAgICAgZGlnaXQoYywgTm9uZSkKKyAgICAgICAgICAgICAgICBudW1lcmljKGMsIE5vbmUpCisgICAgICAgICAgICAgICAgZGVjaW1hbChjLCBOb25lKQorICAgICAgICAgICAgICAgIGNhdGVnb3J5KGMpCisgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbChjKQorICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24oYykKKyAgICAgICAgICAgICAgICBtaXJyb3JlZChjKQorICAgICAgICAgICAgICAgIGNvbWJpbmluZyhjKQorCisgICAgICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgICAgIGRhdGEgPSAodSdhJywgdScxJywgdScgJywgdSdcdTEyMzQnLCB1J1x1RkZGRicpCisgICAgICAgICAgICBsZW5fZGF0YSA9IGxlbihkYXRhKQorICAgICAgICAgICAgZGlnaXQgPSB1bmljb2RlZGF0YS5kaWdpdAorICAgICAgICAgICAgbnVtZXJpYyA9IHVuaWNvZGVkYXRhLm51bWVyaWMKKyAgICAgICAgICAgIGRlY2ltYWwgPSB1bmljb2RlZGF0YS5kZWNpbWFsCisgICAgICAgICAgICBjYXRlZ29yeSA9IHVuaWNvZGVkYXRhLmNhdGVnb3J5CisgICAgICAgICAgICBiaWRpcmVjdGlvbmFsID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbAorICAgICAgICAgICAgZGVjb21wb3NpdGlvbiA9IHVuaWNvZGVkYXRhLmRlY29tcG9zaXRpb24KKyAgICAgICAgICAgIG1pcnJvcmVkID0gdW5pY29kZWRhdGEubWlycm9yZWQKKyAgICAgICAgICAgIGNvbWJpbmluZyA9IHVuaWNvZGVkYXRhLmNvbWJpbmluZworCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgorCisgICAgICAgICAgICAgICAgYyA9IGRhdGFbaSAlIGxlbl9kYXRhXQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9wYWNrYWdlL19faW5pdF9fLnB5IGIvVG9vbHMvcHliZW5jaC9wYWNrYWdlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL3BhY2thZ2UvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvcGFja2FnZS9zdWJtb2R1bGUucHkgYi9Ub29scy9weWJlbmNoL3BhY2thZ2Uvc3VibW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL3BhY2thZ2Uvc3VibW9kdWxlLnB5CmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkgYi9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmYxMGJkMQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weQpAQCAtMCwwICsxLDQ2MSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9weXRob24gLU8KKworIiIiIEEgUHl0aG9uIEJlbmNobWFyayBTdWl0ZQorCisiIiIKKyMKKyMgTm90ZTogUGxlYXNlIGtlZXAgdGhpcyBtb2R1bGUgY29tcGF0aWJsZSB0byBQeXRob24gMS41LjIuCisjCisjIFRlc3RzIG1heSBpbmNsdWRlIGZlYXR1cmVzIGluIGxhdGVyIFB5dGhvbiB2ZXJzaW9ucywgYnV0IHRoZXNlCisjIHNob3VsZCB0aGVuIGJlIGVtYmVkZGVkIGluIHRyeS1leGNlcHQgY2xhdXNlcyBpbiB0aGUgY29uZmlndXJhdGlvbgorIyBtb2R1bGUgU2V0dXAucHkuCisjCisKKyMgcHliZW5jaCBDb3B5cmlnaHQKK19fY29weXJpZ2h0X18gPSAiIiJcCitDb3B5cmlnaHQgKGMpLCAxOTk3LTIwMDYsIE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKQorQ29weXJpZ2h0IChjKSwgMjAwMC0yMDA2LCBlR2VuaXguY29tIFNvZnR3YXJlIEdtYkggKGluZm9AZWdlbml4LmNvbSkKKworICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5CitncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCithbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKK2luIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcKK21vZGlmaWNhdGlvbnMsIHRoYXQgeW91IG1ha2UuCisKK1RIRSBBVVRIT1IgTUFSQy1BTkRSRSBMRU1CVVJHIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTworVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLAorSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCitGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFICEKKyIiIgorCisjIFZlcnNpb24gbnVtYmVyCitfX3ZlcnNpb25fXyA9ICcxLjMnCisKKyMKKyMgTk9URTogVXNlIHhyYW5nZSBmb3IgYWxsIHRlc3QgbG9vcHMgdW5sZXNzIHlvdSB3YW50IHRvIGZhY2UgCisjICAgICAgIGEgMjBNQiBwcm9jZXNzICEKKyMKKyMgQWxsIHRlc3RzIHNob3VsZCBoYXZlIHJvdW5kcyBzZXQgdG8gdmFsdWVzIHNvIHRoYXQgYSBydW4oKQorIyB0YWtlcyBiZXR3ZWVuIDIwLTUwIHNlY29uZHMuIFRoaXMgaXMgdG8gZ2V0IGZhaXJseSBnb29kCisjIGNsb2NrKCkgdmFsdWVzLiBZb3UgY2FuIHVzZSBvcHRpb24gLXcgdG8gc3BlZWR1cCB0aGUgdGVzdHMKKyMgYnkgYSBmaXhlZCBpbnRlZ2VyIGZhY3RvciAodGhlICJ3YXJwIGZhY3RvciIpLgorIworCitpbXBvcnQgc3lzLHRpbWUsb3BlcmF0b3IKK2Zyb20gQ29tbWFuZExpbmUgaW1wb3J0ICoKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlCisgICAgcGlja2xlID0gY1BpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKworIyMjIFRlc3QgYmFzZWNsYXNzCisKK2NsYXNzIFRlc3Q6CisKKyAgICAiIiIgQWxsIHRlc3QgbXVzdCBoYXZlIHRoaXMgY2xhc3MgYXMgYmFzZWNsYXNzLiBJdCBwcm92aWRlcworICAgICAgICB0aGUgbmVjZXNzYXJ5IGludGVyZmFjZSB0byB0aGUgYmVuY2htYXJrIG1hY2hpbmVyeS4KKworICAgICAgICBUaGUgdGVzdHMgbXVzdCBzZXQgLnJvdW5kcyB0byBhIHZhbHVlIGhpZ2ggZW5vdWdoIHRvIGxldCB0aGUKKyAgICAgICAgdGVzdCBydW4gYmV0d2VlbiAyMC01MCBzZWNvbmRzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlCisgICAgICAgIGNsb2NrKCktdGltaW5nIG9ubHkgZ2l2ZXMgcmF0aGVyIGluYWNjdXJhdGUgdmFsdWVzIChvbiBMaW51eCwKKyAgICAgICAgZm9yIGV4YW1wbGUsIGl0IGlzIGFjY3VyYXRlIHRvIGEgZmV3IGh1bmRyZXRocyBvZiBhCisgICAgICAgIHNlY29uZCkuIElmIHlvdSBkb24ndCB3YW50IHRvIHdhaXQgdGhhdCBsb25nLCB1c2UgYSB3YXJwCisgICAgICAgIGZhY3RvciBsYXJnZXIgdGhhbiAxLgorCisgICAgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIHNldCB0aGUgLm9wZXJhdGlvbnMgdmFyaWFibGUgdG8gYQorICAgICAgICB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiAidmlydHVhbCBvcGVyYXRpb25zIiBkb25lIHBlcgorICAgICAgICBjYWxsIG9mIC5ydW4oKS4KKworICAgICAgICBJZiB5b3UgY2hhbmdlIGEgdGVzdCBpbiBzb21lIHdheSwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlYXNlCisgICAgICAgIGl0J3MgdmVyc2lvbiBudW1iZXIuCisKKyAgICAiIiIKKworICAgICMjIyBJbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBlYWNoIHRlc3Qgc2hvdWxkIG92ZXJyaWRlCisKKyAgICAjIFZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZXN0IGFzIGZsb2F0ICh4Lnl5KTsgdGhpcyBpcyBpbXBvcnRhbnQKKyAgICAjIGZvciBjb21wYXJpc29ucyBvZiBiZW5jaG1hcmsgcnVucyAtIHRlc3RzIHdpdGggdW5lcXVhbCB2ZXJzaW9uCisgICAgIyBudW1iZXIgd2lsbCBub3QgZ2V0IGNvbXBhcmVkLgorICAgIHZlcnNpb24gPSAxLjAKKyAgICAKKyAgICAjIFRoZSBudW1iZXIgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBkb25lIGluIGVhY2ggcm91bmQgb2YgdGhlCisgICAgIyB0ZXN0LiBBbiBvcGVyYXRpb24gaXMgdGhlIGJhc2ljIHVuaXQgb2Ygd2hhdCB5b3Ugd2FudCB0bworICAgICMgbWVhc3VyZS4gVGhlIGJlbmNobWFyayB3aWxsIG91dHB1dCB0aGUgYW1vdW50IG9mIHJ1bi10aW1lIHBlcgorICAgICMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gcmFpc2UgdGhlIG1lYXN1cmVkIHRpbWluZ3MKKyAgICAjIHNpZ25pZmljYW50bHkgYWJvdmUgbm9pc2UgbGV2ZWwsIGl0IGlzIG9mdGVuIHJlcXVpcmVkIHRvIHJlcGVhdAorICAgICMgc2V0cyBvZiBvcGVyYXRpb25zIG1vcmUgdGhhbiBvbmNlIHBlciB0ZXN0IHJvdW5kLiBUaGUgbWVhc3VyZWQKKyAgICAjIG92ZXJoZWFkIHBlciB0ZXN0IHJvdW5kIHNob3VsZCBiZSBsZXNzIHRoYW4gMSBzZWNvbmQuCisgICAgb3BlcmF0aW9ucyA9IDEKKworICAgICMgTnVtYmVyIG9mIHJvdW5kcyB0byBleGVjdXRlIHBlciB0ZXN0IHJ1bi4gVGhpcyBzaG91bGQgYmUKKyAgICAjIGFkanVzdGVkIHRvIGEgZmlndXJlIHRoYXQgcmVzdWx0cyBpbiBhIHRlc3QgcnVuLXRpbWUgb2YgYmV0d2VlbgorICAgICMgMjAtNTAgc2Vjb25kcy4KKyAgICByb3VuZHMgPSAxMDAwMDAKKworICAgICMjIyBJbnRlcm5hbCB2YXJpYWJsZXMKKworICAgICMgTWFyayB0aGlzIGNsYXNzIGFzIGltcGxlbWVudGluZyBhIHRlc3QKKyAgICBpc19hX3Rlc3QgPSAxCisKKyAgICAjIE1pc2MuIGludGVybmFsIHZhcmlhYmxlcworICAgIGxhc3RfdGltaW5nID0gKDAsMCwwKSAjIGxhc3QgdGltaW5nIChyZWFsLHJ1bixjYWxpYnJhdGlvbikKKyAgICB3YXJwID0gMSAgICAgICAgICAgICMgd2FycCBmYWN0b3IgdGhpcyB0ZXN0IHVzZXMKKyAgICBjcnVucyA9IDIwICAgICAgICAgICMgbnVtYmVyIG9mIGNhbGlicmF0aW9uIHJ1bnMKKyAgICBvdmVyaGVhZCA9IE5vbmUgICAgICMgbGlzdCBvZiBjYWxpYnJhdGlvbiB0aW1pbmdzCisKKyAgICBkZWYgX19pbml0X18oc2VsZix3YXJwPTEpOgorCisgICAgICAgIGlmIHdhcnAgPiAxOgorICAgICAgICAgICAgc2VsZi5yb3VuZHMgPSBzZWxmLnJvdW5kcyAvIHdhcnAKKyAgICAgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgc2VsZi50aW1lcyA9IFtdCisgICAgICAgIHNlbGYub3ZlcmhlYWQgPSBbXQorICAgICAgICAjIFdlIHdhbnQgdGhlc2UgdG8gYmUgaW4gdGhlIGluc3RhbmNlIGRpY3QsIHNvIHRoYXQgcGlja2xlCisgICAgICAgICMgc2F2ZXMgdGhlbQorICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLnZlcnNpb24KKyAgICAgICAgc2VsZi5vcGVyYXRpb25zID0gc2VsZi5vcGVyYXRpb25zCisgICAgICAgIHNlbGYucm91bmRzID0gc2VsZi5yb3VuZHMKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgIiIiIFJ1biB0aGUgdGVzdCBpbiB0d28gcGhhc2VzOiBmaXJzdCBjYWxpYnJhdGUsIHRoZW4KKyAgICAgICAgICAgIGRvIHRoZSBhY3R1YWwgdGVzdC4gQmUgY2FyZWZ1bCB0byBrZWVwIHRoZSBjYWxpYnJhdGlvbgorICAgICAgICAgICAgdGltaW5nIGxvdyB3L3IgdG8gdGhlIHRlc3QgdGltaW5nLgorICAgICAgICAgICAgCisgICAgICAgICIiIgorICAgICAgICB0ZXN0ID0gc2VsZi50ZXN0CisgICAgICAgIGNhbGlicmF0ZSA9IHNlbGYuY2FsaWJyYXRlCisgICAgICAgIGNsb2NrID0gdGltZS5jbG9jaworICAgICAgICBjcnVucyA9IHNlbGYuY3J1bnMKKyAgICAgICAgIyBmaXJzdCBjYWxpYnJhdGUKKyAgICAgICAgb2Zmc2V0ID0gMC4wCisgICAgICAgIGZvciBpIGluIHJhbmdlKGNydW5zKToKKyAgICAgICAgICAgIHQgPSBjbG9jaygpCisgICAgICAgICAgICBjYWxpYnJhdGUoKQorICAgICAgICAgICAgdCA9IGNsb2NrKCkgLSB0CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyB0CisgICAgICAgIG9mZnNldCA9IG9mZnNldCAvIGNydW5zCisgICAgICAgICMgbm93IHRoZSByZWFsIHRoaW5nCisgICAgICAgIHQgPSBjbG9jaygpIAorICAgICAgICB0ZXN0KCkKKyAgICAgICAgdCA9IGNsb2NrKCkgLSB0CisgICAgICAgIHNlbGYubGFzdF90aW1pbmcgPSAodC1vZmZzZXQsdCxvZmZzZXQpCisgICAgICAgIHNlbGYudGltZXMuYXBwZW5kKHQtb2Zmc2V0KQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworCSIiIiBDYWxpYnJhdGUgdGhlIHRlc3QuCisKKwkgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGV4ZWN1dGUgZXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZCB0bworCSAgICBzZXR1cCBhbmQgcnVuIHRoZSB0ZXN0IC0gZXhjZXB0IGZvciB0aGUgYWN0dWFsIG9wZXJhdGlvbnMKKwkgICAgdGhhdCB5b3UgaW50ZW5kIHRvIG1lYXN1cmUuIHB5YmVuY2ggdXNlcyB0aGlzIG1ldGhvZCB0bworCSAgICBtZWFzdXJlIHRoZSB0ZXN0IGltcGxlbWVudGF0aW9uIG92ZXJoZWFkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisJIiIiIFJ1biB0aGUgdGVzdC4KKworCSAgICBUaGUgdGVzdCBuZWVkcyB0byBydW4gc2VsZi5yb3VuZHMgZXhlY3V0aW5nCisJICAgIHNlbGYub3BlcmF0aW9ucyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBlYWNoLgorCisgICAgICAgICIiIgorICAgICAgICAjIGRvIHNvbWUgdGVzdHMKKyAgICAgICAgcmV0dXJuCisgICAgCisgICAgZGVmIHN0YXQoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybnMgdHdvIHZhbHVlOiBhdmVyYWdlIHRpbWUgcGVyIHJ1biBhbmQgYXZlcmFnZSBwZXIKKyAgICAgICAgICAgIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIAorICAgICAgICAiIiIKKyAgICAgICAgcnVucyA9IGxlbihzZWxmLnRpbWVzKQorICAgICAgICBpZiBydW5zID09IDA6CisgICAgICAgICAgICByZXR1cm4gMCwwCisgICAgICAgIHRvdGFsdGltZSA9IHJlZHVjZShvcGVyYXRvci5hZGQsc2VsZi50aW1lcywwLjApCisgICAgICAgIGF2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMpCisgICAgICAgIG9wX2F2ZyA9IHRvdGFsdGltZSAvIGZsb2F0KHJ1bnMgKiBzZWxmLnJvdW5kcyAqIHNlbGYub3BlcmF0aW9ucykKKyAgICAgICAgaWYgc2VsZi5vdmVyaGVhZDoKKyAgICAgICAgICAgIHRvdGFsb3ZlcmhlYWQgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLHNlbGYub3ZlcmhlYWQsMC4wKQorICAgICAgICAgICAgb3ZfYXZnID0gdG90YWxvdmVyaGVhZCAvIGZsb2F0KHJ1bnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHVzZSBzZWxmLmxhc3RfdGltaW5nIC0gbm90IHRvbyBhY2N1cmF0ZQorICAgICAgICAgICAgb3ZfYXZnID0gc2VsZi5sYXN0X3RpbWluZ1syXQorICAgICAgICByZXR1cm4gYXZnLG9wX2F2Zyxvdl9hdmcKKworIyMjIExvYWQgU2V0dXAKKworIyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBUZXN0IGNsYXNzLCBzaW5jZQorIyB0aGUgU2V0dXAgbW9kdWxlIHdpbGwgaW1wb3J0IHN1YmNsYXNzZXMgdXNpbmcgdGhpcyBjbGFzcy4KKworaW1wb3J0IFNldHVwCisKKyMjIyBCZW5jaG1hcmsgYmFzZSBjbGFzcworCitjbGFzcyBCZW5jaG1hcms6CisKKyAgICBuYW1lID0gJz8nICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHRoZSBiZW5jaG1hcmsKKyAgICByb3VuZHMgPSAxICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygcm91bmRzIHRvIHJ1bgorICAgIHdhcnAgPSAxICAgICAgICAgICAgICAgICAgICAjIFdhcnAgZmFjdG9yCisgICAgcm91bmR0aW1lID0gMCAgICAgICAgICAgICAgICMgQXZlcmFnZSByb3VuZCB0aW1lCisgICAgdmVyc2lvbiA9IE5vbmUgICAgICAgICAgICAgICMgQmVuY2htYXJrIHZlcnNpb24gbnVtYmVyIChzZWUgX19pbml0X18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgZmxvYXQgeC55eQorICAgIHN0YXJ0dGltZSA9IE5vbmUJCSMgQmVuY2htYXJrIHN0YXJ0IHRpbWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKworICAgICAgICBzZWxmLnRlc3RzID0ge30KKyAgICAgICAgc2VsZi52ZXJzaW9uID0gMC4zMQorCisgICAgZGVmIGxvYWRfdGVzdHMoc2VsZixzZXR1cG1vZCx3YXJwPTEpOgorCisgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzCisgICAgICAgIHByaW50ICdTZWFyY2hpbmcgZm9yIHRlc3RzLi4uJworICAgICAgICBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKQorICAgICAgICBmb3IgYyBpbiBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYywnaXNfYV90ZXN0JykgYW5kIGMuX19uYW1lX18gIT0gJ1Rlc3QnOgorICAgICAgICAgICAgICAgIHRlc3RzW2MuX19uYW1lX19dID0gYyh3YXJwKQorICAgICAgICBsID0gdGVzdHMua2V5cygpCisgICAgICAgIGwuc29ydCgpCisgICAgICAgIGZvciB0IGluIGw6CisgICAgICAgICAgICBwcmludCAnICAnLHQKKyAgICAgICAgcHJpbnQKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgIGNsb2NrID0gdGltZS5jbG9jaworICAgICAgICBwcmludCAnUnVubmluZyAlaSByb3VuZChzKSBvZiB0aGUgc3VpdGU6ICcgJSBzZWxmLnJvdW5kcworICAgICAgICBwcmludAorICAgICAgICBzZWxmLnN0YXJ0dGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHJvdW5kdGltZSA9IGNsb2NrKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5yb3VuZHMpOgorICAgICAgICAgICAgcHJpbnQgJyBSb3VuZCAlLTI1aSAgcmVhbCAgIGFicyAgICBvdmVyaGVhZCcgJSAoaSsxKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHRlc3RzKSk6CisgICAgICAgICAgICAgICAgbmFtZSx0ID0gdGVzdHNbal0KKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczonICUgbmFtZSwKKyAgICAgICAgICAgICAgICB0LnJ1bigpCisgICAgICAgICAgICAgICAgcHJpbnQgJyAgJS4zZnIgJS4zZmEgJS4zZm8nICUgdC5sYXN0X3RpbWluZworICAgICAgICAgICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgICAgICBwcmludCAnICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgICUuM2Ygc2Vjb25kcycgJSBcCisgICAgICAgICAgICAgICAgICAoKGNsb2NrKCkgLSByb3VuZHRpbWUpLyhpKzEpKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgc2VsZi5yb3VuZHRpbWUgPSAoY2xvY2soKSAtIHJvdW5kdGltZSkgLyBzZWxmLnJvdW5kcworICAgICAgICBwcmludAorICAgIAorICAgIGRlZiBwcmludF9zdGF0KHNlbGYsIGNvbXBhcmVfdG89Tm9uZSwgaGlkZW5vaXNlPTApOgorCisgICAgICAgIGlmIG5vdCBjb21wYXJlX3RvOgorICAgICAgICAgICAgcHJpbnQgJyUtMzBzICAgICAgcGVyIHJ1biAgICBwZXIgb3Blci4gICBvdmVyaGVhZCcgJSAnVGVzdHM6JworICAgICAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQorICAgICAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgICAgICBmb3IgbmFtZSx0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgIGF2ZyxvcF9hdmcsb3ZfYXZnID0gdC5zdGF0KCkKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICU3LjJmIHVzICU3LjJmIG1zJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobmFtZSxhdmcqMTAwMC4wLG9wX2F2ZyoxMDAwMDAwLjAsb3ZfYXZnKjEwMDAuMCkKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICUxMC4yZiBtcycgJSBcCisgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjApCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICclLTMwcyAgICAgIHBlciBydW4gICAgcGVyIG9wZXIuICAgIGRpZmYgKiknICUgXAorICAgICAgICAgICAgICAgICAgJ1Rlc3RzOicKKyAgICAgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgICAgIHRlc3RzLnNvcnQoKQorICAgICAgICAgICAgY29tcGF0aWJsZSA9IDEKKyAgICAgICAgICAgIGZvciBuYW1lLHQgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgYXZnLG9wX2F2Zyxvdl9hdmcgPSB0LnN0YXQoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBjb21wYXJlX3RvLnRlc3RzW25hbWVdCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBvdGhlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBvdGhlciBhbmQgb3RoZXIudmVyc2lvbiA9PSB0LnZlcnNpb24gYW5kIFwKKyAgICAgICAgICAgICAgICAgICBvdGhlci5vcGVyYXRpb25zID09IHQub3BlcmF0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgYXZnMSxvcF9hdmcxLG92X2F2ZzEgPSBvdGhlci5zdGF0KCkKKyAgICAgICAgICAgICAgICAgICAgcW9wX2F2ZyA9IChvcF9hdmcvb3BfYXZnMS0xLjApKjEwMC4wCisgICAgICAgICAgICAgICAgICAgIGlmIGhpZGVub2lzZSBhbmQgYWJzKHFvcF9hdmcpIDwgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBxb3BfYXZnID0gJycKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHFvcF9hdmcgPSAnJSs3LjJmJSUnICUgcW9wX2F2ZworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHFhdmcscW9wX2F2ZyA9ICduL2EnLCAnbi9hJworICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gMAorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlMTAuMmYgbXMgJTcuMmYgdXMgICU4cycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsYXZnKjEwMDAuMCxvcF9hdmcqMTAwMDAwMC4wLHFvcF9hdmcpCisgICAgICAgICAgICBwcmludCAnLScqNzIKKyAgICAgICAgICAgIGlmIGNvbXBhdGlibGUgYW5kIGNvbXBhcmVfdG8ucm91bmR0aW1lID4gMCBhbmQgXAorICAgICAgICAgICAgICAgY29tcGFyZV90by52ZXJzaW9uID09IHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICAgICAgICAgICAgICUrNy4yZiUlJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICgoc2VsZi5yb3VuZHRpbWUqc2VsZi53YXJwKS8KKyAgICAgICAgICAgICAgICAgICAgICAgIChjb21wYXJlX3RvLnJvdW5kdGltZSpjb21wYXJlX3RvLndhcnApLTEuMCkqMTAwLjApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlMTAuMmYgbXMgICAgICAgICAgICAgICAgICBuL2EnICUgXAorICAgICAgICAgICAgICAgICAgICAgICgnQXZlcmFnZSByb3VuZCB0aW1lJyxzZWxmLnJvdW5kdGltZSAqIDEwMDAuMCkKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnKikgbWVhc3VyZWQgYWdhaW5zdDogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgKGNvbXBhcmVfdG8ubmFtZSxjb21wYXJlX3RvLnJvdW5kcyxjb21wYXJlX3RvLndhcnApCisgICAgICAgIHByaW50CisKK2RlZiBwcmludF9tYWNoaW5lKCk6CisKKyAgICBpbXBvcnQgcGxhdGZvcm0KKyAgICBwcmludCAnTWFjaGluZSBEZXRhaWxzOicKKyAgICBwcmludCAnICAgUGxhdGZvcm0gSUQ6ICAlcycgJSBwbGF0Zm9ybS5wbGF0Zm9ybSgpCisgICAgcHJpbnQgJyAgIEV4ZWN1dGFibGU6ICAgJXMnICUgc3lzLmV4ZWN1dGFibGUKKyAgICAjIFRoZXJlJ3MgYSBidWcgaW4gUHl0aG9uIDIuMmIxKy4uLgorICAgIGlmIHN5cy52ZXJzaW9uWzo2XSA9PSAnMi4yYjErJzoKKyAgICAgICAgcmV0dXJuCisgICAgcHJpbnQgJyAgIFB5dGhvbjogICAgICAgJXMnICUgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQorICAgIHByaW50ICcgICBDb21waWxlcjogICAgICVzJyAlIHBsYXRmb3JtLnB5dGhvbl9jb21waWxlcigpCisgICAgYnVpbGRubywgYnVpbGRkYXRlID0gcGxhdGZvcm0ucHl0aG9uX2J1aWxkKCkKKyAgICBwcmludCAnICAgQnVpbGQ6ICAgICAgICAlcyAoIyVzKScgJSAoYnVpbGRkYXRlLCBidWlsZG5vKQorCitjbGFzcyBQeUJlbmNoQ21kbGluZShBcHBsaWNhdGlvbik6CisKKyAgICBoZWFkZXIgPSAoIlBZQkVOQ0ggLSBhIGJlbmNobWFyayB0ZXN0IHN1aXRlIGZvciBQeXRob24gIgorICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXJzL2NvbXBpbGVycy4iKQorCisgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fCisKKyAgICBvcHRpb25zID0gW0FyZ3VtZW50T3B0aW9uKCctbicsJ251bWJlciBvZiByb3VuZHMnLFNldHVwLk51bWJlcl9vZl9yb3VuZHMpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1mJywnc2F2ZSBiZW5jaG1hcmsgdG8gZmlsZSBhcmcnLCcnKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctYycsJ2NvbXBhcmUgYmVuY2htYXJrIHdpdGggdGhlIG9uZSBpbiBmaWxlIGFyZycsJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1zJywnc2hvdyBiZW5jaG1hcmsgaW4gZmlsZSBhcmcsIHRoZW4gZXhpdCcsJycpLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctUycsJ3Nob3cgc3RhdGlzdGljcyBvZiBiZW5jaG1hcmtzJywwKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctdycsJ3NldCB3YXJwIGZhY3RvciB0byBhcmcnLFNldHVwLldhcnBfZmFjdG9yKSwKKyAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLWQnLCdoaWRlIG5vaXNlIGluIGNvbXBhcmVzJywgMCksCisgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tbm8tZ2MnLCdkaXNhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbicsIDApLAorICAgICAgICAgICAgICAgXQorCisgICAgYWJvdXQgPSAiIiJcCitUaGUgbm9ybWFsIG9wZXJhdGlvbiBpcyB0byBydW4gdGhlIHN1aXRlIGFuZCBkaXNwbGF5IHRoZQorcmVzdWx0cy4gVXNlIC1mIHRvIHNhdmUgdGhlbSBmb3IgbGF0ZXIgcmV1c2Ugb3IgY29tcGFyaXNtcy4KKworRXhhbXBsZXM6CisKK3B5dGhvbjEuNSBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTUKK3B5dGhvbjEuNCBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTQKK3B5dGhvbiBweWJlbmNoLnB5IC1zIHAxNSAtYyBwMTQKKyIiIgorICAgIGNvcHlyaWdodCA9IF9fY29weXJpZ2h0X18KKworICAgIGRlZiBoYW5kbGVfUyhzZWxmLCB2YWx1ZSk6CisKKyAgICAgICAgIiIiIERpc3BsYXkgb25lIGxpbmUgc3RhdHMgZm9yIGVhY2ggYmVuY2htYXJrIGZpbGUgZ2l2ZW4gb24gdGhlCisgICAgICAgICAgICBjb21tYW5kIGxpbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBiZW5jaG1hcmsgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihiZW5jaG1hcmssICdyYicpCisgICAgICAgICAgICAgICAgYmVuY2ggPSBwaWNrbGUubG9hZChmKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUgJXMnICUgcmVwcihiZW5jaG1hcmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICclcywlLS4yZixtcycgJSAoYmVuY2htYXJrLCBiZW5jaC5yb3VuZHRpbWUqMTAwMC4wKQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIG1haW4oc2VsZik6CisKKyAgICAgICAgcm91bmRzID0gc2VsZi52YWx1ZXNbJy1uJ10KKyAgICAgICAgcmVwb3J0ZmlsZSA9IHNlbGYudmFsdWVzWyctZiddCisgICAgICAgIHNob3dfYmVuY2ggPSBzZWxmLnZhbHVlc1snLXMnXQorICAgICAgICBjb21wYXJlX3RvID0gc2VsZi52YWx1ZXNbJy1jJ10KKyAgICAgICAgaGlkZW5vaXNlID0gc2VsZi52YWx1ZXNbJy1kJ10KKyAgICAgICAgd2FycCA9IHNlbGYudmFsdWVzWyctdyddCisgICAgICAgIG5vZ2MgPSBzZWxmLnZhbHVlc1snLS1uby1nYyddCisgICAgICAgIAorICAgICAgICAjIFN3aXRjaCBvZmYgR0MKKyAgICAgICAgaWYgbm9nYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBub2djID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlc1snLS1uby1nYyddOgorICAgICAgICAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKKworICAgICAgICBwcmludCAnUFlCRU5DSCcsX192ZXJzaW9uX18KKyAgICAgICAgcHJpbnQKKworICAgICAgICBpZiBub3QgY29tcGFyZV90bzoKKyAgICAgICAgICAgIHByaW50X21hY2hpbmUoKQorICAgICAgICAgICAgcHJpbnQKKworICAgICAgICBpZiBjb21wYXJlX3RvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGNvbXBhcmVfdG8sJ3JiJykKKyAgICAgICAgICAgICAgICBiZW5jaCA9IHBpY2tsZS5sb2FkKGYpCisgICAgICAgICAgICAgICAgYmVuY2gubmFtZSA9IGNvbXBhcmVfdG8KKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gYmVuY2gKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlJyxjb21wYXJlX3RvCisgICAgICAgICAgICAgICAgY29tcGFyZV90byA9IE5vbmUgICAgCisKKyAgICAgICAgaWYgc2hvd19iZW5jaDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihzaG93X2JlbmNoLCdyYicpCisgICAgICAgICAgICAgICAgYmVuY2ggPSBwaWNrbGUubG9hZChmKQorICAgICAgICAgICAgICAgIGJlbmNoLm5hbWUgPSBzaG93X2JlbmNoCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcHJpbnQgJ0JlbmNobWFyazogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgICAgIChiZW5jaC5uYW1lLGJlbmNoLnJvdW5kcyxiZW5jaC53YXJwKQorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfc3RhdChjb21wYXJlX3RvLCBoaWRlbm9pc2UpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3JlYWRpbmcgZmlsZScsc2hvd19iZW5jaAorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiByZXBvcnRmaWxlOgorICAgICAgICAgICAgaWYgbm9nYzoKKyAgICAgICAgICAgICAgICBwcmludCAnQmVuY2htYXJrOiAlcyAocm91bmRzPSVpLCB3YXJwPSVpLCBubyBHQyknICUgXAorICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnRmaWxlLHJvdW5kcyx3YXJwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnQmVuY2htYXJrOiAlcyAocm91bmRzPSVpLCB3YXJwPSVpKScgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKHJlcG9ydGZpbGUscm91bmRzLHdhcnApCisgICAgICAgICAgICBwcmludAorCisgICAgICAgICMgQ3JlYXRlIGJlbmNobWFyayBvYmplY3QKKyAgICAgICAgYmVuY2ggPSBCZW5jaG1hcmsoKQorICAgICAgICBiZW5jaC5yb3VuZHMgPSByb3VuZHMKKyAgICAgICAgYmVuY2gubG9hZF90ZXN0cyhTZXR1cCx3YXJwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiZW5jaC5ydW4oKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgJyoqKiBLZXlib2FyZEludGVycnVwdCAtLSBBYm9ydGluZycKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmVuY2gucHJpbnRfc3RhdChjb21wYXJlX3RvKQorICAgICAgICAjIHJpbmcgYmVsbAorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcMDA3JykKKworICAgICAgICBpZiByZXBvcnRmaWxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHJlcG9ydGZpbGUsJ3diJykKKyAgICAgICAgICAgICAgICBiZW5jaC5uYW1lID0gcmVwb3J0ZmlsZQorICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKGJlbmNoLGYpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3dyaXRpbmcgcmVwb3J0ZmlsZScKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBQeUJlbmNoQ21kbGluZSgpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2J5ZXh0LnB5IGIvVG9vbHMvc2NyaXB0cy9ieWV4dC5weQppbmRleCA5Mzc1OWJjLi4wOTYxMGIwIDEwMDY0NAotLS0gYS9Ub29scy9zY3JpcHRzL2J5ZXh0LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvYnlleHQucHkKQEAgLTE3LDcgKzE3LDcgQEAKICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUoYXJnKToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRmaWxlKGFyZykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZmluZCAlc1xuIiAlIGZpbGUpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZmluZCAlc1xuIiAlIGFyZykKICAgICAgICAgICAgICAgICBzZWxmLmFkZHN0YXRzKCI8Pz8/PiIsICJ1bmtub3duIiwgMSkKIAogICAgIGRlZiBzdGF0ZGlyKHNlbGYsIGRpcik6CkBAIC0yNSw4ICsyNSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgbGlzdCAlczogJXNcbiIgJSAoZmlsZSwgZXJyKSkKLSAgICAgICAgICAgIHNlbGYuYWRkc3RhdHMoZXh0LCAidW5saXN0YWJsZSIsIDEpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDYW4ndCBsaXN0ICVzOiAlc1xuIiAlIChkaXIsIGVycikpCisgICAgICAgICAgICBzZWxmLmFkZHN0YXRzKCI8ZGlyPiIsICJ1bmxpc3RhYmxlIiwgMSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBuYW1lcy5zb3J0KCkKICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CkBAIC00Miw5ICs0Miw5IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdGZpbGUoZnVsbCkKIAotICAgIGRlZiBzdGF0ZmlsZShzZWxmLCBmaWxlKToKLSAgICAgICAgaGVhZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQotICAgICAgICBoZWFkLCBiYXNlID0gb3MucGF0aC5zcGxpdChmaWxlKQorICAgIGRlZiBzdGF0ZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGhlYWQsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIGhlYWQsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICBpZiBleHQgPT0gYmFzZToKICAgICAgICAgICAgIGV4dCA9ICIiICMgRS5nLiAuY3ZzaWdub3JlIGlzIGRlZW1lZCBub3QgdG8gaGF2ZSBhbiBleHRlbnNpb24KICAgICAgICAgZXh0ID0gb3MucGF0aC5ub3JtY2FzZShleHQpCkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgICBleHQgPSAiPG5vbmU+IgogICAgICAgICBzZWxmLmFkZHN0YXRzKGV4dCwgImZpbGVzIiwgMSkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZmlsZSwgInJiIikKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQogICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3Qgb3BlbiAlczogJXNcbiIgJSAoZmlsZSwgZXJyKSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkNhbid0IG9wZW4gJXM6ICVzXG4iICUgKGZpbGVuYW1lLCBlcnIpKQogICAgICAgICAgICAgc2VsZi5hZGRzdGF0cyhleHQsICJ1bm9wZW5hYmxlIiwgMSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBkYXRhID0gZi5yZWFkKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvY2xhc3NmaXgucHkgYi9Ub29scy9zY3JpcHRzL2NsYXNzZml4LnB5CmluZGV4IGNkZjAwNmEuLmQzMDcwMGYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvY2xhc3NmaXgucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9jbGFzc2ZpeC5weQpAQCAtMzAsNyArMzAsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgaWYgZml4KGFyZyk6IGJhZCA9IDEKICAgICBzeXMuZXhpdChiYWQpCiAKLWlzcHl0aG9ucHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQoraXNweXRob25wcm9nID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCiBkZWYgaXNweXRob24obmFtZSk6CiAgICAgcmV0dXJuIGlzcHl0aG9ucHJvZy5tYXRjaChuYW1lKSA+PSAwCiAKQEAgLTE0OCwxMiArMTQ4LDEyIEBACiAKICMgVGhpcyBleHByZXNzaW9uIGRvZXNuJ3QgY2F0Y2ggKmFsbCogY2xhc3MgZGVmaW5pdGlvbiBoZWFkZXJzLAogIyBidXQgaXQncyBwcmV0dHkgZGFybiBjbG9zZS4KLWNsYXNzZXhwciA9ICdeXChbIFx0XSpjbGFzcyArW2EtekEtWjAtOV9dK1wpICooICopICpcKFwoPS4qXCk/XCk6JwotY2xhc3Nwcm9nID0gcmVnZXguY29tcGlsZShjbGFzc2V4cHIpCitjbGFzc2V4cHIgPSAnXihbIFx0XSpjbGFzcyArW2EtekEtWjAtOV9dKykgKiggKikgKigoPS4qKT8pOicKK2NsYXNzcHJvZyA9IHJlLmNvbXBpbGUoY2xhc3NleHByKQogCiAjIEV4cHJlc3Npb25zIGZvciBmaW5kaW5nIGJhc2UgY2xhc3MgZXhwcmVzc2lvbnMuCi1iYXNlZXhwciA9ICdeICpcKC4qXCkgKiggKikgKiQnCi1iYXNlcHJvZyA9IHJlZ2V4LmNvbXBpbGUoYmFzZWV4cHIpCitiYXNlZXhwciA9ICdeICooLiopICooICopICokJworYmFzZXByb2cgPSByZS5jb21waWxlKGJhc2VleHByKQogCiBkZWYgZml4bGluZShsaW5lKToKICAgICBpZiBjbGFzc3Byb2cubWF0Y2gobGluZSkgPCAwOiAjIE5vICdjbGFzcycga2V5d29yZCAtLSBubyBjaGFuZ2UKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvZml4Y2lkLnB5IGIvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKaW5kZXggNDJhYTgzNS4uNDMzYTQyNSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9maXhjaWQucHkKQEAgLTM1LDcgKzM1LDcgQEAKICMgZmlsZXMuCiAKIGltcG9ydCBzeXMKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiBpbXBvcnQgb3MKIGZyb20gc3RhdCBpbXBvcnQgKgogaW1wb3J0IGdldG9wdApAQCAtOTAsNyArOTAsNyBAQAogIyBDaGFuZ2UgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VsZWN0IGEgZGlmZmVyZW50IHNldCBvZiBmaWxlcwogV2FudGVkID0gJ15bYS16QS1aMC05X10rXC5bY2hdJCcKIGRlZiB3YW50ZWQobmFtZSk6Ci0gICAgcmV0dXJuIHJlZ2V4Lm1hdGNoKFdhbnRlZCwgbmFtZSkgPj0gMAorICAgIHJldHVybiByZS5tYXRjaChXYW50ZWQsIG5hbWUpID49IDAKIAogZGVmIHJlY3Vyc2Vkb3duKGRpcm5hbWUpOgogICAgIGRiZygncmVjdXJzZWRvd24oJXIpXG4nICUgKGRpcm5hbWUsKSkKQEAgLTIxMiwxMiArMjEyLDEyIEBACiAjIEFueXRoaW5nIGVsc2UgaXMgYW4gb3BlcmF0b3IgLS0gZG9uJ3QgbGlzdCB0aGlzIGV4cGxpY2l0bHkgYmVjYXVzZSBvZiAnLyonCiAKIE91dHNpZGVDb21tZW50ID0gKElkZW50aWZpZXIsIE51bWJlciwgU3RyaW5nLCBDaGFyLCBDb21tZW50U3RhcnQpCi1PdXRzaWRlQ29tbWVudFBhdHRlcm4gPSAnXCgnICsgJ1x8Jy5qb2luKE91dHNpZGVDb21tZW50KSArICdcKScKLU91dHNpZGVDb21tZW50UHJvZ3JhbSA9IHJlZ2V4LmNvbXBpbGUoT3V0c2lkZUNvbW1lbnRQYXR0ZXJuKQorT3V0c2lkZUNvbW1lbnRQYXR0ZXJuID0gJygnICsgJ3wnLmpvaW4oT3V0c2lkZUNvbW1lbnQpICsgJyknCitPdXRzaWRlQ29tbWVudFByb2dyYW0gPSByZS5jb21waWxlKE91dHNpZGVDb21tZW50UGF0dGVybikKIAogSW5zaWRlQ29tbWVudCA9IChJZGVudGlmaWVyLCBOdW1iZXIsIENvbW1lbnRFbmQpCi1JbnNpZGVDb21tZW50UGF0dGVybiA9ICdcKCcgKyAnXHwnLmpvaW4oSW5zaWRlQ29tbWVudCkgKyAnXCknCi1JbnNpZGVDb21tZW50UHJvZ3JhbSA9IHJlZ2V4LmNvbXBpbGUoSW5zaWRlQ29tbWVudFBhdHRlcm4pCitJbnNpZGVDb21tZW50UGF0dGVybiA9ICcoJyArICd8Jy5qb2luKEluc2lkZUNvbW1lbnQpICsgJyknCitJbnNpZGVDb21tZW50UHJvZ3JhbSA9IHJlLmNvbXBpbGUoSW5zaWRlQ29tbWVudFBhdHRlcm4pCiAKIGRlZiBpbml0Zml4bGluZSgpOgogICAgIGdsb2JhbCBQcm9ncmFtCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9pZmRlZi5weQppbmRleCA3ZTdiNWNjLi4yZWQ3YTY2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lmZGVmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvaWZkZWYucHkKQEAgLTI3LDcgKzI3LDYgQEAKICMgcHJlcHJvY2Vzc29yIGNvbW1hbmRzLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKIGltcG9ydCBnZXRvcHQKIAogZGVmcyA9IFtdCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL21ldGhmaXgucHkgYi9Ub29scy9zY3JpcHRzL21ldGhmaXgucHkKaW5kZXggYTg3MmFiNy4uYjgxODcxZiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9tZXRoZml4LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvbWV0aGZpeC5weQpAQCAtMjcsNyArMjcsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIApAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgaWYgZml4KGFyZyk6IGJhZCA9IDEKICAgICBzeXMuZXhpdChiYWQpCiAKLWlzcHl0aG9ucHJvZyA9IHJlZ2V4LmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQoraXNweXRob25wcm9nID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfXStcLnB5JCcpCiBkZWYgaXNweXRob24obmFtZSk6CiAgICAgcmV0dXJuIGlzcHl0aG9ucHJvZy5tYXRjaChuYW1lKSA+PSAwCiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBpZiBsaW5lbm8gPT0gMSBhbmQgZyBpcyBOb25lIGFuZCBsaW5lWzoyXSA9PSAnIyEnOgogICAgICAgICAgICAgIyBDaGVjayBmb3Igbm9uLVB5dGhvbiBzY3JpcHRzCiAgICAgICAgICAgICB3b3JkcyA9IGxpbmVbMjpdLnNwbGl0KCkKLSAgICAgICAgICAgIGlmIHdvcmRzIGFuZCByZWdleC5zZWFyY2goJ1twUF15dGhvbicsIHdvcmRzWzBdKSA8IDA6CisgICAgICAgICAgICBpZiB3b3JkcyBhbmQgcmUuc2VhcmNoKCdbcFBdeXRob24nLCB3b3Jkc1swXSkgPCAwOgogICAgICAgICAgICAgICAgIG1zZyA9IGZpbGVuYW1lICsgJzogJyArIHdvcmRzWzBdCiAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgJyBzY3JpcHQ7IG5vdCBmaXhlZFxuJwogICAgICAgICAgICAgICAgIGVycihtc2cpCkBAIC0xNTgsOCArMTU4LDggQEAKICAgICByZXR1cm4gMAogCiAKLWZpeHBhdCA9ICdeWyBcdF0rZGVmICtbYS16QS1aMC05X10rICooICpzZWxmICosICpcKCggKlwoLipcKSAqKVwpICopICo6JwotZml4cHJvZyA9IHJlZ2V4LmNvbXBpbGUoZml4cGF0KQorZml4cGF0ID0gJ15bIFx0XStkZWYgK1thLXpBLVowLTlfXSsgKiggKnNlbGYgKiwgKigoICooLiopICopKSAqKSAqOicKK2ZpeHByb2cgPSByZS5jb21waWxlKGZpeHBhdCkKIAogZGVmIGZpeGxpbmUobGluZSk6CiAgICAgaWYgZml4cHJvZy5tYXRjaChsaW5lKSA+PSAwOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9vYmpncmFwaC5weSBiL1Rvb2xzL3NjcmlwdHMvb2JqZ3JhcGgucHkKaW5kZXggMDEwNjBmOS4uZjc0YzJiNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9vYmpncmFwaC5weQorKysgYi9Ub29scy9zY3JpcHRzL29iamdyYXBoLnB5CkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBnZXRvcHQKLWltcG9ydCByZWdleAoraW1wb3J0IHJlCiAKICMgVHlwZXMgb2Ygc3ltYm9scy4KICMKQEAgLTMyLDcgKzMyLDcgQEAKIAogIyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gcGFyc2UgIm5tIC1vIiBvdXRwdXQuCiAjCi1tYXRjaGVyID0gcmVnZXguY29tcGlsZSgnXCguKlwpOlx0Py4uLi4uLi4uIFwoLlwpIFwoLipcKSQnKQorbWF0Y2hlciA9IHJlLmNvbXBpbGUoJyguKik6XHQ/Li4uLi4uLi4gKC4pICguKikkJykKIAogIyBTdG9yZSAiaXRlbSIgaW4gImRpY3QiIHVuZGVyICJrZXkiLgogIyBUaGUgZGljdGlvbmFyeSBtYXBzIGtleXMgdG8gbGlzdHMgb2YgaXRlbXMuCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkgYi9Ub29scy9zY3JpcHRzL3BhdGhmaXgucHkKaW5kZXggNWNiNWFkZC4uN2Y2ZjE5MSAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9wYXRoZml4LnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvcGF0aGZpeC5weQpAQCAtMjAsNyArMjAsNyBAQAogIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiBmcm9tIHN0YXQgaW1wb3J0ICoKIGltcG9ydCBnZXRvcHQKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgIGlmIGZpeChhcmcpOiBiYWQgPSAxCiAgICAgc3lzLmV4aXQoYmFkKQogCi1pc3B5dGhvbnByb2cgPSByZWdleC5jb21waWxlKCdeW2EtekEtWjAtOV9dK1wucHkkJykKK2lzcHl0aG9ucHJvZyA9IHJlLmNvbXBpbGUoJ15bYS16QS1aMC05X10rXC5weSQnKQogZGVmIGlzcHl0aG9uKG5hbWUpOgogICAgIHJldHVybiBpc3B5dGhvbnByb2cubWF0Y2gobmFtZSkgPj0gMAogCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3BkZXBzLnB5IGIvVG9vbHMvc2NyaXB0cy9wZGVwcy5weQppbmRleCBlODM1Zjg0Li5kYTYzZTM1IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3BkZXBzLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvcGRlcHMucHkKQEAgLTIxLDcgKzIxLDcgQEAKIAogCiBpbXBvcnQgc3lzCi1pbXBvcnQgcmVnZXgKK2ltcG9ydCByZQogaW1wb3J0IG9zCiAKIApAQCAtNTcsOCArNTcsOCBAQAogCiAjIENvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gc2VhcmNoIGZvciBpbXBvcnQgc3RhdGVtZW50cwogIwotbV9pbXBvcnQgPSByZWdleC5jb21waWxlKCdeWyBcdF0qZnJvbVsgXHRdK1woW14gXHRdK1wpWyBcdF0rJykKLW1fZnJvbSA9IHJlZ2V4LmNvbXBpbGUoJ15bIFx0XSppbXBvcnRbIFx0XStcKFteI10rXCknKQorbV9pbXBvcnQgPSByZS5jb21waWxlKCdeWyBcdF0qZnJvbVsgXHRdKyhbXiBcdF0rKVsgXHRdKycpCittX2Zyb20gPSByZS5jb21waWxlKCdeWyBcdF0qaW1wb3J0WyBcdF0rKFteI10rKScpCiAKIAogIyBDb2xsZWN0IGRhdGEgZnJvbSBvbmUgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvdW5pY29kZS9NYWtlZmlsZSBiL1Rvb2xzL3VuaWNvZGUvTWFrZWZpbGUKaW5kZXggZjI2NmQ0ZC4uZmJkMzU1NyAxMDA2NDQKLS0tIGEvVG9vbHMvdW5pY29kZS9NYWtlZmlsZQorKysgYi9Ub29scy91bmljb2RlL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw3IEBACiAKIGFsbDoJZGlzdGNsZWFuIG1hcHBpbmdzIGNvZGVjcwogCi1jb2RlY3M6CW1pc2Mgd2luZG93cyBpc28gYXBwbGUgZWJjZGljIGN1c3RvbS1tYXBwaW5ncworY29kZWNzOgltaXNjIHdpbmRvd3MgaXNvIGFwcGxlIGViY2RpYyBjdXN0b20tbWFwcGluZ3MgY2prCiAKICMjIyBNYXBwaW5ncwogCkBAIC03Miw2ICs3Miw5IEBACiAJJChQWVRIT04pIGdlbmNvZGVjLnB5IE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy8gYnVpbGQvCiAJJChSTSkgLWYgYnVpbGQvcmVhZG1lLioKIAorY2prOglidWlsZC8KKwkkKFBZVEhPTikgZ2VuY2prY29kZWNzLnB5IGJ1aWxkLworCiAjIyMgQ2xlYW51cAogCiBjbGVhbjoKZGlmZiAtLWdpdCBhL1Rvb2xzL3VuaWNvZGUvZ2VuY2prY29kZWNzLnB5IGIvVG9vbHMvdW5pY29kZS9nZW5jamtjb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1YzE5YwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3VuaWNvZGUvZ2VuY2prY29kZWNzLnB5CkBAIC0wLDAgKzEsNjggQEAKK2ltcG9ydCBvcywgc3RyaW5nCisKK2NvZGVjcyA9IHsKKyAgICAnY24nOiAoJ2diMjMxMicsICdnYmsnLCAnZ2IxODAzMCcsICdoeicpLAorICAgICd0dyc6ICgnYmlnNScsICdjcDk1MCcpLAorICAgICdoayc6ICgnYmlnNWhrc2NzJywpLAorICAgICdqcCc6ICgnY3A5MzInLCAnc2hpZnRfamlzJywgJ2V1Y19qcCcsICdldWNfamlzeDAyMTMnLCAnc2hpZnRfamlzeDAyMTMnLAorICAgICAgICAgICAnZXVjX2ppc18yMDA0JywgJ3NoaWZ0X2ppc18yMDA0JyksCisgICAgJ2tyJzogKCdjcDk0OScsICdldWNfa3InLCAnam9oYWInKSwKKyAgICAnaXNvMjAyMic6ICgnaXNvMjAyMl9qcCcsICdpc28yMDIyX2pwXzEnLCAnaXNvMjAyMl9qcF8yJywKKyAgICAgICAgICAgICAgICAnaXNvMjAyMl9qcF8yMDA0JywgJ2lzbzIwMjJfanBfMycsICdpc28yMDIyX2pwX2V4dCcsCisgICAgICAgICAgICAgICAgJ2lzbzIwMjJfa3InKSwKK30KKworVEVNUExBVEUgPSBzdHJpbmcuVGVtcGxhdGUoIiIiXAorIworIyAkZW5jb2RpbmcucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciAkRU5DT0RJTkcKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzXyRvd25lciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfJG93bmVyLmdldGNvZGVjKCckZW5jb2RpbmcnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nJGVuY29kaW5nJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorIiIiKQorCitkZWYgZ2VuY29kZWNzKHByZWZpeCk6CisgICAgZm9yIGxvYywgZW5jb2RpbmdzIGluIGNvZGVjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgZm9yIGVuYyBpbiBlbmNvZGluZ3M6CisgICAgICAgICAgICBjb2RlID0gVEVNUExBVEUuc3Vic3RpdHV0ZShFTkNPRElORz1lbmMudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPWVuYy5sb3dlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXI9bG9jKQorICAgICAgICAgICAgY29kZWNwYXRoID0gb3MucGF0aC5qb2luKHByZWZpeCwgZW5jICsgJy5weScpCisgICAgICAgICAgICBvcGVuKGNvZGVjcGF0aCwgJ3cnKS53cml0ZShjb2RlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBnZW5jb2RlY3Moc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5IGIvVG9vbHMvdW5pY29kZS9nZW5jb2RlYy5weQppbmRleCBiYjFjOWRhLi4zY2ZlZjIwIDEwMDY0NAotLS0gYS9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5CisrKyBiL1Rvb2xzL3VuaWNvZGUvZ2VuY29kZWMucHkKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgIGwuZXh0ZW5kKGVuY29kaW5nX21hcF9jb2RlKQogCiAgICAgIyBGaW5hbCBuZXctbGluZQotICAgIGwuYXBwZW5kKCdcbicpCisgICAgbC5hcHBlbmQoJycpCiAKICAgICByZXR1cm4gJ1xuJy5qb2luKGwpLmV4cGFuZHRhYnMoKQogCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggM2UzMjJlNi4uMDI1MGQ5ZSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMSw1ICsxLDUgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQyNTYzIC4KKyMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQzNDU5IC4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KICMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5IGZvciBweXRob24gMy4wLgogIwpAQCAtMzEyLDcgKzMxMiw3IEBACiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmIgogCi1hY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIFZFUlNJT04gU09WRVJTSU9OIENPTkZJR19BUkdTIFBZVEhPTkZSQU1FV09SSyBQWVRIT05GUkFNRVdPUktESVIgUFlUSE9ORlJBTUVXT1JLUFJFRklYIFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIgTUFDSERFUCBTR0lfQUJJIEVYVFJBUExBVERJUiBFWFRSQU1BQ0hERVBQQVRIIENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgQ1hYIE1BSU5PQkogRVhFRVhUIENDIENGTEFHUyBMREZMQUdTIENQUEZMQUdTIGFjX2N0X0NDIE9CSkVYVCBDUFAgRUdSRVAgQlVJTERFWEVFWFQgTElCUkFSWSBMRExJQlJBUlkgRExMTElCUkFSWSBCTERMSUJSQVJZIExETElCUkFSWURJUiBJTlNUU09OQU1FIFJVTlNIQVJFRCBMSU5LQ0MgUkFOTElCIGFjX2N0X1JBTkxJQiBBUiBTVk5WRVJTSU9OIElOU1RBTExfUFJPR1JBTSBJTlNUQUxMX1NDUklQVCBJTlNUQUxMX0RBVEEgTE4gT1BUIEJBU0VDRkxBR1MgT1RIRVJfTElCVE9PTF9PUFQgTElCVE9PTF9DUlVGVCBTTyBMRFNIQVJFRCBCTERTSEFSRUQgQ0NTSEFSRUQgTElOS0ZPUlNIQVJFRCBDRkxBR1NGT1JTSEFSRUQgU0hMSUJTIFVTRV9TSUdOQUxfTU9EVUxFIFNJR05BTF9PQkpTIFVTRV9USFJFQURfTU9EVUxFIExETEFTVCBUSFJFQURPQkogRExJTkNMRElSIERZTkxPQURGSUxFIE1BQ0hERVBfT0JKUyBUUlVFIExJQk9CSlMgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcgSEFWRV9HRVRIT1NUQllOQU1FX1IgSEFWRV9HRVRIT1NUQllOQU1FIExJQk0gTElCQyBVTklDT0RFX09CSlMgVEhSRUFESEVBREVSUyBTUkNESVJTIExUTElCT0JKUycKK2FjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgVkVSU0lPTiBTT1ZFUlNJT04gQ09ORklHX0FSR1MgUFlUSE9ORlJBTUVXT1JLIFBZVEhPTkZSQU1FV09SS0RJUiBQWVRIT05GUkFNRVdPUktQUkVGSVggUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUiBNQUNIREVQIFNHSV9BQkkgRVhUUkFQTEFURElSIEVYVFJBTUFDSERFUFBBVEggQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIENYWCBNQUlOQ0MgQ1BQIEVHUkVQIEJVSUxERVhFRVhUIExJQlJBUlkgTERMSUJSQVJZIERMTExJQlJBUlkgQkxETElCUkFSWSBMRExJQlJBUllESVIgSU5TVFNPTkFNRSBSVU5TSEFSRUQgTElOS0NDIFJBTkxJQiBhY19jdF9SQU5MSUIgQVIgU1ZOVkVSU0lPTiBJTlNUQUxMX1BST0dSQU0gSU5TVEFMTF9TQ1JJUFQgSU5TVEFMTF9EQVRBIExOIE9QVCBCQVNFQ0ZMQUdTIE9USEVSX0xJQlRPT0xfT1BUIExJQlRPT0xfQ1JVRlQgU08gTERTSEFSRUQgQkxEU0hBUkVEIENDU0hBUkVEIExJTktGT1JTSEFSRUQgQ0ZMQUdTRk9SU0hBUkVEIFNITElCUyBVU0VfU0lHTkFMX01PRFVMRSBTSUdOQUxfT0JKUyBVU0VfVEhSRUFEX01PRFVMRSBMRExBU1QgVEhSRUFET0JKIERMSU5DTERJUiBEWU5MT0FERklMRSBNQUNIREVQX09CSlMgVFJVRSBMSUJPQkpTIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SIEhBVkVfR0VUSE9TVEJZTkFNRSBMSUJNIExJQkMgVU5JQ09ERV9PQkpTIFRIUkVBREhFQURFUlMgU1JDRElSUyBMVExJQk9CSlMnCiBhY19zdWJzdF9maWxlcz0nJwogCiAjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCkBAIC04NTksMTAgKzg1OSwxMyBAQAogICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQogICAtLXdpdGhvdXQtZ2NjICAgICAgICAgICBuZXZlciB1c2UgZ2NjCi0gIC0td2l0aC1jeHg9PGNvbXBpbGVyPiAgIGVuYWJsZSBDKysgc3VwcG9ydAorICAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlIG1haW4oKSBhbmQgbGluayBweXRob24gZXhlY3V0YWJsZSB3aXRoIEMrKworICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcgogICAtLXdpdGgtc3VmZml4PS5leGUgICAgICBzZXQgZXhlY3V0YWJsZSBzdWZmaXgKICAgLS13aXRoLXB5ZGVidWcgICAgICAgICAgYnVpbGQgd2l0aCBQeV9ERUJVRyBkZWZpbmVkCiAgIC0td2l0aC1saWJzPSdsaWIxIC4uLicgIGxpbmsgYWdhaW5zdCBhZGRpdGlvbmFsIGxpYnMKKyAgLS13aXRoLXN5c3RlbS1mZmkgICAgICAgYnVpbGQgX2N0eXBlcyBtb2R1bGUgdXNpbmcgYW4gaW5zdGFsbGVkIGZmaSBsaWJyYXJ5CiAgIC0td2l0aC1zaWduYWwtbW9kdWxlICAgIGRpc2FibGUvZW5hYmxlIHNpZ25hbCBtb2R1bGUKICAgLS13aXRoLWRlYy10aHJlYWRzICAgICAgdXNlIERFQyBBbHBoYS9PU0YxIHRocmVhZC1zYWZlIGxpYnJhcmllcwogICAtLXdpdGgob3V0KS10aHJlYWRzWz1ESVJFQ1RPUlldCkBAIC05NzksNyArOTgyLDcgQEAKICAgICBlbHNlCiAgICAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2RpciIgPiYyCiAgICAgZmkKLSAgICBjZCAkYWNfcG9wZGlyCisgICAgY2QgIiRhY19wb3BkaXIiCiAgIGRvbmUKIGZpCiAKQEAgLTE1MTMsNyArMTUxNiw5IEBACiAgICAgOzsKICAgIyBPbiBNYWMgT1MgWCAxMC40LCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRQogICAjIGRpc2FibGVzIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzIGJleW9uZCByZXBhaXIuCi0gIERhcndpbi84LiopCisgICMgT24gTWFjIE9TIFggMTAuMywgZGVmaW5pbmcgX1BPU0lYX0NfU09VUkNFIG9yIF9YT1BFTl9TT1VSQ0UKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KKyAgRGFyd2luL1s3OF0uKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMTY3NiwyNTggKzE2ODEsNiBAQAogZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhvdXRfZ2NjIiA+JjUKIGVjaG8gIiR7RUNIT19UfSR3aXRob3V0X2djYyIgPiY2CiAKLQotCi1NQUlOT0JKPXB5dGhvbi5vCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1jeHg9PGNvbXBpbGVyPiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtY3h4PTxjb21waWxlcj4uLi4gJEVDSE9fQyIgPiY2Ci0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3h4IG9yIC0td2l0aG91dC1jeHggd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2N4eCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9jeHgiCi0KLQljaGVja19jeHg9bm8KLQljYXNlICR3aXRodmFsIGluCi0Jbm8pCUNYWD0KLQkJd2l0aF9jeHg9bm87OwotCSopCUNYWD0kd2l0aHZhbAotCQlNQUlOT0JKPWNjcHl0aG9uLm8KLQkJd2l0aF9jeHg9JHdpdGh2YWw7OwotCWVzYWMKLWVsc2UKLQotCXdpdGhfY3h4PW5vCi0JY2hlY2tfY3h4PXllcwotCi1maTsKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRoX2N4eCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aF9jeHgiID4mNgotCi1pZiB0ZXN0ICIkd2l0aF9jeHgiID0gInllcyIKLXRoZW4KLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBtdXN0IHN1cHBseSBhIGNvbXBpbGVyIHdoZW4gdXNpbmcgLS13aXRoLWN4eCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBtdXN0IHN1cHBseSBhIGNvbXBpbGVyIHdoZW4gdXNpbmcgLS13aXRoLWN4eCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotaWYgdGVzdCAiJGNoZWNrX2N4eCIgPSAieWVzIgotdGhlbgotCWZvciBhY19wcm9nIGluICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NYWCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgotICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfcHJvZyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotCi1maQotZmkKLUNYWD0kYWNfY3ZfcHJvZ19DWFgKLWlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFgiID4mNQotZWNobyAiJHtFQ0hPX1R9JENYWCIgPiY2Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLWZpCi0KLSAgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRDWFgiIHx8IENYWD0ibm90Zm91bmQiCi0KLQlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKLQl0aGVuCi0JCUNYWD0KLQllbHNlCi0JCWFjX2V4dD1jYwotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLSAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5leGUgYi5vdXQiCi0jIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCi0jIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCi0jIG9mIGV4ZWV4dC4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQysrIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICRFQ0hPX0MiID4mNgotYWNfbGlua19kZWZhdWx0PWBlY2hvICIkYWNfbGluayIgfCBzZWQgJ3MvIC1vICpjb25mdGVzdFteIF0qLy8nYAotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua19kZWZhdWx0XCIiKSA+JjUKLSAgKGV2YWwgJGFjX2xpbmtfZGVmYXVsdCkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIEZpbmQgdGhlIG91dHB1dCwgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuICBUaGlzIHNjaGVtZSBpcwotIyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikgb25seSBhcyBhIGxhc3QKLSMgcmVzb3J0LgotCi0jIEJlIGNhcmVmdWwgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlLCBzaW5jZSBpdCB1c2VkIHRvIGJlIGNhY2hlZC4KLSMgT3RoZXJ3aXNlIGFuIG9sZCBjYWNoZSB2YWx1ZSBvZiBgbm8nIGxlZCB0byBgRVhFRVhUID0gbm8nIGluIGEgTWFrZWZpbGUuCi1hY19jdl9leGVleHQ9Ci0jIGIub3V0IGlzIGNyZWF0ZWQgYnkgaTk2MCBjb21waWxlcnMuCi1mb3IgYWNfZmlsZSBpbiBhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0Ci1kbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5vIHwgKi5vYmogKQotCTs7Ci0gICAgY29uZnRlc3QuJGFjX2V4dCApCi0JIyBUaGlzIGlzIHRoZSBzb3VyY2UgZmlsZS4KLQk7OwotICAgIFthYl0ub3V0ICkKLQkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAotCSMgY2VydGFpbmx5IHJpZ2h0LgotCWJyZWFrOzsKLSAgICAqLiogKQotCWFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAotCSMgRklYTUU6IEkgYmVsaWV2ZSB3ZSBleHBvcnQgYWNfY3ZfZXhlZXh0IGZvciBMaWJ0b29sLAotCSMgYnV0IGl0IHdvdWxkIGJlIGNvb2wgdG8gZmluZCBvdXQgaWYgaXQncyB0cnVlLiAgRG9lcyBhbnlib2R5Ci0JIyBtYWludGFpbiBMaWJ0b29sPyAtLWFraW0uCi0JZXhwb3J0IGFjX2N2X2V4ZWV4dAotCWJyZWFrOzsKLSAgICAqICkKLQlicmVhazs7Ci0gIGVzYWMKLWRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci1maQotCi1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgotCi0jIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgd29ya3MuLi4gJEVDSE9fQyIgPiY2Ci0jIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCi0jIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMrKyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biBDKysgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZmkKLSAgZmkKLWZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLQotcm0gLWYgYS5vdXQgYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0Ci1hY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQotIyBDaGVjayB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICRFQ0hPX0MiID4mNgotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjYKLQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNgotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gIChldmFsICRhY19saW5rKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQotIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCi0jIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAotIyBgcm0nLgotZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQotICBjYXNlICRhY19maWxlIGluCi0gICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKi4qICkgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JICBleHBvcnQgYWNfY3ZfZXhlZXh0Ci0JICBicmVhazs7Ci0gICAgKiApIGJyZWFrOzsKLSAgZXNhYwotZG9uZQotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgotCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci1FWEVFWFQ9JGFjX2N2X2V4ZWV4dAotYWNfZXhlZXh0PSRFWEVFWFQKLQotICAgICAgIGFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi0KLQlmaQotZmkKLQogIyBJZiB0aGUgdXNlciBzd2l0Y2hlcyBjb21waWxlcnMsIHdlIGNhbid0IGJlbGlldmUgdGhlIGNhY2hlCiBpZiB0ZXN0ICEgLXogIiRhY19jdl9wcm9nX0NDIiAtYSAhIC16ICIkQ0MiIC1hICIkQ0MiICE9ICIkYWNfY3ZfcHJvZ19DQyIKIHRoZW4KQEAgLTI1MDYsOCArMjI1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI1NjUsOCArMjMxNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI2ODIsOCArMjQzMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI3MzcsOCArMjQ4Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI3ODMsOCArMjUzMiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI4MjgsOCArMjU3Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTI4NjksNiArMjYxNiwxOTAgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKIAogCisKKworZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPi4uLiAkRUNIT19DIiA+JjYKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jeHhfbWFpbiBvciAtLXdpdGhvdXQtY3h4X21haW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2N4eF9tYWluK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2N4eF9tYWluIgorCisKKwljYXNlICR3aXRodmFsIGluCisJbm8pCXdpdGhfY3h4X21haW49bm8KKwkJTUFJTkNDPSckKENDKSc7OworCXllcykJd2l0aF9jeHhfbWFpbj15ZXMKKwkJTUFJTkNDPSckKENYWCknOzsKKwkqKQl3aXRoX2N4eF9tYWluPXllcworCQlNQUlOQ0M9JHdpdGh2YWwKKwkJaWYgdGVzdCAteiAiJENYWCIKKwkJdGhlbgorCQkJQ1hYPSR3aXRodmFsCisJCWZpOzsKKwllc2FjCitlbHNlCisKKwl3aXRoX2N4eF9tYWluPW5vCisJTUFJTkNDPSckKENDKScKKworZmk7CitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9jeHhfbWFpbiIgPiY1CitlY2hvICIke0VDSE9fVH0kd2l0aF9jeHhfbWFpbiIgPiY2CisKK3ByZXNldF9jeHg9IiRDWFgiCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorICAgICAgICBjYXNlICIkQ0MiIGluCisgICAgICAgIGdjYykgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGcrKzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQ1hYIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gbm90Zm91bmQKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DWFgiICYmIGFjX2N2X3BhdGhfQ1hYPSJnKysiCisgIDs7Citlc2FjCitmaQorQ1hYPSRhY19jdl9wYXRoX0NYWAorCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorIDs7CisgICAgICAgIGNjKSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGMrKzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2FzZSAkQ1hYIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gbm90Zm91bmQKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DWFg9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9DWFgiICYmIGFjX2N2X3BhdGhfQ1hYPSJjKysiCisgIDs7Citlc2FjCitmaQorQ1hYPSRhY19jdl9wYXRoX0NYWAorCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorIDs7CisgICAgICAgIGVzYWMKKwlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKKwl0aGVuCisJCUNYWD0iIgorCWZpCitmaQoraWYgdGVzdCAteiAiJENYWCIKK3RoZW4KKwlmb3IgYWNfcHJvZyBpbiAkQ0NDIGMrKyBnKysgZ2NjIENDIGN4eCBjYysrIGNsCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DWFg9IiRDWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Byb2ciCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKKworZmkKK2ZpCitDWFg9JGFjX2N2X3Byb2dfQ1hYCitpZiB0ZXN0IC1uICIkQ1hYIjsgdGhlbgorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNgorZWxzZQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2CitmaQorCisgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkQ1hYIiB8fCBDWFg9Im5vdGZvdW5kIgorCisJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCisJdGhlbgorCQlDWFg9IiIKKwlmaQorZmkKK2lmIHRlc3QgIiRwcmVzZXRfY3h4IiAhPSAiJENYWCIKK3RoZW4KKyAgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzoKKworICBCeSBkZWZhdWx0LCBkaXN0dXRpbHMgd2lsbCBidWlsZCBDKysgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcIiRDWFhcIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzoKKworICBCeSBkZWZhdWx0LCBkaXN0dXRpbHMgd2lsbCBidWlsZCBDKysgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcIiRDWFhcIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgIiA+JjI7fQorZmkKKworCiAjIGNoZWNrcyBmb3IgVU5JWCB2YXJpYW50cyB0aGF0IHNldCBDIHByZXByb2Nlc3NvciB2YXJpYWJsZXMKIAogYWNfZXh0PWMKQEAgLTMyNzEsMjIgKzMyMDIsNyBAQAogZWNobyAkRUNIT19OICJjaGVja2luZyBMSU5LQ0MuLi4gJEVDSE9fQyIgPiY2CiBpZiB0ZXN0IC16ICIkTElOS0NDIgogdGhlbgotICAgICAgICBpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgotICAgICAgICAgICAgICBMSU5LQ0M9IlwkKFBVUklGWSkgXCQoQ0MpIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVjaG8gJ2V4dGVybiAiQyIgdm9pZCBmb28oKTtpbnQgbWFpbigpe2ZvbygpO30nID4gY29uZnRlc3RfYS5jYwotICAgICAgICAgICAgICAkQ1hYIC1jIGNvbmZ0ZXN0X2EuY2MgIyAyPiY1Ci0gICAgICAgICAgICAgIGVjaG8gJ3ZvaWQgZm9vKCl7fScgPiBjb25mdGVzdF9iLiRhY19leHQKLSAgICAgICAgICAgICAgJENDIC1jIGNvbmZ0ZXN0X2IuJGFjX2V4dCAjIDI+JjUKLSAgICAgICAgICAgICAgaWYgJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdF9hLiRhY19vYmpleHQgY29uZnRlc3RfYi4kYWNfb2JqZXh0IDI+JjUgXAotICAgICAgICAgICAgICAgICAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiAuL2NvbmZ0ZXN0JGFjX2V4ZWV4dAotICAgICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgIExJTktDQz0iXCQoUFVSSUZZKSBcJChDQykiCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgTElOS0NDPSJcJChQVVJJRlkpIFwkKENYWCkiCi0gICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIHJtIC1mciBjb25mdGVzdCoKLSAgICAgICAgZmkKKwlMSU5LQ0M9JyQoUFVSSUZZKSAkKE1BSU5DQyknCiAJY2FzZSAkYWNfc3lzX3N5c3RlbSBpbgogCUFJWCopCiAJICAgZXhwX2V4dHJhPSJcIlwiIgpAQCAtMzYwMCw2ICszNTE2LDcgQEAKIGRvbmUKIGRvbmUKIAorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVk5WRVJTSU9OIiAmJiBhY19jdl9wcm9nX1NWTlZFUlNJT049Im5vdC1mb3VuZCIKIGZpCiBmaQogU1ZOVkVSU0lPTj0kYWNfY3ZfcHJvZ19TVk5WRVJTSU9OCkBAIC0zNzg4LDE4ICszNzA1LDIxIEBACiB0aGVuCiAgICAgY2FzZSAkR0NDIGluCiAgICAgeWVzKQorICAgICAgICBpZiB0ZXN0ICIkQ0MiICE9ICdnKysnIDsgdGhlbgorCSAgICBTVFJJQ1RfUFJPVE89Ii1Xc3RyaWN0LXByb3RvdHlwZXMiCisJZmkKIAljYXNlICRhY19jdl9wcm9nX2NjX2cgaW4KIAl5ZXMpCiAJICAgIGlmIHRlc3QgIiRQeV9ERUJVRyIgPSAndHJ1ZScgOyB0aGVuCiAJCSMgT3B0aW1pemF0aW9uIG1lc3NlcyB1cCBkZWJ1Z2dlcnMsIHNvIHR1cm4gaXQgb2ZmIGZvcgogCQkjIGRlYnVnIGJ1aWxkcy4KLQkJT1BUPSItZyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCQlPUFQ9Ii1nIC1XYWxsICRTVFJJQ1RfUFJPVE8iCiAJICAgIGVsc2UKLQkJT1BUPSItZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyIKKwkJT1BUPSItZyAtTzMgLVdhbGwgJFNUUklDVF9QUk9UTyIKIAkgICAgZmkKIAkgICAgOzsKIAkqKQotCSAgICBPUFQ9Ii1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCSAgICBPUFQ9Ii1PMyAtV2FsbCAkU1RSSUNUX1BST1RPIgogCSAgICA7OwogCWVzYWMKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCkBAIC0zODgyLDYgKzM4MDIsOSBAQAogCURhcndpbiopCiAJICAgIEJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1Xbm8tbG9uZy1kb3VibGUgLW5vLWNwcC1wcmVjb21wIC1tbm8tZnVzZWQtbWFkZCIKIAkgICAgOzsKKwlPU0YqKQorCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtbWllZWUiCisJICAgIDs7CiAgICAgZXNhYwogICAgIDs7CiAKQEAgLTQzNjYsOCArNDI4OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ1MzcsOCArNDQ1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ2NTIsOCArNDU3Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ4MDgsOCArNDcyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ4ODEsOCArNDgwMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTQ5MzYsOCArNDg1NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUwMDgsOCArNDkyNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUwNjMsOCArNDk3OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUxMjcsOCArNTA0Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUxODUsOCArNTA5OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUzMzMsOCArNTI0Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU0ODYsOCArNTM5OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU1NTYsOCArNTQ2Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU2NDcsOCArNTU1Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU2OTgsOCArNTYwNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU3NzYsOCArNTY4NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU4NTgsOCArNTc2NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU5MjQsOCArNTgzMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTU5OTAsOCArNTg5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYwNjMsOCArNTk2Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYxMjUsOCArNjAyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYyMjksOCArNjEzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYyOTYsOCArNjE5Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYzNTksOCArNjI1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0MDAsOCArNjI5OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0NTcsOCArNjM1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY0OTgsOCArNjM5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY1NjMsOCArNjQ1OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTY1OTUsMTAgKzY0OTAsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNjcxMCw4ICs2NjAzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjc3Myw4ICs2NjY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjgxNCw4ICs2NzA1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjg3MSw4ICs2NzYxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjkxMiw4ICs2ODAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNjk3Nyw4ICs2ODY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNzAwOSwxMCArNjg5Niw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC03MTI0LDggKzcwMDksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MTg3LDggKzcwNzEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MjI4LDggKzcxMTEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03Mjg1LDggKzcxNjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MzI2LDggKzcyMDcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03MzkxLDggKzcyNzEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC03NDIzLDEwICs3MzAyLDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTc1MzgsOCArNzQxNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2MDEsOCArNzQ3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2NDIsOCArNzUxNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc2OTksOCArNzU3Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc3NDAsOCArNzYxMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc4MDUsOCArNzY3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTc4MzcsMTAgKzc3MDgsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNzk1Miw4ICs3ODIxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODAxNSw4ICs3ODgzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODA1Niw4ICs3OTIzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODExMyw4ICs3OTc5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODE1NCw4ICs4MDE5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODIxOSw4ICs4MDgzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtODI1MSwxMCArODExNCw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC04MzY2LDggKzgyMjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NDI5LDggKzgyODksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NDcwLDggKzgzMjksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NTI3LDggKzgzODUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NTY4LDggKzg0MjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NjMzLDggKzg0ODksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC04NjY1LDEwICs4NTIwLDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTg3ODAsOCArODYzMyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg4NDMsOCArODY5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg4ODQsOCArODczNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg5NDEsOCArODc5MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTg5ODIsOCArODgzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTkwNDcsOCArODg5NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTkwNzksMTAgKzg5MjYsOCBAQAogZXNhYwogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtOTE5NCw4ICs5MDM5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTI1Nyw4ICs5MTAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTI5OCw4ICs5MTQxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTM1NSw4ICs5MTk3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTM5Niw4ICs5MjM3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTQ2MSw4ICs5MzAxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtOTQ5MywxMCArOTMzMiw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC05NjA0LDggKzk0NDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NjY2LDggKzk1MDIsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NzI5LDggKzk1NjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05NzcwLDggKzk2MDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05ODI3LDggKzk2NjAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05ODY4LDggKzk3MDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05OTMzLDggKzk3NjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC05OTY1LDEwICs5Nzk1LDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTEwMDc3LDggKzk5MDUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDEzOSw4ICs5OTY2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTAyMDIsOCArMTAwMjgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDI0Myw4ICsxMDA2OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwMzAwLDggKzEwMTI0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTAzNDEsOCArMTAxNjQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMDQwNiw4ICsxMDIyOCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwNDM4LDEwICsxMDI1OSw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xMDY5Myw4ICsxMDUxMiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEwODEzLDcgKzEwNjMxLDcgQEAKIAogCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgotICBEYXJ3aW4vWzAxMjM0NTY3XS4qKQorICBEYXJ3aW4vWzAxNTY3XVwuLiopCiAgICAgT1RIRVJfTElCVE9PTF9PUFQ9Ii1wcmViaW5kIC1zZWcxYWRkciAweDEwMDAwMDAwIgogICAgIDs7CiAgIERhcndpbi8qKQpAQCAtMTA4MjMsNyArMTA2NDEsNyBAQAogCiAKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCi0gIERhcndpbi9bMDEyMzQ1NjddLiopCisgIERhcndpbi9bMDE1NjddXC4uKikKICAgICBMSUJUT09MX0NSVUZUPSItZnJhbWV3b3JrIFN5c3RlbSAtbGNjX2R5bmFtaWMgLWFyY2hfb25seSBgYXJjaGAiCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWluc3RhbGxfbmFtZSAkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspJwogICAgIExJQlRPT0xfQ1JVRlQ9JExJQlRPT0xfQ1JVRlQnIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJChWRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTiknOzsKQEAgLTExMTcwLDggKzEwOTg4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTEyNDQsOCArMTEwNjEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTMyMCw4ICsxMTEzNiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExMzc1LDggKzExMTkwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTE0NTEsOCArMTEyNjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTUxNCw4ICsxMTMyNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExNTg2LDggKzExMzk4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTE2NTQsOCArMTE0NjUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMTcyNSw4ICsxMTUzNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTExNzc0LDYgKzExNTgzLDIyIEBACiBlY2hvICIke0VDSE9fVH1ubyIgPiY2CiBmaTsKIAorIyBDaGVjayBmb3IgdXNlIG9mIHRoZSBzeXN0ZW0gbGliZmZpIGxpYnJhcnkKK2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXN5c3RlbS1mZmkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXN5c3RlbS1mZmkuLi4gJEVDSE9fQyIgPiY2CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtX2ZmaSBvciAtLXdpdGhvdXQtc3lzdGVtX2ZmaSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc3lzdGVtX2ZmaStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9zeXN0ZW1fZmZpIgorCitmaTsKKworaWYgdGVzdCAteiAiJHdpdGhfc3lzdGVtX2ZmaSIKK3RoZW4gd2l0aF9zeXN0ZW1fZmZpPSJubyIKK2ZpCitlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9zeXN0ZW1fZmZpIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRoX3N5c3RlbV9mZmkiID4mNgorCiAjIERldGVybWluZSBpZiBzaWduYWxtb2R1bGUgc2hvdWxkIGJlIHVzZWQuCiAKIApAQCAtMTE5NzksOCArMTE4MDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjEzNCw4ICsxMTk1OCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyMzE1LDggKzEyMTM4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTI0MDgsOCArMTIyMzAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjQ3Miw4ICsxMjI5Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyNjIyLDggKzEyNDQyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTI3ODAsOCArMTI1OTksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMjg1NCw4ICsxMjY3Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEyOTI4LDggKzEyNzQ1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTMwMDIsOCArMTI4MTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMzEwNSw4ICsxMjkyMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEzMTgxLDggKzEyOTk1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTMzODQsOCArMTMxOTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xMzUzMyw4ICsxMzM0NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTEzOTI0LDggKzEzNzM1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTM5NzQsNyArMTM3ODQsOCBAQAogCTs7CiAJQmVPUyopIERZTkxPQURGSUxFPSJkeW5sb2FkX2Jlb3MubyI7OwogCWhwKnxIUCopIERZTkxPQURGSUxFPSJkeW5sb2FkX2hwdXgubyI7OwotCURhcndpbi8qKSBEWU5MT0FERklMRT0iZHlubG9hZF9uZXh0Lm8iOzsKKwkjIFVzZSBkeW5sb2FkX25leHQuYyBvbmx5IG9uIDEwLjIgYW5kIGJlbG93LCB3aGljaCBkb24ndCBoYXZlIG5hdGl2ZSBkbG9wZW4oKQorCURhcndpbi9bMDE1Nl1cLi4qKSBEWU5MT0FERklMRT0iZHlubG9hZF9uZXh0Lm8iOzsKIAlhdGhlb3MqKSBEWU5MT0FERklMRT0iZHlubG9hZF9hdGhlb3MubyI7OwogCSopCiAJIyB1c2UgZHlubG9hZF9zaGxpYi5jIGFuZCBkbG9wZW4oKSBpZiB3ZSBoYXZlIGl0OyBvdGhlcndpc2Ugc3R1YgpAQCAtMTQwODYsNiArMTM4OTcsOCBAQAogCiAKIAorCisKIGZvciBhY19mdW5jIGluIGFsYXJtIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGNob3duIGNsb2NrIGNvbmZzdHIgY3Rlcm1pZCBcCiAgZXhlY3YgZm9yayBmcGF0aGNvbmYgZnRpbWUgZnRydW5jYXRlIFwKICBnYWlfc3RyZXJyb3IgZ2V0Z3JvdXBzIGdldGxvZ2luIGdldGxvYWRhdmcgZ2V0cGVlcm5hbWUgZ2V0cGdpZCBnZXRwaWQgXApAQCAtMTQwOTcsNyArMTM5MTAsNyBAQAogIHNldGxvY2FsZSBzZXRyZWdpZCBzZXRyZXVpZCBzZXRzaWQgc2V0cGdpZCBzZXRwZ3JwIHNldHVpZCBzZXR2YnVmIHNucHJpbnRmIFwKICBzaWdhY3Rpb24gc2lnaW50ZXJydXB0IHNpZ3JlbHNlIHN0cmZ0aW1lIFwKICBzeXNjb25mIHRjZ2V0cGdycCB0Y3NldHBncnAgdGVtcG5hbSB0aW1lZ20gdGltZXMgdG1wZmlsZSB0bXBuYW0gdG1wbmFtX3IgXAotIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdjc2NvbGwgX2dldHB0eQorIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdhaXQzIHdhaXQ0IHdjc2NvbGwgX2dldHB0eQogZG8KIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCiBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKQEAgLTE0MTY1LDggKzEzOTc4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQyMjcsOCArMTQwMzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDI4Miw4ICsxNDA5Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0MzM3LDggKzE0MTQ3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQzOTIsOCArMTQyMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDQ0Nyw4ICsxNDI1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0NTAyLDggKzE0MzA5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ1NjcsOCArMTQzNzMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDYyNiw4ICsxNDQzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0Njg1LDggKzE0NDg5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ3OTUsOCArMTQ1OTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNDg2Myw4ICsxNDY2NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE0OTMxLDggKzE0NzMyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTQ5OTQsOCArMTQ3OTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTA1Nyw4ICsxNDg1Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1MTIwLDggKzE0OTE4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTUyMjEsOCArMTUwMTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTI5MCw4ICsxNTA4Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1MzYwLDggKzE1MTU1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU0NjksOCArMTUyNjMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTUzOCw4ICsxNTMzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1NjA4LDggKzE1NDAwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU3MjQsOCArMTU1MTUsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNTgzMSw4ICsxNTYyMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE1OTQzLDggKzE1NzMyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTU5OTYsOCArMTU3ODQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjA5NCw4ICsxNTg4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2MTQ3LDggKzE1OTMzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTYyNDUsOCArMTYwMzAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjI5OCw4ICsxNjA4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2MzY1LDggKzE2MTQ4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY0MzQsOCArMTYyMTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjY3Miw4ICsxNjQ1Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2NzQwLDggKzE2NTIwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY4MDMsOCArMTY1ODIsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNjg2OSw4ICsxNjY0Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE2OTE2LDggKzE2NjkzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTY5OTEsOCArMTY3NjcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzA1Niw4ICsxNjgzMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3MTAwLDggKzE2ODc0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTcxNjYsOCArMTY5MzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzIxMCw4ICsxNjk4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3Mjc2LDggKzE3MDQ3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTczMjAsOCArMTcwOTAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzM4Niw4ICsxNzE1NSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NDMwLDggKzE3MTk4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc0OTYsOCArMTcyNjMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzU0MCw4ICsxNzMwNiw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NjA2LDggKzE3MzcxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc2NTAsOCArMTc0MTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzcyOSw4ICsxNzQ5Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3NzkzLDggKzE3NTU1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTc4NTMsOCArMTc2MTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xNzkxNyw4ICsxNzY3Nyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE3OTg0LDggKzE3NzQzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTgwOTAsOCArMTc4NDgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODE1MCw4ICsxNzkwNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4MjA2LDggKzE3OTYyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTgyNjIsOCArMTgwMTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODMyOSw4ICsxODA4Myw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4Mzg5LDggKzE4MTQyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg0NDgsOCArMTgyMDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODUxMCw4ICsxODI2MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4NjEwLDggKzE4MzYwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg2NzksOCArMTg0MjgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xODc0OCw4ICsxODQ5Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE4ODE1LDggKzE4NTYyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTg5MzAsOCArMTg2NzYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTA0MSw4ICsxODc4Niw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5MTA4LDggKzE4ODUyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTkzMDEsOCArMTkwNDQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTM3Nyw4ICsxOTExOSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5NTM2LDggKzE5Mjc3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTk2MDAsOCArMTkzNDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTY0Miw4ICsxOTM4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5NzAwLDggKzE5NDM4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMTk3NDIsOCArMTk0NzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0xOTgwOCw4ICsxOTU0NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTE5ODQwLDEwICsxOTU3NSw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xOTk1Nyw4ICsxOTY5MCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwMDEwLDcgKzE5NzQyLDggQEAKICAgI2luY2x1ZGUgPHdjaGFyLmg+CiAgIGludCBtYWluKCkKICAgewotICAgICAgICBleGl0KCgoKHdjaGFyX3QpIC0xKSA8ICgod2NoYXJfdCkgMCkpID8gMSA6IDApOworCS8qIFN1Y2Nlc3M6IGV4aXQgY29kZSAwICovCisgICAgICAgIGV4aXQoKCgod2NoYXJfdCkgLTEpIDwgKCh3Y2hhcl90KSAwKSkgPyAwIDogMSk7CiAgIH0KIAogX0FDRU9GCkBAIC0yMDE2OCw4ICsxOTkwMSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwMjExLDggKzE5OTQzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjAyNjksOCArMjAwMDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMDQ1OSw4ICsyMDE4OSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwNTM2LDggKzIwMjY1LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjA2MTIsOCArMjAzNDAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMDY4OCw4ICsyMDQxNSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIwODIwLDggKzIwNTQ2LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjA4OTQsOCArMjA2MTksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTE1Nyw4ICsyMDg4MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxMjA0LDggKzIwOTI3LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjEyNzksOCArMjEwMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTQ2Myw4ICsyMTE4NCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxNTMwLDggKzIxMjUwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjE1OTcsOCArMjEzMTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTY2NCw4ICsyMTM4Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTIxNzc0LDggKzIxNDkxLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMjI0NTUsMTUgKzIyMTcxLDE1IEBACiBzLEBFWFRSQVBMQVRESVJALCRFWFRSQVBMQVRESVIsO3QgdAogcyxARVhUUkFNQUNIREVQUEFUSEAsJEVYVFJBTUFDSERFUFBBVEgsO3QgdAogcyxAQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVEAsJENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQsO3QgdAotcyxAQ1hYQCwkQ1hYLDt0IHQKLXMsQE1BSU5PQkpALCRNQUlOT0JKLDt0IHQKLXMsQEVYRUVYVEAsJEVYRUVYVCw7dCB0CiBzLEBDQ0AsJENDLDt0IHQKIHMsQENGTEFHU0AsJENGTEFHUyw7dCB0CiBzLEBMREZMQUdTQCwkTERGTEFHUyw7dCB0CiBzLEBDUFBGTEFHU0AsJENQUEZMQUdTLDt0IHQKIHMsQGFjX2N0X0NDQCwkYWNfY3RfQ0MsO3QgdAorcyxARVhFRVhUQCwkRVhFRVhULDt0IHQKIHMsQE9CSkVYVEAsJE9CSkVYVCw7dCB0CitzLEBDWFhALCRDWFgsO3QgdAorcyxATUFJTkNDQCwkTUFJTkNDLDt0IHQKIHMsQENQUEAsJENQUCw7dCB0CiBzLEBFR1JFUEAsJEVHUkVQLDt0IHQKIHMsQEJVSUxERVhFRVhUQCwkQlVJTERFWEVFWFQsO3QgdApAQCAtMjI2ODEsMTEgKzIyMzk3LDYgQEAKICAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKICAgZXNhYwogCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIHJtIC1mICIkYWNfZmlsZSIKLSAgZmkKICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgogICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwpAQCAtMjI3MjQsNiArMjI0MzUsMTIgQEAKIAkgZmk7OwogICAgICAgZXNhYwogICAgIGRvbmVgIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIHJtIC1mICIkYWNfZmlsZSIKKyAgZmkKIF9BQ0VPRgogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKICAgc2VkICIkYWNfdnBzdWIKQEAgLTIzMDA3LDEzICsyMjcyNCwxMyBAQAogZmkKIAogCi1lY2hvICJjcmVhdGluZyBTZXR1cCIKK2VjaG8gImNyZWF0aW5nIE1vZHVsZXMvU2V0dXAiCiBpZiB0ZXN0ICEgLWYgTW9kdWxlcy9TZXR1cAogdGhlbgogCWNwICRzcmNkaXIvTW9kdWxlcy9TZXR1cC5kaXN0IE1vZHVsZXMvU2V0dXAKIGZpCiAKLWVjaG8gImNyZWF0aW5nIFNldHVwLmxvY2FsIgorZWNobyAiY3JlYXRpbmcgTW9kdWxlcy9TZXR1cC5sb2NhbCIKIGlmIHRlc3QgISAtZiBNb2R1bGVzL1NldHVwLmxvY2FsCiB0aGVuCiAJZWNobyAiIyBFZGl0IHRoaXMgZmlsZSBmb3IgbG9jYWwgc2V0dXAgY2hhbmdlcyIgPk1vZHVsZXMvU2V0dXAubG9jYWwKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBmMzUyNWIxLi43YTNhMzdmIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0xNzMsNyArMTczLDkgQEAKICAgICA7OwogICAjIE9uIE1hYyBPUyBYIDEwLjQsIGRlZmluaW5nIF9QT1NJWF9DX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFCiAgICMgZGlzYWJsZXMgcGxhdGZvcm0gc3BlY2lmaWMgZmVhdHVyZXMgYmV5b25kIHJlcGFpci4KLSAgRGFyd2luLzguKikKKyAgIyBPbiBNYWMgT1MgWCAxMC4zLCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRSAKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KKyAgRGFyd2luL0A8OkA3OEA6PkAuKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMzExLDU2ICszMTMsNiBAQAogCWVzYWNdKQogQUNfTVNHX1JFU1VMVCgkd2l0aG91dF9nY2MpCiAKLUFDX1NVQlNUKENYWCkKLUFDX1NVQlNUKE1BSU5PQkopCi1NQUlOT0JKPXB5dGhvbi5vCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC0td2l0aC1jeHg9PGNvbXBpbGVyPikKLUFDX0FSR19XSVRIKGN4eCwKLSAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKC0td2l0aC1jeHg9PGNvbXBpbGVyPiwgZW5hYmxlIEMrKyBzdXBwb3J0KSwKLVsKLQljaGVja19jeHg9bm8KLQljYXNlICR3aXRodmFsIGluCi0Jbm8pCUNYWD0KLQkJd2l0aF9jeHg9bm87OwotCSopCUNYWD0kd2l0aHZhbAotCQlNQUlOT0JKPWNjcHl0aG9uLm8KLQkJd2l0aF9jeHg9JHdpdGh2YWw7OwotCWVzYWNdLCBbCi0Jd2l0aF9jeHg9bm8KLQljaGVja19jeHg9eWVzCi1dKQotQUNfTVNHX1JFU1VMVCgkd2l0aF9jeHgpCi0KLWlmIHRlc3QgIiR3aXRoX2N4eCIgPSAieWVzIgotdGhlbgotCUFDX01TR19FUlJPUihbbXVzdCBzdXBwbHkgYSBjb21waWxlciB3aGVuIHVzaW5nIC0td2l0aC1jeHhdKQotZmkKLQotZG5sIFRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgd29ya3Mgc2ltaWxhciB0byBBQ19QUk9HX0NYWC4KLWRubCBJdCBkb2VzIG5vdCBmYWlsIGlmIENYWCBpcyBub3QgZm91bmQsIGFuZCBpdCBpcyBub3QgZXhlY3V0ZWQgaWYgCi1kbmwgLS13aXRob3V0LWN4eCB3YXMgZ2l2ZW4uCi1kbmwgRmluYWxseSwgaXQgZG9lcyBub3QgdGVzdCB3aGV0aGVyIENYWCBpcyBnKysuCi0KLWRubCBBdXRvY29uZiAyLjV4IGRvZXMgbm90IGhhdmUgQUNfUFJPR19DWFhfV09SS1MgYW55bW9yZQotaWZkZWYoW0FDX1BST0dfQ1hYX1dPUktTXSxbXSwKLSAgICAgIFtBQ19ERUZVTihbQUNfUFJPR19DWFhfV09SS1NdLAotICAgICAgW0FDX0xBTkdfUFVTSChDKyspZG5sCi0gICAgICAgX0FDX0NPTVBJTEVSX0VYRUVYVAotICAgICAgIEFDX0xBTkdfUE9QKCkKLSAgICAgIF0KLSldKQotCi1pZiB0ZXN0ICIkY2hlY2tfY3h4IiA9ICJ5ZXMiIAotdGhlbgotCUFDX0NIRUNLX1BST0dTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbCwgbm90Zm91bmQpCi0JaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCi0JdGhlbgotCQlDWFg9Ci0JZWxzZQotCQlBQ19QUk9HX0NYWF9XT1JLUwotCWZpCi1maQotCiAjIElmIHRoZSB1c2VyIHN3aXRjaGVzIGNvbXBpbGVycywgd2UgY2FuJ3QgYmVsaWV2ZSB0aGUgY2FjaGUKIGlmIHRlc3QgISAteiAiJGFjX2N2X3Byb2dfQ0MiIC1hICEgLXogIiRDQyIgLWEgIiRDQyIgIT0gIiRhY19jdl9wcm9nX0NDIgogdGhlbgpAQCAtMzcwLDYgKzMyMiw2MSBAQAogCiBBQ19QUk9HX0NDCiAKK0FDX1NVQlNUKENYWCkKK0FDX1NVQlNUKE1BSU5DQykKK0FDX01TR19DSEVDS0lORyhmb3IgLS13aXRoLWN4eC1tYWluPTxjb21waWxlcj4pCitBQ19BUkdfV0lUSChjeHhfbWFpbiwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKFstLXdpdGgtY3h4LW1haW49PGNvbXBpbGVyPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcGlsZSBtYWluKCkgYW5kIGxpbmsgcHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBDKysgY29tcGlsZXJdKSwKK1sKKwkKKwljYXNlICR3aXRodmFsIGluCisJbm8pCXdpdGhfY3h4X21haW49bm8KKwkJTUFJTkNDPSckKENDKSc7OworCXllcykJd2l0aF9jeHhfbWFpbj15ZXMKKwkJTUFJTkNDPSckKENYWCknOzsKKwkqKQl3aXRoX2N4eF9tYWluPXllcworCQlNQUlOQ0M9JHdpdGh2YWwKKwkJaWYgdGVzdCAteiAiJENYWCIKKwkJdGhlbgorCQkJQ1hYPSR3aXRodmFsCisJCWZpOzsKKwllc2FjXSwgWworCXdpdGhfY3h4X21haW49bm8KKwlNQUlOQ0M9JyQoQ0MpJworXSkKK0FDX01TR19SRVNVTFQoJHdpdGhfY3h4X21haW4pCisKK3ByZXNldF9jeHg9IiRDWFgiCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorICAgICAgICBjYXNlICIkQ0MiIGluCisgICAgICAgIGdjYykgICAgQUNfUEFUSF9QUk9HKENYWCwgW2crK10sIFtnKytdLCBbbm90Zm91bmRdKSA7OworICAgICAgICBjYykgICAgIEFDX1BBVEhfUFJPRyhDWFgsIFtjKytdLCBbYysrXSwgW25vdGZvdW5kXSkgOzsKKyAgICAgICAgZXNhYworCWlmIHRlc3QgIiRDWFgiID0gIm5vdGZvdW5kIgorCXRoZW4KKwkJQ1hYPSIiCisJZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ1hYIgordGhlbgorCUFDX0NIRUNLX1BST0dTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbCwgbm90Zm91bmQpCisJaWYgdGVzdCAiJENYWCIgPSAibm90Zm91bmQiCisJdGhlbgorCQlDWFg9IiIKKwlmaQorZmkKK2lmIHRlc3QgIiRwcmVzZXRfY3h4IiAhPSAiJENYWCIKK3RoZW4KKyAgICAgICAgQUNfTVNHX1dBUk4oWworCisgIEJ5IGRlZmF1bHQsIGRpc3R1dGlscyB3aWxsIGJ1aWxkIEMrKyBleHRlbnNpb24gbW9kdWxlcyB3aXRoICIkQ1hYIi4KKyAgSWYgdGhpcyBpcyBub3QgaW50ZW5kZWQsIHRoZW4gc2V0IENYWCBvbiB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4KKyAgXSkKK2ZpCisKKwogIyBjaGVja3MgZm9yIFVOSVggdmFyaWFudHMgdGhhdCBzZXQgQyBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCiBBQ19BSVgKIApAQCAtNDc4LDIyICs0ODUsNyBAQAogQUNfTVNHX0NIRUNLSU5HKExJTktDQykKIGlmIHRlc3QgLXogIiRMSU5LQ0MiCiB0aGVuCi0gICAgICAgIGlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCi0gICAgICAgICAgICAgIExJTktDQz0iXCQoUFVSSUZZKSBcJChDQykiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWNobyAnZXh0ZXJuICJDIiB2b2lkIGZvbygpO2ludCBtYWluKCl7Zm9vKCk7fScgPiBjb25mdGVzdF9hLmNjCi0gICAgICAgICAgICAgICRDWFggLWMgY29uZnRlc3RfYS5jYyAjIDI+JjUKLSAgICAgICAgICAgICAgZWNobyAndm9pZCBmb28oKXt9JyA+IGNvbmZ0ZXN0X2IuJGFjX2V4dAotICAgICAgICAgICAgICAkQ0MgLWMgY29uZnRlc3RfYi4kYWNfZXh0ICMgMj4mNQotICAgICAgICAgICAgICBpZiAkQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0X2EuJGFjX29iamV4dCBjb25mdGVzdF9iLiRhY19vYmpleHQgMj4mNSBcCi0gICAgICAgICAgICAgICAgICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIC4vY29uZnRlc3QkYWNfZXhlZXh0Ci0gICAgICAgICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICAgTElOS0NDPSJcJChQVVJJRlkpIFwkKENDKSIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICBMSU5LQ0M9IlwkKFBVUklGWSkgXCQoQ1hYKSIKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgcm0gLWZyIGNvbmZ0ZXN0KgotICAgICAgICBmaQorCUxJTktDQz0nJChQVVJJRlkpICQoTUFJTkNDKScKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCiAJQUlYKikKIAkgICBleHBfZXh0cmE9IlwiXCIiCkBAIC02MTksNyArNjExLDcgQEAKIEFDX0NIRUNLX1BST0dTKEFSLCBhciBhYWwsIGFyKQogCiBBQ19TVUJTVChTVk5WRVJTSU9OKQotQUNfQ0hFQ0tfUFJPRyhTVk5WRVJTSU9OLCBzdm52ZXJzaW9uLCBmb3VuZCkKK0FDX0NIRUNLX1BST0coU1ZOVkVSU0lPTiwgc3ZudmVyc2lvbiwgZm91bmQsIG5vdC1mb3VuZCkKIGlmIHRlc3QgJFNWTlZFUlNJT04gPSBmb3VuZAogdGhlbgogCVNWTlZFUlNJT049InN2bnZlcnNpb24gXCQoc3JjZGlyKSIKQEAgLTY4MywxOCArNjc1LDIxIEBACiB0aGVuCiAgICAgY2FzZSAkR0NDIGluCiAgICAgeWVzKQorICAgICAgICBpZiB0ZXN0ICIkQ0MiICE9ICdnKysnIDsgdGhlbgorCSAgICBTVFJJQ1RfUFJPVE89Ii1Xc3RyaWN0LXByb3RvdHlwZXMiCisJZmkKIAljYXNlICRhY19jdl9wcm9nX2NjX2cgaW4KIAl5ZXMpCiAJICAgIGlmIHRlc3QgIiRQeV9ERUJVRyIgPSAndHJ1ZScgOyB0aGVuCiAJCSMgT3B0aW1pemF0aW9uIG1lc3NlcyB1cCBkZWJ1Z2dlcnMsIHNvIHR1cm4gaXQgb2ZmIGZvcgogCQkjIGRlYnVnIGJ1aWxkcy4KLQkJT1BUPSItZyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCQlPUFQ9Ii1nIC1XYWxsICRTVFJJQ1RfUFJPVE8iCiAJICAgIGVsc2UKLQkJT1BUPSItZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyIKKwkJT1BUPSItZyAtTzMgLVdhbGwgJFNUUklDVF9QUk9UTyIKIAkgICAgZmkKIAkgICAgOzsKIAkqKQotCSAgICBPUFQ9Ii1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorCSAgICBPUFQ9Ii1PMyAtV2FsbCAkU1RSSUNUX1BST1RPIgogCSAgICA7OwogCWVzYWMKIAljYXNlICRhY19zeXNfc3lzdGVtIGluCkBAIC03NDYsNiArNzQxLDkgQEAKIAlEYXJ3aW4qKQogCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtV25vLWxvbmctZG91YmxlIC1uby1jcHAtcHJlY29tcCAtbW5vLWZ1c2VkLW1hZGQiCiAJICAgIDs7CisJT1NGKikKKwkgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLW1pZWVlIgorCSAgICA7OwogICAgIGVzYWMKICAgICA7OwogCkBAIC0xMjU0LDcgKzEyNTIsNyBAQAogCiBBQ19TVUJTVChPVEhFUl9MSUJUT09MX09QVCkKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCi0gIERhcndpbi9APDpAMDEyMzQ1NjdAOj5ALiopIAorICBEYXJ3aW4vQDw6QDAxNTY3QDo+QFwuLiopIAogICAgIE9USEVSX0xJQlRPT0xfT1BUPSItcHJlYmluZCAtc2VnMWFkZHIgMHgxMDAwMDAwMCIKICAgICA7OwogICBEYXJ3aW4vKikKQEAgLTEyNjQsNyArMTI2Miw3IEBACiAKIEFDX1NVQlNUKExJQlRPT0xfQ1JVRlQpCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgotICBEYXJ3aW4vQDw6QDAxMjM0NTY3QDo+QC4qKSAKKyAgRGFyd2luL0A8OkAwMTU2N0A6PkBcLi4qKSAKICAgICBMSUJUT09MX0NSVUZUPSItZnJhbWV3b3JrIFN5c3RlbSAtbGNjX2R5bmFtaWMgLWFyY2hfb25seSBgYXJjaGAiCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWluc3RhbGxfbmFtZSAkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspJwogICAgIExJQlRPT0xfQ1JVRlQ9JExJQlRPT0xfQ1JVRlQnIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJChWRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTiknOzsKQEAgLTE1OTksNiArMTU5NywxNiBAQAogXSwKIFtBQ19NU0dfUkVTVUxUKG5vKV0pCiAKKyMgQ2hlY2sgZm9yIHVzZSBvZiB0aGUgc3lzdGVtIGxpYmZmaSBsaWJyYXJ5CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIC0td2l0aC1zeXN0ZW0tZmZpKQorQUNfQVJHX1dJVEgoc3lzdGVtX2ZmaSwKKyAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKC0td2l0aC1zeXN0ZW0tZmZpLCBidWlsZCBfY3R5cGVzIG1vZHVsZSB1c2luZyBhbiBpbnN0YWxsZWQgZmZpIGxpYnJhcnkpKQorCitpZiB0ZXN0IC16ICIkd2l0aF9zeXN0ZW1fZmZpIgordGhlbiB3aXRoX3N5c3RlbV9mZmk9Im5vIgorZmkKK0FDX01TR19SRVNVTFQoJHdpdGhfc3lzdGVtX2ZmaSkKKwogIyBEZXRlcm1pbmUgaWYgc2lnbmFsbW9kdWxlIHNob3VsZCBiZSB1c2VkLgogQUNfU1VCU1QoVVNFX1NJR05BTF9NT0RVTEUpCiBBQ19TVUJTVChTSUdOQUxfT0JKUykKQEAgLTIxMDUsNyArMjExMyw4IEBACiAJOzsKIAlCZU9TKikgRFlOTE9BREZJTEU9ImR5bmxvYWRfYmVvcy5vIjs7CiAJaHAqfEhQKikgRFlOTE9BREZJTEU9ImR5bmxvYWRfaHB1eC5vIjs7Ci0JRGFyd2luLyopIERZTkxPQURGSUxFPSJkeW5sb2FkX25leHQubyI7OworCSMgVXNlIGR5bmxvYWRfbmV4dC5jIG9ubHkgb24gMTAuMiBhbmQgYmVsb3csIHdoaWNoIGRvbid0IGhhdmUgbmF0aXZlIGRsb3BlbigpCisJRGFyd2luL0A8OkAwMTU2QDo+QFwuLiopIERZTkxPQURGSUxFPSJkeW5sb2FkX25leHQubyI7OwogCWF0aGVvcyopIERZTkxPQURGSUxFPSJkeW5sb2FkX2F0aGVvcy5vIjs7CiAJKikKIAkjIHVzZSBkeW5sb2FkX3NobGliLmMgYW5kIGRsb3BlbigpIGlmIHdlIGhhdmUgaXQ7IG90aGVyd2lzZSBzdHViCkBAIC0yMTQ4LDcgKzIxNTcsNyBAQAogIHNldGxvY2FsZSBzZXRyZWdpZCBzZXRyZXVpZCBzZXRzaWQgc2V0cGdpZCBzZXRwZ3JwIHNldHVpZCBzZXR2YnVmIHNucHJpbnRmIFwKICBzaWdhY3Rpb24gc2lnaW50ZXJydXB0IHNpZ3JlbHNlIHN0cmZ0aW1lIFwKICBzeXNjb25mIHRjZ2V0cGdycCB0Y3NldHBncnAgdGVtcG5hbSB0aW1lZ20gdGltZXMgdG1wZmlsZSB0bXBuYW0gdG1wbmFtX3IgXAotIHRydW5jYXRlIHVuYW1lIHVuc2V0ZW52IHV0aW1lcyB3YWl0cGlkIHdjc2NvbGwgX2dldHB0eSkKKyB0cnVuY2F0ZSB1bmFtZSB1bnNldGVudiB1dGltZXMgd2FpdHBpZCB3YWl0MyB3YWl0NCB3Y3Njb2xsIF9nZXRwdHkpCiAKICMgRm9yIHNvbWUgZnVuY3Rpb25zLCBoYXZpbmcgYSBkZWZpbml0aW9uIGlzIG5vdCBzdWZmaWNpZW50LCBzaW5jZQogIyB3ZSB3YW50IHRvIHRha2UgdGhlaXIgYWRkcmVzcy4KQEAgLTI3ODYsNyArMjc5NSw4IEBACiAgICNpbmNsdWRlIDx3Y2hhci5oPgogICBpbnQgbWFpbigpCiAgIHsKLSAgICAgICAgZXhpdCgoKCh3Y2hhcl90KSAtMSkgPCAoKHdjaGFyX3QpIDApKSA/IDEgOiAwKTsKKwkvKiBTdWNjZXNzOiBleGl0IGNvZGUgMCAqLworICAgICAgICBleGl0KCgoKHdjaGFyX3QpIC0xKSA8ICgod2NoYXJfdCkgMCkpID8gMCA6IDEpOwogICB9CiAgIF0sCiAgIGFjX2N2X3djaGFyX3Rfc2lnbmVkPXllcywKQEAgLTMyMTEsMTMgKzMyMjEsMTMgQEAKIEFDX0NPTkZJR19GSUxFUyhNYWtlZmlsZS5wcmUgTW9kdWxlcy9TZXR1cC5jb25maWcpCiBBQ19PVVRQVVQKIAotZWNobyAiY3JlYXRpbmcgU2V0dXAiCitlY2hvICJjcmVhdGluZyBNb2R1bGVzL1NldHVwIgogaWYgdGVzdCAhIC1mIE1vZHVsZXMvU2V0dXAKIHRoZW4KIAljcCAkc3JjZGlyL01vZHVsZXMvU2V0dXAuZGlzdCBNb2R1bGVzL1NldHVwCiBmaQogCi1lY2hvICJjcmVhdGluZyBTZXR1cC5sb2NhbCIKK2VjaG8gImNyZWF0aW5nIE1vZHVsZXMvU2V0dXAubG9jYWwiCiBpZiB0ZXN0ICEgLWYgTW9kdWxlcy9TZXR1cC5sb2NhbAogdGhlbgogCWVjaG8gIiMgRWRpdCB0aGlzIGZpbGUgZm9yIGxvY2FsIHNldHVwIGNoYW5nZXMiID5Nb2R1bGVzL1NldHVwLmxvY2FsCmRpZmYgLS1naXQgYS9weWNvbmZpZy5oLmluIGIvcHljb25maWcuaC5pbgppbmRleCA5YzNjYTUzLi44ZGY3ZjliIDEwMDY0NAotLS0gYS9weWNvbmZpZy5oLmluCisrKyBiL3B5Y29uZmlnLmguaW4KQEAgLTY3MCw2ICs2NzAsMTIgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbWUuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9VVElNRV9ICiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdDMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfV0FJVDMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0NCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9XQUlUNAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXRwaWQnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfV0FJVFBJRAogCmRpZmYgLS1naXQgYS9zZXR1cC5weSBiL3NldHVwLnB5CmluZGV4IDA5Yjc5ZmQuLjYxYzFmZWMgMTAwNjQ0Ci0tLSBhL3NldHVwLnB5CisrKyBiL3NldHVwLnB5CkBAIC0xODAsNiArMTgwLDEwIEBACiAKICAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAKKyAgICAgICAgaWYgZXh0Lm5hbWUgPT0gJ19jdHlwZXMnOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uZmlndXJlX2N0eXBlcyhleHQpOgorICAgICAgICAgICAgICAgIHJldHVybgorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQogICAgICAgICBleGNlcHQgKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFcnJvciksIHdoeToKQEAgLTMyNiw4ICszMzAsNiBAQAogICAgICAgICAjCiAKICAgICAgICAgIyBTb21lIG1vZHVsZXMgdGhhdCBhcmUgbm9ybWFsbHkgYWx3YXlzIG9uOgotICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdyZWdleCcsIFsncmVnZXhtb2R1bGUuYycsICdyZWdleHByLmMnXSkgKQotCiAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ193ZWFrcmVmJywgWydfd2Vha3JlZi5jJ10pICkKIAogICAgICAgICAjIGFycmF5IG9iamVjdHMKQEAgLTU1MSw4ICs1NTMsOCBAQAogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX3NoYScsIFsnc2hhbW9kdWxlLmMnXSkgKQogICAgICAgICAgICAgIyBUaGUgX21kNSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1CiAgICAgICAgICAgICAjIE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQyAxMzIxLiAgVGhlCi0gICAgICAgICAgICAjIG5lY2Vzc2FyeSBmaWxlcyBtZDVjLmMgYW5kIG1kNS5oIGFyZSBpbmNsdWRlZCBoZXJlLgotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX21kNScsIFsnbWQ1bW9kdWxlLmMnLCAnbWQ1Yy5jJ10pICkKKyAgICAgICAgICAgICMgbmVjZXNzYXJ5IGZpbGVzIG1kNS5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KKyAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19tZDUnLCBbJ21kNW1vZHVsZS5jJywgJ21kNS5jJ10pICkKIAogICAgICAgICBpZiAob3BlbnNzbF92ZXIgPCAweDAwOTA4MDAwKToKICAgICAgICAgICAgICMgT3BlblNTTCBkb2Vzbid0IGRvIHRoZXNlIHVudGlsIDAuOS44IHNvIHdlJ2xsIGJyaW5nIG91ciBvd24gaGFzaApAQCAtNTY5LDE0ICs1NzEsMTMgQEAKIAogICAgICAgICAjIFNsZWVweWNhdCBCZXJrZWxleSBEQiBpbnRlcmZhY2UuICBodHRwOi8vd3d3LnNsZWVweWNhdC5jb20KICAgICAgICAgIwotICAgICAgICAjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLiBUaGUgZWFybGllc3Qgc3VwcG9ydGVkIHZlcnNpb24KLSAgICAgICAgIyBvZiB0aGF0IGxpYnJhcnkgaXMgMy4yLCB0aGUgbGF0ZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGlzIDQuNC4gIEEgbGlzdAotICAgICAgICAjIG9mIGF2YWlsYWJsZSByZWxlYXNlcyBjYW4gYmUgZm91bmQgYXQKLSAgICAgICAgIwotICAgICAgICAjIGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS91cGRhdGUvaW5kZXguaHRtbAorICAgICAgICAjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLiBUaGUgc3VwcG9ydGVkIHZlcnNpb25zCisgICAgICAgICMgYXJlIHNldCBiZWxvdy4gIFZpc2l0IGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS8gdG8gZG93bmxvYWQKKyAgICAgICAgIyBhIHJlbGVhc2UuICBNb3N0IG9wZW4gc291cmNlIE9TZXMgY29tZSB3aXRoIG9uZSBvciBtb3JlCisgICAgICAgICMgdmVyc2lvbnMgb2YgQmVya2VsZXlEQiBhbHJlYWR5IGluc3RhbGxlZC4KIAogICAgICAgICBtYXhfZGJfdmVyID0gKDQsIDQpCi0gICAgICAgIG1pbl9kYl92ZXIgPSAoMywgMikKKyAgICAgICAgbWluX2RiX3ZlciA9ICgzLCAzKQogICAgICAgICBkYl9zZXR1cF9kZWJ1ZyA9IEZhbHNlICAgIyB2ZXJib3NlIGRlYnVnIHByaW50cyBmcm9tIHRoaXMgc2NyaXB0PwogCiAgICAgICAgICMgY29uc3RydWN0IGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvciB0aGUgaGVhZGVyIGZpbGUgaW4gb24KQEAgLTY5MSw2ICs2OTIsODggQEAKICAgICAgICAgICAgIGRibGlicyA9IFtdCiAgICAgICAgICAgICBkYmxpYl9kaXIgPSBOb25lCiAKKyAgICAgICAgIyBUaGUgc3FsaXRlIGludGVyZmFjZQorICAgICAgICBzcWxpdGVfc2V0dXBfZGVidWcgPSBUcnVlICAgIyB2ZXJib3NlIGRlYnVnIHByaW50cyBmcm9tIHRoaXMgc2NyaXB0PworCisgICAgICAgICMgV2UgaHVudCBmb3IgI2RlZmluZSBTUUxJVEVfVkVSU0lPTiAibi5uLm4iCisgICAgICAgICMgV2UgbmVlZCB0byBmaW5kID49IHNxbGl0ZSB2ZXJzaW9uIDMuMC44CisgICAgICAgIHNxbGl0ZV9pbmNkaXIgPSBzcWxpdGVfbGliZGlyID0gTm9uZQorICAgICAgICBzcWxpdGVfaW5jX3BhdGhzID0gWyAnL3Vzci9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvaW5jbHVkZS9zcWxpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9pbmNsdWRlL3NxbGl0ZTMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbG9jYWwvaW5jbHVkZS9zcWxpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9sb2NhbC9pbmNsdWRlL3NxbGl0ZTMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBNSU5fU1FMSVRFX1ZFUlNJT05fTlVNQkVSID0gKDMsIDAsIDgpCisgICAgICAgIE1JTl9TUUxJVEVfVkVSU0lPTiA9ICIuIi5qb2luKFtzdHIoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIE1JTl9TUUxJVEVfVkVSU0lPTl9OVU1CRVJdKQorICAgICAgICBmb3IgZCBpbiBzcWxpdGVfaW5jX3BhdGhzICsgaW5jX2RpcnM6CisgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGQsICJzcWxpdGUzLmgiKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CisgICAgICAgICAgICAgICAgaWYgc3FsaXRlX3NldHVwX2RlYnVnOiBwcmludCAic3FsaXRlOiBmb3VuZCAlcyIlZgorICAgICAgICAgICAgICAgIGluY2YgPSBvcGVuKGYpLnJlYWQoKQorICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2goCisgICAgICAgICAgICAgICAgICAgIHInXHMqLiojXHMqLipkZWZpbmVccy4qU1FMSVRFX1ZFUlNJT05cVyoiKC4qKSInLCBpbmNmKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV92ZXJzaW9uID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBzcWxpdGVfdmVyc2lvbl90dXBsZSA9IHR1cGxlKFtpbnQoeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc3FsaXRlX3ZlcnNpb25fdHVwbGUgPj0gTUlOX1NRTElURV9WRVJTSU9OX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2Ugd2luIQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzL3NxbGl0ZTMuaDogdmVyc2lvbiAlcyIlKGQsIHNxbGl0ZV92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX2luY2RpciA9IGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzcWxpdGVfc2V0dXBfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiB2ZXJzaW9uICVkIGlzIHRvbyBvbGQsIG5lZWQgPj0gJXMiJShkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV92ZXJzaW9uLCBNSU5fU1FMSVRFX1ZFUlNJT04pCisgICAgICAgICAgICAgICAgZWxpZiBzcWxpdGVfc2V0dXBfZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJzcWxpdGU6ICVzIGhhZCBubyBTUUxJVEVfVkVSU0lPTiIlKGYsKQorCisgICAgICAgIGlmIHNxbGl0ZV9pbmNkaXI6CisgICAgICAgICAgICBzcWxpdGVfZGlyc190b19jaGVjayA9IFsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3FsaXRlX2luY2RpciwgJy4uJywgJ2xpYjY0JyksCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNxbGl0ZV9pbmNkaXIsICcuLicsICdsaWInKSwKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3FsaXRlX2luY2RpciwgJy4uJywgJy4uJywgJ2xpYjY0JyksCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNxbGl0ZV9pbmNkaXIsICcuLicsICcuLicsICdsaWInKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIHNxbGl0ZV9saWJmaWxlID0gc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlX2RpcnNfdG9fY2hlY2sgKyBsaWJfZGlycywgJ3NxbGl0ZTMnKQorICAgICAgICAgICAgc3FsaXRlX2xpYmRpciA9IFtvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHNxbGl0ZV9saWJmaWxlKSldCisKKyAgICAgICAgaWYgc3FsaXRlX2luY2RpciBhbmQgc3FsaXRlX2xpYmRpcjoKKyAgICAgICAgICAgIHNxbGl0ZV9zcmNzID0gWydfc3FsaXRlL2FkYXB0ZXJzLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL2NhY2hlLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL2Nvbm5lY3Rpb24uYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvY29udmVydGVycy5jJywKKyAgICAgICAgICAgICAgICAnX3NxbGl0ZS9jdXJzb3IuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvbWljcm9wcm90b2NvbHMuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvbW9kdWxlLmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL3ByZXBhcmVfcHJvdG9jb2wuYycsCisgICAgICAgICAgICAgICAgJ19zcWxpdGUvcm93LmMnLAorICAgICAgICAgICAgICAgICdfc3FsaXRlL3N0YXRlbWVudC5jJywKKyAgICAgICAgICAgICAgICAnX3NxbGl0ZS91dGlsLmMnLCBdCisKKyAgICAgICAgICAgIFBZU1FMSVRFX1ZFUlNJT04gPSAiMi4yLjAiCisgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcyA9IFtdCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKKyAgICAgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcy5hcHBlbmQoKCdNT0RVTEVfTkFNRScsICcic3FsaXRlMyInKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnTU9EVUxFX05BTUUnLCAnXFwic3FsaXRlM1xcIicpKQorCisgICAgICAgICAgICBzcWxpdGVfZGVmaW5lcy5hcHBlbmQoKCdQWV9NQUpPUl9WRVJTSU9OJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoc3lzLnZlcnNpb25faW5mb1swXSkpKQorICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnUFlfTUlOT1JfVkVSU0lPTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHN5cy52ZXJzaW9uX2luZm9bMV0pKSkKKworICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKCdfc3FsaXRlMycsIHNxbGl0ZV9zcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3M9c3FsaXRlX2RlZmluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPVsiTW9kdWxlcy9fc3FsaXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZV9pbmNkaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1zcWxpdGVfbGliZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPXNxbGl0ZV9saWJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVsic3FsaXRlMyIsXSkpCiAKICAgICAgICAgIyBMb29rIGZvciBCZXJrZWxleSBkYiAxLjg1LiAgIE5vdGUgdGhhdCBpdCBpcyBidWlsdCBhcyBhIGRpZmZlcmVudAogICAgICAgICAjIG1vZHVsZSBuYW1lIHNvIGl0IGNhbiBiZSBpbmNsdWRlZCBldmVuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgYXJlCkBAIC04NjUsNyArOTQ4LDcgQEAKICAgICAgICAgIyBGcmVkcmlrIEx1bmRoJ3MgY0VsZW1lbnRUcmVlIG1vZHVsZS4gIE5vdGUgdGhhdCB0aGlzIGFsc28KICAgICAgICAgIyB1c2VzIGV4cGF0ICh2aWEgdGhlIENBUEkgaG9vayBpbiBweWV4cGF0KS4KIAotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgnTW9kdWxlcy9fZWxlbWVudHRyZWUuYycpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3JjZGlyLCAnTW9kdWxlcycsICdfZWxlbWVudHRyZWUuYycpKToKICAgICAgICAgICAgIGRlZmluZV9tYWNyb3MuYXBwZW5kKCgnVVNFX1BZRVhQQVRfQ0FQSScsIE5vbmUpKQogICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKCdfZWxlbWVudHRyZWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3MgPSBkZWZpbmVfbWFjcm9zLApAQCAtODg1LDExICs5NjgsMTEgQEAKICAgICAgICAgaWYgc3lzLm1heGludCA9PSAweDdmZmZmZmZmOgogICAgICAgICAgICAgIyBUaGlzIHJlcXVpcmVzIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSA9PSBzaXplb2YoY2hhciopCiAgICAgICAgICAgICBkbF9pbmMgPSBmaW5kX2ZpbGUoJ2RsZmNuLmgnLCBbXSwgaW5jX2RpcnMpCi0gICAgICAgICAgICBpZiAoZGxfaW5jIGlzIG5vdCBOb25lKSBhbmQgKHBsYXRmb3JtIG5vdCBpbiBbJ2F0aGVvcycsICdkYXJ3aW4nXSk6CisgICAgICAgICAgICBpZiAoZGxfaW5jIGlzIG5vdCBOb25lKSBhbmQgKHBsYXRmb3JtIG5vdCBpbiBbJ2F0aGVvcyddKToKICAgICAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdkbCcsIFsnZGxtb2R1bGUuYyddKSApCiAKICAgICAgICAgIyBUaG9tYXMgSGVsbGVyJ3MgX2N0eXBlcyBtb2R1bGUKLSAgICAgICAgc2VsZi5kZXRlY3RfY3R5cGVzKCkKKyAgICAgICAgc2VsZi5kZXRlY3RfY3R5cGVzKGluY19kaXJzLCBsaWJfZGlycykKIAogICAgICAgICAjIFBsYXRmb3JtLXNwZWNpZmljIGxpYnJhcmllcwogICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnbGludXgyJzoKQEAgLTkwNSw4MiArOTg4LDg2IEBACiAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdzdW5hdWRpb2RldicsIFsnc3VuYXVkaW9kZXYuYyddKSApCiAKICAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgiLS1kaXNhYmxlLXRvb2xib3gtZ2x1ZSIgbm90IGluCi0gICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkNPTkZJR19BUkdTIikpOgotICAgICAgICAgICAgIyBNYWMgT1MgWCBzcGVjaWZpYyBtb2R1bGVzLgotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0NGJywgWydjZi9fQ0Ztb2R1bGUuYycsICdjZi9weWNmYnJpZGdlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSkgKQorICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ09ORklHX0FSR1MiKSk6CiAKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ0NvbG9yUGlja2VyJywgWydDb2xvclBpY2tlcm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdhdXRvR0lMJywgWydhdXRvR0lMLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignZ2VzdGFsdCcsIFsnZ2VzdGFsdG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdNYWNPUycsIFsnbWFjb3Ntb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignT1NBVGVybWlub2xvZ3knLCBbJ09TQVRlcm1pbm9sb2d5LmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ2ljZ2x1ZScsIFsnaWNnbHVlbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19SZXMnLCBbJ3Jlcy9fUmVzbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19TbmQnLCBbJ3NuZC9fU25kbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ05hdicsIFsnTmF2LmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0FFJywgWydhZS9fQUVtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQUgnLCBbJ2FoL19BSG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19BcHAnLCBbJ2FwcC9fQXBwbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0NhcmJvbkV2dCcsIFsnY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQ0cnLCBbJ2NnL19DR21vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQXBwbGljYXRpb25TZXJ2aWNlcyddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfQ20nLCBbJ2NtL19DbW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19DdGwnLCBbJ2N0bC9fQ3RsbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0RsZycsIFsnZGxnL19EbGdtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfRHJhZycsIFsnZHJhZy9fRHJhZ21vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19FdnQnLCBbJ2V2dC9fRXZ0bW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0ZpbGUnLCBbJ2ZpbGUvX0ZpbGVtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfRm9sZGVyJywgWydmb2xkZXIvX0ZvbGRlcm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19GbScsIFsnZm0vX0ZtbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0hlbHAnLCBbJ2hlbHAvX0hlbHBtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfSWNuJywgWydpY24vX0ljbm1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19JQkNhcmJvbicsIFsnaWJjYXJib24vX0lCQ2FyYm9uLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0xhdW5jaCcsIFsnbGF1bmNoL19MYXVuY2htb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0FwcGxpY2F0aW9uU2VydmljZXMnXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX0xpc3QnLCBbJ2xpc3QvX0xpc3Rtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfTWVudScsIFsnbWVudS9fTWVudW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19NbHRlJywgWydtbHRlL19NbHRlbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX09TQScsIFsnb3NhL19PU0Ftb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfUWQnLCBbJ3FkL19RZG1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19RZG9mZnMnLCBbJ3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQorICAgICAgICAgICAgaWYgb3MudW5hbWUoKVsyXSA+ICc4Lic6CisgICAgICAgICAgICAgICAgIyBXZSdyZSBvbiBNYWMgT1MgWCAxMC40IG9yIGxhdGVyLCB0aGUgY29tcGlsZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgIyBzdXBwb3J0ICctV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJy4gVGhpcyB3aWxsCisgICAgICAgICAgICAgICAgIyBzdXJwcmVzcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgdGhlIENhcmJvbiBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICMgdGhlc2UgZXh0ZW5zaW9ucyB3cmFwIHRoZSBDYXJib24gQVBJcyBhbmQgZXZlbiB0aG9zZQorICAgICAgICAgICAgICAgICMgcGFydHMgdGhhdCBhcmUgZGVwcmVjYXRlZC4KKyAgICAgICAgICAgICAgICBjYXJib25fZXh0cmFfY29tcGlsZV9hcmdzID0gWyctV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncyA9IFtdCisKKyAgICAgICAgICAgICMgTWFjIE9TIFggc3BlY2lmaWMgbW9kdWxlcy4KKyAgICAgICAgICAgIGRlZiBtYWNTcmNFeGlzdHMobmFtZTEsIG5hbWUyPScnKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbmFtZTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgbmFtZXMgPSAobmFtZTEsKQorICAgICAgICAgICAgICAgIGlmIG5hbWUyOgorICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IChuYW1lMSwgbmFtZTIpCisgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzcmNkaXIsICdNYWMnLCAnTW9kdWxlcycsICpuYW1lcykKKyAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKKworICAgICAgICAgICAgZGVmIGFkZE1hY0V4dGVuc2lvbihuYW1lLCBrd2RzLCBleHRyYV9zcmNzPVtdKToKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gJycKKyAgICAgICAgICAgICAgICBpZiBuYW1lWzBdID09ICdfJzoKKyAgICAgICAgICAgICAgICAgICAgZGlybmFtZSA9IG5hbWVbMTpdLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBjbmFtZSA9IG5hbWUgKyAnLmMnCisgICAgICAgICAgICAgICAgY21vZHVsZW5hbWUgPSBuYW1lICsgJ21vZHVsZS5jJworICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIE5OTi5jLCBOTk5tb2R1bGUuYywgX25ubi9OTk4uYywgX25ubi9OTk5tb2R1bGUuYworICAgICAgICAgICAgICAgIGlmIG1hY1NyY0V4aXN0cyhjbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbY25hbWVdCisgICAgICAgICAgICAgICAgZWxpZiBtYWNTcmNFeGlzdHMoY21vZHVsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzcmNzID0gW2Ntb2R1bGVuYW1lXQorICAgICAgICAgICAgICAgIGVsaWYgbWFjU3JjRXhpc3RzKGRpcm5hbWUsIGNuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgIyBYWFgobm5vcndpdHopOiBJZiBhbGwgdGhlIG5hbWVzIGVuZGVkIHdpdGggbW9kdWxlLCB3ZQorICAgICAgICAgICAgICAgICAgICAjIHdvdWxkbid0IG5lZWQgdGhpcyBjb25kaXRpb24uICBpYmNhcmJvbiBpcyB0aGUgb25seSBvbmUuCisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGNuYW1lKV0KKyAgICAgICAgICAgICAgICBlbGlmIG1hY1NyY0V4aXN0cyhkaXJuYW1lLCBjbW9kdWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBbb3MucGF0aC5qb2luKGRpcm5hbWUsIGNtb2R1bGVuYW1lKV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIiVzIG5vdCBmb3VuZCIgJSBuYW1lKQorCisgICAgICAgICAgICAgICAgIyBIZXJlJ3MgdGhlIHdob2xlIHBvaW50OiAgYWRkIHRoZSBleHRlbnNpb24gd2l0aCBzb3VyY2VzCisgICAgICAgICAgICAgICAgZXh0cy5hcHBlbmQoRXh0ZW5zaW9uKG5hbWUsIHNyY3MgKyBleHRyYV9zcmNzLCAqKmt3ZHMpKQorCisgICAgICAgICAgICAjIENvcmUgRm91bmRhdGlvbgorICAgICAgICAgICAgY29yZV9rd2RzID0geydleHRyYV9jb21waWxlX2FyZ3MnOiBjYXJib25fZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9saW5rX2FyZ3MnOiBbJy1mcmFtZXdvcmsnLCAnQ29yZUZvdW5kYXRpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE1hY0V4dGVuc2lvbignX0NGJywgY29yZV9rd2RzLCBbJ2NmL3B5Y2ZicmlkZ2UuYyddKQorICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKCdhdXRvR0lMJywgY29yZV9rd2RzKQorCisgICAgICAgICAgICAjIENhcmJvbgorICAgICAgICAgICAgY2FyYm9uX2t3ZHMgPSB7J2V4dHJhX2NvbXBpbGVfYXJncyc6IGNhcmJvbl9leHRyYV9jb21waWxlX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0cmFfbGlua19hcmdzJzogWyctZnJhbWV3b3JrJywgJ0NhcmJvbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBDQVJCT05fRVhUUyA9IFsnQ29sb3JQaWNrZXInLCAnZ2VzdGFsdCcsICdNYWNPUycsICdOYXYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09TQVRlcm1pbm9sb2d5JywgJ2ljZ2x1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFsbCB0aGVzZSBhcmUgaW4gc3ViZGlycworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19BRScsICdfQUgnLCAnX0FwcCcsICdfQ2FyYm9uRXZ0JywgJ19DbScsICdfQ3RsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdfRGxnJywgJ19EcmFnJywgJ19FdnQnLCAnX0ZpbGUnLCAnX0ZvbGRlcicsICdfRm0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19IZWxwJywgJ19JY24nLCAnX0lCQ2FyYm9uJywgJ19MaXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdfTWVudScsICdfTWx0ZScsICdfT1NBJywgJ19SZXMnLCAnX1FkJywgJ19RZG9mZnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19TY3JhcCcsICdfU25kJywgJ19URScsICdfV2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gQ0FSQk9OX0VYVFM6CisgICAgICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKG5hbWUsIGNhcmJvbl9rd2RzKQorCisgICAgICAgICAgICAjIEFwcGxpY2F0aW9uIFNlcnZpY2VzICYgUXVpY2tUaW1lCisgICAgICAgICAgICBhcHBfa3dkcyA9IHsnZXh0cmFfY29tcGlsZV9hcmdzJzogY2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9saW5rX2FyZ3MnOiBbJy1mcmFtZXdvcmsnLCdBcHBsaWNhdGlvblNlcnZpY2VzJ10sCisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE1hY0V4dGVuc2lvbignX0xhdW5jaCcsIGFwcF9rd2RzKQorICAgICAgICAgICAgYWRkTWFjRXh0ZW5zaW9uKCdfQ0cnLCBhcHBfa3dkcykKKwogICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX1F0JywgWydxdC9fUXRtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ1F1aWNrVGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9Y2FyYm9uX2V4dHJhX2NvbXBpbGVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnUXVpY2tUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQotICAgICAgICAgICAgZXh0cy5hcHBlbmQoIEV4dGVuc2lvbignX1NjcmFwJywgWydzY3JhcC9fU2NyYXBtb2R1bGUuYyddLAotICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKSApCi0gICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfVEUnLCBbJ3RlL19URW1vZHVsZS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJ10pICkKKwogICAgICAgICAgICAgIyBBcyB0aGVyZSBpcyBubyBzdGFuZGFyZGl6ZWQgcGxhY2UgKHlldCkgdG8gcHV0CiAgICAgICAgICAgICAjIHVzZXItaW5zdGFsbGVkIE1hYyBsaWJyYXJpZXMgb24gT1NYLCB3ZSBzZWFyY2ggZm9yICJ3YXN0ZSIKICAgICAgICAgICAgICMgaW4gcGFyZW50IGRpcmVjdG9yaWVzIG9mIHRoZSBQeXRob24gc291cmNlIHRyZWUuIFlvdQpAQCAtOTkyLDcgKzEwNzksNiBAQAogICAgICAgICAgICAgd2FzdGVfbGlicyA9IGZpbmRfbGlicmFyeV9maWxlKHNlbGYuY29tcGlsZXIsICJXQVNURSIsIFtdLAogICAgICAgICAgICAgICAgICAgICBbIi4uLyIqbiArICJ3YXN0ZS9TdGF0aWMgTGlicmFyaWVzIiBmb3IgbiBpbiAoMCwxLDIsMyw0KV0pCiAgICAgICAgICAgICBpZiB3YXN0ZV9pbmNzICE9IE5vbmUgYW5kIHdhc3RlX2xpYnMgIT0gTm9uZToKLSAgICAgICAgICAgICAgICAoc3JjZGlyLCkgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCdzcmNkaXInKQogICAgICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ3dhc3RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dhc3RlL3dhc3RlbW9kdWxlLmMnXSArIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY2RpciwgZCkgZm9yIGQgaW4KQEAgLTEwMDUsOCArMTA5MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gWydXQVNURSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncyA9IFsnLWZyYW1ld29yaycsICdDYXJib24nXSwKICAgICAgICAgICAgICAgICApICkKLSAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19XaW4nLCBbJ3dpbi9fV2lubW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkgKQogCiAgICAgICAgIHNlbGYuZXh0ZW5zaW9ucy5leHRlbmQoZXh0cykKIApAQCAtMTE4Myw0NCArMTI2Nyw1NSBAQAogICAgICAgICAjICoqKiBVbmNvbW1lbnQgdGhlc2UgZm9yIFRPR0wgZXh0ZW5zaW9uIG9ubHk6CiAgICAgICAgICMgICAgICAgLWxHTCAtbEdMVSAtbFhleHQgLWxYbXUgXAogCi0gICAgZGVmIGRldGVjdF9jdHlwZXMoc2VsZik6Ci0gICAgICAgIChzcmNkaXIsKSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ3NyY2RpcicpCi0gICAgICAgIGZmaV9idWlsZGRpciA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICdsaWJmZmknKQotICAgICAgICBmZmlfc3JjZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzcmNkaXIsICdNb2R1bGVzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcycsICdsaWJmZmknKSkKLSAgICAgICAgZmZpX2NvbmZpZ2ZpbGUgPSBvcy5wYXRoLmpvaW4oZmZpX2J1aWxkZGlyLCAnZmZpY29uZmlnLnB5JykKKyAgICBkZWYgY29uZmlndXJlX2N0eXBlcyhzZWxmLCBleHQpOgorICAgICAgICBpZiBub3Qgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaToKKyAgICAgICAgICAgIChzcmNkaXIsKSA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoJ3NyY2RpcicpCisgICAgICAgICAgICBmZmlfYnVpbGRkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAnbGliZmZpJykKKyAgICAgICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNyY2RpciwgJ01vZHVsZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcycsICdsaWJmZmknKSkKKyAgICAgICAgICAgIGZmaV9jb25maWdmaWxlID0gb3MucGF0aC5qb2luKGZmaV9idWlsZGRpciwgJ2ZmaWNvbmZpZy5weScpCiAKLSAgICAgICAgaWYgc2VsZi5mb3JjZSBvciBub3Qgb3MucGF0aC5leGlzdHMoZmZpX2NvbmZpZ2ZpbGUpOgotICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IG1rcGF0aAotICAgICAgICAgICAgbWtwYXRoKGZmaV9idWlsZGRpcikKLSAgICAgICAgICAgIGNvbmZpZ19hcmdzID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuZm9yY2Ugb3Igbm90IG9zLnBhdGguZXhpc3RzKGZmaV9jb25maWdmaWxlKToKKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgbWtwYXRoCisgICAgICAgICAgICAgICAgbWtwYXRoKGZmaV9idWlsZGRpcikKKyAgICAgICAgICAgICAgICBjb25maWdfYXJncyA9IFtdCiAKLSAgICAgICAgICAgICMgUGFzcyBlbXB0eSBDRkxBR1MgYmVjYXVzZSB3ZSdsbCBqdXN0IGFwcGVuZCB0aGUgcmVzdWx0aW5nIENGTEFHUwotICAgICAgICAgICAgIyB0byBQeXRob24nczsgLWcgb3IgLU8yIGlzIHRvIGJlIGF2b2lkZWQuCi0gICAgICAgICAgICBjbWQgPSAiY2QgJXMgJiYgZW52IENGTEFHUz0nJyAnJXMvY29uZmlndXJlJyAlcyIgXAotICAgICAgICAgICAgICAgICAgJSAoZmZpX2J1aWxkZGlyLCBmZmlfc3JjZGlyLCAiICIuam9pbihjb25maWdfYXJncykpCisgICAgICAgICAgICAgICAgIyBQYXNzIGVtcHR5IENGTEFHUyBiZWNhdXNlIHdlJ2xsIGp1c3QgYXBwZW5kIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgICAgICAjIENGTEFHUyB0byBQeXRob24nczsgLWcgb3IgLU8yIGlzIHRvIGJlIGF2b2lkZWQuCisgICAgICAgICAgICAgICAgY21kID0gImNkICVzICYmIGVudiBDRkxBR1M9JycgJyVzL2NvbmZpZ3VyZScgJXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAlIChmZmlfYnVpbGRkaXIsIGZmaV9zcmNkaXIsICIgIi5qb2luKGNvbmZpZ19hcmdzKSkKIAotICAgICAgICAgICAgcmVzID0gb3Muc3lzdGVtKGNtZCkKLSAgICAgICAgICAgIGlmIHJlcyBvciBub3Qgb3MucGF0aC5leGlzdHMoZmZpX2NvbmZpZ2ZpbGUpOgotICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY29uZmlndXJlIF9jdHlwZXMgbW9kdWxlIgotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCisgICAgICAgICAgICAgICAgaWYgcmVzIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhmZmlfY29uZmlnZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gY29uZmlndXJlIF9jdHlwZXMgbW9kdWxlIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAotICAgICAgICBmZmljb25maWcgPSB7fQotICAgICAgICBleGVjZmlsZShmZmlfY29uZmlnZmlsZSwgZ2xvYmFscygpLCBmZmljb25maWcpCi0gICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmpvaW4oZmZpY29uZmlnWydmZmlfc3JjZGlyJ10sICdzcmMnKQorICAgICAgICAgICAgZmZpY29uZmlnID0ge30KKyAgICAgICAgICAgIGV4ZWNmaWxlKGZmaV9jb25maWdmaWxlLCBnbG9iYWxzKCksIGZmaWNvbmZpZykKKyAgICAgICAgICAgIGZmaV9zcmNkaXIgPSBvcy5wYXRoLmpvaW4oZmZpY29uZmlnWydmZmlfc3JjZGlyJ10sICdzcmMnKQogCi0gICAgICAgICMgQWRkIC5TIChwcmVwcm9jZXNzZWQgYXNzZW1ibHkpIHRvIEMgY29tcGlsZXIgc291cmNlIGV4dGVuc2lvbnMuCi0gICAgICAgIHNlbGYuY29tcGlsZXIuc3JjX2V4dGVuc2lvbnMuYXBwZW5kKCcuUycpCisgICAgICAgICAgICAjIEFkZCAuUyAocHJlcHJvY2Vzc2VkIGFzc2VtYmx5KSB0byBDIGNvbXBpbGVyIHNvdXJjZSBleHRlbnNpb25zLgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zcmNfZXh0ZW5zaW9ucy5hcHBlbmQoJy5TJykKIAotICAgICAgICBpbmNsdWRlX2RpcnMgPSBbb3MucGF0aC5qb2luKGZmaV9idWlsZGRpciwgJ2luY2x1ZGUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZmaV9idWlsZGRpciwgZmZpX3NyY2Rpcl0KLSAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gZmZpY29uZmlnWydmZmlfY2ZsYWdzJ10uc3BsaXQoKQorICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gW29zLnBhdGguam9pbihmZmlfYnVpbGRkaXIsICdpbmNsdWRlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX2J1aWxkZGlyLCBmZmlfc3JjZGlyXQorICAgICAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzID0gZmZpY29uZmlnWydmZmlfY2ZsYWdzJ10uc3BsaXQoKQorCisgICAgICAgICAgICBleHQuc291cmNlcy5leHRlbmQoZmZpY29uZmlnWydmZmlfc291cmNlcyddKQorICAgICAgICAgICAgZXh0LmluY2x1ZGVfZGlycy5leHRlbmQoaW5jbHVkZV9kaXJzKQorICAgICAgICAgICAgZXh0LmV4dHJhX2NvbXBpbGVfYXJncy5leHRlbmQoZXh0cmFfY29tcGlsZV9hcmdzKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRldGVjdF9jdHlwZXMoc2VsZiwgaW5jX2RpcnMsIGxpYl9kaXJzKToKKyAgICAgICAgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaSA9IEZhbHNlCisgICAgICAgIGluY2x1ZGVfZGlycyA9IFtdCisgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncyA9IFtdCiAgICAgICAgIHNvdXJjZXMgPSBbJ19jdHlwZXMvX2N0eXBlcy5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jYWxsYmFja3MuYycsCiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvY2FsbHByb2MuYycsCiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvc3RnZGljdC5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jZmllbGQuYycsCi0gICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYyddICsgZmZpY29uZmlnWydmZmlfc291cmNlcyddCisgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYyddCiAgICAgICAgIGRlcGVuZHMgPSBbJ19jdHlwZXMvY3R5cGVzLmgnXQogCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKQEAgLTEyMzIsMTIgKzEzMjcsNDAgQEAKICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCdfY3R5cGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9ZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1zb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcz1kZXBlbmRzKQogICAgICAgICBleHRfdGVzdCA9IEV4dGVuc2lvbignX2N0eXBlc190ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz1bJ19jdHlwZXMvX2N0eXBlc190ZXN0LmMnXSkKICAgICAgICAgc2VsZi5leHRlbnNpb25zLmV4dGVuZChbZXh0LCBleHRfdGVzdF0pCiAKKyAgICAgICAgaWYgbm90ICctLXdpdGgtc3lzdGVtLWZmaScgaW4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDT05GSUdfQVJHUyIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZmZpX2luYyA9IGZpbmRfZmlsZSgnZmZpLmgnLCBbXSwgaW5jX2RpcnMpCisgICAgICAgIGlmIGZmaV9pbmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmZmlfaCA9IGZmaV9pbmNbMF0gKyAnL2ZmaS5oJworICAgICAgICAgICAgZnAgPSBvcGVuKGZmaV9oKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBmZmlfaW5jID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnI2RlZmluZSBMSUJGRklfSCcpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBmZmlfbGliID0gTm9uZQorICAgICAgICBpZiBmZmlfaW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGxpYl9uYW1lIGluICgnZmZpX2NvbnZlbmllbmNlJywgJ2ZmaV9waWMnLCAnZmZpJyk6CisgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIGxpYl9uYW1lKSk6CisgICAgICAgICAgICAgICAgICAgIGZmaV9saWIgPSBsaWJfbmFtZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIGZmaV9pbmMgYW5kIGZmaV9saWI6CisgICAgICAgICAgICBleHQuaW5jbHVkZV9kaXJzLmV4dGVuZChmZmlfaW5jKQorICAgICAgICAgICAgZXh0LmxpYnJhcmllcy5hcHBlbmQoZmZpX2xpYikKKyAgICAgICAgICAgIHNlbGYudXNlX3N5c3RlbV9saWJmZmkgPSBUcnVlCisKKwogY2xhc3MgUHlCdWlsZEluc3RhbGwoaW5zdGFsbCk6CiAgICAgIyBTdXBwcmVzcyB0aGUgd2FybmluZyBhYm91dCBpbnN0YWxsYXRpb24gaW50byB0aGUgbGliX2R5bmxvYWQKICAgICAjIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IGluIHN5cy5wYXRoIHdoZW4gcnVubmluZyBQeXRob24gZHVyaW5nCg==