PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PHRpdGxlPlJldHJpZXZpbmcgRWxlbWVudCBDb250ZW50PC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjYxLjIiPjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJ1cCIgaHJlZj0iaW5kZXguaHRtbCIgdGl0bGU9IkxpYnhtbCBUdXRvcmlhbCI+PGxpbmsgcmVsPSJwcmV2aW91cyIgaHJlZj0iYXIwMXMwMy5odG1sIiB0aXRsZT0iUGFyc2luZyB0aGUgZmlsZSI+PGxpbmsgcmVsPSJuZXh0IiBocmVmPSJhcjAxczA1Lmh0bWwiIHRpdGxlPSJVc2luZyBYUGF0aCB0byBSZXRyaWV2ZSBFbGVtZW50IENvbnRlbnQiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPlJldHJpZXZpbmcgRWxlbWVudCBDb250ZW50PC90aD48L3RyPjx0cj48dGQgd2lkdGg9IjIwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXIwMXMwMy5odG1sIj5QcmV2PC9hPqA8L3RkPjx0aCB3aWR0aD0iNjAlIiBhbGlnbj0iY2VudGVyIj6gPC90aD48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJhcjAxczA1Lmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9InNlY3QxIiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJ4bWx0dXRvcmlhbGdldHRleHQiPjwvYT5SZXRyaWV2aW5nIEVsZW1lbnQgQ29udGVudDwvaDI+PC9kaXY+PC9kaXY+PGRpdj48L2Rpdj48L2Rpdj48cD48YSBjbGFzcz0iaW5kZXh0ZXJtIiBuYW1lPSJpZDI1MjU0MzkiPjwvYT4KUmV0cmlldmluZyB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50IGludm9sdmVzIHRyYXZlcnNpbmcgdGhlIGRvY3VtZW50CiAgICB0cmVlIHVudGlsIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvci4gSW4gdGhpcyBjYXNlLCB3ZSBhcmUgbG9va2luZwogICAgZm9yIGFuIGVsZW1lbnQgY2FsbGVkICJrZXl3b3JkIiBjb250YWluZWQgd2l0aGluIGVsZW1lbnQgY2FsbGVkICJzdG9yeSIuIFRoZQogICAgcHJvY2VzcyB0byBmaW5kIHRoZSBub2RlIHdlIGFyZSBpbnRlcmVzdGVkIGluIGludm9sdmVzIHRlZGlvdXNseSB3YWxraW5nIHRoZQogICAgdHJlZS4gV2UgYXNzdW1lIHlvdSBhbHJlYWR5IGhhdmUgYW4geG1sRG9jUHRyIGNhbGxlZCA8dHQgY2xhc3M9InZhcm5hbWUiPmRvYzwvdHQ+CiAgICBhbmQgYW4geG1sTm9kUHRyIGNhbGxlZCA8dHQgY2xhc3M9InZhcm5hbWUiPmN1cjwvdHQ+LjwvcD48cD4KICAgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4KCTxhIG5hbWU9ImdldGNoaWxkbm9kZSI+PC9hPjxpbWcgc3JjPSJpbWFnZXMvY2FsbG91dHMvMS5wbmciIGFsdD0iMSIgYm9yZGVyPSIwIj5jdXIgPSBjdXItJmd0O3htbENoaWxkcmVuTm9kZTsKCTxhIG5hbWU9Imh1bnRzdG9yeWluZm8iPjwvYT48aW1nIHNyYz0iaW1hZ2VzL2NhbGxvdXRzLzIucG5nIiBhbHQ9IjIiIGJvcmRlcj0iMCI+d2hpbGUgKGN1ciAhPSBOVUxMKSB7CgkJaWYgKCgheG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikic3RvcnlpbmZvIikpKXsKCQkJcGFyc2VTdG9yeSAoZG9jLCBjdXIpOwoJCX0KCQkgCgljdXIgPSBjdXItJmd0O25leHQ7Cgl9CiAgICAgIDwvcHJlPjxwPgoKICAgICAgPC9wPjxkaXYgY2xhc3M9ImNhbGxvdXRsaXN0Ij48dGFibGUgYm9yZGVyPSIwIiBzdW1tYXJ5PSJDYWxsb3V0IGxpc3QiPjx0cj48dGQgd2lkdGg9IjUlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxhIGhyZWY9IiNnZXRjaGlsZG5vZGUiPjxpbWcgc3JjPSJpbWFnZXMvY2FsbG91dHMvMS5wbmciIGFsdD0iMSIgYm9yZGVyPSIwIj48L2E+IDwvdGQ+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+PHA+R2V0IHRoZSBmaXJzdCBjaGlsZCBub2RlIG9mIDx0dCBjbGFzcz0idmFybmFtZSI+Y3VyPC90dD4uIEF0IHRoaXMKCSAgICBwb2ludCwgPHR0IGNsYXNzPSJ2YXJuYW1lIj5jdXI8L3R0PiBwb2ludHMgYXQgdGhlIGRvY3VtZW50IHJvb3QsIHdoaWNoIGlzCgkgICAgdGhlIGVsZW1lbnQgInN0b3J5Ii48L3A+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjUlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxhIGhyZWY9IiNodW50c3RvcnlpbmZvIj48aW1nIHNyYz0iaW1hZ2VzL2NhbGxvdXRzLzIucG5nIiBhbHQ9IjIiIGJvcmRlcj0iMCI+PC9hPiA8L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxwPlRoaXMgbG9vcCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBjaGlsZHJlbiBvZgoJICAic3RvcnkiLCBsb29raW5nIGZvciBvbmUgY2FsbGVkICJzdG9yeWluZm8iLiBUaGF0CgkgIGlzIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBjb250YWluIHRoZSAia2V5d29yZHMiIHdlIGFyZQoJICAgIGxvb2tpbmcgZm9yLiBJdCB1c2VzIHRoZSA8c3BhbiBjbGFzcz0iYXBwbGljYXRpb24iPmxpYnhtbDwvc3Bhbj4gc3RyaW5nCgkgIGNvbXBhcmlzb24KCSAgICBmdW5jdGlvbiwgPHR0IGNsYXNzPSJmdW5jdGlvbiI+PGEgaHJlZj0iaHR0cDovL3htbHNvZnQub3JnL2h0bWwvbGlieG1sLXBhcnNlci5odG1sI1hNTFNUUkNNUCIgdGFyZ2V0PSJfdG9wIj54bWxTdHJjbXA8L2E+PC90dD4uIElmIHRoZXJlIGlzIGEgbWF0Y2gsIGl0IGNhbGxzIHRoZSBmdW5jdGlvbiA8dHQgY2xhc3M9ImZ1bmN0aW9uIj5wYXJzZVN0b3J5PC90dD4uPC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwPgogICAgPC9wPjxwPgogICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgp2b2lkCnBhcnNlU3RvcnkgKHhtbERvY1B0ciBkb2MsIHhtbE5vZGVQdHIgY3VyKSB7CgoJeG1sQ2hhciAqa2V5OwoJPGEgbmFtZT0iYW5vdGhlcmdldGNoaWxkIj48L2E+PGltZyBzcmM9ImltYWdlcy9jYWxsb3V0cy8xLnBuZyIgYWx0PSIxIiBib3JkZXI9IjAiPiBjdXIgPSBjdXItJmd0O3htbENoaWxkcmVuTm9kZTsKCTxhIG5hbWU9ImZpbmRrZXl3b3JkIj48L2E+PGltZyBzcmM9ImltYWdlcy9jYWxsb3V0cy8yLnBuZyIgYWx0PSIyIiBib3JkZXI9IjAiPiB3aGlsZSAoY3VyICE9IE5VTEwpIHsKCSAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLSZndDtuYW1lLCAoY29uc3QgeG1sQ2hhciAqKSJrZXl3b3JkIikpKSB7Cgk8YSBuYW1lPSJmb3VuZGtleXdvcmQiPjwvYT48aW1nIHNyYz0iaW1hZ2VzL2NhbGxvdXRzLzMucG5nIiBhbHQ9IjMiIGJvcmRlcj0iMCI+CSAgICBrZXkgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGN1ci0mZ3Q7eG1sQ2hpbGRyZW5Ob2RlLCAxKTsKCQkgICAgcHJpbnRmKCJrZXl3b3JkOiAlc1xuIiwga2V5KTsKCQkgICAgeG1sRnJlZShrZXkpOwogCSAgICB9CgljdXIgPSBjdXItJmd0O25leHQ7Cgl9CiAgICByZXR1cm47Cn0KICAgICAgPC9wcmU+PHA+CiAgICAgIDwvcD48ZGl2IGNsYXNzPSJjYWxsb3V0bGlzdCI+PHRhYmxlIGJvcmRlcj0iMCIgc3VtbWFyeT0iQ2FsbG91dCBsaXN0Ij48dHI+PHRkIHdpZHRoPSI1JSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij48YSBocmVmPSIjYW5vdGhlcmdldGNoaWxkIj48aW1nIHNyYz0iaW1hZ2VzL2NhbGxvdXRzLzEucG5nIiBhbHQ9IjEiIGJvcmRlcj0iMCI+PC9hPiA8L3RkPjx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxwPkFnYWluIHdlIGdldCB0aGUgZmlyc3QgY2hpbGQgbm9kZS48L3A+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjUlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxhIGhyZWY9IiNmaW5ka2V5d29yZCI+PGltZyBzcmM9ImltYWdlcy9jYWxsb3V0cy8yLnBuZyIgYWx0PSIyIiBib3JkZXI9IjAiPjwvYT4gPC90ZD48dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij48cD5MaWtlIHRoZSBsb29wIGFib3ZlLCB3ZSB0aGVuIGl0ZXJhdGUgdGhyb3VnaCB0aGUgbm9kZXMsIGxvb2tpbmcKCSAgZm9yIG9uZSB0aGF0IG1hdGNoZXMgdGhlIGVsZW1lbnQgd2UncmUgaW50ZXJlc3RlZCBpbiwgaW4gdGhpcyBjYXNlCgkgICJrZXl3b3JkIi48L3A+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjUlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPjxhIGhyZWY9IiNmb3VuZGtleXdvcmQiPjxpbWcgc3JjPSJpbWFnZXMvY2FsbG91dHMvMy5wbmciIGFsdD0iMyIgYm9yZGVyPSIwIj48L2E+IDwvdGQ+PHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+PHA+V2hlbiB3ZSBmaW5kIHRoZSAia2V5d29yZCIgZWxlbWVudCwgd2UgbmVlZCB0byBwcmludAoJICAgIGl0cyBjb250ZW50cy4gUmVtZW1iZXIgdGhhdCBpbiA8c3BhbiBjbGFzcz0iYWNyb255bSI+WE1MPC9zcGFuPiwgdGhlIHRleHQKCSAgICBjb250YWluZWQgd2l0aGluIGFuIGVsZW1lbnQgaXMgYSBjaGlsZCBub2RlIG9mIHRoYXQgZWxlbWVudCwgc28gd2UKCSAgICB0dXJuIHRvIDx0dCBjbGFzcz0idmFybmFtZSI+Y3VyLSZndDt4bWxDaGlsZHJlbk5vZGU8L3R0Pi4gVG8gcmV0cmlldmUgaXQsIHdlCgkgICAgdXNlIHRoZSBmdW5jdGlvbiA8dHQgY2xhc3M9ImZ1bmN0aW9uIj48YSBocmVmPSJodHRwOi8veG1sc29mdC5vcmcvaHRtbC9saWJ4bWwtdHJlZS5odG1sI1hNTE5PREVMSVNUR0VUU1RSSU5HIiB0YXJnZXQ9Il90b3AiPnhtbE5vZGVMaXN0R2V0U3RyaW5nPC9hPjwvdHQ+LCB3aGljaCBhbHNvIHRha2VzIHRoZSA8dHQgY2xhc3M9InZhcm5hbWUiPmRvYzwvdHQ+IHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuIEluIHRoaXMgY2FzZSwgd2UganVzdCBwcmludCBpdCBvdXQuPC9wPjxkaXYgY2xhc3M9Im5vdGUiIHN0eWxlPSJtYXJnaW4tbGVmdDogMC41aW47IG1hcmdpbi1yaWdodDogMC41aW47Ij48dGFibGUgYm9yZGVyPSIwIiBzdW1tYXJ5PSJOb3RlIj48dHI+PHRkIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUiPjxpbWcgYWx0PSJbTm90ZV0iIHNyYz0iaW1hZ2VzL25vdGUucG5nIj48L3RkPjx0aCBhbGlnbj0ibGVmdCI+Tm90ZTwvdGg+PC90cj48dHI+PHRkIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+QmVjYXVzZSA8dHQgY2xhc3M9ImZ1bmN0aW9uIj54bWxOb2RlTGlzdEdldFN0cmluZzwvdHQ+IGFsbG9jYXRlcwoJICAgICAgbWVtb3J5IGZvciB0aGUgc3RyaW5nIGl0IHJldHVybnMsIHlvdSBtdXN0IHVzZQoJICAgICAgPHR0IGNsYXNzPSJmdW5jdGlvbiI+eG1sRnJlZTwvdHQ+IHRvIGZyZWUgaXQuPC9wPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjxwPgogICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5hdmZvb3RlciI+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXIwMXMwMy5odG1sIj5QcmV2PC9hPqA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9InUiIGhyZWY9ImluZGV4Lmh0bWwiPlVwPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCI+oDxhIGFjY2Vzc2tleT0ibiIgaHJlZj0iYXIwMXMwNS5odG1sIj5OZXh0PC9hPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+UGFyc2luZyB0aGUgZmlsZaA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCI+oFVzaW5nIFhQYXRoIHRvIFJldHJpZXZlIEVsZW1lbnQgQ29udGVudDwvdGQ+PC90cj48L3RhYmxlPjwvZGl2PjwvYm9keT48L2h0bWw+Cg==