qti 2.2.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/qti.rb +1 -0
  3. data/lib/qti/models/assessment_meta.rb +16 -12
  4. data/lib/qti/models/resource.rb +26 -2
  5. data/lib/qti/v1/models/assessment_item.rb +4 -0
  6. data/lib/qti/v1/models/interactions/base_fill_blank_interaction.rb +33 -1
  7. data/lib/qti/v1/models/interactions/canvas_multiple_dropdown.rb +2 -29
  8. data/lib/qti/v1/models/object_bank.rb +14 -0
  9. data/lib/qti/version.rb +1 -1
  10. data/spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml +244 -0
  11. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +0 -0
  12. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +0 -0
  13. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/imsmanifest.xml +0 -0
  14. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  15. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  16. data/spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml +39 -0
  17. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml +69 -0
  18. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml +99 -0
  19. data/spec/fixtures/with_banks/imsmanifest.xml +54 -0
  20. data/spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti +85 -0
  21. data/spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti +107 -0
  22. data/spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti +59 -0
  23. data/spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti +145 -0
  24. data/spec/lib/qti/models/assessment_meta_spec.rb +39 -1
  25. data/spec/lib/qti/models/resource_spec.rb +14 -0
  26. data/spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb +146 -0
  27. data/spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb +0 -27
  28. data/spec/lib/qti/v1/models/object_bank_spec.rb +39 -0
  29. metadata +36 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9c8a7c338d0de60c7ef5d45f3acd6cc70d5dfc2c9a738744957b9ee7e5c48f7
4
- data.tar.gz: ba4a37727dca4854d1b53592d0b4e541cedbb9ac95815483a8be3815ba1281b8
3
+ metadata.gz: 80bd134de64054ac80ae1f3293bfc25cac5f1f0801f82767134759fafa1e50fa
4
+ data.tar.gz: '008ddea00fb490d5f58266ded09d4ce64bb8578a7ea6c2d48017f6084a094d3e'
5
5
  SHA512:
6
- metadata.gz: 5ef6b0033fbc4c57593896aa1842d84c93eb9162867d9a6b93b0304427a5f20b17bf02f807ff8f9cab9664ae5bc228d36eceba0bd73017203b4caedb42a13058
7
- data.tar.gz: b204d4aeb766718ab8187b0d96df30ae62778335a686ee63134b5828622db926978d10fbfcedcc55c5eeb96c3694830786e692be71f85f62cb30109f974cd29c
6
+ metadata.gz: 0be90cee407e5119935bc98e9ba32c5a6202ac678fdd6d19e344f5a7133253cfb76b806e43d1362861d1766f54fb381fba3d2c0f8ea73040c38e17fabac16d07
7
+ data.tar.gz: ef3d1d4d84c6b1d9546b39d2326b2be9887ea4659a36c898b6f8120bce6d39e75b79007b8c9510c014ff60f5d0256f73d75318cc0e8d93d6de8f9a4cb44fb8f4
data/lib/qti.rb CHANGED
@@ -103,6 +103,7 @@ require 'qti/models/manifest'
103
103
  require 'qti/v1/models/assessment_item'
104
104
  require 'qti/v1/models/choices/logical_identifier_choice'
105
105
  require 'qti/v1/models/choices/fill_blank_choice'
106
+ require 'qti/v1/models/object_bank'
106
107
  require 'qti/v1/models/scoring_data'
107
108
  require 'qti/v1/models/stimulus_item'
108
109
  require 'qti/v1/models/question_group'
@@ -18,7 +18,7 @@ module Qti
18
18
  end
19
19
 
20
20
  def hide_results
21
- nil_if_empty(tag_under_quiz('hide_results'))
21
+ tag_under_quiz('hide_results')
22
22
  end
23
23
 
24
24
  def scoring_policy
@@ -37,10 +37,14 @@ module Qti
37
37
  points_possible_raw.to_f
38
38
  end
39
39
 
40
- def show_correct_anwers
40
+ def show_correct_answers
41
41
  tag_under_quiz('show_correct_answers')
42
42
  end
43
43
 
44
+ def show_correct_answers?
45
+ string_true?(show_correct_answers)
46
+ end
47
+
44
48
  def anonymous_submissions
45
49
  tag_under_quiz('anonymous_submissions')
46
50
  end
@@ -138,7 +142,9 @@ module Qti
138
142
  end
139
143
 
140
144
  def access_code
141
- tag_under_quiz('access_code')
145
+ code = sanitize_content!(tag_under_quiz('access_code'))
146
+ return nil if code.to_s.empty?
147
+ code
142
148
  end
