PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5CLiBDb2RlIGZvciBLZXl3b3JkIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNTAuMCI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InByZXZpb3VzIiBocmVmPSJhcGEuaHRtbCIgdGl0bGU9IkEuIFNhbXBsZSBEb2N1bWVudCI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJhcGMuaHRtbCIgdGl0bGU9IkMuIENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGUiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPkIuIENvZGUgZm9yIEtleXdvcmQgRXhhbXBsZTwvdGg+PC90cj48dHI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJsZWZ0Ij48YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImFwYS5odG1sIj5QcmV2PC9hPqA8L3RkPjx0aCB3aWR0aD0iNjAlIiBhbGlnbj0iY2VudGVyIj6gPC90aD48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJhcGMuaHRtbCI+TmV4dDwvYT48L3RkPjwvdHI+PC90YWJsZT48aHI+PC9kaXY+PGRpdiBjbGFzcz0iYXBwZW5kaXgiPjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0ia2V5d29yZGFwcGVuZGl4Ij48L2E+Qi4gQ29kZSBmb3IgS2V5d29yZCBFeGFtcGxlPC9oMj48cD4KICAgICAgPHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgojaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwveG1sbWVtb3J5LmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwvcGFyc2VyLmgmZ3Q7Cgp2b2lkCnBhcnNlU3RvcnkgKHhtbERvY1B0ciBkb2MsIHhtbE5vZGVQdHIgY3VyKSB7CgoJeG1sQ2hhciAqa2V5OwoJY3VyID0gY3VyLSZndDt4bWxDaGlsZHJlbk5vZGU7Cgl3aGlsZSAoY3VyICE9IE5VTEwpIHsKCSAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSZxdW90O2tleXdvcmQmcXVvdDspKSkgewoJCSAgICBrZXkgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGN1ci0mZ3Q7eG1sQ2hpbGRyZW5Ob2RlLCAxKTsKCQkgICAgcHJpbnRmKCZxdW90O2tleXdvcmQ6ICVzXG4mcXVvdDssIGtleSk7CgkJICAgIHhtbEZyZWUoa2V5KTsKIAkgICAgfQoJY3VyID0gY3VyLSZndDtuZXh0OwoJfQogICAgcmV0dXJuOwp9CgpzdGF0aWMgdm9pZApwYXJzZURvYyhjaGFyICpkb2NuYW1lKSB7CgoJeG1sRG9jUHRyIGRvYzsKCXhtbE5vZGVQdHIgY3VyOwoKCWRvYyA9IHhtbFBhcnNlRmlsZShkb2NuYW1lKTsKCQoJaWYgKGRvYyA9PSBOVUxMICkgewoJCWZwcmludGYoc3RkZXJyLCZxdW90O0RvY3VtZW50IG5vdCBwYXJzZWQgc3VjY2Vzc2Z1bGx5LiBcbiZxdW90Oyk7CgkJcmV0dXJuOwoJfQoJCgljdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwoJCglpZiAoY3VyID09IE5VTEwpIHsKCQlmcHJpbnRmKHN0ZGVyciwmcXVvdDtlbXB0eSBkb2N1bWVudFxuJnF1b3Q7KTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuOwoJfQoJCglpZiAoeG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgJnF1b3Q7c3RvcnkmcXVvdDspKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7ZG9jdW1lbnQgb2YgdGhlIHdyb25nIHR5cGUsIHJvb3Qgbm9kZSAhPSBzdG9yeSZxdW90Oyk7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldHVybjsKCX0KCQoJY3VyID0gY3VyLSZndDt4bWxDaGlsZHJlbk5vZGU7Cgl3aGlsZSAoY3VyICE9IE5VTEwpIHsKCQlpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSZxdW90O3N0b3J5aW5mbyZxdW90OykpKXsKCQkJcGFyc2VTdG9yeSAoZG9jLCBjdXIpOwoJCX0KCQkgCgljdXIgPSBjdXItJmd0O25leHQ7Cgl9CgkKCXhtbEZyZWVEb2MoZG9jKTsKCXJldHVybjsKfQoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CgoJY2hhciAqZG9jbmFtZTsKCQkKCWlmIChhcmdjICZsdDs9IDEpIHsKCQlwcmludGYoJnF1b3Q7VXNhZ2U6ICVzIGRvY25hbWVcbiZxdW90OywgYXJndlswXSk7CgkJcmV0dXJuKDApOwoJfQoKCWRvY25hbWUgPSBhcmd2WzFdOwoJcGFyc2VEb2MgKGRvY25hbWUpOwoKCXJldHVybiAoMSk7Cn0KCjwvcHJlPgogICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5hdmZvb3RlciI+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXBhLmh0bWwiPlByZXY8L2E+oDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iaW5kZXguaHRtbCI+VXA8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJhcGMuaHRtbCI+TmV4dDwvYT48L3RkPjwvdHI+PHRyPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPkEuIFNhbXBsZSBEb2N1bWVudKA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCI+oEMuIENvZGUgZm9yIEFkZCBLZXl3b3JkIEV4YW1wbGU8L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2JvZHk+PC9odG1sPgo=