Index: lams_build/3rdParty.userlibraries =================================================================== diff -u -r8bc318f44b193b1d926fcc62211ca1b4b18d9b30 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision 8bc318f44b193b1d926fcc62211ca1b4b18d9b30) +++ lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -1,48 +1,54 @@ - - - - - - + + + + + + - - + + - + - - + - - - - - - - - - - - + + + + + + + + + + + + - + + + + + + + Index: lams_build/build.xml =================================================================== diff -u -rcf258bae4dd72eab7a6f5bc895b96966caafaf06 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_build/build.xml (.../build.xml) (revision cf258bae4dd72eab7a6f5bc895b96966caafaf06) +++ lams_build/build.xml (.../build.xml) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -86,11 +86,11 @@ - + --> @@ -123,6 +123,7 @@ + @@ -286,6 +287,7 @@ + --> @@ -400,6 +402,22 @@ + + + + + + + + + + + + + + @@ -408,6 +426,15 @@ + + + + + + + + @@ -424,14 +451,15 @@ - - - + + + - + + @@ -510,6 +538,16 @@ + + + + + + + + + @@ -573,6 +611,7 @@ + + + + + + + + + + + + + + + + + + + @@ -763,6 +822,7 @@ + @@ -854,7 +914,6 @@ - Index: lams_central/conf/security/Owasp.CsrfGuard.properties =================================================================== diff -u -rcf258bae4dd72eab7a6f5bc895b96966caafaf06 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision cf258bae4dd72eab7a6f5bc895b96966caafaf06) +++ lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -1,8 +1,12 @@ # Only check POST forms. If we need to, we can add GET and other HTTP methods org.owasp.csrfguard.ProtectedMethods=POST -# By default do not check anything. ignoreAll is the same as filter coverage in web.xml -org.owasp.csrfguard.unprotected.ignoreAll=*.do +# Do not check anything except for pages which are explicitly marked as protected +org.owasp.csrfguard.Protect = true + +# Mandatory field for stateful applications like LAMS +org.owasp.csrfguard.LogicalSessionExtractor = org.owasp.csrfguard.session.SessionTokenKeyExtractor + # List of actions to check # Each key goes into a separate line prefixed with org.owasp.csrfguard.protected. # A key suffix must not contain a dot "." character @@ -59,6 +63,8 @@ org.owasp.csrfguard.protected.centralPortraitDelete=/lams/saveportrait/deletePortrait.do org.owasp.csrfguard.protected.centralPortraitSave=/lams/saveportrait.do org.owasp.csrfguard.protected.centralPasswordChange=/lams/passwordChanged.do +org.owasp.csrfguard.protected.centralForgotPassword=/lams/ForgotPasswordRequest +org.owasp.csrfguard.protected.centralLogin=/lams/j_security_check #QB org.owasp.csrfguard.protected.centralSaveQuestion=/lams/qb/edit/saveOrUpdateQuestion.do @@ -127,6 +133,7 @@ org.owasp.csrfguard.protected.assessmentMonitoringExportExcel=/lams/tool/laasse10/monitoring/exportSummary.do org.owasp.csrfguard.protected.assessmentMonitoringAllocateUserAnswer=/lams/tool/laasse10/monitoring/allocateUserAnswer.do org.owasp.csrfguard.protected.assessmentMonitoringSetActivityEvaluation=/lams/tool/laasse10/monitoring/setActivityEvaluation.do +org.owasp.csrfguard.protected.assessmentMonitoringChangeLeader=/lams/tool/laasse10/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.assessmentSaveUserGrade=/lams/tool/laasse10/monitoring/saveUserGrade.do org.owasp.csrfguard.protected.assessmentUpdateTimeLimit=/lams/tool/laasse10/monitoring/updateTimeLimit.do org.owasp.csrfguard.protected.assessmentUpdateIndividualTimeLimit=/lams/tool/laasse10/monitoring/updateIndividualTimeLimit.do @@ -141,6 +148,9 @@ org.owasp.csrfguard.protected.dokuAuthoringSave=/lams/tool/ladoku11/authoring/update.do org.owasp.csrfguard.protected.dokuAuthoringDefineLater=/lams/tool/ladoku11/authoring/definelater.do org.owasp.csrfguard.protected.dokuMonitoringUpdateLearnerMark=/lams/tool/ladoku11/monitoring/updateLearnerMark.do +org.owasp.csrfguard.protected.dokuMonitoringChangeLeader=/lams/tool/ladoku11/monitoring/changeLeaderForGroup.do +org.owasp.csrfguard.protected.dokuMonitoringUpdateTimeLimit=/lams/tool/ladoku11/monitoring/updateTimeLimit.do +org.owasp.csrfguard.protected.dokuMonitoringUpdateIndividualTimeLimit=/lams/tool/ladoku11/monitoring/updateIndividualTimeLimit.do org.owasp.csrfguard.protected.forumAuthoringSave=/lams/tool/lafrum11/authoring/update.do org.owasp.csrfguard.protected.forumAuthoringDefineLater=/lams/tool/lafrum11/authoring/definelater.do @@ -164,7 +174,7 @@ org.owasp.csrfguard.protected.leaderAuthoringSave=/lams/tool/lalead11/authoring/updateContent.do org.owasp.csrfguard.protected.leaderAuthoringDefineLater=/lams/tool/lalead11/authoring/definelater.do org.owasp.csrfguard.protected.leaderSaveLeaders=/lams/tool/lalead11/monitoring/saveLeaders.do -org.owasp.csrfguard.protected.leaderTblmonitoringChangeLeader=/lams/tool/lalead11/tblmonitoring/changeLeader.do +org.owasp.csrfguard.protected.leaderMonitoringChangeLeader=/lams/tool/lalead11/monitoring/changeLeader.do org.owasp.csrfguard.protected.laqaAuthoringSave=/lams/tool/laqa11/authoring/submitAllContent.do org.owasp.csrfguard.protected.laqaAuthoringDefineLater=/lams/tool/laqa11/authoring/definelater.do @@ -173,6 +183,7 @@ org.owasp.csrfguard.protected.laqaAuthoringSaveOrUpdateCondition=/lams/tool/laqa11/authoringConditions/saveOrUpdateCondition.do org.owasp.csrfguard.protected.laqaAuthoringRemoveCondition=/lams/tool/laqa11/authoringConditions/removeCondition.do org.owasp.csrfguard.protected.laqaMonitoringSubmissionDeadline=/lams/tool/laqa11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.laqaMonitoringChangeLeader=/lams/tool/laqa11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.larsrcAuthoringSave=/lams/tool/larsrc11/authoring/update.do org.owasp.csrfguard.protected.larsrcAuthoringDefineLater=/lams/tool/larsrc11/authoring/definelater.do @@ -204,6 +215,7 @@ org.owasp.csrfguard.protected.sbmtAuthoringSave=/lams/tool/lasbmt11/authoring/updateContent.do org.owasp.csrfguard.protected.sbmtAuthoringDefineLater=/lams/tool/lasbmt11/authoring/definelater.do org.owasp.csrfguard.protected.sbmtMonitoringSubmissionDeadline=/lams/tool/lasbmt11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.sbmtMonitoringChangeLeader=/lams/tool/lasbmt11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.sbmtUpdateMark=/lams/tool/lasbmt11/mark/updateMark.do org.owasp.csrfguard.protected.sbmtReleaseMarks=/lams/tool/lasbmt11/monitoring/releaseMarks.do org.owasp.csrfguard.protected.sbmtDownloadMarks=/lams/tool/lasbmt11/monitoring/downloadMarks.do @@ -218,8 +230,11 @@ org.owasp.csrfguard.protected.scratchieAuthoringRemoveItem=/lams/tool/lascrt11/authoring/removeItem.do org.owasp.csrfguard.protected.scratchieMonitoringExportExcel=/lams/tool/lascrt11/monitoring/exportExcel.do org.owasp.csrfguard.protected.scratchieMonitoringSubmissionDeadline=/lams/tool/lascrt11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.scratchieMonitoringChangeLeader=/lams/tool/lascrt11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.scratchieTblMonitoringExportExcel=/lams/tool/lascrt11/tblmonitoring/exportExcel.do org.owasp.csrfguard.protected.scratchieSaveUserMark=/lams/tool/lascrt11/monitoring/saveUserMark.do +org.owasp.csrfguard.protected..scratchieUpdateTimeLimit=/lams/tool/lascrt11/monitoring/updateTimeLimit.do +org.owasp.csrfguard.protected..scratchieUpdateIndividualTimeLimit=/lams/tool/lascrt11/monitoring/updateIndividualTimeLimit.do org.owasp.csrfguard.protected.spreadsheetAuthoringSave=/lams/tool/lasprd10/authoring/updateContent.do org.owasp.csrfguard.protected.spreadsheetAuthoringDefineLater=/lams/tool/lasprd10/authoring/definelater.do @@ -240,6 +255,7 @@ org.owasp.csrfguard.protected.voteAuthoringAddNomination=/lams/tool/lavote11/authoring/addSingleNomination.do org.owasp.csrfguard.protected.voteAuthoringRemoveNomination=/lams/tool/lavote11/authoring/removeNomination.do org.owasp.csrfguard.protected.voteMonitoringSubmissionDeadline=/lams/tool/lavote11/monitoring/setSubmissionDeadline.do +org.owasp.csrfguard.protected.voteMonitoringChangeLeader=/lams/tool/lavote11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.voteHideOpenVote=/lams/tool/lavote11/monitoring/hideOpenVote.do org.owasp.csrfguard.protected.voteShowOpenVote=/lams/tool/lavote11/monitoring/showOpenVote.do Index: lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java =================================================================== diff -u -rcf258bae4dd72eab7a6f5bc895b96966caafaf06 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision cf258bae4dd72eab7a6f5bc895b96966caafaf06) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/template/web/LdTemplateController.java (.../LdTemplateController.java) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -41,6 +41,7 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.authoring.service.AuthoringService; import org.lamsfoundation.lams.authoring.service.IAuthoringFullService; import org.lamsfoundation.lams.authoring.template.AssessMCAnswer; import org.lamsfoundation.lams.authoring.template.Assessment; @@ -58,10 +59,8 @@ import org.lamsfoundation.lams.questions.Question; import org.lamsfoundation.lams.questions.QuestionParser; import org.lamsfoundation.lams.rest.RestTags; -import org.lamsfoundation.lams.rest.ToolRestManager; import org.lamsfoundation.lams.tool.Tool; import org.lamsfoundation.lams.tool.dao.IToolDAO; -import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.AuthoringJsonTags; @@ -110,7 +109,7 @@ NumberFormat groupNumberFormatter = new DecimalFormat("00"); private static Logger log = Logger.getLogger(LdTemplateController.class); - public static final int MAX_OPTION_COUNT = 6; + public static final int MAX_OPTION_COUNT = 20; public static final int MAX_FLOATING_ACTIVITY_OPTIONS = 6; // Hardcoded in the Flash client public static final String PARENT_ACTIVITY_TYPE = "parentActivityType"; // used to work out transitions - not used by the authoring module @@ -130,37 +129,39 @@ // icon strings found in the lams_learningdesign_activity table protected static final String ASSESSMENT_TOOL_SIGNATURE = "laasse10"; - protected static final String ASSESSMENT_ICON = "tool/laasse10/images/icon_assessment.swf"; + protected static final String ASSESSMENT_ICON = "tool/laasse10/images/icon_assessment.svg"; protected static final String ASSESSMENT_TOOL_OUTPUT_DEFINITION = "learner.total.score"; protected static final String CHAT_TOOL_SIGNATURE = "lachat11"; - protected static final String CHAT_ICON = "tool/lachat11/images/icon_chat.swf"; + protected static final String CHAT_ICON = "tool/lachat11/images/icon_chat.svg"; + protected static final String DOKU_TOOL_SIGNATURE = "ladoku11"; + protected static final String DOKU_ICON = "tool/ladoku11/images/icon_dokumaran.svg"; protected static final String FORUM_TOOL_SIGNATURE = "lafrum11"; - protected static final String FORUM_ICON = "tool/lafrum11/images/icon_forum.swf"; + protected static final String FORUM_ICON = "tool/lafrum11/images/icon_forum.svg"; protected static final String LEADER_TOOL_SIGNATURE = "lalead11"; protected static final String LEADER_ICON = "tool/lalead11/images/icon_leaderselection.swf"; protected static final String NOTEBOOK_TOOL_SIGNATURE = "lantbk11"; - protected static final String NOTEBOOK_ICON = "tool/lantbk11/images/icon_notebook.swf"; + protected static final String NOTEBOOK_ICON = "tool/lantbk11/images/icon_notebook.svg"; protected static final String NOTICEBOARD_TOOL_SIGNATURE = "lanb11"; - protected static final String NOTICEBOARD_ICON = "tool/lanb11/images/icon_htmlnb.swf"; + protected static final String NOTICEBOARD_ICON = "tool/lanb11/images/icon_htmlnb.svg"; protected static final String QA_TOOL_SIGNATURE = "laqa11"; - protected static final String QA_ICON = "tool/laqa11/images/icon_questionanswer.swf"; + protected static final String QA_ICON = "tool/laqa11/images/icon_questionanswer.svg"; protected static final String SHARE_RESOURCES_TOOL_SIGNATURE = "larsrc11"; - protected static final String SHARE_RESOURCES_ICON = "tool/larsrc11/images/icon_rsrc.swf"; + protected static final String SHARE_RESOURCES_ICON = "tool/larsrc11/images/icon_rsrc.svg"; protected static final String SCRATCHIE_TOOL_SIGNATURE = "lascrt11"; - protected static final String SCRATCHIE_ICON = "tool/lascrt11/images/icon_scratchie.swf"; + protected static final String SCRATCHIE_ICON = "tool/lascrt11/images/icon_scratchie.svg"; protected static final String SCRATCHIE_TOOL_OUTPUT_DEFINITION = "learner.mark"; protected static final String SCRIBE_TOOL_SIGNATURE = "lascrb11"; - protected static final String SCRIBE_ICON = "tool/lascrb11/images/icon_scribe.swf"; + protected static final String SCRIBE_ICON = "tool/lascrb11/images/icon_scribe.svg"; protected static final String SUBMIT_TOOL_SIGNATURE = "lasbmt11"; - protected static final String SUBMIT_ICON = "tool/lasbmt11/images/icon_reportsubmission.swf"; + protected static final String SUBMIT_ICON = "tool/lasbmt11/images/icon_reportsubmission.svg"; protected static final String SURVEY_TOOL_SIGNATURE = "lasurv11"; - protected static final String SURVEY_ICON = "tool/lasurv11/images/icon_survey.swf"; + protected static final String SURVEY_ICON = "tool/lasurv11/images/icon_survey.svg"; protected static final String WIKI_TOOL_SIGNATURE = "lawiki10"; - protected static final String WIKI_ICON = "tool/lawiki10/images/icon_wiki.swf"; + protected static final String WIKI_ICON = "tool/lawiki10/images/icon_wiki.svg"; protected static final String MINDMAP_TOOL_SIGNATURE = "lamind10"; - protected static final String MINDMAP_ICON = "tool/lamind10/images/icon_mindmap.swf"; + protected static final String MINDMAP_ICON = "tool/lamind10/images/icon_mindmap.svg"; protected static final String VOTE_TOOL_SIGNATURE = "lavote11"; - protected static final String VOTE_ICON = "tool/lavote11/images/icon_ranking.swf"; + protected static final String VOTE_ICON = "tool/lavote11/images/icon_ranking.svg"; protected static final String PEER_REVIEW_TOOL_SIGNATURE = "laprev11"; protected static final String PEER_REVIEW_ICON = "tool/laprev11/images/icon_peerreview.svg"; @@ -286,10 +287,10 @@ return transitions; } - protected static final int rowHeightSpace = 100; - protected static final int activityWidthSpace = 185; - protected static final int gateHeightOffset = 5; - protected static final int gateWidthOffset = 50; + protected static final int rowHeightSpace = 120; + protected static final int activityWidthSpace = 240; + protected static final int gateHeightOffset = 20; + protected static final int gateWidthOffset = 70; /** * Calculate where to draw an activity. Aim for 4 activities per line. Returns Integer[x,y] @@ -399,7 +400,7 @@ /* ************************************** Non-Tool Activity methods ******************************************** */ protected ObjectNode createGateActivity(AtomicInteger uiid, int order, Integer[] layoutCoords, String activityTitle, - String activityDescription) { + String activityDescription, boolean gateStopAtPrecedingActivity) { ObjectNode activityJSON = JsonNodeFactory.instance.objectNode(); Integer[] pos = layoutCoords; @@ -421,14 +422,16 @@ } activityJSON.put(AuthoringJsonTags.ACTIVITY_TYPE_ID, Activity.PERMISSION_GATE_ACTIVITY_TYPE); activityJSON.put(AuthoringJsonTags.GATE_ACTIVITY_LEVEL_ID, GateActivity.LEARNER_GATE_LEVEL); + activityJSON.put(AuthoringJsonTags.GATE_STOP_AT_PRECEDING_ACTIVITY, gateStopAtPrecedingActivity); return activityJSON; } protected ObjectNode createScheduledGateActivity(AtomicInteger uiid, int order, Integer[] layoutCoords, - String activityTitle, String activityDescription, Long startOffset) { + String activityTitle, String activityDescription, Long startOffset, boolean gateStopAtPrecedingActivity) { - ObjectNode activityJSON = createGateActivity(uiid, order, layoutCoords, activityTitle, activityDescription); + ObjectNode activityJSON = createGateActivity(uiid, order, layoutCoords, activityTitle, activityDescription, + gateStopAtPrecedingActivity); activityJSON.put(AuthoringJsonTags.ACTIVITY_TYPE_ID, Activity.SCHEDULE_GATE_ACTIVITY_TYPE); activityJSON.put(AuthoringJsonTags.GATE_START_OFFSET, startOffset); @@ -662,29 +665,6 @@ return activityJSON; } - /* ************************************** Tool related methods ********************************************** */ - /** General method to create a tool content. All calls to create tool content should go through this method */ - protected Long createToolContent(UserDTO user, String toolSignature, ObjectNode toolContentJSON) - throws IOException { - try { - Tool tool = getTool(toolSignature); - Long toolContentID = authoringService.insertToolContentID(tool.getToolId()); - - // Tools' services implement an interface for processing REST requests - ToolRestManager toolRestService = (ToolRestManager) lamsCoreToolService.findToolService(tool); - toolRestService.createRestToolContent(user.getUserID(), toolContentID, toolContentJSON); - - return toolContentID; - } catch (Exception e) { - log.error("Unable to create tool content for " + toolSignature + " with details " + toolContentJSON - + ". \nThe tool probably threw an exception - check the server logs for more details.\n" - + "If the exception is \"Servlet.service() for servlet ToolContentRestServlet threw exception java.lang.ClassCastException: com.sun.proxy.$ProxyXXX cannot be cast to org.lamsfoundation.lams.rest.ToolRestManager)\"" - + " then the tool doesn't support the LDTemplate service calls (ie has not implemented the ToolRestManager interface / createRestToolContent() method."); - throw new ToolException( - "Unable to create tool content for " + toolSignature + " with details " + toolContentJSON); - } - } - /** * General method to create tool activity. All calls to create an activity relating to a tool should go through this * method @@ -732,87 +712,7 @@ return activityJSON; } - /** Sets up the standard fields that are used by many tools! */ - protected ObjectNode createStandardToolContent(String title, String instructions, String reflectionInstructions, - Boolean lockWhenFinished, Boolean allowRichTextEditor, UserDTO user) { - ObjectNode toolContentJSON = JsonNodeFactory.instance.objectNode(); - toolContentJSON.put(RestTags.TITLE, title != null ? title : ""); - toolContentJSON.put(RestTags.INSTRUCTIONS, instructions != null ? instructions : ""); - - if (reflectionInstructions != null) { - toolContentJSON.put(RestTags.REFLECT_ON_ACTIVITY, true); - toolContentJSON.put(RestTags.REFLECT_INSTRUCTIONS, reflectionInstructions); - } - - toolContentJSON.put(RestTags.LOCK_WHEN_FINISHED, lockWhenFinished); - toolContentJSON.put(RestTags.ALLOW_RICH_TEXT_EDITOR, allowRichTextEditor); - - if (user != null) { - toolContentJSON.put("firstName", user.getFirstName()); - toolContentJSON.put("lastName", user.getLastName()); - toolContentJSON.put("loginName", user.getLogin()); - } - return toolContentJSON; - } - /** - * Helper method to create a Assessment tool content. Assessment is one of the unusuals tool in that it caches - * user's login names and - * first/last names Mandatory fields in toolContentJSON: title, instructions, resources, user fields firstName, - * lastName and loginName. - * - * Required fields in toolContentJSON: "title", "instructions", "questions", "firstName", "lastName", "lastName", - * "questions" and "references". - * - * The questions entry should be ArrayNode containing JSON objects, which in turn must contain - * "questionTitle", "questionText", "displayOrder" (Integer), "type" (Integer). If the type is Multiple Choice, - * Numerical or Matching Pairs - * then a ArrayNode "answers" is required. - * - * The answers entry should be ArrayNode - * containing JSON objects, which in turn must contain "answerText" or "answerFloat", "displayOrder" (Integer), - * "grade" (Integer). - * - * For the templates, all the questions that are created will be set up as references, therefore the questions in - * the assessment == the bank of questions. - * So references entry will be a ArrayNode containing JSON objects, which in turn must contain "displayOrder" - * (Integer), - * "questionDisplayOrder" (Integer - to match to the question). If default grade or random questions are needed then - * this method needs - * to be expanded. - */ - protected Long createAssessmentToolContent(UserDTO user, String title, String instructions, - String reflectionInstructions, boolean selectLeaderToolOutput, boolean enableNumbering, - boolean enableConfidenceLevels, boolean allowDiscloseAnswers, boolean allowAnswerJustification, - ArrayNode questions) throws IOException { - - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, null, null, - user); - toolContentJSON.put(RestTags.USE_SELECT_LEADER_TOOL_OUTPUT, selectLeaderToolOutput); - toolContentJSON.put(RestTags.ENABLE_CONFIDENCE_LEVELS, enableConfidenceLevels); - toolContentJSON.put("numbered", enableNumbering); - toolContentJSON.put("displaySummary", Boolean.TRUE); - toolContentJSON.put("allowDiscloseAnswers", allowDiscloseAnswers); - toolContentJSON.put("allowAnswerJustification", allowAnswerJustification); - - toolContentJSON.set(RestTags.QUESTIONS, questions); - - ArrayNode references = JsonNodeFactory.instance.arrayNode(); - for (int i = 0; i < questions.size(); i++) { - ObjectNode question = (ObjectNode) questions.get(i); - question.put("answerRequired", true); - - Integer questionDisplayOrder = question.get(RestTags.DISPLAY_ORDER).asInt(); - Integer defaultGrade = JsonUtil.optInt(question, "defaultGrade", 1); - references.add(JsonNodeFactory.instance.objectNode().put(RestTags.DISPLAY_ORDER, questionDisplayOrder) - .put("questionDisplayOrder", questionDisplayOrder).put("defaultGrade", defaultGrade)); - } - toolContentJSON.set("references", references); - - return createToolContent(user, LdTemplateController.ASSESSMENT_TOOL_SIGNATURE, toolContentJSON); - } - - /** * Creates a forum activity's JSON details. */ protected ObjectNode createAssessmentActivity(AtomicInteger uiid, int order, Integer[] layoutCoords, @@ -833,10 +733,10 @@ protected Long createChatToolContent(UserDTO user, String title, String instructions, boolean lockWhenFinished, String filterKeywords, String reflectionInstructions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, - lockWhenFinished, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, + reflectionInstructions, lockWhenFinished, null, null); toolContentJSON.put("filterKeywords", filterKeywords); - return createToolContent(user, LdTemplateController.CHAT_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.CHAT_TOOL_SIGNATURE, toolContentJSON); } /** @@ -872,8 +772,8 @@ boolean allowRichTextEditor, boolean allowNewTopic, boolean allowRateMessages, boolean allowUpload, boolean limitedMaxCharacters, Integer maxCharacters, ArrayNode topics) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, - allowRichTextEditor, user); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, allowRichTextEditor, user); toolContentJSON.set("topics", topics); toolContentJSON.put("allowNewTopic", allowNewTopic); toolContentJSON.put("allowRateMessages", allowRateMessages); @@ -882,7 +782,7 @@ if (limitedMaxCharacters && maxCharacters != null) { toolContentJSON.put("maxCharacters", maxCharacters); } - return createToolContent(user, LdTemplateController.FORUM_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.FORUM_TOOL_SIGNATURE, toolContentJSON); } /** @@ -903,8 +803,9 @@ */ protected Long createLeaderSelectionToolContent(UserDTO user, String title, String instructions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, null, null, null); - return createToolContent(user, LdTemplateController.LEADER_TOOL_SIGNATURE, toolContentJSON); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, null, null, + null); + return authoringService.createToolContent(user, LdTemplateController.LEADER_TOOL_SIGNATURE, toolContentJSON); } /** @@ -926,9 +827,9 @@ protected Long createNotebookToolContent(UserDTO user, String title, String instructions, boolean lockWhenFinished, boolean allowRichTextEditor) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, - allowRichTextEditor, null); - return createToolContent(user, LdTemplateController.NOTEBOOK_TOOL_SIGNATURE, toolContentJSON); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, allowRichTextEditor, null); + return authoringService.createToolContent(user, LdTemplateController.NOTEBOOK_TOOL_SIGNATURE, toolContentJSON); } /** @@ -950,9 +851,11 @@ protected Long createNoticeboardToolContent(UserDTO user, String title, String content, String reflectionInstructions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, null, reflectionInstructions, null, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, null, reflectionInstructions, + null, null, null); toolContentJSON.put("content", content != null ? content : ""); - return createToolContent(user, LdTemplateController.NOTICEBOARD_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.NOTICEBOARD_TOOL_SIGNATURE, + toolContentJSON); } /** @@ -975,13 +878,13 @@ boolean allowRichTextEditor, boolean oneQuestionPerPage, boolean showOtherLearnersAnswers, boolean showOtherLearnersNames, ArrayNode questions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, - allowRichTextEditor, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, allowRichTextEditor, null); toolContentJSON.set(RestTags.QUESTIONS, questions); toolContentJSON.put("questionsSequenced", oneQuestionPerPage); toolContentJSON.put("showOtherAnswers", showOtherLearnersAnswers); toolContentJSON.put("usernameVisible", showOtherLearnersNames); - return createToolContent(user, LdTemplateController.QA_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.QA_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1002,9 +905,10 @@ protected Long createMindmapToolContent(UserDTO user, String title, String instructions, boolean lockWhenFinished, boolean multiUserMode, String reflectionInstruction) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, null, null); toolContentJSON.put("multiUserMode", multiUserMode); - return createToolContent(user, LdTemplateController.MINDMAP_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.MINDMAP_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1031,8 +935,8 @@ boolean notifyInstructors, Integer minResourcesToView, String reflectionInstructions, ArrayNode resources) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, - lockWhenFinished, null, user); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, + reflectionInstructions, lockWhenFinished, null, user); toolContentJSON.put("allowAddFiles", allowLearnerAddFile); toolContentJSON.put("allowAddUrls", allowLearnerAddURL); toolContentJSON.put("notifyTeachersOnAssigmentSumbit", notifyInstructors); @@ -1041,7 +945,8 @@ toolContentJSON.put("minViewResourceNumber", minResourcesToView); } toolContentJSON.set("resources", resources); - return createToolContent(user, LdTemplateController.SHARE_RESOURCES_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.SHARE_RESOURCES_TOOL_SIGNATURE, + toolContentJSON); } // resource type - copied from ResourceConstants @@ -1122,21 +1027,24 @@ * full details of questions). Other fields are optional. */ protected Long createScratchieToolContent(UserDTO user, String title, String instructions, - boolean useSelectLeaderToolOuput, Integer confidenceLevelsActivityUiid, ArrayNode questions) - throws IOException { + boolean useSelectLeaderToolOuput, boolean enableDiscussionSentiment, Integer confidenceLevelsActivityUiid, + ArrayNode questions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, null, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, null, null, + null); toolContentJSON.set(RestTags.QUESTIONS, questions); if (confidenceLevelsActivityUiid != null) { toolContentJSON.put(RestTags.CONFIDENCE_LEVELS_ACTIVITY_UIID, confidenceLevelsActivityUiid); } + toolContentJSON.put(RestTags.ENABLE_DISCUSSION_SENTIMENT, enableDiscussionSentiment); + for (int i = 0; i < questions.size(); i++) { ObjectNode question = (ObjectNode) questions.get(i); question.put("answerRequired", true); } - return createToolContent(user, LdTemplateController.SCRATCHIE_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.SCRATCHIE_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1160,12 +1068,12 @@ boolean autoSelectScribe, boolean showAggregatedReports, String reflectionInstructions, ArrayNode questions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, - lockWhenFinished, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, + reflectionInstructions, lockWhenFinished, null, null); toolContentJSON.set(RestTags.QUESTIONS, questions); toolContentJSON.put("autoSelectScribe", autoSelectScribe); toolContentJSON.put("showAggregatedReports", showAggregatedReports); - return createToolContent(user, LdTemplateController.SCRIBE_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.SCRIBE_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1188,13 +1096,13 @@ protected Long createSubmitToolContent(UserDTO user, String title, String instructions, boolean lockWhenFinished, Boolean limitUpload, Integer limitUploadNumber, String reflectionInstructions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, - lockWhenFinished, null, user); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, + reflectionInstructions, lockWhenFinished, null, user); if (limitUploadNumber != null) { toolContentJSON.put("limitUpload", limitUpload != null ? limitUpload : true); toolContentJSON.put("limitUploadNumber", limitUploadNumber); } - return createToolContent(user, LdTemplateController.SUBMIT_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.SUBMIT_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1216,9 +1124,10 @@ protected Long createSurveyToolContent(UserDTO user, String title, String instructions, Boolean lockWhenFinished, ArrayNode questions) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, null, user); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, null, user); toolContentJSON.set("questions", questions); - return createToolContent(user, LdTemplateController.SURVEY_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.SURVEY_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1240,10 +1149,11 @@ protected Long createVoteToolContent(UserDTO user, String title, String instructions, ArrayNode answers, Boolean showResults) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, null, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, null, null, + null); toolContentJSON.set(RestTags.ANSWERS, answers); toolContentJSON.put("showResults", showResults); - return createToolContent(user, LdTemplateController.VOTE_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.VOTE_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1264,9 +1174,10 @@ protected Long createWikiToolContent(UserDTO user, String title, String instructions, boolean lockWhenFinished, String reflectionInstruction, ArrayNode pages) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, null, lockWhenFinished, null, null); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, null, + lockWhenFinished, null, null); toolContentJSON.set("pages", pages); - return createToolContent(user, LdTemplateController.WIKI_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.WIKI_TOOL_SIGNATURE, toolContentJSON); } /** @@ -1291,10 +1202,11 @@ protected Long createPeerReviewToolContent(UserDTO user, String title, String instructions, String reflectionInstructions, ArrayNode criterias) throws IOException { - ObjectNode toolContentJSON = createStandardToolContent(title, instructions, reflectionInstructions, null, null, - user); + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, instructions, + reflectionInstructions, null, null, user); toolContentJSON.set("criterias", criterias); - return createToolContent(user, LdTemplateController.PEER_REVIEW_TOOL_SIGNATURE, toolContentJSON); + return authoringService.createToolContent(user, LdTemplateController.PEER_REVIEW_TOOL_SIGNATURE, + toolContentJSON); } /** @@ -1310,6 +1222,36 @@ } /** + * Helper method to create a doKumaran tool content. + */ + protected Long createDokumaranToolContent(UserDTO user, String title, String description, String instructions, + boolean selectLeaderToolOutput, boolean galleryWalkEnabled, boolean galleryWalkReadOnly, + String galleryWalkInstructions, String reflectionInstructions) throws IOException { + + ObjectNode toolContentJSON = AuthoringService.createStandardToolContent(title, description, + reflectionInstructions, null, null, user); + toolContentJSON.put(RestTags.USE_SELECT_LEADER_TOOL_OUTPUT, selectLeaderToolOutput); + toolContentJSON.put(RestTags.LOCK_WHEN_FINISHED, true); + toolContentJSON.put("etherpadInstructions", instructions); + toolContentJSON.put("galleryWalkEnabled", galleryWalkEnabled); + toolContentJSON.put("galleryWalkReadOnly", galleryWalkReadOnly); + toolContentJSON.put("galleryWalkInstructions", galleryWalkInstructions); + return authoringService.createToolContent(user, LdTemplateController.DOKU_TOOL_SIGNATURE, toolContentJSON); + } + + /** + * Creates a doKumaran activity's JSON details. + */ + protected ObjectNode createDokumaranActivity(AtomicInteger uiid, int order, Integer[] layoutCoords, + Long toolContentID, String contentFolderID, Integer groupingUIID, Integer parentUIID, + Integer parentActivityType, String activityTitle) { + + return createToolActivity(uiid, order, layoutCoords, LdTemplateController.DOKU_TOOL_SIGNATURE, + LdTemplateController.DOKU_ICON, toolContentID, contentFolderID, groupingUIID, parentUIID, + parentActivityType, activityTitle != null ? activityTitle : "doKumaran"); + } + + /** * * /* ************************************** Service related methods ********************************************** */ @@ -1389,7 +1331,7 @@ model.addAttribute(AttributeNames.PARAM_CONTENT_FOLDER_ID, qbQuestion.getContentFolderId()); model.addAttribute("question", question); - if (question.getType() == Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE) { + if (question.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE) { Set answers = question.getAnswers(); for (QbOption qbOption : qbQuestion.getQbOptions()) { AssessMCAnswer answer = new AssessMCAnswer(qbOption.getDisplayOrder(), qbOption.getName(), @@ -1410,10 +1352,11 @@ QbQuestion qbQuestion = qbService.getQuestionByUid(qbQuestionUid); Assessment question = new Assessment(); - question.setType(Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE); + question.setType(qbQuestion.getType()); question.setTitle(qbQuestion.getName()); question.setText(qbQuestion.getDescription()); question.setUuid(qbQuestion.getUuid().toString()); + question.setDefaultGrade(qbQuestion.getMaxMark()); Set answers = question.getAnswers(); for (QbOption qbOption : qbQuestion.getQbOptions()) { @@ -1439,16 +1382,17 @@ assessments.add(assessment); boolean isMultipleChoice = Question.QUESTION_TYPE_MULTIPLE_CHOICE.equals(question.getType()); + boolean isMarkHedging = Question.QUESTION_TYPE_MARK_HEDGING.equals(question.getType()); boolean isMultipleResponse = Question.QUESTION_TYPE_MULTIPLE_RESPONSE.equals(question.getType()); - int defaultGrade = 1; + Integer defaultGrade = question.getScore(); assessment.setText(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, question.getResourcesFolderPath())); assessment.setTitle(question.getTitle()); assessment.setUuid(question.getQbUUID()); - if (isMultipleChoice) { - assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE); + if (isMultipleChoice || isMarkHedging) { + assessment.setType(isMultipleChoice ? QbQuestion.TYPE_MULTIPLE_CHOICE : QbQuestion.TYPE_MARK_HEDGING); assessment.setMultipleAnswersAllowed(false); String correctAnswer = null; @@ -1467,8 +1411,10 @@ if ((answer.getScore() != null) && (answer.getScore() > 0)) { if (correctAnswer == null) { - // whatever the correct answer holds, it becomes the question score - defaultGrade = Double.valueOf(Math.ceil(answer.getScore())).intValue(); + if (defaultGrade == null) { + // if grade not explicitly set, whatever the correct answer holds, it becomes the question score + defaultGrade = Double.valueOf(Math.ceil(answer.getScore())).intValue(); + } // 100% goes to the correct answer newAnswer.setGrade(1F); correctAnswer = answerText; @@ -1488,7 +1434,7 @@ } } else if (isMultipleResponse) { - assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_MULTIPLE_CHOICE); + assessment.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); assessment.setMultipleAnswersAllowed(true); if (question.getAnswers() != null) { @@ -1499,7 +1445,10 @@ totalScore += answer.getScore(); } } - defaultGrade = Double.valueOf(Math.round(totalScore)).intValue(); + if (defaultGrade == null) { + // if grade not explicitly set, user total score as grade + defaultGrade = Double.valueOf(Math.round(totalScore)).intValue(); + } int displayOrder = 1; for (Answer answer : question.getAnswers()) { @@ -1519,10 +1468,12 @@ } } } else { - assessment.setType(Assessment.ASSESSMENT_QUESTION_TYPE_ESSAY); + assessment.setType(QbQuestion.TYPE_ESSAY); } - assessment.setDefaultGrade(defaultGrade); + assessment.setDefaultGrade(defaultGrade == null ? 1 : defaultGrade); + + assessment.setLearningOutcomes(question.getLearningOutcomes()); } return assessments; Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/SearchQBController.java =================================================================== diff -u -rfffb5d73e9c9bf785cbf01613e6972065cf88bc6 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/SearchQBController.java (.../SearchQBController.java) (revision fffb5d73e9c9bf785cbf01613e6972065cf88bc6) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/SearchQBController.java (.../SearchQBController.java) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -103,8 +103,9 @@ questionTypesAvailable.append(QbQuestion.TYPE_MULTIPLE_CHOICE); questionTypesAvailable.append(","); questionTypesAvailable.append(QbQuestion.TYPE_VERY_SHORT_ANSWERS); + questionTypesAvailable.append(","); + questionTypesAvailable.append(QbQuestion.TYPE_MARK_HEDGING); - //CommonConstants.TOOL_SIGNATURE_SURVEY } else if ("lasurv11".equals(toolSignature)) { questionTypesAvailable.append(QbQuestion.TYPE_MULTIPLE_CHOICE); questionTypesAvailable.append(","); @@ -130,7 +131,14 @@ //CommonConstants.TOOL_SIGNATURE_QA } else if ("laqa11".equals(toolSignature)) { questionTypeDefault = QbQuestion.TYPE_ESSAY; + } else if ("tblIrat".equals(toolSignature)) { + // this is a special tool "signature" which allows mcq and mark hedging + // used by iRAT page in TBL template + questionTypesAvailable.append(QbQuestion.TYPE_MULTIPLE_CHOICE); + questionTypesAvailable.append(","); + questionTypesAvailable.append(QbQuestion.TYPE_MARK_HEDGING); } + request.setAttribute("questionType", questionTypeDefault); request.setAttribute("questionTypesAvailable", questionTypesAvailable.toString()); //let jsp know it's Scratchie, so we can disable VSA questions not compatible with TBL @@ -224,8 +232,8 @@ @RequestMapping("/getPagedQuestions") @ResponseBody private String getPagedQuestions(HttpServletRequest request, HttpServletResponse response, - @RequestParam(required = false) String questionTypes, - @RequestParam(required = false) String collectionUids) { + @RequestParam(required = false) String questionTypes, @RequestParam(required = false) String collectionUids, + @RequestParam(required = false) Long toolContentID) { if (StringUtils.isEmpty(questionTypes)) { questionTypes = null; } @@ -244,8 +252,8 @@ String searchString = WebUtil.readStrParam(request, "searchString", true); // Get the user list from the db - List questions = qbService.getPagedQuestions(questionTypes, collectionUids, page - 1, rowLimit, - sortBy, sortOrder, searchString); + List questions = qbService.getPagedQuestions(questionTypes, collectionUids, toolContentID, page - 1, + rowLimit, sortBy, sortOrder, searchString); int countQuestions = qbService.getCountQuestions(questionTypes, collectionUids, searchString); int totalPages = Double.valueOf(Math.ceil(Double.valueOf(countQuestions) / Double.valueOf(rowLimit))) .intValue(); @@ -291,8 +299,7 @@ boolean isScratchie = WebUtil.readBooleanParam(request, "isScratchie", false); request.setAttribute("isScratchie", isScratchie); - List otherVersions = qbService.getQuestionsByQuestionId(qbQuestion.getQuestionId()); - request.setAttribute("otherVersions", otherVersions); + qbService.fillVersionMap(qbQuestion); return "qb/qbQuestionDetails"; } Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java =================================================================== diff -u -rb5d2a6851ee4797e641081bd5e6a1f28f78c30a6 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision b5d2a6851ee4797e641081bd5e6a1f28f78c30a6) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -928,8 +928,8 @@ if (StringUtils.isNotBlank(userName)) { // integrationService.addExtUserToLesson(extServer, IntegrationConstants.METHOD_LEARNER, lessonId, // userName, firstName, lastName, email, courseId, countryIsoCode, langIsoCode); - integrationService.addExtUserToCourseAndLesson(extServer, IntegrationConstants.METHOD_LEARNER, lessonId, - userName, firstName, lastName, email, courseId, country, locale); + integrationService.addExtUserToCourseAndLesson(extServer, IntegrationConstants.METHOD_LEARNER, + lessonId, userName, firstName, lastName, email, courseId, country, locale, true); } i++; } @@ -946,8 +946,8 @@ } if (StringUtils.isNotBlank(userName)) { - integrationService.addExtUserToCourseAndLesson(extServer, IntegrationConstants.METHOD_MONITOR, lessonId, - userName, firstName, lastName, email, courseId, country, locale); + integrationService.addExtUserToCourseAndLesson(extServer, IntegrationConstants.METHOD_MONITOR, + lessonId, userName, firstName, lastName, email, courseId, country, locale, true); } i++; } @@ -1018,8 +1018,8 @@ Element lessonElement = document.createElement(CentralConstants.ELEM_LESSON); lessonElement.setAttribute(CentralConstants.ATTR_LESSON_ID, "" + lessonId); lessonElement.setAttribute("lessonName", lesson.getLessonName()); - String createDateTime = lesson.getCreateDateTime().toString(); - lessonElement.setAttribute("createDateTime", StringUtils.isBlank(createDateTime) ? "" : createDateTime); + String createDateTime = lesson.getCreateDateTime().toString(); + lessonElement.setAttribute("createDateTime", StringUtils.isBlank(createDateTime) ? "" : createDateTime); // calculate lesson's MaxPossibleMark Long lessonMaxPossibleMark = lamsCoreToolService.getLessonMaxPossibleMark(lesson); @@ -1179,8 +1179,8 @@ toolOutputsElement.setAttribute(CentralConstants.ATTR_LESSON_ID, "" + lessonId); toolOutputsElement.setAttribute("name", lesson.getLessonName()); - String createDateTime = lesson.getCreateDateTime().toString(); - toolOutputsElement.setAttribute("createDateTime", StringUtils.isBlank(createDateTime) ? "" : createDateTime); + String createDateTime = lesson.getCreateDateTime().toString(); + toolOutputsElement.setAttribute("createDateTime", StringUtils.isBlank(createDateTime) ? "" : createDateTime); List learnerProgresses = lessonService.getUserProgressForLesson(lesson.getLessonId()); List toolSessions = lamsCoreToolService.getToolSessionsByLesson(lesson); @@ -1369,7 +1369,8 @@ ToolOutputDefinition definition = toolOutputDefinitions.get(outputName); if (isAuthoredToolOutputs) { - ActivityEvaluation evaluation = activity.getEvaluation(); + ActivityEvaluation evaluation = (ActivityEvaluation) userManagementService + .findById(ActivityEvaluation.class, activity.getActivityId()); if (evaluation != null) { if (outputName.equals(evaluation.getToolOutputDefinition())) { ToolOutput toolOutput = lamsCoreToolService.getOutputFromTool(outputName, toolSession, Index: lams_central/web/css/free.ui.jqgrid.custom.css =================================================================== diff -u -r9d7b90d94d48b27360701e1ae04497958f6eb259 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/web/css/free.ui.jqgrid.custom.css (.../free.ui.jqgrid.custom.css) (revision 9d7b90d94d48b27360701e1ae04497958f6eb259) +++ lams_central/web/css/free.ui.jqgrid.custom.css (.../free.ui.jqgrid.custom.css) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -121,4 +121,33 @@ font-size: 1rem; padding: 0; text-align: center; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-jqgrid-btable td > a { + text-decoration: none; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .sgbutton > .fa-solid { + font-weight: 1000; + color: #3C42E0; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-pg-button span { + margin: 5px 5px 0 0; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-pg-table .ui-pg-selbox { + padding-left: 5px; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-search-toolbar .ui-search-table td { + border-bottom: none; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-search-toolbar .ui-search-table .ui-search-clear > a { + font-size: 30px; +} + +.ui-jqgrid.ui-jqgrid-bootstrap .ui-search-toolbar .ui-search-table .ui-search-input { + width: 90%; } \ No newline at end of file Index: lams_central/web/includes/javascript/authoring/authoringActivity.js =================================================================== diff -u -r7a6cf37e3bfd077514f47ff4f4f37522b72a33da -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/web/includes/javascript/authoring/authoringActivity.js (.../authoringActivity.js) (revision 7a6cf37e3bfd077514f47ff4f4f37522b72a33da) +++ lams_central/web/includes/javascript/authoring/authoringActivity.js (.../authoringActivity.js) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -1,48 +1,8 @@ -/** +/** * This file contains methods for Activity definition and manipulation on canvas. */ /** - * Stores different Activity types structures. - */ -var ActivityIcons = { - 'grouping' : 'data:image/png;base64,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', - 'bin' : 'data:image/png;base64,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', - - 'Assessment' : 'data:image/png;base64,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', - 'Bbb' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFeklEQVRIx82Xa2xUVRDH577vroAlUdouVQgKolERqHRboICINKCA1YIKVkK7RR4f/EDwowQwBsVUohLTFUXqBwoGGuShEAIGaEtb8BUkrdFAYNtS5CGP7n2e65xz9tFCSxeMkZvMzu7N3f2d/5w5M7MCpHoVFUmZkX5jBVecDCI8IYhCX3rb8wSDEOcEEDik+939pw5uNFL5OaG3B7JySx4mnrhclKVZkiTdL4giiAJ+TYh91fOAoHmEACHkmuuQ3UQga9tqwg13BA6MLrsPNLJSkpRSWZYVhILITESm2JmLxsGu63JzHA9tmw3wdntNxR8pgzNyS8bIorRdVtSArCggKzJIksygoohwUUCwEAN7zIiLYEKhDAyObYNt29dwIcWtteHtvYIzc0NTUeE3iqL0UVSVQVEwSDLCZQpFtdRuCDVBpdQcCo2BHYvBXduyl7bWhT/rEZyZUzpaVpVDCPSpFKoqoCgqDB2cAWfbL6NimYdb6KQYjdD97Qy2HQRaYFOwRb3lWbY5p612w9abwA+OW9SfeKRB1bSH0EDRVKDwgvwRsHrJTNi0qx6tAeheswQTk6HmYMKgNMy2nQCCZaI3TbAs6zIxnZxIfbi5CzgjN/SxrmlLKVTVNdAoHMELiybC/BlBuHLdgPmrqsAhHg83JlhnsOs6sb11klDqTQo3wTQM6g9EaiqeSYCzchYOFVTxhKbrioZQDteZ4oVF+TC3IJtBKnY0wL7GP3mSdQHTELt8X2NqLa4SLAOhpsE9hVv2tLa68B4GDgRDn6o+fbFOYVQtemp0AaHCsfDKlJEM0nzmAqysPAxS7FhBp/2NJ1Q8vAwcU2oa9D36KLXowUhteBKCV4gDx7W1IDRd9+lJKPMalMzMg9mTn2SQM+evwIrKGpbhNNxxxcl9pRYHomdQDqbeiEapJ6ZlB4T0YFmOpsp1us/HoTE4/UzVL3ghCC9PepxBzv51Fd7dcgyGZKbBoAH9Yop5qOn5vfj3dWg63Q7nLlzm6oykxaDsvhU1FgiZuaVvaZpezsA+DowvQNd9MP/5MVA44TEGiVy4Bu9X/wLTswfDcyMC3VY803ZhfXU9HGxsRhgLbQxMFxDlviMaFgK5ZZ9gSJdoCNSZUWjMI/iN6U9DYf6jHHzxOpTvPAk0F+aNHwTDM/v2AHdg8dpqaDl3iYENgy+AQpnyaPSAMDBYVqn59XlxGFeefF88LRteHM/BLRc7YN2eJhYNv98HhSMHwLB0f7fw8qojsK/uZAJsdEQTihH+kxDIC32NIZ2bCrj1Ugd8tLspkQcSJtigNBmz2gYXk2vO2CGgKRJ7duPu47Bl3/FbgG8j1K2o+MOdv7FjpmA5pRctGCyL8bisejUb7r1HY/e/3HWsC/imUN9OcrXgHq/Z/jOr37RhYMVmbZDWZXp23ysOJsBf7GyAqr3Hb5FcwbJRsiofS+U40axeXdWI3UpmRSReQGjxoIXjg5J8SOvDwZ/vqIeq7xu7PU5or9PKJWSNe/M0wh7orYCcPX8V3qk80mMBWbf4WQTrvLxW18HmPfXdFRDHc6z0Xktmyaw8eG3qKL6f2IFo9aIhTrQXOoGwFw8GZ6Ql2uX6rYdh83f1tyqZAANzSrNEVWlCmP/GJpGf/QisXjQdbvdaVr4Njvz4+81NwrYnttWGf0i2xbzQGl3Vlt/YFlXsy+uWz4anhmWlDG3Gslm64ivoQIVd2qJhfhuprZiR0iAgo/Xr44dlxVNgwuihgHW9R2CHYcHRX0/B2k174dz5S6kNAizkY0LDRE2uQ6X9O48+fO6SeVLd2ejjuLZZEKndsP/uGvYSQzxOJCDDDhxth//L8bad2OSllqMVh+/ugf5//QvzX/9p+weF9UW/2f/vfQAAAABJRU5ErkJggg==', - 'Chat' : 'data:image/png;base64,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', - 'Data Collection' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAN1wAADdcBQiibeAAAA2pJREFUSMftl0toXUUYx3/fnHtzc5PYh21iao1tQhIrMQ+rLRgRqi4KgthG60LIThRETSEWdG1FBDda1NSCdSFSoXSRUJC4ERWhaqx9WB/ExDSvJiFcc1/nnnPmzLiQvN9pkC7yhwPfN98wv5lvzjfMCIvIWuRSz+NVSLgfzD3YsDwMuSOrZYsXiGS1yvhaJnK+05vT9HhaurJGXTx2sDPDCiRzGy51Hy5BgpdEdLNFVyC33wjVnsFQqjIBd5lcqERrQxAqfDNhc7nuWC7bvS2T7S3P6VDntLTnPGk7fuTLr1cMvtJ7qMWKPR7Ne+Q3iT7lGymr9o0UawOBsQTGMmnr+b7v6dTvmdSFxPjoF7Wun+7yQ6f5vefaR5YEX+l55rVorKG5oKi1QNtIZWCYN/gyYIJp200mf7gwNNC21UsFjR+/2JGdC1aTRrzgwBObt7xxLxKt5OYVjxfuP7Bz15tW8p2mhTpMg/MffhSIso6K5N3ZECusqV8SnEqfwdjsenJJJzpxM5d7lwQHwV9MJF5H+12AvSmg0eMkRz/in7HPFs/GTCfUw2RSbyPODlSkEevUg+wGYsugLIQjGO8aXuZHkslfcHMGi1qoYueDp2YcDmL0GeBzBIiqEpQtwWEbFjAYDBZPp/H8EVxvmNDzML4i9BVYNTOZKwfPmQaYIRzbj8L8509+VtBGIdZZFrToHv/f2gBvgDfAy8pawf3zAYr6HmT74F7KBh5qeaX1VNMaDpBVgo2iOl84VNk32VT9zrebngTO3RKpXpcVB0GE61fr8L08gtChbqs7K57vmJqjx06eAvCt0/7hu893rAt4+O8Kni3OUlw4vmC8pbFrH7AP4PTP9zUAHWp9fihFnhOuqG9UhXKr7LHtB8rWMkgs7vLdwN1sjgXkOSF7S8eIqOlbzFCqyPQmNrkAN9KF/iywRd4SbNtawKVlfYwVJhjxIyRTBSSul3Fw99BU/NOu2vNXR4uPAjhExmaB68rPnvy1p2ncCO8DO1YLLyhKg68wjoub2DUr5jh6/PwnT/csWsc1FefOmni2Sqx9FfgG0Kvk91nkA+vnD8+4jWGsmGXruL60MwOcAE58338kfps3cX/oUCuWPYLsnPMIyQjyhxK55uD89MJjXw0BvNx6+PLF4e1Ty07rotNzOf8CYjexQAURu7EAAAAASUVORK5CYII=', - 'doKumaran' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH4QEQBwgaTEF5XwAABANJREFUSMfF1l2I3OUVBvDf+c/sZJNsdpLZTQq1jYYQ8QMxVRBqzY42F0Zj2iLiF+IneumVKd4oeiEILdLQi6LgVUEQKS0UrYitTGJpU6jSQvALjatGxY9MspFMdmfmf7z4r9KL1UyMse/1Oc/zPs95zzlvGPG02pOSVoi7sA3LENgX/DqVr1hY6+A/3hoJrxiNtCnEyhD3YiPuxVUybsRbyYMhNmh8OqoOteMFrPvxWsP6AHENLpC5k3i9H/1eEdHFP0OcS1xQH/Q74xvGsze7cPKKB2MLoizGsRV/UMQnwg/HjN0e4pwQfekJnD+oj52WMZKJo1lNLsMB/FuCGyPicdxNn8j9eCFkfVSrjxtYxFAwN1R7OKM4FpnwUmbux94KYtk887/JgsWLnTzxJ53PLML1YOrS1fCfTHvJf8HBzsdfxIx8RrbmS9MrxUWVO2JBl3LyG+ZtxEX40XdCPDUzKTIbuBXrcZvMqdbM5KklzggZcTHOxNs4S8QVIk4dcevSpgjjuB7P4APsxc+I6VZ79SlSnGS6BJN4WjWr30CXvFKUNm7a/O0St9pNIsdVtV2O1apxux593BJZtA59f/+pUBxbsAr78ADOwE8xhiMpr0ip1V43Etxxl0RrpklaLuzE01Fb2CVrB7Ad74m8gziAGyj+yqDXm50/OcUTW1ZWG7dwGVYEz+SwAa/hfZSR0aDs4Ai5XaTpLa2TI24UdViJa/GnMnX/J+8wImlSHMOT2B5ZtLIYfnPiyZkJUfXnDLZgU8jvBaLy4aiqvq3FIf0RNqXcVhaltT+Z/lrir6zxitPHlZkTEbEz+UswJeJ6LGCdqp8bWB+cg+tUvX1uURbPl0V5rDd77MQUr2uvlFFTRGxFPcTvQj6EWTyKx9HE33E+7sS7+CWOZOS2jKHp9tSJEQ+zoZZW4Wo8R16S4hFswP14BOVi/h2LcU3cJ72GnxdZX5NZjm51q726ejKR23HLoq3n4TkZu4Q9wYc4G/fhv4bez9CJcJqwA5tF+WYZxb5VZ9QdXeIPtoTiVGQWaC+SdiLcKfye8mOZUgYGIeZDOPjiYVFkt6jP71p05AhxE/3lfUsvkPpSxH31smbwW6KHizN9hD9n5FxUdw3IqH4dUzNrGEa9zNiMHXgTf1QW/ZGt7s3Om5/tWb5hvCuig/dwDXaE6NZz7J0ycgqXpXx2qDxahM0i78Ev8DJ+dahzePf46cvKQ3vmliQ+7iJdM9NETETkVapB8gZexM14TPXtPRsdPNVYOPxuf2zCp7s/+1rckTb41NZpg6NzisaKH4S8DZerXvir+BueGMw33q6NDbK7pzsK5GjEX6pvN6EW8kLiIjxfluXrEVF2d8+dCNT/73wOS5ljz+5uaYkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMDEtMTZUMDc6MDg6MjYtMDc6MDAYquw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTAxLTE2VDA3OjA4OjI2LTA3OjAwafdUgwAAAABJRU5ErkJggg==', - 'Forum' : 'data:image/png;base64,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', - 'Gmap' : 'data:image/png;base64,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', - 'Share imageGallery' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAHoUlEQVRIx7WXbYhVxxnHf8/MOffec+/du6/q7vqyaqKJ8SWJUSpNbGOJRkoaaJqE0IR+aaGFlkKh9FvAD4XQL6UQCLTQQgOloEloGxtj3BiT2BhjE11jfKm611XX7Lqv9/2ec8/M9MNdd7VK2xQ7MJzDcJjfef7Pf2aeEW7RdrgdavXABy+BXNWWV59Yv3eA29zkVoO7jm5/WFT6Hc9fSqNxEpy9LPAGwu7OyWjPli0H4v8L+JVjW19MBtt/lMn8kNiUCaNjNKIj2PgQjvqEOPUG4u2aaPS++f0Nv2ncFvCMzMNtrTu6lb+e2DqMBeMcxoRYcxJljpGQz1BEU4jbbZ3ZhTf61tdX7An/Z/CrR7c+iModbO/6PdZ6TbCbgc+8xxasbZCQPIGcIpBTWFuoxq6yv2Equ2oy+trTqw+UvxB417FtvwyCR36SzvwYYx2xmwNeg8+OWYdxYJwlyRXS+gRpOYyxw7V6o/A2YneFNfWn5zbtKf5bsHPIKwPbLra2Pr9I+xubkGsyXyf5DfLPfKNNhXQ8TtqM0W7O02bOkrGjDKeno6vJ+luI7HIN8+enN/QXbgLvPL7tAUXm752dL2Osf4PM2Ai/Nsbo4HlG8pcoF8pkEkJvLmJ9b4m+tiImrlCVGjUdU/UMmVgz7dbxYbaLVu9vJNVI1cEea+zz3my0O5/S/fX6d1P+PbROHibRKJB0FVKuRkCdQ6cMfzlcYXJ6DK1T1MtD4AxKB7wZdLFgaYq1X7lIrqsyG0hPPaCrFDIaPsFw/ZsE6kx6WfDrbyX06Adecc93XnAijxZh+capdGtdXaCW/AO1hGba97DJNAcOtnHkgwnCyjA4i4gime0jLA9h4gqmVOHyqQzTY2vZ9I3TdPZOA1DTMQlbxziHc1CNF+OrSZTjdQ+R585lS4vGkiF1HdNQbib5mnRiPoMDXXx0cJSo+vl1XrBEtc/JdK2kPHYaoCnz9AiHX1/JxqeKROl7OB3dx/7kUsQZcJpWfwCReODJ+/adVQ7ydW0o+Y1ZKICv0zSqOT7c17gBCqC8BGAxUZFUrmfOqTqgOHaegffWE9mFzAsOsCb3U+7M/ApfKzoShxHcqwAekA+M3vyvdtcqyblTbcSNIsnsYrSXQCWS+KmAjiVrQWtso04cVhke+CvOxAiCNSGl/Al67BlSfnM/8VWBpB+T0SM40TubYCf5IPZuscA1lwcTmKhEHDVzJkqz6P7HuDA0hA7SFMYn6OnpJte9kqhSIKpOARBHRa5e7GTJPVdm5gpp0eeou/tHnr33d2cAlCibD6y+CRzZLFOT3iwUINd9N0ZnsaLY9Nh2lq9Zw+jIKLnuO0m2dBGHpaYHbEi1lLxhvoz+lFA9VJhNlyD5wDTBVbOEgv0eg9Vf8NHE88TxXM5FafygFWMMDhg5N4Tn+zgciZYuqhOX5syHwtkbVQzUcaCvd8c7zgPwIlQ+aaHcWM3Z6s/IeSfJ+e/SmzpOKbeAYlMtEpkFTA59TF/PckwUcuaTj4ljQ0dHO4VLJwkr43P+0AHZFodDiJ3GlxifPL6utSzu9DYCh7yOQ33DxU35sDuhkxfqwtLMi2iqAMxfkmTkfAbTqCCAjUMm8wOsXLmBaq2G7/sQlRk7N0CQ68VajaDQfpYFfcOMxT1MN3yMq5KSCu3BfrT/+HbgkJIdOyxw6YHFTzI/k6BmV83++cK7RvBT81E6QVSbAKB45SRTQ58yfuINrp7Yy+jpgzRqZcLqFGH5MmH1El09mqglQ83lUKJwzqMQJ5msv4/vqW0AaoZxwUYF7mjXhHbdnJk6Kqx4IMJPd2PjcGbzMJSuDqL9HPXiVcLyGHFYxMa1Zi5blrNos1CxGZQo5FpHU2qMkxDZuPOzQodq2t3ls1Oj9HnjNGTdDaZY/dBZFq3IkEj3zp4pjdokzliUl54zn2iC1jtYs72Dtl5QolCo5nOmx1YRm4s6Efhf8wCsqEE39Dbz5X101wsYFqAZxddZeju30v3tKQ7vT3P8UAv18hVMo0xYuUKqZRmNcBLtZcnNW8C6RzO0LYmJzPWRKhJeO22plWQTd5NOduOLbPUAxHIBAc9FdNuLVL11aLePNT0/oC29lsiE9D1dZ/NXJzh6ZIhzpz+nMFnC8zXt3UtYuCLFwlUKoyMiY9EqRVovpy21jMC/g4RuQUSQ5vpFFJs9AOMl9mgb/hwnE1rJBqfufXZhtk537ktEpj4r27x5OR5+dAVffmQxkQ2JTJ3IhEQ2IjJZlJtPwuvBU52IqCZEmkYSEZTgRBgAfntT6fPy6coG7UpHHl8GSmWI7Mzks5A6kalTj2OqcZbQ5jCuE5HUtcmRORACQwr2Iux2fvKdLfOlfO2QuKEN3pX+ZNU/3Fg9Hp2XTbbMGsQhlBppilEH1TjAkmjKJ+CrZmSCoISSKN5UqH6lbf/mBanB/7qufu1c+Y+r2kvPdAYZxmowGUK5oXHuZvlEcEr4BOhH9G56vA+3iPzHgt+71WDC0/vypdZn8qU5ybSAqFn5rijYjZZ+X6J3H+xuufpFC/pbgp12ez0n18sXifCeQvqVSP9DPf5REbG3/QoDsP9K/SXlJFCw10iif0uvjN/OS9s/AVgpuaPN3hZYAAAAAElFTkSuQmCC', - 'Share commonCartridge' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAABaFBMVEUAAABiYmJjZWdiZGZkZ2l1d3h7fX9wcnNrbW95enxtb3Fyc3V9f4GLjY6TlZY3NTU4NjY5Nzc6OTk7OTk8Ozs+PDw+PD1APj5APj9HRkZJSEhLSkpPTk5QTk5dW1tkZGVmZWVnZWVqamtraWlsampsa2xxcXFzcnJ6eXl9fX2Jh4eLjIyOj5GQj4+ZmJign5+ioaGlp6mlp6qmqKqnqaqoqKyoqaqoqqypqq2pq62qqamqrK6rra6rra+srrCtr7Gur7CusLKvrq6wsbOwsrSxsrSys7Sztbe0s7O3uLq4t7e4ury5uLi6urq6u726vL27urq7vL67vb28vr+9vLy9vb2/wMHBwsLCwsLCw8XDwsLDw8PFx8jGxcXHycnHycrIyMnKzM3S0dHS09TV1dXX2NjY2NnZ2dna2tvc29vc3Nzd3d3e3t7i4uLj5OXk5eXm5+jn6Onq6+vr6+vv8PDx8vL39/f7+/uc9g7RAAAAD3RSTlMAL5WentXX4OLs7/D3+vor/6SGAAAA+0lEQVR4AWMYzICJDSdgB0qzWOMEPJRI83HjleZkRJM2N4QBYyCPlwsibakkzA8GInGFIFBQWJif7GkOtdvCTYifXzcrSoafX620tDTLN9o3E0iHQaWDdPj51XOVDZL4+aWAwr6xClEBQLrYCCxtHK/Jz6+vxy9cLsgvWlJaGq7CrxhRCgQOEN2B2vz8GimyWun8/JJA0RAPaadQIF1kApE2sxHgF7Aqy5bj51cFCqd65fikAOlgWLCYykuIgYG4cwYQpCWkZWQk+1EUqAjpyEQsIMYWKu1SiBV4Q6VdsUv7Q6Xt87DJFrjD7LZzxALsIE5jZsUJOAY0EwAAATaL14smOYAAAAAASUVORK5CYII=', - 'MCQ' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAN1wAADdcBQiibeAAABJlJREFUSMe1lllMVFcYgL9z7yzMMDPMULYRRJQOi4JxC5GQqjV1jUmbrom1iSldTN/60qSNTRcb0zebmj754oPVaF0eKk3Ugpa0FbdEReqMqFVE2WSdhZG559y+FAIKDAX6J+fh3POf/7v/miN4SvZc3PG1XXNs0TVdMU1JyIQeHur/4NOq/Zcm0hGjN7t/37q5LPOFQ5sWVHuE0KbLpb71GFc76vpiRnjJzqqD98fTGWM9xeZeFvAt95gmKKWmvQw5RFzGvE6L++yXZ7enjAe2jHVfCKVMpJTMRGKJMEoZmJoq8Loch4GXJ/UYwDTNGXmrlGIwEQZg0IgIobRNexp2vJsUPJnBaDBIT01NcrARGbEXTvRYpSm/++aPrfOSgqWUSCmJ3bpFNBRCSslgSwu9x4/TsncvA/39IzrjrbiMjrH5REbdKZqz9siRN/Rxczw61PFgkEe7duEqK2egogpn01Xily/TWVlJwGZDqYm7zSqeqich0IW14H5e6lvAwWfAw6GSUhJXinh3N+pCA+luF9FQkIfZORhvViOEmLQA18+ppudJGw6LC4fuxmFx83f4ul7ffjBrQo+H4amBADXvfMyGwz9gnDgBQOv618l0eHjU1pW0sjXS0VLspKS5MJWJaZoTt9PoHANczlnC5lEXlp4+yoARRm17G4RICh/O+bDdScHDOUZK3j/wFXosRtfatbiamnB0dOCpO4VlywZ8gcCUenoYOCWPlVL07t9PXkuI3kARn1V+RMrSGJ/XfIv0efFmZ09aXJP9wLjg0cU10NBA3O/H8141JwMa4CJR8QVKKex2+3+ebklD/W9csO3cSXDgN4y0U9zoPDVytNC9hnxzETMVy0QHWX4/feIO82zl+Cx+ABojdTyREWZDLMkU/PYAeSmlAASj5zGkoqOjd0rGHQ4bHk/q9MDP9KcQ2O1WADoHm7nScQChKQqcL1KSsXascYs+fY+vh2sJRc8DEJW9aJrA43Jy4cGPhHrqKfVXEWr7k5tdZyjJWIXX6515qItTKzFIjOzTbbmkWbL49c73dMZCFOes5EbrORIyjm9oBZFIZHbA5e6xoTMxOd28h67BZuZnLqPxQS2adJIdW0eOYyFZWVkzL67g43MceniXRrWMu/pqAAKJk2wSjZT4q2hsrcOeyMQf20BRYSkFBQWIKYzRScAmg4k+6u/tY33uGsp6D+AUp6nIf5WjTfsI5Fby16N6bMZz+GMbWb5kBRkZGSN3JxYzucc23YmQFhof1OL3Po/Pnc7Pod14nV7C8W6kYZITWU1WZgGPu+M87m4dF+VJczInJ33qodY1K+X27dyMHaet7zY90TZK51Rh1e1cufcLvvhyCvMWUVpaMvsDpGLxKuov5jM3/hP95jWutZxBCA1NWUkzFlJYWDijyTXhq13TND5ZuYCNiz9kfuI17EY2mnSQEVlDnj8fm836/45Mn9fLS5Wv0Hy7jPb2dhwuB8VFRbM7qyWJ+/1GRzzXXjTmtabrOiXFxZQUF0//kS/7EpKhnnHBzr7Ow7e1S9va43fmCiFMZklMExGW3e16WBwb/vYPd+KYXXFMATAAAAAASUVORK5CYII=', - 'Question and Answer' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAG0ElEQVRIx9VXW29cVxX+1j63ufqWSZw4aVNyp9M4l45EAiU0Eg1SopIHSEEqAp546QPiRxR+AS880AceoEkfEBISpZCLWkUhjm2cYJLixA1KajtxYnvsmTNzzt5rLR5mPB3XVUnbFzgve5+tfda3v29d9jrA/9OjqnT27FlPVY2q0uex8UQfXblypSeXy5WSJCkRUZ8xRlRViIiMMZ5zzgJ4ZIx5XK1WHx4/ftx9IeDLly9nM5nMHgDDsT4YbkR3Kqk/t5eRZpRgiFVI/aZnB+4XZPdEZLfcNMbcstZOHD16dIaI9DMD37hxYzCO46+m/tw3Vgpj3yHfbS5Em/yeTAm+yYNAAASWG6g251Ctz2ozqdVK/MKfirL3XQBXs9nseLlcTp8YeHR0dJeIHFsujP4gCe9+fVNxr5/zBz7F5wwBI7YLmHk0CST56c387Td88kdzudy75XK59l+Br169+pSqfmux78LPvIzdt7XwnAGZTwASKBiqAtGuORgPl6awsry0+CX90a8CL3pnbm7uvZMnTybdNrzul8nJyQER+Wa18LfXKBMf3NrzHIFMh5HAgjUFa3uU1ff2GlpjJsxDTTM7H1/f10fDs/39/Y3BwcGZixcvdnxuulOk0WgcqPvTp2xm9vBgYQ+cprASw0qjNXIDCkHG60OgeVjXQOJq7T0xUm509mdz/UCuXpqRC6eTJHn+xIkTW7pJ+quTiYmJIVU9sJwdO1XKbvOcNqHSklBUAABb889jc24/DHU+w0I8jbG538DLBKsEAFUAiv7ebZipjxzaHBwZNSaYVtU5IuI1jJ1ze+rh9Nc8z/QYClssNUbaHofyhzCUPwRRxvXZc5iY+x3q6TwGcjtwcPBV1GuPIeygwhBhsDBUBJl8nmaSS8eMMbtHRkY2rpF6cnIyBLAljqYPG59gda10LBZbcgdbaTbzFuaaE3jspjC5+HsAQCm/C76EbUAHEW4fwCGf7ceSTO4OgmDIGLNxjdTMnPc8L2cxPxR4hY4vFQpVhQcfKdfAYnFveQS5Qj9YGKYdmwpFyg1EYgBVaHsNqiD4sBob65obCf6GNcArKytBNpsNBByqKNjYlgFtBaFVh8uzv4RwikyuByKMrN+HZwdOAwDuL12DUJtpGxDaBW6AmOcGC/5ToaoSEakPAEEQGKE0VBWjqhDm9pkVLCksN+AkgZMmRBj5oIQXtv4UuWADPqyO4cLtnyOIskiaK/BNBJ8yMMZvgauCoGjyQk9PuF3ataMF3Gw2qRjk2r4RsCZo8jISVwNL2pK9Ha0KxdFnXkMu2IC7C+/h/J3XYYIIKdehblUlhYGH0Csg8gtgYfhepAD03Llz1JG6t7eXrbVWVbXanCEnTahKB2hVdoUiNFlsyO6EkwTnp34BCnyouHb1AqCtQzqkSF2MleYDiPORCUvLzGzOnDkjHWBrrYiIkgZp6uajbqCPg6fcwMP6LcyvvA+HJjwJ1u5tM9auubBBSH2Lnufp6o21WgniIAjigntmOjHzX7Yaf8Sy2xAUrCnO334dogwiArNbB9TtFhFGwWyHMf5j3/cX1+RxpVKJRWQhL/smSCIIOzC7dk5aMFuwWAhb5INBvDL8Bl4Z/jUy1NfKXXYQdhBx7bkFiwOzBaURtkTH7hLRvHPu0bqSaa29E5nSP7O0bSHRpQGW+hoWACEwOUReoV3cgUzQC1YHlqQdiLbDdJV1pL0oRQcvJUkyHYbh/DrgYrF4e2lp6eZm78U/x7j//ZRrUHUdI4HJwMBDNf4Qb479uJVmEkNFARgYBLDS+EhmVQTSh93FV/9FRHeJ6O+VSiVedzuVy+W0WCyOBdo3slVPvZM1JXCXjImtI7E1ONdEPX2MxNXg2MJygtTW0Uyrnb0sDh4XsCv/vWpftOttY8x4qVSa/tRG4Nq1a4cBnK5h+uW79q1DtXQGrMk6CT8edK21VpnNYBA7899NN0VfeZOI/hqG4R+Gh4cXP/Fa7G63VLUnK9t1h//Dex/ob19uugWq21msS7NO7rbmARURUAHl3p/cK3q7/2iMGU/T9FKlUll8op5LVb3x8fFDIvIiET077669NJNc2JZyFawpHDfgtAFSDwYhDAJ4FGEo86I8XXjpbWHcMsaMhmH4l/379z/4TF2mqtLo6OgOAIeZuex53nZG/PSK+/eBlJf7nMaeoRABCs2iv/2DwPTeVNX7RDTlnPsHEY0dOXJk+XM39FNTU9Hy8vIOz/N2WmsHiCgPIADgE5GIiDPGpM65FSKayefz75fL5QftHPxifxKrCly/fj1nrc2KiO/7vgEAz/McEdk0TWuVSsX+z/9//Qcb2LxgTGbpOQAAAABJRU5ErkJggg==', - 'Share resources' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFOklEQVRIx7WXzW8bxxXAf7O7szNcJrY+zLiWrbKpAyvOh4XG/4DRwBd/HYoWQU/9L3royT0UPfZvaHvovQaEEAlg1IDdJIbdpkjjL0CB5UQSY4cSRYq7O7Pc6YHclSivZaduH3bAGczj/t57897MrOAFpNVqvel53q+BWeD3Z8+e/YSXlOBFlDzP+zAMw6YxBufce8D8y4K95yncuHGjBjTr9ToAQoic/4E85fHS0pJqNBp/zrKs3e12/93pdGKl1G6Vtf8LOM/zdxYXF38hpQSg0+lw+/btcj6Kovfu3r37ZRzH3yRJ8nAwGHwex/GdPM/XhBBfXbx4cfBfgbXWbxRQAGvtxPzMzIxcWFg4CZwEcM4RxzFJkpAkyXB5eXkrTdPH1tpHaZo+2Nra+jJJktb58+fv7wuenp5+d/c4TdOJ+TAMJ8ZCCKIoIooiAB+YHrcTwPvtdpubN2/+CfjVvsmllFoo+luDId1+vHf+e61lkiQAq88NtZSyWfS/7WZsbo3AWZYB8M0mdPMYGQikL1BSIH0PGQi0FISBhxA774vjGODrFwEf2Rk5dHQQM9ig1++jXz1ErT5FNnTYoYPRg3MON1IHAe/8MCIMRAluNBp/uHXr1m96vd6nZ86c+VklWCk1vbN+MHXoCAdnD5MPc4Tv49zYpDF0BBclXAAyEBOhnpubk1EUza2srPy00uOrV68GSqkIYJg7pC9wHjh8CPyxd+DY7W1hiMDhCDzBrkgTx3GZkFmWrVeC+/3+nNZajOp5bPkuwF4PJzwfw5WczFdrLUEwwhhjHlWChRDNWq1GsVxh4D0F2O3hSM+N53JcbtFhbaIUC+h4/KASPDU19Zbn7VgcBmIcwhFxElxEQPBk8A/Wex8TBjVO6F8Ch8v1LcLsnCNN0/uV4CiK3i4LXEA3ucPy4xZ98x2H6id568gHCPwy5Flu+WLtj3y3/U/qegYlFDZ/XILjOC7r3hgDsFIJVkq9UfS/6nzEnbW/kmZ9UttnbfM27e7nvH/yt0i/xiDt8LcHv2Ng16mrGTzhI4SHktFEYhXbrzEGIUQ1OAzD8px90r83Xr9xw7Gy8Xf+8tkHzE0tstL5hMCX1PUsnvAQ4xZ6r0yUUuFxmqZkWVadXFLK18o/2Q1wOc7lEwZsxis87t2jrmeRwcwOFDECB5MeHzhwoMju7NKlS98+y+Opor9w+CL9tE0vWWdz8DUbg0d0+ssktjcGeRO/nvDxhE/gTYIbjUZRwxtCCPcUuNVq1bXW5dEzd/AnlZu+GQ7oxWtsmycktkuWD8jyGCFyQllHCK8y1MaY9cq9OkmSY0UN7yehHzH7ynFmOb6vnnOO4XCIGJ8YWZY9rDwWpZRNY0x5Cr2spGnK7guFMeZBpcd5nq9eu3btX8Axz/NmwjBEKUUURWit0VoTRRFKKbTW1Gq10psq2b1HO+dIkuReJfjChQtfAIsA169fv9dsNk9Ya0nTFGMMm5ubtNttrLUYY8jzvDSgMKzo12o1tre3924eD597r5ZSHg7DkDAMKa61eyXLMowxpGmKtZZ+v0+n0ykNtdbSbDZL8HA4fLQv+PLlyx7wqjEGKeUzwxkEAUEQFHetfcUYQxAEE+DKt165cuXnwNtCiHnf919XSjV93z+qR4JSCiklRVT2W2uA9fX19NSpU/q54GfJ0tKSyvP8qHNuTghxBPix7/vzYRi+LqU8LqU8JqWsa61Lw7TWrK6urp4+ffro9/52KuTcuXMpsDxuVbUrWq3WD6y180KIY865ed/3fwTc36v7H/3Gg+YiyiIQAAAAAElFTkSuQmCC', - 'Leaderselection' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAHvElEQVRIx62We4wdVR3HP+ecmXtn7t27273bbbvbB1SWUqh9BCpUWgKIPCTUEoFGS0yMIAREg1GJmog1xGhQEx8YA1FC0kTCNvIQAiaKSpsWaCyVFoppoI9Q6D7v3r3d+5iZc87PP+5SMHRjrc5k/jq/cz7ze33PD07zObzmgvueXbrk8Qf7+wuns1+fLliUrBbhOvr6sv8b+NjaCy7fe8HKxwZvwsy8VU0A9dt3754R/Odl5/zq0cVn/VJAnZrHSn0Nxcbe/ed+Y0asiFPgZlp/9fwV6xF1B8g1D/X3x6cElqZ8FtQ2gR8MLl585clDrbzMAH5n7epzRLEF1EEJg4/f/u67jVMC9+/e3bBO3Qi8jdKPPXjGGX0f8jjgW6LNFSf/KbaCKI3asOnAgbGT2QQzher8PXtGX1i+9NMK7iTLJgE2y2ad2/bG9SbwtwwqmYso/yO17I1Uq1/cu2br7g+g7/OakU/s3//6jKk61Sr84c6bBgzyeCmoDZRMPTaqHeVUQmpZZ6Xlox0cL3zum1dvqZ/KeQpAQCvwMxnd/9Kms7VrPd8XDy+MTJF80IVReQTB+iaJrTJlrR9N5+6JqlNrv3rtc8lJq3zp0p6RJLl406FDTwdDV60ovl0Pj+xN7PZqK91ZSd2esUbjlVuPHq0AiKDu35lsnRcNLSyGsynm5hEFZQIdIwiZm6JlxzHpMQ0jK0a7eh8AvvQebPiS1TdMJPaaicSumUiy80Dp3y5cOD9QLu5AbAW4TFDXKxFCHewCLgK4/8WNG2aFEwNxUKKYm0cpv4A4nEvOdCAIia0SpBEiDusOhxM6u2rzX78wa/Plj1Tb0VR3CKxDyWtKeFihRsI0nQzmPv/yMLAEYPvy5R+BbJVSUn0/QP6WDlMv5oMFREGZQm4upfwioqAHwdFIhxEcqTtOLqjQaY73tXK59cAWgPFK49qR3l5/+a6/2Rmr+pJ9+w4CB/+t35T0auUxOk9gYkJTIgp76IoWY30L51PCbJxAxxiVJ9S10CAr3wMve/319D+20+I/jG/sMv5KPEx49dyRDbMfR6ZFQgQEEI+Iw/kULxbBM73wfjNBE2Dhk5NXl012vVbkKk7tOLKh5+EPgVc8M/6TdR1yZ39exwBHE79pxzOVC0VuO2jFXGx9k8xPkbgajXQELxkinmY2RuImyXy9XeE+3/CSe/HcZ8fuuTjKvrM4Vl0KGMv85//y9Pi6V9f3fBFoXwLznpi47JMl99MlJVMsxwEdOU2HIYycW/GWdQ/1BQfXxboeax2ilEYka1dzNk4zG6WRDp/4RtPyO48c+/bPVxVLv1nRaXrKcUAprykYZbqV++jQZ+55s/roj18LAMrGXTk/Uh3FnGF2oR0EDyyMfee20fWLPhb9cX89mFqn0yFEhMweJzAFRDyZr9PKxqmnQ9Rs0XnRg63cwmsGIuYUQ01PbAi0Aiy9OR2Wtaw7DI8GAJmoliCICHY6lyKCFyiaIWO0zBtPy4hMYP1hWraE0XkQwfoWia1SswWaPmeU8jf0BG8+YBnAA1YA3z7LI2QirRPKNfup0XMuLbD9oi7T25Fr3xtTqefFanPswuLXxxZEby+Ng07G006sZES6SkiGoMgkoum7KOVCOs0E9azG0Vb/P7cd/1l8aXd0Rilv0EA98/yj5qeeb+prj11X3h4AdGl13pSX+O81z5K47fmBpnBm7vfdvbmRcmRyFMJueot9GNPNZJrRtA2UMpTCIqXQkNpx6qnC+YQ5+bElZ2db012TN7M0FoyCNxOh6Yk6xV91DLYHDErurHDse5d06g4TGo6k7TisLicE6T5TNA1CM4d8MIso6KaQ62NeqZecKQGQueM0s1HqeKxvkrkpCn5YL8rvi+Z3ZBzJCnhRLO8StHNBl/Z31Z4YfTIYiCt3rYxlZRQoypFm6SyDVnC0to18cKTdczoi0DFhUCIfzKIQ9hKHswFFMxvFiyV1UwS2gNERoOgOjtBQO7hi9qcIjaLaclSawqK8n9Ufqq/osmFZoD449bQ9ttkrFPQUCoNSBq0CtAoxOkeoC8TT8NAUMSqHVuG0jUErQ2zqZG4vSina7/tPSctAIOJ05iBxQjPzVKctrJ9EBR5BtdUKjxeLlwzrExI7MW3XwkmGiEVwiDhEPArB++NMthxaQdN6EidkTlBoE4xZ87v9ibtslfFnKqDlPApw4k4IoPUJ1jWxrk5qazT1KE6SEzlO7SSZa2B9EyfJtIyC945K06KUInWeeuY5lKjKkOXJ4NCGnj+NPDW15lCWfLkcyopuTY/WyPn5ZBV5Su8dnrgagS2gVYAXS2Im2x67Jomt0LIVElsjdVMnQtqUZPLliuwNtKNqVXPMqgOVJluGNs7eFQDUN3QMvwH3fvDCWLvzxl8nPn9rXidBW50qaGUQcWSu0RYQwPmE1NVo2QqtrEI2DW75vMtTGXz26p7b/qthL67W7x7umrOqHFZWdQT1qGXHEBzWtwhNDaPCNnhatxNbPZH3hi+k41l5Tyuf3H1aw97g4E3m0Hy5Wyu5Ja+Tng5TnxMbIWfyGN0Ge7EktkXLIXVfGG64eNKhBs86qr6/ceNW9z9PmZtfunlB5NKNCnepUnqewiVtsMmjqAjmhUzY+t21j711Kuf9C0QV+CAoTLAnAAAAAElFTkSuQmCC', - 'Mindmap' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFeUlEQVR42r1W60+TZxRnLlv2YdmyxC2LX7b9A5vbBORSEHU62CfjXLaoMEvww6ZBnPPDki0MlFtLoRXEWrG0vG2hQKFXSguFlosU2g4mFwHpjBOZGfdLWQbj7JzXvAkqMmpwT3KS857b75zznJP3CXn8yGsaQ8UWD5Nv7amVGlxnQv6PozKZ3hDZ+28V+WbgSu8sCDrG/5YZnMlP2BUX71T98JOI+faUleEnO4mI16BMIyn5MGhgeW3TcYF7AiqHF8D0WwAu98xAocWn4vRKQclbqvPnNYqEz2blH4fCekQ6siHbTQOX1zR9JGj9fbGsfw7Ut+ah0DsNEnOnmHTaguKdyqQTPgq+GSpP4vuqJZLNV19kas/Jb/HPCtrHVsQWX4tWa3lTU1Lybjk/eeCJ4LtCQRUaRoT8OuAnkgfId9PgGo1+R7nO+EF6evo2+mbSzlWtDUhAVeHhULd7NxgiWCKeZKzuEduz56qfaeA0IhGv7MCnC1ygCgxMIPWREdAUHQnNvCgi4knG6irWgJNvpVAYEzQwZnx5baUUuCEqElwx0eDewwNPXAwR8SQjHdk8Urkq7fuSoIHLk0+2cgGqwsLBglU5scLuOB707Y+FoU/2EBFPMtKRDWvL+THJKW1BAyu/5g+SsxKHpyY8nK2oPTYaevbFwO0DcTAWvw/uIxHfizLSkY0ufDfrw/om8YeCrxidOGAKZnsIjCCxMHowDv5I2EdEPCvrQJ3tMWAm8cRI8MD8lE52SJBoammA6C69eK8D+xEcK0VCfg/JSMfaVKNtGddqfoo7aGAm7Tsld1caHBg9Do4dJ7gNK6M77dkbQ0Q8yVidHtdLs3a4MEbwU52Xl1gWxVvhqtbi0NDeUjtpjVqxQiLiSUY6smGrJYri/aPOFSYFDQwALzDfnLZTEA68IiwMdFi5MSICzJEsEU8yVqfgQJGYU6ftFCPkWY5aKIxWHvr8PheMGzY1tpOAiIgnGavfheAH46Ei9SyM9A9MLi8v1yB4PNK24FuecTFR9cWXM//1cyg78hVclVWAwHYLch1+KLV7wdXVA3Nzc7CyslL5TJX7Wlw/WrJzVuWRvPV/iXH7oUhthRz3JEh803AJ/+vC7ikQOv3g7RsiYMWmwbRa7etareE9uVz+Cn0vLS29093QYLOLJbO6M2mrmmOJoD56HKpTU4FR6SCr408owf+4anAeKoYW4NpNfFB0TYHM6vZv6q6v6p1HCyy+5uzGkYmsJv9sjn14rNDi0SmMjRFrBu/V+fn5vYFA4DDyxxiHdzDPPQXX++bA6A9Aw90lNgEx/tcLrb3jarVx+4agl83tmRnOe4sXOiYhF9uWhxnndE5CRscEZDX6x6T61iPr+V0xuIxkJ/t1FqpGFqD29iIo8FEh8mDbLd2j2L2Xn15pXcuhzOa7gWwMQC8QapsU31/Fv8ywAS7ewGRsg3fk2ua3H/ctqzUfzm8amiY78qEE6K6z2h7AdYNDtWG1IovPkImVESg5MtgqDT6Dygfm2WD5OCzpbRNQZLqRs55/aV2juMDeP0EJUvLZzrvL1/SONoaxvLYhsNDWN0rtogoJrG50Ecx3AlCDbaO3GFVAQUX1Paan7r3OFosJKK5hlYpaayq2+MUNQaVS6UvYxvu0DtxkGvG12XTvLzYBJSZCT18Czrf2OkK28gisN71ZGJh2kCqsGsYhQdBKXI1SnFa6ArqKApOX2VLgS6YbErpDWnyqmlaDEii9+XDAaF3SnePLtG5bCixVN2/HqvtpdWjxqUK610LPNK7Ww8ESm9zmkOdxZHrX+6J6X/vPrgerlMAFpIx2JOfYksTcVcNO6PM69KaWGRwn880+WYHFU1tQ75HIqx0JWxX/X3CoxAc97BzAAAAAAElFTkSuQmCC', - 'Noticeboard' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAeCAYAAAA/xX6fAAAFTElEQVRIx6WXW2xURRjH/+d+dvfspZSe6m7bbUsBUQigQPHCAwYSeQBviRpiIso9QZ9IiBrURE148VHjA4kxRF+URCNQExIkFSkoWCsgICQtbbdNpdvurXvrufjNaRcWutA9OpvJzJmZnd/M/L9vznc4UPr41Zb1kiAsFkTIEg+IogCR58HqrIEXeSis3enjIQrUJwKxh/Xlw/NqX7LTid6ne8a+UMFPyhxGvF7jh4bXfo2jQuI+eKX5AE2wTxI4moyDU7IJnXL6WSx/nq7T2Gsr6lG74Cl0xzshmcCm7jR8NCn1DymWtDS88+RoJWCSAIG6gAi/JkLgOfAcRyXAl+oCIFDJ39V3ebmObFgHR7+bhWHIho3N3RO0e2fR2xvf+PlgJaDNVr3z+QaamEO16VLAi2TbevyVPI9EcRQ2/TjbxsaT46gPKWzhe5u2nvqkIlCWOOx+oWlWiE35cGsU/cYowp4o/FINAc8hXLSwKmVh/OI4fAaHSK3nvwFNOr5BmceAFkJG9UOS6Qi9PGRBxZ/jXc4YGTzeGsiBnU33lSRkjq8eSItDjAF8QaRUDZKkQ/csg64uQUCqJUOREEtfQ7dxGCOFQUwYacwRQtjaN+JMVjVQIltu3vUoLLkOtcpCPOBdiTli2DGGUuLJTURRRMfRDvxT7Ee+/Q8U7Twa1VY803sFITIYVzts3rMWT9bvv6u3rErHOxQbQtfpLmx8dhP0eh0p8yZswUTvub1Ykki5Ay7e8RgWRPbDwwcqAlmyLIvcQoA/oDnH62S6AY70bMfagT53wA2bW5Bs2YYW9fF7AgVyyCmQSPpOASUGvPo21l4/Xz1QIeC2F6M40bwKq0O77wks6TgFug0+O3wIDRe+Qt/FRPXAXWSlHeF5s+pYApKPwzRt1NQEMWr0OzoaZwbcATvr6rAwXFlHwzCRSuWQyeQxQVmSBUQiOpqawrd0DB3vcQfsUwXScTvpuJpWbyGdyiKVziJNAHbt+TUvQjUaQqEAZFmaoWPoyIlbQEkS9jZs6bw/0KAjOxFtx+qaXcjlioiPpeD3e6FpKgH5WXVMff85Qjm7eiBLP0bm4Ql9dh15XkSeFkUNqK+f6+j4y7E9aOiNuwMyHR+KvAeV898BZEaSzeZJx6yjYbFoIhjU8GB4rgNkOn59+nW0dV12B5zScQfp2I7JSQNj8YyjY6EwCZ9PIacnHUMa1b0z/PHbC/vQdLzTHZDp+BPp2E46MkiaLFMLeKCq0qz+eGrwSxhHD2KBR64e6EbHciCrMx3PdLyJFckJd8DOuToWRd6nwMl3z1unBBEo3ombAxhMd2Fg7CLUG71oH8+4A/apIpKtO9GirJwBNGHQu/AqYrmzyBtD8BQyiGTGEckXce1Swp0flhLT8STpuIp0tAgxXLyKkfzvKBZi4ItxNGaTiJBLaKZ9x2Tll7crIEvfhcPwCLUUaSag5xJonMhgjmHfN+b5X8ACXSyKBVepHBhcuOFYzZp3D1HzOTKy6+VAi8JEbs3SIHxewRGL48pk427bCzfdULkd6I/l0FTnhY9sQH5kC5T5z9ElL9O9K9+g/A250wECRn+jMH/FjKh7+pnFrGIVUXjpv6Vx1vJ3IOlLoMgKZEWGoigsf8p9+HJ0kSjLn/n8/qWqx6uRX7HxZO40ASt5ONG44HxbcM5bgz49nLoDoNKJtKe/OUSJdhRdB7ltE9sZfZs4O+yTZInt8KMZobZt2zoVyyi3GYYx3zTM+aZptNLrSqGYJmjZlkRjAs7lyrHj59KUJ2myBIUgRcq9tObrVP5NczDteqh/uDT/vxa5OOMf7++XAAAAAElFTkSuQmCC', - 'Notebook' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANWSURBVEiJ7VdbaBRXGP7+M5czezGby65xs16ClcQYb+hDTVJrVSyI78VSKoohULFVEdQn8UEUa5ES9CEi4u2llD75IBSkVI1G+mCpVRtEU1xNrKtxY3Z3Ljszx4dN4k6yo7GkVNQPDnM4//zfd+Z8/+GcIfigo21xUNa0dYo6eHrdd39kAaBjW9M8yaHG1vbLPwAQAHB8a/MK2ybedrjz3HDu0c0tqyUGY2N75y9+/MwvIAX47k9XqUvtfHAfAOzZAxbi0oGGennVsW+aGwHgyKZPwhUV1JZI0Ocd2xdHAeDYtqbKmhp8URVFa/vXH5b58dPogYNdrRvCFPgqeLGn/suV+qQzP6vZ0McNveS6xG/frW6cCenqk1i/Ei/XhZ6XagaSUVUR7K6SeCxHAnk3Y8m1RjJqCyAZnp5KBZ1HA05m/66mE2d9hQ92bVy7TCSO1A0kK3/7K4vlLf04/2sES+aGIQRwPWngg1pCLh1ErMyBaRMeZvPgClAmKwiqAjlLQtq24NgCsYCCgMbxe0Ws77Ld+9muJccvlVxqGeqGusG+SoKLaXOW4syPLqYuWFaYIQG6OhsXrtgIV8UBAIqqoedhBDd6AuBaCADAtRBu9Wi40xcB5yqEY2ChbsVVUtu8WkXgTA6RmwMAVNNNrF6zAorVPRJfND0Lt3YeuPl3Ydaujub5CYAkSMa9Qm24z/DRoqkgAGTeLyRaGTBNmuIrXAzm5KDptz1jipUCkPKMqeaDMbl8WPAl8K3q/xqeLyYXEFLgX5MRjdkkICKQHASg+wvnGbnpWTuLs150vWweYkmSXtoYY8C1LR7h/22p3z1h3+2UfPAYmYzuF/aARnk+/KyeUoWG+pmvJzwtEZ2Q4vLDe49H8N7jicab5/GjVBo5wxoXCRGVbNGqctTOSLyecCQSRniS+4Lcq+QRZYyNHAbFfU3jvpP1Feaq/HYWl+8X9z8dhGnZ4yJhjI0s+bC/jDFUlJchHo+9WlgM/R0AgMqVwgE+hFd5XKqN22PbsdK2MCETRzioTZjHT41/YDu25+bo8diFue/8k1Pd5tAVdyIwaPXjp+7v/3Qd45Bn7qNf/LZz/UJZ0XYyIU8uES4JRmNrlBhBCFfkHTPpOMbeHS0n7xTHnwPFCQoUJD+NQgAAAABJRU5ErkJggg==', - 'Peerreview' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QIbASYa02rxEAAABMBJREFUSMfNll1sFFUUx//n3tmZ2e5ud7e7LS20AmmBCtRqQATESONHomBJ/MBXJdEYIhASIuqLkhgeiMYQTPTBFxMJRAWVVh8QeTAQGjBiCFKRolRaS+m223a7uzM7c+/xYcuHksIiFT2TzM3N3NzfnI//PZdQoh08n7vP1bTV9TnqKA3XZzh+cXSVhuMBjq+OBS4kN7y5mgo32s8oFUxCvgutlwAA+G8fufgiwoJcZeoQgJ032k+UCmZwvKR1xBWlrCsZnPHHpmASreRQ/5o5m2U24gIWorIKAsHbAz6ZOTVY8P1aS5RhZnAOau05twe8ouaxWUGKXqlmxbcEFviPrGSPj6aO9Rhkz54VmgeLym8fOCiD0hIhmMK8Vsf/JrgpPr/m6hzfqpWc4yE3nR320uDJcPdmPP7m4rfdFtmVS+LLETeqJxdcty+1KinEQ4DGoBb7f2+taL/07dm6p+febKjf6XiyJSC8VtLKdLU8tGlp265rwPPbB95+MMxrp9ocBAg9ebXmu/bUez+tTL76TzzafqT1lalB+VqybFqMSGLEHXhhR8fKR9Ytbl8DAAQA1Z8OLG+txL7GsBGJWMW0Z1yNzjF/9KsR+fgfqyoObzl+oEsx6gUsVAXqEJKJK23R13DG26OreP2UwEv7poZwdGasuSoWbICgADJON3ozPxbOjIw+t2lp2y4BAIkgPVxniUjYFEiWGUiWGQiZAnWWKC+X/CgA5FVe5ZWDrD8GR+evX7Gkn0gEY1URqxaV4WZURxYiYt+BqJU0LaGXXQ51QbHLTNAMKF2sW2ZAM8PXIgcAi5L31pZ8ZBJltNbQ7MNXDsCAZh+aNRgifxk87PHuE1nesCigEpqLG44VNE5kKZVxCp/cbH4LAeOLvuzwubD124xiBAxk3B4MZPtyiunzy+CIKe8aA8zvRzRm2xoMoMshaNaRcttY2Q/s2H/hwFkDZlNz+SJEZPL6UnGcJraM0LnhLiSCfZBkYMjNwNNsGYQVAA4b+JqtBjn4xgMRioiAgV63WHIL4oDyyZKkNqf3ZD+bEz4ZLxNRxM0K+Oo6UYamsKm3zojWVEbsBmR9BaU1ZpWF4fg9sme0c+32jmf2GPVe6uXmEJosKVBhCTTGJASAYVdhMMdotDHtFye3aXp4esWlHPuYWMchuffupC2X2IE4onYt6kPzEJBhpHOnMZDNI2pFooPO4HqRMMSdBhX/laioLyL6yzwm0VB6M+muM0gbAI0/AgSJS3MACAiv3gCBPF3UYM6jcTCQ8xiuz/A0AyTl+10f/MCslwXIxMLY/Wgou2fC656nxuD6w8h5/UjnTQgykfP64XhD8FQGGiSNAU/u7syrlmahZxIA1y9WtasY2YLCGQf9FwvY+1bj89sMDmutBXlK0ERyyqiWY+nC8RrT6JlLJOH6wyiOIxhzezDkDqU9RL8kAEjuydYkzfy6qgDmBgVVgpkczekhhdO9OfHh0OrEqYO9Tqfrc+PVOp7o5KqzN37ENLLRJtlkGnY1EQlfuZmcds/ktf3x5sV7OwwASD0V6ksBr/88Sdea9Yt3jgLYMin9mIDzJa3T1D2p/RiCX2RgM4BEsdx5vMdwUQXMGuAj21oq2/B/tj8Bew9GsWfUN0gAAAAASUVORK5CYII=', - 'Pixlr' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAABd1BMVEWcGyDuLjOaGh/sLDGbGh+eGyCeHCDrLTLrLTLtLTKbGh+eGyChGyCjHCGmHSKpHSKqICWsHiOtLzOvHySyHyS0QEW1ICW3ISa3Jiu6ISa7Mje8KC28MDS9Iie/Oj+/S0/AIyjCKS7DIyjDPUHEWV3GJCnGLDHGUFTIJSrIRkrJMDXKeHvLJSrLYGPNfYDOJivPZGjQbXDRJyzRi43TbG/UJyzUiozWdnnXKC3Yh4rZe37ZhIfZm53aKS7aoKLbe37cKS7cKi/cNDndfH/dqavefH/ef4LepaffKi/flJfgfH/gjZDiKzDifYDimJvjRkrjRkvjfYDlKzDldXjlfYDmWV3mcXTmeHvnfoHnurvoLDHohIfou73pf4Lqf4LqjZDrLTLrsbPtLTLux8nvrK3vxcfwpqjy2Nn009T23t/33t734OH42dr45OX45+j68PH76Oj78PH78/T86+v89PT89fX89vb99/f9+vr+9/j+/Pz+/f3///+sY+cHAAAACnRSTlNnaWpt8PDx8fLyuVKQpgAAAPhJREFUeAFjYOaICvLxcLC1MDXS19FQVVKQlRQXExEW5Ofj5WFjYuBMwC3NzcKQhE+aCyLtHxcbERLo6+XqbG9lbqAugSYdkFZcAwJVhSUgqiJGBSoNM9wpBySeoaqkaJIHYrkLoEjbxkOlFWSV80FMG1TpcLi0pCWIWS2KIh2MkJYDu8MYl7R4GYjtglO6FMS2wyUtAzZcG5e0IYhZJIRDWjodxNTjwy6tmQwKPjN+LNJV2amZICpSXhCbdK6bt5+nta4UOEpwekxsSElHg6SzcEqngKTLtbBLO4ZVgqMpUQ2bdGhBDRSU+aFIE8gGhDIRIztuaVYGAEbJ1fVk5yXRAAAAAElFTkSuQmCC', - 'Submit file' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAEqElEQVRIx8WVXYhVVRTHf2vtc+6HOs6oo84go4b4OSakVogvGoilBKFZL0K+RS8GPgTSy4DgY1QQBFFEDxVZRohJUhaVhamVhplZjYOOXnOcO3dmunfOx967h3udHG8641ctWIdz9tdv7/Vf62yhZh2frwqmj2t5XtU86bCTGIPJVU8AEQAd/lY1Re/8rvMDZ3d0rP4irZvb4Tu05UjnUfFb7i3bRSZyQqCQDZSsUbKBEAZKxgiBClpjOQ+p88TWk1pPlHpi6xhKHamDXCBMCE9Z51470b109n0d0uGGNwUw+bvDj3j32OKL0WIzkCqxE6xXLIoTwYkiWnUTKGFoCEODCRSttVsECyReSJ0QWShFnu7BeQYeb598+Mj6q0+sAFnTtBqZG4wIhYAKqAhGBSMQqJAxSi6oesYoxlT7jAoq1WiIjJREdYEZHzavvbotABAnecHcSEiobURqEAB1vrpzqR87cg0FyNWBr2feX3GP94L1YJ0nsVWpUuexI8ZU3/GjJ+Z1wa62iPMe6wXrPKnziK32XQGnzmOdx9XGVufcBHhqtodp2cZ/dKlpGmhV46Cms3pB3FVRMeBU8RmqEfHVxPQIqoKI4v0Fzg1eB9ySvUhbvu3GOl/bLIIxBlWDMQZjqllebdPhvs5SqQ6s3EHz3nO0eIxS0n/rGt+K/dB3nDc6X8WR4ak5m1ndumrsYO891roxh9p7UAXnPD1Dl5mVD1namGdP1zscKHzJ9iXPjQ0cRwm//VEY0wlFPBHJ8CbOUCDX1Ehzvo1NbXCo9zxbD21j8z0Pjw7O5jK0L5o56okvRj280PUSGbGoGFQDBMP6pvk05VoRER5qmcrChgu83bmX8SZasem9TWbXE7vsbWn8ff9RZmf7mJdPmJidQVNuJhNzM2jItpALmgBhKC2hErBlprK3cHJB0jh0ct3eDWs+Xr+765bBKSmCx0hIaPKEZhzZYCLjwik0ZFsRUQaikNRVGDJFVk+ZqjMyXXO/KuqxR/dtWFOvcZJy/tzlUUPdZ8sQVitS0Gq4JcBohoyZgIjBaC8qASIGEKYFQls2mXA2yW6oAxtVpjQ3jArOlzL8ZcH5BOsTUheTugpROsBAXEBQorSfxFawLib2Eft7pb9kwwMuHtpRDzZKQ8O4UcFT02ZO9YYU4oiS7+dSWmBy4pjbGJDYMogQp4NUkl5ODxT45FJPlFh5+qO17797W8m1sulB+pIiJVtk0Cvl2PBjf4Gz5SIrmucAkNgKewunKSWelU25D55d/ta71y0n5xyVSjwm+Jrxa1DVmhsODnzDr5VPKVYMl+KI/ZeKbJy1gYUTJ/F19+uVG9ZxmloKheKYTy4iw160g5SDPg72lDlTzrNtwTbapy+gs3Ro9B9IJhMyZ07rLd1OU5Lx7Dx5kPb8fF5e8gz5MPffXBKtuem8suzF4WvxRnZHr8Wbsf8X7IXI+vSuQayPwRLVgSNX/KwQHY/uFvj33m/jiru8vw7c+8D9+3rjzp9/GtgdOdwdAzocB7vfjC6UfznZs3zZnn8tlI4TmzLTB812VbMRL7mbhcg1WawieBjy3n049GfPzq3r9o2I6N9jzQF6Fi2ajAAAAABJRU5ErkJggg==', - 'Scratchie' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAACx1BMVEUAAACcnJyTk52Wlp6WlpuXl5uWmZyWmJuho6emqKurrK6usLO+wMGWmJuXmp2cnqGqrK6rrq+xs7Wxtba0tbjY29ze39/BxcbIysvN0NFHt1RIt1RIt1VIuFVJuFZKuFVKuVRKuVdLuFRLuFdLuVhMuVRMuVlNuVpPuVNPuVtQulNQulZQullRuVNSu11TulZUulRUvGBWvGFXu1JavVtbvWZcvmddvmhjwW5kvlBkwWRmwnFnw3Fnw3JsxHZtxHdwwU9wxW93w093x4B6xmN8xEx8y3qBxlKBx12EzIyHzoCIyFGIzZCIzn6JzpGKzW6KzneMyVqNzGyN0JaQz3qR0JiTykmT0ZqUy0mWmJuXmZyYmp2Zm56anJ+bnaCc1aOdn6Gdn6Kdz1ed1KSd2Juen6KeoKOfzUqgoqWgzUeho6Wi1qii16mkpaikpqmlp6ml0V+mp6qmqaup2a+qq66qrK6q0EarrK+r0Ear2bCsrrCt0UuvsbOv37GwsbOwsrSw3LaxsrSx3JSytLay1FWy2H2y3qa0tbe0tri02He21l63ury31mC33by4ury412K6vb673r+8vr+92W6+v8G+2m++4cO/wMG/wMK/23K/4cTAwcPA3HXBwsPCxMXCxMbF4snGyMrG38rHycrI4IfI4pjI5MzJ3MzJ5M3KzM3LzM3L5c/Mzc7M5dDNzc/Nzs/O0NHO5JTP0dLP5JXR09TU1dbU6NfV1dbV19fX2NnX6KvZ2tvZ593Z6tza2tva6t3a67fc3d7c3t7d3t/d39/d7Lbd7ODe3+De7bjf4OHf6+Df7OLg4eHg4eLg4uLg7OLh4+Ph7OPi4+Tm8c/n6Ojn6enn7+no6eno6uro7+ro8c7o8s3q8Ozr7Ozr7e3r7+zs7e7t7u7t7+/t8e/t9dju7u7u7+/v8PDw8fHw8fLw8vHx8vL0+Odc3MJ6AAAAGnRSTlMAEhoiLkBVipOVmp6tv8DDyszOz9DS2dre4h1KAQwAAAHrSURBVHgBY2BkxgOYGNgj8QBeqHReSTSIKkzAJp2w5fXrc32rpu98/WxuZHRaZOzsleVw6aj5D14jwLx7r7efff36eTNUOmbfa2TwEkpfvXSmAyS97jU6eOGjnAymS3gZOF5gSAdLSUsVgxgzsEnHSxlHaMjOArLqgYZvQpOtlDLIrHCV8nv9+kY0UHo2qmyvrHZBdZiC2log+zg/A/sWFNmJcjqtU5NUVRaAeRIM7BMg4msvgshFmopNGzv1ZRoggpIM7O3PQIxQKb1tr+8uN5RtO7HURCob6kNBBk6wbI6UrozpnlOmUrVPDlhJhUNtWsXLwA2il8lopXtIWVtIpby57Cjl+Qoiey8N6PJDQEaDlGVZl4uUlNftW25Szo9h7tzNx8CeePD16/v2Ug4tk/1Ddh31lbK7g/CHMAN73BEgfdNWyqlnzpLNAVI215C8KcLAdR3MOG8u5d4/M0jK7DSS7GE+BlEoc7+RtHegjNFe5JhbzMsgBuOsVpdXUl+BGsJCDDxw9ixFxWlo0SPOwN64aQeUc2wveroQACXFKjD7KVgARXoKOKVGnQQyt3YDJdfPBqu5Apa8UApNyHHz1tRERtbNzo2M3vD60aqMoodANQtjENkAAVJjgUTWpBn5kITMwoYHsDLgBwBl6wZxS0UKzgAAAABJRU5ErkJggg==', - 'Scribe' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAACqVBMVEUAAAD///+AgID///+qqqq/v7/MzMy2tra5ubm/v7+2trbIyMi4uLi/v7/CwsK/v7/CwsLMzMyqqpfGxsbIyMjMzMzJycnLy8u8vLy/v7/FxcW9vb3JycnCwsLd5si+vr7Ozs7AwMDLy8u+vr7Pz8+/v7/MzMyhoZe+vr7MzMzJycm9vb29vb2+vr7CwsLOzs7Ozs6/v7/JycmmqJXMzMzQ0NC/v7/JycnAwMDLy8vPz8/MzMzJycm9vb3MzMzAwMDPz8/Ly8u/v7/BwcGdnpXAwMCeoZa/v7+/v7/BwcHIyMjJycnKysrLy8vAwMDAwMDNzc3BwcHIyMjOzs7AwMDBwcHNzc3CwsLJycnPz8/BwcHR0dHIyMjJycnPz8/W28zFysHR0dHIyMjExMTNzc3KysrQ0NDAwMDl5eXAwMDm5ubExMTGxsbGxsbAwMDT09PHx8fT09PW1tbAwMDk5OTAwMDW1ta50YPAwMDGxsba2trX5q/i4uLHx8fS0tLi4uLFxcXS0tLV1dXW1taArEaAr0GBrUaItEeKr1mPtlSUvlShvl2iuoOiw2akwX+nwmisw5GwznayyXq1zIK3wqi81YO/x7bC1JvExMTFxcXF3I3GxsbHx8fIysTKysrKzMrMzMzNzc3N4ZbO4ZfPz8/P4ZnP4pnQ0NDR0dHT09PT46HU1NTW1tbX19fX4rzX56nZ2dna2tra6LLb29vc3Nzd3d3e3t7f39/f6rzg4ODh4eHh7MLi4uLi7cjj4+Pj5OLk5OTk6tPl5eXl787m5ubn5+fn8NXo6Ojo7trp6enq6urr6+vr8dzs7Ozt7e3u7u7v7+/v9OPw8PDx8fHx9Ovy8vLz8/Pz9O/09PT19fX19vT19/H19/X29vb39/f4+Pj5+fn6+vr7+/usj+l+AAAAhHRSTlMAAQICAwQFBwsMDg4SFBUYGRkbGxweISIqLCwyNDs8Pz9FRUdKTFBRUlVZYGFqcXJzdHp7fX5/f4WFhYuSk5eZmp2goKantrjAwsPDyczNzs7Pz8/Q0tLU1NTW1tne3+Di4uTl5unr7O/y8vT09fb29/j4+fn6+vv7+/v8/P39/f7+/v690lsTAAACFklEQVR42nXMZXvTYBiG4YzBNtyGu7u7u7sOHa7Dh9twd21ZgbAhg2ElJCFjlBISQhLSlJSFFoh0v4Q3XfIOWLk+PudxP0iZanZfOak2Er/Ubgs3s3J2x3hWp3f6VlYvLo56RiT8a3X7pG/jDWDRqIktT/3L6g1cttMx0zQC2R1KrfHw1Xsl06LPVz6YhmHoumco/N5wVSAKDOy+Pj978buu65r2bHENuJ6qAwJ9efXw5tUfmqZFIoKnLeS+a03r5acXOWcuvNdUhlTCYfdgyA2mAPz18cmtk5dQjCLFsKqq+YuqQp8W0X++e3D9+A30sWRZqKiIdreG3H/9t7e5l4/dRnFgCk2QwVDQPQhyoyVvcs+funvPpyp+guBCiqIE8+ZVcbjpvpzT59A81k9QomUyE5QLDrW0NXH0rhPX0HyckmJGv8ZpOSC5BtjcbmyvpQQfsA3zB6yk+zMrl3CtxIQ5CjSLGEISiQPNEach24MSjjNyzHAvyYsC7+oHudl0Wf7TBIHn0ckVHS6XVmIvScGKJXCOw/Y0gfNh+yUWK7DNi/k4lmVcPSG3mCXGXlrm51iADHNnYgWHk9KAMYTX6xhN+x6tSIbzkVl8IU6X2tMtO2Z0RWBt5gKyrfDoxt2ze1SHBkpe4NiRDZkTulSDYDeGAkYdzsgc37kSUrb286mDGZvGdUpB4paybs2oVknIf6tfPs7xN4t9X9VYdVz0AAAAAElFTkSuQmCC', - 'Spreadsheet' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAELElEQVRIx8WXO2xbZRTHf999+FE7iWO3adPGSahAaQkPgWCgG50QQkKsbEhIHRBMFRILAwwd6AJsMIC6MHSsmBl4iKE8BK1Kq5akbt3WoQm5jn19n99hiO34+pGQBIkjHd3r//30HZ9z/t8551MAQRA8C3wMHGUfIiLUarUPZ2dnv9xprQLwff9r4GX2KVEU1f9aWckqwzg9Nzf33XZrjfazICLsV7XW64AtIhcrlcq20bMA0DoB/rlUxQ/DXXtsKMlPjGUBjmitL169evXFxcXFYKRh3QdW76/QbLZ2bXiykC+2DQOcKhaL54F3RoZatE4oInvKsWka/WR7u16vvzHS434zJ08cJ4ri3ZMrCK4DC33GP/V9/3I6nf59MMfto9CRQmFsTx4HQZCqO04AiFLKARyllK+1fg94fTDHWvNfiG3bj5QOHuz8nGorURQ5w0O9x5zuR/5fw1prlFJdsOl6+w6/YRjkDmQY5dhQcl2/sUypOJEkThjitXzGx/MJvF5vkMmmSdl2Al9dc3jm6YXdhTpl25RnDiewRrPF6qozgN+uCKXSBPlcNoFvbLjbpnCo4U7tHYbtFt++Vvct8IOQa9eXk8Uhjgn8ELflJXDX9ag3mlimuZkS3UJE0Wy0tvYdlWPp+5hO2Zx4bDaxsOl6rK46zJaToV6qVHGMW/zx92Wq6zfxwmb320/fjjFXOsnC1HPzd+7cyZbL5dZAd5JknIaHri8t1Y1f+dn5AjdYRSGUDvT7tUbd/Z6qs37s8cmZu3Hlh3Pm7KnzW8epz0gYxdytrvSxOsJ1/S4eWFeoND5jMitMdnm1tY9SkLEneWrmTabXPIIfPyl6hv1RvL48ZRbm3x1KLsMwGJ9IHpuWFxBrYXwijxDwMLzA9ESAGphpBKVMjhRe42jwBOFvl/C89XYfjIhqv5wVkQtWpy3SU0AMBblseoAQnuuRy6YxLU0hdWYkY3PpRVi+jLf81WYUbHMrmvWbKgWnu4OA6vFahlWbnhzXwiJN/RKRhkhLn27mrzT+Koeef4VD0T1SjWVi5zaRU0FCBXDP6t20V67dqAyQS4uw0XDZyBYYOzaPHwthR3XyueR03g+ST01xJPcC04ctypm4lodLQ3P86PHtp9wHoUU1jLCVOTjiDtE1L6bWjLjy0KeUM269Vcr7e+pOKQOCQIOpsAxFEG8ZQYbP0DNjFsoAlNwfWUB2kryKKGZMtIBGyFmCUpt/wI8gElBtvtvG5v6mqTaPrZZwdAHZaagj5pjZomHl0QgiHUK2J9Y2Z3QPLghaeBDH+oOR4+2/kUzUJK00cXYcjdENtZatKqelm3iJkc9NHb3/5OGxWm+TuL+XZq8CFztsYaQzmFYaTBtMo3OrQEsMoY9EwTdz5ZkzgxOIyFkFdZTK7+Wipr0WESMvAB5wrh/8B2iVqmWxp59GAAAAAElFTkSuQmCC', - 'Survey' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFEUlEQVR42u2UXUyTZxTHuy27WJbsatnuvFiWZVm27GK7oUEXHUPRyDalMrYwpTqmbFp0ok6dOnBCQSjo+CzMOmBsCioCFkEoBdqXflGg9OttpUBt15bKR6F8ROG/hzdSL0QwFXflSf552qfveX7nnP/zlrVYgMV6QcgLSS/hsWUlvNDQhf3iRPamYh6bEiayjwX29rHfL+aFSMjzxYXxH73MepqYh4kOsC2t51e3kEP1C/tCHvuOLG9Ny4XEENuF/SEfMGAeu/ZGamhL2WG2lhQRGxQwQxb7Rro87pNcwfrkil/XGKY6wiZId/4Mihs2L2FiyOysOuxe+Yk15t/PRRyd3ytKCqUHxOv6xTlruwpPh5WkKuLWpbV/u+qJgJcucV7KpOLLU+X7ZzOo7Mm8yqMz1wQxc/6OjShJWot8db6/QJPvL9m/GvfV4ag6Gz0nrPllukBT4BelbJkbaNw21/TH9rkiUeI9gTLPn0Ydup+l2N16ruOb15YEn6XiSfVlM4ckbiRJPEgR6yBK+hQVJz9HhWAfhD1jKDWMoyKNy+xd/DkC5Z0DKNGNoaIoBWXHN0F0+DPkXJfM5zPKVjXfz1Ym/L0kWKBIMCS32QNJJ1o9ULU1QFKZj4YuC0R6H/4xT4DSGSG5nAu1vAWX6XH8afChRjcI6VUhFM3V4MtcgTOOtHiQ3rF7amlwx+47J6TOQNKx1iHkKNwo1bog7B4lgHFUWiYgtk1A3j+MRpsPV6x+lBnHyTTI711u5CvdOE7ySH5AqVQCTuHUi08MPiodwmn5XWSphlHQNYqLeh/pcAI1tknUD0yhlqykEGb8hd1jEKhHcIa6+9RgZkzJMi8ylMPI1Y4SL30oNzJdz3dKVj/+Mo3jQq8PeaSwTFJgitxLCg4CXKoxoqLTEVBltwPVOiduGFxoMLnRRHvQYhmC1DrErBKiW7QXDURisxe15mFcMxKZRnCdHkM1PYo0Kn55sJaWo99me1T9/YvKbrfD6XTC7XbD6/ViZGQEPp8Pfr8f09PTmJqZBJ+Kew5+PLhTqwNFaR6qo3NRdSi0UCi7oFL3QK3RkTw9tF0GGIzW4MAmoxk6nWFZ6fUmmEwW0PRtWK029PUNkEnY4XC4nnv8ZGCNphvt7cqHkqkWlUyuhpzSBPxWqroZv3t0puDAZjMNg8H0UEbzojLTVlisfbjdRyYwYMeg3QGH0wWPx/sIeHNNzOvrxVHVG8RRZeE3Y1/9X0YdeSvmTQLsIWAwqudIOZc4rzxTcIp8BzaIOb3zQJ40El83bmHgpJCvnpnHrgkXtjZEM6AjsliclEXiQdeesEbOqhXxuEpXi5MUH9p+HeOxa9yDXa37GNAZ9WFkan5kPofXR7kibnDeWxGPrxprsKGewxwc0/QdNP92BaDndTko6uU/GO9WZ/jNre+uyHtMD1qwsT4aEfVRSGpnxhhQgT4fIlPhwoVybKyLfmfF/kAGHXZwJXuZww+2fYF01U5saYzBue5k0unZhYtkJ+C3WYtFlmLPYCctC2rUfQ4b9rT+xEAOtG2DxHIQaWoe8/3Lm9uwmblIj4lM6ntxXe/F2WBfp9suG3a2ML4irjnqgd9c/EbF21lLRZqC+2EGtWuyqjv3XrP+CpoMVctKYroKKV2NNmsNZH11aLRWIVbyHQONvrUdp6mdM3yKG8laLlJV3Lf4cq4gS5FQF4yyVT/U8ZUJDXtbd/QkU7tK+Qrux0vx/gPaZLILlUu/9wAAAABJRU5ErkJggg==', - 'Share taskList' : 'data:image/png;base64,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', - 'Voting' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAN1wAADdcBQiibeAAAA/hJREFUSMe1Vz1sW1UU/s71+7Gfn0ls1yRN0jZpnCrICRgQUqoCCjJCDapg6UJHJoaqQ9QBsRQWBEgMgISEEBOMTAgKAx2KWIAMKJUbRyGi0DSkCYbKOHH9fO+5DE4d2/HfU9Mr3emee773ne/83Ee4j/XJm68cGjz+1NmAYaXPnDv/mp+75MdYA/TpO+dPH0s+9pzbnzjVf2j4cTf6cCj/1427Gz9/2f/ihY/Kvfoyuhm8++qpyPGTp8/GBkaf+akvcTIzPH7CMC1Rb+P2J4J3gokZAFcPBPirLz74cGhsai4+NJYUItDWzg6F8ZAbffTAgMN9MSMxkkz24ijcFx/3I5vodLi2unhZs9KtziqVCra3t1EsFgEAVtCd8gPckvHnF8d+jEbdoC5+Rxu/pUuHTzztMDM8z4OUEkIIGIYBx3FAVM1PI6Ce/frt6YVmX8XCjr22lT9z8bM7f3QFjkWdeCYzMwki/Hk3DyKC53mwLAvhcBgAoJSC53moVCoIBoOIxI6Yj2Sef9KmnYZSyV2/Xri1+V8/gO7AWgFq528AABcWoUdfhm3b8DwPpVIJABAIBGCaJizLAgA4kTjWbxKOhrcafCmlfCSX1mBZvdAnNvFv/gaEMwAhRC28WmtIKVEuV0vXcRyUjRGwXG0iwb0Da81gWb3gGMDtfBbR+CiYGeVyuaazaZoIhUI1nVXwCFSJGzqTZvgB1lC7jK/+soqj6ckaO9u2EQwGWzqz+sdw7VoBNu0geSxRlcoXY94NtSY4tolbi5exvvRDT72XZQnjI5FaxDT7AAYDXGFoAE9MTYCE1QatdatnrwCuSICqJPyFWilAA8yFOj7UOFnajRita9/lK7lY62qodPf5RfcMqHX82zS+dhoDXFH7aVFvA5bqpGDtC5ihJPcoaXvGRICWvhsIV0d/N+edokHkT2PwXufq/l6hTgnuN6sBlgy9y7hjAnUoMwKg2iRXwzxeWFgwc7ncS4FQ7LCSCiyrrVNJVd2Vvc3y3uYWe+8cMELTL8xnstmstY/xysqKzczzAC4AGBRmCFwpdBawUxDq4q4hzOjw9PuGYby+vLz8cSQSeW9oaGjHyGazMWa+AiDdoHGbpOglq+r1rhsSCQCXisXiuVwuN2sEAoH5BlAAihXKntzvlrrr2rykFM1dcYKILhlCCNZNRe4mZ7G5nceBLBII9Q02gzNls9mYYRhXmlk/qEVEK8w8K1Kp1D9CiBkAbwDYeICYWwDecl03PTk5uU7N5eS67hyAOSFERms9cZ9gvwP4HsC3UspvUqmU19O/09LSUlwIkdZaTwEYJqJBrfUAETW/xzURbWqtbwNYE0JkiejXZDK52c73/7uW01MBF4RnAAAAAElFTkSuQmCC', - 'Wiki' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAExElEQVR4AbWWa2hbZRzGq0NBnCLKRNi++Em/KAquzMHA+cEhqBNh8yIqzn1QxgTLNpR56SY4J4rKlG5Y52pnabtLW6ttKCtpk6a5nLRp04tN2iZtLm3TXNJLend7/D8HjhxqunOY3YGHhOQ97+99nvf//s8pWK9LUZTHOzo6zra1tb1UcDMvALcIrLC7u/vHrq6uyODgYCIej19zuVxeALeuK8zr9d4mrp4XUI3f74+MjIxEp6amrq6srIBaXl6G0+m8arPZHv3fsL6+vtsJE2d1otjo6GhydnYWepimpaUlDAwMwOFwfH9DMAHcKbC9PT09FvkeN4JpWlxcRCqVousIgA1mnW2UKN+SGB0CSwhsKh+MgNUwTQsLC6ra29v/ljkeMoTKnmwShxnZs+zMzIwGMgWLKU54vzmObCSM+fl5Vb29vYSfMOVYBkY5kVlnM7kcPMMxuMpL0f3lISiff4iZTBpzc3NIJBIED1VXV28wAz7DG/LBCNJrNDGEtkAUsdQUxiYzsH70AS7tegpdZWXI5XIUwSsS94OGYKvV+pgU0+xaMEaYm5uFN3QGzuA+xFMW9IajqHN04PRvNWh87wCysnDWBSXHjdX9mdm44wToYJrEpQ8NvgNo6d8Na/8jcAy8jgprE46V1aCqqQVSjGB9aJJmQvBAcXGxcTORrlM2Pj5OEPeKK5cJYmj0foU/fG+j3l+Ipr4ncVnZh6OXt+F048ewOz3o7OzE0NAQQqEQstkspqen+Ukw495iCG5ubi6UiswRSvkD7bjgOYjfe/bigu8JNPbuwcn6Z/DppZ2os/0EOX6Eqm6lg+mlgn0+H9xu9xFT/VcO/zidOoMXUendj/KOp1HRuQO/2t/AkYqt+K5+HxxuqwqV/qwC9LBMJqN9ckEsMj/nNYQLuGokVI+LXe+jxL0d570v4ovaZwW6HZVXvoXiVVSXsVjsX1g6nUYkElHjDofDhFLsYox72ePxPGAIDvpPnZwIlWAwUoFzbe+gqKwQx6p244qjTnUplY/JyUlOqjoaHh4mjL+pC9DE/yneI2YOXhcaCZzYmo6VLySjlejr/Bo/1+5H6Z+fwKO4uF8EsIAIUx0mk8nVMP7GNLTvHEuwV6bPH/fDmzffl4zWKuG/Tl1z247DaT8LxdMKaaXo7+/nfq7ljAAtaopgjqPYxRj3IttyXnBR0aGj58/9MKEoNsixYlHwEccb8zrjpNLb1QURxnOrwfRQSlEUyJvJ/jWfuzLgFXF4WI7AawJO3SiMjpnOxMSEqkAgQCMOs13Mou0VJwsGg4YwjmFK2jg2I4rfxfGCxWK51xDc2tr6glTwEmOm8kXIfSWMYhKE6DU2NqZJ275XTb1fSVFM6mGMjUeIIMZnBKNTTXxG2+12l6m4JR4bXemj5HHKC8oD4z7zKcVCbWlpYdwRU11MBu+RuJfp1CSMhcczT3eQ7SI0LTHXSvd6Wf7bYrbA7pC4k9eDaUnoYHSWlHur5P3tOXk63Z+/eRjH3c69XO2Me8zzSZA0Bzoblw71ixzFXQ0NDZvME9au7jcl7pVoNPofmKQRFVCpFOJOq9V6T8F6XrL6uwWS0zkbFZUIcIekcVfBzbzEzbsCOyw9e5scrY3rMec/Oxp4Tfuik2YAAAAASUVORK5CYII=', - 'Kaltura' : 'data:image/png;base64,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', - 'Zoom' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAABPAAAATwFjiv3XAAAEbElEQVRIDbWWW2wUVRzGv9kLa91CW2zRyhIEa6UJaTXQpi+YlEBjE16IiYb4VBCDhCBvPCgPxicfJE0kxhguj6gPYiIEtXgnASmJdlFrDKkX1hZaAq29uO3uzvh9szPbmdrt7mj9J2fm3Ob7nfOf8z/nGAholmWF+EkVU7Xz6Rjf44ZhmE65rJdRTi/CBHmaaYdpoW10FnVjWWgAqI7AXBXDCIX6WDzL9B4HocEsaouCCdTMDk+Z2N97G1Wf3gWSk8BE1q+5PAI0VwJba4DOWozHQ3iTPV7jAMb9PedKRcGEbstYOHl6GIlTKRjj82BzEv5cFQfRnYC1qx6pqIHdhF/w98iXFgQTuj+VRs/hAUQHphb6rHRdU5xT3oBsogIvEi4P+OwfYEL3/TyJYweSCN/J+PoGLqyMAseakWusxAHC3/IK+MCEbhlOo7f7KmK3Z73d/n2+dhlwajNm6u/BdsK/dpUKYELjXLHfPdeHhv6iS8L9LNi7hUv0eCuuhww8Rrj98+yQcGQOvn8DD1+7A4RyS5ukKW1yDrpDtmfM2cZmTfy683M8MDLjNpV4W2wv+KtEXzYz1nGmAzeXhfAQZz3DxW9b18VbWHVr2inx1VbLsHhkrlwsl6Z3zqeAT4b8PTbfB0Toz8uj+Xppi7G1Hl2s+aAA/nIIhlzs2rp7gVbCy7Et93Py3DB7/wCihO1rAp5tAF5PAlc8mmLMB7clR+k4TyfIlQGsKwEMcqN8pRVo1AYrk4ZH02bQmWqK8P+GMybWDk84HVUrC7TlAxVh4OVNHqir4QHfJEMsMbWqY9MZVGS5JVqEuSnojC3OzpjvJZZdPb0zZIglpv2P1a7/612kwQ65BaBUl0aIMNc0LrFU1ozTlVFMRVWUe72JxSCW8bjV/s6rxbwYYrEtHWJMmVz2g6vjHIk+dNJkufHsjoyiL33G8GFoFUxgj6YYYompGcu+aanzgy/+BowEOZkIHuVZfehjoOcSMCMXy4sesM0gS0A3js91rMULH/6Yv1WoYZIBv/cMrx0bgToecaXshxH+U0Fo7zB++24AcR4Qbp3qyZAPzinvbpkRHhA/PXMa61NjvjWmPktiiWpY7+7CIA+KDXR11na1nTFwdO8mOkYu+h+StAk9KpZm4v5j5Y93Popk+xqY3thbirw0tzfimhgCyQpgjkRH/+4jnZhYvdy/0LwLJGheWtI0DHQ7DD9YJTb0r4yj+42n8NeaFflN5b+czdKQljSlbROdh3ezKtRzL915dwonXz2LFZcH57xS6FBGpn09zCM78GdN3L5pMj78tiBYXQh/nGF44qMkNp74CpGhMlf7g1y9e55A9slmfE/xPZzpt35kvlQU7MB5b8DzOROHLl1H4osBhPt/R2iYg8gqImk67OtrYLVwAXU0IdfegBSPnh42vU1o0f1vUbCtzAdnz4sqtjHp9tCWzWEdt1ReFbj3xjAdCeMXZq8wnWe6QGDJi3FZYIr5TOcpK+QN2QxBzp6Vryjn+TdhHQNZV1X6YQAAAABJRU5ErkJggg==', - 'Resources and Forum' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFgElEQVRIx9WWy4scxxnAf1XV1a+Z3dWOJEuKLTmWZC8C2eQBwRCwk4sI6JDb2ib/QC6CHGJMQg46BmOjQ/6AhBj7oINBiQkEETYoxARERBIrkhJHq2ey2l3NZjSv7p7urs+H7hnvsGuvJeODC2q6ph7fr7/6Xq14hHb+/PljwE+AeRH5+YkTJ/78sDI8Hq29FwTB4SzLUEp9HXjiYQXohz2wtLQUAk/FcTyeKh/lzXfU+OzZs/7Ro0d/nef5eq/Xu5wkSd9aqzZtWflCwFEUHT9+/PhL1loANjY2uHTp0mQ9juOvXbt27UqSJMtFUfy70+lczbLsBrA8HA5vLS4ulo8KfnoMBcjzfGq91WoFCwsLx4BjwEmALMtIkoQ0Td3Nmzf7o9FoPc/zu2maLvf7/Svdbve9HcFzc3PPAgxSR14KvUE6te77/pYzQRAQBMHYh2brfgR4cXV1lYsXLz67IzgIggWAdr+g3S0Ybgym1juJ5sZqhjUK32pCqwisxvcUSm2VlyQJIrKyI9j3/ScBnBOsUUhZXXVRFLVLWx4MKzOKgED1owSrFdbT+FYx3/CYbxrSNEUpdeezgPePhXqeIm7uYjT4P71+n3huH/HMPKAmQAFEBFA4IMsdaQ4NXwOGJEk+GzgIghaAAqxRzLb2MzO/F+ccWns1qNq7Gf7xS4wVqFJGrfFtb4cYNkEQxE5Aa4VmLMwAZlvgZG7TmggEnprY2Bjz6eAoih4Pw1A5J1hPfaLQHeekuq1a4+HJkyc3tgX/+PfS0Lb9/NWi/e1vik+rPlg5T2W/zULrYT0niEzbHMAYRZZlOOdubZtAXv3T+itN3X7HNxpRe/nl5R5NT/PyQhN/Ap8WutOcUqBVdc3AnS1F4tUL69+YNfqdudDQiqq+KzJkIrz9rx6eUdi6e179/IQ5o0d00ov087/hex87FnB7i8YBnImspukbZgKNpxVJ7kCgk5a005J9Dc2D4U3Sosuu6BmsibZ484PsDtfuvYXSIxpBi9noMeDJcfK4swVstHrB0+AbRWw1sdU4AWscRitW+mtcX/sV7f6HZHkfT8d855mf0Wo8PbHvjfYf+eB/bxHZGRphC6U0np4Kpa1X7YQPnUDhhKwQ+qMqP5cOnAhrvT/QS/+LiEMQ+tkqv/3HKW61l8iKdd6//gbvX38TJwVK6bobQtuYhNK2V52XvJbm7t2BVjgBo2BUCsPcVbGo/kMigiAVXBxZMeA3f/8RRZnRCFs0gt3oMRSNVhrfa366jXsb6QXT8gcOGmnh0EpROCEpHY/HBl8HZEqDCDL1AjLRTtdApSqo0T6e9scaS5Ikd6fAp5ckLO39fzataXhakZeOXAlWa+aMx3paEtlT/OC5WUblgF56j366Ri9bZaO/TCe5S+kyoEAoJ1r73kwdXkKWZfcXFxeTKfBQr52ZM96+yqs1kWcxGvL6qkGz3MlZ7uQc3tVgd+MIuxtHts14pctJiw55OUTXjlUnj9tTXyCnfieBVfd/6GmF1YrAUzT8qqYmuaMQ8ErBaMXZD9b4/p4uYRgShiFxHBOG4bjw19Fhafh7t9ThcfKYgKPw/lcnOxQoqiJulKrGdXVSCjrO5/qNWz/FFfuBA8Bh4Cue5x2IoogoigjDkPF4/H84HE4cawIuoakFShGKUshKh8khK4TcCaNSKJxQOHACf42/d+b0d9XUN9C5c+dm8jw/1O12D2mtD4rIQeBQ3Q/W395XN+kHpy6s7A1LsxbX9o2txvc0RlUxnRaVnfujkqxk4/UX9+xRSgmfo2mAX7xwYN2p8ltJ4VYGuaM3cnSzkgdpSTergMPckRXuL07yhc8LnWg8XRLvPRbG3nMaFoxSvkAvL7liAy6ffn53ly97+wj6rOFKzCnbDgAAAABJRU5ErkJggg==', - 'Chat and Scribe' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFG0lEQVR42rWW3WtbZRzHuymKKCgqQ8E7L4XdCbsQxYsNRBEUFMULB8Pb4f4BbfFCL+ZktV2XZUu7NEvbbNnatUubNc3rkub9tTlJzsn7e9qmLyxN12b26+85uLDDumXr6oEvJychz+f8vr+X5+naj8vr9b4/Pz9/kuO4d7v+78vn8x0mYK/f7y/H4/FNAsPtdvfRTwf2HUYLf0DAvmAwWInFYtu1Wg1bW1totVogOAieDIVCh/YNRlENBAKBRZ7nW/V6Hdvb2wzG7m0tLy/D4XCAXuyLPYEAHCQLP6IFlBRZXRCE+4+DUbQS2e12FvWZZ4ZRZNcosvVkMrmzG2xpLYPiUlQCu3fvXlsLCwtwOp2cwWB462msvEZ5qWaz2Z21tTUG2jWyZYJesfwElfkEfS60YZubm21Vq1UW8Y7H4znaEWyxWP5eXFxsPsnG2nocfPUGfGk1FIbvEUiNt2HNZrOtRqMh2k3u/d4RbDKZjpDFXoLtYmETlZUguJIanmwf+ozfwhOdwMZGow1bX19nhUXfbYjgcDjM7A6lUqnXO+X3AEUdZqCHRAvdRanuRqiggD15Gn/ojkHnGAK9JFhKCoUCMpkMUqk8uGgVIX8Nrvky7tgymNF5d/S6wA8dozabzWeXlpa2Hth3d2MV+boDgdx5zCz8gp7xT2FzzjILQdMJuVwBXk8ZN28kManlYbudhddWQthZRsBRgtNYwPS4sD02HC+phwSVXC68tyt4bm7uY2odH7NurVFDdskMf24AVz2n0HP9M7i9ThGaTqeRSdcxeSONeWMWyVCtoyLOCibGhMaIij8LQDrVuru7D5LdkZW7BaQW9SJUbjqOM5PH2RhkQwGlUgmRcA36qRT4QEUK6Cx60cLOmEpwaDR4QQLnc654vEyVm+3Hn7e+gtLwmxgltRrYaIzHqpieFNgie5bLVIRmmJ9qQ2Uy2duuxGD+Dn8aPVePQn9HK0JpHlM+c1RAaUxoBfDPABGYgtLnGNXFLW26qVbGPhGn1iVFv1ql6XP0jH7ZcjitiEQiBEuJlbu6ukpVW4NtNvNUQD5QRdRJaXEUd1XAVoB6iJ/t6pX3HlEoB05qNJo3qacHK5XKP6w3SaxtRBkNOXCeznlN+Kts8Y4aHRYikjwbjcbPg3Q9ALLBkM/nMTXOg3OX9wXKNDYsRCVgnU73stVqjTJ7ScxqsbAMM1mE7UVwrrII4INi/kRbE74Ke6kOMKlGLifsuw0TdblcxsrKCmiHEuV1F2HTp9ifnlcUQAFDF/lrj4DJ7q+phRYIyKwWo45xPLRj0X0BG24mS7Jz8W8eAdMp4hWyO8ygNEZB0Yt3uy0Hw1TsuaB+K0V7IaaXTjCp3dpisQjaLtuqVmuYHI/DMMntCeqzFKAaign9/dF3nrRVfkd2x1hhMQmCgEQiIQ6SGV0cGpUfAWv2qaGW6TSuXI4JyoHkoU579Gs2my3EThRM1NsScVwOo1eC1I9eGG9xj4kwj9s3Ezujyujq8OVEt8TeDvAp6uE2jHLdFm0Yoni+AOUlH4LWwn9Aeh70bynkLkF+PnhR1h87ptFEX+pMk4J/pNNEQgoTxbZHdiC4PzdnaowMBdtRakcWti/JIsc6LN0R/AbZHXwYRifQFlV8k4pvxWy2jigueNanrycxO5HCiDLSUshcp/ZOlPa03eVy5WmvZrAyqZf0IctXd7fpxfP9lhODclufXDbzs1Kpf/X5aNKofyXoX3ROPty1z9e//wA5CC1mZuMAAAAASUVORK5CYII=', - 'Forum and Scribe' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAFv0lEQVR42r2VeWyTZRzHxzxi/MMEjfgXiTExRmM8EjUxJhiNsiCKIBoRDEKMCYKRYALswmwIEZUQBAIDdzC53MkOdsAGPba26/22a7u13dbt7br1envfXfv1eV4CYaFjHNNf88vb9knez/P7/r7P78n7v6K6d/1zNYJNj/2nEJlM9mx3d/eTN363ynatqu5dFyNZtaAgAPlarfYdkvVGo9FmtVpnpFKpnP7v4JTVo1PiRK1gI0vAqOn96sMHgtXX1z+k0Wg+YBimy2QyOV0uV3ZmZgY06FMul6dZr7pn2HUxxdhPoW+oOknA6nN96xffM0ylUj1OYBv1er1keHjYx3EcMpkMcoXNqYZpuiHNsCdRJd6I0sa3dSMjI0vuGqZQKJaq1eoSAhscHR2NhMNhZLNZzB0ZOAN6GBznoB4/jiM9a7G7+a26e65SIpFUB4NB3E1kyGcqoIV+shbysT9xoGMF9rd+fOy+eikQCF6z2Wza+aDpTBIOnxIMWwmx5XeUN7+PTskZELV2PsjxaL4TNJmOws5JoZmoQI/hF+xpeBfe8CTcbjcGBgbUZPMP3xdYKBTuTSQS2dzQECa8EtLPE2jVFKG04T3Ek2GQoMaj7p7p6+t7dV5IGcryO0zfLLtq3v5dj3Xbp53WzU+THb9MjKXKBTZPyEmlJ3C2fyv2X/yMwNKz1nU6Ha266I7QZt2aJVctP6rM7npMh5Sw+8VQs4cTHcavN+eSe9RmRmdXC6qvbUFl70/IFV6vl4KZOeUG8ha1D66TKNmDYP1CpGYi8EZNME7/jV7zD+iVVlbE43Eq980h0S8VQKdXIpmM54RSqdPpNC+3Uql8PSe43bT2+TbD55CN74fV04LpoBw27jLU9sPoGtqENmZDDRkAilvBcwU953SdQpPJJMh0AwGX5AS36r54oYEpQI95KxQTv0E7eRzy8T/QZKjAaX0HzhqGHBc0jvGxQBLZuwQSQ4KohKmpKZBW6cnke+R2U5WV5TfpPlE3MMvRYdyALtP3uGBQQjEdht4dgcET4Z+KqTB6xsPIZHMDU6nUTWA0GkUkEkEoFKJyZ8jFkVvuRmbFzy361VkKr9a0QE4gJm8UbDAGZySGyXAMFl8UameErMXnBdLxSqdeIBCggwSk4j23QeuYgi0Cyw4MOc8TQ7WjYzQEFal2xB+FJxZHciaBcCrBw43eCLrJejI1P9Dn84FeJhaLBeQ8q2ZBL+lXLm7Sf5SSje/jDTXmY3HZFsSA43rFk6EYfOTFHEmWfKeyCyZCCESvA2Ox2G1Av98PlmVBbrNYf3+/SywWXya5eha4Qbt8A5X3mnUHNPajUNrPockSwLWJEO0pD7L6ojT5apVEiTZrAOHI7AopzG63Z4mkAVKdQyQS1RFYQU5T0SDQUgqm2W74Eu3GdTihEqGFwK/YQhDbQ5A5wrwCkskwv6ErIwEK5KsbGxvLEPNwBMIS2DEyLN4AsChvvmhmCjZT6K1Zo96NCsaDuqEAv4FLI0HS9yDaybNSy0U1g0NT5Mp0ExhDYIUkl87HyXGU8vLrNAVbGnXL3RRaq9mOhmEOAjaMRnMApxgfKkhWDfrQagny/a1SO63neweeuVfWnGOzdqD4laMqT7hhOEAB9OzyTvYn4nBH4xjmokRu2uMgfpV5DuYtVJSKvNsOKTicHvTzsvbb+QHCG8tCknFFIGJDvPwnNb50WSf3xIKAC0WetnKJB0fUHM4Y/GgllV0lldMqpSSFBNpJev2PKYAKrQ8lIveyBQHvErj7dwrc2Evgh1UcqvQ+HtJsuW6yJtLz8yY//tL5cEjJoVjsWbkg4CKhp5yCae7p8+DAgBdHVBytjjfZSZLHiBoH5V6US7zJEpEjp5vvw+HILxI4v90tdJlvbKBU7AGVf5/Uy2dZnyddLHI3ET+8mPdfRJE89FSh0PtmkcizqlDoWlMsdhUUibmXyurx6IO++1/6Zel3OJblJAAAAABJRU5ErkJggg==' -}, - -/** * For colouring. See LDEV-5058 * CATEGORY_SYSTEM = 1; CATEGORY_COLLABORATION = 2; @@ -64,7 +24,7 @@ 'MCQ' : 3, 'Question and Answer' : 6, 'Share resources' : 4, - 'Leaderselection' : 6, + 'Leaderselection' : 2, 'Mindmap' : 6, 'Noticeboard' : 4, 'Notebook' : 6, @@ -77,12 +37,19 @@ 'Survey' : 6, 'Share taskList' : 4, 'Voting' : 6, + 'Whiteboard' : 2, 'Wiki' : 2, 'Kaltura' : 2, 'Zoom' : 2, 'Resources and Forum' : 5, 'Chat and Scribe' : 5, - 'Forum and Scribe' : 5 + 'Forum and Scribe' : 5, + + 'grouping' : 1, + 'gate' : 1, + 'branching': 1, + 'optional' : 1, + 'floating' : 1 }, ActivityDefs = { @@ -174,13 +141,16 @@ /** * Constructor for a Gate Activity. */ - GateActivity : function(id, uiid, x, y, title, description, readOnly, gateType, startTimeOffset, gateActivityCompletionBased, password) { + GateActivity : function(id, uiid, x, y, title, description, readOnly, gateType, startTimeOffset, + gateActivityCompletionBased, gateStopAtPrecedingActivity, password) { this.id = +id || null; this.uiid = +uiid || ++layout.ld.maxUIID; this.title = title; this.description = description; this.readOnly = readOnly; this.gateType = gateType || 'permission'; + this.gateStopAtPrecedingActivity = gateStopAtPrecedingActivity; + if (gateType == 'schedule') { var day = 24*60; this.offsetDay = Math.floor(startTimeOffset/day); @@ -193,6 +163,7 @@ if (gateType == 'password') { this.password = password; } + // mapping between tool output and gate states ("branches"), if applicable this.conditionsToBranches = []; this.transitions = { @@ -223,6 +194,10 @@ this.groupingType = groupingType || 'random'; this.groupDivide = groupDivide || 'groups'; this.groupCount = +groupCount || layout.conf.defaultGroupingGroupCount; + if (groups && groups.length > this.groupCount) { + // when opening a run sequence, groups created in monitoring can be more numerous then the original setting + this.groupCount = groups.length; + } this.learnerCount = +learnerCount || layout.conf.defaultGroupingLearnerCount; this.equalSizes = equalSizes || false; this.viewLearners = viewLearners || false; @@ -378,20 +353,35 @@ this.items.remove(); } - x = GeneralLib.snapToGrid(x); - y = GeneralLib.snapToGrid(y); + // make the icon more centred + x = GeneralLib.snapToGrid(x - 40) + 40; + y = GeneralLib.snapToGrid(y - 20) + 20; // create activity SVG elements - var shape = paper.circle(x, y, 20) - .addClass('svg-branching svg-branching-' + (this.isStart ? 'start' : 'end')); - - this.items = paper.g(shape); + var shape = paper.circle(x + 20, y + 20, 20) + .addClass('svg-branching svg-shadow svg-branching-' + (this.isStart ? 'start' : 'end')), + icon = ActivityLib.getActivityIcon(this.isStart ? 'branching' : 'branchingEnd'); + icon.select('svg').attr({ + 'x' : x + 5, + 'y' : y + 5, + 'width' : '30px', + 'height': '30px' + }); + + this.items = paper.g(shape, icon); + this.items.addClass('svg-activity svg-activity-branching'); if (this.readOnly && !isReadOnlyMode) { this.items.attr('filter', layout.conf.readOnlyFilter); } if (this.isStart) { - // uiid is needed in Monitoring - this.items.attr('uiid', this.branchingActivity.uiid); + // these are needed in monitoring + this.items.attr({ + 'uiid' : this.branchingActivity.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : 40, + 'data-height': 40 + }); } this.items.shape = shape; @@ -437,57 +427,61 @@ this.drawContainer(x, y, box.x2 + layout.conf.containerActivityPadding, - box.y2 + layout.conf.containerActivityPadding, - layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); + box.y2 + layout.conf.containerActivityPadding); } else { this.drawContainer(x, y, x + layout.conf.containerActivityEmptyWidth, - y + layout.conf.containerActivityEmptyHeight, - layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); + y + layout.conf.containerActivityEmptyHeight); } this.items.data('parentObject', this); + this.items.addClass('svg-activity svg-activity-floating svg-shadow'); }, /** * Draws a Gate activity */ gate : function(x, y) { + if (x == undefined || y == undefined) { x = this.items.getBBox().x; y = this.items.getBBox().y; } + + x = Math.round(x); + y = Math.round(y); if (this.items) { this.items.remove(); } x = GeneralLib.snapToGrid(x); + // make the icon more centred y = GeneralLib.snapToGrid(y); // create activity SVG elements - var shape = paper.path(Snap.format('M {x} {y} l-9 9 v16 l9 9 h16 l9 -9 v-16 l-9 -9 z', - { - 'x' : x + 9, - 'y' : y - }) - ) - .attr({ - 'stroke' : layout.colors.gateBorder, - 'stroke-width' : '0.5', - 'fill' : layout.colors.gate - }), - label = paper.text(x + 17, y + 20, LABELS.GATE_ACTIVITY_LABEL) - .attr(layout.defaultTextAttributes) - .attr('stroke', layout.colors.gateText); - - this.items = paper.g(shape, label); + var shape = ActivityLib.getActivityIcon('gate'); + shape.select('svg').attr({ + 'x' : x, + 'y' : y, + 'width' : '40px', + 'height': '40px' + }); + + this.items = paper.g(shape); + this.items.addClass('svg-activity svg-activity-gate svg-shadow'); if (this.readOnly && !isReadOnlyMode) { this.items.attr('filter', layout.conf.readOnlyFilter); } - // uiid is needed in Monitoring - this.items.attr('uiid', this.uiid); + // these are needed in monitoring + this.items.attr({ + 'uiid' : this.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : 40, + 'data-height': 40 + }); this.items.shape = shape; ActivityLib.activityHandlersInit(this); @@ -499,11 +493,11 @@ */ grouping : function(x, y) { if (x == undefined || y == undefined) { - // just redraw the activity + // if no new coordinates are given, just redraw the activity x = this.items.getBBox().x; y = this.items.getBBox().y; } - + if (this.items) { this.items.remove(); } @@ -512,28 +506,41 @@ y = GeneralLib.snapToGrid(y); // create activity SVG elements - var shape = paper.path(Snap.format('M {x} {y} h 125 v 50 h -125 z', - { - 'x' : x, - 'y' : y - }) - ) - .attr({ - 'stroke' : layout.colors.groupingBorder, - 'stroke-width' : '0.5', - 'fill' : layout.colors.grouping - }), - icon = paper.image(ActivityIcons.grouping, x + 47, y - 3, 32, 45), - label = paper.text(x + 62, y + 42, ActivityLib.shortenActivityTitle(this.title)) - .attr(layout.defaultTextAttributes); + var curve = layout.activity.borderCurve, + width = layout.activity.width, + height = layout.activity.height, + shapePath = ' M ' + (x + curve) + ' ' + y + ' h ' + (width - 2 * curve) + ' q ' + curve + ' 0 ' + curve + ' ' + curve + + ' v ' + (height - 2 * curve) + ' q 0 ' + curve + ' ' + -curve + ' ' + curve + + ' h ' + (-width + 2 * curve) + ' q ' + -curve + ' 0 ' + -curve + ' ' + -curve + + ' v ' + (-height + 2 * curve) + ' q 0 ' + -curve + ' ' + curve + ' ' + -curve, + shape = paper.path(shapePath) + .addClass('svg-tool-activity-background svg-shadow'), + shapeBorder = paper.path(shapePath) + .addClass('svg-tool-activity-border'), + // check for icon in the library + icon = ActivityLib.getActivityIcon('grouping'), + label = ActivityLib.getActivityTitle(this.title, x, y); + + icon.select('svg').attr({ + 'x' : x + 20, + 'y' : y + 15, + 'width' : '50px', + 'height': '50px' + }); - this.items = paper.g(shape, icon, label); - // uiid is needed in Monitoring + this.items = paper.g(shape, shapeBorder, label, icon); + this.items.attr({ + 'uiid' : this.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : width, + 'data-height': height + }); + + this.items.addClass('svg-activity svg-activity-grouping'); if (this.readOnly && !isReadOnlyMode) { this.items.attr('filter', layout.conf.readOnlyFilter); } - // uiid is needed in Monitoring - this.items.attr('uiid', this.uiid); this.items.shape = shape; ActivityLib.activityHandlersInit(this); @@ -558,6 +565,9 @@ this.childActivities = childActivities; } + var width = null, + height = null; + if (this.childActivities && this.childActivities.length > 0) { // draw one by one, vertically var activityY = y + layout.conf.containerActivityPadding + 10, @@ -578,14 +588,16 @@ // area containing all drawn child activities box = allElements.getBBox(); - this.drawContainer(x, y, - box.x2 + layout.conf.containerActivityPadding, - box.y2 + layout.conf.containerActivityPadding, + width = box.x2 + layout.conf.containerActivityPadding - x; + height = box.y2 + layout.conf.containerActivityPadding - y; + + this.drawContainer(x, y, x + width, y + height, layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); } else { - this.drawContainer(x, y, - x + layout.conf.containerActivityEmptyWidth, - y + layout.conf.containerActivityEmptyHeight, + width = layout.conf.containerActivityEmptyWidth; + height = layout.conf.containerActivityEmptyHeight; + + this.drawContainer(x, y, x + width, y + height, layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); } @@ -595,6 +607,15 @@ } this.items.data('parentObject', this); + this.items.addClass('svg-activity svg-activity-optional svg-shadow'); + // these are needed in monitoring + this.items.attr({ + 'uiid' : this.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : width, + 'data-height': height + }); }, @@ -612,7 +633,10 @@ x = GeneralLib.snapToGrid(x); y = GeneralLib.snapToGrid(y); - + + var width = null, + height = null; + if (this.childActivities && this.childActivities.length > 0) { // draw one by one, vertically var activityY = y + layout.conf.containerActivityPadding + 10, @@ -628,14 +652,16 @@ // area containing all drawn child activities var box = allElements.getBBox(); - this.drawContainer(x, y, - box.x2 + layout.conf.containerActivityPadding, - box.y2 + layout.conf.containerActivityPadding, + width = box.x2 + layout.conf.containerActivityPadding - x; + height = box.y2 + layout.conf.containerActivityPadding - y; + + this.drawContainer(x, y, x + width, y + height, layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); } else { - this.drawContainer(x, y, - x + layout.conf.containerActivityEmptyWidth, - y + layout.conf.containerActivityEmptyHeight, + width = layout.conf.containerActivityEmptyWidth; + height = layout.conf.containerActivityEmptyHeight; + + this.drawContainer(x, y, x + width, y + height, layout.colors.optionalActivity, layout.colors.optionalActivityBorder, 0.5); } @@ -649,6 +675,15 @@ } this.items.data('parentObject', this); + this.items.addClass('svg-activity svg-activity-parallel svg-shadow'); + // these are needed in monitoring + this.items.attr({ + 'uiid' : this.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : width, + 'data-height': height + }); }, @@ -675,40 +710,50 @@ var curve = layout.activity.borderCurve, width = layout.activity.width, height = layout.activity.height, - bannerWidth = layout.activity.bannerWidth, bannerPath = 'M ' + (x + curve) + ' ' + (y + height) + ' q ' + -curve + ' 0 ' + -curve + ' ' + -curve + ' v ' + (-height + 2 * curve) + ' q 0 ' + -curve + ' ' + curve + ' ' + -curve, + // by default the wide banner is displayed, + // but when there are learners in monitoring, the narrow one is shown instead + bannerWidePath = bannerPath + ' h ' + layout.activity.bannerWideWidth + ' v ' + height + ' z', + bannerNarrowPath = bannerPath + ' h ' + layout.activity.bannerNarrowWidth + ' v ' + height + ' z', + bannerWide = paper.path(bannerWidePath) + .addClass('svg-tool-banner-wide svg-tool-activity-category-' + layout.toolMetadata[this.learningLibraryID].activityCategoryID), + bannerNarrow = paper.path(bannerNarrowPath) + .addClass('svg-tool-banner-narrow svg-tool-activity-category-' + layout.toolMetadata[this.learningLibraryID].activityCategoryID), shapePath = bannerPath + ' h ' + (width - 2 * curve) + ' q ' + curve + ' 0 ' + curve + ' ' + curve + ' v ' + (height - 2 * curve) + ' q 0 ' + curve + ' ' + -curve + ' ' + curve + ' z', shape = paper.path(shapePath) - .addClass('svg-tool-activity-background'), + .addClass('svg-tool-activity-background ' + (this.grouping ? '' : 'svg-shadow')), shapeBorder = paper.path(shapePath) .addClass('svg-tool-activity-border' + (this.requireGrouping ? '-require-grouping' : '')), - // check for icon in the library - imageData = null, // ActivityIcons[this.learningLibraryID], - icon = imageData ? paper.image(imageData, x + 5, y + 3, 20, 20) : null, - label = paper.text(x + 30, y + 18, ActivityLib.shortenActivityTitle(this.title)) - .attr(layout.defaultTextAttributes) - .attr({ - 'id' : 'toolActivityTitle', - 'fill' : layout.colors.activityText, - 'text-anchor' : 'start' - }); + label = ActivityLib.getActivityTitle(this.title, x, y), + icon = ActivityLib.getActivityIcon(this.learningLibraryID); + + $(bannerNarrow.node).hide(); + this.items = paper.g(shape, bannerWide, bannerNarrow, shapeBorder, label); - bannerPath += ' h ' + bannerWidth + ' v ' + height + ' z'; - var banner = paper.path(bannerPath) - .addClass('svg-tool-activity-category-' + layout.toolMetadata[this.learningLibraryID].activityCategoryID); - this.items = paper.g(shape, banner, shapeBorder, label); - if (icon) { - this.items.add(icon); + icon.select('svg').attr({ + 'x' : x + 15, + 'y' : y + 20, + 'width' : '40px', + 'height': '40px' + }); + this.items.add(icon); } + if (this.readOnly && !isReadOnlyMode) { this.items.attr('filter', layout.conf.readOnlyFilter); } - // uiid is needed in Monitoring - this.items.attr('uiid', this.uiid); - this.items.attr('id' , 'toolActivity'); + // these are needed in monitoring + this.items.attr({ + 'uiid' : this.uiid, + 'data-x' : x, + 'data-y' : y, + 'data-width' : width, + 'data-height': height + }); + this.items.addClass('svg-activity svg-activity-tool'); this.items.shape = shape; if (this.grouping) { @@ -728,7 +773,8 @@ } this.items = paper.g(); - var isBranching = this.fromActivity instanceof ActivityDefs.BranchingEdgeActivity || this.toActivity instanceof ActivityDefs.BranchingEdgeActivity, + var isBranching = (this.fromActivity instanceof ActivityDefs.BranchingEdgeActivity && this.fromActivity.isStart) || + (this.toActivity instanceof ActivityDefs.BranchingEdgeActivity && !this.toActivity.isStart), points = ActivityLib.findTransitionPoints(this.fromActivity, this.toActivity), curve = layout.transition.curve, straightLineThreshold = 2 * curve + 2; @@ -937,7 +983,7 @@ activityBox.width, activityBox.height, 5, 5) - .addClass('svg-tool-activity-border'); + .addClass('svg-tool-activity-border svg-tool-activity-border-grouped svg-shadow'); activity.items.prepend(activity.items.groupingEffect); @@ -1244,7 +1290,16 @@ GeneralLib.setModified(true); return transition; }, - + + adjustTransitionPoint : function(bottomLimit, topLimit, target) { + bottomLimit = Math.round(bottomLimit); + topLimit = Math.round(topLimit); + target = Math.round(target); + // find a good point inside the grid, then make sure it is within bounds + return Math.max(bottomLimit + layout.transition.adjustStep, Math.min(topLimit - layout.transition.adjustStep, + Math.floor(target / layout.transition.adjustStep) * layout.transition.adjustStep)); + }, + /** * It is run from authoringConfirm.jsp * It closes the dialog with activity authoring @@ -1368,13 +1423,6 @@ return nestedBranching; }, - adjustTransitionPoint : function(bottomLimit, topLimit, target) { - // find a good point inside the grid, then make sure it is within bounds - return Math.max(bottomLimit + layout.transition.adjustStep, Math.min(topLimit - layout.transition.adjustStep, - Math.floor(target / layout.transition.adjustStep) * layout.transition.adjustStep + layout.snapToGrid.offset)); - }, - - /** * Calculates start, middle and end points of a line between two activities. */ @@ -1393,8 +1441,7 @@ if (direction === 'vertical') { if (fromActivityBox.cy < toActivityBox.cy) { points = { - 'startX' : ActivityLib.adjustTransitionPoint(fromActivityBox.x, fromActivityBox.x2, toActivityBox.x + toActivityBox.width / 2) - - (fromActivity.items.groupingEffect ? 0.5 * layout.conf.groupingEffectPadding : 0), + 'startX' : ActivityLib.adjustTransitionPoint(fromActivityBox.x, fromActivityBox.x2, toActivityBox.x + toActivityBox.width / 2), 'startY' : fromActivityBox.y2 + layout.transition.dotRadius, 'endY' : toActivityBox.y, 'direction' : 'down', @@ -1409,15 +1456,13 @@ 'direction' : 'up', 'arrowAngle': 0 }; - points.endX = ActivityLib.adjustTransitionPoint(toActivityBox.x, toActivityBox.x2, points.startX) - - (toActivity.items.groupingEffect ? 0.5 * layout.conf.groupingEffectPadding : 0); + points.endX = ActivityLib.adjustTransitionPoint(toActivityBox.x, toActivityBox.x2, points.startX); } } else { if (fromActivityBox.cx < toActivityBox.cx) { points = { 'startX' : fromActivityBox.x2 + layout.transition.dotRadius, - 'startY' : ActivityLib.adjustTransitionPoint(fromActivityBox.y, fromActivityBox.y2, toActivityBox.y + toActivityBox.height / 2) - - (fromActivity.items.groupingEffect ? 0.5 * layout.conf.groupingEffectPadding : 0), + 'startY' : ActivityLib.adjustTransitionPoint(fromActivityBox.y, fromActivityBox.y2, toActivityBox.y + toActivityBox.height / 2), 'endX' : toActivityBox.x, 'direction' : 'right', 'arrowAngle': 90 @@ -1432,8 +1477,7 @@ 'direction' : 'left', 'arrowAngle': 270 }; - points.endY = ActivityLib.adjustTransitionPoint(toActivityBox.y, toActivityBox.y2, points.startY) - - (toActivity.items.groupingEffect ? 0.5 * layout.conf.groupingEffectPadding : 0); + points.endY = ActivityLib.adjustTransitionPoint(toActivityBox.y, toActivityBox.y2, points.startY); } } @@ -1446,18 +1490,49 @@ return points; }, + getActivityIcon : function(activityName) { + // check for icon SVG cache in the library + var iconData = layout.toolMetadata[activityName].iconData; + if (!iconData) { + if (!layout.toolMetadata[activityName].iconPath) { + return; + } + // if SVG is not cached, get it synchronously + $.ajax({ + url : LAMS_URL + layout.toolMetadata[activityName].iconPath, + async : false, + dataType : 'text', + success : function(response) { + iconData = response; + layout.toolMetadata[activityName].iconData = iconData; + } + }); + } + + if (iconData) { + // build a SVG fragment + var fragment = Snap.parse(iconData); + return Snap(fragment.node); + } + }, + /** * Finds activity/region this shape is bound with. */ getParentObject : function(item) { - var parentObject = item.data('parentObject'); - if (!parentObject) { - var parentNode = item.parent(); - if (parentNode.type == 'g') { - parentObject = parentNode.data('parentObject'); + var parentObject = null; + + while (!parentObject) { + parentObject = item.data('parentObject'); + if (!parentObject) { + item = item.parent(); + if (!item || item.attr('id') == 'canvas') { + break; + } } } + return parentObject; }, @@ -1639,23 +1714,21 @@ * Deletes the given activity. */ removeActivity : function(activity, forceRemove) { - var coreActivity = activity.branchingActivity || this; + var coreActivity = activity.branchingActivity || activity; if (!forceRemove && activity instanceof ActivityDefs.BranchingEdgeActivity){ // user removes one of the branching edges, so remove the whole activity - if (confirm(LABELS.REMOVE_ACTIVITY_CONFIRM)){ - var otherEdge = activity.isStart ? coreActivity.end - : coreActivity.start; - ActivityLib.removeActivity(otherEdge, true); - } else { + if (!confirm(LABELS.REMOVE_ACTIVITY_CONFIRM)){ return; } + var otherEdge = activity.isStart ? coreActivity.end + : coreActivity.start; + ActivityLib.removeActivity(otherEdge, true); } if (activity instanceof ActivityDefs.FloatingActivity) { layout.floatingActivity = null; // re-enable the button, as the only possible Floating Activity is gone now - $('#floatingActivityButton').attr('disabled', null) - .css('opacity', 1); + $('.template[learningLibraryId="floating"]').slideDown(); } else { // remove the transitions // need to use slice() to copy the array as it gets modified in removeTransition() @@ -1674,11 +1747,14 @@ // find references of this activity as grouping or input $.each(layout.activities, function(){ - if (activity == coreActivity.grouping) { - coreActivity.grouping = null; + var candidate = this.branchingActivity || this; + if (candidate.grouping == coreActivity) { + candidate.grouping = null; + this.propertiesContent = null; this.draw(); - } else if (activity == coreActivity.input) { - coreActivity.input = null; + } else if (candidate.input == coreActivity) { + candidate.input = null; + this.propertiesContent = null; } }); } @@ -1700,7 +1776,23 @@ GeneralLib.setModified(true); }, + /** + * Deletes an item (activity, annotation etc.) as a result of user pressing a button on properties box + */ + removeItemWithButton : function(item) { + if ((item instanceof ActivityDefs.BranchingEdgeActivity) || confirm(LABELS.REMOVE_BUTTON_CONFIRM)) { + ActivityLib.removeSelectEffect(item); + if (item instanceof DecorationDefs.Label) { + DecorationLib.removeLabel(item); + } else if (item instanceof DecorationDefs.Region) { + DecorationLib.removeRegion(item); + } else { + ActivityLib.removeActivity(item); + } + } + }, + /** * Deselects an activity/transition/annotation */ @@ -1717,7 +1809,7 @@ // different effects for different types of objects if (object instanceof DecorationDefs.Region) { object.items.shape.attr({ - 'stroke' : layout.colors.activityBorder, + 'stroke' : 'black', 'stroke-dasharray' : null }); object.items.fitButton.attr('display','none'); @@ -1784,7 +1876,7 @@ /** * Removes the given transition. */ - removeTransition : function(transition, redraw) { + removeTransition : function(transition) { // find the transition and remove it var transitions = transition.fromActivity.transitions.from; transitions.splice(transitions.indexOf(transition), 1); @@ -1806,17 +1898,7 @@ GeneralLib.setModified(true); }, - /** - * Reduce length of activity's title so it fits in its SVG shape. - */ - shortenActivityTitle : function(title) { - if (title.length > 18) { - title = title.substring(0, 17) + '...'; - } - return title; - }, - /** * Crawles through branches setting their lengths and finding the longest one. */ @@ -1848,5 +1930,22 @@ }); branchingActivity.longestBranchLength = longestBranchLength; + }, + + getActivityTitle : function(title, x, y) { + + if (title.length > 35) { + title = title.substring(0, 35) + '...'; + } + var label = $('
').addClass('svg-activity-title-label svg-tool-activity-title-box') + .attr('xmlns', 'http://www.w3.org/1999/xhtml') + .text(title), + wrapper = $('').append(label).attr({ + 'x' : x + 75, + 'y' : y, + 'width' : layout.activity.width - 75, + 'height': layout.activity.height + }); + return Snap.parse(wrapper[0].outerHTML); } -}; +}; Index: lams_central/web/includes/javascript/authoring/authoringGeneral.js =================================================================== diff -u -rdcb81d1b2bd66f65b38ae9c167bad8d743e03ab0 -recc49cd6851b43f37ef02c2ddb85257096e2cf49 --- lams_central/web/includes/javascript/authoring/authoringGeneral.js (.../authoringGeneral.js) (revision dcb81d1b2bd66f65b38ae9c167bad8d743e03ab0) +++ lams_central/web/includes/javascript/authoring/authoringGeneral.js (.../authoringGeneral.js) (revision ecc49cd6851b43f37ef02c2ddb85257096e2cf49) @@ -8,6 +8,23 @@ */ $(document).ready(function() { GeneralInitLib.initAll(); + + // we display authoring in separate window if LAMS acts as a LTI 1.3 Tool + if (isLtiContentSelection || initRelaunchMonitorLessonID) { + window.onbeforeunload = function(e) { + if (window.opener && typeof window.opener.refreshSeqList === 'function') { + window.opener.refreshSeqList(); + } + + if (!GeneralLib.canClose()) { + e.preventDefault(); + e.returnValue = LABELS.NAVIGATE_AWAY_CONFIRM; + return LABELS.NAVIGATE_AWAY_CONFIRM; + } + + delete e['returnValue']; + } + } }); @@ -32,22 +49,22 @@ 'addBranchingStart' : null, // list of all dialogs, so they can be easily closed all at once 'dialogs' : [], - // icons for special activities + // for storing icons and other activity metadata 'toolMetadata': { - 'gate' : { - 'iconPath' : '../images/stop.gif' + 'branchingEnd' : { + 'iconPath' : 'images/svg/branchingEnd.svg' }, - 'grouping' : { - 'iconPath' : '../images/grouping.png' + 'bin' : { + 'iconPath' : 'images/svg/authoringBin.svg' } }, // graphics constants 'conf' : { - 'arrangeHorizontalSpace' : 200, - 'arrangeVerticalSpace' : 100, - 'arrangeHorizontalPadding' : 35, - 'arrangeVerticalPadding' : 50, + 'arrangeHorizontalSpace' : 240, + 'arrangeVerticalSpace' : 120, + 'arrangeHorizontalPadding' : 40, + 'arrangeVerticalPadding' : 40, 'dragStartThreshold' : 300, @@ -58,8 +75,8 @@ 'defaultGroupingGroupCount' : 2, 'defaultGroupingLearnerCount' : 1, - 'containerActivityEmptyWidth' : 50, - 'containerActivityEmptyHeight' : 70, + 'containerActivityEmptyWidth' : 200, + 'containerActivityEmptyHeight' : 100, 'containerActivityPadding' : 20, 'containerActivityChildrenPadding' : 10, 'regionEmptyWidth' : 20, @@ -80,15 +97,16 @@ 'snapToGrid' : { // snapping grid step when dragging an activity 'step' : 40, - 'padding' : 20, - 'offset' : 10 + // distance from canvas border so activities are not on edge + 'padding' : 40 }, 'activity' : { 'width' : 200, 'height' : 80, 'borderCurve' : 5, - 'bannerWidth' : 10 + 'bannerNarrowWidth' : 10, + 'bannerWideWidth' : 60 }, 'transition' : { @@ -99,8 +117,6 @@ }, 'colors' : { - 'activityBorder' : 'black', - 'activityText' : 'black', // default region colour 'annotation' : '#CCFF99', // region colours to choose from @@ -110,14 +126,6 @@ // when mouse hovers over rubbish bin 'binSelect' : 'red', - - 'gate' : 'red', - 'gateBorder' : '#801515', - 'gateText' : 'white', - 'grouping' : '#caddfb', - 'groupingBorder' : '#00007f', - 'optionalActivity' : '#caddfb', - 'optionalActivityBorder' : '#00007f', // dashed border around a selected activity 'selectEffect' : 'black', // highlight TBL activities which should be grouped @@ -175,9 +183,11 @@ * Draw boxes with Tool Activity templates in the panel on the left. */ initTemplates : function(){ + var templateContainerCell = $('#templateContainerCell'); + // store some template data in JS structures - $('.template').each(function(){ - var learningLibraryID = +$(this).attr('learningLibraryId'), + $('.template', templateContainerCell).each(function(){ + var learningLibraryID = $(this).attr('learningLibraryId'), learningLibraryTitle = $(this).attr('learningLibraryTitle'), activityCategoryID = ActivityCategories[learningLibraryTitle], parallelChildActivityDefs = null; @@ -197,10 +207,6 @@ }); } - // assign icons' data uris to their learning library IDs instead of labels - ActivityIcons[learningLibraryID] = ActivityIcons[learningLibraryTitle]; - delete ActivityIcons[learningLibraryTitle]; - $('').attr('src', ActivityIcons[learningLibraryID]).appendTo(".img-"+learningLibraryID); // register tool properties so they are later easily accessible layout.toolMetadata[learningLibraryID] = { 'iconPath' : $(this).attr('iconPath'), @@ -209,75 +215,45 @@ 'activityCategoryID' : activityCategoryID, 'parallelChildActivityDefs' : parallelChildActivityDefs }; - }); if (!isReadOnlyMode){ // store the initial window height now as on iPad the iframe grows when templates are show, // reporting incorrect window height to the first resizePaper() run layout.initWindowHeight = $(window).height(); - // create list of learning libraries for each group - var templateContainerCell = $('#templateContainerCell'), - learningLibraryGroupSelect = $('select', templateContainerCell), - allGroup = $('option', learningLibraryGroupSelect), - allTemplates = $('#templateContainerCell .templateContainer').show(); - - learningLibraryGroupSelect.change(function(){ - $('.templateContainer').hide(); - // show DIV with the selected learning libraries group - $('option:selected', this).data('templates').show(); - }); - allGroup.data('templates', allTemplates); - $.each(learningLibraryGroups, function(){ - var learningLibraries = this.learningLibraries; - if (!learningLibraries) { - return true; - } - - var templates = allTemplates.clone().appendTo(templateContainerCell); - // cloned everything, now remove ones that are not in the list - $('.template', templates).each(function(){ - var learningLibraryId = $(this).attr('learningLibraryId'), - found = false; - $.each(learningLibraries, function(){ - if (learningLibraryId == this) { - found = true; - return false; - } - }); + $('.template', templateContainerCell).each(function(){ + let learningLibraryID = $(this).attr('learningLibraryId'), + isFlowActivity = isNaN(+learningLibraryID), + activityCategoryID = layout.toolMetadata[learningLibraryID].activityCategoryID; - if (!found) { - $(this).remove(); - } - }); + $('#collapse-tool-category-' + activityCategoryID, templateContainerCell).append(this); - $('