143
149
 
144
150
  def ip_filter
@@ -187,22 +193,20 @@ module Qti
187
193
  end
188
194
 
189
195
  def lockdown_browser_monitor_data
190
- nil_if_empty(tag_under_quiz('lockdown_browser_monitor_data'))
196
+ tag_under_quiz('lockdown_browser_monitor_data')
191
197
  end
192
198
 
193
199
  private
194
200
 
195
201
  def tag_under_quiz(tag)
196
- @doc.xpath("//xmlns:quiz/xmlns:#{tag}")&.first&.content
202
+ value = @doc.xpath("//xmlns:quiz/xmlns:#{tag}")&.first&.content
203
+ # If the tag is present but has no content, return nil
204
+ return nil if value.to_s.empty?
205
+ value
197
206
  end
198
207
 
199
208
  def string_true?(value)
200
- value&.casecmp('true')&.zero?
201
- end
202
-
203
- def nil_if_empty(value)
204
- return nil if value.to_s.empty?
205
- value
209
+ value&.casecmp('true')&.zero? || false
206
210
  end
207
211
  end
208
212
 
@@ -217,7 +221,7 @@ module Qti
217
221
  :show_correct_answers_at, :hide_correct_answers_at,
218
222
  :lock_at, :unlock_at, :due_at, :require_lockdown_browser?,
219
223
  :require_lockdown_browser_for_results?,
220
- :require_lockdown_browser_monitor?,
224
+ :require_lockdown_browser_monitor?, :show_correct_answers?,
221
225
  :lockdown_browser_monitor_data,
222
226
  to: :@canvas_meta_data, prefix: :canvas, allow_nil: true
223
227
 
@@ -73,6 +73,12 @@ module Qti
73
73
  rsc.href
74
74
  end
75
75
 
76
+ def load_asset_resource(rsc_path)
77
+ doc = Nokogiri.XML(File.read(rsc_path), rsc_path.to_s, &:noblanks)
78
+ raise ArgumentError unless doc
79
+ doc
80
+ end
81
+
76
82
  def identifier_list(rsc_type)
77
83
  RESOURCE_QTI_TYPES.map do |v|
78
84
  xmlns_resource_list("[#{rtype_predicate(v, rsc_type)}]").map { |r| r[:identifier] }
@@ -91,8 +97,26 @@ module Qti
91
97
  id_list
92
98
  end
93
99
 
94
- def question_bank_identifiers
95
- identifier_list('/question-bank')
100
+ def associated_content_list
101
+ predicate = rtype_predicate('associatedcontent', 'learning-application-resource')
102
+ xmlns_resource_list("[#{predicate}]").map { |r| r[:identifier] }
103
+ end
104
+
105
+ def load_associated_content
106
+ @_load_associated_content ||= associated_content_list.map do |ident|
107
+ rsc = resource_for(ident)
108
+ rsc_path = remap_href_path(asset_resource_for(rsc))
109
+ doc = load_asset_resource(rsc_path)
110
+
111
+ # There are other types, but all we support right now are object banks...
112
+ Qti::V1::Models::ObjectBank.from_path!(rsc_path, @package_root, rsc) unless doc.search('objectbank').empty?
113
+ end.reject(&:nil?)
114
+ end
115
+
116
+ def objectbanks
117
+ load_associated_content.select do |c|
118
+ c.class == Qti::V1::Models::ObjectBank
119
+ end
96
120
  end
97
121
 
98
122
  def item_resources_v2
@@ -85,6 +85,10 @@ module Qti
85
85
  def feedback
86
86
  @feedback ||= interaction_model.canvas_item_feedback
87
87
  end
88
+
89
+ def answer_feedback
90
+ @answer_feedback ||= interaction_model.answer_feedback
91
+ end
88
92
  end
89
93
  end
90
94
  end
@@ -7,7 +7,7 @@ module Qti
7
7
 
8
8
  def canvas_stem_items(item_prompt)
9
9
  item_prompt.split(CANVAS_REGEX).map.with_index do |stem_item, index|
10
- if stem_item.match CANVAS_REGEX
10
+ if canvas_fib_response_ids.include?(stem_item)
11
11
  # Strip the brackets before searching
12
12
  stem_blank(index, canvas_blank_id(stem_item[1..-2]))
13
13
  else
@@ -43,6 +43,38 @@ module Qti
43
43
  end
44
44
  blank_id
45
45
  end
