PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPkludHJvZHVjdGlvbiBpbnRvIHRlc3Rpbmcgb3Igd2h5IHRlc3RpbmcgaXMgd29ydGggdGhlIGVmZm9ydDwvdGl0bGU+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vc3R5bGUvc3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+CjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzQuMCI+CjxsaW5rIHJlbD0iaG9tZSIgaHJlZj0iLi4vaW5kZXguaHRtbCIgdGl0bGU9IkJvb3N0IFRlc3QgTGlicmFyeSI+CjxsaW5rIHJlbD0idXAiIGhyZWY9Ii4uL3V0Zi90dXRvcmlhbHMuaHRtbCIgdGl0bGU9IlRoZSB1bml0IHRlc3QgZnJhbWV3b3JrIHR1dG9yaWFscyI+CjxsaW5rIHJlbD0icHJldiIgaHJlZj0iLi4vdXRmL3R1dG9yaWFscy5odG1sIiB0aXRsZT0iVGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsgdHV0b3JpYWxzIj4KPGxpbmsgcmVsPSJuZXh0IiBocmVmPSJoZWxsby10aGUtdGVzdGluZy13b3JsZC5odG1sIiB0aXRsZT0iSGVsbG8gdGhlIHRlc3Rpbmcgd29ybGQgb3IgYmVnaW5uZXIncyBpbnRyb2R1Y3Rpb24gaW50byB0ZXN0aW5nIHVzaW5nIHRoZSBVbml0IFRlc3QgRnJhbWV3b3JrIj4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdDEuMiIgc3JjPSIuLi8uLi9qcy9ib29zdC10ZXN0LmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+Cjx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyPgo8dGQgd2lkdGg9IjEwJSI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBhbHQ9IkhvbWUiIHdpZHRoPSIyMjkiIGhlaWdodD0iNjEiIGJvcmRlcj0iMCIgc3JjPSIuLi8uLi8uLi8uLi8uLi9saWJzL3Rlc3QvZG9jYm9vay9pbWcvYm9vc3QudGVzdC5sb2dvLnBuZyI+PC9hPjwvdGQ+Cjx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiPiAmZ3Q7IDxhIGhyZWY9Ii4uL3V0Zi5odG1sIj5UaGUgVW5pdCBUZXN0IEZyYW1ld29yazwvYT4gJmd0OyA8YSBocmVmPSIuLi91dGYvdHV0b3JpYWxzLmh0bWwiPlR1dG9yaWFsczwvYT48YSBocmVmPSIuLi91dGYvY29tcGlsYXRpb24uaHRtbCI+CiAgICAgICZndDsKICAgICAgPC9hPjxiPkludHJvZHVjdGlvbiBpbnRvIHRlc3Rpbmc8L2I+CjwvdGQ+Cjx0ZD48ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgaHJlZj0iLi4vdXRmL3R1dG9yaWFscy5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL3ByZXYucG5nIiBhbHQ9IlByZXYiPjwvYT48YSBocmVmPSJoZWxsby10aGUtdGVzdGluZy13b3JsZC5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25leHQucG5nIiBhbHQ9Ik5leHQiPjwvYT4KPC9kaXY+PC90ZD4KPC90cj48L3RhYmxlPgo8aHI+CjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj4KPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2Pgo8ZGl2PjxoNCBjbGFzcz0idGl0bGUiPgo8YSBuYW1lPSJ0dXRvcmlhbC5pbnRyby1pbi10ZXN0aW5nIj48L2E+SW50cm9kdWN0aW9uIGludG8gdGVzdGluZyAgb3Igd2h5IHRlc3RpbmcgaXMgd29ydGggdGhlIGVmZm9ydDwvaDQ+PC9kaXY+CjxkaXY+PGRpdiBjbGFzcz0iYXV0aG9yIj4KPGgzIGNsYXNzPSJhdXRob3IiPgo8c3BhbiBjbGFzcz0iZmlyc3RuYW1lIj5Kb2huPC9zcGFuPiA8c3BhbiBjbGFzcz0ib3RoZXJuYW1lIj5SPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3VybmFtZSI+UGhpbGxpcHM8L3NwYW4+CjwvaDM+Cjxjb2RlIGNsYXNzPSJlbWFpbCI+Jmx0OzxhIGNsYXNzPSJlbWFpbCIgaHJlZj0ibWFpbHRvOmpwaGlsbGlwJTIwYXQlMjBjYXBpdGFsJTIwZG90JTIwZWR1JTIwKHBsZWFzZSUyMHVub2JzY3VyZSkiPmpwaGlsbGlwIGF0IGNhcGl0YWwgZG90IGVkdSAocGxlYXNlIHVub2JzY3VyZSk8L2E+Jmd0OzwvY29kZT4KPC9kaXY+PC9kaXY+CjxkaXY+PHAgY2xhc3M9ImNvcHlyaWdodCI+Q29weXJpZ2h0IKkgMjAwNiBKb2huIFIuIFBoaWxsaXBzPC9wPjwvZGl2Pgo8ZGl2PjxkaXYgY2xhc3M9ImxlZ2Fsbm90aWNlIj4KPGEgbmFtZT0iaWQ2NDQyODYiPjwvYT48cD4KICAgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUKICAgIDxjb2RlIGNsYXNzPSJmaWxlbmFtZSI+TElDRU5TRV8xXzAudHh0PC9jb2RlPiBvciBjb3B5IGF0CiAgICA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPiApCiAgIDwvcD4KPC9kaXY+PC9kaXY+CjwvZGl2PjwvZGl2Pgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgRm9yIGFsbW9zdCBldmVyeW9uZSwgdGhlIGZpcnN0IGludHJvZHVjdGlvbiB0byB0aGUgY3JhZnQgb2YgcHJvZ3JhbW1pbmcgaXMgYSB2ZXJzaW9uIG9mIHRoZSBzaW1wbGUgIkhlbGxvIFdvcmxkIiBwcm9ncmFtLiBJbiBDKyssIHRoaXMgZmlyc3QgZXhhbXBsZSBtaWdodCBiZSB3cml0dGVuIGFzCiA8L3A+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jaW5jbHVkZSAmbHQ7b3N0cmVhbSZndDsgCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCAmbHQ7Jmx0OyAiSGVsbG8gV29ybGRcbiI7Cn0KPC9wcmU+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBUaGlzIGlzIGEgZ29vZCBpbnRyb2R1Y3Rpb24gZm9yIHNldmVyYWwgcmVhc29ucy4gT25lIGlzIHRoYXQgdGhlIHByb2dyYW0gaXMgc2hvcnQgZW5vdWdoLCBhbmQgdGhlIGxvZ2ljIG9mIGl0cwogIGV4ZWN1dGlvbiBzaW1wbGUgZW5vdWdoIHRoYXQgZGlyZWN0IGluc3BlY3Rpb24gY2FuIHNob3cgd2hldGhlciBpdCBpcyBjb3JyZWN0IGluIGFsbCB1c2UgY2FzZXMga25vd24gdG8gdGhlIG5ldwogIHN0dWRlbnQgcHJvZ3JhbW1lci4gSWYgdGhpcyB3ZXJlIHRoZSBjb21wbGV4aXR5IG9mIGFsbCBwcm9ncmFtbWluZywgdGhlcmUgd291bGQgYmUgbm8gbmVlZCB0byB0ZXN0IGFueXRoaW5nIGJlZm9yZQogIHVzaW5nIGl0LiBJbiBwcm9ncmFtbWluZyBhcyBhIG5ldyBzdHVkZW50IGV4cGVyaWVuY2VzIGl0LCB0ZXN0aW5nIGlzIHBvaW50bGVzcyBhbmQgYWRkcyB1bm5lZWRlZCBjb21wbGV4aXR5LgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgSG93ZXZlciwgbm8gYWN0dWFsIHByb2dyYW1zIGFyZSBhcyBzaW1wbGUgYXMgYW4gaW50cm9kdWN0b3J5IGxlc3NvbiBtYWtlcyAiSGVsbG8gV29ybGQiIHNlZW0uIE5vdCBldmVuICJIZWxsbyBXb3JsZCIuCiAgSW4gYWxsIHJlYWwgcHJvZ3JhbXMsIHRoZXJlIGFyZSBkZWNpc2lvbnMgdG8gYmUgbWFkZSBhbmQgbXVsdGlwbGUgcGF0aHMgb2YgZXhlY3V0aW9uIGJhc2VkIG9uIHRoZXNlIGRlY2lzaW9ucy4gVGhlc2UKICBkZWNpc2lvbnMgY291bGQgYmUgYmFzZWQgb24gdXNlciBpbnB1dCwgc3RyZWFtaW5nIGRhdGEsIHJlc291cmNlIGF2YWlsYWJpbGl0eSBhbmQgZG96ZW5zIG9mIG90aGVyIGZhY3RvcnMuIFRoZQogIHByb2dyYW1tZXIgc3RyaXZlcyB0byBjb250cm9sIHRoZSBpbnB1dHMsIGFuZCByZXN1bHRzIG9mIHRoZXNlIGRlY2lzaW9ucywgYnV0IG5vIG9uZSBjYW4ga2VlcCBhbGwgb2YgdGhlbSBjbGVhcmx5CiAgaW4gbWluZCBvbmNlIHRoZSBzaXplIG9mIHRoZSBwcm9qZWN0IGV4Y2VlZHMganVzdCBhIGZldyBodW5kcmVkIGxpbmVzLiBFdmVuICJIZWxsbyBXb3JsZCIgaGlkZXMgY29tcGxleGl0aWVzIG9mCiAgdGhpcyBzb3J0IGluIHRoZSBzaW1wbGUgc2VlbWluZyBjYWxsIHRvIHN0ZDo6Y291dC4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFNpbmNlIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1tZXIgY2FuIG5vIGxvbmdlciBkZXRlcm1pbmUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwcm9ncmFtLCB0aGVyZSBpcyBhIG5lZWQgZm9yIGEKICBkaWZmZXJlbnQgYXBwcm9hY2guIEFuIG9idmlvdXMgcG9zc2liaWxpdHkgaXMgdGVzdGluZyB0aGUgcHJvZ3JhbSBhZnRlciBjb25zdHJ1Y3Rpb24uIFNvbWVvbmUgZGV2ZWxvcHMgYSBzZXQgb2YKICB0ZXN0IGNhc2VzLCB3aGVyZSBpbnB1dHMgYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtIHN1Y2ggdGhhdCB0aGUgYmVoYXZpb3IgYW5kIG91dHB1dHMgb2YgYSBjb3JyZWN0bHkgcGVyZm9ybWluZwogIHByb2dyYW0gYXJlIGtub3duLiBUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlIG5ldyBwcm9ncmFtIGlzIGNvbXBhcmVkIHRvIGtub3duIHN0YW5kYXJkcyBhbmQgdGhlIG5ldyBwcm9ncmFtIGVpdGhlcgogIHBhc3NlcyBvciBmYWlscy4gSWYgaXQgZmFpbHMsIGF0dGVtcHRzIGFyZSBtYWRlIHRvIGZpeCBpdC4gSWYgdGhlIHRlc3QgY2FzZXMgYXJlIGNhcmVmdWxseSBjaG9zZW4sIHRoZSBzcGVjaWZpY3Mgb2YKICB0aGUgZmFpbHVyZSBnaXZlIGFuIGluZGljYXRpb24gb2Ygd2hhdCBpbiB0aGUgcHJvZ3JhbSBuZWVkcyB0byBiZSBmaXhlZC4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgb3ZlciBqdXN0IG5vdCBrbm93aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgd29ya2luZyBwcm9wZXJseSwgYnV0IGl0IGlzbid0IGEgYmlnIGltcHJvdmVtZW50LgogIElmIHRoZSB3aG9sZSBwcm9ncmFtIGlzIHRlc3RlZCBhdCBvbmNlLCBpdCBpcyBuZWFybHkgaW1wb3NzaWJsZSB0byBkZXZlbG9wIHRlc3QgY2FzZXMgdGhhdCBjbGVhcmx5IGluZGljYXRlIHdoYXQKICB0aGUgZmFpbHVyZSBpcy4gVGhlIHN5c3RlbSBpcyB0b28gY29tcGxleCwgYW5kIHRoZSBwcm9ncmFtbWVyIHN0aWxsIG5lZWRzIHRvIHVuZGVyc3RhbmQgYWxtb3N0IGFsbCBvZiB0aGUgcG9zc2libGUKICBvdXRjb21lcyB0byBiZSBhYmxlIHRvIGRldmVsb3AgdGVzdHMuIEFzIGFsd2F5cywgd2hlbiBhIHByb2JsZW0gaXMgdG9vIGJpZyBhbmQgY29tcGxpY2F0ZWQgYSBnb29kIGlkZWEgaXMgdG8gdHJ5CiAgc3BsaXR0aW5nIGl0IGludG8gc21hbGxlciBhbmQgc2ltcGxlciBwaWVjZXMuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBUaGlzIGFwcHJvYWNoIGxlYWRzIHRvIGEgbGF5ZXJlZCBzeXN0ZW0gb2YgdGVzdGluZywgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBsYXllcmVkIGFwcHJvYWNoIHRvIG9yaWdpbmFsIGRldmVsb3BtZW50CiAgYW5kIHNob3VsZCBiZSBpbnRlZ3JhdGVkIGludG8gaXQuIFdoZW4gd3JpdGluZyBhIHByb2dyYW0sIHRoZSBkZXNpZ24gaXMgZmFjdG9yZWQgaW50byBzbWFsbCB1bml0cyB0aGF0IGFyZQogIGNvbmNlcHR1YWxseSBhbmQgc3RydWN0dXJhbGx5IGVhc2llciB0byBncmFzcC4gQSBzdGFuZGFyZCBydWxlIGZvciB0aGlzIGlzIHRoYXQgb25lIHVuaXQgcGVyZm9ybXMgb25lIGpvYiBvcgogIGVtYm9kaWVzIG9uZSBjb25jZXB0LiBUaGVzZSBzaW1wbGUgdW5pdHMgYXJlIGNvbXBvc2VkIGludG8gbGFyZ2VyIGFuZCBtb3JlIGNvbXBsaWNhdGVkIGFsZ29yaXRobXMgYnkgcGFzc2luZyBuZWVkZWQKICBpbmZvcm1hdGlvbiBpbnRvIGEgdW5pdCBhbmQgcmVjZWl2aW5nIHRoZSBkZXNpcmVkIHJlc3VsdCBvdXQgb2YgaXQuIFRoZSB1bml0cyBhcmUgaW50ZWdyYXRlZCB0byBwZXJmb3JtIHRoZSB3aG9sZQogIHRhc2suIFRlc3Rpbmcgc2hvdWxkIHJlZmxlY3QgdGhpcyBzdHJ1Y3R1cmUgb2YgZGV2ZWxvcG1lbnQuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBUaGUgc2ltcGxlc3QgbGF5ZXIgaXMgVW5pdCBUZXN0aW5nLiBBIHVuaXQgaXMgdGhlIHNtYWxsZXN0IGNvbmNlcHR1YWxseSB3aG9sZSBzZWdtZW50IG9mIHRoZSBwcm9ncmFtLiBFeGFtcGxlcyBvZgogIGJhc2ljIHVuaXRzIG1pZ2h0IGJlIGEgc2luZ2xlIGNsYXNzIG9yIGEgc2luZ2xlIGZ1bmN0aW9uLiBGb3IgZWFjaCB1bml0LCB0aGUgdGVzdGVyICh3aG8gbWF5IG9yIG1heSBub3QgYmUgdGhlCiAgcHJvZ3JhbW1lcikgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHdoYXQgc3RhdGVzIHRoZSB1bml0IGNhbiBlbmNvdW50ZXIgd2hpbGUgZXhlY3V0aW5nIGFzIHBhcnQgb2YgdGhlIHByb2dyYW0uIFRoZXNlCiAgc3RhdGVzIGluY2x1ZGUgZGV0ZXJtaW5pbmcgdGhlIHJhbmdlIG9mIGFwcHJvcHJpYXRlIGlucHV0cyB0byB0aGUgdW5pdCwgZGV0ZXJtaW5pbmcgdGhlIHJhbmdlIG9mIHBvc3NpYmxlCiAgaW5hcHByb3ByaWF0ZSBpbnB1dHMsIGFuZCByZWNvZ25pemluZyBhbnkgd2F5cyB0aGUgc3RhdGUgb2YgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0gbWlnaHQgYWZmZWN0IGV4ZWN1dGlvbiBpbiB0aGlzCiAgdW5pdC4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFdpdGggc28gbWFueSBnZW5lcmFsIHN0YXRlbWVudHMsIGFuIGV4YW1wbGUgd2lsbCBoZWxwIGNsYXJpZnkuIEltYWdpbmUgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmFsIGZ1bmN0aW9uIGlzIHBhcnQgb2YKICBhIHByb2dyYW0sIGFuZCB0aGUgcHJvZ3JhbW1lciB3YW50cyB0byB0ZXN0IGl0LiBGb3IgdGhlIHNha2Ugb2YgYnJldml0eSwgaGVhZGVyIGluY2x1ZGVzIGFuZCBuYW1lc3BhY2UgcXVhbGlmaWVycwogIGhhdmUgYmVlbiBzdXBwcmVzc2VkLgogPC9wPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+ZG91YmxlIGZpbmRfcm9vdCggZG91YmxlICAgICAgICAgICAgICgqZikoZG91YmxlKSwgCiAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgICAgIGxvd19ndWVzcywgCiAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgICAgIGhpZ2hfZ3Vlc3MsIAogICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvciZsdDtkb3VibGUmZ3Q7JmFtcDsgc3RlcHMsIAogICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgICAgICAgICB0b2xlcmFuY2UgKQp7CiAgICBkb3VibGUgc29sdXRpb247CiAgICBib29sICAgY29udmVyZ2VkID0gZmFsc2U7CgogICAgd2hpbGUobm90IGNvbnZlcmdlZCkKICAgIHsKICAgICAgICBkb3VibGUgdGVtcCA9IChsb3dfZ3Vlc3MgKyBoaWdoX2d1ZXNzKSAvIDIuMDsKICAgICAgICBzdGVwcy5wdXNoX2JhY2soIHRlbXAgKTsKCiAgICAgICAgZG91YmxlIGZfdGVtcCA9IGYodGVtcCk7CiAgICAgICAgZG91YmxlIGZfbG93ID0gZihsb3dfZ3Vlc3MpOwogICAgICAgIAogICAgICAgIGlmKGFicyhmX3RlbXApICZsdDsgdG9sZXJhbmNlKQogICAgICAgIHsKICAgICAgICAgICAgc29sdXRpb24gID0gdGVtcDsKICAgICAgICAgICAgY29udmVyZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihmX3RlbXAgLyBhYnMoZl90ZW1wKSA9PSBmX2xvdyAvIGFicyhmX2xvdykpCiAgICAgICAgewogICAgICAgICAgICBsb3dfZ3Vlc3MgPSB0ZW1wOwogICAgICAgICAgICBjb252ZXJnZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaGlnaF9ndWVzcyA9IHRlbXA7CiAgICAgICAgICAgIGNvbnZlcmdlZCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcmV0dXJuIHNvbHV0aW9uOwp9CjwvcHJlPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgVGhpcyBjb2RlLCBhbHRob3VnaCBicmllZiBhbmQgc2ltcGxlIGlzIGdldHRpbmcgbG9uZyBlbm91Z2ggdGhhdCBpdCB0YWtlcyBhdHRlbnRpb24gdG8gZmluZCB3aGF0IGlzIGRvbmUgYW5kIHdoeS4KICBJdCBpcyBubyBsb25nZXIgb2J2aW91cyBhdCBhIGdsYW5jZSB3aGF0IHRoZSBpbnRlbnQgb2YgdGhlIHByb2dyYW0gaXMsIHNvIGNhcmVmdWwgbmFtaW5nIG11c3QgYmUgdXNlZCB0byBjYXJyeSB0aGF0CiAgaW50ZW50LgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgVGhhbmtzIHRvIHRoZSBjb250cm9sIHN0cnVjdHVyZXMsIHRoZXJlIGFyZSBzb21lIG9idmlvdXMgZXhlY3V0aW9uIHBhdGhzIGluIHRoZSBjb2RlLiBIb3dldmVyLCB0aGVyZSBhcmUgYWxzbyBhIGZldwogIGxlc3Mgb2J2aW91cyBwYXRocy4gRm9yIGV4YW1wbGUsIGlmIHRoZSByb290IGZpbmRlciB0YWtlcyBtYW55IHN0ZXBzIHRvIGNvbnZlcmdlIHRvIGFuIGFjY2VwdGFibGUgYW5zd2VyLCB0aGUKICB2ZWN0b3IgdGhhdCBpcyBob2xkaW5nIHRoZSBoaXN0b3J5IG9mIHN0ZXBzIHRha2VuIG1heSBuZWVkIHRvIHJlYWxsb2NhdGUgZm9yIGFkZGl0aW9uYWwgc3BhY2UuIEluIHRoaXMgY2FzZSwgdGhlcmUKICBhcmUgbWFueSBoaWRkZW4gc3RlcHMgaW4gdGhlIHNpbmdsZSBwdXNoX2JhY2sgY29tbWFuZC4gVGhlc2Ugc3RlcHMgYWxzbyBpbmNsdWRlIHRoZSBjaGFuY2Ugb2YgZmFpbHVyZSwgc2luY2UgdGhhdAogIGlzIGFsd2F5cyBhIHBvc3NpYmlsaXR5IGluIGEgbWVtb3J5IGFsbG9jYXRpb24uCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBBIHNlY29uZCBleGFtcGxlIG5vdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBhdCB0aGUgbG93IGd1ZXNzIGhhcyBub3QgYmVlbiB0ZXN0ZWQsIHNvIHRoZXJlIGlzIHRoZSBjaGFuY2UKICBvZiBhIHplcm8gZGl2aXNpb24uIEFsc28sIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYXQgdGhlIGhpZ2ggZ3Vlc3MgaXMgemVybywgdGhlIHJvb3QgZmluZGVyIHdpbGwgbWlzcyB0aGF0CiAgcm9vdCBlbnRpcmVseS4gSXQgbWF5IGV2ZW4gZmFsbCBpbnRvIGFuIGluZmluaXRlIGxvb3AgaWYgbm8gcm9vdCBsaWVzIGJldHdlZW4gdGhlIGxvdyBhbmQgaGlnaCB2YWx1ZXMuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBJbiB0aGlzIHVuaXQsIHByb3BlciB0ZXN0aW5nIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBiZWhhdmlvciBpbiBlYWNoIHBvc3NpYmlsaXR5LiBJdCBhbHNvIGluY2x1ZGVzIGNoZWNraW5nIHRoZQogIGZ1bmN0aW9uIGJ5IGdpdmluZyBpbnB1dHMgd2hlcmUgdGhlIGNvcnJlY3QgYW5zd2VyIGlzIGtub3duIGFuZCBjaGVja2luZyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHRoYXQgYW5zd2VyLiBUaHVzLAogIHRoZSB1bml0IGlzIHRlc3RlZCBpbiBldmVyeSBleGVjdXRpb24gcGF0aCB0byBhc3N1cmUgcHJvcGVyIGJlaGF2aW9yLgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgVGVzdCBjYXNlcyBhcmUgY2hvc2VuIHRvIGV4cG9zZSBhcyBtYW55IGVycm9ycyBhcyBwb3NzaWJsZS4gQSBkZWZpbmluZyBjaGFyYWN0ZXJpc3RpYyBvZiBhIGdvb2QgdGVzdCBjYXNlIGlzIHRoYXQKICB0aGUgcHJvZ3JhbW1lciBrbm93cyB3aGF0IHRoZSB1bml0IHNob3VsZCBkbyBpZiBpdCBpcyBmdW5jdGlvbmluZyBwcm9wZXJseS4gVGVzdCBjYXNlcyBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvCiAgZXhlcmNpc2UgZWFjaCBhdmFpbGFibGUgZXhlY3V0aW9uIHBhdGguIEZvciB0aGUgYWJvdmUgc25pcHBldCwgdGhpcyBpbmNsdWRlcyB0aGUgb2J2aW91cyBhbmQgdGhlIG5vdCBzbyBvYnZpb3VzCiAgcGF0aHMuIEV2ZXJ5IHBhdGggc2hvdWxkIGJlIHRlc3RlZCwgc2luY2UgZXZlcnkgcGF0aCBpcyBhIHBvc3NpYmxlIG91dGNvbWUgb2YgcHJvZ3JhbSBleGVjdXRpb24uCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBUaHVzLCB0byB3cml0ZSBhIGdvb2QgdGVzdGluZyBzdWl0ZSwgdGhlIHRlc3RlciBtdXN0IGtub3cgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZS4gVGhlIG1vc3QgZGVwZW5kYWJsZSB3YXkgdG8KICBhY2NvbXBsaXNoIHRoaXMgaXMgaWYgdGhlIG9yaWdpbmFsIHByb2dyYW1tZXIgd3JpdGVzIHRlc3RzIGFzIHBhcnQgb2YgY3JlYXRpbmcgdGhlIGNvZGUuIEluIGZhY3QsIGl0IGlzIGFkdmlzYWJsZQogIHRoYXQgdGhlIHRlc3RzIGFyZSBwcm9kdWNlZCBiZWZvcmUgdGhlIGNvZGUgaXMgd3JpdHRlbiwgYW5kIHVwZGF0ZWQgd2hlbmV2ZXIgc3RydWN0dXJlIGRlY2lzaW9ucyBhcmUgY2hhbmdlZC4gVGhpcwogIHdheSwgdGhlIHRlc3RzIGFyZSB3cml0dGVuIHdpdGggYSB2aWV3IHRvd2FyZCBob3cgdGhlIHVuaXQgc2hvdWxkIHBlcmZvcm0gaW5zdGVhZCBvZiByZXByb2R1Y2luZyB0aGUgcHJvZ3JhbW1lcidzCiAgdGhpbmtpbmcgZnJvbSB3cml0aW5nIHRoZSBjb2RlLiBXaGlsZSBibGFjayBib3ggdGVzdGluZyBpcyBhbHNvIHVzZWZ1bCwgaXQgaXMgaW1wb3J0YW50IHRoYXQgc29tZW9uZSB3aG8ga25vd3MgdGhlCiAgZGVzaWduIGRlY2lzaW9ucyBtYWRlIGFuZCB0aGUgcmF0aW9uYWxlIGZvciB0aG9zZSBkZWNpc2lvbnMgdGVzdCB0aGUgY29kZSB1bml0LiBBIHByb2dyYW1tZXIgd2hvIGNhbid0IGRldmlzZSAKICBnb29kIHRlc3RzIGZvciBhIHVuaXQgZG9lcyBub3QgeWV0IGtub3cgdGhlIHByb2JsZW0gYXQgaGFuZCB3ZWxsIGVub3VnaCB0byBwcm9ncmFtIGRlcGVuZGFibHkuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICBXaGVuIGEgdW5pdCBpcyBjb21wbGV0ZWQgYW5kIHRlc3RlZCwgaXQgaXMgcmVhZHkgZm9yIGludGVncmF0aW9uIHdpdGggb3RoZXIgdW5pdHMgaW4gdGhlIHByb2dyYW0uIFRoaXMgaXMKICBpbnRlZ3JhdGlvbiBzaG91bGQgYWxzbyBiZSB0ZXN0ZWQuIEF0IHRoaXMgcG9pbnQsIHRoZSB0ZXN0IGNhc2VzIGZvY3VzIG9uIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB1bml0cy4gVGVzdHMKICBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgZWFjaCB3YXkgdGhlIHVuaXRzIGNhbiBhZmZlY3QgZWFjaCBvdGhlci4KIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogIFRoaXMgaXMgdGhlIHBvaW50IGluIGRldmVsb3BtZW50IHdoZXJlIHByb3BlciB1bml0IHRlc3RpbmcgcmVhbGx5IHNoaW5lcy4gSWYgZWFjaCB1bml0IGlzIGRvaW5nIHdoYXQgaXQgc2hvdWxkIGJlCiAgZG9pbmcgYW5kIG5vdCBjcmVhdGluZyB1bmV4cGVjdGVkIHNpZGUgZWZmZWN0cywgYW55IGlzc3VlcyBpbiB0ZXN0aW5nIGEgc2V0IG9mIGludGVncmF0ZWQgdW5pdHMgbXVzdCBjb21lIGZyb20gaG93CiAgdGhleSBhcmUgcGFzc2luZyBpbmZvcm1hdGlvbi4gVGh1cywgdGhlIG5lYXJseSBpbnRyYWN0YWJsZSBwcm9ibGVtIG9mIGZpbmRpbmcgYW4gZXJyb3Igd2hpbGUgbWFueSB1bml0cyBpbnRlcmFjdAogIGJlY29tZXMgdGhlIGxlc3MgaW50aW1pZGF0aW5nIHByb2JsZW0gb2YgZmluZGluZyB0aGUgYnJlYWtkb3duIGluIGNvbW11bmljYXRpb25zLgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgQXQgZWFjaCBsYXllciBvZiBpbmNyZWFzaW5nIGNvbXBsZXhpdHksIG5ldyB0ZXN0cyBhcmUgcnVuLCBhbmQgaWYgdGhlIHByaW9yIHRlc3RzIG9mIHRoZSBjb21wb25lbnRzIGFyZSB3ZWxsCiAgZGVzaWduZWQgYW5kIGFsbCBpc3N1ZXMgYXJlIGZpeGVkLCBuZXcgZXJyb3JzIGFyZSBpc29sYXRlZCB0byB0aGUgaW50ZWdyYXRpb24uIFRoaXMgcHJvY2VzcyBjb250aW51ZXMsIGluIHBhcmFsbGVsCiAgd2l0aCBkZXZlbG9wbWVudCwgZnJvbSB0aGUgc21hbGxlc3QgdW5pdHMgdG8gdGhlIGNvbXBsZXRlZCBwcm9ncmFtLgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgVGhpcyBzaG93cyB0aGF0IHRoZXJlIGlzIGEgbmVlZCB0byBiZSBhYmxlIHRvIGNoZWNrIGFuZCB0ZXN0IGNvZGUgc25pcHBldHMgc3VjaCBhcyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcwogIGluZGVwZW5kZW50IHRoZSBwcm9ncmFtIG9mIHdoaWNoIHRoZXkgd2lsbCBiZWNvbWUgYSBwYXJ0LiBUaGF0IGlzLCB0aGUgbmVlZCBmb3IgYSBtZWFucyB0byBwcm92aWRlIHByZWRldGVybWluZWQKICBpbnB1dHMgdG8gdGhlIHVuaXQgdG8gY2hlY2sgdGhlIG91dHB1dHMgYWdhaW5zdCBleHBlY3RlZCByZXN1bHRzLiBTdWNoIGEgc3lzdGVtIG11c3QgYWxsb3cgZm9yIGJvdGggbm9ybWFsCiAgb3BlcmF0aW9uICBhbmQgZXJyb3IgY29uZGl0aW9ucywgYWxsb3cgdGhlIHByb2dyYW1tZXIgdG8gcHJvZHVjZSBhIHRob3JvdWdoIGRlc2NyaXB0aW9uIG9mIHRoZSByZXN1bHRzLgogPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgVGhpcyBpcyB0aGUgZ29hbCBhbmQgcmF0aW9uYWxlIGZvciBhbGwgdW5pdCB0ZXN0aW5nLCBhbmQgc3VwcG9ydGluZyB0ZXN0aW5nIG9mIHRoaXMgc29ydCBpcyB0aGUgcHVycG9zZSBvZiB0aGUKICBCb29zdC5UZXN0IGxpYnJhcnkuIEFzIGlzIHNob3duIGJlbG93LCBCb29zdC5UZXN0IHByb3ZpZGVzIGEgd2VsbC1pbnRlZ3JhdGVkIHNldCBvZiB0b29scyB0byBzdXBwb3J0IHRoaXMgdGVzdGluZwogIGVmZm9ydCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtbWluZyBhbmQgbWFpbnRlbmFuY2UgY3ljbGVzIG9mIHNvZnR3YXJlIGRldmVsb3BtZW50LgogPC9wPgo8L2Rpdj4KPHRhYmxlIHhtbG5zOnJldj0iaHR0cDovL3d3dy5jcy5ycGkuZWR1L35ncmVnb2QvYm9vc3QvdG9vbHMvZG9jL3JldmlzaW9uIiB3aWR0aD0iMTAwJSI+PHRyPgo8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Cjx0ZCBhbGlnbj0icmlnaHQiPjxkaXYgY2xhc3M9ImNvcHlyaWdodC1mb290ZXIiPkNvcHlyaWdodCCpIDIwMDEtMjAwNyBHZW5uYWRpeSBSb3plbnRhbDwvZGl2PjwvdGQ+CjwvdHI+PC90YWJsZT4KPGhyPgo8ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgYWNjZXNza2V5PSJwIiBocmVmPSIuLi91dGYvdHV0b3JpYWxzLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iLi4vdXRmL3R1dG9yaWFscy5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL3VwLnBuZyIgYWx0PSJVcCI+PC9hPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy9ob21lLnBuZyIgYWx0PSJIb21lIj48L2E+PGEgYWNjZXNza2V5PSJuIiBocmVmPSJoZWxsby10aGUtdGVzdGluZy13b3JsZC5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25leHQucG5nIiBhbHQ9Ik5leHQiPjwvYT4KPC9kaXY+CjwvYm9keT4KPC9odG1sPgo=