PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPk1hbnVhbGx5IHJlZ2lzdGVyZWQgdGVzdCBzdWl0ZXM8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uL3N0eWxlL3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgo8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiPgo8bGluayByZWw9ImhvbWUiIGhyZWY9Ii4uLy4uLy4uL2luZGV4Lmh0bWwiIHRpdGxlPSJCb29zdCBUZXN0IExpYnJhcnkiPgo8bGluayByZWw9InVwIiBocmVmPSJ0ZXN0LXN1aXRlLmh0bWwiIHRpdGxlPSJUZXN0IHN1aXRlIj4KPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJ0ZXN0LXN1aXRlLmh0bWwiIHRpdGxlPSJUZXN0IHN1aXRlIj4KPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJhdXRvLXRlc3Qtc3VpdGUuaHRtbCIgdGl0bGU9IlRlc3Qgc3VpdGVzIHdpdGggYXV0b21hdGVkIHJlZ2lzdHJhdGlvbiI+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQxLjIiIHNyYz0iLi4vLi4vLi4vLi4vanMvYm9vc3QtdGVzdC5qcyI+PC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgo8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj4KPHRkIHdpZHRoPSIxMCUiPjxhIGhyZWY9Ii4uLy4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgYWx0PSJIb21lIiB3aWR0aD0iMjI5IiBoZWlnaHQ9IjYxIiBib3JkZXI9IjAiIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZXN0L2RvY2Jvb2svaW1nL2Jvb3N0LnRlc3QubG9nby5wbmciPjwvYT48L3RkPgo8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0Ij4gJmd0OyA8YSBocmVmPSIuLi8uLi8uLi91dGYuaHRtbCI+VGhlIFVuaXQgVGVzdCBGcmFtZXdvcms8L2E+ICZndDsgPGEgaHJlZj0iLi4vLi4vdXNlci1ndWlkZS5odG1sIj5Vc2VyJ3MgZ3VpZGU8L2E+PGEgaHJlZj0iLi4vLi4vdGVzdGluZy10b29scy5odG1sIj4KICAgICAgJmd0OwogICAgICA8L2E+PGEgaHJlZj0iLi4vdGVzdC1vcmdhbml6YXRpb24uaHRtbCI+VGVzdCBvcmdhbml6YXRpb248L2E+PGEgaHJlZj0iLi4vZml4dHVyZS5odG1sIj4KICAgICAgJmd0OwogICAgICA8L2E+PGEgaHJlZj0idGVzdC1zdWl0ZS5odG1sIj5UZXN0IHN1aXRlPC9hPjxhIGhyZWY9ImV4cGVjdGVkLWZhaWx1cmVzLmh0bWwiPgogICAgICAmZ3Q7CiAgICAgIDwvYT48Yj5NYW51YWwgcmVnaXN0cmF0aW9uPC9iPgo8L3RkPgo8dGQ+PGRpdiBjbGFzcz0ic3Bpcml0LW5hdiI+CjxhIGhyZWY9InRlc3Qtc3VpdGUuaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9wcmV2LnBuZyIgYWx0PSJQcmV2Ij48L2E+PGEgaHJlZj0iYXV0by10ZXN0LXN1aXRlLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvbmV4dC5wbmciIGFsdD0iTmV4dCI+PC9hPgo8L2Rpdj48L3RkPgo8L3RyPjwvdGFibGU+Cjxocj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPgo8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDYgY2xhc3M9InRpdGxlIj4KPGEgbmFtZT0idXRmLnVzZXItZ3VpZGUudGVzdC1vcmdhbml6YXRpb24ubWFudWFsLXRlc3Qtc3VpdGUiPjwvYT5NYW51YWxseSByZWdpc3RlcmVkIHRlc3Qgc3VpdGVzPC9oNj48L2Rpdj48L2Rpdj48L2Rpdj4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICAgVG8gY3JlYXRlIGEgdGVzdCBzdWl0ZSBtYW51YWxseSwgZW1wbG95IHRoZSBtYWNybyBCT09TVF9URVNUX1NVSVRFOgogICA8L3A+CjxwcmUgY2xhc3M9ImlubGluZS1zeW5vcHNpcyI+CjxhIG5hbWU9IkJPT1NUX1RFU1RfU1VJVEUiPjwvYT5CT09TVF9URVNUX1NVSVRFKDxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPnRlc3Rfc3VpdGVfbmFtZTwvZW0+PC9zcGFuPik8L3ByZT4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICAgQk9PU1RfVEVTVF9TVUlURSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKICAgIGNvbnN0cnVjdGVkIGluc3RhbmNlLiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGNsYXNzIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUgeW91cnNlbGYuCiAgIDwvcD4KPGRpdiBjbGFzcz0ibm90ZSI+PHRhYmxlIGJvcmRlcj0iMCIgc3VtbWFyeT0iTm90ZSI+Cjx0cj4KPHRkIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMjUiPjxpbWcgYWx0PSJbTm90ZV0iIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25vdGUucG5nIj48L3RkPgo8dGggYWxpZ249ImxlZnQiPk5vdGU8L3RoPgo8L3RyPgo8dHI+PHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+PHA+CiAgICAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSBpbnN0YW5jZXMgaGF2ZSB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYW5kIHRoZSBjb21waWxlciB3b24ndCBhbGxvdyB5b3UKICAgICB0byBjcmVhdGUgb25lIG9uIHRoZSBzdGFjay4KICAgIDwvcD48L3RkPjwvdHI+CjwvdGFibGU+PC9kaXY+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIE5ld2x5IGNyZWF0ZWQgdGVzdCBzdWl0ZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCBpbiBhIHBhcmVudCBvbmUgdXNpbmcgYWRkIGludGVyZmFjZS4gQm90aCB0ZXN0IHN1aXRlIGNyZWF0aW9uIGFuZAogICAgcmVnaXN0cmF0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgdGVzdCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgIDwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZSI+CjxhIG5hbWU9InV0Zi51c2VyLWd1aWRlLnRlc3Qtb3JnYW5pemF0aW9uLm1hbnVhbC10ZXN0LXN1aXRlLmV4YW1wbGUxMSI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RXhhbXBsZaAxNS6gTWFudWFsbHkgcmVnaXN0ZXJlZCB0ZXN0IHN1aXRlczwvYj48L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvaW5jbHVkZWQvdW5pdF90ZXN0LmhwcCZndDsKdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q7CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vLwoKdm9pZCB0ZXN0X2Nhc2UxKCkgeyAvKiA6ICovIH0Kdm9pZCB0ZXN0X2Nhc2UyKCkgeyAvKiA6ICovIH0Kdm9pZCB0ZXN0X2Nhc2UzKCkgeyAvKiA6ICovIH0Kdm9pZCB0ZXN0X2Nhc2U0KCkgeyAvKiA6ICovIH0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgp0ZXN0X3N1aXRlKgppbml0X3VuaXRfdGVzdF9zdWl0ZSggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApCnsKICAgIHRlc3Rfc3VpdGUqIHRzMSA9IEJPT1NUX1RFU1RfU1VJVEUoICJ0ZXN0X3N1aXRlMSIgKTsKICAgIHRzMS0mZ3Q7YWRkKCBCT09TVF9URVNUX0NBU0UoICZhbXA7dGVzdF9jYXNlMSApICk7CiAgICB0czEtJmd0O2FkZCggQk9PU1RfVEVTVF9DQVNFKCAmYW1wO3Rlc3RfY2FzZTIgKSApOwoKICAgIHRlc3Rfc3VpdGUqIHRzMiA9IEJPT1NUX1RFU1RfU1VJVEUoICJ0ZXN0X3N1aXRlMiIgKTsKICAgIHRzMi0mZ3Q7YWRkKCBCT09TVF9URVNUX0NBU0UoICZhbXA7dGVzdF9jYXNlMyApICk7CiAgICB0czItJmd0O2FkZCggQk9PU1RfVEVTVF9DQVNFKCAmYW1wO3Rlc3RfY2FzZTQgKSApOwoKICAgIGZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5hZGQoIHRzMSApOwogICAgZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFkZCggdHMyICk7CgogICAgcmV0dXJuIDA7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCjwvcHJlPgo8dGFibGUgY2xhc3M9InNpbXBsZWxpc3QiIGJvcmRlcj0iMCIgc3VtbWFyeT0iU2ltcGxlIGxpc3QiPjx0cj4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIuLi8uLi8uLi8uLi9zcmMvZXhhbXBsZXMvZXhhbXBsZTExLmNwcCIgdGFyZ2V0PSJfdG9wIj5Tb3VyY2UgY29kZTwvYT48L2NvZGU+PC90ZD4KPHRkPiB8IDwvdGQ+Cjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PGEgaHJlZj0iIyIgdGFyZ2V0PSJfdG9wIiBpZD0iaWQ2NTExMDEiIG9uY2xpY2s9InRvZ2dsZV9lbGVtZW50KCAnZXhhbXBsZTExLW91dHB1dCcsICdpZDY1MTEwMScsICdTaG93IG91dHB1dCcsICdIaWRlIG91dHB1dCcgKTsgcmV0dXJuIGZhbHNlOyI+U2hvdyBvdXRwdXQ8L2E+PC9jb2RlPjwvdGQ+CjwvdHI+PC90YWJsZT4KPHByZSBjbGFzcz0iZXhhbXBsZS1vdXRwdXQiIGlkPSJleGFtcGxlMTEtb3V0cHV0Ij4mZ3Q7IGV4YW1wbGUgLS1sb2dfbGV2ZWw9dGVzdF9zdWl0ZQpSdW5uaW5nIDQgdGVzdCBjYXNlcy4uLgpFbnRlcmluZyB0ZXN0IHN1aXRlICJNYXN0ZXIgVGVzdCBTdWl0ZSIKRW50ZXJpbmcgdGVzdCBzdWl0ZSAidGVzdF9zdWl0ZTEiCkVudGVyaW5nIHRlc3QgY2FzZSAidGVzdF9jYXNlMSIKTGVhdmluZyB0ZXN0IGNhc2UgInRlc3RfY2FzZTEiCkVudGVyaW5nIHRlc3QgY2FzZSAidGVzdF9jYXNlMiIKTGVhdmluZyB0ZXN0IGNhc2UgInRlc3RfY2FzZTIiCkxlYXZpbmcgdGVzdCBzdWl0ZSAidGVzdF9zdWl0ZTEiCkVudGVyaW5nIHRlc3Qgc3VpdGUgInRlc3Rfc3VpdGUyIgpFbnRlcmluZyB0ZXN0IGNhc2UgInRlc3RfY2FzZTMiCkxlYXZpbmcgdGVzdCBjYXNlICJ0ZXN0X2Nhc2UzIgpFbnRlcmluZyB0ZXN0IGNhc2UgInRlc3RfY2FzZTQiCkxlYXZpbmcgdGVzdCBjYXNlICJ0ZXN0X2Nhc2U0IgpMZWF2aW5nIHRlc3Qgc3VpdGUgInRlc3Rfc3VpdGUyIgpMZWF2aW5nIHRlc3Qgc3VpdGUgIk1hc3RlciBUZXN0IFN1aXRlIgoKKioqIE5vIGVycm9ycyBkZXRlY3RlZAo8L3ByZT4KPC9kaXY+CjwvZGl2Pgo8YnIgY2xhc3M9ImV4YW1wbGUtYnJlYWsiPjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgdGVzdCB0cmVlLCB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6CiAgIDwvcD4KPGRpdiBjbGFzcz0ibWVkaWFvYmplY3QiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi9pbWcvY2xhc3MtaGllci5qcGciPjwvZGl2Pgo8L2Rpdj4KPHRhYmxlIHhtbG5zOnJldj0iaHR0cDovL3d3dy5jcy5ycGkuZWR1L35ncmVnb2QvYm9vc3QvdG9vbHMvZG9jL3JldmlzaW9uIiB3aWR0aD0iMTAwJSI+PHRyPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0icmlnaHQiPjxkaXYgY2xhc3M9ImNvcHlyaWdodC1mb290ZXIiPkNvcHlyaWdodCCpIDIwMDEtMjAwNyBHZW5uYWRpeSBSb3plbnRhbDwvZGl2PjwvdGQ+CjwvdHI+PC90YWJsZT4KPGhyPgo8ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgYWNjZXNza2V5PSJwIiBocmVmPSJ0ZXN0LXN1aXRlLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0idGVzdC1zdWl0ZS5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL3VwLnBuZyIgYWx0PSJVcCI+PC9hPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iLi4vLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9ob21lLnBuZyIgYWx0PSJIb21lIj48L2E+PGEgYWNjZXNza2V5PSJuIiBocmVmPSJhdXRvLXRlc3Qtc3VpdGUuaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9uZXh0LnBuZyIgYWx0PSJOZXh0Ij48L2E+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K