46
+
47
+ def canvas_fib_responses
48
+ @base_canvas_blanks ||= node.xpath('.//xmlns:response_lid').map do |resp|
49
+ index = 0
50
+ {
51
+ id: resp[:ident],
52
+ choices:
53
+ resp.xpath('.//xmlns:response_label').map do |bnode|
54
+ canvas_blank_choice(bnode, index += 1)
55
+ end
56
+ }
57
+ end
58
+ @base_canvas_blanks
59
+ end
60
+
61
+ def canvas_fib_response_ids
62
+ @canvas_fib_response_ids ||= canvas_fib_responses.map { |b| "[#{b[:id].sub(/^response_/, '')}]" }
63
+ end
64
+
65
+ private
66
+
67
+ def canvas_blank_choice(bnode, index)
68
+ bnode_id = bnode[:ident]
69
+ choice = {
70
+ id: bnode_id,
71
+ position: index + 1,
72
+ item_body: bnode.at_xpath('.//xmlns:mattext').text
73
+ }
74
+ @blank_choices ||= {}
75
+ @blank_choices[bnode_id] = choice
76
+ choice
77
+ end
46
78
  end
47
79
  end
48
80
  end
@@ -14,19 +14,6 @@ module Qti
14
14
  canvas_stem_items(node.at_xpath('.//xmlns:presentation/xmlns:material/xmlns:mattext').text)
15
15
  end
16
16
 
17
- def blanks
18
- @blanks = node.xpath('.//xmlns:response_lid').map do |resp|
19
- index = 0
20
- {
21
- id: resp[:ident],
22
- choices:
23
- resp.xpath('.//xmlns:response_label').map do |bnode|
24
- blank_choice(bnode, index += 1)
25
- end
26
- }
27
- end
28
- end
29
-
30
17
  def scoring_data_structs
31
18
  answers.map do |answer|
32
19
  ScoringData.new(
@@ -42,12 +29,12 @@ module Qti
42
29
  end
43
30
 
44
31
  def text_for_entry(entry_id)
45
- blanks
32
+ canvas_fib_responses
46
33
  @blank_choices[entry_id][:item_body]
47
34
  end
48
35
 
49
36
  def position_for_entry(entry_id)
50
- blanks
37
+ canvas_fib_responses
51
38
  @blank_choices[entry_id][:position]
52
39
  end
53
40
 
@@ -63,20 +50,6 @@ module Qti
63
50
  }
64
51
  end
65
52
  end
66
-
67
- private
68
-
69
- def blank_choice(bnode, index)
70
- bnode_id = bnode[:ident]
71
- choice = {
72
- id: bnode_id,
73
- position: index + 1,
74
- item_body: bnode.at_xpath('.//xmlns:mattext').text
75
- }
76
- @blank_choices ||= {}
77
- @blank_choices[bnode_id] = choice
78
- choice
79
- end
80
53
  end
81
54
  end
82
55
  end
@@ -0,0 +1,14 @@
1
+ module Qti
2
+ module V1
3
+ module Models
4
+ class ObjectBank < Qti::V1::Models::Assessment
5
+ # use assessment_items / create_assessment_item from Assessment for bank items
6
+ def title
7
+ @title ||= xpath_with_single_check(
8
+ './/xmlns:qtimetadatafield/xmlns:fieldlabel[text()="bank_title"]/../xmlns:fieldentry'
9
+ )&.content || File.basename(@path, '.xml')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
data/lib/qti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Qti
2
- VERSION = '2.2.0'.freeze
2
+ VERSION = '2.5.1'.freeze
3
3
  end
