浏览代码

Merge with 1.11.x

Julio Montoya 5 年之前
父节点
当前提交
35b95f560d
共有 100 个文件被更改,包括 4533 次插入4577 次删除
  1. 19 0
      app/Resources/public/assets/flag-icon-css/css/flag-icon.css
  2. 0 0
      app/Resources/public/assets/flag-icon-css/css/flag-icon.min.css
  3. 91 0
      app/Resources/public/assets/flag-icon-css/flags/1x1/basque.svg
  4. 68 0
      app/Resources/public/assets/flag-icon-css/flags/1x1/catalan.svg
  5. 981 0
      app/Resources/public/assets/flag-icon-css/flags/1x1/galician.svg
  6. 89 0
      app/Resources/public/assets/flag-icon-css/flags/4x3/basque.svg
  7. 68 0
      app/Resources/public/assets/flag-icon-css/flags/4x3/catalan.svg
  8. 981 0
      app/Resources/public/assets/flag-icon-css/flags/4x3/galician.svg
  9. 18 6
      app/Resources/public/css/base.css
  10. 337 2752
      app/Resources/public/css/themes/academica/svg/background.svg
  11. 145 0
      app/courses/proxy.php
  12. 二进制
      apple-touch-icon.png
  13. 1 1
      composer.json
  14. 389 81
      documentation/changelog.html
  15. 4 18
      main/admin/access_url_add_courses_to_url.php
  16. 0 5
      main/admin/access_url_add_usergroup_to_url.php
  17. 0 4
      main/admin/access_url_add_users_to_url.php
  18. 0 9
      main/admin/access_url_edit_courses_to_url.php
  19. 2 6
      main/admin/access_url_edit_usergroup_to_url.php
  20. 0 5
      main/admin/access_url_edit_users_to_url.php
  21. 2 2
      main/admin/access_urls.php
  22. 0 4
      main/admin/add_courses_to_usergroup.php
  23. 5 2
      main/admin/add_drh_to_user.php
  24. 0 2
      main/admin/add_sessions_to_usergroup.php
  25. 1 1
      main/admin/career_dashboard.php
  26. 3 3
      main/admin/configure_homepage.php
  27. 2 2
      main/admin/configure_inscription.php
  28. 1 1
      main/admin/course_add.php
  29. 1 1
      main/admin/course_edit.php
  30. 1 1
      main/admin/dashboard_add_users_to_user.php
  31. 2 2
      main/admin/email_tester.php
  32. 1 1
      main/admin/languages.php
  33. 35 13
      main/admin/settings.lib.php
  34. 6 0
      main/admin/settings.php
  35. 1 1
      main/admin/sub_language.php
  36. 1 1
      main/admin/teachers_time_by_session_report.php
  37. 4 0
      main/admin/user_edit.php
  38. 28 13
      main/admin/user_import.php
  39. 3 3
      main/admin/user_information.php
  40. 1 1
      main/admin/user_linking_requests.php
  41. 42 40
      main/admin/user_list.php
  42. 5 4
      main/admin/user_move_stats.php
  43. 1 1
      main/admin/usergroup_user_import.php
  44. 1 1
      main/auth/courses_controller.php
  45. 1 1
      main/auth/courses_list.php
  46. 1 1
      main/auth/hrm_courses.php
  47. 22 14
      main/auth/inscription.php
  48. 8 11
      main/auth/profile.php
  49. 6 6
      main/badge/assign.php
  50. 3 3
      main/badge/issued.php
  51. 3 3
      main/badge/issued_all.php
  52. 1 1
      main/course_info/about.php
  53. 6 0
      main/course_info/infocours.php
  54. 3 3
      main/cron/course_finished.php
  55. 30 16
      main/cron/import_csv.php
  56. 1 1
      main/document/download_scorm.php
  57. 2 2
      main/exercise/Annotation.php
  58. 5 3
      main/exercise/Draggable.php
  59. 20 0
      main/exercise/HotSpotDelineation.php
  60. 5 3
      main/exercise/MatchingDraggable.php
  61. 13 12
      main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php
  62. 2 2
      main/exercise/ReadingComprehension.php
  63. 0 34
      main/exercise/TestCategory.php
  64. 29 55
      main/exercise/UniqueAnswerImage.php
  65. 1 1
      main/exercise/admin.php
  66. 5 3
      main/exercise/calculated_answer.class.php
  67. 315 199
      main/exercise/exercise.class.php
  68. 5 24
      main/exercise/exercise.php
  69. 3 4
      main/exercise/exercise_admin.php
  70. 16 44
      main/exercise/exercise_reminder.php
  71. 19 33
      main/exercise/exercise_report.php
  72. 23 39
      main/exercise/exercise_result.php
  73. 12 181
      main/exercise/exercise_show.php
  74. 70 50
      main/exercise/exercise_submit.php
  75. 216 455
      main/exercise/exercise_submit_modal.php
  76. 2 2
      main/exercise/fill_blanks.class.php
  77. 2 2
      main/exercise/freeanswer.class.php
  78. 6 8
      main/exercise/global_multiple_answer.class.php
  79. 2 49
      main/exercise/hotspot.class.php
  80. 26 36
      main/exercise/hotspot_admin.inc.php
  81. 2 31
      main/exercise/hotspot_answers.as.php
  82. 8 4
      main/exercise/matching.class.php
  83. 4 7
      main/exercise/multiple_answer.class.php
  84. 5 4
      main/exercise/multiple_answer_combination.class.php
  85. 2 2
      main/exercise/multiple_answer_combination_true_false.class.php
  86. 8 7
      main/exercise/multiple_answer_true_false.class.php
  87. 2 2
      main/exercise/oral_expression.class.php
  88. 14 11
      main/exercise/overview.php
  89. 44 39
      main/exercise/question.class.php
  90. 1 1
      main/exercise/question_admin.inc.php
  91. 2 2
      main/exercise/question_create.php
  92. 15 9
      main/exercise/question_list_admin.inc.php
  93. 10 5
      main/exercise/question_pool.php
  94. 8 1
      main/exercise/result.php
  95. 79 68
      main/exercise/unique_answer.class.php
  96. 6 5
      main/exercise/unique_answer_no_option.class.php
  97. 1 1
      main/extra/myStudents.php
  98. 90 78
      main/forum/forumfunction.inc.php
  99. 6 9
      main/forum/index.php
  100. 2 3
      main/gamification/my_progress.php

+ 19 - 0
app/Resources/public/assets/flag-icon-css/css/flag-icon.css

@@ -1548,3 +1548,22 @@
 .flag-icon-un.flag-icon-squared {
   background-image: url(../flags/1x1/un.svg);
 }
+.flag-icon-basque {
+  background-image: url(../flags/4x3/basque.svg);
+}
+.flag-icon-basque.flag-icon-squared {
+  background-image: url(../flags/1x1/basque.svg);
+}
+.flag-icon-galician
+{
+  background-image: url(../flags/4x3/galician.svg);
+}
+.flag-icon-galician.flag-icon-squared {
+  background-image: url(../flags/1x1/galician.svg);
+}
+.flag-icon-catalan{
+  background-image: url(../flags/4x3/catalan.svg);
+}
+.flag-icon-catalan.flag-icon-squared {
+  background-image: url(../flags/1x1/catalan.svg);
+}

文件差异内容过多而无法显示
+ 0 - 0
app/Resources/public/assets/flag-icon-css/css/flag-icon.min.css


+ 91 - 0
app/Resources/public/assets/flag-icon-css/flags/1x1/basque.svg

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="512"
+   width="512"
+   viewBox="0 0 512 512"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="basque.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath1483">
+      <path
+         id="path1485"
+         d="M 0.58646567,-0.04947315 V 479.95053 H 640.58647 V -0.04947315 Z"
+         inkscape:connector-curvature="0"
+         style="fill:#d52b1e;stroke-width:14.81312275" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath1508">
+      <path
+         id="path1510"
+         d="M 0.58646567,-0.04947315 V 479.95053 H 640.58647 V -0.04947315 Z"
+         inkscape:connector-curvature="0"
+         style="fill:#d52b1e;stroke-width:14.81312275" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1052"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.86357951"
+     inkscape:cx="282.95101"
+     inkscape:cy="274.78667"
+     inkscape:window-x="1366"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <path
+     style="fill:#d52b1e;stroke-width:13.68377686"
+     inkscape:connector-curvature="0"
+     d="m 0.58646567,-0.04947 v 512 H 512.58647 v -512 z"
+     id="path1457" />
+  <path
+     style="stroke:#009b48;stroke-width:64.94848633"
+     inkscape:connector-curvature="0"
+     d="M -14.40796,5.4211501 661.90744,477.67985 m 0,-472.2586999 -676.3154,472.2586999"
+     id="path1459"
+     clip-path="url(#clipPath1508)"
+     transform="matrix(0.79999999,0,0,1.0666667,0.11729314,0.00330333)" />
+  <path
+     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:55.04000854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+     d="M 293.06641,-9.25 V 212.42969 H -19.414062 V 267.4707 H 293.06641 v 231.67969 h 55.04101 V 267.4707 H 660.58594 V 212.42969 H 348.10742 V -9.25 Z"
+     id="path1461"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ccccccccccccc"
+     clip-path="url(#clipPath1483)"
+     transform="matrix(0.79999999,0,0,1.0666667,0.11729314,0.00330333)" />
+</svg>

+ 68 - 0
app/Resources/public/assets/flag-icon-css/flags/1x1/catalan.svg

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="512"
+   width="512"
+   viewBox="0 0 512 512"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="catalan.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1052"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.88213297"
+     inkscape:cx="468.15183"
+     inkscape:cy="179.92249"
+     inkscape:window-x="1366"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <g
+     id="g1384"
+     transform="scale(0.63209877,0.94814815)">
+    <rect
+       id="rect1370"
+       height="540"
+       width="810"
+       x="0"
+       y="0"
+       style="fill:#fcdd09" />
+    <path
+       id="path1372"
+       d="m 0,90 h 810 m 0,120 H 0 m 0,120 h 810 m 0,120 H 0"
+       inkscape:connector-curvature="0"
+       style="stroke:#da121a;stroke-width:60" />
+  </g>
+</svg>

+ 981 - 0
app/Resources/public/assets/flag-icon-css/flags/1x1/galician.svg

@@ -0,0 +1,981 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="512"
+   width="512"
+   viewBox="0 0 512 512"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="galician.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1052"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.88213297"
+     inkscape:cx="314.54687"
+     inkscape:cy="387.86331"
+     inkscape:window-x="1366"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <g
+     id="g2848"
+     transform="translate(12.756827,7.7097363)">
+    <g
+       transform="matrix(0.85333325,0,0,1.2800971,-12.79096,-130.66021)"
+       id="g5162">
+      <rect
+         style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke-width:1.00000003pt"
+         id="rect733"
+         width="599.99994"
+         height="399.96927"
+         x="0.040048152"
+         y="96.04776" />
+      <path
+         style="font-size:12px;fill:#0099cc"
+         d="M 600.04006,437.79746 86.069986,96.048183 H 0.04 v 56.934997 l 515.89648,343.03425 h 84.10358 v -58.21997"
+         id="path556"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="matrix(1.0171546,0,0,0.87423498,-58.252242,2.1253636)"
+       id="g4979">
+      <path
+         style="font-size:12px;fill:#005bbf;fill-opacity:1"
+         d="m 296.64841,401.23465 c -60.13404,0 -58.18121,-56.57472 -58.18121,-56.57472 v -86.83278 h 116.36002 v 86.83278 c 0,0 2.03689,56.57472 -58.17881,56.57472"
+         id="path558"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.64841,401.23465 c -60.13404,0 -58.18121,-56.57472 -58.18121,-56.57472 v -86.83278 h 116.36002 v 86.83278 c 0,0 2.03689,56.57472 -58.17881,56.57472 z"
+         id="path559"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#d81126;fill-opacity:1"
+         d="m 296.13678,203.17868 c 0,0 -12.40632,-6.03575 -24.14249,2.85096 0,0 -21.11837,-3.0479 -22.67247,17.18017 -0.0625,0.81902 -0.18975,2.32736 0.18736,2.76689 0.37712,0.43954 0.75423,1.25855 0.75423,1.82058 0,0.56683 0.37712,0.88146 0.50443,1.13125 0.12489,0.25219 0.43955,0.62928 0.50201,1.69808 0.0625,1.06882 -0.12491,1.57079 0.88154,2.6396 1.00403,1.0688 1.06648,4.15033 1.06648,5.0294 0,0.87906 0.62933,3.33131 1.06888,3.8357 0.43957,0.50197 1.1938,1.75812 1.1938,2.82693 0,1.0688 0.43957,4.02304 0.24981,4.7748 -0.18735,0.75417 1.13134,1.69808 2.32753,2.07517 1.1938,0.37709 16.03095,5.21674 37.65614,4.83965 21.62759,-0.37708 29.41488,-1.52755 38.35031,-4.7772 1.38115,-0.50199 1.63336,-1.63324 1.50846,-2.26252 -0.12731,-0.62686 0,-2.63718 0.37711,-3.14157 0.37711,-0.50197 2.89201,-4.52501 2.38759,-5.27918 -0.50202,-0.75417 -0.50202,-2.3898 0,-3.01668 0.50442,-0.62928 2.07773,-3.65316 2.38759,-4.9045 0.31226,-1.25374 0.35309,-2.73086 0.92957,-3.168 0.57888,-0.43713 0.77344,-1.85419 0.88394,-2.14962 0.11288,-0.29782 0.53324,-1.22012 1.11933,-1.64044 0,0 1.09051,-5.11105 0.41794,-7.62335 -0.66775,-2.5147 -4.44129,-13.32767 -19.78046,-11.06276 0,0 -11.39988,-8.63452 -28.16343,-4.44336"
+         id="path560"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.50839722"
+         d="m 296.13678,203.17868 c 0,0 -12.40632,-6.03575 -24.14249,2.85096 0,0 -21.11837,-3.0479 -22.67247,17.18017 -0.0625,0.81902 -0.18975,2.32736 0.18736,2.76689 0.37712,0.43954 0.75423,1.25855 0.75423,1.82058 0,0.56683 0.37712,0.88146 0.50443,1.13125 0.12489,0.25219 0.43955,0.62928 0.50201,1.69808 0.0625,1.06882 -0.12491,1.57079 0.88154,2.6396 1.00403,1.0688 1.06648,4.15033 1.06648,5.0294 0,0.87906 0.62933,3.33131 1.06888,3.8357 0.43957,0.50197 1.1938,1.75812 1.1938,2.82693 0,1.0688 0.43957,4.02304 0.24981,4.7748 -0.18735,0.75417 1.13134,1.69808 2.32753,2.07517 1.1938,0.37709 16.03095,5.21674 37.65614,4.83965 21.62759,-0.37708 29.41488,-1.52755 38.35031,-4.7772 1.38115,-0.50199 1.63336,-1.63324 1.50846,-2.26252 -0.12731,-0.62686 0,-2.63718 0.37711,-3.14157 0.37711,-0.50197 2.89201,-4.52501 2.38759,-5.27918 -0.50202,-0.75417 -0.50202,-2.3898 0,-3.01668 0.50442,-0.62928 2.07773,-3.65316 2.38759,-4.9045 0.31226,-1.25374 0.35309,-2.73086 0.92957,-3.168 0.57888,-0.43713 0.77344,-1.85419 0.88394,-2.14962 0.11288,-0.29782 0.53324,-1.22012 1.11933,-1.64044 0,0 1.09051,-5.11105 0.41794,-7.62335 -0.66775,-2.5147 -4.44129,-13.32767 -19.78046,-11.06276 0,0 -11.39988,-8.63452 -28.16343,-4.44336 z"
+         id="path561"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1"
+         d="m 337.64332,240.83432 c -47.108,-14.92006 -83.4142,-0.73976 -83.4142,-0.73976 0,0 0.33627,1.64525 0.75422,2.14722 0.42035,0.50198 1.00644,1.67647 1.00644,2.55794 0,0.87906 0.0841,2.13761 0.0841,2.80772 0,0.6677 -0.51403,3.67477 2.1738,3.63875 0,0 32.74165,-12.8425 75.37713,0.6605 0,0 1.16737,-1.04719 1.21061,-2.55554 0.0408,-1.50834 0.29064,-3.10074 0.87912,-3.93897 0.58609,-0.83823 1.92641,-3.45621 1.92641,-4.57786"
+         id="path562"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#c8b100;fill-opacity:0.94117647"
+         d="m 293.96778,319.34721 h -20.45302 c 0,0 -2.01288,18.2706 13.74664,23.80438 v 1.67647 h 3.35319 v 2.17844 c 0,0 -5.78401,5.19512 -0.75663,11.14682 v 1.8446 h 0.8407 v 2.93261 h 0.91996 v 4.7748 c 0,0 -0.75423,17.05769 -17.47694,25.22866 v 1.00635 h 44.65076 v -1.00635 C 302.07212,384.76302 301.3155,367.70533 301.3155,367.70533 v -4.7748 h 0.91996 v -2.93261 h 0.8383 v -1.8446 c 5.02978,-5.9517 -0.75423,-11.14682 -0.75423,-11.14682 v -2.17844 h 3.35318 v -1.67647 c 15.75952,-5.53378 13.74664,-23.80438 13.74664,-23.80438 h -25.45397"
+         id="path563"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 293.96778,319.34721 h -20.45302 c 0,0 -2.01288,18.2706 13.74664,23.80438 v 1.67647 h 3.35319 v 2.17844 c 0,0 -5.78401,5.19512 -0.75663,11.14682 v 1.8446 h 0.8407 v 2.93261 h 0.91996 v 4.7748 c 0,0 -0.75423,17.05769 -17.47694,25.22866 v 1.00635 h 44.65076 v -1.00635 C 302.07212,384.76302 301.3155,367.70533 301.3155,367.70533 v -4.7748 h 0.91996 v -2.93261 h 0.8383 v -1.8446 c 5.02978,-5.9517 -0.75423,-11.14682 -0.75423,-11.14682 v -2.17844 h 3.35318 v -1.67647 c 15.75952,-5.53378 13.74664,-23.80438 13.74664,-23.80438 h -25.45397 z"
+         id="path564"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 286.58884,342.8994 h 19.74203 m -19.06947,1.50834 h 18.39931 m -15.04612,2.5147 h 11.56802 m -12.32465,11.43984 h 13.20378 m -12.32225,1.40506 h 11.52719 m -11.52719,2.85095 h 11.48396 m -18.52421,23.15349 h 25.52363 m -32.73203,5.90846 h 39.98367 m -41.49213,0.87906 h 43.04142"
+         id="path565"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 296.6388,318.2688 c 7.20119,0 13.04045,-5.83881 13.04045,-13.03944 0,-7.20065 -5.83926,-13.03945 -13.04045,-13.03945 -7.2012,0 -13.04045,5.8388 -13.04045,13.03945 0,7.20063 5.83925,13.03944 13.04045,13.03944"
+         id="path566"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.6388,318.2688 c 7.20119,0 13.04045,-5.83881 13.04045,-13.03944 0,-7.20065 -5.83926,-13.03945 -13.04045,-13.03945 -7.2012,0 -13.04045,5.8388 -13.04045,13.03945 0,7.20063 5.83925,13.03944 13.04045,13.03944 z"
+         id="path567"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,279.95507 h -8.13076 v -8.13255 h -7.20841 v 8.13255 h -8.13076 v 7.20543 h 8.13076 v 8.13015 h 7.20841 v -8.13015 h 8.13076 v -7.20543"
+         id="path568"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,279.95507 h -8.13076 v -8.13255 h -7.20841 v 8.13255 h -8.13076 v 7.20543 h 8.13076 v 8.13015 h 7.20841 v -8.13015 h 8.13076 v -7.20543"
+         id="path569"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,279.95507 h -8.13076 v -8.13255 h -7.2108 v 8.13255 h -8.12836 v 7.20543 h 8.12836 v 8.13015 h 7.2108 v -8.13015 h 8.13076 v -7.20543"
+         id="path570"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,279.95507 h -8.13076 v -8.13255 h -7.2108 v 8.13255 h -8.12836 v 7.20543 h 8.12836 v 8.13015 h 7.2108 v -8.13015 h 8.13076 v -7.20543"
+         id="path571"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 307.97624,269.73775 h -8.13077 v -8.13014 h -7.20839 v 8.13014 h -8.13077 v 7.20785 h 8.13077 v 8.13013 h 7.20839 v -8.13013 h 8.13077 v -7.20785"
+         id="path572"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 307.97624,269.73775 h -8.13077 v -8.13014 h -7.20839 v 8.13014 h -8.13077 v 7.20785 h 8.13077 v 8.13013 h 7.20839 v -8.13013 h 8.13077 v -7.20785"
+         id="path573"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,315.15605 h -8.13076 v -8.13014 h -7.20841 v 8.13014 h -8.13076 v 7.20784 h 8.13076 v 8.13014 h 7.20841 v -8.13014 h 8.13076 v -7.20784"
+         id="path574"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,315.15605 h -8.13076 v -8.13014 h -7.20841 v 8.13014 h -8.13076 v 7.20784 h 8.13076 v 8.13014 h 7.20841 v -8.13014 h 8.13076 v -7.20784"
+         id="path575"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,315.15605 h -8.13076 v -8.13014 h -7.2108 v 8.13014 h -8.12836 v 7.20784 h 8.12836 v 8.13014 h 7.2108 v -8.13014 h 8.13076 v -7.20784"
+         id="path576"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,315.15605 h -8.13076 v -8.13014 h -7.2108 v 8.13014 h -8.12836 v 7.20784 h 8.12836 v 8.13014 h 7.2108 v -8.13014 h 8.13076 v -7.20784"
+         id="path577"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,350.70529 h -8.13076 v -8.13254 h -7.20841 v 8.13254 h -8.13076 v 7.20785 h 8.13076 v 8.12773 h 7.20841 v -8.12773 h 8.13076 v -7.20785"
+         id="path578"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,350.70529 h -8.13076 v -8.13254 h -7.20841 v 8.13254 h -8.13076 v 7.20785 h 8.13076 v 8.12773 h 7.20841 v -8.12773 h 8.13076 v -7.20785"
+         id="path579"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,350.70529 h -8.13076 v -8.13254 h -7.2108 v 8.13254 h -8.12836 v 7.20785 h 8.12836 v 8.12773 h 7.2108 v -8.12773 h 8.13076 v -7.20785"
+         id="path580"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,350.70529 h -8.13076 v -8.13254 h -7.2108 v 8.13254 h -8.12836 v 7.20785 h 8.12836 v 8.12773 h 7.2108 v -8.12773 h 8.13076 v -7.20785"
+         id="path581"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#005bbf;fill-opacity:1"
+         d="m 296.53311,185.77274 c 4.3212,0 7.82571,-3.50184 7.82571,-7.82271 0,-4.32086 -3.50451,-7.82271 -7.82571,-7.82271 -4.32119,0 -7.82331,3.50185 -7.82331,7.82271 0,4.32087 3.50212,7.82271 7.82331,7.82271"
+         id="path582"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.53311,185.77274 c 4.3212,0 7.82571,-3.50184 7.82571,-7.82271 0,-4.32086 -3.50451,-7.82271 -7.82571,-7.82271 -4.32119,0 -7.82331,3.50185 -7.82331,7.82271 0,4.32087 3.50212,7.82271 7.82331,7.82271 z"
+         id="path583"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 303.82798,176.56659 h -6.41333 v -10.37103 h 2.45003 v -2.07517 h -2.45003 v -2.45226 h -2.07533 v 2.45226 h -2.45245 v 2.07517 h 2.45245 v 10.37103 h -6.09868 v 1.38344 h 6.09868 v 0.0625 h 2.07533 v -0.0625 h 6.41333 v -1.38344"
+         id="path584"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.50199842"
+         d="m 303.82798,176.56659 h -6.41333 v -10.37103 h 2.45003 v -2.07517 h -2.45003 v -2.45226 h -2.07533 v 2.45226 h -2.45245 v 2.07517 h 2.45245 v 10.37103 h -6.09868 v 1.38344 h 6.09868 v 0.0625 h 2.07533 v -0.0625 h 6.41333 v -1.38344"
+         id="path585"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 265.20625,195.13261 c 0,0 5.78401,-0.6701 9.1348,0.67011 0,0 -3.8408,4.36889 -3.01691,10.14046 0.42034,2.93501 1.00643,4.44335 1.84473,5.86763 0.8383,1.42668 1.75826,4.35929 1.25624,6.70585 h 1.09051 c 0,0 1.09051,-4.7772 -0.75423,-7.46003 -1.84473,-2.68042 -2.7671,-6.36961 -0.92236,-10.22452 1.84234,-3.85491 4.52537,-5.36325 4.52537,-5.36325 3.10097,1.25615 9.64162,0.0817 11.48395,-1.25854 1.84233,-1.34262 2.7647,-3.18481 -0.67015,-3.35294 -3.43486,-0.16812 -9.30295,-0.0841 -13.3263,2.93502 0,0 -2.09694,-2.43304 -12.57446,-1.25855 -10.47751,1.17448 -18.05102,5.64907 -20.36895,15.08819 -1.17217,4.77721 3.26912,14.8336 7.37654,17.26424 0,0 -0.12491,-1.63324 0.29305,-2.80772 0,0 -6.99943,-7.83712 -4.90249,-15.12903 2.09455,-7.2919 10.47752,-12.06911 19.53066,-11.81692"
+         id="path586"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 265.20625,195.13261 c 0,0 5.78401,-0.6701 9.1348,0.67011 0,0 -3.8408,4.36889 -3.01691,10.14046 0.42034,2.93501 1.00643,4.44335 1.84473,5.86763 0.8383,1.42668 1.75826,4.35929 1.25624,6.70585 h 1.09051 c 0,0 1.09051,-4.7772 -0.75423,-7.46003 -1.84473,-2.68042 -2.7671,-6.36961 -0.92236,-10.22452 1.84234,-3.85491 4.52537,-5.36325 4.52537,-5.36325 3.10097,1.25615 9.64162,0.0817 11.48395,-1.25854 1.84233,-1.34262 2.7647,-3.18481 -0.67015,-3.35294 -3.43486,-0.16812 -9.30295,-0.0841 -13.3263,2.93502 0,0 -2.09694,-2.43304 -12.57446,-1.25855 -10.47751,1.17448 -18.05102,5.64907 -20.36895,15.08819 -1.17217,4.77721 3.26912,14.8336 7.37654,17.26424 0,0 -0.12491,-1.63324 0.29305,-2.80772 0,0 -6.99943,-7.83712 -4.90249,-15.12903 2.09455,-7.2919 10.47752,-12.06911 19.53066,-11.81692 z"
+         id="path587"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 284.89783,193.68912 c 1.81111,-0.14651 3.26192,-0.46114 3.2427,-0.70853 -0.0192,-0.24259 -1.50365,-0.32425 -3.31476,-0.17774 -1.81111,0.14651 -3.26191,0.46355 -3.2427,0.70854 0.0192,0.24498 1.50365,0.32424 3.31476,0.17773"
+         id="path588"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.65331852"
+         d="m 278.30195,195.42563 c 0,0 -2.07293,1.94787 0,0 2.07532,-1.94787 6.41333,-3.26887 8.86577,-2.70204 2.45004,0.56443 -0.44197,0.87906 -1.25865,0.94151 -0.81668,0.0625 -2.45244,0.37709 -4.84003,0"
+         id="path589"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 327.73508,195.75948 c 0,0 -5.78162,-0.6677 -9.1348,0.67251 0,0 3.8432,4.3665 3.01691,10.14046 -0.41795,2.93501 -1.00404,4.44335 -1.84233,5.86763 -0.84071,1.42187 -1.76067,4.35929 -1.25866,6.70586 h -1.0905 c 0,0 -1.08811,-4.7772 0.75422,-7.46003 1.84475,-2.68282 2.76711,-6.36961 0.92237,-10.22452 -1.84233,-3.85731 -4.52536,-5.36565 -4.52536,-5.36565 -3.10099,1.25855 -9.63923,0.0841 -11.48396,-1.25615 -1.83993,-1.34261 -2.7647,-3.18481 0.67016,-3.35293 3.43726,-0.16813 9.30534,-0.0841 13.32869,2.93261 0,0 2.09455,-2.43063 12.57206,-1.25614 10.47992,1.17208 18.05102,5.64906 20.36895,15.08579 1.17458,4.7772 -3.26912,14.836 -7.37653,17.26664 0,0 0.12729,-1.63324 -0.29305,-2.80772 0,0 6.99942,-7.83712 4.90488,-15.12903 -2.09695,-7.29191 -10.47751,-12.06911 -19.53305,-11.81933"
+         id="path590"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 327.73508,195.75948 c 0,0 -5.78162,-0.6677 -9.1348,0.67251 0,0 3.8432,4.3665 3.01691,10.14046 -0.41795,2.93501 -1.00404,4.44335 -1.84233,5.86763 -0.84071,1.42187 -1.76067,4.35929 -1.25866,6.70586 h -1.0905 c 0,0 -1.08811,-4.7772 0.75422,-7.46003 1.84475,-2.68282 2.76711,-6.36961 0.92237,-10.22452 -1.84233,-3.85731 -4.52536,-5.36565 -4.52536,-5.36565 -3.10099,1.25855 -9.63923,0.0841 -11.48396,-1.25615 -1.83993,-1.34261 -2.7647,-3.18481 0.67016,-3.35293 3.43726,-0.16813 9.30534,-0.0841 13.32869,2.93261 0,0 2.09455,-2.43063 12.57206,-1.25614 10.47992,1.17208 18.05102,5.64906 20.36895,15.08579 1.17458,4.7772 -3.26912,14.836 -7.37653,17.26664 0,0 0.12729,-1.63324 -0.29305,-2.80772 0,0 6.99942,-7.83712 4.90488,-15.12903 -2.09695,-7.29191 -10.47751,-12.06911 -19.53305,-11.81933 z"
+         id="path591"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 308.04349,194.31839 c -1.8087,-0.14651 -3.26191,-0.46355 -3.2427,-0.70853 0.0216,-0.24498 1.50365,-0.32425 3.31476,-0.17773 1.81111,0.14651 3.26432,0.46355 3.2451,0.70854 -0.0216,0.24497 -1.50605,0.32424 -3.31716,0.17772"
+         id="path592"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.65331852"
+         d="m 314.63938,196.05491 c 0,0 2.07533,1.94787 0,0 -2.07293,-1.95028 -6.41093,-3.26887 -8.86338,-2.70445 -2.45244,0.56683 0.43957,0.88147 1.25625,0.94392 0.81908,0.0625 2.45244,0.37708 4.84243,0"
+         id="path593"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 291.107,189.34904 v 22.29604 c -0.25221,2.17845 2.68063,5.27919 4.77757,6.20148 0,0 4.94572,-1.67646 5.27959,-6.20148 v -23.55459 h -1.67658 v 20.36738 c -0.0817,2.09678 -1.42439,5.86763 -3.26913,6.45608 0,0 -3.603,-0.58845 -3.77113,-6.37202 v -19.86059 l -1.34032,0.6677"
+         id="path594"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 291.107,189.34904 v 22.29604 c -0.25221,2.17845 2.68063,5.27919 4.77757,6.20148 0,0 4.94572,-1.67646 5.27959,-6.20148 v -23.55459 h -1.67658 v 20.36738 c -0.0817,2.09678 -1.42439,5.86763 -3.26913,6.45608 0,0 -3.603,-0.58845 -3.77113,-6.37202 v -19.86059 l -1.34032,0.6677"
+         id="path595"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 241.77715,219.84247 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.46992 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path596"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 241.77715,219.84247 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.46992 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path597"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 240.11016,213.71304 c 1.47483,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.46992 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47232 1.1938,2.66601 2.66622,2.66601"
+         id="path598"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 240.11016,213.71304 c 1.47483,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.46992 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47232 1.1938,2.66601 2.66622,2.66601 z"
+         id="path599"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 240.9917,206.29624 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.4723 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47472 1.19379,2.66842 2.66622,2.66842"
+         id="path600"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 240.9917,206.29624 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.4723 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47472 1.19379,2.66842 2.66622,2.66842 z"
+         id="path601"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 245.13995,200.13559 c 1.47483,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.66601 2.66622,2.66601"
+         id="path602"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 245.13995,200.13559 c 1.47483,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.66601 2.66622,2.66601 z"
+         id="path603"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 250.04483,195.6418 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66842 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47471 1.1962,2.66842 2.66862,2.66842"
+         id="path604"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 250.04483,195.6418 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66842 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47471 1.1962,2.66842 2.66862,2.66842 z"
+         id="path605"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 256.36208,193.1271 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.1938,2.66842 2.66622,2.66842"
+         id="path606"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 256.36208,193.1271 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.1938,2.66842 2.66622,2.66842 z"
+         id="path607"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 262.96278,191.9334 c 1.47242,0 2.66621,-1.19611 2.66621,-2.66842 0,-1.47232 -1.19379,-2.66601 -2.66621,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842"
+         id="path608"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 262.96278,191.9334 c 1.47242,0 2.66621,-1.19611 2.66621,-2.66842 0,-1.47232 -1.19379,-2.66601 -2.66621,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842 z"
+         id="path609"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 269.25121,191.55631 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47232 1.19379,2.66842 2.66862,2.66842"
+         id="path610"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 269.25121,191.55631 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47232 1.19379,2.66842 2.66862,2.66842 z"
+         id="path611"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 274.90792,192.05829 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66601 0,-1.47472 -1.1938,-2.66842 -2.66622,-2.66842 -1.47243,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path612"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 274.90792,192.05829 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66601 0,-1.47472 -1.1938,-2.66842 -2.66622,-2.66842 -1.47243,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path613"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 291.03734,190.04557 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.46992 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path614"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 291.03734,190.04557 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.46992 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path615"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,191.42901 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path616"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,191.42901 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path617"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,211.16712 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path618"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,211.16712 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path619"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 351.32751,221.54055 c 1.47242,0 2.66621,-1.19369 2.66621,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66621,-2.66602 -1.47483,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47472 1.19379,2.66841 2.66862,2.66841"
+         id="path620"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 351.32751,221.54055 c 1.47242,0 2.66621,-1.19369 2.66621,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66621,-2.66602 -1.47483,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47472 1.19379,2.66841 2.66862,2.66841 z"
+         id="path621"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 352.70866,214.90674 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.1938,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path622"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 352.70866,214.90674 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.1938,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path623"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 351.57731,207.99432 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66841 0,-1.47231 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47471 1.1938,2.66841 2.66622,2.66841"
+         id="path624"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 351.57731,207.99432 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66841 0,-1.47231 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47471 1.1938,2.66841 2.66622,2.66841 z"
+         id="path625"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 348.68531,201.45659 c 1.47483,0 2.66862,-1.19611 2.66862,-2.66842 0,-1.46991 -1.19379,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842"
+         id="path626"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 348.68531,201.45659 c 1.47483,0 2.66862,-1.19611 2.66862,-2.66842 0,-1.46991 -1.19379,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842 z"
+         id="path627"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 343.78283,196.92916 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19619,2.66601 2.66862,2.66601"
+         id="path628"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 343.78283,196.92916 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19619,2.66601 2.66862,2.66601 z"
+         id="path629"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 337.87391,194.03738 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.1938,2.66601 2.66862,2.66601"
+         id="path630"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 337.87391,194.03738 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.1938,2.66601 2.66862,2.66601 z"
+         id="path631"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 331.14591,192.49782 c 1.47483,0 2.66863,-1.1937 2.66863,-2.66602 0,-1.4699 -1.1938,-2.666 -2.66863,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path632"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 331.14591,192.49782 c 1.47483,0 2.66863,-1.1937 2.66863,-2.66602 0,-1.4699 -1.1938,-2.666 -2.66863,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path633"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 324.98479,191.99584 c 1.47482,0 2.66861,-1.1937 2.66861,-2.66841 0,-1.46992 -1.19379,-2.66602 -2.66861,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47471 1.19379,2.66841 2.66622,2.66841"
+         id="path634"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 324.98479,191.99584 c 1.47482,0 2.66861,-1.1937 2.66861,-2.66841 0,-1.46992 -1.19379,-2.66602 -2.66861,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47471 1.19379,2.66841 2.66622,2.66841 z"
+         id="path635"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 319.40014,191.26088 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47232 -1.19379,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.666 2.66622,2.666"
+         id="path636"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 319.40014,191.26088 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47232 -1.19379,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.666 2.66622,2.666 z"
+         id="path637"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 323.00554,213.08617 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.4699 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.1938,2.66842 2.66622,2.66842"
+         id="path638"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 323.00554,213.08617 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.4699 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.1938,2.66842 2.66622,2.66842 z"
+         id="path639"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 324.38909,207.92947 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66861,1.19371 -2.66861,2.66602 0,1.47231 1.19379,2.66601 2.66861,2.66601"
+         id="path640"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 324.38909,207.92947 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66861,1.19371 -2.66861,2.66602 0,1.47231 1.19379,2.66601 2.66861,2.66601 z"
+         id="path641"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 301.97604,190.86458 c 1.47483,0 2.66863,-1.1961 2.66863,-2.66841 0,-1.47231 -1.1938,-2.66601 -2.66863,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66841 2.66622,2.66841"
+         id="path642"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 301.97604,190.86458 c 1.47483,0 2.66863,-1.1961 2.66863,-2.66841 0,-1.47231 -1.1938,-2.66601 -2.66863,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66841 2.66622,2.66841 z"
+         id="path643"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 288.92599,190.14164 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66842 0,-1.4699 -1.1938,-2.66361 -2.66862,-2.66361 -1.47243,0 -2.66622,1.19131 -2.66622,2.66361 0,1.47472 1.19379,2.66842 2.66622,2.66842"
+         id="path644"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 288.92599,190.14164 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66842 0,-1.4699 -1.1938,-2.66361 -2.66862,-2.66361 -1.47243,0 -2.66622,1.19131 -2.66622,2.66361 0,1.47472 1.19379,2.66842 2.66622,2.66842 z"
+         id="path645"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 285.78416,190.01434 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66621,1.1937 -2.66621,2.66601 0,1.47231 1.19379,2.66601 2.66621,2.66601"
+         id="path646"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 285.78416,190.01434 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66621,1.1937 -2.66621,2.66601 0,1.47231 1.19379,2.66601 2.66621,2.66601 z"
+         id="path647"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 268.84047,213.14861 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66841 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.19379,2.66841 2.66622,2.66841"
+         id="path648"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 268.84047,213.14861 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66841 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.19379,2.66841 2.66622,2.66841 z"
+         id="path649"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 268.05502,206.76699 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47232 1.19379,2.66601 2.66622,2.66601"
+         id="path650"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 268.05502,206.76699 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47232 1.19379,2.66601 2.66622,2.66601 z"
+         id="path651"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 269.94059,200.60635 c 1.47482,0 2.66861,-1.19371 2.66861,-2.66602 0,-1.47231 -1.19379,-2.66601 -2.66861,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66602 2.66622,2.66602"
+         id="path652"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 269.94059,200.60635 c 1.47482,0 2.66861,-1.19371 2.66861,-2.66602 0,-1.47231 -1.19379,-2.66601 -2.66861,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66602 2.66622,2.66602 z"
+         id="path653"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 281.66474,190.61239 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.666 2.66622,2.666"
+         id="path654"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 281.66474,190.61239 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.666 2.66622,2.666 z"
+         id="path655"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 277.23305,192.43537 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66622,1.1937 -2.66622,2.66841 0,1.47231 1.1938,2.66601 2.66622,2.66601"
+         id="path656"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 277.23305,192.43537 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66622,1.1937 -2.66622,2.66841 0,1.47231 1.1938,2.66601 2.66622,2.66601 z"
+         id="path657"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 272.99112,196.01888 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.666 -2.66622,-2.666 -1.47482,0 -2.66862,1.19369 -2.66862,2.666 0,1.47232 1.1938,2.66842 2.66862,2.66842"
+         id="path658"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 272.99112,196.01888 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.666 -2.66622,-2.666 -1.47482,0 -2.66862,1.19369 -2.66862,2.666 0,1.47232 1.1938,2.66842 2.66862,2.66842 z"
+         id="path659"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,194.44809 c 1.47243,0 2.66862,-1.1961 2.66862,-2.66842 0,-1.4699 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47232 1.19379,2.66842 2.66622,2.66842"
+         id="path660"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,194.44809 c 1.47243,0 2.66862,-1.1961 2.66862,-2.66842 0,-1.4699 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47232 1.19379,2.66842 2.66622,2.66842 z"
+         id="path661"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,199.47509 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path662"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,199.47509 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path663"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,204.88157 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.4699 -1.19619,-2.666 -2.66862,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path664"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,204.88157 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.4699 -1.19619,-2.666 -2.66862,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path665"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 305.43492,190.17287 c 1.47242,0 2.66622,-1.19611 2.66622,-2.66842 0,-1.46991 -1.1938,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19379,2.66842 2.66862,2.66842"
+         id="path666"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 305.43492,190.17287 c 1.47242,0 2.66622,-1.19611 2.66622,-2.66842 0,-1.46991 -1.1938,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19379,2.66842 2.66862,2.66842 z"
+         id="path667"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 309.08116,189.41869 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.46991 -1.1938,-2.66602 -2.66622,-2.66602 -1.47483,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.19379,2.66841 2.66862,2.66841"
+         id="path668"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 309.08116,189.41869 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.46991 -1.1938,-2.66602 -2.66622,-2.66602 -1.47483,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.19379,2.66841 2.66862,2.66841 z"
+         id="path669"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 313.19818,190.07919 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.47231 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66841 2.66622,2.66841"
+         id="path670"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 313.19818,190.07919 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.47231 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66841 2.66622,2.66841 z"
+         id="path671"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 323.50756,201.39174 c 1.47242,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47231 -1.1962,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path672"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 323.50756,201.39174 c 1.47242,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47231 -1.1962,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path673"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 317.34643,192.4666 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66621,1.1937 -2.66621,2.66841 0,1.47232 1.19379,2.66602 2.66621,2.66602"
+         id="path674"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 317.34643,192.4666 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66621,1.1937 -2.66621,2.66841 0,1.47232 1.19379,2.66602 2.66621,2.66602 z"
+         id="path675"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 321.11997,196.11255 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47471 1.1938,2.66841 2.66862,2.66841"
+         id="path676"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 321.11997,196.11255 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47471 1.1938,2.66841 2.66862,2.66841 z"
+         id="path677"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.02148,236.04991 -7.04026,3.52105 6.33648,3.98943 7.51105,-3.75404 -6.80727,-3.75644"
+         id="path678"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 296.02148,236.04991 -7.04026,3.52105 6.33648,3.98943 7.51105,-3.75404 -6.80727,-3.75644"
+         id="path679"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 280.62948,236.78967 -10.56159,1.63323 c 0,0 -0.1273,5.65868 0.37711,7.04212 l 10.8114,-1.51074 c 0,0 0.50442,-5.27918 -0.62692,-7.16461"
+         id="path680"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 280.62948,236.78967 -10.56159,1.63323 c 0,0 -0.1273,5.65868 0.37711,7.04212 l 10.8114,-1.51074 c 0,0 0.50442,-5.27918 -0.62692,-7.16461 z"
+         id="path681"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#058e6e;fill-opacity:0.94117647"
+         d="m 279.4549,238.79999 c 0,0 -6.3701,0.58604 -7.96263,1.17449 l 0.0841,3.85491 c 0,0 4.19149,-0.75418 8.04669,-1.09043 l -0.16814,-3.93897"
+         id="path682"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 279.4549,238.79999 c 0,0 -6.3701,0.58604 -7.96263,1.17449 l 0.0841,3.85491 c 0,0 4.19149,-0.75418 8.04669,-1.09043 l -0.16814,-3.93897"
+         id="path683"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 310.74334,237.09229 10.55918,1.63565 c 0,0 0.12731,5.65626 -0.37711,7.03971 l -10.81139,-1.50834 c 0,0 -0.50442,-5.28159 0.62932,-7.16702"
+         id="path684-3"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 310.74334,237.09229 10.55918,1.63565 c 0,0 0.12731,5.65626 -0.37711,7.03971 l -10.81139,-1.50834 c 0,0 -0.50442,-5.28159 0.62932,-7.16702 z"
+         id="path685"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#058e6e;fill-opacity:0.94117647"
+         d="m 311.91551,239.10501 c 0,0 6.3701,0.58605 7.96263,1.17209 l -0.0841,3.85491 c 0,0 -4.19149,-0.75416 -8.04669,-1.08802 l 0.16813,-3.93898"
+         id="path686-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 311.91551,239.10501 c 0,0 6.3701,0.58605 7.96263,1.17209 l -0.0841,3.85491 c 0,0 -4.19149,-0.75416 -8.04669,-1.08802 l 0.16813,-3.93898"
+         id="path687"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 254.22431,241.81907 c 0,0 37.04843,-13.75759 84.15883,1.16248 m -82.65037,6.75629 c 0,0 35.83541,-13.40211 80.02979,0.59566 m -79.86166,-9.01882 7.2084,2.09438 -5.02978,5.36566"
+         id="path688-7"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 256.06904,247.76836 4.10742,-3.437 -4.6935,-0.9223 c 0,0 0.63893,0.72535 0.50682,1.39066 -0.12971,0.6653 0.0384,2.38259 0.0793,2.96864"
+         id="path689"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 256.06904,247.76836 4.10742,-3.437 -4.6935,-0.9223 c 0,0 0.63893,0.72535 0.50682,1.39066 -0.12971,0.6653 0.0384,2.38259 0.0793,2.96864 z"
+         id="path690"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 337.58567,242.69813 -7.66958,1.38345 5.15469,6.03335"
+         id="path691"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 335.32299,247.97971 -2.892,-3.01907 4.14824,-0.37709 c 0,0 -1.13134,0.75417 -1.13134,1.38345 0,0.62927 0.12731,1.50834 -0.1249,2.01271"
+         id="path692"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 335.32299,247.97971 -2.892,-3.01907 4.14824,-0.37709 c 0,0 -1.13134,0.75417 -1.13134,1.38345 0,0.62927 0.12731,1.50834 -0.1249,2.01271 z"
+         id="path693"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 265.29031,241.84548 c 0.65335,0 1.18419,-0.42511 1.18419,-0.95111 0,-0.52119 -0.53084,-0.94632 -1.18419,-0.94632 -0.65574,0 -1.18658,0.42513 -1.18658,0.94632 0,0.526 0.53084,0.95111 1.18658,0.95111 z m 20.60675,-2.34897 c 0.65575,0 1.18659,-0.42512 1.18659,-0.94631 0,-0.526 -0.53084,-0.94872 -1.18659,-0.94872 -0.65334,0 -1.18418,0.42272 -1.18418,0.94872 0,0.52119 0.53084,0.94631 1.18418,0.94631 z m 0,3.35294 c 0.65575,0 1.18659,-0.42513 1.18659,-0.94872 0,-0.5236 -0.53084,-0.94631 -1.18659,-0.94631 -0.65334,0 -1.18418,0.42271 -1.18418,0.94631 0,0.52359 0.53084,0.94872 1.18418,0.94872 z m 20.28488,-3.18481 c 0.65574,0 1.18658,-0.42272 1.18658,-0.94872 0,-0.52119 -0.53084,-0.94631 -1.18658,-0.94631 -0.65334,0 -1.18418,0.42271 -1.18418,0.94631 0,0.526 0.53084,0.94872 1.18418,0.94872 z m 20.11674,3.68918 c 0.65575,0 1.18659,-0.42511 1.18659,-0.95111 0,-0.5212 -0.53084,-0.94632 -1.18659,-0.94632 -0.65334,0 -1.18418,0.42512 -1.18418,0.94632 0,0.526 0.53084,0.95111 1.18418,0.95111 z m -0.33387,2.68043 c 0.65574,0 1.18658,-0.42512 1.18658,-0.94632 0,-0.52119 -0.53084,-0.95112 -1.18658,-0.95112 -0.65575,0 -1.1866,0.42753 -1.1866,0.95112 0,0.5212 0.53085,0.94632 1.1866,0.94632 z m -19.78287,-3.01668 c 0.65574,0 1.18658,-0.42512 1.18658,-0.94871 0,-0.5212 -0.53084,-0.94632 -1.18658,-0.94632 -0.65334,0 -1.18418,0.42272 -1.18418,0.94632 0,0.52359 0.53084,0.94871 1.18418,0.94871 z m -39.8972,3.01668 c 0.65334,0 1.18419,-0.42512 1.18419,-0.94632 0,-0.52119 -0.53085,-0.95112 -1.18419,-0.95112 -0.65575,0 -1.18659,0.42753 -1.18659,0.95112 0,0.5212 0.53084,0.94632 1.18659,0.94632 z"
+         id="path694"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 253.55415,231.0061 c 0,0 0.16814,7.20785 4.86165,6.20148 4.6935,-1.00635 4.19148,-6.87398 4.52776,-7.20784 0.33388,-0.33626 0.8359,-0.33626 0.8359,-0.33626 0,0 0.67015,5.69951 5.02738,5.02941 4.35963,-0.67011 4.19149,-7.70983 3.68947,-8.88432 l 1.00644,-0.33625 c 0,0 1.67419,8.2142 6.70398,7.04212 5.02978,-1.17449 4.52776,-6.36961 4.52776,-6.36961 h 0.38672 c 0,0 1.12175,5.53137 5.14509,5.19512 4.02095,-0.33385 4.86165,-1.67647 4.35722,-7.20784 l 2.68303,-0.50198 c 0,0 -1.00643,8.04607 3.85281,7.87795 4.86405,-0.16813 5.02978,-4.02304 5.36607,-4.69314 h 0.73261 c 0,0 0.27383,5.6995 4.29718,5.6995 4.02334,0 4.85923,-4.86127 4.85923,-6.70587 l 3.92967,0.17534 c 0,0 -4.0954,7.53689 1.94082,8.54325 6.03382,1.00395 6.20196,-4.86368 6.20196,-4.86368 h 1.17217 c 0,0 -0.16813,7.5441 3.18506,7.71223 3.35078,0.16812 5.36366,-1.00636 5.69753,-6.53774 l 1.84475,0.67011 c 0,0 -1.59974,8.94195 -7.87856,7.37357 -3.35319,-0.83583 -4.35963,-4.69074 -4.19149,-5.69711 0,0 -2.34435,4.18877 -6.87212,2.84856 -4.52536,-1.34021 -4.02334,-4.52502 -4.02334,-5.53138 0,0 -2.72147,4.99817 -6.53825,3.85251 -3.35078,-1.00396 -4.69351,-2.17845 -4.69351,-4.52502 0,0 -1.67658,3.85491 -5.02978,3.68919 -3.35319,-0.16813 -5.02738,-2.18085 -5.19552,-4.02304 0,0 -0.66536,3.60272 -5.19792,3.85491 -3.01691,0.16813 -4.69351,-1.3378 -5.36367,-3.35293 0,0 -0.86712,3.65076 -5.19552,4.19117 -2.68063,0.33625 -5.36366,-1.17209 -6.03623,-3.68679 0,0 -0.66775,4.85887 -5.02738,5.53138 -4.35963,0.6701 -5.36606,-2.34658 -5.36606,-2.34658 0,0 -0.8359,3.85731 -4.35723,4.69315 -3.52133,0.83823 -5.86808,-0.6677 -6.70638,-4.18876 -0.83829,-3.52106 -0.50201,-5.0294 -0.50201,-5.0294 l 1.34031,1.84219"
+         id="path695"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 253.55415,231.0061 c 0,0 0.16814,7.20785 4.86165,6.20148 4.6935,-1.00635 4.19148,-6.87398 4.52776,-7.20784 0.33388,-0.33626 0.8359,-0.33626 0.8359,-0.33626 0,0 0.67015,5.69951 5.02738,5.02941 4.35963,-0.67011 4.19149,-7.70983 3.68947,-8.88432 l 1.00644,-0.33625 c 0,0 1.67419,8.2142 6.70398,7.04212 5.02978,-1.17449 4.52776,-6.36961 4.52776,-6.36961 h 0.38672 c 0,0 1.12175,5.53137 5.14509,5.19512 4.02095,-0.33385 4.86165,-1.67647 4.35722,-7.20784 l 2.68303,-0.50198 c 0,0 -1.00643,8.04607 3.85281,7.87795 4.86405,-0.16813 5.02978,-4.02304 5.36607,-4.69314 h 0.73261 c 0,0 0.27383,5.6995 4.29718,5.6995 4.02334,0 4.85923,-4.86127 4.85923,-6.70587 l 3.92967,0.17534 c 0,0 -4.0954,7.53689 1.94082,8.54325 6.03382,1.00395 6.20196,-4.86368 6.20196,-4.86368 h 1.17217 c 0,0 -0.16813,7.5441 3.18506,7.71223 3.35078,0.16812 5.36366,-1.00636 5.69753,-6.53774 l 1.84475,0.67011 c 0,0 -1.59974,8.94195 -7.87856,7.37357 -3.35319,-0.83583 -4.35963,-4.69074 -4.19149,-5.69711 0,0 -2.34435,4.18877 -6.87212,2.84856 -4.52536,-1.34021 -4.02334,-4.52502 -4.02334,-5.53138 0,0 -2.72147,4.99817 -6.53825,3.85251 -3.35078,-1.00396 -4.69351,-2.17845 -4.69351,-4.52502 0,0 -1.67658,3.85491 -5.02978,3.68919 -3.35319,-0.16813 -5.02738,-2.18085 -5.19552,-4.02304 0,0 -0.66536,3.60272 -5.19792,3.85491 -3.01691,0.16813 -4.69351,-1.3378 -5.36367,-3.35293 0,0 -0.86712,3.65076 -5.19552,4.19117 -2.68063,0.33625 -5.36366,-1.17209 -6.03623,-3.68679 0,0 -0.66775,4.85887 -5.02738,5.53138 -4.35963,0.6701 -5.36606,-2.34658 -5.36606,-2.34658 0,0 -0.8359,3.85731 -4.35723,4.69315 -3.52133,0.83823 -5.86808,-0.6677 -6.70638,-4.18876 -0.83829,-3.52106 -0.50201,-5.0294 -0.50201,-5.0294 l 1.34031,1.84219 z"
+         id="path696"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 263.27744,231.32314 c 0.91756,0 1.65978,-0.74216 1.65978,-1.65966 0,-0.91509 -0.74222,-1.65965 -1.65978,-1.65965 -0.91757,0 -1.65978,0.74456 -1.65978,1.65965 0,0.9175 0.74221,1.65966 1.65978,1.65966"
+         id="path697"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 263.27744,231.32314 c 0.91756,0 1.65978,-0.74216 1.65978,-1.65966 0,-0.91509 -0.74222,-1.65965 -1.65978,-1.65965 -0.91757,0 -1.65978,0.74456 -1.65978,1.65965 0,0.9175 0.74221,1.65966 1.65978,1.65966 z"
+         id="path698"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 285.12362,227.8261 c 0.91756,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74222,-1.65966 -1.65978,-1.65966 -0.91757,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74221,1.65965 1.65978,1.65965"
+         id="path699"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 285.12362,227.8261 c 0.91756,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74222,-1.65966 -1.65978,-1.65966 -0.91757,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74221,1.65965 1.65978,1.65965 z"
+         id="path700"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 307.26284,228.47459 c 0.91757,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65978,-1.65966 -0.91756,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74222,1.65965 1.65978,1.65965"
+         id="path701"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 307.26284,228.47459 c 0.91757,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65978,-1.65966 -0.91756,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74222,1.65965 1.65978,1.65965 z"
+         id="path702"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 329.23393,232.00525 c 0.91756,0 1.65977,-0.74456 1.65977,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65977,-1.65966 -0.91517,0 -1.65739,0.74217 -1.65739,1.65966 0,0.91509 0.74222,1.65965 1.65739,1.65965"
+         id="path703"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 329.23393,232.00525 c 0.91756,0 1.65977,-0.74456 1.65977,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65977,-1.65966 -0.91517,0 -1.65739,0.74217 -1.65739,1.65966 0,0.91509 0.74222,1.65965 1.65739,1.65965 z"
+         id="path704"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 295.21441,225.9767 h -1.50845 c -0.37712,1.50834 -3.58378,2.45226 -3.58378,2.45226 -0.37712,-1.19371 0.43957,-2.89179 0.43957,-2.89179 -3.70869,-0.94391 -3.70869,-2.26491 -3.70869,-2.26491 0.56447,-1.25615 3.9609,-1.44349 3.9609,-1.44349 -0.88154,-1.13125 -0.69178,-2.95423 -0.69178,-2.95423 2.26268,0.1273 4.14825,2.38741 4.14825,2.38741 0,0 -2.26268,-1.12886 -2.01047,-5.1543 0,0 1.25624,-0.06 2.01047,0.75417 0,0 0,-4.33527 1.82312,-4.83725 h 0.18735 c 1.82312,0.50198 1.82312,4.83725 1.82312,4.83725 0.75423,-0.81421 2.01047,-0.75417 2.01047,-0.75417 0.25221,4.02304 -2.01047,5.1543 -2.01047,5.1543 0,0 1.88557,-2.26011 4.14825,-2.38741 0,0 0.18976,1.82058 -0.69178,2.95423 0,0 3.39643,0.18734 3.9609,1.44349 0,0 0,1.321 -3.70869,2.26491 0,0 0.81669,1.69808 0.43957,2.89179 0,0 -3.20666,-0.94392 -3.58378,-2.45226 h -3.45648"
+         id="path705"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 295.21441,225.9767 h -1.50845 c -0.37712,1.50834 -3.58378,2.45226 -3.58378,2.45226 -0.37712,-1.19371 0.43957,-2.89179 0.43957,-2.89179 -3.70869,-0.94391 -3.70869,-2.26491 -3.70869,-2.26491 0.56447,-1.25615 3.9609,-1.44349 3.9609,-1.44349 -0.88154,-1.13125 -0.69178,-2.95423 -0.69178,-2.95423 2.26268,0.1273 4.14825,2.38741 4.14825,2.38741 0,0 -2.26268,-1.12886 -2.01047,-5.1543 0,0 1.25624,-0.06 2.01047,0.75417 0,0 0,-4.33527 1.82312,-4.83725 h 0.18735 c 1.82312,0.50198 1.82312,4.83725 1.82312,4.83725 0.75423,-0.81421 2.01047,-0.75417 2.01047,-0.75417 0.25221,4.02304 -2.01047,5.1543 -2.01047,5.1543 0,0 1.88557,-2.26011 4.14825,-2.38741 0,0 0.18976,1.82058 -0.69178,2.95423 0,0 3.39643,0.18734 3.9609,1.44349 0,0 0,1.321 -3.70869,2.26491 0,0 0.81669,1.69808 0.43957,2.89179 0,0 -3.20666,-0.94392 -3.58378,-2.45226 h -3.45648 z"
+         id="path706"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.07193,226.83415 c 1.679,0 3.03853,-1.35943 3.03853,-3.0383 0,-1.67646 -1.35953,-3.03589 -3.03853,-3.03589 -1.67659,0 -3.03612,1.35943 -3.03612,3.03589 0,1.67887 1.35953,3.0383 3.03612,3.0383"
+         id="path707"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 296.07193,226.83415 c 1.679,0 3.03853,-1.35943 3.03853,-3.0383 0,-1.67646 -1.35953,-3.03589 -3.03853,-3.03589 -1.67659,0 -3.03612,1.35943 -3.03612,3.03589 0,1.67887 1.35953,3.0383 3.03612,3.0383 z"
+         id="path708"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.07193,225.45551 c 0.91756,0 1.66219,-0.74216 1.66219,-1.65966 0,-0.91509 -0.74463,-1.65725 -1.66219,-1.65725 -0.91516,0 -1.65738,0.74216 -1.65738,1.65725 0,0.9175 0.74222,1.65966 1.65738,1.65966"
+         id="path709"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 296.07193,225.45551 c 0.91756,0 1.66219,-0.74216 1.66219,-1.65966 0,-0.91509 -0.74463,-1.65725 -1.66219,-1.65725 -0.91516,0 -1.65738,0.74216 -1.65738,1.65725 0,0.9175 0.74222,1.65966 1.65738,1.65966 z"
+         id="path710"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 319.10709,227.94379 1.47483,0.31944 c 0.0456,1.55397 2.98569,3.15118 2.98569,3.15118 0.61731,-1.08802 0.17775,-2.9182 0.17775,-2.9182 3.82398,-0.13931 4.1002,-1.42908 4.1002,-1.42908 -0.28583,-1.34982 -3.56456,-2.2505 -3.56456,-2.2505 1.09772,-0.9199 1.29949,-2.74288 1.29949,-2.74288 -2.23867,-0.35306 -4.5614,1.4603 -4.5614,1.4603 0,0 2.45243,-0.62686 3.05534,-4.61387 0,0 -1.21781,-0.32425 -2.12337,0.31222 0,0 0.91276,-4.2392 -0.76143,-5.11345 l -0.18495,-0.0408 c -1.88797,0.10809 -2.80313,4.34729 -2.80313,4.34729 -0.56448,-0.95833 -1.80631,-1.16248 -1.80631,-1.16248 -1.09531,3.87893 0.87913,5.46413 0.87913,5.46413 0,0 -1.36674,-2.61077 -3.55255,-3.21122 0,0 -0.56928,1.74131 0.0528,3.03348 0,0 -3.358,-0.5308 -4.17707,0.57884 0,0 -0.27624,1.28978 3.14902,2.99506 0,0 -1.15777,1.48673 -1.04007,2.73327 0,0 3.33397,-0.24499 4.02095,-1.64044 l 1.47242,0.31704 1.90718,0.41071"
+         id="path711"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 319.10709,227.94379 1.47483,0.31944 c 0.0456,1.55397 2.98569,3.15118 2.98569,3.15118 0.61731,-1.08802 0.17775,-2.9182 0.17775,-2.9182 3.82398,-0.13931 4.1002,-1.42908 4.1002,-1.42908 -0.28583,-1.34982 -3.56456,-2.2505 -3.56456,-2.2505 1.09772,-0.9199 1.29949,-2.74288 1.29949,-2.74288 -2.23867,-0.35306 -4.5614,1.4603 -4.5614,1.4603 0,0 2.45243,-0.62686 3.05534,-4.61387 0,0 -1.21781,-0.32425 -2.12337,0.31222 0,0 0.91276,-4.2392 -0.76143,-5.11345 l -0.18495,-0.0408 c -1.88797,0.10809 -2.80313,4.34729 -2.80313,4.34729 -0.56448,-0.95833 -1.80631,-1.16248 -1.80631,-1.16248 -1.09531,3.87893 0.87913,5.46413 0.87913,5.46413 0,0 -1.36674,-2.61077 -3.55255,-3.21122 0,0 -0.56928,1.74131 0.0528,3.03348 0,0 -3.358,-0.5308 -4.17707,0.57884 0,0 -0.27624,1.28978 3.14902,2.99506 0,0 -1.15777,1.48673 -1.04007,2.73327 0,0 3.33397,-0.24499 4.02095,-1.64044 l 1.47242,0.31704 1.90718,0.41071"
+         id="path712"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 318.08385,228.60188 c -1.63816,-0.35306 -2.68063,-1.96948 -2.32754,-3.60992 0.35309,-1.63803 1.96963,-2.68282 3.6102,-2.32736 1.64057,0.35307 2.68304,1.96949 2.32994,3.60992 -0.35549,1.63805 -1.97204,2.68284 -3.6126,2.32736"
+         id="path713"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 318.08385,228.60188 c -1.63816,-0.35306 -2.68063,-1.96948 -2.32754,-3.60992 0.35309,-1.63803 1.96963,-2.68282 3.6102,-2.32736 1.64057,0.35307 2.68304,1.96949 2.32994,3.60992 -0.35549,1.63805 -1.97204,2.68284 -3.6126,2.32736 z"
+         id="path714"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 318.37689,227.25447 c -0.89835,-0.19214 -1.46762,-1.07602 -1.27306,-1.97189 0.19216,-0.89347 1.07609,-1.46511 1.97204,-1.27056 0.89595,0.19215 1.46522,1.07841 1.27306,1.97189 -0.19456,0.89588 -1.0785,1.46511 -1.97204,1.27056"
+         id="path715"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 318.37689,227.25447 c -0.89835,-0.19214 -1.46762,-1.07602 -1.27306,-1.97189 0.19216,-0.89347 1.07609,-1.46511 1.97204,-1.27056 0.89595,0.19215 1.46522,1.07841 1.27306,1.97189 -0.19456,0.89588 -1.0785,1.46511 -1.97204,1.27056 z"
+         id="path716"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 272.26572,227.64837 -1.49645,0.19695 c -0.17534,1.54676 -3.23068,2.90379 -3.23068,2.90379 -0.53084,-1.13366 0.0553,-2.92301 0.0553,-2.92301 -3.79997,-0.44674 -3.97531,-1.75573 -3.97531,-1.75573 0.39633,-1.31859 3.7351,-1.95508 3.7351,-1.95508 -1.02085,-1.00395 -1.07369,-2.83653 -1.07369,-2.83653 2.26028,-0.17054 4.42928,1.82057 4.42928,1.82057 0,0 -2.39238,-0.82382 -2.67342,-4.84446 0,0 1.23943,-0.22817 2.09454,0.48277 0,0 -0.57167,-4.29925 1.16497,-5.03901 l 0.18736,-0.0216 c 1.87356,0.25459 2.44524,4.55624 2.44524,4.55624 0.64133,-0.90788 1.89517,-1.01356 1.89517,-1.01356 0.78065,3.95578 -1.31389,5.37286 -1.31389,5.37286 0,0 1.57091,-2.48828 3.79756,-2.911 0,0 0.42755,1.77975 -0.29545,3.01668 0,0 3.38922,-0.2618 4.11702,0.91029 0,0 0.17295,1.30899 -3.3796,2.73326 0,0 1.03525,1.57319 0.81907,2.80772 0,0 -3.30274,-0.51158 -3.87682,-1.95748 l -1.49644,0.19935 -1.92881,0.257"
+         id="path717"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 272.26572,227.64837 -1.49645,0.19695 c -0.17534,1.54676 -3.23068,2.90379 -3.23068,2.90379 -0.53084,-1.13366 0.0553,-2.92301 0.0553,-2.92301 -3.79997,-0.44674 -3.97531,-1.75573 -3.97531,-1.75573 0.39633,-1.31859 3.7351,-1.95508 3.7351,-1.95508 -1.02085,-1.00395 -1.07369,-2.83653 -1.07369,-2.83653 2.26028,-0.17054 4.42928,1.82057 4.42928,1.82057 0,0 -2.39238,-0.82382 -2.67342,-4.84446 0,0 1.23943,-0.22817 2.09454,0.48277 0,0 -0.57167,-4.29925 1.16497,-5.03901 l 0.18736,-0.0216 c 1.87356,0.25459 2.44524,4.55624 2.44524,4.55624 0.64133,-0.90788 1.89517,-1.01356 1.89517,-1.01356 0.78065,3.95578 -1.31389,5.37286 -1.31389,5.37286 0,0 1.57091,-2.48828 3.79756,-2.911 0,0 0.42755,1.77975 -0.29545,3.01668 0,0 3.38922,-0.2618 4.11702,0.91029 0,0 0.17295,1.30899 -3.3796,2.73326 0,0 1.03525,1.57319 0.81907,2.80772 0,0 -3.30274,-0.51158 -3.87682,-1.95748 l -1.49644,0.19935 -1.92881,0.257"
+         id="path718"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 273.22892,228.38572 c 1.66458,-0.22097 2.83436,-1.74852 2.61097,-3.41297 -0.22098,-1.66206 -1.74865,-2.83174 -3.41083,-2.60837 -1.66459,0.22096 -2.83196,1.74851 -2.61097,3.41057 0.22098,1.66205 1.74864,2.83174 3.41083,2.61077"
+         id="path719"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 273.22892,228.38572 c 1.66458,-0.22097 2.83436,-1.74852 2.61097,-3.41297 -0.22098,-1.66206 -1.74865,-2.83174 -3.41083,-2.60837 -1.66459,0.22096 -2.83196,1.74851 -2.61097,3.41057 0.22098,1.66205 1.74864,2.83174 3.41083,2.61077 z"
+         id="path720"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 273.04877,227.01909 c 0.90796,-0.12009 1.54689,-0.95352 1.42439,-1.86381 -0.12011,-0.90789 -0.9536,-1.54436 -1.86156,-1.42668 -0.91035,0.12249 -1.54928,0.95593 -1.42678,1.86381 0.1201,0.91029 0.95599,1.54677 1.86395,1.42668"
+         id="path721"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 273.04877,227.01909 c 0.90796,-0.12009 1.54689,-0.95352 1.42439,-1.86381 -0.12011,-0.90789 -0.9536,-1.54436 -1.86156,-1.42668 -0.91035,0.12249 -1.54928,0.95593 -1.42678,1.86381 0.1201,0.91029 0.95599,1.54677 1.86395,1.42668 z"
+         id="path722"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 340.16061,234.10444 c 0,0 -0.76142,-1.99831 -2.44283,-1.28017 -1.6814,0.71815 -1.50845,0.97994 -3.0121,0.88868 0,0 -0.58609,-1.79656 0.15372,-2.57235 0,0 -2.402,-0.89828 -2.90642,-3.00707 0,0 1.28748,-1.49393 4.33802,-0.9367 0,0 -0.0961,-1.51555 0.32186,-2.18326 0,0 3.27633,1.01357 3.29314,2.84135 0,0 -0.98242,-3.5859 0.74703,-6.18947 0,0 1.53487,0.6581 1.43639,2.29133 0,0 0.70619,-3.36014 5.24836,-2.45706 0,0 -2.46204,2.18325 -2.58454,3.1824 -0.1225,0.99916 -2.17622,2.70205 -2.21224,3.26887 -0.0312,0.56443 -0.28104,1.55638 -0.88394,2.14963 -0.6029,0.59324 -0.66295,1.59961 -0.61491,1.91425 0.0408,0.31943 -0.10329,1.69568 -0.88154,2.08957"
+         id="path723"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 340.16061,234.10444 c 0,0 -0.76142,-1.99831 -2.44283,-1.28017 -1.6814,0.71815 -1.50845,0.97994 -3.0121,0.88868 0,0 -0.58609,-1.79656 0.15372,-2.57235 0,0 -2.402,-0.89828 -2.90642,-3.00707 0,0 1.28748,-1.49393 4.33802,-0.9367 0,0 -0.0961,-1.51555 0.32186,-2.18326 0,0 3.27633,1.01357 3.29314,2.84135 0,0 -0.98242,-3.5859 0.74703,-6.18947 0,0 1.53487,0.6581 1.43639,2.29133 0,0 0.70619,-3.36014 5.24836,-2.45706 0,0 -2.46204,2.18325 -2.58454,3.1824 -0.1225,0.99916 -2.17622,2.70205 -2.21224,3.26887 -0.0312,0.56443 -0.28104,1.55638 -0.88394,2.14963 -0.6029,0.59324 -0.66295,1.59961 -0.61491,1.91425 0.0408,0.31943 -0.10329,1.69568 -0.88154,2.08957 z"
+         id="path724"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 337.70097,230.11743 c 0.32186,-1.64524 1.91679,-2.72125 3.56216,-2.39941 0.46839,0.0889 0.88634,0.28581 1.24183,0.55482 -0.0913,0.56923 -0.34588,1.33541 -0.8455,1.82778 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.0336,0.24978 -0.0553,1.14806 -0.46839,1.71729 -0.15613,-0.007 -0.31466,-0.0216 -0.4708,-0.0528 -1.64296,-0.31944 -2.71905,-1.91424 -2.40199,-3.56189"
+         id="path725"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 337.70097,230.11743 c 0.32186,-1.64524 1.91679,-2.72125 3.56216,-2.39941 0.46839,0.0889 0.88634,0.28581 1.24183,0.55482 -0.0913,0.56923 -0.34588,1.33541 -0.8455,1.82778 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.0336,0.24978 -0.0553,1.14806 -0.46839,1.71729 -0.15613,-0.007 -0.31466,-0.0216 -0.4708,-0.0528 -1.64296,-0.31944 -2.71905,-1.91424 -2.40199,-3.56189 z"
+         id="path726"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 339.05569,230.38162 c 0.17295,-0.89827 1.04487,-1.48671 1.94562,-1.31138 0.40834,0.0793 0.74703,0.30743 0.98722,0.61487 -0.0961,0.1489 -0.20417,0.29301 -0.32907,0.41551 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.007,0.0649 0.007,0.17532 -0.005,0.30502 -0.21379,0.0456 -0.44197,0.0528 -0.67017,0.007 -0.90074,-0.17533 -1.48683,-1.04479 -1.31149,-1.94548"
+         id="path727"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 339.05569,230.38162 c 0.17295,-0.89827 1.04487,-1.48671 1.94562,-1.31138 0.40834,0.0793 0.74703,0.30743 0.98722,0.61487 -0.0961,0.1489 -0.20417,0.29301 -0.32907,0.41551 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.007,0.0649 0.007,0.17532 -0.005,0.30502 -0.21379,0.0456 -0.44197,0.0528 -0.67017,0.007 -0.90074,-0.17533 -1.48683,-1.04479 -1.31149,-1.94548 z"
+         id="path728"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 252.15139,233.26861 c 0,0 0.87912,-1.94787 2.51248,-1.13126 1.63576,0.81662 1.446,1.06881 2.95687,1.06881 0,0 0.68937,-1.76053 0,-2.57715 0,0 2.45003,-0.75416 3.07936,-2.82933 0,0 -1.19379,-1.57078 -4.27556,-1.1937 0,0 0.18975,-1.51075 -0.18736,-2.20006 0,0 -3.33157,0.81661 -3.45888,2.63959 0,0 1.1962,-3.52106 -0.37711,-6.2231 0,0 -1.57091,0.56443 -1.57091,2.20007 0,0 -0.50201,-3.39617 -5.09224,-2.7669 0,0 2.32514,2.32736 2.38999,3.33132 0.0625,1.00636 2.01048,2.82934 2.01048,3.39616 0,0.56443 0.18976,1.57078 0.75422,2.20006 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.0624,0.31223 0,1.69568 0.75664,2.13761"
+         id="path729"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 252.15139,233.26861 c 0,0 0.87912,-1.94787 2.51248,-1.13126 1.63576,0.81662 1.446,1.06881 2.95687,1.06881 0,0 0.68937,-1.76053 0,-2.57715 0,0 2.45003,-0.75416 3.07936,-2.82933 0,0 -1.19379,-1.57078 -4.27556,-1.1937 0,0 0.18975,-1.51075 -0.18736,-2.20006 0,0 -3.33157,0.81661 -3.45888,2.63959 0,0 1.1962,-3.52106 -0.37711,-6.2231 0,0 -1.57091,0.56443 -1.57091,2.20007 0,0 -0.50201,-3.39617 -5.09224,-2.7669 0,0 2.32514,2.32736 2.38999,3.33132 0.0625,1.00636 2.01048,2.82934 2.01048,3.39616 0,0.56443 0.18976,1.57078 0.75422,2.20006 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.0624,0.31223 0,1.69568 0.75664,2.13761 z"
+         id="path730"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 254.84162,229.43772 c -0.22098,-1.66447 -1.74625,-2.83174 -3.41083,-2.61077 -0.4708,0.0624 -0.90076,0.23298 -1.27307,0.48035 0.0576,0.57404 0.26422,1.35223 0.73501,1.87582 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.048,0.24498 -0.0144,1.14807 0.36751,1.73891 0.15373,0.002 0.31226,0 0.47079,-0.0216 1.66218,-0.22096 2.83195,-1.74851 2.60857,-3.41057"
+         id="path731"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 254.84162,229.43772 c -0.22098,-1.66447 -1.74625,-2.83174 -3.41083,-2.61077 -0.4708,0.0624 -0.90076,0.23298 -1.27307,0.48035 0.0576,0.57404 0.26422,1.35223 0.73501,1.87582 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.048,0.24498 -0.0144,1.14807 0.36751,1.73891 0.15373,0.002 0.31226,0 0.47079,-0.0216 1.66218,-0.22096 2.83195,-1.74851 2.60857,-3.41057 z"
+         id="path732"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 253.47729,229.61785 c -0.12011,-0.90788 -0.956,-1.54677 -1.86396,-1.42667 -0.41554,0.0576 -0.76623,0.2642 -1.02324,0.55481 0.0889,0.15612 0.18495,0.30503 0.30264,0.43713 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.012,0.0624 -0.0168,0.17053 -0.0144,0.30263 0.21138,0.06 0.43957,0.0793 0.67016,0.0504 0.90795,-0.12249 1.54689,-0.95592 1.42679,-1.86621"
+         id="path733"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 253.47729,229.61785 c -0.12011,-0.90788 -0.956,-1.54677 -1.86396,-1.42667 -0.41554,0.0576 -0.76623,0.2642 -1.02324,0.55481 0.0889,0.15612 0.18495,0.30503 0.30264,0.43713 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.012,0.0624 -0.0168,0.17053 -0.0144,0.30263 0.21138,0.06 0.43957,0.0793 0.67016,0.0504 0.90795,-0.12249 1.54689,-0.95592 1.42679,-1.86621 z"
+         id="path734"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.50839722"
+         d="m 257.24122,251.62327 c 0,0 33.74808,-13.21958 76.38356,0.28342"
+         id="path735"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 338.38314,241.09612 c -47.1104,-14.92007 -84.66085,-0.83823 -84.66085,-0.83823"
+         id="path736"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 295.96865,237.79603 -3.77354,1.88542 3.39642,2.13762 4.02335,-2.01272 -3.64623,-2.01032"
+         id="path737"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 295.96865,237.79603 -3.77354,1.88542 3.39642,2.13762 4.02335,-2.01272 -3.64623,-2.01032"
+         id="path738"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>

+ 89 - 0
app/Resources/public/assets/flag-icon-css/flags/4x3/basque.svg

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="480"
+   width="640"
+   viewBox="0 0 640 480"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="basque.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath1483">
+      <path
+         id="path1485"
+         d="M 0.58646567,-0.04947315 V 479.95053 H 640.58647 V -0.04947315 Z"
+         inkscape:connector-curvature="0"
+         style="fill:#d52b1e;stroke-width:14.81312275" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath1508">
+      <path
+         id="path1510"
+         d="M 0.58646567,-0.04947315 V 479.95053 H 640.58647 V -0.04947315 Z"
+         inkscape:connector-curvature="0"
+         style="fill:#d52b1e;stroke-width:14.81312275" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="713"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.52395833"
+     inkscape:cx="282.95101"
+     inkscape:cy="274.78667"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <path
+     style="fill:#d52b1e;stroke-width:14.81312275"
+     inkscape:connector-curvature="0"
+     d="M 0.58646567,-0.04947315 V 479.95053 H 640.58647 V -0.04947315 Z"
+     id="path1457" />
+  <path
+     style="stroke:#009b48;stroke-width:64.94848633"
+     inkscape:connector-curvature="0"
+     d="M -14.40796,5.4211501 661.90744,477.67985 m 0,-472.2586999 -676.3154,472.2586999"
+     id="path1459"
+     clip-path="url(#clipPath1508)" />
+  <path
+     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:55.04000854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+     d="M 293.06641,-9.25 V 212.42969 H -19.414062 V 267.4707 H 293.06641 v 231.67969 h 55.04101 V 267.4707 H 660.58594 V 212.42969 H 348.10742 V -9.25 Z"
+     id="path1461"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ccccccccccccc"
+     clip-path="url(#clipPath1483)" />
+</svg>

+ 68 - 0
app/Resources/public/assets/flag-icon-css/flags/4x3/catalan.svg

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="480"
+   width="640"
+   viewBox="0 0 640 480"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="catalan.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="713"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.74098898"
+     inkscape:cx="468.15183"
+     inkscape:cy="276.11299"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <g
+     id="g1384"
+     transform="scale(0.79012346,0.88888889)">
+    <rect
+       id="rect1370"
+       height="540"
+       width="810"
+       x="0"
+       y="0"
+       style="fill:#fcdd09" />
+    <path
+       id="path1372"
+       d="m 0,90 h 810 m 0,120 H 0 m 0,120 h 810 m 0,120 H 0"
+       inkscape:connector-curvature="0"
+       style="stroke:#da121a;stroke-width:60" />
+  </g>
+</svg>

+ 981 - 0
app/Resources/public/assets/flag-icon-css/flags/4x3/galician.svg

@@ -0,0 +1,981 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="480"
+   width="640"
+   viewBox="0 0 640 480"
+   version="1.1"
+   id="svg690"
+   sodipodi:docname="galician.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata696">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs694" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1366"
+     inkscape:window-height="713"
+     id="namedview692"
+     showgrid="false"
+     showguides="false"
+     inkscape:zoom="0.74098898"
+     inkscape:cx="468.15183"
+     inkscape:cy="276.11299"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg690" />
+  <g
+     id="g1299"
+     transform="matrix(1.0666666,0,0,1.1999998,0,8.3210384e-5)">
+    <g
+       transform="matrix(1,0,0,1.000076,-0.04,-96.05513)"
+       id="g5162">
+      <rect
+         style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke-width:1.00000003pt"
+         id="rect733"
+         width="599.99994"
+         height="399.96927"
+         x="0.040048152"
+         y="96.04776" />
+      <path
+         style="font-size:12px;fill:#0099cc"
+         d="M 600.04006,437.79746 86.069986,96.048183 H 0.04 v 56.934997 l 515.89648,343.03425 h 84.10358 v -58.21997"
+         id="path556"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="matrix(1,0,0,1.000076,-0.04,-96.05513)"
+       id="g4979">
+      <path
+         style="font-size:12px;fill:#005bbf;fill-opacity:1"
+         d="m 296.64841,401.23465 c -60.13404,0 -58.18121,-56.57472 -58.18121,-56.57472 v -86.83278 h 116.36002 v 86.83278 c 0,0 2.03689,56.57472 -58.17881,56.57472"
+         id="path558"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.64841,401.23465 c -60.13404,0 -58.18121,-56.57472 -58.18121,-56.57472 v -86.83278 h 116.36002 v 86.83278 c 0,0 2.03689,56.57472 -58.17881,56.57472 z"
+         id="path559"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#d81126;fill-opacity:1"
+         d="m 296.13678,203.17868 c 0,0 -12.40632,-6.03575 -24.14249,2.85096 0,0 -21.11837,-3.0479 -22.67247,17.18017 -0.0625,0.81902 -0.18975,2.32736 0.18736,2.76689 0.37712,0.43954 0.75423,1.25855 0.75423,1.82058 0,0.56683 0.37712,0.88146 0.50443,1.13125 0.12489,0.25219 0.43955,0.62928 0.50201,1.69808 0.0625,1.06882 -0.12491,1.57079 0.88154,2.6396 1.00403,1.0688 1.06648,4.15033 1.06648,5.0294 0,0.87906 0.62933,3.33131 1.06888,3.8357 0.43957,0.50197 1.1938,1.75812 1.1938,2.82693 0,1.0688 0.43957,4.02304 0.24981,4.7748 -0.18735,0.75417 1.13134,1.69808 2.32753,2.07517 1.1938,0.37709 16.03095,5.21674 37.65614,4.83965 21.62759,-0.37708 29.41488,-1.52755 38.35031,-4.7772 1.38115,-0.50199 1.63336,-1.63324 1.50846,-2.26252 -0.12731,-0.62686 0,-2.63718 0.37711,-3.14157 0.37711,-0.50197 2.89201,-4.52501 2.38759,-5.27918 -0.50202,-0.75417 -0.50202,-2.3898 0,-3.01668 0.50442,-0.62928 2.07773,-3.65316 2.38759,-4.9045 0.31226,-1.25374 0.35309,-2.73086 0.92957,-3.168 0.57888,-0.43713 0.77344,-1.85419 0.88394,-2.14962 0.11288,-0.29782 0.53324,-1.22012 1.11933,-1.64044 0,0 1.09051,-5.11105 0.41794,-7.62335 -0.66775,-2.5147 -4.44129,-13.32767 -19.78046,-11.06276 0,0 -11.39988,-8.63452 -28.16343,-4.44336"
+         id="path560"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.50839722"
+         d="m 296.13678,203.17868 c 0,0 -12.40632,-6.03575 -24.14249,2.85096 0,0 -21.11837,-3.0479 -22.67247,17.18017 -0.0625,0.81902 -0.18975,2.32736 0.18736,2.76689 0.37712,0.43954 0.75423,1.25855 0.75423,1.82058 0,0.56683 0.37712,0.88146 0.50443,1.13125 0.12489,0.25219 0.43955,0.62928 0.50201,1.69808 0.0625,1.06882 -0.12491,1.57079 0.88154,2.6396 1.00403,1.0688 1.06648,4.15033 1.06648,5.0294 0,0.87906 0.62933,3.33131 1.06888,3.8357 0.43957,0.50197 1.1938,1.75812 1.1938,2.82693 0,1.0688 0.43957,4.02304 0.24981,4.7748 -0.18735,0.75417 1.13134,1.69808 2.32753,2.07517 1.1938,0.37709 16.03095,5.21674 37.65614,4.83965 21.62759,-0.37708 29.41488,-1.52755 38.35031,-4.7772 1.38115,-0.50199 1.63336,-1.63324 1.50846,-2.26252 -0.12731,-0.62686 0,-2.63718 0.37711,-3.14157 0.37711,-0.50197 2.89201,-4.52501 2.38759,-5.27918 -0.50202,-0.75417 -0.50202,-2.3898 0,-3.01668 0.50442,-0.62928 2.07773,-3.65316 2.38759,-4.9045 0.31226,-1.25374 0.35309,-2.73086 0.92957,-3.168 0.57888,-0.43713 0.77344,-1.85419 0.88394,-2.14962 0.11288,-0.29782 0.53324,-1.22012 1.11933,-1.64044 0,0 1.09051,-5.11105 0.41794,-7.62335 -0.66775,-2.5147 -4.44129,-13.32767 -19.78046,-11.06276 0,0 -11.39988,-8.63452 -28.16343,-4.44336 z"
+         id="path561"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1"
+         d="m 337.64332,240.83432 c -47.108,-14.92006 -83.4142,-0.73976 -83.4142,-0.73976 0,0 0.33627,1.64525 0.75422,2.14722 0.42035,0.50198 1.00644,1.67647 1.00644,2.55794 0,0.87906 0.0841,2.13761 0.0841,2.80772 0,0.6677 -0.51403,3.67477 2.1738,3.63875 0,0 32.74165,-12.8425 75.37713,0.6605 0,0 1.16737,-1.04719 1.21061,-2.55554 0.0408,-1.50834 0.29064,-3.10074 0.87912,-3.93897 0.58609,-0.83823 1.92641,-3.45621 1.92641,-4.57786"
+         id="path562"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#c8b100;fill-opacity:0.94117647"
+         d="m 293.96778,319.34721 h -20.45302 c 0,0 -2.01288,18.2706 13.74664,23.80438 v 1.67647 h 3.35319 v 2.17844 c 0,0 -5.78401,5.19512 -0.75663,11.14682 v 1.8446 h 0.8407 v 2.93261 h 0.91996 v 4.7748 c 0,0 -0.75423,17.05769 -17.47694,25.22866 v 1.00635 h 44.65076 v -1.00635 C 302.07212,384.76302 301.3155,367.70533 301.3155,367.70533 v -4.7748 h 0.91996 v -2.93261 h 0.8383 v -1.8446 c 5.02978,-5.9517 -0.75423,-11.14682 -0.75423,-11.14682 v -2.17844 h 3.35318 v -1.67647 c 15.75952,-5.53378 13.74664,-23.80438 13.74664,-23.80438 h -25.45397"
+         id="path563"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 293.96778,319.34721 h -20.45302 c 0,0 -2.01288,18.2706 13.74664,23.80438 v 1.67647 h 3.35319 v 2.17844 c 0,0 -5.78401,5.19512 -0.75663,11.14682 v 1.8446 h 0.8407 v 2.93261 h 0.91996 v 4.7748 c 0,0 -0.75423,17.05769 -17.47694,25.22866 v 1.00635 h 44.65076 v -1.00635 C 302.07212,384.76302 301.3155,367.70533 301.3155,367.70533 v -4.7748 h 0.91996 v -2.93261 h 0.8383 v -1.8446 c 5.02978,-5.9517 -0.75423,-11.14682 -0.75423,-11.14682 v -2.17844 h 3.35318 v -1.67647 c 15.75952,-5.53378 13.74664,-23.80438 13.74664,-23.80438 h -25.45397 z"
+         id="path564"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 286.58884,342.8994 h 19.74203 m -19.06947,1.50834 h 18.39931 m -15.04612,2.5147 h 11.56802 m -12.32465,11.43984 h 13.20378 m -12.32225,1.40506 h 11.52719 m -11.52719,2.85095 h 11.48396 m -18.52421,23.15349 h 25.52363 m -32.73203,5.90846 h 39.98367 m -41.49213,0.87906 h 43.04142"
+         id="path565"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 296.6388,318.2688 c 7.20119,0 13.04045,-5.83881 13.04045,-13.03944 0,-7.20065 -5.83926,-13.03945 -13.04045,-13.03945 -7.2012,0 -13.04045,5.8388 -13.04045,13.03945 0,7.20063 5.83925,13.03944 13.04045,13.03944"
+         id="path566"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.6388,318.2688 c 7.20119,0 13.04045,-5.83881 13.04045,-13.03944 0,-7.20065 -5.83926,-13.03945 -13.04045,-13.03945 -7.2012,0 -13.04045,5.8388 -13.04045,13.03945 0,7.20063 5.83925,13.03944 13.04045,13.03944 z"
+         id="path567"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,279.95507 h -8.13076 v -8.13255 h -7.20841 v 8.13255 h -8.13076 v 7.20543 h 8.13076 v 8.13015 h 7.20841 v -8.13015 h 8.13076 v -7.20543"
+         id="path568"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,279.95507 h -8.13076 v -8.13255 h -7.20841 v 8.13255 h -8.13076 v 7.20543 h 8.13076 v 8.13015 h 7.20841 v -8.13015 h 8.13076 v -7.20543"
+         id="path569"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,279.95507 h -8.13076 v -8.13255 h -7.2108 v 8.13255 h -8.12836 v 7.20543 h 8.12836 v 8.13015 h 7.2108 v -8.13015 h 8.13076 v -7.20543"
+         id="path570"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,279.95507 h -8.13076 v -8.13255 h -7.2108 v 8.13255 h -8.12836 v 7.20543 h 8.12836 v 8.13015 h 7.2108 v -8.13015 h 8.13076 v -7.20543"
+         id="path571"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 307.97624,269.73775 h -8.13077 v -8.13014 h -7.20839 v 8.13014 h -8.13077 v 7.20785 h 8.13077 v 8.13013 h 7.20839 v -8.13013 h 8.13077 v -7.20785"
+         id="path572"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 307.97624,269.73775 h -8.13077 v -8.13014 h -7.20839 v 8.13014 h -8.13077 v 7.20785 h 8.13077 v 8.13013 h 7.20839 v -8.13013 h 8.13077 v -7.20785"
+         id="path573"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,315.15605 h -8.13076 v -8.13014 h -7.20841 v 8.13014 h -8.13076 v 7.20784 h 8.13076 v 8.13014 h 7.20841 v -8.13014 h 8.13076 v -7.20784"
+         id="path574"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,315.15605 h -8.13076 v -8.13014 h -7.20841 v 8.13014 h -8.13076 v 7.20784 h 8.13076 v 8.13014 h 7.20841 v -8.13014 h 8.13076 v -7.20784"
+         id="path575"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,315.15605 h -8.13076 v -8.13014 h -7.2108 v 8.13014 h -8.12836 v 7.20784 h 8.12836 v 8.13014 h 7.2108 v -8.13014 h 8.13076 v -7.20784"
+         id="path576"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,315.15605 h -8.13076 v -8.13014 h -7.2108 v 8.13014 h -8.12836 v 7.20784 h 8.12836 v 8.13014 h 7.2108 v -8.13014 h 8.13076 v -7.20784"
+         id="path577"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 266.29435,350.70529 h -8.13076 v -8.13254 h -7.20841 v 8.13254 h -8.13076 v 7.20785 h 8.13076 v 8.12773 h 7.20841 v -8.12773 h 8.13076 v -7.20785"
+         id="path578"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 266.29435,350.70529 h -8.13076 v -8.13254 h -7.20841 v 8.13254 h -8.13076 v 7.20785 h 8.13076 v 8.12773 h 7.20841 v -8.12773 h 8.13076 v -7.20785"
+         id="path579"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#cccccc;fill-opacity:1"
+         d="m 350.79906,350.70529 h -8.13076 v -8.13254 h -7.2108 v 8.13254 h -8.12836 v 7.20785 h 8.12836 v 8.12773 h 7.2108 v -8.12773 h 8.13076 v -7.20785"
+         id="path580"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 350.79906,350.70529 h -8.13076 v -8.13254 h -7.2108 v 8.13254 h -8.12836 v 7.20785 h 8.12836 v 8.12773 h 7.2108 v -8.12773 h 8.13076 v -7.20785"
+         id="path581"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#005bbf;fill-opacity:1"
+         d="m 296.53311,185.77274 c 4.3212,0 7.82571,-3.50184 7.82571,-7.82271 0,-4.32086 -3.50451,-7.82271 -7.82571,-7.82271 -4.32119,0 -7.82331,3.50185 -7.82331,7.82271 0,4.32087 3.50212,7.82271 7.82331,7.82271"
+         id="path582"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.53311,185.77274 c 4.3212,0 7.82571,-3.50184 7.82571,-7.82271 0,-4.32086 -3.50451,-7.82271 -7.82571,-7.82271 -4.32119,0 -7.82331,3.50185 -7.82331,7.82271 0,4.32087 3.50212,7.82271 7.82331,7.82271 z"
+         id="path583"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 303.82798,176.56659 h -6.41333 v -10.37103 h 2.45003 v -2.07517 h -2.45003 v -2.45226 h -2.07533 v 2.45226 h -2.45245 v 2.07517 h 2.45245 v 10.37103 h -6.09868 v 1.38344 h 6.09868 v 0.0625 h 2.07533 v -0.0625 h 6.41333 v -1.38344"
+         id="path584"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.50199842"
+         d="m 303.82798,176.56659 h -6.41333 v -10.37103 h 2.45003 v -2.07517 h -2.45003 v -2.45226 h -2.07533 v 2.45226 h -2.45245 v 2.07517 h 2.45245 v 10.37103 h -6.09868 v 1.38344 h 6.09868 v 0.0625 h 2.07533 v -0.0625 h 6.41333 v -1.38344"
+         id="path585"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 265.20625,195.13261 c 0,0 5.78401,-0.6701 9.1348,0.67011 0,0 -3.8408,4.36889 -3.01691,10.14046 0.42034,2.93501 1.00643,4.44335 1.84473,5.86763 0.8383,1.42668 1.75826,4.35929 1.25624,6.70585 h 1.09051 c 0,0 1.09051,-4.7772 -0.75423,-7.46003 -1.84473,-2.68042 -2.7671,-6.36961 -0.92236,-10.22452 1.84234,-3.85491 4.52537,-5.36325 4.52537,-5.36325 3.10097,1.25615 9.64162,0.0817 11.48395,-1.25854 1.84233,-1.34262 2.7647,-3.18481 -0.67015,-3.35294 -3.43486,-0.16812 -9.30295,-0.0841 -13.3263,2.93502 0,0 -2.09694,-2.43304 -12.57446,-1.25855 -10.47751,1.17448 -18.05102,5.64907 -20.36895,15.08819 -1.17217,4.77721 3.26912,14.8336 7.37654,17.26424 0,0 -0.12491,-1.63324 0.29305,-2.80772 0,0 -6.99943,-7.83712 -4.90249,-15.12903 2.09455,-7.2919 10.47752,-12.06911 19.53066,-11.81692"
+         id="path586"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 265.20625,195.13261 c 0,0 5.78401,-0.6701 9.1348,0.67011 0,0 -3.8408,4.36889 -3.01691,10.14046 0.42034,2.93501 1.00643,4.44335 1.84473,5.86763 0.8383,1.42668 1.75826,4.35929 1.25624,6.70585 h 1.09051 c 0,0 1.09051,-4.7772 -0.75423,-7.46003 -1.84473,-2.68042 -2.7671,-6.36961 -0.92236,-10.22452 1.84234,-3.85491 4.52537,-5.36325 4.52537,-5.36325 3.10097,1.25615 9.64162,0.0817 11.48395,-1.25854 1.84233,-1.34262 2.7647,-3.18481 -0.67015,-3.35294 -3.43486,-0.16812 -9.30295,-0.0841 -13.3263,2.93502 0,0 -2.09694,-2.43304 -12.57446,-1.25855 -10.47751,1.17448 -18.05102,5.64907 -20.36895,15.08819 -1.17217,4.77721 3.26912,14.8336 7.37654,17.26424 0,0 -0.12491,-1.63324 0.29305,-2.80772 0,0 -6.99943,-7.83712 -4.90249,-15.12903 2.09455,-7.2919 10.47752,-12.06911 19.53066,-11.81692 z"
+         id="path587"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 284.89783,193.68912 c 1.81111,-0.14651 3.26192,-0.46114 3.2427,-0.70853 -0.0192,-0.24259 -1.50365,-0.32425 -3.31476,-0.17774 -1.81111,0.14651 -3.26191,0.46355 -3.2427,0.70854 0.0192,0.24498 1.50365,0.32424 3.31476,0.17773"
+         id="path588"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.65331852"
+         d="m 278.30195,195.42563 c 0,0 -2.07293,1.94787 0,0 2.07532,-1.94787 6.41333,-3.26887 8.86577,-2.70204 2.45004,0.56443 -0.44197,0.87906 -1.25865,0.94151 -0.81668,0.0625 -2.45244,0.37709 -4.84003,0"
+         id="path589"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 327.73508,195.75948 c 0,0 -5.78162,-0.6677 -9.1348,0.67251 0,0 3.8432,4.3665 3.01691,10.14046 -0.41795,2.93501 -1.00404,4.44335 -1.84233,5.86763 -0.84071,1.42187 -1.76067,4.35929 -1.25866,6.70586 h -1.0905 c 0,0 -1.08811,-4.7772 0.75422,-7.46003 1.84475,-2.68282 2.76711,-6.36961 0.92237,-10.22452 -1.84233,-3.85731 -4.52536,-5.36565 -4.52536,-5.36565 -3.10099,1.25855 -9.63923,0.0841 -11.48396,-1.25615 -1.83993,-1.34261 -2.7647,-3.18481 0.67016,-3.35293 3.43726,-0.16813 9.30534,-0.0841 13.32869,2.93261 0,0 2.09455,-2.43063 12.57206,-1.25614 10.47992,1.17208 18.05102,5.64906 20.36895,15.08579 1.17458,4.7772 -3.26912,14.836 -7.37653,17.26664 0,0 0.12729,-1.63324 -0.29305,-2.80772 0,0 6.99942,-7.83712 4.90488,-15.12903 -2.09695,-7.29191 -10.47751,-12.06911 -19.53305,-11.81933"
+         id="path590"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 327.73508,195.75948 c 0,0 -5.78162,-0.6677 -9.1348,0.67251 0,0 3.8432,4.3665 3.01691,10.14046 -0.41795,2.93501 -1.00404,4.44335 -1.84233,5.86763 -0.84071,1.42187 -1.76067,4.35929 -1.25866,6.70586 h -1.0905 c 0,0 -1.08811,-4.7772 0.75422,-7.46003 1.84475,-2.68282 2.76711,-6.36961 0.92237,-10.22452 -1.84233,-3.85731 -4.52536,-5.36565 -4.52536,-5.36565 -3.10099,1.25855 -9.63923,0.0841 -11.48396,-1.25615 -1.83993,-1.34261 -2.7647,-3.18481 0.67016,-3.35293 3.43726,-0.16813 9.30534,-0.0841 13.32869,2.93261 0,0 2.09455,-2.43063 12.57206,-1.25614 10.47992,1.17208 18.05102,5.64906 20.36895,15.08579 1.17458,4.7772 -3.26912,14.836 -7.37653,17.26664 0,0 0.12729,-1.63324 -0.29305,-2.80772 0,0 6.99942,-7.83712 4.90488,-15.12903 -2.09695,-7.29191 -10.47751,-12.06911 -19.53305,-11.81933 z"
+         id="path591"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 308.04349,194.31839 c -1.8087,-0.14651 -3.26191,-0.46355 -3.2427,-0.70853 0.0216,-0.24498 1.50365,-0.32425 3.31476,-0.17773 1.81111,0.14651 3.26432,0.46355 3.2451,0.70854 -0.0216,0.24497 -1.50605,0.32424 -3.31716,0.17772"
+         id="path592"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.65331852"
+         d="m 314.63938,196.05491 c 0,0 2.07533,1.94787 0,0 -2.07293,-1.95028 -6.41093,-3.26887 -8.86338,-2.70445 -2.45244,0.56683 0.43957,0.88147 1.25625,0.94392 0.81908,0.0625 2.45244,0.37708 4.84243,0"
+         id="path593"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 291.107,189.34904 v 22.29604 c -0.25221,2.17845 2.68063,5.27919 4.77757,6.20148 0,0 4.94572,-1.67646 5.27959,-6.20148 v -23.55459 h -1.67658 v 20.36738 c -0.0817,2.09678 -1.42439,5.86763 -3.26913,6.45608 0,0 -3.603,-0.58845 -3.77113,-6.37202 v -19.86059 l -1.34032,0.6677"
+         id="path594"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 291.107,189.34904 v 22.29604 c -0.25221,2.17845 2.68063,5.27919 4.77757,6.20148 0,0 4.94572,-1.67646 5.27959,-6.20148 v -23.55459 h -1.67658 v 20.36738 c -0.0817,2.09678 -1.42439,5.86763 -3.26913,6.45608 0,0 -3.603,-0.58845 -3.77113,-6.37202 v -19.86059 l -1.34032,0.6677"
+         id="path595"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 241.77715,219.84247 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.46992 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path596"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 241.77715,219.84247 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.46992 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path597"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 240.11016,213.71304 c 1.47483,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.46992 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47232 1.1938,2.66601 2.66622,2.66601"
+         id="path598"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 240.11016,213.71304 c 1.47483,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.46992 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47232 1.1938,2.66601 2.66622,2.66601 z"
+         id="path599"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 240.9917,206.29624 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.4723 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47472 1.19379,2.66842 2.66622,2.66842"
+         id="path600"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 240.9917,206.29624 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.4723 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47472 1.19379,2.66842 2.66622,2.66842 z"
+         id="path601"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 245.13995,200.13559 c 1.47483,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.66601 2.66622,2.66601"
+         id="path602"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 245.13995,200.13559 c 1.47483,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.66601 2.66622,2.66601 z"
+         id="path603"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 250.04483,195.6418 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66842 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47471 1.1962,2.66842 2.66862,2.66842"
+         id="path604"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 250.04483,195.6418 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66842 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47471 1.1962,2.66842 2.66862,2.66842 z"
+         id="path605"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 256.36208,193.1271 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.1938,2.66842 2.66622,2.66842"
+         id="path606"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 256.36208,193.1271 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.1938,2.66842 2.66622,2.66842 z"
+         id="path607"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 262.96278,191.9334 c 1.47242,0 2.66621,-1.19611 2.66621,-2.66842 0,-1.47232 -1.19379,-2.66601 -2.66621,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842"
+         id="path608"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 262.96278,191.9334 c 1.47242,0 2.66621,-1.19611 2.66621,-2.66842 0,-1.47232 -1.19379,-2.66601 -2.66621,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842 z"
+         id="path609"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 269.25121,191.55631 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47232 1.19379,2.66842 2.66862,2.66842"
+         id="path610"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 269.25121,191.55631 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47232 1.19379,2.66842 2.66862,2.66842 z"
+         id="path611"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 274.90792,192.05829 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66601 0,-1.47472 -1.1938,-2.66842 -2.66622,-2.66842 -1.47243,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path612"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 274.90792,192.05829 c 1.47242,0 2.66622,-1.19371 2.66622,-2.66601 0,-1.47472 -1.1938,-2.66842 -2.66622,-2.66842 -1.47243,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path613"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 291.03734,190.04557 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.46992 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path614"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 291.03734,190.04557 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.46992 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path615"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,191.42901 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path616"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,191.42901 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path617"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,211.16712 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601"
+         id="path618"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,211.16712 c 1.47243,0 2.66862,-1.19371 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.66601 2.66622,2.66601 z"
+         id="path619"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 351.32751,221.54055 c 1.47242,0 2.66621,-1.19369 2.66621,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66621,-2.66602 -1.47483,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47472 1.19379,2.66841 2.66862,2.66841"
+         id="path620"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 351.32751,221.54055 c 1.47242,0 2.66621,-1.19369 2.66621,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66621,-2.66602 -1.47483,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47472 1.19379,2.66841 2.66862,2.66841 z"
+         id="path621"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 352.70866,214.90674 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.1938,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path622"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 352.70866,214.90674 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47231 -1.1938,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path623"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 351.57731,207.99432 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66841 0,-1.47231 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47471 1.1938,2.66841 2.66622,2.66841"
+         id="path624"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 351.57731,207.99432 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66841 0,-1.47231 -1.19379,-2.66602 -2.66862,-2.66602 -1.47242,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47471 1.1938,2.66841 2.66622,2.66841 z"
+         id="path625"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 348.68531,201.45659 c 1.47483,0 2.66862,-1.19611 2.66862,-2.66842 0,-1.46991 -1.19379,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842"
+         id="path626"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 348.68531,201.45659 c 1.47483,0 2.66862,-1.19611 2.66862,-2.66842 0,-1.46991 -1.19379,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66842 2.66622,2.66842 z"
+         id="path627"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 343.78283,196.92916 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19619,2.66601 2.66862,2.66601"
+         id="path628"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 343.78283,196.92916 c 1.47242,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.1938,-2.66601 -2.66622,-2.66601 -1.47243,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19619,2.66601 2.66862,2.66601 z"
+         id="path629"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 337.87391,194.03738 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.1938,2.66601 2.66862,2.66601"
+         id="path630"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 337.87391,194.03738 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.1938,2.66601 2.66862,2.66601 z"
+         id="path631"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 331.14591,192.49782 c 1.47483,0 2.66863,-1.1937 2.66863,-2.66602 0,-1.4699 -1.1938,-2.666 -2.66863,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path632"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 331.14591,192.49782 c 1.47483,0 2.66863,-1.1937 2.66863,-2.66602 0,-1.4699 -1.1938,-2.666 -2.66863,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path633"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 324.98479,191.99584 c 1.47482,0 2.66861,-1.1937 2.66861,-2.66841 0,-1.46992 -1.19379,-2.66602 -2.66861,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47471 1.19379,2.66841 2.66622,2.66841"
+         id="path634"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 324.98479,191.99584 c 1.47482,0 2.66861,-1.1937 2.66861,-2.66841 0,-1.46992 -1.19379,-2.66602 -2.66861,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.47471 1.19379,2.66841 2.66622,2.66841 z"
+         id="path635"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 319.40014,191.26088 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47232 -1.19379,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.666 2.66622,2.666"
+         id="path636"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 319.40014,191.26088 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47232 -1.19379,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.1937 -2.66622,2.66602 0,1.4723 1.19379,2.666 2.66622,2.666 z"
+         id="path637"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 323.00554,213.08617 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.4699 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.1938,2.66842 2.66622,2.66842"
+         id="path638"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 323.00554,213.08617 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.4699 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.1938,2.66842 2.66622,2.66842 z"
+         id="path639"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 324.38909,207.92947 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66861,1.19371 -2.66861,2.66602 0,1.47231 1.19379,2.66601 2.66861,2.66601"
+         id="path640"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 324.38909,207.92947 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66861,1.19371 -2.66861,2.66602 0,1.47231 1.19379,2.66601 2.66861,2.66601 z"
+         id="path641"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 301.97604,190.86458 c 1.47483,0 2.66863,-1.1961 2.66863,-2.66841 0,-1.47231 -1.1938,-2.66601 -2.66863,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66841 2.66622,2.66841"
+         id="path642"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 301.97604,190.86458 c 1.47483,0 2.66863,-1.1961 2.66863,-2.66841 0,-1.47231 -1.1938,-2.66601 -2.66863,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66841 2.66622,2.66841 z"
+         id="path643"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 288.92599,190.14164 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66842 0,-1.4699 -1.1938,-2.66361 -2.66862,-2.66361 -1.47243,0 -2.66622,1.19131 -2.66622,2.66361 0,1.47472 1.19379,2.66842 2.66622,2.66842"
+         id="path644"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 288.92599,190.14164 c 1.47482,0 2.66862,-1.1937 2.66862,-2.66842 0,-1.4699 -1.1938,-2.66361 -2.66862,-2.66361 -1.47243,0 -2.66622,1.19131 -2.66622,2.66361 0,1.47472 1.19379,2.66842 2.66622,2.66842 z"
+         id="path645"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 285.78416,190.01434 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66621,1.1937 -2.66621,2.66601 0,1.47231 1.19379,2.66601 2.66621,2.66601"
+         id="path646"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 285.78416,190.01434 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66601 0,-1.47231 -1.19379,-2.66601 -2.66622,-2.66601 -1.47242,0 -2.66621,1.1937 -2.66621,2.66601 0,1.47231 1.19379,2.66601 2.66621,2.66601 z"
+         id="path647"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 268.84047,213.14861 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66841 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.19379,2.66841 2.66622,2.66841"
+         id="path648"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 268.84047,213.14861 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66841 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47472 1.19379,2.66841 2.66622,2.66841 z"
+         id="path649"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 268.05502,206.76699 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47232 1.19379,2.66601 2.66622,2.66601"
+         id="path650"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 268.05502,206.76699 c 1.47242,0 2.66862,-1.19369 2.66862,-2.66601 0,-1.47231 -1.1962,-2.66602 -2.66862,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47232 1.19379,2.66601 2.66622,2.66601 z"
+         id="path651"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 269.94059,200.60635 c 1.47482,0 2.66861,-1.19371 2.66861,-2.66602 0,-1.47231 -1.19379,-2.66601 -2.66861,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66602 2.66622,2.66602"
+         id="path652"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 269.94059,200.60635 c 1.47482,0 2.66861,-1.19371 2.66861,-2.66602 0,-1.47231 -1.19379,-2.66601 -2.66861,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47231 1.19379,2.66602 2.66622,2.66602 z"
+         id="path653"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 281.66474,190.61239 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.666 2.66622,2.666"
+         id="path654"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 281.66474,190.61239 c 1.47483,0 2.66862,-1.1937 2.66862,-2.666 0,-1.47472 -1.19379,-2.66842 -2.66862,-2.66842 -1.47242,0 -2.66622,1.1937 -2.66622,2.66842 0,1.4723 1.1938,2.666 2.66622,2.666 z"
+         id="path655"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 277.23305,192.43537 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66622,1.1937 -2.66622,2.66841 0,1.47231 1.1938,2.66601 2.66622,2.66601"
+         id="path656"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 277.23305,192.43537 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66622,1.1937 -2.66622,2.66841 0,1.47231 1.1938,2.66601 2.66622,2.66601 z"
+         id="path657"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 272.99112,196.01888 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.666 -2.66622,-2.666 -1.47482,0 -2.66862,1.19369 -2.66862,2.666 0,1.47232 1.1938,2.66842 2.66862,2.66842"
+         id="path658"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 272.99112,196.01888 c 1.47243,0 2.66622,-1.1961 2.66622,-2.66842 0,-1.47231 -1.19379,-2.666 -2.66622,-2.666 -1.47482,0 -2.66862,1.19369 -2.66862,2.666 0,1.47232 1.1938,2.66842 2.66862,2.66842 z"
+         id="path659"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,194.44809 c 1.47243,0 2.66862,-1.1961 2.66862,-2.66842 0,-1.4699 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47232 1.19379,2.66842 2.66622,2.66842"
+         id="path660"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,194.44809 c 1.47243,0 2.66862,-1.1961 2.66862,-2.66842 0,-1.4699 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19371 -2.66622,2.66601 0,1.47232 1.19379,2.66842 2.66622,2.66842 z"
+         id="path661"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,199.47509 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66601 2.66622,2.66601"
+         id="path662"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,199.47509 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66601 0,-1.47232 -1.19619,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.19369 -2.66622,2.66601 0,1.47231 1.19379,2.66601 2.66622,2.66601 z"
+         id="path663"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.19203,204.88157 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.4699 -1.19619,-2.666 -2.66862,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path664"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 296.19203,204.88157 c 1.47243,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.4699 -1.19619,-2.666 -2.66862,-2.666 -1.47243,0 -2.66622,1.1937 -2.66622,2.666 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path665"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 305.43492,190.17287 c 1.47242,0 2.66622,-1.19611 2.66622,-2.66842 0,-1.46991 -1.1938,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19379,2.66842 2.66862,2.66842"
+         id="path666"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 305.43492,190.17287 c 1.47242,0 2.66622,-1.19611 2.66622,-2.66842 0,-1.46991 -1.1938,-2.66601 -2.66622,-2.66601 -1.47483,0 -2.66862,1.1937 -2.66862,2.66601 0,1.47231 1.19379,2.66842 2.66862,2.66842 z"
+         id="path667"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 309.08116,189.41869 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.46991 -1.1938,-2.66602 -2.66622,-2.66602 -1.47483,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.19379,2.66841 2.66862,2.66841"
+         id="path668"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 309.08116,189.41869 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.46991 -1.1938,-2.66602 -2.66622,-2.66602 -1.47483,0 -2.66862,1.19371 -2.66862,2.66602 0,1.47231 1.19379,2.66841 2.66862,2.66841 z"
+         id="path669"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 313.19818,190.07919 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.47231 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66841 2.66622,2.66841"
+         id="path670"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 313.19818,190.07919 c 1.47242,0 2.66622,-1.1961 2.66622,-2.66841 0,-1.47231 -1.1938,-2.66602 -2.66622,-2.66602 -1.47243,0 -2.66622,1.19371 -2.66622,2.66602 0,1.47231 1.19379,2.66841 2.66622,2.66841 z"
+         id="path671"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 323.50756,201.39174 c 1.47242,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47231 -1.1962,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.19379,2.66602 2.66622,2.66602"
+         id="path672"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 323.50756,201.39174 c 1.47242,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47231 -1.1962,-2.66601 -2.66862,-2.66601 -1.47243,0 -2.66622,1.1937 -2.66622,2.66601 0,1.47232 1.19379,2.66602 2.66622,2.66602 z"
+         id="path673"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 317.34643,192.4666 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66621,1.1937 -2.66621,2.66841 0,1.47232 1.19379,2.66602 2.66621,2.66602"
+         id="path674"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 317.34643,192.4666 c 1.47483,0 2.66862,-1.1937 2.66862,-2.66602 0,-1.47471 -1.19379,-2.66841 -2.66862,-2.66841 -1.47242,0 -2.66621,1.1937 -2.66621,2.66841 0,1.47232 1.19379,2.66602 2.66621,2.66602 z"
+         id="path675"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 321.11997,196.11255 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47471 1.1938,2.66841 2.66862,2.66841"
+         id="path676"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.0063988"
+         d="m 321.11997,196.11255 c 1.47243,0 2.66622,-1.1937 2.66622,-2.66841 0,-1.47232 -1.19379,-2.66602 -2.66622,-2.66602 -1.47482,0 -2.66862,1.1937 -2.66862,2.66602 0,1.47471 1.1938,2.66841 2.66862,2.66841 z"
+         id="path677"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.02148,236.04991 -7.04026,3.52105 6.33648,3.98943 7.51105,-3.75404 -6.80727,-3.75644"
+         id="path678"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 296.02148,236.04991 -7.04026,3.52105 6.33648,3.98943 7.51105,-3.75404 -6.80727,-3.75644"
+         id="path679"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 280.62948,236.78967 -10.56159,1.63323 c 0,0 -0.1273,5.65868 0.37711,7.04212 l 10.8114,-1.51074 c 0,0 0.50442,-5.27918 -0.62692,-7.16461"
+         id="path680"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 280.62948,236.78967 -10.56159,1.63323 c 0,0 -0.1273,5.65868 0.37711,7.04212 l 10.8114,-1.51074 c 0,0 0.50442,-5.27918 -0.62692,-7.16461 z"
+         id="path681"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#058e6e;fill-opacity:0.94117647"
+         d="m 279.4549,238.79999 c 0,0 -6.3701,0.58604 -7.96263,1.17449 l 0.0841,3.85491 c 0,0 4.19149,-0.75418 8.04669,-1.09043 l -0.16814,-3.93897"
+         id="path682"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 279.4549,238.79999 c 0,0 -6.3701,0.58604 -7.96263,1.17449 l 0.0841,3.85491 c 0,0 4.19149,-0.75418 8.04669,-1.09043 l -0.16814,-3.93897"
+         id="path683"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 310.74334,237.09229 10.55918,1.63565 c 0,0 0.12731,5.65626 -0.37711,7.03971 l -10.81139,-1.50834 c 0,0 -0.50442,-5.28159 0.62932,-7.16702"
+         id="path684-3"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 310.74334,237.09229 10.55918,1.63565 c 0,0 0.12731,5.65626 -0.37711,7.03971 l -10.81139,-1.50834 c 0,0 -0.50442,-5.28159 0.62932,-7.16702 z"
+         id="path685"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#058e6e;fill-opacity:0.94117647"
+         d="m 311.91551,239.10501 c 0,0 6.3701,0.58605 7.96263,1.17209 l -0.0841,3.85491 c 0,0 -4.19149,-0.75416 -8.04669,-1.08802 l 0.16813,-3.93898"
+         id="path686-6"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 311.91551,239.10501 c 0,0 6.3701,0.58605 7.96263,1.17209 l -0.0841,3.85491 c 0,0 -4.19149,-0.75416 -8.04669,-1.08802 l 0.16813,-3.93898"
+         id="path687"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 254.22431,241.81907 c 0,0 37.04843,-13.75759 84.15883,1.16248 m -82.65037,6.75629 c 0,0 35.83541,-13.40211 80.02979,0.59566 m -79.86166,-9.01882 7.2084,2.09438 -5.02978,5.36566"
+         id="path688-7"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 256.06904,247.76836 4.10742,-3.437 -4.6935,-0.9223 c 0,0 0.63893,0.72535 0.50682,1.39066 -0.12971,0.6653 0.0384,2.38259 0.0793,2.96864"
+         id="path689"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 256.06904,247.76836 4.10742,-3.437 -4.6935,-0.9223 c 0,0 0.63893,0.72535 0.50682,1.39066 -0.12971,0.6653 0.0384,2.38259 0.0793,2.96864 z"
+         id="path690"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 337.58567,242.69813 -7.66958,1.38345 5.15469,6.03335"
+         id="path691"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 335.32299,247.97971 -2.892,-3.01907 4.14824,-0.37709 c 0,0 -1.13134,0.75417 -1.13134,1.38345 0,0.62927 0.12731,1.50834 -0.1249,2.01271"
+         id="path692"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 335.32299,247.97971 -2.892,-3.01907 4.14824,-0.37709 c 0,0 -1.13134,0.75417 -1.13134,1.38345 0,0.62927 0.12731,1.50834 -0.1249,2.01271 z"
+         id="path693"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 265.29031,241.84548 c 0.65335,0 1.18419,-0.42511 1.18419,-0.95111 0,-0.52119 -0.53084,-0.94632 -1.18419,-0.94632 -0.65574,0 -1.18658,0.42513 -1.18658,0.94632 0,0.526 0.53084,0.95111 1.18658,0.95111 z m 20.60675,-2.34897 c 0.65575,0 1.18659,-0.42512 1.18659,-0.94631 0,-0.526 -0.53084,-0.94872 -1.18659,-0.94872 -0.65334,0 -1.18418,0.42272 -1.18418,0.94872 0,0.52119 0.53084,0.94631 1.18418,0.94631 z m 0,3.35294 c 0.65575,0 1.18659,-0.42513 1.18659,-0.94872 0,-0.5236 -0.53084,-0.94631 -1.18659,-0.94631 -0.65334,0 -1.18418,0.42271 -1.18418,0.94631 0,0.52359 0.53084,0.94872 1.18418,0.94872 z m 20.28488,-3.18481 c 0.65574,0 1.18658,-0.42272 1.18658,-0.94872 0,-0.52119 -0.53084,-0.94631 -1.18658,-0.94631 -0.65334,0 -1.18418,0.42271 -1.18418,0.94631 0,0.526 0.53084,0.94872 1.18418,0.94872 z m 20.11674,3.68918 c 0.65575,0 1.18659,-0.42511 1.18659,-0.95111 0,-0.5212 -0.53084,-0.94632 -1.18659,-0.94632 -0.65334,0 -1.18418,0.42512 -1.18418,0.94632 0,0.526 0.53084,0.95111 1.18418,0.95111 z m -0.33387,2.68043 c 0.65574,0 1.18658,-0.42512 1.18658,-0.94632 0,-0.52119 -0.53084,-0.95112 -1.18658,-0.95112 -0.65575,0 -1.1866,0.42753 -1.1866,0.95112 0,0.5212 0.53085,0.94632 1.1866,0.94632 z m -19.78287,-3.01668 c 0.65574,0 1.18658,-0.42512 1.18658,-0.94871 0,-0.5212 -0.53084,-0.94632 -1.18658,-0.94632 -0.65334,0 -1.18418,0.42272 -1.18418,0.94632 0,0.52359 0.53084,0.94871 1.18418,0.94871 z m -39.8972,3.01668 c 0.65334,0 1.18419,-0.42512 1.18419,-0.94632 0,-0.52119 -0.53085,-0.95112 -1.18419,-0.95112 -0.65575,0 -1.18659,0.42753 -1.18659,0.95112 0,0.5212 0.53084,0.94632 1.18659,0.94632 z"
+         id="path694"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 253.55415,231.0061 c 0,0 0.16814,7.20785 4.86165,6.20148 4.6935,-1.00635 4.19148,-6.87398 4.52776,-7.20784 0.33388,-0.33626 0.8359,-0.33626 0.8359,-0.33626 0,0 0.67015,5.69951 5.02738,5.02941 4.35963,-0.67011 4.19149,-7.70983 3.68947,-8.88432 l 1.00644,-0.33625 c 0,0 1.67419,8.2142 6.70398,7.04212 5.02978,-1.17449 4.52776,-6.36961 4.52776,-6.36961 h 0.38672 c 0,0 1.12175,5.53137 5.14509,5.19512 4.02095,-0.33385 4.86165,-1.67647 4.35722,-7.20784 l 2.68303,-0.50198 c 0,0 -1.00643,8.04607 3.85281,7.87795 4.86405,-0.16813 5.02978,-4.02304 5.36607,-4.69314 h 0.73261 c 0,0 0.27383,5.6995 4.29718,5.6995 4.02334,0 4.85923,-4.86127 4.85923,-6.70587 l 3.92967,0.17534 c 0,0 -4.0954,7.53689 1.94082,8.54325 6.03382,1.00395 6.20196,-4.86368 6.20196,-4.86368 h 1.17217 c 0,0 -0.16813,7.5441 3.18506,7.71223 3.35078,0.16812 5.36366,-1.00636 5.69753,-6.53774 l 1.84475,0.67011 c 0,0 -1.59974,8.94195 -7.87856,7.37357 -3.35319,-0.83583 -4.35963,-4.69074 -4.19149,-5.69711 0,0 -2.34435,4.18877 -6.87212,2.84856 -4.52536,-1.34021 -4.02334,-4.52502 -4.02334,-5.53138 0,0 -2.72147,4.99817 -6.53825,3.85251 -3.35078,-1.00396 -4.69351,-2.17845 -4.69351,-4.52502 0,0 -1.67658,3.85491 -5.02978,3.68919 -3.35319,-0.16813 -5.02738,-2.18085 -5.19552,-4.02304 0,0 -0.66536,3.60272 -5.19792,3.85491 -3.01691,0.16813 -4.69351,-1.3378 -5.36367,-3.35293 0,0 -0.86712,3.65076 -5.19552,4.19117 -2.68063,0.33625 -5.36366,-1.17209 -6.03623,-3.68679 0,0 -0.66775,4.85887 -5.02738,5.53138 -4.35963,0.6701 -5.36606,-2.34658 -5.36606,-2.34658 0,0 -0.8359,3.85731 -4.35723,4.69315 -3.52133,0.83823 -5.86808,-0.6677 -6.70638,-4.18876 -0.83829,-3.52106 -0.50201,-5.0294 -0.50201,-5.0294 l 1.34031,1.84219"
+         id="path695"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 253.55415,231.0061 c 0,0 0.16814,7.20785 4.86165,6.20148 4.6935,-1.00635 4.19148,-6.87398 4.52776,-7.20784 0.33388,-0.33626 0.8359,-0.33626 0.8359,-0.33626 0,0 0.67015,5.69951 5.02738,5.02941 4.35963,-0.67011 4.19149,-7.70983 3.68947,-8.88432 l 1.00644,-0.33625 c 0,0 1.67419,8.2142 6.70398,7.04212 5.02978,-1.17449 4.52776,-6.36961 4.52776,-6.36961 h 0.38672 c 0,0 1.12175,5.53137 5.14509,5.19512 4.02095,-0.33385 4.86165,-1.67647 4.35722,-7.20784 l 2.68303,-0.50198 c 0,0 -1.00643,8.04607 3.85281,7.87795 4.86405,-0.16813 5.02978,-4.02304 5.36607,-4.69314 h 0.73261 c 0,0 0.27383,5.6995 4.29718,5.6995 4.02334,0 4.85923,-4.86127 4.85923,-6.70587 l 3.92967,0.17534 c 0,0 -4.0954,7.53689 1.94082,8.54325 6.03382,1.00395 6.20196,-4.86368 6.20196,-4.86368 h 1.17217 c 0,0 -0.16813,7.5441 3.18506,7.71223 3.35078,0.16812 5.36366,-1.00636 5.69753,-6.53774 l 1.84475,0.67011 c 0,0 -1.59974,8.94195 -7.87856,7.37357 -3.35319,-0.83583 -4.35963,-4.69074 -4.19149,-5.69711 0,0 -2.34435,4.18877 -6.87212,2.84856 -4.52536,-1.34021 -4.02334,-4.52502 -4.02334,-5.53138 0,0 -2.72147,4.99817 -6.53825,3.85251 -3.35078,-1.00396 -4.69351,-2.17845 -4.69351,-4.52502 0,0 -1.67658,3.85491 -5.02978,3.68919 -3.35319,-0.16813 -5.02738,-2.18085 -5.19552,-4.02304 0,0 -0.66536,3.60272 -5.19792,3.85491 -3.01691,0.16813 -4.69351,-1.3378 -5.36367,-3.35293 0,0 -0.86712,3.65076 -5.19552,4.19117 -2.68063,0.33625 -5.36366,-1.17209 -6.03623,-3.68679 0,0 -0.66775,4.85887 -5.02738,5.53138 -4.35963,0.6701 -5.36606,-2.34658 -5.36606,-2.34658 0,0 -0.8359,3.85731 -4.35723,4.69315 -3.52133,0.83823 -5.86808,-0.6677 -6.70638,-4.18876 -0.83829,-3.52106 -0.50201,-5.0294 -0.50201,-5.0294 l 1.34031,1.84219 z"
+         id="path696"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 263.27744,231.32314 c 0.91756,0 1.65978,-0.74216 1.65978,-1.65966 0,-0.91509 -0.74222,-1.65965 -1.65978,-1.65965 -0.91757,0 -1.65978,0.74456 -1.65978,1.65965 0,0.9175 0.74221,1.65966 1.65978,1.65966"
+         id="path697"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 263.27744,231.32314 c 0.91756,0 1.65978,-0.74216 1.65978,-1.65966 0,-0.91509 -0.74222,-1.65965 -1.65978,-1.65965 -0.91757,0 -1.65978,0.74456 -1.65978,1.65965 0,0.9175 0.74221,1.65966 1.65978,1.65966 z"
+         id="path698"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 285.12362,227.8261 c 0.91756,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74222,-1.65966 -1.65978,-1.65966 -0.91757,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74221,1.65965 1.65978,1.65965"
+         id="path699"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 285.12362,227.8261 c 0.91756,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74222,-1.65966 -1.65978,-1.65966 -0.91757,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74221,1.65965 1.65978,1.65965 z"
+         id="path700"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 307.26284,228.47459 c 0.91757,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65978,-1.65966 -0.91756,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74222,1.65965 1.65978,1.65965"
+         id="path701"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 307.26284,228.47459 c 0.91757,0 1.65978,-0.74456 1.65978,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65978,-1.65966 -0.91756,0 -1.65978,0.74217 -1.65978,1.65966 0,0.91509 0.74222,1.65965 1.65978,1.65965 z"
+         id="path702"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 329.23393,232.00525 c 0.91756,0 1.65977,-0.74456 1.65977,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65977,-1.65966 -0.91517,0 -1.65739,0.74217 -1.65739,1.65966 0,0.91509 0.74222,1.65965 1.65739,1.65965"
+         id="path703"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 329.23393,232.00525 c 0.91756,0 1.65977,-0.74456 1.65977,-1.65965 0,-0.91749 -0.74221,-1.65966 -1.65977,-1.65966 -0.91517,0 -1.65739,0.74217 -1.65739,1.65966 0,0.91509 0.74222,1.65965 1.65739,1.65965 z"
+         id="path704"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 295.21441,225.9767 h -1.50845 c -0.37712,1.50834 -3.58378,2.45226 -3.58378,2.45226 -0.37712,-1.19371 0.43957,-2.89179 0.43957,-2.89179 -3.70869,-0.94391 -3.70869,-2.26491 -3.70869,-2.26491 0.56447,-1.25615 3.9609,-1.44349 3.9609,-1.44349 -0.88154,-1.13125 -0.69178,-2.95423 -0.69178,-2.95423 2.26268,0.1273 4.14825,2.38741 4.14825,2.38741 0,0 -2.26268,-1.12886 -2.01047,-5.1543 0,0 1.25624,-0.06 2.01047,0.75417 0,0 0,-4.33527 1.82312,-4.83725 h 0.18735 c 1.82312,0.50198 1.82312,4.83725 1.82312,4.83725 0.75423,-0.81421 2.01047,-0.75417 2.01047,-0.75417 0.25221,4.02304 -2.01047,5.1543 -2.01047,5.1543 0,0 1.88557,-2.26011 4.14825,-2.38741 0,0 0.18976,1.82058 -0.69178,2.95423 0,0 3.39643,0.18734 3.9609,1.44349 0,0 0,1.321 -3.70869,2.26491 0,0 0.81669,1.69808 0.43957,2.89179 0,0 -3.20666,-0.94392 -3.58378,-2.45226 h -3.45648"
+         id="path705"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 295.21441,225.9767 h -1.50845 c -0.37712,1.50834 -3.58378,2.45226 -3.58378,2.45226 -0.37712,-1.19371 0.43957,-2.89179 0.43957,-2.89179 -3.70869,-0.94391 -3.70869,-2.26491 -3.70869,-2.26491 0.56447,-1.25615 3.9609,-1.44349 3.9609,-1.44349 -0.88154,-1.13125 -0.69178,-2.95423 -0.69178,-2.95423 2.26268,0.1273 4.14825,2.38741 4.14825,2.38741 0,0 -2.26268,-1.12886 -2.01047,-5.1543 0,0 1.25624,-0.06 2.01047,0.75417 0,0 0,-4.33527 1.82312,-4.83725 h 0.18735 c 1.82312,0.50198 1.82312,4.83725 1.82312,4.83725 0.75423,-0.81421 2.01047,-0.75417 2.01047,-0.75417 0.25221,4.02304 -2.01047,5.1543 -2.01047,5.1543 0,0 1.88557,-2.26011 4.14825,-2.38741 0,0 0.18976,1.82058 -0.69178,2.95423 0,0 3.39643,0.18734 3.9609,1.44349 0,0 0,1.321 -3.70869,2.26491 0,0 0.81669,1.69808 0.43957,2.89179 0,0 -3.20666,-0.94392 -3.58378,-2.45226 h -3.45648 z"
+         id="path706"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.07193,226.83415 c 1.679,0 3.03853,-1.35943 3.03853,-3.0383 0,-1.67646 -1.35953,-3.03589 -3.03853,-3.03589 -1.67659,0 -3.03612,1.35943 -3.03612,3.03589 0,1.67887 1.35953,3.0383 3.03612,3.0383"
+         id="path707"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 296.07193,226.83415 c 1.679,0 3.03853,-1.35943 3.03853,-3.0383 0,-1.67646 -1.35953,-3.03589 -3.03853,-3.03589 -1.67659,0 -3.03612,1.35943 -3.03612,3.03589 0,1.67887 1.35953,3.0383 3.03612,3.0383 z"
+         id="path708"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 296.07193,225.45551 c 0.91756,0 1.66219,-0.74216 1.66219,-1.65966 0,-0.91509 -0.74463,-1.65725 -1.66219,-1.65725 -0.91516,0 -1.65738,0.74216 -1.65738,1.65725 0,0.9175 0.74222,1.65966 1.65738,1.65966"
+         id="path709"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 296.07193,225.45551 c 0.91756,0 1.66219,-0.74216 1.66219,-1.65966 0,-0.91509 -0.74463,-1.65725 -1.66219,-1.65725 -0.91516,0 -1.65738,0.74216 -1.65738,1.65725 0,0.9175 0.74222,1.65966 1.65738,1.65966 z"
+         id="path710"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 319.10709,227.94379 1.47483,0.31944 c 0.0456,1.55397 2.98569,3.15118 2.98569,3.15118 0.61731,-1.08802 0.17775,-2.9182 0.17775,-2.9182 3.82398,-0.13931 4.1002,-1.42908 4.1002,-1.42908 -0.28583,-1.34982 -3.56456,-2.2505 -3.56456,-2.2505 1.09772,-0.9199 1.29949,-2.74288 1.29949,-2.74288 -2.23867,-0.35306 -4.5614,1.4603 -4.5614,1.4603 0,0 2.45243,-0.62686 3.05534,-4.61387 0,0 -1.21781,-0.32425 -2.12337,0.31222 0,0 0.91276,-4.2392 -0.76143,-5.11345 l -0.18495,-0.0408 c -1.88797,0.10809 -2.80313,4.34729 -2.80313,4.34729 -0.56448,-0.95833 -1.80631,-1.16248 -1.80631,-1.16248 -1.09531,3.87893 0.87913,5.46413 0.87913,5.46413 0,0 -1.36674,-2.61077 -3.55255,-3.21122 0,0 -0.56928,1.74131 0.0528,3.03348 0,0 -3.358,-0.5308 -4.17707,0.57884 0,0 -0.27624,1.28978 3.14902,2.99506 0,0 -1.15777,1.48673 -1.04007,2.73327 0,0 3.33397,-0.24499 4.02095,-1.64044 l 1.47242,0.31704 1.90718,0.41071"
+         id="path711"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 319.10709,227.94379 1.47483,0.31944 c 0.0456,1.55397 2.98569,3.15118 2.98569,3.15118 0.61731,-1.08802 0.17775,-2.9182 0.17775,-2.9182 3.82398,-0.13931 4.1002,-1.42908 4.1002,-1.42908 -0.28583,-1.34982 -3.56456,-2.2505 -3.56456,-2.2505 1.09772,-0.9199 1.29949,-2.74288 1.29949,-2.74288 -2.23867,-0.35306 -4.5614,1.4603 -4.5614,1.4603 0,0 2.45243,-0.62686 3.05534,-4.61387 0,0 -1.21781,-0.32425 -2.12337,0.31222 0,0 0.91276,-4.2392 -0.76143,-5.11345 l -0.18495,-0.0408 c -1.88797,0.10809 -2.80313,4.34729 -2.80313,4.34729 -0.56448,-0.95833 -1.80631,-1.16248 -1.80631,-1.16248 -1.09531,3.87893 0.87913,5.46413 0.87913,5.46413 0,0 -1.36674,-2.61077 -3.55255,-3.21122 0,0 -0.56928,1.74131 0.0528,3.03348 0,0 -3.358,-0.5308 -4.17707,0.57884 0,0 -0.27624,1.28978 3.14902,2.99506 0,0 -1.15777,1.48673 -1.04007,2.73327 0,0 3.33397,-0.24499 4.02095,-1.64044 l 1.47242,0.31704 1.90718,0.41071"
+         id="path712"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 318.08385,228.60188 c -1.63816,-0.35306 -2.68063,-1.96948 -2.32754,-3.60992 0.35309,-1.63803 1.96963,-2.68282 3.6102,-2.32736 1.64057,0.35307 2.68304,1.96949 2.32994,3.60992 -0.35549,1.63805 -1.97204,2.68284 -3.6126,2.32736"
+         id="path713"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 318.08385,228.60188 c -1.63816,-0.35306 -2.68063,-1.96948 -2.32754,-3.60992 0.35309,-1.63803 1.96963,-2.68282 3.6102,-2.32736 1.64057,0.35307 2.68304,1.96949 2.32994,3.60992 -0.35549,1.63805 -1.97204,2.68284 -3.6126,2.32736 z"
+         id="path714"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 318.37689,227.25447 c -0.89835,-0.19214 -1.46762,-1.07602 -1.27306,-1.97189 0.19216,-0.89347 1.07609,-1.46511 1.97204,-1.27056 0.89595,0.19215 1.46522,1.07841 1.27306,1.97189 -0.19456,0.89588 -1.0785,1.46511 -1.97204,1.27056"
+         id="path715"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 318.37689,227.25447 c -0.89835,-0.19214 -1.46762,-1.07602 -1.27306,-1.97189 0.19216,-0.89347 1.07609,-1.46511 1.97204,-1.27056 0.89595,0.19215 1.46522,1.07841 1.27306,1.97189 -0.19456,0.89588 -1.0785,1.46511 -1.97204,1.27056 z"
+         id="path716"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 272.26572,227.64837 -1.49645,0.19695 c -0.17534,1.54676 -3.23068,2.90379 -3.23068,2.90379 -0.53084,-1.13366 0.0553,-2.92301 0.0553,-2.92301 -3.79997,-0.44674 -3.97531,-1.75573 -3.97531,-1.75573 0.39633,-1.31859 3.7351,-1.95508 3.7351,-1.95508 -1.02085,-1.00395 -1.07369,-2.83653 -1.07369,-2.83653 2.26028,-0.17054 4.42928,1.82057 4.42928,1.82057 0,0 -2.39238,-0.82382 -2.67342,-4.84446 0,0 1.23943,-0.22817 2.09454,0.48277 0,0 -0.57167,-4.29925 1.16497,-5.03901 l 0.18736,-0.0216 c 1.87356,0.25459 2.44524,4.55624 2.44524,4.55624 0.64133,-0.90788 1.89517,-1.01356 1.89517,-1.01356 0.78065,3.95578 -1.31389,5.37286 -1.31389,5.37286 0,0 1.57091,-2.48828 3.79756,-2.911 0,0 0.42755,1.77975 -0.29545,3.01668 0,0 3.38922,-0.2618 4.11702,0.91029 0,0 0.17295,1.30899 -3.3796,2.73326 0,0 1.03525,1.57319 0.81907,2.80772 0,0 -3.30274,-0.51158 -3.87682,-1.95748 l -1.49644,0.19935 -1.92881,0.257"
+         id="path717"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 272.26572,227.64837 -1.49645,0.19695 c -0.17534,1.54676 -3.23068,2.90379 -3.23068,2.90379 -0.53084,-1.13366 0.0553,-2.92301 0.0553,-2.92301 -3.79997,-0.44674 -3.97531,-1.75573 -3.97531,-1.75573 0.39633,-1.31859 3.7351,-1.95508 3.7351,-1.95508 -1.02085,-1.00395 -1.07369,-2.83653 -1.07369,-2.83653 2.26028,-0.17054 4.42928,1.82057 4.42928,1.82057 0,0 -2.39238,-0.82382 -2.67342,-4.84446 0,0 1.23943,-0.22817 2.09454,0.48277 0,0 -0.57167,-4.29925 1.16497,-5.03901 l 0.18736,-0.0216 c 1.87356,0.25459 2.44524,4.55624 2.44524,4.55624 0.64133,-0.90788 1.89517,-1.01356 1.89517,-1.01356 0.78065,3.95578 -1.31389,5.37286 -1.31389,5.37286 0,0 1.57091,-2.48828 3.79756,-2.911 0,0 0.42755,1.77975 -0.29545,3.01668 0,0 3.38922,-0.2618 4.11702,0.91029 0,0 0.17295,1.30899 -3.3796,2.73326 0,0 1.03525,1.57319 0.81907,2.80772 0,0 -3.30274,-0.51158 -3.87682,-1.95748 l -1.49644,0.19935 -1.92881,0.257"
+         id="path718"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 273.22892,228.38572 c 1.66458,-0.22097 2.83436,-1.74852 2.61097,-3.41297 -0.22098,-1.66206 -1.74865,-2.83174 -3.41083,-2.60837 -1.66459,0.22096 -2.83196,1.74851 -2.61097,3.41057 0.22098,1.66205 1.74864,2.83174 3.41083,2.61077"
+         id="path719"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 273.22892,228.38572 c 1.66458,-0.22097 2.83436,-1.74852 2.61097,-3.41297 -0.22098,-1.66206 -1.74865,-2.83174 -3.41083,-2.60837 -1.66459,0.22096 -2.83196,1.74851 -2.61097,3.41057 0.22098,1.66205 1.74864,2.83174 3.41083,2.61077 z"
+         id="path720"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 273.04877,227.01909 c 0.90796,-0.12009 1.54689,-0.95352 1.42439,-1.86381 -0.12011,-0.90789 -0.9536,-1.54436 -1.86156,-1.42668 -0.91035,0.12249 -1.54928,0.95593 -1.42678,1.86381 0.1201,0.91029 0.95599,1.54677 1.86395,1.42668"
+         id="path721"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 273.04877,227.01909 c 0.90796,-0.12009 1.54689,-0.95352 1.42439,-1.86381 -0.12011,-0.90789 -0.9536,-1.54436 -1.86156,-1.42668 -0.91035,0.12249 -1.54928,0.95593 -1.42678,1.86381 0.1201,0.91029 0.95599,1.54677 1.86395,1.42668 z"
+         id="path722"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 340.16061,234.10444 c 0,0 -0.76142,-1.99831 -2.44283,-1.28017 -1.6814,0.71815 -1.50845,0.97994 -3.0121,0.88868 0,0 -0.58609,-1.79656 0.15372,-2.57235 0,0 -2.402,-0.89828 -2.90642,-3.00707 0,0 1.28748,-1.49393 4.33802,-0.9367 0,0 -0.0961,-1.51555 0.32186,-2.18326 0,0 3.27633,1.01357 3.29314,2.84135 0,0 -0.98242,-3.5859 0.74703,-6.18947 0,0 1.53487,0.6581 1.43639,2.29133 0,0 0.70619,-3.36014 5.24836,-2.45706 0,0 -2.46204,2.18325 -2.58454,3.1824 -0.1225,0.99916 -2.17622,2.70205 -2.21224,3.26887 -0.0312,0.56443 -0.28104,1.55638 -0.88394,2.14963 -0.6029,0.59324 -0.66295,1.59961 -0.61491,1.91425 0.0408,0.31943 -0.10329,1.69568 -0.88154,2.08957"
+         id="path723"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 340.16061,234.10444 c 0,0 -0.76142,-1.99831 -2.44283,-1.28017 -1.6814,0.71815 -1.50845,0.97994 -3.0121,0.88868 0,0 -0.58609,-1.79656 0.15372,-2.57235 0,0 -2.402,-0.89828 -2.90642,-3.00707 0,0 1.28748,-1.49393 4.33802,-0.9367 0,0 -0.0961,-1.51555 0.32186,-2.18326 0,0 3.27633,1.01357 3.29314,2.84135 0,0 -0.98242,-3.5859 0.74703,-6.18947 0,0 1.53487,0.6581 1.43639,2.29133 0,0 0.70619,-3.36014 5.24836,-2.45706 0,0 -2.46204,2.18325 -2.58454,3.1824 -0.1225,0.99916 -2.17622,2.70205 -2.21224,3.26887 -0.0312,0.56443 -0.28104,1.55638 -0.88394,2.14963 -0.6029,0.59324 -0.66295,1.59961 -0.61491,1.91425 0.0408,0.31943 -0.10329,1.69568 -0.88154,2.08957 z"
+         id="path724"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 337.70097,230.11743 c 0.32186,-1.64524 1.91679,-2.72125 3.56216,-2.39941 0.46839,0.0889 0.88634,0.28581 1.24183,0.55482 -0.0913,0.56923 -0.34588,1.33541 -0.8455,1.82778 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.0336,0.24978 -0.0553,1.14806 -0.46839,1.71729 -0.15613,-0.007 -0.31466,-0.0216 -0.4708,-0.0528 -1.64296,-0.31944 -2.71905,-1.91424 -2.40199,-3.56189"
+         id="path725"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 337.70097,230.11743 c 0.32186,-1.64524 1.91679,-2.72125 3.56216,-2.39941 0.46839,0.0889 0.88634,0.28581 1.24183,0.55482 -0.0913,0.56923 -0.34588,1.33541 -0.8455,1.82778 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.0336,0.24978 -0.0553,1.14806 -0.46839,1.71729 -0.15613,-0.007 -0.31466,-0.0216 -0.4708,-0.0528 -1.64296,-0.31944 -2.71905,-1.91424 -2.40199,-3.56189 z"
+         id="path726"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 339.05569,230.38162 c 0.17295,-0.89827 1.04487,-1.48671 1.94562,-1.31138 0.40834,0.0793 0.74703,0.30743 0.98722,0.61487 -0.0961,0.1489 -0.20417,0.29301 -0.32907,0.41551 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.007,0.0649 0.007,0.17532 -0.005,0.30502 -0.21379,0.0456 -0.44197,0.0528 -0.67017,0.007 -0.90074,-0.17533 -1.48683,-1.04479 -1.31149,-1.94548"
+         id="path727"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 339.05569,230.38162 c 0.17295,-0.89827 1.04487,-1.48671 1.94562,-1.31138 0.40834,0.0793 0.74703,0.30743 0.98722,0.61487 -0.0961,0.1489 -0.20417,0.29301 -0.32907,0.41551 -0.6029,0.59324 -0.66295,1.59961 -0.61731,1.91425 0.007,0.0649 0.007,0.17532 -0.005,0.30502 -0.21379,0.0456 -0.44197,0.0528 -0.67017,0.007 -0.90074,-0.17533 -1.48683,-1.04479 -1.31149,-1.94548 z"
+         id="path728"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffcc00;fill-opacity:1"
+         d="m 252.15139,233.26861 c 0,0 0.87912,-1.94787 2.51248,-1.13126 1.63576,0.81662 1.446,1.06881 2.95687,1.06881 0,0 0.68937,-1.76053 0,-2.57715 0,0 2.45003,-0.75416 3.07936,-2.82933 0,0 -1.19379,-1.57078 -4.27556,-1.1937 0,0 0.18975,-1.51075 -0.18736,-2.20006 0,0 -3.33157,0.81661 -3.45888,2.63959 0,0 1.1962,-3.52106 -0.37711,-6.2231 0,0 -1.57091,0.56443 -1.57091,2.20007 0,0 -0.50201,-3.39617 -5.09224,-2.7669 0,0 2.32514,2.32736 2.38999,3.33132 0.0625,1.00636 2.01048,2.82934 2.01048,3.39616 0,0.56443 0.18976,1.57078 0.75422,2.20006 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.0624,0.31223 0,1.69568 0.75664,2.13761"
+         id="path729"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#bcac0b;fill-opacity:1;stroke:#000000;stroke-width:0.65331852"
+         d="m 252.15139,233.26861 c 0,0 0.87912,-1.94787 2.51248,-1.13126 1.63576,0.81662 1.446,1.06881 2.95687,1.06881 0,0 0.68937,-1.76053 0,-2.57715 0,0 2.45003,-0.75416 3.07936,-2.82933 0,0 -1.19379,-1.57078 -4.27556,-1.1937 0,0 0.18975,-1.51075 -0.18736,-2.20006 0,0 -3.33157,0.81661 -3.45888,2.63959 0,0 1.1962,-3.52106 -0.37711,-6.2231 0,0 -1.57091,0.56443 -1.57091,2.20007 0,0 -0.50201,-3.39617 -5.09224,-2.7669 0,0 2.32514,2.32736 2.38999,3.33132 0.0625,1.00636 2.01048,2.82934 2.01048,3.39616 0,0.56443 0.18976,1.57078 0.75422,2.20006 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.0624,0.31223 0,1.69568 0.75664,2.13761 z"
+         id="path730"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 254.84162,229.43772 c -0.22098,-1.66447 -1.74625,-2.83174 -3.41083,-2.61077 -0.4708,0.0624 -0.90076,0.23298 -1.27307,0.48035 0.0576,0.57404 0.26422,1.35223 0.73501,1.87582 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.048,0.24498 -0.0144,1.14807 0.36751,1.73891 0.15373,0.002 0.31226,0 0.47079,-0.0216 1.66218,-0.22096 2.83195,-1.74851 2.60857,-3.41057"
+         id="path731"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.40352026"
+         d="m 254.84162,229.43772 c -0.22098,-1.66447 -1.74625,-2.83174 -3.41083,-2.61077 -0.4708,0.0624 -0.90076,0.23298 -1.27307,0.48035 0.0576,0.57404 0.26422,1.35223 0.73501,1.87582 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.048,0.24498 -0.0144,1.14807 0.36751,1.73891 0.15373,0.002 0.31226,0 0.47079,-0.0216 1.66218,-0.22096 2.83195,-1.74851 2.60857,-3.41057 z"
+         id="path732"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ffffff"
+         d="m 253.47729,229.61785 c -0.12011,-0.90788 -0.956,-1.54677 -1.86396,-1.42667 -0.41554,0.0576 -0.76623,0.2642 -1.02324,0.55481 0.0889,0.15612 0.18495,0.30503 0.30264,0.43713 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.012,0.0624 -0.0168,0.17053 -0.0144,0.30263 0.21138,0.06 0.43957,0.0793 0.67016,0.0504 0.90795,-0.12249 1.54689,-0.95592 1.42679,-1.86621"
+         id="path733"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.25220016"
+         d="m 253.47729,229.61785 c -0.12011,-0.90788 -0.956,-1.54677 -1.86396,-1.42667 -0.41554,0.0576 -0.76623,0.2642 -1.02324,0.55481 0.0889,0.15612 0.18495,0.30503 0.30264,0.43713 0.56688,0.62928 0.56688,1.63324 0.50202,1.94788 -0.012,0.0624 -0.0168,0.17053 -0.0144,0.30263 0.21138,0.06 0.43957,0.0793 0.67016,0.0504 0.90795,-0.12249 1.54689,-0.95592 1.42679,-1.86621 z"
+         id="path734"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:1.50839722"
+         d="m 257.24122,251.62327 c 0,0 33.74808,-13.21958 76.38356,0.28342"
+         id="path735"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 338.38314,241.09612 c -47.1104,-14.92007 -84.66085,-0.83823 -84.66085,-0.83823"
+         id="path736"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:#ff0000"
+         d="m 295.96865,237.79603 -3.77354,1.88542 3.39642,2.13762 4.02335,-2.01272 -3.64623,-2.01032"
+         id="path737"
+         inkscape:connector-curvature="0" />
+      <path
+         style="font-size:12px;fill:none;stroke:#000000;stroke-width:0.50199842"
+         d="m 295.96865,237.79603 -3.77354,1.88542 3.39642,2.13762 4.02335,-2.01272 -3.64623,-2.01032"
+         id="path738"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>

+ 18 - 6
app/Resources/public/css/base.css

@@ -37,7 +37,6 @@
 }
 
 html {
-    background-color: #FFF;
     position: relative;
     min-height: 100%;
 }
@@ -1288,6 +1287,14 @@ div.attendance-calendar-add div.row div.formw, div.attendance-calendar-edit div.
     height: 64px;
 }
 
+.promoted_post{
+    background: #f1fff1;
+    border-color: #9bd6b8;
+}
+.promoted_post .msg-content div{
+    border-bottom: 1px solid #9bd6b8;
+}
+
 /**********************************************
  *  MESSAGE TOOL                           *
  **********************************************/
@@ -2938,14 +2945,14 @@ form .formw .freeze {
 }
 
 #social_wall_main_wall_post_button{
-    background: #f5f6f7 !important;
+    /*background: #f5f6f7 !important;
     color: #7a7a7a !important;
-    border: 1px solid #bababa !important;
+    border: 1px solid #bababa !important;*/
 }
 #social_wall_main_wall_post_button:hover{
-    border: 1px solid #162a83 !important;
+    /*border: 1px solid #162a83 !important;
     background: #162a83 !important;
-    color: #ffffff !important;
+    color: #ffffff !important;*/
 }
 .input-file-container {
     position: relative;
@@ -2955,7 +2962,7 @@ form .formw .freeze {
 }
 .js .input-file-trigger {
     display: inline-block;
-    padding: 7px 15px;
+    padding: 6px 12px;
     background: #f5f6f7;
     color: #7a7a7a;
     font-size: 14px;
@@ -10196,6 +10203,11 @@ ul.dropdown-menu.inner > li > a {
     clear: left;
 }
 
+.compilation_block .progress {
+    margin:0px;
+    width:120px
+}
+
 @media (min-width: 768px) {
     .clear-rows-6-4-3 .col-sm-6:nth-child(2n+1) {
         clear: left;

文件差异内容过多而无法显示
+ 337 - 2752
app/Resources/public/css/themes/academica/svg/background.svg


+ 145 - 0
app/courses/proxy.php

@@ -0,0 +1,145 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+/**
+ * Script needed in order to avoid mixed content in links inside a learning path
+ * In order to use this file you have to:
+ *
+ * 1. Modify configuration.php and add this setting: $_configuration['lp_fix_embed_content'] = true;
+ * 2. Copy this file in app/courses/proxy.php
+ * 3. Change your .htaccess in order to let the proxy.php to be read inside app/courses
+ *
+ */
+
+require_once '../config/configuration.php';
+
+/**
+ * Returns "%" or "px"
+ *
+ * 800px => function returns "px"
+ * 800% => function returns %
+ *
+ * @param string $value
+ * @return string
+ */
+function addPixelOrPercentage($value)
+{
+    $addPixel = strpos($value, 'px');
+    $addPixel = !($addPixel === false);
+    $addCharacter = '';
+    if ($addPixel == false) {
+        $addPercentage = strpos($value, '%');
+        $addPercentage = !($addPercentage === false);
+        if ($addPercentage) {
+            $addCharacter = '%';
+        }
+    } else {
+        $addCharacter = 'px';
+    }
+
+    return $addCharacter;
+}
+
+function get_http_response_code($theURL)
+{
+    $headers = get_headers($theURL);
+
+    return substr($headers[0], 9, 3);
+}
+
+
+$height = isset($_GET['height']) ? (int) $_GET['height'].addPixelOrPercentage($_GET['height']) : '';
+$width = isset($_GET['width']) ? (int) $_GET['width'].addPixelOrPercentage($_GET['width'])  : '';
+$vars = isset($_GET['flashvars']) ? htmlentities($_GET['flashvars']) : '';
+$src = isset($_GET['src']) ? htmlentities($_GET['src']) : '';
+$id = isset($_GET['id']) ? htmlentities($_GET['id']) : '';
+$type = isset($_GET['type']) ? $_GET['type'] : 'flash';
+
+// Fixes URL like: https://www.vopspsy.ugent.be/pdfs/download.php?own=mvsteenk&file=caleidoscoop.pdf
+if (strpos($src, 'download.php') !== false) {
+    $src = str_replace('download.php', 'download.php?', $src);
+    $src .= isset($_GET['own']) ? '&own='.htmlentities($_GET['own']) : '';
+    $src .= isset($_GET['file']) ? '&file='.htmlentities($_GET['file']) : '';
+}
+
+$result = get_http_response_code($src);
+$urlToTest = parse_url($src, PHP_URL_HOST);
+$g = stream_context_create (array('ssl' => array('capture_peer_cert' => true)));
+$r = @stream_socket_client("ssl://$urlToTest:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $g);
+$cont = stream_context_get_params($r);
+$convertToSecure = false;
+
+$certinfo = openssl_x509_parse($cont['options']['ssl']['peer_certificate']);
+if (isset($certinfo) && isset($certinfo['subject']) && isset($certinfo['subject']['CN'])) {
+    $certUrl = $certinfo['subject']['CN'];
+    $parsed = parse_url($certUrl);
+
+    // Remove www from URL
+    $parsedUrl = preg_replace('#^(http(s)?://)?w{3}\.#', '$1', $certUrl);
+
+    if ($urlToTest == $certUrl || $parsedUrl == $urlToTest) {
+        $convertToSecure = true;
+    }
+
+    if ($urlToTest != $certUrl) {
+        // url and cert url are different this will show a warning in browsers
+        // use normal "http" version
+        $result = false;
+    }
+}
+
+if ($result == false) {
+    $src = str_replace('https', 'http', $src);
+}
+
+if ($convertToSecure) {
+    $src = str_replace('http', 'https', $src);
+}
+
+$result = '';
+switch ($type) {
+    case 'link':
+        // Check if links comes from a course
+        $srcParts = explode('/', $src);
+        $srcParts = array_filter($srcParts);
+        $srcParts = array_values($srcParts);
+
+        if (isset($srcParts[0], $srcParts[2]) && $srcParts[0] === 'courses' && $srcParts[2] === 'document') {
+            $src = $_configuration['root_web'].$src;
+        }
+
+        if (strpos($src, 'http') === false) {
+            $src = "http://$src";
+        }
+        header('Location: '.$src);
+        exit;
+        break;
+    case 'iframe':
+        $result = '<iframe src="'.$src.'" width="'.$width.'" height="'.$height.'" ></iframe>';
+        break;
+    case 'flash':
+        $result =  '
+        <object 
+            id="'.$id.'" width="'.$width.'" height="'.$height.'" align="center"
+            codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">
+            <param name="id" value="'.$id.'">
+            <param name="width" value="'.$width.'">
+            <param name="height" value="'.$height.'">
+            <param name="bgcolor" value="#ffffff">
+            <param name="align" value="center">
+            <param name="allowfullscreen" value="true">
+            <param name="allowscriptaccess" value="always">
+            <param name="quality" value="high">
+            <param name="wmode" value="transparent">
+            <param name="flashvars" value="'.$vars.'">
+            <param name="src" value="'.$src.'">
+            <embed 
+                id="'.$id.'" width="'.$width.'" height="'.$height.'" bgcolor="#ffffff" align="center" 
+                allowfullscreen="true" allowscriptaccess="always" quality="high" wmode="transparent" 
+                flashvars="'.$vars.'" src="'.$src.'"
+                type="application/x-shockwave-flash" 
+            >
+        </object>';
+}
+
+echo $result;

二进制
apple-touch-icon.png


+ 1 - 1
composer.json

@@ -33,7 +33,7 @@
         ]
     },
     "require": {
-        "php": ">=5.5",
+        "php": ">=5.6",
         "ext-intl": "*",
         "ext-gd": "*",
         "ext-curl": "*",

+ 389 - 81
documentation/changelog.html

@@ -7,6 +7,39 @@
     <link rel="stylesheet" href="default.css" type="text/css" media="screen,projection" />
     <link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" />
     <script src="../web/assets/jquery/dist/jquery.js"></script>
+    <style>
+        .version h1 {
+            padding-top: 60px;
+        }
+    </style>
+    <script>
+      $(document).ready(function() {
+        $('.version').each(function() {
+          var version = $(this).attr('aria-label');
+          var title = $(this).find('h1').text();
+          var titleParts = title.split('-');
+          title = titleParts[0];
+          var cityParts = titleParts[1].split(',');
+
+          var city = cityParts[0];
+          var date = cityParts[1];
+
+          if (typeof date !== 'undefined') {
+          } else {
+            date = city;
+            city = '';
+          }
+          var link = $("<a/>", {
+            text: title,
+            "title": title,
+            "href": "#"+version
+          });
+          $("#index").append(
+            $('<tr>').append($('<td>').append(link), $('<td>').append(city), $('<td>').append(date))
+          );
+        });
+      });
+    </script>
 </head>
 <body>
 <nav class="navbar navbar-default navbar-fixed-top">
@@ -33,40 +66,6 @@
         </div><!--/.nav-collapse -->
     </div>
 </nav>
-<style>
-    .version h1 {
-        padding-top: 60px;
-    }
-</style>
-
-<script>
-    $(document).ready(function() {
-        $('.version').each(function( index ) {
-            var version = $(this).attr('aria-label');
-            var title = $(this).find('h1').text();
-            var titleParts = title.split('-');
-            title = titleParts[0];
-            var cityParts = titleParts[1].split(',');
-
-            var city = cityParts[0];
-            var date = cityParts[1];
-
-            if (typeof date !== 'undefined') {
-            } else {
-                date = city;
-                city = '';
-            }
-            var link = $("<a/>", {
-                text: title,
-                "title": title,
-                "href": "#"+version
-            });
-            $("#index").append(
-                $('<tr>').append($('<td>').append(link), $('<td>').append(city), $('<td>').append(date))
-            );
-        });
-    });
-</script>
 
 <div class="container"><div class="row"><div class="col-md-12">
 <ul class="breadcrumb">
@@ -106,8 +105,317 @@
 
     </table>
 
+    <div class="version" aria-label="1.11.12">
+        <a id="1.11.12"></a>
+
+        <h1>Chamilo 1.11.12 - ,  ?/09/2019</h1>
+        <h3>Release notes - summary</h3>
+        <p>Chamilo 1.11.12 is a minor bugfix release on top of 1.11.10.</p>
+        <p>Starting from this release, changes are registered by reversed date of addition (the latest changes first), which dramatically improves the changelog edition time. Because yes, it is reviewed manually.</p>
+        <h3>Release name</h3>
+        <p>Version name paragraph</p>
+        <h3>Security fixes</h3>
+        <ul aria-live="off">
+            <li>None</li>
+        </ul>
+        <h3>Possibly breaking changes</h3>
+        <ul aria-live="off">
+            <li>None</li>
+        </ul>
+        <h3>Notable new Features</h3>
+        <h4>For end-users, teachers and Chamilo admins</h4>
+        <ul aria-live="off">
+            <li>[2019-08-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/58d67bf87aaa029034e2e24056c9b693fe19f1b0">58d67bf8</a> - <a href="https://task.beeznest.com/issues/16003">BT#16003</a>) CKEditor: Allow adding responsive video with the video plugin</li>
+            <li>[2019-08-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/14001517782d6d5dd15255639e874bd14bc85cd6">14001517</a> - <a href="https://task.beeznest.com/issues/16003">BT#16003</a>) CKEditor: Allow responsive Vimeo videos with oEmbed</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/196a2fa1719cb49c623c4a56a13706e3e7961939">196a2fa1</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Add up/down arrows in LP item edition list</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/caeacdd6b78cae06c9f0ec28f53bac659a0f934a">caeacdd6</a> - <a href="https://task.beeznest.com/issues/15930">BT#15930</a>) Learnpath: Check if exercise item step is completed in other sessions</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/3600bdc528aa5880b9bfc14ac25570065931434b">3600bdc5</a> - <a href="https://task.beeznest.com/issues/15932">BT#15932</a>) Forum: Add option in course settings to auto-subscribe users to all forum notifications</li>
+            <li>[2019-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/a96e975819b50377e655f5d92e2517ccc52a0974">a96e9758</a> - <a href="https://task.beeznest.com/issues/15933">BT#15933</a>) Message: Add "promoted messages" for admin</li>
+            <li>[2019-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/327bf12809ab27abca8dab90f124a411729d9517">327bf128</a> - <a href="https://task.beeznest.com/issues/15826">BT#15826</a>) Tracking: Add new login/logout access report</li>
+            <li>[2019-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/b6267722dcd2fde67dbd6f4669e13cc3868239d5">b6267722</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: Add new exercise feedback type EXERCISE_FEEDBACK_TYPE_POPUP</li>
+            <li>[2019-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/78c74f872de7ac05d3c94c4f606b60553742bcc7">78c74f87</a> - <a href="https://task.beeznest.com/issues/15808">BT#15808</a>) Plugin: CourseHomeNotification: Add plugin to enable configurable notifications at the course level, on the course homepage</li>
+            <li>[2019-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/c393fe0aee7c4d870f38ab46101de772251d2ab7">c393fe0a</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Add regenerate recording setting</li>
+            <li>[2019-06-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/0502e3711ddf9ae9e476468a10f79cabe30c0a21">0502e371</a> - <a href="https://task.beeznest.com/issues/15744">BT#15744</a>) Exercise: Add clone option in the select multiple question pool</li>
+            <li>[2019-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/41cccb7f66714c99478aebaec7e9ac598a3b5f5e">41cccb7f</a> - <a href="https://task.beeznest.com/issues/15744">BT#15744</a>) Exercise: Add selection of multiple items in question pool</li>
+            <li>[2019-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/03343168463dd9dbe1d6bf168359a93ef42a832c">03343168</a> - <a href="https://task.beeznest.com/issues/15746">BT#15746</a>) Exercise: Add new option "AutoEvaluationAndRankingMode" to show score and ranking table</li>
+            <li>[2019-06-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/532653fe60c3fefe096a011779de08789f9475d2">532653fe</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Tracking: Allow general coach to export student results to PDF</li>
+            <li>[2019-06-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/8275d004a16c9e1f0d5b5ca140b1546d2990cdde">8275d004</a> - <a href="https://task.beeznest.com/issues/15743">BT#15743</a>) Exercise: Show correct answers and student answers when option RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER is selected</li>
+            <li>[2019-06-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/524b305038853710ea5db972d95741e87a51b001">524b3050</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Add compilatio tool</li>
+            <li>[2019-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/9dab238435dee577c9b4c833b538efd208470793">9dab2384</a> - <a href="https://task.beeznest.com/issues/15715">BT#15715</a>) Tracking: Add total time in date range statistics report</li>
+            <li>[2019-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/f1e92f99b9cb57d3cab15dfc1adacb9e93f5283f">f1e92f99</a> - <a href="https://task.beeznest.com/issues/13541">BT#13541</a>) Group: Add new group announcement option (private message) by group owner</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/bfaba8a9eeba709fa60ff521166a2dbf0cb54c7f">bfaba8a9</a> - <a href="https://task.beeznest.com/issues/15624">BT#15624</a>) Gradebook: Generate skills doesn't require "generate certificate" dependency</li>
+            <li>[2019-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/933b83d9b830f88ac04f221e9a912e64a7cd71e8">933b83d9</a> - <a href="https://task.beeznest.com/issues/15675">BT#15675</a>) Assignment: Add bulk actions (delete/change status) in student's work list</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/733259044f1b1c2089ae93716e7fafd2ad40c5ab">73325904</a> - <a href="https://task.beeznest.com/issues/15669">BT#15669</a>) Session: Add new option to add course teachers as a coach</li>
+            <li>[2019-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/52fb31926bd4c819a89055e69194ae9c22b45cc7">52fb3192</a> - <a href="https://task.beeznest.com/issues/15679">BT#15679</a>) Link: Add PDF export of links page</li>
+            <li>[2019-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/903d04aafe1de5054c9b42a7a59c2dc2a8b798de">903d04aa</a> - <a href="https://task.beeznest.com/issues/15670">BT#15670</a>) Tracking: Add extra field filter in the myspace/session page</li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/fed1fe15672dc122396aa0d4dc3f9ec1d6319aed">fed1fe15</a> - <a href="https://task.beeznest.com/issues/15624">BT#15624</a>) Gradebook: Add recalculate certificate with skills</li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/9976ca6fa8d9daab7c997753f2a172e33b38deeb">9976ca6f</a> - <a href="https://task.beeznest.com/issues/15624">BT#15624</a>) Gradebook: Add possibility to assign skills to users for gradebook sub-categories</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/cc9003b4a0bbbbc463820add8b065cb043c837f5">cc9003b4</a> - <a href="https://task.beeznest.com/issues/15553">BT#15553</a>) Tracking: Add surveys report</li>
+            <li>[2019-05-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/ec5893c15a74d1c860cd081ecca44fba57107232">ec5893c1</a> - <a href="https://task.beeznest.com/issues/15390">BT#15390</a>) Plugin: Add EmbedRegistry plugin</li>
+        </ul>
+        <h4>For developers and sysadmins</h4>
+        <ul aria-live="off">
+            <li>[2019-08-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/e6b7f3941fc5bc4797bd7aaee026cbc691ed9f33">e6b7f394</a> - <a href="https://task.beeznest.com/issues/15971">BT#15971</a>) Admin: Add configuration setting "allow_online_users_by_status" to only show online users count to specific roles/status</li>
+            <li>[2019-08-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/a08473588275ac3ab2e5feed7a7c1405d221216e">a0847358</a> - <a href="https://task.beeznest.com/issues/15932">BT#15932</a>) Admin: Subscribe user to a forum automatically when subscribing session users</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/17a16e05d3cd492cff3a250fdf3f1b4f2a2e23d1">17a16e05</a> - <a href="https://task.beeznest.com/issues/15970">BT#15970</a>) Admin: Add configuration setting "hide_course_sidebar" to hide "Courses" block in the left menu</li>
+            <li>[2019-08-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/6588a378778a9d2d5531dec5255ac5cb290aa7d4">6588a378</a>) Internal: Upgrade require PHP version to 5.6</li>
+            <li>[2019-08-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/815e3acafd449e75fce33067fb367f3a9448df24">815e3aca</a> - <a href="https://task.beeznest.com/issues/15962">BT#15962</a>) Admin: Add new option for configuration setting "lp_view_settings" allowing to show/hide the mini-toolbar by default</li>
+            <li>[2019-08-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/de0f6024e1b37df2d3ebd70985d62edd7c2dd136">de0f6024</a> - <a href="https://task.beeznest.com/issues/15958">BT#15958</a>) Admin: Add configuration setting "exercise_score_format" to format the score in exercise results</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/2c5e3a8ebe0ed3d5d584902a87a9d6fa4b67a76d">2c5e3a8e</a> - <a href="https://task.beeznest.com/issues/15806">BT#15806</a>) Admin: Send mail errors to the platform admin</li>
+            <li>[2019-07-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/3bdb2fa6cca5f4e6e7df2181cca062e262d6ac1a">3bdb2fa6</a> - <a href="https://task.beeznest.com/issues/15934">BT#15934</a>) Admin: Add configuration setting "disable_dislike_option" option to remove the dislike button when like/dislike is enabled in the social network</li>
+            <li>[2019-07-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/6719ca238fc34c2a46d1168ca6c254d97bac38cc">6719ca23</a> - <a href="https://task.beeznest.com/issues/15930">BT#15930</a>) Admin: Add configuration setting "validate_lp_prerequisite_from_other_session". Allows user to enter a LP item if it was validated in another session</li>
+            <li>[2019-07-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/247e609e88696d6d679fe1a596573a0d16edfbc8">247e609e</a> - <a href="https://task.beeznest.com/issues/15929">BT#15929</a>) Admin: Add latest login column in user list</li>
+            <li>[2019-07-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/9a3514eb2ee13ec354cb6eabf7a0fc953ba5bf83">9a3514eb</a> - <a href="https://task.beeznest.com/issues/15916">BT#15916</a>) Admin: Add configuration setting "language_flags_by_country" to decide to show the flags or not in the language drop-down (flags are for countries, not languages)</li>
+            <li>[2019-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/77a97dcbd7182706e29fb36554ff22140c9f2467">77a97dcb</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Add configuration setting "bbb_force_record_generation"</li>
+            <li>[2019-07-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/dbbb577a4856abe2c44eaf25ce4cf1872aece9e8">dbbb577a</a> - <a href="https://task.beeznest.com/issues/15844">BT#15844</a>) Admin: Add configuration setting "allow_quiz_save_correct_options" to allow different "save_correct_answers" options in order to get all answers (correct and incorrect) from previous attempts. Requires DB change.</li>
+            <li>[2019-07-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/84d4105a9005f7ac6c3836695a00f56bc0e8dc2d">84d4105a</a> - <a href="https://task.beeznest.com/issues/15844">BT#15844</a>) Admin: Add configuration setting "allow_quiz_results_page_config" to handle page results UI. Requires DB change.</li>
+            <li>[2019-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/f1ab4dc873ace9516bd47677eddddfdba5144736">f1ab4dc8</a>) Admin: Add double version information in system status page to make it easier to know the version of the platform.</li>
+            <li>[2019-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/80612d661f3511ce3149a0385c1f2864d603d6b9">80612d66</a> - <a href="https://task.beeznest.com/issues/15161">BT#15161</a>) Admin: Add configuration setting "plugin_redirection_enabled" to redirect imported users in Plugin Redirection</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/42f9e96adb51c284b0f1a0025d61a1980c1c43ec">42f9e96a</a> - <a href="https://task.beeznest.com/issues/15857">BT#15857</a>) Admin: Add new configuration setting "send_inscription_notification_to_general_admin_only". Allows sending the new user notification when 'allow_registration' = 'approval' to the main admin.</li>
+            <li>[2019-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/ad49e34f8336f198d013c08fa143ab2af77a7e7d">ad49e34f</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Allow generate records when user didn't click in "record conference"</li>
+            <li>[2019-07-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/db60bd5a4b9b3f6191959676e4e120850bda2a3d">db60bd5a</a> - <a href="https://task.beeznest.com/issues/15694">BT#15694</a>) Webservice: Add gradebook webservice</li>
+            <li>[2019-07-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/fb3483efbbac6e1fec6265b5b5fc0b838d5fd6c1">fb3483ef</a> - <a href="https://task.beeznest.com/issues/15636">BT#15636</a>) Admin: Add configuration setting "allow_exercise_categories". Allow exercise categories. Requires DB changes</li>
+            <li>[2019-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/856ad962ee1790daf81b81499a12c7035629159b">856ad962</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Plugin: Azure B2B AD: Add option to enable management login</li>
+            <li>[2019-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/51e240a8e22c91e719c0ea8ba6eeac796730e2f5">51e240a8</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Internal: Add api_get_plugin_setting to twig filters</li>
+            <li>[2019-06-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/3c7dda22ca4d3be8e86848abc3cdae0ca2758d38">3c7dda22</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Plugin: Azure B2B AD: Add option to show logout button</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd483f98ec09922bdb1cbc47f70af5cae8e3a96a">dd483f98</a> - <a href="https://task.beeznest.com/issues/15811">BT#15811</a>) Internal: Add function to load languages files: Wrap the current code to include language files into a function</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/43c6b80e92ebfa89029ddd36e232f0867a8253a7">43c6b80e</a>) Global: Remove PHP 5.5 support</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/34f57596fcba68e234cd14eaa34b6fdfdaa4ff3b">34f57596</a> - <a href="https://task.beeznest.com/issues/15760">BT#15760</a>) Admin: Add configuration setting "quiz_generate_certificate_ending" to add a button at the end of a quiz to point to the (generic) certificate</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/da21a80205b6490453788370169b48f3f68e5125">da21a802</a>) Documentation: Add documentation on rules to optimize loading of media resources from documents</li>
+            <li>[2019-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/030527eb4ed0fbb9b7bdae3440b3952131954a77">030527eb</a> - <a href="https://task.beeznest.com/issues/15334">BT#15334</a>) Learnpath: Add configuration setting "allow_htaccess_import_from_scorm" to allow .htacces files to be imported inside SCORM packages. This adds a big security risk, so disabled by default.</li>
+            <li>[2019-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/69bce067f5dd397638cfec21ed0a6586cdcc6bae">69bce067</a> - <a href="https://task.beeznest.com/issues/15748">BT#15748</a>) Admin: Add configuration setting "remove_session_url" to hide link to session when there is a session category in user portal (template customization required)</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/356937c121964be999f7fd2ef76470aa8c73b379">356937c1</a> - <a href="https://task.beeznest.com/issues/15177">BT#15177</a>) Internal: Add "linkifyjs" lib in order to convert urls into links</li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/52c77b30d0395a264c3be0ad18f80ebb5435b657">52c77b30</a> - <a href="https://task.beeznest.com/issues/15586">BT#15586</a>) Admin: Add configuration setting "block_my_files_access"</li>
+            <li>[2019-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/4f0b6b4723c13f6ec1edfa1dc1eef65be0e2fd85">4f0b6b47</a> - <a href="https://task.beeznest.com/issues/15586">BT#15586</a>) Admin: Add configuration setting "cron_notification_help_desk" to notify users on CSV import</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/f1d0a5628d342ba3fdae4552127914492861ca83">f1d0a562</a>) Admin: Force use of configuration setting "gradebook_report_score_style" instead of platform setting "gradebook_show_percentage_in_reports"</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/53487be83555ecdf3147b7f99f2c1aedf5d5f921">53487be8</a> - <a href="https://task.beeznest.com/issues/15652">BT#15652</a>) Admin: Add configuration setting "gradebook_report_score_style" to setup custom score style</li>
+            <li>[2019-05-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/7b9b8a5d19815e6b269653fe0f79e85f41d05924">7b9b8a5d</a> - <a href="https://task.beeznest.com/issues/15596">BT#15596</a>) Admin: Add configuration setting "add_user_course_information_in_mailto"</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/0ab8cf8f067dd5dbb2e34f6aecddffc800f79913">0ab8cf8f</a> - <a href="https://task.beeznest.com/issues/15126">BT#15126</a>) Admin: Add configuration option to "courses_list_session_title_link" setting to hide link but show session</li>
+            <li>[2019-05-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/3c3eb2fdaf172ad2373e21d2214ab31e13a7e468">3c3eb2fd</a> - <a href="https://task.beeznest.com/issues/15511">BT#15511</a>) Internal: Add script to fix iid/id LP issues when migrating from 1.9.x BT#15511</li>
+            <li>[2019-05-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/149df5e8d756ae4e20d7cac1757606cc379876c7">149df5e8</a>) Update documentation to indicate removed support for PHP 7.0</li>
+        </ul>
+        <h3>Improvements (minor features) and debug</h3>
+        <ul aria-live="off">
+            <li>[2019-08-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/5ac590eea85dc712041e1267ebfa673f08d6ad70">5ac590ee</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) Template: Changed site_name to institution name in mail template from automated CSV import</li>
+            <li>[2019-08-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/9f462b4eb063bf77073ed2ec7e62a789838e61e5">9f462b4e</a> - <a href="https://task.beeznest.com/issues/15826">BT#15826</a>) Tracking: Remove partial start and end date from each course table (only use duration) in PDF time report and change report title</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/5c4a877e527c83090b7b534cf8c797a4ff641c3c">5c4a877e</a>) Plugin: BuyCourses: Add message to configure currency</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/23965466c1c166a4de57967864134691cb6af8b3">23965466</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2964">GH#2964</a>) Exercise: Fix copy with current session ID</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/0a353bdee629f53b75d297697e68a44197b55cd0">0a353bde</a> - <a href="https://task.beeznest.com/issues/16036">BT#16036</a>) Exercise: Fix query for exercise categories in exerciseGrid() not showing any exercise</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/b3c548530d68fdf6e045318a6a95d11e2f7ad573">b3c54853</a> - <a href="https://task.beeznest.com/issues/16036">BT#16036</a>) Tracking: Increase precision in tracking query when session position feature is enabled</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/d4ca572878f0be7d790ab12fb91299bfc6a913e6">d4ca5728</a>) Exercise: Fix hotspot_delineation results in modal context</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/4bc2f021f6e7154f7b9bf38c05ad54faea7ee97a">4bc2f021</a> - <a href="https://task.beeznest.com/issues/16014">BT#16014</a>) Exercise: Simplify weird condition to hide tests in Exercise::exerciseGrid()</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/c764cb00459c81b0fd8c9a0d4a59471167b5b629">c764cb00</a> - <a href="https://task.beeznest.com/issues/16014">BT#16014</a>) Exercise: Clean-up. Remove deprecated $page, $from and $limit variables from Exercise::exerciseGrid()</li>
+            <li>[2019-08-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a5d18a292d872a3cf137fee6609f9619e4862b1">7a5d18a2</a> - <a href="https://task.beeznest.com/issues/16003">BT#16003</a>) CKEditor: Allow width/height in percentages</li>
+            <li>[2019-08-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/2eeabfa3a2cc1e32f080ff3e200d86949784cc7b">2eeabfa3</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) CSV Import: Allow more than one career to be printed in mails sent from events in import_csv.php</li>
+            <li>[2019-08-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/dfd5bc8d7ce1feac4b1f678f2eaddf4cd56237af">dfd5bc8d</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) CSV Import: Fix issue linking external career names in automated CSV import of calendar events (2/2)</li>
+            <li>[2019-08-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/d868d51f73bd8d7ae0384aec87e8ab267f361c4a">d868d51f</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) CSV Import: Fix issue linking external career names in automated CSV import of calendar events</li>
+            <li>[2019-08-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/fbadf1bf7f4684537384ed9ed741170c50beeea8">fbadf1bf</a> - <a href="https://task.beeznest.com/issues/16003">BT#16003</a>) CKEditor: Fix oEmbed plugin's relationship with CKEditor's objects</li>
+            <li>[2019-08-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/509437e2579d79f753d2f5904872df6f740edb2f">509437e2</a> - <a href="https://task.beeznest.com/issues/15941">BT#15941</a>) Internal: FormValidator return SelectAjax added</li>
+            <li>[2019-08-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/f5feaecc2ef2c2a7b4f3eeebe85ef5e088dfda46">f5feaecc</a> - <a href="https://task.beeznest.com/issues/15996">BT#15996</a>) Exercise: Show complete question list on admin view</li>
+            <li>[2019-08-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/d98760dd88f8a1196a527beb51e74ef1305e74c7">d98760dd</a> - <a href="https://task.beeznest.com/issues/15996">BT#15996</a>) Exercise: Don't update question positions when saving</li>
+            <li>[2019-08-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/eb2417e44ac4baddaeb57f529d6b8006eed24c32">eb2417e4</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Fix ordering, logs removed</li>
+            <li>[2019-08-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/dd2fb31e482c6eb83a8c2d390891bdff51bd675a">dd2fb31e</a> - <a href="https://task.beeznest.com/issues/15983">BT#15983</a>) Exercise: Temporarily use exercise ID instead of IID to avoid conflict with the delete and other methods not yet migrated to IID</li>
+            <li>[2019-08-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/d8593ad72b0897c92d0754ecc3eab9fcb748ba54">d8593ad7</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: WIP - Fix ordering</li>
+            <li>[2019-08-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/59692ef0595e93180d98227200bc3594878e1408">59692ef0</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: Fix calculated questions on Enter key action</li>
+            <li>[2019-08-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/5271ef3b74f9802048df26a76641f6e0d1e729ec">5271ef3b</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Fix to items ordering</li>
+            <li>[2019-08-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/b850664e6d4d7db81277ef2cdaf4ac8bbf1dd488">b850664e</a>) Display: Move apple touch PNG</li>
+            <li>[2019-08-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/cc2108cc3315fb2f322a92cbffb592fdc8b421b5">cc2108cc</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2974">GH#2974</a>) Plugin: BigBlueButton: Check if host setting is set</li>
+            <li>[2019-08-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/5e302265cfa597f5881b5f663a75972dcd1947ce">5e302265</a>) Message: Update CSS for promoted_post</li>
+            <li>[2019-08-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/a5cab353c09e4be206cfa2d599bb888e16614438">a5cab353</a>) Display: Update icon apple-touch-icon.png</li>
+            <li>[2019-08-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/1aad396caabd2886595f83f41dda52ad2be03ecc">1aad396c</a> - <a href="https://task.beeznest.com/issues/15987">BT#15987</a>) Plugin: BuyCourses: Fix browsing course to buy list</li>
+            <li>[2019-08-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a692eed73416cbe1c331c08f2dee2bb77b6eadf">7a692eed</a>) Internal: Fix count message PHP warning.</li>
+            <li>[2019-08-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/886b1054bdb17406202726b87db5da634c3cd107">886b1054</a> - <a href="https://task.beeznest.com/issues/15934">BT#15934</a>) Message: Fix like/dislike icons</li>
+            <li>[2019-08-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/615d7342de522122fc25d3bda6a4645471ce49e7">615d7342</a> - <a href="https://task.beeznest.com/issues/15983">BT#15983</a>) Message: Fix redirect, remove unused code</li>
+            <li>[2019-08-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/d88e0b6367600b9839cb0f1fbd40882f24eedfd5">d88e0b63</a> - <a href="https://task.beeznest.com/issues/15983">BT#15983</a>) Display: Refactor message grid</li>
+            <li>[2019-08-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/e8bc411a5ab3a7d65bad184ca77c17e7739257ec">e8bc411a</a> - <a href="https://task.beeznest.com/issues/15928">BT#15928</a>) Mobile: Format content for push notifications</li>
+            <li>[2019-08-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/8f97c374f5c2cf0c4be455962a8ea106b2709b26">8f97c374</a> - <a href="https://task.beeznest.com/issues/15928">BT#15928</a>) Mobile: Fix sending of push notifications</li>
+            <li>[2019-08-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/319bf79c8722cf85dca81563d4ae4d5bf9ea65ec">319bf79c</a>) Message: Fix redirect after deleting a message</li>
+            <li>[2019-08-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/a834f88421a80f3a06f56b53686a98ad84dc5d3a">a834f884</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Lp item list: Allow all items to be moved using arrows except the "final item".</li>
+            <li>[2019-08-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/2dd97f560f19d605b2506e3953b8aa6498b6bd61">2dd97f56</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Lp item list: Allow documents to be moved using arrows</li>
+            <li>[2019-08-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/b2915bdef2b97a29c8b64c99f9c371baa824dfa7">b2915bde</a> - <a href="https://task.beeznest.com/issues/15972">BT#15972</a>) Exercise: Fix toolbar filter in exercise results page</li>
+            <li>[2019-08-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/7eaa45e6194a932dd03befe56d278a8b18b4c56a">7eaa45e6</a> - <a href="https://task.beeznest.com/issues/15933">BT#15933</a>) Display: Add promoted messages CSS style</li>
+            <li>[2019-08-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/d81cef333df534e9f09cc8a876f78aac8ad441ae">d81cef33</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: Fix delineation results issue</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/3fc242260eb45fbc9ca7a09a1512466e0b9dc71b">3fc24226</a>) Display: Fix PDF export styling in access_details_session.php</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/ad134425375ae51859a8b24d80d5d7185d0dbe69">ad134425</a> - <a href="https://support.chamilo.org/issues/15933">CT#15933</a>) Display: Add promoted_message icons</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/b8128a72e5efc23ec17899138ad9029b239cd1a0">b8128a72</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: Calculated questions fix when using popup/direct feedback</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/7122dc33a1a8c1b1a74f390ac7bbff480e4b4b9e">7122dc33</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Only allow lp item list order buttons for chapter and final item BT#15967</li>
+            <li>[2019-08-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/adae9738d3d4d3c9c2a28f65a8b3f3c500555649">adae9738</a> - <a href="https://task.beeznest.com/issues/15967">BT#15967</a>) Learnpath: Fix lp item list order</li>
+            <li>[2019-08-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/e859a26682211aa1308457d683f3614e248c045c">e859a266</a>) Message: Fix message URL + fix conditions</li>
+            <li>[2019-08-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/74fa0a3333ced43cee1d3d76bb32272ea40233c4">74fa0a33</a>) Exercise: Improve exercise results page display</li>
+            <li>[2019-08-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe802ec7fa6a38786294dbcb91053985a6aaec17">fe802ec7</a> - <a href="https://task.beeznest.com/issues/15962">BT#15962</a>) Learnpath: LP mini-toolbar is now folded by default</li>
+            <li>[2019-08-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/b6d3f9be7057fcf29a19e085b30e78a0c8b27f1f">b6d3f9be</a> - <a href="https://task.beeznest.com/issues/15937">BT#15937</a>) Gradebook: Fix min certificate to be 0</li>
+            <li>[2019-08-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/516279ea47b9434d209e9fb202db989affafecd8">516279ea</a> - <a href="https://task.beeznest.com/issues/15854">BT#15854</a>) Tracking: Read session extra field "disable_log_after_session_ends" in order to block course logs aftet the session has expired</li>
+            <li>[2019-08-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/75edd8edad44d6610949649309c12ac6afc31387">75edd8ed</a> - <a href="https://task.beeznest.com/issues/15826">BT#15826</a>) Tracking: Add total table to PDF report of access to sessions (PDF export icon in student tracking)</li>
+            <li>[2019-08-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/6db3dffdbb1fcb90a7f98140361cdcad7472bc41">6db3dffd</a>) Internal: Update PHP version to 5.6 in composer.json</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/26401f771128848e3dcf55d2335bd8e0c9417a5f">26401f77</a> - <a href="https://task.beeznest.com/issues/15806">BT#15806</a>) Admin: Send an email with error messages if exists to the current user when creating or editing a user</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/d8ae9d4744df46a6225d946f889f3d9a415fa16f">d8ae9d47</a> - <a href="https://task.beeznest.com/issues/15920">BT#15920</a>) Learnpath: Fix issue with invitee role viewing learning paths</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/debefbf9f0d57266be3eb1e2943327d1fb169d9e">debefbf9</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Improve Compilatio results UI</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/96d44a45f29a1a45dea8fd0bc5994914338c866d">96d44a45</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Improve Compilatio results UI</li>
+            <li>[2019-08-02] (<a href="https://github.com/chamilo/chamilo-lms/commit/4af41b41cb2200a8e6fb9b0236bd39560b05c3d8">4af41b41</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Improve Compilatio results UI</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/b1cbe90de704bcea7bc6e7438e78ab776dcfdc2c">b1cbe90d</a> - <a href="https://task.beeznest.com/issues/15935">BT#15935</a>) Display: Fix courses grid</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/97be842533115edb0c090b4a30f3ac18a17546e9">97be8425</a> - <a href="https://task.beeznest.com/issues/15933">BT#15933</a>) Social: Allow comments in promoted messages BT#15933</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/5e6461edcb818b375d99a78af33138e85bb87250">5e6461ed</a> - <a href="https://task.beeznest.com/issues/15944">BT#15944</a>) Gradebook: Fix query to get session if is null or 0</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/e91021a3257407e3f06cbb62afa40b94502feed2">e91021a3</a> - <a href="https://task.beeznest.com/issues/15826">BT#15826</a>) Tracking: Improve and validate date format</li>
+            <li>[2019-08-01] (<a href="https://github.com/chamilo/chamilo-lms/commit/70a731284d538590b8e64ffdad7e6fba80657b26">70a73128</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: WIP: Refactor immediate popup direct feedback code</li>
+            <li>[2019-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/0ed6d91a125859a5b167851a0b1a1e667e43e04a">0ed6d91a</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Improve Compilatio UI</li>
+            <li>[2019-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/edc1b0bc046deb1740dd07f8f3e971db811aa8db">edc1b0bc</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Remove unused Compilatio variables</li>
+            <li>[2019-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/8874f72f5ff524fca61ba8615fb20beacf70913f">8874f72f</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Add Compilatio fixes</li>
+            <li>[2019-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/106100a53dcf0f0dd85756a146489659377b38b4">106100a5</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Add fixes to Compilatio</li>
+            <li>[2019-07-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/a627bd47b2a1c27b0f6862c05359dc362da5a62b">a627bd47</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercises: Allow new type of questions in immediate popup exercises. Improve class loading</li>
+            <li>[2019-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/c93a451a56fac55a186b14b8bf35d2471430f418">c93a451a</a> - <a href="https://task.beeznest.com/issues/15743">BT#15743</a>) Internal: Write timezone into the user session</li>
+            <li>[2019-07-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/5ee3a54cfd21c35be073ee7ec4274e8b448a0d99">5ee3a54c</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2957">#2957</a>) Internal: Fix function name, add comments</li>
+            <li>[2019-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/9e5469bf4ee8b588f7359a0362bc0b573c3cbc2f">9e5469bf</a> - <a href="https://task.beeznest.com/issues/15743">BT#15743</a>) Exercise: Add JS countdown to see results, if quiz extra field "results_available_for_x_minutes" is set</li>
+            <li>[2019-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/b9944096abbb4710ee9c006d0ca50cedd6bed46c">b9944096</a>) Learnpath: Option "use_new_tracking_in_lp_item" requires to add an LP extra field. LP extrafield called "track_lp_item"</li>
+            <li>[2019-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/01a2af608593e802f370f657f048c1d7e82040fa">01a2af60</a> - <a href="https://task.beeznest.com/issues/15768">BT#15768</a>) Learnpath: Save lp_item_id and attempt id, new tracking system can check time spent on LP.</li>
+            <li>[2019-07-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/e07c51a686c1ddbdcdb7e096ede92475b93625eb">e07c51a6</a> - <a href="https://task.beeznest.com/issues/15921">BT#15921</a>) Learnpath: Fix old redirection thanks to new messaging technique</li>
+            <li>[2019-07-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/900cce6e8cf1f2b05ad86b1eca669de122f256fa">900cce6e</a> - <a href="https://task.beeznest.com/issues/15916">BT#15916</a>) Display: Add Galician, Euskeran and Catalan flags</li>
+            <li>[2019-07-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/12ca5444fa253aafee786dbe9e887f2b3acb8481">12ca5444</a> - <a href="https://task.beeznest.com/issues/15743">BT#15743</a>) Exercise: Add extra field for exercises</li>
+            <li>[2019-07-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/7a494ed6fb9acc77c61c5f5e199bead8c19d4bd3">7a494ed6</a>) Internal: Use UserManager::formatUserFullName as in v2, format code</li>
+            <li>[2019-07-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/89fed6ecde101579661b4190123a630da41e230b">89fed6ec</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Save bbb "internal meeting id" in plugin_bbb_meeting table</li>
+            <li>[2019-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/a348c8f4d24889198850e3f7d2f4ff93e3e2a66a">a348c8f4</a> - <a href="https://task.beeznest.com/issues/15881">BT#15881</a>) Learnpath: Improve function is_lp_visible_for_student</li>
+            <li>[2019-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/84bd3df795726b96ac1faadbfd32c0f01db8c00b">84bd3df7</a> - <a href="https://task.beeznest.com/issues/15881">BT#15881</a>) Learnpath: Improve LP list loop performance</li>
+            <li>[2019-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/22291a843ddaf04a001e272f2b80b22f28d266e3">22291a84</a> - <a href="https://task.beeznest.com/issues/15899">BT#15899</a>) Admin: Add new option "send_to_coaches" checkbox in scheduled announcements. This option will send a copy of the email to all the course coaches of the session.</li>
+            <li>[2019-07-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/bbdd57e3f050a946ad60617d5dd75cc26f1361a0">bbdd57e3</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Record should be available to show the "regenerate record" button</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/db53efd730d1433d3d27df296f232e83be2e2c32">db53efd7</a>) Admin: Fix global document template comments</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/fd91e2408f8b816547669fcfeb076304c054bcff">fd91e240</a>) Admin: Do not translate template title anymore</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/519ff9045f094da91d4a0ff489c828a08a61d97a">519ff904</a>) Admin: Fix global document templates image validation</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/842210b7d064128dbdb098f15b59223997b90b7f">842210b7</a> - <a href="https://task.beeznest.com/issues/15694">BT#15694</a>) Gradebook: Fix gradebook score result when using sessions</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/af8cb8d2d6c59fb5439282593c965c5ac4ddfabb">af8cb8d2</a> - <a href="https://task.beeznest.com/issues/15894">BT#15894</a>) Internal: Try to find items using iid in exercises</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/d59a99214b17135233b6cc1218bc5a4f96cfdcf2">d59a9921</a>) Gradebook: Fix exercise id use</li>
+            <li>[2019-07-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/1dacd354a31bca51e291a521973ff6765415fe8f">1dacd354</a> - <a href="https://task.beeznest.com/issues/15891">BT#15891</a>) Group: Fix queries in groups when using multiple URL setup</li>
+            <li>[2019-07-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/c40550d0d8bc90165d9db0ab39e69ce9066ed942">c40550d0</a> - <a href="https://task.beeznest.com/issues/15892">BT#15892</a>) Group: Check if tool is available for users in a group, otherwise block access</li>
+            <li>[2019-07-08] (<a href="https://github.com/chamilo/chamilo-lms/commit/1faf35f500c6e1c684fef804c69bb4f185416d6f">1faf35f5</a> - <a href="https://task.beeznest.com/issues/15827">BT#15827</a>) Exercise: Improve UI modal question page</li>
+            <li>[2019-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/06c4dc0874898a15775e7bc806cb52e30f64fdc0">06c4dc08</a>) Calendar: Fix agenda files upload</li>
+            <li>[2019-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/f6b16777cae4ed42b10a023def7594046b8910e2">f6b16777</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2946">GH#2946</a>) Internal: Fix declaration of inheritable function</li>
+            <li>[2019-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/285759b3151a917b9768dbdfdc227c244d77a124">285759b3</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2945">GH#2945</a>) Quiz: Scenario mode is not embeddable</li>
+            <li>[2019-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/f6d3429a0daff85c4e387af8da98a79262dc8425">f6d3429a</a> - <a href="https://task.beeznest.com/issues/15858">BT#15858</a>) Gradebook: Use correct session id</li>
+            <li>[2019-07-04] (<a href="https://github.com/chamilo/chamilo-lms/commit/9a8c96938416b9237bb8abd3b507ce53b0db9184">9a8c9693</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) Import CSV Cron: fix announcement email subject, fix language loading BT#15628</li>
+            <li>[2019-07-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/1545341d74d496ab7f34d69edec598efc548a7f9">1545341d</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) Import CSV Cron: fix announcement email subject, fix language loading BT#15628</li>
+            <li>[2019-07-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/81f80b4e5dac5d49afa3506340959a42008bb097">81f80b4e</a> - <a href="https://task.beeznest.com/issues/12898">BT#12898</a>) Gradebook: Fix gradebook score UI when using course model</li>
+            <li>[2019-07-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/1c251f76588e2f4ce006731809add5414f842a94">1c251f76</a> - <a href="https://task.beeznest.com/issues/15553">BT#15553</a>) Survey: Improve survey report UI</li>
+            <li>[2019-06-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/a9b336c702f2fcd03d7e7481a477450da60b980e">a9b336c7</a> - <a href="https://task.beeznest.com/issues/15831">BT#15831</a>) Exercise: Fix QTI export when there's feedback</li>
+            <li>[2019-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/e54f219f46d7e4bee6055e1f24f4ec670e6e9f84">e54f219f</a> - <a href="https://task.beeznest.com/issues/15679">BT#15679</a>) Link: Show link categories content when exporting to PDF</li>
+            <li>[2019-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/0fb1d58ba88e30a3eb42f364acf65fd69c97b71e">0fb1d58b</a> - <a href="https://task.beeznest.com/issues/15802">BT#15802</a>) User: Allow course coach to export user list</li>
+            <li>[2019-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/4957ee3f87fd5e678265e584db0a8672840ff685">4957ee3f</a> - <a href="https://task.beeznest.com/issues/15056">BT#15056</a>) Migration: Add forum URL fixes</li>
+            <li>[2019-06-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/30ea07e472c76453624f9565c988bd43568bfb6e">30ea07e4</a> - <a href="https://task.beeznest.com/issues/15056">BT#15056</a>) Migration: Fix URL modifications</li>
+            <li>[2019-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/f78e2e88b24f471f8d2e9a14ef3d22eee4576a16">f78e2e88</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Plugin: Azure B2B AD: Fix template when plugin is disabled</li>
+            <li>[2019-06-25] (<a href="https://github.com/chamilo/chamilo-lms/commit/7d5e68d1d7a410186cb8d0965e15166b254f8579">7d5e68d1</a> - <a href="https://task.beeznest.com/issues/12898">BT#12898</a>) Gradebook: Update UI when using "course score model"</li>
+            <li>[2019-06-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/a7ad5865d41ac3174d08655de9837a7a23a276dc">a7ad5865</a> - <a href="https://task.beeznest.com/issues/15679">BT#15679</a>) Link: Fix course/session export of links to a PDF when links are in a session</li>
+            <li>[2019-06-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/8c27f9dcc9daf210942cd171765769f8901d2b37">8c27f9dc</a> - <a href="https://task.beeznest.com/issues/15802">BT#15802</a>) Gradebook: Course coach has access to user results</li>
+            <li>[2019-06-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/46df5e422d8c7683eb2fbc5aa1c6e4a578a7c090">46df5e42</a> - <a href="https://task.beeznest.com/issues/15677">BT#15677</a>) Display: Always show course code in the "Sort my courses" page</li>
+            <li>[2019-06-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/1b4d43733ca373e065b45af5ad4092fa9994bd02">1b4d4373</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2931">GH#2931</a>) Gradebook: Block page if certificate doesn't exists</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/cf6f667fef4031a5ce6771a616aadafb201bf30c">cf6f667f</a> - <a href="https://task.beeznest.com/issues/15811">BT#15811</a>) Gradebook: Display certificate with course language</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/325a6a82d7a9eaab2597e99f6312fbae0cb0e87d">325a6a82</a> - <a href="https://task.beeznest.com/issues/15807">BT#15807</a>) Admin: Fix global questions search by description</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/27e373da990616613ded59451278699d4553cf41">27e373da</a> - <a href="https://task.beeznest.com/issues/12815">BT#12815</a>) Plugin: StudentFollowup: Improve search form</li>
+            <li>[2019-06-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/ce1901ef6694c575f45ab67085d1b00505c98484">ce1901ef</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2932">GH#2932</a>) Display: Fix template errors in user tracking pages</li>
+            <li>[2019-06-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/d0a9e04c7de3736bf9848e5bdd075e705fa3966c">d0a9e04c</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Plugin: Azure B2B AD: Update readme file with configuration</li>
+            <li>[2019-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0720401a00081bb0861a457bb2ba206cdc82982a">0720401a</a> - <a href="https://task.beeznest.com/issues/8959">BT#8959</a>) Plugin: Azure B2B AD: Update to use oatuh2</li>
+            <li>[2019-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/f600c2bbce5696698fc11836f7d058c7c44d26fa">f600c2bb</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Internal: Vendor - Add thenetworg/oauth2-azure</li>
+            <li>[2019-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/2b2cd54bfa2ae46632f9b0ea30e08f407df0ee16">2b2cd54b</a> - <a href="https://task.beeznest.com/issues/15697">BT#15697</a>) Learnpath: Fix order of published LP according to their categories</li>
+            <li>[2019-06-18] (<a href="https://github.com/chamilo/chamilo-lms/commit/1d4ec845a73ffe7d6274aaeef4096743ea611cfc">1d4ec845</a> - <a href="https://task.beeznest.com/issues/15743">BT#15743</a>) Exercise: Change new result option: Option RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER_AND_RANKING now works like RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER and RESULT_DISABLE_RANKING</li>
+            <li>[2019-06-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/ad08c5294b6c7827c85af4078ad13afa91078ea3">ad08c529</a> - <a href="https://task.beeznest.com/issues/15760">BT#15760</a>) Internal: Use const instead of value</li>
+            <li>[2019-06-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/07579db4e8cb6ca0cf0f1051ebd08d0b2328b76e">07579db4</a> - <a href="https://task.beeznest.com/issues/15687">BT#15687</a>) Tracking: Fix first user connection date</li>
+            <li>[2019-06-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/3be52e2b836ffbea9b869d457527d21db92b14a3">3be52e2b</a> - <a href="https://task.beeznest.com/issues/15789">BT#15789</a>) Exercise: Fix result display of unique-answer question type</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/a32a49c965a910be6ce08b437ec2a56a7f3d33a2">a32a49c9</a> - <a href="https://task.beeznest.com/issues/15760">BT#15760</a>) Learnpath: Fix returned value + remove one condition</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/7c289a2f289ed4f1ab058330936726c0da3592dc">7c289a2f</a> - <a href="https://task.beeznest.com/issues/12723">BT#12723</a>) CSV import cron: Add utf8_encode to the article post</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/90234ad3c767c9a7ba04c5ba8e85f651e998b11e">90234ad3</a> - <a href="https://task.beeznest.com/issues/15782">BT#15782</a>) Display: Change teacher footer email (use chamilo inbox to send email)</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/cc1f8810b4b7b15b9d7f8e22090571507e2a16c0">cc1f8810</a> - <a href="https://task.beeznest.com/issues/12723">BT#12723</a>) Plugin: StudentFollowup: Ignore visibility when checking posts in student followup history</li>
+            <li>[2019-06-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/d1d1d4641263024be0666cbe11c294f49641153f">d1d1d464</a> - <a href="https://task.beeznest.com/issues/12723">BT#12723</a>) Plugin: StudentFollowup: Fix student list, only get sessions where the user is coach</li>
+            <li>[2019-06-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/f91db74424e0117495ac215f729db4184ed6d3c2">f91db744</a> - <a href="https://task.beeznest.com/issues/12723">BT#12723</a>) Plugin: StudentFollowup: improve UI</li>
+            <li>[2019-06-12] (<a href="https://github.com/chamilo/chamilo-lms/commit/e190df7d20079706d6cdc41ef8ee8f45a8eda0d2">e190df7d</a> - <a href="https://task.beeznest.com/issues/15618">BT#15618</a>) Plugin: BigBlueButton: Fix redirect + php warnings</li>
+            <li>[2019-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/590eb6e611aac0a07ee607bde11ef09ed1720d9e">590eb6e6</a> - <a href="https://task.beeznest.com/issues/15744">BT#15744</a>) Exercise: Clean exercise title in question pool</li>
+            <li>[2019-06-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/9d40d078769a9c600b3a2c49df6f4934a61671ea">9d40d078</a> - <a href="https://task.beeznest.com/issues/15744">BT#15744</a>) Exercise: Add strip_tags in exercise title in question pool</li>
+            <li>[2019-06-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/bcaf23593ec87f134bc950bc683359eca6488251">bcaf2359</a> - <a href="https://task.beeznest.com/issues/15765">BT#15765</a>) Exercise: Convert date to local time in live results</li>
+            <li>[2019-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/3a16a39392c6cf17d1b5cf2ba7793bebd356ad6f">3a16a393</a> - <a href="https://task.beeznest.com/issues/9859">BT#9859</a>) Plugin: Azure B2B: Add link with help to fix Azure Active Directory plugin</li>
+            <li>[2019-06-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/b9742bcdeaca83159f6f0753f5ddb7a51ba4fce1">b9742bcd</a> - <a href="https://task.beeznest.com/issues/15056">BT#15056</a>) Migration: Add glossary fix in iid fixing script</li>
+            <li>[2019-06-03] (<a href="https://github.com/chamilo/chamilo-lms/commit/f7350b6a66ecf0add7c54b190982e7a799a3e0ad">f7350b6a</a> - <a href="https://task.beeznest.com/issues/15698">BT#15698</a>) Plagiarism: Add compilatio code</li>
+            <li>[2019-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/92a87efb51b73d0d9a8b603ace34027ceaa400f3">92a87efb</a> - <a href="https://task.beeznest.com/issues/13469">BT#13469</a>) Session: Add slash to username with apostrophe in user selector when subscribing to session</li>
+            <li>[2019-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/545e1eb8f031c4e775996f193483afb16b54bab4">545e1eb8</a> - <a href="https://task.beeznest.com/issues/13469">BT#13469</a>) Plugin: LTI: fix unsinstall plugin by FK with self reference</li>
+            <li>[2019-05-31] (<a href="https://github.com/chamilo/chamilo-lms/commit/125903bffb3ca82fbc227c9fb066c3829cbd3cd2">125903bf</a> - <a href="https://task.beeznest.com/issues/15715">BT#15715</a>) Internal: Fix date range validation when hiding time picker</li>
+            <li>[2019-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/ae206304cfb521523031c77913697bea5d9ee4c1">ae206304</a> - <a href="https://task.beeznest.com/issues/15715">BT#15715</a>) Internal: Fix date range picker when hiding the time picker</li>
+            <li>[2019-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/dfa1afdf6e8630f913767d8f7c547708a886eb11">dfa1afdf</a>) Display: Update check icon in learnpath tracking</li>
+            <li>[2019-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/a4db90b5b4b0a2f267741a98a4ebeef18ff8f266">a4db90b5</a> - <a href="https://task.beeznest.com/issues/13541">BT#13541</a>) Group: Fix api_protect_course_group reject request if group doesn't exists</li>
+            <li>[2019-05-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1045adf293dcf2c59ed5f3d3c9bfe47a50a71bc">a1045adf</a> - <a href="https://task.beeznest.com/issues/15709">BT#15709</a>) Admin: Fix question description search</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/4f85ee8fa284c838bd8d402247605a5742aeaa8c">4f85ee8f</a>) Plugin: BigBlueButton: Correcting link in copy field of bbb session HTML5 and Flash to put the r in interface</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/b98c30eada354b25a748b14000806c0c2a152a80">b98c30ea</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Internal: Add possibility to add custom footer bottom value in PDF</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/273f8ddb37e6cea1d6212e42a35f0b98abce08df">273f8ddb</a> - <a href="https://task.beeznest.com/issues/15177">BT#15177</a>) Chat: Remove focus in order to copy/paste</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/bbbef59e85b7ed3713c687499e5cee704e30ffc0">bbbef59e</a>) Admin: Fix export CSS to zip</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1eaeaead4e563d4eea977e5cbb84375d6c19a5b">a1eaeaea</a> - <a href="https://task.beeznest.com/issues/15709">BT#15709</a>) Admin: Remove security::remove_XSS before searching questions in global search</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/c8c9aef8da7cc958d667012671d277c49a284c1a">c8c9aef8</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Tracking: Improve UI in learnpath PDF export</li>
+            <li>[2019-05-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/04e883135c8bbf89ffaaae5da20a72b3b126adfb">04e88313</a>) Display: Add bar_progress.png</li>
+            <li>[2019-05-28] (<a href="https://github.com/chamilo/chamilo-lms/commit/e551d248e4c0d79e69b378ec6342ab20e7981806">e551d248</a> - <a href="https://task.beeznest.com/issues/15624">BT#15624</a>) Skill: User has access to their skills</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/965bd0b4e511439a96cbbc06798e5f0fe49b7aa9">965bd0b4</a>) Tracking: Improve PDF lp tracking presentation</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/b89edfa33a285230fa8812c8458b2e40d57a2dcd">b89edfa3</a>) Display: Add tpl pdf_tracking_lp</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/723a7a602085ff3a70039cc574489c9044a1343e">723a7a60</a> - <a href="https://task.beeznest.com/issues/15697">BT#15697</a>) Display: Fix course home grid</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/d34734c2ad8219a1ad975f909fddcc8ea68adcdd">d34734c2</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Learnpath: Teachers and admins can export to PDF the lp results</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/334b90578474864a3eb4f280edc2e0cdf14d097a">334b9057</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Learnpath: UI improvements when exporting a LP as a PDF</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/37c1f30878e836172e3496007f50b19a8e5cc572">37c1f308</a> - <a href="https://task.beeznest.com/issues/15518">BT#15518</a>) Exercise: Add pretty boxes css lib fix exercise reminder UI</li>
+            <li>[2019-05-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/9363d32d19094e736bb3b304457bc889d362c196">9363d32d</a>) Internal: Fix redirection loop when logging as students</li>
+            <li>[2019-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/f9514aaceee95f90b25245a2c173b08f0b2fe984">f9514aac</a> - <a href="https://task.beeznest.com/issues/15672">BT#15672</a>) Admin: Fix save extrafield value when importing users</li>
+            <li>[2019-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/26b1ab1b0baf4683ee7e294af83d8a5579b9aaac">26b1ab1b</a> - <a href="https://task.beeznest.com/issues/15276">BT#15276</a>) Exercise: Remember group selection in exercise report</li>
+            <li>[2019-05-24] (<a href="https://github.com/chamilo/chamilo-lms/commit/2a40c40514588a0f6f1aa5b7e9c9b09d2dd1b40a">2a40c405</a> - <a href="https://task.beeznest.com/issues/15259">BT#15259</a>) Learnpath: Change default ckeditor height</li>
+            <li>[2019-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/b21067090d16964badca3b481cb9ed9ce00f7a7a">b2106709</a> - <a href="https://task.beeznest.com/issues/15643">BT#15643</a>) Learnpath: Add custom interactions export to PDF</li>
+            <li>[2019-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/8f8181139a7c2d5e37c5ff00b81d6605f0da6a0f">8f818113</a>) Internal: Fix double Database::escape_string</li>
+            <li>[2019-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/f03c2301ba7ca1f192e8af457f1fad85c340dae4">f03c2301</a>) Assignment: Fix work queries</li>
+            <li>[2019-05-23] (<a href="https://github.com/chamilo/chamilo-lms/commit/053b9f3809c847dfbbee36052edaed6cf5afe792">053b9f38</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2910">GH#2910</a>) Admin: Fix extra field workflow page #2910</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/52ca7cac2d6c9c40d38fbac02676b33050081234">52ca7cac</a> - <a href="https://task.beeznest.com/issues/15686">BT#15686</a>) Display: Fix notifications count in menu when undefined</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/41d74bfa1ff82c99997ec6a8c81824cf38e3ced2">41d74bfa</a> - <a href="https://support.chamilo.org/issues/15686">CT#15686</a>) Learnpath: Fix accordion</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/e137b325b90ea12bd8fb65ae093ee3941288dd41">e137b325</a>) Internal: Fix query error</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/a47a950af22151bd6fb304a4a6cf26f6e1aff8ea">a47a950a</a> - <a href="https://task.beeznest.com/issues/15553">BT#15553</a>) Survey: Hide extra fields in survey report</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/fe6e30b9c1bb85b1c85f4a0be4f3c62c5f616eed">fe6e30b9</a> - <a href="https://task.beeznest.com/issues/15670">BT#15670</a>) Tracking: Fix search condition</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/63b535b0ea91342440a573a20c4534c2d8dc7379">63b535b0</a> - <a href="https://task.beeznest.com/issues/15670">BT#15670</a>) Session: Remove popup + add extra fields for the session form</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/f0ac92aa93fbdaed8ebcf655a20d5bec31024825">f0ac92aa</a>) Display: Undo css change that affect all tables</li>
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/c6a4858de51bc47aa6881a9c0136cfc93cc5ba1f">c6a4858d</a> - <a href="https://task.beeznest.com/issues/15682">BT#15682</a>) Maintenance: Add LP title in export + fix php warning + fix access to teacher to the export</li>
+            <li>[2019-05-21] (<a href="https://github.com/chamilo/chamilo-lms/commit/6871eceaeeb5ddef137f1f379f5d0bd756f86073">6871ecea</a>) Internal: Fix select in <a href="https://github.com/chamilo/chamilo-lms/commit/87d542fda3c31a4143cd2e9ad71953eeaf2f36da">previous commit</a></li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/87d542fda3c31a4143cd2e9ad71953eeaf2f36da">87d542fd</a> - <a href="https://task.beeznest.com/issues/15673">BT#15673</a>) Internal: Fix duplications in extrafield options</li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/f2eb5bbd091cc6ae1cd42f6dfb3d25918058cfd0">f2eb5bbd</a>) Gradebook: Add "Recalculate results" link</li>
+            <li>[2019-05-20] (<a href="https://github.com/chamilo/chamilo-lms/commit/a6a334b957960b45d0c1cf15dfdc3773384f9d92">a6a334b9</a>) Skills: Fix course image link</li>
+            <li>[2019-05-17] (<a href="https://github.com/chamilo/chamilo-lms/commit/2d548727a068bd6e6c77e45b07481bcb591c47d4">2d548727</a> - <a href="https://task.beeznest.com/issues/15553">BT#15553</a>) Tracking: Improve survey report</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/ccd2f317899661aed1374b851a46ed8cfb0109f8">ccd2f317</a> - <a href="https://task.beeznest.com/issues/15590">BT#15590</a>) Internal: Fix Translation error in report table</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/549ab0e22202928ef584783cc63eb45d7b7ea467">549ab0e2</a>) Plugin: EmbedRegistry: Add icons embedregistry</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/a5ee47e62f94974d22aebd63affcdbc8addd75e3">a5ee47e6</a> - <a href="https://task.beeznest.com/issues/15553">BT#15553</a>) Tracking: Add survey report page</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/cd0f0b8419b00db966278142129b10acfee81b10">cd0f0b84</a> - <a href="https://task.beeznest.com/issues/15660">BT#15660</a>) Learnpath: Fix js error</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/d4ce9230518b08eb352dce19b92f8243975ca31a">d4ce9230</a> - <a href="https://task.beeznest.com/issues/15652">BT#15652</a>) Gradebook: Fix default score value</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/a2110984f4e3815ebee4835397bfd3b0be8b44fc">a2110984</a> - <a href="https://task.beeznest.com/issues/15652">BT#15652</a>) Gradebook: Fix default score value</li>
+            <li>[2019-05-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/e270269608b6e4d2f0077107449fe7604602f820">e2702696</a> - <a href="https://task.beeznest.com/issues/15641">BT#15641</a>) Internal: Fix CKeditor toolbar</li>
+            <li>[2019-05-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/27720b8bcf574ddde43834f91efccb9f0181950a">27720b8b</a> - <a href="https://task.beeznest.com/issues/15628">BT#15628</a>) CSV Import: Change email body when sending calendar message</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/b009adc6b381c1770dd2638e4ec4f7d07f91322e">b009adc6</a> - <a href="https://task.beeznest.com/issues/15390">BT#15390</a>) Plugin: EmbedRegistry: Improve on-page documentation</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/280b362759560d07950fe4a37158f8f2e715f527">280b3627</a> - <a href="https://task.beeznest.com/issues/15390">BT#15390</a>) Plugin: EmbedRegistry: Fix title plugin</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/a660c27fac56004d518c05869225ffb35ab35111">a660c27f</a> - <a href="https://task.beeznest.com/issues/15597">BT#15597</a>) Display: Add teachers in course list</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/1c935a3c6422d616abc4a1cf512d9f3288ca6390">1c935a3c</a> - <a href="https://task.beeznest.com/issues/15650">BT#15650</a>) Course home: Auto launch elements won't work for coaches or tutors</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/14fe6d26c7a46d3704e03249f5d4c24741b74d60">14fe6d26</a> - <a href="https://task.beeznest.com/issues/15650">BT#15650</a>) Course home: Auto launch elements won't work for coaches or tutors</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/d4106f2971d60d7a6888de84871c69504c743656">d4106f29</a> - <a href="https://task.beeznest.com/issues/15652">BT#15652</a>) Gradebook: Show official code in gradebook export</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/5c0a4276ceb824fed055f467fac113159fabd69c">5c0a4276</a> - <a href="https://task.beeznest.com/issues/15641">BT#15641</a>) Exercise: Add translate html config js for exercise descriptions</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/8265d22a1923657d1ebe62853ee9a45c7b814b75">8265d22a</a> - <a href="https://task.beeznest.com/issues/15641">BT#15641</a>) Exercise: Add translate html config js for exercise descriptions</li>
+            <li>[2019-05-14] (<a href="https://github.com/chamilo/chamilo-lms/commit/2de360308f157590d22a9fef504b62985c59ffc6">2de36030</a> - <a href="https://task.beeznest.com/issues/15175">BT#15175</a>) Internal: Refactor code, move "icon status" inside api_get_user_info()</li>
+            <li>[2019-05-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/a6cea31eb1734fdd21cf5d9fc80e73dd658d97e7">a6cea31e</a> - <a href="https://task.beeznest.com/issues/15644">BT#15644</a>) Social: Fix js error when rendering map</li>
+            <li>[2019-05-10] (<a href="https://github.com/chamilo/chamilo-lms/commit/e413aeb80c9784fe0350241d025f54119d0bce9f">e413aeb8</a> - <a href="https://task.beeznest.com/issues/15511">BT#15511</a>) Learnpath: Fix SCORM loading + fix js error</li>
+            <li>[2019-05-09] (<a href="https://github.com/chamilo/chamilo-lms/commit/1d2d463aa8add25f216b0a8d12113e848b566bcb">1d2d463a</a> - <a href="https://task.beeznest.com/issues/15534">BT#15534</a>) Internal: Add script to delete removed exercises</li>
+        </ul>
+        <h3>Stylesheets and theming</h3>
+        <ul aria-live="off">
+            <li>[2019-05-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/0e23c615584ca825b25f0b30f2af4cfcac842e97">0e23c615</a> - <a href="https://task.beeznest.com/issues/15686">BT#15686</a>) Display: Fix css learnpath list</li>
+            <li>[2019-05-16] (<a href="https://github.com/chamilo/chamilo-lms/commit/62303ba4212b70a8384ad952030a4a28734f4526">62303ba4</a> - <a href="https://task.beeznest.com/issues/15175">BT#15175</a>) Display: Fix avatar CSS</li>
+            <li>[2019-05-13] (<a href="https://github.com/chamilo/chamilo-lms/commit/a21a9261fed027637c4b2eacd508007ce2a8f78d">a21a9261</a> - <a href="https://task.beeznest.com/issues/15175">BT#15175</a>) Display: Fix student boss icon</li>
+        </ul>
+        <h3>Web services</h3>
+        <ul aria-live="off">
+            <li>[2019-08-19] (<a href="https://github.com/chamilo/chamilo-lms/commit/7651f236b848f132bb0f1474e6fab767318fa9a8">7651f236</a>) Webservice: REST: Return default image for course</li>
+            <li>[2019-07-15] (<a href="https://github.com/chamilo/chamilo-lms/commit/d3da477da38bdb3df1075c373e5209c6a8867c45">d3da477d</a> - <a href="https://task.beeznest.com/issues/15694">BT#15694</a>) Webservice: return new soap_fault error in gradebook</li>
+        </ul>
+        <h3>Removals</h3>
+        <ul aria-live="off">
+            <li>None</li>
+        </ul>
+        <h3>Known issues</h3>
+        <ul aria-live="off">
+            <li>None</li>
+        </ul>
+    </div>
+
+
     <div class="version" aria-label="1.11.10">
-        <a name="1.11.10"></a>
+        <a id="1.11.10"></a>
 
         <h1>Chamilo 1.11.10 - Winchester,  08/05/2019</h1>
         <h3>Release notes - summary</h3>
@@ -198,7 +506,7 @@
             <li>[2019-03-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/399d7ce660f5334b3743a819148a837cb519c39d">399d7ce6</a> - <a href="https://task.beeznest.com/issues/15265">BT#15265</a>) Plugin: QuestionOptionsEvaluation: Add questionoptionsevaluation plugin</li>
             <li>[2019-03-11] (<a href="https://github.com/chamilo/chamilo-lms/commit/0de2668a7108ac509e14607849a7a7302672e59c">0de2668a</a> - <a href="https://task.beeznest.com/issues/15265">BT#15265</a>) Admin: Add configuraiton setting "exercise_additional_teacher_modify_actions" to enable more actions for teachers</li>
             <li>[2019-03-07] (<a href="https://github.com/chamilo/chamilo-lms/commit/6a758d8a524c383ceab9a1ce73b026527bfc5c2b">6a758d8a</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2699">GH#2699</a>) Admin: Add configuration setting "mail_no_reply_avoid_reply_to" - Avoid add a reply-to header when a no-reply address is set.</li>
-            <li>[2019-03-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/73d802a6adb998866b2ee3fc63cc8b72509ba1c8">73d802a6</a> - <a href="https://task.beeznest.com/issues/15176">BT#15176</a>) Social: Add social map, requires to add geolocation extra fields and configuration setting $_configuration['allow_social_map_fields'] = ['fields' => ['terms_villedustage', 'terms_ville']];</li>
+            <li>[2019-03-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/73d802a6adb998866b2ee3fc63cc8b72509ba1c8">73d802a6</a> - <a href="https://task.beeznest.com/issues/15176">BT#15176</a>) Social: Add social map, requires to add geolocation extra fields and configuration setting $_configuration['allow_social_map_fields'] = ['fields' =&gt; ['terms_villedustage', 'terms_ville']];</li>
             <li>[2019-03-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/a31c5df0cb5398bb6673a6f21da6638dd96d1593">a31c5df0</a> - <a href="https://task.beeznest.com/issues/15173">BT#15173</a> - <a href="https://task.beeznest.com/issues/15309">BT#15309</a>) Admin: Add new configuration settings "allow_forum_post_revisions", "community_managers_user_list" and "global_forums_course_id"</li>
             <li>[2019-02-27] (<a href="https://github.com/chamilo/chamilo-lms/commit/c2f9db3d27c55f91cf8b40520433998db1da0442">c2f9db3d</a> - <a href="https://task.beeznest.com/issues/15326">BT#15326</a>) Registration: Add configuration setting "required_extra_fields_in_inscription" - Set extra fields as required in the inscription.php page + Add forum_post, forum_category extra fields</li>
             <li>[2019-02-22] (<a href="https://github.com/chamilo/chamilo-lms/commit/28657267ab690f40b52e522968ee2eb69a1dc14b">28657267</a> - <a href="https://task.beeznest.com/issues/15317">BT#15317</a>) Forum: Add configuration setting "forum_fold_categories" to fold forum categories by default</li>
@@ -207,7 +515,7 @@
             <li>[2019-02-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/8a21d41da8c63f4ec2943f3ce53f2385d594430c">8a21d41d</a> - <a href="https://github.com/chamilo/chamilo-lms/issues/2796">GH#2796</a>) Admin: Add configuration setting "admin_chamilo_announcements_disable". Disable Chamilo.org announcements at the top of the admin page</li>
             <li>[2019-02-06] (<a href="https://github.com/chamilo/chamilo-lms/commit/e226292b8579a3f60928bf01b0ca9e5767af4c60">e226292b</a> - <a href="https://task.beeznest.com/issues/15252">BT#15252</a>) LP: Add setting lp_minimum_item, depends in the course and session extra field "new_tracking_system". It should be turned on in order to process the new stats, otherwise it will load the legacy stats</li>
             <li>[2019-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/eca05ce736396738b1c80717722428fe5564548a">eca05ce7</a> - <a href="https://task.beeznest.com/issues/15270">BT#15270</a>) Admin: Add configuration setting "jq_grid_default_row" for default row values for jQGrid</li>
-            <li>[2019-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/70242077ac61b260ac1df1aa486f75a26da8fee6">70242077</a> - <a href="https://task.beeznest.com/issues/15270">BT#15270</a>) Admin: Add configuration setting "jq_grid_row_list" to change the jqgrid row list //$_configuration['jq_grid_row_list'] = ['options' => [50, 100, 200, 500]];</li>
+            <li>[2019-02-05] (<a href="https://github.com/chamilo/chamilo-lms/commit/70242077ac61b260ac1df1aa486f75a26da8fee6">70242077</a> - <a href="https://task.beeznest.com/issues/15270">BT#15270</a>) Admin: Add configuration setting "jq_grid_row_list" to change the jqgrid row list //$_configuration['jq_grid_row_list'] = ['options' =&gt; [50, 100, 200, 500]];</li>
             <li>[2019-01-30] (<a href="https://github.com/chamilo/chamilo-lms/commit/dc21353812ade069dff4465067620db9fa932f08">dc213538</a> - <a href="https://task.beeznest.com/issues/15230">BT#15230</a>) Admin: Add configuration setting "show_question_id" config to show question ID in the exercises + Add DESCRIPTION option when importing exercises with AIKEN</li>
             <li>[2019-01-29] (<a href="https://github.com/chamilo/chamilo-lms/commit/a1e9e3f287e41cf2feed86f004a3b68ac24eb84f">a1e9e3f2</a> - <a href="https://task.beeznest.com/issues/15235">BT#15235</a>) Admin: Add configuration setting that limits teachers rights in exercise $_configuration['limit_exercise_teacher_access']</li>
             <li>[2019-01-26] (<a href="https://github.com/chamilo/chamilo-lms/commit/a7fbce409028e60845a608d1d9d89e403591a4a7">a7fbce40</a> - <a href="https://task.beeznest.com/issues/11784">BT#11784</a>) Admin: Add configuration setting "quiz_show_description_on_results_page" to control whether the test description is shown on the results page or not</li>
@@ -1165,7 +1473,7 @@
     </div>
 
     <div class="version" aria-label="1.11.8">
-    <a name="1.11.8"></a>
+    <a id="1.11.8"></a>
 
     <h1>Chamilo 1.11.8 - Sayaxché,  15/08/2018</h1>
     <h3>Release notes - summary</h3>
@@ -2018,7 +2326,7 @@
     </div>
 
     <div class="version" aria-label="1.11.6">
-    <a name="1.11.6"></a>
+    <a id="1.11.6"></a>
 
     <h1>Chamilo 1.11.6 - Poznán,  18/01/2018</h1>
     <h3>Release notes - summary</h3>
@@ -3235,7 +3543,7 @@
     </div>
 
     <div class="version" aria-label="1.11.4">
-    <a name="1.11.4"></a>
+    <a id="1.11.4"></a>
     <h1>Chamilo 1.11.4 - Uyuni, 31st of May 2017</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.11.4 is a minor, bugfix release of the 1.11.x branch, with a large number of bugfixes on top of 1.11.2.</p>
@@ -4488,7 +4796,7 @@
     </div>
 
     <div class="version" aria-label="1.11.2">
-    <a name="1.11.2"></a>
+    <a id="1.11.2"></a>
     <h1>Chamilo 1.11.2 - Bari, 1st of November 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.11.2 is a minor, bugfix release of the 1.11.x branch, with a few bugfixes on top of 1.11.0.</p>
@@ -4597,7 +4905,7 @@
     </div>
 
     <div class="version" aria-label="1.11.0">
-    <a name="1.11.0"></a>
+    <a id="1.11.0"></a>
     <h1>Chamilo 1.11.0 - Lecce, 17th of October 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.11.0 is a major release of the 1.11.x branch. It is meant as a transition between 1.10 and 2.0 versions.</p>
@@ -6044,7 +6352,7 @@
     </div>
 
     <div class="version" aria-label="1.10.8">
-    <a name="1.10.8"></a>
+    <a id="1.10.8"></a>
     <h1>Chamilo 1.10.8 - Vilcashuamán, 22nd of July 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.10.8 is a minor, bugfix release of the 1.10.x branch, with a few new features and bugfixes on top of 1.10.6.</p>
@@ -6160,7 +6468,7 @@
     </div>
 
     <div class="version" aria-label="1.10.6">
-    <a name="1.10.6"></a>
+    <a id="1.10.6"></a>
     <h1>Chamilo 1.10.6 - Zacatecas, 24th of May 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.10.6 is a minor, bugfix release of the 1.10.x branch, with a few new features and bugfixes on top of 1.10.4.</p>
@@ -6386,7 +6694,7 @@
     </div>
 
     <div class="version" aria-label="1.10.4">
-    <a name="1.10.4"></a>
+    <a id="1.10.4"></a>
     <h1>Chamilo 1.10.4 - Bath, 22th of March 2016</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.10.4 is a minor, bugfix release of the 1.10.x branch, with a few new features and bugfixes on top of 1.10.2.</p>
@@ -6718,7 +7026,7 @@
     </div>
 
     <div class="version" aria-label="1.10.2">
-    <a  name="1.10.2"></a>
+    <a  id="1.10.2"></a>
     <h1>Chamilo 1.10.2 - Alsted, 22nd of December 2015</h1>
     <h3>Release notes - summary</h3>
     <p>Chamilo 1.10.2 is a minor, bugfix version of the 1.10.x branch, with a few new features and  bugfixes on top of 1.10.0. Notably, this version enables the migration from 1.9.x to 1.10.2 (many bugs were reported in the migration from 1.9.x to 1.10.0, which were fixed within the 2 months to this minor version).</p>
@@ -6948,7 +7256,7 @@
     </div>
 
     <div class="version" aria-label="1.10.0">
-<a  name="1.10.0"></a>
+<a  id="1.10.0"></a>
 
 <h1>Chamilo 1.10.0 - San Juan, 16th of October 2015</h1>
 <h3>Release notes - summary</h3>
@@ -7920,7 +8228,7 @@
     </div>
 
     <div class="version" aria-label="1.9.10.2">
-<a  name="1.9.10.2"></a>
+<a  id="1.9.10.2"></a>
 
 <h1>Chamilo 1.9.10.2 - Sipán, 19th of March, 2015</h1>
 <h3>Release notes - summary</h3>
@@ -7993,7 +8301,7 @@
     </div>
 
     <div class="version" aria-label="1.9.10">
-<a  name="1.9.10"></a>
+<a  id="1.9.10"></a>
 <h1>Chamilo 1.9.10 - Huánuco, 25th of January, 2015</h1>
 <h3>Release notes - summary</h3>
 <p>Chamilo 1.9.10 is a new minor version of the 1.9.x branch, with many bugfixes and a few interesting new features (as such, you can just overwrite previous files to upgrade from 1.9.8, 1.9.8.1 or 1.9.8.2 to 1.9.10).</p>
@@ -8362,7 +8670,7 @@ All security issues are published and patches are attached on <a href="https://s
     </div>
 
     <div class="version" aria-label="1.9.8.2">
-<a  name="1.9.8.2"></a>
+<a  id="1.9.8.2"></a>
 <h1>Chamilo 1.9.8.2 - ,21st of June, 2014</h1>
 <h3>Release notes - summary</h3>
 <p>Chamilo 1.9.8.2 is a very little patch version with one bugfix regarding the learning paths tool. Considering the fact that 1.9.8 is planned for the long term, we'd hate to have such a minor patch left on the side for a year or so. This will be packaged and promoted as 1.9.8, but the folder inside the 1.9.8 will be called 1.9.8.2, with a change to this changelog file and a one-line change to main/newscorm/learnpathItem.class.php (as such, you can update just this file to upgrade from 1.9.8.1 to 1.9.8.2. See <a href="https://github.com/chamilo/chamilo-lms/commit/642a80e9e838f98f25135fbb64795e4f3df86260">the code change</a> for detais.</p>
@@ -8375,7 +8683,7 @@ All security issues are published and patches are attached on <a href="https://s
     </div>
 
     <div class="version" aria-label="1.9.8.0">
-        <a  name="1.9.8.0"></a>
+        <a  id="1.9.8.0"></a>
 <h1>Chamilo 1.9.8 - Thon, 15th of June, 2014</h1>
 <h3>Release notes - summary</h3>
 <p>Chamilo 1.9.8 is a minor stable version with a series of improvements on top of 1.9.6.<br />
@@ -8884,7 +9192,7 @@ Stylesheets have been considerably changed in version 1.9.8, which might require
     </div>
 
     <div class="version" aria-label="1.9.6.1">
-<a  name="1.9.6.1"></a>
+<a  id="1.9.6.1"></a>
 
 <h1>Chamilo 1.9.6.1 - ,22th of May 2014</h1>
 <h3>Release notes - summary</h3>
@@ -9032,7 +9340,7 @@ Stylesheets have been considerably changed in version 1.9.8, which might require
     </div>
 
     <div class="version" aria-label="1.9.4">
-<a  name="1.9.4"></a>
+<a  id="1.9.4"></a>
 
 <h1>Chamilo 1.9.4 - Puebla, 18th of January, 2013</h1>
 <h3>Release notes - summary</h3>
@@ -9305,7 +9613,7 @@ Stylesheets have been considerably changed in version 1.9.8, which might require
     </div>
 
     <div class="version" aria-label="1.9.2">
-<a  name="1.9.2"></a>
+<a  id="1.9.2"></a>
 
 <h1>Chamilo 1.9.2 - Hanga Roa, 27th of September, 2012</h1>
 <h3>Release notes - summary</h3>
@@ -9404,7 +9712,7 @@ Stylesheets have been considerably changed in version 1.9.8, which might require
     </div>
 
     <div class="version" aria-label="1.9.0">
-<a  name="1.9.0"></a>
+<a  id="1.9.0"></a>
 
 <h1>Chamilo 1.9.0 - Vogüé, 31st of July, 2012</h1>
 
@@ -9909,7 +10217,7 @@ Due to the move to HTML5, it is very likely that any older stylesheet will have
     </div>
 
 <div class="version" aria-label="1.8.8.6">
-<a  name="1.8.8.6"></a>
+<a  id="1.8.8.6"></a>
 
 <h1>Chamilo 1.8.8.6 - Rottweil, 20th of July 2012</h1>
 
@@ -9928,7 +10236,7 @@ Due to the move to HTML5, it is very likely that any older stylesheet will have
 </div>
 
     <div class="version" aria-label="1.8.8.4">
-<a  name="1.8.8.4"></a>
+<a  id="1.8.8.4"></a>
 
 <h1>Chamilo 1.8.8.4 - La Molina, August 2011</h1>
 
@@ -10118,7 +10426,7 @@ This version of Chamilo only includes a few minor new features:
     </div>
 
     <div class="version" aria-label="1.8.8.2">
-<a  name="1.8.8.2"></a>
+<a  id="1.8.8.2"></a>
 
 <h1>Chamilo 1.8.8.2 - Bellavista, May 2011</h1>
 
@@ -10180,7 +10488,7 @@ This version of Chamilo only includes a few minor new features:
     </div>
 
     <div class="version" aria-label="1.8.8">
-  <a  name="1.8.8"></a>
+  <a  id="1.8.8"></a>
 
 <h1>Chamilo 1.8.8 - Miraflores, May 2011</h1>
 
@@ -10444,7 +10752,7 @@ providers (see our website, <i>Support</i> tab).
     </div>
 
 <div class="version" aria-label="1.8.7.1">
-<a  name="1.8.7.1"></a>
+<a  id="1.8.7.1"></a>
 
 <h1>Chamilo 1.8.7.1 - Palmas, July 2010</h1>
 <h3>New Features</h3>
@@ -10545,7 +10853,7 @@ providers (see our website, <i>Support</i> tab).
 </ul>
     </div>
     <div class="version" aria-label="1.8.7">
-<a  name="1.8.7"></a>
+<a  id="1.8.7"></a>
 
 <h1>Chamilo 1.8.7 - Istanbul, June 2010</h1>
 
@@ -10651,7 +10959,7 @@ providers (see our website, <i>Support</i> tab).
     </div>
 
     <div class="version" aria-label="1.8.6.2">
-<a  name="1.8.6.2"></a>
+<a  id="1.8.6.2"></a>
 
 <h1>Chamilo 1.8.6.2 - Salto, January 2010</h1>
 
@@ -10750,7 +11058,7 @@ providers (see our website, <i>Support</i> tab).
     </div>
 
     <div class="version" aria-label="1.8.6.1">
-<a  name="1.8.6.1"></a>
+<a  id="1.8.6.1"></a>
 <p>
     Chamilo was initially a fork of the Dokeos project, which was a 2004 fork of the Claroline project.
     In the interest of science, we have added below the retrievable code changes history of both projects.<br /><br />
@@ -10808,7 +11116,7 @@ providers (see our website, <i>Support</i> tab).
     </div>
 
     <div class="version" aria-label="1.8.6">
-<a  name="1.8.6"></a>
+<a  id="1.8.6"></a>
 
 <h1>Dokeos 1.8.6 - Svalbard, June 2009</h1>
 
@@ -11008,7 +11316,7 @@ providers (see our website, <i>Support</i> tab).
 <br />
     </div>
     <div class="version" aria-label="1.8.5">
-        <a name="1.8.5"></a>
+        <a id="1.8.5"></a>
         <h1>Dokeos 1.8.5 - Valparaiso, June 2008</h1>
         <h3>Release notes - summary</h3>
         <p>Dokeos 1.8.5 is a major debugging release but includes interesting new features as well.&nbsp;</p>
@@ -11138,7 +11446,7 @@ providers (see our website, <i>Support</i> tab).
         </ul>
     </div>
     <div class="version" aria-label="1.8.4">
-        <a name="1.8.4"></a>
+        <a id="1.8.4"></a>
         <h1>Dokeos 1.8.4 - September 2007</h1>
 
         <h3>Release notes - summary</h3>
@@ -11205,7 +11513,7 @@ providers (see our website, <i>Support</i> tab).
     </div>
 
     <div class="version" aria-label="1.8.0">
-<a name="1.8.0"></a>
+<a id="1.8.0"></a>
 
 <h1>Dokeos 1.8 - May 2007</h1>
 
@@ -11240,21 +11548,21 @@ a simple videoconferencing interface.</p>
     </div>
 
     <div class="version" aria-label="1.6.5">
-        <a name="1.6.5"></a>
+        <a id="1.6.5"></a>
         <h1>Dokeos 1.6.5 - , July 2006 </h1>
         <h3>Release notes - summary</h3>
         <p>Security Release. 1 bug has been fixed.<br/>
         </p>
     </div>
     <div class="version" aria-label="1.6.4">
-<a name="1.6.4"></a>
+<a id="1.6.4"></a>
 <h1>Dokeos 1.6.4 - , April 2006 </h1>
 <h3>Release notes - summary</h3>
 <p>Bugfix release. 2 bugs have been fixed. One security hole has been fixed <br />
 </p>
     </div>
     <div class="version" aria-label="1.6.3">
-<a name="1.6.3"></a>
+<a id="1.6.3"></a>
 
 <h1>Dokeos 1.6.3 - , February 2006 </h1>
 
@@ -11263,7 +11571,7 @@ a simple videoconferencing interface.</p>
 <p>Bugfix release. 44 bugs have been fixed.<br />
     </div>
     <div class="version" aria-label="1.6.2">
-<a name="1.6.2"></a>
+<a id="1.6.2"></a>
 
 <h1>Dokeos 1.6.2 - , September 2005</h1>
 
@@ -11273,7 +11581,7 @@ a simple videoconferencing interface.</p>
 
     </div>
     <div class="version" aria-label="1.6.1">
-<a name="1.6.1"></a>
+<a id="1.6.1"></a>
 
 <h1>Dokeos 1.6.1 - , August 2005</h1>
 
@@ -11282,7 +11590,7 @@ a simple videoconferencing interface.</p>
 <p>Bugfix release. 31 bugs have been fixed.<br />
     </div>
     <div class="version" aria-label="1.6.0">
-<a name="1.6"></a>
+<a id="1.6"></a>
 
 <h1>Dokeos 1.6 - July 2005</h1>
 
@@ -11318,7 +11626,7 @@ a simple videoconferencing interface.</p>
     </ul>
     </div>
     <div class="version" aria-label="1.5.5">
-    <a name="1.5.5"></a>
+    <a id="1.5.5"></a>
 
     <h1>Dokeos 1.5.5 - 2004</h1>
 
@@ -11345,21 +11653,21 @@ a simple videoconferencing interface.</p>
     </ul>
     </div>
     <div class="version" aria-label="1.4.2">
-    <a name="1.4.2"></a>
+    <a id="1.4.2"></a>
     <h1>Claroline 1.4.2 - 2003</h1>
     <ul>
         <li>No feature is added to Claroline 1.4.2. This release is basically stressed on stability increase and bugs fixing.</li>
     </ul>
     </div>
     <div class="version" aria-label="1.4.1">
-    <a name="1.4.1"></a>
+    <a id="1.4.1"></a>
     <h1>Claroline 1.4.1 - 2003</h1>
     <ul>
         <li>No feature is added to Claroline 1.4.2. This release is basically stressed on stability increase and bugs fixing.</li>
     </ul>
     </div>
     <div class="version" aria-label="1.4.0">
-    <a name="1.4"></a>
+    <a id="1.4"></a>
     <h1>Claroline 1.4 - 2003</h1>
     The main Claroline improvements are hidden behind the screen.
     We have totally recoded the Claroline Kernel to be more
@@ -11407,14 +11715,14 @@ a simple videoconferencing interface.</p>
     </ul>
     </div>
     <div class="version" aria-label="1.3.1">
-    <a name="1.3.1"></a>
+    <a id="1.3.1"></a>
     <h1>Claroline 1.3.1 - 2003</h1>
     <ul>
         <li>No feature is added to Claroline 1.3.1. This release is basically stressed on stability increase and bugs fixing.</li>
     </ul>
     </div>
     <div class="version" aria-label="1.3.0">
-    <a name="1.3.0"></a>
+    <a id="1.3.0"></a>
     <h1>Claroline 1.3.0 - 2003</h1>
     <ul>
         <li>LANGUAGE. New languages added. Claroline is now in 12 languages :
@@ -11439,7 +11747,7 @@ a simple videoconferencing interface.</p>
     </ul>
     </div>
     <div class="version" aria-label="1.2.0">
-    <a name="1.2.0"></a>
+    <a id="1.2.0"></a>
     <h1>Claroline 1.2.0 - 2002</h1>
     <ul>
         <li>Claroline can be installed in a server sub-directory.</li>
@@ -11513,7 +11821,7 @@ a simple videoconferencing interface.</p>
         <li>Display</li>
         <li>Document</li>
         <li>Dropbox</li>
-        <li>Quiz (not exercise)</li>
+        <li>Exercise (not Quiz)</li>
         <li>Extra Fields</li>
         <li>Forum</li>
         <li>Glossary</li>

+ 4 - 18
main/admin/access_url_add_courses_to_url.php

@@ -13,7 +13,6 @@ $cidReset = true;
 require_once __DIR__.'/../inc/global.inc.php';
 
 $this_section = SECTION_PLATFORM_ADMIN;
-
 api_protect_global_admin_script();
 
 if (!api_get_multiple_access_url()) {
@@ -21,15 +20,12 @@ if (!api_get_multiple_access_url()) {
     exit;
 }
 
-$form_sent = 0;
 $first_letter_course = '';
 $courses = [];
 $url_list = [];
 $users = [];
 
-$tbl_access_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
 $tbl_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
-$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
 $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
 
 /*	Header   */
@@ -68,29 +64,19 @@ if (isset($_POST['form_sent']) && $_POST['form_sent']) {
     }
 }
 
-if (empty($first_letter_user)) {
-    $sql = "SELECT count(*) as num_courses FROM $tbl_course";
-    $result = Database::query($sql);
-    $num_row = Database::fetch_array($result);
-    if ($num_row['num_courses'] > 1000) {
-        //if there are too much num_courses to gracefully handle with the HTML select list,
-        // assign a default filter on users names
-        $first_letter_user = 'A';
-    }
-    unset($result);
-}
-
 $first_letter_course_lower = Database::escape_string(api_strtolower($first_letter_course));
 
 $sql = "SELECT code, title FROM $tbl_course
-		WHERE title LIKE '".$first_letter_course_lower."%' OR title LIKE '".$first_letter_course_lower."%'
+		WHERE 
+            title LIKE '".$first_letter_course_lower."%' OR 
+		    title LIKE '".$first_letter_course_lower."%'
 		ORDER BY title, code DESC ";
 
 $result = Database::query($sql);
 $db_courses = Database::store_result($result);
 unset($result);
 
-$sql = "SELECT id, url FROM $tbl_access_url  WHERE active=1 ORDER BY url";
+$sql = "SELECT id, url FROM $tbl_access_url WHERE active = 1 ORDER BY url";
 $result = Database::query($sql);
 $db_urls = Database::store_result($result);
 unset($result);

+ 0 - 5
main/admin/access_url_add_usergroup_to_url.php

@@ -20,16 +20,11 @@ if (!api_get_multiple_access_url()) {
 }
 
 $userGroup = new UserGroup();
-$form_sent = 0;
 $firstLetterUserGroup = null;
 $courses = [];
 $url_list = [];
 
-$tbl_access_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
 $tbl_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
-$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
-$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
-
 $tool_name = get_lang('AddUserGroupToURL');
 $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
 $interbreadcrumb[] = ['url' => 'access_urls.php', 'name' => get_lang('MultipleAccessURLs')];

+ 0 - 4
main/admin/access_url_add_users_to_url.php

@@ -19,14 +19,10 @@ if (!api_get_multiple_access_url()) {
     exit;
 }
 
-$form_sent = 0;
 $first_letter_user = '';
-$first_letter_course = '';
-$courses = [];
 $url_list = [];
 $users = [];
 
-$tbl_access_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
 $tbl_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
 $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
 

+ 0 - 9
main/admin/access_url_edit_courses_to_url.php

@@ -26,11 +26,6 @@ if (!api_get_multiple_access_url()) {
     exit;
 }
 
-// Database Table Definitions
-$tbl_access_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
-$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
-$tbl_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
-
 // setting breadcrumbs
 $tool_name = get_lang('EditCoursesToURL');
 $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
@@ -76,10 +71,6 @@ function remove_item(origin) {
 }
 </script>';
 
-$form_sent = 0;
-$UserList = $SessionList = [];
-$users = $sessions = [];
-
 if (isset($_POST['form_sent']) && $_POST['form_sent']) {
     $form_sent = $_POST['form_sent'];
     $course_list = $_POST['course_list'];

+ 2 - 6
main/admin/access_url_edit_usergroup_to_url.php

@@ -71,11 +71,7 @@ function remove_item(origin) {
 }
 </script>';
 
-$form_sent = 0;
 $errorMsg = '';
-$UserList = $SessionList = [];
-$users = $sessions = [];
-
 if (isset($_POST['form_sent']) && $_POST['form_sent']) {
     $form_sent = $_POST['form_sent'];
     $course_list = $_POST['course_list'];
@@ -109,7 +105,7 @@ echo '</div>';
 api_display_tool_title($tool_name);
 
 $noUserGroupList = $userGroupList = [];
-$ajax_search = $add_type == 'unique' ? true : false;
+$ajax_search = $add_type === 'unique' ? true : false;
 
 if ($ajax_search) {
     $userGroups = UrlManager::get_url_rel_usergroup_data($access_url_id);
@@ -130,7 +126,7 @@ if ($ajax_search) {
 $link_add_type_unique = ['class' => 'disabled'];
 $link_add_type_multiple = [];
 
-if ($add_type == 'multiple') {
+if ($add_type === 'multiple') {
     $link_add_type_unique = [];
     $link_add_type_multiple = ['class' => 'disabled'];
 }

+ 0 - 5
main/admin/access_url_edit_users_to_url.php

@@ -25,9 +25,6 @@ if (!api_get_multiple_access_url()) {
 
 // Database Table Definitions
 $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
-$tbl_access_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
-$tbl_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
-
 // setting breadcrumbs
 $tool_name = get_lang('EditUsersToURL');
 $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
@@ -73,9 +70,7 @@ function remove_item(origin) {
 }
 </script>';
 
-$form_sent = 0;
 $errorMsg = '';
-$UserList = [];
 $message = '';
 
 if (isset($_POST['form_sent']) && $_POST['form_sent']) {

+ 2 - 2
main/admin/access_urls.php

@@ -20,7 +20,7 @@ if (!api_get_multiple_access_url()) {
     exit;
 }
 
-$interbreadcrumb[] = ["url" => 'index.php', 'name' => get_lang('PlatformAdmin')];
+$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
 $tool_name = get_lang('MultipleAccessURLs');
 Display :: display_header($tool_name);
 
@@ -30,7 +30,7 @@ $url_list = UrlManager::get_url_data();
 
 // Actions
 if (isset($_GET['action'])) {
-    $url_id = (empty($_GET['url_id']) ? 0 : intval($_GET['url_id']));
+    $url_id = empty($_GET['url_id']) ? 0 : (int) $_GET['url_id'];
 
     switch ($_GET['action']) {
         case 'delete_url':

+ 0 - 4
main/admin/add_courses_to_usergroup.php

@@ -47,10 +47,7 @@ function remove_item(origin) {
 
 </script>';
 
-$form_sent = 0;
 $errorMsg = '';
-$sessions = [];
-
 if (isset($_POST['form_sent']) && $_POST['form_sent']) {
     $form_sent = $_POST['form_sent'];
     $elements_posted = $_POST['elements_in_name'];
@@ -301,7 +298,6 @@ unset($sessionUsersList);
 </tr>
 </table>
 </form>
-
 <script>
 function moveItem(origin , destination) {
     for(var i = 0 ; i<origin.options.length ; i++) {

+ 5 - 2
main/admin/add_drh_to_user.php

@@ -38,7 +38,7 @@ foreach ($subscribedUsers as $subscribedUser) {
         continue;
     }
 
-    $hrmOptions[$hrm->getId()] = $hrm->getCompleteNameWithUsername();
+    $hrmOptions[$hrm->getId()] = UserManager::formatUserFullName($hrm, true);
 }
 
 $form = new FormValidator('assign_hrm');
@@ -89,7 +89,10 @@ if ($form->validate()) {
 
 $interbreadcrumb[] = ['name' => get_lang('PlatformAdmin'), 'url' => 'index.php'];
 $interbreadcrumb[] = ['name' => get_lang('UserList'), 'url' => 'user_list.php'];
-$interbreadcrumb[] = ['name' => $user->getCompleteName(), 'url' => 'user_information.php?user_id='.$user->getId()];
+$interbreadcrumb[] = [
+    'name' => UserManager::formatUserFullName($user),
+    'url' => 'user_information.php?user_id='.$user->getId(),
+];
 
 $toolName = get_lang('AssignHrmToUser');
 

+ 0 - 2
main/admin/add_sessions_to_usergroup.php

@@ -73,9 +73,7 @@ function validate_filter() {
 }
 </script>';
 
-$form_sent = 0;
 $errorMsg = '';
-$sessions = [];
 if (isset($_POST['form_sent']) && $_POST['form_sent']) {
     $form_sent = $_POST['form_sent'];
     $elements_posted = $_POST['elements_in_name'];

+ 1 - 1
main/admin/career_dashboard.php

@@ -37,7 +37,7 @@ $career = new Career();
 $condition = ['status = ?' => 1];
 if ($form->validate()) {
     $data = $form->getSubmitValues();
-    $filter = intval($data['filter']);
+    $filter = (int) $data['filter'];
     if (!empty($filter)) {
         $condition = ['status = ? AND id = ? ' => [1, $filter]];
     }

+ 3 - 3
main/admin/configure_homepage.php

@@ -1024,11 +1024,11 @@ switch ($action) {
                                            disabled="disabled"/>
                                 </div>
                                 <button class="btn btn-primary btn-block" type="button" name="submitAuth"
-                                        value="<?php echo get_lang('Ok'); ?>"
-                                        disabled="disabled"><?php echo get_lang('Ok'); ?></button>
+                                        value="<?php echo get_lang('LoginEnter'); ?>"
+                                        disabled="disabled"><?php echo get_lang('LoginEnter'); ?></button>
                             </form>
                             <ul class="nav nav-pills nav-stacked">
-                                <li><?php echo api_ucfirst(get_lang('Registration')); ?></li>
+                                <li><?php echo api_ucfirst(get_lang('SignUp')); ?></li>
                                 <li><?php echo api_ucfirst(get_lang('LostPassword')); ?></li>
                             </ul>
                         </div>

+ 2 - 2
main/admin/configure_inscription.php

@@ -12,10 +12,10 @@ require_once __DIR__.'/../inc/global.inc.php';
 api_protect_admin_script();
 
 // Load terms & conditions from the current lang
-if (api_get_setting('allow_terms_conditions') == 'true') {
+if (api_get_setting('allow_terms_conditions') === 'true') {
     $get = array_keys($_GET);
     if (isset($get)) {
-        if ($get[0] == 'legal') {
+        if (isset($get[0]) && $get[0] == 'legal') {
             $language = api_get_interface_language();
             $language = api_get_language_id($language);
             $term_preview = LegalManager::get_last_condition($language);

+ 1 - 1
main/admin/course_add.php

@@ -103,7 +103,7 @@ $currentTeacher = api_get_user_entity(api_get_user_id());
 $form->addSelectAjax(
     'course_teachers',
     get_lang('CourseTeachers'),
-    [$currentTeacher->getId() => $currentTeacher->getCompleteNameWithUsername()],
+    [$currentTeacher->getId() => UserManager::formatUserFullName($currentTeacher, true)],
     [
         'url' => api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=teacher_to_basis_course',
         'id' => 'course_teachers',

+ 1 - 1
main/admin/course_edit.php

@@ -189,7 +189,7 @@ $courseTeacherNames = [];
 foreach ($course_teachers as $courseTeacherId) {
     /** @var User $courseTeacher */
     $courseTeacher = UserManager::getRepository()->find($courseTeacherId);
-    $courseTeacherNames[$courseTeacher->getUserId()] = $courseTeacher->getCompleteNameWithUsername();
+    $courseTeacherNames[$courseTeacher->getUserId()] = UserManager::formatUserFullName($courseTeacher, true);
 }
 
 $form->addSelectAjax(

+ 1 - 1
main/admin/dashboard_add_users_to_user.php

@@ -441,7 +441,7 @@ $result = Database::query($sql);
             <?php if ($add_type == 'multiple') {
                             ?>
                 <p><?php echo get_lang('FirstLetterUser'); ?></p>
-                <select class="selectpicker form-control" name="firstLetterUser" onchange = "xajax_search_users(this.value,'multiple')">
+                <select class="selectpicker show-tick form-control" name="firstLetterUser" onchange = "xajax_search_users(this.value,'multiple')">
                     <option value="%">--</option>
                     <?php echo Display::get_alphabet_options($firstLetterUser); ?>
                 </select>

+ 2 - 2
main/admin/email_tester.php

@@ -48,12 +48,12 @@ if ($form->validate()) {
         $values['destination'],
         $values['subject'],
         $values['content'],
-        $user->getCompleteName(),
+        UserManager::formatUserFullName($user),
         $user->getEmail()
     );
 
     Display::addFlash(
-        Display::return_message(get_lang('MailingTestSent'), 'warning')
+        Display::return_message(get_lang('MailingTestSent'), 'success')
     );
 
     header('Location: '.api_get_self());

+ 1 - 1
main/admin/languages.php

@@ -54,7 +54,7 @@ $msgLang = isset($_SESSION['disabled_languages']) ? 1 : 0;
 $disabledLang = isset($_SESSION['disabled_languages']) ? $_SESSION['disabled_languages'] : null;
 
 $htmlHeadXtra[] = '<script>
- $(document).ready(function() {
+ $(function () {
     var msgLang = '.$msgLang.';
     var disabledLang = "'.$disabledLang.'"
 

+ 35 - 13
main/admin/settings.lib.php

@@ -1118,6 +1118,7 @@ function addEditTemplate()
 
     // Setting the form elements: the title of the template.
     $form->addText('title', get_lang('Title'), false);
+    $form->addText('comment', get_lang('Description'), false);
 
     // Setting the form elements: the content of the template (wysiwyg editor).
     $form->addHtmlEditor(
@@ -1129,7 +1130,9 @@ function addEditTemplate()
     );
 
     // Setting the form elements: the form to upload an image to be used with the template.
-    $form->addElement('file', 'template_image', get_lang('Image'), '');
+    if (empty($template->getImage())) {
+        $form->addElement('file', 'template_image', get_lang('Image'), '');
+    }
 
     // Setting the form elements: a little bit information about the template image.
     $form->addElement('static', 'file_comment', '', get_lang('TemplateImageComment100x70'));
@@ -1139,12 +1142,14 @@ function addEditTemplate()
         $defaults['template_id'] = $id;
         $defaults['template_text'] = $template->getContent();
         // Forcing get_lang().
-        $defaults['title'] = get_lang($template->getTitle());
+        $defaults['title'] = $template->getTitle();
+        $defaults['comment'] = $template->getComment();
 
         // Adding an extra field: a hidden field with the id of the template we are editing.
         $form->addElement('hidden', 'template_id');
 
         // Adding an extra field: a preview of the image that is currently used.
+
         if (!empty($template->getImage())) {
             $form->addElement(
                 'static',
@@ -1155,6 +1160,7 @@ function addEditTemplate()
                     .'" alt="'.get_lang('TemplatePreview')
                     .'"/>'
             );
+            $form->addCheckBox('delete_image', null, get_lang('DeletePicture'));
         } else {
             $form->addElement(
                 'static',
@@ -1171,20 +1177,28 @@ function addEditTemplate()
     $form->addButtonSave(get_lang('Ok'), 'submit');
 
     // Setting the rules: the required fields.
-    $form->addRule(
-        'template_image',
-        get_lang('ThisFieldIsRequired'),
-        'required'
-    );
-    $form->addRule('title', get_lang('ThisFieldIsRequired'), 'required');
+    if (empty($template->getImage())) {
+        $form->addRule(
+            'template_image',
+            get_lang('ThisFieldIsRequired'),
+            'required'
+        );
+        $form->addRule('title', get_lang('ThisFieldIsRequired'), 'required');
+    }
 
     // if the form validates (complies to all rules) we save the information,
     // else we display the form again (with error message if needed)
     if ($form->validate()) {
         $check = Security::check_token('post');
+
         if ($check) {
             // Exporting the values.
             $values = $form->exportValues();
+            $isDelete = null;
+            if (isset($values['delete_image'])) {
+                $isDelete = $values['delete_image'];
+            }
+
             // Upload the file.
             if (!empty($_FILES['template_image']['name'])) {
                 $upload_ok = process_uploaded_file($_FILES['template_image']);
@@ -1214,14 +1228,15 @@ function addEditTemplate()
             }
 
             // Store the information in the database (as insert or as update).
-            $bootstrap = api_get_css(api_get_path(WEB_PUBLIC_PATH).'assets/bootstrap/dist/css/bootstrap.min.css');
+            //$bootstrap = api_get_css(api_get_path(WEB_PUBLIC_PATH).'assets/bootstrap/dist/css/bootstrap.min.css');
             $viewport = '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
 
             if ($_GET['action'] == 'add') {
-                $templateContent = '<head>'.$viewport.'<title>'.$values['title'].'</title>'.$bootstrap.'</head>'
+                $templateContent = '<head>'.$viewport.'<title>'.$values['title'].'</title></head>'
                     .$values['template_text'];
                 $template
                     ->setTitle($values['title'])
+                    ->setComment(Security::remove_XSS($values['comment']))
                     ->setContent(Security::remove_XSS($templateContent, COURSEMANAGERLOWSECURITY))
                     ->setImage($new_file_name);
                 $em->persist($template);
@@ -1236,13 +1251,20 @@ function addEditTemplate()
                     Display::return_icon('new_template.png', get_lang('AddTemplate'), '', ICON_SIZE_MEDIUM).
                     '</a>';
             } else {
-                $templateContent = '<head>'.$viewport.'<title>'.$values['title'].'</title>'.$bootstrap.'</head>'
-                    .$values['template_text'];
-
+                $templateContent = $values['template_text'];
                 $template
                     ->setTitle($values['title'])
+                    ->setComment(Security::remove_XSS($values['comment']))
                     ->setContent(Security::remove_XSS($templateContent, COURSEMANAGERLOWSECURITY));
 
+                if ($isDelete) {
+                    $filePath = api_get_path(SYS_APP_PATH).'home/default_platform_document/template_thumb/'.$template->getImage();
+                    if (file_exists($filePath)) {
+                        unlink($filePath);
+                    }
+                    $template->setImage(null);
+                }
+
                 if (!empty($new_file_name)) {
                     $template->setImage($new_file_name);
                 }

+ 6 - 0
main/admin/settings.php

@@ -381,6 +381,9 @@ $action_images['shibboleth'] = 'shibboleth.png';
 $action_images['facebook'] = 'facebook.png';
 $action_images['crons'] = 'crons.png';
 $action_images['webservices'] = 'webservices.png';
+if (api_get_configuration_value('allow_compilatio_tool')) {
+    $action_images['plagiarism'] = 'plagiarism.png';
+}
 
 $action_array = [];
 $resultcategories = [];
@@ -407,6 +410,9 @@ $resultcategories[] = ['category' => 'Shibboleth'];
 $resultcategories[] = ['category' => 'Facebook'];
 $resultcategories[] = ['category' => 'Crons'];
 $resultcategories[] = ['category' => 'WebServices'];
+if (api_get_configuration_value('allow_compilatio_tool')) {
+    $resultcategories[] = ['category' => 'Plagiarism'];
+}
 
 foreach ($resultcategories as $row) {
     $url = [];

+ 1 - 1
main/admin/sub_language.php

@@ -12,7 +12,7 @@ $this_section = SECTION_PLATFORM_ADMIN;
 
 api_protect_admin_script();
 $htmlHeadXtra[] = '<script>
- $(document).ready(function() {
+ $(function () {
     $(".save").click(function() {
         var button_name=$(this).attr("name");
         var button_array=button_name.split("|");

+ 1 - 1
main/admin/teachers_time_by_session_report.php

@@ -67,7 +67,7 @@ if ($session) {
             if (!array_key_exists($user->getId(), $usersInfo)) {
                 $usersInfo[$user->getId()] = [
                     'code' => $user->getOfficialCode(),
-                    'complete_name' => $user->getCompleteName(),
+                    'complete_name' => UserManager::formatUserFullName($user),
                     'time_in_platform' => api_time_to_hms(
                         Tracking::get_time_spent_on_the_platform($user->getId(), 'ever')
                     ),

+ 4 - 0
main/admin/user_edit.php

@@ -1,6 +1,8 @@
 <?php
 /* For licensing terms, see /license.txt */
 
+use ChamiloSession as Session;
+
 /**
  * @package chamilo.admin
  */
@@ -489,6 +491,8 @@ if ($form->validate()) {
             api_get_path(WEB_CODE_PATH).'admin/user_edit.php?user_id='.$user_id
         );
 
+        Session::erase('system_timezone');
+
         Display::addFlash(Display::return_message($message, 'normal', false));
         header('Location: user_list.php');
         exit();

+ 28 - 13
main/admin/user_import.php

@@ -16,6 +16,10 @@ require_once __DIR__.'/../inc/global.inc.php';
 $purification_option_for_usernames = false;
 $userId = api_get_user_id();
 
+api_protect_admin_script(true, null);
+api_protect_limit_for_session_admin();
+set_time_limit(0);
+
 /**
  * @param array $users
  * @param bool  $checkUniqueEmail
@@ -220,6 +224,8 @@ function save_data($users, $sendMail = false)
 
             $user = complete_missing_data($user);
             $user['Status'] = api_status_key($user['Status']);
+            $redirection = isset($user['Redirection']) ? $user['Redirection'] : '';
+
             $user_id = UserManager::create_user(
                 $user['FirstName'],
                 $user['LastName'],
@@ -237,7 +243,14 @@ function save_data($users, $sendMail = false)
                 0,
                 null,
                 null,
-                $sendMail
+                $sendMail,
+                false,
+                '',
+                false,
+                null,
+                null,
+                null,
+                $redirection
             );
 
             if ($user_id) {
@@ -484,12 +497,7 @@ function processUsers(&$users, $sendMail)
 }
 
 $this_section = SECTION_PLATFORM_ADMIN;
-api_protect_admin_script(true, null);
-api_protect_limit_for_session_admin();
-set_time_limit(0);
-
 $defined_auth_sources[] = PLATFORM_AUTH_SOURCE;
-
 if (isset($extAuthSource) && is_array($extAuthSource)) {
     $defined_auth_sources = array_merge($defined_auth_sources, array_keys($extAuthSource));
 }
@@ -734,14 +742,20 @@ if ($count_fields > 0) {
         $i++;
     }
 }
+
+if (api_get_configuration_value('plugin_redirection_enabled')) {
+    $list[] = 'Redirection';
+    $list_reponse[] = api_get_path(WEB_PATH);
+}
+
 ?>
 <p><?php echo get_lang('CSVMustLookLike').' ('.get_lang('MandatoryFields').')'; ?> :</p>
 <blockquote>
 <pre>
-<b>LastName</b>;<b>FirstName</b>;<b>Email</b>;UserName;Password;AuthSource;OfficialCode;PhoneNumber;Status;ExpiryDate;<span style="color:red;"><?php if (count($list) > 0) {
+<b>LastName</b>;<b>FirstName</b>;<b>Email</b>;UserName;Password;AuthSource;OfficialCode;language;PhoneNumber;Status;ExpiryDate;<span style="color:red;"><?php if (count($list) > 0) {
     echo implode(';', $list).';';
 } ?></span>Courses;Sessions;ClassId;
-<b>xxx</b>;<b>xxx</b>;<b>xxx</b>;xxx;xxx;<?php echo implode('/', $defined_auth_sources); ?>;xxx;xxx;user/teacher/drh;0000-00-00 00:00:00;<span style="color:red;"><?php if (count($list_reponse) > 0) {
+<b>xxx</b>;<b>xxx</b>;<b>xxx</b>;xxx;xxx;<?php echo implode('/', $defined_auth_sources); ?>;xxx;english/spanish/(other);xxx;user/teacher/drh;0000-00-00 00:00:00;<span style="color:red;"><?php if (count($list_reponse) > 0) {
     echo implode(';', $list_reponse).';';
 } ?></span>xxx1|xxx2|xxx3;sessionId|sessionId|sessionId;1;<br />
 </pre>
@@ -759,17 +773,18 @@ if ($count_fields > 0) {
         &lt;AuthSource&gt;<?php echo implode('/', $defined_auth_sources); ?>&lt;/AuthSource&gt;
         <b>&lt;Email&gt;xxx&lt;/Email&gt;</b>
         &lt;OfficialCode&gt;xxx&lt;/OfficialCode&gt;
+        &lt;language&gt;english/spanish/(other)&lt;/language&gt;
         &lt;PhoneNumber&gt;xxx&lt;/PhoneNumber&gt;
-        &lt;Status&gt;user/teacher/drh<?php if ($result_xml != '') {
+        &lt;Status&gt;user/teacher/drh&lt;/Status&gt;<?php if ($result_xml != '') {
     echo '<br /><span style="color:red;">', $result_xml;
-    echo '</span>';
-} ?>&lt;/Status&gt;
+    echo '</span><br />';
+} ?>
         &lt;Courses&gt;xxx1|xxx2|xxx3&lt;/Courses&gt;
         &lt;Sessions&gt;sessionId|sessionId|sessionId&lt;/Sessions&gt;
         &lt;ClassId&gt;1&lt;/ClassId&gt;
-        &lt;/Contact&gt;
+    &lt;/Contact&gt;
 &lt;/Contacts&gt;
 </pre>
-    </blockquote>
+</blockquote>
 <?php
 Display::display_footer();

+ 3 - 3
main/admin/user_information.php

@@ -48,7 +48,7 @@ $userId = $user['user_id'];
 
 $currentUrl = api_get_self().'?user_id='.$userId;
 
-$tool_name = $userEntity->getCompleteName();
+$tool_name = UserManager::formatUserFullName($userEntity);
 $table_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
 $table_course = Database::get_main_table(TABLE_MAIN_COURSE);
 $csvContent = [];
@@ -218,13 +218,13 @@ if (api_get_setting('allow_terms_conditions') === 'true') {
         $btn = Display::url(
             get_lang('DeleteLegal'),
             api_get_self().'?action=delete_legal&user_id='.$userId,
-            ['class' => 'btn btn-danger']
+            ['class' => 'btn btn-danger btn-xs']
         );
     } else {
         $btn = Display::url(
             get_lang('SendLegal'),
             api_get_self().'?action=send_legal&user_id='.$userId,
-            ['class' => 'btn btn-primary']
+            ['class' => 'btn btn-primary btn-xs']
         );
         $timeLegalAccept = get_lang('NotRegistered');
     }

+ 1 - 1
main/admin/user_linking_requests.php

@@ -147,7 +147,7 @@ $form = new FormValidator('user_linking_requests', 'get');
 $form->addSelectAjax(
     'hrm',
     get_lang('DRH'),
-    $hrm ? [$hrm->getId() => $hrm->getCompleteName()] : [],
+    $hrm ? [$hrm->getId() => UserManager::formatUserFullName($hrm)] : [],
     ['url' => api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=user_by_role']
 );
 $form->addButtonFilter(get_lang('Filter'));

+ 42 - 40
main/admin/user_list.php

@@ -157,7 +157,7 @@ function display_advanced_search_form () {
     }
 }
 
-$(document).ready(function() {
+$(function () {
     var select_val = $("#input_select_extra_data").val();
     if ( document.getElementById(\'extra_data_text\')) {
         if (select_val != 0) {
@@ -217,21 +217,22 @@ function prepare_user_sql_query($getCount)
     if ($getCount) {
         $sql .= "SELECT COUNT(u.id) AS total_number_of_items FROM $user_table u";
     } else {
-        $sql .= "SELECT u.id AS col0, u.official_code AS col2, ";
+        $sql .= 'SELECT u.id AS col0, u.official_code AS col2, ';
 
         if (api_is_western_name_order()) {
-            $sql .= "u.firstname AS col3, u.lastname AS col4, ";
+            $sql .= 'u.firstname AS col3, u.lastname AS col4, ';
         } else {
-            $sql .= "u.lastname AS col3, u.firstname AS col4, ";
+            $sql .= 'u.lastname AS col3, u.firstname AS col4, ';
         }
 
         $sql .= " u.username AS col5,
                     u.email AS col6,
                     u.status AS col7,
                     u.active AS col8,
-                    u.id AS col9,
-                    u.registration_date AS col10,
-                    u.expiration_date AS exp,
+                    u.registration_date AS col9,
+                    u.last_login as col10,                    
+                    u.id AS col11,
+                    u.expiration_date AS exp,                    
                     u.password
                 FROM $user_table u";
     }
@@ -275,9 +276,7 @@ function prepare_user_sql_query($getCount)
         $extra_info = UserManager::get_extra_field_information_by_name($keyword_extra_data);
         $field_id = $extra_info['id'];
         $sql.= " INNER JOIN user_field_values ufv ON u.id=ufv.user_id AND ufv.field_id=$field_id ";
-    }
-    */
-
+    } */
     if (isset($_GET['keyword']) && !empty($_GET['keyword'])) {
         $keywordFiltered = Database::escape_string("%".$_GET['keyword']."%");
         $sql .= " WHERE (
@@ -330,18 +329,18 @@ function prepare_user_sql_query($getCount)
         if (isset($keywordListValues['keyword_active']) &&
             !isset($keywordListValues['keyword_inactive'])
         ) {
-            $sql .= " AND u.active = 1";
+            $sql .= ' AND u.active = 1';
         } elseif (isset($keywordListValues['keyword_inactive']) &&
             !isset($keywordListValues['keyword_active'])
         ) {
-            $sql .= " AND u.active = 0";
+            $sql .= ' AND u.active = 0';
         }
-        $sql .= " ) ";
+        $sql .= ' ) ';
     }
 
     $preventSessionAdminsToManageAllUsers = api_get_setting('prevent_session_admins_to_manage_all_users');
     if (api_is_session_admin() && $preventSessionAdminsToManageAllUsers === 'true') {
-        $sql .= " AND u.creator_id = ".api_get_user_id();
+        $sql .= ' AND u.creator_id = '.api_get_user_id();
     }
 
     $variables = Session::read('variables_to_show', []);
@@ -408,7 +407,7 @@ function prepare_user_sql_query($getCount)
     if ((api_is_platform_admin() || api_is_session_admin()) &&
         api_get_multiple_access_url()
     ) {
-        $sql .= " AND url_rel_user.access_url_id=".api_get_current_access_url_id();
+        $sql .= ' AND url_rel_user.access_url_id = '.api_get_current_access_url_id();
     }
 
     return $sql;
@@ -446,17 +445,18 @@ function get_user_data($from, $number_of_items, $column, $direction)
     if (!in_array($direction, ['ASC', 'DESC'])) {
         $direction = 'ASC';
     }
-    $column = intval($column);
-    $from = intval($from);
-    $number_of_items = intval($number_of_items);
+    $column = (int) $column;
+    $from = (int) $from;
+    $number_of_items = (int) $number_of_items;
+
     $sql .= " ORDER BY col$column $direction ";
-    $sql .= " LIMIT $from,$number_of_items";
+    $sql .= " LIMIT $from, $number_of_items";
 
     $res = Database::query($sql);
 
     $users = [];
     $t = time();
-    while ($user = Database::fetch_row($res)) {
+    while ($user = Database::fetch_array($res)) {
         $userPicture = UserManager::getUserPicture(
             $user[0],
             USER_IMAGE_SIZE_SMALL
@@ -466,9 +466,9 @@ function get_user_data($from, $number_of_items, $column, $direction)
             alt="'.api_get_person_name($user[2], $user[3]).'" 
             title="'.api_get_person_name($user[2], $user[3]).'" />';
 
-        if ($user[7] == 1 && !empty($user[10])) {
+        if ($user[7] == 1 && !empty($user['exp'])) {
             // check expiration date
-            $expiration_time = convert_sql_date($user[10]);
+            $expiration_time = convert_sql_date($user['exp']);
             // if expiration date is passed, store a special value for active field
             if ($expiration_time < $t) {
                 $user[7] = '-1';
@@ -477,16 +477,17 @@ function get_user_data($from, $number_of_items, $column, $direction)
 
         // forget about the expiration date field
         $users[] = [
-            $user[0],
+            $user[0], // id
             $photo,
             $user[1],
             $user[2],
             $user[3],
-            $user[4],
-            $user[5],
+            $user[4], // username
+            $user[5], // email
             $user[6],
-            $user[7],
-            api_get_local_time($user[9]),
+            $user[7], // active
+            api_get_local_time($user[8]),
+            api_get_local_time($user[9], null, null, true),
             $user[0],
         ];
     }
@@ -509,7 +510,7 @@ function email_filter($email)
 /**
  * Returns a mailto-link.
  *
- * @param string $email  An email-address
+ * @param string $name
  * @param array  $params Deprecated
  * @param array  $row
  *
@@ -577,10 +578,10 @@ function modify_filter($user_id, $url_params, $row)
         }
     }
 
-    //only allow platform admins to login_as, or session admins only for students (not teachers nor other admins)
+    // Only allow platform admins to login_as, or session admins only for students (not teachers nor other admins)
     $loginAsStatusForSessionAdmins = [$statusname[STUDENT]];
 
-    //except when allow_session_admin_login_as_teacher is enabled, then can login_as teachers also
+    // Except when allow_session_admin_login_as_teacher is enabled, then can login_as teachers also
     if (api_get_configuration_value('allow_session_admin_login_as_teacher')) {
         $loginAsStatusForSessionAdmins[] = $statusname[COURSEMANAGER];
     }
@@ -846,17 +847,17 @@ function active_filter($active, $params, $row)
  */
 function status_filter($status)
 {
-    $statusname = api_get_status_langvars();
+    $name = api_get_status_langvars();
 
-    return $statusname[$status];
+    return $name[$status];
 }
 
 if (isset($_GET['keyword']) || isset($_GET['keyword_firstname'])) {
-    $interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')];
-    $interbreadcrumb[] = ["url" => 'user_list.php', "name" => get_lang('UserList')];
+    $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
+    $interbreadcrumb[] = ['url' => 'user_list.php', 'name' => get_lang('UserList')];
     $tool_name = get_lang('SearchUsers');
 } else {
-    $interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')];
+    $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
     $tool_name = get_lang('UserList');
 }
 
@@ -977,7 +978,7 @@ $form->addText(
     get_lang('Search'),
     false,
     [
-        'aria-label' => get_lang("SearchUsers"),
+        'aria-label' => get_lang('SearchUsers'),
     ]
 );
 $form->addButtonSearch(get_lang('Search'));
@@ -1059,7 +1060,7 @@ $data = $extraField->addElements($form, 0, [], true, false, $variablesToShow);
 
 $htmlHeadXtra[] = '
     <script>
-    $(document).ready(function() {
+    $(function () {
         '.$data['jquery_ready_content'].'
     })
     </script>
@@ -1098,14 +1099,15 @@ $table->set_header(6, get_lang('Email'));
 $table->set_header(7, get_lang('Profile'));
 $table->set_header(8, get_lang('Active'), true, 'width="15px"');
 $table->set_header(9, get_lang('RegistrationDate'), true, 'width="90px"');
-$table->set_header(10, get_lang('Action'), false, 'width="220px"');
+$table->set_header(10, get_lang('LatestLogin'), true, 'width="90px"');
+$table->set_header(11, get_lang('Action'), false, 'width="220px"');
 
 $table->set_column_filter(3, 'user_filter');
 $table->set_column_filter(4, 'user_filter');
 $table->set_column_filter(6, 'email_filter');
 $table->set_column_filter(7, 'status_filter');
 $table->set_column_filter(8, 'active_filter');
-$table->set_column_filter(10, 'modify_filter');
+$table->set_column_filter(11, 'modify_filter');
 
 // Hide email column if login is email, to avoid column with same data
 if (api_get_setting('login_is_email') === 'true') {
@@ -1126,7 +1128,7 @@ $table->set_form_actions($actionsList);
 $table_result = $table->return_table();
 $extra_search_options = '';
 
-//Try to search the user everywhere
+// Try to search the user everywhere
 if ($table->get_total_number_of_items() == 0) {
     if (api_get_multiple_access_url() && isset($_REQUEST['keyword'])) {
         $keyword = Database::escape_string($_REQUEST['keyword']);

+ 5 - 4
main/admin/user_move_stats.php

@@ -124,7 +124,7 @@ if (isset($_REQUEST['load_ajax'])) {
                     );
                 }
 
-                //Begin with the import process
+                // Begin with the import process
                 $course_info = api_get_course_info($origin_course_code);
                 $course_id = $course_info['real_id'];
 
@@ -239,6 +239,7 @@ if (isset($_REQUEST['load_ajax'])) {
                 while ($row = Database::fetch_array($res, 'ASSOC')) {
                     $list[] = $row['access_id'];
                 }
+
                 if (!empty($list)) {
                     foreach ($list as $id) {
                         if ($update_database) {
@@ -262,7 +263,7 @@ if (isset($_REQUEST['load_ajax'])) {
                 $res = Database::query($sql);
 
                 //Getting the list of LPs in the new session
-                $lp_list = new LearnpathList($user_id, $origin_course_code, $new_session_id);
+                $lp_list = new LearnpathList($user_id, $course_info, $new_session_id);
                 $flat_list = $lp_list->get_flat_list();
 
                 $list = [];
@@ -314,8 +315,8 @@ if (isset($_REQUEST['load_ajax'])) {
                     $sql = "SELECT * FROM $TBL_LP_VIEW WHERE user_id = $user_id AND session_id = $new_session_id AND c_id = $course_id";
                     $res = Database::query($sql);
 
-                    //Getting the list of LPs in the new session
-                    $lp_list = new LearnpathList($user_id, $origin_course_code, $new_session_id);
+                    // Getting the list of LPs in the new session
+                    $lp_list = new LearnpathList($user_id, $course_info, $new_session_id);
                     $flat_list = $lp_list->get_flat_list();
 
                     $list = [];

+ 1 - 1
main/admin/usergroup_user_import.php

@@ -83,7 +83,7 @@ function save_data($users_classes, $deleteUsersNotInList = false)
                      WHERE username = '".Database::escape_string(UserManager::purify_username($user_class['UserName'], $purification_option_for_usernames))."'";
             $res1 = Database::query($sql1);
             $obj1 = Database::fetch_object($res1);
-            $id = $usergroup->get_id_by_name($user_class['ClassName']);
+            $id = $usergroup->getIdByName($user_class['ClassName']);
 
             if ($obj1 && $id) {
                 $csv_data[$id]['user_list'][] = $obj1->user_id;

+ 1 - 1
main/auth/courses_controller.php

@@ -857,7 +857,7 @@ class CoursesController
 
             $generalCoach = $session->getGeneralCoach();
             $coachId = $generalCoach ? $generalCoach->getId() : 0;
-            $coachName = $generalCoach ? $session->getGeneralCoach()->getCompleteName() : '';
+            $coachName = $generalCoach ? UserManager::formatUserFullName($session->getGeneralCoach()) : '';
 
             $actions = null;
             if (api_is_platform_admin()) {

+ 1 - 1
main/auth/courses_list.php

@@ -51,7 +51,7 @@ if (!empty($user_course_categories)) {
         }
         if ($action != 'unsubscribe') {
             if ($allowCollapsable) {
-                if ($row['collapsed'] == 0) {
+                if (isset($row['collapsed']) && $row['collapsed'] == 0) {
                     echo Display::url(
                         '<i class="fa fa-folder-open"></i>',
                         $url.'&action=set_collapsable&option=1'

+ 1 - 1
main/auth/hrm_courses.php

@@ -58,7 +58,7 @@ foreach ($assignedUsers as $assignedUserId => $assignedUserInfo) {
 
     $userInfo = [
         'username' => $assignedUser->getUsername(),
-        'complete_name' => $assignedUser->getCompleteName(),
+        'complete_name' => UserManager::formatUserFullName($assignedUser),
         'picture_url' => UserManager::getUserPicture($assignedUserId),
         'course_list' => $courseController->returnCoursesAndSessions($assignedUserId)['html'],
     ];

+ 22 - 14
main/auth/inscription.php

@@ -854,20 +854,28 @@ if ($form->validate()) {
 
                 $emailbody .= get_lang('ManageUser').": $url_edit";
 
-                $admins = UserManager::get_all_administrators();
-                foreach ($admins as $admin_info) {
-                    MessageManager::send_message(
-                        $admin_info['user_id'],
-                        $emailsubject,
-                        $emailbody,
-                        [],
-                        [],
-                        null,
-                        null,
-                        null,
-                        null,
-                        $user_id
-                    );
+                if (api_get_configuration_value('send_inscription_notification_to_general_admin_only')) {
+                    $email = api_get_setting('emailAdministrator');
+                    $firtname = api_get_setting('administratorSurname');
+                    $lastname = api_get_setting('administratorName');
+
+                    api_mail_html("$firtname $lastname", $email, $emailsubject, $emailbody);
+                } else {
+                    $admins = UserManager::get_all_administrators();
+                    foreach ($admins as $admin_info) {
+                        MessageManager::send_message(
+                            $admin_info['user_id'],
+                            $emailsubject,
+                            $emailbody,
+                            [],
+                            [],
+                            null,
+                            null,
+                            null,
+                            null,
+                            $user_id
+                        );
+                    }
                 }
 
                 // 2. set account inactive

+ 8 - 11
main/auth/profile.php

@@ -26,7 +26,6 @@ $logInfo = [
     'tool_id' => 0,
     'tool_id_detail' => 0,
     'action' => $this_section,
-    'info' => '',
 ];
 Event::registerLog($logInfo);
 
@@ -312,10 +311,10 @@ if (is_platform_authentication() &&
     is_profile_editable() &&
     api_get_setting('profile', 'password') == 'true'
 ) {
-    $form->addElement('password', 'password0', [get_lang('Pass'), get_lang('Enter2passToChange')], ['size' => 40]);
-    $form->addElement('password', 'password1', get_lang('NewPass'), ['id' => 'password1', 'size' => 40]);
+    $form->addElement('password', 'password0', [get_lang('Pass'), get_lang('TypeCurrentPassword')], ['size' => 40]);
+    $form->addElement('password', 'password1', [get_lang('NewPass'), get_lang('EnterYourNewPassword')], ['id' => 'password1', 'size' => 40]);
 
-    $form->addElement('password', 'password2', get_lang('Confirmation'), ['size' => 40]);
+    $form->addElement('password', 'password2', [get_lang('Confirmation'), get_lang('RepeatYourNewPassword')], ['size' => 40]);
     //    user must enter identical password twice so we can prevent some user errors
     $form->addRule(['password1', 'password2'], get_lang('PassTwo'), 'compare');
     $form->addPasswordRule('password1');
@@ -651,21 +650,19 @@ if ($form->validate()) {
     Session::write('_user', $userInfo);
 
     if ($hook) {
-        Database::getManager()->clear(User::class); //Avoid cache issue (user entity is used before)
-
-        $user = api_get_user_entity(api_get_user_id()); //Get updated user info for hook event
-
+        Database::getManager()->clear(User::class); // Avoid cache issue (user entity is used before)
+        $user = api_get_user_entity(api_get_user_id()); // Get updated user info for hook event
         $hook->setEventData(['user' => $user]);
         $hook->notifyUpdateUser(HOOK_EVENT_TYPE_POST);
     }
 
+    Session::erase('system_timezone');
+
     $url = api_get_self();
-    header("Location: ".$url);
+    header("Location: $url");
     exit;
 }
 
-// the header
-
 $actions = '';
 if ($allowSocialTool) {
     if (api_get_setting('extended_profile') === 'true') {

+ 6 - 6
main/badge/assign.php

@@ -277,7 +277,7 @@ if ($form->validate()) {
             Display::return_message(
                 sprintf(
                     get_lang('TheUserXHasAlreadyAchievedTheSkillY'),
-                    $user->getCompleteName(),
+                    UserManager::formatUserFullName($user),
                     $skill->getName()
                 ),
                 'warning'
@@ -327,7 +327,7 @@ if ($form->validate()) {
                     $subject = get_lang('StudentHadEnoughSkills');
                     $message = sprintf(
                         get_lang('StudentXHadEnoughSkillsToGetSkillXToAssignClickHereX'),
-                        $user->getCompleteName(),
+                        UserManager::formatUserFullName($user),
                         $parentData['name'],
                         $link
                     );
@@ -349,7 +349,7 @@ if ($form->validate()) {
             sprintf(
                 get_lang('SkillXAssignedToUserY'),
                 $skill->getName(),
-                $user->getCompleteName()
+                UserManager::formatUserFullName($user)
             ),
             'success'
         )
@@ -359,7 +359,7 @@ if ($form->validate()) {
     exit;
 }
 
-$form->setDefaults(['user_name' => $user->getCompleteNameWithUsername()]);
+$form->setDefaults(['user_name' => UserManager::formatUserFullName($user, true)]);
 $form->freeze(['user_name']);
 
 if (api_is_drh()) {
@@ -380,7 +380,7 @@ if (api_is_drh()) {
     }
     $interbreadcrumb[] = [
         'url' => api_get_path(WEB_CODE_PATH).'mySpace/myStudents.php?student='.$userId,
-        'name' => $user->getCompleteName(),
+        'name' => UserManager::formatUserFullName($user),
     ];
 } else {
     $interbreadcrumb[] = [
@@ -393,7 +393,7 @@ if (api_is_drh()) {
     ];
     $interbreadcrumb[] = [
         'url' => api_get_path(WEB_CODE_PATH).'admin/user_information.php?user_id='.$userId,
-        'name' => $user->getCompleteName(),
+        'name' => UserManager::formatUserFullName($user),
     ];
 }
 

+ 3 - 3
main/badge/issued.php

@@ -100,7 +100,7 @@ $skillIssueInfo = [
     'argumentation' => $skillIssue->getArgumentation(),
     'source_name' => $skillIssue->getSourceName(),
     'user_id' => $skillIssue->getUser()->getId(),
-    'user_complete_name' => $skillIssue->getUser()->getCompleteName(),
+    'user_complete_name' => UserManager::formatUserFullName($skillIssue->getUser()),
     'skill_id' => $skillIssue->getSkill()->getId(),
     'skill_badge_image' => Skill::getWebIconPath($skillIssue->getSkill()),
     'skill_name' => $skillIssue->getSkill()->getName(),
@@ -123,7 +123,7 @@ foreach ($skillIssueComments as $comment) {
     $skillIssueInfo['comments'][] = [
         'text' => $comment->getFeedbackText(),
         'value' => $comment->getFeedbackValue(),
-        'giver_complete_name' => $comment->getFeedbackGiver()->getCompleteName(),
+        'giver_complete_name' => UserManager::formatUserFullName($comment->getFeedbackGiver()),
         'datetime' => api_format_date($commentDate, DATE_TIME_FORMAT_SHORT),
     ];
 }
@@ -183,7 +183,7 @@ if ($showLevels && $allowToEdit) {
 
     if ($formAcquiredLevel->validate() && $allowComment) {
         $values = $formAcquiredLevel->exportValues();
-        $level = $skillLevelRepo->find(intval($values['acquired_level']));
+        $level = $skillLevelRepo->find($values['acquired_level']);
         $skillIssue->setAcquiredLevel($level);
 
         $entityManager->persist($skillIssue);

+ 3 - 3
main/badge/issued_all.php

@@ -49,7 +49,7 @@ $userSkills = $skillUserRepo->findBy([
 
 $userInfo = [
     'id' => $user->getId(),
-    'complete_name' => $user->getCompleteName(),
+    'complete_name' => UserManager::formatUserFullName($user),
 ];
 
 $skillInfo = [
@@ -87,7 +87,7 @@ foreach ($userSkills as $index => $skillIssue) {
         'argumentation' => $skillIssue->getArgumentation(),
         'source_name' => $skillIssue->getSourceName(),
         'user_id' => $skillIssue->getUser()->getId(),
-        'user_complete_name' => $skillIssue->getUser()->getCompleteName(),
+        'user_complete_name' => UserManager::formatUserFullName($skillIssue->getUser()),
         'skill_id' => $skillIssue->getSkill()->getId(),
         'skill_badge_image' => Skill::getWebIconPath($skillIssue->getSkill()),
         'skill_name' => $skillIssue->getSkill()->getName(),
@@ -109,7 +109,7 @@ foreach ($userSkills as $index => $skillIssue) {
         $skillIssueInfo['comments'][] = [
             'text' => $comment->getFeedbackText(),
             'value' => $comment->getFeedbackValue(),
-            'giver_complete_name' => $comment->getFeedbackGiver()->getCompleteName(),
+            'giver_complete_name' => UserManager::formatUserFullName($comment->getFeedbackGiver()),
             'datetime' => api_format_date($commentDate, DATE_TIME_FORMAT_SHORT),
         ];
     }

+ 1 - 1
main/course_info/about.php

@@ -64,7 +64,7 @@ $teachersData = [];
 foreach ($courseTeachers as $teacherSubscription) {
     $teacher = $teacherSubscription->getUser();
     $userData = [
-        'complete_name' => $teacher->getCompleteName(),
+        'complete_name' => UserManager::formatUserFullName($teacher),
         'image' => UserManager::getUserPicture(
             $teacher->getId(),
             USER_IMAGE_SIZE_ORIGINAL

+ 6 - 0
main/course_info/infocours.php

@@ -875,9 +875,15 @@ $groupNotification = [
     $form->createElement('radio', 'hide_forum_notifications', null, get_lang('No'), 2),
 ];
 
+$addUsers = [
+    $form->createElement('radio', 'subscribe_users_to_forum_notifications', null, get_lang('Yes'), 1),
+    $form->createElement('radio', 'subscribe_users_to_forum_notifications', null, get_lang('No'), 2),
+];
+
 $globalGroup = [
     get_lang('EnableForumAutoLaunch') => $group,
     get_lang('HideForumNotifications') => $groupNotification,
+    get_lang('SubscribeUsersToAllForumNotifications') => $addUsers,
     '' => $myButton,
 ];
 

+ 3 - 3
main/cron/course_finished.php

@@ -67,7 +67,7 @@ foreach ($sessions as $session) {
         );
 
         $bodyTemplate = new Template(null, false, false, false, false, false);
-        $bodyTemplate->assign('complete_user_name', $user->getCompleteName());
+        $bodyTemplate->assign('complete_user_name', UserManager::formatUserFullName($user));
         $bodyTemplate->assign('session_name', $session->getName());
 
         $bodyLayout = $bodyTemplate->get_template(
@@ -75,7 +75,7 @@ foreach ($sessions as $session) {
         );
 
         api_mail_html(
-            $user->getCompleteName(),
+            UserManager::formatUserFullName($user),
             $user->getEmail(),
             $subjectTemplate->fetch($subjectLayout),
             $bodyTemplate->fetch($bodyLayout),
@@ -84,7 +84,7 @@ foreach ($sessions as $session) {
         );
 
         echo '============'.PHP_EOL;
-        echo "Email sent to: {$user->getCompleteName()} ({$user->getEmail()})".PHP_EOL;
+        echo "Email sent to: ".UserManager::formatUserFullName($user)." ({$user->getEmail()})".PHP_EOL;
         echo "Session: {$session->getName()}".PHP_EOL;
         echo "End date: {$session->getAccessEndDate()->format('Y-m-d h:i')}".PHP_EOL;
     }

+ 30 - 16
main/cron/import_csv.php

@@ -1226,16 +1226,12 @@ class ImportCsv
                 $update = false;
                 $item = null;
                 if (!isset($event[$extraFieldName])) {
-                    $this->logger->addInfo(
-                        "No external_calendar_itemID found. Skipping ..."
-                    );
+                    $this->logger->addInfo('No external_calendar_itemID found. Skipping ...');
                     continue;
                 } else {
                     $externalEventId = $event[$extraFieldName];
                     if (empty($externalEventId)) {
-                        $this->logger->addInfo(
-                            "external_calendar_itemID was set but empty. Skipping ..."
-                        );
+                        $this->logger->addInfo('external_calendar_itemID was set but empty. Skipping ...');
                         continue;
                     }
 
@@ -1433,28 +1429,46 @@ class ImportCsv
 
                     $courseTitle = $courseInfo['title'];
 
+                    // Get the value of the "careerid" extra field of this
+                    // session
                     $sessionExtraFieldValue = new ExtraFieldValue('session');
-                    $values = $sessionExtraFieldValue->get_values_by_handler_and_field_variable(
+                    $externalCareerIdList = $sessionExtraFieldValue->get_values_by_handler_and_field_variable(
                         $event['session_id'],
-                        $this->extraFieldIdNameList['session_career']
+                        'careerid'
                     );
+                    $externalCareerIdList = $externalCareerIdList['value'];
+                    $externalCareerIds = [];
+                    if (substr($externalCareerIdList, 0, 1) === '[') {
+                        $externalCareerIdList = substr($externalCareerIdList, 1, -1);
+                        $externalCareerIds = preg_split('/,/', $externalCareerIdList);
+                    } else {
+                        $externalCareerIds = [$externalCareerIdList];
+                    }
 
+                    $careerExtraFieldValue = new ExtraFieldValue('career');
+                    $career = new Career();
                     $careerName = '';
-                    if (!empty($values)) {
-                        foreach ($values as $value) {
-                            if (isset($value['value'])) {
-                                $careerName = $value['value'];
-                            }
-                        }
+
+                    // Concat the names of each career linked to this session
+                    foreach ($externalCareerIds as $externalCareerId) {
+                        // Using the external_career_id field (from above),
+                        // find the career ID
+                        $careerValue = $careerExtraFieldValue->get_item_id_from_field_variable_and_field_value(
+                            'external_career_id',
+                            $externalCareerId
+                        );
+                        $career = $career->find($careerValue['item_id']);
+                        $careerName .= $career['name'].', ';
                     }
+                    // Remove trailing comma
+                    $careerName = substr($careerName, 0, -2);
 
                     $subject = sprintf(
                         get_lang('WelcomeToPortalXInCourseSessionX'),
-                        api_get_setting('siteName'),
+                        api_get_setting('Institution'),
                         $courseInfo['title']
                     );
 
-                    $tpl->assign('site_name', api_get_setting('siteName'));
                     $tpl->assign('course_title', $courseTitle);
                     $tpl->assign('career_name', $careerName);
                     $tpl->assign('first_lesson', $date);

+ 1 - 1
main/document/download_scorm.php

@@ -29,7 +29,7 @@ if (empty($obj)) {
 }
 
 // If is visible for the current user
-if (!learnpath::is_lp_visible_for_student($obj->get_id(), api_get_user_id())) {
+if (!learnpath::is_lp_visible_for_student($obj->get_id(), api_get_user_id(), $_course)) {
     api_not_allowed();
 }
 

+ 2 - 2
main/exercise/Annotation.php

@@ -11,8 +11,8 @@
  */
 class Annotation extends Question
 {
-    public static $typePicture = 'annotation.png';
-    public static $explanationLangVar = 'Annotation';
+    public $typePicture = 'annotation.png';
+    public $explanationLangVar = 'Annotation';
 
     /**
      * Annotation constructor.

+ 5 - 3
main/exercise/Draggable.php

@@ -8,8 +8,8 @@
  */
 class Draggable extends Question
 {
-    public static $typePicture = 'ordering.png';
-    public static $explanationLangVar = 'Draggable';
+    public $typePicture = 'ordering.png';
+    public $explanationLangVar = 'Draggable';
 
     /**
      * Class constructor.
@@ -217,7 +217,9 @@ class Draggable extends Question
 
         if ($exercise->showExpectedChoice()) {
             $header .= '<th>'.get_lang('YourChoice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
         } else {
             $header .= '<th>'.get_lang('ElementList').'</th>';
         }

+ 20 - 0
main/exercise/HotSpotDelineation.php

@@ -0,0 +1,20 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+/**
+ * Class HotSpotDelineation.
+ */
+class HotSpotDelineation extends HotSpot
+{
+    public $typePicture = 'hotspot-delineation.png';
+    public $explanationLangVar = 'HotspotDelineation';
+
+    /**
+     * HotSpotDelineation constructor.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+        $this->type = HOT_SPOT_DELINEATION;
+    }
+}

+ 5 - 3
main/exercise/MatchingDraggable.php

@@ -8,8 +8,8 @@
  */
 class MatchingDraggable extends Question
 {
-    public static $typePicture = 'matchingdrag.png';
-    public static $explanationLangVar = 'MatchingDraggable';
+    public $typePicture = 'matchingdrag.png';
+    public $explanationLangVar = 'MatchingDraggable';
 
     /**
      * Class constructor.
@@ -274,7 +274,9 @@ class MatchingDraggable extends Question
         }
 
         if ($exercise->showExpectedChoice()) {
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
             $header .= '<th>'.get_lang('Status').'</th>';
         } else {
             $header .= '<th>'.get_lang('CorrespondsTo').'</th>';

+ 13 - 12
main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php

@@ -18,8 +18,8 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
     const LEVEL_LIGHTRED = 4;
     const LEVEL_DARKRED = 5;
 
-    public static $typePicture = 'mccert.png';
-    public static $explanationLangVar = 'MultipleAnswerTrueFalseDegreeCertainty';
+    public $typePicture = 'mccert.png';
+    public $explanationLangVar = 'MultipleAnswerTrueFalseDegreeCertainty';
     public $optionsTitle;
     public $options;
 
@@ -77,7 +77,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
             .'</th>';
 
         // show column comment when feedback is enable
-        if ($objEx->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+        if ($objEx->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
             $html .= '<th>'.get_lang('Comment').'</th>';
         }
         $html .= '</tr>';
@@ -173,7 +173,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
             $form->addRule('answer['.$i.']', get_lang('ThisFieldIsRequired'), 'required');
 
             // show comment when feedback is enable
-            if ($objEx->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+            if ($objEx->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
                 $form->addElement(
                     'html_editor',
                     'comment['.$i.']',
@@ -306,19 +306,20 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question
     public function return_header(Exercise $exercise, $counter = null, $score = [])
     {
         $header = parent::return_header($exercise, $counter, $score);
-        $header .= '<table class="'
-            .$this->question_table_class
-            .'"><tr><th>'
-            .get_lang('Choice')
-            .'</th><th>'
-            .get_lang('ExpectedChoice')
-            .'</th><th>'
+        $header .= '<table class="'.$this->question_table_class.'"><tr>';
+        $header .= '<th>'.get_lang('Choice').'</th>';
+
+        if ($exercise->showExpectedChoiceColumn()) {
+            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+        }
+
+        $header .= '<th>'
             .get_lang('Answer')
             .'</th><th colspan="2" style="text-align:center;">'
             .get_lang('YourDegreeOfCertainty')
             .'</th>'
         ;
-        if ($exercise->feedback_type != EXERCISE_FEEDBACK_TYPE_EXAM) {
+        if ($exercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
             $header .= '<th>'.get_lang('Comment').'</th>';
         } else {
             $header .= '<th>&nbsp;</th>';

+ 2 - 2
main/exercise/ReadingComprehension.php

@@ -11,8 +11,8 @@
  */
 class ReadingComprehension extends UniqueAnswer
 {
-    public static $typePicture = 'reading-comprehension.png';
-    public static $explanationLangVar = 'ReadingComprehension';
+    public $typePicture = 'reading-comprehension.png';
+    public $explanationLangVar = 'ReadingComprehension';
 
     /**
      * Defines the different speeds of scrolling for the reading window,

+ 0 - 34
main/exercise/TestCategory.php

@@ -714,40 +714,6 @@ class TestCategory
         return $tabResult;
     }
 
-    /**
-     * return total score for test exe_id for all question in the category $in_cat_id for user
-     * If no question for this category, return "".
-     */
-    public static function getCatScoreForExeidForUserid($in_cat_id, $in_exe_id, $in_user_id)
-    {
-        $tbl_track_attempt = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
-        $tbl_question_rel_category = Database::get_course_table(TABLE_QUIZ_QUESTION_REL_CATEGORY);
-        $in_cat_id = (int) $in_cat_id;
-        $in_exe_id = (int) $in_exe_id;
-        $in_user_id = (int) $in_user_id;
-
-        $query = "SELECT DISTINCT
-                        marks, 
-                        exe_id, 
-                        user_id, 
-                        ta.question_id, 
-                        category_id
-                  FROM $tbl_track_attempt ta 
-                  INNER JOIN $tbl_question_rel_category qrc
-                  ON (ta.question_id = qrc.question_id)
-                  WHERE
-                    qrc.category_id = $in_cat_id AND
-                    exe_id = $in_exe_id AND 
-                    user_id = $in_user_id";
-        $res = Database::query($query);
-        $score = '';
-        while ($data = Database::fetch_array($res)) {
-            $score += $data['marks'];
-        }
-
-        return $score;
-    }
-
     /**
      * Return the number max of question in a category
      * count the number of questions in all categories, and return the max.

+ 29 - 55
main/exercise/UniqueAnswerImage.php

@@ -10,8 +10,8 @@ use ChamiloSession as Session;
  */
 class UniqueAnswerImage extends UniqueAnswer
 {
-    public static $typePicture = 'uaimg.png';
-    public static $explanationLangVar = 'UniqueAnswerImage';
+    public $typePicture = 'uaimg.png';
+    public $explanationLangVar = 'UniqueAnswerImage';
 
     /**
      * UniqueAnswerImage constructor.
@@ -43,13 +43,18 @@ class UniqueAnswerImage extends UniqueAnswer
         $numberAnswers += (isset($_POST['lessAnswers']) ? -1 : (isset($_POST['moreAnswers']) ? 1 : 0));
 
         $feedbackTitle = '';
-
-        if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
-            //Scenario
-            $commentTitle = '<th>'.get_lang('Comment').'</th>';
-            $feedbackTitle = '<th>'.get_lang('Scenario').'</th>';
-        } else {
-            $commentTitle = '<th >'.get_lang('Comment').'</th>';
+        switch ($objExercise->getFeedbackType()) {
+            case EXERCISE_FEEDBACK_TYPE_DIRECT:
+                // Scenario
+                $commentTitle = '<th width="20%">'.get_lang('Comment').'</th>';
+                $feedbackTitle = '<th width="20%">'.get_lang('Scenario').'</th>';
+                break;
+            case EXERCISE_FEEDBACK_TYPE_POPUP:
+                $commentTitle = '<th width="20%">'.get_lang('Comment').'</th>';
+                break;
+            default:
+                $commentTitle = '<th width="40%">'.get_lang('Comment').'</th>';
+                break;
         }
 
         $html = '<div class="alert alert-success" role="alert">'.
@@ -114,7 +119,6 @@ class UniqueAnswerImage extends UniqueAnswer
         }
 
         $tempScenario = [];
-
         if ($numberAnswers < 1) {
             $numberAnswers = 1;
             echo Display::return_message(get_lang('YouHaveToCreateAtLeastOneAnswer'));
@@ -196,49 +200,17 @@ class UniqueAnswerImage extends UniqueAnswer
 
             $form->addRule('answer['.$i.']', get_lang('ThisFieldIsRequired'), 'required');
 
-            if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
-                $form->addHtmlEditor(
-                    'comment['.$i.']',
-                    null,
-                    null,
-                    false,
-                    $editorConfig
-                );
-                // Direct feedback
-                // Adding extra feedback fields
-                $group = [];
-                $group['try'.$i] = $form->createElement('checkbox', 'try'.$i, null, get_lang('TryAgain'));
-                $group['lp'.$i] = $form->createElement(
-                    'select',
-                    'lp'.$i,
-                    get_lang('SeeTheory').': ',
-                    $selectLpId
-                );
-                $group['destination'.$i] = $form->createElement(
-                    'select',
-                    'destination'.$i,
-                    get_lang('GoToQuestion').': ',
-                    $selectQuestion
-                );
-                $group['url'.$i] = $form->createElement(
-                    'text',
-                    'url'.$i,
-                    get_lang('Other').': ',
-                    [
-                        'class' => 'col-md-2',
-                        'placeholder' => get_lang('Other'),
-                    ]
-                );
-                $form->addGroup($group, 'scenario');
-
-                $renderer->setElementTemplate(
-                    '<td><!-- BEGIN error --><span class="form_error">{error}</span><!-- END error --><br/>{element}',
-                    'scenario'
-                );
-            } else {
-                $form->addHtmlEditor('comment['.$i.']', null, null, false, $editorConfig);
+            switch ($objExercise->getFeedbackType()) {
+                case EXERCISE_FEEDBACK_TYPE_DIRECT:
+                    $this->setDirectOptions($i, $form, $renderer, $selectLpId, $selectQuestion);
+                    break;
+                case EXERCISE_FEEDBACK_TYPE_POPUP:
+                default:
+                    $form->addHtmlEditor('comment['.$i.']', null, null, false, $editorConfig);
+                    break;
             }
-            $form->addText('weighting['.$i.']', null, null, ['class' => "col-md-1", 'value' => '0']);
+
+            $form->addText('weighting['.$i.']', null, null, ['class' => 'col-md-1', 'value' => '0']);
             $form->addHtml('</tr>');
         }
 
@@ -378,9 +350,11 @@ class UniqueAnswerImage extends UniqueAnswer
         if ($exercise->showExpectedChoice()) {
             $header = '<table class="'.$this->question_table_class.'">
 			<tr>
-				<th>'.get_lang('Choice').'</th>
-				<th>'.get_lang('ExpectedChoice').'</th>
-				<th>'.get_lang('Answer').'</th>';
+				<th>'.get_lang('Choice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
+            $header .= '<th>'.get_lang('Answer').'</th>';
             $header .= '<th>'.get_lang('Status').'</th>';
             $header .= '<th>'.get_lang('Comment').'</th>';
             $header .= '</tr>';

+ 1 - 1
main/exercise/admin.php

@@ -453,7 +453,7 @@ if (!$newQuestion && !$modifyQuestion && !$editQuestion && !isset($_GET['hotspot
 
 // if we are in question authoring, display warning to user is feedback not shown at the end of the test -ref #6619
 // this test to display only message in the question authoring page and not in the question list page too
-if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_EXAM) {
+if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_EXAM) {
     echo Display::return_message(get_lang('TestFeedbackNotShown'), 'normal');
 }
 

+ 5 - 3
main/exercise/calculated_answer.class.php

@@ -13,8 +13,8 @@ use Webit\Util\EvalMath\EvalMath;
  */
 class CalculatedAnswer extends Question
 {
-    public static $typePicture = 'calculated_answer.png';
-    public static $explanationLangVar = 'CalculatedAnswer';
+    public $typePicture = 'calculated_answer.png';
+    public $explanationLangVar = 'CalculatedAnswer';
 
     /**
      * Constructor.
@@ -252,7 +252,9 @@ class CalculatedAnswer extends Question
         $header .= '<th>'.get_lang('Answer').'</th>';
         if ($exercise->showExpectedChoice()) {
             $header .= '<th>'.get_lang('YourChoice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
             $header .= '<th>'.get_lang('Status').'</th>';
         }
         $header .= '</tr>';

文件差异内容过多而无法显示
+ 315 - 199
main/exercise/exercise.class.php


+ 5 - 24
main/exercise/exercise.php

@@ -69,15 +69,7 @@ $exercisePath = substr($exercisePath, 0, strpos($exercisePath, $exfile));
 $exercisePath = $exercisePath.'exercise.php';
 
 // Clear the exercise session
-Session::erase('objExercise');
-Session::erase('objQuestion');
-Session::erase('objAnswer');
-Session::erase('questionList');
-Session::erase('exerciseResult');
-Session::erase('firstTime');
-Session::erase('calculatedAnswerId');
-Session::erase('duration_time_previous');
-Session::erase('duration_time');
+Exercise::cleanSessionVariables();
 
 //General POST/GET/SESSION/COOKIES parameters recovery
 $origin = api_get_origin();
@@ -87,15 +79,10 @@ $exerciseId = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : n
 $file = isset($_REQUEST['file']) ? Database::escape_string($_REQUEST['file']) : null;
 $learnpath_id = isset($_REQUEST['learnpath_id']) ? (int) $_REQUEST['learnpath_id'] : null;
 $learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? (int) $_REQUEST['learnpath_item_id'] : null;
-$page = isset($_REQUEST['page']) ? (int) $_REQUEST['page'] : null;
 $categoryId = isset($_REQUEST['category_id']) ? (int) $_REQUEST['category_id'] : 0;
 $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
 $keyword = isset($_REQUEST['keyword']) ? Security::remove_XSS($_REQUEST['keyword']) : '';
 
-if ($page < 0) {
-    $page = 1;
-}
-
 if (api_is_in_gradebook()) {
     $interbreadcrumb[] = [
         'url' => Category::getUrl(),
@@ -527,12 +514,6 @@ if ($origin !== 'learnpath') {
 }
 Display::display_introduction_section(TOOL_QUIZ);
 
-// Selects $limit exercises at the same time
-// maximum number of exercises on a same page
-$limit = 50;
-
-// Display the next and previous link if needed
-$from = $page * $limit;
 HotPotGCt($documentPath, 1, $userId);
 
 $token = Security::get_token();
@@ -630,11 +611,11 @@ if ($is_allowedToEdit) {
 }
 
 if (api_get_configuration_value('allow_exercise_categories') === false) {
-    echo Exercise::exerciseGrid(0, $page, $from, $limit, $keyword);
+    echo Exercise::exerciseGrid(0, $keyword);
 } else {
     if (empty($categoryId)) {
         echo Display::page_subheader(get_lang('NoCategory'));
-        echo Exercise::exerciseGrid(0, $page, $from, $limit, $keyword);
+        echo Exercise::exerciseGrid(0, $keyword);
         $counter = 0;
         $manager = new ExerciseCategoryManager();
         $categories = $manager->getCategories($courseId);
@@ -660,13 +641,13 @@ if (api_get_configuration_value('allow_exercise_categories') === false) {
                 }
             }
             echo Display::page_subheader($category->getName().$up.$down);
-            echo Exercise::exerciseGrid($category->getId(), $page, $from, $limit, $keyword);
+            echo Exercise::exerciseGrid($category->getId(), $keyword);
         }
     } else {
         $manager = new ExerciseCategoryManager();
         $category = $manager->get($categoryId);
         echo Display::page_subheader($category['name']);
-        echo Exercise::exerciseGrid($category['id'], $page, $from, $limit, $keyword);
+        echo Exercise::exerciseGrid($category['id'], $keyword);
     }
 }
 

+ 3 - 4
main/exercise/exercise_admin.php

@@ -185,7 +185,6 @@ if ($form->validate()) {
     Display::display_header($nameTools, get_lang('Exercise'));
 
     echo '<div class="actions">';
-
     if ($objExercise->id != 0) {
         echo '<a href="admin.php?'.api_get_cidreq().'&exerciseId='.$objExercise->id.'">'.
             Display::return_icon('back.png', get_lang('GoBackToQuestionList'), '', ICON_SIZE_MEDIUM).'</a>';
@@ -199,7 +198,7 @@ if ($form->validate()) {
             }
             $lp_id = (int) $lp_id;
             echo "<a href=\"../lp/lp_controller.php?".api_get_cidreq()."&gradebook=&action=add_item&type=step&lp_id=".$lp_id."#resource_tab-2\">".
-                Display::return_icon('back.png', get_lang("BackTo").' '.get_lang("LearningPaths"), '', ICON_SIZE_MEDIUM)."</a>";
+                Display::return_icon('back.png', get_lang("BackTo").' '.get_lang('LearningPaths'), '', ICON_SIZE_MEDIUM)."</a>";
         } else {
             echo '<a href="exercise.php?'.api_get_cidreq().'">'.
                 Display::return_icon('back.png', get_lang('BackToExercisesList'), '', ICON_SIZE_MEDIUM).
@@ -208,11 +207,11 @@ if ($form->validate()) {
     }
     echo '</div>';
 
-    if ($objExercise->feedback_type == 1) {
+    if (in_array($objExercise->getFeedbackType(), [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
         echo Display::return_message(get_lang('DirectFeedbackCantModifyTypeQuestion'));
     }
 
-    if (api_get_setting('search_enabled') == 'true' &&
+    if (api_get_setting('search_enabled') === 'true' &&
         !extension_loaded('xapian')
     ) {
         echo Display::return_message(get_lang('SearchXapianModuleNotInstalled'), 'error');

+ 16 - 44
main/exercise/exercise_reminder.php

@@ -18,43 +18,15 @@ $this_section = SECTION_COURSES;
 api_protect_course_script(true);
 $origin = api_get_origin();
 
-if (empty($learnpath_id)) {
-    if (!empty($_REQUEST['learnpath_id'])) {
-        $learnpath_id = (int) $_REQUEST['learnpath_id'];
-    } else {
-        $learnpath_id = 0;
-    }
-}
-if (empty($learnpath_item_id)) {
-    if (!empty($_REQUEST['learnpath_item_id'])) {
-        $learnpath_item_id = (int) $_REQUEST['learnpath_item_id'];
-    } else {
-        $learnpath_item_id = 0;
-    }
-}
-if (empty($learnpath_item_view_id)) {
-    if (!empty($_REQUEST['learnpath_item_view_id'])) {
-        $learnpath_item_view_id = (int) $_REQUEST['learnpath_item_view_id'];
-    } else {
-        $learnpath_item_view_id = 0;
-    }
-}
-
-if (empty($exerciseId)) {
-    if (!empty($_REQUEST['exerciseId'])) {
-        $exerciseId = (int) $_REQUEST['exerciseId'];
-    } else {
-        $exerciseId = 0;
-    }
-}
-
-if (empty($objExercise)) {
-    $exerciseInSession = Session::read('objExercise');
-    if (!empty($exerciseInSession)) {
-        $objExercise = $exerciseInSession;
-    } else {
-        $objExercise = null;
-    }
+$learnpath_id = isset($_REQUEST['learnpath_id']) ? (int) $_REQUEST['learnpath_id'] : 0;
+$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? (int) $_REQUEST['learnpath_item_id'] : 0;
+$learnpath_item_view_id = isset($_REQUEST['learnpath_item_view_id']) ? (int) $_REQUEST['learnpath_item_view_id'] : 0;
+$exerciseId = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : 0;
+
+$objExercise = null;
+$exerciseInSession = Session::read('objExercise');
+if (!empty($exerciseInSession)) {
+    $objExercise = $exerciseInSession;
 }
 
 if (!$objExercise) {
@@ -131,7 +103,7 @@ if (api_is_course_admin() && !$hideHeaderAndFooter) {
 echo Display::page_header(get_lang('QuestionsToReview'));
 
 if ($time_control) {
-    echo $objExercise->return_time_left_div();
+    echo $objExercise->returnTimeLeftDiv();
 }
 
 echo Display::div('', ['id' => 'message']);
@@ -139,7 +111,7 @@ echo '<script>
     var lp_data = $.param({"learnpath_id": '.$learnpath_id.', "learnpath_item_id" : '.$learnpath_item_id.', "learnpath_item_view_id": '.$learnpath_item_view_id.'});
 
     function final_submit() {
-        //Normal inputs
+        // Normal inputs
         window.location = "'.api_get_path(WEB_CODE_PATH).'exercise/exercise_result.php?'.api_get_cidreq().'&exe_id='.$exe_id.'&" + lp_data;
     }
     
@@ -229,7 +201,6 @@ foreach ($question_list as $questionId) {
     unset($objQuestionTmp);
     // creates a temporary Question object
     $objQuestionTmp = Question:: read($questionId);
-    $quesId = $objQuestionTmp->selectId();
     $check_id = 'remind_list['.$questionId.']';
 
     $attributes = ['id' => $check_id, 'onclick' => "save_remind_item(this, '$questionId');"];
@@ -239,15 +210,16 @@ foreach ($question_list as $questionId) {
 
     $checkbox = Display::input('checkbox', 'remind_list['.$questionId.']', '', $attributes);
 
-    $checkbox = '<div class="pretty p-default">
+    $checkbox = '<div class="pretty p-svg p-curve">
         '.$checkbox.'
         <div class="state p-primary ">
-            <label>&nbsp;</label>
+         <svg class="svg svg-icon" viewBox="0 0 20 20">
+                <path d="M7.629,14.566c0.125,0.125,0.291,0.188,0.456,0.188c0.164,0,0.329-0.062,0.456-0.188l8.219-8.221c0.252-0.252,0.252-0.659,0-0.911c-0.252-0.252-0.659-0.252-0.911,0l-7.764,7.763L4.152,9.267c-0.252-0.251-0.66-0.251-0.911,0c-0.252,0.252-0.252,0.66,0,0.911L7.629,14.566z" style="stroke: white;fill:white;"></path>
+         </svg>
+         <label>&nbsp;</label>
         </div>
     </div>';
 
-    $url = 'exercise_submit.php?exerciseId='.$objExercise->id.'&num='.$counter.'&reminder=1&'.api_get_cidreq();
-
     $counter++;
     $questionTitle = $counter.'. '.strip_tags($objQuestionTmp->selectTitle());
     // Check if the question doesn't have an answer

+ 19 - 33
main/exercise/exercise_report.php

@@ -44,8 +44,6 @@ $_course = api_get_course_info();
 // document path
 $documentPath = api_get_path(SYS_COURSE_PATH).$_course['path']."/document";
 $origin = api_get_origin();
-$path = isset($_GET['path']) ? Security::remove_XSS($_GET['path']) : null;
-
 $is_allowedToEdit = api_is_allowed_to_edit(null, true) ||
     api_is_drh() ||
     api_is_student_boss() ||
@@ -57,7 +55,6 @@ $TBL_TRACK_ATTEMPT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 $TBL_TRACK_ATTEMPT_RECORDING = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING);
 $TBL_LP_ITEM_VIEW = Database::get_course_table(TABLE_LP_ITEM_VIEW);
 $allowCoachFeedbackExercises = api_get_setting('allow_coach_feedback_exercises') === 'true';
-
 $course_id = api_get_course_int_id();
 $exercise_id = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : 0;
 $locked = api_resource_is_locked_by_gradebook($exercise_id, LINK_EXERCISE);
@@ -153,11 +150,9 @@ if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') {
 $objExerciseTmp = new Exercise();
 $exerciseExists = $objExerciseTmp->read($exercise_id);
 
-$courseInfo = api_get_course_info();
-
 //Send student email @todo move this code in a class, library
 if (isset($_REQUEST['comments']) &&
-    $_REQUEST['comments'] == 'update' &&
+    $_REQUEST['comments'] === 'update' &&
     ($is_allowedToEdit || $is_tutor || $allowCoachFeedbackExercises)
 ) {
     // Filtered by post-condition
@@ -167,7 +162,6 @@ if (isset($_REQUEST['comments']) &&
     if (empty($track_exercise_info)) {
         api_not_allowed();
     }
-    $test = $track_exercise_info['title'];
     $student_id = $track_exercise_info['exe_user_id'];
     $session_id = $track_exercise_info['session_id'];
     $lp_id = $track_exercise_info['orig_lp_id'];
@@ -175,10 +169,6 @@ if (isset($_REQUEST['comments']) &&
     $lp_item_view_id = (int) $track_exercise_info['orig_lp_item_view_id'];
     $exerciseId = $track_exercise_info['exe_exo_id'];
     $exeWeighting = $track_exercise_info['exe_weighting'];
-
-    $url = api_get_path(WEB_CODE_PATH).'exercise/result.php?id='.$track_exercise_info['exe_id'].'&'.api_get_cidreq().'&show_headers=1&id_session='.$session_id;
-
-    $my_post_info = [];
     $post_content_id = [];
     $comments_exist = false;
 
@@ -186,14 +176,12 @@ if (isset($_REQUEST['comments']) &&
         $my_post_info = explode('_', $key_index);
         $post_content_id[] = isset($my_post_info[1]) ? $my_post_info[1] : null;
 
-        if ($my_post_info[0] == 'comments') {
+        if ($my_post_info[0] === 'comments') {
             $comments_exist = true;
         }
     }
 
     $loop_in_track = $comments_exist === true ? (count($_POST) / 2) : count($_POST);
-    $array_content_id_exe = [];
-
     if ($comments_exist === true) {
         $array_content_id_exe = array_slice($post_content_id, $loop_in_track);
     } else {
@@ -349,7 +337,6 @@ if ($is_allowedToEdit && $origin != 'learnpath') {
             Display::return_icon('activity_monitor.png', get_lang('LiveResults'), '', ICON_SIZE_MEDIUM).'</a>';
         $actions .= '<a href="stats.php?'.api_get_cidreq().'&exerciseId='.$exercise_id.'">'.
             Display::return_icon('statistics.png', get_lang('ReportByQuestion'), '', ICON_SIZE_MEDIUM).'</a>';
-
         $actions .= '<a id="export_opener" href="'.api_get_self().'?export_report=1&exerciseId='.$exercise_id.'" >'.
         Display::return_icon('save.png', get_lang('Export'), '', ICON_SIZE_MEDIUM).'</a>';
         // clean result before a selected date icon
@@ -397,7 +384,7 @@ if ($is_allowedToEdit && $origin != 'learnpath') {
 
 // Deleting an attempt
 if (($is_allowedToEdit || $is_tutor || api_is_coach()) &&
-    isset($_GET['delete']) && $_GET['delete'] == 'delete' &&
+    isset($_GET['delete']) && $_GET['delete'] === 'delete' &&
     !empty($_GET['did']) && $locked == false
 ) {
     $exe_id = (int) $_GET['did'];
@@ -420,7 +407,7 @@ if (($is_allowedToEdit || $is_tutor || api_is_coach()) &&
 
 if ($is_allowedToEdit || $is_tutor) {
     $interbreadcrumb[] = [
-        'url' => "exercise.php?".api_get_cidreq(),
+        'url' => 'exercise.php?'.api_get_cidreq(),
         'name' => get_lang('Exercises'),
     ];
 
@@ -442,17 +429,17 @@ if ($is_allowedToEdit || $is_tutor) {
 }
 
 if (($is_allowedToEdit || $is_tutor || api_is_coach()) &&
-    isset($_GET['a']) && $_GET['a'] == 'close' &&
+    isset($_GET['a']) && $_GET['a'] === 'close' &&
     !empty($_GET['id']) && $locked == false
 ) {
     // Close the user attempt otherwise left pending
-    $exe_id = intval($_GET['id']);
+    $exe_id = (int) $_GET['id'];
     $sql = "UPDATE $TBL_TRACK_EXERCISES SET status = '' 
             WHERE exe_id = $exe_id AND status = 'incomplete'";
     Database::query($sql);
 }
 
-Display :: display_header($nameTools);
+Display::display_header($nameTools);
 
 // Clean all results for this test before the selected date
 if (($is_allowedToEdit || $is_tutor || api_is_coach()) &&
@@ -512,7 +499,7 @@ $extra = '<script>
     });
     </script>';
 
-$extra .= '<div id="dialog-confirm" title="'.get_lang("ConfirmYourChoice").'">';
+$extra .= '<div id="dialog-confirm" title="'.get_lang('ConfirmYourChoice').'">';
 $form = new FormValidator(
     'report',
     'post',
@@ -641,7 +628,7 @@ if ($is_allowedToEdit || $is_tutor) {
         ['name' => 'actions', 'index' => 'actions', 'width' => '60', 'align' => 'left', 'search' => 'false', 'sortable' => 'false'],
     ];
 
-    if ($officialCodeInList == 'true') {
+    if ($officialCodeInList === 'true') {
         $officialCodeRow = ['name' => 'official_code', 'index' => 'official_code', 'width' => '50', 'align' => 'left', 'search' => 'true'];
         $column_model = array_merge([$officialCodeRow], $column_model);
     }
@@ -650,7 +637,7 @@ if ($is_allowedToEdit || $is_tutor) {
     // add username as title in lastname filed - ref 4226
     function action_formatter(cellvalue, options, rowObject) {
         // rowObject is firstname,lastname,login,... get the third word
-        var loginx = "'.api_htmlentities(sprintf(get_lang("LoginX"), ":::"), ENT_QUOTES).'";
+        var loginx = "'.api_htmlentities(sprintf(get_lang('LoginX'), ':::'), ENT_QUOTES).'";
         var tabLoginx = loginx.split(/:::/);
         // tabLoginx[0] is before and tabLoginx[1] is after :::
         // may be empty string but is defined
@@ -672,7 +659,6 @@ $extra_params['gridComplete'] = "
 ";
 
 $extra_params['beforeRequest'] = "
-//console.log('beforeRequest');
 var defaultGroupId = $('#gs_group_name').val();
 
 // Load from group menu
@@ -681,15 +667,17 @@ if (typeof defaultGroupId !== 'undefined') {
 } else {
     // get from cookies
     defaultGroupId = Cookies.get('default_group_".$exercise_id."');
-    $('#gs_group_name').val(defaultGroupId);
-    //console.log('from cookies');
+    $('#gs_group_name').val(defaultGroupId);    
 }
  
 if (typeof defaultGroupId !== 'undefined') {
     var posted_data = $(\"#results\").jqGrid('getGridParam', 'postData');
-    var defFilter = '{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"group_id\",\"op\":\"eq\",\"data\":\"'+ defaultGroupId +'\"}]}';
-    posted_data.filters = defFilter;
-    //console.log(posted_data);
+    var extraFilter = ',{\"field\":\"group_id\",\"op\":\"eq\",\"data\":\"'+ defaultGroupId +'\"}]}';        
+    // var defFilter = '{\"groupOp\":\"AND\",\"rules\": [{\"field\":\"group_id\",\"op\":\"eq\",\"data\":\"'+ defaultGroupId +'\"}] }';
+    // posted_data.filters = defFilter;    
+    var filters = posted_data.filters;        
+    var stringObj = new String(filters);    
+    stringObj.replace(']}', extraFilter);         
     $(this).jqGrid('setGridParam', 'postData', posted_data);          
 }
 ";
@@ -715,7 +703,8 @@ $gridJs = Display::grid_js(
         var ii = 0;
         for (var i in data) {
             colNames[ii++] = i;
-        }    // capture col names
+        }
+        // capture col names
         var html = "";
         for (i = 0; i < mya.length; i++) {
             data = $("#results").getRowData(mya[i]); // get each row
@@ -758,8 +747,6 @@ $gridJs = Display::grid_js(
 
             // Update group
             var defaultGroupId = Cookies.get('default_group_<?php echo $exercise_id; ?>');
-            //console.log('cookie GET defaultGroupId ' + defaultGroupId );
-
             $('#gs_group_name').val(defaultGroupId);
             // Adding search options
             var options = {
@@ -776,7 +763,6 @@ $gridJs = Display::grid_js(
                     });
                 }
             }
-
             jQuery("#results").jqGrid('filterToolbar', options);
             sgrid.triggerToolbar();
             $('#results').on('click', 'a.exercise-recalculate', function (e) {

+ 23 - 39
main/exercise/exercise_result.php

@@ -36,9 +36,6 @@ $origin = api_get_origin();
 if (empty($objExercise)) {
     $objExercise = Session::read('objExercise');
 }
-if (empty($remind_list)) {
-    $remind_list = isset($_REQUEST['remind_list']) ? $_REQUEST['remind_list'] : null;
-}
 
 $exe_id = isset($_REQUEST['exe_id']) ? (int) $_REQUEST['exe_id'] : 0;
 
@@ -78,6 +75,13 @@ if (api_get_configuration_value('quiz_prevent_copy_paste')) {
     $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'jquery.nocopypaste.js"></script>';
 }
 
+if (!empty($objExercise->getResultAccess())) {
+    $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/epiclock/renderers/minute/epiclock.minute.css');
+    $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js');
+    $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.epiclock.min.js');
+    $htmlHeadXtra[] = api_get_js('epiclock/renderers/minute/epiclock.minute.js');
+}
+
 if (!in_array($origin, ['learnpath', 'embeddable'])) {
     // So we are not in learnpath tool
     Display::display_header($nameTools, get_lang('Exercise'));
@@ -99,19 +103,12 @@ if (api_is_course_admin() && !in_array($origin, ['learnpath', 'embeddable'])) {
         Display::return_icon('edit.png', get_lang('ModifyExercise'), [], 32).'</a>';
     echo '</div>';
 }
-
-$feedback_type = $objExercise->feedback_type;
 $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id);
-
-if (!empty($exercise_stat_info['data_tracking'])) {
-    $question_list = explode(',', $exercise_stat_info['data_tracking']);
-}
-
 $learnpath_id = isset($exercise_stat_info['orig_lp_id']) ? $exercise_stat_info['orig_lp_id'] : 0;
 $learnpath_item_id = isset($exercise_stat_info['orig_lp_item_id']) ? $exercise_stat_info['orig_lp_item_id'] : 0;
 $learnpath_item_view_id = isset($exercise_stat_info['orig_lp_item_view_id']) ? $exercise_stat_info['orig_lp_item_view_id'] : 0;
 
-if ($origin == 'learnpath') {
+if ($origin === 'learnpath') {
     ?>
     <form method="GET" action="exercise.php?<?php echo api_get_cidreq(); ?>">
     <input type="hidden" name="origin" value="<?php echo $origin; ?>" />
@@ -122,7 +119,6 @@ if ($origin == 'learnpath') {
 }
 
 $i = $total_score = $max_score = 0;
-
 $remainingMessage = '';
 $attemptButton = '';
 
@@ -163,10 +159,9 @@ if ($objExercise->selectAttempts() > 0) {
     } else {
         $attempt_count++;
         $remainingAttempts = $objExercise->selectAttempts() - $attempt_count;
-
         if ($remainingAttempts) {
             $attemptMessage = sprintf(get_lang('RemainingXAttempts'), $remainingAttempts);
-            $remainingMessage = sprintf("<p>%s</p> %s", $attemptMessage, $attemptButton);
+            $remainingMessage = sprintf('<p>%s</p> %s', $attemptMessage, $attemptButton);
         }
     }
 } else {
@@ -180,19 +175,23 @@ if (!empty($exercise_stat_info)) {
 
 $max_score = $objExercise->get_max_score();
 
-if ($origin !== 'embeddable') {
+if ($origin === 'embeddable') {
+    showEmbeddableFinishButton();
+} else {
     echo Display::return_message(get_lang('Saved').'<br />', 'normal', false);
 }
 
-if ($origin == 'embeddable') {
-    showEmbeddableFinishButton();
+$saveResults = true;
+$feedbackType = $objExercise->getFeedbackType();
+if (!in_array($feedbackType, [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
+    //$saveResults = false;
 }
 
 // Display and save questions
 ExerciseLib::displayQuestionListByAttempt(
     $objExercise,
     $exe_id,
-    true,
+    $saveResults,
     $remainingMessage
 );
 
@@ -215,45 +214,30 @@ if (!in_array($origin, ['learnpath', 'embeddable'])) {
     echo '</div>';
 
     if (api_is_allowed_to_session_edit()) {
-        Session::erase('objExercise');
-        Session::erase('exe_id');
-        Session::erase('calculatedAnswerId');
-        Session::erase('duration_time_previous');
-        Session::erase('duration_time');
+        Exercise::cleanSessionVariables();
     }
     Display::display_footer();
-} elseif ($origin == 'embeddable') {
+} elseif ($origin === 'embeddable') {
     if (api_is_allowed_to_session_edit()) {
-        Session::erase('objExercise');
-        Session::erase('exe_id');
-        Session::erase('calculatedAnswerId');
-        Session::erase('duration_time_previous');
-        Session::erase('duration_time');
+        Exercise::cleanSessionVariables();
     }
 
     Session::write('attempt_remaining', $remainingMessage);
-
     showEmbeddableFinishButton();
-
     Display::display_reduced_footer();
 } else {
     $lp_mode = Session::read('lp_mode');
-    $url = '../lp/lp_controller.php?'.api_get_cidreq().'&action=view&lp_id='.$learnpath_id.'&lp_item_id='.$learnpath_item_id.'&exeId='.$exercise_stat_info['exe_id'].'&fb_type='.$objExercise->feedback_type.'#atoc_'.$learnpath_item_id;
-    $href = $lp_mode == 'fullscreen' ? ' window.opener.location.href="'.$url.'" ' : ' top.location.href="'.$url.'"';
+    $url = '../lp/lp_controller.php?'.api_get_cidreq().'&action=view&lp_id='.$learnpath_id.'&lp_item_id='.$learnpath_item_id.'&exeId='.$exercise_stat_info['exe_id'].'&fb_type='.$objExercise->getFeedbackType().'#atoc_'.$learnpath_item_id;
+    $href = $lp_mode === 'fullscreen' ? ' window.opener.location.href="'.$url.'" ' : ' top.location.href="'.$url.'"';
 
     if (api_is_allowed_to_session_edit()) {
-        Session::erase('objExercise');
-        Session::erase('exe_id');
-        Session::erase('calculatedAnswerId');
-        Session::erase('duration_time_previous');
-        Session::erase('duration_time');
+        Exercise::cleanSessionVariables();
     }
     Session::write('attempt_remaining', $remainingMessage);
 
     // Record the results in the learning path, using the SCORM interface (API)
     echo "<script>window.parent.API.void_save_asset('$total_score', '$max_score', 0, 'completed');</script>";
     echo '<script type="text/javascript">'.$href.'</script>';
-
     Display::display_reduced_footer();
 }
 

+ 12 - 181
main/exercise/exercise_show.php

@@ -16,7 +16,7 @@ use ChamiloSession as Session;
  * @todo small letters for table variables
  */
 require_once __DIR__.'/../inc/global.inc.php';
-$debug = false;
+
 $origin = api_get_origin();
 $currentUserId = api_get_user_id();
 $printHeaders = $origin === 'learnpath';
@@ -67,7 +67,7 @@ if (empty($exerciseResult)) {
 if (empty($choiceDegreeCertainty)) {
     $choiceDegreeCertainty = isset($_REQUEST['choiceDegreeCertainty']) ? $_REQUEST['choiceDegreeCertainty'] : null;
 }
-$questionId = isset($_REQUEST['questionId']) ? $_REQUEST['questionId'] : null;
+$questionId = isset($_REQUEST['questionId']) ? (int) $_REQUEST['questionId'] : null;
 
 if (empty($choice)) {
     $choice = isset($_REQUEST['choice']) ? $_REQUEST['choice'] : null;
@@ -127,7 +127,7 @@ if (empty($objExercise)) {
     $objExercise = new Exercise();
     $objExercise->read($exercise_id);
 }
-$feedback_type = $objExercise->feedback_type;
+$feedback_type = $objExercise->getFeedbackType();
 
 // Only users can see their own results
 if (!$is_allowedToEdit) {
@@ -309,29 +309,24 @@ if ($show_results || $show_only_total_score || $showTotalScoreAndUserChoicesInLa
 }
 
 $i = $totalScore = $totalWeighting = 0;
-if ($debug > 0) {
-    error_log("ExerciseResult: ".print_r($exerciseResult, 1));
-    error_log("QuestionList: ".print_r($questionList, 1));
-}
-
 $arrques = [];
 $arrans = [];
-$user_restriction = $is_allowedToEdit ? '' : "AND user_id=".intval($student_id)." ";
+$user_restriction = $is_allowedToEdit ? '' : " AND user_id= $student_id ";
 $sql = "SELECT attempts.question_id, answer
         FROM $TBL_TRACK_ATTEMPT as attempts
-        INNER JOIN ".$TBL_TRACK_EXERCISES." AS stats_exercises
-        ON stats_exercises.exe_id=attempts.exe_id
+        INNER JOIN $TBL_TRACK_EXERCISES AS stats_exercises
+        ON stats_exercises.exe_id = attempts.exe_id
         INNER JOIN $TBL_EXERCISE_QUESTION AS quizz_rel_questions
         ON
             quizz_rel_questions.exercice_id=stats_exercises.exe_exo_id AND
             quizz_rel_questions.question_id = attempts.question_id AND
             quizz_rel_questions.c_id=".api_get_course_int_id()."
-        INNER JOIN ".$TBL_QUESTIONS." AS questions
+        INNER JOIN $TBL_QUESTIONS AS questions
         ON
             questions.id = quizz_rel_questions.question_id AND
             questions.c_id = ".api_get_course_int_id()."
         WHERE
-            attempts.exe_id = ".$id." $user_restriction
+            attempts.exe_id = $id $user_restriction
 		GROUP BY quizz_rel_questions.question_order, attempts.question_id";
 $result = Database::query($sql);
 $question_list_from_database = [];
@@ -358,7 +353,7 @@ if (!empty($track_exercise_info['data_tracking'])) {
 }
 
 // Display the text when finished message if we are on a LP #4227
-$end_of_message = $objExercise->selectTextWhenFinished();
+$end_of_message = $objExercise->getTextWhenFinished();
 if (!empty($end_of_message) && ($origin === 'learnpath')) {
     echo Display::return_message($end_of_message, 'normal', false);
     echo "<div class='clear'>&nbsp;</div>";
@@ -529,154 +524,8 @@ foreach ($questionList as $questionId) {
             $questionScore = $question_result['score'];
             $totalScore += $question_result['score'];
 
-            $final_overlap = $question_result['extra']['final_overlap'];
-            $final_missing = $question_result['extra']['final_missing'];
-            $final_excess = $question_result['extra']['final_excess'];
-
-            $overlap_color = $question_result['extra']['overlap_color'];
-            $missing_color = $question_result['extra']['missing_color'];
-            $excess_color = $question_result['extra']['excess_color'];
-
-            $threadhold1 = $question_result['extra']['threadhold1'];
-            $threadhold2 = $question_result['extra']['threadhold2'];
-            $threadhold3 = $question_result['extra']['threadhold3'];
-
-            if ($show_results) {
-                if ($overlap_color) {
-                    $overlap_color = 'green';
-                } else {
-                    $overlap_color = 'red';
-                }
-
-                if ($missing_color) {
-                    $missing_color = 'green';
-                } else {
-                    $missing_color = 'red';
-                }
-                if ($excess_color) {
-                    $excess_color = 'green';
-                } else {
-                    $excess_color = 'red';
-                }
-
-                if (!is_numeric($final_overlap)) {
-                    $final_overlap = 0;
-                }
-
-                if (!is_numeric($final_missing)) {
-                    $final_missing = 0;
-                }
-                if (!is_numeric($final_excess)) {
-                    $final_excess = 0;
-                }
-
-                if ($final_excess > 100) {
-                    $final_excess = 100;
-                }
-
-                $table_resume = '
-                    <table class="data_table">
-                        <tr class="row_odd" >
-                            <td>&nbsp;</td>
-                            <td><b>'.get_lang('Requirements').'</b></td>
-                            <td><b>'.get_lang('YourAnswer').'</b></td>
-                        </tr>
-                        <tr class="row_even">
-                            <td><b>'.get_lang('Overlap').'</b></td>
-                            <td>'.get_lang('Min').' '.$threadhold1.'</td>
-                            <td>
-                                <div style="color:'.$overlap_color.'">
-                                    '.(($final_overlap < 0) ? 0 : intval($final_overlap)).'
-                                </div>
-                            </td>
-                        </tr>
-                        <tr>
-                            <td><b>'.get_lang('Excess').'</b></td>
-                            <td>'.get_lang('Max').' '.$threadhold2.'</td>
-                            <td>
-                                <div style="color:'.$excess_color.'">
-                                    '.(($final_excess < 0) ? 0 : intval($final_excess)).'
-                                </div>
-                            </td>
-                        </tr>
-                        <tr class="row_even">
-                            <td><b>'.get_lang('Missing').'</b></td>
-                            <td>'.get_lang('Max').' '.$threadhold3.'</td>
-                            <td>
-                                <div style="color:'.$missing_color.'">
-                                    '.(($final_missing < 0) ? 0 : intval($final_missing)).'
-                                </div>
-                            </td>
-                        </tr>
-                    </table>
-                ';
-
-                if ($answerType != HOT_SPOT_DELINEATION) {
-                    $item_list = explode('@@', $destination);
-
-                    $try = $item_list[0];
-                    $lp = $item_list[1];
-                    $destinationid = $item_list[2];
-                    $url = $item_list[3];
-                    $table_resume = '';
-                } else {
-                    if ($next == 0) {
-                        $try = $try_hotspot;
-                        $lp = $lp_hotspot;
-                        $destinationid = $select_question_hotspot;
-                        $url = $url_hotspot;
-                    } else {
-                        //show if no error
-                        $comment = $answerComment = $objAnswerTmp->selectComment($nbrAnswers);
-                        $answerDestination = $objAnswerTmp->selectDestination($nbrAnswers);
-                    }
-                }
-
-                echo '<h1><div style="color:#333;">'.get_lang('Feedback').'</div></h1>';
-                if ($answerType == HOT_SPOT_DELINEATION) {
-                    if ($organs_at_risk_hit > 0) {
-                        $message = '<br />'.get_lang('ResultIs').' <b>'.$result_comment.'</b><br />';
-                        $message .= '<p style="color:#DC0A0A;"><b>'.get_lang('OARHit').'</b></p>';
-                    } else {
-                        $message = '<p>'.get_lang('YourDelineation').'</p>';
-                        $message .= $table_resume;
-                        $message .= '<br />'.get_lang('ResultIs').' <b>'.$result_comment.'</b><br />';
-                    }
-                    $message .= '<p>'.$comment.'</p>';
-                    echo $message;
-                } else {
-                    echo '<p>'.$comment.'</p>';
-                }
-
-                //showing the score
-                $queryfree = "SELECT marks from ".$TBL_TRACK_ATTEMPT." 
-                              WHERE exe_id = ".intval($id)." AND question_id= ".intval($questionId);
-                $resfree = Database::query($queryfree);
-                $questionScore = Database::result($resfree, 0, "marks");
-                $totalScore += $questionScore;
-                $relPath = api_get_path(REL_PATH);
-                echo '</table></td></tr>';
-                echo "
-                        <tr>
-                            <td colspan=\"2\">
-                                <div id=\"hotspot-solution\"></div>
-                                <script>
-                                    $(function() {
-                                        new HotspotQuestion({
-                                            questionId: $questionId,
-                                            exerciseId: {$objExercise->id},
-                                            exeId: $id,
-                                            selector: '#hotspot-solution',
-                                            for: 'solution',
-                                            relPath: '$relPath'
-                                        });
-                                    });
-                                </script>
-                            </td>
-                        </tr>
-                    </table>
-                ";
-            }
+            //$organs_at_risk_hit
+            echo $objExercise->getDelineationResult($objQuestionTmp, $questionId, $show_results, $question_result);
             break;
         case ANNOTATION:
             $question_result = $objExercise->manage_answer(
@@ -738,7 +587,7 @@ foreach ($questionList as $questionId) {
                 $url_name = get_lang('EditCommentsAndMarks');
             } else {
                 $url_name = get_lang('AddComments');
-                if ($action == 'edit') {
+                if ($action === 'edit') {
                     $url_name = get_lang('EditIndividualComment');
                 }
             }
@@ -842,24 +691,6 @@ foreach ($questionList as $questionId) {
                 }
 
                 $formMark->display();
-
-                /*echo '<form name="smarksform_'.$questionId.'" method="post" action="">';
-                echo get_lang('AssignMarks');
-                echo "&nbsp;<select name='marks' id='select_marks_".$questionId."' class='selectpicker exercise_mark_select'>";
-
-                if (empty($model)) {
-                    for ($i = 0; $i <= $questionWeighting; $i++) {
-                        echo '<option value="'.$i.'" '.(($i == $questionScore) ? "selected='selected'" : '').'>'.$i.'</option>';
-                    }
-                } else {
-                    foreach ($model['score_list'] as $item) {
-                        $i = api_number_format($item['score_to_qualify'] / 100 * $questionWeighting, 2);
-                        $model = ExerciseLib::getModelStyle($item, $i);
-                        echo '<option class = "'.$item['css_class'].'" value="'.$i.'" '.(($i == $questionScore) ? "selected='selected'" : '').'>'.$model.'</option>';
-                    }
-                }
-                echo '</select>';
-                echo '</form><br /></div>';*/
                 echo '</div>';
                 if ($questionScore == -1) {
                     $questionScore = 0;

+ 70 - 50
main/exercise/exercise_submit.php

@@ -98,8 +98,6 @@ $choice = empty($choice) ? isset($_REQUEST['choice2']) ? $_REQUEST['choice2'] :
 // From submit modal
 $current_question = isset($_REQUEST['num']) ? (int) $_REQUEST['num'] : null;
 $currentAnswer = isset($_REQUEST['num_answer']) ? (int) $_REQUEST['num_answer'] : null;
-$endExercise = isset($_REQUEST['end_exercise']) && $_REQUEST['end_exercise'] == 1 ? true : false;
-
 $logInfo = [
     'tool' => TOOL_QUIZ,
     'tool_id' => $exerciseId,
@@ -109,7 +107,6 @@ $logInfo = [
 ];
 Event::registerLog($logInfo);
 
-// Error message
 $error = '';
 $exercise_attempt_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT);
 
@@ -154,6 +151,7 @@ if (!isset($exerciseInSession) || isset($exerciseInSession) && ($exerciseInSessi
     Session::write('firstTime', false);
 }
 //2. Checking if $objExercise is set
+/** @var |Exercise $objExercise */
 if (!isset($objExercise) && isset($exerciseInSession)) {
     if ($debug) {
         error_log('2. Loading $objExercise from session');
@@ -576,10 +574,6 @@ if ($time_control) {
     } else {
         $clock_expired_time = $_SESSION['expired_time'][$current_expired_time_key];
     }
-} else {
-    if ($debug) {
-        error_log("7 No time control");
-    }
 }
 
 // Get time left for expiring time
@@ -667,7 +661,7 @@ if ($formSent && isset($_POST)) {
                 // stores the user answer into the array
                 $exerciseResult[$key] = $choice[$key];
                 //saving each question
-                if ($objExercise->feedback_type != EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                if (!in_array($objExercise->getFeedbackType(), [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
                     $nro_question = $current_question; // - 1;
                     $questionId = $key;
                     // gets the student choice for this question
@@ -756,10 +750,6 @@ if ($formSent && isset($_POST)) {
     if ($debug) {
         error_log('11. $formSent was set - end');
     }
-} else {
-    if ($debug) {
-        error_log('9. $formSent was NOT sent');
-    }
 }
 
 // If questionNum comes from POST and not from GET
@@ -846,7 +836,7 @@ if ($question_count != 0) {
     $error = get_lang('ThereAreNoQuestionsForThisExercise');
     // if we are in the case where user select random by category, but didn't choose the number of random question
     if ($objExercise->getRandomByCategory() > 0 && $objExercise->random <= 0) {
-        $error .= "<br/>".get_lang('PleaseSelectSomeRandomQuestion');
+        $error .= '<br/>'.get_lang('PleaseSelectSomeRandomQuestion');
     }
 }
 
@@ -858,10 +848,10 @@ if (api_is_in_gradebook()) {
 }
 
 $interbreadcrumb[] = [
-    "url" => "exercise.php?".api_get_cidreq(),
-    "name" => get_lang('Exercises'),
+    'url' => 'exercise.php?'.api_get_cidreq(),
+    'name' => get_lang('Exercises'),
 ];
-$interbreadcrumb[] = ["url" => "#", "name" => $objExercise->selectTitle(true)];
+$interbreadcrumb[] = ['url' => '#', 'name' => $objExercise->selectTitle(true)];
 
 if (!in_array($origin, ['learnpath', 'embeddable'])) { //so we are not in learnpath tool
     if (!api_is_allowed_to_session_edit()) {
@@ -977,7 +967,7 @@ if (isset($_custom['exercises_hidden_when_no_start_date']) &&
 
 // Timer control
 if ($time_control) {
-    echo $objExercise->return_time_left_div();
+    echo $objExercise->returnTimeLeftDiv();
     echo '<div style="display:none" class="warning-message" id="expired-message-id">'.
         get_lang('ExerciseExpiredTimeMessage').'</div>';
 }
@@ -1133,6 +1123,16 @@ if (!empty($error)) {
             $(".block_on_enter").keypress(function(event) {
                 return event.keyCode != 13;
             });
+            
+            $(".checkCalculatedQuestionOnEnter").keypress(function(event) {
+                if (event.keyCode === 13) {
+                    event.preventDefault();
+                    var id = $(this).attr("id");
+                    var parts = id.split("_");
+                    var buttonId = "button_" + parts[1];
+                    document.getElementById(buttonId).click();                    
+                }
+            });
 
             $(".main_question").mouseover(function() {
                 //$(this).find(".exercise_save_now_button").show();
@@ -1222,8 +1222,7 @@ if (!empty($error)) {
                 url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'&reminder=2";
             } else {
                 url = "exercise_submit.php?'.$params.'&num='.$current_question.'&remind_question_id='.$remind_question_id.'";
-            }
-            //$("#save_for_now_"+question_id).html(\''.Display::return_icon('save.png', get_lang('Saved'), [], ICON_SIZE_SMALL).'\');
+            }            
             window.location = url;
         }
         
@@ -1233,19 +1232,19 @@ if (!empty($error)) {
         }
 
         function save_now(question_id, url_extra, validate) {
-            //1. Normal choice inputs
+            // 1. Normal choice inputs
             var my_choice = $(\'*[name*="choice[\'+question_id+\']"]\').serialize();
-
-            //2. Reminder checkbox
+            
+            // 2. Reminder checkbox
             var remind_list = $(\'*[name*="remind_list"]\').serialize();
 
-            //3. Hotspots
+            // 3. Hotspots
             var hotspot = $(\'*[name*="hotspot[\'+question_id+\']"]\').serialize();
             
-            //4. choice for degree of certainty
+            // 4. choice for degree of certainty
             var my_choiceDc = $(\'*[name*="choiceDegreeCertainty[\'+question_id+\']"]\').serialize();
 
-            // Checking FCK
+            // Checking CkEditor
             if (question_id) {
                 if (CKEDITOR.instances["choice["+question_id+"]"]) {
                     var ckContent = CKEDITOR.instances["choice["+question_id+"]"].getData();
@@ -1322,7 +1321,7 @@ if (!empty($error)) {
             var question_list = ['.implode(',', $questionList).'];
             var free_answers = {};
             $.each(question_list, function(index, my_question_id) {
-                // Checking FCK
+                // Checking Ckeditor
                 if (my_question_id) {
                     if (CKEDITOR.instances["choice["+my_question_id+"]"]) {
                         var ckContent = CKEDITOR.instances["choice["+my_question_id+"]"].getData();
@@ -1395,7 +1394,7 @@ if (!empty($error)) {
                 $i++;
                 continue;
             } else {
-                if ($objExercise->feedback_type != EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                if (!in_array($objExercise->getFeedbackType(), [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
                     // if the user has already answered this question
                     if (isset($exerciseResult[$questionId])) {
                         // construction of the Question object
@@ -1414,11 +1413,23 @@ if (!empty($error)) {
         $user_choice = null;
         if (isset($attempt_list[$questionId])) {
             $user_choice = $attempt_list[$questionId];
-        } elseif ($objExercise->saveCorrectAnswers) {
-            $correctAnswers = $objExercise->getCorrectAnswersInAllAttempts(
-                $learnpath_id,
-                $learnpath_item_id
-            );
+        } elseif ($objExercise->getSaveCorrectAnswers()) {
+            $correctAnswers = [];
+            switch ($objExercise->getSaveCorrectAnswers()) {
+                case 1:
+                    $correctAnswers = $objExercise->getCorrectAnswersInAllAttempts(
+                        $learnpath_id,
+                        $learnpath_item_id
+                    );
+                    break;
+                case 2:
+                    $correctAnswers = $objExercise->getAnswersInAllAttempts(
+                        $learnpath_id,
+                        $learnpath_item_id,
+                        false
+                    );
+                    break;
+            }
 
             if (isset($correctAnswers[$questionId])) {
                 $user_choice = $correctAnswers[$questionId];
@@ -1426,8 +1437,7 @@ if (!empty($error)) {
         }
 
         $remind_highlight = '';
-
-        //Hides questions when reviewing a ALL_ON_ONE_PAGE exercise see #4542 no_remind_highlight class hide with jquery
+        // Hides questions when reviewing a ALL_ON_ONE_PAGE exercise see #4542 no_remind_highlight class hide with jquery
         if ($objExercise->type == ALL_ON_ONE_PAGE &&
             isset($_GET['reminder']) && $_GET['reminder'] == 2
         ) {
@@ -1463,21 +1473,33 @@ if (!empty($error)) {
 
         echo '<div id="question_div_'.$questionId.'" class="main-question '.$remind_highlight.'" >';
 
+        $showQuestion = true;
+        $exerciseResultFromSession = Session::read('exerciseResult');
+        if ($objExercise->getFeedbackType() === EXERCISE_FEEDBACK_TYPE_POPUP &&
+            isset($exerciseResultFromSession[$questionId])
+        ) {
+            $showQuestion = false;
+        }
+
         // Shows the question and its answers
-        ExerciseLib::showQuestion(
-            $objExercise,
-            $questionId,
-            false,
-            $origin,
-            $i,
-            $objExercise->getHideQuestionTitle() ? false : true,
-            false,
-            $user_choice,
-            false,
-            null,
-            false,
-            true
-        );
+        if ($showQuestion) {
+            ExerciseLib::showQuestion(
+                $objExercise,
+                $questionId,
+                false,
+                $origin,
+                $i,
+                $objExercise->getHideQuestionTitle() ? false : true,
+                false,
+                $user_choice,
+                false,
+                null,
+                false,
+                true
+            );
+        } else {
+            echo Display::return_message(get_lang('AlreadyAnswered'));
+        }
 
         // Button save and continue
         switch ($objExercise->type) {
@@ -1549,10 +1571,8 @@ if (!empty($error)) {
     }
     echo '</form>';
 }
-
 if (!in_array($origin, ['learnpath', 'embeddable'])) {
     // So we are not in learnpath tool
     echo '</div>'; //End glossary div
 }
-
 Display::display_footer();

+ 216 - 455
main/exercise/exercise_submit_modal.php

@@ -10,122 +10,163 @@ use ChamiloSession as Session;
  */
 require_once __DIR__.'/../inc/global.inc.php';
 
-api_protect_course_script(false);
+api_protect_course_script();
 
 require_once api_get_path(LIBRARY_PATH).'geometry.lib.php';
 
-$message = null;
-$dbg_local = 0;
-$gradebook = null;
-$final_overlap = null;
-$final_missing = null;
-$final_excess = null;
-$threadhold1 = null;
-$threadhold2 = null;
-$threadhold3 = null;
-
+/** @var Exercise $objExercise */
+$objExercise = Session::read('objExercise');
 $exerciseResult = Session::read('exerciseResult');
-$exerciseResultCoordinates = isset($_REQUEST['exerciseResultCoordinates']) ? $_REQUEST['exerciseResultCoordinates'] : null;
-$origin = api_get_origin();
 
-// if origin is learnpath
-$learnpath_id = 0;
-if (isset($_REQUEST['learnpath_id'])) {
-    $learnpath_id = intval($_REQUEST['learnpath_id']);
+if (empty($objExercise)) {
+    api_not_allowed();
 }
 
-$learnpath_item_id = 0;
-if (isset($_REQUEST['learnpath_item_id'])) {
-    $learnpath_item_id = intval($_REQUEST['learnpath_item_id']);
+$feedbackType = $objExercise->getFeedbackType();
+$exerciseType = $objExercise->type;
+if (!in_array($feedbackType, [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
+    api_not_allowed();
 }
 
-$_SESSION['hotspot_coord'] = [];
-$newquestionList = Session::read('newquestionList', []);
+$learnpath_id = isset($_REQUEST['learnpath_id']) ? (int) $_REQUEST['learnpath_id'] : 0;
+$learnpath_item_id = isset($_REQUEST['learnpath_item_id']) ? (int) $_REQUEST['learnpath_item_id'] : 0;
 $questionList = Session::read('questionList');
-$exerciseId = intval($_GET['exerciseId']);
-$exerciseType = intval($_GET['exerciseType']);
-$questionNum = intval($_GET['num']);
-$nbrQuestions = isset($_GET['nbrQuestions']) ? intval($_GET['nbrQuestions']) : null;
-
-//clean extra session variables
-Session::erase('objExerciseExtra'.$exerciseId);
-Session::erase('exerciseResultExtra'.$exerciseId);
-Session::erase('questionListExtra'.$exerciseId);
-
-// Round-up the coordinates
-$user_array = '';
-if (isset($_GET['hotspot'])) {
-    $coords = explode('/', $_GET['hotspot']);
-    if (is_array($coords) && count($coords) > 0) {
-        foreach ($coords as $coord) {
-            if (!empty($coord)) {
-                list($x, $y) = explode(';', $coord);
-                $user_array .= round($x).';'.round($y).'/';
-            }
-        }
+
+$exerciseId = (int) $_GET['exerciseId'];
+$questionNum = (int) $_GET['num'];
+$questionId = $questionList[$questionNum];
+$choiceValue = isset($_GET['choice']) ? $_GET['choice'] : '';
+$hotSpot = isset($_GET['hotspot']) ? $_GET['hotspot'] : '';
+$loaded = isset($_GET['loaded']);
+
+if (empty($choiceValue) && isset($exerciseResult[$questionId])) {
+    $choiceValue = $exerciseResult[$questionId];
+}
+
+if (!empty($hotSpot)) {
+    if (isset($hotSpot[$questionId])) {
+        $hotSpot = $hotSpot[$questionId];
     }
 }
 
-$user_array = substr($user_array, 0, -1);
-$choice_value = '';
-if (isset($_GET['choice'])) {
-    $choice_value = (int) $_GET['choice'];
+if (!empty($choiceValue)) {
+    if (isset($choiceValue[$questionId])) {
+        $choiceValue = $choiceValue[$questionId];
+    }
 }
 
-echo '<div id="delineation-container">';
+echo '<script>
+function tryAgain() {
+    $(function () {
+        $("#global-modal").modal("hide");
+    });
+}
+
+function SendEx(num) {
+    if (num == -1) {
+        window.location.href = "exercise_result.php?'.api_get_cidreq().'&take_session=1&exerciseId='.$exerciseId.'&num="+num+"&learnpath_item_id='.$learnpath_item_id.'&learnpath_id='.$learnpath_id.'";
+    } else {
+        num -= 1;
+        window.location.href = "exercise_submit.php?'.api_get_cidreq().'&tryagain=1&exerciseId='.$exerciseId.'&num="+num+"&learnpath_item_id='.$learnpath_item_id.'&learnpath_id='.$learnpath_id.'";
+    }    
+    return false;
+}
+</script>';
 
+echo '<div id="delineation-container">';
 // Getting the options by js
-if (empty($choice_value)) {
+if (empty($choiceValue) && empty($hotSpot) && $loaded) {
+    $nextQuestion = $questionNum + 1;
+    $destinationId = isset($questionList[$nextQuestion]) ? $questionList[$nextQuestion] : -1;
+    $icon = Display::return_icon(
+        'reload.png',
+        '',
+        ['style' => 'width:22px; height:22px; padding-left:0px;padding-right:5px;']
+    );
+    $links = '<a onclick="tryAgain();" href="#">'.get_lang('TryAgain').'</a>&nbsp;'.$icon.'&nbsp;';
+
+    // the link to finish the test
+    if ($destinationId == -1) {
+        $links .= Display::return_icon(
+                'finish.gif',
+                '',
+                ['style' => 'width:22px; height:22px; padding-left:0px;padding-right:5px;']
+            ).'<a onclick="SendEx(-1);" href="#">'.get_lang('EndActivity').'</a><br /><br />';
+    } else {
+        // the link to other question
+        if (in_array($destinationId, $questionList)) {
+            $num_value_array = array_keys($questionList, $destinationId);
+            $icon = Display::return_icon(
+                'quiz.png',
+                '',
+                ['style' => 'padding-left:0px;padding-right:5px;']
+            );
+            $links .= '<a onclick="SendEx('.$num_value_array[0].');" href="#">'.
+                get_lang('Question').' '.$num_value_array[0].'</a>&nbsp;';
+            $links .= $icon;
+        }
+    }
+    echo '<div class="row"><div class="col-md-5 col-md-offset-7"><h5 class="pull-right">'.$links.'</h5></div></div>';
+    exit;
+}
+
+if (empty($choiceValue) && empty($hotSpot)) {
     echo "<script>
         // this works for only radio buttons
-        var f = window.document.frm_exercise;
-        var choice_js='';
+        var f = window.document.frm_exercise;        
+        var choice_js = {answers: []};
         var hotspot = new Array();
         var hotspotcoord = new Array();
-        var counter=0;
-        for ( var i = 0; i < f.elements.length; i++ ) {
-            if (f.elements[i].type=='radio' && f.elements[i].checked) {
-                choice_js = f.elements[i].value;
+        var counter = 0;
+        
+        for (var i = 0; i < f.elements.length; i++) {            
+            if (f.elements[i].type == 'radio' && f.elements[i].checked) {                
+                choice_js.answers.push(f.elements[i].value);
+                counter ++;
+            }
+            
+            if (f.elements[i].type == 'checkbox' && f.elements[i].checked) {
+                choice_js.answers.push(f.elements[i].value);
                 counter ++;
             }
 
-            if (f.elements[i].type=='hidden' ) {
+            if (f.elements[i].type == 'hidden') {
                 var name = f.elements[i].name;
-                if (name.substr(0,7)=='hotspot')
+                
+                if (name.substr(0,7) == 'hotspot') {
                     hotspot.push(f.elements[i].value);
+                }
 
-                if (name.substr(0,20)=='hotspot_coordinates')
+                if (name.substr(0,20) == 'hotspot_coordinates') {
                     hotspotcoord.push(f.elements[i].value);
+                }
             }
         }
-
-        if (counter==0) {
-            choice_js=-1; // this is an error
-        }
-
+        
+        var my_choice = $('*[name*=\"choice[".$questionId."]\"]').serialize();
+        var hotspot = $('*[name*=\"hotspot[".$questionId."]\"]').serialize();     
     ";
+
     // IMPORTANT
-    //this is the real redirect function
-    //echo 'window.location.href = "exercise_submit_modal.php?learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id.'&hotspotcoord="+ hotspotcoord + "&hotspot="+ hotspot + "&choice="+ choice_js + "&exerciseId='.$exerciseId.'&num='.$questionNum.'&exerciseType='.$exerciseType.'&origin='.$origin.'&gradebook='.$gradebook.'";';
-    echo ' url = "exercise_submit_modal.php?learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id.'&hotspotcoord="+ hotspotcoord + "&hotspot="+ hotspot + "&choice="+ choice_js + "&exerciseId='.$exerciseId.'&num='.$questionNum.'&exerciseType='.$exerciseType.'&'.api_get_cidreq().'&gradebook='.$gradebook.'";';
+    // This is the real redirect function
+    $extraUrl = '&loaded=1&exerciseId='.$exerciseId.'&num='.$questionNum.'&learnpath_id='.$learnpath_id.'&learnpath_item_id='.$learnpath_item_id;
+    $url = api_get_path(WEB_CODE_PATH).'exercise/exercise_submit_modal.php?'.api_get_cidreq().$extraUrl;
+    echo ' url = "'.addslashes($url).'&hotspotcoord="+ hotspotcoord + "&"+ hotspot + "&"+ my_choice;';
     echo "$('#global-modal .modal-body').load(url);";
+
     echo '</script>';
     exit;
 }
-
 $choice = [];
-$questionid = $questionList[$questionNum];
-// $choice_value => value of the user selection
-$choice[$questionid] = isset($choice_value) ? $choice_value : null;
+$choice[$questionId] = isset($choiceValue) ? $choiceValue : null;
 
-// initializing
 if (!is_array($exerciseResult)) {
     $exerciseResult = [];
 }
 
 // if the user has answered at least one question
 if (is_array($choice)) {
-    if ($exerciseType == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+    if (in_array($exerciseType, [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
         // $exerciseResult receives the content of the form.
         // Each choice of the student is stored into the array $choice
         $exerciseResult = $choice;
@@ -142,359 +183,119 @@ if (is_array($choice)) {
 
 // the script "exercise_result.php" will take the variable $exerciseResult from the session
 Session::write('exerciseResult', $exerciseResult);
-Session::write('exerciseResultCoordinates', $exerciseResultCoordinates);
-
-// creates a temporary Question object
-if (in_array($questionid, $questionList)) {
-    $objQuestionTmp = Question:: read($questionid);
-    $questionName = $objQuestionTmp->selectTitle();
-    $questionDescription = $objQuestionTmp->selectDescription();
-    $questionWeighting = $objQuestionTmp->selectWeighting();
-    $answerType = $objQuestionTmp->selectType();
-    $quesId = $objQuestionTmp->selectId(); //added by priya saini
+
+$objQuestionTmp = Question::read($questionId);
+$answerType = $objQuestionTmp->selectType();
+$showResult = false;
+
+$objAnswerTmp = new Answer($questionId, api_get_course_int_id());
+if ($objExercise->getFeedbackType() === EXERCISE_FEEDBACK_TYPE_DIRECT) {
+    $showResult = true;
 }
 
-$objAnswerTmp = new Answer($questionid);
-$nbrAnswers = $objAnswerTmp->selectNbrAnswers();
-$choice = $exerciseResult[$questionid];
-$destination = [];
-$comment = '';
-$next = 1;
-$_SESSION['hotspot_coord'] = [];
-$_SESSION['hotspot_dest'] = [];
-$overlap_color = $missing_color = $excess_color = false;
-$organs_at_risk_hit = 0;
-$wrong_results = false;
-$hot_spot_load = false;
-$questionScore = 0;
-$totalScore = 0;
-
-if (!empty($choice_value)) {
-    for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
-        $answer = $objAnswerTmp->selectAnswer($answerId);
-        $answerComment = $objAnswerTmp->selectComment($answerId);
-        $answerDestination = $objAnswerTmp->selectDestination($answerId);
-
-        $answerCorrect = $objAnswerTmp->isCorrect($answerId);
-        $answerWeighting = $objAnswerTmp->selectWeighting($answerId);
-        $numAnswer = $objAnswerTmp->selectAutoId($answerId);
-
-        // Delineation
-        $delineation_cord = $objAnswerTmp->selectHotspotCoordinates(1);
-        $answer_delineation_destination = $objAnswerTmp->selectDestination(1);
-        if ($dbg_local > 0) {
-            error_log(__LINE__.' answerId: '.$answerId.'('.$answerType.') - user delineation_cord: '.$delineation_cord.' - $answer_delineation_destination: '.$answer_delineation_destination, 0);
+switch ($answerType) {
+    case MULTIPLE_ANSWER:
+        if (is_array($choiceValue)) {
+            $choiceValue = array_combine(array_values($choiceValue), array_values($choiceValue));
         }
-
-        switch ($answerType) {
-            // for unique answer
-            case UNIQUE_ANSWER:
-                $studentChoice = ($choice_value == $numAnswer) ? 1 : 0;
-                if ($studentChoice) {
-                    $questionScore += $answerWeighting;
-                    $totalScore += $answerWeighting;
-                    $newquestionList[] = $questionid;
-                }
-                break;
-            case HOT_SPOT_DELINEATION:
-                $studentChoice = $choice[$answerId];
-                if ($studentChoice) {
-                    $newquestionList[] = $questionid;
-                }
-                if ($answerId === 1) {
-                    $questionScore += $answerWeighting;
-                    $totalScore += $answerWeighting;
-                    $_SESSION['hotspot_coord'][1] = $delineation_cord;
-                    $_SESSION['hotspot_dest'][1] = $answer_delineation_destination;
-                }
-                break;
+        break;
+    case UNIQUE_ANSWER:
+        if (is_array($choiceValue) && isset($choiceValue[0])) {
+            $choiceValue = $choiceValue[0];
         }
-
-        if ($answerType == UNIQUE_ANSWER || $answerType == MULTIPLE_ANSWER) {
-            if ($studentChoice) {
-                $destination = $answerDestination;
-                $comment = $answerComment;
-            }
-        } elseif ($answerType == HOT_SPOT_DELINEATION) {
-            if ($next) {
-                $hot_spot_load = true; //apparently the script is called twice
-                $user_answer = $user_array;
-                $_SESSION['exerciseResultCoordinates'][$questionid] = $user_answer; //needed for exercise_result.php
-
-                // we compare only the delineation not the other points
-                $answer_question = $_SESSION['hotspot_coord'][1];
-                $answerDestination = $_SESSION['hotspot_dest'][1];
-
-                $poly_user = convert_coordinates($user_answer, '/');
-                $poly_answer = convert_coordinates($answer_question, '|');
-                $max_coord = poly_get_max($poly_user, $poly_answer);
-
-                if (empty($_GET['hotspot'])) { //no user response
-                    $overlap = -2;
-                } else {
-                    $poly_user_compiled = poly_compile($poly_user, $max_coord);
-                    $poly_answer_compiled = poly_compile(
-                        $poly_answer,
-                        $max_coord
-                    );
-                    $poly_results = poly_result(
-                        $poly_answer_compiled,
-                        $poly_user_compiled,
-                        $max_coord
-                    );
-
-                    $overlap = $poly_results['both'];
-                    $poly_answer_area = $poly_results['s1'];
-                    $poly_user_area = $poly_results['s2'];
-                    $missing = $poly_results['s1Only'];
-                    $excess = $poly_results['s2Only'];
-                }
-
-                if ($overlap < 1) {
-                    // shortcut to avoid complicated calculations
-                    $final_overlap = 0;
-                    $final_missing = 100;
-                    $final_excess = 100;
-                } else {
-                    // the final overlap is the percentage of the initial polygon that is overlapped by the user's polygon
-                    $final_overlap = round(((float) $overlap / (float) $poly_answer_area) * 100);
-                    if ($dbg_local > 1) {
-                        error_log(__LINE__.' - Final overlap is '.$final_overlap, 0);
-                    }
-                    // the final missing area is the percentage of the initial polygon that is not overlapped by the user's polygon
-                    $final_missing = 100 - $final_overlap;
-                    if ($dbg_local > 1) {
-                        error_log(__LINE__.' - Final missing is '.$final_missing, 0);
-                    }
-                    // the final excess area is the percentage of the initial polygon's size that is covered by the user's polygon outside of the initial polygon
-                    $final_excess = round((((float) $poly_user_area - (float) $overlap) / (float) $poly_answer_area) * 100);
-                    if ($dbg_local > 1) {
-                        error_log(__LINE__.' - Final excess is '.$final_excess, 0);
-                    }
-                }
-
-                $destination_items = explode('@@', $answerDestination);
-                $threadhold_total = $destination_items[0];
-                $threadhold_items = explode(';', $threadhold_total);
-                $threadhold1 = $threadhold_items[0]; // overlap
-                $threadhold2 = $threadhold_items[1]; // excess
-                $threadhold3 = $threadhold_items[2]; //missing
-
-                // if is delineation
-                if ($answerId === 1) {
-                    //setting colors
-                    if ($final_overlap >= $threadhold1) {
-                        $overlap_color = true;
-                    }
-
-                    if ($final_excess <= $threadhold2) {
-                        $excess_color = true;
-                    }
-
-                    if ($final_missing <= $threadhold3) {
-                        $missing_color = true;
-                    }
-
-                    $try_hotspot = null;
-                    $lp_hotspot = null;
-                    $url_hotspot = null;
-                    $select_question_hotspot = null;
-
-                    // if pass
-                    //if ($final_overlap>=$threadhold1 && $final_missing<=$threadhold2 && $final_excess<=$threadhold3) {
-                    if ($final_overlap >= $threadhold1 && $final_missing <= $threadhold3 && $final_excess <= $threadhold2) {
-                        $next = 1; //go to the oars
-                        $result_comment = get_lang('Acceptable');
-                    } else {
-                        $next = 1; //Go to the oars. If $next =  0 we will show this message: "One (or more) area at risk has been hit" instead of the table resume with the results
-                        $wrong_results = true;
-                        $result_comment = get_lang('Unacceptable');
-                    }
-
-                    $special_comment = $comment = $answerDestination = $objAnswerTmp->selectComment(1);
-                    $answerDestination = $objAnswerTmp->selectDestination(1);
-                    $destination_items = explode('@@', $answerDestination);
-                    $try_hotspot = $destination_items[1];
-                    $lp_hotspot = $destination_items[2];
-                    $select_question_hotspot = $destination_items[3];
-                    $url_hotspot = $destination_items[4];
-                } elseif ($answerId > 1) {
-                    if ($objAnswerTmp->selectHotspotType($answerId) === 'noerror') {
-                        if ($dbg_local > 0) {
-                            error_log(__LINE__.' - answerId is of type noerror', 0);
-                        }
-                        //type no error shouldn't be treated
-                        $next = 1;
-                        continue;
-                    }
-                    if ($dbg_local > 0) {
-                        error_log(__LINE__.' - answerId is >1 so we\'re probably in OAR', 0);
-                    }
-                    //check the intersection between the oar and the user
-                    //echo 'user';	print_r($x_user_list);		print_r($y_user_list);
-                    //echo 'official';print_r($x_list);print_r($y_list);
-                    //$result = get_intersection_data($x_list,$y_list,$x_user_list,$y_user_list);
-
-                    //$delineation_cord=$objAnswerTmp->selectHotspotCoordinates($answerId);
-                    $delineation_cord = $objAnswerTmp->selectHotspotCoordinates($answerId); //getting the oars coordinates
-                    $poly_answer = convert_coordinates($delineation_cord, '|');
-                    // getting max coordinates
-                    $max_coord = poly_get_max(
-                        $poly_user,
-                        $poly_answer
-                    );
-                    $test = false;
-                    if (empty($_GET['hotspot'])) {
-                        // no user response
-                        $overlap = false;
-                    } else {
-                        // poly_compile really works tested with gnuplot
-                        $poly_user_compiled = poly_compile(
-                            $poly_user,
-                            $max_coord,
-                            $test
-                        ); //$poly_user is already set when answerid = 1
-                        $poly_answer_compiled = poly_compile(
-                            $poly_answer,
-                            $max_coord,
-                            $test
-                        );
-                        $overlap = poly_touch(
-                            $poly_user_compiled,
-                            $poly_answer_compiled,
-                            $max_coord
-                        );
-                    }
-
-                    if ($overlap == false) {
-                        //all good, no overlap
-                        $next = 1;
-                        continue;
-                    } else {
-                        if ($dbg_local > 0) {
-                            error_log(
-                                __LINE__.' - Overlap is '.$overlap.': OAR hit',
-                                0
-                            );
-                        }
-                        $organs_at_risk_hit++;
-                        //show the feedback
-                        $next = 1;
-                        $comment = $answerDestination = $objAnswerTmp->selectComment(
-                            $answerId
-                        );
-                        $answerDestination = $objAnswerTmp->selectDestination(
-                            $answerId
-                        );
-                        $destination_items = explode('@@', $answerDestination);
-                        $try_hotspot = $destination_items[1];
-                        $lp_hotspot = $destination_items[2];
-                        $select_question_hotspot = $destination_items[3];
-                        $url_hotspot = $destination_items[4];
-                    }
-                }
-            }
+        break;
+    case DRAGGABLE:
+        break;
+    case HOT_SPOT_DELINEATION:
+        $showResult = true;
+        if (is_array($hotSpot)) {
+            $choiceValue = isset($hotSpot[1]) ? $hotSpot[1] : '';
+            $_SESSION['exerciseResultCoordinates'][$questionId] = $choiceValue; //needed for exercise_result.php
+            $delineation_cord = $objAnswerTmp->selectHotspotCoordinates(1);
+            $answer_delineation_destination = $objAnswerTmp->selectDestination(1);
+            $_SESSION['hotspot_coord'][$questionId][1] = $delineation_cord;
+            $_SESSION['hotspot_dest'][$questionId][1] = $answer_delineation_destination;
         }
-    }
-
-    if ($overlap_color) {
-        $overlap_color = 'green';
-    } else {
-        $overlap_color = 'red';
-    }
-    if ($missing_color) {
-        $missing_color = 'green';
-    } else {
-        $missing_color = 'red';
-    }
-    if ($excess_color) {
-        $excess_color = 'green';
-    } else {
-        $excess_color = 'red';
-    }
+        break;
+    case CALCULATED_ANSWER:
+        /*$_SESSION['calculatedAnswerId'][$questionId] = mt_rand(
+            1,
+            $nbrAnswers
+        );*/
+        //var_dump($_SESSION['calculatedAnswerId'][$questionId]);
+        break;
+}
 
-    if (!is_numeric($final_overlap)) {
-        $final_overlap = 0;
+ob_start();
+$result = $objExercise->manage_answer(
+    0,
+    $questionId,
+    $choiceValue,
+    'exercise_result',
+    null,
+    false,
+    false,
+    $showResult,
+    null,
+    [],
+    true,
+    false,
+    true
+);
+$manageAnswerHtmlContent = ob_get_clean();
+$contents = '';
+$answerCorrect = false;
+if (!empty($result)) {
+    switch ($answerType) {
+        case UNIQUE_ANSWER:
+        case MULTIPLE_ANSWER:
+        case DRAGGABLE:
+        case HOT_SPOT_DELINEATION:
+        case CALCULATED_ANSWER:
+            if ($result['score'] == $result['weight']) {
+                $answerCorrect = true;
+            }
+            break;
     }
+}
 
-    if (!is_numeric($final_missing)) {
-        $final_missing = 0;
+if ($objExercise->getFeedbackType() === EXERCISE_FEEDBACK_TYPE_DIRECT) {
+    if (isset($result['correct_answer_id'])) {
+        /** @var Answer $answer */
+        $answerId = $result['correct_answer_id'];
+        $contents = $objAnswerTmp->selectComment($answerId);
     }
-    if (!is_numeric($final_excess)) {
-        $final_excess = 0;
-    }
-
-    if ($final_excess > 100) {
-        $final_excess = 100;
+} else {
+    $contents = Display::return_message(get_lang('Incorrect'), 'warning');
+    if ($answerCorrect) {
+        $contents = Display::return_message(get_lang('Correct'), 'success');
     }
+}
 
-    $table_resume = '<table class="data_table">
-    <tr class="row_odd">
-        <td></td>
-        <td ><b>'.get_lang('Requirements').'</b></td>
-        <td><b>'.get_lang('YourAnswer').'</b></td>
-    </tr>
-    <tr class="row_even">
-        <td><b>'.get_lang('Overlap').'</b></td>
-        <td>'.get_lang('Min').' '.$threadhold1.'</td>
-        <td><div style="color:'.$overlap_color.'">'.(($final_overlap < 0) ? 0 : intval($final_overlap)).'</div></td>
-    </tr>
-    <tr>
-        <td><b>'.get_lang('Excess').'</b></td>
-        <td>'.get_lang('Max').' '.$threadhold2.'</td>
-        <td><div style="color:'.$excess_color.'">'.(($final_excess < 0) ? 0 : intval($final_excess)).'</div></td>
-    </tr>
-
-    <tr class="row_even">
-        <td><b>'.get_lang('Missing').'</b></td>
-        <td>'.get_lang('Max').' '.$threadhold3.'</td>
-        <td><div style="color:'.$missing_color.'">'.(($final_missing < 0) ? 0 : intval($final_missing)).'</div></td>
-    </tr>
-    </table>';
+if ($answerType === HOT_SPOT_DELINEATION) {
+    $contents = $manageAnswerHtmlContent;
 }
-Session::write('newquestionList', $newquestionList);
 $links = '';
-if (isset($choice_value) && $choice_value == -1) {
-    if ($answerType != HOT_SPOT_DELINEATION) {
-        $links .= '<a href="#" onclick="tb_remove();">'.get_lang('ChooseAnAnswer').'</a><br />';
+if ($objExercise->getFeedbackType() === EXERCISE_FEEDBACK_TYPE_DIRECT) {
+    if (isset($choiceValue) && $choiceValue == -1) {
+        if ($answerType != HOT_SPOT_DELINEATION) {
+            $links .= '<a href="#" onclick="tb_remove();">'.get_lang('ChooseAnAnswer').'</a><br />';
+        }
     }
 }
 
-$destinationid = null;
-if ($answerType != HOT_SPOT_DELINEATION) {
-    if (!empty($destination)) {
-        $item_list = explode('@@', $destination);
-        $try = $item_list[0];
-        $lp = $item_list[1];
-        $destinationid = $item_list[2];
-        $url = $item_list[3];
-    }
-    $table_resume = '';
-} else {
-    $try = $try_hotspot;
-    $lp = $lp_hotspot;
-    $destinationid = $select_question_hotspot;
-    $url = $url_hotspot;
-    if ($organs_at_risk_hit == 0 && $wrong_results == false) {
-        // no error = no oar and no wrong result for delineation
-        // show if no error
-        $comment = $answerComment = $objAnswerTmp->selectComment($nbrAnswers);
-        $answerDestination = $objAnswerTmp->selectDestination($nbrAnswers);
-        // we send the error
-        $destination_items = explode('@@', $answerDestination);
-        $try = $destination_items[1];
-        $lp = $destination_items[2];
-        $destinationid = $destination_items[3];
-        $url = $destination_items[4];
-        $exerciseResult[$questionid] = 1;
-    } else {
-        $exerciseResult[$questionid] = 0;
-    }
+$destinationId = null;
+if (isset($result['answer_destination'])) {
+    $itemList = explode('@@', $result['answer_destination']);
+    $try = $itemList[0];
+    $lp = $itemList[1];
+    $destinationId = $itemList[2];
+    $url = $itemList[3];
 }
 
 // the link to retry the question
 if (isset($try) && $try == 1) {
-    $num_value_array = array_keys($questionList, $questionid);
+    $num_value_array = array_keys($questionList, $questionId);
     $links .= Display:: return_icon(
         'reload.gif',
         '',
@@ -505,18 +306,17 @@ if (isset($try) && $try == 1) {
 // the link to theory (a learning path)
 if (!empty($lp)) {
     $lp_url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=view&lp_id='.$lp;
-    $list = new LearnpathList(api_get_user_id());
-    $flat_list = $list->get_flat_list();
     $links .= Display:: return_icon(
         'theory.gif',
         '',
         ['style' => 'padding-left:0px;padding-right:5px;']
     ).'<a target="_blank" href="'.$lp_url.'">'.get_lang('SeeTheory').'</a><br />';
 }
+
 $links .= '<br />';
 
 // the link to an external website or link
-if (!empty($url)) {
+if (!empty($url) && $url != -1) {
     $links .= Display:: return_icon(
         'link.gif',
         '',
@@ -524,8 +324,11 @@ if (!empty($url)) {
     ).'<a target="_blank" href="'.$url.'">'.get_lang('VisitUrl').'</a><br /><br />';
 }
 
+$nextQuestion = $questionNum + 1;
+$destinationId = isset($questionList[$nextQuestion]) ? $questionList[$nextQuestion] : -1;
+
 // the link to finish the test
-if ($destinationid == -1) {
+if ($destinationId == -1) {
     $links .= Display:: return_icon(
         'finish.gif',
         '',
@@ -533,10 +336,8 @@ if ($destinationid == -1) {
     ).'<a onclick="SendEx(-1);" href="#">'.get_lang('EndActivity').'</a><br /><br />';
 } else {
     // the link to other question
-    if (in_array($destinationid, $questionList)) {
-        $objQuestionTmp = Question::read($destinationid);
-        $questionName = $objQuestionTmp->selectTitle();
-        $num_value_array = array_keys($questionList, $destinationid);
+    if (in_array($destinationId, $questionList)) {
+        $num_value_array = array_keys($questionList, $destinationId);
         $icon = Display::return_icon(
                 'quiz.png',
                 '',
@@ -548,54 +349,14 @@ if ($destinationid == -1) {
     }
 }
 
-echo '<script>
-function SendEx(num) {
-    if (num == -1) {
-        window.location.href = "exercise_result.php?take_session=1&exerciseId='.$exerciseId.'&num="+num+"&exerciseType='.$exerciseType.'&origin='.$origin.'&learnpath_item_id='.$learnpath_item_id.'&learnpath_id='.$learnpath_id.'";
-    } else {
-        num -= 1;
-        window.location.href = "exercise_submit.php?tryagain=1&exerciseId='.$exerciseId.'&num="+num+"&exerciseType='.$exerciseType.'&origin='.$origin.'&learnpath_item_id='.$learnpath_item_id.'&learnpath_id='.$learnpath_id.'";
-    }
-    
-    return false;
-}
-</script>';
-
 if (!empty($links)) {
-    //echo '<h1><div style="color:#333;">'.get_lang('Feedback').'</div></h1>';
-    if ($answerType == HOT_SPOT_DELINEATION) {
-        if ($organs_at_risk_hit > 0) {
-            $message .= '<br />'.get_lang('ResultIs').' <b>'.get_lang('Unacceptable').'</b><br />';
-            $message .= '<p style="color:#DC0A0A;"><b>'.get_lang('OARHit').'</b></p>';
-            $message .= '<p>'.$comment.'</p>';
-        } else {
-            $message = '<p>'.get_lang('YourDelineation').'</p>';
-            $message .= $table_resume;
-            $message .= '<br />'.get_lang('ResultIs').' <b>'.$result_comment.'</b><br />';
-            $message .= '<p>'.$comment.'</p>';
-        }
-        echo '<br />';
-        echo $message;
-    } else {
-        echo '<p>'.$comment.'</p>';
-    }
+    echo '<div>'.$contents.'</div>';
     echo '<div style="padding-left: 450px"><h5>'.$links.'</h5></div>';
     echo '</div>';
-
-    Session::write('hot_spot_result', $message);
-    $_SESSION['hotspot_delineation_result'][$exerciseId][$questionid] = [$message, $exerciseResult[$questionid]];
-    //reseting the exerciseResult variable
-    Session::write('exerciseResult', $exerciseResult);
-
-    //save this variables just in case the exercise loads an LP with other exercise
-    $_SESSION['objExerciseExtra'.$exerciseId] = $_SESSION['objExercise'];
-    $_SESSION['exerciseResultExtra'.$exerciseId] = $_SESSION['exerciseResult'];
-    $_SESSION['questionListExtra'.$exerciseId] = $_SESSION['questionList'];
 } else {
     $questionNum++;
     echo '<script>
-            window.location.href = "exercise_submit.php?exerciseId='.$exerciseId.'&num='.$questionNum.'&exerciseType='.$exerciseType.'&'.api_get_cidreq().'";
+            window.location.href = "exercise_submit.php?exerciseId='.$exerciseId.'&num='.$questionNum.'&'.api_get_cidreq().'";
         </script>';
 }
-
 echo '</div>';

+ 2 - 2
main/exercise/fill_blanks.class.php

@@ -15,8 +15,8 @@ class FillBlanks extends Question
     const FILL_THE_BLANK_MENU = 1;
     const FILL_THE_BLANK_SEVERAL_ANSWER = 2;
 
-    public static $typePicture = 'fill_in_blanks.png';
-    public static $explanationLangVar = 'FillBlanks';
+    public $typePicture = 'fill_in_blanks.png';
+    public $explanationLangVar = 'FillBlanks';
 
     /**
      * Constructor.

+ 2 - 2
main/exercise/freeanswer.class.php

@@ -12,8 +12,8 @@
  */
 class FreeAnswer extends Question
 {
-    public static $typePicture = 'open_answer.png';
-    public static $explanationLangVar = 'FreeAnswer';
+    public $typePicture = 'open_answer.png';
+    public $explanationLangVar = 'FreeAnswer';
 
     /**
      * Constructor.

+ 6 - 8
main/exercise/global_multiple_answer.class.php

@@ -8,8 +8,8 @@ use ChamiloSession as Session;
  */
 class GlobalMultipleAnswer extends Question
 {
-    public static $typePicture = 'mcmagl.png';
-    public static $explanationLangVar = 'GlobalMultipleAnswer';
+    public $typePicture = 'mcmagl.png';
+    public $explanationLangVar = 'GlobalMultipleAnswer';
 
     /**
      * GlobalMultipleAnswer constructor.
@@ -266,13 +266,11 @@ class GlobalMultipleAnswer extends Question
         $header = parent::return_header($exercise, $counter, $score);
         $header .= '<table class="'.$this->question_table_class.'"><tr>';
 
-        if (!in_array($exercise->results_disabled, [
-            RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
-        ])
-        ) {
+        if (!in_array($exercise->results_disabled, [RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER])) {
             $header .= '<th>'.get_lang('Choice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
         }
 
         $header .= '<th>'.get_lang('Answer').'</th>';

+ 2 - 49
main/exercise/hotspot.class.php

@@ -14,8 +14,8 @@
  */
 class HotSpot extends Question
 {
-    public static $typePicture = 'hotspot.png';
-    public static $explanationLangVar = 'HotSpot';
+    public $typePicture = 'hotspot.png';
+    public $explanationLangVar = 'HotSpot';
 
     /**
      * HotSpot constructor.
@@ -105,50 +105,3 @@ class HotSpot extends Question
         // nothing
     }
 }
-
-/**
- * Class HotSpotDelineation.
- */
-class HotSpotDelineation extends HotSpot
-{
-    public static $typePicture = 'hotspot-delineation.png';
-    public static $explanationLangVar = 'HotspotDelineation';
-
-    /**
-     * HotSpotDelineation constructor.
-     */
-    public function __construct()
-    {
-        parent::__construct();
-        $this->type = HOT_SPOT_DELINEATION;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function createForm(&$form, $exercise)
-    {
-        parent::createForm($form, $exercise);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function processCreation($form, $exercise)
-    {
-        parent::processCreation($form, $exercise);
-    }
-
-    public function createAnswersForm($form)
-    {
-        parent::createAnswersForm($form);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function processAnswersCreation($form, $exercise)
-    {
-        parent::processAnswersCreation($form, $exercise);
-    }
-}

+ 26 - 36
main/exercise/hotspot_admin.inc.php

@@ -12,7 +12,6 @@ use ChamiloSession as Session;
  * @author  Toon Keppens
  */
 $modifyAnswers = (int) $_GET['hotspotadmin'];
-
 if (!is_object($objQuestion)) {
     $objQuestion = Question::read($modifyAnswers);
 }
@@ -120,7 +119,7 @@ if ($submitAnswers || $buttonBack) {
 
                 $reponse[$i] = trim($reponse[$i]);
                 $comment[$i] = trim($comment[$i]);
-                $weighting[$i] = ($weighting[$i]); //it can be float
+                $weighting[$i] = $weighting[$i]; // It can be float.
 
                 if ($weighting[$i]) {
                     $questionWeighting += $weighting[$i];
@@ -159,9 +158,9 @@ if ($submitAnswers || $buttonBack) {
         }
 
         $questionWeighting = $nbrGoodAnswers = 0;
-        $select_question = $_POST['select_question'];
+        $select_question = isset($_POST['select_question']) ? $_POST['select_question'] : null;
         $try = isset($_POST['try']) ? $_POST['try'] : [];
-        $url = $_POST['url'];
+        $url = isset($_POST['url']) ? $_POST['url'] : '';
         $destination = [];
 
         $threadhold1 = $_POST['threadhold1'];
@@ -169,10 +168,6 @@ if ($submitAnswers || $buttonBack) {
         $threadhold3 = $_POST['threadhold3'];
 
         for ($i = 1; $i <= $nbrAnswers; $i++) {
-            if ($debug > 0) {
-                echo str_repeat('&nbsp;', 4).'$answerType is HOT_SPOT'."<br />\n";
-            }
-
             $reponse[$i] = trim($reponse[$i]);
             $comment[$i] = trim($comment[$i]);
             $weighting[$i] = $weighting[$i];
@@ -180,19 +175,19 @@ if ($submitAnswers || $buttonBack) {
             if (empty($threadhold1[$i])) {
                 $threadhold1_str = 0;
             } else {
-                $threadhold1_str = intval($threadhold1[$i]);
+                $threadhold1_str = (int) $threadhold1[$i];
             }
 
             if (empty($threadhold2[$i])) {
                 $threadhold2_str = 0;
             } else {
-                $threadhold2_str = intval($threadhold2[$i]);
+                $threadhold2_str = (int) $threadhold2[$i];
             }
 
             if (empty($threadhold3[$i])) {
                 $threadhold3_str = 0;
             } else {
-                $threadhold3_str = intval($threadhold3[$i]);
+                $threadhold3_str = (int) $threadhold3[$i];
             }
 
             $threadhold_total = $threadhold1_str.';'.$threadhold2_str.';'.$threadhold3_str;
@@ -209,9 +204,8 @@ if ($submitAnswers || $buttonBack) {
                 $lp_str = $lp[$i];
             }
 
-            if ($url[$i] == '') {
-                $url_str = '';
-            } else {
+            $url_str = '';
+            if (isset($url[$i]) && !empty($url[$i])) {
                 $url_str = $url[$i];
             }
 
@@ -245,14 +239,14 @@ if ($submitAnswers || $buttonBack) {
                 $objAnswer->cancel();
                 break;
             }
-        }  // end for()
+        }
 
-        //now the noerror section
-        $selectQuestionNoError = Security::remove_XSS($_POST['select_question_noerror']);
-        $lp_noerror = Security::remove_XSS($_POST['lp_noerror']);
+        // now the noerror section
+        $selectQuestionNoError = isset($_POST['select_question_noerror']) ? Security::remove_XSS($_POST['select_question_noerror']) : null;
+        $lp_noerror = isset($_POST['lp_noerror']) ? Security::remove_XSS($_POST['lp_noerror']) : '';
         $try_noerror = isset($_POST['try_noerror']) ? Security::remove_XSS($_POST['try_noerror']) : null;
-        $url_noerror = Security::remove_XSS($_POST['url_noerror']);
-        $comment_noerror = Security::remove_XSS($_POST['comment_noerror']);
+        $url_noerror = isset($_POST['url_noerror']) ? Security::remove_XSS($_POST['url_noerror']) : null;
+        $comment_noerror = isset($_POST['comment_noerror']) ? Security::remove_XSS($_POST['comment_noerror']) : null;
         $threadhold_total = '0;0;0';
 
         if ($try_noerror == 'on') {
@@ -365,7 +359,6 @@ if (isset($modifyAnswers)) {
 
     if (!$nbrAnswers) {
         $nbrAnswers = $objAnswer->selectNbrAnswers();
-
         if ($answerType == HOT_SPOT_DELINEATION) {
             // the magic happens here ...
             // we do this to not count the if no error section
@@ -385,7 +378,7 @@ if (isset($modifyAnswers)) {
         for ($i = 1; $i <= $nbrAnswers; $i++) {
             $reponse[$i] = $objAnswer->selectAnswer($i);
 
-            if ($objExercise->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+            if ($objExercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
                 $comment[$i] = $objAnswer->selectComment($i);
             }
 
@@ -417,7 +410,6 @@ if (isset($modifyAnswers)) {
 
     if ($answerType == HOT_SPOT_DELINEATION) {
         //added the noerror answer
-        $reponse_noerror = 'noerror';
         $comment_noerror = $objAnswer->selectComment($nbrAnswers + 1);
         $destination_noerror_list = $objAnswer->selectDestination($nbrAnswers + 1);
 
@@ -426,7 +418,6 @@ if (isset($modifyAnswers)) {
         }
 
         $destination_items = explode('@@', $destination_noerror_list);
-
         $try_noerror = $destination_items[1];
         $lp_noerror = $destination_items[2];
         $selectQuestionNoError = $destination_items[3];
@@ -436,7 +427,7 @@ if (isset($modifyAnswers)) {
     $_SESSION['tmp_answers'] = [];
     $_SESSION['tmp_answers']['answer'] = $reponse;
 
-    if ($objExercise->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+    if ($objExercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
         $_SESSION['tmp_answers']['comment'] = $comment;
     }
 
@@ -474,7 +465,7 @@ if (isset($modifyAnswers)) {
                 $nbrAnswers--;
                 // Remove the last answer
                 $tmp = array_pop($_SESSION['tmp_answers']['answer']);
-                if ($objExercise->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+                if ($objExercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
                     $tmp = array_pop($_SESSION['tmp_answers']['comment']);
                 }
                 $tmp = array_pop($_SESSION['tmp_answers']['weighting']);
@@ -494,7 +485,7 @@ if (isset($modifyAnswers)) {
 
             // Add a new answer
             $_SESSION['tmp_answers']['answer'][] = '';
-            if ($objExercise->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+            if ($objExercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
                 $_SESSION['tmp_answers']['comment'][] = '';
             }
             $_SESSION['tmp_answers']['weighting'][] = '1';
@@ -615,7 +606,7 @@ if (isset($modifyAnswers)) {
                     <th width="5">&nbsp;</th>
                     <th><?php echo get_lang('HotspotDescription'); ?> *</th>
                     <?php
-                    if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                    if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
                         echo '<th>'.get_lang('Comment').'</th>';
                         if ($answerType == HOT_SPOT_DELINEATION) {
                             echo '<th >'.get_lang('Scenario').'</th>';
@@ -736,7 +727,7 @@ if (isset($modifyAnswers)) {
                                 <input type="hidden" name="hotspot_coordinates[<?php echo $i; ?>]" value="<?php
                                 echo empty($hotspot_coordinates[$i]) ? '0;0|0|0' : $hotspot_coordinates[$i]; ?>"/>
                             </td>
-                            <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                            <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
                                     ?>
                                 <td>
                                     <div class="checkbox">
@@ -795,7 +786,7 @@ if (isset($modifyAnswers)) {
                                               name="comment[<?php echo $i; ?>]"
                                               style="width: 100%"><?php echo Security::remove_XSS($comment[$i]); ?></textarea>
                                 </td>
-                                <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                                <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
                     ?>
                                     <td>
                                         <table>
@@ -850,7 +841,7 @@ if (isset($modifyAnswers)) {
                                 <tr>
                                     <th width="5">&nbsp;<?php /* echo get_lang('Hotspot'); */ ?></th>
                                     <th><?php echo get_lang('OAR'); ?>*</th>
-                                    <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                                    <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
                         ?>
                                         <th colspan="2"><?php echo get_lang('Comment'); ?></th>
                                         <th><?php if ($answerType == HOT_SPOT_DELINEATION) {
@@ -883,7 +874,7 @@ if (isset($modifyAnswers)) {
                                 <input type="hidden" name="hotspot_coordinates[<?php echo $i; ?>]" value="<?php
                                 echo empty($hotspot_coordinates[$i]) ? '0;0|0|0' : $hotspot_coordinates[$i]; ?>"/>
                             </td>
-                            <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                            <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
                                     ?>
                                 <td>
                                     <div class="checkbox">
@@ -1029,7 +1020,7 @@ if (isset($modifyAnswers)) {
         ?>
                     <tr>
                         <th colspan="2"><?php echo get_lang('IfNoError'); ?></th>
-                        <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                        <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
             ?>
                             <th colspan="2"><?php echo get_lang('Feedback'); ?></th>
                             <th><?php echo get_lang('Scenario'); ?></th>
@@ -1049,7 +1040,7 @@ if (isset($modifyAnswers)) {
                             <textarea class="form-control" wrap="virtual" rows="3" cols="25"
                                       name="comment_noerror"><?php echo Security::remove_XSS($comment_noerror); ?></textarea>
                         </td>
-                        <?php if ($objExercise->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+                        <?php if ($objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
             ?>
                             <td>
                                 <div class="checkbox">
@@ -1096,8 +1087,7 @@ if (isset($modifyAnswers)) {
         <div class="row">
             <div class="col-xs-12">
                 <?php
-                $swf_loaded = $answerType == HOT_SPOT_DELINEATION ? 'hotspot_delineation_admin' : 'hotspot_admin';
-    $height = 450;
+
     $relPath = api_get_path(WEB_CODE_PATH); ?>
                 <div id="hotspot-container" class="center-block"></div>
             </div>

+ 2 - 31
main/exercise/hotspot_answers.as.php

@@ -127,7 +127,7 @@ if (in_array(
 }
 
 $hideExpectedAnswer = false;
-if ($objExercise->selectFeedbackType() == 0 &&
+if ($objExercise->getFeedbackType() == 0 &&
     $objExercise->selectResultsDisabled() == RESULT_DISABLE_SHOW_SCORE_ONLY
 ) {
     $hideExpectedAnswer = true;
@@ -166,37 +166,8 @@ if (!$hideExpectedAnswer) {
 
     /** @var CQuizAnswer $hotSpotAnswer */
     foreach ($result as $hotSpotAnswer) {
-        $hotSpotAnswerId = $hotSpotAnswer->getIid();
-
-        // Show only correct hotspots
-        /*
-        if ($objExercise->selectResultsDisabled() == RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER) {
-            $TBL_TRACK_HOTSPOT = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTSPOT);
-            // Check auto id
-            $sql = "SELECT hotspot_correct
-                    FROM $TBL_TRACK_HOTSPOT
-                    WHERE
-                        hotspot_exe_id = $exeId AND
-                        hotspot_question_id= $questionId AND
-                        hotspot_answer_id = ".$hotSpotAnswerId."
-                    ORDER BY hotspot_id ASC";
-            $result = Database::query($sql);
-            $studentChoice = false;
-            if (Database::num_rows($result)) {
-                $studentChoice = Database::result(
-                    $result,
-                    0,
-                    'hotspot_correct'
-                );
-            }
-
-            if (!$studentChoice) {
-                continue;
-            }
-        }*/
-
         $hotSpot = [];
-        $hotSpot['id'] = $hotSpotAnswerId;
+        $hotSpot['id'] = $hotSpotAnswer->getIid();
         $hotSpot['answer'] = $hotSpotAnswer->getAnswer();
 
         switch ($hotSpotAnswer->getHotspotType()) {

+ 8 - 4
main/exercise/matching.class.php

@@ -15,8 +15,8 @@
  */
 class Matching extends Question
 {
-    public static $typePicture = 'matching.png';
-    public static $explanationLangVar = 'Matching';
+    public $typePicture = 'matching.png';
+    public $explanationLangVar = 'Matching';
 
     /**
      * Constructor.
@@ -292,13 +292,17 @@ class Matching extends Question
         ])
         ) {
             $header .= '<th>'.get_lang('Choice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            //if ($exercise->showExpectedChoiceColumn()) {
+                //$header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            //}
         }
 
         if ($exercise->showExpectedChoice()) {
             $header .= '<th>'.get_lang('Status').'</th>';
         } else {
-            $header .= '<th>'.get_lang('CorrespondsTo').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('CorrespondsTo').'</th>';
+            }
         }
         $header .= '</tr>';
 

+ 4 - 7
main/exercise/multiple_answer.class.php

@@ -15,8 +15,8 @@ use ChamiloSession as Session;
  */
 class MultipleAnswer extends Question
 {
-    public static $typePicture = 'mcma.png';
-    public static $explanationLangVar = 'MultipleSelect';
+    public $typePicture = 'mcma.png';
+    public $explanationLangVar = 'MultipleSelect';
 
     /**
      * Constructor.
@@ -235,11 +235,8 @@ class MultipleAnswer extends Question
         $header .= '<table class="'.$this->question_table_class.'"><tr>';
 
         $header .= '<th>'.get_lang('Choice').'</th>';
-        if (!in_array($exercise->results_disabled, [
-            RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
-        ])
-        ) {
+
+        if ($exercise->showExpectedChoiceColumn()) {
             $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
         }
 

+ 5 - 4
main/exercise/multiple_answer_combination.class.php

@@ -16,8 +16,8 @@ use ChamiloSession as Session;
  */
 class MultipleAnswerCombination extends Question
 {
-    public static $typePicture = 'mcmac.png';
-    public static $explanationLangVar = 'MultipleSelectCombination';
+    public $typePicture = 'mcmac.png';
+    public $explanationLangVar = 'MultipleSelectCombination';
 
     /**
      * Constructor.
@@ -234,11 +234,12 @@ class MultipleAnswerCombination extends Question
 
         if (!in_array($exercise->results_disabled, [
             RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
         ])
         ) {
             $header .= '<th>'.get_lang('Choice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
         }
 
         $header .= '<th>'.get_lang('Answer').'</th>';

+ 2 - 2
main/exercise/multiple_answer_combination_true_false.class.php

@@ -13,8 +13,8 @@
  */
 class MultipleAnswerCombinationTrueFalse extends MultipleAnswerCombination
 {
-    public static $typePicture = 'mcmaco.png';
-    public static $explanationLangVar = 'MultipleAnswerCombinationTrueFalse';
+    public $typePicture = 'mcmaco.png';
+    public $explanationLangVar = 'MultipleAnswerCombinationTrueFalse';
     public $options;
 
     /**

+ 8 - 7
main/exercise/multiple_answer_true_false.class.php

@@ -14,8 +14,8 @@ use ChamiloSession as Session;
  */
 class MultipleAnswerTrueFalse extends Question
 {
-    public static $typePicture = 'mcmao.png';
-    public static $explanationLangVar = 'MultipleAnswerTrueFalse';
+    public $typePicture = 'mcmao.png';
+    public $explanationLangVar = 'MultipleAnswerTrueFalse';
     public $options;
 
     /**
@@ -52,7 +52,7 @@ class MultipleAnswerTrueFalse extends Question
         $html .= '<th>'.get_lang('Answer').'</th>';
 
         // show column comment when feedback is enable
-        if ($obj_ex->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+        if ($obj_ex->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
             $html .= '<th>'.get_lang('Comment').'</th>';
         }
 
@@ -146,7 +146,7 @@ class MultipleAnswerTrueFalse extends Question
             );
 
             // show comment when feedback is enable
-            if ($obj_ex->selectFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
+            if ($obj_ex->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) {
                 $form->addElement(
                     'html_editor',
                     'comment['.$i.']',
@@ -315,11 +315,12 @@ class MultipleAnswerTrueFalse extends Question
 
         if (!in_array($exercise->results_disabled, [
             RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
         ])
         ) {
             $header .= '<th>'.get_lang('Choice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
         }
 
         $header .= '<th>'.get_lang('Answer').'</th>';
@@ -327,7 +328,7 @@ class MultipleAnswerTrueFalse extends Question
         if ($exercise->showExpectedChoice()) {
             $header .= '<th>'.get_lang('Status').'</th>';
         }
-        if ($exercise->feedback_type != EXERCISE_FEEDBACK_TYPE_EXAM ||
+        if ($exercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM ||
             in_array(
                 $exercise->results_disabled,
                 [

+ 2 - 2
main/exercise/oral_expression.class.php

@@ -12,8 +12,8 @@
  */
 class OralExpression extends Question
 {
-    public static $typePicture = 'audio_question.png';
-    public static $explanationLangVar = 'OralExpression';
+    public $typePicture = 'audio_question.png';
+    public $explanationLangVar = 'OralExpression';
     public $available_extensions = ['wav', 'ogg'];
     private $sessionId;
     private $userId;

+ 14 - 11
main/exercise/overview.php

@@ -15,10 +15,7 @@ require_once __DIR__.'/../inc/global.inc.php';
 $current_course_tool = TOOL_QUIZ;
 
 // Clear the exercise session just in case
-Session::erase('objExercise');
-Session::erase('calculatedAnswerId');
-Session::erase('duration_time_previous');
-Session::erase('duration_time');
+Exercise::cleanSessionVariables();
 
 $this_section = SECTION_COURSES;
 
@@ -29,7 +26,7 @@ $htmlHeadXtra[] = $js;
 api_protect_course_script(true);
 $sessionId = api_get_session_id();
 $courseCode = api_get_course_id();
-$exercise_id = isset($_REQUEST['exerciseId']) ? intval($_REQUEST['exerciseId']) : 0;
+$exercise_id = isset($_REQUEST['exerciseId']) ? (int) $_REQUEST['exerciseId'] : 0;
 
 $objExercise = new Exercise();
 $result = $objExercise->read($exercise_id, true);
@@ -286,7 +283,7 @@ if (!empty($attempts)) {
             ]
         ) || (
             $objExercise->results_disabled == RESULT_DISABLE_SHOW_SCORE_ONLY &&
-            $objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_END
+            $objExercise->getFeedbackType() == EXERCISE_FEEDBACK_TYPE_END
         )
         ) {
             if ($blockShowAnswers &&
@@ -302,6 +299,11 @@ if (!empty($attempts)) {
                 }
             }
 
+            if (!empty($objExercise->getResultAccess())) {
+                if (!$objExercise->hasResultsAccess($attempt_result)) {
+                    $attempt_link = '';
+                }
+            }
             $row['attempt_link'] = $attempt_link;
         }
         $my_attempt_array[] = $row;
@@ -355,7 +357,7 @@ if (!empty($attempts)) {
             $header_names = [get_lang('Attempt'), get_lang('StartDate'), get_lang('IP')];
             break;
         case RESULT_DISABLE_SHOW_SCORE_ONLY:
-            if ($objExercise->feedback_type != EXERCISE_FEEDBACK_TYPE_END) {
+            if ($objExercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_END) {
                 $header_names = [get_lang('Attempt'), get_lang('StartDate'), get_lang('IP'), get_lang('Score')];
             } else {
                 $header_names = [
@@ -386,10 +388,11 @@ if (!empty($attempts)) {
     $table_content = $table->toHtml();
 }
 
-if ($objExercise->selectAttempts()) {
-    $attempt_message = get_lang('Attempts').' '.$counter.' / '.$objExercise->selectAttempts();
+$selectAttempts = $objExercise->selectAttempts();
+if ($selectAttempts) {
+    $attempt_message = get_lang('Attempts').' '.$counter.' / '.$selectAttempts;
 
-    if ($counter == $objExercise->selectAttempts()) {
+    if ($counter == $selectAttempts) {
         $attempt_message = Display::return_message($attempt_message, 'error');
     } else {
         $attempt_message = Display::return_message($attempt_message, 'info');
@@ -400,7 +403,7 @@ if ($objExercise->selectAttempts()) {
 }
 
 if ($time_control) {
-    $html .= $objExercise->return_time_left_div();
+    $html .= $objExercise->returnTimeLeftDiv();
 }
 
 $html .= $message;

+ 44 - 39
main/exercise/question.class.php

@@ -33,8 +33,8 @@ abstract class Question
     public $isContent;
     public $course;
     public $feedback;
-    public static $typePicture = 'new_question.png';
-    public static $explanationLangVar = '';
+    public $typePicture = 'new_question.png';
+    public $explanationLangVar = '';
     public $question_table_class = 'table table-striped';
     public $questionTypeWithFeedback;
     public $extra;
@@ -48,7 +48,7 @@ abstract class Question
         FREE_ANSWER => ['freeanswer.class.php', 'FreeAnswer'],
         ORAL_EXPRESSION => ['oral_expression.class.php', 'OralExpression'],
         HOT_SPOT => ['hotspot.class.php', 'HotSpot'],
-        HOT_SPOT_DELINEATION => ['hotspot.class.php', 'HotspotDelineation'],
+        HOT_SPOT_DELINEATION => ['HotSpotDelineation.php', 'HotSpotDelineation'],
         MULTIPLE_ANSWER_COMBINATION => ['multiple_answer_combination.class.php', 'MultipleAnswerCombination'],
         UNIQUE_ANSWER_NO_OPTION => ['unique_answer_no_option.class.php', 'UniqueAnswerNoOption'],
         MULTIPLE_ANSWER_TRUE_FALSE => ['multiple_answer_true_false.class.php', 'MultipleAnswerTrueFalse'],
@@ -1547,7 +1547,7 @@ abstract class Question
     /**
      * @return array
      */
-    public static function get_question_type_list()
+    public static function getQuestionTypeList()
     {
         if (api_get_setting('enable_record_audio') !== 'true') {
             self::$questionTypes[ORAL_EXPRESSION] = null;
@@ -1810,37 +1810,45 @@ abstract class Question
      */
     public static function displayTypeMenu($objExercise)
     {
-        $feedback_type = $objExercise->feedback_type;
+        $feedbackType = $objExercise->getFeedbackType();
         $exerciseId = $objExercise->id;
 
         // 1. by default we show all the question types
-        $question_type_custom_list = self::get_question_type_list();
+        $questionTypeList = self::getQuestionTypeList();
 
-        if (!isset($feedback_type)) {
-            $feedback_type = 0;
+        if (!isset($feedbackType)) {
+            $feedbackType = 0;
         }
 
-        if ($feedback_type == 1) {
-            //2. but if it is a feedback DIRECT we only show the UNIQUE_ANSWER type that is currently available
-            $question_type_custom_list = [
-                UNIQUE_ANSWER => self::$questionTypes[UNIQUE_ANSWER],
-                HOT_SPOT_DELINEATION => self::$questionTypes[HOT_SPOT_DELINEATION],
-            ];
-        } else {
-            unset($question_type_custom_list[HOT_SPOT_DELINEATION]);
+        switch ($feedbackType) {
+            case EXERCISE_FEEDBACK_TYPE_DIRECT:
+                $questionTypeList = [
+                    UNIQUE_ANSWER => self::$questionTypes[UNIQUE_ANSWER],
+                    HOT_SPOT_DELINEATION => self::$questionTypes[HOT_SPOT_DELINEATION],
+                ];
+                break;
+            case EXERCISE_FEEDBACK_TYPE_POPUP:
+                $questionTypeList = [
+                    UNIQUE_ANSWER => self::$questionTypes[UNIQUE_ANSWER],
+                    MULTIPLE_ANSWER => self::$questionTypes[MULTIPLE_ANSWER],
+                    DRAGGABLE => self::$questionTypes[DRAGGABLE],
+                    HOT_SPOT_DELINEATION => self::$questionTypes[HOT_SPOT_DELINEATION],
+                    CALCULATED_ANSWER => self::$questionTypes[CALCULATED_ANSWER],
+                ];
+                break;
+            default:
+                unset($questionTypeList[HOT_SPOT_DELINEATION]);
+                break;
         }
 
         echo '<div class="panel panel-default">';
         echo '<div class="panel-body">';
         echo '<ul class="question_menu">';
-        foreach ($question_type_custom_list as $i => $a_type) {
-            // @todo remove require_once classes are already loaded using composer
-            // include the class of the type
-            require_once $a_type[0];
-            // get the picture of the type and the langvar which describes it
-            $img = $explanation = '';
-            eval('$img = '.$a_type[1].'::$typePicture;');
-            eval('$explanation = get_lang('.$a_type[1].'::$explanationLangVar);');
+        foreach ($questionTypeList as $i => $type) {
+            /** @var Question $type */
+            $type = new $type[1]();
+            $img = $type->getTypePicture();
+            $explanation = get_lang($type->getExplanation());
             echo '<li>';
             echo '<div class="icon-image">';
             $icon = '<a href="admin.php?'.api_get_cidreq().'&newQuestion=yes&answerType='.$i.'">'.
@@ -1853,7 +1861,6 @@ abstract class Question
                     $icon = Display::return_icon($img, $explanation, null, ICON_SIZE_BIG);
                 }
             }
-
             echo $icon;
             echo '</div>';
             echo '</li>';
@@ -1869,7 +1876,7 @@ abstract class Question
                 ICON_SIZE_BIG
             );
         } else {
-            if ($feedback_type == 1) {
+            if (in_array($feedbackType, [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP])) {
                 echo $url = "<a href=\"question_pool.php?".api_get_cidreq()."&type=1&fromExercise=$exerciseId\">";
             } else {
                 echo $url = '<a href="question_pool.php?'.api_get_cidreq().'&fromExercise='.$exerciseId.'">';
@@ -2198,26 +2205,24 @@ abstract class Question
     }
 
     /**
-     * @return array the image filename of the question type
+     * @return string
      */
-    public function get_type_icon_html()
+    public function getTypePicture()
     {
-        $type = $this->selectType();
-        $tabQuestionList = self::get_question_type_list(); // [0]=file to include [1]=type name
-
-        require_once $tabQuestionList[$type][0];
-
-        $img = $explanation = null;
-        eval('$img = '.$tabQuestionList[$type][1].'::$typePicture;');
-        eval('$explanation = get_lang('.$tabQuestionList[$type][1].'::$explanationLangVar);');
+        return $this->typePicture;
+    }
 
-        return [$img, $explanation];
+    /**
+     * @return string
+     */
+    public function getExplanation()
+    {
+        return $this->explanationLangVar;
     }
 
     /**
      * Get course medias.
      *
-     * @param int course id
      * @param int $course_id
      *
      * @return array
@@ -2397,7 +2402,7 @@ abstract class Question
     {
         return
             in_array($this->type, $this->questionTypeWithFeedback) &&
-            $exercise->feedback_type != EXERCISE_FEEDBACK_TYPE_EXAM;
+            $exercise->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM;
     }
 
     /**

+ 1 - 1
main/exercise/question_admin.inc.php

@@ -32,7 +32,7 @@ if (is_object($objQuestion)) {
         $type = $_REQUEST['answerType'];
     }
 
-    $typesInformation = Question::get_question_type_list();
+    $typesInformation = Question::getQuestionTypeList();
     $form_title_extra = isset($typesInformation[$type][1]) ? get_lang($typesInformation[$type][1]) : null;
 
     $code = '';

+ 2 - 2
main/exercise/question_create.php

@@ -31,7 +31,7 @@ $form = new FormValidator('add_question', 'post', api_get_self().'?'.api_get_cid
 // form title
 $form->addElement('header', '', get_lang('AddQuestionToExercise'));
 
-$question_list = Question::get_question_type_list();
+$question_list = Question::getQuestionTypeList();
 $question_list_options = [];
 foreach ($question_list as $key => $value) {
     $question_list_options[$key] = addslashes(get_lang($value[1]));
@@ -117,7 +117,7 @@ if ($form->validate()) {
 
 function check_question_type($parameter)
 {
-    $question_list = Question::get_question_type_list();
+    $question_list = Question::getQuestionTypeList();
     foreach ($question_list as $key => $value) {
         $valid_question_types[] = $key;
     }

+ 15 - 9
main/exercise/question_list_admin.inc.php

@@ -43,7 +43,6 @@ $ajax_url = api_get_path(WEB_AJAX_PATH).'exercise.ajax.php?'.api_get_cidreq().'&
         <?php echo get_lang('AreYouSureToDelete'); ?>
     </p>
 </div>
-
 <script>
     $(function () {
         $("#dialog:ui-dialog").dialog("destroy");
@@ -60,12 +59,12 @@ $ajax_url = api_get_path(WEB_AJAX_PATH).'exercise.ajax.php?'.api_get_cidreq().'&
             $("#dialog-confirm").dialog({
                 modal: true,
                 buttons: {
-                    "<?php echo get_lang("Yes"); ?>": function () {
+                    "<?php echo get_lang('Yes'); ?>": function () {
                         location.href = targetUrl;
                         $(this).dialog("close");
 
                     },
-                    "<?php echo get_lang("No"); ?>": function () {
+                    "<?php echo get_lang('No'); ?>": function () {
                         $(this).dialog("close");
                     }
                 }
@@ -148,7 +147,7 @@ $ajax_url = api_get_path(WEB_AJAX_PATH).'exercise.ajax.php?'.api_get_cidreq().'&
 </script>
 <?php
 
-//we filter the type of questions we can add
+// Filter the type of questions we can add
 Question::displayTypeMenu($objExercise);
 
 echo '<div id="message"></div>';
@@ -217,13 +216,17 @@ if (!$inATest) {
 
         if (is_array($questionList)) {
             foreach ($questionList as $id) {
-                //To avoid warning messages
+                // To avoid warning messages.
                 if (!is_numeric($id)) {
                     continue;
                 }
                 /** @var Question $objQuestionTmp */
                 $objQuestionTmp = Question::read($id);
 
+                if (empty($objQuestionTmp)) {
+                    continue;
+                }
+
                 $clone_link = Display::url(
                     Display::return_icon(
                         'cd.png',
@@ -234,7 +237,8 @@ if (!$inATest) {
                     api_get_self().'?'.api_get_cidreq().'&clone_question='.$id.'&page='.$page,
                     ['class' => 'btn btn-default btn-sm']
                 );
-                $edit_link = $objQuestionTmp->type == CALCULATED_ANSWER && $objQuestionTmp->isAnswered()
+
+                $edit_link = $objQuestionTmp->selectType() == CALCULATED_ANSWER && $objQuestionTmp->isAnswered()
                     ? Display::span(
                         Display::return_icon(
                             'edit_na.png',
@@ -304,7 +308,9 @@ if (!$inATest) {
                     </a>';
 
                 // Question type
-                list($typeImg, $typeExpl) = $objQuestionTmp->get_type_icon_html();
+                $typeImg = $objQuestionTmp->getTypePicture();
+                $typeExpl = $objQuestionTmp->getExplanation();
+
                 $questionType = Display::return_icon($typeImg, $typeExpl);
 
                 // Question category
@@ -312,11 +318,11 @@ if (!$inATest) {
                     TestCategory::getCategoryNameForQuestion($objQuestionTmp->id)
                 );
                 if (empty($txtQuestionCat)) {
-                    $txtQuestionCat = "-";
+                    $txtQuestionCat = '-';
                 }
 
                 // Question level
-                $txtQuestionLevel = $objQuestionTmp->level;
+                $txtQuestionLevel = $objQuestionTmp->getLevel();
                 if (empty($objQuestionTmp->level)) {
                     $txtQuestionLevel = '-';
                 }

+ 10 - 5
main/exercise/question_pool.php

@@ -472,13 +472,16 @@ $select_difficulty_html = Display::select(
 echo Display::form_row(get_lang('Difficulty'), $select_difficulty_html);
 
 // Answer type
-$question_list = Question::get_question_type_list();
+$question_list = Question::getQuestionTypeList();
 
 $new_question_list = [];
 $new_question_list['-1'] = get_lang('All');
 if (!empty($_course)) {
     foreach ($question_list as $key => $item) {
-        if ($objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_DIRECT) {
+        if (in_array(
+            $objExercise->getFeedbackType(),
+            [EXERCISE_FEEDBACK_TYPE_DIRECT, EXERCISE_FEEDBACK_TYPE_POPUP]
+        )) {
             if (!in_array($key, [HOT_SPOT_DELINEATION, UNIQUE_ANSWER])) {
                 continue;
             }
@@ -1174,10 +1177,12 @@ function get_action_icon_for_question(
 function get_question_type_for_question($in_selectedcourse, $in_questionid)
 {
     $courseInfo = api_get_course_info_by_id($in_selectedcourse);
-    $myObjQuestion = Question::read($in_questionid, $courseInfo);
+    $question = Question::read($in_questionid, $courseInfo);
     $questionType = null;
-    if (!empty($myObjQuestion)) {
-        list($typeImg, $typeExpl) = $myObjQuestion->get_type_icon_html();
+    if (!empty($question)) {
+        $typeImg = $question->getTypePicture();
+        $typeExpl = $question->getExplanation();
+
         $questionType = Display::tag('div', Display::return_icon($typeImg, $typeExpl, [], 32), []);
     }
 

+ 8 - 1
main/exercise/result.php

@@ -10,7 +10,7 @@ use ChamiloSession as Session;
  */
 require_once __DIR__.'/../inc/global.inc.php';
 
-$id = isset($_REQUEST['id']) ? (int) $_GET['id'] : null; //exe id
+$id = isset($_REQUEST['id']) ? (int) $_GET['id'] : 0; // exe id
 $show_headers = isset($_REQUEST['show_headers']) ? (int) $_REQUEST['show_headers'] : null;
 $origin = api_get_origin();
 
@@ -58,6 +58,13 @@ $htmlHeadXtra[] = '<link rel="stylesheet" href="'.api_get_path(WEB_LIBRARY_JS_PA
 $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'hotspot/js/hotspot.js"></script>';
 $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'annotation/js/annotation.js"></script>';
 
+if (!empty($objExercise->getResultAccess())) {
+    $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/epiclock/renderers/minute/epiclock.minute.css');
+    $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js');
+    $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.epiclock.min.js');
+    $htmlHeadXtra[] = api_get_js('epiclock/renderers/minute/epiclock.minute.js');
+}
+
 if ($show_headers) {
     $interbreadcrumb[] = [
         'url' => 'exercise.php?'.api_get_cidreq(),

+ 79 - 68
main/exercise/unique_answer.class.php

@@ -18,8 +18,8 @@ use ChamiloSession as Session;
  */
 class UniqueAnswer extends Question
 {
-    public static $typePicture = 'mcua.png';
-    public static $explanationLangVar = 'UniqueSelect';
+    public $typePicture = 'mcua.png';
+    public $explanationLangVar = 'UniqueSelect';
 
     /**
      * Constructor.
@@ -37,6 +37,7 @@ class UniqueAnswer extends Question
     public function createAnswersForm($form)
     {
         // Getting the exercise list
+        /** @var Exercise $obj_ex */
         $obj_ex = Session::read('objExercise');
 
         $editor_config = [
@@ -50,20 +51,19 @@ class UniqueAnswer extends Question
         $nb_answers = isset($_POST['nb_answers']) ? (int) $_POST['nb_answers'] : 4;
         $nb_answers += (isset($_POST['lessAnswers']) ? -1 : (isset($_POST['moreAnswers']) ? 1 : 0));
 
-        /*
-          Types of Feedback
-          $feedback_option[0]=get_lang('Feedback');
-          $feedback_option[1]=get_lang('DirectFeedback');
-          $feedback_option[2]=get_lang('NoFeedback');
-         */
-
         $feedback_title = '';
-        if ($obj_ex->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
-            //Scenario
-            $comment_title = '<th width="20%">'.get_lang('Comment').'</th>';
-            $feedback_title = '<th width="20%">'.get_lang('Scenario').'</th>';
-        } else {
-            $comment_title = '<th width="40%">'.get_lang('Comment').'</th>';
+        switch ($obj_ex->getFeedbackType()) {
+            case EXERCISE_FEEDBACK_TYPE_DIRECT:
+                // Scenario
+                $comment_title = '<th width="20%">'.get_lang('Comment').'</th>';
+                $feedback_title = '<th width="20%">'.get_lang('Scenario').'</th>';
+                break;
+            case EXERCISE_FEEDBACK_TYPE_POPUP:
+                $comment_title = '<th width="20%">'.get_lang('Comment').'</th>';
+                break;
+            default:
+                $comment_title = '<th width="40%">'.get_lang('Comment').'</th>';
+                break;
         }
 
         $html = '<table class="table table-striped table-hover">
@@ -93,8 +93,8 @@ class UniqueAnswer extends Question
         }
         $form->addElement('hidden', 'nb_answers');
 
-        //Feedback SELECT
-        $question_list = $obj_ex->selectQuestionList();
+        $obj_ex->setQuestionList(true);
+        $question_list = $obj_ex->getQuestionList();
         $select_question = [];
         $select_question[0] = get_lang('SelectTargetQuestion');
         if (is_array($question_list)) {
@@ -218,52 +218,14 @@ class UniqueAnswer extends Question
                 'required'
             );
 
-            if ($obj_ex->selectFeedbackType() == EXERCISE_FEEDBACK_TYPE_DIRECT) {
-                $form->addHtmlEditor(
-                    'comment['.$i.']',
-                    null,
-                    null,
-                    false,
-                    $editor_config
-                );
-                // Direct feedback
-                //Adding extra feedback fields
-                $group = [];
-                $group['try'.$i] = $form->createElement(
-                    'checkbox',
-                    'try'.$i,
-                    null,
-                    get_lang('TryAgain')
-                );
-                $group['lp'.$i] = $form->createElement(
-                    'select',
-                    'lp'.$i,
-                    get_lang('SeeTheory').': ',
-                    $select_lp_id
-                );
-                $group['destination'.$i] = $form->createElement(
-                    'select',
-                    'destination'.$i,
-                    get_lang('GoToQuestion').': ',
-                    $select_question
-                );
-                $group['url'.$i] = $form->createElement(
-                    'text',
-                    'url'.$i,
-                    get_lang('Other').': ',
-                    [
-                        'class' => 'col-md-2',
-                        'placeholder' => get_lang('Other'),
-                    ]
-                );
-                $form->addGroup($group, 'scenario');
-
-                $renderer->setElementTemplate(
-                    '<td><!-- BEGIN error --><span class="form_error">{error}</span><!-- END error --><br/>{element}',
-                    'scenario'
-                );
-            } else {
-                $form->addHtmlEditor('comment['.$i.']', null, null, false, $editor_config);
+            switch ($obj_ex->getFeedbackType()) {
+                case EXERCISE_FEEDBACK_TYPE_DIRECT:
+                    $this->setDirectOptions($i, $form, $renderer, $select_lp_id, $select_question);
+                    break;
+                case EXERCISE_FEEDBACK_TYPE_POPUP:
+                default:
+                    $form->addHtmlEditor('comment['.$i.']', null, null, false, $editor_config);
+                    break;
             }
             $form->addText('weighting['.$i.']', null, null, ['value' => '0']);
             $form->addHtml('</tr>');
@@ -314,6 +276,59 @@ class UniqueAnswer extends Question
         $form->setConstants(['nb_answers' => $nb_answers]);
     }
 
+    public function setDirectOptions($i, FormValidator $form, $renderer, $select_lp_id, $select_question)
+    {
+        $editor_config = [
+            'ToolbarSet' => 'TestProposedAnswer',
+            'Width' => '100%',
+            'Height' => '125',
+        ];
+
+        $form->addHtmlEditor(
+            'comment['.$i.']',
+            null,
+            null,
+            false,
+            $editor_config
+        );
+        // Direct feedback
+        //Adding extra feedback fields
+        $group = [];
+        $group['try'.$i] = $form->createElement(
+            'checkbox',
+            'try'.$i,
+            null,
+            get_lang('TryAgain')
+        );
+        $group['lp'.$i] = $form->createElement(
+            'select',
+            'lp'.$i,
+            get_lang('SeeTheory').': ',
+            $select_lp_id
+        );
+        $group['destination'.$i] = $form->createElement(
+            'select',
+            'destination'.$i,
+            get_lang('GoToQuestion').': ',
+            $select_question
+        );
+        $group['url'.$i] = $form->createElement(
+            'text',
+            'url'.$i,
+            get_lang('Other').': ',
+            [
+                'class' => 'col-md-2',
+                'placeholder' => get_lang('Other'),
+            ]
+        );
+        $form->addGroup($group, 'scenario');
+
+        $renderer->setElementTemplate(
+            '<td><!-- BEGIN error --><span class="form_error">{error}</span><!-- END error --><br/>{element}',
+            'scenario'
+        );
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -414,11 +429,7 @@ class UniqueAnswer extends Question
         $header .= '<table class="'.$this->question_table_class.'"><tr>';
 
         $header .= '<th>'.get_lang('Choice').'</th>';
-        if (!in_array($exercise->results_disabled, [
-            RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
-        ])
-        ) {
+        if ($exercise->showExpectedChoiceColumn()) {
             $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
         }
 

+ 6 - 5
main/exercise/unique_answer_no_option.class.php

@@ -15,8 +15,8 @@ use ChamiloSession as Session;
  */
 class UniqueAnswerNoOption extends Question
 {
-    public static $typePicture = 'mcuao.png';
-    public static $explanationLangVar = 'UniqueAnswerNoOption';
+    public $typePicture = 'mcuao.png';
+    public $explanationLangVar = 'UniqueAnswerNoOption';
 
     /**
      * Constructor.
@@ -54,7 +54,7 @@ class UniqueAnswerNoOption extends Question
          */
 
         $feedback_title = '';
-        if ($obj_ex->selectFeedbackType() == 1) {
+        if ($obj_ex->getFeedbackType() == 1) {
             $editor_config['Width'] = '250';
             $editor_config['Height'] = '110';
             $comment_title = '<th width="50%" >'.get_lang('Comment').'</th>';
@@ -406,11 +406,12 @@ class UniqueAnswerNoOption extends Question
 
         if (!in_array($exercise->results_disabled, [
             RESULT_DISABLE_SHOW_ONLY_IN_CORRECT_ANSWER,
-            //RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS_AND_RANKING,
         ])
         ) {
             $header .= '<th>'.get_lang('Choice').'</th>';
-            $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            if ($exercise->showExpectedChoiceColumn()) {
+                $header .= '<th>'.get_lang('ExpectedChoice').'</th>';
+            }
         }
         $header .= '<th>'.get_lang('Answer').'</th>';
         if ($exercise->showExpectedChoice()) {

+ 1 - 1
main/extra/myStudents.php

@@ -188,7 +188,7 @@ $course_quiz_answer = 'quiz_answer';
 $course_student_publication = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
 $TABLECALHORAIRE = Database:: get_course_table(TABLE_CAL_HORAIRE);
 
-if (isset($_GET['user_id']) && $_GET['user_id'] != "") {
+if (isset($_GET['user_id']) && $_GET['user_id'] != '') {
     $user_id = intval($_GET['user_id']);
 } else {
     $user_id = api_get_user_id();

+ 90 - 78
main/forum/forumfunction.inc.php

@@ -99,7 +99,7 @@ function handle_forum_and_forumcategories($lp_id = null)
     $get_content = isset($_GET['content']) ? $_GET['content'] : '';
     $post_submit_cat = isset($_POST['SubmitForumCategory']) ? true : false;
     $post_submit_forum = isset($_POST['SubmitForum']) ? true : false;
-    $get_id = isset($_GET['id']) ? intval($_GET['id']) : '';
+    $get_id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
     $forum_categories_list = get_forum_categories();
 
     // Verify if forum category exists
@@ -110,23 +110,23 @@ function handle_forum_and_forumcategories($lp_id = null)
     $content = '';
 
     // Adding a forum category
-    if (($action_forum_cat == 'add' && $get_content == 'forumcategory') || $post_submit_cat) {
+    if (($action_forum_cat === 'add' && $get_content === 'forumcategory') || $post_submit_cat) {
         $content = show_add_forumcategory_form([], $lp_id); //$lp_id when is called from learning path
     }
 
     // Adding a forum
-    if ((($action_forum_cat == 'add' || $action_forum_cat == 'edit') && $get_content == 'forum') ||
+    if ((($action_forum_cat === 'add' || $action_forum_cat === 'edit') && $get_content === 'forum') ||
         $post_submit_forum
     ) {
         $inputvalues = [];
-        if ($action_forum_cat == 'edit' && $get_id || $post_submit_forum) {
+        if ($action_forum_cat === 'edit' && $get_id || $post_submit_forum) {
             $inputvalues = get_forums($get_id);
         }
         $content = show_add_forum_form($inputvalues, $lp_id);
     }
 
     // Edit a forum category
-    if (($action_forum_cat == 'edit' && $get_content == 'forumcategory') ||
+    if (($action_forum_cat === 'edit' && $get_content === 'forumcategory') ||
     (isset($_POST['SubmitEditForumCategory'])) ? true : false
     ) {
         $forum_category = get_forum_categories($get_id);
@@ -134,10 +134,8 @@ function handle_forum_and_forumcategories($lp_id = null)
     }
 
     // Delete a forum category
-    if ($action_forum_cat == 'delete') {
-        $id_forum = intval($get_id);
-        $list_threads = get_threads($id_forum);
-
+    if ($action_forum_cat === 'delete') {
+        $list_threads = get_threads($get_id);
         for ($i = 0; $i < count($list_threads); $i++) {
             deleteForumCategoryThread('thread', $list_threads[$i]['thread_id']);
             $link_info = GradebookUtils::isResourceInCourseGradebook(
@@ -154,21 +152,21 @@ function handle_forum_and_forumcategories($lp_id = null)
     }
 
     // Change visibility of a forum or a forum category.
-    if ($action_forum_cat == 'invisible' || $action_forum_cat == 'visible') {
+    if ($action_forum_cat === 'invisible' || $action_forum_cat === 'visible') {
         $return_message = change_visibility($get_content, $get_id, $action_forum_cat);
         Display::addFlash(
             Display::return_message($return_message, 'confirmation', false)
         );
     }
     // Change lock status of a forum or a forum category.
-    if ($action_forum_cat == 'lock' || $action_forum_cat == 'unlock') {
+    if ($action_forum_cat === 'lock' || $action_forum_cat === 'unlock') {
         $return_message = change_lock_status($get_content, $get_id, $action_forum_cat);
         Display::addFlash(
             Display::return_message($return_message, 'confirmation', false)
         );
     }
     // Move a forum or a forum category.
-    if ($action_forum_cat == 'move' && isset($_GET['direction'])) {
+    if ($action_forum_cat === 'move' && isset($_GET['direction'])) {
         $return_message = move_up_down($get_content, $_GET['direction'], $get_id);
         Display::addFlash(
             Display::return_message($return_message, 'confirmation', false)
@@ -267,14 +265,14 @@ function show_add_forum_form($inputvalues = [], $lp_id)
         $form_title = get_lang('EditForum');
     }
 
-    $form->addElement('header', $form_title);
+    $form->addHeader($form_title);
 
     // We have a hidden field if we are editing.
     if (!empty($inputvalues) && is_array($inputvalues)) {
         $my_forum_id = isset($inputvalues['forum_id']) ? $inputvalues['forum_id'] : null;
         $form->addElement('hidden', 'forum_id', $my_forum_id);
     }
-    $lp_id = intval($lp_id);
+    $lp_id = (int) $lp_id;
 
     // hidden field if from learning path
     $form->addElement('hidden', 'lp_id', $lp_id);
@@ -892,7 +890,6 @@ function store_forum($values, $courseInfo = [], $returnId = false)
         $logInfo = [
             'tool' => TOOL_FORUM,
             'tool_id' => $values['forum_id'],
-            'tool_id_detail' => 0,
             'action' => 'update-forum',
             'action_details' => 'forum',
             'info' => $values['forum_title'],
@@ -921,7 +918,7 @@ function store_forum($values, $courseInfo = [], $returnId = false)
             'end_time' => !empty($values['end_time']) ? api_get_utc_datetime($values['end_time']) : null,
             'forum_order' => isset($new_max) ? $new_max : null,
             'session_id' => $session_id,
-            'lp_id' => isset($values['lp_id']) ? intval($values['lp_id']) : 0,
+            'lp_id' => isset($values['lp_id']) ? (int) $values['lp_id'] : 0,
             'locked' => 0,
             'forum_id' => 0,
         ];
@@ -930,6 +927,25 @@ function store_forum($values, $courseInfo = [], $returnId = false)
         if ($forumId > 0) {
             $sql = "UPDATE $table_forums SET forum_id = iid WHERE iid = $forumId";
             Database::query($sql);
+            $courseCode = $courseInfo['code'];
+            $subscribe = (int) api_get_course_setting('subscribe_users_to_forum_notifications', $courseCode);
+
+            $status = STUDENT;
+            if (!empty($session_id)) {
+                $status = 0;
+            }
+            if ($subscribe === 1) {
+                $userList = CourseManager::get_user_list_from_course_code(
+                    $courseCode,
+                    $session_id,
+                    null,
+                    null,
+                    $status
+                );
+                foreach ($userList as $userInfo) {
+                    set_notification('forum', $forumId, false, $userInfo, $courseInfo);
+                }
+            }
 
             api_item_property_update(
                 $courseInfo,
@@ -950,7 +966,6 @@ function store_forum($values, $courseInfo = [], $returnId = false)
             $logInfo = [
                 'tool' => TOOL_FORUM,
                 'tool_id' => $forumId,
-                'tool_id_detail' => 0,
                 'action' => 'new-forum',
                 'action_details' => 'forum',
                 'info' => $values['forum_title'],
@@ -999,7 +1014,7 @@ function deleteForumCategoryThread($content, $id)
     $groupId = api_get_group_id();
     $groupInfo = GroupManager::get_group_properties($groupId);
     $userId = api_get_user_id();
-    $id = intval($id);
+    $id = (int) $id;
 
     // Delete all attachment file about this tread id.
     $sql = "SELECT post_id FROM $table_forums_post
@@ -1011,7 +1026,7 @@ function deleteForumCategoryThread($content, $id)
 
     $tool_constant = null;
     $return_message = '';
-    if ($content == 'forumcategory') {
+    if ($content === 'forumcategory') {
         $tool_constant = TOOL_FORUM_CATEGORY;
         $return_message = get_lang('ForumCategoryDeleted');
 
@@ -1033,7 +1048,7 @@ function deleteForumCategoryThread($content, $id)
         }
     }
 
-    if ($content == 'forum') {
+    if ($content === 'forum') {
         $tool_constant = TOOL_FORUM;
         $return_message = get_lang('ForumDeleted');
 
@@ -1055,7 +1070,7 @@ function deleteForumCategoryThread($content, $id)
         }
     }
 
-    if ($content == 'thread') {
+    if ($content === 'thread') {
         $tool_constant = TOOL_FORUM_THREAD;
         $return_message = get_lang('ThreadDeleted');
         Skill::deleteSkillsFromItem($id, ITEM_TYPE_FORUM_THREAD);
@@ -2279,7 +2294,7 @@ function getPosts(
                 $postInfo['username_canonical'] = $user->getUsernameCanonical();
                 $postInfo['lastname'] = $user->getLastname();
                 $postInfo['firstname'] = $user->getFirstname();
-                $postInfo['complete_name'] = $user->getCompleteName();
+                $postInfo['complete_name'] = UserManager::formatUserFullName($user);
             }
         }
 
@@ -5621,58 +5636,68 @@ function get_forums_of_group($groupInfo)
 /**
  * This function stores which users have to be notified of which forums or threads.
  *
- * @param string $content does the user want to be notified about a forum or about a thread
- * @param int    $id      the id of the forum or thread
+ * @param string $content    does the user want to be notified about a forum or about a thread
+ * @param int    $id         the id of the forum or thread
+ * @param bool   $addOnly
+ * @param array  $userInfo
+ * @param array  $courseInfo
  *
  * @return string language variable
  *
- * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
- *
- * @version May 2008, dokeos 1.8.5
+ * @author  Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
+ * @author  Julio Montoya
  *
- * @since May 2008, dokeos 1.8.5
+ * @since   May 2008 v1.8.5
  */
-function set_notification($content, $id, $add_only = false)
+function set_notification($content, $id, $addOnly = false, $userInfo = [], $courseInfo = [])
 {
-    $_user = api_get_user_info();
+    $userInfo = empty($userInfo) ? api_get_user_info() : $userInfo;
+    $courseInfo = empty($courseInfo) ? api_get_course_info() : $courseInfo;
+    $id = (int) $id;
+
+    if (empty($userInfo) || empty($courseInfo) || empty($id) || empty($content)) {
+        return false;
+    }
+
     // Database table definition
     $table_notification = Database::get_course_table(TABLE_FORUM_NOTIFICATION);
 
-    $course_id = api_get_course_int_id();
+    $course_id = $courseInfo['real_id'];
 
     // Which database field do we have to store the id in?
-    if ($content == 'forum') {
-        $database_field = 'forum_id';
-    } else {
-        $database_field = 'thread_id';
+    $field = 'thread_id';
+    if ($content === 'forum') {
+        $field = 'forum_id';
     }
 
+    $userId = $userInfo['user_id'];
+
     // First we check if the notification is already set for this.
     $sql = "SELECT * FROM $table_notification
             WHERE
                 c_id = $course_id AND
-                $database_field = '".Database::escape_string($id)."' AND
-                user_id = '".intval($_user['user_id'])."'";
+                $field = $id AND
+                user_id = $userId ";
     $result = Database::query($sql);
     $total = Database::num_rows($result);
 
     // If the user did not indicate that (s)he wanted to be notified already
     // then we store the notification request (to prevent double notification requests).
     if ($total <= 0) {
-        $sql = "INSERT INTO $table_notification (c_id, $database_field, user_id)
-                VALUES (".$course_id.", '".Database::escape_string($id)."','".intval($_user['user_id'])."')";
+        $sql = "INSERT INTO $table_notification (c_id, $field, user_id)
+                VALUES ($course_id, '$id','$userId')";
         Database::query($sql);
         Session::erase('forum_notification');
         getNotificationsPerUser(0, true);
 
         return get_lang('YouWillBeNotifiedOfNewPosts');
     } else {
-        if (!$add_only) {
+        if (!$addOnly) {
             $sql = "DELETE FROM $table_notification
                     WHERE
                         c_id = $course_id AND
-                        $database_field = '".Database::escape_string($id)."' AND
-                        user_id = '".intval($_user['user_id'])."'";
+                        $field = $id AND
+                        user_id = $userId ";
             Database::query($sql);
             Session::erase('forum_notification');
             getNotificationsPerUser(0, true);
@@ -5692,6 +5717,7 @@ function set_notification($content, $id, $add_only = false)
  * @return array returns
  *
  * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
+ * @author Julio Montoya
  *
  * @version May 2008, dokeos 1.8.5
  *
@@ -5705,18 +5731,19 @@ function get_notifications($content, $id)
     $course_id = api_get_course_int_id();
 
     // Which database field contains the notification?
-    if ($content == 'forum') {
-        $database_field = 'forum_id';
-    } else {
-        $database_field = 'thread_id';
+    $field = 'thread_id';
+    if ($content === 'forum') {
+        $field = 'forum_id';
     }
 
+    $id = (int) $id;
+
     $sql = "SELECT user.user_id, user.firstname, user.lastname, user.email, user.user_id user
             FROM $table_users user, $table_notification notification
             WHERE 
                 notification.c_id = $course_id AND user.active = 1 AND
                 user.user_id = notification.user_id AND
-                notification.$database_field= '".Database::escape_string($id)."'";
+                notification.$field = $id ";
 
     $result = Database::query($sql);
     $return = [];
@@ -5746,20 +5773,7 @@ function get_notifications($content, $id)
  */
 function send_notifications($forum_id = 0, $thread_id = 0, $post_id = 0)
 {
-    //$_course = api_get_course_info();
-
-    /*$forumCourseId = api_get_configuration_value('global_forums_course_id');
-    if (!empty($forumCourseId)) {
-        if ($_course['real_id'] == $forumCourseId) {
-            return false;
-        }
-    }*/
-
     $forum_id = (int) $forum_id;
-
-    // The content of the mail
-    //$thread_link = api_get_path(WEB_CODE_PATH).'forum/viewthread.php?'.api_get_cidreq().'&forum='.$forum_id.'&thread='.$thread_id;
-
     // Users who subscribed to the forum
     if ($forum_id != 0) {
         $users_to_be_notified_by_forum = get_notifications('forum', $forum_id);
@@ -5768,8 +5782,6 @@ function send_notifications($forum_id = 0, $thread_id = 0, $post_id = 0)
     }
 
     $current_thread = get_thread_information($forum_id, $thread_id);
-    //$current_forum = get_forum_information($current_thread['forum_id']);
-    //$subject = get_lang('NewForumPost').' - '.$_course['official_code'].' - '.$current_forum['forum_title'].' - '.$current_thread['thread_title'];
 
     // User who subscribed to the thread
     if ($thread_id != 0) {
@@ -6225,8 +6237,8 @@ function editAttachedFile($array, $id, $courseId = null)
 {
     // Init variables
     $setString = '';
-    $id = intval($id);
-    $courseId = intval($courseId);
+    $id = (int) $id;
+    $courseId = (int) $courseId;
     if (empty($courseId)) {
         // $courseId can be null, use api method
         $courseId = api_get_course_int_id();
@@ -6274,8 +6286,7 @@ function editAttachedFile($array, $id, $courseId = null)
  */
 function getAttachmentsAjaxTable($postId = 0)
 {
-    // Init variables
-    $postId = intval($postId);
+    $postId = (int) $postId;
     $courseId = api_get_course_int_id();
     $attachIds = getAttachmentIdsByPostId($postId, $courseId);
     $fileDataContent = '';
@@ -6354,10 +6365,10 @@ function getAttachedFiles(
     $attachId = 0,
     $courseId = 0
 ) {
-    $forumId = intval($forumId);
-    $courseId = intval($courseId);
-    $attachId = intval($attachId);
-    $postId = intval($postId);
+    $forumId = (int) $forumId;
+    $courseId = (int) $courseId;
+    $attachId = (int) $attachId;
+    $postId = (int) $postId;
     $threadId = !empty($threadId) ? intval($threadId) : isset($_REQUEST['thread']) ? intval($_REQUEST['thread']) : '';
     if (empty($courseId)) {
         // $courseId can be null, use api method
@@ -6365,7 +6376,7 @@ function getAttachedFiles(
     }
     if (empty($forumId)) {
         if (!empty($_REQUEST['forum'])) {
-            $forumId = intval($_REQUEST['forum']);
+            $forumId = (int) $_REQUEST['forum'];
         } else {
             // if forum ID is empty, cannot generate delete url
 
@@ -6435,11 +6446,11 @@ function getAttachedFiles(
  *
  * @return array
  */
-function clearAttachedFiles($postId = null, $courseId = null)
+function clearAttachedFiles($postId = 0, $courseId = 0)
 {
     // Init variables
-    $courseId = intval($courseId);
-    $postId = intval($postId);
+    $courseId = (int) $courseId;
+    $postId = (int) $postId;
     $array = [];
     if (empty($courseId)) {
         // $courseId can be null, use api method
@@ -6485,8 +6496,8 @@ function clearAttachedFiles($postId = null, $courseId = null)
 function getAttachmentIdsByPostId($postId, $courseId = 0)
 {
     $array = [];
-    $courseId = intval($courseId);
-    $postId = intval($postId);
+    $courseId = (int) $courseId;
+    $postId = (int) $postId;
     if (empty($courseId)) {
         // $courseId can be null, use api method
         $courseId = api_get_course_int_id();
@@ -6517,7 +6528,8 @@ function getAttachmentIdsByPostId($postId, $courseId = 0)
  */
 function getForumCategoryByTitle($title, $courseId, $sessionId = 0)
 {
-    $sessionId = intval($sessionId);
+    $sessionId = (int) $sessionId;
+    $courseId = (int) $courseId;
     $forumCategoryTable = Database::get_course_table(TABLE_FORUM_CATEGORY);
     $itemProperty = Database::get_course_table(TABLE_ITEM_PROPERTY);
 
@@ -6547,7 +6559,7 @@ function getForumCategoryByTitle($title, $courseId, $sessionId = 0)
                 'ip.tool = ? AND ' => TOOL_FORUM_CATEGORY,
                 'fc.session_id = ? AND ' => $sessionId,
                 'fc.cat_title = ? AND ' => $title,
-                'fc.c_id = ?' => intval($courseId),
+                'fc.c_id = ?' => $courseId,
             ],
         ],
         'first'

+ 6 - 9
main/forum/index.php

@@ -62,9 +62,9 @@ if (api_is_in_gradebook()) {
 $search_forum = isset($_GET['search']) ? Security::remove_XSS($_GET['search']) : '';
 
 /* ACTIONS */
-$actions = isset($_GET['action']) ? $_GET['action'] : '';
+$action = isset($_GET['action']) ? $_GET['action'] : '';
 
-if ($actions === 'add') {
+if ($action === 'add') {
     switch ($_GET['content']) {
         case 'forum':
             $interbreadcrumb[] = [
@@ -102,12 +102,12 @@ $form_count = 0;
 $formContent = '';
 if (api_is_allowed_to_edit(false, true)) {
     //if is called from a learning path lp_id
-    $lp_id = isset($_REQUEST['lp_id']) ? intval($_REQUEST['lp_id']) : null;
+    $lp_id = isset($_REQUEST['lp_id']) ? (int) $_REQUEST['lp_id'] : null;
     $formContent = handle_forum_and_forumcategories($lp_id);
 }
 
 // Notification
-if ($actions == 'notify' && isset($_GET['content']) && isset($_GET['id'])) {
+if ($action == 'notify' && isset($_GET['content']) && isset($_GET['id'])) {
     if (api_get_session_id() != 0 &&
         api_is_allowed_to_session_edit(false, true) == false
     ) {
@@ -120,14 +120,11 @@ if ($actions == 'notify' && isset($_GET['content']) && isset($_GET['id'])) {
 get_whats_new();
 $whatsnew_post_info = Session::read('whatsnew_post_info');
 
-/* TRACKING */
 Event::event_access_tool(TOOL_FORUM);
 
 $logInfo = [
     'tool' => TOOL_FORUM,
-    'tool_id' => 0,
-    'tool_id_detail' => 0,
-    'action' => !empty($actions) ? $actions : 'list-category',
+    'action' => !empty($action) ? $action : 'list-category',
     'action_details' => isset($_GET['content']) ? $_GET['content'] : '',
 ];
 Event::registerLog($logInfo);
@@ -557,7 +554,7 @@ if (is_array($forumCategories)) {
                             }
                         }
 
-                        if (!api_is_anonymous() && api_is_allowed_to_session_edit(false, true) && $hideNotifications == false) {
+                        if ($hideNotifications == false && !api_is_anonymous() && api_is_allowed_to_session_edit(false, true)) {
                             $toolActions .= '<a href="'.api_get_self().'?'.api_get_cidreq()
                                 .'&action=notify&content=forum&id='.$forum['forum_id'].'">'
                                 .Display::return_icon($iconnotify, get_lang('NotifyMe'), null, ICON_SIZE_SMALL)

+ 2 - 3
main/gamification/my_progress.php

@@ -105,9 +105,10 @@ if ($currentSession) {
             'stats' => [],
         ];
 
+        $courseInfo = api_get_course_info($course->getCode());
         $learningPathList = new LearnpathList(
             $user->getId(),
-            $course->getCode(),
+            $courseInfo,
             $currentSession->getId()
         );
 
@@ -123,10 +124,8 @@ if ($currentSession) {
                 ]).api_get_cidreq(),
             ];
         }
-
         $sessionData[$course->getId()] = $courseData;
     }
-
     $template->assign('session_data', $sessionData);
 }
 

部分文件因为文件数量过多而无法显示