diff --git a/NOTICE b/NOTICE index bfaa082cfe1..bf9911626a0 100644 --- a/NOTICE +++ b/NOTICE @@ -26,11 +26,6 @@ Bitstream Vera is a trademark of Bitstream, Inc. For details, see http://dejavu-fonts.org and http://dejavu-fonts.org/wiki/License -This product includes JasperReports Library -Copyright (c) 2001-2016 TIBCO Software Inc. -JasperReports Library is distributed under the terms of -GNU Lesser General Public Licenses (LGPL) - This product includes AdminLTE template Copyright (c) 2014-2016 Abdullah Almsaeed AdminLTE is distributed under the terms of The MIT License diff --git a/config/initial-objects/000-system-configuration.xml b/config/initial-objects/000-system-configuration.xml index 3d6814bd377..dfa28d0f829 100644 --- a/config/initial-objects/000-system-configuration.xml +++ b/config/initial-objects/000-system-configuration.xml @@ -54,11 +54,6 @@ OFF org.hibernate.internal.ExceptionMapperStandardImpl - - - OFF - net.sf.jasperreports.engine.fill.JRFillDataset - diff --git a/config/initial-objects/080-report-audit.xml b/config/initial-objects/080-report-audit.xml deleted file mode 100644 index 42194b59555..00000000000 --- a/config/initial-objects/080-report-audit.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - All audit records report - Report made from all audit records. - - - - - - - - - diff --git a/config/initial-objects/090-report-audit-jasper.xml b/config/initial-objects/090-report-audit-jasper.xml deleted file mode 100644 index 5ec1a4d1e28..00000000000 --- a/config/initial-objects/090-report-audit-jasper.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - Audit logs report (Jasper) - Report made from audit records. - - true - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRBdWRpdExvZ3MiIHBhZ2VXaWR0aD0iMTE2MiIgcGFnZUhlaWdodD0iNTk1IiBvcmllbnRhdGlvbj0iTGFuZHNjYXBlIiB3aGVuTm9EYXRhVHlwZT0iQWxsU2VjdGlvbnNOb0RldGFpbCIgY29sdW1uV2lkdGg9IjExMjIiIGxlZnRNYXJnaW49IjIwIiByaWdodE1hcmdpbj0iMjAiIHRvcE1hcmdpbj0iMjAiIGJvdHRvbU1hcmdpbj0iMjAiIHV1aWQ9IjY3ZTQ2NWM1LTQ2ZWEtNDBkMi1iZWEwLTQ2OWM2Y2YzODkzNyI+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuYXd0Lmlnbm9yZS5taXNzaW5nLmZvbnQiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjEiIHZhbHVlPSJ0aXRsZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5jc3YuZXhjbHVkZS5vcmlnaW4uYmFuZC4yIiB2YWx1ZT0icGFnZUZvb3RlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5wZGYuZm9yY2UubGluZWJyZWFrLnBvbGljeSIgdmFsdWU9InRydWUiLz4KCTxpbXBvcnQgdmFsdWU9Im9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzIi8+Cgk8aW1wb3J0IHZhbHVlPSJjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMiLz4KCTxzdWJEYXRhc2V0IG5hbWU9ImVudHJ5RGVsdGFzIiB1dWlkPSI2NDg5NDAwNS1kMGY3LTQxYmEtYTA0Ny0xYTFhYmVhOWY1NWYiPgoJCTxmaWVsZCBuYW1lPSJleGVjdXRpb25SZXN1bHQiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLk9wZXJhdGlvblJlc3VsdFR5cGUiLz4KCQk8ZmllbGQgbmFtZT0ib2JqZWN0RGVsdGEiIGNsYXNzPSJjb20uZXZvbHZldW0ucHJpc20ueG1sLm5zLl9wdWJsaWMudHlwZXNfMy5PYmplY3REZWx0YVR5cGUiLz4KCQk8ZmllbGQgbmFtZT0ib2JqZWN0TmFtZSIgY2xhc3M9ImphdmEubGFuZy5PYmplY3QiLz4KCQk8ZmllbGQgbmFtZT0icmVzb3VyY2VOYW1lIiBjbGFzcz0iamF2YS5sYW5nLk9iamVjdCIvPgoJPC9zdWJEYXRhc2V0PgoJPHBhcmFtZXRlciBuYW1lPSJmcm9tIiBjbGFzcz0iamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIj4KCQk8cHJvcGVydHkgbmFtZT0ibXVsdGl2YWx1ZSIgdmFsdWU9ImZhbHNlIi8+Cgk8L3BhcmFtZXRlcj4KCTxwYXJhbWV0ZXIgbmFtZT0idG8iIGNsYXNzPSJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiLz4KCTxwYXJhbWV0ZXIgbmFtZT0iZXZlbnRUeXBlIiBjbGFzcz0iamF2YS51dGlsLkxpc3QiIG5lc3RlZFR5cGU9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uYXVkaXRfMy5BdWRpdEV2ZW50VHlwZVR5cGUiPgoJCTxwcm9wZXJ0eSBuYW1lPSJtdWx0aXZhbHVlIiB2YWx1ZT0idHJ1ZSIvPgoJPC9wYXJhbWV0ZXI+Cgk8cGFyYW1ldGVyIG5hbWU9ImV2ZW50U3RhZ2UiIGNsYXNzPSJqYXZhLnV0aWwuTGlzdCIgbmVzdGVkVHlwZT0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5hdWRpdF8zLkF1ZGl0RXZlbnRTdGFnZVR5cGUiPgoJCTxwcm9wZXJ0eSBuYW1lPSJtdWx0aXZhbHVlIiB2YWx1ZT0idHJ1ZSIvPgoJPC9wYXJhbWV0ZXI+Cgk8cGFyYW1ldGVyIG5hbWU9Im91dGNvbWUiIGNsYXNzPSJqYXZhLnV0aWwuTGlzdCIgbmVzdGVkVHlwZT0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5PcGVyYXRpb25SZXN1bHRTdGF0dXNUeXBlIj4KCQk8cHJvcGVydHkgbmFtZT0ibXVsdGl2YWx1ZSIgdmFsdWU9InRydWUiLz4KCTwvcGFyYW1ldGVyPgoJPHBhcmFtZXRlciBuYW1lPSJpbml0aWF0b3JOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXROYW1lIiBjbGFzcz0iamF2YS51dGlsLkxpc3QiIG5lc3RlZFR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KCTxxdWVyeVN0cmluZyBsYW5ndWFnZT0ibXFsIj4KCQk8IVtDREFUQVs8Y29kZT4NCiAgICBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOw0KICAgIGltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVGYWN0b3J5Ow0KICAgIGltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7IA0KICAgIA0KICAgIHF1ZXJ5ID0gInNlbGVjdCAqIGZyb20gbV9hdWRpdF9ldmVudCBhcyBhZXIgd2hlcmUgMT0xIGFuZCAiOw0KICAgICAgICANCiAgICBpZiAoYXVkaXRQYXJhbXMuZ2V0KCdmcm9tJykuZ2V0VmFsdWUoKSAhPSBudWxsKSB7DQogICAgICAgIHF1ZXJ5ICs9ICIoYWVyLnRpbWVzdGFtcFZhbHVlID49IDpmcm9tKSBhbmQgIjsNCiAgICB9IGVsc2Ugew0KICAgICAgICBhdWRpdFBhcmFtcy5yZW1vdmUoJ2Zyb20nKS5nZXRWYWx1ZSgpOw0KICAgIH0NCiAgICBpZiAoYXVkaXRQYXJhbXMuZ2V0KCd0bycpLmdldFZhbHVlKCkgIT0gbnVsbCkgew0KICAgICAgICBxdWVyeSArPSAiKGFlci50aW1lc3RhbXBWYWx1ZSA8PSA6dG8pIGFuZCAiOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGF1ZGl0UGFyYW1zLnJlbW92ZSgndG8nKS5nZXRWYWx1ZSgpOw0KICAgIH0NCiAgICBpZiAoYXVkaXRQYXJhbXMuZ2V0KCdldmVudFR5cGUnKS5nZXRWYWx1ZSgpICE9IG51bGwpIHsNCiAgICAgICAgcXVlcnkgKz0gIihhZXIuZXZlbnRUeXBlIGluICg6ZXZlbnRUeXBlKSkgYW5kICI7DQogICAgfSBlbHNlIHsNCiAgICAgICAgYXVkaXRQYXJhbXMucmVtb3ZlKCdldmVudFR5cGUnKS5nZXRWYWx1ZSgpOw0KICAgIH0NCiAgICBpZiAoYXVkaXRQYXJhbXMuZ2V0KCdldmVudFN0YWdlJykuZ2V0VmFsdWUoKSAhPSBudWxsKSB7DQogICAgICAgIHF1ZXJ5ICs9ICIoYWVyLmV2ZW50U3RhZ2UgaW4gKDpldmVudFN0YWdlKSkgYW5kICI7DQogICAgfSBlbHNlIHsNCiAgICAgICAgYXVkaXRQYXJhbXMucmVtb3ZlKCdldmVudFN0YWdlJykuZ2V0VmFsdWUoKTsNCiAgICB9DQogICAgaWYgKGF1ZGl0UGFyYW1zLmdldCgnb3V0Y29tZScpLmdldFZhbHVlKCkgIT0gbnVsbCkgew0KICAgICAgICBxdWVyeSArPSAiKGFlci5vdXRjb21lIGluICg6b3V0Y29tZSkpIGFuZCAiOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGF1ZGl0UGFyYW1zLnJlbW92ZSgnb3V0Y29tZScpLmdldFZhbHVlKCk7DQogICAgfQ0KICAgIGlmIChhdWRpdFBhcmFtcy5nZXQoJ2luaXRpYXRvck5hbWUnKS5nZXRWYWx1ZSgpICE9IG51bGwpIHsNCiAgICAgICAgcXVlcnkgKz0gIihhZXIuaW5pdGlhdG9yTmFtZSA9IDppbml0aWF0b3JOYW1lKSBhbmQgIjsNCiAgICB9IGVsc2Ugew0KICAgICAgICBhdWRpdFBhcmFtcy5yZW1vdmUoJ2luaXRpYXRvck5hbWUnKS5nZXRWYWx1ZSgpOw0KICAgIH0NCiAgICBpZiAoYXVkaXRQYXJhbXMuZ2V0KCd0YXJnZXROYW1lJykuZ2V0VmFsdWUoKSAhPSBudWxsKSB7DQogICAgICAgIHF1ZXJ5ICs9ICIoYWVyLnRhcmdldE5hbWUgaW4gKDp0YXJnZXROYW1lKSkgYW5kICI7DQogICAgfSBlbHNlIHsNCiAgICAgICAgYXVkaXRQYXJhbXMucmVtb3ZlKCd0YXJnZXROYW1lJykuZ2V0VmFsdWUoKTsNCiAgICB9DQogICAgDQogICAgcXVlcnkgPSBxdWVyeS5zdWJzdHJpbmcoMCwgcXVlcnkubGVuZ3RoKCktNSk7IC8vIHJlbW92ZSB0cmFpbGluZyBhbmQgDQogICAgcXVlcnkgKz0gIiBvcmRlciBieSBhZXIudGltZXN0YW1wVmFsdWUgYXNjIjsNCiAgICANCiAgICByZXBvcnQuc2VhcmNoQXVkaXRSZWNvcmRzKHF1ZXJ5LCBhdWRpdFBhcmFtcyk7DQo8L2NvZGU+XV0+Cgk8L3F1ZXJ5U3RyaW5nPgoJPGZpZWxkIG5hbWU9InRpbWVzdGFtcCIgY2xhc3M9ImphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhciIvPgoJPGZpZWxkIG5hbWU9ImV2ZW50VHlwZSIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uYXVkaXRfMy5BdWRpdEV2ZW50VHlwZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJldmVudFN0YWdlIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5hdWRpdF8zLkF1ZGl0RXZlbnRTdGFnZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJ0YXJnZXRSZWYiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQucHJpc20uUHJpc21SZWZlcmVuY2VWYWx1ZSIvPgoJPGZpZWxkIG5hbWU9ImluaXRpYXRvclJlZiIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC5wcmlzbS5QcmlzbVJlZmVyZW5jZVZhbHVlIi8+Cgk8ZmllbGQgbmFtZT0ib3V0Y29tZSIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuT3BlcmF0aW9uUmVzdWx0U3RhdHVzVHlwZSIvPgoJPGZpZWxkIG5hbWU9Im1lc3NhZ2UiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8ZmllbGQgbmFtZT0iZGVsdGEiIGNsYXNzPSJqYXZhLnV0aWwuQXJyYXlMaXN0Ii8+Cgk8YmFja2dyb3VuZD4KCQk8YmFuZCBzcGxpdFR5cGU9IlN0cmV0Y2giLz4KCTwvYmFja2dyb3VuZD4KCTx0aXRsZT4KCQk8YmFuZCBoZWlnaHQ9IjE5OCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlRpdGxlIiBtb2RlPSJPcGFxdWUiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMTIwIiBoZWlnaHQ9IjY3IiBiYWNrY29sb3I9IiMyNjc5OTQiIHV1aWQ9IjQ0YmVkYWNjLWZhMjMtNGZlMS1iNzFmLWU1YWZhOTQzZjU1MyIvPgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlRpdGxlIiB4PSIxMCIgeT0iMTMiIHdpZHRoPSIyNjYiIGhlaWdodD0iMzgiIHV1aWQ9ImYyZDk5Y2FkLTlkODQtNGY1MC1iNDU1LTQ1M2M4N2Y2MmM0YyIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbQXVkaXQgTG9nIFJlcG9ydF1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJPC9mcmFtZT4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjIiIHk9Ijg1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtEYXRlIEZyb206XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQgcGF0dGVybj0iZGQuTU0ueXl5eSwgSEg6bW06c3MiPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiBpc1ByaW50UmVwZWF0ZWRWYWx1ZXM9ImZhbHNlIiB4PSIxMTAiIHk9Ijg1IiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsgCgkJCQkkUHtmcm9tfSAhPSBudWxsID8gUmVwb3J0VXRpbHMuY29udmVydERhdGVUaW1lKCRQe2Zyb219KSA6ICJBbnkiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjIiIHk9IjExNSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIyMCIgdXVpZD0iZTAzNWRiZDUtZGMyZi00NWNiLTkzNmMtYTA4ZTljMDExZTQzIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbRGF0ZSBUbzpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJkZC5NTS55eXl5LCBISDptbTpzcyI+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjExMCIgeT0iMTE1IiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsKCQkJCSRQe3RvfSAhPSBudWxsID8gUmVwb3J0VXRpbHMuY29udmVydERhdGVUaW1lKCRQe3RvfSkgOiAiQW55Il1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJPC90ZXh0RmllbGQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSIyIiB5PSIxNDUiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjAiIHV1aWQ9ImUwMzVkYmQ1LWRjMmYtNDVjYi05MzZjLWEwOGU5YzAxMWU0MyIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW0V2ZW50IFR5cGU6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjExMCIgeT0iMTQ1IiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsKCQkJCVJlcG9ydFV0aWxzLmdldFByb3BlcnR5U3RyaW5nKCJBdWRpdEV2ZW50VHlwZS4iLCAkUHtldmVudFR5cGV9LCAiQW55IildXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMiIgeT0iMTc1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtFdmVudCBTdGFnZTpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiBpc1ByaW50UmVwZWF0ZWRWYWx1ZXM9ImZhbHNlIiB4PSIxMTAiIHk9IjE3NSIgd2lkdGg9IjI0NCIgaGVpZ2h0PSIyMCIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSI+CgkJCQkJPGZvbnQgaXNCb2xkPSJmYWxzZSIvPgoJCQkJPC90ZXh0RWxlbWVudD4KCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHM7CgkJCQlSZXBvcnRVdGlscy5nZXRQcm9wZXJ0eVN0cmluZygiQXVkaXRFdmVudFN0YWdlLiIsICRQe2V2ZW50U3RhZ2V9LCAiQW55IildXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iNDAwIiB5PSI4NSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIyMCIgdXVpZD0iZTAzNWRiZDUtZGMyZi00NWNiLTkzNmMtYTA4ZTljMDExZTQzIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbT3V0Y29tZTpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgaXNQcmludFJlcGVhdGVkVmFsdWVzPSJmYWxzZSIgeD0iNTEwIiB5PSI4NSIgd2lkdGg9IjI0NCIgaGVpZ2h0PSIyMCIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSI+CgkJCQkJPGZvbnQgaXNCb2xkPSJmYWxzZSIvPgoJCQkJPC90ZXh0RWxlbWVudD4KCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHM7CgkJCQlSZXBvcnRVdGlscy5nZXRQcm9wZXJ0eVN0cmluZygiT3BlcmF0aW9uUmVzdWx0U3RhdHVzVHlwZS4iLCAkUHtvdXRjb21lfSwgIkFueSIpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjQwMCIgeT0iMTE1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtJbml0aWF0b3IgTmFtZTpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgaXNQcmludFJlcGVhdGVkVmFsdWVzPSJmYWxzZSIgeD0iNTEwIiB5PSIxMTUiIHdpZHRoPSIyNDQiIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskUHtpbml0aWF0b3JOYW1lfSAhPSBudWxsID8gJFB7aW5pdGlhdG9yTmFtZX0gOiAiQW55Il1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJPC90ZXh0RmllbGQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSI0MDAiIHk9IjE0NSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIyMCIgdXVpZD0iZTAzNWRiZDUtZGMyZi00NWNiLTkzNmMtYTA4ZTljMDExZTQzIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbVGFyZ2V0IE5hbWU6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjUxMCIgeT0iMTQ1IiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwoJCQkJJFB7dGFyZ2V0TmFtZX0gIT0gbnVsbCA/IFN0cmluZ1V0aWxzLmpvaW4oJFB7dGFyZ2V0TmFtZX0sICIsICIpIDogIkFueSJdXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCTwvYmFuZD4KCTwvdGl0bGU+Cgk8cGFnZUhlYWRlcj4KCQk8YmFuZCBzcGxpdFR5cGU9IlN0cmV0Y2giLz4KCTwvcGFnZUhlYWRlcj4KCTxjb2x1bW5IZWFkZXI+CgkJPGJhbmQgaGVpZ2h0PSIyNCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIG1vZGU9IlRyYW5zcGFyZW50IiB4PSIwIiB5PSIxIiB3aWR0aD0iMTEyMCIgaGVpZ2h0PSIxOSIgaXNSZW1vdmVMaW5lV2hlbkJsYW5rPSJ0cnVlIiB1dWlkPSIzZThmZGQ2ZC1hNmZmLTQ0MDctOWExZS01ZDZiNDcwNjMwMGEiLz4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbVGltZXN0YW1wXV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjEyMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbSW5pdGlhdG9yXV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjIwMCIgeT0iMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbRXZlbnQgVHlwZV1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIyOTAiIHk9IjAiIHdpZHRoPSI5MCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW0V2ZW50IFN0YWdlXV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjM4MCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW1RhcmdldF1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI0ODAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW091dGNvbWVdXT48L3RleHQ+CgkJCQk8L3N0YXRpY1RleHQ+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNTYwIiB5PSIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbTWVzc2FnZV1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI3MjAiIHk9IjAiIHdpZHRoPSI0MDAiIGhlaWdodD0iMTgiIHV1aWQ9Ijg2Yzc0YmViLWJkZGQtNDhjYy05NDVhLTE2N2IyNjFiMWUwYiIvPgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiIHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dD48IVtDREFUQVtEZWx0YV1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L2NvbHVtbkhlYWRlcj4KCTxkZXRhaWw+CgkJPGJhbmQgaGVpZ2h0PSIxNSIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTEyMCIgaGVpZ2h0PSIxNCIgdXVpZD0iM2U4ZmRkNmQtYTZmZi00NDA3LTlhMWUtNWQ2YjQ3MDYzMDBhIi8+CgkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgcGF0dGVybj0iZGQuTU0ueXl5eSwgSEg6bW06c3MiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iMTMiIGlzUHJpbnRXaGVuRGV0YWlsT3ZlcmZsb3dzPSJ0cnVlIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHM7CgkJCQkJUmVwb3J0VXRpbHMuY29udmVydERhdGVUaW1lKCRGe3RpbWVzdGFtcH0pXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iRGV0YWlsIiB4PSIxMjAiIHk9IjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIxMyIgaXNQcmludFdoZW5EZXRhaWxPdmVyZmxvd3M9InRydWUiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCI+CgkJCQkJCTxwcmludFdoZW5FeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucHJpc20uUHJpc21SZWZlcmVuY2VWYWx1ZTsKCQkJCQkkRntpbml0aWF0b3JSZWZ9IGluc3RhbmNlb2YgUHJpc21SZWZlcmVuY2VWYWx1ZV1dPjwvcHJpbnRXaGVuRXhwcmVzc2lvbj4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRntpbml0aWF0b3JSZWZ9LmdldFRhcmdldE5hbWUoKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgeD0iMjAwIiB5PSIwIiB3aWR0aD0iOTAiIGhlaWdodD0iMTMiIGlzUHJpbnRXaGVuRGV0YWlsT3ZlcmZsb3dzPSJ0cnVlIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsKCQkJCQkkRntldmVudFR5cGV9ICE9IG51bGwgPyBSZXBvcnRVdGlscy5nZXRQcm9wZXJ0eVN0cmluZygiQXVkaXRFdmVudFR5cGUuIiskRntldmVudFR5cGV9KSA6IG51bGxdXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHg9IjI5MCIgeT0iMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjEzIiBpc1ByaW50V2hlbkRldGFpbE92ZXJmbG93cz0idHJ1ZSIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHM7CgkJCQkJJEZ7ZXZlbnRTdGFnZX0gIT0gbnVsbCA/IFJlcG9ydFV0aWxzLmdldFByb3BlcnR5U3RyaW5nKCJBdWRpdEV2ZW50U3RhZ2VUeXBlLiIrJEZ7ZXZlbnRTdGFnZX0pIDogbnVsbF1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgeD0iMzgwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEzIiBpc1ByaW50V2hlbkRldGFpbE92ZXJmbG93cz0idHJ1ZSIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ij4KCQkJCQkJPHByaW50V2hlbkV4cHJlc3Npb24+PCFbQ0RBVEFbISRGe3RhcmdldFJlZn0uZXF1YWxzKG51bGwpXV0+PC9wcmludFdoZW5FeHByZXNzaW9uPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2ltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucHJpc20uUHJpc21SZWZlcmVuY2VWYWx1ZTsKCQkJCQlpZighKCRGe3RhcmdldFJlZn0gaW5zdGFuY2VvZiBQcmlzbVJlZmVyZW5jZVZhbHVlKSl7CgkJCQkJICAgcmV0dXJuIG51bGwKCQkJCQl9CgkJCQkJCgkJCQkJaWYoJEZ7dGFyZ2V0UmVmfSAhPSBudWxsKXsKCQkJCQkgICAkRnt0YXJnZXRSZWZ9LmdldFRhcmdldFR5cGUoKS5nZXRMb2NhbFBhcnQoKSsiOiAiKyRGe3RhcmdldFJlZn0uZ2V0VGFyZ2V0TmFtZSgpCgkJCQkJfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgeD0iNDgwIiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iMTMiIGlzUHJpbnRXaGVuRGV0YWlsT3ZlcmZsb3dzPSJ0cnVlIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsKCQkJCQkkRntvdXRjb21lfSAhPSBudWxsID8gUmVwb3J0VXRpbHMuZ2V0UHJvcGVydHlTdHJpbmcoIk9wZXJhdGlvblJlc3VsdFN0YXR1c1R5cGUuIiskRntvdXRjb21lfSkgOiBudWxsXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29kZSIgeD0iNTYwIiB5PSIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjEzIiBpc1ByaW50V2hlbkRldGFpbE92ZXJmbG93cz0idHJ1ZSIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRnttZXNzYWdlfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvZGUiIHg9IjcyMCIgeT0iMCIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIxMyIgaXNQcmludFdoZW5EZXRhaWxPdmVyZmxvd3M9InRydWUiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlsczsKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5PYmplY3REZWx0YU9wZXJhdGlvblR5cGU7CgkJCQkJCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgaWYoJEZ7ZGVsdGF9ID09IG51bGwpewoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSAiIjsKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBmb3IoT2JqZWN0RGVsdGFPcGVyYXRpb25UeXBlIG9iamVjdERlbHRhIDogJEZ7ZGVsdGF9KXsKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQgKyBSZXBvcnRVdGlscy5wcmludERlbHRhKG9iamVjdERlbHRhLmdldE9iamVjdERlbHRhKCksIChvYmplY3REZWx0YS5nZXRPYmplY3ROYW1lKCk9PW51bGwpP251bGw6b2JqZWN0RGVsdGEuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCksIChvYmplY3REZWx0YS5nZXRSZXNvdXJjZU5hbWUoKT09bnVsbCk/bnVsbDpvYmplY3REZWx0YS5nZXRSZXNvdXJjZU5hbWUoKS50b1N0cmluZygpKSArICJcbiIKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsICYmIHJldC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnN1YnN0cmluZygwLCByZXQubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRdXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTxsaW5lPgoJCQkJCTxyZXBvcnRFbGVtZW50IHBvc2l0aW9uVHlwZT0iRml4UmVsYXRpdmVUb0JvdHRvbSIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIxMyIgd2lkdGg9IjExMjAiIGhlaWdodD0iMSIgZm9yZWNvbG9yPSIjMzMzMzMzIiB1dWlkPSI0N2Y5MTgwMS1jZjVmLTRiZWQtYjE5Yy1jYTM5MzFjYmY5OGQiLz4KCQkJCTwvbGluZT4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L2RldGFpbD4KCTxjb2x1bW5Gb290ZXI+CgkJPGJhbmQgaGVpZ2h0PSI3IiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8bGluZT4KCQkJCTxyZXBvcnRFbGVtZW50IHBvc2l0aW9uVHlwZT0iRml4UmVsYXRpdmVUb0JvdHRvbSIgeD0iMCIgeT0iMyIgd2lkdGg9IjExMjAiIGhlaWdodD0iMSIgdXVpZD0iYTU5MWQ0YzEtMWNhZC00ZGEyLTlmOWQtMDgxZjUzOWU5MDQzIi8+CgkJCQk8Z3JhcGhpY0VsZW1lbnQ+CgkJCQkJPHBlbiBsaW5lV2lkdGg9IjAuNSIgbGluZUNvbG9yPSIjOTk5OTk5Ii8+CgkJCQk8L2dyYXBoaWNFbGVtZW50PgoJCQk8L2xpbmU+CgkJPC9iYW5kPgoJPC9jb2x1bW5Gb290ZXI+Cgk8cGFnZUZvb3Rlcj4KCQk8YmFuZCBoZWlnaHQ9IjMyIiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8ZnJhbWU+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIG1vZGU9IlRyYW5zcGFyZW50IiB4PSIwIiB5PSIxIiB3aWR0aD0iMTEyMCIgaGVpZ2h0PSIyNCIgZm9yZWNvbG9yPSIjMDAwMDAwIiBiYWNrY29sb3I9IiMyNjc5OTQiIHV1aWQ9ImZiZThhYWU0LTY1MDAtNDY4YS1iMWU4LTcwMGI1NjkxMzlhMSIvPgoJCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJFRUVFRSBkZCBNTU1NTSB5eXl5Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjIiIHk9IjEiIHdpZHRoPSIxOTciIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IGphdmEudXRpbC5EYXRlKCldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiB4PSIxMDAwIiB5PSIxIiB3aWR0aD0iODAiIGhlaWdodD0iMjAiIHV1aWQ9IjVjMDYyYzY2LWJhNDUtNDI4OC05ZGNkLTI0NmUyOGM1YWY3NSIvPgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJSaWdodCIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyJQYWdlICIrJFZ7UEFHRV9OVU1CRVJ9KyIgb2YiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGV2YWx1YXRpb25UaW1lPSJSZXBvcnQiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgeD0iMTA4MCIgeT0iMSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjIwIiB1dWlkPSI5MzRiMTZlOC1jM2ViLTQwMTctODY2YS0wYjc3MzViZjI5MTciLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyIgIiArICRWe1BBR0VfTlVNQkVSfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQk8L2ZyYW1lPgoJCTwvYmFuZD4KCTwvcGFnZUZvb3Rlcj4KCTxzdW1tYXJ5PgoJCTxiYW5kIHNwbGl0VHlwZT0iU3RyZXRjaCIvPgoJPC9zdW1tYXJ5Pgo8L2phc3BlclJlcG9ydD4K - PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8IURPQ1RZUEUgamFzcGVyVGVtcGxhdGUNCiAgUFVCTElDICItLy9KYXNwZXJSZXBvcnRzLy9EVEQgVGVtcGxhdGUvL0VOIg0KICAiaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2R0ZHMvamFzcGVydGVtcGxhdGUuZHRkIj4NCjxqYXNwZXJUZW1wbGF0ZT4NCiAgICAgICAgCTxzdHlsZSBmb250TmFtZT0iRGVqYVZ1IFNhbnMiIGZvbnRTaXplPSIxMCIgaEFsaWduPSJMZWZ0IiBpc0RlZmF1bHQ9InRydWUiIGlzUGRmRW1iZWRkZWQ9InRydWUiIA0KCQkJCSAgIG5hbWU9IkJhc2UiIHBkZkVuY29kaW5nPSJJZGVudGl0eS1IIiBwZGZGb250TmFtZT0iRGVqYVZ1U2Fucy50dGYiIHZBbGlnbj0iTWlkZGxlIj4NCgkJCTwvc3R5bGU+DQoJCQk8c3R5bGUgYmFja2NvbG9yPSIjMjY3OTk0IiBmb250U2l6ZT0iMjYiIGZvcmVjb2xvcj0iI0ZGRkZGRiIgaXNEZWZhdWx0PSJmYWxzZSINCiAgICAgICAgICAgICAgICAgICBtb2RlPSJPcGFxdWUiIG5hbWU9IlRpdGxlIiBzdHlsZT0iQmFzZSIvPiANCgkJCTxzdHlsZSBmb250U2l6ZT0iMTIiIGZvcmVjb2xvcj0iIzAwMDAwMCIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iUGFnZSBoZWFkZXIiDQogICAgICAgICAgICAgICAgICAgc3R5bGU9IkJhc2UiLz4NCgkJCTxzdHlsZSBiYWNrY29sb3I9IiMzMzMzMzMiIGZvbnRTaXplPSIxMiIgZm9yZWNvbG9yPSIjRkZGRkZGIiBoQWxpZ249IkNlbnRlciINCiAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIiBtb2RlPSJPcGFxdWUiIG5hbWU9IkNvbHVtbiBoZWFkZXIiIHN0eWxlPSJCYXNlIi8+DQoJCQk8c3R5bGUgaXNCb2xkPSJmYWxzZSIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iRGV0YWlsIiBzdHlsZT0iQmFzZSIvPg0KICAgICAgICAgICAgPHN0eWxlIGlzQm9sZD0iZmFsc2UiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IkNvZGUiIHN0eWxlPSJCYXNlIiBmb250U2l6ZT0iOSIvPg0KCQkJPHN0eWxlIGZvbnRTaXplPSI5IiBmb3JlY29sb3I9IiMwMDAwMDAiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IlBhZ2UgZm9vdGVyIg0KICAgICAgICAgICAgICAgICAgIHN0eWxlPSJCYXNlIi8+DQoJCTwvamFzcGVyVGVtcGxhdGU+ - html - JRSwapFileVirtualizer - 300 - 10000 - 300000 - - - prismReference - - diff --git a/config/initial-objects/090-report-audit.xml b/config/initial-objects/090-report-audit.xml new file mode 100644 index 00000000000..1704e9025ea --- /dev/null +++ b/config/initial-objects/090-report-audit.xml @@ -0,0 +1,227 @@ + + + + + All audit records report + Report made from all audit records. + + + + + + + + + + + + targetRef + + filterAll + + + + + initiatorRef + + filterAll + + + + + outcome + + filterAll + + + + + eventType + + filterAll + + + + + eventStage + + filterAll + + + + + timestamp + + filterAll + + + + + timestamp + + filterAll + + + + + + + + outcome + OperationResultStatusType + + + outcome + + AuditEventRecordType.outcome + + + + + + eventType + AuditEventTypeType + + + eventType + + AuditEventRecordType.eventType + + + + + + eventStage + AuditEventStageType + + + eventStage + + AuditEventRecordType.eventStage + + + + + + from + dateTime + + + from + + AuditPopupPanel.dateFrom + + + + + + to + dateTime + + + to + + AuditPopupPanel.dateTo + + + + + + target + c:ObjectReferenceType + + + targetRef + + AuditEventRecordType.targetRef + + + + + + initiator + c:ObjectReferenceType + + + initiatorRef + + AuditEventRecordType.initiatorRef + + + + + + diff --git a/config/initial-objects/100-report-reconciliation.xml b/config/initial-objects/100-report-reconciliation.xml index 32f521d5f4d..147ab42051e 100644 --- a/config/initial-objects/100-report-reconciliation.xml +++ b/config/initial-objects/100-report-reconciliation.xml @@ -1,22 +1,215 @@ - - Reconciliation report (Jasper) - Reconciliation report for selected resource. - - true - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRSZWNvbmNpbGlhdGlvbiIgcGFnZVdpZHRoPSIxMDQyIiBwYWdlSGVpZ2h0PSI1OTUiIG9yaWVudGF0aW9uPSJMYW5kc2NhcGUiIHdoZW5Ob0RhdGFUeXBlPSJBbGxTZWN0aW9uc05vRGV0YWlsIiBjb2x1bW5XaWR0aD0iMTAwMiIgbGVmdE1hcmdpbj0iMjAiIHJpZ2h0TWFyZ2luPSIyMCIgdG9wTWFyZ2luPSIyMCIgYm90dG9tTWFyZ2luPSIyMCIgdXVpZD0iNjdlNDY1YzUtNDZlYS00MGQyLWJlYTAtNDY5YzZjZjM4OTM3Ij4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5hd3QuaWdub3JlLm1pc3NpbmcuZm9udCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQucGRmLmZvcmNlLmxpbmVicmVhay5wb2xpY3kiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjEiIHZhbHVlPSJ0aXRsZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5jc3YuZXhjbHVkZS5vcmlnaW4uYmFuZC4yIiB2YWx1ZT0icGFnZUZvb3RlciIvPgoJPHN1YkRhdGFzZXQgbmFtZT0ib3duZXJEYXRhc2V0IiB1dWlkPSJiODFiOGRmZi01ODdiLTQzZTYtYWNkYy0wYjk3NDhmNDc2MTAiPgoJCTxwYXJhbWV0ZXIgbmFtZT0ic2hhZG93T2lkIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJCTxxdWVyeVN0cmluZyBsYW5ndWFnZT0ibXFsIj4KCQkJPCFbQ0RBVEFbPGNvZGU+CiAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnNjaGVtYS5HZXRPcGVyYXRpb25PcHRpb25zOwogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC5zY2hlbWEuU2VsZWN0b3JPcHRpb25zOwogICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuKjsKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQucHJpc20ucXVlcnkuKgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBxdWVyeSA9IG1pZHBvaW50LmdldFByaXNtQ29udGV4dCgpLnF1ZXJ5Rm9yKEZvY3VzVHlwZS5jbGFzcykKCQkJCS5pdGVtKEZvY3VzVHlwZS5GX0xJTktfUkVGKS5yZWYoc2hhZG93T2lkKQoJCQkJLmJ1aWxkKCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBTZWxlY3Rvck9wdGlvbnMuY3JlYXRlQ29sbGVjdGlvbihHZXRPcGVyYXRpb25PcHRpb25zLmNyZWF0ZVJhdygpKQogICAgICAgICAgICAgICAgbWlkcG9pbnQuc2VhcmNoT2JqZWN0cyhGb2N1c1R5cGUuY2xhc3MsIHF1ZXJ5LCBvcHRpb25zKTsKICAgICAgICAgICAgPC9jb2RlPl1dPgoJCTwvcXVlcnlTdHJpbmc+CgkJPGZpZWxkIG5hbWU9Im5hbWUiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQucHJpc20ucG9seXN0cmluZy5Qb2x5U3RyaW5nIi8+Cgk8L3N1YkRhdGFzZXQ+Cgk8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyI+CgkJPHByb3BlcnR5IG5hbWU9InRhcmdldFR5cGUiIHZhbHVlPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLlJlc291cmNlVHlwZSIvPgoJCTxwcm9wZXJ0eSBuYW1lPSJrZXkiIHZhbHVlPSJuYW1lIi8+CgkJPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB2YWx1ZT0ibmFtZSIvPgoJCTxwcm9wZXJ0eSBuYW1lPSJtYW5kYXRvcnkiIHZhbHVlPSJ0cnVlIi8+Cgk8L3BhcmFtZXRlcj4KCTxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJPHBhcmFtZXRlciBuYW1lPSJvYmplY3RDbGFzcyIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KCTxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuU2hhZG93S2luZFR5cGUiLz4KCTxwYXJhbWV0ZXIgbmFtZT0ic2l0dWF0aW9uIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5TeW5jaHJvbml6YXRpb25TaXR1YXRpb25UeXBlIi8+Cgk8cXVlcnlTdHJpbmcgbGFuZ3VhZ2U9Im1xbCI+CgkJPCFbQ0RBVEFbPGZpbHRlcj4NCiAgICA8dHlwZT4NCiAgICAgICAgPHR5cGU+U2hhZG93VHlwZTwvdHlwZT4NCiAgICAgICAgPGZpbHRlcj4NCiAgICAgICAgICAgIDxhbmQ+DQogICAgICAgICAgICAgICAgPHJlZj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGg+cmVzb3VyY2VSZWY8L3BhdGg+DQogICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHF1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+ZmlsdGVyQWxsPC9xdWVyeUludGVycHJldGF0aW9uT2ZOb1ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuUmVzb3VyY2VUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5PYmplY3RSZWZlcmVuY2VUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2VUeXBlIG9ydCA9IG5ldyBPYmplY3RSZWZlcmVuY2VUeXBlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlIHJlc09iajsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPYmogPSBtaWRwb2ludC5zZWFyY2hPYmplY3RCeU5hbWUoUmVzb3VyY2VUeXBlLmNsYXNzLCByZXNvdXJjZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzT2JqICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcnQuc2V0T2lkKHJlc09iai5nZXRPaWQoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ydC5zZXRUeXBlKFJlc291cmNlVHlwZS5DT01QTEVYX1RZUEUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3J0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29kZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDwvcmVmPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPGVxdWFsPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5zeW5jaHJvbml6YXRpb25TaXR1YXRpb248L3BhdGg+DQogICAgICAgICAgICAgICAgICAgIDxleHByZXNzaW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHF1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+ZmlsdGVyQWxsPC9xdWVyeUludGVycHJldGF0aW9uT2ZOb1ZhbHVlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGg+JHNpdHVhdGlvbjwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgIDwvZXF1YWw+ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8ZXF1YWw+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoPm9iamVjdENsYXNzPC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxxdWVyeUludGVycHJldGF0aW9uT2ZOb1ZhbHVlPmZpbHRlckFsbDwvcXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0Q2xhc3MgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoImh0dHA6Ly9taWRwb2ludC5ldm9sdmV1bS5jb20veG1sL25zL3B1YmxpYy9yZXNvdXJjZS9pbnN0YW5jZS0zIiwgb2JqZWN0Q2xhc3MpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2RlPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPC9lcXVhbD4gICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgPGVxdWFsPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5raW5kPC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxxdWVyeUludGVycHJldGF0aW9uT2ZOb1ZhbHVlPmZpbHRlckFsbDwvcXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPiRraW5kPC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgPC9lcXVhbD4NCiAgICAgICAgICAgICAgICA8ZXF1YWw+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoPmludGVudDwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8cXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT5maWx0ZXJBbGw8L3F1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aD4kaW50ZW50PC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgPC9lcXVhbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIDwvYW5kPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIDwvZmlsdGVyPg0KICAgIDwvdHlwZT4NCjwvZmlsdGVyPl1dPgoJPC9xdWVyeVN0cmluZz4KCTxmaWVsZCBuYW1lPSJvaWQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8ZmllbGQgbmFtZT0ibmFtZSIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC5wcmlzbS5wb2x5c3RyaW5nLlBvbHlTdHJpbmciLz4KCTxmaWVsZCBuYW1lPSJzeW5jaHJvbml6YXRpb25TaXR1YXRpb24iIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLlN5bmNocm9uaXphdGlvblNpdHVhdGlvblR5cGUiLz4KCTxmaWVsZCBuYW1lPSJzeW5jaHJvbml6YXRpb25UaW1lc3RhbXAiIGNsYXNzPSJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiLz4KCTxmaWVsZCBuYW1lPSJyZXNvdXJjZVJlZiIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuT2JqZWN0UmVmZXJlbmNlVHlwZSIvPgoJPGJhY2tncm91bmQ+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L2JhY2tncm91bmQ+Cgk8dGl0bGU+CgkJPGJhbmQgaGVpZ2h0PSIxMzgiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJUaXRsZSIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwMCIgaGVpZ2h0PSI2NyIgYmFja2NvbG9yPSIjMjY3OTk0IiB1dWlkPSI0NGJlZGFjYy1mYTIzLTRmZTEtYjcxZi1lNWFmYTk0M2Y1NTMiLz4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJUaXRsZSIgeD0iMTAiIHk9IjEzIiB3aWR0aD0iMjY2IiBoZWlnaHQ9IjM4IiB1dWlkPSJmMmQ5OWNhZC05ZDg0LTRmNTAtYjQ1NS00NTNjODdmNjJjNGMiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW1JlY29uY2lsaWF0aW9uIFJlcG9ydF1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJPC9mcmFtZT4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjIiIHk9IjcwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtSZXNvdXJjZTpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSIxMDIiIHk9IjcwIiB3aWR0aD0iMjgwIiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJFB7cmVzb3VyY2V9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjIiIHk9IjkwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtJbnRlbnQ6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMTAyIiB5PSI5MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIyMCIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSI+CgkJCQkJPGZvbnQgaXNCb2xkPSJmYWxzZSIvPgoJCQkJPC90ZXh0RWxlbWVudD4KCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRQe2ludGVudH1dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMiIgeT0iMTEwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtPYmplY3QgQ2xhc3M6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMTAyIiB5PSIxMTAiIHdpZHRoPSIxNTAiIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskUHtvYmplY3RDbGFzc31dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iNDAwIiB5PSI3MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIyMCIgdXVpZD0iZTAzNWRiZDUtZGMyZi00NWNiLTkzNmMtYTA4ZTljMDExZTQzIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbUmVwb3J0IGdlbmVyYXRlZCBvbjpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJFRUVFRSBkZCBNTU1NTSB5eXl5LCBISDptbTpzcyI+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjU1MCIgeT0iNzAiIHdpZHRoPSIyNTAiIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IlJpZ2h0IiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IGphdmEudXRpbC5EYXRlKCldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iNDAwIiB5PSI5MCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIyMCIgdXVpZD0iODU5OWIyYzUtM2EyNC00NTk0LTk4YjktNWIzZjM4ZjM5ZTI0Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbTnVtYmVyIG9mIHJlY29yZHM6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQgZXZhbHVhdGlvblRpbWU9IlJlcG9ydCIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iNTUwIiB5PSI5MCIgd2lkdGg9IjI1MCIgaGVpZ2h0PSIyMCIgdXVpZD0iZjZiMDEwMTYtMjQwNi00MTk1LThiM2ItMzVkY2EyMzJjZTY4Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iUmlnaHQiIHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskVntSRVBPUlRfQ09VTlR9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQk8L2JhbmQ+Cgk8L3RpdGxlPgoJPHBhZ2VIZWFkZXI+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L3BhZ2VIZWFkZXI+Cgk8Y29sdW1uSGVhZGVyPgoJCTxiYW5kIGhlaWdodD0iMjQiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiBtb2RlPSJUcmFuc3BhcmVudCIgeD0iMCIgeT0iMSIgd2lkdGg9IjEwMDAiIGhlaWdodD0iMTkiIGlzUmVtb3ZlTGluZVdoZW5CbGFuaz0idHJ1ZSIgdXVpZD0iM2U4ZmRkNmQtYTZmZi00NDA3LTlhMWUtNWQ2YjQ3MDYzMDBhIi8+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW05hbWVdXT48L3RleHQ+CgkJCQk8L3N0YXRpY1RleHQ+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iMzAwIiB5PSIwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbUmVzb3VyY2VdXT48L3RleHQ+CgkJCQk8L3N0YXRpY1RleHQ+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNTAwIiB5PSIwIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbU2l0dWF0aW9uXV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjY1MCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW093bmVyXV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9Ijg1MCIgeT0iMCIgd2lkdGg9IjE1MCIgaGVpZ2h0PSIxOCIgdXVpZD0iODZjNzRiZWItYmRkZC00OGNjLTk0NWEtMTY3YjI2MWIxZTBiIi8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW1RpbWVzdGFtcF1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L2NvbHVtbkhlYWRlcj4KCTxkZXRhaWw+CgkJPGJhbmQgaGVpZ2h0PSIxNyIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgc3RyZXRjaFR5cGU9IlJlbGF0aXZlVG9UYWxsZXN0T2JqZWN0IiBtb2RlPSJPcGFxdWUiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjE0IiB1dWlkPSIzZThmZGQ2ZC1hNmZmLTQ0MDctOWExZS01ZDZiNDcwNjMwMGEiLz4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHN0cmV0Y2hUeXBlPSJSZWxhdGl2ZVRvVGFsbGVzdE9iamVjdCIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwMCIgaGVpZ2h0PSIxMyIgaXNQcmludFdoZW5EZXRhaWxPdmVyZmxvd3M9InRydWUiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7bmFtZX0uZ2V0T3JpZygpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iRGV0YWlsIiBzdHJldGNoVHlwZT0iUmVsYXRpdmVUb1RhbGxlc3RPYmplY3QiIHg9IjMwMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMyIgaXNQcmludFdoZW5EZXRhaWxPdmVyZmxvd3M9InRydWUiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7cmVzb3VyY2VSZWZ9LmdldE5hbWUoKS5nZXRPcmlnKCldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHN0cmV0Y2hUeXBlPSJSZWxhdGl2ZVRvVGFsbGVzdE9iamVjdCIgeD0iNTAwIiB5PSIwIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjEzIiBpc1ByaW50V2hlbkRldGFpbE92ZXJmbG93cz0idHJ1ZSIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe3N5bmNocm9uaXphdGlvblNpdHVhdGlvbn1dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBwYXR0ZXJuPSJkZC5NTS55eSwgSEg6bW06c3MiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgc3RyZXRjaFR5cGU9IlJlbGF0aXZlVG9UYWxsZXN0T2JqZWN0IiB4PSI4NTAiIHk9IjAiIHdpZHRoPSIxNTAiIGhlaWdodD0iMTMiIGlzUHJpbnRXaGVuRGV0YWlsT3ZlcmZsb3dzPSJ0cnVlIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7c3luY2hyb25pemF0aW9uVGltZXN0YW1wfS50b0dyZWdvcmlhbkNhbGVuZGFyKCkuZ2V0VGltZSgpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8Y29tcG9uZW50RWxlbWVudD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI2NTAiIHk9IjEiIHdpZHRoPSIyMDAiIGhlaWdodD0iMTMiIHV1aWQ9ImZjNjBkYzA1LWEwNmQtNDFhYy04MjM4LWU1MjdlNWE3MDVkYyIvPgoJCQkJCTxqcjpsaXN0IHhtbG5zOmpyPSJodHRwOi8vamFzcGVycmVwb3J0cy5zb3VyY2Vmb3JnZS5uZXQvamFzcGVycmVwb3J0cy9jb21wb25lbnRzIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXNwZXJyZXBvcnRzLnNvdXJjZWZvcmdlLm5ldC9qYXNwZXJyZXBvcnRzL2NvbXBvbmVudHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9jb21wb25lbnRzLnhzZCIgcHJpbnRPcmRlcj0iVmVydGljYWwiPgoJCQkJCQk8ZGF0YXNldFJ1biBzdWJEYXRhc2V0PSJvd25lckRhdGFzZXQiIHV1aWQ9IjcwYjIwZTMwLWFiNjAtNDEyNi04YzI4LTE4MjBmMGVhOTlkMyI+CgkJCQkJCQk8cGFyYW1ldGVyc01hcEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IEhhc2hNYXAoJFB7UkVQT1JUX1BBUkFNRVRFUlNfTUFQfSldXT48L3BhcmFtZXRlcnNNYXBFeHByZXNzaW9uPgoJCQkJCQkJPGRhdGFzZXRQYXJhbWV0ZXIgbmFtZT0ic2hhZG93T2lkIj4KCQkJCQkJCQk8ZGF0YXNldFBhcmFtZXRlckV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7b2lkfV1dPjwvZGF0YXNldFBhcmFtZXRlckV4cHJlc3Npb24+CgkJCQkJCQk8L2RhdGFzZXRQYXJhbWV0ZXI+CgkJCQkJCQk8Y29ubmVjdGlvbkV4cHJlc3Npb24+PCFbQ0RBVEFbJFB7UkVQT1JUX0NPTk5FQ1RJT059XV0+PC9jb25uZWN0aW9uRXhwcmVzc2lvbj4KCQkJCQkJPC9kYXRhc2V0UnVuPgoJCQkJCQk8anI6bGlzdENvbnRlbnRzIGhlaWdodD0iMTIiIHdpZHRoPSIyMDAiPgoJCQkJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIxMiIgdXVpZD0iNTFhYzM0Y2QtMWVjZi00OWFiLWJiOWYtY2VkZmM1ZjFjNTZlIi8+CgkJCQkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe25hbWV9LmdldE9yaWcoKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCQkJCTwvdGV4dEZpZWxkPgoJCQkJCQk8L2pyOmxpc3RDb250ZW50cz4KCQkJCQk8L2pyOmxpc3Q+CgkJCQk8L2NvbXBvbmVudEVsZW1lbnQ+CgkJCQk8bGluZT4KCQkJCQk8cmVwb3J0RWxlbWVudCBwb3NpdGlvblR5cGU9IkZpeFJlbGF0aXZlVG9Cb3R0b20iIG1vZGU9Ik9wYXF1ZSIgeD0iMCIgeT0iMTMiIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjEiIGZvcmVjb2xvcj0iIzMzMzMzMyIgdXVpZD0iNDdmOTE4MDEtY2Y1Zi00YmVkLWIxOWMtY2EzOTMxY2JmOThkIi8+CgkJCQk8L2xpbmU+CgkJCTwvZnJhbWU+CgkJPC9iYW5kPgoJPC9kZXRhaWw+Cgk8Y29sdW1uRm9vdGVyPgoJCTxiYW5kIGhlaWdodD0iNyIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGxpbmU+CgkJCQk8cmVwb3J0RWxlbWVudCBwb3NpdGlvblR5cGU9IkZpeFJlbGF0aXZlVG9Cb3R0b20iIHg9IjAiIHk9IjMiIHdpZHRoPSIxMDAwIiBoZWlnaHQ9IjEiIHV1aWQ9ImE1OTFkNGMxLTFjYWQtNGRhMi05ZjlkLTA4MWY1MzllOTA0MyIvPgoJCQkJPGdyYXBoaWNFbGVtZW50PgoJCQkJCTxwZW4gbGluZVdpZHRoPSIwLjUiIGxpbmVDb2xvcj0iIzk5OTk5OSIvPgoJCQkJPC9ncmFwaGljRWxlbWVudD4KCQkJPC9saW5lPgoJCTwvYmFuZD4KCTwvY29sdW1uRm9vdGVyPgoJPHBhZ2VGb290ZXI+CgkJPGJhbmQgaGVpZ2h0PSIzMiIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiBtb2RlPSJUcmFuc3BhcmVudCIgeD0iMCIgeT0iMSIgd2lkdGg9IjEwMDAiIGhlaWdodD0iMjQiIGZvcmVjb2xvcj0iIzAwMDAwMCIgYmFja2NvbG9yPSIjMjY3OTk0IiB1dWlkPSJmYmU4YWFlNC02NTAwLTQ2OGEtYjFlOC03MDBiNTY5MTM5YTEiLz4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiB4PSI4ODAiIHk9IjEiIHdpZHRoPSI4MCIgaGVpZ2h0PSIyMCIgdXVpZD0iNWMwNjJjNjYtYmE0NS00Mjg4LTlkY2QtMjQ2ZTI4YzVhZjc1Ii8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IlJpZ2h0IiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQkJPGZvbnQgc2l6ZT0iOSIgaXNCb2xkPSJ0cnVlIi8+CgkJCQkJPC90ZXh0RWxlbWVudD4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVsiUGFnZSAiKyRWe1BBR0VfTlVNQkVSfSsiIG9mIl1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJFRUVFRSBkZCBNTU1NTSB5eXl5Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjIiIHk9IjEiIHdpZHRoPSIxOTciIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQkJPGZvbnQgc2l6ZT0iOSIgaXNCb2xkPSJ0cnVlIi8+CgkJCQkJPC90ZXh0RWxlbWVudD4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtuZXcgamF2YS51dGlsLkRhdGUoKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBldmFsdWF0aW9uVGltZT0iUmVwb3J0Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9Ijk2MCIgeT0iMSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjIwIiB1dWlkPSI5MzRiMTZlOC1jM2ViLTQwMTctODY2YS0wYjc3MzViZjI5MTciLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSI+CgkJCQkJCTxmb250IHNpemU9IjkiIGlzQm9sZD0idHJ1ZSIvPgoJCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbIiAiICsgJFZ7UEFHRV9OVU1CRVJ9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCTwvZnJhbWU+CgkJPC9iYW5kPgoJPC9wYWdlRm9vdGVyPgoJPHN1bW1hcnk+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L3N1bW1hcnk+CjwvamFzcGVyUmVwb3J0Pgo= - PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8IURPQ1RZUEUgamFzcGVyVGVtcGxhdGUNCiAgUFVCTElDICItLy9KYXNwZXJSZXBvcnRzLy9EVEQgVGVtcGxhdGUvL0VOIg0KICAiaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2R0ZHMvamFzcGVydGVtcGxhdGUuZHRkIj4NCjxqYXNwZXJUZW1wbGF0ZT4NCiAgICAgICAgCTxzdHlsZSBmb250TmFtZT0iRGVqYVZ1IFNhbnMiIGZvbnRTaXplPSIxMCIgaEFsaWduPSJMZWZ0IiBpc0RlZmF1bHQ9InRydWUiIGlzUGRmRW1iZWRkZWQ9InRydWUiIA0KCQkJCSAgIG5hbWU9IkJhc2UiIHBkZkVuY29kaW5nPSJJZGVudGl0eS1IIiBwZGZGb250TmFtZT0iRGVqYVZ1U2Fucy50dGYiIHZBbGlnbj0iTWlkZGxlIj4NCgkJCTwvc3R5bGU+DQoJCQk8c3R5bGUgYmFja2NvbG9yPSIjMjY3OTk0IiBmb250U2l6ZT0iMjYiIGZvcmVjb2xvcj0iI0ZGRkZGRiIgaXNEZWZhdWx0PSJmYWxzZSINCiAgICAgICAgICAgICAgICAgICBtb2RlPSJPcGFxdWUiIG5hbWU9IlRpdGxlIiBzdHlsZT0iQmFzZSIvPiANCgkJCTxzdHlsZSBmb250U2l6ZT0iMTIiIGZvcmVjb2xvcj0iIzAwMDAwMCIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iUGFnZSBoZWFkZXIiDQogICAgICAgICAgICAgICAgICAgc3R5bGU9IkJhc2UiLz4NCgkJCTxzdHlsZSBiYWNrY29sb3I9IiMzMzMzMzMiIGZvbnRTaXplPSIxMiIgZm9yZWNvbG9yPSIjRkZGRkZGIiBoQWxpZ249IkNlbnRlciINCiAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIiBtb2RlPSJPcGFxdWUiIG5hbWU9IkNvbHVtbiBoZWFkZXIiIHN0eWxlPSJCYXNlIi8+DQoJCQk8c3R5bGUgaXNCb2xkPSJmYWxzZSIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iRGV0YWlsIiBzdHlsZT0iQmFzZSIvPg0KICAgICAgICAgICAgPHN0eWxlIGlzQm9sZD0iZmFsc2UiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IkNvZGUiIHN0eWxlPSJCYXNlIiBmb250U2l6ZT0iOSIvPg0KCQkJPHN0eWxlIGZvbnRTaXplPSI5IiBmb3JlY29sb3I9IiMwMDAwMDAiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IlBhZ2UgZm9vdGVyIg0KICAgICAgICAgICAgICAgICAgIHN0eWxlPSJCYXNlIi8+DQoJCTwvamFzcGVyVGVtcGxhdGU+ - pdf - JRSwapFileVirtualizer - 300 - 10000 - 300000 - + + + Reconciliation report + Reconciliation report for selected resource. + + + + + + + + + + + + resourceRef + + filterAll + + + + + synchronizationSituation + + filterAll + + + + + objectClass + + filterAll + + + + + kind + + filterAll + + + + + intent + + filterAll + + + + + + + + intent + string + + + intent + + ShadowType.intent + + + + + + objectClass + string + + + objectClass + + ShadowType.objectClass + + + + + + kind + ShadowKindType + + + kind + + ShadowType.kind + + + + + + situation + SynchronizationSituationType + + + situation + + ShadowType.synchronizationSituation + + + + + + resource + c:ObjectReferenceType + c:ResourceType + + + resource + + ObjectTypeGuiDescriptor.resource + + + + + + ShadowType + + nameColumn + name + + + resourceColumn + resourceRef + nameColumn + + + situationColumn + synchronizationSituation + resourceColumn + + + ownerColumn + + Owner + + + + + + + situationColumn + + + synchTimestampColumn + synchronizationTimestamp + ownerColumn + + + diff --git a/config/initial-objects/110-report-user-list.xml b/config/initial-objects/110-report-user-list.xml index e1e6395cf7a..1d4c9ca25fb 100644 --- a/config/initial-objects/110-report-user-list.xml +++ b/config/initial-objects/110-report-user-list.xml @@ -1,21 +1,257 @@ - - Users in MidPoint (Jasper) + + + Users in MidPoint Users listed in MidPoint. - - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRVc2VyTGlzdCIgcGFnZVdpZHRoPSIxMTIwIiBwYWdlSGVpZ2h0PSI1OTUiIG9yaWVudGF0aW9uPSJMYW5kc2NhcGUiIHdoZW5Ob0RhdGFUeXBlPSJBbGxTZWN0aW9uc05vRGV0YWlsIiBjb2x1bW5XaWR0aD0iMTA4MCIgbGVmdE1hcmdpbj0iMjAiIHJpZ2h0TWFyZ2luPSIyMCIgdG9wTWFyZ2luPSIzMCIgYm90dG9tTWFyZ2luPSIzMCIgdXVpZD0iNjdlNDY1YzUtNDZlYS00MGQyLWJlYTAtNDY5YzZjZjM4OTM3Ij4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5wcmludC5rZWVwLmZ1bGwudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLnJlbW92ZS5lbXB0eS5zcGFjZS5iZXR3ZWVuLmNvbHVtbnMiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5yZW1vdmUuZW1wdHkuc3BhY2UuYmV0d2Vlbi5yb3dzIiB2YWx1ZT0idHJ1ZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5wZGYuZm9yY2UubGluZWJyZWFrLnBvbGljeSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQuY3N2LmV4Y2x1ZGUub3JpZ2luLmJhbmQuMSIgdmFsdWU9InRpdGxlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjEiIHZhbHVlPSJwYWdlSGVhZGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5rZWVwLmZpcnN0LmJhbmQuMiIgdmFsdWU9ImNvbHVtbkhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZGV0ZWN0LmNlbGwudHlwZSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLndyYXAudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LnJvdyIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LmNvbHVtbiIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5hd3QuaWdub3JlLm1pc3NpbmcuZm9udCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0Lnpvb20iIHZhbHVlPSIxLjAiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0LngiIHZhbHVlPSIxNiIvPgoJPHByb3BlcnR5IG5hbWU9ImlyZXBvcnQueSIgdmFsdWU9IjE0Ii8+Cgk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmRhdGEuZGVmYXVsdGRhdGFhZGFwdGVyIiB2YWx1ZT0ibXFsIi8+Cgk8aW1wb3J0IHZhbHVlPSJjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMiLz4KCTxzdWJEYXRhc2V0IG5hbWU9InJvbGVzRGF0YXNldCIgdXVpZD0iNjU5ZDNmYmEtZDAzZC00M2JjLThkY2QtNTAyZDAzNDQzZWJlIj4KCQk8cGFyYW1ldGVyIG5hbWU9ImFzc2lnbm1lbnQiIGNsYXNzPSJqYXZhLnV0aWwuTGlzdCIvPgoJCTxxdWVyeVN0cmluZyBsYW5ndWFnZT0ibXFsIj4KCQkJPCFbQ0RBVEFbPGNvZGU+aWYgKGFzc2lnbm1lbnQgIT0gbnVsbCl7cmVwb3J0LnJlc29sdmVSb2xlcyhhc3NpZ25tZW50KX08L2NvZGU+XV0+CgkJPC9xdWVyeVN0cmluZz4KCQk8ZmllbGQgbmFtZT0ibmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KCTwvc3ViRGF0YXNldD4KCTxzdWJEYXRhc2V0IG5hbWU9Im9yZ3NEYXRhc2V0IiB1dWlkPSI2NGE1Yzk0YS1jYmM2LTQyNjgtYmNiMy0wY2VmMzNhYTVlMDIiPgoJCTxwYXJhbWV0ZXIgbmFtZT0iYXNzaWdubWVudCIgY2xhc3M9ImphdmEudXRpbC5MaXN0Ii8+CgkJPHF1ZXJ5U3RyaW5nIGxhbmd1YWdlPSJtcWwiPgoJCQk8IVtDREFUQVs8Y29kZT4KCQkJCQlpZiAoYXNzaWdubWVudCAhPSBudWxsKXsKCQkJCQlyZXBvcnQucmVzb2x2ZU9yZ3MoYXNzaWdubWVudCkKCQkJCQl9CgkJCQk8L2NvZGU+XV0+CgkJPC9xdWVyeVN0cmluZz4KCQk8ZmllbGQgbmFtZT0ibmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KCTwvc3ViRGF0YXNldD4KCTxzdWJEYXRhc2V0IG5hbWU9ImFjY291bnRzRGF0YXNldCIgdXVpZD0iYzRkODQ0ZTctMTRjNC00OWI4LWJmMTEtYzkyMWQ1OGExZDQwIj4KCQk8cGFyYW1ldGVyIG5hbWU9Im9iamVjdFJlZiIgY2xhc3M9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KCQk8cXVlcnlTdHJpbmcgbGFuZ3VhZ2U9Im1xbCI+CgkJCTwhW0NEQVRBWzxjb2RlPgoJCQlpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5TaGFkb3dUeXBlOwoJCQkKCQkJaWYgKG9iamVjdFJlZiAhPSBudWxsKXsKCQkJCQlyZXBvcnQucmVzb2x2ZUxpbmtSZWZzKG9iamVjdFJlZiwgU2hhZG93VHlwZS5jbGFzcykKCQkJCQl9CgkJCTwvY29kZT5dXT4KCQk8L3F1ZXJ5U3RyaW5nPgoJCTxmaWVsZCBuYW1lPSJuYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJCTxmaWVsZCBuYW1lPSJyZXNvdXJjZVJlZiIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuT2JqZWN0UmVmZXJlbmNlVHlwZSIvPgoJPC9zdWJEYXRhc2V0PgoJPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0aW9uIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5BY3RpdmF0aW9uU3RhdHVzVHlwZSIvPgoJPHBhcmFtZXRlciBuYW1lPSJvcmdhbml6YXRpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8cGFyYW1ldGVyIG5hbWU9InJvbGUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyI+CgkJPHByb3BlcnR5IG5hbWU9ImtleSIgdmFsdWU9Im9pZCIvPgoJCTxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdmFsdWU9Im5hbWUiLz4KCQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0VHlwZSIgdmFsdWU9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuUmVzb3VyY2VUeXBlIi8+Cgk8L3BhcmFtZXRlcj4KCTxxdWVyeVN0cmluZyBsYW5ndWFnZT0ibXFsIj4KCQk8IVtDREFUQVs8ZmlsdGVyPg0KICAgIDx0eXBlPg0KICAgICAgICA8dHlwZT5Vc2VyVHlwZTwvdHlwZT4NCiAgICAgICAgPGZpbHRlcj4NCiAgICAgICAgICAgIDxhbmQ+DQogICAgICAgICAgICAgICAgPGVxdWFsPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5hY3RpdmF0aW9uL2FkbWluaXN0cmF0aXZlU3RhdHVzPC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxxdWVyeUludGVycHJldGF0aW9uT2ZOb1ZhbHVlPmZpbHRlckFsbDwvcXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoPiRhY3RpdmF0aW9uPC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgPC9lcXVhbD4NCiAgICAgICAgICAgICAgICA8cmVmPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5hc3NpZ25tZW50L3RhcmdldFJlZjwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8cXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT5maWx0ZXJBbGw8L3F1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5PcmdUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5PYmplY3RSZWZlcmVuY2VUeXBlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmdhbml6YXRpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2VUeXBlIG9ydCA9IG5ldyBPYmplY3RSZWZlcmVuY2VUeXBlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J0LnNldE9pZChvcmdhbml6YXRpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcnQuc2V0VHlwZShPcmdUeXBlLkNPTVBMRVhfVFlQRSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2RlPiAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4NCiAgICAgICAgICAgICAgICA8L3JlZj4NCiAgICAgICAgICAgICAgICA8cmVmPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5hc3NpZ25tZW50L3RhcmdldFJlZjwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8cXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT5maWx0ZXJBbGw8L3F1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5Sb2xlVHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuT2JqZWN0UmVmZXJlbmNlVHlwZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm9sZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZVR5cGUgb3J0ID0gbmV3IE9iamVjdFJlZmVyZW5jZVR5cGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcnQuc2V0T2lkKHJvbGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcnQuc2V0VHlwZShSb2xlVHlwZS5DT01QTEVYX1RZUEUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3J0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29kZT4gICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICA8L2V4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgPC9yZWY+ICANCiAgICAgICAgICAgICAgICA8cmVmPg0KICAgICAgICAgICAgICAgICAgICA8cGF0aD5hc3NpZ25tZW50L2NvbnN0cnVjdGlvbi9yZXNvdXJjZVJlZjwvcGF0aD4NCiAgICAgICAgICAgICAgICAgICAgPGV4cHJlc3Npb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8cXVlcnlJbnRlcnByZXRhdGlvbk9mTm9WYWx1ZT5maWx0ZXJBbGw8L3F1ZXJ5SW50ZXJwcmV0YXRpb25PZk5vVmFsdWU+DQogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5SZXNvdXJjZVR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLk9iamVjdFJlZmVyZW5jZVR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UmVmZXJlbmNlVHlwZSBvcnQgPSBuZXcgT2JqZWN0UmVmZXJlbmNlVHlwZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ydC5zZXRPaWQocmVzb3VyY2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcnQuc2V0VHlwZShSZXNvdXJjZVR5cGUuQ09NUExFWF9UWVBFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ydDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGU+ICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgPC9leHByZXNzaW9uPg0KICAgICAgICAgICAgICAgIDwvcmVmPiAgDQogICAgICAgICAgICA8L2FuZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICA8L2ZpbHRlcj4NCiAgICA8L3R5cGU+DQo8L2ZpbHRlcj5dXT4KCTwvcXVlcnlTdHJpbmc+Cgk8ZmllbGQgbmFtZT0ib2lkIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJPGZpZWxkIG5hbWU9Im5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8ZmllbGQgbmFtZT0ibGlua1JlZiIgY2xhc3M9ImphdmEudXRpbC5BcnJheUxpc3QiLz4KCTxmaWVsZCBuYW1lPSJhc3NpZ25tZW50IiBjbGFzcz0iamF2YS51dGlsLkxpc3QiLz4KCTxmaWVsZCBuYW1lPSJhY3RpdmF0aW9uIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5BY3RpdmF0aW9uVHlwZSIvPgoJPGZpZWxkIG5hbWU9ImZ1bGxOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJPGJhY2tncm91bmQ+CgkJPGJhbmQgaGVpZ2h0PSIzMCIgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L2JhY2tncm91bmQ+Cgk8dGl0bGU+CgkJPGJhbmQgaGVpZ2h0PSIxNDUiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJUaXRsZSIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTA4MCIgaGVpZ2h0PSI2NyIgYmFja2NvbG9yPSIjMjY3OTk0IiB1dWlkPSI0NGJlZGFjYy1mYTIzLTRmZTEtYjcxZi1lNWFmYTk0M2Y1NTMiLz4KCQkJCTxzdGF0aWNUZXh0PgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJUaXRsZSIgeD0iMTAiIHk9IjEzIiB3aWR0aD0iMjY2IiBoZWlnaHQ9IjM4IiB1dWlkPSJmMmQ5OWNhZC05ZDg0LTRmNTAtYjQ1NS00NTNjODdmNjJjNGMiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW1VzZXIgUmVwb3J0XV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQk8L2ZyYW1lPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMiIgeT0iODUiIHdpZHRoPSIxNTAiIGhlaWdodD0iMjAiIHV1aWQ9ImIwYjk3MTRmLTk2ZjUtNGY1OC04MjRiLWM4MWZkNGQzMjFmNyIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW1JlcG9ydCBnZW5lcmF0ZWQgb246XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQgcGF0dGVybj0iZGQuTU1NTS55eXl5LCBISDptbTpzcyI+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjE2MCIgeT0iODUiIHdpZHRoPSIyNTAiIGhlaWdodD0iMjAiIHV1aWQ9IjA5YTdlMjcyLTIwNGUtNDA3OC04YTVlLWU0NzI3NTc0MjRjMSIvPgoJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IlJpZ2h0IiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IGphdmEudXRpbC5EYXRlKCldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCTwvdGV4dEZpZWxkPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGhlYWRlciIgeD0iMiIgeT0iMTE1IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjIwIiB1dWlkPSIzZmY3OGZiZi04ZmNlLTQwNzItYjY5MS03YWYwNDdlYTkyYTciLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtOdW1iZXIgb2YgcmVjb3JkczpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBldmFsdWF0aW9uVGltZT0iUmVwb3J0IiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSIxNjAiIHk9IjExNSIgd2lkdGg9IjI1MCIgaGVpZ2h0PSIyMCIgdXVpZD0iODkyNTEyMTEtM2Y0OS00NzFkLWI4OGQtNTU2NGMxYmQwNGQxIi8+CgkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iUmlnaHQiIHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskVntSRVBPUlRfQ09VTlR9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQk8L2JhbmQ+Cgk8L3RpdGxlPgoJPHBhZ2VIZWFkZXI+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L3BhZ2VIZWFkZXI+Cgk8Y29sdW1uSGVhZGVyPgoJCTxiYW5kIGhlaWdodD0iMTkiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjAiIHk9IjAiIHdpZHRoPSIyNDAiIGhlaWdodD0iMTgiIHV1aWQ9IjA0OTg5MDliLWQzYzUtNGVlMy1iOGM5LWYwMGE4MDhlZmE3YSIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW05hbWVdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iMjQwIiB5PSIwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtGdWxsIG5hbWVdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNDYwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjE4IiB1dWlkPSI4NmM3NGJlYi1iZGRkLTQ4Y2MtOTQ1YS0xNjdiMjYxYjFlMGIiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtBY3RpdmF0aW9uXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjU2MCIgeT0iMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxOCIgdXVpZD0iMmZmZDIyOGItOGI4Ny00YmM2LWE5ZDItMzFlOGEyZDVkYmI3Ii8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbUm9sZV1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI3MDAiIHk9IjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTgiIHV1aWQ9IjJjNGZhZWIzLWQxOWMtNGMxZS1iZmJmLTFiMTBjZWNlOGFlOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW09yZ2FuaXphdGlvbl1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI4NDAiIHk9IjAiIHdpZHRoPSIyNDAiIGhlaWdodD0iMTgiIHV1aWQ9IjNlNGUyMzE5LTI1MDItNGE1My1hNmI0LWM3OTY4NTIxZjZiOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW0FjY291bnRdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQk8L2JhbmQ+Cgk8L2NvbHVtbkhlYWRlcj4KCTxkZXRhaWw+CgkJPGJhbmQgaGVpZ2h0PSIyNSIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgc3RyZXRjaFR5cGU9IlJlbGF0aXZlVG9UYWxsZXN0T2JqZWN0IiBtb2RlPSJPcGFxdWUiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMDgwIiBoZWlnaHQ9IjI0IiB1dWlkPSI4NmRiNjUzNy04MWYwLTQyYjEtYjc0YS1kMmJlNzA5MjcxY2QiLz4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjAiIHk9IjAiIHdpZHRoPSIyODAiIGhlaWdodD0iMjAiIHV1aWQ9IjNjNjY4ZWVlLWNkM2UtNDY5Ny1hZmUzLWVkYjc4OTQ1MjVjYyIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe25hbWV9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSIyODAiIHk9IjAiIHdpZHRoPSIxODAiIGhlaWdodD0iMjAiIHV1aWQ9ImM4OTQ4Yzg1LWVjMzEtNGIzOS04ODlhLTQzY2JjZTcwZjdmOCIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe2Z1bGxOYW1lfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iNDYwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjIwIiB1dWlkPSI4OTliMDY2ZC1kOGNmLTQ1OTQtODNiNC0xYTM1YTk1NDE2NDgiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRnthY3RpdmF0aW9ufS5nZXRBZG1pbmlzdHJhdGl2ZVN0YXR1cygpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8Y29tcG9uZW50RWxlbWVudD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI1NjAiIHk9IjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTkiIHV1aWQ9IjQyYTdmMDFmLTM1OGEtNGEwZC1hNmFhLTRjOWMwOTNiZTNjNiIvPgoJCQkJCTxqcjpsaXN0IHhtbG5zOmpyPSJodHRwOi8vamFzcGVycmVwb3J0cy5zb3VyY2Vmb3JnZS5uZXQvamFzcGVycmVwb3J0cy9jb21wb25lbnRzIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXNwZXJyZXBvcnRzLnNvdXJjZWZvcmdlLm5ldC9qYXNwZXJyZXBvcnRzL2NvbXBvbmVudHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9jb21wb25lbnRzLnhzZCIgcHJpbnRPcmRlcj0iSG9yaXpvbnRhbCI+CgkJCQkJCTxkYXRhc2V0UnVuIHN1YkRhdGFzZXQ9InJvbGVzRGF0YXNldCIgdXVpZD0iMzAwNTg2ZDYtMGYzMi00YWY5LWIyN2YtYWI5OTE2NzUwMWQ1Ij4KCQkJCQkJCTxwYXJhbWV0ZXJzTWFwRXhwcmVzc2lvbj48IVtDREFUQVtuZXcgSGFzaE1hcCgkUHtSRVBPUlRfUEFSQU1FVEVSU19NQVB9KV1dPjwvcGFyYW1ldGVyc01hcEV4cHJlc3Npb24+CgkJCQkJCQk8ZGF0YXNldFBhcmFtZXRlciBuYW1lPSJhc3NpZ25tZW50Ij4KCQkJCQkJCQk8ZGF0YXNldFBhcmFtZXRlckV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7YXNzaWdubWVudH1dXT48L2RhdGFzZXRQYXJhbWV0ZXJFeHByZXNzaW9uPgoJCQkJCQkJPC9kYXRhc2V0UGFyYW1ldGVyPgoJCQkJCQkJPGNvbm5lY3Rpb25FeHByZXNzaW9uPjwhW0NEQVRBWyRQe1JFUE9SVF9DT05ORUNUSU9OfV1dPjwvY29ubmVjdGlvbkV4cHJlc3Npb24+CgkJCQkJCTwvZGF0YXNldFJ1bj4KCQkJCQkJPGpyOmxpc3RDb250ZW50cyBoZWlnaHQ9IjE4IiB3aWR0aD0iMTQwIj4KCQkJCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIiBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjAiIHk9IjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTgiIHV1aWQ9IjYxZGM5NDBlLTFkZjQtNDczZC1hMWY1LWMyMWRmNjY2ZThhMSIvPgoJCQkJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe25hbWV9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJCQkJPC90ZXh0RmllbGQ+CgkJCQkJCTwvanI6bGlzdENvbnRlbnRzPgoJCQkJCTwvanI6bGlzdD4KCQkJCTwvY29tcG9uZW50RWxlbWVudD4KCQkJCTxjb21wb25lbnRFbGVtZW50PgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjcwMCIgeT0iMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxOSIgdXVpZD0iZTdmNjY4ZjMtOTY2NC00NjYwLThiMTYtMGQyNWRmN2QzZTJkIi8+CgkJCQkJPGpyOmxpc3QgeG1sbnM6anI9Imh0dHA6Ly9qYXNwZXJyZXBvcnRzLnNvdXJjZWZvcmdlLm5ldC9qYXNwZXJyZXBvcnRzL2NvbXBvbmVudHMiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMvY29tcG9uZW50cyBodHRwOi8vamFzcGVycmVwb3J0cy5zb3VyY2Vmb3JnZS5uZXQveHNkL2NvbXBvbmVudHMueHNkIiBwcmludE9yZGVyPSJIb3Jpem9udGFsIj4KCQkJCQkJPGRhdGFzZXRSdW4gc3ViRGF0YXNldD0ib3Jnc0RhdGFzZXQiIHV1aWQ9ImFmNjRjMTdjLTAyZWUtNDA0NC1hOWNlLTkxYTkwYTdhNGUwOCI+CgkJCQkJCQk8cGFyYW1ldGVyc01hcEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IEhhc2hNYXAoJFB7UkVQT1JUX1BBUkFNRVRFUlNfTUFQfSldXT48L3BhcmFtZXRlcnNNYXBFeHByZXNzaW9uPgoJCQkJCQkJPGRhdGFzZXRQYXJhbWV0ZXIgbmFtZT0iYXNzaWdubWVudCI+CgkJCQkJCQkJPGRhdGFzZXRQYXJhbWV0ZXJFeHByZXNzaW9uPjwhW0NEQVRBWyRGe2Fzc2lnbm1lbnR9XV0+PC9kYXRhc2V0UGFyYW1ldGVyRXhwcmVzc2lvbj4KCQkJCQkJCTwvZGF0YXNldFBhcmFtZXRlcj4KCQkJCQkJCTxjb25uZWN0aW9uRXhwcmVzc2lvbj48IVtDREFUQVskUHtSRVBPUlRfQ09OTkVDVElPTn1dXT48L2Nvbm5lY3Rpb25FeHByZXNzaW9uPgoJCQkJCQk8L2RhdGFzZXRSdW4+CgkJCQkJCTxqcjpsaXN0Q29udGVudHMgaGVpZ2h0PSIxOSIgd2lkdGg9IjE0MCI+CgkJCQkJCQk8dGV4dEZpZWxkIGlzU3RyZXRjaFdpdGhPdmVyZmxvdz0idHJ1ZSIgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQkJCQk8cmVwb3J0RWxlbWVudCB4PSIwIiB5PSIwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE5IiB1dWlkPSI5ZjQ4OTRmMy00ZGFjLTQ4MTMtODBjZi1hZDk3MDgzNmMwZWEiLz4KCQkJCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRntuYW1lfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCQkJCTwvdGV4dEZpZWxkPgoJCQkJCQk8L2pyOmxpc3RDb250ZW50cz4KCQkJCQk8L2pyOmxpc3Q+CgkJCQk8L2NvbXBvbmVudEVsZW1lbnQ+CgkJCQk8Y29tcG9uZW50RWxlbWVudD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI4NDAiIHk9IjAiIHdpZHRoPSIyNDAiIGhlaWdodD0iMTkiIHV1aWQ9ImE4Y2UyNTAwLWQ3OTktNDhjYy1hMzMxLTRjMTNhMmFmNjc0NCIvPgoJCQkJCTxqcjpsaXN0IHhtbG5zOmpyPSJodHRwOi8vamFzcGVycmVwb3J0cy5zb3VyY2Vmb3JnZS5uZXQvamFzcGVycmVwb3J0cy9jb21wb25lbnRzIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXNwZXJyZXBvcnRzLnNvdXJjZWZvcmdlLm5ldC9qYXNwZXJyZXBvcnRzL2NvbXBvbmVudHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9jb21wb25lbnRzLnhzZCIgcHJpbnRPcmRlcj0iSG9yaXpvbnRhbCI+CgkJCQkJCTxkYXRhc2V0UnVuIHN1YkRhdGFzZXQ9ImFjY291bnRzRGF0YXNldCIgdXVpZD0iNmYxODVmNDgtZGJjMC00NzAzLThjZjItNWY5YzJjNzQwZDk3Ij4KCQkJCQkJCTxwYXJhbWV0ZXJzTWFwRXhwcmVzc2lvbj48IVtDREFUQVtuZXcgSGFzaE1hcCgkUHtSRVBPUlRfUEFSQU1FVEVSU19NQVB9KV1dPjwvcGFyYW1ldGVyc01hcEV4cHJlc3Npb24+CgkJCQkJCQk8ZGF0YXNldFBhcmFtZXRlciBuYW1lPSJvYmplY3RSZWYiPgoJCQkJCQkJCTxkYXRhc2V0UGFyYW1ldGVyRXhwcmVzc2lvbj48IVtDREFUQVskRntsaW5rUmVmfV1dPjwvZGF0YXNldFBhcmFtZXRlckV4cHJlc3Npb24+CgkJCQkJCQk8L2RhdGFzZXRQYXJhbWV0ZXI+CgkJCQkJCQk8Y29ubmVjdGlvbkV4cHJlc3Npb24+PCFbQ0RBVEFbJFB7UkVQT1JUX0NPTk5FQ1RJT059XV0+PC9jb25uZWN0aW9uRXhwcmVzc2lvbj4KCQkJCQkJPC9kYXRhc2V0UnVuPgoJCQkJCQk8anI6bGlzdENvbnRlbnRzIGhlaWdodD0iMTkiIHdpZHRoPSIyNDAiPgoJCQkJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMCIgeT0iMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSIxOSIgdXVpZD0iNGU1OTg5ZGYtNzM0Yy00MWFkLTg0NzItYjZhNmY4OTM5YjI4Ii8+CgkJCQkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7bmFtZX0rIiAoUmVzb3VyY2U6ICIrJEZ7cmVzb3VyY2VSZWZ9LmdldE5hbWUoKS5nZXRPcmlnKCkrIikiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJCQkJPC90ZXh0RmllbGQ+CgkJCQkJCTwvanI6bGlzdENvbnRlbnRzPgoJCQkJCTwvanI6bGlzdD4KCQkJCTwvY29tcG9uZW50RWxlbWVudD4KCQkJCTxsaW5lPgoJCQkJCTxyZXBvcnRFbGVtZW50IHBvc2l0aW9uVHlwZT0iRml4UmVsYXRpdmVUb0JvdHRvbSIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIxOSIgd2lkdGg9IjEwODAiIGhlaWdodD0iMSIgZm9yZWNvbG9yPSIjMzMzMzMzIiB1dWlkPSI0N2Y5MTgwMS1jZjVmLTRiZWQtYjE5Yy1jYTM5MzFjYmY5OGQiLz4KCQkJCTwvbGluZT4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L2RldGFpbD4KCTxjb2x1bW5Gb290ZXI+CgkJPGJhbmQgaGVpZ2h0PSI3IiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8bGluZT4KCQkJCTxyZXBvcnRFbGVtZW50IHBvc2l0aW9uVHlwZT0iRml4UmVsYXRpdmVUb0JvdHRvbSIgeD0iMCIgeT0iMyIgd2lkdGg9IjEwODAiIGhlaWdodD0iMSIgdXVpZD0iYTU5MWQ0YzEtMWNhZC00ZGEyLTlmOWQtMDgxZjUzOWU5MDQzIi8+CgkJCQk8Z3JhcGhpY0VsZW1lbnQ+CgkJCQkJPHBlbiBsaW5lV2lkdGg9IjAuNSIgbGluZUNvbG9yPSIjOTk5OTk5Ii8+CgkJCQk8L2dyYXBoaWNFbGVtZW50PgoJCQk8L2xpbmU+CgkJPC9iYW5kPgoJPC9jb2x1bW5Gb290ZXI+Cgk8cGFnZUZvb3Rlcj4KCQk8YmFuZCBoZWlnaHQ9IjMyIiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8ZnJhbWU+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIG1vZGU9IlRyYW5zcGFyZW50IiB4PSIwIiB5PSIxIiB3aWR0aD0iMTA4MCIgaGVpZ2h0PSIyNCIgdXVpZD0iZmJlOGFhZTQtNjUwMC00NjhhLWIxZTgtNzAwYjU2OTEzOWExIi8+CgkJCQk8dGV4dEZpZWxkIHBhdHRlcm49ImRkLk1NTU1NLnl5eXkiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgeD0iMiIgeT0iMSIgd2lkdGg9IjE5NyIgaGVpZ2h0PSIyMCIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtuZXcgamF2YS51dGlsLkRhdGUoKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9Ijk2MCIgeT0iMSIgd2lkdGg9IjgwIiBoZWlnaHQ9IjIwIiB1dWlkPSI1YzA2MmM2Ni1iYTQ1LTQyODgtOWRjZC0yNDZlMjhjNWFmNzUiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iUmlnaHQiIHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVsiUGFnZSAiKyRWe1BBR0VfTlVNQkVSfSsiIG9mIl1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBldmFsdWF0aW9uVGltZT0iUmVwb3J0Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjEwNDAiIHk9IjEiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMCIgdXVpZD0iOTM0YjE2ZTgtYzNlYi00MDE3LTg2NmEtMGI3NzM1YmYyOTE3Ii8+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVsiICIgKyAkVntQQUdFX05VTUJFUn1dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L3BhZ2VGb290ZXI+CjwvamFzcGVyUmVwb3J0Pgo= - PD94bWwgdmVyc2lvbj0iMS4wIj8+DQo8IURPQ1RZUEUgamFzcGVyVGVtcGxhdGUNCiAgUFVCTElDICItLy9KYXNwZXJSZXBvcnRzLy9EVEQgVGVtcGxhdGUvL0VOIg0KICAiaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2R0ZHMvamFzcGVydGVtcGxhdGUuZHRkIj4NCjxqYXNwZXJUZW1wbGF0ZT4NCiAgICAgICAgCTxzdHlsZSBmb250TmFtZT0iRGVqYVZ1IFNhbnMiIGZvbnRTaXplPSIxMCIgaEFsaWduPSJMZWZ0IiBpc0RlZmF1bHQ9InRydWUiIGlzUGRmRW1iZWRkZWQ9InRydWUiIA0KCQkJCSAgIG5hbWU9IkJhc2UiIHBkZkVuY29kaW5nPSJJZGVudGl0eS1IIiBwZGZGb250TmFtZT0iRGVqYVZ1U2Fucy50dGYiIHZBbGlnbj0iTWlkZGxlIj4NCgkJCTwvc3R5bGU+DQoJCQk8c3R5bGUgYmFja2NvbG9yPSIjMjY3OTk0IiBmb250U2l6ZT0iMjYiIGZvcmVjb2xvcj0iI0ZGRkZGRiIgaXNEZWZhdWx0PSJmYWxzZSINCiAgICAgICAgICAgICAgICAgICBtb2RlPSJPcGFxdWUiIG5hbWU9IlRpdGxlIiBzdHlsZT0iQmFzZSIvPiANCgkJCTxzdHlsZSBmb250U2l6ZT0iMTIiIGZvcmVjb2xvcj0iIzAwMDAwMCIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iUGFnZSBoZWFkZXIiDQogICAgICAgICAgICAgICAgICAgc3R5bGU9IkJhc2UiLz4NCgkJCTxzdHlsZSBiYWNrY29sb3I9IiMzMzMzMzMiIGZvbnRTaXplPSIxMiIgZm9yZWNvbG9yPSIjRkZGRkZGIiBoQWxpZ249IkNlbnRlciINCiAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIiBtb2RlPSJPcGFxdWUiIG5hbWU9IkNvbHVtbiBoZWFkZXIiIHN0eWxlPSJCYXNlIi8+DQoJCQk8c3R5bGUgaXNCb2xkPSJmYWxzZSIgaXNEZWZhdWx0PSJmYWxzZSIgbmFtZT0iRGV0YWlsIiBzdHlsZT0iQmFzZSIvPg0KICAgICAgICAgICAgPHN0eWxlIGlzQm9sZD0iZmFsc2UiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IkNvZGUiIHN0eWxlPSJCYXNlIiBmb250U2l6ZT0iOSIvPg0KCQkJPHN0eWxlIGZvbnRTaXplPSI5IiBmb3JlY29sb3I9IiMwMDAwMDAiIGlzRGVmYXVsdD0iZmFsc2UiIG5hbWU9IlBhZ2UgZm9vdGVyIg0KICAgICAgICAgICAgICAgICAgIHN0eWxlPSJCYXNlIi8+DQoJCTwvamFzcGVyVGVtcGxhdGU+ - pdf - JRSwapFileVirtualizer - 300 - 10000 - 300000 - + + + + + + + + + activation/administrativeStatus + + filterAll + + + + + assignment/targetRef + + filterAll + + + + + assignment/targetRef + + filterAll + + + + + assignment/construction/resourceRef + + filterAll + + + + + + + + activation + ActivationStatusType + + + activation + + ActivationType.administrativeStatus + + + + + + organization + c:ObjectReferenceType + c:OrgType + + + organization + + ObjectTypeGuiDescriptor.org + + + + + + role + c:ObjectReferenceType + c:RoleType + + + role + + ObjectTypeGuiDescriptor.role + + + + + + resource + c:ObjectReferenceType + c:ResourceType + + + resource + + ObjectTypeGuiDescriptor.resource + + + + + + + nameColumn + name + + + fullNameColumn + fullName + nameColumn + + + activationColumn + activation/administrativeStatus + fullNameColumn + + + roleColumn + assignment + + Role + + + + + + + activationColumn + + + orgColumn + assignment + + Organization + + + + + + + roleColumn + + + accountColumn + linkRef + + Account + + + + + + + orgColumn + + UserType + + diff --git a/config/initial-objects/130-report-certification-definitions.xml b/config/initial-objects/130-report-certification-definitions.xml index 9795729d665..575014f957a 100644 --- a/config/initial-objects/130-report-certification-definitions.xml +++ b/config/initial-objects/130-report-certification-definitions.xml @@ -7,6 +7,7 @@ --> Certification definitions report All certification definitions with basic information on related campaigns. @@ -15,15 +16,14 @@ - + + + nameColumn name - - Name - ownerColumn @@ -43,21 +43,12 @@ + number openCampaignsColumn @@ -74,7 +65,6 @@ oid = object.getOid(); numberOfCampaigns = 0; - campaigns = midpoint.searchObjects(AccessCertificationCampaignType.class, prismContext.queryFor(AccessCertificationCampaignType.class).build(), null); for (AccessCertificationCampaignType campaign : campaigns) { if (oid.equals(campaign.getDefinitionRef().getOid())) { AccessCertificationCampaignStateType state = campaign.getState(); @@ -89,6 +79,7 @@ + number lastStartedColumn @@ -124,8 +115,26 @@ + + ascending + name + AccessCertificationDefinitionType + + campaigns + AccessCertificationCampaignType + + + + true diff --git a/config/initial-objects/140-report-certification-campaigns.xml b/config/initial-objects/140-report-certification-campaigns.xml index 78b2853c93e..51afc737483 100644 --- a/config/initial-objects/140-report-certification-campaigns.xml +++ b/config/initial-objects/140-report-certification-campaigns.xml @@ -7,19 +7,180 @@ --> - Certification campaigns report (Jasper) - All certification campaigns along with their state. - - true - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRVc2VyTGlzdCIgcGFnZVdpZHRoPSIxMjAwIiBwYWdlSGVpZ2h0PSI1OTUiIG9yaWVudGF0aW9uPSJMYW5kc2NhcGUiIHdoZW5Ob0RhdGFUeXBlPSJBbGxTZWN0aW9uc05vRGV0YWlsIiBjb2x1bW5XaWR0aD0iMTE2MCIgbGVmdE1hcmdpbj0iMjAiIHJpZ2h0TWFyZ2luPSIyMCIgdG9wTWFyZ2luPSIzMCIgYm90dG9tTWFyZ2luPSIzMCIgdXVpZD0iNjdlNDY1YzUtNDZlYS00MGQyLWJlYTAtNDY5YzZjZjM4OTM3Ij4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5wcmludC5rZWVwLmZ1bGwudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLnJlbW92ZS5lbXB0eS5zcGFjZS5iZXR3ZWVuLmNvbHVtbnMiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5yZW1vdmUuZW1wdHkuc3BhY2UuYmV0d2Vlbi5yb3dzIiB2YWx1ZT0idHJ1ZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5wZGYuZm9yY2UubGluZWJyZWFrLnBvbGljeSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQuY3N2LmV4Y2x1ZGUub3JpZ2luLmJhbmQuMSIgdmFsdWU9InRpdGxlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjEiIHZhbHVlPSJwYWdlSGVhZGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5rZWVwLmZpcnN0LmJhbmQuMiIgdmFsdWU9ImNvbHVtbkhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZGV0ZWN0LmNlbGwudHlwZSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLndyYXAudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LnJvdyIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LmNvbHVtbiIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5hd3QuaWdub3JlLm1pc3NpbmcuZm9udCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0Lnpvb20iIHZhbHVlPSIxLjAiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0LngiIHZhbHVlPSIxNiIvPgoJPHByb3BlcnR5IG5hbWU9ImlyZXBvcnQueSIgdmFsdWU9IjE0Ii8+Cgk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmRhdGEuZGVmYXVsdGRhdGFhZGFwdGVyIiB2YWx1ZT0ibXFsLnhtbCIvPgoJPGltcG9ydCB2YWx1ZT0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy4qIi8+Cgk8aW1wb3J0IHZhbHVlPSJjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMiLz4KCTxpbXBvcnQgdmFsdWU9ImNvbS5ldm9sdmV1bS5taWRwb2ludC5zY2hlbWEudXRpbC5DZXJ0Q2FtcGFpZ25UeXBlVXRpbCIvPgoJPHN0eWxlIG5hbWU9IkJhc2UiIGlzRGVmYXVsdD0idHJ1ZSIgaFRleHRBbGlnbj0iTGVmdCIgaEltYWdlQWxpZ249IkxlZnQiIHZUZXh0QWxpZ249Ik1pZGRsZSIgdkltYWdlQWxpZ249Ik1pZGRsZSIgZm9udE5hbWU9IkRlamFWdSBTYW5zIiBmb250U2l6ZT0iMTAiIHBkZkZvbnROYW1lPSJEZWphVnVTYW5zLnR0ZiIgcGRmRW5jb2Rpbmc9IklkZW50aXR5LUgiIGlzUGRmRW1iZWRkZWQ9InRydWUiLz4KCTxzdHlsZSBuYW1lPSJUaXRsZSIgc3R5bGU9IkJhc2UiIG1vZGU9Ik9wYXF1ZSIgZm9yZWNvbG9yPSIjRkZGRkZGIiBiYWNrY29sb3I9IiMyNjc5OTQiIGZvbnRTaXplPSIyNiIvPgoJPHN0eWxlIG5hbWU9IlBhZ2UgaGVhZGVyIiBzdHlsZT0iQmFzZSIgZm9yZWNvbG9yPSIjMDAwMDAwIiBmb250U2l6ZT0iMTIiLz4KCTxzdHlsZSBuYW1lPSJDb2x1bW4gaGVhZGVyIiBzdHlsZT0iQmFzZSIgbW9kZT0iT3BhcXVlIiBmb3JlY29sb3I9IiNGRkZGRkYiIGJhY2tjb2xvcj0iIzMzMzMzMyIgaFRleHRBbGlnbj0iQ2VudGVyIiBoSW1hZ2VBbGlnbj0iQ2VudGVyIiBmb250U2l6ZT0iMTIiLz4KCTxzdHlsZSBuYW1lPSJEZXRhaWwiIHN0eWxlPSJCYXNlIiBpc0JvbGQ9ImZhbHNlIi8+Cgk8c3R5bGUgbmFtZT0iQ29kZSIgc3R5bGU9IkJhc2UiIGZvbnRTaXplPSI5IiBpc0JvbGQ9ImZhbHNlIi8+Cgk8c3R5bGUgbmFtZT0iUGFnZSBmb290ZXIiIHN0eWxlPSJCYXNlIiBmb3JlY29sb3I9IiMwMDAwMDAiIGZvbnRTaXplPSI5Ii8+Cgk8cGFyYW1ldGVyIG5hbWU9ImFsc29DbG9zZWRDYW1wYWlnbnMiIGNsYXNzPSJqYXZhLmxhbmcuQm9vbGVhbiI+CgkJPHBhcmFtZXRlckRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3VsZCB3ZSBzaG93IGFsc28gY2FtcGFpZ25zIHRoYXQgd2VyZSBhbHJlYWR5IGNsb3NlZD8gKGRlZmF1bHQgaXMgZmFsc2UpXV0+PC9wYXJhbWV0ZXJEZXNjcmlwdGlvbj4KCTwvcGFyYW1ldGVyPgoJPHF1ZXJ5U3RyaW5nIGxhbmd1YWdlPSJtcWwiPgoJCTwhW0NEQVRBWzxjb2RlPiAgICAgICAgDQogICAgcmVwb3J0LmdldENlcnRpZmljYXRpb25DYW1wYWlnbnMoYWxzb0Nsb3NlZENhbXBhaWducykNCjwvY29kZT5dXT4KCTwvcXVlcnlTdHJpbmc+Cgk8ZmllbGQgbmFtZT0ib2lkIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyIvPgoJPGZpZWxkIG5hbWU9Im5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+Cgk8ZmllbGQgbmFtZT0ib3duZXJSZWYiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLk9iamVjdFJlZmVyZW5jZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJzdGFydFRpbWVzdGFtcCIgY2xhc3M9ImphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhciIvPgoJPGZpZWxkIG5hbWU9ImVuZFRpbWVzdGFtcCIgY2xhc3M9ImphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhciIvPgoJPGZpZWxkIG5hbWU9InN0YXRlIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5BY2Nlc3NDZXJ0aWZpY2F0aW9uQ2FtcGFpZ25TdGF0ZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJzdGFnZU51bWJlciIgY2xhc3M9ImphdmEubGFuZy5JbnRlZ2VyIi8+Cgk8ZmllbGQgbmFtZT0iX3RoaXNfIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnByaXNtLlByaXNtQ29udGFpbmVyVmFsdWUiLz4KCTxiYWNrZ3JvdW5kPgoJCTxiYW5kIGhlaWdodD0iNjgiIHNwbGl0VHlwZT0iU3RyZXRjaCIvPgoJPC9iYWNrZ3JvdW5kPgoJPHRpdGxlPgoJCTxiYW5kIGhlaWdodD0iMTIzIiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8ZnJhbWU+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iVGl0bGUiIG1vZGU9Ik9wYXF1ZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjExNjAiIGhlaWdodD0iNjciIGJhY2tjb2xvcj0iIzI2Nzk5NCIgdXVpZD0iNDRiZWRhY2MtZmEyMy00ZmUxLWI3MWYtZTVhZmE5NDNmNTUzIi8+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iVGl0bGUiIHg9IjEwIiB5PSIxNCIgd2lkdGg9IjExNDAiIGhlaWdodD0iMzgiIHV1aWQ9ImYyZDk5Y2FkLTlkODQtNGY1MC1iNDU1LTQ1M2M4N2Y2MmM0YyIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbQ2VydGlmaWNhdGlvbiBDYW1wYWlnbnMgUmVwb3J0XV0+PC90ZXh0PgoJCQkJPC9zdGF0aWNUZXh0PgoJCQk8L2ZyYW1lPgoJCTwvYmFuZD4KCTwvdGl0bGU+Cgk8cGFnZUhlYWRlcj4KCQk8YmFuZCBzcGxpdFR5cGU9IlN0cmV0Y2giLz4KCTwvcGFnZUhlYWRlcj4KCTxjb2x1bW5IZWFkZXI+CgkJPGJhbmQgaGVpZ2h0PSIyMCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LmhlaWdodCIgdmFsdWU9InBpeGVsIi8+CgkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuSG9yaXpvbnRhbFJvd0xheW91dCIvPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIwIiB5PSIwIiB3aWR0aD0iMzYwIiBoZWlnaHQ9IjIwIiB1dWlkPSIwNDk4OTA5Yi1kM2M1LTRlZTMtYjhjOS1mMDBhODA4ZWZhN2EiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtOYW1lXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjM2MCIgeT0iMCIgd2lkdGg9IjE0NSIgaGVpZ2h0PSIyMCIgdXVpZD0iYzUzMDU1NmItZTY3NC00N2M2LWE3OTktNmYxZDViNWJjZTYxIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbT3duZXJdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNTA1IiB5PSIwIiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjIwIiB1dWlkPSJiYmY5NGYwZC01MzVmLTRiN2YtYTJmMi03YWQzZWM1MGYwZWYiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtTdGFydF1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI2MjAiIHk9IjAiIHdpZHRoPSIxMTUiIGhlaWdodD0iMjAiIHV1aWQ9IjNiNTQ3MjJhLTk5YmYtNGM3Yy1iNjQ5LWJiMDNlYzUzMzI5ZSI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtGaW5pc2hdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNzM1IiB5PSIwIiB3aWR0aD0iNjAiIGhlaWdodD0iMjAiIHV1aWQ9IjQyMWQzOWJkLTZhZjAtNGMxYy04MzlmLTA2YzFjZjNjZjEzMCI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbQ2FzZXNdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNzk1IiB5PSIwIiB3aWR0aD0iMTc1IiBoZWlnaHQ9IjIwIiB1dWlkPSJjMTQzOWMwZC02NTgwLTRkOTYtOGM4YS1lOTg2MjI0Njk2ZjMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtTdGF0ZSBhbmQgc3RhZ2VdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iOTcwIiB5PSIwIiB3aWR0aD0iOTAiIGhlaWdodD0iMjAiIHV1aWQ9ImE4YmUxZmI5LWU3MTQtNDIzZi1iMzQ5LTQyYTIyMDQ5NGI2MSIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW1N0YWdlIGNhc2VzXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjEwNjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjAiIHV1aWQ9IjMzMTllNTliLTUyMDEtNDU0ZC05Mjk2LTcyMmM1NTdiODQ2MCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBWyUgY29tcGxldGVdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQk8L2JhbmQ+Cgk8L2NvbHVtbkhlYWRlcj4KCTxkZXRhaWw+CgkJPGJhbmQgaGVpZ2h0PSIyNCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LmhlaWdodCIgdmFsdWU9InBpeGVsIi8+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHN0cmV0Y2hUeXBlPSJSZWxhdGl2ZVRvVGFsbGVzdE9iamVjdCIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTE2MCIgaGVpZ2h0PSIyNCIgdXVpZD0iODZkYjY1MzctODFmMC00MmIxLWI3NGEtZDJiZTcwOTI3MWNkIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuSG9yaXpvbnRhbFJvd0xheW91dCIvPgoJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSIwIiB5PSIwIiB3aWR0aD0iMzYwIiBoZWlnaHQ9IjI0IiB1dWlkPSJjODk0OGM4NS1lYzMxLTRiMzktODg5YS00M2NiY2U3MGY3ZjgiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRntuYW1lfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSIzNjAiIHk9IjAiIHdpZHRoPSIxNDUiIGhlaWdodD0iMjQiIHV1aWQ9Ijc1YmZkNGEwLTU4MDAtNDdhNS1hNTNjLTQ1ODAyNTczMGJiMyI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50Rm9yUmVwb3J0KCRGe293bmVyUmVmfSwgZmFsc2UpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjUwNSIgeT0iMCIgd2lkdGg9IjExNSIgaGVpZ2h0PSIyNCIgdXVpZD0iZjliOGJiNjgtN2RjMy00N2JmLTg2MTEtODAyYjgzNjhmMjI0Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50Rm9yUmVwb3J0KCRGe3N0YXJ0VGltZXN0YW1wfSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iNjIwIiB5PSIwIiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjI0IiB1dWlkPSJiNWRlNjAwMy1jYzY0LTRlZTQtOWIyNS05OTI3ZTczNzlmNTciPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRGb3JSZXBvcnQoJEZ7ZW5kVGltZXN0YW1wfSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNCbGFua1doZW5OdWxsPSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI3MzUiIHk9IjAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIyNCIgdXVpZD0iYjkxYjNmNDUtMjUyZC00ZTcxLTk1MWMtOWUxMjBhYWY3YzVhIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7X3RoaXNffS5nZXRDYXNlKCkuc2l6ZSgpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9Ijc5NSIgeT0iMCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIyNCIgdXVpZD0iMTA0NDMwZjctZmQ2MC00Zjk4LTg5MjctMzliMjNlNzdjZjRmIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRGb3JSZXBvcnQoJEZ7c3RhdGV9KV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI5MjUiIHk9IjAiIHdpZHRoPSI0NSIgaGVpZ2h0PSIyNCIgdXVpZD0iNGYwOTgyZjMtNDg5NS00NjA1LWE1YWEtZjY0MDJiNGFlYWI4Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7c3RhdGV9ID09IGNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuQWNjZXNzQ2VydGlmaWNhdGlvbkNhbXBhaWduU3RhdGVUeXBlLklOX1JFVklFV19TVEFHRSB8fAoJCQkkRntzdGF0ZX0gPT0gY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5BY2Nlc3NDZXJ0aWZpY2F0aW9uQ2FtcGFpZ25TdGF0ZVR5cGUuUkVWSUVXX1NUQUdFX0RPTkUgCgkJCQk/ICRGe3N0YWdlTnVtYmVyfSA6ICIiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iOTcwIiB5PSIwIiB3aWR0aD0iOTAiIGhlaWdodD0iMjQiIHV1aWQ9IjhjMDliNzg3LTIzOTItNDRlOS04OTBmLTQ2ZGQwZjNiM2I2OCI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5zY2hlbWEudXRpbC5DZXJ0Q2FtcGFpZ25UeXBlVXRpbC5nZXRBY3RpdmVDYXNlcygkRntfdGhpc199LmdldENhc2UoKSwgJEZ7c3RhZ2VOdW1iZXJ9LCAkRntzdGF0ZX0pXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMTA2MCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIyNCIgdXVpZD0iOTk0YTFlMGYtY2UyOC00ZTQ0LWJiNGQtNDcwYzhiYzJjNjVkIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnNjaGVtYS51dGlsLkNlcnRDYW1wYWlnblR5cGVVdGlsLmdldENhc2VzRGVjaWRlZFBlcmNlbnRhZ2VBbGxTdGFnZXNBbGxJdGVyYXRpb25zKCRGe190aGlzX30pKyIlIl1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQk8L2ZyYW1lPgoJCTwvYmFuZD4KCTwvZGV0YWlsPgoJPHBhZ2VGb290ZXI+CgkJPGJhbmQgaGVpZ2h0PSIzMiIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiBtb2RlPSJUcmFuc3BhcmVudCIgeD0iMCIgeT0iMSIgd2lkdGg9IjExMjAiIGhlaWdodD0iMjQiIGZvcmVjb2xvcj0iIzAwMDAwMCIgYmFja2NvbG9yPSIjMjY3OTk0IiB1dWlkPSJmYmU4YWFlNC02NTAwLTQ2OGEtYjFlOC03MDBiNTY5MTM5YTEiLz4KCQkJCTx0ZXh0RmllbGQgcGF0dGVybj0iRUVFRUUgZGQgTU1NTU0geXl5eSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiB4PSIyIiB5PSIxIiB3aWR0aD0iMTk3IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW25ldyBqYXZhLnV0aWwuRGF0ZSgpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgeD0iMTAwMCIgeT0iMSIgd2lkdGg9IjgwIiBoZWlnaHQ9IjIwIiB1dWlkPSI1YzA2MmM2Ni1iYTQ1LTQyODgtOWRjZC0yNDZlMjhjNWFmNzUiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iUmlnaHQiIHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVsiUGFnZSAiKyRWe1BBR0VfTlVNQkVSfSsiIG9mIl1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBldmFsdWF0aW9uVGltZT0iUmVwb3J0Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjEwODAiIHk9IjEiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMCIgdXVpZD0iOTM0YjE2ZTgtYzNlYi00MDE3LTg2NmEtMGI3NzM1YmYyOTE3Ii8+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVsiICIgKyAkVntQQUdFX05VTUJFUn1dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L3BhZ2VGb290ZXI+CjwvamFzcGVyUmVwb3J0Pgo= - html - JRSwapFileVirtualizer - 300 - 10000 - 300000 - - - prismReference - + Certification campaigns report + All certification campaigns along with their state. + + + + + + + + + state + + filterAll + + + + + state + inReviewStage + + + state + reviewStageDone + + + state + inRemediation + + + + + + + + + + nameColumn + name + + Name + + + + ownerColumn + ownerRef + + Owner + + nameColumn + + + startTimestampColumn + startTimestamp + + Start + + ownerColumn + + + + + + + + endTimestampColumn + endTimestamp + + Finish + + startTimestampColumn + + + + + + + + casesColumn + case + + Cases + + endTimestampColumn + number + + + stateColumn + state + + State + + casesColumn + + + stageNumberColumn + stageNumber + + Actual stage + + stateColumn + + + stageCasesColumn + stageNumberColumn + + Stage cases + + + + + + + + + percentageCompleteColumn + stageCasesColumn + + % complete + + + + + + + + + ascending + name + + AccessCertificationCampaignType + + true + + alsoClosedCampaigns + boolean + + + alsoClosedCampaigns + + runReportPopupContent.param.name.alsoClosedCampaigns + + + + + diff --git a/config/initial-objects/150-report-certification-cases.xml b/config/initial-objects/150-report-certification-cases.xml index b0f6c1478a5..86868f09e65 100644 --- a/config/initial-objects/150-report-certification-cases.xml +++ b/config/initial-objects/150-report-certification-cases.xml @@ -6,19 +6,197 @@ ~ and European Union Public License. See LICENSE file for details. --> - Certification cases report (Jasper) - Cases within a given certification campaign. - - true - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRVc2VyTGlzdCIgcGFnZVdpZHRoPSIxMjYwIiBwYWdlSGVpZ2h0PSI1OTUiIG9yaWVudGF0aW9uPSJMYW5kc2NhcGUiIHdoZW5Ob0RhdGFUeXBlPSJBbGxTZWN0aW9uc05vRGV0YWlsIiBjb2x1bW5XaWR0aD0iMTIyMCIgbGVmdE1hcmdpbj0iMjAiIHJpZ2h0TWFyZ2luPSIyMCIgdG9wTWFyZ2luPSIzMCIgYm90dG9tTWFyZ2luPSIzMCIgdXVpZD0iNjdlNDY1YzUtNDZlYS00MGQyLWJlYTAtNDY5YzZjZjM4OTM3Ij4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5wcmludC5rZWVwLmZ1bGwudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLnJlbW92ZS5lbXB0eS5zcGFjZS5iZXR3ZWVuLmNvbHVtbnMiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5yZW1vdmUuZW1wdHkuc3BhY2UuYmV0d2Vlbi5yb3dzIiB2YWx1ZT0idHJ1ZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5wZGYuZm9yY2UubGluZWJyZWFrLnBvbGljeSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQuY3N2LmV4Y2x1ZGUub3JpZ2luLmJhbmQuMSIgdmFsdWU9InRpdGxlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjEiIHZhbHVlPSJwYWdlSGVhZGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5leGNsdWRlLm9yaWdpbi5rZWVwLmZpcnN0LmJhbmQuMiIgdmFsdWU9ImNvbHVtbkhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZGV0ZWN0LmNlbGwudHlwZSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLndyYXAudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LnJvdyIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmF1dG8uZml0LmNvbHVtbiIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5hd3QuaWdub3JlLm1pc3NpbmcuZm9udCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0Lnpvb20iIHZhbHVlPSIxLjAiLz4KCTxwcm9wZXJ0eSBuYW1lPSJpcmVwb3J0LngiIHZhbHVlPSIxNiIvPgoJPHByb3BlcnR5IG5hbWU9ImlyZXBvcnQueSIgdmFsdWU9IjE0Ii8+Cgk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmRhdGEuZGVmYXVsdGRhdGFhZGFwdGVyIiB2YWx1ZT0ibXFsLnhtbCIvPgoJPHN0eWxlIG5hbWU9IkJhc2UiIGlzRGVmYXVsdD0idHJ1ZSIgaFRleHRBbGlnbj0iTGVmdCIgaEltYWdlQWxpZ249IkxlZnQiIHZUZXh0QWxpZ249Ik1pZGRsZSIgdkltYWdlQWxpZ249Ik1pZGRsZSIgZm9udE5hbWU9IkRlamFWdSBTYW5zIiBmb250U2l6ZT0iMTAiIHBkZkZvbnROYW1lPSJEZWphVnVTYW5zLnR0ZiIgcGRmRW5jb2Rpbmc9IklkZW50aXR5LUgiIGlzUGRmRW1iZWRkZWQ9InRydWUiLz4KCTxzdHlsZSBuYW1lPSJUaXRsZSIgc3R5bGU9IkJhc2UiIG1vZGU9Ik9wYXF1ZSIgZm9yZWNvbG9yPSIjRkZGRkZGIiBiYWNrY29sb3I9IiMyNjc5OTQiIGZvbnRTaXplPSIyNiIvPgoJPHN0eWxlIG5hbWU9IlBhZ2UgaGVhZGVyIiBzdHlsZT0iQmFzZSIgZm9yZWNvbG9yPSIjMDAwMDAwIiBmb250U2l6ZT0iMTIiLz4KCTxzdHlsZSBuYW1lPSJDb2x1bW4gaGVhZGVyIiBzdHlsZT0iQmFzZSIgbW9kZT0iT3BhcXVlIiBmb3JlY29sb3I9IiNGRkZGRkYiIGJhY2tjb2xvcj0iIzMzMzMzMyIgaFRleHRBbGlnbj0iQ2VudGVyIiBoSW1hZ2VBbGlnbj0iQ2VudGVyIiBmb250U2l6ZT0iMTIiLz4KCTxzdHlsZSBuYW1lPSJEZXRhaWwiIHN0eWxlPSJCYXNlIiBpc0JvbGQ9ImZhbHNlIi8+Cgk8c3R5bGUgbmFtZT0iQ29kZSIgc3R5bGU9IkJhc2UiIGZvbnRTaXplPSI5IiBpc0JvbGQ9ImZhbHNlIi8+Cgk8c3R5bGUgbmFtZT0iUGFnZSBmb290ZXIiIHN0eWxlPSJCYXNlIiBmb3JlY29sb3I9IiMwMDAwMDAiIGZvbnRTaXplPSI5Ii8+Cgk8cGFyYW1ldGVyIG5hbWU9ImNhbXBhaWduTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciPgoJCTxwcm9wZXJ0eSBuYW1lPSJrZXkiIHZhbHVlPSJuYW1lIi8+CgkJPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB2YWx1ZT0ibmFtZSIvPgoJCTxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXRUeXBlIiB2YWx1ZT0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnhtbC5ucy5fcHVibGljLmNvbW1vbi5jb21tb25fMy5BY2Nlc3NDZXJ0aWZpY2F0aW9uQ2FtcGFpZ25UeXBlIi8+CgkJPHBhcmFtZXRlckRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgY2VydGlmaWNhdGlvbiBjYW1wYWlnbiB3aG9zZSBjYXNlcyBhcmUgdG8gYmUgcmVwb3J0ZWQgb24uXV0+PC9wYXJhbWV0ZXJEZXNjcmlwdGlvbj4KCTwvcGFyYW1ldGVyPgoJPHF1ZXJ5U3RyaW5nIGxhbmd1YWdlPSJtcWwiPgoJCTwhW0NEQVRBWzxjb2RlPiAgICAgICAgDQogICAgcmVwb3J0LmdldENlcnRpZmljYXRpb25DYW1wYWlnbkNhc2VzKGNhbXBhaWduTmFtZSkNCjwvY29kZT5dXT4KCTwvcXVlcnlTdHJpbmc+Cgk8ZmllbGQgbmFtZT0iX3RoaXNfIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnByaXNtLlByaXNtQ29udGFpbmVyVmFsdWUiLz4KCTxmaWVsZCBuYW1lPSJvYmplY3RSZWYiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLk9iamVjdFJlZmVyZW5jZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJ0YXJnZXRSZWYiIGNsYXNzPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLk9iamVjdFJlZmVyZW5jZVR5cGUiLz4KCTxmaWVsZCBuYW1lPSJjdXJyZW50UmV2aWV3UmVxdWVzdGVkVGltZXN0YW1wIiBjbGFzcz0iamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIi8+Cgk8ZmllbGQgbmFtZT0iY3VycmVudFJldmlld0RlYWRsaW5lIiBjbGFzcz0iamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIi8+Cgk8ZmllbGQgbmFtZT0ib3V0Y29tZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz4KCTxmaWVsZCBuYW1lPSJpdGVyYXRpb24iIGNsYXNzPSJqYXZhLmxhbmcuSW50ZWdlciIvPgoJPGZpZWxkIG5hbWU9InN0YWdlTnVtYmVyIiBjbGFzcz0iamF2YS5sYW5nLkludGVnZXIiLz4KCTxmaWVsZCBuYW1lPSJyZW1lZGllZFRpbWVzdGFtcCIgY2xhc3M9ImphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhciIvPgoJPGJhY2tncm91bmQ+CgkJPGJhbmQgaGVpZ2h0PSI2OCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby5sYXlvdXQiIHZhbHVlPSJjb20uamFzcGVyc29mdC5zdHVkaW8uZWRpdG9yLmxheW91dC5GcmVlTGF5b3V0Ii8+CgkJPC9iYW5kPgoJPC9iYWNrZ3JvdW5kPgoJPHRpdGxlPgoJCTxiYW5kIGhlaWdodD0iMTIzIiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8ZnJhbWU+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iVGl0bGUiIG1vZGU9Ik9wYXF1ZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjEyMjAiIGhlaWdodD0iNjciIGJhY2tjb2xvcj0iIzI2Nzk5NCIgdXVpZD0iNDRiZWRhY2MtZmEyMy00ZmUxLWI3MWYtZTVhZmE5NDNmNTUzIi8+CgkJCQk8c3RhdGljVGV4dD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iVGl0bGUiIHg9IjEwIiB5PSIxNCIgd2lkdGg9IjEyMDAiIGhlaWdodD0iMzgiIHV1aWQ9ImYyZDk5Y2FkLTlkODQtNGY1MC1iNDU1LTQ1M2M4N2Y2MmM0YyIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHQ+PCFbQ0RBVEFbQ2VydGlmaWNhdGlvbiBDYXNlcyBSZXBvcnRdXT48L3RleHQ+CgkJCQk8L3N0YXRpY1RleHQ+CgkJCTwvZnJhbWU+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSIwIiB5PSI4NSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIyMCIgdXVpZD0iZTAzNWRiZDUtZGMyZi00NWNiLTkzNmMtYTA4ZTljMDExZTQzIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbQ2FtcGFpZ24gbmFtZTpdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJkZC5NTS55eXl5LCBISDptbTpzcyI+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjEyMCIgeT0iODUiIHdpZHRoPSI0MzciIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskUHtjYW1wYWlnbk5hbWV9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQk8L2JhbmQ+Cgk8L3RpdGxlPgoJPHBhZ2VIZWFkZXI+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L3BhZ2VIZWFkZXI+Cgk8Y29sdW1uSGVhZGVyPgoJCTxiYW5kIGhlaWdodD0iMjAiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuSG9yaXpvbnRhbFJvd0xheW91dCIvPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTk1IiBoZWlnaHQ9IjIwIiB1dWlkPSIwNDk4OTA5Yi1kM2M1LTRlZTMtYjhjOS1mMDBhODA4ZWZhN2EiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbT2JqZWN0XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjE5NSIgeT0iMCIgd2lkdGg9IjE5NSIgaGVpZ2h0PSIyMCIgdXVpZD0iYzUzMDU1NmItZTY3NC00N2M2LWE3OTktNmYxZDViNWJjZTYxIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtUYXJnZXRdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iMzkwIiB5PSIwIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjIwIiB1dWlkPSIzYjU0NzIyYS05OWJmLTRjN2MtYjY0OS1iYjAzZWM1MzMyOWUiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbUmV2aWV3ZXJzXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjUxOCIgeT0iMCIgd2lkdGg9IjEyOSIgaGVpZ2h0PSIyMCIgdXVpZD0iNDIxZDM5YmQtNmFmMC00YzFjLTgzOWYtMDZjMWNmM2NmMTMwIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtMYXN0IHJldmlld2VkIG9uXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjY0NyIgeT0iMCIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIyMCIgdXVpZD0iYzE0MzljMGQtNjU4MC00ZDk2LThjOGEtZTk4NjIyNDY5NmYzIi8+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbUmV2aWV3ZWQgYnldXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iNzc1IiB5PSIwIiB3aWR0aD0iNjAiIGhlaWdodD0iMjAiIHV1aWQ9ImVmMTZjYzg0LWNjYTctNDIwNC05YmM4LWQwODY4MGI1MDY3ZCI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LmhlaWdodCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbSXRlcmF0aW9uXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjgzNSIgeT0iMCIgd2lkdGg9IjY2IiBoZWlnaHQ9IjIwIiB1dWlkPSJhOGJlMWZiOS1lNzE0LTQyM2YtYjM0OS00MmEyMjA0OTRiNjEiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC5oZWlnaHQiIHZhbHVlPSJwaXhlbCIvPgoJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW0luIHN0YWdlXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjkwMSIgeT0iMCIgd2lkdGg9IjYzIiBoZWlnaHQ9IjIwIiB1dWlkPSIzMzE5ZTU5Yi01MjAxLTQ1NGQtOTI5Ni03MjJjNTU3Yjg0NjAiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtSZXN1bHRdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iOTY0IiB5PSIwIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjIwIiB1dWlkPSI1M2M1OTE3MC1mNzhhLTQxYTUtOTM5OS1lNDEyOWQzZDZkZjgiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtDb21tZW50c11dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIxMDkyIiB5PSIwIiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjIwIiB1dWlkPSI4MGI2ZTFiZC04YjJlLTQ3NzQtYjUxMi03ZDRjMjNhNTgyMTEiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtSZW1lZGllZCBvbl1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCTwvYmFuZD4KCTwvY29sdW1uSGVhZGVyPgoJPGRldGFpbD4KCQk8YmFuZCBoZWlnaHQ9IjI0IiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmxheW91dCIgdmFsdWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby5lZGl0b3IubGF5b3V0Lkhvcml6b250YWxSb3dMYXlvdXQiLz4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkRldGFpbCIgc3RyZXRjaFR5cGU9IlJlbGF0aXZlVG9UYWxsZXN0T2JqZWN0IiBtb2RlPSJPcGFxdWUiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjIwIiBoZWlnaHQ9IjI0IiB1dWlkPSI4NmRiNjUzNy04MWYwLTQyYjEtYjc0YS1kMmJlNzA5MjcxY2QiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuSG9yaXpvbnRhbFJvd0xheW91dCIvPgoJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjAiIHk9IjAiIHdpZHRoPSIxOTUiIGhlaWdodD0iMjQiIHV1aWQ9ImM4OTQ4Yzg1LWVjMzEtNGIzOS04ODlhLTQzY2JjZTcwZjdmOCI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5wcmV0dHlQcmludEZvclJlcG9ydCgkRntvYmplY3RSZWZ9KV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjE5NSIgeT0iMCIgd2lkdGg9IjE5NSIgaGVpZ2h0PSIyNCIgdXVpZD0iNzViZmQ0YTAtNTgwMC00N2E1LWE1M2MtNDU4MDI1NzMwYmIzIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRGb3JSZXBvcnQoJEZ7dGFyZ2V0UmVmfSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSIzOTAiIHk9IjAiIHdpZHRoPSIxMjgiIGhlaWdodD0iMjQiIHV1aWQ9ImI1ZGU2MDAzLWNjNjQtNGVlNC05YjI1LTk5MjdlNzM3OWY1NyI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5wcmV0dHlQcmludFVzZXJzRm9yUmVwb3J0KGNvbS5ldm9sdmV1bS5taWRwb2ludC5zY2hlbWEudXRpbC5DZXJ0Q2FtcGFpZ25UeXBlVXRpbC5nZXRDdXJyZW50bHlBc3NpZ25lZFJldmlld2VycygkRntfdGhpc199LmFzUHJpc21Db250YWluZXJWYWx1ZSgpKSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iNTE4IiB5PSIwIiB3aWR0aD0iMTI5IiBoZWlnaHQ9IjI0IiB1dWlkPSJiOTFiM2Y0NS0yNTJkLTRlNzEtOTUxYy05ZTEyMGFhZjdjNWEiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRGb3JSZXBvcnQoY29tLmV2b2x2ZXVtLm1pZHBvaW50LnNjaGVtYS51dGlsLkNlcnRDYW1wYWlnblR5cGVVdGlsLmdldExhc3RSZXZpZXdlZE9uKCRGe190aGlzX30uYXNQcmlzbUNvbnRhaW5lclZhbHVlKCkpKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc1N0cmV0Y2hXaXRoT3ZlcmZsb3c9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjY0NyIgeT0iMCIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIyNCIgdXVpZD0iMTA0NDMwZjctZmQ2MC00Zjk4LTg5MjctMzliMjNlNzdjZjRmIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50VXNlcnNGb3JSZXBvcnQoY29tLmV2b2x2ZXVtLm1pZHBvaW50LnNjaGVtYS51dGlsLkNlcnRDYW1wYWlnblR5cGVVdGlsLmdldFJldmlld2VkQnkoJEZ7X3RoaXNffS5hc1ByaXNtQ29udGFpbmVyVmFsdWUoKSkpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9Ijc3NSIgeT0iMCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjI0IiB1dWlkPSIyZDM2YzUyOC00Nzg0LTQwYjItOWI1My0zYTI1MzVkNzc5ZjYiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskRntzdGFnZU51bWJlcn1dXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iODM1IiB5PSIwIiB3aWR0aD0iNjYiIGhlaWdodD0iMjQiIHV1aWQ9IjhjMDliNzg3LTIzOTItNDRlOS04OTBmLTQ2ZGQwZjNiM2I2OCI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe3N0YWdlTnVtYmVyfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZCBpc0JsYW5rV2hlbk51bGw9InRydWUiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjkwMSIgeT0iMCIgd2lkdGg9IjYzIiBoZWlnaHQ9IjI0IiB1dWlkPSI5OTRhMWUwZi1jZTI4LTRlNDQtYmI0ZC00NzBjOGJjMmM2NWQiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRDZXJ0T3V0Y29tZUZvclJlcG9ydCgkRntvdXRjb21lfSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgaXNTdHJldGNoV2l0aE92ZXJmbG93PSJ0cnVlIj4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI5NjQiIHk9IjAiIHdpZHRoPSIxMjgiIGhlaWdodD0iMjQiIHV1aWQ9ImE5YWFkNTc2LTY5ZGItNDdjMS1iNDliLTQ0NzkzYTRlNmEwNyI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5qb2luKGNvbS5ldm9sdmV1bS5taWRwb2ludC5zY2hlbWEudXRpbC5DZXJ0Q2FtcGFpZ25UeXBlVXRpbC5nZXRDb21tZW50cygkRntfdGhpc199LmFzUHJpc21Db250YWluZXJWYWx1ZSgpKSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMTA5MiIgeT0iMCIgd2lkdGg9IjEyOCIgaGVpZ2h0PSIyNCIgdXVpZD0iNDc3Yzk5NjQtZDgyYy00NTBlLWI0ZWUtMjczYjFiZGQ4ZTZmIj4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQuaGVpZ2h0IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5wcmV0dHlQcmludEZvclJlcG9ydCgkRntyZW1lZGllZFRpbWVzdGFtcH0pXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCTwvZnJhbWU+CgkJPC9iYW5kPgoJPC9kZXRhaWw+Cgk8cGFnZUZvb3Rlcj4KCQk8YmFuZCBoZWlnaHQ9IjMyIiBzcGxpdFR5cGU9IlN0cmV0Y2giPgoJCQk8ZnJhbWU+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIG1vZGU9IlRyYW5zcGFyZW50IiB4PSIwIiB5PSIxIiB3aWR0aD0iMTE4MCIgaGVpZ2h0PSIyNCIgZm9yZWNvbG9yPSIjMDAwMDAwIiBiYWNrY29sb3I9IiMyNjc5OTQiIHV1aWQ9ImZiZThhYWU0LTY1MDAtNDY4YS1iMWU4LTcwMGI1NjkxMzlhMSIvPgoJCQkJPHRleHRGaWVsZCBwYXR0ZXJuPSJFRUVFRSBkZCBNTU1NTSB5eXl5Ij4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjIiIHk9IjEiIHdpZHRoPSIxOTciIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbbmV3IGphdmEudXRpbC5EYXRlKCldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiB4PSIxMDYwIiB5PSIxIiB3aWR0aD0iODAiIGhlaWdodD0iMjAiIHV1aWQ9IjVjMDYyYzY2LWJhNDUtNDI4OC05ZGNkLTI0NmUyOGM1YWY3NSIvPgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJSaWdodCIgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyJQYWdlICIrJFZ7UEFHRV9OVU1CRVJ9KyIgb2YiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGV2YWx1YXRpb25UaW1lPSJSZXBvcnQiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgeD0iMTE0MCIgeT0iMSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjIwIiB1dWlkPSI5MzRiMTZlOC1jM2ViLTQwMTctODY2YS0wYjc3MzViZjI5MTciLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyIgIiArICRWe1BBR0VfTlVNQkVSfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQk8L2ZyYW1lPgoJCTwvYmFuZD4KCTwvcGFnZUZvb3Rlcj4KPC9qYXNwZXJSZXBvcnQ+Cg== - html - JRSwapFileVirtualizer - 300 - 10000 - 300000 - - - prismReference - + Certification cases report + Cases within a given certification campaign. + + + + + + + + ../name + + filterAll + + + + + + + + objectColumn + objectRef + + Object + + + + + + + + + targetColumn + targetRef + + Target + + objectColumn + + + + + + + + reviewersColumn + + Reviewers + + targetColumn + + + + + + + + lastReviewedOnColumn + + Last reviewed on + + reviewersColumn + + + + + + + + reviewedByColumn + + Reviewed by + + lastReviewedOnColumn + + + + + + + + iterationColumn + iteration + + Iteration + + reviewedByColumn + + + inStageNumberColumn + stageNumber + + In stage + + iterationColumn + + + outcomeColumn + outcome + + Result + + inStageNumberColumn + + + commentsColumn + + Comments + + outcomeColumn + + + + + + + + remediedTimestampColumn + remediedTimestamp + + Remedied on + + commentsColumn + + AccessCertificationCaseType + + objectRef/@/name + + + + campaignName + c:ObjectReferenceType + c:AccessCertificationCampaignType + + + campaignName + + runReportPopupContent.param.name.campaignName + + + + + diff --git a/config/initial-objects/160-report-certification-decisions.xml b/config/initial-objects/160-report-certification-decisions.xml index 86cb0f2e414..386cfd4cbbc 100644 --- a/config/initial-objects/160-report-certification-decisions.xml +++ b/config/initial-objects/160-report-certification-decisions.xml @@ -6,19 +6,182 @@ ~ and European Union Public License. See LICENSE file for details. --> - Certification decisions report (Jasper) - Decisions of individual reviewers for a certification campaign as a whole or for a given campaign stage. - - true - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGphc3BlclJlcG9ydCB4bWxucz0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L2phc3BlcnJlcG9ydHMgaHR0cDovL2phc3BlcnJlcG9ydHMuc291cmNlZm9yZ2UubmV0L3hzZC9qYXNwZXJyZXBvcnQueHNkIiBuYW1lPSJyZXBvcnRVc2VyTGlzdCIgcGFnZVdpZHRoPSIxMjYwIiBwYWdlSGVpZ2h0PSI2MTUiIG9yaWVudGF0aW9uPSJMYW5kc2NhcGUiIHdoZW5Ob0RhdGFUeXBlPSJBbGxTZWN0aW9uc05vRGV0YWlsIiBjb2x1bW5XaWR0aD0iMTIyMCIgbGVmdE1hcmdpbj0iMjAiIHJpZ2h0TWFyZ2luPSIyMCIgdG9wTWFyZ2luPSIzMCIgYm90dG9tTWFyZ2luPSIzMCIgdXVpZD0iNjdlNDY1YzUtNDZlYS00MGQyLWJlYTAtNDY5YzZjZjM4OTM3Ij4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5wcmludC5rZWVwLmZ1bGwudGV4dCIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLnJlbW92ZS5lbXB0eS5zcGFjZS5iZXR3ZWVuLmNvbHVtbnMiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5yZW1vdmUuZW1wdHkuc3BhY2UuYmV0d2Vlbi5yb3dzIiB2YWx1ZT0idHJ1ZSIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC5wZGYuZm9yY2UubGluZWJyZWFrLnBvbGljeSIgdmFsdWU9InRydWUiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQuY3N2LmV4Y2x1ZGUub3JpZ2luLmJhbmQuMSIgdmFsdWU9InRpdGxlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5iYW5kLjIiIHZhbHVlPSJwYWdlRm9vdGVyIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0LmNzdi5leGNsdWRlLm9yaWdpbi5rZWVwLmZpcnN0LmJhbmQuMiIgdmFsdWU9ImNvbHVtbkhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZXhjbHVkZS5vcmlnaW4uYmFuZC4xIiB2YWx1ZT0icGFnZUhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZXhjbHVkZS5vcmlnaW4uYmFuZC4yIiB2YWx1ZT0icGFnZUZvb3RlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHMuZXhjbHVkZS5vcmlnaW4ua2VlcC5maXJzdC5iYW5kLjIiIHZhbHVlPSJjb2x1bW5IZWFkZXIiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzLmRldGVjdC5jZWxsLnR5cGUiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy53cmFwLnRleHQiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5hdXRvLmZpdC5yb3ciIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhscy5hdXRvLmZpdC5jb2x1bW4iIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuYXd0Lmlnbm9yZS5taXNzaW5nLmZvbnQiIHZhbHVlPSJ0cnVlIi8+Cgk8cHJvcGVydHkgbmFtZT0ibmV0LnNmLmphc3BlcnJlcG9ydHMuZXhwb3J0Lnhsc3guZXhjbHVkZS5vcmlnaW4uYmFuZC4xIiB2YWx1ZT0icGFnZUhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHN4LmV4Y2x1ZGUub3JpZ2luLmJhbmQuMiIgdmFsdWU9InBhZ2VGb290ZXIiLz4KCTxwcm9wZXJ0eSBuYW1lPSJuZXQuc2YuamFzcGVycmVwb3J0cy5leHBvcnQueGxzeC5leGNsdWRlLm9yaWdpbi5rZWVwLmZpcnN0LmJhbmQuMiIgdmFsdWU9ImNvbHVtbkhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9Im5ldC5zZi5qYXNwZXJyZXBvcnRzLmV4cG9ydC54bHN4LmV4Y2x1ZGUub3JpZ2luLmtlZXAuZmlyc3QuYmFuZC4xIiB2YWx1ZT0icGFnZUhlYWRlciIvPgoJPHByb3BlcnR5IG5hbWU9ImlyZXBvcnQuem9vbSIgdmFsdWU9IjEuMCIvPgoJPHByb3BlcnR5IG5hbWU9ImlyZXBvcnQueCIgdmFsdWU9IjE2Ii8+Cgk8cHJvcGVydHkgbmFtZT0iaXJlcG9ydC55IiB2YWx1ZT0iMTQiLz4KCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8uZGF0YS5kZWZhdWx0ZGF0YWFkYXB0ZXIiIHZhbHVlPSJtcWwueG1sIi8+Cgk8c3R5bGUgbmFtZT0iQmFzZSIgaXNEZWZhdWx0PSJ0cnVlIiBoVGV4dEFsaWduPSJMZWZ0IiBoSW1hZ2VBbGlnbj0iTGVmdCIgdlRleHRBbGlnbj0iTWlkZGxlIiB2SW1hZ2VBbGlnbj0iTWlkZGxlIiBmb250TmFtZT0iRGVqYVZ1IFNhbnMiIGZvbnRTaXplPSIxMCIgcGRmRm9udE5hbWU9IkRlamFWdVNhbnMudHRmIiBwZGZFbmNvZGluZz0iSWRlbnRpdHktSCIgaXNQZGZFbWJlZGRlZD0idHJ1ZSIvPgoJPHN0eWxlIG5hbWU9IlRpdGxlIiBzdHlsZT0iQmFzZSIgbW9kZT0iT3BhcXVlIiBmb3JlY29sb3I9IiNGRkZGRkYiIGJhY2tjb2xvcj0iIzI2Nzk5NCIgZm9udFNpemU9IjI2Ii8+Cgk8c3R5bGUgbmFtZT0iUGFnZSBoZWFkZXIiIHN0eWxlPSJCYXNlIiBmb3JlY29sb3I9IiMwMDAwMDAiIGZvbnRTaXplPSIxMiIvPgoJPHN0eWxlIG5hbWU9IkNvbHVtbiBoZWFkZXIiIHN0eWxlPSJCYXNlIiBtb2RlPSJPcGFxdWUiIGZvcmVjb2xvcj0iI0ZGRkZGRiIgYmFja2NvbG9yPSIjMzMzMzMzIiBoVGV4dEFsaWduPSJDZW50ZXIiIGhJbWFnZUFsaWduPSJDZW50ZXIiIGZvbnRTaXplPSIxMiIvPgoJPHN0eWxlIG5hbWU9IkRldGFpbCIgc3R5bGU9IkJhc2UiIGlzQm9sZD0iZmFsc2UiLz4KCTxzdHlsZSBuYW1lPSJDb2RlIiBzdHlsZT0iQmFzZSIgZm9udFNpemU9IjkiIGlzQm9sZD0iZmFsc2UiLz4KCTxzdHlsZSBuYW1lPSJQYWdlIGZvb3RlciIgc3R5bGU9IkJhc2UiIGZvcmVjb2xvcj0iIzAwMDAwMCIgZm9udFNpemU9IjkiLz4KCTxwYXJhbWV0ZXIgbmFtZT0iY2FtcGFpZ25OYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZyI+CgkJPHByb3BlcnR5IG5hbWU9ImtleSIgdmFsdWU9Im5hbWUiLz4KCQk8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHZhbHVlPSJuYW1lIi8+CgkJPHByb3BlcnR5IG5hbWU9InRhcmdldFR5cGUiIHZhbHVlPSJjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLkFjY2Vzc0NlcnRpZmljYXRpb25DYW1wYWlnblR5cGUiLz4KCQk8cGFyYW1ldGVyRGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiBjZXJ0aWZpY2F0aW9uIGNhbXBhaWduIHdob3NlIGRlY2lzaW9ucyBhcmUgdG8gYmUgcmVwb3J0ZWQgb24uXV0+PC9wYXJhbWV0ZXJEZXNjcmlwdGlvbj4KCTwvcGFyYW1ldGVyPgoJPHBhcmFtZXRlciBuYW1lPSJzdGFnZU51bWJlciIgY2xhc3M9ImphdmEubGFuZy5JbnRlZ2VyIj4KCQk8cGFyYW1ldGVyRGVzY3JpcHRpb24+PCFbQ0RBVEFbTnVtYmVyIG9mIHN0YWdlIHRvIHJlcG9ydCBkZWNpc2lvbnMgZm9yIChpZiBub3Qgc3BlY2lmaWVkLCBhbGwgc3RhZ2VzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQpXV0+PC9wYXJhbWV0ZXJEZXNjcmlwdGlvbj4KCTwvcGFyYW1ldGVyPgoJPHBhcmFtZXRlciBuYW1lPSJpdGVyYXRpb24iIGNsYXNzPSJqYXZhLmxhbmcuSW50ZWdlciI+CgkJPHBhcmFtZXRlckRlc2NyaXB0aW9uPjwhW0NEQVRBW0l0ZXJhdGlvbiB0byByZXBvcnQgZGVjaXNpb25zIGZvciAoaWYgbm90IHNwZWNpZmllZCwgYWxsIGl0ZXJhdGlvbnMgYXJlIHRha2VuIGludG8gYWNjb3VudCldXT48L3BhcmFtZXRlckRlc2NyaXB0aW9uPgoJPC9wYXJhbWV0ZXI+Cgk8cXVlcnlTdHJpbmcgbGFuZ3VhZ2U9Im1xbCI+CgkJPCFbQ0RBVEFbPGNvZGU+DQogICAgcmVwb3J0LmdldENlcnRpZmljYXRpb25DYW1wYWlnbkRlY2lzaW9ucyhjYW1wYWlnbk5hbWUsIHN0YWdlTnVtYmVyLCBpdGVyYXRpb24pDQo8L2NvZGU+XV0+Cgk8L3F1ZXJ5U3RyaW5nPgoJPGZpZWxkIG5hbWU9InN0YWdlTnVtYmVyIiBjbGFzcz0iamF2YS5sYW5nLkludGVnZXIiLz4KCTxmaWVsZCBuYW1lPSJpdGVyYXRpb24iIGNsYXNzPSJqYXZhLmxhbmcuSW50ZWdlciIvPgoJPGZpZWxkIG5hbWU9InBlcmZvcm1lclJlZiIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuT2JqZWN0UmVmZXJlbmNlVHlwZSIvPgoJPGZpZWxkIG5hbWU9Im91dHB1dCIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC54bWwubnMuX3B1YmxpYy5jb21tb24uY29tbW9uXzMuQWJzdHJhY3RXb3JrSXRlbU91dHB1dFR5cGUiLz4KCTxmaWVsZCBuYW1lPSJvdXRwdXRDaGFuZ2VUaW1lc3RhbXAiIGNsYXNzPSJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiLz4KCTxmaWVsZCBuYW1lPSJfcGFyZW50XyIgY2xhc3M9ImNvbS5ldm9sdmV1bS5taWRwb2ludC5wcmlzbS5QcmlzbUNvbnRhaW5lclZhbHVlIi8+Cgk8ZmllbGQgbmFtZT0iX3RoaXNfIiBjbGFzcz0iY29tLmV2b2x2ZXVtLm1pZHBvaW50LnByaXNtLlByaXNtQ29udGFpbmVyVmFsdWUiLz4KCTxiYWNrZ3JvdW5kPgoJCTxiYW5kIGhlaWdodD0iNjgiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuRnJlZUxheW91dCIvPgoJCTwvYmFuZD4KCTwvYmFja2dyb3VuZD4KCTx0aXRsZT4KCQk8YmFuZCBoZWlnaHQ9IjE0MyIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPGZyYW1lPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlRpdGxlIiBtb2RlPSJPcGFxdWUiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjIwIiBoZWlnaHQ9IjY3IiBiYWNrY29sb3I9IiMyNjc5OTQiIHV1aWQ9IjQ0YmVkYWNjLWZhMjMtNGZlMS1iNzFmLWU1YWZhOTQzZjU1MyIvPgoJCQkJPHN0YXRpY1RleHQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlRpdGxlIiB4PSIxMCIgeT0iMTQiIHdpZHRoPSIxMjAwIiBoZWlnaHQ9IjM4IiB1dWlkPSJmMmQ5OWNhZC05ZDg0LTRmNTAtYjQ1NS00NTNjODdmNjJjNGMiLz4KCQkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJCTx0ZXh0PjwhW0NEQVRBW0NlcnRpZmljYXRpb24gRGVjaXNpb25zIFJlcG9ydF1dPjwvdGV4dD4KCQkJCTwvc3RhdGljVGV4dD4KCQkJPC9mcmFtZT4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9IjAiIHk9Ijg1IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtDYW1wYWlnbiBuYW1lOl1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8dGV4dEZpZWxkPgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiBpc1ByaW50UmVwZWF0ZWRWYWx1ZXM9ImZhbHNlIiB4PSIxMjAiIHk9Ijg1IiB3aWR0aD0iNDM3IiBoZWlnaHQ9IjIwIiB1dWlkPSIyOGJiOWI0Ny1hNjljLTQ4ZTEtOTA3My1kNTRkOTI2MjQyZTgiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJFB7Y2FtcGFpZ25OYW1lfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJPC90ZXh0RmllbGQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgaGVhZGVyIiB4PSI5NjQiIHk9Ijg1IiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjIwIiB1dWlkPSJlMDM1ZGJkNS1kYzJmLTQ1Y2ItOTM2Yy1hMDhlOWMwMTFlNDMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtTdGFnZSBudW1iZXI6XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjExNjAiIHk9Ijg1IiB3aWR0aD0iNjAiIGhlaWdodD0iMjAiIHV1aWQ9IjI4YmI5YjQ3LWE2OWMtNDhlMS05MDczLWQ1NGQ5MjYyNDJlOCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiPgoJCQkJCTxmb250IGlzQm9sZD0iZmFsc2UiLz4KCQkJCTwvdGV4dEVsZW1lbnQ+CgkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVskUHtzdGFnZU51bWJlcn0gIT0gbnVsbCA/ICRQe3N0YWdlTnVtYmVyfSA6ICJBbnkiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIHg9Ijk2NCIgeT0iMTA1IiB3aWR0aD0iMTg2IiBoZWlnaHQ9IjIwIiB1dWlkPSIxOTk5NTNmMS1lOWJjLTRkNzEtOTc5Ny0wMGQ5Y2M1NGE3MGMiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtJdGVyYXRpb246XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTx0ZXh0RmllbGQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBoZWFkZXIiIGlzUHJpbnRSZXBlYXRlZFZhbHVlcz0iZmFsc2UiIHg9IjExNjAiIHk9IjEwNSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjIwIiB1dWlkPSI3YTFlZDhjYy05NTJhLTQyNTktODNlMS1mYzljY2E0OTI3YjQiLz4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIj4KCQkJCQk8Zm9udCBpc0JvbGQ9ImZhbHNlIi8+CgkJCQk8L3RleHRFbGVtZW50PgoJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJFB7aXRlcmF0aW9ufSAhPSBudWxsID8gJFB7aXRlcmF0aW9ufSA6ICJBbnkiXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQk8L3RleHRGaWVsZD4KCQk8L2JhbmQ+Cgk8L3RpdGxlPgoJPHBhZ2VIZWFkZXI+CgkJPGJhbmQgc3BsaXRUeXBlPSJTdHJldGNoIi8+Cgk8L3BhZ2VIZWFkZXI+Cgk8Y29sdW1uSGVhZGVyPgoJCTxiYW5kIGhlaWdodD0iMjAiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8ubGF5b3V0IiB2YWx1ZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmVkaXRvci5sYXlvdXQuSG9yaXpvbnRhbFJvd0xheW91dCIvPgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjczIiBoZWlnaHQ9IjIwIiB1dWlkPSIwNDk4OTA5Yi1kM2M1LTRlZTMtYjhjOS1mMDBhODA4ZWZhN2EiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbT2JqZWN0XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjI3MyIgeT0iMCIgd2lkdGg9IjI3MiIgaGVpZ2h0PSIyMCIgdXVpZD0iYzUzMDU1NmItZTY3NC00N2M2LWE3OTktNmYxZDViNWJjZTYxIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW1RhcmdldF1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI1NDUiIHk9IjAiIHdpZHRoPSIxNjUiIGhlaWdodD0iMjAiIHV1aWQ9IjNiNTQ3MjJhLTk5YmYtNGM3Yy1iNjQ5LWJiMDNlYzUzMzI5ZSI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQk8dGV4dD48IVtDREFUQVtSZXZpZXdlZCBieV1dPjwvdGV4dD4KCQkJPC9zdGF0aWNUZXh0PgoJCQk8c3RhdGljVGV4dD4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJDb2x1bW4gaGVhZGVyIiB4PSI3MTAiIHk9IjAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMjAiIHV1aWQ9IjQyMWQzOWJkLTZhZjAtNGMxYy04MzlmLTA2YzFjZjNjZjEzMCIvPgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW1Jldmlld2VkIG9uXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9Ijg0MCIgeT0iMCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjIwIiB1dWlkPSJlOTYzODYxNy01NDFlLTQzYWEtOWFhMy1mZDk5YWYwYjQwZmEiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC5oZWlnaHQiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbSXRlcmF0aW9uXV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjkwMCIgeT0iMCIgd2lkdGg9Ijc1IiBoZWlnaHQ9IjIwIiB1dWlkPSJhOGJlMWZiOS1lNzE0LTQyM2YtYjM0OS00MmEyMjA0OTRiNjEiPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC5oZWlnaHQiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbSW4gc3RhZ2VdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQkJPHN0YXRpY1RleHQ+CgkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iQ29sdW1uIGhlYWRlciIgeD0iOTc1IiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iMjAiIHV1aWQ9IjMzMTllNTliLTUyMDEtNDU0ZC05Mjk2LTcyMmM1NTdiODQ2MCI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQk8dGV4dEVsZW1lbnQgdmVydGljYWxBbGlnbm1lbnQ9Ik1pZGRsZSIvPgoJCQkJPHRleHQ+PCFbQ0RBVEFbUmVzdWx0XV0+PC90ZXh0PgoJCQk8L3N0YXRpY1RleHQ+CgkJCTxzdGF0aWNUZXh0PgoJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IkNvbHVtbiBoZWFkZXIiIHg9IjEwNTUiIHk9IjAiIHdpZHRoPSIxNjUiIGhlaWdodD0iMjAiIHV1aWQ9IjUzYzU5MTcwLWY3OGEtNDFhNS05Mzk5LWU0MTI5ZDNkNmRmOCI+CgkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCTx0ZXh0PjwhW0NEQVRBW0NvbW1lbnRdXT48L3RleHQ+CgkJCTwvc3RhdGljVGV4dD4KCQk8L2JhbmQ+Cgk8L2NvbHVtbkhlYWRlcj4KCTxkZXRhaWw+CgkJPGJhbmQgaGVpZ2h0PSIyNCIgc3BsaXRUeXBlPSJTdHJldGNoIj4KCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby5sYXlvdXQiIHZhbHVlPSJjb20uamFzcGVyc29mdC5zdHVkaW8uZWRpdG9yLmxheW91dC5Ib3Jpem9udGFsUm93TGF5b3V0Ii8+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJEZXRhaWwiIHN0cmV0Y2hUeXBlPSJSZWxhdGl2ZVRvVGFsbGVzdE9iamVjdCIgbW9kZT0iT3BhcXVlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTIyMCIgaGVpZ2h0PSIyNCIgdXVpZD0iODZkYjY1MzctODFmMC00MmIxLWI3NGEtZDJiZTcwOTI3MWNkIj4KCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLmxheW91dCIgdmFsdWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby5lZGl0b3IubGF5b3V0Lkhvcml6b250YWxSb3dMYXlvdXQiLz4KCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMCIgeT0iMCIgd2lkdGg9IjI3MyIgaGVpZ2h0PSIyNCIgdXVpZD0iYzg5NDhjODUtZWMzMS00YjM5LTg4OWEtNDNjYmNlNzBmN2Y4Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50Rm9yUmVwb3J0KCRGe19wYXJlbnRffS5nZXRPYmplY3RSZWYoKSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMjczIiB5PSIwIiB3aWR0aD0iMjcyIiBoZWlnaHQ9IjI0IiB1dWlkPSI3NWJmZDRhMC01ODAwLTQ3YTUtYTUzYy00NTgwMjU3MzBiYjMiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQud2lkdGgiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5wcmV0dHlQcmludEZvclJlcG9ydCgkRntfcGFyZW50X30uZ2V0VGFyZ2V0UmVmKCkpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkPgoJCQkJCTxyZXBvcnRFbGVtZW50IHg9IjU0NSIgeT0iMCIgd2lkdGg9IjE2NSIgaGVpZ2h0PSIyNCIgdXVpZD0iYjVkZTYwMDMtY2M2NC00ZWU0LTliMjUtOTkyN2U3Mzc5ZjU3Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50UGVyZm9ybWVyT3JBc3NpZ25lZXNGb3JSZXBvcnQoJEZ7X3RoaXNffS5hc1ByaXNtQ29udGFpbmVyVmFsdWUoKSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iNzEwIiB5PSIwIiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjI0IiB1dWlkPSJiOTFiM2Y0NS0yNTJkLTRlNzEtOTUxYy05ZTEyMGFhZjdjNWEiPgoJCQkJCQk8cHJvcGVydHkgbmFtZT0iY29tLmphc3BlcnNvZnQuc3R1ZGlvLnVuaXQueCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJPC9yZXBvcnRFbGVtZW50PgoJCQkJCTx0ZXh0RWxlbWVudCB0ZXh0QWxpZ25tZW50PSJDZW50ZXIiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtjb20uZXZvbHZldW0ubWlkcG9pbnQucmVwb3J0LmltcGwuUmVwb3J0VXRpbHMucHJldHR5UHJpbnRPdXRwdXRDaGFuZ2VGb3JSZXBvcnQoJEZ7X3RoaXNffS5hc1ByaXNtQ29udGFpbmVyVmFsdWUoKSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQ+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iODQwIiB5PSIwIiB3aWR0aD0iNjAiIGhlaWdodD0iMjQiIHV1aWQ9IjZmZmNmZmRiLTg1MTMtNDg1Yi05ZDE5LWNlYWI5MzFlNzUxNyI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC53aWR0aCIgdmFsdWU9InBpeGVsIi8+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBWyRGe3N0YWdlTnVtYmVyfV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCB4PSI5MDAiIHk9IjAiIHdpZHRoPSI3NSIgaGVpZ2h0PSIyNCIgdXVpZD0iOGMwOWI3ODctMjM5Mi00NGU5LTg5MGYtNDZkZDBmM2IzYjY4Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbJEZ7c3RhZ2VOdW1iZXJ9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iOTc1IiB5PSIwIiB3aWR0aD0iODAiIGhlaWdodD0iMjQiIHV1aWQ9Ijk5NGExZTBmLWNlMjgtNGU0NC1iYjRkLTQ3MGM4YmMyYzY1ZCI+CgkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJjb20uamFzcGVyc29mdC5zdHVkaW8udW5pdC54IiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LndpZHRoIiB2YWx1ZT0icGl4ZWwiLz4KCQkJCQk8L3JlcG9ydEVsZW1lbnQ+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IkNlbnRlciIvPgoJCQkJCTx0ZXh0RmllbGRFeHByZXNzaW9uPjwhW0NEQVRBW2NvbS5ldm9sdmV1bS5taWRwb2ludC5yZXBvcnQuaW1wbC5SZXBvcnRVdGlscy5wcmV0dHlQcmludENlcnRPdXRjb21lRm9yUmVwb3J0KChjb20uZXZvbHZldW0ubWlkcG9pbnQueG1sLm5zLl9wdWJsaWMuY29tbW9uLmNvbW1vbl8zLkFic3RyYWN0V29ya0l0ZW1PdXRwdXRUeXBlKSRGe291dHB1dH0sIHRydWUpXV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCQk8dGV4dEZpZWxkIGlzQmxhbmtXaGVuTnVsbD0idHJ1ZSI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgeD0iMTA1NSIgeT0iMCIgd2lkdGg9IjE2NSIgaGVpZ2h0PSIyNCIgdXVpZD0iYTlhYWQ1NzYtNjlkYi00N2MxLWI0OWItNDQ3OTNhNGU2YTA3Ij4KCQkJCQkJPHByb3BlcnR5IG5hbWU9ImNvbS5qYXNwZXJzb2Z0LnN0dWRpby51bml0LngiIHZhbHVlPSJwaXhlbCIvPgoJCQkJCTwvcmVwb3J0RWxlbWVudD4KCQkJCQk8dGV4dEVsZW1lbnQgdGV4dEFsaWdubWVudD0iQ2VudGVyIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbY29tLmV2b2x2ZXVtLm1pZHBvaW50LnJlcG9ydC5pbXBsLlJlcG9ydFV0aWxzLnByZXR0eVByaW50Q2VydENvbW1lbnRGb3JSZXBvcnQoJEZ7b3V0cHV0fSldXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJPC9mcmFtZT4KCQk8L2JhbmQ+Cgk8L2RldGFpbD4KCTxwYWdlRm9vdGVyPgoJCTxiYW5kIGhlaWdodD0iMzIiIHNwbGl0VHlwZT0iU3RyZXRjaCI+CgkJCTxmcmFtZT4KCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgbW9kZT0iVHJhbnNwYXJlbnQiIHg9IjAiIHk9IjEiIHdpZHRoPSIxMTgwIiBoZWlnaHQ9IjI0IiBmb3JlY29sb3I9IiMwMDAwMDAiIGJhY2tjb2xvcj0iIzI2Nzk5NCIgdXVpZD0iZmJlOGFhZTQtNjUwMC00NjhhLWIxZTgtNzAwYjU2OTEzOWExIi8+CgkJCQk8dGV4dEZpZWxkIHBhdHRlcm49IkVFRUVFIGRkIE1NTU1NIHl5eXkiPgoJCQkJCTxyZXBvcnRFbGVtZW50IHN0eWxlPSJQYWdlIGZvb3RlciIgeD0iMiIgeT0iMSIgd2lkdGg9IjE5NyIgaGVpZ2h0PSIyMCIgdXVpZD0iMjhiYjliNDctYTY5Yy00OGUxLTkwNzMtZDU0ZDkyNjI0MmU4Ii8+CgkJCQkJPHRleHRFbGVtZW50IHZlcnRpY2FsQWxpZ25tZW50PSJNaWRkbGUiLz4KCQkJCQk8dGV4dEZpZWxkRXhwcmVzc2lvbj48IVtDREFUQVtuZXcgamF2YS51dGlsLkRhdGUoKV1dPjwvdGV4dEZpZWxkRXhwcmVzc2lvbj4KCQkJCTwvdGV4dEZpZWxkPgoJCQkJPHRleHRGaWVsZD4KCQkJCQk8cmVwb3J0RWxlbWVudCBzdHlsZT0iUGFnZSBmb290ZXIiIHg9IjEwNjAiIHk9IjEiIHdpZHRoPSI4MCIgaGVpZ2h0PSIyMCIgdXVpZD0iNWMwNjJjNjYtYmE0NS00Mjg4LTlkY2QtMjQ2ZTI4YzVhZjc1Ii8+CgkJCQkJPHRleHRFbGVtZW50IHRleHRBbGlnbm1lbnQ9IlJpZ2h0IiB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbIlBhZ2UgIiskVntQQUdFX05VTUJFUn0rIiBvZiJdXT48L3RleHRGaWVsZEV4cHJlc3Npb24+CgkJCQk8L3RleHRGaWVsZD4KCQkJCTx0ZXh0RmllbGQgZXZhbHVhdGlvblRpbWU9IlJlcG9ydCI+CgkJCQkJPHJlcG9ydEVsZW1lbnQgc3R5bGU9IlBhZ2UgZm9vdGVyIiB4PSIxMTQwIiB5PSIxIiB3aWR0aD0iNDAiIGhlaWdodD0iMjAiIHV1aWQ9IjkzNGIxNmU4LWMzZWItNDAxNy04NjZhLTBiNzczNWJmMjkxNyIvPgoJCQkJCTx0ZXh0RWxlbWVudCB2ZXJ0aWNhbEFsaWdubWVudD0iTWlkZGxlIi8+CgkJCQkJPHRleHRGaWVsZEV4cHJlc3Npb24+PCFbQ0RBVEFbIiAiICsgJFZ7UEFHRV9OVU1CRVJ9XV0+PC90ZXh0RmllbGRFeHByZXNzaW9uPgoJCQkJPC90ZXh0RmllbGQ+CgkJCTwvZnJhbWU+CgkJPC9iYW5kPgoJPC9wYWdlRm9vdGVyPgo8L2phc3BlclJlcG9ydD4K - html - JRSwapFileVirtualizer - 300 - 10000 - 300000 - - - prismReference - + Certification decisions report + Decisions of individual reviewers for a certification campaign as a whole or for a given campaign stage. + + + + + + + + ../name + + filterAll + + + + + + + + + + + objectColumn + objectRef + + Object + + + + + + + + + targetColumn + targetRef + + Target + + objectColumn + + + + + + + + workItemColumn + workItem + + Reviewed by - Reviewed on - Iteration - In stage - Result (Comment) + + targetColumn + + + + + + + + objectRef/@/name + + c:AccessCertificationCaseType + + + campaignName + c:ObjectReferenceType + c:AccessCertificationCampaignType + + + campaignName + + runReportPopupContent.param.name.campaignName + + + + + + stageNumber + string + + + stageNumber + + runReportPopupContent.param.name.stageNumber + + + + + + iteration + string + + + iteration + + runReportPopupContent.param.name.iteration + + + + + diff --git a/config/initial-objects/280-object-collection-resource-up.xml b/config/initial-objects/251-object-collection-resource-up.xml similarity index 100% rename from config/initial-objects/280-object-collection-resource-up.xml rename to config/initial-objects/251-object-collection-resource-up.xml diff --git a/config/initial-objects/270-object-collection-task-active.xml b/config/initial-objects/261-object-collection-task-active.xml similarity index 100% rename from config/initial-objects/270-object-collection-task-active.xml rename to config/initial-objects/261-object-collection-task-active.xml diff --git a/config/initial-objects/284-object-collection-audit.xml b/config/initial-objects/270-object-collection-audit.xml similarity index 100% rename from config/initial-objects/284-object-collection-audit.xml rename to config/initial-objects/270-object-collection-audit.xml diff --git a/config/initial-objects/285-object-collection-audit-24h.xml b/config/initial-objects/271-object-collection-audit-24h.xml similarity index 100% rename from config/initial-objects/285-object-collection-audit-24h.xml rename to config/initial-objects/271-object-collection-audit-24h.xml diff --git a/config/initial-objects/290-object-collection-audit-errors-24h.xml b/config/initial-objects/272-object-collection-audit-errors-24h.xml similarity index 100% rename from config/initial-objects/290-object-collection-audit-errors-24h.xml rename to config/initial-objects/272-object-collection-audit-errors-24h.xml diff --git a/config/initial-objects/300-object-collection-audit-modifications-24h.xml b/config/initial-objects/273-object-collection-audit-modifications-24h.xml similarity index 100% rename from config/initial-objects/300-object-collection-audit-modifications-24h.xml rename to config/initial-objects/273-object-collection-audit-modifications-24h.xml diff --git a/config/initial-objects/280-object-collection-certification-campaign-all.xml b/config/initial-objects/280-object-collection-certification-campaign-all.xml new file mode 100644 index 00000000000..a92f8c21f25 --- /dev/null +++ b/config/initial-objects/280-object-collection-certification-campaign-all.xml @@ -0,0 +1,27 @@ + + + + + All certification campaigns + AccessCertificationCampaignType + + + + + + + case + + + include + + + + diff --git a/gui/admin-gui/src/main/resources/initial-objects/255-object-collection-certification-definition-all.xml b/config/initial-objects/290-object-collection-shadow-all.xml similarity index 72% rename from gui/admin-gui/src/main/resources/initial-objects/255-object-collection-certification-definition-all.xml rename to config/initial-objects/290-object-collection-shadow-all.xml index 330c41f246c..c08274cd3d9 100644 --- a/gui/admin-gui/src/main/resources/initial-objects/255-object-collection-certification-definition-all.xml +++ b/config/initial-objects/290-object-collection-shadow-all.xml @@ -1,6 +1,6 @@ - - - net.sf.jasperreports - jasperreports - - - bouncycastle - bcmail-jdk14 - - - bouncycastle - bcprov-jdk14 - - - bouncycastle - bctsp-jdk14 - - - org.bouncycastle - bcprov-jdk15on - - - org.apache.poi diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java index 9da81c40ca4..0e7396559c8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ObjectListPanel.java @@ -9,6 +9,10 @@ import java.util.*; import java.util.function.Supplier; +import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel; +import com.evolveum.midpoint.web.component.search.*; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectColumnType; import com.evolveum.midpoint.prism.query.ObjectOrdering; import com.evolveum.midpoint.web.component.util.SerializableFunction; @@ -22,26 +26,17 @@ import org.apache.wicket.util.string.StringValue; import org.jetbrains.annotations.NotNull; -import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.gui.impl.component.ContainerableListPanel; import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.web.component.data.ISelectableDataProvider; import com.evolveum.midpoint.web.component.data.SelectableBeanObjectDataProvider; import com.evolveum.midpoint.web.component.data.column.ColumnUtils; import com.evolveum.midpoint.web.component.data.column.ObjectNameColumn; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; -import com.evolveum.midpoint.web.component.search.ContainerTypeSearchItem; -import com.evolveum.midpoint.web.component.search.Search; -import com.evolveum.midpoint.web.component.search.SearchFactory; -import com.evolveum.midpoint.web.component.search.SearchValue; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.SerializableSupplier; import com.evolveum.midpoint.web.session.PageStorage; @@ -145,7 +140,7 @@ public void addPerformed(AjaxRequestTarget target, List selected) { } @Override - protected IColumn, String> createNameColumn(IModel displayModel, String itemPath, ExpressionType expression) { + protected IColumn, String> createNameColumn(IModel displayModel, GuiObjectColumnType customColumn, String itemPath, ExpressionType expression) { return new ObjectNameColumn<>(displayModel == null ? createStringResource("ObjectType.name") : displayModel, itemPath, expression, getPageBase(), StringUtils.isEmpty(itemPath)) { private static final long serialVersionUID = 1L; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/tabs/PanelTab.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/tabs/PanelTab.java index 8b238752a60..a17f3cba00e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/tabs/PanelTab.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/tabs/PanelTab.java @@ -58,4 +58,8 @@ public boolean isVisible() { return visible.isVisible(); } + + public void resetPanel(){ + panel = null; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 19c3c04ca1e..feb01e78447 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -16,6 +16,8 @@ import com.evolveum.midpoint.gui.impl.component.menu.LeftMenuPanel; +import com.evolveum.midpoint.report.api.ReportService; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index cca055a367e..c226865f24d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -23,6 +23,8 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.component.util.SelectableBean; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.*; import org.apache.commons.lang3.math.NumberUtils; @@ -867,6 +869,8 @@ public static List createContainerableTypesQnameList() { List qnameList = types.stream().map(type -> type.getTypeQName()).collect(Collectors.toList()); //todo create enum for containerable types? qnameList.add(AuditEventRecordType.COMPLEX_TYPE); + qnameList.add(AccessCertificationCaseType.COMPLEX_TYPE); + qnameList.add(CaseWorkItemType.COMPLEX_TYPE); return qnameList.stream().sorted((type1, type2) -> { Validate.notNull(type1); Validate.notNull(type2); @@ -2412,11 +2416,12 @@ public static void setCurrentPage(Table table, ObjectPaging paging) { return; } - if (paging == null) { + if (paging == null || paging.getOffset() == null) { table.getDataTable().setCurrentPage(0); return; } + long itemsPerPage = table.getDataTable().getItemsPerPage(); long page = ((paging.getOffset() + itemsPerPage) / itemsPerPage) - 1; if (page < 0) { @@ -2601,6 +2606,7 @@ protected void onSubmit(AjaxRequestTarget target) { if (target != null) { target.add(findParent(TabbedPanel.class)); } + target.add(parentPage.getFeedbackPanel()); } }; @@ -5085,6 +5091,71 @@ public static String countLinkFroNonDeadShadows(Collection return Integer.toString(count); } + public static List> getAllowedValues(SearchFilterParameterType parameter, PageBase pageBase) { + List> allowedValues = new ArrayList<>(); + + if (parameter == null || parameter.getAllowedValuesExpression() == null) { + return allowedValues; + } + Task task = pageBase.createSimpleTask("evaluate expression for allowed values"); + ExpressionType expression = parameter.getAllowedValuesExpression(); + Object value = null; + try { + + value = ExpressionUtil.evaluateExpression(new VariablesMap(), null, + expression, MiscSchemaUtil.getExpressionProfile(), + pageBase.getExpressionFactory(), "evaluate expression for allowed values", task, task.getResult()); + } catch (Exception e) { + LOGGER.error("Couldn't execute expression " + expression, e); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.evaluateAllowedValuesExpression", expression).getString()); + return allowedValues; + } + if (value instanceof PrismPropertyValue) { + value = ((PrismPropertyValue) value).getRealValue(); + } + + if (!(value instanceof List)) { + LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); + return allowedValues; + } + + if (!((List>) value).isEmpty()) { + if (!(((List>) value).get(0) instanceof DisplayableValue)) { + LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); + return allowedValues; + } + return (List>) value; + } + return allowedValues; + } + + public static DropDownChoicePanel createDropDownChoices(String id, IModel> model, IModel>> choices, + boolean allowNull, PageBase pageBase) { + return new DropDownChoicePanel(id, model, choices, new IChoiceRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Object getDisplayValue(DisplayableValue val) { + if (val.getValue() instanceof Enum) { + return pageBase.createStringResource((Enum>) val.getValue()).getString(); + } + return pageBase.createStringResource(val.getLabel()).getString(); + } + + @Override + public String getIdValue(DisplayableValue val, int index) { + return Integer.toString(index); + } + + @Override + public DisplayableValue getObject(String id, IModel extends List extends DisplayableValue>> choices) { + return StringUtils.isNotBlank(id) ? choices.getObject().get(Integer.parseInt(id)) : null; + } + }, allowNull); + } + public static Map createMainButtonLayerIcon(DisplayType mainButtonDisplayType) { if (mainButtonDisplayType.getIcon() != null && mainButtonDisplayType.getIcon().getCssClass() != null && mainButtonDisplayType.getIcon().getCssClass().contains(GuiStyleConstants.CLASS_ADD_NEW_OBJECT)) { @@ -5094,4 +5165,23 @@ public static Map createMainButtonLayerIcon(DisplayType layerIconMap.put(IconCssStyle.BOTTOM_RIGHT_STYLE, WebComponentUtil.createIconType(GuiStyleConstants.CLASS_PLUS_CIRCLE, "green")); return layerIconMap; } + + public static void addNewArchetype(PrismObjectWrapper object, String archetypeOid, AjaxRequestTarget target, PageBase pageBase){ + try { + PrismContainerWrapper archetypeAssignment = object.findContainer(TaskType.F_ASSIGNMENT); + PrismContainerValue archetypeAssignmentValue = archetypeAssignment.getItem().createNewValue(); + AssignmentType newArchetypeAssignment = archetypeAssignmentValue.asContainerable(); + newArchetypeAssignment.setTargetRef(ObjectTypeUtil.createObjectRef(archetypeOid, ObjectTypes.ARCHETYPE)); + WebPrismUtil.createNewValueWrapper(archetypeAssignment, archetypeAssignmentValue, pageBase, target); + } catch (SchemaException e) { + LOGGER.error("Exception during assignment lookup, reason: {}", e.getMessage(), e); + pageBase.error("Cannot set selected handler: " + e.getMessage()); + return; + } + } + + public static boolean isImportReport(ReportType report) { + ReportBehaviorType behavior = report.getBehavior(); + return behavior != null && DirectionTypeType.IMPORT.equals(behavior.getDirection()); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentConstructionPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentConstructionPanel.java index 7e48b3ab1e0..3e8453a4cd5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentConstructionPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentConstructionPanel.java @@ -7,6 +7,7 @@ package com.evolveum.midpoint.gui.impl.component; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; import com.evolveum.midpoint.gui.impl.prism.panel.ResourceAttributePanel; import com.evolveum.midpoint.gui.impl.prism.panel.SingleContainerPanel; @@ -41,7 +42,8 @@ private void initLayout() { SingleContainerPanel baseConstructionPanel = new SingleContainerPanel<>(ID_BASIC, getModel(), ConstructionType.COMPLEX_TYPE) { @Override - protected ItemVisibility getVisibility(ItemPath itemPath) { + protected ItemVisibility getVisibility(ItemWrapper itemWrapper) { + ItemPath itemPath = itemWrapper.getPath(); if (isAssociation(itemPath)) { return ItemVisibility.HIDDEN; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentsDetailsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentsDetailsPanel.java index 88092234bee..18c5dc2abe4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentsDetailsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/AssignmentsDetailsPanel.java @@ -232,7 +232,8 @@ public WebMarkupContainer createPanel(String panelId) { PrismContainerWrapperModel.fromContainerValueWrapper(getModel(), AssignmentType.F_ACTIVATION), ActivationType.COMPLEX_TYPE) { @Override - protected ItemVisibility getVisibility(ItemPath itemPath) { + protected ItemVisibility getVisibility(ItemWrapper itemWrapper) { + ItemPath itemPath = itemWrapper.getPath(); if (ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_ACTIVATION, ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP).equivalent(itemPath.namedSegmentsOnly())) { return ItemVisibility.HIDDEN; } @@ -249,7 +250,7 @@ protected ItemVisibility getVisibility(ItemPath itemPath) { return ItemVisibility.HIDDEN; } - return super.getVisibility(itemPath); + return super.getVisibility(itemWrapper); } }; } @@ -264,9 +265,10 @@ public WebMarkupContainer createPanel(String panelId) { return new SingleContainerPanel<>(panelId, PrismContainerWrapperModel.fromContainerValueWrapper(getModel(), AssignmentType.F_CONDITION), MappingType.COMPLEX_TYPE) { @Override - protected ItemVisibility getVisibility(ItemPath itemPath) { + protected ItemVisibility getVisibility(ItemWrapper itemWrapper) { ItemPath assignmentConditionExpressionPath = ItemPath.create(AssignmentHolderType.F_ASSIGNMENT, AssignmentType.F_CONDITION, MappingType.F_EXPRESSION); ItemPath inducementConditionExpressionPath = ItemPath.create(AbstractRoleType.F_INDUCEMENT, AssignmentType.F_CONDITION, MappingType.F_EXPRESSION); + ItemPath itemPath = itemWrapper.getPath(); if (itemPath.namedSegmentsOnly().equivalent(assignmentConditionExpressionPath) || itemPath.namedSegmentsOnly().equivalent(inducementConditionExpressionPath)) { return ItemVisibility.AUTO; } else { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/BasicMultivalueContainerListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/BasicMultivalueContainerListPanel.java new file mode 100644 index 00000000000..62943a73a83 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/BasicMultivalueContainerListPanel.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.component; + +import com.evolveum.midpoint.gui.api.component.DisplayNamePanel; +import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder; +import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle; +import com.evolveum.midpoint.gui.impl.factory.panel.ItemRealValueModel; +import com.evolveum.midpoint.gui.impl.prism.panel.SingleContainerPanel; +import com.evolveum.midpoint.model.api.AssignmentObjectRelation; +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.CompositedIconButtonDto; +import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; +import com.evolveum.midpoint.web.component.util.VisibleBehaviour; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; + +import com.evolveum.midpoint.web.model.PrismContainerWrapperModel; +import com.evolveum.midpoint.web.page.admin.reports.component.EngineReportTabPanel; +import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.DisplayType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionReportEngineConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchFilterParameterType; + +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.tabs.ITab; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.list.ListItem; +import org.apache.wicket.markup.html.list.ListView; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author skublik + */ + +public abstract class BasicMultivalueContainerListPanel + extends MultivalueContainerListPanelWithDetailsPanel { + + private static final long serialVersionUID = 1L; + + public BasicMultivalueContainerListPanel(String id, Class type) { + super(id, type); + } + + protected String createHeaderClassIcon(){ + return "fa fa-sliders"; + }; + + @Override + protected boolean isCreateNewObjectVisible() { + return true; + } + + @Override + protected List createNewButtonDescription() { + String title = getPageBase().createStringResource("PageAdminObjectDetails.title.new", getContainerNameForNewButton()).getString(); + DisplayType defaultButtonDisplayType = WebComponentUtil.createDisplayType("fa fa-plus", "green", title); + CompositedIconButtonDto defaultButton = new CompositedIconButtonDto(); + CompositedIconBuilder builder = new CompositedIconBuilder(); + builder.setBasicIcon(WebComponentUtil.getIconCssClass(defaultButtonDisplayType), IconCssStyle.IN_ROW_STYLE) + .appendColorHtmlValue(WebComponentUtil.getIconColor(defaultButtonDisplayType)); + + defaultButton.setAdditionalButtonDisplayType(defaultButtonDisplayType); + defaultButton.setCompositedIcon(builder.build()); + return Collections.singletonList(defaultButton); + } + + protected String getContainerNameForNewButton(){ + return ""; + } + + @Override + protected UserProfileStorage.TableId getTableId() { + return null; + } + + @Override + protected Component createHeader(String headerId) { + return new WebMarkupContainer(headerId); + } + + @Override + protected IColumn, String> createCheckboxColumn() { + return new CheckBoxHeaderColumn<>(); + } + + @Override + protected List createInlineMenu() { + return getDefaultMenuActions(); + } + + @Override + protected void newItemPerformed(AjaxRequestTarget target, AssignmentObjectRelation relationSepc) { + PrismContainerValue newParameter = getContainerModel().getObject().getItem().createNewValue(); + createNewItemContainerValueWrapper(newParameter, getContainerModel().getObject(), target); + refreshTable(target); + reloadSavePreviewButtons(target); + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java index b4a4ebfef2d..043af036301 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/ContainerableListPanel.java @@ -7,15 +7,16 @@ package com.evolveum.midpoint.gui.impl.component; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.Objects; import java.util.stream.Collectors; import javax.xml.namespace.QName; import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; +import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.prism.xml.ns._public.query_3.OrderDirectionType; +import com.evolveum.prism.xml.ns._public.query_3.PagingType; import com.evolveum.midpoint.web.component.CompositedIconButtonDto; import org.apache.commons.collections4.CollectionUtils; @@ -26,11 +27,14 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; +import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; +import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Fragment; +import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; @@ -64,6 +68,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.*; @@ -103,7 +108,7 @@ public abstract class ContainerableListPanel load() { if (isCollectionViewPanel()) { - search.setCollectionSearchItem(new ObjectCollectionSearchItem(search, getObjectCollectionView())); + CompiledObjectCollectionView view = getObjectCollectionView(); + search.setCollectionSearchItem(new ObjectCollectionSearchItem(search, view)); search.setCollectionItemVisible(isCollectionViewPanelForWidget()); + if (storage != null && view.getPaging() != null) { + ObjectPaging paging = ObjectQueryUtil.convertToObjectPaging(view.getPaging(), getPrismContext()); + if (storage.getPaging() == null) { + storage.setPaging(paging); + } + if (getTableId() != null && paging.getMaxSize() != null + && !getPageBase().getSessionStorage().getUserProfile().isExistPagingSize(getTableId())) { + getPageBase().getSessionStorage().getUserProfile().setPagingSize(getTableId(), paging.getMaxSize()); + } + } } if (storage != null) { storage.setSearch(search); @@ -235,7 +251,7 @@ protected boolean isListPanelVisible() { return true; } - protected WebMarkupContainer createHeader(String headerId) { + protected Component createHeader(String headerId) { return initSearch(headerId); } @@ -243,13 +259,14 @@ protected BoxedTablePanel initItemTable() { List> columns = createColumns(); ISelectableDataProvider provider = createProvider(); + setDefaultSorting(provider); BoxedTablePanel itemTable = new BoxedTablePanel<>(ID_ITEMS_TABLE, provider, columns, getTableId()) { private static final long serialVersionUID = 1L; @Override - protected WebMarkupContainer createHeader(String headerId) { - WebMarkupContainer header = ContainerableListPanel.this.createHeader(headerId); + protected Component createHeader(String headerId) { + Component header = ContainerableListPanel.this.createHeader(headerId); header.add(new VisibleBehaviour(() -> isHeaderVisible())); return header; @@ -269,6 +286,7 @@ public String getObject() { } })); } + customProcessNewRowItem(item, model); return item; } @@ -312,6 +330,9 @@ public boolean enableSavePageSize() { return itemTable; } + protected void customProcessNewRowItem(org.apache.wicket.markup.repeater.Item item, IModel model) { + } + protected abstract UserProfileStorage.TableId getTableId(); protected boolean isHeaderVisible() { @@ -384,7 +405,12 @@ private List> createColumns() { addCustomActions(menuItems, this::getSelectedRealObjects); if (!menuItems.isEmpty()) { - InlineMenuButtonColumn actionsColumn = new InlineMenuButtonColumn<>(menuItems, getPageBase()); + InlineMenuButtonColumn actionsColumn = new InlineMenuButtonColumn<>(menuItems, getPageBase()){ + @Override + public String getCssClass() { + return "col-md-1"; + } + }; columns.add(actionsColumn); } return columns; @@ -405,6 +431,7 @@ private List> initViewColumns() { LOGGER.trace("Finished to init custom columns, created columns {}", columns); return columns; } + private void addingCheckAndIconColumnIfExists(List> columns){ IColumn checkboxColumn = createCheckboxColumn(); if (checkboxColumn != null) { @@ -430,7 +457,7 @@ protected List> getViewColumnsTransformed(List> getViewColumnsTransformed(List columnDisplayModel = createColumnDisplayModel(customColumn); if (customColumns.indexOf(customColumn) == 0) { // TODO what if a complex path is provided here? - column = createNameColumn(columnDisplayModel, customColumn.getPath() == null ? "" : customColumn.getPath().toString(), expression); + column = createNameColumn(columnDisplayModel, customColumn, customColumn.getPath() == null ? "" : customColumn.getPath().toString(), expression); } else { column = createCustomExportableColumn(columnDisplayModel, customColumn, columnPath, expression); } - - columns.add(column); + if (column != null) { + columns.add(column); + } } } return columns; @@ -477,14 +505,23 @@ private IModel createColumnDisplayModel(GuiObjectColumnType customColumn Model.of(customColumn.getName()))); } - private IColumn createCustomExportableColumn(IModel columnDisplayModel, GuiObjectColumnType customColumn, ItemPath columnPath, ExpressionType expression) { + protected IColumn createCustomExportableColumn(IModel columnDisplayModel, GuiObjectColumnType customColumn, ItemPath columnPath, ExpressionType expression) { return new AbstractExportableColumn<>(columnDisplayModel, getSortProperty(customColumn, columnPath, expression)) { private static final long serialVersionUID = 1L; @Override public void populateItem(org.apache.wicket.markup.repeater.Item> item, String componentId, IModel rowModel) { - item.add(new Label(componentId, getDataModel(rowModel))); + IModel> model = getDataModel(rowModel); + if (model != null && model.getObject() instanceof Collection){ + RepeatingView listItems = new RepeatingView(componentId); + for (Object object : (Collection)model.getObject()) { + listItems.add(new Label(listItems.newChildId(), (IModel) () -> object)); + } + item.add(listItems); + } else { + item.add(new Label(componentId, model)); + } } @Override @@ -555,21 +592,22 @@ private IModel> getExportableColumnDataModel(IModel rowModel, GuiObjectCol return new ReadOnlyModel<>(() -> loadExportableColumnDataModel(rowModel, customColumn, columnPath, expression)); } - private String loadExportableColumnDataModel(IModel rowModel, GuiObjectColumnType customColumn, ItemPath columnPath, ExpressionType expression) { + private Collection loadExportableColumnDataModel(IModel rowModel, GuiObjectColumnType customColumn, ItemPath columnPath, ExpressionType expression) { C value = getRowRealValue(rowModel.getObject()); if (value == null) { - return ""; + return Collections.singletonList(""); } Item, ?> item = findItem(value, columnPath); if (expression != null) { - return evaluateExpression(value, item, expression, customColumn); + Collection collection = evaluateExpression(value, item, expression, customColumn); + return getValuesString(collection, customColumn.getDisplayValue()); } if (item != null) { return evaluateItemValues(item, customColumn.getDisplayValue()); } - return ""; + return Collections.singletonList(""); } protected abstract C getRowRealValue(PO rowModelObject); @@ -581,7 +619,7 @@ private String loadExportableColumnDataModel(IModel rowModel, GuiObjectColum return null; } - private String evaluateExpression(C rowValue, Item, ?> columnItem, ExpressionType expression, GuiObjectColumnType customColumn) { + protected Collection evaluateExpression(C rowValue, Item, ?> columnItem, ExpressionType expression, GuiObjectColumnType customColumn) { Task task = getPageBase().createSimpleTask(OPERATION_EVALUATE_EXPRESSION); OperationResult result = task.getResult(); try { @@ -593,61 +631,94 @@ private String evaluateExpression(C rowValue, Item, ?> columnItem, ExpressionT Collection evaluatedValues = ExpressionUtil.evaluateStringExpression(variablesMap, getPageBase().getPrismContext(), expression, MiscSchemaUtil.getExpressionProfile(), getPageBase().getExpressionFactory(), "evaluate column expression", task, result); - String stringValue = null; - if (evaluatedValues != null) { - stringValue = evaluatedValues.iterator().next(); // TODO: what if more than one value is returned? - } - - return stringValue; + return evaluatedValues; } catch (Exception e) { LOGGER.error("Couldn't execute expression for {} column. Reason: {}", customColumn, e.getMessage(), e); result.recomputeStatus(); OperationResultStatusPresentationProperties props = OperationResultStatusPresentationProperties.parseOperationalResultStatus(result.getStatus()); - return getPageBase().createStringResource(props.getStatusLabelKey()).getString(); //TODO: this is not entirely correct + return Collections.singletonList(getPageBase().createStringResource(props.getStatusLabelKey()).getString()); //TODO: this is not entirely correct } } - private String evaluateItemValues(Item, ?> item, DisplayValueType displayValue) { - return getItemValuesString(item, displayValue, loadLookupTable(item)); + private List evaluateItemValues(Item, ?> item, DisplayValueType displayValue) { + return getValuesString(item, displayValue, loadLookupTable(item)); } - private String getItemValuesString(Item, ?> item, DisplayValueType displayValue, PrismObject lookupTable){ + private List getValuesString(Item, ?> item, DisplayValueType displayValue, PrismObject lookupTable){ if (DisplayValueType.NUMBER.equals(displayValue)) { + String number; //This is really ugly HACK FIXME TODO if (item.getDefinition() != null && UserType.F_LINK_REF.equivalent(item.getDefinition().getItemName())) { - return WebComponentUtil.countLinkFroNonDeadShadows((Collection) item.getRealValues()); + number = WebComponentUtil.countLinkFroNonDeadShadows((Collection) item.getRealValues()); + } else { + number = String.valueOf(item.getValues().size()); } - return String.valueOf(item.getValues().size()); + return Collections.singletonList(number); } return item.getValues().stream() .filter(Objects::nonNull) - .map(itemValue -> getStringValue(itemValue,lookupTable)) - .collect(Collectors.joining(", ")); + .map(itemValue -> getStringValue(itemValue, lookupTable)) + .collect(Collectors.toList()); } - private String getStringValue(PrismValue itemValue, PrismObject lookupTable) { - if (!(itemValue instanceof PrismPropertyValue)) { - return itemValue.toString(); + private List getValuesString(Collection collection, DisplayValueType displayValue){ + if (DisplayValueType.NUMBER.equals(displayValue)) { + return Collections.singletonList(String.valueOf(collection.size())); } - PrismPropertyValue> prismPropertyValue = (PrismPropertyValue>) itemValue; - if (lookupTable == null) { - if (isPolyString(prismPropertyValue.getTypeName())) { - return WebComponentUtil.getTranslatedPolyString((PolyString) prismPropertyValue.getValue()); - } - return String.valueOf(prismPropertyValue.getValue()); + return (List) collection.stream() + .filter(Objects::nonNull) + .map(object -> getStringValue(object, null)) + .collect(Collectors.toList()); + } + + private String getStringValue(Object object, PrismObject lookupTable) { + if (object == null) { + return ""; } - String lookupTableKey = prismPropertyValue.getValue().toString(); - LookupTableType lookupTableObject = lookupTable.asObjectable(); - String rowLabel = ""; - for (LookupTableRowType lookupTableRow : lookupTableObject.getRow()){ - if (lookupTableRow.getKey().equals(lookupTableKey)){ - return lookupTableRow.getLabel() != null ? lookupTableRow.getLabel().getOrig() : lookupTableRow.getValue(); + if (object instanceof PrismPropertyValue) { + PrismPropertyValue> prismPropertyValue = (PrismPropertyValue>) object; + if (lookupTable == null) { + if (isPolyString(prismPropertyValue.getTypeName())) { + return WebComponentUtil.getTranslatedPolyString((PolyString) prismPropertyValue.getValue()); + } + if (prismPropertyValue.getValue() instanceof Enum) { + return getPageBase().createStringResource((Enum)prismPropertyValue.getValue()).getString(); + } + return String.valueOf(prismPropertyValue.getValue()); + } + + String lookupTableKey = prismPropertyValue.getValue().toString(); + LookupTableType lookupTableObject = lookupTable.asObjectable(); + String rowLabel = ""; + for (LookupTableRowType lookupTableRow : lookupTableObject.getRow()) { + if (lookupTableRow.getKey().equals(lookupTableKey)) { + return lookupTableRow.getLabel() != null ? lookupTableRow.getLabel().getOrig() : lookupTableRow.getValue(); + } } + return rowLabel; } - return rowLabel; + if (object instanceof Enum) { + return getPageBase().createStringResource((Enum)object).getString(); + } + if (object instanceof ObjectType){ + return WebComponentUtil.getDisplayName(((ObjectType)object).asPrismObject()); + } + if (object instanceof PrismObject){ + return WebComponentUtil.getDisplayName((PrismObject) object); + } + if (object instanceof PrismObjectValue){ + return WebComponentUtil.getDisplayName(((PrismObjectValue) object).asPrismObject()); + } + if (object instanceof PrismReferenceValue) { + return WebComponentUtil.getDisplayName(((PrismReferenceValue) object).getRealValue(), true); + } + if (object instanceof ObjectReferenceType) { + return WebComponentUtil.getDisplayName(((ObjectReferenceType) object)); + } + return object.toString(); } private boolean isPolyString(QName typeName) { @@ -693,7 +764,7 @@ private List> initColumns() { if (others == null) { return columns; } else { - IColumn nameColumn = createNameColumn(null, null, null); + IColumn nameColumn = createNameColumn(null, null, null, null); if (nameColumn != null) { columns.add(nameColumn); } @@ -712,7 +783,7 @@ protected IColumn createCheckboxColumn(){ protected abstract IColumn createIconColumn(); - protected IColumn createNameColumn(IModel displayModel, String itemPath, ExpressionType expression) { + protected IColumn createNameColumn(IModel displayModel, GuiObjectColumnType customColumn, String itemPath, ExpressionType expression) { return null; } @@ -833,7 +904,7 @@ protected int getAutoRefreshInterval() { return 0; } - protected final CompiledObjectCollectionView getObjectCollectionView() { + protected CompiledObjectCollectionView getObjectCollectionView() { CompiledObjectCollectionView view = getWidgetCollectionView(); if (view != null) { return view; @@ -932,18 +1003,26 @@ protected Collection> getOptions(){ public void refreshTable(AjaxRequestTarget target) { BoxedTablePanel table = getTable(); if (searchModel.getObject().isTypeChanged()){ - table.getDataTable().getColumns().clear(); - //noinspection unchecked - table.getDataTable().getColumns().addAll(createColumns()); - ((WebMarkupContainer) table.get("box")).addOrReplace(initSearch("header")); - resetSearchModel(); - table.setCurrentPage(null); + resetTable(target); } else { saveSearchModel(getCurrentTablePaging()); } - target.add(table); - target.add(getPageBase().getFeedbackPanel()); + target.add(getFeedbackPanel()); + } + + public void resetTable(AjaxRequestTarget target) { + BoxedTablePanel table = getTable(); + table.getDataTable().getColumns().clear(); + //noinspection unchecked + table.getDataTable().getColumns().addAll(createColumns()); + ((WebMarkupContainer) table.get("box")).addOrReplace(initSearch("header")); + resetSearchModel(); + table.setCurrentPage(null); + } + + protected Component getFeedbackPanel() { + return getPageBase().getFeedbackPanel(); } public void resetSearchModel(){ @@ -1115,4 +1194,19 @@ protected void createReportPerformed(AjaxRequestTarget target) { protected GuiObjectListViewType getDefaultView() { return DefaultColumnUtils.getDefaultView(getType()); } + + protected void setDefaultSorting(ISelectableDataProvider provider){ + if (provider instanceof SortableDataProvider + && isCollectionViewPanel() && getObjectCollectionView().getPaging() != null + && getObjectCollectionView().getPaging().getOrderBy() != null) { + PagingType paging = getObjectCollectionView().getPaging(); + boolean ascending = !OrderDirectionType.DESCENDING.equals(paging.getOrderDirection()); + ItemPath orderBy = paging.getOrderBy().getItemPath(); + ItemName name = orderBy.lastName(); + if (name == null) { + return; + } + ((SortableDataProvider)provider).setSort(new SortParam(name.getLocalPart(), ascending)); + } + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumn.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumn.java index 7560f078232..1d77b665186 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumn.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumn.java @@ -31,7 +31,8 @@ public abstract class AbstractItemWrapperColumn> mainModel, ItemPath itemName, ColumnType columnType) { super(null); Validate.notNull(mainModel, "no model"); - Validate.notNull(mainModel.getObject(), "no ContainerWrappe from model"); + Validate.notNull(mainModel.getObject(), "no ContainerWrapper from model"); Validate.notNull(itemName, "no qName"); this.mainModel = mainModel; this.itemName = itemName; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumnPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumnPanel.java index ba856284ce4..9b66f897748 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumnPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/data/column/AbstractItemWrapperColumnPanel.java @@ -18,6 +18,7 @@ import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import com.evolveum.midpoint.gui.api.component.BasePanel; @@ -89,10 +90,22 @@ protected void populate(ListItem item) { case VALUE: item.add(createValuePanel(ID_VALUE, getModel(), item.getModelObject())); break; + case EXISTENCE_OF_VALUE: + IModel labelModel = Model.of(""); + if (existenceOfValue(item.getModelObject())) { + labelModel = getPageBase().createStringResource("AbstractItemWrapperColumnPanel.existValue"); + } + Label existence = new Label(ID_VALUE, labelModel); + item.add(existence); + break; } } protected abstract String createLabel(VW object); protected abstract Panel createLink(String id, IModel object); protected abstract Panel createValuePanel(String id, IModel model, VW object); + protected boolean existenceOfValue(VW object) { + Object realValue = object.getRealValue(); + return realValue != null; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/LeftMenuPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/LeftMenuPanel.java index 98fcb25e46c..8e4b3bca426 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/LeftMenuPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/LeftMenuPanel.java @@ -381,36 +381,11 @@ private MainMenuItem createNodesItems() { } private MainMenuItem createReportsItems() { - MainMenuItem reportsMenu = createMainMenuItem("PageAdmin.menu.top.reports", GuiStyleConstants.CLASS_REPORT_ICON); - reportsMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.reports.list", GuiStyleConstants.CLASS_REPORT_ICON, PageReports.class)); - - if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_REPORTS_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL, - AuthorizationConstants.AUTZ_UI_REPORTS_VIEW_URL)) { - - addCollectionsMenuItems(reportsMenu, ReportType.COMPLEX_TYPE, PageReports.class); - } - - if (classMatches(PageReport.class)) { - MenuItem edit = new MenuItem("PageAdmin.menu.top.reports.edit", - PageReport.class); - reportsMenu.addMenuItem(edit); - } - - if (classMatches(PageJasperReport.class)) { - MenuItem configure = new MenuItem("PageAdmin.menu.top.reports.configure", - PageJasperReport.class); - reportsMenu.addMenuItem(configure); - } - - reportsMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.reports.created", PageCreatedReports.class)); - reportsMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.reports.new", PageNewReport.class)); - - -// if (WebComponentUtil.isAuthorized(ModelAuthorizationAction.AUDIT_READ.getUrl())) { - reportsMenu.addMenuItem(new MenuItem("PageAuditLogViewer.menuName", PageAuditLogViewer.class)); -// } - - return reportsMenu; + MainMenuItem reportMenu = createMainMenuItem("PageAdmin.menu.top.reports", GuiStyleConstants.CLASS_REPORT_ICON); + createBasicAssignmentHolderMenuItems(reportMenu, PageTypes.REPORT); + reportMenu.addMenuItem(new MenuItem("PageAdmin.menu.top.reports.created", PageCreatedReports.class)); + reportMenu.addMenuItem(new MenuItem("PageAuditLogViewer.menuName", PageAuditLogViewer.class)); + return reportMenu; } private SideBarMenuItem createConfigurationMenu(boolean experimentalFeaturesEnabled) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/PageTypes.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/PageTypes.java index a3e3669c1bf..4b7d0673129 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/PageTypes.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/menu/PageTypes.java @@ -12,6 +12,8 @@ import com.evolveum.midpoint.web.page.admin.cases.PageCases; import com.evolveum.midpoint.web.page.admin.orgs.PageOrgUnit; import com.evolveum.midpoint.web.page.admin.orgs.PageOrgs; +import com.evolveum.midpoint.web.page.admin.reports.PageReport; +import com.evolveum.midpoint.web.page.admin.reports.PageReports; import com.evolveum.midpoint.web.page.admin.resources.PageResource; import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard; import com.evolveum.midpoint.web.page.admin.resources.PageResources; @@ -35,7 +37,8 @@ public enum PageTypes { ORG("orgs", GuiStyleConstants.CLASS_OBJECT_ORG_ICON, PageOrgs.class, PageOrgUnit.class, OrgType.COMPLEX_TYPE), TASK("tasks", GuiStyleConstants.CLASS_OBJECT_TASK_ICON, PageTasks.class, PageTask.class, TaskType.COMPLEX_TYPE), RESOURCE("resources", GuiStyleConstants.CLASS_OBJECT_RESOURCE_ICON, PageResources.class, PageResourceWizard.class, ResourceType.COMPLEX_TYPE), - CASE("cases", GuiStyleConstants.EVO_CASE_OBJECT_ICON, PageCases.class, null, CaseType.COMPLEX_TYPE); + CASE("cases", GuiStyleConstants.EVO_CASE_OBJECT_ICON, PageCases.class, null, CaseType.COMPLEX_TYPE), + REPORT("reports", GuiStyleConstants.CLASS_REPORT_ICON, PageReports .class, PageReport.class, ReportType.COMPLEX_TYPE); private String identifier; private String icon; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/AutoCompleteReferencePanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/AutoCompleteReferencePanelFactory.java new file mode 100644 index 00000000000..aeee61092c6 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/AutoCompleteReferencePanelFactory.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2010-2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.factory.panel; + +import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteReferenceRenderer; +import com.evolveum.midpoint.gui.api.factory.GuiComponentFactory; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismReferenceWrapper; +import com.evolveum.midpoint.gui.api.registry.GuiComponentRegistry; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismReferenceValueWrapperImpl; +import com.evolveum.midpoint.report.api.ReportConstants; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.data.LinkedReferencePanel; +import com.evolveum.midpoint.web.component.search.ReferenceAutocomplete; +import com.evolveum.midpoint.web.component.search.ReferenceValueSearchPopupPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + +import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.model.Model; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @author lskublik + */ +@Component +public class AutoCompleteReferencePanelFactory + implements GuiComponentFactory> { + + private static final Trace LOGGER = TraceManager.getTrace(AutoCompleteReferencePanelFactory.class); + + @Autowired private GuiComponentRegistry registry; + + @PostConstruct + public void register() { + registry.addToRegistry(this); + } + + @Override + public Integer getOrder() { + return 100; + } + + @Override + public > boolean match(IW wrapper) { + return QNameUtil.match(ObjectReferenceType.COMPLEX_TYPE, wrapper.getTypeName()) + && ReportConstants.NS_EXTENSION.equals(wrapper.getNamespace()) + && wrapper.getParent() == null; + } + + @Override + public org.apache.wicket.Component createPanel(PrismReferencePanelContext panelCtx) { + ReferenceAutocomplete panel = new ReferenceAutocomplete(panelCtx.getComponentId(), panelCtx.getRealValueModel(), + new AutoCompleteReferenceRenderer(), + panelCtx.getPageBase()); + panel.setOutputMarkupId(true); + panel.add(AttributeAppender.append("style", "padding-top:5px")); //ugly hack to be aligned with prism-property-label + return panel; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DropDownChoicePanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DropDownChoicePanelFactory.java index a2db6bf3f08..98fa8e16097 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DropDownChoicePanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/DropDownChoicePanelFactory.java @@ -10,6 +10,8 @@ import javax.annotation.PostConstruct; import javax.xml.namespace.QName; +import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListViewType; + import org.apache.wicket.model.Model; import org.springframework.stereotype.Component; @@ -44,9 +46,10 @@ protected InputPanel getPanel(PrismPropertyPanelContext panelCtx) { List typesList; if (AssignmentType.F_FOCUS_TYPE.equals(panelCtx.getDefinitionName())) { typesList = WebComponentUtil.createFocusTypeList(); - } else if (ObjectCollectionType.F_TYPE.equals(panelCtx.getDefinitionName()) && - panelCtx.unwrapWrapperModel().getParent().getDefinition() != null && - ObjectCollectionType.class.equals(panelCtx.unwrapWrapperModel().getParent().getDefinition().getTypeClass())) { + } else if ((ObjectCollectionType.F_TYPE.equals(panelCtx.getDefinitionName()) || GuiObjectListViewType.F_TYPE.equals(panelCtx.getDefinitionName())) + && panelCtx.unwrapWrapperModel().getParent().getDefinition() != null && + (ObjectCollectionType.class.equals(panelCtx.unwrapWrapperModel().getParent().getDefinition().getTypeClass()) + || GuiObjectListViewType.class.equals(panelCtx.unwrapWrapperModel().getParent().getDefinition().getTypeClass()))) { typesList = WebComponentUtil.createContainerableTypesQnameList(); } else { typesList = WebComponentUtil.createObjectTypeList(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/ParameterTypePanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/ParameterTypePanelFactory.java new file mode 100644 index 00000000000..127a24b95bc --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/ParameterTypePanelFactory.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010-2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.gui.impl.factory.panel; + +import java.io.Serializable; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.xml.namespace.QName; + +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.springframework.stereotype.Component; + +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; +import com.evolveum.midpoint.web.component.input.QNameObjectTypeChoiceRenderer; +import com.evolveum.midpoint.web.component.prism.InputPanel; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; + +/** + * @author katkav + */ +@Component +public class ParameterTypePanelFactory extends DropDownChoicePanelFactory implements Serializable { + + @Override + public > boolean match(IW wrapper) { + return DOMUtil.XSD_QNAME.equals(wrapper.getTypeName()) + && SearchFilterParameterType.F_TYPE.equals(wrapper.getItemName()) + && wrapper.getParent().getDefinition() != null + && ParameterType.class.isAssignableFrom(wrapper.getParent().getDefinition().getTypeClass()); + } + + @Override + protected InputPanel getPanel(PrismPropertyPanelContext panelCtx) { + IModel qNameModel = new IModel() { + @Override + public String getObject() { + if (panelCtx.getRealValueModel().getObject() != null) { + return panelCtx.getRealValueModel().getObject().getLocalPart(); + } + return null; + } + + @Override + public void setObject(String object) { + if (StringUtils.isNotEmpty(object)){ + QName objectQName = getQName(object); + if (!QNameUtil.match(objectQName, panelCtx.getRealValueModel().getObject())) { + panelCtx.getRealValueModel().setObject(objectQName); + } + } else { + panelCtx.getRealValueModel().setObject(null); + } + } + }; + return new TextPanel(panelCtx.getComponentId(), qNameModel, String.class, false); + } + + private QName getQName(String object){ + if (QNameUtil.match(ObjectReferenceType.COMPLEX_TYPE, new QName(object))) { + return ObjectReferenceType.COMPLEX_TYPE; + } + if (QNameUtil.isUriQName(object)) { + return QNameUtil.uriToQName(object); + } + return new QName(object); + } + + @Override + public Integer getOrder() { + return 9000; + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java index 2f47d5b5cef..b88d355f427 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java @@ -8,9 +8,11 @@ import com.evolveum.midpoint.gui.api.model.ReadOnlyModel; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.StringResourceModel; + +import java.util.Collection; /** * @author katka @@ -27,6 +29,10 @@ public LookupTableType getPredefinedValues() { return unwrapWrapperModel().getPredefinedValues(); } + public Collection extends DisplayableValue> getAllowedValues() { + return unwrapWrapperModel().getAllowedValues(); + } + public boolean hasValueEnumerationRef() { return unwrapWrapperModel().getValueEnumerationRef() != null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java index eee4d69107d..109bd26ddb2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java @@ -7,11 +7,24 @@ package com.evolveum.midpoint.gui.impl.factory.panel; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.xml.namespace.QName; +import com.evolveum.midpoint.util.DisplayableValue; + +import com.evolveum.midpoint.web.component.search.FilterSearchItem; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; import org.springframework.stereotype.Component; import com.evolveum.midpoint.common.LocalizationService; @@ -43,21 +56,44 @@ public void register() { @Override protected InputPanel getPanel(PrismPropertyPanelContext panelCtx) { LookupTableType lookupTable = panelCtx.getPredefinedValues(); - if (lookupTable == null) { - return new TextPanel<>(panelCtx.getComponentId(), - panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false); + if (lookupTable != null) { + return new AutoCompleteTextPanel(panelCtx.getComponentId(), + panelCtx.getRealValueModel(), panelCtx.getTypeClass(), panelCtx.hasValueEnumerationRef(), lookupTable) { + + private static final long serialVersionUID = 1L; + + @Override + public Iterator getIterator(String input) { + return (Iterator) prepareAutoCompleteList(input, lookupTable, panelCtx.getPageBase().getLocalizationService()).iterator(); + } + }; } - return new AutoCompleteTextPanel(panelCtx.getComponentId(), - panelCtx.getRealValueModel(), panelCtx.getTypeClass(), panelCtx.hasValueEnumerationRef(), lookupTable) { + Collection extends DisplayableValue> allowedValues = panelCtx.getAllowedValues(); + if (CollectionUtils.isNotEmpty(allowedValues)) { + IModel>> choices = Model.ofList(allowedValues.stream().collect(Collectors.toCollection(ArrayList::new))); + IModel convertModel = new IModel>(){ + @Override + public DisplayableValue getObject() { + Object value = panelCtx.getRealValueModel().getObject(); + for (DisplayableValue dispValue : choices.getObject()) { + if (dispValue.getValue().equals(value)) { + return dispValue; + } + } + return null; + } - private static final long serialVersionUID = 1L; + @Override + public void setObject(DisplayableValue object) { + panelCtx.getRealValueModel().setObject(object.getValue()); + } + }; + return WebComponentUtil.createDropDownChoices(panelCtx.getComponentId(), convertModel, choices, true, panelCtx.getPageBase()); + } - @Override - public Iterator getIterator(String input) { - return (Iterator) prepareAutoCompleteList(input, lookupTable, panelCtx.getPageBase().getLocalizationService()).iterator(); - } - }; + return new TextPanel<>(panelCtx.getComponentId(), + panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false); } protected List prepareAutoCompleteList(String input, LookupTableType lookupTable, LocalizationService localizationService) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/model/JasperTemplateModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/model/JasperTemplateModel.java deleted file mode 100644 index 47695d2bb5d..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/model/JasperTemplateModel.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2010-2019 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.gui.impl.model; - -import com.evolveum.midpoint.util.exception.SystemException; - -import org.apache.commons.codec.binary.Base64; -import org.apache.wicket.model.IModel; - -import java.nio.charset.StandardCharsets; - -/** - * @author skublik - */ -public class JasperTemplateModel implements IModel { - - private IModel model; - - public JasperTemplateModel(IModel model) { - this.model = model; - } - - @Override - public String getObject() { - if (model.getObject() == null) { - return null; - } - byte[] obj; - if (Base64.isBase64(model.getObject())) { - obj = Base64.decodeBase64(model.getObject()); - } else { - obj = model.getObject(); - } - - return new String(obj, StandardCharsets.UTF_8); - } - - @Override - public void setObject(String object) { - if (object == null) { - model.setObject(null); - return; - } - - byte[] val = object.getBytes(StandardCharsets.UTF_8); - model.setObject(val); - } - - @Override - public void detach() { - } -} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java index c9068926551..451275ecff2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java @@ -78,7 +78,7 @@ protected Component createValuePanel(ListItem> ite PrismContainerValuePanel> panel = new PrismContainerValuePanel>("value", item.getModel(), settings) { @Override - protected void removeValue(PrismContainerValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismContainerValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { PrismContainerPanel.this.removeValue(valueToRemove, target); } }; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java index 79f2226eb27..349187095b3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java @@ -283,7 +283,7 @@ public boolean isOn() { } @Override - protected void removeValue(CVW valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(CVW valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java index 94b14552588..5929211a7f1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java @@ -53,8 +53,8 @@ protected Component createValuePanel(ListItem> item PrismPropertyValuePanel panel = new PrismPropertyValuePanel("value", item.getModel(), getSettings()) { @Override - protected void removeValue(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { - PrismPropertyPanel.this.removeValue(valueToRemove, target); + protected void remove(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + removeValue(valueToRemove, target); } }; item.add(panel); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java index df83520838f..c90f502710f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java @@ -51,7 +51,7 @@ protected PV createNewValue(PrismPropertyWrapper item } @Override - protected void removeValue(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java index 6a6578347f4..18ea1ed1697 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java @@ -47,7 +47,7 @@ protected void refreshPanel(AjaxRequestTarget target) { protected Component createValuePanel(ListItem> item) { PrismReferenceValuePanel valuePanel = new PrismReferenceValuePanel(ID_VALUE, item.getModel(), getSettings()) { @Override - protected void removeValue( + protected void remove( PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { PrismReferencePanel.this.removeValue(valueToRemove, target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java index d048965fd10..87588775e4d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java @@ -118,7 +118,7 @@ private PrismReferenceWrapper getParentWrapper() { } @Override - protected void removeValue(PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java index 76f0ea2a8ea..79d2923a491 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java @@ -87,7 +87,7 @@ private WebMarkupContainer createHeaderPanel() { @Override public void onClick(AjaxRequestTarget target) { try { - removeValue(PrismValuePanel.this.getModelObject(), target); + PrismValuePanel.this.remove(PrismValuePanel.this.getModelObject(), target); } catch (SchemaException e) { LOGGER.error("Cannot remove value: {}", getModelObject()); getSession().error("Cannot remove value " + getModelObject()); @@ -272,7 +272,7 @@ private O getObject() { protected abstract PV createNewValue(IW itemWrapper); //TODO move to the ItemPanel, exception handling - protected abstract void removeValue(VW valueToRemove, AjaxRequestTarget target) throws SchemaException; + protected abstract void remove(VW valueToRemove, AjaxRequestTarget target) throws SchemaException; private void showMetadataPerformed(VW value, AjaxRequestTarget target) { boolean showMetadata = !value.isShowMetadata(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/SingleContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/SingleContainerPanel.java index 53b086acd2d..a5bd4205a9f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/SingleContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/SingleContainerPanel.java @@ -9,6 +9,8 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; + import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; @@ -45,7 +47,7 @@ private void initLayout() { try { ItemPanelSettingsBuilder builder = new ItemPanelSettingsBuilder() - .visibilityHandler(wrapper -> getVisibility(wrapper.getPath())) + .visibilityHandler(wrapper -> getVisibility(wrapper)) .editabilityHandler(getEditabilityHandler()) .mandatoryHandler(getMandatoryHandler()); Panel panel = getPageBase().initItemPanel(ID_CONTAINER, getTypeName(), getModel(), builder.build()); @@ -62,7 +64,7 @@ protected QName getTypeName() { return typeName; } - protected ItemVisibility getVisibility(ItemPath itemPath) { + protected ItemVisibility getVisibility(ItemWrapper itemWrapper) { return ItemVisibility.AUTO; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java index 0b5abd8f78c..ce0625cfe85 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java @@ -84,7 +84,7 @@ protected PV createNewValue(PrismContainerWrapper ite } @Override - protected void removeValue(CVW valueToRemove, AjaxRequestTarget target) { + protected void remove(CVW valueToRemove, AjaxRequestTarget target) { } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java index 9af2c76d0ea..77bc05f795c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java @@ -28,7 +28,6 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ReportTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -37,7 +36,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; /** * Imports initial data objects as needed, ignoring already imported objects. @@ -103,10 +101,6 @@ private ImportResult importInitialObjectsResource( String objectText = IOUtils.toString(resourceInputStream, StandardCharsets.UTF_8); object = prismContext.parseObject(objectText); } - if (ReportType.class.equals(object.getCompileTimeClass())) { - //noinspection unchecked - ReportTypeUtil.applyDefinition((PrismObject) object, prismContext); - } return importObject(object, resource.getFilename(), task, mainResult, overwrite); } catch (Exception ex) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSearchDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSearchDataProvider.java index bc8b44d36d3..fe8e249d808 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSearchDataProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSearchDataProvider.java @@ -49,6 +49,10 @@ IModel> getSearchModel() { @Override public ObjectQuery getQuery() { + return search.getObject() == null ? null : search.getObject().createObjectQuery(getVariables(), getPageBase(), getCustomizeContentQuery()); + } + + protected VariablesMap getVariables() { VariablesMap expVariables = new VariablesMap(); for (Map.Entry entry : variables.entrySet()) { if (entry.getValue() == null) { @@ -57,7 +61,7 @@ public ObjectQuery getQuery() { expVariables.put(entry.getKey(), entry.getValue(), entry.getValue().getClass()); } } - return search.getObject() == null ? null : search.getObject().createObjectQuery(expVariables.isEmpty() ? null : expVariables, getPageBase(), getCustomizeContentQuery()); + return expVariables.isEmpty() ? null : expVariables; } protected ObjectQuery getCustomizeContentQuery() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java index d7c85361d03..86443a8f18b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BoxedTablePanel.java @@ -228,7 +228,7 @@ public WebMarkupContainer getFooter() { return (WebMarkupContainer) get(ID_BOX).get(ID_FOOTER); } - protected WebMarkupContainer createHeader(String headerId) { + protected Component createHeader(String headerId) { WebMarkupContainer header = new WebMarkupContainer(headerId); header.setVisible(false); return header; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java index 535e1b69a57..cb1cd20b1d6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java @@ -157,30 +157,6 @@ protected IModel>> createBooleanChoices() { return Model.ofList(list); } - protected DropDownChoicePanel createDropDownChoices(String id, IModel model, IModel>> choices, boolean allowNull) { - return new DropDownChoicePanel(id, model, choices, new IChoiceRenderer() { - private static final long serialVersionUID = 1L; - - @Override - public Object getDisplayValue(DisplayableValue val) { - if (val.getValue() instanceof Enum) { - return getPageBase().createStringResource((Enum>) val.getValue()).getString(); - } - return getPageBase().createStringResource(val.getLabel()).getString(); - } - - @Override - public String getIdValue(DisplayableValue val, int index) { - return Integer.toString(index); - } - - @Override - public DisplayableValue getObject(String id, IModel extends List extends DisplayableValue>> choices) { - return StringUtils.isNotBlank(id) ? choices.getObject().get(Integer.parseInt(id)) : null; - } - }, allowNull); - } - protected AutoCompleteTextPanel createAutoCompetePanel(String id, IModel model, LookupTableType lookupTable) { AutoCompleteTextPanel autoCompletePanel = new AutoCompleteTextPanel(id, model, String.class, true, lookupTable) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java index 779c097c487..9a0432fbf46 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java @@ -7,6 +7,7 @@ package com.evolveum.midpoint.web.component.search; import java.io.Serializable; +import java.util.Collections; import java.util.List; import org.apache.commons.collections4.CollectionUtils; @@ -131,48 +132,17 @@ public List> getAllowedValues(PageBase pageBase) { if (allowedValues != null) { return allowedValues; } - - if (predefinedFilter == null || predefinedFilter.getParameter() == null - || predefinedFilter.getParameter().getAllowedValuesExpression() == null) { - return null; - } - Task task = pageBase.createSimpleTask("evaluate expression for allowed values"); - ExpressionType expression = predefinedFilter.getParameter().getAllowedValuesExpression(); - Object value = null; - try { - - value = ExpressionUtil.evaluateExpression(new VariablesMap(), null, - expression, MiscSchemaUtil.getExpressionProfile(), - pageBase.getExpressionFactory(), "evaluate expression for allowed values", task, task.getResult()); - } catch (Exception e) { - LOGGER.error("Couldn't execute expression " + expression, e); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.evaluateAllowedValuesExpression", expression).getString()); - return null; - } - if (value instanceof PrismPropertyValue) { - value = ((PrismPropertyValue) value).getRealValue(); - } - - if (!(value instanceof List)) { - LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); - return null; - } - - if (!((List>) value).isEmpty()) { - if (!(((List>) value).get(0) instanceof DisplayableValue)) { - LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); - return null; - } + if (predefinedFilter == null) { + return Collections.EMPTY_LIST; } - this.allowedValues = (List>) value; - return (List>) value; + List> values = WebComponentUtil.getAllowedValues(predefinedFilter.getParameter(), pageBase); + return values; } public LookupTableType getLookupTable(PageBase pageBase) { if (predefinedFilter != null && predefinedFilter.getParameter() != null - && predefinedFilter.getParameter().getAllowedValuesLookupTable() != null) { + && predefinedFilter.getParameter().getAllowedValuesLookupTable() != null + && predefinedFilter.getParameter().getAllowedValuesLookupTable().getOid() != null) { PrismObject lokupTable = WebComponentUtil.findLookupTable(predefinedFilter.getParameter().getAllowedValuesLookupTable().asReferenceValue(), pageBase); if (lokupTable != null) { return lokupTable.asObjectable(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java index 04ec0521258..d81662e78f0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java @@ -11,6 +11,7 @@ import java.util.Iterator; import java.util.List; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import org.apache.commons.lang3.StringUtils; @@ -36,14 +37,16 @@ /** * @author honchar */ -public abstract class ReferenceAutocomplete extends AutoCompleteTextPanel { +public class ReferenceAutocomplete extends AutoCompleteTextPanel { private static final long serialVersionUID = 1L; private final PageBase pageBase; + private final IModel model; public ReferenceAutocomplete(String id, final IModel model, IAutoCompleteRenderer renderer, PageBase pageBase) { super(id, model, ObjectReferenceType.class, renderer); this.pageBase = pageBase; + this.model = model; } @Override @@ -82,7 +85,10 @@ protected boolean isAllowedNotFoundObjectRef() { } protected Class getReferenceTargetObjectType(){ - return (Class) AbstractRoleType.class; + if (model.getObject() == null || model.getObject().getType() == null) { + return (Class) ObjectType.class; + } + return (Class) WebComponentUtil.qnameToClass(pageBase.getPrismContext(), model.getObject().getType()); } protected int getMaxRowsCount() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java index 91e418e9c68..fbd73726e83 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java @@ -6,9 +6,12 @@ */ package com.evolveum.midpoint.web.component.search; +import java.util.Collections; import java.util.List; import javax.xml.namespace.QName; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; @@ -46,7 +49,10 @@ protected List getAllowedRelations() { @Override protected List getSupportedTargetList() { - return WebComponentUtil.createSupportedTargetTypeList((referenceDef).getTargetTypeName()); + if (referenceDef != null) { + return WebComponentUtil.createSupportedTargetTypeList(referenceDef.getTargetTypeName()); + } + return Collections.singletonList(ObjectType.COMPLEX_TYPE); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java index e1367088571..fbcad782935 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java @@ -28,6 +28,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -86,14 +87,6 @@ public void setObject(String object) { private static final long serialVersionUID = 1L; - @Override - protected Class getReferenceTargetObjectType() { - if (getModelObject().getType() == null) { - return (Class) ObjectType.class; - } - return (Class) WebComponentUtil.qnameToClass(getPageBase().getPrismContext(), getModelObject().getType()); - } - @Override protected boolean isAllowedNotFoundObjectRef() { return ReferenceValueSearchPopupPanel.this.isAllowedNotFoundObjectRef(); @@ -188,6 +181,7 @@ protected void onSelectPerformed(AjaxRequestTarget target, O object) { getPageBase().showMainPopup(objectBrowserPanel, target); } }; + selectObject.add(new VisibleBehaviour(() -> getPageBase().getMainPopup() instanceof WebMarkupContainer)); midpointForm.add(selectObject); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java index f0aa95cba97..47473ae364a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/Search.java @@ -266,6 +266,16 @@ public SearchItem addItem(SearchItemType predefinedFilter) { FilterSearchItem item = new FilterSearchItem(this, predefinedFilter); item.setDefinition(def); + if (predefinedFilter != null && predefinedFilter.getParameter() != null + && QNameUtil.match(predefinedFilter.getParameter().getType(), ObjectReferenceType.COMPLEX_TYPE)) { + ObjectReferenceType ref = new ObjectReferenceType(); + List supportedTargets = WebComponentUtil.createSupportedTargetTypeList(predefinedFilter.getParameter().getTargetType()); + if (supportedTargets.size() == 1) { + ref.setType(supportedTargets.iterator().next()); + } + item.setInput(new SearchValue<>(ref)); + } + items.add(item); availableDefinitions.remove(def); return item; @@ -438,15 +448,7 @@ private ObjectQuery createObjectQuerySimple(VariablesMap defaultVariables, PageB } } - VariablesMap variables = defaultVariables == null ? new VariablesMap() : defaultVariables; - for (FilterSearchItem item : getFilterItems()) { - SearchFilterParameterType functionParameter = item.getPredefinedFilter().getParameter(); - if (functionParameter != null && functionParameter.getType() != null) { - Class> inputClass = pageBase.getPrismContext().getSchemaRegistry().determineClassForType(functionParameter.getType()); - TypedValue value = new TypedValue(item.getInput() != null ? item.getInput().getValue() : null, inputClass); - variables.put(functionParameter.getName(), value); - } - } + VariablesMap variables = getFilterVariables(defaultVariables, pageBase); for (FilterSearchItem item : getFilterItems()) { if (item.isEnabled() && item.isApplyFilter()) { @@ -500,6 +502,19 @@ private ObjectQuery createObjectQuerySimple(VariablesMap defaultVariables, PageB return query; } + public VariablesMap getFilterVariables(VariablesMap defaultVariables, PageBase pageBase) { + VariablesMap variables = defaultVariables == null ? new VariablesMap() : defaultVariables; + for (FilterSearchItem item : getFilterItems()) { + SearchFilterParameterType functionParameter = item.getPredefinedFilter().getParameter(); + if (functionParameter != null && functionParameter.getType() != null) { + Class> inputClass = pageBase.getPrismContext().getSchemaRegistry().determineClassForType(functionParameter.getType()); + TypedValue value = new TypedValue(item.getInput() != null ? item.getInput().getValue() : null, inputClass); + variables.put(functionParameter.getName(), value); + } + } + return variables; + } + private ObjectFilter createFilterForSearchItem(PropertySearchItem item, PrismContext ctx) { if (!(item instanceof DateSearchItem) && (item.getValue() == null || item.getValue().getValue() == null)) { return null; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java index ccc9c5121c1..ff15c3039c7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java @@ -238,7 +238,7 @@ public static Search createSearch( panelType, false ); } - public static Search createSearch( + private static Search createSearch( ContainerTypeSearchItem type, String collectionViewName, List fixedSearchItems, ResourceShadowDiscriminator discriminator, ModelServiceLocator modelServiceLocator, List availableItemPath, boolean useDefsFromSuperclass, boolean useObjectCollection, Search.PanelType panelType, boolean isOidSearchEnabled) { @@ -283,7 +283,38 @@ public static Search createSearch( return search; } - public static void processSearchItemDefFromCompiledView(List configuredSearchItemDefs, Search search, PrismContainerDefinition containerDef) { + public static Search createSearchForReport(Class type, List parameters, ModelServiceLocator modelServiceLocator) { + ContainerTypeSearchItem typeItem = new ContainerTypeSearchItem<>(new SearchValue<>(type, "")); + Search search = new Search(typeItem, new ArrayList<>(), false, SearchBoxModeType.BASIC, Collections.singletonList(SearchBoxModeType.BASIC), false); + + SchemaRegistry registry = modelServiceLocator.getPrismContext().getSchemaRegistry(); + PrismContainerDefinition objDef = registry.findContainerDefinitionByCompileTimeClass(type); + + final List configuredSearchItemDefs = new ArrayList<>(); + parameters.forEach(parameter -> { + SearchItemType searchItemType = new SearchItemType(); + searchItemType.setParameter(parameter); + searchItemType.setVisibleByDefault(true); + if (parameter.getDisplay() != null) { + if (parameter.getDisplay().getLabel() != null) { + searchItemType.setDisplayName(parameter.getDisplay().getLabel()); + } else { + searchItemType.setDisplayName(new PolyStringType(parameter.getName())); + } + if (parameter.getDisplay().getHelp() != null) { + searchItemType.setDescription( + modelServiceLocator.getLocalizationService().translate(parameter.getDisplay().getHelp().toPolyString())); + } + } + configuredSearchItemDefs.add(new SearchItemDefinition(searchItemType)); + return; + }); + processSearchItemDefFromCompiledView(configuredSearchItemDefs, search, objDef); + search.setCanConfigure(false); + return search; + } + + private static void processSearchItemDefFromCompiledView(List configuredSearchItemDefs, Search search, PrismContainerDefinition containerDef) { configuredSearchItemDefs.forEach(searchItemDef -> { search.addItemToAllDefinitions(searchItemDef); if (searchItemDef.isVisibleByDefault()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java index b03ae95109a..41105383128 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java @@ -8,10 +8,15 @@ import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.MutableItemDefinition; +import com.evolveum.midpoint.prism.MutablePrismReferenceDefinition; +import com.evolveum.midpoint.prism.Referencable; +import com.evolveum.midpoint.report.api.ReportConstants; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.web.component.input.CheckPanel; import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.prism.InputPanel; +import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; @@ -19,6 +24,8 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ParameterType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchFilterParameterType; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.Validate; import org.apache.wicket.Component; @@ -59,6 +66,7 @@ protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) { } }); checkPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + checkPanel.add(new VisibleBehaviour(() -> canRemoveSearchItem())); checkPanel.setOutputMarkupId(true); searchItemContainer.add(checkPanel); @@ -75,10 +83,18 @@ protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) { IModel>> choices = null; switch (inputType) { case REFERENCE: - getModelObject().setInput(new SearchValue<>(new ObjectReferenceType())); + SearchFilterParameterType parameter = getModelObject().getPredefinedFilter().getParameter(); + MutablePrismReferenceDefinition def = null; + if (parameter != null) { + Class> clazz = getPrismContext().getSchemaRegistry().determineClassForType(parameter.getType()); + QName type = getPrismContext().getSchemaRegistry().determineTypeForClass(clazz); + def = getPrismContext().definitionFactory().createReferenceDefinition( + new QName(parameter.getName()), type); + def.setTargetTypeName(parameter.getTargetType()); + } inputPanel = new ReferenceValueSearchPanel(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), FilterSearchItem.F_INPUT_VALUE), - null){ + def){ @Override protected void referenceValueUpdated(ObjectReferenceType ort, AjaxRequestTarget target) { searchPerformed(target); @@ -94,7 +110,8 @@ protected void referenceValueUpdated(ObjectReferenceType ort, AjaxRequestTarget createEnumChoices((Class extends Enum>) inputClass) : Model.ofList(getModelObject().getAllowedValues(getPageBase())); } if (choices != null) { - inputPanel = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), FilterSearchItem.F_INPUT), choices, false); + inputPanel = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), FilterSearchItem.F_INPUT), (IModel)choices, true, getPageBase()); ((InputPanel) inputPanel).getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html index bd7469de101..836dcacf3d1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.html @@ -7,31 +7,30 @@ --> - - - - - - - - Toggle Dropdown - - - - - - - + + + + + + + Toggle Dropdown + + + + + + + - + @@ -41,8 +40,8 @@ - + @@ -81,7 +80,9 @@ - + + + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java index 505bf3235ec..9ae336abf11 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java @@ -271,7 +271,7 @@ protected IModel createHelpModel() { form.add(oidItem); WebMarkupContainer moreGroup = new WebMarkupContainer(ID_MORE_GROUP); - moreGroup.add(new VisibleBehaviour(() -> createVisibleBehaviour(SearchBoxModeType.BASIC).isVisible() && getModelObject().isCanConfigure())); + moreGroup.add(new VisibleBehaviour(() -> createVisibleBehaviour(SearchBoxModeType.BASIC).isVisible())); form.add(moreGroup); AjaxLink more = new AjaxLink(ID_MORE) { @@ -348,6 +348,16 @@ public boolean isEnabled() { } return true; } + + @Override + public boolean isVisible() { + Search search = getModelObject(); + if (search.getAllowedSearchType().size() == 1 + && SearchBoxModeType.BASIC.equals(search.getAllowedSearchType().get(0))) { + return !search.getItems().isEmpty() || !search.getAvailableDefinitions().isEmpty(); + } + return true; + } }); searchButtonBeforeDropdown.setOutputMarkupId(true); searchContainer.add(searchButtonBeforeDropdown); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java index 7e2d7551fae..a3dc1a35e13 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java @@ -92,7 +92,8 @@ protected boolean isAllowedNotFoundObjectRef() { if (choices == null) { choices = new ListModel(item.getAllowedValues(getPageBase())); } - searchItemField = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), "value"), choices, true); + searchItemField = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), "value"), (IModel)choices, true, getPageBase()); ((InputPanel) searchItemField).getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java index a5fc6256971..60ba6e517ca 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java @@ -8,6 +8,8 @@ import java.util.List; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; + import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; @@ -42,7 +44,8 @@ protected void initSearchItemField(WebMarkupContainer searchItemContainer) { List>> allowedValues = item.getAllowedValues(); if (allowedValues != null && !allowedValues.isEmpty()) { IModel>> choices = new ListModel(item.getAllowedValues()); - searchItemField = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), ContainerTypeSearchItem.F_TYPE), choices, false); + searchItemField = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), ContainerTypeSearchItem.F_TYPE), (IModel)choices, false, getPageBase()); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.html index 9cecaa995b1..097b44150b3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.html @@ -14,8 +14,8 @@ - + [Status indicator here]