@@ -0,0 +1,244 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
3
+ <item ident="gdc445634f8b3e063eb009700326194e9" title="L2Q2RUnit8q1">
4
+ <itemmetadata>
5
+ <qtimetadata>
6
+ <qtimetadatafield>
7
+ <fieldlabel>question_type</fieldlabel>
8
+ <fieldentry>multiple_dropdowns_question</fieldentry>
9
+ </qtimetadatafield>
10
+ <qtimetadatafield>
11
+ <fieldlabel>points_possible</fieldlabel>
12
+ <fieldentry>7.0</fieldentry>
13
+ </qtimetadatafield>
14
+ <qtimetadatafield>
15
+ <fieldlabel>original_answer_ids</fieldlabel>
16
+ <fieldentry>8464,265,3002,1356,5614,4002,8630,7844,3602,9525,8390,8745,3760,7542,1523,3317,6768,5823,2492,4494,6742,794,4259,4851,8574</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
20
+ <fieldentry>gf47b767d37e06559ff801f2d253307ba</fieldentry>
21
+ </qtimetadatafield>
22
+ </qtimetadata>
23
+ </itemmetadata>
24
+ <presentation>
25
+ <material>
26
+ <mattext texttype="text/html">&lt;div&gt;
27
+ &lt;p&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;LOREM &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
28
+ &lt;p&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;Lorem ipsum dolor sit amet consecteur&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;to&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;? Write the letter of the correct paragraph&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
29
+ &lt;p&gt; &lt;/p&gt;
30
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;A.&lt;/strong&gt; Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in. &lt;/span&gt;&lt;/p&gt;
31
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;B&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in. &lt;/span&gt;&lt;/p&gt;
32
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;C&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. &lt;/span&gt;&lt;/p&gt;
33
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;D&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt. &lt;/span&gt;&lt;/p&gt;
34
+ &lt;p&gt;&lt;span data-contrast="none"&gt;&lt;strong&gt;E&lt;/strong&gt;. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in. &lt;/span&gt;&lt;/p&gt;
35
+ &lt;p&gt;&lt;span data-ccp-props='{"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;1&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; impsum dolor / &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; sit amet consectetur &lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240,"335559991":1080}'&gt; &lt;/span&gt;&lt;/p&gt;
36
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[1]&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
37
+ &lt;p&gt;&lt;span data-contrast="none"&gt;2&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet / &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; consectetur adipiscing&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
38
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt; &lt;strong&gt;&lt;span data-contrast="none"&gt;[2]&lt;/span&gt;&lt;/strong&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
39
+ &lt;p&gt;&lt;span data-contrast="none"&gt;3&lt;/span&gt;&lt;span data-contrast="none"&gt;. &lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;Lorem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240,"335559991":1080}'&gt; &lt;/span&gt;&lt;/p&gt;
40
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[3]&lt;/span&gt;&lt;/strong&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559685":1080,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
41
+ &lt;p&gt;&lt;span data-contrast="none"&gt;4&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;orem&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; ipsum dolor sit amet consectetur&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
42
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph  &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[4]&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
43
+ &lt;p&gt;&lt;span data-contrast="none"&gt;5&lt;/span&gt;&lt;span data-contrast="none"&gt;. L&lt;/span&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;irst&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt; orem ipsum dolor sit &lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span data-contrast="none"&gt;ppl&lt;/span&gt;&lt;/i&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-ccp-props='{"134233117":true,"134233118":true,"201341983":0,"335559739":160,"335559740":240}'&gt; &lt;/span&gt;&lt;/p&gt;
44
+ &lt;p&gt;&lt;span data-contrast="auto"&gt; &lt;/span&gt;&lt;span data-contrast="none"&gt;This note refers to paragraph &lt;/span&gt;&lt;strong&gt;&lt;span data-contrast="none"&gt;[5]&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
45
+ &lt;/div&gt;</mattext>
46
+ </material>
47
+ <response_lid ident="response_1">
48
+ <material>
49
+ <mattext>1</mattext>
50
+ </material>
51
+ <render_choice>
52
+ <response_label ident="8464">
53
+ <material>
54
+ <mattext texttype="text/plain">A</mattext>
55
+ </material>
56
+ </response_label>
57
+ <response_label ident="265">
58
+ <material>
59
+ <mattext texttype="text/plain">B</mattext>
60
+ </material>
61
+ </response_label>
62
+ <response_label ident="3002">
63
+ <material>
64
+ <mattext texttype="text/plain">C</mattext>
65
+ </material>
66
+ </response_label>
67
+ <response_label ident="1356">
68
+ <material>
69
+ <mattext texttype="text/plain">D</mattext>
70
+ </material>
71
+ </response_label>
72
+ <response_label ident="5614">
73
+ <material>
74
+ <mattext texttype="text/plain">E</mattext>
75
+ </material>
76
+ </response_label>
77
+ </render_choice>
78
+ </response_lid>
79
+ <response_lid ident="response_2">
80
+ <material>
81
+ <mattext>2</mattext>
82
+ </material>
83
+ <render_choice>
84
+ <response_label ident="4002">
85
+ <material>
86
+ <mattext texttype="text/plain">A</mattext>
87
+ </material>
88
+ </response_label>
89
+ <response_label ident="8630">
90
+ <material>
91
+ <mattext texttype="text/plain">B</mattext>
92
+ </material>
93
+ </response_label>
94
+ <response_label ident="7844">
95
+ <material>
96
+ <mattext texttype="text/plain">C</mattext>
97
+ </material>
98
+ </response_label>
99
+ <response_label ident="3602">
100
+ <material>
101
+ <mattext texttype="text/plain">D</mattext>
102
+ </material>
103
+ </response_label>
104
+ <response_label ident="9525">
105
+ <material>
106
+ <mattext texttype="text/plain">E</mattext>
107
+ </material>
108
+ </response_label>
109
+ </render_choice>
110
+ </response_lid>
111
+ <response_lid ident="response_3">
112
+ <material>
113
+ <mattext>3</mattext>
114
+ </material>
115
+ <render_choice>
116
+ <response_label ident="8390">
117
+ <material>
118
+ <mattext texttype="text/plain">A</mattext>
119
+ </material>
120
+ </response_label>
121
+ <response_label ident="8745">
122
+ <material>
123
+ <mattext texttype="text/plain">B</mattext>
124
+ </material>
125
+ </response_label>
126
+ <response_label ident="3760">
127
+ <material>
128
+ <mattext texttype="text/plain">C</mattext>
129
+ </material>
130
+ </response_label>
131
+ <response_label ident="7542">
132
+ <material>
133
+ <mattext texttype="text/plain">D</mattext>
134
+ </material>
135
+ </response_label>
136
+ <response_label ident="1523">
137
+ <material>
138
+ <mattext texttype="text/plain">E</mattext>
139
+ </material>
140
+ </response_label>
141
+ </render_choice>
142
+ </response_lid>
143
+ <response_lid ident="response_4">
144
+ <material>
145
+ <mattext>4</mattext>
146
+ </material>
147
+ <render_choice>
148
+ <response_label ident="3317">
149
+ <material>
150
+ <mattext texttype="text/plain">A</mattext>
151
+ </material>
152
+ </response_label>
153
+ <response_label ident="6768">
154
+ <material>
155
+ <mattext texttype="text/plain">B</mattext>
156
+ </material>
157
+ </response_label>
158
+ <response_label ident="5823">
159
+ <material>
160
+ <mattext texttype="text/plain">C</mattext>
161
+ </material>
162
+ </response_label>
163
+ <response_label ident="2492">
164
+ <material>
165
+ <mattext texttype="text/plain">D</mattext>
166
+ </material>
167
+ </response_label>
168
+ <response_label ident="4494">
169
+ <material>
170
+ <mattext texttype="text/plain">E</mattext>
171
+ </material>
172
+ </response_label>
173
+ </render_choice>
174
+ </response_lid>
175
+ <response_lid ident="response_5">
176
+ <material>
177
+ <mattext>5</mattext>
178
+ </material>
179
+ <render_choice>
180
+ <response_label ident="6742">
181
+ <material>
182
+ <mattext texttype="text/plain">A</mattext>
183
+ </material>
184
+ </response_label>
185
+ <response_label ident="794">
186
+ <material>
187
+ <mattext texttype="text/plain">B</mattext>
188
+ </material>
189
+ </response_label>
190
+ <response_label ident="4259">
191
+ <material>
192
+ <mattext texttype="text/plain">C</mattext>
193
+ </material>
194
+ </response_label>
195
+ <response_label ident="4851">
196
+ <material>
197
+ <mattext texttype="text/plain">D</mattext>
198
+ </material>
199
+ </response_label>
200
+ <response_label ident="8574">
201
+ <material>
202
+ <mattext texttype="text/plain">E</mattext>
203
+ </material>
204
+ </response_label>
205
+ </render_choice>
206
+ </response_lid>
207
+ </presentation>
208
+ <resprocessing>
209
+ <outcomes>
210
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
211
+ </outcomes>
212
+ <respcondition>
213
+ <conditionvar>
214
+ <varequal respident="response_1">1356</varequal>
215
+ </conditionvar>
216
+ <setvar varname="SCORE" action="Add">20.00</setvar>
217
+ </respcondition>
218
+ <respcondition>
219
+ <conditionvar>
220
+ <varequal respident="response_2">9525</varequal>
221
+ </conditionvar>
222
+ <setvar varname="SCORE" action="Add">20.00</setvar>
223
+ </respcondition>
224
+ <respcondition>
225
+ <conditionvar>
226
+ <varequal respident="response_3">8745</varequal>
227
+ </conditionvar>
228
+ <setvar varname="SCORE" action="Add">20.00</setvar>
229
+ </respcondition>
230
+ <respcondition>
231
+ <conditionvar>
232
+ <varequal respident="response_4">5823</varequal>
233
+ </conditionvar>
234
+ <setvar varname="SCORE" action="Add">20.00</setvar>
235
+ </respcondition>
236
+ <respcondition>
237
+ <conditionvar>
238
+ <varequal respident="response_5">6742</varequal>
239
+ </conditionvar>
240
+ <setvar varname="SCORE" action="Add">20.00</setvar>
241
+ </respcondition>
242
+ </resprocessing>
243
+ </item>
244
+ </questestinterop>