PCEtLQ0KTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQpjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCnRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NClRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQoodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQoNClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0+DQo8ZGl2IGlkPSJkYXRhaW1wb3J0IiBjbGFzcz0iY2xlYXJmaXgiPg0KDQogIDxkaXYgbmctc2hvdz0iIWhhc0hhbmRsZXJzIj5Tb3JyeSwgbm8gZGF0YWltcG9ydC1oYW5kbGVyIGRlZmluZWQhPC9kaXY+DQogIDxkaXYgaWQ9ImZyYW1lIiBuZy1zaG93PSJoYXNIYW5kbGVycyI+DQoNCiAgICA8ZGl2IGlkPSJlcnJvciIgbmctc2hvdz0iZXJyb3IiPjwvZGl2Pg0KDQogICAgPGRpdiBpZD0iY3VycmVudF9zdGF0ZSIgY2xhc3M9Int7c3RhdHVzfX0iPg0KDQogICAgICA8cCBjbGFzcz0ibGFzdF91cGRhdGUiPkxhc3QgVXBkYXRlOiA8YWJiciB0aXRsZT0ie3tsYXN0VXBkYXRlVVRDfX0iPnt7bGFzdFVwZGF0ZX19PC9hYmJyPjwvcD4NCiAgICAgIDxkaXYgY2xhc3M9ImluZm8iPg0KDQogICAgICAgIDxzdHJvbmc+e3tpbmZvLnRleHR9fTxzcGFuIG5nLXNob3c9ImluZm8udGltZVRha2VuIj4gKER1cmF0aW9uOiB7e2luZm8udGltZVRha2VuIHwgcmVhZGFibGVTZWNvbmRzIH19KTwvc3Bhbj4NCiAgICAgICAgPC9zdHJvbmc+DQogICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbHMiIG5nLXNob3c9ImluZm8uc2hvd0RldGFpbHMiPg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImRvY3MiPg0KICAgICAgICAgICAgICA8c3BhbiBuZy1yZXBlYXQ9ImRvYyBpbiBpbmZvLmRvY3MiPg0KICAgICAgICAgICAgICAgICAgPGFiYnIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIiB0aXRsZT0ie3sgZG9jLmRlc2MgfX0iPnt7IGRvYy5uYW1lIH19PC9hYmJyPjoge3tkb2MudmFsdWUgfCBudW1iZXJ9fTwhLS0gcmVtb3ZlIHdoaXRlc3BhY2UhDQogICAgICAgICAgICAgICAgICAtLT4mbmJzcDs8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUiIG5nLXNob3c9ImRvYy5zcGVlZCI+e3sgZG9jLnNwZWVkIHwgbnVtYmVyfX0vczwvc3Bhbj48IS0tIHJlbW92ZSB3aGl0ZXNwYWNlIQ0KICAgICAgICAgICAgICAgICAgLS0+PHNwYW4gc3R5bGU9ImRpc3BsYXk6aW5saW5lIiBuZy1zaG93PSIhJGxhc3QiPiwgPC9zcGFuPg0KICAgICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPGRpdiBjbGFzcz0iZGF0ZXMiPg0KICAgICAgICAgICAgICA8c3BhbiBuZy1yZXBlYXQ9ImRhdGUgaW4gaW5mby5kYXRlcyI+DQogICAgICAgICAgICAgICAgICA8YWJiciB0aXRsZT0ie3sgZGF0ZS5kZXNjIH19Ij57eyBkYXRlLm5hbWUgfX08L2FiYnI+Og0KICAgICAgICAgICAgICAgICAgPGFiYnIgY2xhc3M9InRpbWUiPnt7IGRhdGUudmFsdWUgfCB0aW1lYWdvIH19PC9hYmJyPg0KICAgICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KDQogICAgICAgIDxidXR0b24gY2xhc3M9ImFib3J0LWltcG9ydCIgbmctY2xhc3M9Int3YXJuOiFpc0Fib3J0aW5nLCBzdWNjZXNzOiBpc0Fib3J0aW5nfSIgbmctY2xpY2s9ImFib3J0KCkiIG5nLXNob3c9ImlzUnVubmluZyI+DQogICAgICAgICAgICA8c3BhbiBuZy1zaG93PSJpc0Fib3J0aW5nIj5BYm9ydGluZyBJbXBvcnQ8L3NwYW4+DQogICAgICAgICAgICA8c3BhbiBuZy1zaG93PSIhaXNBYm9ydGluZyI+QWJvcnQgSW1wb3J0PC9zcGFuPg0KICAgICAgICA8L2J1dHRvbj4NCg0KICAgICAgPC9kaXY+DQogICAgDQogICAgPC9kaXY+DQoNCiAgICA8ZGl2IGNsYXNzPSJibG9jayIgaWQ9InJhd19vdXRwdXQiID4NCg0KICAgICAgPGgyPg0KICAgICAgICA8YSBjbGFzcz0idG9nZ2xlIiBuZy1jbGljaz0idG9nZ2xlUmF3U3RhdHVzKCkiPjxzcGFuPlJhdyBTdGF0dXMtT3V0cHV0PC9zcGFuPjwvYT4NCiAgICAgIDwvaDI+DQogICAgICAgIA0KICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InNob3dSYXdTdGF0dXMiPg0KICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPjwvZGl2Pg0KICAgICAgPC9kaXY+DQoNCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiIG5nLXNob3c9InNob3dSYXdTdGF0dXMiPg0KDQogICAgICAgIDxkaXYgaWQ9InJhd19vdXRwdXRfY29udGFpbmVyIj48cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UtanNvbiI+PGNvZGUgbmctYmluZC1odG1sPSJyYXdTdGF0dXMgfCBoaWdobGlnaHQ6J2pzb24nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+PC9kaXY+DQoNCiAgICAgIDwvZGl2Pg0KICAgIA0KICAgIDwvZGl2Pg0KDQogICAgPGRpdiBjbGFzcz0iYmxvY2siIGlkPSJjb25maWciIG5nLWNsYXNzPSJ7ZGVidWdfbW9kZTppc0RlYnVnTW9kZX0iPg0KDQogICAgICA8aDIgY2xhc3M9ImNsZWFyZml4Ij4NCiAgICAgICAgPGEgY2xhc3M9InRvZ2dsZSIgbmctY2xpY2s9InRvZ2dsZUNvbmZpZ3VyYXRpb24oKSI+PHNwYW4+Q29uZmlndXJhdGlvbjwvc3Bhbj48L2E+DQogICAgICAgIDxhIGNsYXNzPSJyIHJlbG9hZF9jb25maWciIG5nLWNsYXNzPSJ7c3VjY2VzczpyZWxvYWRlZH0iIG5nLWNsaWNrPSJyZWxvYWQoKSIgdGl0bGU9IlJlbG9hZCBDb25maWd1cmF0aW9uIj5SZWxvYWQ8L2E+DQogICAgICAgIDxhIGNsYXNzPSJyIGRlYnVnX21vZGUiIG5nLWNsaWNrPSJ0b2dnbGVEZWJ1ZygpIj5EZWJ1Zy1Nb2RlPC9hPg0KICAgICAgPC9oMj4NCiAgICAgICAgDQogICAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlLWNvbnRhaW5lciIgbmctc2hvdz0ic2hvd0NvbmZpZ3VyYXRpb24iPg0KICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPjwvZGl2Pg0KICAgICAgPC9kaXY+DQoNCiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiIG5nLXNob3c9InNob3dDb25maWd1cmF0aW9uIj4NCiAgICAgICAgPGRpdiBpZD0iZGF0YWltcG9ydF9jb25maWciPg0KDQogICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybWF0dGVkIiBuZy1zaG93PSIhaXNEZWJ1Z01vZGUiPg0KDQogICAgICAgICAgICA8cHJlIGNsYXNzPSJzeW50YXggbGFuZ3VhZ2UteG1sIj48Y29kZSBuZy1iaW5kLWh0bWw9ImNvbmZpZyB8IGhpZ2hsaWdodDoneG1sJ3wgdW5zYWZlIj48L2NvZGU+PC9wcmU+DQoNCiAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImVkaXRhYmxlIiBuZy1zaG93PSJpc0RlYnVnTW9kZSI+DQoNCiAgICAgICAgICAgIDx0ZXh0YXJlYSBuZy1tb2RlbD0iY29uZmlnIj48L3RleHRhcmVhPg0KICAgICAgICAgIA0KICAgICAgICAgIDwvZGl2Pg0KDQogICAgICAgIDwvZGl2Pg0KDQogICAgICA8L2Rpdj4NCiAgICANCiAgICA8L2Rpdj4NCg0KICAgIDxkaXYgY2xhc3M9ImJsb2NrIiBpZD0iZGVidWdfcmVzcG9uc2UiIG5nLXNob3c9ImZvcm0uc2hvd0RlYnVnIj4NCg0KICAgICAgPGgyPg0KICAgICAgICA8YSBjbGFzcz0idG9nZ2xlIiBuZy1jbGljaz0idG9nZ2xlUmF3RGVidWcoKSI+PHNwYW4+UmF3IERlYnVnLVJlc3BvbnNlPC9zcGFuPjwvYT4NCiAgICAgIDwvaDI+DQogICAgICAgIA0KICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZS1jb250YWluZXIiIG5nLXNob3c9InNob3dSYXdEZWJ1ZyI+DQogICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+PC9kaXY+DQogICAgICA8L2Rpdj4NCg0KICAgICAgPGRpdiBjbGFzcz0iY29udGVudCIgbmctc2hvdz0ic2hvd1Jhd0RlYnVnIj4NCiAgICAgICAgICA8c3BhbiBuZy1oaWRlPSJyYXdSZXNwb25zZSI+DQogICAgICAgICAgICAgIDxlbT5ObyBSZXF1ZXN0IGV4ZWN1dGVkPC9lbT4NCiAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgPHNwYW4gbmctc2hvdz0icmF3UmVzcG9uc2UiPg0KICAgICAgICAgICAgPHByZSBjbGFzcz0ic3ludGF4IGxhbmd1YWdlLWpzb24iPjxjb2RlIG5nLWJpbmQtaHRtbD0icmF3UmVzcG9uc2UgfCBoaWdobGlnaHQ6J2pzb24nIHwgdW5zYWZlIj48L2NvZGU+PC9wcmU+DQogICAgICAgICAgPC9zcGFuPg0KICAgICAgPC9kaXY+DQogICAgDQogICAgPC9kaXY+DQogIA0KICA8L2Rpdj4NCg0KICA8ZGl2IGlkPSJmb3JtIiBuZy1zaG93PSJoYXNIYW5kbGVycyI+DQoNCiAgICA8ZGl2IGlkPSJuYXZpZ2F0aW9uIj4NCg0KICAgICAgPHVsPg0KICAgICAgICAgIDxsaSBuZy1jbGFzcz0ie2N1cnJlbnQ6IGN1cnJlbnRIYW5kbGVyID09IGhhbmRsZXJ9IiBuZy1yZXBlYXQ9ImhhbmRsZXIgaW4gaGFuZGxlcnMiPg0KICAgICAgICAgICAgICA8YSBocmVmPSIjL3t7Zm9ybS5jb3JlfX0vZGF0YWltcG9ydC97e2hhbmRsZXJ9fSI+e3toYW5kbGVyfX08L2E+DQogICAgICAgICAgPC9saT4NCiAgICAgIDwvdWw+DQoNCiAgICA8L2Rpdj4NCg0KICAgIDxmb3JtIGFjdGlvbj0iIyIgbWV0aG9kPSJnZXQiPg0KDQogICAgICA8bGFiZWwgZm9yPSJjb21tYW5kIj4NCiAgICAgICAgPGEgcmVsPSJoZWxwIj5Db21tYW5kPC9hPg0KICAgICAgPC9sYWJlbD4NCiAgICAgIDxzZWxlY3QgbmFtZT0iY29tbWFuZCIgaWQ9ImNvbW1hbmQiIG5nLW1vZGVsPSJmb3JtLmNvbW1hbmQiPg0KICAgICAgICA8b3B0aW9uPmZ1bGwtaW1wb3J0PC9vcHRpb24+DQogICAgICAgIDxvcHRpb24+ZGVsdGEtaW1wb3J0PC9vcHRpb24+DQogICAgICA8L3NlbGVjdD4NCg0KICAgICAgPGxhYmVsIGZvcj0idmVyYm9zZSIgY2xhc3M9ImNoZWNrYm94Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ2ZXJib3NlIiBpZD0idmVyYm9zZSIgbmctbW9kZWw9ImZvcm0udmVyYm9zZSI+DQogICAgICAgIFZlcmJvc2UNCiAgICAgIDwvbGFiZWw+DQoNCiAgICAgIDxsYWJlbCBmb3I9ImNsZWFuIiBjbGFzcz0iY2hlY2tib3giPg0KICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImNsZWFuIiBpZD0iY2xlYW4iIG5nLW1vZGVsPSJmb3JtLmNsZWFuIj4NCiAgICAgICAgQ2xlYW4NCiAgICAgIDwvbGFiZWw+DQoNCiAgICAgIDxsYWJlbCBmb3I9ImNvbW1pdCIgY2xhc3M9ImNoZWNrYm94Ij4NCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjb21taXQiIGlkPSJjb21taXQiIG5nLW1vZGVsPSJmb3JtLmNvbW1pdCI+DQogICAgICAgIENvbW1pdA0KICAgICAgPC9sYWJlbD4NCg0KICAgICAgPGxhYmVsIGZvcj0ib3B0aW1pemUiIGNsYXNzPSJjaGVja2JveCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ib3B0aW1pemUiIGlkPSJvcHRpbWl6ZSIgbmctbW9kZWw9ImZvcm0ub3B0aW1pemUiPg0KICAgICAgICBPcHRpbWl6ZQ0KICAgICAgPC9sYWJlbD4NCg0KICAgICAgPGxhYmVsIGZvcj0iZGVidWciIGNsYXNzPSJjaGVja2JveCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGVidWciIGlkPSJkZWJ1ZyIgbmctbW9kZWw9ImZvcm0uc2hvd0RlYnVnIj4NCiAgICAgICAgRGVidWcNCiAgICAgIDwvbGFiZWw+DQoNCiAgICAgIDxsYWJlbCBmb3I9ImVudGl0eSI+DQogICAgICAgIDxhIHJlbD0iaGVscCI+RW50aXR5PC9hPg0KICAgICAgPC9sYWJlbD4NCiAgICAgIDxzZWxlY3QgbmctbW9kZWw9ImZvcm0uZW50aXR5IiBpZD0iZW50aXR5Ij4NCiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj48L29wdGlvbj4NCiAgICAgICAgPG9wdGlvbiBuZy1yZXBlYXQ9ImVudGl0eSBpbiBlbnRpdGllcyI+e3tlbnRpdHl9fTwvb3B0aW9uPg0KICAgICAgPC9zZWxlY3Q+DQoNCiAgICAgIDxsYWJlbCBmb3I9InN0YXJ0Ij4NCiAgICAgICAgPGEgcmVsPSJoZWxwIj5TdGFydDwvYT4sDQogICAgICAgIDxhIHJlbD0iaGVscCI+Um93czwvYT4NCiAgICAgIDwvbGFiZWw+DQogICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3RhcnQiIHBsYWNlaG9sZGVyPSIwIiBuZy1tb2RlbD0iZm9ybS5zdGFydCI+DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icm93cyIgcGxhY2Vob2xkZXI9IjEwIiBuZy1tb2RlbD0iZm9ybS5yb3dzIj4NCiAgICAgIDwvZGl2Pg0KDQogICAgICA8bGFiZWwgZm9yPSJjdXN0b21fcGFyYW1ldGVycyI+DQogICAgICAgIDxhIHJlbD0iaGVscCI+Q3VzdG9tIFBhcmFtZXRlcnM8L2E+DQogICAgICA8L2xhYmVsPg0KICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjdXN0b21fcGFyYW1ldGVycyIgbmctbW9kZWw9ImZvcm0uY3VzdG9tIiBwbGFjZWhvbGRlcj0ia2V5MT12YWwxJmFtcDtrZXkyPXZhbDIiPg0KICAgIDwvZm9ybT4NCiAgICAgIDxidXR0b24gY2xhc3M9ImV4ZWN1dGUiIHR5cGU9InN1Ym1pdCIgbmctY2xpY2s9InN1Ym1pdCgpIj4NCiAgICAgICAgICA8c3BhbiBuZy1zaG93PSJpc0RlYnVnTW9kZSI+RXhlY3V0ZSB3aXRoIHRoaXMgQ29uZmlndXJhdGlvbiDihj88L3NwYW4+DQogICAgICAgICAgPHNwYW4gbmctc2hvdz0iIWlzRGVidWdNb2RlIj5FeGVjdXRlPC9zcGFuPg0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIGNsYXNzPSJyZWZyZXNoLXN0YXR1cyIgbmctY2xpY2s9InJlZnJlc2hTdGF0dXMoKSIgbmctY2xhc3M9Intsb2FkZXI6IGlzU3RhdHVzTG9hZGluZywgc3VjY2Vzczogc3RhdHVzVXBkYXRlZH0iPjxzcGFuPlJlZnJlc2ggU3RhdHVzPC9zcGFuPjwvYnV0dG9uPg0KDQogICAgPHAgaWQ9ImF1dG8tcmVmcmVzaC1zdGF0dXMiPjxhIG5nLWNsaWNrPSJ1cGRhdGVBdXRvUmVmcmVzaCgpIiBuZy1jbGFzcz0ie29uOmF1dG9yZWZyZXNofSI+QXV0by1SZWZyZXNoIFN0YXR1czwvYT48L3A+DQogIA0KICA8L2Rpdj4NCg0KPC9kaXY+DQo=