PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD48IS0tCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgICAgICAgICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20geG1sIHNvdXJjZTogRE8gTk9UIEVESVQKICAgICAgICBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAogICAgICAtLT4KPHRpdGxlPkNvbnRlbnQgTmVnb3RpYXRpb24gLSBBcGFjaGUgSFRUUCBTZXJ2ZXI8L3RpdGxlPgo8bGluayBocmVmPSIuL3N0eWxlL2Nzcy9tYW51YWwuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTWFpbiBzdHlsZXNoZWV0IiAvPgo8bGluayBocmVmPSIuL3N0eWxlL2Nzcy9tYW51YWwtbG9vc2UtMTAwcGMuY3NzIiByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik5vIFNpZGViYXIgLSBEZWZhdWx0IGZvbnQgc2l6ZSIgLz4KPGxpbmsgaHJlZj0iLi9zdHlsZS9jc3MvbWFudWFsLXByaW50LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0icHJpbnQiIHR5cGU9InRleHQvY3NzIiAvPgo8bGluayBocmVmPSIuL2ltYWdlcy9mYXZpY29uLmljbyIgcmVsPSJzaG9ydGN1dCBpY29uIiAvPjwvaGVhZD4KPGJvZHkgaWQ9Im1hbnVhbC1wYWdlIj48ZGl2IGlkPSJwYWdlLWhlYWRlciI+CjxwIGNsYXNzPSJtZW51Ij48YSBocmVmPSIuL21vZC8iPk1vZHVsZXM8L2E+IHwgPGEgaHJlZj0iLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Ii4vZmFxLyI+RkFRPC9hPiB8IDxhIGhyZWY9Ii4vZ2xvc3NhcnkuaHRtbCI+R2xvc3Nhcnk8L2E+IHwgPGEgaHJlZj0iLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPgo8cCBjbGFzcz0iYXBhY2hlIj5BcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAyLjM8L3A+CjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZmVhdGhlci5naWYiIC8+PC9kaXY+CjxkaXYgY2xhc3M9InVwIj48YSBocmVmPSIuLyI+PGltZyB0aXRsZT0iJmx0Oy0iIGFsdD0iJmx0Oy0iIHNyYz0iLi9pbWFnZXMvbGVmdC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYXRoIj4KPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlPC9hPiAmZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnLyI+SFRUUCBTZXJ2ZXI8L2E+ICZndDsgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8iPkRvY3VtZW50YXRpb248L2E+ICZndDsgPGEgaHJlZj0iLi8iPlZlcnNpb24gMi4zPC9hPjwvZGl2PjxkaXYgaWQ9InBhZ2UtY29udGVudCI+PGRpdiBpZD0icHJlYW1ibGUiPjxoMT5Db250ZW50IE5lZ290aWF0aW9uPC9oMT4KPGRpdiBjbGFzcz0idG9wbGFuZyI+CjxwPjxzcGFuPkF2YWlsYWJsZSBMYW5ndWFnZXM6IDwvc3Bhbj48YSBocmVmPSIuL2VuL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCIgdGl0bGU9IkVuZ2xpc2giPiZuYnNwO2VuJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4vamEvY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiBocmVmbGFuZz0iamEiIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iSmFwYW5lc2UiPiZuYnNwO2phJm5ic3A7PC9hPiB8CjxhIGhyZWY9Ii4va28vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIiBocmVmbGFuZz0ia28iIHJlbD0iYWx0ZXJuYXRlIiB0aXRsZT0iS29yZWFuIj4mbmJzcDtrbyZuYnNwOzwvYT4gfAo8YSBocmVmPSIuL3RyL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCIgaHJlZmxhbmc9InRyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IlT8cmvnZSI+Jm5ic3A7dHImbmJzcDs8L2E+PC9wPgo8L2Rpdj4KCgogICAgPHA+QXBhY2hlIEhUVFBEIHN1cHBvcnRzIGNvbnRlbnQgbmVnb3RpYXRpb24gYXMgZGVzY3JpYmVkIGluCiAgICB0aGUgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbi4gSXQgY2FuIGNob29zZSB0aGUgYmVzdAogICAgcmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSBiYXNlZCBvbiB0aGUgYnJvd3Nlci1zdXBwbGllZAogICAgcHJlZmVyZW5jZXMgZm9yIG1lZGlhIHR5cGUsIGxhbmd1YWdlcywgY2hhcmFjdGVyIHNldCBhbmQKICAgIGVuY29kaW5nLiBJdCBhbHNvIGltcGxlbWVudHMgYSBjb3VwbGUgb2YgZmVhdHVyZXMgdG8gZ2l2ZQogICAgbW9yZSBpbnRlbGxpZ2VudCBoYW5kbGluZyBvZiByZXF1ZXN0cyBmcm9tIGJyb3dzZXJzIHRoYXQgc2VuZAogICAgaW5jb21wbGV0ZSBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbi48L3A+CgogICAgPHA+Q29udGVudCBuZWdvdGlhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUKICAgIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L2E+PC9jb2RlPiBtb2R1bGUsIHdoaWNoIGlzIGNvbXBpbGVkIGluCiAgICBieSBkZWZhdWx0LjwvcD4KPC9kaXY+CjxkaXYgaWQ9InF1aWNrdmlldyI+PHVsIGlkPSJ0b2MiPjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjYWJvdXQiPkFib3V0IENvbnRlbnQgTmVnb3RpYXRpb248L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNuZWdvdGlhdGlvbiI+TmVnb3RpYXRpb24gaW4gaHR0cGQ8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNtZXRob2RzIj5UaGUgTmVnb3RpYXRpb24gTWV0aG9kczwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI2JldHRlciI+RmlkZGxpbmcgd2l0aCBRdWFsaXR5CiAgICBWYWx1ZXM8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNleHRlbnNpb25zIj5FeHRlbnNpb25zIHRvIFRyYW5zcGFyZW50IENvbnRlbnQKTmVnb3RpYXRpb248L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNuYW1pbmciPk5vdGUgb24gaHlwZXJsaW5rcyBhbmQgbmFtaW5nIGNvbnZlbnRpb25zPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjY2FjaGluZyI+Tm90ZSBvbiBDYWNoaW5nPC9hPjwvbGk+CjwvdWw+PC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0iYWJvdXQiIGlkPSJhYm91dCI+QWJvdXQgQ29udGVudCBOZWdvdGlhdGlvbjwvYT48L2gyPgoKICAgIDxwPkEgcmVzb3VyY2UgbWF5IGJlIGF2YWlsYWJsZSBpbiBzZXZlcmFsIGRpZmZlcmVudAogICAgcmVwcmVzZW50YXRpb25zLiBGb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgYXZhaWxhYmxlIGluCiAgICBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG9yIGRpZmZlcmVudCBtZWRpYSB0eXBlcywgb3IgYSBjb21iaW5hdGlvbi4KICAgIE9uZSB3YXkgb2Ygc2VsZWN0aW5nIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNob2ljZSBpcyB0byBnaXZlIHRoZQogICAgdXNlciBhbiBpbmRleCBwYWdlLCBhbmQgbGV0IHRoZW0gc2VsZWN0LiBIb3dldmVyIGl0IGlzIG9mdGVuCiAgICBwb3NzaWJsZSBmb3IgdGhlIHNlcnZlciB0byBjaG9vc2UgYXV0b21hdGljYWxseS4gVGhpcyB3b3JrcwogICAgYmVjYXVzZSBicm93c2VycyBjYW4gc2VuZCwgYXMgcGFydCBvZiBlYWNoIHJlcXVlc3QsIGluZm9ybWF0aW9uCiAgICBhYm91dCB3aGF0IHJlcHJlc2VudGF0aW9ucyB0aGV5IHByZWZlci4gRm9yIGV4YW1wbGUsIGEgYnJvd3NlcgogICAgY291bGQgaW5kaWNhdGUgdGhhdCBpdCB3b3VsZCBsaWtlIHRvIHNlZSBpbmZvcm1hdGlvbiBpbiBGcmVuY2gsCiAgICBpZiBwb3NzaWJsZSwgZWxzZSBFbmdsaXNoIHdpbGwgZG8uIEJyb3dzZXJzIGluZGljYXRlIHRoZWlyCiAgICBwcmVmZXJlbmNlcyBieSBoZWFkZXJzIGluIHRoZSByZXF1ZXN0LiBUbyByZXF1ZXN0IG9ubHkgRnJlbmNoCiAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBicm93c2VyIHdvdWxkIHNlbmQ8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT5BY2NlcHQtTGFuZ3VhZ2U6IGZyPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5Ob3RlIHRoYXQgdGhpcyBwcmVmZXJlbmNlIHdpbGwgb25seSBiZSBhcHBsaWVkIHdoZW4gdGhlcmUgaXMKICAgIGEgY2hvaWNlIG9mIHJlcHJlc2VudGF0aW9ucyBhbmQgdGhleSB2YXJ5IGJ5IGxhbmd1YWdlLjwvcD4KCiAgICA8cD5BcyBhbiBleGFtcGxlIG9mIGEgbW9yZSBjb21wbGV4IHJlcXVlc3QsIHRoaXMgYnJvd3NlciBoYXMKICAgIGJlZW4gY29uZmlndXJlZCB0byBhY2NlcHQgRnJlbmNoIGFuZCBFbmdsaXNoLCBidXQgcHJlZmVyCiAgICBGcmVuY2gsIGFuZCB0byBhY2NlcHQgdmFyaW91cyBtZWRpYSB0eXBlcywgcHJlZmVycmluZyBIVE1MIG92ZXIKICAgIHBsYWluIHRleHQgb3Igb3RoZXIgdGV4dCB0eXBlcywgYW5kIHByZWZlcnJpbmcgR0lGIG9yIEpQRUcgb3ZlcgogICAgb3RoZXIgbWVkaWEgdHlwZXMsIGJ1dCBhbHNvIGFsbG93aW5nIGFueSBvdGhlciBtZWRpYSB0eXBlIGFzIGEKICAgIGxhc3QgcmVzb3J0OjwvcD4KCjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogIEFjY2VwdC1MYW5ndWFnZTogZnI7IHE9MS4wLCBlbjsgcT0wLjU8YnIgLz4KICBBY2NlcHQ6IHRleHQvaHRtbDsgcT0xLjAsIHRleHQvKjsgcT0wLjgsIGltYWdlL2dpZjsgcT0wLjYsIGltYWdlL2pwZWc7IHE9MC42LCBpbWFnZS8qOyBxPTAuNSwgKi8qOyBxPTAuMQo8L2NvZGU+PC9wPjwvZGl2PgoKICAgIDxwPmh0dHBkIHN1cHBvcnRzICdzZXJ2ZXIgZHJpdmVuJyBjb250ZW50IG5lZ290aWF0aW9uLCBhcwogICAgZGVmaW5lZCBpbiB0aGUgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbi4gSXQgZnVsbHkgc3VwcG9ydHMgdGhlCiAgICA8Y29kZT5BY2NlcHQ8L2NvZGU+LCA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+LAogICAgPGNvZGU+QWNjZXB0LUNoYXJzZXQ8L2NvZGU+IGFuZDxjb2RlPkFjY2VwdC1FbmNvZGluZzwvY29kZT4gCiAgICByZXF1ZXN0IGhlYWRlcnMuIGh0dHBkIGFsc28gc3VwcG9ydHMgJ3RyYW5zcGFyZW50JwogICAgY29udGVudCBuZWdvdGlhdGlvbiwgd2hpY2ggaXMgYW4gZXhwZXJpbWVudGFsIG5lZ290aWF0aW9uCiAgICBwcm90b2NvbCBkZWZpbmVkIGluIFJGQyAyMjk1IGFuZCBSRkMgMjI5Ni4gSXQgZG9lcyBub3Qgb2ZmZXIKICAgIHN1cHBvcnQgZm9yICdmZWF0dXJlIG5lZ290aWF0aW9uJyBhcyBkZWZpbmVkIGluIHRoZXNlIFJGQ3MuPC9wPgoKICAgIDxwPkEgPHN0cm9uZz5yZXNvdXJjZTwvc3Ryb25nPiBpcyBhIGNvbmNlcHR1YWwgZW50aXR5CiAgICBpZGVudGlmaWVkIGJ5IGEgVVJJIChSRkMgMjM5NikuIEFuIEhUVFAgc2VydmVyIGxpa2UgQXBhY2hlIEhUVFAgU2VydmVyCiAgICBwcm92aWRlcyBhY2Nlc3MgdG8gPHN0cm9uZz5yZXByZXNlbnRhdGlvbnM8L3N0cm9uZz4gb2YgdGhlCiAgICByZXNvdXJjZShzKSB3aXRoaW4gaXRzIG5hbWVzcGFjZSwgd2l0aCBlYWNoIHJlcHJlc2VudGF0aW9uIGluCiAgICB0aGUgZm9ybSBvZiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHdpdGggYSBkZWZpbmVkIG1lZGlhIHR5cGUsCiAgICBjaGFyYWN0ZXIgc2V0LCBlbmNvZGluZywgZXRjLiBFYWNoIHJlc291cmNlIG1heSBiZSBhc3NvY2lhdGVkCiAgICB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIG9uZSByZXByZXNlbnRhdGlvbiBhdCBhbnkgZ2l2ZW4KICAgIHRpbWUuIElmIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgcmVzb3VyY2UKICAgIGlzIHJlZmVycmVkIHRvIGFzIDxzdHJvbmc+bmVnb3RpYWJsZTwvc3Ryb25nPiBhbmQgZWFjaCBvZiBpdHMKICAgIHJlcHJlc2VudGF0aW9ucyBpcyB0ZXJtZWQgYSA8c3Ryb25nPnZhcmlhbnQ8L3N0cm9uZz4uIFRoZSB3YXlzCiAgICBpbiB3aGljaCB0aGUgdmFyaWFudHMgZm9yIGEgbmVnb3RpYWJsZSByZXNvdXJjZSB2YXJ5IGFyZSBjYWxsZWQKICAgIHRoZSA8c3Ryb25nPmRpbWVuc2lvbnM8L3N0cm9uZz4gb2YgbmVnb3RpYXRpb24uPC9wPgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9Im5lZ290aWF0aW9uIiBpZD0ibmVnb3RpYXRpb24iPk5lZ290aWF0aW9uIGluIGh0dHBkPC9hPjwvaDI+CgogICAgPHA+SW4gb3JkZXIgdG8gbmVnb3RpYXRlIGEgcmVzb3VyY2UsIHRoZSBzZXJ2ZXIgbmVlZHMgdG8gYmUKICAgIGdpdmVuIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggb2YgdGhlIHZhcmlhbnRzLiBUaGlzIGlzIGRvbmUgaW4KICAgIG9uZSBvZiB0d28gd2F5czo8L3A+CgogICAgPHVsPgogICAgICA8bGk+VXNpbmcgYSB0eXBlIG1hcCAoPGVtPmkuZS48L2VtPiwgYSA8Y29kZT4qLnZhcjwvY29kZT4KICAgICAgZmlsZSkgd2hpY2ggbmFtZXMgdGhlIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHZhcmlhbnRzCiAgICAgIGV4cGxpY2l0bHksIG9yPC9saT4KCiAgICAgIDxsaT5Vc2luZyBhICdNdWx0aVZpZXdzJyBzZWFyY2gsIHdoZXJlIHRoZSBzZXJ2ZXIgZG9lcyBhbgogICAgICBpbXBsaWNpdCBmaWxlbmFtZSBwYXR0ZXJuIG1hdGNoIGFuZCBjaG9vc2VzIGZyb20gYW1vbmcgdGhlCiAgICAgIHJlc3VsdHMuPC9saT4KICAgIDwvdWw+CgogICA8aDM+PGEgbmFtZT0idHlwZS1tYXAiIGlkPSJ0eXBlLW1hcCI+VXNpbmcgYSB0eXBlLW1hcCBmaWxlPC9hPjwvaDM+CgogICAgPHA+QSB0eXBlIG1hcCBpcyBhIGRvY3VtZW50IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlcgogICAgbmFtZWQgPGNvZGU+dHlwZS1tYXA8L2NvZGU+IChvciwgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGgKICAgIG9sZGVyIGh0dHBkIGNvbmZpZ3VyYXRpb25zLCB0aGUgPGEgY2xhc3M9Imdsb3NzYXJ5bGluayIgaHJlZj0iLi9nbG9zc2FyeS5odG1sI21pbWUtdHlwZSIgdGl0bGU9InNlZSBnbG9zc2FyeSI+TUlNRS10eXBlPC9hPgogICAgPGNvZGU+YXBwbGljYXRpb24veC10eXBlLW1hcDwvY29kZT4pLiBOb3RlIHRoYXQgdG8gdXNlIHRoaXMKICAgIGZlYXR1cmUsIHlvdSBtdXN0IGhhdmUgYSBoYW5kbGVyIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbiB0aGF0CiAgICBkZWZpbmVzIGEgZmlsZSBzdWZmaXggYXMgPGNvZGU+dHlwZS1tYXA8L2NvZGU+OyB0aGlzIGlzIGJlc3QgZG9uZQogICAgd2l0aDwvcD4KCjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPkFkZEhhbmRsZXIgdHlwZS1tYXAgLnZhcjwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+aW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuPC9wPgoKICAgIDxwPlR5cGUgbWFwIGZpbGVzIHNob3VsZCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlc291cmNlCiAgICB3aGljaCB0aGV5IGFyZSBkZXNjcmliaW5nLCBhbmQgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaCBhdmFpbGFibGUKICAgIHZhcmlhbnQ7IHRoZXNlIGVudHJpZXMgY29uc2lzdCBvZiBjb250aWd1b3VzIEhUVFAtZm9ybWF0IGhlYWRlcgogICAgbGluZXMuIEVudHJpZXMgZm9yIGRpZmZlcmVudCB2YXJpYW50cyBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rCiAgICBsaW5lcy4gQmxhbmsgbGluZXMgYXJlIGlsbGVnYWwgd2l0aGluIGFuIGVudHJ5LiBJdCBpcwogICAgY29udmVudGlvbmFsIHRvIGJlZ2luIGEgbWFwIGZpbGUgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGNvbWJpbmVkCiAgICBlbnRpdHkgYXMgYSB3aG9sZSAoYWx0aG91Z2ggdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpZgogICAgcHJlc2VudCB3aWxsIGJlIGlnbm9yZWQpLiBBbiBleGFtcGxlIG1hcCBmaWxlIGlzIHNob3duIGJlbG93LgogICAgVGhpcyBmaWxlIHdvdWxkIGJlIG5hbWVkIDxjb2RlPmZvby52YXI8L2NvZGU+LCBhcyBpdCBkZXNjcmliZXMKICAgIGEgcmVzb3VyY2UgbmFtZWQgPGNvZGU+Zm9vPC9jb2RlPi48L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICBVUkk6IGZvbzxiciAvPgo8YnIgLz4KICBVUkk6IGZvby5lbi5odG1sPGJyIC8+CiAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw8YnIgLz4KICBDb250ZW50LWxhbmd1YWdlOiBlbjxiciAvPgo8YnIgLz4KICBVUkk6IGZvby5mci5kZS5odG1sPGJyIC8+CiAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0yPGJyIC8+CiAgQ29udGVudC1sYW5ndWFnZTogZnIsIGRlPGJyIC8+CjwvY29kZT48L3A+PC9kaXY+CiAgICA8cD5Ob3RlIGFsc28gdGhhdCBhIHR5cGVtYXAgZmlsZSB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZQogICAgZmlsZW5hbWUncyBleHRlbnNpb24sIGV2ZW4gd2hlbiBNdWx0aXZpZXdzIGlzIG9uLiBJZiB0aGUKICAgIHZhcmlhbnRzIGhhdmUgZGlmZmVyZW50IHNvdXJjZSBxdWFsaXRpZXMsIHRoYXQgbWF5IGJlIGluZGljYXRlZAogICAgYnkgdGhlICJxcyIgcGFyYW1ldGVyIHRvIHRoZSBtZWRpYSB0eXBlLCBhcyBpbiB0aGlzIHBpY3R1cmUKICAgIChhdmFpbGFibGUgYXMgSlBFRywgR0lGLCBvciBBU0NJSS1hcnQpOiA8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICBVUkk6IGZvbzxiciAvPgo8YnIgLz4KICBVUkk6IGZvby5qcGVnPGJyIC8+CiAgQ29udGVudC10eXBlOiBpbWFnZS9qcGVnOyBxcz0wLjg8YnIgLz4KPGJyIC8+CiAgVVJJOiBmb28uZ2lmPGJyIC8+CiAgQ29udGVudC10eXBlOiBpbWFnZS9naWY7IHFzPTAuNTxiciAvPgo8YnIgLz4KICBVUkk6IGZvby50eHQ8YnIgLz4KICBDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IHFzPTAuMDE8YnIgLz4KPC9jb2RlPjwvcD48L2Rpdj4KCiAgICA8cD5xcyB2YWx1ZXMgY2FuIHZhcnkgaW4gdGhlIHJhbmdlIDAuMDAwIHRvIDEuMDAwLiBOb3RlIHRoYXQKICAgIGFueSB2YXJpYW50IHdpdGggYSBxcyB2YWx1ZSBvZiAwLjAwMCB3aWxsIG5ldmVyIGJlIGNob3Nlbi4KICAgIFZhcmlhbnRzIHdpdGggbm8gJ3FzJyBwYXJhbWV0ZXIgdmFsdWUgYXJlIGdpdmVuIGEgcXMgZmFjdG9yIG9mCiAgICAxLjAuIFRoZSBxcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSByZWxhdGl2ZSAncXVhbGl0eScgb2YgdGhpcwogICAgdmFyaWFudCBjb21wYXJlZCB0byB0aGUgb3RoZXIgYXZhaWxhYmxlIHZhcmlhbnRzLCBpbmRlcGVuZGVudAogICAgb2YgdGhlIGNsaWVudCdzIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGUsIGEgSlBFRyBmaWxlIGlzCiAgICB1c3VhbGx5IG9mIGhpZ2hlciBzb3VyY2UgcXVhbGl0eSB0aGFuIGFuIEFTQ0lJIGZpbGUgaWYgaXQgaXMKICAgIGF0dGVtcHRpbmcgdG8gcmVwcmVzZW50IGEgcGhvdG9ncmFwaC4gSG93ZXZlciwgaWYgdGhlIHJlc291cmNlCiAgICBiZWluZyByZXByZXNlbnRlZCBpcyBhbiBvcmlnaW5hbCBBU0NJSSBhcnQsIHRoZW4gYW4gQVNDSUkKICAgIHJlcHJlc2VudGF0aW9uIHdvdWxkIGhhdmUgYSBoaWdoZXIgc291cmNlIHF1YWxpdHkgdGhhbiBhIEpQRUcKICAgIHJlcHJlc2VudGF0aW9uLiBBIHFzIHZhbHVlIGlzIHRoZXJlZm9yZSBzcGVjaWZpYyB0byBhIGdpdmVuCiAgICB2YXJpYW50IGRlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHRoZSByZXNvdXJjZSBpdAogICAgcmVwcmVzZW50cy48L3A+CgogICAgPHA+VGhlIGZ1bGwgbGlzdCBvZiBoZWFkZXJzIHJlY29nbml6ZWQgaXMgYXZhaWxhYmxlIGluIHRoZSA8YSBocmVmPSJtb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjdHlwZW1hcHMiPm1vZF9uZWdvdGlhdGlvbgogICAgdHlwZW1hcDwvYT4gZG9jdW1lbnRhdGlvbi48L3A+CgoKPGgzPjxhIG5hbWU9Im11bHRpdmlld3MiIGlkPSJtdWx0aXZpZXdzIj5NdWx0aXZpZXdzPC9hPjwvaDM+CgogICAgPHA+PGNvZGU+TXVsdGlWaWV3czwvY29kZT4gaXMgYSBwZXItZGlyZWN0b3J5IG9wdGlvbiwgbWVhbmluZyBpdAogICAgY2FuIGJlIHNldCB3aXRoIGFuIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL2NvcmUuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjwvY29kZT4KICAgIGRpcmVjdGl2ZSB3aXRoaW4gYSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvYT48L2NvZGU+LCA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L2E+PC9jb2RlPiBvciA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuL21vZC9jb3JlLmh0bWwjZmlsZXMiPiZsdDtGaWxlcyZndDs8L2E+PC9jb2RlPiBzZWN0aW9uIGluCiAgICA8Y29kZT5odHRwZC5jb25mPC9jb2RlPiwgb3IgKGlmIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9hPjwvY29kZT4gaXMgcHJvcGVybHkgc2V0KSBpbgogICAgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlcy4gTm90ZSB0aGF0IDxjb2RlPk9wdGlvbnMgQWxsPC9jb2RlPgogICAgZG9lcyBub3Qgc2V0IDxjb2RlPk11bHRpVmlld3M8L2NvZGU+OyB5b3UgaGF2ZSB0byBhc2sgZm9yIGl0IGJ5CiAgICBuYW1lLjwvcD4KCiAgICA8cD5UaGUgZWZmZWN0IG9mIDxjb2RlPk11bHRpVmlld3M8L2NvZGU+IGlzIGFzIGZvbGxvd3M6IGlmIHRoZQogICAgc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgPGNvZGU+L3NvbWUvZGlyL2ZvbzwvY29kZT4sIGlmCiAgICA8Y29kZT4vc29tZS9kaXI8L2NvZGU+IGhhcyA8Y29kZT5NdWx0aVZpZXdzPC9jb2RlPiBlbmFibGVkLCBhbmQKICAgIDxjb2RlPi9zb21lL2Rpci9mb288L2NvZGU+IGRvZXMgPGVtPm5vdDwvZW0+IGV4aXN0LCB0aGVuIHRoZQogICAgc2VydmVyIHJlYWRzIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IgZmlsZXMgbmFtZWQgZm9vLiosIGFuZAogICAgZWZmZWN0aXZlbHkgZmFrZXMgdXAgYSB0eXBlIG1hcCB3aGljaCBuYW1lcyBhbGwgdGhvc2UgZmlsZXMsCiAgICBhc3NpZ25pbmcgdGhlbSB0aGUgc2FtZSBtZWRpYSB0eXBlcyBhbmQgY29udGVudC1lbmNvZGluZ3MgaXQKICAgIHdvdWxkIGhhdmUgaWYgdGhlIGNsaWVudCBoYWQgYXNrZWQgZm9yIG9uZSBvZiB0aGVtIGJ5IG5hbWUuIEl0CiAgICB0aGVuIGNob29zZXMgdGhlIGJlc3QgbWF0Y2ggdG8gdGhlIGNsaWVudCdzIHJlcXVpcmVtZW50cy48L3A+CgogICAgPHA+PGNvZGU+TXVsdGlWaWV3czwvY29kZT4gbWF5IGFsc28gYXBwbHkgdG8gc2VhcmNoZXMgZm9yIHRoZSBmaWxlCiAgICBuYW1lZCBieSB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvYT48L2NvZGU+IGRpcmVjdGl2ZSwgaWYgdGhlCiAgICBzZXJ2ZXIgaXMgdHJ5aW5nIHRvIGluZGV4IGEgZGlyZWN0b3J5LiBJZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcwogICAgc3BlY2lmeTwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+RGlyZWN0b3J5SW5kZXggaW5kZXg8L2NvZGU+PC9wPjwvZGl2PgogICAgPHA+dGhlbiB0aGUgc2VydmVyIHdpbGwgYXJiaXRyYXRlIGJldHdlZW4gPGNvZGU+aW5kZXguaHRtbDwvY29kZT4KICAgIGFuZCA8Y29kZT5pbmRleC5odG1sMzwvY29kZT4gaWYgYm90aCBhcmUgcHJlc2VudC4gSWYgbmVpdGhlcgogICAgYXJlIHByZXNlbnQsIGFuZCA8Y29kZT5pbmRleC5jZ2k8L2NvZGU+IGlzIHRoZXJlLCB0aGUgc2VydmVyCiAgICB3aWxsIHJ1biBpdC48L3A+CgogICAgPHA+SWYgb25lIG9mIHRoZSBmaWxlcyBmb3VuZCB3aGVuIHJlYWRpbmcgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdAogICAgaGF2ZSBhbiBleHRlbnNpb24gcmVjb2duaXplZCBieSA8Y29kZT5tb2RfbWltZTwvY29kZT4gdG8gZGVzaWduYXRlCiAgICBpdHMgQ2hhcnNldCwgQ29udGVudC1UeXBlLCBMYW5ndWFnZSwgb3IgRW5jb2RpbmcsIHRoZW4gdGhlIHJlc3VsdAogICAgZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBvZiB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX21pbWUuaHRtbCNtdWx0aXZpZXdzbWF0Y2giPk11bHRpVmlld3NNYXRjaDwvYT48L2NvZGU+IGRpcmVjdGl2ZS4gIFRoaXMKICAgIGRpcmVjdGl2ZSBkZXRlcm1pbmVzIHdoZXRoZXIgaGFuZGxlcnMsIGZpbHRlcnMsIGFuZCBvdGhlcgogICAgZXh0ZW5zaW9uIHR5cGVzIGNhbiBwYXJ0aWNpcGF0ZSBpbiBNdWx0aVZpZXdzIG5lZ290aWF0aW9uLjwvcD4KCjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0ibWV0aG9kcyIgaWQ9Im1ldGhvZHMiPlRoZSBOZWdvdGlhdGlvbiBNZXRob2RzPC9hPjwvaDI+CgogICAgPHA+QWZ0ZXIgaHR0cGQgaGFzIG9idGFpbmVkIGEgbGlzdCBvZiB0aGUgdmFyaWFudHMgZm9yIGEgZ2l2ZW4KICAgIHJlc291cmNlLCBlaXRoZXIgZnJvbSBhIHR5cGUtbWFwIGZpbGUgb3IgZnJvbSB0aGUgZmlsZW5hbWVzIGluCiAgICB0aGUgZGlyZWN0b3J5LCBpdCBpbnZva2VzIG9uZSBvZiB0d28gbWV0aG9kcyB0byBkZWNpZGUgb24gdGhlCiAgICAnYmVzdCcgdmFyaWFudCB0byByZXR1cm4sIGlmIGFueS4gSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBrbm93CiAgICBhbnkgb2YgdGhlIGRldGFpbHMgb2YgaG93IG5lZ290aWF0aW9uIGFjdHVhbGx5IHRha2VzIHBsYWNlIGluCiAgICBvcmRlciB0byB1c2UgaHR0cGQncyBjb250ZW50IG5lZ290aWF0aW9uIGZlYXR1cmVzLiBIb3dldmVyIHRoZQogICAgcmVzdCBvZiB0aGlzIGRvY3VtZW50IGV4cGxhaW5zIHRoZSBtZXRob2RzIHVzZWQgZm9yIHRob3NlCiAgICBpbnRlcmVzdGVkLiA8L3A+CgogICAgPHA+VGhlcmUgYXJlIHR3byBuZWdvdGlhdGlvbiBtZXRob2RzOjwvcD4KCiAgICA8b2w+CiAgICAgIDxsaT48c3Ryb25nPlNlcnZlciBkcml2ZW4gbmVnb3RpYXRpb24gd2l0aCB0aGUgaHR0cGQKICAgICAgYWxnb3JpdGhtPC9zdHJvbmc+IGlzIHVzZWQgaW4gdGhlIG5vcm1hbCBjYXNlLiBUaGUgaHR0cGQKICAgICAgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4gV2hlbiB0aGlzCiAgICAgIGFsZ29yaXRobSBpcyB1c2VkLCBodHRwZCBjYW4gc29tZXRpbWVzICdmaWRkbGUnIHRoZSBxdWFsaXR5CiAgICAgIGZhY3RvciBvZiBhIHBhcnRpY3VsYXIgZGltZW5zaW9uIHRvIGFjaGlldmUgYSBiZXR0ZXIgcmVzdWx0LgogICAgICBUaGUgd2F5cyBodHRwZCBjYW4gZmlkZGxlIHF1YWxpdHkgZmFjdG9ycyBpcyBleHBsYWluZWQgaW4KICAgICAgbW9yZSBkZXRhaWwgYmVsb3cuPC9saT4KCiAgICAgIDxsaT48c3Ryb25nPlRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb248L3N0cm9uZz4gaXMgdXNlZAogICAgICB3aGVuIHRoZSBicm93c2VyIHNwZWNpZmljYWxseSByZXF1ZXN0cyB0aGlzIHRocm91Z2ggdGhlCiAgICAgIG1lY2hhbmlzbSBkZWZpbmVkIGluIFJGQyAyMjk1LiBUaGlzIG5lZ290aWF0aW9uIG1ldGhvZCBnaXZlcwogICAgICB0aGUgYnJvd3NlciBmdWxsIGNvbnRyb2wgb3ZlciBkZWNpZGluZyBvbiB0aGUgJ2Jlc3QnIHZhcmlhbnQsCiAgICAgIHRoZSByZXN1bHQgaXMgdGhlcmVmb3JlIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMgYWxnb3JpdGhtcwogICAgICB1c2VkIGJ5IHRoZSBicm93c2VyLiBBcyBwYXJ0IG9mIHRoZSB0cmFuc3BhcmVudCBuZWdvdGlhdGlvbgogICAgICBwcm9jZXNzLCB0aGUgYnJvd3NlciBjYW4gYXNrIGh0dHBkIHRvIHJ1biB0aGUgJ3JlbW90ZQogICAgICB2YXJpYW50IHNlbGVjdGlvbiBhbGdvcml0aG0nIGRlZmluZWQgaW4gUkZDIDIyOTYuPC9saT4KICAgIDwvb2w+Cgo8aDM+PGEgbmFtZT0iZGltZW5zaW9ucyIgaWQ9ImRpbWVuc2lvbnMiPkRpbWVuc2lvbnMgb2YgTmVnb3RpYXRpb248L2E+PC9oMz4KCiAgICA8dGFibGU+CiAgICAgIAogICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgIDx0aD5EaW1lbnNpb248L3RoPgoKICAgICAgICA8dGg+Tm90ZXM8L3RoPgogICAgICA8L3RyPgoKICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICA8dGQ+TWVkaWEgVHlwZTwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZSA8Y29kZT5BY2NlcHQ8L2NvZGU+CiAgICAgICAgaGVhZGVyIGZpZWxkLiBFYWNoIGl0ZW0gY2FuIGhhdmUgYW4gYXNzb2NpYXRlZCBxdWFsaXR5IGZhY3Rvci4KICAgICAgICBWYXJpYW50IGRlc2NyaXB0aW9uIGNhbiBhbHNvIGhhdmUgYSBxdWFsaXR5IGZhY3RvciAodGhlICJxcyIKICAgICAgICBwYXJhbWV0ZXIpLjwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHIgdmFsaWduPSJ0b3AiPgogICAgICAgIDx0ZD5MYW5ndWFnZTwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZQogICAgICAgIDxjb2RlPkFjY2VwdC1MYW5ndWFnZTwvY29kZT4gaGVhZGVyIGZpZWxkLiBFYWNoIGl0ZW0gY2FuIGhhdmUKICAgICAgICBhIHF1YWxpdHkgZmFjdG9yLiBWYXJpYW50cyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG5vbmUsIG9uZSBvcgogICAgICAgIG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UuPC90ZD4KICAgICAgPC90cj4KCiAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgPHRkPkVuY29kaW5nPC90ZD4KCiAgICAgICAgPHRkPkJyb3dzZXIgaW5kaWNhdGVzIHByZWZlcmVuY2Ugd2l0aCB0aGUKICAgICAgICA8Y29kZT5BY2NlcHQtRW5jb2Rpbmc8L2NvZGU+IGhlYWRlciBmaWVsZC4gRWFjaCBpdGVtIGNhbiBoYXZlCiAgICAgICAgYSBxdWFsaXR5IGZhY3Rvci48L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICA8dGQ+Q2hhcnNldDwvdGQ+CgogICAgICAgIDx0ZD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlIHdpdGggdGhlCiAgICAgICAgPGNvZGU+QWNjZXB0LUNoYXJzZXQ8L2NvZGU+IGhlYWRlciBmaWVsZC4gRWFjaCBpdGVtIGNhbiBoYXZlIGEKICAgICAgICBxdWFsaXR5IGZhY3Rvci4gVmFyaWFudHMgY2FuIGluZGljYXRlIGEgY2hhcnNldCBhcyBhIHBhcmFtZXRlcgogICAgICAgIG9mIHRoZSBtZWRpYSB0eXBlLjwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgoKCjxoMz48YSBuYW1lPSJhbGdvcml0aG0iIGlkPSJhbGdvcml0aG0iPmh0dHBkIE5lZ290aWF0aW9uIEFsZ29yaXRobTwvYT48L2gzPgoKICAgIDxwPmh0dHBkIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gdG8gc2VsZWN0IHRoZSAnYmVzdCcKICAgIHZhcmlhbnQgKGlmIGFueSkgdG8gcmV0dXJuIHRvIHRoZSBicm93c2VyLiBUaGlzIGFsZ29yaXRobSBpcwogICAgbm90IGZ1cnRoZXIgY29uZmlndXJhYmxlLiBJdCBvcGVyYXRlcyBhcyBmb2xsb3dzOjwvcD4KCiAgICA8b2w+CiAgICAgIDxsaT5GaXJzdCwgZm9yIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBuZWdvdGlhdGlvbiwgY2hlY2sgdGhlCiAgICAgIGFwcHJvcHJpYXRlIDxlbT5BY2NlcHQqPC9lbT4gaGVhZGVyIGZpZWxkIGFuZCBhc3NpZ24gYQogICAgICBxdWFsaXR5IHRvIGVhY2ggdmFyaWFudC4gSWYgdGhlIDxlbT5BY2NlcHQqPC9lbT4gaGVhZGVyIGZvcgogICAgICBhbnkgZGltZW5zaW9uIGltcGxpZXMgdGhhdCB0aGlzIHZhcmlhbnQgaXMgbm90IGFjY2VwdGFibGUsCiAgICAgIGVsaW1pbmF0ZSBpdC4gSWYgbm8gdmFyaWFudHMgcmVtYWluLCBnbyB0byBzdGVwIDQuPC9saT4KCiAgICAgIDxsaT4KICAgICAgICBTZWxlY3QgdGhlICdiZXN0JyB2YXJpYW50IGJ5IGEgcHJvY2VzcyBvZiBlbGltaW5hdGlvbi4gRWFjaAogICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgaXMgYXBwbGllZCBpbiBvcmRlci4gQW55IHZhcmlhbnRzCiAgICAgICAgbm90IHNlbGVjdGVkIGF0IGVhY2ggdGVzdCBhcmUgZWxpbWluYXRlZC4gQWZ0ZXIgZWFjaCB0ZXN0LAogICAgICAgIGlmIG9ubHkgb25lIHZhcmlhbnQgcmVtYWlucywgc2VsZWN0IGl0IGFzIHRoZSBiZXN0IG1hdGNoCiAgICAgICAgYW5kIHByb2NlZWQgdG8gc3RlcCAzLiBJZiBtb3JlIHRoYW4gb25lIHZhcmlhbnQgcmVtYWlucywKICAgICAgICBtb3ZlIG9uIHRvIHRoZSBuZXh0IHRlc3QuIAoKICAgICAgICA8b2w+CiAgICAgICAgICA8bGk+TXVsdGlwbHkgdGhlIHF1YWxpdHkgZmFjdG9yIGZyb20gdGhlIDxjb2RlPkFjY2VwdDwvY29kZT4KICAgICAgICAgIGhlYWRlciB3aXRoIHRoZSBxdWFsaXR5LW9mLXNvdXJjZSBmYWN0b3IgZm9yIHRoaXMgdmFyaWFudHMKICAgICAgICAgIG1lZGlhIHR5cGUsIGFuZCBzZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGhpZ2hlc3QKICAgICAgICAgIHZhbHVlLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgaGlnaGVzdCBsYW5ndWFnZSBxdWFsaXR5CiAgICAgICAgICBmYWN0b3IuPC9saT4KCiAgICAgICAgICA8bGk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBiZXN0IGxhbmd1YWdlIG1hdGNoLAogICAgICAgICAgdXNpbmcgZWl0aGVyIHRoZSBvcmRlciBvZiBsYW5ndWFnZXMgaW4gdGhlCiAgICAgICAgICA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+IGhlYWRlciAoaWYgcHJlc2VudCksIG9yIGVsc2UKICAgICAgICAgIHRoZSBvcmRlciBvZiBsYW5ndWFnZXMgaW4gdGhlIDxjb2RlPkxhbmd1YWdlUHJpb3JpdHk8L2NvZGU+CiAgICAgICAgICBkaXJlY3RpdmUgKGlmIHByZXNlbnQpLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgaGlnaGVzdCAnbGV2ZWwnIG1lZGlhCiAgICAgICAgICBwYXJhbWV0ZXIgKHVzZWQgdG8gZ2l2ZSB0aGUgdmVyc2lvbiBvZiB0ZXh0L2h0bWwgbWVkaWEKICAgICAgICAgIHR5cGVzKS48L2xpPgoKICAgICAgICAgIDxsaT5TZWxlY3QgdmFyaWFudHMgd2l0aCB0aGUgYmVzdCBjaGFyc2V0IG1lZGlhCiAgICAgICAgICBwYXJhbWV0ZXJzLCBhcyBnaXZlbiBvbiB0aGUgPGNvZGU+QWNjZXB0LUNoYXJzZXQ8L2NvZGU+CiAgICAgICAgICBoZWFkZXIgbGluZS4gIENoYXJzZXQgSVNPLTg4NTktMSBpcyBhY2NlcHRhYmxlIHVubGVzcwogICAgICAgICAgZXhwbGljaXRseSBleGNsdWRlZC4gVmFyaWFudHMgd2l0aCBhIDxjb2RlPnRleHQvKjwvY29kZT4KICAgICAgICAgIG1lZGlhIHR5cGUgYnV0IG5vdCBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIKICAgICAgICAgIGNoYXJzZXQgYXJlIGFzc3VtZWQgdG8gYmUgaW4gSVNPLTg4NTktMS48L2xpPgoKICAgICAgICAgIDxsaT5TZWxlY3QgdGhvc2UgdmFyaWFudHMgd2hpY2ggaGF2ZSBhc3NvY2lhdGVkIGNoYXJzZXQKICAgICAgICAgIG1lZGlhIHBhcmFtZXRlcnMgdGhhdCBhcmUgPGVtPm5vdDwvZW0+IElTTy04ODU5LTEuIElmCiAgICAgICAgICB0aGVyZSBhcmUgbm8gc3VjaCB2YXJpYW50cywgc2VsZWN0IGFsbCB2YXJpYW50cwogICAgICAgICAgaW5zdGVhZC48L2xpPgoKICAgICAgICAgIDxsaT5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGJlc3QgZW5jb2RpbmcuIElmIHRoZXJlCiAgICAgICAgICBhcmUgdmFyaWFudHMgd2l0aCBhbiBlbmNvZGluZyB0aGF0IGlzIGFjY2VwdGFibGUgdG8gdGhlCiAgICAgICAgICB1c2VyLWFnZW50LCBzZWxlY3Qgb25seSB0aGVzZSB2YXJpYW50cy4gT3RoZXJ3aXNlIGlmCiAgICAgICAgICB0aGVyZSBpcyBhIG1peCBvZiBlbmNvZGVkIGFuZCBub24tZW5jb2RlZCB2YXJpYW50cywKICAgICAgICAgIHNlbGVjdCBvbmx5IHRoZSB1bmVuY29kZWQgdmFyaWFudHMuIElmIGVpdGhlciBhbGwKICAgICAgICAgIHZhcmlhbnRzIGFyZSBlbmNvZGVkIG9yIGFsbCB2YXJpYW50cyBhcmUgbm90IGVuY29kZWQsCiAgICAgICAgICBzZWxlY3QgYWxsIHZhcmlhbnRzLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgc21hbGxlc3QgY29udGVudAogICAgICAgICAgbGVuZ3RoLjwvbGk+CgogICAgICAgICAgPGxpPlNlbGVjdCB0aGUgZmlyc3QgdmFyaWFudCBvZiB0aG9zZSByZW1haW5pbmcuIFRoaXMKICAgICAgICAgIHdpbGwgYmUgZWl0aGVyIHRoZSBmaXJzdCBsaXN0ZWQgaW4gdGhlIHR5cGUtbWFwIGZpbGUsIG9yCiAgICAgICAgICB3aGVuIHZhcmlhbnRzIGFyZSByZWFkIGZyb20gdGhlIGRpcmVjdG9yeSwgdGhlIG9uZSB3aG9zZQogICAgICAgICAgZmlsZSBuYW1lIGNvbWVzIGZpcnN0IHdoZW4gc29ydGVkIHVzaW5nIEFTQ0lJIGNvZGUKICAgICAgICAgIG9yZGVyLjwvbGk+CiAgICAgICAgPC9vbD4KICAgICAgPC9saT4KCiAgICAgIDxsaT5UaGUgYWxnb3JpdGhtIGhhcyBub3cgc2VsZWN0ZWQgb25lICdiZXN0JyB2YXJpYW50LCBzbwogICAgICByZXR1cm4gaXQgYXMgdGhlIHJlc3BvbnNlLiBUaGUgSFRUUCByZXNwb25zZSBoZWFkZXIKICAgICAgPGNvZGU+VmFyeTwvY29kZT4gaXMgc2V0IHRvIGluZGljYXRlIHRoZSBkaW1lbnNpb25zIG9mCiAgICAgIG5lZ290aWF0aW9uIChicm93c2VycyBhbmQgY2FjaGVzIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB3aGVuCiAgICAgIGNhY2hpbmcgdGhlIHJlc291cmNlKS4gIEVuZC48L2xpPgoKICAgICAgPGxpPlRvIGdldCBoZXJlIG1lYW5zIG5vIHZhcmlhbnQgd2FzIHNlbGVjdGVkIChiZWNhdXNlIG5vbmUKICAgICAgYXJlIGFjY2VwdGFibGUgdG8gdGhlIGJyb3dzZXIpLiBSZXR1cm4gYSA0MDYgc3RhdHVzIChtZWFuaW5nCiAgICAgICJObyBhY2NlcHRhYmxlIHJlcHJlc2VudGF0aW9uIikgd2l0aCBhIHJlc3BvbnNlIGJvZHkKICAgICAgY29uc2lzdGluZyBvZiBhbiBIVE1MIGRvY3VtZW50IGxpc3RpbmcgdGhlIGF2YWlsYWJsZQogICAgICB2YXJpYW50cy4gQWxzbyBzZXQgdGhlIEhUVFAgPGNvZGU+VmFyeTwvY29kZT4gaGVhZGVyIHRvCiAgICAgIGluZGljYXRlIHRoZSBkaW1lbnNpb25zIG9mIHZhcmlhbmNlLjwvbGk+CiAgICA8L29sPgoKPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJiZXR0ZXIiIGlkPSJiZXR0ZXIiPkZpZGRsaW5nIHdpdGggUXVhbGl0eQogICAgVmFsdWVzPC9hPjwvaDI+CgogICAgPHA+aHR0cGQgc29tZXRpbWVzIGNoYW5nZXMgdGhlIHF1YWxpdHkgdmFsdWVzIGZyb20gd2hhdCB3b3VsZAogICAgYmUgZXhwZWN0ZWQgYnkgYSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGh0dHBkCiAgICBuZWdvdGlhdGlvbiBhbGdvcml0aG0gYWJvdmUuIFRoaXMgaXMgdG8gZ2V0IGEgYmV0dGVyIHJlc3VsdAogICAgZnJvbSB0aGUgYWxnb3JpdGhtIGZvciBicm93c2VycyB3aGljaCBkbyBub3Qgc2VuZCBmdWxsIG9yCiAgICBhY2N1cmF0ZSBpbmZvcm1hdGlvbi4gU29tZSBvZiB0aGUgbW9zdCBwb3B1bGFyIGJyb3dzZXJzIHNlbmQKICAgIDxjb2RlPkFjY2VwdDwvY29kZT4gaGVhZGVyIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG90aGVyd2lzZQogICAgcmVzdWx0IGluIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHdyb25nIHZhcmlhbnQgaW4gbWFueSBjYXNlcy4gSWYgYQogICAgYnJvd3NlciBzZW5kcyBmdWxsIGFuZCBjb3JyZWN0IGluZm9ybWF0aW9uIHRoZXNlIGZpZGRsZXMgd2lsbCBub3QKICAgIGJlIGFwcGxpZWQuPC9wPgoKPGgzPjxhIG5hbWU9IndpbGRjYXJkcyIgaWQ9IndpbGRjYXJkcyI+TWVkaWEgVHlwZXMgYW5kIFdpbGRjYXJkczwvYT48L2gzPgoKICAgIDxwPlRoZSA8Y29kZT5BY2NlcHQ6PC9jb2RlPiByZXF1ZXN0IGhlYWRlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZXMKICAgIGZvciBtZWRpYSB0eXBlcy4gSXQgY2FuIGFsc28gaW5jbHVkZSAnd2lsZGNhcmQnIG1lZGlhIHR5cGVzLCBzdWNoCiAgICBhcyAiaW1hZ2UvKiIgb3IgIiovKiIgd2hlcmUgdGhlICogbWF0Y2hlcyBhbnkgc3RyaW5nLiBTbyBhIHJlcXVlc3QKICAgIGluY2x1ZGluZzo8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT5BY2NlcHQ6IGltYWdlLyosICovKjwvY29kZT48L3A+PC9kaXY+CgogICAgPHA+d291bGQgaW5kaWNhdGUgdGhhdCBhbnkgdHlwZSBzdGFydGluZyAiaW1hZ2UvIiBpcyBhY2NlcHRhYmxlLAogICAgYXMgaXMgYW55IG90aGVyIHR5cGUuCiAgICBTb21lIGJyb3dzZXJzIHJvdXRpbmVseSBzZW5kIHdpbGRjYXJkcyBpbiBhZGRpdGlvbiB0byBleHBsaWNpdAogICAgdHlwZXMgdGhleSBjYW4gaGFuZGxlLiBGb3IgZXhhbXBsZTo8L3A+Cgo8ZGl2IGNsYXNzPSJleGFtcGxlIj48cD48Y29kZT4KICBBY2NlcHQ6IHRleHQvaHRtbCwgdGV4dC9wbGFpbiwgaW1hZ2UvZ2lmLCBpbWFnZS9qcGVnLCAqLyoKPC9jb2RlPjwvcD48L2Rpdj4KICAgIDxwPlRoZSBpbnRlbnRpb24gb2YgdGhpcyBpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBleHBsaWNpdGx5IGxpc3RlZAogICAgdHlwZXMgYXJlIHByZWZlcnJlZCwgYnV0IGlmIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIGlzCiAgICBhdmFpbGFibGUsIHRoYXQgaXMgb2sgdG9vLiAgVXNpbmcgZXhwbGljaXQgcXVhbGl0eSB2YWx1ZXMsCiAgICB3aGF0IHRoZSBicm93c2VyIHJlYWxseSB3YW50cyBpcyBzb21ldGhpbmcgbGlrZTo8L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPjxjb2RlPgogIEFjY2VwdDogdGV4dC9odG1sLCB0ZXh0L3BsYWluLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICovKjsgcT0wLjAxCjwvY29kZT48L3A+PC9kaXY+CiAgICA8cD5UaGUgZXhwbGljaXQgdHlwZXMgaGF2ZSBubyBxdWFsaXR5IGZhY3Rvciwgc28gdGhleSBkZWZhdWx0IHRvIGEKICAgIHByZWZlcmVuY2Ugb2YgMS4wICh0aGUgaGlnaGVzdCkuIFRoZSB3aWxkY2FyZCAqLyogaXMgZ2l2ZW4gYQogICAgbG93IHByZWZlcmVuY2Ugb2YgMC4wMSwgc28gb3RoZXIgdHlwZXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGlmCiAgICBubyB2YXJpYW50IG1hdGNoZXMgYW4gZXhwbGljaXRseSBsaXN0ZWQgdHlwZS48L3A+CgogICAgPHA+SWYgdGhlIDxjb2RlPkFjY2VwdDo8L2NvZGU+IGhlYWRlciBjb250YWlucyA8ZW0+bm88L2VtPiBxCiAgICBmYWN0b3JzIGF0IGFsbCwgaHR0cGQgc2V0cyB0aGUgcSB2YWx1ZSBvZiAiKi8qIiwgaWYgcHJlc2VudCwgdG8KICAgIDAuMDEgdG8gZW11bGF0ZSB0aGUgZGVzaXJlZCBiZWhhdmlvci4gSXQgYWxzbyBzZXRzIHRoZSBxIHZhbHVlIG9mCiAgICB3aWxkY2FyZHMgb2YgdGhlIGZvcm1hdCAidHlwZS8qIiB0byAwLjAyIChzbyB0aGVzZSBhcmUgcHJlZmVycmVkCiAgICBvdmVyIG1hdGNoZXMgYWdhaW5zdCAiKi8qIi4gSWYgYW55IG1lZGlhIHR5cGUgb24gdGhlCiAgICA8Y29kZT5BY2NlcHQ6PC9jb2RlPiBoZWFkZXIgY29udGFpbnMgYSBxIGZhY3RvciwgdGhlc2Ugc3BlY2lhbAogICAgdmFsdWVzIGFyZSA8ZW0+bm90PC9lbT4gYXBwbGllZCwgc28gcmVxdWVzdHMgZnJvbSBicm93c2VycyB3aGljaAogICAgc2VuZCB0aGUgZXhwbGljaXQgaW5mb3JtYXRpb24gdG8gc3RhcnQgd2l0aCB3b3JrIGFzIGV4cGVjdGVkLjwvcD4KCgo8aDM+PGEgbmFtZT0iZXhjZXB0aW9ucyIgaWQ9ImV4Y2VwdGlvbnMiPkxhbmd1YWdlIE5lZ290aWF0aW9uIEV4Y2VwdGlvbnM8L2E+PC9oMz4KCiAgICA8cD5OZXcgaW4gaHR0cGQgMi4wLCBzb21lIGV4Y2VwdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZQogICAgbmVnb3RpYXRpb24gYWxnb3JpdGhtIHRvIGFsbG93IGdyYWNlZnVsIGZhbGxiYWNrIHdoZW4gbGFuZ3VhZ2UKICAgIG5lZ290aWF0aW9uIGZhaWxzIHRvIGZpbmQgYSBtYXRjaC48L3A+CgogICAgPHA+V2hlbiBhIGNsaWVudCByZXF1ZXN0cyBhIHBhZ2Ugb24geW91ciBzZXJ2ZXIsIGJ1dCB0aGUgc2VydmVyCiAgICBjYW5ub3QgZmluZCBhIHNpbmdsZSBwYWdlIHRoYXQgbWF0Y2hlcyB0aGUKICAgIDxjb2RlPkFjY2VwdC1sYW5ndWFnZTwvY29kZT4gc2VudCBieQogICAgdGhlIGJyb3dzZXIsIHRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gZWl0aGVyIGEgIk5vIEFjY2VwdGFibGUKICAgIFZhcmlhbnQiIG9yICJNdWx0aXBsZSBDaG9pY2VzIiByZXNwb25zZSB0byB0aGUgY2xpZW50LiAgVG8gYXZvaWQKICAgIHRoZXNlIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyBwb3NzaWJsZSB0byBjb25maWd1cmUgaHR0cGQgdG8gaWdub3JlCiAgICB0aGUgPGNvZGU+QWNjZXB0LWxhbmd1YWdlPC9jb2RlPiBpbiB0aGVzZSBjYXNlcyBhbmQgcHJvdmlkZSBhCiAgICBkb2N1bWVudCB0aGF0IGRvZXMgbm90IGV4cGxpY2l0bHkgbWF0Y2ggdGhlIGNsaWVudCdzIHJlcXVlc3QuICBUaGUKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sI2ZvcmNlbGFuZ3VhZ2Vwcmlvcml0eSI+Rm9yY2VMYW5ndWFnZVByaW9yaXR5PC9hPjwvY29kZT4KICAgIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBvbmUgb3IgYm90aCBvZiB0aGVzZSBlcnJvcgogICAgbWVzc2FnZXMgYW5kIHN1YnN0aXR1dGUgdGhlIHNlcnZlcnMganVkZ2VtZW50IGluIHRoZSBmb3JtIG9mIHRoZQogICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvYT48L2NvZGU+CiAgICBkaXJlY3RpdmUuPC9wPgoKICAgIDxwPlRoZSBzZXJ2ZXIgd2lsbCBhbHNvIGF0dGVtcHQgdG8gbWF0Y2ggbGFuZ3VhZ2Utc3Vic2V0cyB3aGVuIG5vCiAgICBvdGhlciBtYXRjaCBjYW4gYmUgZm91bmQuICBGb3IgZXhhbXBsZSwgaWYgYSBjbGllbnQgcmVxdWVzdHMKICAgIGRvY3VtZW50cyB3aXRoIHRoZSBsYW5ndWFnZSA8Y29kZT5lbi1HQjwvY29kZT4gZm9yIEJyaXRpc2gKICAgIEVuZ2xpc2gsIHRoZSBzZXJ2ZXIgaXMgbm90IG5vcm1hbGx5IGFsbG93ZWQgYnkgdGhlIEhUVFAvMS4xCiAgICBzdGFuZGFyZCB0byBtYXRjaCB0aGF0IGFnYWluc3QgYSBkb2N1bWVudCB0aGF0IGlzIG1hcmtlZCBhcyBzaW1wbHkKICAgIDxjb2RlPmVuPC9jb2RlPi4gIChOb3RlIHRoYXQgaXQgaXMgYWxtb3N0IHN1cmVseSBhIGNvbmZpZ3VyYXRpb24KICAgIGVycm9yIHRvIGluY2x1ZGUgPGNvZGU+ZW4tR0I8L2NvZGU+IGFuZCBub3QgPGNvZGU+ZW48L2NvZGU+IGluIHRoZQogICAgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPiBoZWFkZXIsIHNpbmNlIGl0IGlzIHZlcnkgdW5saWtlbHkKICAgIHRoYXQgYSByZWFkZXIgdW5kZXJzdGFuZHMgQnJpdGlzaCBFbmdsaXNoLCBidXQgZG9lc24ndCB1bmRlcnN0YW5kCiAgICBFbmdsaXNoIGluIGdlbmVyYWwuICBVbmZvcnR1bmF0ZWx5LCBtYW55IGN1cnJlbnQgY2xpZW50cyBoYXZlCiAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIHRoYXQgcmVzZW1ibGUgdGhpcy4pICBIb3dldmVyLCBpZiBubyBvdGhlcgogICAgbGFuZ3VhZ2UgbWF0Y2ggaXMgcG9zc2libGUgYW5kIHRoZSBzZXJ2ZXIgaXMgYWJvdXQgdG8gcmV0dXJuIGEgIk5vCiAgICBBY2NlcHRhYmxlIFZhcmlhbnRzIiBlcnJvciBvciBmYWxsYmFjayB0byB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvYT48L2NvZGU+LCB0aGUgc2VydmVyCiAgICB3aWxsIGlnbm9yZSB0aGUgc3Vic2V0IHNwZWNpZmljYXRpb24gYW5kIG1hdGNoIDxjb2RlPmVuLUdCPC9jb2RlPgogICAgYWdhaW5zdCA8Y29kZT5lbjwvY29kZT4gZG9jdW1lbnRzLiAgSW1wbGljaXRseSwgaHR0cGQgd2lsbCBhZGQKICAgIHRoZSBwYXJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGNsaWVudCdzIGFjY2VwdGFibGUgbGFuZ3VhZ2UgbGlzdCB3aXRoCiAgICBhIHZlcnkgbG93IHF1YWxpdHkgdmFsdWUuICBCdXQgbm90ZSB0aGF0IGlmIHRoZSBjbGllbnQgcmVxdWVzdHMKICAgICJlbi1HQjsgcT0wLjksIGZyOyBxPTAuOCIsIGFuZCB0aGUgc2VydmVyIGhhcyBkb2N1bWVudHMKICAgIGRlc2lnbmF0ZWQgImVuIiBhbmQgImZyIiwgdGhlbiB0aGUgImZyIiBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkLgogICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFpbnRhaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBIVFRQLzEuMQogICAgc3BlY2lmaWNhdGlvbiBhbmQgdG8gd29yayBlZmZlY3RpdmVseSB3aXRoIHByb3Blcmx5IGNvbmZpZ3VyZWQKICAgIGNsaWVudHMuPC9wPgoKICAgIDxwPkluIG9yZGVyIHRvIHN1cHBvcnQgYWR2YW5jZWQgdGVjaG5pcXVlcyAoc3VjaCBhcyBjb29raWVzIG9yCiAgICBzcGVjaWFsIFVSTC1wYXRocykgdG8gZGV0ZXJtaW5lIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlLAogICAgc2luY2UgaHR0cGQgMi4wLjQ3IDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L2E+PC9jb2RlPiByZWNvZ25pemVzCiAgICB0aGUgPGEgaHJlZj0iZW52Lmh0bWwiPmVudmlyb25tZW50IHZhcmlhYmxlPC9hPgogICAgPGNvZGU+cHJlZmVyLWxhbmd1YWdlPC9jb2RlPi4gSWYgaXQgZXhpc3RzIGFuZCBjb250YWlucyBhbgogICAgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgdGFnLCA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9hPjwvY29kZT4gd2lsbAogICAgdHJ5IHRvIHNlbGVjdCBhIG1hdGNoaW5nIHZhcmlhbnQuIElmIHRoZXJlJ3Mgbm8gc3VjaCB2YXJpYW50LAogICAgdGhlIG5vcm1hbCBuZWdvdGlhdGlvbiBwcm9jZXNzIGFwcGxpZXMuPC9wPgoKICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUiPjxoMz5FeGFtcGxlPC9oMz48cD48Y29kZT4KICAgICAgU2V0RW52SWYgQ29va2llICJsYW5ndWFnZT0oLispIiBwcmVmZXItbGFuZ3VhZ2U9JDE8YnIgLz4KICAgICAgSGVhZGVyIGFwcGVuZCBWYXJ5IGNvb2tpZQogICAgPC9jb2RlPjwvcD48L2Rpdj4KCjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iPgo8aDI+PGEgbmFtZT0iZXh0ZW5zaW9ucyIgaWQ9ImV4dGVuc2lvbnMiPkV4dGVuc2lvbnMgdG8gVHJhbnNwYXJlbnQgQ29udGVudApOZWdvdGlhdGlvbjwvYT48L2gyPiAKCjxwPmh0dHBkIGV4dGVuZHMgdGhlIHRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb24gcHJvdG9jb2wgKFJGQwoyMjk1KSBhcyBmb2xsb3dzLiBBIG5ldyA8Y29kZT57ZW5jb2RpbmcgLi59PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgaW4KdmFyaWFudCBsaXN0cyB0byBsYWJlbCB2YXJpYW50cyB3aGljaCBhcmUgYXZhaWxhYmxlIHdpdGggYSBzcGVjaWZpYwpjb250ZW50LWVuY29kaW5nIG9ubHkuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtCihSRkMgMjI5NikgaXMgZXh0ZW5kZWQgdG8gcmVjb2duaXplIGVuY29kZWQgdmFyaWFudHMgaW4gdGhlIGxpc3QsIGFuZAp0byB1c2UgdGhlbSBhcyBjYW5kaWRhdGUgdmFyaWFudHMgd2hlbmV2ZXIgdGhlaXIgZW5jb2RpbmdzIGFyZQphY2NlcHRhYmxlIGFjY29yZGluZyB0byB0aGUgPGNvZGU+QWNjZXB0LUVuY29kaW5nPC9jb2RlPiByZXF1ZXN0CmhlYWRlci4gVGhlIFJWU0EvMS4wIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJvdW5kIGNvbXB1dGVkIHF1YWxpdHkKZmFjdG9ycyB0byA1IGRlY2ltYWwgcGxhY2VzIGJlZm9yZSBjaG9vc2luZyB0aGUgYmVzdCB2YXJpYW50LjwvcD4KPC9kaXY+PGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiI+CjxoMj48YSBuYW1lPSJuYW1pbmciIGlkPSJuYW1pbmciPk5vdGUgb24gaHlwZXJsaW5rcyBhbmQgbmFtaW5nIGNvbnZlbnRpb25zPC9hPjwvaDI+CgogICAgPHA+SWYgeW91IGFyZSB1c2luZyBsYW5ndWFnZSBuZWdvdGlhdGlvbiB5b3UgY2FuIGNob29zZSBiZXR3ZWVuCiAgICBkaWZmZXJlbnQgbmFtaW5nIGNvbnZlbnRpb25zLCBiZWNhdXNlIGZpbGVzIGNhbiBoYXZlIG1vcmUgdGhhbgogICAgb25lIGV4dGVuc2lvbiwgYW5kIHRoZSBvcmRlciBvZiB0aGUgZXh0ZW5zaW9ucyBpcyBub3JtYWxseQogICAgaXJyZWxldmFudCAoc2VlIHRoZSA8YSBocmVmPSJtb2QvbW9kX21pbWUuaHRtbCNtdWx0aXBsZWV4dCI+bW9kX21pbWU8L2E+IGRvY3VtZW50YXRpb24KICAgIGZvciBkZXRhaWxzKS48L3A+CgogICAgPHA+QSB0eXBpY2FsIGZpbGUgaGFzIGEgTUlNRS10eXBlIGV4dGVuc2lvbiAoPGVtPmUuZy48L2VtPiwKICAgIDxjb2RlPmh0bWw8L2NvZGU+KSwgbWF5YmUgYW4gZW5jb2RpbmcgZXh0ZW5zaW9uICg8ZW0+ZS5nLjwvZW0+LAogICAgPGNvZGU+Z3o8L2NvZGU+KSwgYW5kIG9mIGNvdXJzZSBhIGxhbmd1YWdlIGV4dGVuc2lvbgogICAgKDxlbT5lLmcuPC9lbT4sIDxjb2RlPmVuPC9jb2RlPikgd2hlbiB3ZSBoYXZlIGRpZmZlcmVudAogICAgbGFuZ3VhZ2UgdmFyaWFudHMgb2YgdGhpcyBmaWxlLjwvcD4KCiAgICA8cD5FeGFtcGxlczo8L3A+CgogICAgPHVsPgogICAgICA8bGk+Zm9vLmVuLmh0bWw8L2xpPgoKICAgICAgPGxpPmZvby5odG1sLmVuPC9saT4KCiAgICAgIDxsaT5mb28uZW4uaHRtbC5nejwvbGk+CiAgICA8L3VsPgoKICAgIDxwPkhlcmUgc29tZSBtb3JlIGV4YW1wbGVzIG9mIGZpbGVuYW1lcyB0b2dldGhlciB3aXRoIHZhbGlkIGFuZAogICAgaW52YWxpZCBoeXBlcmxpbmtzOjwvcD4KCiAgICA8dGFibGUgY2xhc3M9ImJvcmRlcmVkIj4KICAgICAgCiAgICAgIDx0cj4KICAgICAgICA8dGg+RmlsZW5hbWU8L3RoPgoKICAgICAgICA8dGg+VmFsaWQgaHlwZXJsaW5rPC90aD4KCiAgICAgICAgPHRoPkludmFsaWQgaHlwZXJsaW5rPC90aD4KICAgICAgPC90cj4KCiAgICAgIDx0cj4KICAgICAgICA8dGQ+PGVtPmZvby5odG1sLmVuPC9lbT48L3RkPgoKICAgICAgICA8dGQ+Zm9vPGJyIC8+CiAgICAgICAgIGZvby5odG1sPC90ZD4KCiAgICAgICAgPHRkPi08L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyPgogICAgICAgIDx0ZD48ZW0+Zm9vLmVuLmh0bWw8L2VtPjwvdGQ+CgogICAgICAgIDx0ZD5mb288L3RkPgoKICAgICAgICA8dGQ+Zm9vLmh0bWw8L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyPgogICAgICAgIDx0ZD48ZW0+Zm9vLmh0bWwuZW4uZ3o8L2VtPjwvdGQ+CgogICAgICAgIDx0ZD5mb288YnIgLz4KICAgICAgICAgZm9vLmh0bWw8L3RkPgoKICAgICAgICA8dGQ+Zm9vLmd6PGJyIC8+CiAgICAgICAgIGZvby5odG1sLmd6PC90ZD4KICAgICAgPC90cj4KCiAgICAgIDx0cj4KICAgICAgICA8dGQ+PGVtPmZvby5lbi5odG1sLmd6PC9lbT48L3RkPgoKICAgICAgICA8dGQ+Zm9vPC90ZD4KCiAgICAgICAgPHRkPmZvby5odG1sPGJyIC8+CiAgICAgICAgIGZvby5odG1sLmd6PGJyIC8+CiAgICAgICAgIGZvby5nejwvdGQ+CiAgICAgIDwvdHI+CgogICAgICA8dHI+CiAgICAgICAgPHRkPjxlbT5mb28uZ3ouaHRtbC5lbjwvZW0+PC90ZD4KCiAgICAgICAgPHRkPmZvbzxiciAvPgogICAgICAgICBmb28uZ3o8YnIgLz4KICAgICAgICAgZm9vLmd6Lmh0bWw8L3RkPgoKICAgICAgICA8dGQ+Zm9vLmh0bWw8L3RkPgogICAgICA8L3RyPgoKICAgICAgPHRyPgogICAgICAgIDx0ZD48ZW0+Zm9vLmh0bWwuZ3ouZW48L2VtPjwvdGQ+CgogICAgICAgIDx0ZD5mb288YnIgLz4KICAgICAgICAgZm9vLmh0bWw8YnIgLz4KICAgICAgICAgZm9vLmh0bWwuZ3o8L3RkPgoKICAgICAgICA8dGQ+Zm9vLmd6PC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CgogICAgPHA+TG9va2luZyBhdCB0aGUgdGFibGUgYWJvdmUsIHlvdSB3aWxsIG5vdGljZSB0aGF0IGl0IGlzIGFsd2F5cwogICAgcG9zc2libGUgdG8gdXNlIHRoZSBuYW1lIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMgaW4gYSBoeXBlcmxpbmsKICAgICg8ZW0+ZS5nLjwvZW0+LCA8Y29kZT5mb288L2NvZGU+KS4gVGhlIGFkdmFudGFnZSBpcyB0aGF0IHlvdQogICAgY2FuIGhpZGUgdGhlIGFjdHVhbCB0eXBlIG9mIGEgZG9jdW1lbnQgcnNwLiBmaWxlIGFuZCBjYW4gY2hhbmdlCiAgICBpdCBsYXRlciwgPGVtPmUuZy48L2VtPiwgZnJvbSA8Y29kZT5odG1sPC9jb2RlPiB0bwogICAgPGNvZGU+c2h0bWw8L2NvZGU+IG9yIDxjb2RlPmNnaTwvY29kZT4gd2l0aG91dCBjaGFuZ2luZyBhbnkKICAgIGh5cGVybGluayByZWZlcmVuY2VzLjwvcD4KCiAgICA8cD5JZiB5b3Ugd2FudCB0byBjb250aW51ZSB0byB1c2UgYSBNSU1FLXR5cGUgaW4geW91cgogICAgaHlwZXJsaW5rcyAoPGVtPmUuZy48L2VtPiA8Y29kZT5mb28uaHRtbDwvY29kZT4pIHRoZSBsYW5ndWFnZQogICAgZXh0ZW5zaW9uIChpbmNsdWRpbmcgYW4gZW5jb2RpbmcgZXh0ZW5zaW9uIGlmIHRoZXJlIGlzIG9uZSkKICAgIG11c3QgYmUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgTUlNRS10eXBlIGV4dGVuc2lvbgogICAgKDxlbT5lLmcuPC9lbT4sIDxjb2RlPmZvby5odG1sLmVuPC9jb2RlPikuPC9wPgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9ImNhY2hpbmciIGlkPSJjYWNoaW5nIj5Ob3RlIG9uIENhY2hpbmc8L2E+PC9oMj4KCiAgICA8cD5XaGVuIGEgY2FjaGUgc3RvcmVzIGEgcmVwcmVzZW50YXRpb24sIGl0IGFzc29jaWF0ZXMgaXQgd2l0aAogICAgdGhlIHJlcXVlc3QgVVJMLiBUaGUgbmV4dCB0aW1lIHRoYXQgVVJMIGlzIHJlcXVlc3RlZCwgdGhlIGNhY2hlCiAgICBjYW4gdXNlIHRoZSBzdG9yZWQgcmVwcmVzZW50YXRpb24uIEJ1dCwgaWYgdGhlIHJlc291cmNlIGlzCiAgICBuZWdvdGlhYmxlIGF0IHRoZSBzZXJ2ZXIsIHRoaXMgbWlnaHQgcmVzdWx0IGluIG9ubHkgdGhlIGZpcnN0CiAgICByZXF1ZXN0ZWQgdmFyaWFudCBiZWluZyBjYWNoZWQgYW5kIHN1YnNlcXVlbnQgY2FjaGUgaGl0cyBtaWdodAogICAgcmV0dXJuIHRoZSB3cm9uZyByZXNwb25zZS4gVG8gcHJldmVudCB0aGlzLCBodHRwZCBub3JtYWxseQogICAgbWFya3MgYWxsIHJlc3BvbnNlcyB0aGF0IGFyZSByZXR1cm5lZCBhZnRlciBjb250ZW50IG5lZ290aWF0aW9uCiAgICBhcyBub24tY2FjaGVhYmxlIGJ5IEhUVFAvMS4wIGNsaWVudHMuIGh0dHBkIGFsc28gc3VwcG9ydHMgdGhlCiAgICBIVFRQLzEuMSBwcm90b2NvbCBmZWF0dXJlcyB0byBhbGxvdyBjYWNoaW5nIG9mIG5lZ290aWF0ZWQKICAgIHJlc3BvbnNlcy48L3A+CgogICAgPHA+Rm9yIHJlcXVlc3RzIHdoaWNoIGNvbWUgZnJvbSBhIEhUVFAvMS4wIGNvbXBsaWFudCBjbGllbnQKICAgIChlaXRoZXIgYSBicm93c2VyIG9yIGEgY2FjaGUpLCB0aGUgZGlyZWN0aXZlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4vbW9kL21vZF9uZWdvdGlhdGlvbi5odG1sI2NhY2hlbmVnb3RpYXRlZGRvY3MiPkNhY2hlTmVnb3RpYXRlZERvY3M8L2E+PC9jb2RlPiBjYW4gYmUKICAgIHVzZWQgdG8gYWxsb3cgY2FjaGluZyBvZiByZXNwb25zZXMgd2hpY2ggd2VyZSBzdWJqZWN0IHRvCiAgICBuZWdvdGlhdGlvbi4gVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGdpdmVuIGluIHRoZSBzZXJ2ZXIgY29uZmlnIG9yCiAgICB2aXJ0dWFsIGhvc3QsIGFuZCB0YWtlcyBubyBhcmd1bWVudHMuIEl0IGhhcyBubyBlZmZlY3Qgb24gcmVxdWVzdHMKICAgIGZyb20gSFRUUC8xLjEgY2xpZW50cy48L3A+CgogICAgPHA+Rm9yIEhUVFAvMS4xIGNsaWVudHMsIGh0dHBkIHNlbmRzIGEgPGNvZGU+VmFyeTwvY29kZT4gSFRUUAogICAgcmVzcG9uc2UgaGVhZGVyIHRvIGluZGljYXRlIHRoZSBuZWdvdGlhdGlvbiBkaW1lbnNpb25zIGZvciB0aGUKICAgIHJlc3BvbnNlLiAgQ2FjaGVzIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhCiAgICBzdWJzZXF1ZW50IHJlcXVlc3QgY2FuIGJlIHNlcnZlZCBmcm9tIHRoZSBsb2NhbCBjb3B5LiAgVG8KICAgIGVuY291cmFnZSBhIGNhY2hlIHRvIHVzZSB0aGUgbG9jYWwgY29weSByZWdhcmRsZXNzIG9mIHRoZQogICAgbmVnb3RpYXRpb24gZGltZW5zaW9ucywgc2V0IHRoZSA8Y29kZT5mb3JjZS1uby12YXJ5PC9jb2RlPiA8YSBocmVmPSJlbnYuaHRtbCNzcGVjaWFsIj5lbnZpcm9ubWVudCB2YXJpYWJsZTwvYT4uPC9wPgoKPC9kaXY+PC9kaXY+CjxkaXYgY2xhc3M9ImJvdHRvbWxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi9lbi9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuL2phL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCIgaHJlZmxhbmc9ImphIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkphcGFuZXNlIj4mbmJzcDtqYSZuYnNwOzwvYT4gfAo8YSBocmVmPSIuL2tvL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCIgaHJlZmxhbmc9ImtvIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IktvcmVhbiI+Jm5ic3A7a28mbmJzcDs8L2E+IHwKPGEgaHJlZj0iLi90ci9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiIGhyZWZsYW5nPSJ0ciIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJU/HJr52UiPiZuYnNwO3RyJm5ic3A7PC9hPjwvcD4KPC9kaXY+PGRpdiBpZD0iZm9vdGVyIj4KPHAgY2xhc3M9ImFwYWNoZSI+Q29weXJpZ2h0IDIwMTEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4vbW9kL2RpcmVjdGl2ZXMuaHRtbCI+RGlyZWN0aXZlczwvYT4gfCA8YSBocmVmPSIuL2ZhcS8iPkZBUTwvYT4gfCA8YSBocmVmPSIuL2dsb3NzYXJ5Lmh0bWwiPkdsb3NzYXJ5PC9hPiB8IDxhIGhyZWY9Ii4vc2l0ZW1hcC5odG1sIj5TaXRlbWFwPC9hPjwvcD48L2Rpdj4KPC9ib2R5PjwvaHRtbD4=