@citolab/qti-components 6.9.1-beta.65 → 6.9.1-beta.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,317 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/lib/qti-transformers/index.ts
20
+ var qti_transformers_exports = {};
21
+ __export(qti_transformers_exports, {
22
+ qtiTransformItem: () => qtiTransformItem,
23
+ qtiTransformManifest: () => qtiTransformManifest,
24
+ qtiTransformTest: () => qtiTransformTest
25
+ });
26
+ module.exports = __toCommonJS(qti_transformers_exports);
27
+
28
+ // src/lib/qti-transformers/qti-transformers.ts
29
+ var xml = String.raw;
30
+ var xmlToHTML = xml`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
31
+ <xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
32
+ <xsl:template match="@*|node()">
33
+ <xsl:copy>
34
+ <xsl:apply-templates select="@*|node()"/>
35
+ </xsl:copy>
36
+ </xsl:template>
37
+
38
+ <!-- remove existing namespaces -->
39
+ <xsl:template match="*">
40
+ <!-- remove element prefix -->
41
+ <xsl:element name="{local-name()}">
42
+ <!-- process attributes -->
43
+ <xsl:for-each select="@*">
44
+ <!-- remove attribute prefix -->
45
+ <xsl:attribute name="{local-name()}">
46
+ <xsl:value-of select="."/>
47
+ </xsl:attribute>
48
+ </xsl:for-each>
49
+ <xsl:apply-templates/>
50
+ </xsl:element>
51
+ </xsl:template>
52
+ </xsl:stylesheet>`;
53
+ function extendElementName(xmlFragment, tagName, extension) {
54
+ xmlFragment.querySelectorAll(tagName).forEach((element) => {
55
+ const newTagName = `${tagName}-${extension}`;
56
+ const newElement = createElementWithNewTagName(element, newTagName);
57
+ element.replaceWith(newElement);
58
+ });
59
+ }
60
+ function extendElementsWithClass(xmlFragment, classNamePattern) {
61
+ xmlFragment.querySelectorAll("*").forEach((element) => {
62
+ const classList = element.classList;
63
+ if (classList) {
64
+ classList.forEach((className) => {
65
+ if (className.startsWith(`${classNamePattern}:`)) {
66
+ const suffix = className.slice(`${classNamePattern}:`.length);
67
+ const newTagName = `${element.nodeName}-${suffix}`;
68
+ const newElement = createElementWithNewTagName(element, newTagName);
69
+ element.replaceWith(newElement);
70
+ }
71
+ });
72
+ }
73
+ });
74
+ }
75
+ function createElementWithNewTagName(element, newTagName) {
76
+ const newElement = document.createElement(newTagName);
77
+ for (const attr of element.attributes) {
78
+ newElement.setAttribute(attr.name, attr.value);
79
+ }
80
+ while (element.firstChild) {
81
+ newElement.appendChild(element.firstChild);
82
+ }
83
+ return newElement;
84
+ }
85
+ function itemsFromTest(xmlFragment) {
86
+ const items = [];
87
+ xmlFragment.querySelectorAll("qti-assessment-item-ref").forEach((el) => {
88
+ const identifier = el.getAttribute("identifier");
89
+ const href = el.getAttribute("href");
90
+ const category = el.getAttribute("category");
91
+ items.push({ identifier, href, category });
92
+ });
93
+ return items;
94
+ }
95
+ var currentRequest = null;
96
+ function loadXML(url, cancelPreviousRequest = false) {
97
+ if (cancelPreviousRequest && currentRequest !== null) {
98
+ currentRequest.abort();
99
+ }
100
+ return new Promise((resolve, reject) => {
101
+ const xhr = new XMLHttpRequest();
102
+ currentRequest = xhr;
103
+ xhr.open("GET", url, true);
104
+ xhr.responseType = "document";
105
+ xhr.onload = () => {
106
+ if (xhr.status >= 200 && xhr.status < 300) {
107
+ resolve(xhr.responseXML);
108
+ } else {
109
+ reject(xhr.statusText);
110
+ }
111
+ };
112
+ xhr.onerror = () => {
113
+ reject(xhr.statusText);
114
+ };
115
+ xhr.send();
116
+ });
117
+ }
118
+ function parseXML(xmlDocument) {
119
+ const parser = new DOMParser();
120
+ const xmlFragment = parser.parseFromString(xmlDocument, "text/xml");
121
+ return xmlFragment;
122
+ }
123
+ function toHTML(xmlFragment) {
124
+ const processor = new XSLTProcessor();
125
+ const xsltDocument = new DOMParser().parseFromString(xmlToHTML, "text/xml");
126
+ processor.importStylesheet(xsltDocument);
127
+ const itemHTMLFragment = processor.transformToFragment(xmlFragment, document);
128
+ return itemHTMLFragment;
129
+ }
130
+ function setLocation(xmlFragment, location) {
131
+ if (!location.endsWith("/")) {
132
+ location += "/";
133
+ }
134
+ xmlFragment.querySelectorAll("[src],[href],[primary-path]").forEach((elWithSrc) => {
135
+ var _a;
136
+ let attr = "";
137
+ if (elWithSrc.getAttribute("src")) {
138
+ attr = "src";
139
+ }
140
+ if (elWithSrc.getAttribute("href")) {
141
+ attr = "href";
142
+ }
143
+ if (elWithSrc.getAttribute("primary-path")) {
144
+ attr = "primary-path";
145
+ }
146
+ const attrValue = (_a = elWithSrc.getAttribute(attr)) == null ? void 0 : _a.trim();
147
+ if (!attrValue.startsWith("data:") && !attrValue.startsWith("http")) {
148
+ const newSrcValue = location + encodeURI(attrValue);
149
+ elWithSrc.setAttribute(attr, newSrcValue);
150
+ }
151
+ });
152
+ }
153
+ function convertCDATAtoComment(xmlFragment) {
154
+ const cdataElements = xmlFragment.querySelectorAll('qti-custom-operator[class="js.org"] > qti-base-value');
155
+ cdataElements.forEach((element) => {
156
+ const commentText = document.createComment(element.textContent);
157
+ element.replaceChild(commentText, element.firstChild);
158
+ });
159
+ }
160
+ function stripStyleSheets(xmlFragment) {
161
+ xmlFragment.querySelectorAll("qti-stylesheet").forEach((stylesheet) => stylesheet.remove());
162
+ }
163
+
164
+ // src/lib/qti-transformers/qti-transform-item.ts
165
+ var qtiTransformItem = () => {
166
+ let xmlFragment;
167
+ const api = {
168
+ async load(uri, cancelPreviousRequest = false) {
169
+ return new Promise((resolve, reject) => {
170
+ loadXML(uri, cancelPreviousRequest).then((xml2) => {
171
+ xmlFragment = xml2;
172
+ api.path(uri.substring(0, uri.lastIndexOf("/")));
173
+ return resolve(api);
174
+ });
175
+ });
176
+ },
177
+ parse(xmlString) {
178
+ xmlFragment = parseXML(xmlString);
179
+ return api;
180
+ },
181
+ path: (location) => {
182
+ setLocation(xmlFragment, location);
183
+ return api;
184
+ },
185
+ fn(fn) {
186
+ fn(xmlFragment);
187
+ return api;
188
+ },
189
+ pciHooks(uri) {
190
+ const attributes = ["hook", "module"];
191
+ const documentPath = uri.substring(0, uri.lastIndexOf("/"));
192
+ for (const attribute of attributes) {
193
+ const srcAttributes = xmlFragment.querySelectorAll("[" + attribute + "]");
194
+ srcAttributes.forEach((node) => {
195
+ const srcValue = node.getAttribute(attribute);
196
+ if (!srcValue.startsWith("data:") && !srcValue.startsWith("http")) {
197
+ node.setAttribute("base-url", uri);
198
+ node.setAttribute(
199
+ "module",
200
+ documentPath + "/" + encodeURI(srcValue + (srcValue.endsWith(".js") ? "" : ".js"))
201
+ );
202
+ }
203
+ });
204
+ }
205
+ return api;
206
+ },
207
+ extendElementName: (tagName, extension) => {
208
+ extendElementName(xmlFragment, tagName, extension);
209
+ return api;
210
+ },
211
+ extendElementsWithClass: (param = "extend") => {
212
+ extendElementsWithClass(xmlFragment, param);
213
+ return api;
214
+ },
215
+ customInteraction(baseRef, baseItem) {
216
+ const qtiCustomInteraction = xmlFragment.querySelector("qti-custom-interaction");
217
+ const qtiCustomInteractionObject = qtiCustomInteraction.querySelector("object");
218
+ qtiCustomInteraction.setAttribute("data-base-ref", baseRef);
219
+ qtiCustomInteraction.setAttribute("data-base-item", baseRef + baseItem);
220
+ qtiCustomInteraction.setAttribute("data", qtiCustomInteractionObject.getAttribute("data"));
221
+ qtiCustomInteraction.setAttribute("width", qtiCustomInteractionObject.getAttribute("width"));
222
+ qtiCustomInteraction.setAttribute("height", qtiCustomInteractionObject.getAttribute("height"));
223
+ qtiCustomInteraction.removeChild(qtiCustomInteractionObject);
224
+ return api;
225
+ },
226
+ convertCDATAtoComment() {
227
+ convertCDATAtoComment(xmlFragment);
228
+ return api;
229
+ },
230
+ stripStyleSheets() {
231
+ stripStyleSheets(xmlFragment);
232
+ return api;
233
+ },
234
+ html() {
235
+ return new XMLSerializer().serializeToString(toHTML(xmlFragment));
236
+ },
237
+ xml() {
238
+ return new XMLSerializer().serializeToString(xmlFragment);
239
+ },
240
+ htmlDoc() {
241
+ return toHTML(xmlFragment);
242
+ },
243
+ xmlDoc() {
244
+ return xmlFragment;
245
+ }
246
+ };
247
+ return api;
248
+ };
249
+
250
+ // src/lib/qti-transformers/qti-transform-manifest.ts
251
+ var qtiTransformManifest = () => {
252
+ let xmlFragment;
253
+ const api = {
254
+ async load(uri) {
255
+ return new Promise((resolve, reject) => {
256
+ loadXML(uri).then((xml2) => {
257
+ xmlFragment = xml2;
258
+ return resolve(api);
259
+ });
260
+ });
261
+ },
262
+ parse(xmlString) {
263
+ xmlFragment = parseXML(xmlString);
264
+ },
265
+ assessmentTest() {
266
+ const el = xmlFragment.querySelector('resource[type="imsqti_test_xmlv3p0"]');
267
+ return { href: el.getAttribute("href"), identifier: el.getAttribute("identifier") };
268
+ }
269
+ };
270
+ return api;
271
+ };
272
+
273
+ // src/lib/qti-transformers/qti-transform-test.ts
274
+ var qtiTransformTest = () => {
275
+ let xmlFragment;
276
+ const api = {
277
+ async load(uri) {
278
+ return new Promise((resolve, reject) => {
279
+ loadXML(uri).then((xml2) => {
280
+ xmlFragment = xml2;
281
+ return resolve(api);
282
+ });
283
+ });
284
+ },
285
+ parse(xmlString) {
286
+ xmlFragment = parseXML(xmlString);
287
+ return api;
288
+ },
289
+ fn(fn) {
290
+ fn(xmlFragment);
291
+ return api;
292
+ },
293
+ items() {
294
+ return itemsFromTest(xmlFragment);
295
+ },
296
+ html() {
297
+ return new XMLSerializer().serializeToString(toHTML(xmlFragment));
298
+ },
299
+ xml() {
300
+ return new XMLSerializer().serializeToString(xmlFragment);
301
+ },
302
+ htmlDoc() {
303
+ return toHTML(xmlFragment);
304
+ },
305
+ xmlDoc() {
306
+ return xmlFragment;
307
+ }
308
+ };
309
+ return api;
310
+ };
311
+ // Annotate the CommonJS export names for ESM import in node:
312
+ 0 && (module.exports = {
313
+ qtiTransformItem,
314
+ qtiTransformManifest,
315
+ qtiTransformTest
316
+ });
317
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0tbWFuaWZlc3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0tdGVzdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSAnLi9xdGktdHJhbnNmb3JtLWl0ZW0nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdHJhbnNmb3JtLW1hbmlmZXN0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXRyYW5zZm9ybS10ZXN0JztcblxuIiwgImNvbnN0IHhtbCA9IFN0cmluZy5yYXc7XG5cbi8qICAgPCEtLSBjb252ZXJ0IENEQVRBIHRvIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwidGV4dCgpW2NvbnRhaW5zKC4sICdDREFUQScpXVwiPlxuICA8eHNsOmNvbW1lbnQ+XG4gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICA8L3hzbDpjb21tZW50PlxuPC94c2w6dGVtcGxhdGU+XG4qL1xuXG4vKlxuICA8IS0tIHJlbW92ZSB4bWwgY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJjb21tZW50KClcIiAvPlxuICAqL1xuXG5jb25zdCB4bWxUb0hUTUwgPSB4bWxgPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249XCIxLjBcIiB4bWxuczp4c2w9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm1cIj5cbjx4c2w6b3V0cHV0IG1ldGhvZD1cImh0bWxcIiB2ZXJzaW9uPVwiNS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIGluZGVudD1cInllc1wiIC8+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJAKnxub2RlKClcIj5cbiAgICA8eHNsOmNvcHk+XG4gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJAKnxub2RlKClcIi8+XG4gICAgPC94c2w6Y29weT5cbiAgPC94c2w6dGVtcGxhdGU+XG5cbiAgPCEtLSByZW1vdmUgZXhpc3RpbmcgbmFtZXNwYWNlcyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIipcIj5cbiAgICA8IS0tIHJlbW92ZSBlbGVtZW50IHByZWZpeCAtLT5cbiAgICA8eHNsOmVsZW1lbnQgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICA8IS0tIHByb2Nlc3MgYXR0cmlidXRlcyAtLT5cbiAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PVwiQCpcIj5cbiAgICAgICAgPCEtLSByZW1vdmUgYXR0cmlidXRlIHByZWZpeCAtLT5cbiAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICAgICAgICA8L3hzbDphdHRyaWJ1dGU+XG4gICAgICA8L3hzbDpmb3ItZWFjaD5cbiAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+XG4gIDwveHNsOmVsZW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbjwveHNsOnN0eWxlc2hlZXQ+YDtcblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGVsZW1lbnRzIHdpdGggYSBzcGVjaWZpYyB0YWcgbmFtZSBieSBhZGRpbmcgYW4gZXh0ZW5zaW9uIHN1ZmZpeFxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgdGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke3RhZ05hbWV9LSR7ZXh0ZW5zaW9ufWA7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICB9KTtcbn1cblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGFueSBlbGVtZW50IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBwYXR0ZXJuIChlLmcuLCBcImV4dGVuZDpzdWZmaXhcIilcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIGNsYXNzTmFtZVBhdHRlcm46IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICBpZiAoY2xhc3NMaXN0KSB7XG4gICAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoYCR7Y2xhc3NOYW1lUGF0dGVybn06YCkpIHtcbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBjbGFzc05hbWUuc2xpY2UoYCR7Y2xhc3NOYW1lUGF0dGVybn06YC5sZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHtlbGVtZW50Lm5vZGVOYW1lfS0ke3N1ZmZpeH1gO1xuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgICAgICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbGVtZW50IHdpdGggYSBuZXcgdGFnIG5hbWUgYW5kIGNvcHkgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKSB7XG4gIGNvbnN0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld1RhZ05hbWUpO1xuICAvLyBDb3B5IGF0dHJpYnV0ZXNcbiAgZm9yIChjb25zdCBhdHRyIG9mIGVsZW1lbnQuYXR0cmlidXRlcykge1xuICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gIH1cbiAgLy8gQ29weSBjaGlsZCBub2Rlc1xuICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlbXNGcm9tVGVzdCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBpdGVtczogeyBpZGVudGlmaWVyOiBzdHJpbmc7IGhyZWY6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZyB9W10gPSBbXTtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWFzc2Vzc21lbnQtaXRlbS1yZWYnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgaHJlZiA9IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gZWwuZ2V0QXR0cmlidXRlKCdjYXRlZ29yeScpO1xuICAgIGl0ZW1zLnB1c2goeyBpZGVudGlmaWVyLCBocmVmLCBjYXRlZ29yeSB9KTtcbiAgfSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxubGV0IGN1cnJlbnRSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFhNTCh1cmwsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKSB7XG4gIGlmIChjYW5jZWxQcmV2aW91c1JlcXVlc3QgJiYgY3VycmVudFJlcXVlc3QgIT09IG51bGwpIHtcbiAgICBjdXJyZW50UmVxdWVzdC5hYm9ydCgpOyAvLyBBYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0IGlmIHRoZXJlIGlzIG9uZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFhNTERvY3VtZW50IHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGN1cnJlbnRSZXF1ZXN0ID0geGhyOyAvLyBTdG9yZSB0aGUgY3VycmVudCByZXF1ZXN0XG5cbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcblxuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICByZXNvbHZlKHhoci5yZXNwb25zZVhNTCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgfTtcblxuICAgIHhoci5zZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUwoeG1sRG9jdW1lbnQ6IHN0cmluZykge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IHhtbEZyYWdtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxEb2N1bWVudCwgJ3RleHQveG1sJyk7XG4gIHJldHVybiB4bWxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSFRNTCh4bWxGcmFnbWVudDogRG9jdW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFhTTFRQcm9jZXNzb3IoKTtcbiAgY29uc3QgeHNsdERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxUb0hUTUwsICd0ZXh0L3htbCcpO1xuICBwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2x0RG9jdW1lbnQpO1xuICBjb25zdCBpdGVtSFRNTEZyYWdtZW50ID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQoeG1sRnJhZ21lbnQsIGRvY3VtZW50KTtcbiAgcmV0dXJuIGl0ZW1IVE1MRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhdGlvbih4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCwgbG9jYXRpb246IHN0cmluZykge1xuICBpZiAoIWxvY2F0aW9uLmVuZHNXaXRoKCcvJykpIHtcbiAgICBsb2NhdGlvbiArPSAnLyc7XG4gIH1cblxuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3JjXSxbaHJlZl0sW3ByaW1hcnktcGF0aF0nKS5mb3JFYWNoKGVsV2l0aFNyYyA9PiB7XG4gICAgbGV0IGF0dHI6ICdzcmMnIHwgJ2hyZWYnIHwgJ3ByaW1hcnktcGF0aCcgfCAnJyA9ICcnO1xuXG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgICBhdHRyID0gJ3NyYyc7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgIGF0dHIgPSAnaHJlZic7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKSkge1xuICAgICAgYXR0ciA9ICdwcmltYXJ5LXBhdGgnO1xuICAgIH1cbiAgICBjb25zdCBhdHRyVmFsdWUgPSBlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKGF0dHIpPy50cmltKCk7XG5cbiAgICBpZiAoIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICBjb25zdCBuZXdTcmNWYWx1ZSA9IGxvY2F0aW9uICsgZW5jb2RlVVJJKGF0dHJWYWx1ZSk7XG4gICAgICBlbFdpdGhTcmMuc2V0QXR0cmlidXRlKGF0dHIsIG5ld1NyY1ZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGNkYXRhRWxlbWVudHMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktY3VzdG9tLW9wZXJhdG9yW2NsYXNzPVwianMub3JnXCJdID4gcXRpLWJhc2UtdmFsdWUnKTtcbiAgY2RhdGFFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNvbW1lbnRUZXh0ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlbGVtZW50LnRleHRDb250ZW50KTtcbiAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChjb21tZW50VGV4dCwgZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIC8vIHJlbW92ZSBxdGktc3R5bGVzaGVldCB0YWdcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0eWxlc2hlZXQnKS5mb3JFYWNoKHN0eWxlc2hlZXQgPT4gc3R5bGVzaGVldC5yZW1vdmUoKSk7XG59XG4iLCAiLyoqXG4gKiBCcm93c2VyIGJhc2VkIFFUSS1YTUwgdG8gSFRNTCB0cmFuc2Zvcm1lci5cbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1JdGVtKCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdwYXRoL3RvL3htbC9maWxlLnhtbCcpO1xuICogcXRpVHJhbnNmb3JtZXIucGF0aCgnL2Fzc2Vzc21lbnRJdGVtL2l0ZW1Cb2R5Jyk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKiBjb25zdCBodG1sZG9jID0gcXRpVHJhbnNmb3JtZXIuaHRtbGRvYygpO1xuICogY29uc3QgeG1sZG9jID0gcXRpVHJhbnNmb3JtZXIueG1sZG9jKCk7XG4gKlxuICogcXRpVHJhbnNmb3JtSXRlbSgpLnBhcnNlKHN0b3J5WE1MKS5odG1sKClcbiAqL1xuXG5pbXBvcnQge1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQsXG4gIGV4dGVuZEVsZW1lbnROYW1lLFxuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyxcbiAgbG9hZFhNTCxcbiAgcGFyc2VYTUwsXG4gIHNldExvY2F0aW9uLFxuICBzdHJpcFN0eWxlU2hlZXRzLFxuICB0b0hUTUxcbn0gZnJvbSAnLi9xdGktdHJhbnNmb3JtZXJzJztcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgbG9hZDogKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3Q/OiBib29sZWFuKSA9PiBQcm9taXNlPHRyYW5zZm9ybUl0ZW1BcGk+O1xuICBwYXJzZTogKHhtbFN0cmluZzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwYXRoOiAobG9jYXRpb246IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZm46IChmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGNpSG9va3M6ICh1cmk6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudE5hbWU6IChlbGVtZW50TmFtZTogc3RyaW5nLCBleHRlbmQ6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbT86IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY3VzdG9tSW50ZXJhY3Rpb246IChiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudDogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgc3RyaXBTdHlsZVNoZWV0czogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgaHRtbDogKCkgPT4gc3RyaW5nO1xuICB4bWw6ICgpID0+IHN0cmluZztcbiAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgeG1sRG9jOiAoKSA9PiBYTUxEb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1JdGVtID0gKCkgPT4ge1xuICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuXG4gIGNvbnN0IGFwaTogdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgICBhc3luYyBsb2FkKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSk6IFByb21pc2U8dHlwZW9mIGFwaT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHR5cGVvZiBhcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbG9hZFhNTCh1cmksIGNhbmNlbFByZXZpb3VzUmVxdWVzdCkudGhlbih4bWwgPT4ge1xuICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgIC8vIHNldCB0aGUgYmFzZSBwYXRoIGZvciBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyxcbiAgICAgICAgICAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBzZXQgdGhlIGJhc2UgcGF0aCB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbHNlIHlvdSBjYW4gdXNlIHRoZSBwYXRoIG1ldGhvZCB0byBzZXQgaXRcbiAgICAgICAgICBhcGkucGF0aCh1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhcnNlKHhtbFN0cmluZzogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIHNldExvY2F0aW9uKHhtbEZyYWdtZW50LCBsb2NhdGlvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZm4oZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwY2lIb29rcyh1cmk6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFsnaG9vaycsICdtb2R1bGUnXTtcbiAgICAgIGNvbnN0IGRvY3VtZW50UGF0aCA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBzcmNBdHRyaWJ1dGVzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBhdHRyaWJ1dGUgKyAnXScpO1xuICAgICAgICBzcmNBdHRyaWJ1dGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpITtcbiAgICAgICAgICBpZiAoIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgLy8gSnVzdCBwYXN0ZSB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgc3JjIGxvY2F0aW9uIGFmdGVyIHRoZSBkb2N1bWVudHJvb3RQYXRoXG4gICAgICAgICAgICAvLyBvbGQgcGNpcyBjYW4gaGF2ZSBhIC5qcywgbmV3IHBjaSdzIGRvbid0XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYmFzZS11cmwnLCB1cmkpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdtb2R1bGUnLFxuICAgICAgICAgICAgICBkb2N1bWVudFBhdGggKyAnLycgKyBlbmNvZGVVUkkoc3JjVmFsdWUgKyAoc3JjVmFsdWUuZW5kc1dpdGgoJy5qcycpID8gJycgOiAnLmpzJykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudE5hbWU6ICh0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudCwgdGFnTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtOiBzdHJpbmcgPSAnZXh0ZW5kJyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQsIHBhcmFtKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjdXN0b21JbnRlcmFjdGlvbihiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvcigncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpO1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QgPSBxdGlDdXN0b21JbnRlcmFjdGlvbi5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtcmVmJywgYmFzZVJlZik7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1pdGVtJywgYmFzZVJlZiArIGJhc2VJdGVtKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YScsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucmVtb3ZlQ2hpbGQocXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCgpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgc3RyaXBTdHlsZVNoZWV0cygpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGh0bWwoKSB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0b0hUTUwoeG1sRnJhZ21lbnQpKTtcbiAgICB9LFxuICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgaHRtbERvYygpIHtcbiAgICAgIHJldHVybiB0b0hUTUwoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgIHJldHVybiB4bWxGcmFnbWVudDsgLy8gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBpO1xufTtcbiIsICJpbXBvcnQgeyBsb2FkWE1MLCBwYXJzZVhNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybU1hbmlmZXN0ID0gKCk6IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHlwZW9mIGFwaT47XG4gICAgYXNzZXNzbWVudFRlc3Q6ICgpID0+IHsgaHJlZjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfTtcbiAgfSA9PiB7XG4gICAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcbiAgXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgYXN5bmMgbG9hZCh1cmkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHR5cGVvZiBhcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsb2FkWE1MKHVyaSkudGhlbih4bWwgPT4ge1xuICAgICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICB9LFxuICAgICAgYXNzZXNzbWVudFRlc3QoKSB7XG4gICAgICAgIGNvbnN0IGVsID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvcigncmVzb3VyY2VbdHlwZT1cImltc3F0aV90ZXN0X3htbHYzcDBcIl0nKTtcbiAgICAgICAgcmV0dXJuIHsgaHJlZjogZWwuZ2V0QXR0cmlidXRlKCdocmVmJyksIGlkZW50aWZpZXI6IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBpO1xuICB9OyIsICJcbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlIGFuZCB0cmFuc2Zvcm0gUVRJIHRlc3RzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybVRlc3QoKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ2h0dHBzOi8vZXhhbXBsZS5jb20vdGVzdC54bWwnKTtcbiAqIGNvbnN0IGl0ZW1zID0gcXRpVHJhbnNmb3JtZXIuaXRlbXMoKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqL1xuXG5pbXBvcnQgeyBpdGVtc0Zyb21UZXN0LCBsb2FkWE1MLCBwYXJzZVhNTCwgdG9IVE1MIH0gZnJvbSBcIi4vcXRpLXRyYW5zZm9ybWVyc1wiO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1UZXN0QXBpID0ge1xuICAgIGxvYWQ6ICh1cmk6IHN0cmluZykgPT4gUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPjtcbiAgICBwYXJzZTogKHhtbFN0cmluZzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybVRlc3RBcGk7XG4gICAgaXRlbXM6ICgpID0+IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdO1xuICAgIGh0bWw6ICgpID0+IHN0cmluZztcbiAgICB4bWw6ICgpID0+IHN0cmluZztcbiAgICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICAgIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG4gIH1cbiAgXG4gIGV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1UZXN0ID0gKCk6IHRyYW5zZm9ybVRlc3RBcGkgPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaTp0cmFuc2Zvcm1UZXN0QXBpID0ge1xuICAgICAgYXN5bmMgbG9hZCh1cmkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHRyYW5zZm9ybVRlc3RBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsb2FkWE1MKHVyaSkudGhlbih4bWwgPT4ge1xuICAgICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuICAgICAgZm4oZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpIHtcbiAgICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gaXRlbXNGcm9tVGVzdCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgICB9LFxuICAgICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICAgIH0sXG4gICAgICBodG1sRG9jKCkge1xuICAgICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICAgIH0sXG4gICAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgICByZXR1cm4geG1sRnJhZ21lbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBpO1xuICB9OyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsSUFBTSxNQUFNLE9BQU87QUFlbkIsSUFBTSxZQUFZO0FBQUE7QUFBQTtB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
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Browser based QTI-XML to HTML transformer.
3
+ * Returns an object with methods to load, parse, transform and serialize QTI XML items.
4
+ * @returns An object with methods to load, parse, transform and serialize QTI XML items.
5
+ * @example
6
+ * const qtiTransformer = qtiTransformItem();
7
+ * await qtiTransformer.load('path/to/xml/file.xml');
8
+ * qtiTransformer.path('/assessmentItem/itemBody');
9
+ * const html = qtiTransformer.html();
10
+ * const xml = qtiTransformer.xml();
11
+ * const htmldoc = qtiTransformer.htmldoc();
12
+ * const xmldoc = qtiTransformer.xmldoc();
13
+ *
14
+ * qtiTransformItem().parse(storyXML).html()
15
+ */
16
+ type transformItemApi = {
17
+ load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;
18
+ parse: (xmlString: string) => transformItemApi;
19
+ path: (location: string) => transformItemApi;
20
+ fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;
21
+ pciHooks: (uri: string) => transformItemApi;
22
+ extendElementName: (elementName: string, extend: string) => transformItemApi;
23
+ extendElementsWithClass: (param?: string) => transformItemApi;
24
+ customInteraction: (baseRef: string, baseItem: string) => transformItemApi;
25
+ convertCDATAtoComment: () => transformItemApi;
26
+ stripStyleSheets: () => transformItemApi;
27
+ html: () => string;
28
+ xml: () => string;
29
+ htmlDoc: () => DocumentFragment;
30
+ xmlDoc: () => XMLDocument;
31
+ };
32
+ declare const qtiTransformItem: () => transformItemApi;
33
+
34
+ declare const qtiTransformManifest: () => {
35
+ load: (uri: string) => Promise<{
36
+ load(uri: any): Promise<any>;
37
+ parse(xmlString: string): void;
38
+ assessmentTest(): {
39
+ href: string;
40
+ identifier: string;
41
+ };
42
+ }>;
43
+ assessmentTest: () => {
44
+ href: string;
45
+ identifier: string;
46
+ };
47
+ };
48
+
49
+ /**
50
+ * Returns an object with methods to load, parse and transform QTI tests.
51
+ * @returns An object with methods to load, parse and transform QTI tests.
52
+ * @example
53
+ * const qtiTransformer = qtiTransformTest();
54
+ * await qtiTransformer.load('https://example.com/test.xml');
55
+ * const items = qtiTransformer.items();
56
+ * const html = qtiTransformer.html();
57
+ * const xml = qtiTransformer.xml();
58
+ */
59
+ type transformTestApi = {
60
+ load: (uri: string) => Promise<transformTestApi>;
61
+ parse: (xmlString: string) => transformTestApi;
62
+ fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;
63
+ items: () => {
64
+ identifier: string;
65
+ href: string;
66
+ category: string;
67
+ }[];
68
+ html: () => string;
69
+ xml: () => string;
70
+ htmlDoc: () => DocumentFragment;
71
+ xmlDoc: () => XMLDocument;
72
+ };
73
+ declare const qtiTransformTest: () => transformTestApi;
74
+
75
+ export { qtiTransformItem, qtiTransformManifest, qtiTransformTest, type transformItemApi, type transformTestApi };