+ ): string {
+ return cheerioAPI(tag).css('font-size') || '20pt';
+ }
+
+ private static getTextAlignment(
+ cheerioAPI: cheerio.CheerioAPI,
+ elem: Element
+ ): string {
+ return cheerioAPI(elem).css('text-align') || 'left';
+ }
+
+ private static stripFromLeadingEmptyParagraph(html: string): string {
+ return html.replace(/^<\/p>/, '');
+ }
+
+ private static convertLineBreaksToHTMLBreaks(html: string): string {
+ return html.replace(/\n/g, '
');
+ }
+
+ private static prepareHtml(html: string): string {
+ return CodebookDocxGenerator.convertLineBreaksToHTMLBreaks(
+ CodebookDocxGenerator.stripFromLeadingEmptyParagraph(html)
+ );
+ }
+
+ private static decodeLatex(latex: string): string {
+ if (!latex) return '';
+ try {
+ return decodeURIComponent(latex);
+ } catch {
+ return latex;
+ }
+ }
+
+ private static latexToOmml(latex: string): ImportedXmlComponent | null {
+ const trimmed = latex.trim();
+ if (!trimmed) return null;
+ try {
+ if (!CodebookDocxGenerator.ommlCache[trimmed]) {
+ const mathml = katex.renderToString(trimmed, {
+ output: 'mathml',
+ throwOnError: false,
+ strict: 'ignore'
+ });
+ CodebookDocxGenerator.ommlCache[trimmed] = mml2omml(mathml);
+ }
+ const omml = CodebookDocxGenerator.ommlCache[trimmed];
+ return CodebookDocxGenerator.unwrapImportedXmlRoot(
+ ImportedXmlComponent.fromXmlString(
+ CodebookDocxGenerator.sanitizeOmmlXml(omml)
+ )
+ );
+ } catch {
+ return null;
+ }
+ }
+
+ private static unwrapImportedXmlRoot(
+ component: ImportedXmlComponent
+ ): ImportedXmlComponent {
+ const importedComponent = component as ImportedXmlComponent & {
+ root?: Array;
+ rootKey?: string;
+ };
+ if (importedComponent.rootKey !== undefined) {
+ return component;
+ }
+
+ const firstChild = importedComponent.root?.[0];
+ return typeof firstChild === 'object' && firstChild !== null ?
+ firstChild as ImportedXmlComponent :
+ component;
+ }
+
+ private static isMathComponent(
+ child: ParagraphChild
+ ): child is ImportedXmlComponent {
+ if (typeof child !== 'object' || child === null) {
+ return false;
+ }
+ const importedChild = child as ImportedXmlComponent & {
+ rootKey?: string;
+ };
+ return importedChild.rootKey === 'm:oMath' ||
+ importedChild.rootKey === 'm:oMathPara';
+ }
+
+ private static createLeftAlignedMathParagraph(
+ mathChildren: ImportedXmlComponent[]
+ ): ImportedXmlComponent {
+ const mathParagraph = new ImportedXmlComponent('m:oMathPara');
+ const mathParagraphProperties = new ImportedXmlComponent('m:oMathParaPr');
+ mathParagraphProperties.push(
+ new ImportedXmlComponent('m:jc', { 'm:val': 'left' })
+ );
+ mathParagraph.push(mathParagraphProperties);
+ mathChildren.forEach(mathChild => mathParagraph.push(mathChild));
+ return mathParagraph;
+ }
+
+ private static normalizeParagraphChildren(
+ children: ParagraphChild[]
+ ): ParagraphChild[] {
+ if (!children.length) {
+ return children;
+ }
+
+ const mathChildren = children.filter(
+ CodebookDocxGenerator.isMathComponent
+ ) as ImportedXmlComponent[];
+ if (mathChildren.length === children.length) {
+ return [CodebookDocxGenerator.createLeftAlignedMathParagraph(mathChildren)];
+ }
+
+ return children;
+ }
+
+ private static sanitizeOmmlXml(omml: string): string {
+ if (!omml) return omml;
+ return omml.replace(
+ /(]*>)([\s\S]*?)(<\/m:t>)/g,
+ (_, prefix: string, rawText: string, suffix: string) => `${prefix}${CodebookDocxGenerator.escapeXmlText(rawText)}${suffix}`
+ );
+ }
+
+ private static escapeXmlText(text: string): string {
+ return text
+ .replace(
+ /&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[0-9a-fA-F]+);)/g,
+ '&'
+ )
+ .replace(//g, '>');
+ }
+
+ private static normalizeMathTokens(html: string): string {
+ return html.replace(
+ /\[\[iqb-math:([\s\S]*?)]]/g,
+ (_, encodedFormula: string) => {
+ const latex = this.decodeLatex(encodedFormula);
+ const escapedLatex = latex.replace(/"/g, '"');
+ return ``;
+ }
+ );
+ }
+
+ private static isListParagraph(elem: Element): boolean {
+ return !!elem.parent && (elem.parent as Element).name === 'li';
+ }
+
+ private static htmlToDocx(
+ html: string,
+ contentSetting: CodeBookContentSetting
+ ) {
+ const normalizedHtml = CodebookDocxGenerator.normalizeMathTokens(html);
+ const blockHtml = /<(p|h[1-4]|img|ul|ol)\b/i.test(normalizedHtml) ? normalizedHtml : `${normalizedHtml}
`;
+ const cheerioAPI = cheerio.load(
+ CodebookDocxGenerator.prepareHtml(blockHtml),
+ null,
+ false
+ );
+ const elements: Paragraph[] = [];
+ cheerioAPI('p,h1,h2,h3,h4,img').each((i, elem) => {
+ try {
+ const span = cheerioAPI(elem).find('span');
+ if (elem.name === 'img') {
+ elements.push(CodebookDocxGenerator.createImagePragraph(elem, contentSetting));
+ } else {
+ elements.push(
+ CodebookDocxGenerator.createParagraph(
+ cheerioAPI,
+ elem.children,
+ CodebookDocxGenerator.getTextAlignment(cheerioAPI, elem),
+ CodebookDocxGenerator.getColor(cheerioAPI, span),
+ CodebookDocxGenerator.getBackgroundColor(cheerioAPI, elem),
+ CodebookDocxGenerator.getSize(cheerioAPI, span),
+ CodebookDocxGenerator.isListParagraph(elem)
+ )
+ );
+ }
+ } catch {
+ elements.push(
+ new Paragraph({
+ text: 'HTML konnte nicht verarbeitet werden.'
+ })
+ );
+ }
+ });
+ return elements.filter(e => e !== undefined && e !== null);
+ }
+
+ private static getFontSize(size: string): number {
+ const sizeTypes = [
+ 'xx-small',
+ 'x-small',
+ 'small',
+ 'medium',
+ 'large',
+ 'x-large',
+ 'xx-large'
+ ];
+ return sizeTypes.includes(size) ? 20 : parseInt(size, 10);
+ }
+
+ private static getAlignment(
+ textAlignment: string
+ ): typeof AlignmentType[keyof typeof AlignmentType] {
+ switch (textAlignment) {
+ case 'center':
+ return AlignmentType.CENTER;
+ case 'right':
+ return AlignmentType.RIGHT;
+ case 'justify':
+ return AlignmentType.JUSTIFIED;
+ default:
+ return AlignmentType.LEFT;
+ }
+ }
+
+ private static createParagraph(
+ cheerioAPI: cheerio.CheerioAPI,
+ elem: BasicAcceptedElems,
+ textAlignment: string,
+ colorParsed: string,
+ backgroundColor: string,
+ size: string,
+ isListParagraph: boolean
+ ): Paragraph {
+ const children: ParagraphChild[] = [];
+ const childNodes = CodebookDocxGenerator.getChildren(cheerioAPI, elem);
+ CodebookDocxGenerator.processInlineElements(
+ childNodes,
+ children,
+ colorParsed,
+ backgroundColor,
+ size
+ );
+ const normalizedChildren = CodebookDocxGenerator.normalizeParagraphChildren(
+ children
+ );
+ return new Paragraph({
+ alignment: CodebookDocxGenerator.getAlignment(textAlignment),
+ spacing: {
+ before: 100,
+ after: 100
+ },
+ indent: !isListParagraph ? { start: 100, end: 100 } : undefined,
+ bullet: isListParagraph ? { level: 0 } : undefined,
+ children: normalizedChildren
+ });
+ }
+
+ private static parseCssRgbString(input: string) {
+ const parts = input
+ ?.replace(/rgba?\(([^)]+)\)/, '$1')
+ .split(/[,\s/]+/)
+ .filter(Boolean);
+ if (parts?.length < 3) {
+ return;
+ }
+
+ const parseValue = (value: string, max: number) => {
+ // eslint-disable-next-line no-param-reassign
+ value = value.trim();
+
+ if (value.endsWith('%')) {
+ return Math.min((Number.parseFloat(value) * max) / 100, max);
+ }
+ return Math.min(Number.parseFloat(value), max);
+ };
+ const red = parseValue(parts[0], 255);
+ const green = parseValue(parts[1], 255);
+ const blue = parseValue(parts[2], 255);
+
+ // eslint-disable-next-line consistent-return
+ return [red, green, blue];
+ }
+
+ // Convert RGB color to HEX https://github.com/sindresorhus/rgb-hex
+ // eslint-disable-next-line no-bitwise
+ private static toHex = (red: number, green: number, blue: number) => (blue | (green << 8) | (red << 16) | (1 << 24)).toString(16).slice(1);
+}
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-generation-error.ts b/projects/ngx-coding-components/codebook-generator/codebook-generation-error.ts
new file mode 100644
index 0000000..d6f9f32
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/codebook-generation-error.ts
@@ -0,0 +1,3 @@
+export class CodebookGenerationError extends Error {
+ override name = 'CodebookGenerationError';
+}
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-generator.ts
new file mode 100644
index 0000000..9005e3e
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/codebook-generator.ts
@@ -0,0 +1,89 @@
+import { ToTextFactory } from '@iqb/responses';
+import { CodingScheme, CodeData, VariableCodingData } from '@iqbspecs/coding-scheme';
+import type {
+ BookVariable, CodeBookContentSetting, CodebookUnitDto, CodeInfo, Missing, UnitPropertiesForCodebook
+} from '@iqb/ngx-coding-components/codebook-models';
+import { CodebookGenerationError } from './codebook-generation-error';
+import { hasCodebookManualInstruction } from './manual-instruction';
+
+export class CodebookGenerator {
+ static getCodebookData(units: UnitPropertiesForCodebook[], options: CodeBookContentSetting, missings: Missing[]): CodebookUnitDto[] {
+ return [...units].sort((a, b) => (a.key < b.key ? -1 : Number(a.key > b.key))).map(unit => {
+ let variables: VariableCodingData[] = [];
+ if (unit.scheme) {
+ try {
+ const data = JSON.parse(unit.scheme);
+ if (!Array.isArray(data.variableCodings) || data.variableCodings.some((variable: VariableCodingData) => !variable || typeof variable.id !== 'string' ||
+ (variable.codes !== undefined && (!Array.isArray(variable.codes) || variable.codes.some(code => !code || typeof code !== 'object'))))) {
+ throw new Error('Ungültige variableCodings');
+ }
+ variables = new CodingScheme(unit.scheme).variableCodings;
+ } catch {
+ throw new CodebookGenerationError(`Ungültiges Kodierschema für Aufgabe ${unit.key}.`);
+ }
+ }
+ const bookVariables = variables.map(variable => this.getVariable(variable, options))
+ .filter((variable): variable is BookVariable => variable !== null)
+ .sort((a, b) => (a.id < b.id ? -1 : Number(a.id > b.id)));
+ return {
+ key: unit.key, name: unit.name, variables: bookVariables, missings, items: unit.metadata?.items || []
+ };
+ });
+ }
+
+ static async generateCodebook(units: UnitPropertiesForCodebook[], options: CodeBookContentSetting, missings: Missing[]): Promise {
+ const data = this.getCodebookData(units, options, missings);
+ if (options.exportFormat === 'docx') {
+ const { CodebookDocxGenerator } = await import('./codebook-docx-generator');
+ return CodebookDocxGenerator.generateDocx(data, options);
+ }
+ return new Blob([JSON.stringify(data.map(({
+ key, name, variables, missings: unitMissings
+ }) => ({
+ key, name, variables, missings: unitMissings
+ })))], { type: 'application/json' });
+ }
+
+ private static isClosed(code: CodeData): boolean {
+ return code.type === 'RESIDUAL_AUTO' || code.type === 'INTENDED_INCOMPLETE';
+ }
+
+ private static isManual(code: CodeData): boolean {
+ return !this.isClosed(code) && hasCodebookManualInstruction(code.manualInstruction);
+ }
+
+ private static getVariable(variable: VariableCodingData, options: CodeBookContentSetting): BookVariable | null {
+ if (variable.sourceType === 'BASE_NO_VALUE' || (variable.sourceType !== 'BASE' && !options.hasDerivedVars)) return null;
+ const codes = (variable.codes || []).filter(code => code.id !== undefined && code.id !== null);
+ const manual = codes.some(code => this.isManual(code));
+ const closed = codes.some(code => this.isClosed(code));
+ if ((options.hasOnlyManualCoding || options.hasClosedVars) &&
+ !((options.hasOnlyManualCoding && manual) || (options.hasClosedVars && closed))) return null;
+ const exportedCodes = options.hasOnlyManualCoding && !options.hasClosedVars ? codes.filter(code => this.isManual(code)) : codes;
+ if (options.hasOnlyVarsWithCodes && !exportedCodes.length) return null;
+ return {
+ id: variable.alias || variable.id,
+ label: variable.label || '',
+ sourceType: variable.sourceType,
+ generalInstruction: options.hasGeneralInstructions ? variable.manualInstruction || '' : '',
+ codes: exportedCodes.map(code => this.getCode(code, options))
+ };
+ }
+
+ private static getCode(code: CodeData, options: CodeBookContentSetting): CodeInfo {
+ const fallback: CodeInfo = { id: `${code.id}`, label: '', description: 'Kodierschema mit Schemer Version ab 1.5 erzeugen!
' };
+ if (options.showScore) fallback.score = '';
+ if (Object.prototype.hasOwnProperty.call(code, 'rules')) return fallback;
+ try {
+ const text = ToTextFactory.codeAsText(code, 'SIMPLE');
+ const rules = options.hasOnlyManualCoding && !options.hasClosedVars ? '' :
+ (text.ruleSetDescriptions || []).filter(rule => rule !== 'Keine Regeln definiert.' || !code.manualInstruction)
+ .map(rule => `${rule}
`).join('');
+ const result: CodeInfo = { id: `${code.id}`, label: options.codeLabelToUpper ? text.label.toUpperCase() : text.label, description: `${rules}${code.manualInstruction || ''}` };
+ if (options.showScore) result.score = `${text.score}`;
+ return result;
+ } catch {
+ return fallback;
+ }
+ }
+}
diff --git a/projects/ngx-coding-components/codebook-generator/manual-instruction.ts b/projects/ngx-coding-components/codebook-generator/manual-instruction.ts
new file mode 100644
index 0000000..0a42602
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/manual-instruction.ts
@@ -0,0 +1,12 @@
+import { load } from 'cheerio';
+
+/** Rich-text instructions may consist entirely of an image or a formula. */
+export function hasCodebookManualInstruction(instruction?: string | null): boolean {
+ if (!instruction) return false;
+ const $ = load(instruction);
+ $('script,style').remove();
+ const text = $.root().text().replace(/[\s\u200b-\u200d\ufeff]/g, '');
+ if (text) return true;
+ return $('img').toArray().some(element => /^data:image\/(png|jpeg|jpg|gif|bmp);base64,\S+$/i.test($(element).attr('src') || '')) ||
+ $('span.iqb-math-formula').toArray().some(element => !!$(element).attr('data-latex')?.trim());
+}
diff --git a/projects/ngx-coding-components/codebook-generator/ng-package.json b/projects/ngx-coding-components/codebook-generator/ng-package.json
new file mode 100644
index 0000000..ed27894
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/ng-package.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
+ "lib": {
+ "entryFile": "public-api.ts"
+ }
+}
diff --git a/projects/ngx-coding-components/codebook-generator/public-api.ts b/projects/ngx-coding-components/codebook-generator/public-api.ts
new file mode 100644
index 0000000..017d25a
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/public-api.ts
@@ -0,0 +1,5 @@
+export * from './codebook-generator';
+export * from './codebook-docx-generator';
+export * from './manual-instruction';
+export type * from '@iqb/ngx-coding-components/codebook-models';
+export * from './codebook-generation-error';
diff --git a/projects/ngx-coding-components/codebook-generator/web-colors.ts b/projects/ngx-coding-components/codebook-generator/web-colors.ts
new file mode 100644
index 0000000..df9d391
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-generator/web-colors.ts
@@ -0,0 +1,1275 @@
+/**
+ * The CSS colour names and their hex values, for turning a colour a user picked by name into
+ * something a generated document can paint with.
+ */
+export class WebColors {
+ /**
+ * The hex value for a CSS colour name, or an empty string when the name is unknown. The name has
+ * to be given in lower case -- the table is compared against it as it comes in.
+ */
+ static getHexFromWebColor(colorName: string) {
+ const foundColor = WebColors.colors
+ .find(color => color.name.toLowerCase() === colorName);
+ return foundColor ? foundColor.hex : '';
+ }
+
+ /** The table itself: name, hex and rgb for every CSS colour. */
+ static colors = [
+ {
+ name: 'Lavender',
+ hex: 'E6E6FA',
+ rgb: {
+ r: 230,
+ g: 230,
+ b: 250
+ }
+ },
+ {
+ name: 'Thistle',
+ hex: 'D8BFD8',
+ rgb: { r: 216, g: 191, b: 216 }
+ },
+ {
+ name: 'Plum',
+ hex: 'DDA0DD',
+ rgb: {
+ r: 221,
+ g: 160,
+ b: 221
+ }
+ },
+ {
+ name: 'Violet',
+ hex: 'EE82EE',
+ rgb: {
+ r: 238,
+ g: 130,
+ b: 238
+ }
+ },
+ {
+ name: 'Orchid',
+ hex: 'DA70D6',
+ rgb: {
+ r: 218,
+ g: 112,
+ b: 214
+ }
+ },
+ {
+ name: 'Fuchsia',
+ hex: 'FF00FF',
+ rgb: {
+ r: 255,
+ g: 0,
+ b: 255
+ }
+ },
+ {
+ name: 'Magenta',
+ hex: 'FF00FF',
+ rgb: {
+ r: 255,
+ g: 0,
+ b: 255
+ }
+ },
+ {
+ name: 'MediumOrchid',
+ hex: 'BA55D3',
+ rgb: {
+ r: 186,
+ g: 85,
+ b: 211
+ }
+ },
+ {
+ name: 'MediumPurple',
+ hex: '9370DB',
+ rgb: {
+ r: 147,
+ g: 112,
+ b: 219
+ }
+ },
+ {
+ name: 'BlueViolet',
+ hex: '8A2BE2',
+ rgb: {
+ r: 138,
+ g: 43,
+ b: 226
+ }
+ },
+ {
+ name: 'DarkViolet',
+ hex: '9400D3',
+ rgb: {
+ r: 148,
+ g: 0,
+ b: 211
+ }
+ },
+ {
+ name: 'DarkOrchid',
+ hex: '9932CC',
+ rgb: {
+ r: 153,
+ g: 50,
+ b: 204
+ }
+ },
+ {
+ name: 'DarkMagenta',
+ hex: '8B008B',
+ rgb: {
+ r: 139,
+ g: 0,
+ b: 139
+ }
+ },
+ {
+ name: 'Purple',
+ hex: '800080',
+ rgb: {
+ r: 128,
+ g: 0,
+ b: 128
+ }
+ },
+ {
+ name: 'Indigo',
+ hex: '4B0082',
+ rgb: {
+ r: 75,
+ g: 0,
+ b: 130
+ }
+ },
+ {
+ name: 'DarkSlateBlue',
+ hex: '483D8B',
+ rgb: {
+ r: 72,
+ g: 61,
+ b: 139
+ }
+ },
+ {
+ name: 'SlateBlue',
+ hex: '6A5ACD',
+ rgb: {
+ r: 106,
+ g: 90,
+ b: 205
+ }
+ },
+ {
+ name: 'MediumSlateBlue',
+ hex: '7B68EE',
+ rgb: {
+ r: 123,
+ g: 104,
+ b: 238
+ }
+ },
+ {
+ name: 'Pink',
+ hex: 'FFC0CB',
+ rgb: {
+ r: 255,
+ g: 192,
+ b: 203
+ }
+ },
+ {
+ name: 'LightPink',
+ hex: 'FFB6C1',
+ rgb: {
+ r: 255,
+ g: 182,
+ b: 193
+ }
+ },
+ {
+ name: 'HotPink',
+ hex: 'FF69B4',
+ rgb: {
+ r: 255,
+ g: 105,
+ b: 180
+ }
+ },
+ {
+ name: 'DeepPink',
+ hex: 'FF1493',
+ rgb: {
+ r: 255,
+ g: 20,
+ b: 147
+ }
+ },
+ {
+ name: 'PaleVioletRed',
+ hex: 'DB7093',
+ rgb: {
+ r: 219,
+ g: 112,
+ b: 147
+ }
+ },
+ {
+ name: 'MediumVioletRed',
+ hex: 'C71585',
+ rgb: {
+ r: 199,
+ g: 21,
+ b: 133
+ }
+ },
+ {
+ name: 'LightSalmon',
+ hex: 'FFA07A',
+ rgb: {
+ r: 255,
+ g: 160,
+ b: 122
+ }
+ },
+ {
+ name: 'Salmon',
+ hex: 'FA8072',
+ rgb: {
+ r: 250,
+ g: 128,
+ b: 114
+ }
+ },
+ {
+ name: 'DarkSalmon',
+ hex: 'E9967A',
+ rgb: {
+ r: 233,
+ g: 150,
+ b: 122
+ }
+ },
+ {
+ name: 'LightCoral',
+ hex: 'F08080',
+ rgb: {
+ r: 240,
+ g: 128,
+ b: 128
+ }
+ },
+ {
+ name: 'IndianRed',
+ hex: 'CD5C5C',
+ rgb: {
+ r: 205,
+ g: 92,
+ b: 92
+ }
+ },
+ {
+ name: 'Crimson',
+ hex: 'DC143C',
+ rgb: {
+ r: 220,
+ g: 20,
+ b: 60
+ }
+ },
+ {
+ name: 'FireBrick',
+ hex: 'B22222',
+ rgb: {
+ r: 178,
+ g: 34,
+ b: 34
+ }
+ },
+ {
+ name: 'DarkRed',
+ hex: '8B0000',
+ rgb: {
+ r: 139,
+ g: 0,
+ b: 0
+ }
+ },
+ {
+ name: 'Red',
+ hex: 'FF0000',
+ rgb: {
+ r: 255,
+ g: 0,
+ b: 0
+ }
+ },
+ {
+ name: 'OrangeRed',
+ hex: 'FF4500',
+ rgb: {
+ r: 255,
+ g: 69,
+ b: 0
+ }
+ },
+ {
+ name: 'Tomato',
+ hex: 'FF6347',
+ rgb: {
+ r: 255,
+ g: 99,
+ b: 71
+ }
+ },
+ {
+ name: 'Coral',
+ hex: 'FF7F50',
+ rgb: {
+ r: 255,
+ g: 127,
+ b: 80
+ }
+ },
+ {
+ name: 'DarkOrange',
+ hex: 'FF8C00',
+ rgb: {
+ r: 255,
+ g: 140,
+ b: 0
+ }
+ },
+ {
+ name: 'Orange',
+ hex: 'FFA500',
+ rgb: {
+ r: 255,
+ g: 165,
+ b: 0
+ }
+ },
+ {
+ name: 'Yellow',
+ hex: 'FFFF00',
+ rgb: {
+ r: 255,
+ g: 255,
+ b: 0
+ }
+ },
+ {
+ name: 'LightYellow',
+ hex: 'FFFFE0',
+ rgb: {
+ r: 255,
+ g: 255,
+ b: 224
+ }
+ },
+ {
+ name: 'LemonChiffon',
+ hex: 'FFFACD',
+ rgb: {
+ r: 255,
+ g: 250,
+ b: 205
+ }
+ },
+ {
+ name: 'LightGoldenrodYellow',
+ hex: 'FAFAD2',
+ rgb: {
+ r: 250,
+ g: 250,
+ b: 210
+ }
+ },
+ {
+ name: 'PapayaWhip',
+ hex: 'FFEFD5',
+ rgb: {
+ r: 255,
+ g: 239,
+ b: 213
+ }
+ },
+ {
+ name: 'Moccasin',
+ hex: 'FFE4B5',
+ rgb: {
+ r: 255,
+ g: 228,
+ b: 181
+ }
+ },
+ {
+ name: 'PeachPuff',
+ hex: 'FFDAB9',
+ rgb: {
+ r: 255,
+ g: 218,
+ b: 185
+ }
+ },
+ {
+ name: 'PaleGoldenrod',
+ hex: 'EEE8AA',
+ rgb: {
+ r: 238,
+ g: 232,
+ b: 170
+ }
+ },
+ {
+ name: 'Khaki',
+ hex: 'F0E68C',
+ rgb: {
+ r: 240,
+ g: 230,
+ b: 140
+ }
+ },
+ {
+ name: 'DarkKhaki',
+ hex: 'BDB76B',
+ rgb: {
+ r: 189,
+ g: 183,
+ b: 107
+ }
+ },
+ {
+ name: 'Gold',
+ hex: 'FFD700',
+ rgb: {
+ r: 255,
+ g: 215,
+ b: 0
+ }
+ },
+ {
+ name: 'Cornsilk',
+ hex: 'FFF8DC',
+ rgb: {
+ r: 255,
+ g: 248,
+ b: 220
+ }
+ },
+ {
+ name: 'BlanchedAlmond',
+ hex: 'FFEBCD',
+ rgb: {
+ r: 255,
+ g: 235,
+ b: 205
+ }
+ },
+ {
+ name: 'Bisque',
+ hex: 'FFE4C4',
+ rgb: {
+ r: 255,
+ g: 228,
+ b: 196
+ }
+ },
+ {
+ name: 'NavajoWhite',
+ hex: 'FFDEAD',
+ rgb: {
+ r: 255,
+ g: 222,
+ b: 173
+ }
+ },
+ {
+ name: 'Wheat',
+ hex: 'F5DEB3',
+ rgb: {
+ r: 245,
+ g: 222,
+ b: 179
+ }
+ },
+ {
+ name: 'BurlyWood',
+ hex: 'DEB887',
+ rgb: {
+ r: 222,
+ g: 184,
+ b: 135
+ }
+ },
+ {
+ name: 'Tan',
+ hex: 'D2B48C',
+ rgb: {
+ r: 210,
+ g: 180,
+ b: 140
+ }
+ },
+ {
+ name: 'RosyBrown',
+ hex: 'BC8F8F',
+ rgb: {
+ r: 188,
+ g: 143,
+ b: 143
+ }
+ },
+ {
+ name: 'SandyBrown',
+ hex: 'F4A460',
+ rgb: {
+ r: 244,
+ g: 164,
+ b: 96
+ }
+ },
+ {
+ name: 'Goldenrod',
+ hex: 'DAA520',
+ rgb: {
+ r: 218,
+ g: 165,
+ b: 32
+ }
+ },
+ {
+ name: 'DarkGoldenrod',
+ hex: 'B8860B',
+ rgb: {
+ r: 184,
+ g: 134,
+ b: 11
+ }
+ },
+ {
+ name: 'Peru',
+ hex: 'CD853F',
+ rgb: {
+ r: 205,
+ g: 133,
+ b: 63
+ }
+ },
+ {
+ name: 'Chocolate',
+ hex: 'D2691E',
+ rgb: {
+ r: 210,
+ g: 105,
+ b: 30
+ }
+ },
+ {
+ name: 'SaddleBrown',
+ hex: '8B4513',
+ rgb: {
+ r: 139,
+ g: 69,
+ b: 19
+ }
+ },
+ {
+ name: 'Sienna',
+ hex: 'A0522D',
+ rgb: {
+ r: 160,
+ g: 82,
+ b: 45
+ }
+ },
+ {
+ name: 'Brown',
+ hex: 'A52A2A',
+ rgb: {
+ r: 165,
+ g: 42,
+ b: 42
+ }
+ },
+ {
+ name: 'Maroon',
+ hex: '800000',
+ rgb: {
+ r: 128,
+ g: 0,
+ b: 0
+ }
+ },
+ {
+ name: 'DarkOliveGreen',
+ hex: '556B2F',
+ rgb: {
+ r: 85,
+ g: 107,
+ b: 47
+ }
+ },
+ {
+ name: 'Olive',
+ hex: '808000',
+ rgb: {
+ r: 128,
+ g: 128,
+ b: 0
+ }
+ },
+ {
+ name: 'OliveDrab',
+ hex: '6B8E23',
+ rgb: {
+ r: 107,
+ g: 142,
+ b: 35
+ }
+ },
+ {
+ name: 'YellowGreen',
+ hex: '9ACD32',
+ rgb: {
+ r: 154,
+ g: 205,
+ b: 50
+ }
+ },
+ {
+ name: 'LimeGreen',
+ hex: '32CD32',
+ rgb: {
+ r: 50,
+ g: 205,
+ b: 50
+ }
+ },
+ {
+ name: 'Lime',
+ hex: '00FF00',
+ rgb: {
+ r: 0,
+ g: 255,
+ b: 0
+ }
+ },
+ {
+ name: 'LawnGreen',
+ hex: '7CFC00',
+ rgb: {
+ r: 124,
+ g: 252,
+ b: 0
+ }
+ },
+ {
+ name: 'Chartreuse',
+ hex: '7FFF00',
+ rgb: {
+ r: 127,
+ g: 255,
+ b: 0
+ }
+ },
+ {
+ name: 'GreenYellow',
+ hex: 'ADFF2F',
+ rgb: {
+ r: 173,
+ g: 255,
+ b: 47
+ }
+ },
+ {
+ name: 'SpringGreen',
+ hex: '00FF7F',
+ rgb: {
+ r: 0,
+ g: 255,
+ b: 127
+ }
+ },
+ {
+ name: 'MediumSpringGreen',
+ hex: '00FA9A',
+ rgb: {
+ r: 0,
+ g: 250,
+ b: 154
+ }
+ },
+ {
+ name: 'LightGreen',
+ hex: '90EE90',
+ rgb: {
+ r: 144,
+ g: 238,
+ b: 144
+ }
+ },
+ {
+ name: 'PaleGreen',
+ hex: '98FB98',
+ rgb: {
+ r: 152,
+ g: 251,
+ b: 152
+ }
+ },
+ {
+ name: 'DarkSeaGreen',
+ hex: '8FBC8F',
+ rgb: {
+ r: 143,
+ g: 188,
+ b: 143
+ }
+ },
+ {
+ name: 'MediumSeaGreen',
+ hex: '3CB371',
+ rgb: {
+ r: 60,
+ g: 179,
+ b: 113
+ }
+ },
+ {
+ name: 'SeaGreen',
+ hex: '2E8B57',
+ rgb: {
+ r: 46,
+ g: 139,
+ b: 87
+ }
+ },
+ {
+ name: 'ForestGreen',
+ hex: '228B22',
+ rgb: {
+ r: 34,
+ g: 139,
+ b: 34
+ }
+ },
+ {
+ name: 'Green',
+ hex: '008000',
+ rgb: {
+ r: 0,
+ g: 128,
+ b: 0
+ }
+ },
+ {
+ name: 'DarkGreen',
+ hex: '006400',
+ rgb: {
+ r: 0,
+ g: 100,
+ b: 0
+ }
+ },
+ {
+ name: 'MediumAquamarine',
+ hex: '66CDAA',
+ rgb: {
+ r: 102,
+ g: 205,
+ b: 170
+ }
+ },
+ {
+ name: 'Aqua',
+ hex: '00FFFF',
+ rgb: {
+ r: 0,
+ g: 255,
+ b: 255
+ }
+ },
+ {
+ name: 'Cyan',
+ hex: '00FFFF',
+ rgb: {
+ r: 0,
+ g: 255,
+ b: 255
+ }
+ },
+ {
+ name: 'LightCyan',
+ hex: 'E0FFFF',
+ rgb: {
+ r: 224,
+ g: 255,
+ b: 255
+ }
+ },
+ {
+ name: 'PaleTurquoise',
+ hex: 'AFEEEE',
+ rgb: {
+ r: 175,
+ g: 238,
+ b: 238
+ }
+ },
+ {
+ name: 'Aquamarine',
+ hex: '7FFFD4',
+ rgb: {
+ r: 127,
+ g: 255,
+ b: 212
+ }
+ },
+ {
+ name: 'Turquoise',
+ hex: '40E0D0',
+ rgb: {
+ r: 64,
+ g: 224,
+ b: 208
+ }
+ },
+ {
+ name: 'MediumTurquoise',
+ hex: '48D1CC',
+ rgb: {
+ r: 72,
+ g: 209,
+ b: 204
+ }
+ },
+ {
+ name: 'DarkTurquoise',
+ hex: '00CED1',
+ rgb: {
+ r: 0,
+ g: 206,
+ b: 209
+ }
+ },
+ {
+ name: 'LightSeaGreen',
+ hex: '20B2AA',
+ rgb: {
+ r: 32,
+ g: 178,
+ b: 170
+ }
+ },
+ {
+ name: 'CadetBlue',
+ hex: '5F9EA0',
+ rgb: {
+ r: 95,
+ g: 158,
+ b: 160
+ }
+ },
+ {
+ name: 'DarkCyan',
+ hex: '008B8B',
+ rgb: {
+ r: 0,
+ g: 139,
+ b: 139
+ }
+ },
+ {
+ name: 'Teal',
+ hex: '008080',
+ rgb: {
+ r: 0,
+ g: 128,
+ b: 128
+ }
+ },
+ {
+ name: 'LightSteelBlue',
+ hex: 'B0C4DE',
+ rgb: {
+ r: 176,
+ g: 196,
+ b: 222
+ }
+ },
+ {
+ name: 'PowderBlue',
+ hex: 'B0E0E6',
+ rgb: {
+ r: 176,
+ g: 224,
+ b: 230
+ }
+ },
+ {
+ name: 'LightBlue',
+ hex: 'ADD8E6',
+ rgb: {
+ r: 173,
+ g: 216,
+ b: 230
+ }
+ },
+ {
+ name: 'SkyBlue',
+ hex: '87CEEB',
+ rgb: {
+ r: 135,
+ g: 206,
+ b: 235
+ }
+ },
+ {
+ name: 'LightSkyBlue',
+ hex: '87CEFA',
+ rgb: {
+ r: 135,
+ g: 206,
+ b: 250
+ }
+ },
+ {
+ name: 'DeepSkyBlue',
+ hex: '00BFFF',
+ rgb: {
+ r: 0,
+ g: 191,
+ b: 255
+ }
+ },
+ {
+ name: 'DodgerBlue',
+ hex: '1E90FF',
+ rgb: {
+ r: 30,
+ g: 144,
+ b: 255
+ }
+ },
+ {
+ name: 'CornflowerBlue',
+ hex: '6495ED',
+ rgb: {
+ r: 100,
+ g: 149,
+ b: 237
+ }
+ },
+ {
+ name: 'SteelBlue',
+ hex: '4682B4',
+ rgb: {
+ r: 70,
+ g: 130,
+ b: 180
+ }
+ },
+ {
+ name: 'RoyalBlue',
+ hex: '4169E1',
+ rgb: {
+ r: 65,
+ g: 105,
+ b: 225
+ }
+ },
+ {
+ name: 'Blue',
+ hex: '0000FF',
+ rgb: {
+ r: 0,
+ g: 0,
+ b: 255
+ }
+ },
+ {
+ name: 'MediumBlue',
+ hex: '0000CD',
+ rgb: {
+ r: 0,
+ g: 0,
+ b: 205
+ }
+ },
+ {
+ name: 'DarkBlue',
+ hex: '00008B',
+ rgb: {
+ r: 0,
+ g: 0,
+ b: 139
+ }
+ },
+ {
+ name: 'Navy',
+ hex: '000080',
+ rgb: {
+ r: 0,
+ g: 0,
+ b: 128
+ }
+ },
+ {
+ name: 'MidnightBlue',
+ hex: '191970',
+ rgb: {
+ r: 25,
+ g: 25,
+ b: 112
+ }
+ },
+ {
+ name: 'White',
+ hex: 'FFFFFF',
+ rgb: {
+ r: 255,
+ g: 255,
+ b: 255
+ }
+ },
+ {
+ name: 'Snow',
+ hex: 'FFFAFA',
+ rgb: {
+ r: 255,
+ g: 250,
+ b: 250
+ }
+ },
+ {
+ name: 'Honeydew',
+ hex: 'F0FFF0',
+ rgb: {
+ r: 240,
+ g: 255,
+ b: 240
+ }
+ },
+ {
+ name: 'MintCream',
+ hex: 'F5FFFA',
+ rgb: {
+ r: 245,
+ g: 255,
+ b: 250
+ }
+ },
+ {
+ name: 'Azure',
+ hex: 'F0FFFF',
+ rgb: {
+ r: 240,
+ g: 255,
+ b: 255
+ }
+ },
+ {
+ name: 'AliceBlue',
+ hex: 'F0F8FF',
+ rgb: {
+ r: 240,
+ g: 248,
+ b: 255
+ }
+ },
+ {
+ name: 'GhostWhite',
+ hex: 'F8F8FF',
+ rgb: {
+ r: 248,
+ g: 248,
+ b: 255
+ }
+ },
+ {
+ name: 'WhiteSmoke',
+ hex: 'F5F5F5',
+ rgb: {
+ r: 245,
+ g: 245,
+ b: 245
+ }
+ },
+ {
+ name: 'Seashell',
+ hex: 'FFF5EE',
+ rgb: {
+ r: 255,
+ g: 245,
+ b: 238
+ }
+ },
+ {
+ name: 'Beige',
+ hex: 'F5F5DC',
+ rgb: {
+ r: 245,
+ g: 245,
+ b: 220
+ }
+ },
+ {
+ name: 'OldLace',
+ hex: 'FDF5E6',
+ rgb: {
+ r: 253,
+ g: 245,
+ b: 230
+ }
+ },
+ {
+ name: 'FloralWhite',
+ hex: 'FFFAF0',
+ rgb: {
+ r: 255,
+ g: 250,
+ b: 240
+ }
+ },
+ {
+ name: 'Ivory',
+ hex: 'FFFFF0',
+ rgb: {
+ r: 255,
+ g: 255,
+ b: 240
+ }
+ },
+ {
+ name: 'AntiqueWhite',
+ hex: 'FAEBD7',
+ rgb: {
+ r: 250,
+ g: 235,
+ b: 215
+ }
+ },
+ {
+ name: 'Linen',
+ hex: 'FAF0E6',
+ rgb: {
+ r: 250,
+ g: 240,
+ b: 230
+ }
+ },
+ {
+ name: 'LavenderBlush',
+ hex: 'FFF0F5',
+ rgb: {
+ r: 255,
+ g: 240,
+ b: 245
+ }
+ },
+ {
+ name: 'MistyRose',
+ hex: 'FFE4E1',
+ rgb: {
+ r: 255,
+ g: 228,
+ b: 225
+ }
+ },
+ {
+ name: 'Gainsboro',
+ hex: 'DCDCDC',
+ rgb: {
+ r: 220,
+ g: 220,
+ b: 220
+ }
+ },
+ {
+ name: 'LightGray',
+ hex: 'D3D3D3',
+ rgb: {
+ r: 211,
+ g: 211,
+ b: 211
+ }
+ },
+ {
+ name: 'Silver',
+ hex: 'C0C0C0',
+ rgb: {
+ r: 192,
+ g: 192,
+ b: 192
+ }
+ },
+ {
+ name: 'DarkGray',
+ hex: 'A9A9A9',
+ rgb: {
+ r: 169,
+ g: 169,
+ b: 169
+ }
+ },
+ {
+ name: 'Gray',
+ hex: '808080',
+ rgb: {
+ r: 128,
+ g: 128,
+ b: 128
+ }
+ },
+ {
+ name: 'DimGray',
+ hex: '696969',
+ rgb: {
+ r: 105,
+ g: 105,
+ b: 105
+ }
+ },
+ {
+ name: 'LightSlateGray',
+ hex: '778899',
+ rgb: {
+ r: 119,
+ g: 136,
+ b: 153
+ }
+ },
+ {
+ name: 'SlateGray',
+ hex: '708090',
+ rgb: {
+ r: 112,
+ g: 128,
+ b: 144
+ }
+ },
+ {
+ name: 'DarkSlateGray',
+ hex: '2F4F4F',
+ rgb: {
+ r: 47,
+ g: 79,
+ b: 79
+ }
+ },
+ {
+ name: 'Black',
+ hex: '000000',
+ rgb: {
+ r: 0,
+ g: 0,
+ b: 0
+ }
+ }
+ ];
+}
diff --git a/projects/ngx-coding-components/codebook-models/ng-package.json b/projects/ngx-coding-components/codebook-models/ng-package.json
new file mode 100644
index 0000000..ed27894
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-models/ng-package.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
+ "lib": {
+ "entryFile": "public-api.ts"
+ }
+}
diff --git a/projects/ngx-coding-components/codebook-models/public-api.ts b/projects/ngx-coding-components/codebook-models/public-api.ts
new file mode 100644
index 0000000..1b21f73
--- /dev/null
+++ b/projects/ngx-coding-components/codebook-models/public-api.ts
@@ -0,0 +1,155 @@
+import { VariableInfo } from '@iqbspecs/variable-info/variable-info.interface';
+
+/**
+ * Item metadata for codebook
+ */
+export interface ItemMetadata {
+ id: string;
+ variableId: string;
+}
+
+/**
+ * Settings for codebook content generation
+ */
+export interface CodeBookContentSetting {
+ /** Export format (docx or json) */
+ exportFormat: 'json' | 'docx';
+ /** Missings profile name */
+ missingsProfile: string;
+ /** Include only manual coding */
+ hasOnlyManualCoding: boolean;
+ /** Include general instructions */
+ hasGeneralInstructions: boolean;
+ /** Include derived variables */
+ hasDerivedVars: boolean;
+ /** Include only variables with codes */
+ hasOnlyVarsWithCodes: boolean;
+ /** Include closed variables */
+ hasClosedVars: boolean;
+ /** Convert code labels to uppercase */
+ codeLabelToUpper: boolean;
+ /** Show score */
+ showScore: boolean;
+ /** Hide item-variable relation */
+ hideItemVarRelation: boolean;
+}
+
+/**
+ * Missing code definition
+ */
+export interface Missing {
+ /** Missing code */
+ code: string | number;
+ /** Missing label */
+ label: string;
+ /** Missing description */
+ description: string;
+}
+
+/**
+ * Code information for codebook
+ */
+export interface CodeInfo {
+ /** Code ID */
+ id: string;
+ /** Code label */
+ label: string;
+ /** Code description */
+ description: string;
+ /** Code score (optional) */
+ score?: string;
+}
+
+/**
+ * Variable information for codebook
+ */
+export interface BookVariable {
+ /** Variable ID */
+ id: string;
+ /** Variable label */
+ label: string;
+ /** Variable source type */
+ sourceType: string;
+ /** General instruction */
+ generalInstruction: string;
+ /** Codes */
+ codes: CodeInfo[];
+}
+
+/**
+ * Unit data for codebook
+ */
+export interface CodebookUnitDto {
+ /** Unit key */
+ key: string;
+ /** Unit name */
+ name: string;
+ /** Variables */
+ variables: BookVariable[];
+ /** Missings */
+ missings: Missing[];
+ /** Items (optional) */
+ items?: ItemMetadata[];
+}
+
+/**
+ * Unit properties for codebook generation
+ */
+export interface UnitPropertiesForCodebook {
+ /** Unit ID */
+ id: number;
+ /** Unit key */
+ key: string;
+ /** Unit name */
+ name: string;
+ /** Coding scheme */
+ scheme?: string;
+ /** Scheme type */
+ schemeType?: string;
+ /** Metadata */
+ metadata?: {
+ /** Items */
+ items?: ItemMetadata[];
+ };
+ /** Variables */
+ variables?: VariableInfo[];
+}
+
+/**
+ * Unit selection item for codebook export UI
+ */
+export interface UnitSelectionItem {
+ /** Unit ID */
+ unitId: number;
+ /** Unit name */
+ unitName: string;
+ /** Unit alias */
+ unitAlias?: string | null;
+ key: string;
+ groupName?: string;
+ disabled?: boolean;
+}
+
+/**
+ * Missings profile for selection
+ */
+export interface MissingsProfile {
+ /** Profile ID */
+ id: number;
+ /** Profile label */
+ label: string;
+ /** Missings data */
+ missings?: Missing[] | string;
+}
+
+/**
+ * Codebook export configuration
+ */
+export interface CodebookExportConfig {
+ /** Selected unit IDs */
+ selectedUnits: number[];
+ /** Content options */
+ contentOptions: CodeBookContentSetting;
+ /** Selected missings profile ID */
+ missingsProfileId: number;
+}
diff --git a/projects/ngx-coding-components/ng-package.json b/projects/ngx-coding-components/ng-package.json
index ee0f04d..5b04d68 100644
--- a/projects/ngx-coding-components/ng-package.json
+++ b/projects/ngx-coding-components/ng-package.json
@@ -3,7 +3,13 @@
"dest": "../../dist/ngx-coding-components",
"allowedNonPeerDependencies": [
"@iqb/mathlive",
- "katex"
+ "katex",
+ "docx",
+ "cheerio",
+ "buffer",
+ "image-size",
+ "mathml2omml",
+ "@iqb/responses"
],
"lib": {
"entryFile": "src/public-api.ts"
diff --git a/projects/ngx-coding-components/package.json b/projects/ngx-coding-components/package.json
index 6c753d2..9097043 100644
--- a/projects/ngx-coding-components/package.json
+++ b/projects/ngx-coding-components/package.json
@@ -4,8 +4,8 @@
"exports": {
"./lib/ngx-coding-components.module": "./lib/ngx-coding-components.module.d.ts"
},
- "version": "4.0.0",
- "author": "IQB - Institut zur Qualitätsentwicklung im Bildungswesen",
+ "version": "4.1.0",
+ "author": "IQB - Institut zur Qualit\u00e4tsentwicklung im Bildungswesen",
"license": "MIT",
"description": "Angular components for coding responses in assessments of IQB.",
"repository": {
@@ -29,9 +29,8 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-browser-dynamic": "^21.0.0",
"@angular/router": "^21.0.0",
- "@iqb/responses": "^5.2.2",
"@iqbspecs/coding-scheme": "^3.4.1",
- "@iqbspecs/response": "^2.0.0",
+ "@iqbspecs/response": "^1.5.1 || ^2.0.0",
"@iqbspecs/variable-info": "^1.3.0",
"@ngx-translate/core": "^15.0.0",
"@tiptap/core": "^2.23.1",
@@ -72,7 +71,26 @@
"dependencies": {
"@iqb/mathlive": "^0.4.1",
"katex": "^0.16.11",
- "tslib": "^2.3.0"
+ "tslib": "^2.3.0",
+ "docx": "8.5.0",
+ "cheerio": "1.1.2",
+ "buffer": "6.0.3",
+ "image-size": "1.2.1",
+ "mathml2omml": "0.5.0",
+ "@iqb/responses": "5.2.2"
},
- "sideEffects": false
+ "sideEffects": false,
+ "typesVersions": {
+ "*": {
+ "codebook-models": [
+ "types/iqb-ngx-coding-components-codebook-models.d.ts"
+ ],
+ "codebook-generator": [
+ "types/iqb-ngx-coding-components-codebook-generator.d.ts"
+ ],
+ "codebook-export": [
+ "types/iqb-ngx-coding-components-codebook-export.d.ts"
+ ]
+ }
+ }
}
diff --git a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
new file mode 100644
index 0000000..edba782
--- /dev/null
+++ b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
@@ -0,0 +1,60 @@
+import { SimpleChange } from '@angular/core';
+import { CodebookExportComponent } from '../../../codebook-export/codebook-export.component';
+
+describe('Studio codebook selection contract', () => {
+ let component: CodebookExportComponent;
+ beforeEach(() => {
+ component = new CodebookExportComponent();
+ component.availableUnits = [
+ {
+ unitId: 1, key: 'A', unitName: 'Alpha', groupName: 'Gruppe'
+ },
+ { unitId: 2, key: 'B', unitName: 'Beta' },
+ {
+ unitId: 3, key: 'C', unitName: 'Gesperrt', disabled: true
+ }
+ ];
+ component.ngOnChanges({ availableUnits: new SimpleChange(null, component.availableUnits, true) });
+ });
+
+ it('selects all available units across search results, excluding disabled units', () => {
+ component.filter = 'Alpha'; component.applyFilter(); component.toggleAll();
+ expect(component.selection).toEqual([1, 2]);
+ expect(component.allSelected).toBeTrue();
+ component.toggleAll(); expect(component.selection).toEqual([]);
+ });
+
+ it('searches names, keys and groups without changing selection', () => {
+ component.toggle(component.availableUnits[1]);
+ component.filter = 'gruppe'; component.applyFilter();
+ expect(component.selection).toEqual([2]);
+ expect(component.dataSource.filteredData.map(unit => unit.unitId)).toEqual([1]);
+ });
+
+ it('accepts initial selection and removes unavailable or disabled IDs', () => {
+ component.selectedUnitIds = [1, 3, 999];
+ component.ngOnChanges({ selectedUnitIds: new SimpleChange([], component.selectedUnitIds, true) });
+ expect(component.selection).toEqual([1]);
+ });
+
+ it('emits a copied export configuration without starting a download or a job', () => {
+ component.toggle(component.availableUnits[0]);
+ component.missingsProfiles = [{ id: 8, label: 'Profil' }]; component.selectedMissingsProfileId = 8;
+ const emit = spyOn(component.exportRequested, 'emit');
+ component.exportCodingBook();
+ expect(emit).toHaveBeenCalledWith(jasmine.objectContaining({ selectedUnits: [1], missingsProfileId: 8 }));
+ const config = emit.calls.mostRecent().args[0]!;
+ component.contentOptions.showScore = false;
+ expect(config.contentOptions.showScore).toBeTrue();
+ expect(config.contentOptions.missingsProfile).toBe('Profil');
+ });
+
+ it('blocks export for empty selection, loading, busy and unsaved changes', () => {
+ const emit = spyOn(component.exportRequested, 'emit');
+ component.exportCodingBook(); component.toggle(component.availableUnits[0]);
+ component.loading = true; component.exportCodingBook(); component.loading = false;
+ component.busy = true; component.exportCodingBook(); component.busy = false;
+ component.workspaceChanges = true; component.exportCodingBook();
+ expect(emit).not.toHaveBeenCalled();
+ });
+});
diff --git a/projects/ngx-coding-components/tsconfig.spec.json b/projects/ngx-coding-components/tsconfig.spec.json
index 2432ead..fc50d18 100644
--- a/projects/ngx-coding-components/tsconfig.spec.json
+++ b/projects/ngx-coding-components/tsconfig.spec.json
@@ -7,6 +7,9 @@
"jasmine"
],
"paths": {
+ "@iqb/ngx-coding-components/codebook-export": ["projects/ngx-coding-components/codebook-export/public-api.ts"],
+ "@iqb/ngx-coding-components/codebook-generator": ["projects/ngx-coding-components/codebook-generator/public-api.ts"],
+ "@iqb/ngx-coding-components/codebook-models": ["projects/ngx-coding-components/codebook-models/public-api.ts"],
"@angular/*": ["../../node_modules/@angular/*"],
"@ngx-translate/core": ["../../node_modules/@ngx-translate/core"],
"@ngx-translate/core/*": ["../../node_modules/@ngx-translate/core/*"],
diff --git a/scripts/build-codebook-node.mjs b/scripts/build-codebook-node.mjs
new file mode 100644
index 0000000..63ef6d7
--- /dev/null
+++ b/scripts/build-codebook-node.mjs
@@ -0,0 +1,18 @@
+import { build } from 'esbuild';
+import { readFile, writeFile, copyFile } from 'node:fs/promises';
+
+// Nest/webpack and Jest consumers also need a native CommonJS entry point.
+const root = 'dist/ngx-coding-components';
+await build({
+ entryPoints: ['projects/ngx-coding-components/codebook-generator/public-api.ts'],
+ outfile: `${root}/cjs/codebook-generator.cjs`, bundle: true, platform: 'node',
+ format: 'cjs', target: 'node20', external: ['@iqb/responses', '@iqbspecs/coding-scheme', 'docx', 'cheerio', 'buffer', 'image-size', 'katex'], sourcemap: true
+});
+const manifest = JSON.parse(await readFile(`${root}/package.json`, 'utf8'));
+const entry = manifest.exports['./codebook-generator'];
+manifest.exports['./codebook-generator'] = {
+ types: entry.types, require: './cjs/codebook-generator.cjs', default: entry.default
+};
+await writeFile(`${root}/package.json`, `${JSON.stringify(manifest, null, 2)}\n`);
+
+await copyFile('node_modules/mathml2omml/LICENSE', `${root}/cjs/mathml2omml.LICENSE`);
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
new file mode 100644
index 0000000..302756c
--- /dev/null
+++ b/scripts/codebook-contract.test.mjs
@@ -0,0 +1,137 @@
+import assert from 'node:assert/strict';
+import { test } from 'node:test';
+import { createRequire } from 'node:module';
+import JSZip from 'jszip';
+import { CodebookGenerator, CodebookDocxGenerator, hasCodebookManualInstruction } from '../dist/ngx-coding-components/fesm2022/iqb-ngx-coding-components-codebook-generator.mjs';
+
+const options = { exportFormat: 'json', missingsProfile: '', hasOnlyManualCoding: false,
+ hasClosedVars: false, hasOnlyVarsWithCodes: true, hasDerivedVars: true,
+ hasGeneralInstructions: true, codeLabelToUpper: false, showScore: true, hideItemVarRelation: false };
+const code = (id, manualInstruction = '', type = 'FULL_CREDIT') => ({ id, label: `Code ${id}`, manualInstruction, type, score: 1, ruleSets: [], ruleSetOperatorAnd: true });
+const variable = (id, codes, extra = {}) => ({ id, alias: id, label: id, sourceType: 'BASE', manualInstruction: '', codes, ...extra });
+const unit = (variables, key = 'U') => ({ id: 1, key, name: 'Aufgabe', scheme: JSON.stringify({ version: '3.0', variableCodings: variables }), metadata: { items: [{ id: 'ITEM', variableId: 'V' }] } });
+const data = (variables, extra = {}) => CodebookGenerator.getCodebookData([unit(variables)], { ...options, ...extra }, [])[0].variables;
+
+for (const manual of [false, true]) for (const closed of [false, true]) for (const onlyCodes of [false, true]) {
+ test(`selection manual=${manual} closed=${closed} onlyCodes=${onlyCodes}`, () => {
+ const vars = [variable('M', [code(1, 'Bewerten
'), code(2)]), variable('C', [code(0, '', 'RESIDUAL_AUTO')]),
+ variable('X', [code(1, 'Bewerten'), code(0, '', 'RESIDUAL_AUTO')]), variable('A', [code(1)]), variable('E', [])];
+ const actual = data(vars, { hasOnlyManualCoding: manual, hasClosedVars: closed, hasOnlyVarsWithCodes: onlyCodes });
+ const expected = manual && closed ? ['C', 'M', 'X'] : manual ? ['M', 'X'] : closed ? ['C', 'X'] : onlyCodes ? ['A', 'C', 'M', 'X'] : ['A', 'C', 'E', 'M', 'X'];
+ assert.deepEqual(actual.map(v => v.id), expected);
+ if (manual && !closed) assert.deepEqual(actual.map(v => v.codes.map(c => c.id)), [['1'], ['1']]);
+ });
+}
+
+test('manual rich text handles empty HTML, invisible text, image and formula-only content', () => {
+ for (const empty of ['', ' ', '
', '
', '']) assert.equal(hasCodebookManualInstruction(empty), false, empty);
+ for (const nonempty of ['Text', '<
', '', '
', '[[iqb-math:x^2]]']) assert.equal(hasCodebookManualInstruction(nonempty), true, nonempty);
+});
+
+test('IDs, code zero, derived filtering, BASE_NO_VALUE and stable sorting', () => {
+ const vars = [variable('Z', [code(0)], { alias: 'A' }), variable('B', [code(-1)]), variable('NO', [code(1)], { sourceType: 'BASE_NO_VALUE' }), variable('D', [code(1)], { sourceType: 'COPY_VALUE' })];
+ const actual = data(vars, { hasDerivedVars: false });
+ assert.deepEqual(actual.map(v => v.id), ['A', 'B']);
+ assert.equal(actual[0].codes[0].id, '0');
+});
+
+test('invalid schemas fail with the unit key and absent schemes are allowed', () => {
+ assert.throws(() => CodebookGenerator.getCodebookData([{ id: 1, key: 'BAD', name: '', scheme: '{' }], options, []), /BAD/);
+ assert.deepEqual(CodebookGenerator.getCodebookData([{ id: 1, key: 'EMPTY', name: '' }], options, [])[0].variables, []);
+});
+
+test('JSON contract omits items and score when disabled; units sorted by key', async () => {
+ const blob = await CodebookGenerator.generateCodebook([unit([variable('V', [code(0)])], 'Z'), unit([], 'A')], { ...options, showScore: false }, [{ code: 0, label: 'Missing', description: 'Leer' }]);
+ const parsed = JSON.parse(await blob.text());
+ assert.deepEqual(parsed.map(u => u.key), ['A', 'Z']);
+ assert.equal('items' in parsed[1], false);
+ assert.equal('score' in parsed[1].variables[0].codes[0], false);
+ assert.equal(parsed[1].missings[0].code, 0);
+});
+
+async function document(description, extra = {}) {
+ const units = [{ key: 'U', name: 'Aufgabe', variables: [{ id: 'V', label: 'Variable', sourceType: 'BASE', generalInstruction: '', codes: [{ id: '0', label: 'CODE ZERO', score: '7', description }] }],
+ items: [{ id: 'ITEM', variableId: 'V' }], missings: [{ code: 0, label: 'MISSING ZERO', description: 'Leer' }] }];
+ const blob = await CodebookDocxGenerator.generateDocx(units, { ...options, ...extra });
+ const zip = await JSZip.loadAsync(await blob.arrayBuffer());
+ return { zip, xml: await zip.file('word/document.xml').async('string') };
+}
+
+test('DOCX keeps Studio headings, item relations, score column order and neutral footer', async () => {
+ const { zip, xml } = await document('INSTRUCTION
');
+ assert.match(xml, /U Aufgabe/); assert.match(xml, /V Variable/); assert.match(xml, /Item\(s\): ITEM/);
+ assert.match(xml, /0 MISSING ZERO/);
+ assert.ok(xml.indexOf('>7<') < xml.indexOf('INSTRUCTION'));
+ const footer = await zip.file('word/footer1.xml').async('string');
+ assert.match(footer, /IQB Codebook/); assert.doesNotMatch(footer, /IQB-Studio|IQB-Kodierbox/);
+});
+
+for (const description of ['
', '[[iqb-math:x^2]]
']) {
+ test(`DOCX retains mathematical content ${description}`, async () => {
+ const { xml } = await document(description);
+ assert.match(xml, / {
+ const image = 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAIAAABwJOjsAAAAJElEQVR4nGOQSDgwIIhh1OJRi0ctHrV41OJRi0ctHrV45FgMAHBlzy43YLJ+AAAAAElFTkSuQmCC';
+ const { zip, xml } = await document(`unterdurch
neu
`);
+ assert.match(xml, / name.startsWith('word/media/')));
+});
+
+test('empty exports produce JSON array and an actual DOCX archive', async () => {
+ assert.equal(await (await CodebookGenerator.generateCodebook([], options, [])).text(), '[]');
+ const blob = await CodebookGenerator.generateCodebook([], { ...options, exportFormat: 'docx' }, []);
+ const zip = await JSZip.loadAsync(await blob.arrayBuffer());
+ assert.ok(zip.file('word/document.xml'));
+});
+
+test('CommonJS and ESM backend entry points agree without Angular or browser globals', async () => {
+ const require = createRequire(import.meta.url);
+ const commonjs = require('../dist/ngx-coding-components/cjs/codebook-generator.cjs');
+ const units = [unit([variable('V', [code(0, 'Manuell')])])];
+ const a = await CodebookGenerator.generateCodebook(units, options, []);
+ const b = await commonjs.CodebookGenerator.generateCodebook(units, options, []);
+ assert.equal(await a.text(), await b.text());
+});
+
+test('plain instructions and whitespace around formatted text are not lost', async () => {
+ const plain = await document('Bitte bewerten'); assert.match(plain.xml, /Bitte bewerten/);
+ const { xml } = await document('vor fett nach
');
+ assert.match(xml, />vor ); assert.match(xml, /> nach);
+});
+
+test('escaped inequality formulas produce valid XML text in inline and block form', async () => {
+ const { xml } = await document('Prefix [[iqb-math:a%3Cb]] suffix
');
+ assert.match(xml, /a<b/); assert.doesNotMatch(xml, //);
+ assert.doesNotMatch(xml, //);
+});
+
+test('incomplete codes are closed and general instructions alone are not manual', () => {
+ const variables = [variable('I', [code(0, '', 'INTENDED_INCOMPLETE')]),
+ variable('G', [code(1)], { manualInstruction: 'Allgemeiner Hinweis
' })];
+ assert.deepEqual(data(variables, { hasClosedVars: true }).map(v => v.id), ['I']);
+ assert.deepEqual(data(variables, { hasOnlyManualCoding: true }), []);
+});
+
+test('malformed variable and code collections produce a named export error', () => {
+ for (const variables of [[null], [{ id: 'V', codes: {} }], [{ id: 'V', codes: [null] }]]) {
+ assert.throws(() => CodebookGenerator.getCodebookData([unit(variables, 'INVALID')], options, []), /INVALID/);
+ }
+});
+
+test('Studio reference preserves document, styles, numbering, settings and page footer XML', async () => {
+ const { readFile } = await import('node:fs/promises');
+ const units = [{ key: 'A', name: 'Referenz', variables: [{ id: 'V', label: 'Variable', sourceType: 'BASE',
+ generalInstruction: 'Hinweis
', codes: [{ id: '1', label: 'RICHTIG', score: '1',
+ description: 'Text
[[iqb-math:x^2]]
' }] }],
+ missings: [{ code: 99, label: 'MISSING', description: 'Keine Antwort' }], items: [] }];
+ const blob = await CodebookDocxGenerator.generateDocx(units, { ...options, exportFormat: 'docx', codeLabelToUpper: true, hideItemVarRelation: true });
+ const zip = await JSZip.loadAsync(await blob.arrayBuffer());
+ for (const file of ['document.xml', 'styles.xml', 'numbering.xml', 'settings.xml', 'footer1.xml']) {
+ const expected = await readFile(new URL(`./fixtures/studio-codebook/${file}`, import.meta.url), 'utf8');
+ const actual = (await zip.file(`word/${file}`).async('string')).replace(new Date().toLocaleDateString(), '{{DATE}}');
+ assert.equal(actual, expected, file);
+ }
+});
diff --git a/scripts/fixtures/studio-codebook/README.md b/scripts/fixtures/studio-codebook/README.md
new file mode 100644
index 0000000..ff24e02
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/README.md
@@ -0,0 +1,13 @@
+# Studio DOCX reference
+
+Generated from iqb-berlin/studio-lite develop commit
+`2504265721a59c7c65425072951ce82ab16f0fb8`, class `DownloadDocx`, using docx 8.5.0.
+The input is in the `Studio reference preserves ...` contract test.
+
+Only two baseline normalizations:
+- `IQB-Studio Codebook` becomes the approved neutral `IQB Codebook`.
+- The generation date becomes `{{DATE}}`.
+
+Document XML, styles, numbering, settings and footer must otherwise match exactly.
+The fixture deliberately excludes the separately tested approved corrections
+(code/missing 0, item relationships, plain instructions and whitespace boundaries).
diff --git a/scripts/fixtures/studio-codebook/document.xml b/scripts/fixtures/studio-codebook/document.xml
new file mode 100644
index 0000000..bfa3d3e
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/document.xml
@@ -0,0 +1 @@
+99 MISSINGKeine AntwortA ReferenzV VariableHinweis1RICHTIG1Textx2
\ No newline at end of file
diff --git a/scripts/fixtures/studio-codebook/footer1.xml b/scripts/fixtures/studio-codebook/footer1.xml
new file mode 100644
index 0000000..c63db64
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/footer1.xml
@@ -0,0 +1 @@
+IQB Codebook {{DATE}} Seite PAGE von NUMPAGES
\ No newline at end of file
diff --git a/scripts/fixtures/studio-codebook/numbering.xml b/scripts/fixtures/studio-codebook/numbering.xml
new file mode 100644
index 0000000..473063e
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/numbering.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/scripts/fixtures/studio-codebook/settings.xml b/scripts/fixtures/studio-codebook/settings.xml
new file mode 100644
index 0000000..58b2c76
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/settings.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/scripts/fixtures/studio-codebook/styles.xml b/scripts/fixtures/studio-codebook/styles.xml
new file mode 100644
index 0000000..74947d2
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/styles.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index a4a04f6..40a826f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -14,6 +14,9 @@
"esModuleInterop": true,
"skipLibCheck": true,
"paths": {
+ "@iqb/ngx-coding-components/codebook-export": ["projects/ngx-coding-components/codebook-export/public-api.ts"],
+ "@iqb/ngx-coding-components/codebook-generator": ["projects/ngx-coding-components/codebook-generator/public-api.ts"],
+ "@iqb/ngx-coding-components/codebook-models": ["projects/ngx-coding-components/codebook-models/public-api.ts"],
"@ngx-translate/core": [
"./node_modules/@ngx-translate/core"
],
From be4f1691d52f30791a0c2d240a91ff2ddb95190b Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 28 Sep 2026 11:28:26 +0200
Subject: [PATCH 02/36] ci: verify shared codebook contracts and document
integration
---
.github/workflows/ci.yml | 3 ++
docs/shared-codebook.md | 76 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+)
create mode 100644 docs/shared-codebook.md
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f5f12ad..d9edeba 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -48,6 +48,9 @@ jobs:
CI: true
run: npm run test:coverage
+ - name: Build shared library and verify codebook contracts
+ run: npm run build_cc && npm run test:codebook
+
- name: Coding-scheme validation script
run: npm run test:scheme
diff --git a/docs/shared-codebook.md b/docs/shared-codebook.md
new file mode 100644
index 0000000..40c54ac
--- /dev/null
+++ b/docs/shared-codebook.md
@@ -0,0 +1,76 @@
+# Gemeinsames Codebook: Integrationsvertrag
+
+Studio ist die Referenz für Bedienung und Dokumentlayout. Die drei Einstiegspunkte
+`codebook-models`, `codebook-generator` und `codebook-export` trennen Daten,
+frameworkfreie Dokumenterstellung und Angular-Oberfläche. Die Bibliothek enthält
+keinen Jobvertrag, keine HTTP-Aufrufe und keinen Download-Dienst.
+
+## Anwendungen
+
+Studio lädt Aufgaben und Missingprofile, übergibt die aktive Aufgabe und seine
+Speichersperre und verarbeitet `exportRequested` mit seinem direkten API-Aufruf.
+Die Kodierbox ergänzt ihre eigenen Filter über `[codebookFilters]` und zeigt ihre
+Jobzustände über `[codebookStatus]`. Das sind Projektionsflächen ohne Jobsemantik.
+`loading` und `busy` sind allgemeine Sperrzustände. Nur die Kodierbox startet Jobs,
+fragt Status ab und lädt Ergebnisse. Beim Schließen endet die Statusabfrage;
+der Serverjob wird nicht abgebrochen.
+
+Die Übersetzungen der Oberfläche stehen im Host unter `codebook.*`. Beide Hosts
+verwenden dieselben Studio-Beschriftungen und Tooltips. `selectionChanged`,
+`exportRequested` und `cancel` sind die einzigen Ausgaben. Der Exportwunsch enthält
+Aufgaben-IDs, fachliche Optionen und Missingprofil-ID. Die Profile tragen eine
+numerische ID und eine Beschriftung; 0 bedeutet kein Profil.
+
+## Bewusste fachliche Korrekturen
+
+* Nur manuell: Variablen mit regulären manuell beschriebenen Codes; nur diese Codes.
+* Nur geschlossen: Variablen mit RESIDUAL_AUTO oder INTENDED_INCOMPLETE; alle Codes.
+* Beide: Vereinigung dieser Variablengruppen; alle Codes.
+* Beide aus: keine Einschränkung nach dieser Kategorie.
+* Nur mit Codes wird nach der Codeauswahl ausgewertet.
+* Leere HTML-Strukturen, unsichtbare Zeichen und Leerzeichen sind keine Instruktion;
+ unterstützte Bilder und Formeln sind eine Instruktion. Allgemeine Instruktionen
+ allein machen keinen Code manuell.
+* Code 0 und Missing 0 bleiben erhalten. Leere Exporte liefern `[]` bzw. ein gültiges
+ DOCX. Fehlerhafte Schemen melden die betroffene Aufgabe.
+* Aufgaben werden nach Schlüssel, Variablen nach Alias/ID sortiert; Codefolge bleibt.
+* BASE_NO_VALUE bleibt ausgeschlossen; abgeleitete Variablen folgen der Option.
+* Itembeziehungen sind explizite `{id, variableId}`-Paare. Der Anwendungsadapter
+ normalisiert Quell-IDs auf die im Dokument verwendeten Aliase.
+* Die Kennzeichnung lautet IQB Codebook. Studio-Formatierung, Tabellen, Seitenfelder,
+ eingebettete Bilder und Formelkonvertierung bleiben erhalten. Klartextinstruktionen
+ und Leerzeichen an Formatgrenzen werden nicht mehr verschluckt.
+
+## Paket und Laufzeit
+
+`npm run build_cc` erzeugt Angular-ESM sowie einen zusätzlichen CommonJS-Einstieg
+für Server. Der Generator braucht weder Angular noch DOM/Browser-Globals.
+Der CommonJS-Build integriert den ausschließlich als ESM gelieferten mathml2omml-
+Konverter. Dessen Quellcode bleibt über Source Maps und das npm-Original verfügbar.
+
+Die Regeltextkonvertierung ist intern auf @iqb/responses 5.2.2 festgelegt.
+Das ist ausdrücklich kein Upgrade der Kodierbox-Kodierengine: deren responses
+5.2.0 und response-Spezifikation 1.5.1 bleiben unverändert. Die Bibliothek akzeptiert
+response-Spezifikation 1.5.1 sowie 2.x als Peer.
+
+## Lokale Integration und Veröffentlichung
+
+Die beiden Integrationen referenzieren dieselbe gepackte Datei unter
+`vendor/iqb-ngx-coding-components-4.1.0.tgz`. Das ist ein lokal prüfbarer Release-
+Kandidat, noch keine veröffentlichte npm-Version. Zum Release wird genau der
+abgenommene Bibliotheksstand veröffentlicht; danach werden die Host-Abhängigkeiten
+auf die Registry-Version umgestellt und Locks neu geprüft. Die lokalen Tarballs
+können dann entfernt werden. Beide Anwendungen gemeinsam abnehmen und ausrollen.
+Rollback: vorherige Bibliotheks-/Anwendungsversion; keine Datenmigration.
+
+## Prüfungen
+
+* `npm run test:codebook`: Node-Vertragstests für alle Filterkombinationen, Daten,
+ JSON, DOCX-Struktur, Bilder, Formeln, Itembeziehungen und CJS/ESM-Gleichheit.
+* `npm run test:cc`: Angular-Tests einschließlich Auswahl/Suche/Sperrzustände.
+* Beide Hosts testen ihre echten Adapter und bestehenden Formelregressionen.
+* Studio-Frontend prüft direkten Export, Ladezustände, Fehlermeldung und Speichersperre.
+* Kodierbox prüft Scope-Filter, wiederholte Starts, langsame Statusabfragen und Schließen.
+* Frontend- und Backend-Prüfungen auf dem Entwicklungsrechner nacheinander ausführen.
+* Vor Ausrollen bleiben visuelle Mehrseiten-DOCX-Abnahme und Host-Browserabläufe
+ einschließlich Netzwerkprüfung verpflichtend.
From d8964b49002c8fb44f45ff8f98d9fcee58ff382e Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 28 Sep 2026 21:06:56 +0200
Subject: [PATCH 03/36] fix: keep host-specific filters outside shared codebook
options
---
.../codebook-export/codebook-export.component.ts | 7 ++++++-
.../codebook-export.component.spec.ts | 14 ++++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
index aae6de2..73db93a 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
@@ -61,7 +61,12 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
contentOptions = { ...DEFAULT_CODEBOOK_OPTIONS };
ngOnChanges(changes: SimpleChanges): void {
- if (changes['defaultContentOptions']) this.contentOptions = { ...DEFAULT_CODEBOOK_OPTIONS, ...this.defaultContentOptions };
+ if (changes['defaultContentOptions']) {
+ // Only shared options cross this boundary; host-specific filters stay with the host.
+ this.contentOptions = Object.fromEntries(Object.entries(DEFAULT_CODEBOOK_OPTIONS).map(([key, value]) => (
+ [key, this.defaultContentOptions[key as keyof CodeBookContentSetting] ?? value]
+ ))) as unknown as CodeBookContentSetting;
+ }
if (changes['availableUnits']) {
this.dataSource.data = this.availableUnits;
this.dataSource.filterPredicate = (unit, filter) => [unit.key, unit.unitName, unit.groupName || '']
diff --git a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
index edba782..74cb6f6 100644
--- a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
+++ b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
@@ -49,6 +49,20 @@ describe('Studio codebook selection contract', () => {
expect(config.contentOptions.missingsProfile).toBe('Profil');
});
+ it('does not copy or emit host-specific options', () => {
+ const hostOptions = { showScore: false, trainingRequirement: 'all', jobDefinitionId: 10 };
+ component.defaultContentOptions = hostOptions;
+ component.ngOnChanges({ defaultContentOptions: new SimpleChange(null, hostOptions, true) });
+ hostOptions.trainingRequirement = 'required';
+ component.toggle(component.availableUnits[0]);
+ const emit = spyOn(component.exportRequested, 'emit');
+ component.exportCodingBook();
+ const options = emit.calls.mostRecent().args[0]!.contentOptions;
+ expect(options.showScore).toBeFalse();
+ expect(Object.keys(options)).not.toContain('trainingRequirement');
+ expect(Object.keys(options)).not.toContain('jobDefinitionId');
+ });
+
it('blocks export for empty selection, loading, busy and unsaved changes', () => {
const emit = spyOn(component.exportRequested, 'emit');
component.exportCodingBook(); component.toggle(component.availableUnits[0]);
From 853c733b540f1b442dedc7ff0210211076f4c80c Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 28 Sep 2026 21:06:56 +0200
Subject: [PATCH 04/36] fix: exclude invisible-only codebook instructions
---
.../codebook-generator/manual-instruction.ts | 2 +-
scripts/codebook-contract.test.mjs | 8 +++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/projects/ngx-coding-components/codebook-generator/manual-instruction.ts b/projects/ngx-coding-components/codebook-generator/manual-instruction.ts
index 0a42602..460633a 100644
--- a/projects/ngx-coding-components/codebook-generator/manual-instruction.ts
+++ b/projects/ngx-coding-components/codebook-generator/manual-instruction.ts
@@ -5,7 +5,7 @@ export function hasCodebookManualInstruction(instruction?: string | null): boole
if (!instruction) return false;
const $ = load(instruction);
$('script,style').remove();
- const text = $.root().text().replace(/[\s\u200b-\u200d\ufeff]/g, '');
+ const text = $.root().text().replace(/[\s\p{Default_Ignorable_Code_Point}]/gu, '');
if (text) return true;
return $('img').toArray().some(element => /^data:image\/(png|jpeg|jpg|gif|bmp);base64,\S+$/i.test($(element).attr('src') || '')) ||
$('span.iqb-math-formula').toArray().some(element => !!$(element).attr('data-latex')?.trim());
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
index 302756c..a384e79 100644
--- a/scripts/codebook-contract.test.mjs
+++ b/scripts/codebook-contract.test.mjs
@@ -24,7 +24,7 @@ for (const manual of [false, true]) for (const closed of [false, true]) for (con
}
test('manual rich text handles empty HTML, invisible text, image and formula-only content', () => {
- for (const empty of ['', ' ', '
', '
', '']) assert.equal(hasCodebookManualInstruction(empty), false, empty);
+ for (const empty of ['', ' ', '
', '
', '', '
', '
', '️
']) assert.equal(hasCodebookManualInstruction(empty), false, empty);
for (const nonempty of ['Text', '<
', '', '
', '[[iqb-math:x^2]]']) assert.equal(hasCodebookManualInstruction(nonempty), true, nonempty);
});
@@ -135,3 +135,9 @@ test('Studio reference preserves document, styles, numbering, settings and page
assert.equal(actual, expected, file);
}
});
+
+test('invisible-only instructions do not include variables in manual exports', () => {
+ for (const instruction of ['
', '
', '️
']) {
+ assert.deepEqual(data([variable('EMPTY', [code(1, instruction)])], { hasOnlyManualCoding: true }), []);
+ }
+});
From 21537078b13d474397ccc06482221d7af7209528 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 5 Oct 2026 13:26:35 +0200
Subject: [PATCH 05/36] fix: preserve nested codebook formatting and word
spacing
---
.../codebook-docx-generator.ts | 206 +++---------------
scripts/codebook-contract.test.mjs | 17 ++
2 files changed, 51 insertions(+), 172 deletions(-)
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
index 9e570f7..3f58a02 100644
--- a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
+++ b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
@@ -15,7 +15,8 @@ import {
PageNumber,
ITableCellBorders,
ImportedXmlComponent,
- ParagraphChild
+ ParagraphChild,
+ IRunOptions
} from 'docx';
import {
@@ -393,181 +394,42 @@ export class CodebookDocxGenerator {
children: ParagraphChild[],
colorParsed: string,
backgroundColor: string,
- size: string
+ size: string,
+ formatting: Pick = {}
): void {
+ const runStyle = {
+ ...formatting,
+ color: colorParsed,
+ shading: { fill: backgroundColor },
+ size: CodebookDocxGenerator.getFontSize(size)
+ };
nodes.forEach(node => {
if (node.type === 'text') {
- if ('data' in node && node.data && node.data.trim()) {
- children.push(
- new TextRun({
- text: node.data.replace(/\s+/g, ' '),
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- } else if (node.type === 'tag') {
- const element = node as Element;
- const tagName = element.name.toLowerCase();
-
- if (
- tagName === 'span' &&
- element.attribs?.['class']?.includes('iqb-math-formula')
- ) {
- const rawLatex = element.attribs?.['data-latex'] || '';
- const latex = CodebookDocxGenerator.decodeLatex(rawLatex).trim();
- if (latex) {
- const ommlComponent = CodebookDocxGenerator.latexToOmml(latex);
- if (ommlComponent) {
- children.push(ommlComponent);
- } else {
- children.push(
- new TextRun({
- text: latex,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- }
- return;
- }
-
- if (tagName === 'strong' || tagName === 'b') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- bold: true,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 'em' || tagName === 'i') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- italics: true,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 'u') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- underline: {},
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 's') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- strike: true,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 'sub') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- subScript: true,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 'sup') {
- if (element.children) {
- element.children.forEach(child => {
- if (child.type === 'text' && child.data) {
- children.push(
- new TextRun({
- text: child.data.replace(/\s+/g, ' '),
- superScript: true,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- }
- });
- }
- } else if (tagName === 'br') {
- children.push(
- new TextRun({
- break: 1,
- color: colorParsed,
- shading: {
- fill: backgroundColor
- },
- size: CodebookDocxGenerator.getFontSize(size)
- })
- );
- } else if (element.children && element.children.length > 0) {
- CodebookDocxGenerator.processInlineElements(
- element.children,
- children,
- colorParsed,
- backgroundColor,
- size
- );
- }
+ if (node.data) children.push(new TextRun({ text: node.data.replace(/\s+/g, ' '), ...runStyle }));
+ return;
}
+ if (node.type !== 'tag') return;
+ const element = node as Element;
+ const tagName = element.name.toLowerCase();
+ if (tagName === 'span' && element.attribs?.['class']?.split(/\s+/).includes('iqb-math-formula')) {
+ const latex = CodebookDocxGenerator.decodeLatex(element.attribs?.['data-latex'] || '').trim();
+ if (latex) children.push(CodebookDocxGenerator.latexToOmml(latex) || new TextRun({ text: latex, ...runStyle }));
+ return;
+ }
+ if (tagName === 'br') {
+ children.push(new TextRun({ break: 1, ...runStyle }));
+ return;
+ }
+ const nestedFormatting = { ...formatting };
+ if (tagName === 'strong' || tagName === 'b') nestedFormatting.bold = true;
+ if (tagName === 'em' || tagName === 'i') nestedFormatting.italics = true;
+ if (tagName === 'u') nestedFormatting.underline = {};
+ if (tagName === 's' || tagName === 'strike') nestedFormatting.strike = true;
+ if (tagName === 'sub') { nestedFormatting.subScript = true; nestedFormatting.superScript = false; }
+ if (tagName === 'sup') { nestedFormatting.superScript = true; nestedFormatting.subScript = false; }
+ CodebookDocxGenerator.processInlineElements(
+ element.children, children, colorParsed, backgroundColor, size, nestedFormatting
+ );
});
}
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
index a384e79..4e11bfb 100644
--- a/scripts/codebook-contract.test.mjs
+++ b/scripts/codebook-contract.test.mjs
@@ -141,3 +141,20 @@ test('invisible-only instructions do not include variables in manual exports', (
assert.deepEqual(data([variable('EMPTY', [code(1, instruction)])], { hasOnlyManualCoding: true }), []);
}
});
+
+test('DOCX retains nested marks and spaces between differently formatted runs', async () => {
+ const { xml } = await document('BEWERTEN Text unten oben
');
+ const $ = (await import('cheerio')).load(xml, { xml: true });
+ const runs = $('w\\:r').toArray();
+ const findRun = text => runs.find(run => $(run).find('w\\:t').text() === text);
+ assert.equal($(findRun('BEWERTEN')).find('w\\:b').length, 1);
+ assert.equal($(findRun('BEWERTEN')).find('w\\:i').length, 1);
+ assert.equal($(findRun('Text')).find('w\\:u').length, 1);
+ assert.equal($(findRun('Text')).find('w\\:strike').length, 1);
+ assert.equal($(findRun('unten')).find('w\\:vertAlign').attr('w:val'), 'subscript');
+ assert.equal($(findRun('oben')).find('w\\:vertAlign').attr('w:val'), 'superscript');
+ assert.match($('w\\:t').toArray().map(element => $(element).text()).join(''), /BEWERTEN Text unten oben/);
+ const spaced = await document('vor nach
');
+ const text = (await import('cheerio')).load(spaced.xml, { xml: true });
+ assert.match(text('w\\:t').toArray().map(element => text(element).text()).join(''), /vor nach/);
+});
From d0179ae816217944f22097c07bc207d98c9f1143 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 5 Oct 2026 13:26:35 +0200
Subject: [PATCH 06/36] fix: lock codebook selection while loading and report
invalidated IDs
---
.../codebook-export.component.html | 2 +-
.../codebook-export.component.ts | 10 +++++++---
.../codebook-export.component.spec.ts | 17 +++++++++++++++++
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.html b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
index 5b75947..c6e7f3c 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.html
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
@@ -26,7 +26,7 @@ {{ 'codebook.workspace.export-coding-book' | translate }}
[matTooltip]="filter ? ('codebook.coding.select-all-including-hidden' | translate) : ''">
-
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
index 73db93a..493b66e 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
@@ -78,7 +78,11 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
}
if (changes['selectedUnitIds']) this.selection = [...this.selectedUnitIds];
const validIds = new Set(this.availableUnits.filter(unit => !unit.disabled).map(unit => unit.unitId));
- this.selection = this.selection.filter(id => validIds.has(id));
+ const validSelection = this.selection.filter(id => validIds.has(id));
+ if (validSelection.length !== this.selection.length) {
+ this.selection = validSelection;
+ this.selectionChanged.emit([...this.selection]);
+ }
}
ngAfterViewInit(): void { this.dataSource.sort = this.sort; }
@@ -95,13 +99,13 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
applyFilter(): void { this.dataSource.filter = this.filter.trim().toLowerCase(); }
toggle(unit: UnitSelectionItem): void {
- if (unit.disabled || this.busy) return;
+ if (unit.disabled || this.loading || this.busy) return;
this.selection = this.selection.includes(unit.unitId) ? this.selection.filter(id => id !== unit.unitId) : [...this.selection, unit.unitId];
this.selectionChanged.emit([...this.selection]);
}
toggleAll(): void {
- if (this.busy) return;
+ if (this.loading || this.busy) return;
this.selection = this.allSelected ? [] : this.availableUnits.filter(unit => !unit.disabled).map(unit => unit.unitId);
this.selectionChanged.emit([...this.selection]);
}
diff --git a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
index 74cb6f6..27cc351 100644
--- a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
+++ b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
@@ -63,6 +63,23 @@ describe('Studio codebook selection contract', () => {
expect(Object.keys(options)).not.toContain('jobDefinitionId');
});
+ it('blocks individual and complete selection while loading', () => {
+ component.loading = true;
+ const emit = spyOn(component.selectionChanged, 'emit');
+ component.toggle(component.availableUnits[0]); component.toggleAll();
+ expect(component.selection).toEqual([]);
+ expect(emit).not.toHaveBeenCalled();
+ });
+
+ it('notifies the host when refreshed units invalidate its selection', () => {
+ component.toggleAll();
+ const emit = spyOn(component.selectionChanged, 'emit');
+ component.availableUnits = [component.availableUnits[0]];
+ component.ngOnChanges({ availableUnits: new SimpleChange(null, component.availableUnits, false) });
+ expect(component.selection).toEqual([1]);
+ expect(emit).toHaveBeenCalledOnceWith([1]);
+ });
+
it('blocks export for empty selection, loading, busy and unsaved changes', () => {
const emit = spyOn(component.exportRequested, 'emit');
component.exportCodingBook(); component.toggle(component.availableUnits[0]);
From fc71cea7085fb35f22877c351dc996604905d29e Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 5 Oct 2026 13:34:24 +0200
Subject: [PATCH 07/36] feat: share codebook training filter and Studio group
column
---
docs/shared-codebook.md | 14 ++++++++++++--
.../codebook-export.component.html | 12 +++++++++++-
.../codebook-export/codebook-export.component.ts | 9 +++++++--
.../codebook-generator/codebook-generator.ts | 3 +++
.../codebook-models/public-api.ts | 4 ++++
.../codebook-export.component.spec.ts | 16 +++++++++++++---
scripts/codebook-contract.test.mjs | 10 ++++++++++
7 files changed, 60 insertions(+), 8 deletions(-)
diff --git a/docs/shared-codebook.md b/docs/shared-codebook.md
index 40c54ac..23f62ad 100644
--- a/docs/shared-codebook.md
+++ b/docs/shared-codebook.md
@@ -9,7 +9,9 @@ keinen Jobvertrag, keine HTTP-Aufrufe und keinen Download-Dienst.
Studio lädt Aufgaben und Missingprofile, übergibt die aktive Aufgabe und seine
Speichersperre und verarbeitet `exportRequested` mit seinem direkten API-Aufruf.
-Die Kodierbox ergänzt ihre eigenen Filter über `[codebookFilters]` und zeigt ihre
+Schulungsbedarf ist eine gemeinsame Auswahl und wird in beiden Anwendungen durch
+denselben Generator anhand von CODER_TRAINING_REQUIRED gefiltert.
+Die Kodierbox ergänzt ihren Jobdefinitionsfilter über `[codebookFilters]` und zeigt ihre
Jobzustände über `[codebookStatus]`. Das sind Projektionsflächen ohne Jobsemantik.
`loading` und `busy` sind allgemeine Sperrzustände. Nur die Kodierbox startet Jobs,
fragt Status ab und lädt Ergebnisse. Beim Schließen endet die Statusabfrage;
@@ -20,6 +22,11 @@ verwenden dieselben Studio-Beschriftungen und Tooltips. `selectionChanged`,
`exportRequested` und `cancel` sind die einzigen Ausgaben. Der Exportwunsch enthält
Aufgaben-IDs, fachliche Optionen und Missingprofil-ID. Die Profile tragen eine
numerische ID und eine Beschriftung; 0 bedeutet kein Profil.
+`showGroupColumn` ist im Studio aktiv, in Kodierbox deaktiviert.
+Während `loading` und `busy` ist jede Auswahl gesperrt. Verliert eine Aufgabe ihre
+Verfügbarkeit, meldet selectionChanged auch die bereinigte Auswahl zurück.
+Variablenbündel bleiben als bestehender Kodierbox-API-Vertrag erhalten, werden
+aber im Codebook-Dialog nicht mehr angeboten (Issue #176).
## Bewusste fachliche Korrekturen
@@ -34,12 +41,15 @@ numerische ID und eine Beschriftung; 0 bedeutet kein Profil.
* Code 0 und Missing 0 bleiben erhalten. Leere Exporte liefern `[]` bzw. ein gültiges
DOCX. Fehlerhafte Schemen melden die betroffene Aufgabe.
* Aufgaben werden nach Schlüssel, Variablen nach Alias/ID sortiert; Codefolge bleibt.
+* Schulungsbedarf: alle, nur mit oder nur ohne CODER_TRAINING_REQUIRED; kombiniert
+ mit der gemeinsamen Variablen-/Codeauswahl.
* BASE_NO_VALUE bleibt ausgeschlossen; abgeleitete Variablen folgen der Option.
* Itembeziehungen sind explizite `{id, variableId}`-Paare. Der Anwendungsadapter
normalisiert Quell-IDs auf die im Dokument verwendeten Aliase.
* Die Kennzeichnung lautet IQB Codebook. Studio-Formatierung, Tabellen, Seitenfelder,
eingebettete Bilder und Formelkonvertierung bleiben erhalten. Klartextinstruktionen
- und Leerzeichen an Formatgrenzen werden nicht mehr verschluckt.
+ und Leerzeichen an Formatgrenzen werden nicht mehr verschluckt. Verschachtelte
+ Textmarkierungen bleiben kombiniert erhalten.
## Paket und Laufzeit
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.html b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
index c6e7f3c..1d55539 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.html
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
@@ -51,6 +51,17 @@ {{ 'codebook.workspace.export-coding-book' | translate }}
+
+
+
+ {{ 'codebook.coding.training-requirement-filter' | translate }}
+
+ {{ 'codebook.coding.training-requirement-all' | translate }}
+ {{ 'codebook.coding.training-requirement-required' | translate }}
+ {{ 'codebook.coding.training-requirement-not-required' | translate }}
+
+
+
{{'codebook.coding.codebook-content' | translate}}
@@ -126,7 +137,6 @@
{{'codebook.coding.export-format' | translate}}
-
@if(workspaceChanges) {
{{'codebook.coding.error-save-changes' | translate}}
}
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
index 493b66e..ad70524 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.ts
@@ -27,7 +27,8 @@ export const DEFAULT_CODEBOOK_OPTIONS: CodeBookContentSetting = {
hasClosedVars: true,
codeLabelToUpper: true,
showScore: true,
- hideItemVarRelation: true
+ hideItemVarRelation: true,
+ trainingRequirement: 'all'
};
/** Studio's export form. Loading data, downloading and job handling belong to the host. */
@@ -46,6 +47,7 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
@Input() selectedUnitIds: number[] = [];
@Input() selectedMissingsProfileId = 0;
@Input() defaultContentOptions: Partial
= {};
+ @Input() showGroupColumn = true;
@Input() loading = false;
@Input() busy = false;
@Input() workspaceChanges = false;
@@ -61,6 +63,9 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
contentOptions = { ...DEFAULT_CODEBOOK_OPTIONS };
ngOnChanges(changes: SimpleChanges): void {
+ if (changes['showGroupColumn']) {
+ this.columns = this.showGroupColumn ? ['select', 'key', 'name', 'group'] : ['select', 'key', 'name'];
+ }
if (changes['defaultContentOptions']) {
// Only shared options cross this boundary; host-specific filters stay with the host.
this.contentOptions = Object.fromEntries(Object.entries(DEFAULT_CODEBOOK_OPTIONS).map(([key, value]) => (
@@ -69,7 +74,7 @@ export class CodebookExportComponent implements OnChanges, AfterViewInit {
}
if (changes['availableUnits']) {
this.dataSource.data = this.availableUnits;
- this.dataSource.filterPredicate = (unit, filter) => [unit.key, unit.unitName, unit.groupName || '']
+ this.dataSource.filterPredicate = (unit, filter) => [unit.key, unit.unitName, this.showGroupColumn ? unit.groupName || '' : '']
.some(value => value.toLowerCase().includes(filter));
this.dataSource.sortingDataAccessor = (unit, column) => ({ key: unit.key, name: unit.unitName, group: unit.groupName || '' }[column] || '');
}
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-generator.ts
index 9005e3e..cfa4ab9 100644
--- a/projects/ngx-coding-components/codebook-generator/codebook-generator.ts
+++ b/projects/ngx-coding-components/codebook-generator/codebook-generator.ts
@@ -53,6 +53,9 @@ export class CodebookGenerator {
}
private static getVariable(variable: VariableCodingData, options: CodeBookContentSetting): BookVariable | null {
+ const trainingRequired = variable.processing?.includes('CODER_TRAINING_REQUIRED') ?? false;
+ if (options.trainingRequirement === 'required' && !trainingRequired) return null;
+ if (options.trainingRequirement === 'not-required' && trainingRequired) return null;
if (variable.sourceType === 'BASE_NO_VALUE' || (variable.sourceType !== 'BASE' && !options.hasDerivedVars)) return null;
const codes = (variable.codes || []).filter(code => code.id !== undefined && code.id !== null);
const manual = codes.some(code => this.isManual(code));
diff --git a/projects/ngx-coding-components/codebook-models/public-api.ts b/projects/ngx-coding-components/codebook-models/public-api.ts
index 1b21f73..9f1bcc1 100644
--- a/projects/ngx-coding-components/codebook-models/public-api.ts
+++ b/projects/ngx-coding-components/codebook-models/public-api.ts
@@ -11,6 +11,8 @@ export interface ItemMetadata {
/**
* Settings for codebook content generation
*/
+export type CodebookTrainingRequirementFilter = 'all' | 'required' | 'not-required';
+
export interface CodeBookContentSetting {
/** Export format (docx or json) */
exportFormat: 'json' | 'docx';
@@ -32,6 +34,8 @@ export interface CodeBookContentSetting {
showScore: boolean;
/** Hide item-variable relation */
hideItemVarRelation: boolean;
+ /** Filter variables by increased coder training requirement; omission means all. */
+ trainingRequirement?: CodebookTrainingRequirementFilter;
}
/**
diff --git a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
index 27cc351..e4ea964 100644
--- a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
+++ b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
@@ -50,19 +50,29 @@ describe('Studio codebook selection contract', () => {
});
it('does not copy or emit host-specific options', () => {
- const hostOptions = { showScore: false, trainingRequirement: 'all', jobDefinitionId: 10 };
+ const hostOptions = { showScore: false, jobDefinitionId: 10, variableBundleIds: [7] };
component.defaultContentOptions = hostOptions;
component.ngOnChanges({ defaultContentOptions: new SimpleChange(null, hostOptions, true) });
- hostOptions.trainingRequirement = 'required';
component.toggle(component.availableUnits[0]);
const emit = spyOn(component.exportRequested, 'emit');
component.exportCodingBook();
const options = emit.calls.mostRecent().args[0]!.contentOptions;
expect(options.showScore).toBeFalse();
- expect(Object.keys(options)).not.toContain('trainingRequirement');
+ expect(Object.keys(options)).not.toContain('variableBundleIds');
expect(Object.keys(options)).not.toContain('jobDefinitionId');
});
+ it('exports the shared training filter and supports Studio-only groups', () => {
+ component.contentOptions.trainingRequirement = 'required';
+ component.showGroupColumn = false;
+ component.ngOnChanges({ showGroupColumn: new SimpleChange(true, false, false) });
+ expect(component.columns).toEqual(['select', 'key', 'name']);
+ component.toggle(component.availableUnits[0]);
+ const emit = spyOn(component.exportRequested, 'emit');
+ component.exportCodingBook();
+ expect(emit.calls.mostRecent().args[0]!.contentOptions.trainingRequirement).toBe('required');
+ });
+
it('blocks individual and complete selection while loading', () => {
component.loading = true;
const emit = spyOn(component.selectionChanged, 'emit');
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
index 4e11bfb..e41dd99 100644
--- a/scripts/codebook-contract.test.mjs
+++ b/scripts/codebook-contract.test.mjs
@@ -158,3 +158,13 @@ test('DOCX retains nested marks and spaces between differently formatted runs',
const text = (await import('cheerio')).load(spaced.xml, { xml: true });
assert.match(text('w\\:t').toArray().map(element => text(element).text()).join(''), /vor nach/);
});
+
+test('shared training filters combine with manual/closed and derived-variable selection', () => {
+ const vars = [variable('TRAIN', [code(0, 'Bewerten')], { processing: ['CODER_TRAINING_REQUIRED'] }),
+ variable('OTHER', [code(1, 'Bewerten')]), variable('CLOSED', [code(0, '', 'RESIDUAL_AUTO')], { processing: ['CODER_TRAINING_REQUIRED'] }),
+ variable('DERIVED', [code(1, 'Bewerten')], { sourceType: 'COPY_VALUE', processing: ['CODER_TRAINING_REQUIRED'] })];
+ assert.deepEqual(data(vars, { trainingRequirement: 'required', hasOnlyManualCoding: true, hasDerivedVars: false }).map(v => v.id), ['TRAIN']);
+ assert.deepEqual(data(vars, { trainingRequirement: 'not-required', hasOnlyManualCoding: true }).map(v => v.id), ['OTHER']);
+ assert.deepEqual(data(vars, { trainingRequirement: 'required', hasClosedVars: true }).map(v => v.id), ['CLOSED']);
+ assert.deepEqual(data(vars, { trainingRequirement: 'all' }).map(v => v.id), data(vars).map(v => v.id));
+});
From d998221924749919832c9c00810d0e5518dc064f Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 5 Oct 2026 13:42:07 +0200
Subject: [PATCH 08/36] fix: expose accessible codebook checkbox labels
---
.../codebook-export.component.html | 4 ++--
.../codebook-export.component.spec.ts | 17 +++++++++++++++++
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/projects/ngx-coding-components/codebook-export/codebook-export.component.html b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
index 1d55539..3a9c1bb 100644
--- a/projects/ngx-coding-components/codebook-export/codebook-export.component.html
+++ b/projects/ngx-coding-components/codebook-export/codebook-export.component.html
@@ -22,12 +22,12 @@ {{ 'codebook.workspace.export-coding-book' | translate }}
0 && !allSelected"
- [attr.aria-label]="'codebook.coding.select-all-units' | translate"
+ [aria-label]="'codebook.coding.select-all-units' | translate"
[matTooltip]="filter ? ('codebook.coding.select-all-including-hidden' | translate) : ''">
+ [attr.data-cy]="'workspace-select-unit-list-checkbox-' + unit.key" [aria-label]="unit.key" (change)="toggle(unit)">
diff --git a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
index e4ea964..d4a5019 100644
--- a/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
+++ b/projects/ngx-coding-components/src/lib/codebook-export/codebook-export.component.spec.ts
@@ -1,4 +1,6 @@
import { SimpleChange } from '@angular/core';
+import { TestBed } from '@angular/core/testing';
+import { TranslateModule } from '@ngx-translate/core';
import { CodebookExportComponent } from '../../../codebook-export/codebook-export.component';
describe('Studio codebook selection contract', () => {
@@ -99,3 +101,18 @@ describe('Studio codebook selection contract', () => {
expect(emit).not.toHaveBeenCalled();
});
});
+
+describe('codebook checkbox accessibility', () => {
+ it('labels the actual checkbox inputs for assistive technology', async () => {
+ await TestBed.configureTestingModule({
+ imports: [CodebookExportComponent, TranslateModule.forRoot()]
+ }).compileComponents();
+ const fixture = TestBed.createComponent(CodebookExportComponent);
+ fixture.componentRef.setInput('availableUnits', [{ unitId: 1, key: 'TASK', unitName: 'Aufgabe' }]);
+ fixture.detectChanges();
+ const inputs = fixture.nativeElement.querySelectorAll('input[type="checkbox"]');
+ expect(inputs[0].getAttribute('aria-label')).toBe('codebook.coding.select-all-units');
+ expect(inputs[1].getAttribute('aria-label')).toBe('TASK');
+ fixture.destroy();
+ });
+});
From 8217bb8d9a01d14a5fb140ead9cde0f927b54b0b Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 5 Oct 2026 14:52:08 +0200
Subject: [PATCH 09/36] fix(codebook): preserve loose instruction text and list
contents
---
docs/shared-codebook.md | 4 +-
.../codebook-docx-generator.ts | 26 +++++++++
scripts/codebook-contract.test.mjs | 55 +++++++++++++++++++
3 files changed, 84 insertions(+), 1 deletion(-)
diff --git a/docs/shared-codebook.md b/docs/shared-codebook.md
index 23f62ad..6a8aac8 100644
--- a/docs/shared-codebook.md
+++ b/docs/shared-codebook.md
@@ -49,7 +49,9 @@ aber im Codebook-Dialog nicht mehr angeboten (Issue #176).
* Die Kennzeichnung lautet IQB Codebook. Studio-Formatierung, Tabellen, Seitenfelder,
eingebettete Bilder und Formelkonvertierung bleiben erhalten. Klartextinstruktionen
und Leerzeichen an Formatgrenzen werden nicht mehr verschluckt. Verschachtelte
- Textmarkierungen bleiben kombiniert erhalten.
+ Textmarkierungen bleiben kombiniert erhalten. Direkte Listentexte und Klartext
+ vor, zwischen und nach HTML-Absätzen werden in Quellreihenfolge übernommen;
+ bestehende Absatzinhalte, Bilder und Formeln erscheinen weiterhin genau einmal.
## Paket und Laufzeit
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
index 3f58a02..d9d6f92 100644
--- a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
+++ b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
@@ -677,6 +677,31 @@ export class CodebookDocxGenerator {
return !!elem.parent && (elem.parent as Element).name === 'li';
}
+ /** Put loose text and inline marks into paragraphs without duplicating existing blocks. */
+ private static wrapInlineParagraphs(cheerioAPI: cheerio.CheerioAPI, parent: AnyNode): void {
+ let inlineNodes: AnyNode[] = [];
+ const flush = () => {
+ if (inlineNodes.some(node => node.type === 'tag' || (node.type === 'text' && node.data.trim()))) {
+ cheerioAPI(inlineNodes).wrapAll('');
+ }
+ inlineNodes = [];
+ };
+ cheerioAPI(parent).contents().toArray().forEach(node => {
+ if (node.type === 'tag' && (
+ /^(p|h[1-4]|img|ul|ol|li|div|blockquote)$/.test(node.name) ||
+ cheerioAPI(node).find('p,h1,h2,h3,h4,img,ul,ol').length > 0
+ )) {
+ flush();
+ if (!/^(p|h[1-4]|img)$/.test(node.name)) {
+ CodebookDocxGenerator.wrapInlineParagraphs(cheerioAPI, node);
+ }
+ } else if (node.type === 'text' || node.type === 'tag') {
+ inlineNodes.push(node);
+ }
+ });
+ flush();
+ }
+
private static htmlToDocx(
html: string,
contentSetting: CodeBookContentSetting
@@ -688,6 +713,7 @@ export class CodebookDocxGenerator {
null,
false
);
+ CodebookDocxGenerator.wrapInlineParagraphs(cheerioAPI, cheerioAPI.root()[0]);
const elements: Paragraph[] = [];
cheerioAPI('p,h1,h2,h3,h4,img').each((i, elem) => {
try {
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
index e41dd99..5565f45 100644
--- a/scripts/codebook-contract.test.mjs
+++ b/scripts/codebook-contract.test.mjs
@@ -2,6 +2,7 @@ import assert from 'node:assert/strict';
import { test } from 'node:test';
import { createRequire } from 'node:module';
import JSZip from 'jszip';
+import { load } from 'cheerio';
import { CodebookGenerator, CodebookDocxGenerator, hasCodebookManualInstruction } from '../dist/ngx-coding-components/fesm2022/iqb-ngx-coding-components-codebook-generator.mjs';
const options = { exportFormat: 'json', missingsProfile: '', hasOnlyManualCoding: false,
@@ -102,6 +103,60 @@ test('plain instructions and whitespace around formatted text are not lost', asy
assert.match(xml, />vor ); assert.match(xml, /> nach);
});
+function descriptionParagraphs(xml) {
+ const $ = load(xml, { xml: true });
+ return $('w\\:tr').first().children('w\\:tc').last().find('w\\:p').toArray()
+ .map(paragraph => $(paragraph).find('w\\:t').text());
+}
+
+for (const tag of ['ul', 'ol']) {
+ test(`DOCX retains direct ${tag} list text and existing paragraph list items exactly once`, async () => {
+ const { xml } = await document(`<${tag}>Erstes KriteriumZweites Kriterium
${tag}>`);
+ assert.deepEqual(descriptionParagraphs(xml), ['Erstes Kriterium', 'Zweites Kriterium']);
+ const $ = load(xml, { xml: true });
+ assert.equal($('w\\:numPr').length, 2);
+ assert.equal($('w\\:r').filter((_, run) => $(run).find('w\\:t').text() === 'Kriterium').find('w\\:b').length, 1);
+ });
+}
+
+test('DOCX keeps loose text and formatting before, between and after blocks in source order', async () => {
+ const { xml } = await document('Vor fettRegel
Zwischen kursivHinweis
Danach');
+ assert.deepEqual(descriptionParagraphs(xml), ['Vor fett', 'Regel', 'Zwischen kursiv', 'Hinweis', 'Danach']);
+ const $ = load(xml, { xml: true });
+ assert.equal($('w\\:r').filter((_, run) => $(run).find('w\\:t').text() === 'fett').find('w\\:b').length, 1);
+ assert.equal($('w\\:r').filter((_, run) => $(run).find('w\\:t').text() === 'kursiv').find('w\\:i').length, 1);
+});
+
+test('DOCX keeps mixed and nested list contents without repeating paragraphs or images', async () => {
+ const image = 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAIAAABwJOjsAAAAJElEQVR4nGOQSDgwIIhh1OJRi0ctHrV41OJRi0ctHrV45FgMAHBlzy43YLJ+AAAAAElFTkSuQmCC';
+ const { xml, zip } = await document(`- Vor
Absatz
Danach- Unterpunkt [[iqb-math:x^2]]

`);
+ assert.deepEqual(descriptionParagraphs(xml), ['Vor', 'Absatz', 'Danach', 'Unterpunkt ', '']);
+ const $ = load(xml, { xml: true });
+ assert.equal($('w\\:drawing').length, 1);
+ assert.equal($('m\\:oMath').length, 1);
+ assert.equal(Object.keys(zip.files).filter(name => name.startsWith('word/media/') && !zip.files[name].dir).length, 1);
+});
+
+test('complete DOCX exports keep list instructions and plain instructions after generated rules in ESM and CJS', async () => {
+ const require = createRequire(import.meta.url);
+ const commonjs = require('../dist/ngx-coding-components/cjs/codebook-generator.cjs');
+ for (const [instruction, ruleSets, expected] of [
+ ['- Erstes Kriterium
- Zweites Kriterium
', [], ['Erstes Kriterium', 'Zweites Kriterium']],
+ ['Manuelle Instruktion', [{ rules: [{ method: 'MATCH', parameters: ['ABC'] }], ruleOperatorAnd: true }], ['ABC', 'Manuelle Instruktion']]
+ ]) {
+ const units = [unit([variable('V', [{ ...code(1, instruction), ruleSets }])])];
+ let reference;
+ for (const generator of [CodebookGenerator, commonjs.CodebookGenerator]) {
+ const blob = await generator.generateCodebook(units, { ...options, exportFormat: 'docx', hasOnlyManualCoding: true, hasClosedVars: true }, []);
+ const zip = await JSZip.loadAsync(await blob.arrayBuffer());
+ const xml = await zip.file('word/document.xml').async('string');
+ assert.deepEqual(descriptionParagraphs(xml), expected);
+ if (reference) assert.equal(xml, reference);
+ reference = xml;
+ }
+ }
+});
+
test('escaped inequality formulas produce valid XML text in inline and block form', async () => {
const { xml } = await document('Prefix [[iqb-math:a%3Cb]] suffix
');
assert.match(xml, /a<b/); assert.doesNotMatch(xml, //);
From fd83caed87f06f8b85910d34b6d1f36d26cab159 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 12 Oct 2026 11:36:57 +0200
Subject: [PATCH 10/36] fix: preserve Studio layout for whitespace-only
instructions
---
.../codebook-generator/codebook-docx-generator.ts | 1 +
scripts/codebook-contract.test.mjs | 14 ++++++++++++++
2 files changed, 15 insertions(+)
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
index d9d6f92..964a75b 100644
--- a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
+++ b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
@@ -706,6 +706,7 @@ export class CodebookDocxGenerator {
html: string,
contentSetting: CodeBookContentSetting
) {
+ if (!html.trim()) return [];
const normalizedHtml = CodebookDocxGenerator.normalizeMathTokens(html);
const blockHtml = /<(p|h[1-4]|img|ul|ol)\b/i.test(normalizedHtml) ? normalizedHtml : `${normalizedHtml}
`;
const cheerioAPI = cheerio.load(
diff --git a/scripts/codebook-contract.test.mjs b/scripts/codebook-contract.test.mjs
index 5565f45..876821d 100644
--- a/scripts/codebook-contract.test.mjs
+++ b/scripts/codebook-contract.test.mjs
@@ -103,6 +103,20 @@ test('plain instructions and whitespace around formatted text are not lost', asy
assert.match(xml, />vor ); assert.match(xml, /> nach);
});
+test('whitespace-only general instructions do not add paragraphs to Studio layout', async () => {
+ const units = instruction => [{ key: 'A', name: 'Aufgabe', items: [], missings: [], variables: [{
+ id: 'V', label: 'Variable', sourceType: 'BASE', generalInstruction: instruction,
+ codes: [{ id: '1', label: 'Code', score: '1', description: 'Bewerten
' }]
+ }] }];
+ let expected;
+ for (const instruction of ['', ' ', '\t\r\n', '\u00a0']) {
+ const zip = await JSZip.loadAsync(await (await CodebookDocxGenerator.generateDocx(units(instruction), options)).arrayBuffer());
+ const actual = await zip.file('word/document.xml').async('string');
+ if (expected) assert.equal(actual, expected, JSON.stringify(instruction));
+ expected = actual;
+ }
+});
+
function descriptionParagraphs(xml) {
const $ = load(xml, { xml: true });
return $('w\\:tr').first().children('w\\:tc').last().find('w\\:p').toArray()
From d8b8316b67fcd1265f377dcdb540ab85d8b0cbff Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 12 Oct 2026 11:43:45 +0200
Subject: [PATCH 11/36] test: cover codebook option matrix against original
Studio exports
---
package.json | 2 +-
scripts/capture-studio-codebook-reference.mjs | 52 +
scripts/codebook-docx-test-utils.mjs | 34 +
scripts/codebook-matrix.test.mjs | 90 +
scripts/fixtures/codebook-synthetic.mjs | 102 +
scripts/fixtures/studio-codebook/README.md | 29 +
.../studio-codebook/synthetic-reference.json | 9301 +++++++++++++++++
7 files changed, 9609 insertions(+), 1 deletion(-)
create mode 100644 scripts/capture-studio-codebook-reference.mjs
create mode 100644 scripts/codebook-docx-test-utils.mjs
create mode 100644 scripts/codebook-matrix.test.mjs
create mode 100644 scripts/fixtures/codebook-synthetic.mjs
create mode 100644 scripts/fixtures/studio-codebook/synthetic-reference.json
diff --git a/package.json b/package.json
index e94cb50..9376d3c 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"test:schemer:coverage": "ng test schemer --watch=false --browsers=ChromeHeadless --code-coverage",
"test:coverage": "npm run test:cc:coverage && npm run test:schemer:coverage",
"test:scheme": "node --test scripts/validate-coding-scheme.test.js",
- "test:codebook": "node --test scripts/codebook-contract.test.mjs",
+ "test:codebook": "node --test scripts/codebook-contract.test.mjs scripts/codebook-matrix.test.mjs",
"test:schemer:responsive": "playwright test --config playwright.schemer.config.cjs"
},
"dependencies": {
diff --git a/scripts/capture-studio-codebook-reference.mjs b/scripts/capture-studio-codebook-reference.mjs
new file mode 100644
index 0000000..3c679f8
--- /dev/null
+++ b/scripts/capture-studio-codebook-reference.mjs
@@ -0,0 +1,52 @@
+// Explicit maintainer operation, never run by CI. Requires a Studio checkout with
+// the immutable pre-harmonisation commit; generates only invented fixture data.
+import assert from 'node:assert/strict';
+import { execFileSync } from 'node:child_process';
+import { createRequire, Module } from 'node:module';
+import { writeFile } from 'node:fs/promises';
+import { referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
+import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
+
+const studio = process.argv[2];
+if (!studio) throw new Error('Usage: node scripts/capture-studio-codebook-reference.mjs /path/to/studio-checkout');
+const ref = '2504265721a59c7c65425072951ce82ab16f0fb8';
+const require = createRequire(import.meta.url);
+const ts = require('typescript');
+const source = path => execFileSync('git', ['show', `${ref}:${path}`], { cwd: studio, encoding: 'utf8' });
+const math = await import('mathml2omml');
+function compile(code, overrides = {}) {
+ const output = ts.transpileModule(code, { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.CommonJS, esModuleInterop: true } }).outputText;
+ const mod = new Module(import.meta.filename);
+ mod.filename = import.meta.filename;
+ mod.paths = Module._nodeModulePaths(new URL('..', import.meta.url).pathname);
+ mod.require = name => overrides[name] || require(name);
+ mod._compile(output, mod.filename);
+ return mod.exports;
+}
+const colors = compile(source('apps/api/src/app/utils/web-colors.ts'));
+const renderer = compile(source('apps/api/src/app/classes/download-docx.class.ts'), {
+ mathml2omml: math, '../utils/web-colors': colors
+}).DownloadDocx;
+const dataSource = source('apps/api/src/app/classes/download-workspaces.class.ts');
+const ast = ts.createSourceFile('baseline.ts', dataSource, ts.ScriptTarget.Latest, true);
+const cls = ast.statements.find(node => ts.isClassDeclaration(node) && node.name.text === 'DownloadWorkspacesClass');
+const names = new Set(['isClosed', 'isManual', 'getCodeInfo', 'getCodeInfoFromCodeAsText', 'getRulesDescription',
+ 'getBaseOrDerivedBookVariable', 'getCodes', 'getManualOrClosedCodedBookVariable', 'getBookVariable',
+ 'getCodeBookDataForUnit', 'getBookVariables', 'getSortedBookVariables']);
+const methods = cls.members.filter(node => node.name && names.has(node.name.getText(ast))).map(node => node.getText(ast));
+assert.equal(methods.length, names.size);
+const adapter = compile(`import { ToTextFactory } from '@iqb/responses'; import { CodingScheme } from '@iqbspecs/coding-scheme';
+ export class DownloadWorkspacesClass { ${methods.join('\n')} }`).DownloadWorkspacesClass;
+const cases = [];
+for (const options of referenceOptions()) {
+ const data = referenceCorpus().map(unit => adapter.getCodeBookDataForUnit(unit, options,
+ [{ code: 99, label: 'Missing', description: 'Keine Antwort' }]));
+ const json = data.map(({ key, name, variables, missings }) => ({ key, name, variables, missings }));
+ const parts = await docxParts(await renderer.getDocXCodebook(data, options));
+ cases.push({ options, json, docxParts: partHashes(parts) });
+}
+const fixture = { source: `iqb-berlin/studio-lite@${ref}`, docx: '8.5.0', responses: '5.2.2',
+ normalization: ['footer date', 'IQB-Studio Codebook -> IQB Codebook', 'exclude docProps/core.xml timestamps',
+ 'random media filenames in first-reference order; image bytes and relationships preserved'], cases };
+await writeFile(new URL('./fixtures/studio-codebook/synthetic-reference.json', import.meta.url), `${JSON.stringify(fixture, null, 2)}\n`);
+console.log(`Captured ${cases.length} original Studio JSON/DOCX cases from raw invented schemas.`);
diff --git a/scripts/codebook-docx-test-utils.mjs b/scripts/codebook-docx-test-utils.mjs
new file mode 100644
index 0000000..223b31c
--- /dev/null
+++ b/scripts/codebook-docx-test-utils.mjs
@@ -0,0 +1,34 @@
+import { createHash } from 'node:crypto';
+import JSZip from 'jszip';
+
+export async function docxParts(output) {
+ const zip = await JSZip.loadAsync(output instanceof Blob ? await output.arrayBuffer() : output);
+ // docx assigns random media filenames. Preserve each relationship and each image
+ // byte, replacing only that random name in first-reference order.
+ const mediaNames = new Map();
+ for (const [name, file] of Object.entries(zip.files).sort(([a], [b]) => a.localeCompare(b))) {
+ if (!name.endsWith('.rels')) continue;
+ for (const match of (await file.async('string')).matchAll(/Target="media\/([^"]+)"/g)) {
+ if (!mediaNames.has(match[1])) {
+ const bytes = await zip.file(`word/media/${match[1]}`).async('nodebuffer');
+ mediaNames.set(match[1], `image-${mediaNames.size}-${createHash('sha256').update(bytes).digest('hex')}.${match[1].split('.').pop()}`);
+ }
+ }
+ }
+ const result = {};
+ for (const [name, file] of Object.entries(zip.files).sort(([a], [b]) => a.localeCompare(b))) {
+ if (file.dir || name === 'docProps/core.xml') continue; // creation/modification timestamps, not document layout
+ const stableName = name.startsWith('word/media/') ? `word/media/${mediaNames.get(name.slice(11)) || name.slice(11)}` : name;
+ result[stableName] = name.endsWith('.xml') || name.endsWith('.rels') ?
+ (await file.async('string')).replaceAll(new Date().toLocaleDateString(), '{{DATE}}')
+ .replaceAll('IQB-Studio Codebook', 'IQB Codebook') :
+ await file.async('nodebuffer');
+ if (typeof result[stableName] === 'string') {
+ for (const [random, stable] of mediaNames) result[stableName] = result[stableName].replaceAll(random, stable);
+ }
+ }
+ return result;
+}
+export function partHashes(parts) {
+ return Object.fromEntries(Object.entries(parts).map(([name, content]) => [name, createHash('sha256').update(content).digest('hex')]));
+}
diff --git a/scripts/codebook-matrix.test.mjs b/scripts/codebook-matrix.test.mjs
new file mode 100644
index 0000000..ade5dd3
--- /dev/null
+++ b/scripts/codebook-matrix.test.mjs
@@ -0,0 +1,90 @@
+import assert from 'node:assert/strict';
+import { test } from 'node:test';
+import { readFile } from 'node:fs/promises';
+import { load } from 'cheerio';
+import { CodebookGenerator } from '../dist/ngx-coding-components/fesm2022/iqb-ngx-coding-components-codebook-generator.mjs';
+import { defaults, selectionCorpus, expectedSelection, optionMatrix, missingCases, referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
+import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
+
+const corpus = selectionCorpus();
+const compactRows = corpus.rows.filter(({ variable }) => variable.sourceType === 'BASE' ||
+ (variable.id.endsWith('_MIXED') && ['SUM_SCORE', 'BASE_NO_VALUE'].includes(variable.sourceType)));
+const compactUnits = [{ ...corpus.units[1], scheme: JSON.stringify({ version: '3.4', variableCodings: compactRows.map(r => r.variable).reverse() }) }];
+const projection = variables => variables.map(({ id, codes }) => ({ id, codes: codes.map(c => c.id) }));
+
+for (const options of optionMatrix()) {
+ test(`all options ${JSON.stringify(options)}`, async () => {
+ const expected = expectedSelection(corpus.rows, options);
+ const compactExpected = expectedSelection(compactRows, options);
+ for (const missings of missingCases) {
+ const json = JSON.parse(await (await CodebookGenerator.generateCodebook(corpus.units, { ...options, exportFormat: 'json' }, missings)).text());
+ assert.deepEqual(json.map(unit => unit.key), ['A', 'Z']);
+ assert.deepEqual(projection(json[0].variables), expected);
+ assert.deepEqual(json[1].variables, []);
+ assert.deepEqual(json[0].missings, missings);
+ assert.equal('items' in json[0], false);
+ for (const variable of json[0].variables) {
+ assert.equal(!!variable.generalInstruction, options.hasGeneralInstructions);
+ for (const code of variable.codes) {
+ assert.equal('score' in code, options.showScore);
+ if (options.showScore && code.id === '0') assert.equal(code.score, '0');
+ if (options.codeLabelToUpper) assert.equal(code.label, code.label.toUpperCase());
+ }
+ }
+ const parts = await docxParts(await CodebookGenerator.generateCodebook(compactUnits, { ...options, exportFormat: 'docx' }, missings));
+ const $ = load(parts['word/document.xml'], { xml: true });
+ const headings = $('w\\:p').filter((_, p) => $(p).find('w\\:pStyle').attr('w:val') === 'Heading2');
+ assert.deepEqual(headings.toArray().map(p => $(p).find('w\\:t').text().split(' ')[0]), compactExpected.map(v => v.id));
+ const tables = $('w\\:tbl').toArray();
+ assert.equal(tables.length, compactExpected.length);
+ tables.forEach((table, i) => {
+ const rows = $(table).children('w\\:tr').toArray();
+ assert.deepEqual(rows.map(row => $(row).children('w\\:tc').first().text()), compactExpected[i].codes);
+ rows.forEach(row => assert.equal($(row).children('w\\:tc').length, options.showScore ? 4 : 3));
+ assert.equal($(table).find('w\\:cantSplit').length, rows.length);
+ // Widths needed by Microsoft Word and the grid needed by Writer are both preserved.
+ assert.equal($(table).children('w\\:tblGrid').children().length, options.showScore ? 4 : 3);
+ assert.equal($(table).find('w\\:tcW').length, rows.length * (options.showScore ? 4 : 3));
+ });
+ const paragraphs = $('w\\:body').children('w\\:p').toArray().map(p => $(p).find('w\\:t').text());
+ assert.equal(paragraphs.filter(t => t.startsWith('Item(s):')).length, options.hideItemVarRelation ? 0 : compactExpected.length);
+ assert.equal(paragraphs.includes('Allgemeiner Hinweis'), options.hasGeneralInstructions && compactExpected.some(v => v.id.endsWith('_GENERAL_ONLY')));
+ assert.equal(paragraphs.some(t => /^\s+$/.test(t)), false, 'whitespace instructions must not change page layout');
+ for (const missing of missings) assert.ok(paragraphs.includes(`${missing.code} ${missing.label}`));
+ const formulaCount = compactExpected.filter(v => v.id.endsWith('_FORMULA')).length;
+ const imageCount = compactExpected.filter(v => v.id.endsWith('_IMAGE')).length;
+ assert.equal($('m\\:oMath').length, formulaCount);
+ assert.equal($('w\\:drawing').length, imageCount);
+ assert.doesNotMatch(parts['word/document.xml'], / {
+ for (const version of ['3.0', '3.3', '3.4']) {
+ const unit = { ...compactUnits[0], scheme: JSON.stringify({ ...JSON.parse(compactUnits[0].scheme), version }) };
+ assert.deepEqual(projection(CodebookGenerator.getCodebookData([unit], defaults, [])[0].variables), expectedSelection(compactRows, defaults));
+ }
+ for (const scheme of ['{', '{}', '{"variableCodings":null}', '{"variableCodings":[null]}']) {
+ await assert.rejects(CodebookGenerator.generateCodebook([{ ...compactUnits[0], key: 'BROKEN', scheme }], defaults, []), /BROKEN/);
+ }
+});
+
+test('raw synthetic schemas match original Studio JSON and complete DOCX parts for all formatting combinations', async () => {
+ const expected = JSON.parse(await readFile(new URL('./fixtures/studio-codebook/synthetic-reference.json', import.meta.url), 'utf8'));
+ let index = 0;
+ for (const options of referenceOptions()) {
+ const entry = expected.cases[index++];
+ assert.deepEqual(entry.options, options);
+ const units = referenceCorpus();
+ const missings = [{ code: 99, label: 'Missing', description: 'Keine Antwort' }];
+ const json = JSON.parse(await (await CodebookGenerator.generateCodebook(units, { ...options, exportFormat: 'json' }, missings)).text());
+ assert.deepEqual(json, entry.json, `original Studio raw-schema JSON: case ${index}`);
+ const parts = await docxParts(await CodebookGenerator.generateCodebook(units, options, missings));
+ assert.deepEqual(partHashes(parts), entry.docxParts, `original Studio DOCX: case ${index}`);
+ }
+ assert.equal(index, 32);
+});
diff --git a/scripts/fixtures/codebook-synthetic.mjs b/scripts/fixtures/codebook-synthetic.mjs
new file mode 100644
index 0000000..578bbc5
--- /dev/null
+++ b/scripts/fixtures/codebook-synthetic.mjs
@@ -0,0 +1,102 @@
+// Entirely invented data. Source archives only informed the structural categories;
+// no task identifiers, text, rules, pictures or formulas were copied from them.
+export const image = 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAUCAIAAABwJOjsAAAAJElEQVR4nGOQSDgwIIhh1OJRi0ctHrV41OJRi0ctHrV45FgMAHBlzy43YLJ+AAAAAElFTkSuQmCC';
+export const booleanOptions = ['hasOnlyManualCoding', 'hasClosedVars', 'hasOnlyVarsWithCodes', 'hasDerivedVars',
+ 'hasGeneralInstructions', 'codeLabelToUpper', 'showScore', 'hideItemVarRelation'];
+export const defaults = { exportFormat: 'docx', missingsProfile: '', hasOnlyManualCoding: true,
+ hasClosedVars: true, hasOnlyVarsWithCodes: true, hasDerivedVars: true, hasGeneralInstructions: true,
+ codeLabelToUpper: true, showScore: true, hideItemVarRelation: true, trainingRequirement: 'all' };
+export function* optionMatrix() {
+ for (let bits = 0; bits < 256; bits += 1) {
+ for (const trainingRequirement of ['all', 'required', 'not-required']) {
+ yield { ...defaults, ...Object.fromEntries(booleanOptions.map((key, i) => [key, !!(bits & (1 << i))])), trainingRequirement };
+ }
+ }
+}
+export const missingCases = [[], [{ code: 0, label: 'Missing zero', description: 'Keine Eingabe' },
+ { code: 99, label: 'Missing other', description: 'Nicht bearbeitet' }],
+[{ code: '0', label: 'Missing string zero', description: 'Keine Eingabe' }]];
+export const ruleCases = [
+ ['MATCH', ['alpha']], ['MATCH_REGEX', ['^beta$']], ['NUMERIC_MATCH', ['7']],
+ ['NUMERIC_RANGE', ['2', '9']], ['NUMERIC_FULL_RANGE', ['3', '8']],
+ ['NUMERIC_LESS_THAN', ['5']], ['NUMERIC_MORE_THAN', ['6']], ['NUMERIC_MAX', ['10']],
+ ['NUMERIC_MIN', ['4']], ['IS_EMPTY', []], ['IS_NULL', []], ['IS_TRUE', []], ['IS_FALSE', []]
+];
+const code = (id, manualInstruction = '', type = 'FULL_CREDIT', extra = {}) => ({ id, type,
+ label: `Label ${id}`, score: id === 0 ? 0 : 2, manualInstruction, ruleSets: [], ruleSetOperatorAnd: true, ...extra });
+
+// Expected membership is explicit: [no filter, manual only, closed only, both].
+// These declarations are the specification, not a call into the production filter.
+const groups = [
+ { name: 'MANUAL', codes: [code(2, 'Bewerten
'), code(0)], selected: [[2, 0], [2], null, [2, 0]] },
+ { name: 'MIXED', codes: [code(2, 'Gemischt
'), code(0, '', 'RESIDUAL_AUTO')], selected: [[2, 0], [2], [2, 0], [2, 0]] },
+ { name: 'CLOSED', codes: [code(0, '', 'RESIDUAL_AUTO')], selected: [[0], null, [0], [0]] },
+ { name: 'INCOMPLETE', codes: [code(0, '', 'INTENDED_INCOMPLETE')], selected: [[0], null, [0], [0]] },
+ { name: 'AUTO', codes: [code(0)], selected: [[0], null, null, null] },
+ { name: 'EMPTY', codes: [], selected: [[], null, null, null] },
+ { name: 'GENERAL_ONLY', codes: [code(0)], general: 'Allgemeiner Hinweis
', selected: [[0], null, null, null] },
+ { name: 'INVISIBLE', codes: [code(0, '
')], selected: [[0], null, null, null] },
+ { name: 'IMAGE', codes: [code(0, `
`)], selected: [[0], [0], null, [0]] },
+ { name: 'FORMULA', codes: [code(0, '[[iqb-math:x^2]]
')], selected: [[0], [0], null, [0]] },
+ { name: 'RESIDUAL', codes: [code(0, 'Rest bewerten
', 'RESIDUAL')], selected: [[0], [0], null, [0]] },
+ { name: 'TO_CHECK', codes: [code(0, '', 'TO_CHECK')], selected: [[0], [0], null, [0]] },
+ { name: 'PARTIAL', codes: [code(0, 'Teilweise
', 'PARTIAL_CREDIT')], selected: [[0], [0], null, [0]] },
+ { name: 'CLOSED_TEXT', codes: [code(0, 'Geschlossener Hinweis
', 'RESIDUAL_AUTO')], selected: [[0], null, [0], [0]] }
+];
+export function selectionCorpus() {
+ const rows = [];
+ for (const sourceType of ['BASE', 'MANUAL', 'COPY_VALUE', 'SUM_SCORE', 'SOLVER', 'UNIQUE_VALUES', 'CONCAT_CODE', 'SUM_CODE', 'BASE_NO_VALUE']) {
+ for (const training of [false, true]) {
+ for (const group of groups) {
+ const id = `${sourceType}_${training ? 'TRAIN' : 'REGULAR'}_${group.name}`;
+ const variable = { id, alias: `PUBLIC.${id}`, label: id, sourceType, deriveSources: ['SOURCE'],
+ sourceParameters: sourceType === 'SOLVER' ? { solverExpression: 'SOURCE + 1' } : {},
+ processing: training ? ['CODER_TRAINING_REQUIRED'] : [], manualInstruction: group.general || ' ', codes: group.codes };
+ rows.push({ variable, selected: group.selected, training });
+ }
+ }
+ }
+ return { rows, units: [{ id: 2, key: 'Z', name: 'Leer', scheme: JSON.stringify({ version: '3.4', variableCodings: [] }), metadata: { items: [] } },
+ { id: 1, key: 'A', name: 'Künstliche Kategorien', scheme: JSON.stringify({ version: '3.4', variableCodings: rows.map(r => r.variable).reverse() }),
+ metadata: { items: rows.map(({ variable }) => ({ id: `ITEM_${variable.id}`, variableId: variable.alias })) } }] };
+}
+export function expectedSelection(rows, options) {
+ const column = Number(options.hasOnlyManualCoding) + 2 * Number(options.hasClosedVars);
+ return rows.filter(({ variable, training, selected }) => selected[column] !== null &&
+ variable.sourceType !== 'BASE_NO_VALUE' && (options.hasDerivedVars || variable.sourceType === 'BASE') &&
+ (options.trainingRequirement === 'all' || training === (options.trainingRequirement === 'required')) &&
+ (!options.hasOnlyVarsWithCodes || selected[column].length))
+ .map(({ variable, selected }) => ({ id: variable.alias, codes: selected[column].map(String) }))
+ .sort((a, b) => a.id < b.id ? -1 : Number(a.id > b.id));
+}
+
+// Stable original-Studio behaviour. Approved corrections have separate tests.
+// In particular no nested marks, loose text, whitespace at mark boundaries,
+// corrected item relations, or changed manual-only filtering is hidden here.
+export function referenceCorpus() {
+ const variables = ruleCases.map(([method, parameters], i) => ({ id: `RULE_${String(i).padStart(2, '0')}`,
+ alias: `ALIAS_${String(i).padStart(2, '0')}`, label: `Regel ${i}`, sourceType: 'BASE', manualInstruction: i ? '' : ' ',
+ codes: [code(1, 'Bewerten
', 'FULL_CREDIT', { ruleSets: [{ rules: [{ method, parameters }], ruleOperatorAnd: true }] })] }));
+ variables.push({ id: 'RICH', alias: 'Z_RICH', label: 'Formatierung', sourceType: 'BASE',
+ manualInstruction: 'Allgemeiner Hinweis
', codes: [code(2,
+ `Farbe
` +
+ 'Unterstrichen
Kursiv
Durchgestrichen
' +
+ 'Kriterium eins
Kriterium zwei
' +
+ '[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
' +
+ `
`)] });
+ variables.push({ id: 'DERIVED', alias: 'Z_SUM', label: 'Abgeleitet', sourceType: 'SUM_SCORE', deriveSources: ['RULE_00'],
+ manualInstruction: '', codes: [code(3, 'Summe bewerten
')] });
+ variables.push({ id: 'CONNECT', alias: 'Z_CONNECT', label: 'Verknüpfungen', sourceType: 'BASE', manualInstruction: '',
+ codes: [true, false].map((and, i) => code(i + 4, 'Verknüpft
', 'FULL_CREDIT', { ruleSetOperatorAnd: and,
+ ruleSets: [{ ruleOperatorAnd: and, valueArrayPos: 'ANY', rules: [{ method: 'MATCH', parameters: ['gamma'] }, { method: 'IS_TRUE', fragment: 0 }] },
+ { ruleOperatorAnd: and, valueArrayPos: 0, rules: [{ method: 'NUMERIC_MATCH', parameters: ['11'] }] }] })) });
+ return [{ id: 1, key: 'A', name: 'Synthetische Studio Referenz', scheme: JSON.stringify({ version: '3.4', variableCodings: variables }), metadata: { items: [] } },
+ { id: 2, key: 'B', name: 'Zweite Aufgabe', scheme: JSON.stringify({ version: '3.0', variableCodings: [variables[0]] }), metadata: { items: [] } }];
+}
+export function* referenceOptions() {
+ for (let bits = 0; bits < 32; bits += 1) {
+ const keys = ['hasGeneralInstructions', 'codeLabelToUpper', 'showScore', 'hideItemVarRelation', 'hasDerivedVars'];
+ yield { ...defaults, hasOnlyManualCoding: false, hasClosedVars: false, hasOnlyVarsWithCodes: false,
+ ...Object.fromEntries(keys.map((key, i) => [key, !!(bits & (1 << i))])) };
+ }
+}
diff --git a/scripts/fixtures/studio-codebook/README.md b/scripts/fixtures/studio-codebook/README.md
index ff24e02..82c3c00 100644
--- a/scripts/fixtures/studio-codebook/README.md
+++ b/scripts/fixtures/studio-codebook/README.md
@@ -11,3 +11,32 @@ Only two baseline normalizations:
Document XML, styles, numbering, settings and footer must otherwise match exactly.
The fixture deliberately excludes the separately tested approved corrections
(code/missing 0, item relationships, plain instructions and whitespace boundaries).
+
+## Synthetic raw-schema reference
+
+`synthetic-reference.json` contains original Studio JSON and SHA-256 digests of
+every DOCX part for 32 formatting combinations, starting from raw invented
+schemes in `../codebook-synthetic.mjs`. It covers all 13 supported rule methods,
+AND/OR rules and rule sets, array positions, multiple tasks, derived variables,
+aliases, formatted text, list paragraphs, images and inline/block formulas.
+Whitespace-only general instructions must retain the original Studio layout.
+
+The synthetic categories were informed by five example ZIPs, but none of their
+identifiers, task content, instructions, rules or images are included. The example
+ZIPs are neither required by tests nor committed as reference fixtures.
+
+Besides the two normalizations above, ZIP container timestamps are irrelevant,
+`docProps/core.xml` (creation/modification metadata) is excluded, and random image
+filenames are replaced in first-reference order. Image bytes, relationship
+targets, document XML, styles, widths, margins, numbering and page fields remain
+part of the exact comparison. `codebook-docx-test-utils.mjs` implements this.
+
+The baseline is captured explicitly from the immutable Studio commit above:
+
+```sh
+node scripts/capture-studio-codebook-reference.mjs /path/to/studio-checkout
+```
+
+CI only reads this fixture. Never regenerate it from the shared generator to make
+a failing test pass. Approved semantic corrections are checked independently by
+the option matrix rather than being disguised as original Studio behaviour.
diff --git a/scripts/fixtures/studio-codebook/synthetic-reference.json b/scripts/fixtures/studio-codebook/synthetic-reference.json
new file mode 100644
index 0000000..fc45b58
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/synthetic-reference.json
@@ -0,0 +1,9301 @@
+{
+ "source": "iqb-berlin/studio-lite@2504265721a59c7c65425072951ce82ab16f0fb8",
+ "docx": "8.5.0",
+ "responses": "5.2.2",
+ "normalization": [
+ "footer date",
+ "IQB-Studio Codebook -> IQB Codebook",
+ "exclude docProps/core.xml timestamps",
+ "random media filenames in first-reference order; image bytes and relationships preserved"
+ ],
+ "cases": [
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "5bb32bfe61cd729e3f4209fb2229dc59d411975f31f3e505f0375010865301bd",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "99d5f96d9ff75cef3deb0dc265411526598bd0ea7a3f755372ae7761f3b36cc1",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "5bb32bfe61cd729e3f4209fb2229dc59d411975f31f3e505f0375010865301bd",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "99d5f96d9ff75cef3deb0dc265411526598bd0ea7a3f755372ae7761f3b36cc1",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "26bb549d5e562916822058d9a3de6914df179b4bc47428988064589310dbf659",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c50511de7b40e5f30b30b3181abc78a0c6f89ef4d156eb9d63162a84c08a8744",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "26bb549d5e562916822058d9a3de6914df179b4bc47428988064589310dbf659",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c50511de7b40e5f30b30b3181abc78a0c6f89ef4d156eb9d63162a84c08a8744",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "5bb32bfe61cd729e3f4209fb2229dc59d411975f31f3e505f0375010865301bd",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "99d5f96d9ff75cef3deb0dc265411526598bd0ea7a3f755372ae7761f3b36cc1",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "5bb32bfe61cd729e3f4209fb2229dc59d411975f31f3e505f0375010865301bd",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "99d5f96d9ff75cef3deb0dc265411526598bd0ea7a3f755372ae7761f3b36cc1",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "26bb549d5e562916822058d9a3de6914df179b4bc47428988064589310dbf659",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c50511de7b40e5f30b30b3181abc78a0c6f89ef4d156eb9d63162a84c08a8744",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "26bb549d5e562916822058d9a3de6914df179b4bc47428988064589310dbf659",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": false,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c50511de7b40e5f30b30b3181abc78a0c6f89ef4d156eb9d63162a84c08a8744",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "87cfe0ff9c38fcd2c157e548791bae4d76124e957de2d9bdd589f62b16f84c80",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "633c95ee191bf907f7325608a737de635c7d8ee47559bf086a65dd2d951738c7",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "87cfe0ff9c38fcd2c157e548791bae4d76124e957de2d9bdd589f62b16f84c80",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "633c95ee191bf907f7325608a737de635c7d8ee47559bf086a65dd2d951738c7",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "57723ed4c2252405e198c6900dfa4ff453a91b4a3032f2f66b0c7a0d59e0137f",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "70b7903b93334e1302849b9c06cdf99ad810622db701df938e419648acc06f21",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "57723ed4c2252405e198c6900dfa4ff453a91b4a3032f2f66b0c7a0d59e0137f",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": false,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "70b7903b93334e1302849b9c06cdf99ad810622db701df938e419648acc06f21",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "87cfe0ff9c38fcd2c157e548791bae4d76124e957de2d9bdd589f62b16f84c80",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "633c95ee191bf907f7325608a737de635c7d8ee47559bf086a65dd2d951738c7",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "87cfe0ff9c38fcd2c157e548791bae4d76124e957de2d9bdd589f62b16f84c80",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "633c95ee191bf907f7325608a737de635c7d8ee47559bf086a65dd2d951738c7",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "57723ed4c2252405e198c6900dfa4ff453a91b4a3032f2f66b0c7a0d59e0137f",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "70b7903b93334e1302849b9c06cdf99ad810622db701df938e419648acc06f21",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": false,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "57723ed4c2252405e198c6900dfa4ff453a91b4a3032f2f66b0c7a0d59e0137f",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": true,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "A",
+ "name": "Synthetische Studio Referenz",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_01",
+ "label": "Regel 1",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_02",
+ "label": "Regel 2",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Übereinstimmung (numerisch) mit '7'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_03",
+ "label": "Regel 3",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '2' und Wert ist maximal '9'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_04",
+ "label": "Regel 4",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '3' und Wert ist maximal '8'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_05",
+ "label": "Regel 5",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert geringer als '5'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_06",
+ "label": "Regel 6",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert größer als '6'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_07",
+ "label": "Regel 7",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist maximal '10'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_08",
+ "label": "Regel 8",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist mindestens '4'
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_09",
+ "label": "Regel 9",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Leerer Wert
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_10",
+ "label": "Regel 10",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist NULL
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_11",
+ "label": "Regel 11",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist WAHR
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "ALIAS_12",
+ "label": "Regel 12",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Wert ist FALSCH
Bewerten
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_CONNECT",
+ "label": "Verknüpfungen",
+ "sourceType": "BASE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "4",
+ "label": "RICHTIG",
+ "description": "gamma\n\nUND\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ },
+ {
+ "id": "5",
+ "label": "RICHTIG",
+ "description": "gamma\n\nODER\n\nWert ist WAHR - F1
Übereinstimmung (numerisch) mit '11' (A1)
Verknüpft
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_RICH",
+ "label": "Formatierung",
+ "sourceType": "BASE",
+ "generalInstruction": "Allgemeiner Hinweis
",
+ "codes": [
+ {
+ "id": "2",
+ "label": "RICHTIG",
+ "description": "Farbe
Unterstrichen
Kursiv
Durchgestrichen
Kriterium eins
Kriterium zwei
[[iqb-math:x^2]]
Formel:[[iqb-math:a%3Cb]]
",
+ "score": "2"
+ }
+ ]
+ },
+ {
+ "id": "Z_SUM",
+ "label": "Abgeleitet",
+ "sourceType": "SUM_SCORE",
+ "generalInstruction": "",
+ "codes": [
+ {
+ "id": "3",
+ "label": "RICHTIG",
+ "description": "Summe bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ },
+ {
+ "key": "B",
+ "name": "Zweite Aufgabe",
+ "variables": [
+ {
+ "id": "ALIAS_00",
+ "label": "Regel 0",
+ "sourceType": "BASE",
+ "generalInstruction": " ",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "alpha
Bewerten
",
+ "score": "2"
+ }
+ ]
+ }
+ ],
+ "missings": [
+ {
+ "code": 99,
+ "label": "Missing",
+ "description": "Keine Antwort"
+ }
+ ]
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "4f37a9ec8bc6e77ac1635576141af357bad88366fb22e54344e54d7053be66e2",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "70b7903b93334e1302849b9c06cdf99ad810622db701df938e419648acc06f21",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/media/image-0-78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684.png": "78d10360f88bf6fea9f54941ae25397f917c4f081d3b14f7a86d2685f6f5e684",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ }
+ ]
+}
From 946585efd810c31d729d82433155e16ef2cf2914 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Mon, 12 Oct 2026 11:47:34 +0200
Subject: [PATCH 12/36] test: compare host installations and prepare Windows
Word acceptance
---
docs/shared-codebook.md | 38 +++++-
scripts/capture-studio-codebook-reference.mjs | 8 +-
scripts/compare-codebook-installations.mjs | 122 ++++++++++++++++++
scripts/verify-codebook-word-windows.ps1 | 95 ++++++++++++++
4 files changed, 261 insertions(+), 2 deletions(-)
create mode 100644 scripts/compare-codebook-installations.mjs
create mode 100644 scripts/verify-codebook-word-windows.ps1
diff --git a/docs/shared-codebook.md b/docs/shared-codebook.md
index 6a8aac8..0df630e 100644
--- a/docs/shared-codebook.md
+++ b/docs/shared-codebook.md
@@ -38,7 +38,9 @@ aber im Codebook-Dialog nicht mehr angeboten (Issue #176).
* Leere HTML-Strukturen, unsichtbare Zeichen und Leerzeichen sind keine Instruktion;
unterstützte Bilder und Formeln sind eine Instruktion. Allgemeine Instruktionen
allein machen keinen Code manuell.
-* Code 0 und Missing 0 bleiben erhalten. Leere Exporte liefern `[]` bzw. ein gültiges
+* Code 0 und Missing 0 bleiben erhalten. Missing-Codes behalten ihren JSON-Datentyp
+ aus dem Profil (Zahl oder Zeichenkette); Kodierbox wandelt Zahlen nicht mehr in
+ Zeichenketten um. Leere Exporte liefern `[]` bzw. ein gültiges
DOCX. Fehlerhafte Schemen melden die betroffene Aufgabe.
* Aufgaben werden nach Schlüssel, Variablen nach Alias/ID sortiert; Codefolge bleibt.
* Schulungsbedarf: alle, nur mit oder nur ohne CODER_TRAINING_REQUIRED; kombiniert
@@ -81,8 +83,42 @@ Rollback: vorherige Bibliotheks-/Anwendungsversion; keine Datenmigration.
JSON, DOCX-Struktur, Bilder, Formeln, Itembeziehungen und CJS/ESM-Gleichheit.
* `npm run test:cc`: Angular-Tests einschließlich Auswahl/Suche/Sperrzustände.
* Beide Hosts testen ihre echten Adapter und bestehenden Formelregressionen.
+* Die künstlichen Fälle in `scripts/fixtures/codebook-synthetic.mjs` enthalten keine
+ Aufgabeninhalte aus den Beispiel-ZIPs. Die Matrix durchläuft alle 256 Kombinationen
+ der acht Ja/Nein-Optionen, drei Schulungsfilter, drei Missing-Konstellationen und
+ beide Formate: 4.608 Exporte. Alle neun Quelltypen werden in der Datenauswahl geprüft.
+* 32 zusätzliche Referenzfälle vergleichen Rohschema → JSON und sämtliche relevanten
+ DOCX-Bestandteile mit dem ursprünglichen Studio. Die Referenz wird ausschließlich
+ aus dem dokumentierten alten Studio-Commit erzeugt, niemals aus dem neuen Generator.
+* `node scripts/compare-codebook-installations.mjs STUDIO_ROOT BOX_ROOT OUTPUT_DIR`
+ prüft dieselbe Matrix über Studios DownloadWorkspacesClass und Kodierboxs echten
+ Generation-Service samt Adapter mit Datenquellen im jeweiligen Anwendungsformat.
+ Nur Datenbank-/Profilzugriffe werden im Speicher bereitgestellt. Der Vergleich
+ schließt Bilder, Beziehungen, Styles, Fußzeilen und Missing-Datentypen ein.
+ Das ist ausdrücklich kein HTTP-, Browser-, Berechtigungs- oder Redis-End-to-End-Test.
* Studio-Frontend prüft direkten Export, Ladezustände, Fehlermeldung und Speichersperre.
* Kodierbox prüft Scope-Filter, wiederholte Starts, langsame Statusabfragen und Schließen.
* Frontend- und Backend-Prüfungen auf dem Entwicklungsrechner nacheinander ausführen.
* Vor Ausrollen bleiben visuelle Mehrseiten-DOCX-Abnahme und Host-Browserabläufe
einschließlich Netzwerkprüfung verpflichtend.
+
+### Microsoft Word unter Windows
+
+Word unter Windows ist ein eigener Abnahmeweg. XML-Gleichheit und LibreOffice-
+Rendering ersetzen ihn nicht. Der Installationsvergleich legt künstliche Exporte
+sechs DOCX-Dateien und `word-expectations.json` im Ausgabeverzeichnis ab: je Anwendung
+einen Filter-/Missing-0-Fall sowie Rich-Text-Fälle mit und ohne Score-Spalte. Die
+Rich-Text-Fälle werden zusätzlich direkt gegen die alte Studio-Referenz geprüft.
+Auf einem Windows-Rechner mit Desktop-Word:
+
+```powershell
+./scripts/verify-codebook-word-windows.ps1 -Directory C:\Codebook-Pruefung
+```
+
+Das Skript öffnet alle Dateien regulär und schreibgeschützt, aktualisiert Felder,
+prüft Textgleichheit, Seitenzahl, Tabellen, ungeteilte Zeilen, Bilder, Formeln und
+Fußzeilen und exportiert sechs PDFs. Es speichert Word-Version und Build im Ergebnis.
+Anschließend alle gerenderten Dokumente vollständig visuell prüfen: insbesondere
+Spaltenbreiten, Umbrüche, Formeln, Bilder, Schriften und „Seite X von Y“.
+`visualAcceptanceComplete` bleibt bis zur tatsächlichen visuellen Abnahme false.
+Eine nicht ausgeführte Windows-Prüfung darf nicht als bestanden gemeldet werden.
diff --git a/scripts/capture-studio-codebook-reference.mjs b/scripts/capture-studio-codebook-reference.mjs
index 3c679f8..9618722 100644
--- a/scripts/capture-studio-codebook-reference.mjs
+++ b/scripts/capture-studio-codebook-reference.mjs
@@ -3,7 +3,7 @@
import assert from 'node:assert/strict';
import { execFileSync } from 'node:child_process';
import { createRequire, Module } from 'node:module';
-import { writeFile } from 'node:fs/promises';
+import { readFile, writeFile } from 'node:fs/promises';
import { referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
@@ -13,6 +13,12 @@ const ref = '2504265721a59c7c65425072951ce82ab16f0fb8';
const require = createRequire(import.meta.url);
const ts = require('typescript');
const source = path => execFileSync('git', ['show', `${ref}:${path}`], { cwd: studio, encoding: 'utf8' });
+const baselineLock = JSON.parse(source('package-lock.json'));
+for (const name of ['docx', '@iqb/responses', 'mathml2omml', 'cheerio', '@iqbspecs/coding-scheme']) {
+ const installed = JSON.parse(await readFile(new URL(`../node_modules/${name}/package.json`, import.meta.url), 'utf8'));
+ assert.equal(installed.version, baselineLock.packages[`node_modules/${name}`].version,
+ `Reference capture requires the original Studio dependency version: ${name}`);
+}
const math = await import('mathml2omml');
function compile(code, overrides = {}) {
const output = ts.transpileModule(code, { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.CommonJS, esModuleInterop: true } }).outputText;
diff --git a/scripts/compare-codebook-installations.mjs b/scripts/compare-codebook-installations.mjs
new file mode 100644
index 0000000..89c0ad2
--- /dev/null
+++ b/scripts/compare-codebook-installations.mjs
@@ -0,0 +1,122 @@
+// Runs real host preparation and adapters against in-memory persistence boundaries.
+// Does not replace an HTTP/browser/Redis acceptance run.
+import assert from 'node:assert/strict';
+import { createRequire, Module } from 'node:module';
+import { readFile, writeFile, mkdir } from 'node:fs/promises';
+import { resolve, join } from 'node:path';
+import { load } from 'cheerio';
+import { optionMatrix, selectionCorpus, missingCases, expectedSelection, defaults, referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
+import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
+
+const [studioPath, boxPath, outputPath] = process.argv.slice(2);
+if (!studioPath || !boxPath || !outputPath) throw new Error('Usage: node scripts/compare-codebook-installations.mjs STUDIO_ROOT BOX_ROOT OUTPUT_DIR');
+const localRequire = createRequire(import.meta.url);
+const ts = localRequire('typescript');
+async function hostModule(root, path, overrides = {}) {
+ const filename = join(root, path);
+ const require = createRequire(filename);
+ const source = await readFile(filename, 'utf8');
+ const output = ts.transpileModule(source, { compilerOptions: { target: ts.ScriptTarget.ES2022,
+ module: ts.ModuleKind.CommonJS, esModuleInterop: true, experimentalDecorators: true } }).outputText;
+ const mod = new Module(filename);
+ mod.filename = filename;
+ mod.paths = Module._nodeModulePaths(root);
+ mod.require = name => overrides[name] || require(name);
+ mod._compile(output, filename);
+ return mod.exports;
+}
+const studio = resolve(studioPath);
+const box = resolve(boxPath);
+const output = resolve(outputPath);
+await mkdir(output, { recursive: true });
+const Studio = (await hostModule(studio, 'apps/api/src/app/classes/download-workspaces.class.ts', {
+ '@studio-lite/shared-code': { isCurrentFromOrder: order => order === 0 } // unrelated metadata reports, never called here
+})).DownloadWorkspacesClass;
+const boxAdapter = await hostModule(box, 'apps/backend/src/app/admin/code-book/codebook-generator.class.ts');
+// Entity constructors are DI tokens only. Repositories/profiles supply source
+// records in host format; the production service, scope handling and adapters run.
+const Service = (await hostModule(box, 'apps/backend/src/app/database/services/coding/codebook-generation.service.ts', {
+ '../../entities/file_upload.entity': { default: class FileUpload {} },
+ '../../entities/job-definition.entity': { JobDefinition: class JobDefinition {} },
+ '../../entities/variable-bundle.entity': { VariableBundle: class VariableBundle {} },
+ './missings-profiles.service': { MissingsProfilesService: class MissingsProfilesService {} },
+ '../../../admin/code-book/codebook-generator.class': boxAdapter
+})).CodebookGenerationService;
+const corpus = selectionCorpus();
+const rows = corpus.rows.filter(({ variable }) => variable.sourceType === 'BASE' ||
+ (variable.id.endsWith('_MIXED') && ['SUM_SCORE', 'BASE_NO_VALUE'].includes(variable.sourceType)));
+const rawUnits = [{ ...corpus.units[1], scheme: JSON.stringify({ version: '3.4', variableCodings: rows.map(r => r.variable).reverse() }),
+ metadata: { items: rows.map(({ variable }) => ({ id: `ITEM_${variable.id}`, variableId: variable.id })) } }];
+let currentUnits = rawUnits;
+const service = new Service({ find: async query => {
+ assert.equal(query.where.workspace_id, 42);
+ return currentUnits.map(unit => ({ id: unit.id, file_id: `${unit.key}.VOCS`, filename: `${unit.name}.vocs`, data: unit.scheme,
+ structured_data: { metadata: unit.metadata } }));
+} }, { findOne: async () => { throw new Error('Unexpected job definition lookup'); } },
+{ find: async () => { throw new Error('Unexpected bundle lookup'); } },
+{ getMissingsProfileDetails: async (workspace, id) => {
+ assert.equal(workspace, 42); assert.equal(id, 7);
+ return { missings: currentMissings };
+} });
+// The logger is not part of generation; keep the 2304-case comparison readable.
+service.logger = { log() {}, warn() {}, error(...args) { throw new Error(args.join(' ')); } };
+let currentMissings = [];
+let comparisons = 0;
+const wordCases = [];
+async function compare(options, missings, save = false, suffix = '', reference = null) {
+ currentMissings = missings;
+ const current = { ...options, missingsProfile: missings.length ? 'Synthetic profile' : '' };
+ const ids = currentUnits.map(unit => unit.id);
+ const a = await Studio.getWorkspaceCodingBook(42, { findAllWithProperties: async () => currentUnits },
+ { findMissingsProfiles: async () => [{ id: 7, label: 'Synthetic profile', missings: JSON.stringify(missings) }] }, current, ids);
+ const b = await service.generateCodebook(42, missings.length ? 7 : 0, current, ids);
+ assert.ok(b, 'Box service must return a file');
+ if (current.exportFormat === 'json') {
+ assert.deepEqual(JSON.parse(a.toString()), JSON.parse(b.toString()), 'Studio preparation vs Box service + adapter');
+ if (reference) assert.deepEqual(JSON.parse(a.toString()), reference.json, 'installed host vs original Studio JSON');
+ else assert.deepEqual(JSON.parse(a.toString())[0].variables.map(({ id, codes }) => ({ id, codes: codes.map(c => c.id) })), expectedSelection(rows, options));
+ } else {
+ const aParts = await docxParts(a);
+ const bParts = await docxParts(b);
+ assert.deepEqual(partHashes(aParts), partHashes(bParts), 'complete DOCX parts including images/relationships/footer/styles');
+ if (reference) assert.deepEqual(partHashes(aParts), reference.docxParts, 'installed host vs original Studio DOCX');
+ const $ = load(aParts['word/document.xml'], { xml: true });
+ assert.equal($('w\\:body').children('w\\:p').toArray().some(p => /^\s+$/.test($(p).find('w\\:t').text())), false);
+ if (save) {
+ wordCases.push({ suffix, columns: options.showScore ? 4 : 3, tables: $('w\\:tbl').length,
+ hasMissingZero: missings.some(m => String(m.code) === '0'),
+ images: $('w\\:drawing').length, formulas: $('m\\:oMath').length,
+ variableHeadings: $('w\\:pStyle').filter((_, e) => $(e).attr('w:val') === 'Heading2').length });
+ }
+ }
+ if (save) {
+ await writeFile(join(output, `studio${suffix}.${current.exportFormat}`), a);
+ await writeFile(join(output, `kodierbox${suffix}.${current.exportFormat}`), b);
+ }
+ comparisons += 1;
+}
+for (const options of optionMatrix()) {
+ for (const missings of missingCases) for (const exportFormat of ['json', 'docx']) await compare({ ...options, exportFormat }, missings);
+ if (comparisons % 600 === 0) console.log(`${comparisons} host export pairs compared`);
+}
+for (const exportFormat of ['json', 'docx']) await compare({ ...defaults, hideItemVarRelation: false, exportFormat }, missingCases[1], true);
+currentUnits = referenceCorpus();
+const references = JSON.parse(await readFile(new URL('./fixtures/studio-codebook/synthetic-reference.json', import.meta.url), 'utf8')).cases;
+for (const showScore of [false, true]) {
+ const options = { ...[...referenceOptions()].at(-1), showScore };
+ const reference = references.find(entry => JSON.stringify(entry.options) === JSON.stringify(options));
+ assert.ok(reference, 'original Studio reference must exist');
+ for (const exportFormat of ['json', 'docx']) await compare({ ...options, exportFormat },
+ [{ code: 99, label: 'Missing', description: 'Keine Antwort' }], true, showScore ? '-rich-scores' : '-rich-no-scores', reference);
+}
+await writeFile(join(output, 'word-expectations.json'), JSON.stringify({ cases: wordCases }, null, 2));
+const roots = [studio, box];
+const artifacts = await Promise.all(roots.map(async root => {
+ const lock = JSON.parse(await readFile(join(root, 'package-lock.json'), 'utf8'));
+ return lock.packages['node_modules/@iqb/ngx-coding-components'].integrity;
+}));
+assert.equal(artifacts[0], artifacts[1], 'both installed artifacts must have the same integrity');
+await writeFile(join(output, 'installation-comparison.json'), JSON.stringify({ hostExportPairs: comparisons, optionCombinations: 768,
+ missingCases: 3, formats: 2, identicalJson: true, identicalAllDocxParts: true, artifactIntegrity: artifacts[0],
+ realHostAdapters: true, inMemoryRepositories: true, httpBrowserRedis: false, windowsWord: false }, null, 2));
+console.log(`PASS: ${comparisons} export pairs through real Studio and Box preparation/adapters.`);
diff --git a/scripts/verify-codebook-word-windows.ps1 b/scripts/verify-codebook-word-windows.ps1
new file mode 100644
index 0000000..3566144
--- /dev/null
+++ b/scripts/verify-codebook-word-windows.ps1
@@ -0,0 +1,95 @@
+param(
+ [Parameter(Mandatory = $true)][string]$Directory
+)
+# Run on Windows with desktop Microsoft Word installed. Opens copies read-only;
+# never saves changes to the DOCX sources. PDF and JSON are acceptance evidence,
+# not a replacement for inspecting the rendered pages.
+$ErrorActionPreference = 'Stop'
+if ($env:OS -ne 'Windows_NT') { throw 'This check requires Microsoft Word on Windows.' }
+$folder = (Resolve-Path $Directory).Path
+$manifest = Get-Content (Join-Path $folder 'word-expectations.json') -Raw | ConvertFrom-Json
+if (@($manifest.cases).Count -ne 3) { throw 'Expected three Word acceptance cases.' }
+$suffixes = @($manifest.cases | ForEach-Object { $_.suffix } | Sort-Object -Unique)
+if (($suffixes -join ',') -ne ',-rich-no-scores,-rich-scores') { throw 'Unexpected Word acceptance cases.' }
+$word = $null
+$results = @()
+try {
+ $word = New-Object -ComObject Word.Application
+ $word.Visible = $false
+ $word.DisplayAlerts = 0
+ $word.AutomationSecurity = 3
+ foreach ($expected in $manifest.cases) {
+ foreach ($hostName in @('studio', 'kodierbox')) {
+ $name = "$hostName$($expected.suffix)"
+ $document = $null
+ try {
+ $path = Join-Path $folder "$name.docx"
+ # ConfirmConversions=false, ReadOnly=true, AddToRecentFiles=false.
+ # Open normally; do not request Word's OpenAndRepair mode.
+ $document = $word.Documents.Open($path, $false, $true, $false)
+ $document.Repaginate()
+ if ($document.Fields.Update() -ne 0) { throw "$name could not update all document fields." }
+ foreach ($section in $document.Sections) {
+ foreach ($footer in $section.Footers) {
+ if ($footer.Range.Fields.Update() -ne 0) { throw "$name could not update all footer fields." }
+ }
+ }
+ $document.Repaginate()
+ $pages = $document.ComputeStatistics(2)
+ $tables = $document.Tables.Count
+ $images = $document.InlineShapes.Count
+ $formulas = $document.OMaths.Count
+ $headings = @($document.Paragraphs | Where-Object { $_.OutlineLevel -eq 2 }).Count
+ if ($pages -lt 2) { throw "$name must exercise multiple pages." }
+ if ($tables -ne $expected.tables) { throw "$name lost tables: $tables / $($expected.tables)" }
+ if ($images -ne $expected.images) { throw "$name lost images: $images / $($expected.images)" }
+ if ($formulas -ne $expected.formulas) { throw "$name lost equations: $formulas / $($expected.formulas)" }
+ if ($headings -ne $expected.variableHeadings) { throw "$name lost variable headings." }
+ foreach ($table in $document.Tables) {
+ if ($table.Columns.Count -ne $expected.columns) { throw "$name has an incorrect table column count." }
+ if ($table.Rows.AllowBreakAcrossPages -ne 0) { throw "$name allows code rows to split across pages." }
+ }
+ $footerText = $document.Sections.Item(1).Footers.Item(1).Range.Text
+ if (-not $footerText.Contains('IQB Codebook')) { throw "$name is missing the footer label." }
+ $footerFields = $document.Sections.Item(1).Footers.Item(1).Range.Fields
+ $pageFields = @($footerFields | Where-Object { $_.Type -eq 33 }) # wdFieldPage
+ $totalFields = @($footerFields | Where-Object { $_.Type -eq 26 }) # wdFieldNumPages
+ if ($pageFields.Count -ne 1 -or $totalFields.Count -ne 1) { throw "$name lost PAGE or NUMPAGES." }
+ if ([int]$totalFields[0].Result.Text.Trim() -ne $pages) { throw "$name has an incorrect total page field." }
+ $pageValue = [int]$pageFields[0].Result.Text.Trim()
+ if ($pageValue -lt 1 -or $pageValue -gt $pages) { throw "$name has an incorrect current page field." }
+ $text = $document.Content.Text
+ if ($expected.hasMissingZero -and -not $text.Contains('0 Missing zero')) { throw "$name is missing Missing 0." }
+ $document.ExportAsFixedFormat((Join-Path $folder "$name-word-windows.pdf"), 17)
+ $results += [pscustomobject]@{
+ case = $expected.suffix; file = "$name.docx"; pages = $pages; tables = $tables; images = $images; formulas = $formulas
+ text = $text; footer = $footerText; wordVersion = $word.Version; wordBuild = $word.Build
+ }
+ } finally {
+ if ($null -ne $document) {
+ $document.Close(0)
+ [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($document)
+ }
+ }
+ }
+ }
+ foreach ($group in @($results | Group-Object -Property case)) {
+ $pair = $group.Group
+ if ($pair.Count -ne 2) { throw 'Missing host document in Word comparison.' }
+ if ($pair[0].text -cne $pair[1].text) { throw "$($group.Name): different content in Word." }
+ if ($pair[0].pages -ne $pair[1].pages) { throw "$($group.Name): different page counts in Word." }
+ if ($pair[0].footer -cne $pair[1].footer) { throw "$($group.Name): different footers in Word." }
+ }
+ $report = [pscustomobject]@{
+ checkedAtUtc = [DateTime]::UtcNow.ToString('o'); platform = 'Windows desktop Word'
+ automatedChecksPassed = $true; visualAcceptanceComplete = $false
+ documents = @($results | Select-Object case,file,pages,tables,images,formulas,wordVersion,wordBuild)
+ }
+ $report | ConvertTo-Json -Depth 5 | Set-Content (Join-Path $folder 'word-windows-result.json') -Encoding UTF8
+ Write-Output 'Word checks passed. Inspect all six PDFs for page breaks, fonts, formulas, images and page fields before visual acceptance.'
+} finally {
+ if ($null -ne $word) {
+ $word.Quit(0)
+ [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($word)
+ }
+}
From aa404bc2a0a1402c13296db6f3acfd6fed192f9e Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Tue, 13 Oct 2026 14:49:47 +0200
Subject: [PATCH 13/36] fix: preserve protected spaces in Studio codebook
exports
---
docs/shared-codebook.md | 6 +
package.json | 2 +-
.../codebook-docx-generator.ts | 3 +-
scripts/capture-studio-codebook-reference.mjs | 12 +
scripts/codebook-whitespace.test.mjs | 34 +
scripts/compare-codebook-installations.mjs | 13 +-
scripts/fixtures/codebook-whitespace.mjs | 33 +
scripts/fixtures/studio-codebook/README.md | 14 +
.../studio-codebook/whitespace-reference.json | 1183 +++++++++++++++++
9 files changed, 1297 insertions(+), 3 deletions(-)
create mode 100644 scripts/codebook-whitespace.test.mjs
create mode 100644 scripts/fixtures/codebook-whitespace.mjs
create mode 100644 scripts/fixtures/studio-codebook/whitespace-reference.json
diff --git a/docs/shared-codebook.md b/docs/shared-codebook.md
index 0df630e..f89971a 100644
--- a/docs/shared-codebook.md
+++ b/docs/shared-codebook.md
@@ -90,11 +90,17 @@ Rollback: vorherige Bibliotheks-/Anwendungsversion; keine Datenmigration.
* 32 zusätzliche Referenzfälle vergleichen Rohschema → JSON und sämtliche relevanten
DOCX-Bestandteile mit dem ursprünglichen Studio. Die Referenz wird ausschließlich
aus dem dokumentierten alten Studio-Commit erzeugt, niemals aus dem neuen Generator.
+* Weitere 20 Studio-Referenzfälle erhalten NBSP, schmale geschützte Leerzeichen und
+ wiederholte Abstände in allgemeinen und Code-Instruktionen, jeweils mit und ohne
+ Score-Spalte. HTML-Zeichenreferenzen, Unicode und fett formatierter Text werden
+ über ESM und CommonJS auf exakte Inhalte und alle DOCX-Bestandteile geprüft.
* `node scripts/compare-codebook-installations.mjs STUDIO_ROOT BOX_ROOT OUTPUT_DIR`
prüft dieselbe Matrix über Studios DownloadWorkspacesClass und Kodierboxs echten
Generation-Service samt Adapter mit Datenquellen im jeweiligen Anwendungsformat.
Nur Datenbank-/Profilzugriffe werden im Speicher bereitgestellt. Der Vergleich
schließt Bilder, Beziehungen, Styles, Fußzeilen und Missing-Datentypen ein.
+ Zusätzlich laufen die 20 Abstandsreferenzen in beiden Formaten gegen das alte
+ Studio; zusammen werden 4.654 Exportpaare verglichen.
Das ist ausdrücklich kein HTTP-, Browser-, Berechtigungs- oder Redis-End-to-End-Test.
* Studio-Frontend prüft direkten Export, Ladezustände, Fehlermeldung und Speichersperre.
* Kodierbox prüft Scope-Filter, wiederholte Starts, langsame Statusabfragen und Schließen.
diff --git a/package.json b/package.json
index 9376d3c..a1bf46c 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,7 @@
"test:schemer:coverage": "ng test schemer --watch=false --browsers=ChromeHeadless --code-coverage",
"test:coverage": "npm run test:cc:coverage && npm run test:schemer:coverage",
"test:scheme": "node --test scripts/validate-coding-scheme.test.js",
- "test:codebook": "node --test scripts/codebook-contract.test.mjs scripts/codebook-matrix.test.mjs",
+ "test:codebook": "node --test scripts/codebook-contract.test.mjs scripts/codebook-matrix.test.mjs scripts/codebook-whitespace.test.mjs",
"test:schemer:responsive": "playwright test --config playwright.schemer.config.cjs"
},
"dependencies": {
diff --git a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
index 964a75b..49fd647 100644
--- a/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
+++ b/projects/ngx-coding-components/codebook-generator/codebook-docx-generator.ts
@@ -405,7 +405,8 @@ export class CodebookDocxGenerator {
};
nodes.forEach(node => {
if (node.type === 'text') {
- if (node.data) children.push(new TextRun({ text: node.data.replace(/\s+/g, ' '), ...runStyle }));
+ // Preserve non-breaking spaces and repeated spacing from Studio instructions.
+ if (node.data) children.push(new TextRun({ text: node.data, ...runStyle }));
return;
}
if (node.type !== 'tag') return;
diff --git a/scripts/capture-studio-codebook-reference.mjs b/scripts/capture-studio-codebook-reference.mjs
index 9618722..5a4c2f8 100644
--- a/scripts/capture-studio-codebook-reference.mjs
+++ b/scripts/capture-studio-codebook-reference.mjs
@@ -5,6 +5,7 @@ import { execFileSync } from 'node:child_process';
import { createRequire, Module } from 'node:module';
import { readFile, writeFile } from 'node:fs/promises';
import { referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
+import { whitespaceReferenceCases, whitespaceReferenceUnits } from './fixtures/codebook-whitespace.mjs';
import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
const studio = process.argv[2];
@@ -56,3 +57,14 @@ const fixture = { source: `iqb-berlin/studio-lite@${ref}`, docx: '8.5.0', respon
'random media filenames in first-reference order; image bytes and relationships preserved'], cases };
await writeFile(new URL('./fixtures/studio-codebook/synthetic-reference.json', import.meta.url), `${JSON.stringify(fixture, null, 2)}\n`);
console.log(`Captured ${cases.length} original Studio JSON/DOCX cases from raw invented schemas.`);
+
+const whitespaceCases = [];
+for (const entry of whitespaceReferenceCases()) {
+ const data = whitespaceReferenceUnits(entry.html).map(unit => adapter.getCodeBookDataForUnit(unit, entry.options, []));
+ const json = data.map(({ key, name, variables, missings }) => ({ key, name, variables, missings }));
+ const parts = await docxParts(await renderer.getDocXCodebook(data, entry.options));
+ whitespaceCases.push({ ...entry, json, docxParts: partHashes(parts) });
+}
+await writeFile(new URL('./fixtures/studio-codebook/whitespace-reference.json', import.meta.url),
+ `${JSON.stringify({ ...fixture, cases: whitespaceCases }, null, 2)}\n`);
+console.log(`Captured ${whitespaceCases.length} original Studio spacing cases for code and general instructions.`);
diff --git a/scripts/codebook-whitespace.test.mjs b/scripts/codebook-whitespace.test.mjs
new file mode 100644
index 0000000..10d0cc5
--- /dev/null
+++ b/scripts/codebook-whitespace.test.mjs
@@ -0,0 +1,34 @@
+import assert from 'node:assert/strict';
+import { test } from 'node:test';
+import { createRequire } from 'node:module';
+import { readFile } from 'node:fs/promises';
+import { load } from 'cheerio';
+import { CodebookGenerator } from '../dist/ngx-coding-components/fesm2022/iqb-ngx-coding-components-codebook-generator.mjs';
+import { whitespaceReferenceCases, whitespaceReferenceUnits } from './fixtures/codebook-whitespace.mjs';
+import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
+
+const require = createRequire(import.meta.url);
+const commonjs = require('../dist/ngx-coding-components/cjs/codebook-generator.cjs');
+const reference = JSON.parse(await readFile(new URL('./fixtures/studio-codebook/whitespace-reference.json', import.meta.url), 'utf8'));
+const cases = [...whitespaceReferenceCases()];
+assert.equal(reference.cases.length, cases.length);
+assert.equal(reference.source, 'iqb-berlin/studio-lite@2504265721a59c7c65425072951ce82ab16f0fb8');
+
+for (const [index, entry] of cases.entries()) {
+ test(`original Studio spacing ${entry.id}, score=${entry.options.showScore}, ESM/CJS`, async () => {
+ const expected = reference.cases[index];
+ assert.deepEqual({ id: expected.id, html: expected.html, text: expected.text, options: expected.options }, entry);
+ for (const generator of [CodebookGenerator, commonjs.CodebookGenerator]) {
+ const units = whitespaceReferenceUnits(entry.html);
+ const json = await generator.generateCodebook(units, { ...entry.options, exportFormat: 'json' }, []);
+ assert.deepEqual(JSON.parse(await json.text()), expected.json);
+ const parts = await docxParts(await generator.generateCodebook(units, entry.options, []));
+ assert.deepEqual(partHashes(parts), expected.docxParts, 'all DOCX parts must match original Studio');
+ const $ = load(parts['word/document.xml'], { xml: true });
+ const paragraphs = $('w\\:body').children('w\\:p').toArray().map(p => $(p).find('w\\:t').text());
+ assert.ok(paragraphs.includes(entry.text), 'general instruction must retain its exact spacing');
+ const description = $('w\\:tr').first().children('w\\:tc').last().find('w\\:t').toArray().map(t => $(t).text()).join('');
+ assert.equal(description, entry.text, 'code instruction must retain its exact spacing');
+ }
+ });
+}
diff --git a/scripts/compare-codebook-installations.mjs b/scripts/compare-codebook-installations.mjs
index 89c0ad2..a43fe96 100644
--- a/scripts/compare-codebook-installations.mjs
+++ b/scripts/compare-codebook-installations.mjs
@@ -6,6 +6,7 @@ import { readFile, writeFile, mkdir } from 'node:fs/promises';
import { resolve, join } from 'node:path';
import { load } from 'cheerio';
import { optionMatrix, selectionCorpus, missingCases, expectedSelection, defaults, referenceCorpus, referenceOptions } from './fixtures/codebook-synthetic.mjs';
+import { whitespaceReferenceCases, whitespaceReferenceUnits } from './fixtures/codebook-whitespace.mjs';
import { docxParts, partHashes } from './codebook-docx-test-utils.mjs';
const [studioPath, boxPath, outputPath] = process.argv.slice(2);
@@ -109,6 +110,15 @@ for (const showScore of [false, true]) {
for (const exportFormat of ['json', 'docx']) await compare({ ...options, exportFormat },
[{ code: 99, label: 'Missing', description: 'Keine Antwort' }], true, showScore ? '-rich-scores' : '-rich-no-scores', reference);
}
+const whitespaceReferences = JSON.parse(await readFile(new URL('./fixtures/studio-codebook/whitespace-reference.json', import.meta.url), 'utf8')).cases;
+let whitespaceCases = 0;
+for (const entry of whitespaceReferenceCases()) {
+ const reference = whitespaceReferences[whitespaceCases++];
+ assert.deepEqual({ id: reference.id, html: reference.html, text: reference.text, options: reference.options }, entry);
+ currentUnits = whitespaceReferenceUnits(entry.html);
+ for (const exportFormat of ['json', 'docx']) await compare({ ...entry.options, exportFormat }, [], false, '', reference);
+}
+assert.equal(whitespaceCases, whitespaceReferences.length);
await writeFile(join(output, 'word-expectations.json'), JSON.stringify({ cases: wordCases }, null, 2));
const roots = [studio, box];
const artifacts = await Promise.all(roots.map(async root => {
@@ -117,6 +127,7 @@ const artifacts = await Promise.all(roots.map(async root => {
}));
assert.equal(artifacts[0], artifacts[1], 'both installed artifacts must have the same integrity');
await writeFile(join(output, 'installation-comparison.json'), JSON.stringify({ hostExportPairs: comparisons, optionCombinations: 768,
- missingCases: 3, formats: 2, identicalJson: true, identicalAllDocxParts: true, artifactIntegrity: artifacts[0],
+ missingCases: 3, formats: 2, originalStudioWhitespaceCases: whitespaceCases,
+ identicalJson: true, identicalAllDocxParts: true, artifactIntegrity: artifacts[0],
realHostAdapters: true, inMemoryRepositories: true, httpBrowserRedis: false, windowsWord: false }, null, 2));
console.log(`PASS: ${comparisons} export pairs through real Studio and Box preparation/adapters.`);
diff --git a/scripts/fixtures/codebook-whitespace.mjs b/scripts/fixtures/codebook-whitespace.mjs
new file mode 100644
index 0000000..99d5ac5
--- /dev/null
+++ b/scripts/fixtures/codebook-whitespace.mjs
@@ -0,0 +1,33 @@
+import { defaults } from './codebook-synthetic.mjs';
+
+// Invented typography examples. Internal spacing is unchanged by old Studio;
+// the separately tested corrections at formatting boundaries still apply.
+const variants = [
+ ['nbsp-named', '10 kg
', '10\u00a0kg'],
+ ['nbsp-decimal', '10 kg
', '10\u00a0kg'],
+ ['nbsp-hex', '10 kg
', '10\u00a0kg'],
+ ['nbsp-literal', '10\u00a0kg
', '10\u00a0kg'],
+ ['narrow-nbsp-decimal', '20 cm
', '20\u202fcm'],
+ ['narrow-nbsp-hex', '20 cm
', '20\u202fcm'],
+ ['narrow-nbsp-literal', '20\u202fcm
', '20\u202fcm'],
+ ['repeated-nbsp', '10 kg
', '10\u00a0\u00a0kg'],
+ ['formatted-nbsp', '10 kg
', '10\u00a0kg'],
+ ['repeated-spaces', 'Abstand bleibt
', 'Abstand bleibt']
+];
+
+export function whitespaceReferenceUnits(html) {
+ return [{ id: 1, key: 'SPACE', name: 'Synthetische Abstände', metadata: { items: [] },
+ scheme: JSON.stringify({ version: '3.4', variableCodings: [{ id: 'V', label: 'Abstände',
+ sourceType: 'BASE', manualInstruction: html,
+ codes: [{ id: 1, type: 'FULL_CREDIT', label: 'Code', score: 1,
+ ruleSets: [], ruleSetOperatorAnd: true, manualInstruction: html }] }] }) }];
+}
+
+export function* whitespaceReferenceCases() {
+ for (const [id, html, text] of variants) {
+ for (const showScore of [false, true]) {
+ yield { id, html, text, options: { ...defaults, hasOnlyManualCoding: false,
+ hasClosedVars: false, hasOnlyVarsWithCodes: false, codeLabelToUpper: false, showScore } };
+ }
+ }
+}
diff --git a/scripts/fixtures/studio-codebook/README.md b/scripts/fixtures/studio-codebook/README.md
index 82c3c00..ce22e4c 100644
--- a/scripts/fixtures/studio-codebook/README.md
+++ b/scripts/fixtures/studio-codebook/README.md
@@ -40,3 +40,17 @@ node scripts/capture-studio-codebook-reference.mjs /path/to/studio-checkout
CI only reads this fixture. Never regenerate it from the shared generator to make
a failing test pass. Approved semantic corrections are checked independently by
the option matrix rather than being disguised as original Studio behaviour.
+
+## Protected spacing reference
+
+`whitespace-reference.json` is captured by the same command from the same old
+Studio commit. Its 20 cases cover NBSP and narrow NBSP as HTML entities, numeric
+character references and literal Unicode, repeated NBSP, bold text and repeated
+ordinary spaces, each with and without a score column. Every input places the
+same text in both a general instruction and a code instruction.
+
+The tests compare original Studio JSON and every normalized DOCX part against
+both ESM and CommonJS exports and additionally assert the exact instruction text.
+The host installation comparison also runs all 20 cases in JSON and DOCX through
+both installed adapters against this independent reference. These cases extend
+the references without changing the original 32-case fixture.
diff --git a/scripts/fixtures/studio-codebook/whitespace-reference.json b/scripts/fixtures/studio-codebook/whitespace-reference.json
new file mode 100644
index 0000000..b612398
--- /dev/null
+++ b/scripts/fixtures/studio-codebook/whitespace-reference.json
@@ -0,0 +1,1183 @@
+{
+ "source": "iqb-berlin/studio-lite@2504265721a59c7c65425072951ce82ab16f0fb8",
+ "docx": "8.5.0",
+ "responses": "5.2.2",
+ "normalization": [
+ "footer date",
+ "IQB-Studio Codebook -> IQB Codebook",
+ "exclude docProps/core.xml timestamps",
+ "random media filenames in first-reference order; image bytes and relationships preserved"
+ ],
+ "cases": [
+ {
+ "id": "nbsp-named",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d5f9f53a5031c8a9ddd1e3a34b7ee7736fc65b91bc282eddaf594b77cbfe1a0c",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-named",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c84f505c7595bf22b934aae1101ee06805d326f0f5c4796d3cf2132c93391312",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-decimal",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d5f9f53a5031c8a9ddd1e3a34b7ee7736fc65b91bc282eddaf594b77cbfe1a0c",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-decimal",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c84f505c7595bf22b934aae1101ee06805d326f0f5c4796d3cf2132c93391312",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-hex",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d5f9f53a5031c8a9ddd1e3a34b7ee7736fc65b91bc282eddaf594b77cbfe1a0c",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-hex",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c84f505c7595bf22b934aae1101ee06805d326f0f5c4796d3cf2132c93391312",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-literal",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d5f9f53a5031c8a9ddd1e3a34b7ee7736fc65b91bc282eddaf594b77cbfe1a0c",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "nbsp-literal",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "c84f505c7595bf22b934aae1101ee06805d326f0f5c4796d3cf2132c93391312",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-decimal",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "2fbb32bd9464923bcb49d0204245fa54a7f3bab9bf6091260c2ed413b48fa745",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-decimal",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d22b462f11aa99bb4342156f65b68b5e73092a2abd7fbc728e840519384a9e76",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-hex",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "2fbb32bd9464923bcb49d0204245fa54a7f3bab9bf6091260c2ed413b48fa745",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-hex",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d22b462f11aa99bb4342156f65b68b5e73092a2abd7fbc728e840519384a9e76",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-literal",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "2fbb32bd9464923bcb49d0204245fa54a7f3bab9bf6091260c2ed413b48fa745",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "narrow-nbsp-literal",
+ "html": "20 cm
",
+ "text": "20 cm",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "20 cm
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "20 cm
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "d22b462f11aa99bb4342156f65b68b5e73092a2abd7fbc728e840519384a9e76",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "repeated-nbsp",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "98e0a6b2f6a6517823bde18586896aa2d7f7e726ca30c3ce400b22de7a34d00d",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "repeated-nbsp",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "3895359b0adbabd51aaa6e49e1b5ed55c532cca9184318cfc32fd9f31e0bc4bd",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "formatted-nbsp",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "38224679ebf17932f60df3476af6d166cb9ead25bed982aef11d90bca1c1250c",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "formatted-nbsp",
+ "html": "10 kg
",
+ "text": "10 kg",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "10 kg
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "10 kg
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "809580cfa42b32d2b96e75f046ecc9753c28a560e7090f8992754f346f1d61e8",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "repeated-spaces",
+ "html": "Abstand bleibt
",
+ "text": "Abstand bleibt",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": false,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "Abstand bleibt
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Abstand bleibt
"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "6648dae92f513a0a1a1e2f6e76cdcdb1bd5265853c9ae43b14f10e5f8ffa4040",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ },
+ {
+ "id": "repeated-spaces",
+ "html": "Abstand bleibt
",
+ "text": "Abstand bleibt",
+ "options": {
+ "exportFormat": "docx",
+ "missingsProfile": "",
+ "hasOnlyManualCoding": false,
+ "hasClosedVars": false,
+ "hasOnlyVarsWithCodes": false,
+ "hasDerivedVars": true,
+ "hasGeneralInstructions": true,
+ "codeLabelToUpper": false,
+ "showScore": true,
+ "hideItemVarRelation": true,
+ "trainingRequirement": "all"
+ },
+ "json": [
+ {
+ "key": "SPACE",
+ "name": "Synthetische Abstände",
+ "variables": [
+ {
+ "id": "V",
+ "label": "Abstände",
+ "sourceType": "BASE",
+ "generalInstruction": "Abstand bleibt
",
+ "codes": [
+ {
+ "id": "1",
+ "label": "RICHTIG",
+ "description": "Abstand bleibt
",
+ "score": "1"
+ }
+ ]
+ }
+ ],
+ "missings": []
+ }
+ ],
+ "docxParts": {
+ "_rels/.rels": "641d22a23aa9eb550103a7a01471eaeda5e84c69413e6e03e7fd290b4811a756",
+ "[Content_Types].xml": "df5eb4247e8594a57c753483112f94648c5b3c162ca0219282d2fff19332bc95",
+ "docProps/app.xml": "579eba9a8d602575736c3880cf5b529aabbadee0e8cc0e4df8573db0ceadbd4b",
+ "docProps/custom.xml": "8ec73cc7ce297e42cc652a1d1884d4ffb18ffa0ba7a6502a36f8da90d1be61a1",
+ "word/_rels/document.xml.rels": "aa8797f9c50610a37b43a791788cb6fe01a8527573c99c09bc946fff7bc31db3",
+ "word/_rels/fontTable.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footer1.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/_rels/footnotes.xml.rels": "bf64631f0bc7bd46712fef822bcfb22e069fa5779e133980ca0c9d81f00efc09",
+ "word/comments.xml": "dd2d62f68c6fd01fc4d7d44081587af54ea3e135b9486cc44fa3c62d087adfec",
+ "word/document.xml": "dfecbaf8f9be0b973a6651243b6b4f543017cff17adc3655762cc6ed9fef0c51",
+ "word/fontTable.xml": "a746dbb577ec5d68983d659707c0750ca89d40b9d3316e31af331d5e1c736bad",
+ "word/footer1.xml": "30efed85f494baa349a2bb3df6b05b5dc032d5e912fc5e3aa5d8b293ceea2127",
+ "word/footnotes.xml": "5a340540bed5ec7a6a1087be13fb0a226151e22e28c43a57d6e5f02acd53ba02",
+ "word/numbering.xml": "d7283fe87395f6e1c8f2d7f9ece168d2fb35865df19c2ad0660b1390805433fe",
+ "word/settings.xml": "9f0ff5915faa60180bf7eb19e0db13633fb19c5cffce8d36c7b9a8387f067ad8",
+ "word/styles.xml": "c51ec0d97223a6b40d98f915b1886d85a909998d4fecdb66ce8bd9be8ef68582"
+ }
+ }
+ ]
+}
From d9182dc1046dee9725eca0c114031711088e8c57 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Tue, 13 Oct 2026 15:13:44 +0200
Subject: [PATCH 14/36] test: retain synthetic documents for Office rendering
acceptance
---
scripts/fixtures/word-acceptance/README.md | 20 ++++++++++++++++++
.../word-acceptance/rich-no-scores.docx | Bin 0 -> 10635 bytes
.../fixtures/word-acceptance/rich-scores.docx | Bin 0 -> 10759 bytes
.../word-acceptance/studio-browser.docx | Bin 0 -> 10827 bytes
4 files changed, 20 insertions(+)
create mode 100644 scripts/fixtures/word-acceptance/README.md
create mode 100644 scripts/fixtures/word-acceptance/rich-no-scores.docx
create mode 100644 scripts/fixtures/word-acceptance/rich-scores.docx
create mode 100644 scripts/fixtures/word-acceptance/studio-browser.docx
diff --git a/scripts/fixtures/word-acceptance/README.md b/scripts/fixtures/word-acceptance/README.md
new file mode 100644
index 0000000..1275888
--- /dev/null
+++ b/scripts/fixtures/word-acceptance/README.md
@@ -0,0 +1,20 @@
+# Synthetic Office acceptance documents
+
+These documents contain invented test data only. They are retained at a public,
+versioned URL so Microsoft Office Web Viewer can render the actual DOCX files
+without uploading user data to an Office account.
+
+- `rich-scores.docx` and `rich-no-scores.docx` are outputs of
+ `scripts/compare-codebook-installations.mjs` using the installed shared package
+ at commit `aa404bc2`. Every relevant DOCX part was compared with the immutable
+ original Studio reference. The corresponding Kodierbox outputs have identical
+ normalized document parts.
+- `studio-browser.docx` is an actual browser download from Studio with its real
+ production backend and a fresh migrated test database. It includes the rich
+ corpus plus NBSP, narrow NBSP and repeated spaces in general/code instructions.
+
+Source fixtures: `../codebook-synthetic.mjs`, `../codebook-whitespace.mjs`.
+Package SHA256: `dcee6cc39436baf91cf2558afedfbc202e044ca14dbf72c7bfdf4b381e5c0ccd`.
+
+These files are inputs to visual acceptance, not proof that Office has rendered
+or passed them. Execution results are documented separately.
diff --git a/scripts/fixtures/word-acceptance/rich-no-scores.docx b/scripts/fixtures/word-acceptance/rich-no-scores.docx
new file mode 100644
index 0000000000000000000000000000000000000000..2767a4f6497171e9293bb4b590b9fcd7db40fd38
GIT binary patch
literal 10635
zcmc(FbyU{P6EEG}DcvC{jeycfcXxNENOwInJ_ty6hjb$y0@4jiigXG0L0^ma{hfR6
zUw8L>`99~cpZU(t%+AituDmoP6av_NgHm{*^Zmy^f1p8cH#8*Ao!XleWlxh@u@;5(_r>onI$
zzp+Lgw23lvpn}9Ahvu>H8f&9o40=WFgtEi?ao3|(xjpyVOAehga576X2GuR-!FDM%
zt77`IDzCJ~>S51Qq;w%(bgg|OF*WNF^@z_T+%Z+q6ov=<>O~yPcz#$gJuR_bS+7PT
z4Ewv}1EM&qZFDLtN~M$bJyGw*U0-BV@$-7H=zk4|j+t>olT?6$RZ2=s#^u7`KwbBLy=Bohh$$2%aASPJ&zsnPKJT=O{EJo
z*-;R}8wD5P+4N1G&?D6BiD>cDMAR)3*^^^^H1+kA^3?EbX+GBLswS{o+^X#s;-|!a
z2$CH;FRlutBitb{F!Y~-{8NPc=~{O4+&F!0;rjZp?5L%Td=5l%AB36Xsm;^q)?5*W
z24CfwhY>CcDY#CIR<*y3@R_TBSt)=;b(!|u)l_M~2_e#j)x+KWw)sZFBY~@JA;^!@
zfPB-zdD2n0UJEC}eDCNzpQX>O^KH>`m7*khGL%DiwB|XZ&9|eoVds@z4nz$~CKj~Z
z01J^A&DMne_By4V>e!s}XR@NeUZcyj-YnvnJ|LSH0piDlnsnEfNueoK96=MZk{o0f
z#VojGnh}^d9m(tJfzLa05BFk2=NUbqr!mPdLt(X-0`^_YIWS3T+0c;@Fw5yfl#~2i
z3%C<_o~JvyBvq3`c!bsIgI}PD7mmhjaMsnr=w0Q;^&2Io1PT`e+GoAqz?k{Vtg^7H
z_xY%qAwce5uH&S;B8w)3(Tfw~;tVnhz{AIwLfc`dy<6eEevSW`kx-)fQ`oU=w+35v
zZ-&`ETVttp;ma1kQjv|zqTEp@)6elaJANl+Zz|s|(s_A3ISq^5vo-CSoq6BtV}7oN
z>{7=9g}ujJoYzSBdS`Z^82cIL{1Jfc(6UEySggg`;>D)tyv9z6ChyFMqT7_BFP}8S
zFgy%ko=N7b1__11$HkdWKjL0y#K!85v26v_YOe&JQaxwY*CRXGdxvSa39g=r#DZT&
zT}OuSC3Lp02sO47jH*kIFeJSJSI0P9gd>@4Nm~ccu(M-Pm|JLZjImx(rSLG~-7s-B
z)nQ#k!nK_0Ge&D$@n$-pL9ziq-D$es`s^(g8v%U1v36pq1N{qP{UWIXkkadlfn-n
zG^sM%EJe?%xR%qL%MsF-nT#2zG(rACvCZDEqE#Kt=Hy|$Siy?Pc-5!_8k09X(XwrTxh>69$a6|*sp`W^<=D=vsz5d&g8~IcEIxXJKFGh8>vvppSBgXO)^I;
zVGlu!FpVWwD8q)I?6|)@R0Q)n$M>ydNk3V`Cp%@R7{!CCh~erR-KP;Pcu%}om%c!`
zO%=lSec&Dg|FZiQ=fLG`dSUO>j4B~1=ZQ`vQ^Iq{l=huM2{jZRW#1&VUE?pwZ$G4^
zJ$9KOC@LSWoRyaszvR@|3-X+;Rxcq@9kktHbXLmW%j3^r)n{cgP7D@32wtzK&WoR8
zFMXq0QXK+lDKX|s&d1GQUKUVmcyw0VCeuI=Z_4w8K4vf{XxY>AR&!}z*-iFCqF1Y<
z@lb&N8;p!@UJOdX*;k)+8HtYVuUh<_I`fc{%*MNj2d3G9I^z)*Lz@XhwYJ>iTOy#&
zW)2~~WeGHXuiXnD68p6?cASnZJ0R8%)D6xegJQ?I`_b4UF-K0K((UdDSUdCy;`ou+
z3%z8ww}^{>gSj22Yi;nMRUcq7F?>Bdhf9JhhyXVd3rQw~)p0QKa)SDX1l
z)%8jSx0?d(qrmEjdNZjRq1$QWO0PMpPSIywiDu8FjpxOUpMg5N*R8lQ=xd?Yz3?C5
zjE_@Z4KVLj?o&kVb4Q&@5$uvh-S1T8b!6S+*S3^*}3_s8YeNdt~<`h!Z$mUvUJ3
zy6M?uG{-b|e{63gW*It1-Bsp<#SbFV1iKXfCV~>hbk|^w>S5jIu~)HC`D}yrzE{(@
zZB&9d=Ld0~cRYh_mt64+kqb6&YViw@hT!x-6T`c>a`bixIIOKcRB0(&?l?cC@Fw%d
z7mTOy2F)t)F=$pu-svQI$a0U-+FViFZZD2c>UVebS+b7u@J>j-q|
z$fjGT6GZ9k6K-ha^eU`5NOl7K&}7qIB%oQi*#I_aI=LP=pPzZb4pvux&`VD*_HwE|
z#=BKP{`7VB5*Uikj;>lorLg}+oF#*zz?dF7{}%G8$>m7p+T4=cx5bHTnH+CJL+3Yy
zsA#uI0yG?EshO>Pmi3uEJwwp
z@Ml~R(pf0CcexGFy}3rz_U-BT`5wjan3%B+i{MB$eXu>ZzL>DX7Rz&qlmTbPKvzmC
zDr7*CV&}J{%bzevN)X?tPK21&Z-l9ClJVIvLp68JpBUs%e*g5CsIcxbR>!@c*w5MkWkJ?8DA_E4P
zxV`FX&5z69TVX;eAB>trUnhi}Bbbpj-SLPv2q5DC(sbu@*Mijrtfo#(7(&
z_*rt={EEy~qp~mmXgNx>AeyCD-OWShAc9&}+1DeddZu~^p3!-URXwN}vjE~Eo{%QK
zxaP1#MzJA@T19)MjlV~mFs*GGS^fOXTc`lWFWBZB^{H<~$$DHL1k6m$EwN`qder>v
zRp|UI%wCkM17DK`VAZwGp)<8riqO>HeaZOoE$%?tIQ{OolVGI|nxO9fFoq}Ae)~2A
z%A3XtOC_490ca+c#Z5191u9FP=7sx}tXuEJ5y)X6xeG`%d9pIM;^Our_Yd16wbuu5
z$g)v#-7n__iP(z`NzZmS|7Oy$yhtevsxLoQf=ZN?5Ga$f|;u6~2ys{hlgl
zz}d@WY=C=qK;T^Wi#3j%`_e7y-vMsYah9kbk#%ni;4m4`gsE|YK4Ad`Wu5zYBoRgyZeynI6fWu+mfdvn-pe4MB0wYl7A
z1}*%fIOUXT$rPeqgI9PPJf;zn?!H`n+$fN_;Dg|+NH03E6<053w;fAP!b!1H)@7pT
zfPuNwhD4$WNudxf@1YH;)$Jwyp5$pi$9f+kMI`_
zE|Dr0t4>A?B{@tSyNY2J|C}Rk4OQ~HSR(S=NMosKcP#zsc1jJzP(#{xYe9k>hD6x}
z14MFbR}lc@_QPec37A)%U#I*X;J3ObmssGD)XfJooZS5o@Sfkt^6njz#<=B}!`l5~4L@z`)
z_8euRuDjMwF3cjo`y`$!PpdKIY`jM}zq`XXK4qvXB6~fl+d87V1U5_~zq>>(tl`O_
zvZ(L&_8Z0Ebj9EdmRK(Ui3@wv3
zM#jrAD!l?ut1=ViY8gU(b@g6|^AjQG_1k`^)Y*=78g3BdDiE5mcHhr$vB&qbR=fg~
zq4gwlkD`0!W0;~(>A~r8)E5ra2n&Y=Eq$tAomx(%`+`$ubJAi^&A$5Wu|a;`-t|Y}
zhEfSI^E!pkIQT6;94kX8u624k08E7++
z`bz2PeTBtiEy(kI1M6**vm`%l{NI^1JjljD`J23>o&Ce4`2(5!Yc5dI8~|Dl_qpD$
zVMcb2CijaW7ocO+$$|ySl>2>NKMygtps?;Lh7X`4Y(nf;=t@Hc4DGb(Y1S%jEoO3U
zU!SZB(3Eb$E*g6s3Tr4)Xrd+fp{vqYmyUbZzR#ycj3ewPw8|6{hch3cUzIWtX!hJ~
z7l$U3euOEtYFQI8o`?rq2|4^M4lcek>NKs-`9y24;bKjzokE0K{n-XUJetqo0EU8>
zAr~*Fn&55TNfKc6GsbMvwJZQC(lREv7iO(Q5^|z
z``OFa%&N>!sVWOd=Ay1p!Z3P=TGKF&jzuih*89{6O7=;@g-9{LX@(I-3a~HV2u7AJ
z2=F5wBq|f;8AtlJ#_-cCC9=MY96!HQvJ2-o3LAn`1N53pBYQTq%|EX~gP&U20vAp*
zkI!e-)Oan9_u5$$n$@R6u{2V1=4BC-Y6P@2-4bp3svpV4RGW5j0s$n@?RipnCJfDO
zej!kbg*gGITSV<~C8?**hCt@0?y5is)B5(aKEB9sg)EavQqNLST#PCIG*jHH(SEHE
z{-PQ*4X3ns^Rd>YYXRGKZn|YgvT%5ViDD9p#^^2@5rVmG(T&1+Awp8U8y}v
z4)gQvjplw%=nx&a4&LU}1rR!-b~p-2tZ8Nr8{e|N7JG3PQyQGe(AfQtY
z-Gb^I@^t-&*Fm{grFq806m4%q{k6{Gk`hMid7$MbxeJ!5(@ZjeQGA4*Bgx4`M0gy`
zjZ*qq&$C9PcNBRu=$BD2Cmrm01jAfe=(zLis7AJ(tgf!F&G>G~7NZ;+%@>Z#=Qw3d
z^_{v{(~y7wbJ2~e#+(qN<;%5Re6>OpzL%J^6-$>1ze3s0fF{2xt4ugj*en4lZ(<9!mlJjucgo{2Y216wQSr`EOqV12WJ5s;-e_
z1Cq8t{~H0B@qHQY$Cw|*G{C47Br95o9@S6_-@NMc9E-<_pI_t%3Q3r{1q_o=E0x;W
z(T1z;%sq=qz1bS%dWKW{Y^G3cZB1#C#YR&e%f?agjNncEZa;BJQUuK$eqk8fg|@Oy
zm}nO%;0t;LF>T63j!fl}b67x}=fWA1qv;Vc1fmB#VST~&(H2K;Q>&nn
zf7+3Ux;Jp^qc$pW;9Cl=GGoU_?2Yg8;udiwS2M7Q+4ZE{k64p`xz`^ndcy6d-UcKF
zFVI5>dcGGff5^nt&d%Ayk@Z)t@kOLC3IrLFXt_wETR3whYuAu1iv9^0vMMP`kh~#(
zE2GYB^Z9M_%VS%?1rBTndmtkoj@}zd|A0OpK5c!SEy6F8Az7>{oD}FTXkO)N&rjpn
zx0UG!Ny{hLPFc0urEXvNeKp?4pTC1$IfDG#?^wth)y#mrJ2xyC7}`%R|KP7S(aLV_
zyK~?8vJz-Bg@s-eWvlYkdI#zocrOoH%*9)y_?o+yuC_Jl`tpt5p~RQXG0R*u$=j#d
zjM)fd2&HU*NFxltHC|lH__&bG^Kmmrf!EX9a|RpIi7%|W*cG|W6s4FR3$gJf`DfR8
z?)Pd-7k#wq@S7%Z;th*$NX4HdDmh)?QNpgy>FRH@n0s{;VHE}7@eL!S$G3Ge-PjK1
zsl>>&mwQ93cZ!!DM_g3%EE49KFrY5DF-vWQ?z#>@IP8XzVC9+vmwTR>$P_r+=gu(v
z7)Kz77w0X23STqUySW6G>%HaEJ-_^!QLQ*etxtVnlHMZX5Qg$V!`00NZ8-1s!UXJU#2%`Vgl+ryFXh16yD
zXv(5zAkzL$7Yu{<^@Kq!&$|`U+F%Eg4pQ~@fq;XTK2ck|A&JxTwC38`H~Axk(t_>*
z@x{30bJx71M0HMO(osGR3q(2&YWD3iHDIfm^CO+jTfo_+71lDrI@jJU&X@_Ax@%mDlb
z{3N0XE9n5Yq{)4mo-0dNu;F~}U{y4%05l*a9xArHDD7I-;X
z5;Yl!CZF;_*!HnWprj6W%Wt!Gu30oi&$Q)nu<+(L66t$2?w-)4W>9p;jh~dOkg33#
zLDo><_b&lEP;{6+}nJf91e>y
z@mZ%`VZAv{S8%^J)Td{U9yy0%#1Sd#t(_fKq{5Ql?nr;bA$EoedIBy$u{Y+I;ZN8v
zitHm-83a2D8FFg>OwMML1=C&Ld|q`CI*GNa`d&UEz5FC00Wn;N;V${(Wt
zXvKWu@UvYAA{GD%+0;M;nGeC)#wmt~g*rsh_|@|+pkhHH246Op;+D+2NTL==k6y{I
z+`JKLb;aURJIX3%CTfyNJIWu;ptWF}S5Usf4wTQ7T8kIUsYia=*ikUbT|Ao(!l3jyto8&M4APgE{UfzW1z_ZX7j~mg0^F1;?>8(>q917j?%mtQ}29VJ~~W#(@ZL?`o8W!$;dsQ?^rR
z(DU!|{jgzht?bjFfsF!FLoIc#e$Ipb-f>dFkX6Ta;z-IlE_somqHG)z1O4(u(Fksm
zOOlSL%~PF$tQ0OHS+Fdvajwkk)g0Q^(Xj{G=;^AIwV4g?%3#l
zVGngi(pEWpwM|M7W`W0L1J}w-goyY|6_T3(;Y%w=&rM?=d=wmt=8B<8u;>+OFs-M6L#h))y*coPQ*|uxaEYfL-H!#-g2OGASODZ=E?SXcIgP)h6up1u
ze9UOMdKiwSfETdq!ShnC!I+O}Y@9t^%7j%#Mv2?TYNXnT##Wd{4mVc
z2x3kZlb*0SF&n1>Pl;n{a*z?8j4{Ys%*@_ZA%MZc5sw8SIP=5`0%oFog
z1!ryA5?$NbWe&mYU9lAt7KwK34gKRIi%$WV^kNV`(0gQ6kR!KpPP$~!R=A9mS4hb9
zXs+qYXp7G#nW+u?s8>vut)hwYc=O#;Nf@3ha3RbC-
zKt|b`mt8K*<(wO}V$;}R*nB>SeTNqTjnTu0)$b)QPws}5Z0pG2yzk#;7ZJ?U-2+l*
zFWevMG_td~KfwN>&dEi`HBvm76)gvDHGsMj*M}OK^!*d}dBn_Dog6nvnd41*id2%x
z>9YRfJCw`u$sgOhK1gyzP;e$OXasmC`avhEqcfj#y8B+YEcgexNMKCTN?O_H;qVIx
z)?llO$Zzj;LQbe&C_`=m%SdZd6#Vw2?5z`2`09_&MQZ0AWXM4DLl0<3e+irYn1l)E|Qqbk-XE;PNl}Kbk3kIHL`e3Em|Jm
zj-JDjc)KQx?+3iIIFlzm_85~!wc5CVwQJz>VrPI1XtTJti1;9jD!)+x&<#r(|ZaiTH0(Vn(|*0&^ZUP&CQfUr3l)9?yt*G{@jRu3}iK9F|hJ8^EI&}K930O1K*Izk3v4@A4AP{2g?0}*~RMu?k^89be{fvLKdk6*S`D1_m{jLAL+w%_+^pg1-2ns9zzUlLj(!7!E^b-XJ
zR`d(=efjc7@!bKtPPvuDlBn%Y}N90C#!?0!JLmelzE%RfJ$K%Y)lw))Ry{&NZZ&m~&62Ih9Z
z7Q%j~Wd(=@M+OH2qk#ki!~c7szLlPXg@L6#owJ2G-95B8M$)Q{9wFdPEbb~fobOx|xcM|W*@sAI_b6_+7M8yKlAjtvCnhUSe^8SE3
zjAmgY919sz5yR65c8qmpx^&WU`d+F=k0N?+hH6~}+%&DbqvPcG;I(ZrYx8`_o3JDa
zXAHus)G5c%vf*$p!U!Z)EuQp`+tniPjW2l{
z-{2
ze2C0v{l!x2%iDwtZB0DGg4h8s0DaLi{4Za~61ZD9hT>MLH5a7ys8rjQ9&bth}3
zBjKWajeWCbt0Kvf`2=tv^~0%&`U&q@&D-+#3np%y@jG()(|h9ql@-w%W=q?&PfSa7
zV5z4au_PT7Urbb2DZvMr)~ve)v=l;#v*4Y0h>KHCX$;A_jf^h3#&d+myY8r{8cWef
z%@^r}NMGS#5?C3)yTu1_VcF;Sz8iB;8Q6b)TCF*vLhGbTWDz*^Ew^f{c=tfXYtqiJ
zlXsPBNUKMz0Y8N{ErEJ_tUbNDZq^$5rkdG_!amGz?j@0bbe1m|O=~}&_5p>fqlL)<
zuFRPsq@K-YwCGZ}4{X#5^Oc#(%t?2{*c{u{IoSyyI3NB!KQxCt0%Mg$+H?Wh8qviq
zF{@qb8dXRouCYNtOTKc2Uk`&>)4~!3k;{vq?JDY_Xf@B#$6cBm9S~3++Fbf;^ztY)
zC;BRf)%EZ=7%Vxhd^=&U5o4tYGtRsF;6qj!y-#1h!OeinOS{=Z?_u3D##POJS}qGP
zQ(Z(ug=@HT6i=Z;!HGG^v=!+-(a3Ypsk1a&Q_Uuf?8d}n>}j*w>BvuWV>xkZdE=l|XT6qfPY0QlaKF^NO!!y^uG`aga>D6MDbCT;i
zp_HS7reyLfl=516##g(B+W|oqQTjQgr%Jp6jKHP4NNo8)xQkaSr=vsM%xUiU0sEMR&;VgaQA5m*K`aAaL+Pq(bP;S&(Sn?)=TZhW<9K(Y9sJ
zxQ4#z{fse01bq{SkW>#6gB%{23R9x%At%|7Wlg~Rv#9)N(3DJOiOL6UM1LE!5ed*n
z!nLP~H0T?#00|JQQTZTN*(E&g#HTn#Ce)-RuE-U>
zk}BNK6lN=81*?30k%@tE#Qa&}9*Nv-_)fBznLCA7o{Nf}js>ibInJs1AdMl7Gjm`e
zH$fbN-*d=|N0zh&rm+zJ@!HnL8@8z$mfItn_@f*O>J!x2Jkdv}uHxhZewI0wLBr6Z
zlQ@32uFj7B_scYzOh;OsXrJd3~`zTFjc+CN$5~T#O((So5rLZD1zHLIo-%om5u#wDz&lIwAJk}x+fsU)f_`h_L&t-&SfoEvYYTAHT82mRBebrIX0NCWew
zp~Urav8i6RL1BBdfa4R6ppODwKDX*a^i|&60PY(qnU~1>J6gRrcNphy6W?Z`m%%qM
z=p#CJ2f=(kGUDDfbQ7Lf6s&g2KC7VFRph%4a&sHr{+1ecxWGwiwzNo#@5B6w#BQR2
zE4w$Wd)F??Ly^>d{_LqT1WHMoMRXKg9yvxgn$k8wheF2Cn#n@np&Pf2^_e`smx<-#7gVXIsRB7HVas)L%mTVM$TNr
zS~eB=tXA7f&urx!eQ46`5{&o<_B=;oY$JxcF*#Ww^z_%ysq}cPI#dsI
zQ4Y>A0?;*l7AY!*+TVC99nH`AIzIN`_cqhPFf7EGmCka5THm-5V_d&#s(tQD`DgE&C=1(EIR-pm^r#7Bs3#&$RBq$Gj9sPH)2V@FH&
zoq=fQGLMMFa6EFWe38kM0k}M|#yOVfGHoEAqGhI)%TLcZy=w$%DpXi>Hdc!W-%CRl
z5y|yI7rtuBL?$jq&}Gb&JFJp!44G!zX^@oPGu;?S9=K)w%8Uz{aXD~sciRE)yasX2
zYRxLsFwvC&*Xv6WC?t5X%CW9lfkHxBvkA(TJ(c`QX^O?=j-eTyINCZCyNO5?sSheohb%5jJuZny
zmOyQDIm*$9!j54_aqLs0kyK>0;~41;f}oP|&|pZ{b1Y4Q
zOuZo;HgmU}Yjk0&GaqN~vap!!h2#CBT!fCX$=W-Jzmx0u@qX#rM_^!F
zh+tsIKa*=adlz#9yZh>-NpVhgjvnO(GjgdlfeoAy5~Pb3iClv^iF8br2$oGnQGj1*
z>6!@Aa$Q#Y`heTW2zx_{vGhD;G0cwng7Uh%pmCON3LU`eje*;tRsX2R(A=hSCKnTZ?+X$WecV(H$s;&npEr
z>>TlUvXChO8QsW_=*?|8tIW_Poblk6m;Kl&DvsDktckJ!hf0_rY|<>
zjG;Z*LZ$*Aq)Yi>)t`r17eDh!FTV8ZWhfA_^2aNSS&%KLoKsQ
zt&*?fjrx`kY1@`PB-u=0pcSYYb%r!r(_U>Q9c+@@{w;<)N3A~bbfkkXx4qRXCb7RF
zH1l(OyLo7P5lpa3ZhMh*aNUaoc|otOt+%oPX|e(7^igg=A_pLmM_Zmp>~(Q`Dy`~x
zT7&T7F^eMiOCs_sf@dBJuNG}z~D|hofsmO?vu6`EerKu$;%!QAb(_=YSuCWzn
zH&7?Un#Vh8?!1@VWR2@>E_(?qLFq_f8$xxO^9<{y`P)MXNZ2<_`j?A#~>RA)s8Z@
zR@M&-_Qk|>8dgxj?h85&_jTs4WqMY&2KR>{8>nH{Mvnoi(tA8oUM0nh3QY$np+n2P
zaKr{?2Cxv3B~5rWSD7koEM%~5U42{OrYJUaThQk`;8T$!RYi&QMpdM)%pWmjAIhbK
zkH+i4Gs_Tyfi>==UJ=vbZgkmc5r!fWCqx%pF|7(8iNk>@hZ+!whK*^fK1uGf|Ax0)
zcfNtwLdp+N7FYucM{w%wLz8k)W#h!|cd<6{!XY3U(=%wR%DC&0Iuq=B4pS&)DIP8_
z)43wSxDt(n)mW%ieI}H=p}JLX{CJkR(QBWA_C}dpkc#WTm|HDr-Wsu@P3d_9)C;b5
z!P#%B-tHXgHeQuTXJv8=v<$Q8pUOE9J?wq^WoM4qX4x-rUN+Nw2@3Bv2Fd})4uL?R
z#F!kH1W|LnDQiTie7e|mpKE;C$BVtlPoCgEmGPsRH!pFywE{_49{~&u?We=BbgvmoY+-kjXUE@dxf8kVQtH47iU<=
z>vsm@#ID7}*k}_z$%fePhI-TjxeBUKv
zL-Cv1Yt01U8K1V;trFdgJ-y(peS>Lv6cH49N(oKx4tRiu$ZTy`_uQPF$rTxx?0-pgWuV
zb7BO}Jfg;sOD!)tg_p3M1mnn7Ys&~ZV@TVd@YvajYkV(9!c$YNr?XAFSZ!^EJQE7i
z=0h$;K_81jmp0Ct6RVln<*(Njnoo|Mk9-CzVno5#;oV_do{1nYHahmg)OcX_cw9Q
zDZa`wc`mytnZ?5^V(8>MKm?F0wz8rOQQV#th)lZP=wlVYDioN`S6W?_8>hEWmBFyE
z$8V7c5
zQ<^C{cy&`zeP1w0GEP}yNw2Hr)pJeSvI9E(Hm1~(3H;uZvXskwt7~DV?9_aesH2onHLn|wL16zh)eNM?RKBPw^2!f^j
z^-dvlVGN)8Es?apfgvgqBl*kda($%HxNSVUZS*|0OSJqQN|MnwHC2kN$*4bJ>0oFnB}7fiH?bs
zUez?nyR*T7fua25@(=#1KG0CzS$%@fF=Vj!K_sOhr-Ro2rFPJiG^`3lU#}OP;mxMcxUvx6hE{9o}^{J=X
zWcJNbs989W-76T68rRavaBVAqy&NsuTKX-4)(K8pG(ka?Kp3vH*32;rHv23ij@ECc%lX;Bb1d#G4y^Y;a$MCY_r@X^)^5|6yWY9eLu%19YG1m7
zMcw&@AL+`Z>aMK6Z9?zyo3*;mQ9It<0HhB>NN7UzZ&Yl|zh6w^mQ)vNkel<)UZzo;
zTKh7xYhZ{4#l+hN)4`nUhVaRXaKfacH_ZA@6AXT6DzKG|+ON&k
z20YJ|i5)7}V-9^V&9C*O1pH+tSI`KN!M--nd%{<}+l8I*(dovoT80qJIO6GP@Gq%y
z?dpC>)=7EO^F
z*j83JoFb7tu^+o`#QB2D=096!n%vw^B&2jPV9u!J7KAIOk-8!N)Qk3&ym%QS)@Cb%
ztZo^w4k7M9wy6iMy~Ej^3WMX3FsT^#(aai>*vxqBg5{vxj)|rDs+-dK%uPrn>*p+0
z_d@5B;kYW8=E-X^73HPZS(k2t2E7qaCp_S`JS<|#03lAf&F1!13x=o}mh3hr?p%8O
zU2jI5V?QbB6x^}l#%I6Ic+C<|4n@}sV8r_d!Mc^00WifrXjg$3`b5P;gj0o_M=TVP
zUmVJKUP&hXvBh0mPi;+;K
zNc&x5nd#Ga+=KPmx4Gx?Ss&w@nyAEPY=qHV4mJ?
zi{D@o*hBii0Ouy%9rjN5!Rrx3^pGz1hZ%zKyQSx4Te=86jpVt4{OO>7cpGJxxu-yo
z=GH*hy#{}0X%2SwRu=afOdI5bYokZ;Unz{8nUlwUnr*_mIxFZvG-`rpY{(CwJv|kI
zL|#5R{M2PupP&_jn8^k}?5gm2)N{0KJbJKc6$p<3L_jpu;YZ|zv$wE|#HR-Y%Id#)
z^(j?0FAj|}lT~&@;zJmIlc-Cl=ph?Ns8UU#u-LY|f{}re=q~a~SL;+^?YHObWjBp6
zM$Lh{`KO3~Z(;R1Z8iqP`h5(!cSXOppkr>q_UXmltG%RjqMJsqzHOtvrP?@*Sk{%UDOExhiR*2#KnI
z!GhwQv>jxBAy%G7f>R>aDJvw_y2dz`WsKkC|7=DHtbbd6$_Ppg+I|`75T>_uy68e{
zJo@JP^Ov%&)%^Vj8yH&o($)q#MX8_&`74LJ_obE~cmKU^oQQ3;{7ekW;W}2|Y76g~
z8gy*w6qdLaCNIEbKz8M|5VxFe>^YgEr|v1fo=tUS=h4~NRChqQ^)hiQkpeaMF4r3q8r#e|87j4&d!oOo#?jlp&&NGlEC8b7
z*h&~dKFc8|EJ%=%S){i|20sGMNpw-v7P)bv&5wc9f&U#0{l{oWy3du&>gEwq`|7A^
zie%LpbstJ#&LU3O`dh?zzXGBaV~&s8pEhTZLOi9SD?hLr%tRl^N<#NCHIsT#TX%z_
zeS)QZHpTKK*LQM|*@a+lq!AF0N~GHXNRQtrWvaAD>_E?Rxu|1Zo(|;~o~}S};>Pnd
zvvpn9_rOKMB5f?|F9(ZQrub0U{T>Hm@7&q;(=zSnL~saY0?4=f?y!osc`gnyfT6u8
zU^O`GLXinjI`aG@A`FZE*TjNu0sCVb)0Kk|jMq56J1*>=(slZrw8JAzX$oKC`&uDQ
zW)I_MKGJgE!NoPJwSLfGOFAFW`rBmxjPV2@lYJ25f9d^u67+u<sN$e#H(Z?(%9Kib^bnTd##d>Fk
zbyP4`VjC;h7J~<=CFFz%V@Z&a^a^iW!_P)3r|F_@i^ac9mg&KVASawG^R)2x!Etqb
zOck8$A6x=pT|6ehMHTL#!qVJOPgNeS19&Q#yv3}o<3YAQd9s|+mwe1!H(1K-fx8Fp
zBs_UuGNetAe0^+I^S7>kTp4<;Re|GJN{!1cxLq%@w2A=B(>?yray00TnQEJQ%z^
zIoPw;%%naJ_RV?yZFZpn?Cl*Ob#}u3p-w$3i~EP?Kh!zCV7p3;1HG(f!=?mOmSY{O
zqDb5O<~#?V@urRW8X;q(K}(igG$BpOM|hiTDJEg6<l`dDZk{SkMShvB-8P6(#dCRxjnoq2s>IjcyJFVnu?n2E
zM`!%ib2btr40$InXezFebOXXNDTeVb%=IC>S}hPTAIrRLeHxj6VqV~qyPju-{#gWa{&S9+TINg|@
zLHO2PONgxHy7CqEn6D7R2^v=d_+GQH;izbQNw{&xZmRFsdfDceRB_waUD+0B$>~*$
z|77-@F19MnY;G#4;3AZUxGNpY21By0bmF3YZy0CAf*{SlLYyK!X=*ubC$~l-7|)+SF`8+KA&Y?AvKIrWvSL
z9CwVB736{qv}^kxhu=#wM4}=W~<=~m?%eg>+a@fO4hqwkQJNHKB^j~
z;+D#&c@>?XO?Byh!WG=Aw%?TOunIW$tZj;AxfG$v=8nstUTmL^=Z`W)5K+}NbH6NN
zcoVjT8}Ue=Ep5)9-`JoEX2-lSn5z%&R=e#P++?-F2EhbwSfqz0e+b46Q85)`+
zbU5~SGPv)@8R{BfMlYjPnz;G26?oe?=;W9pLtLpllvKPR&R~kZfM1}?P}-##nG*(x
z^yKTEaOL6<6jBV{g(QJxWm+0iUC=9y7#PHcXBko_y9gEw??W$y@y4YKNAeM>14k!S
zRPlFo9MjdE%B~ovhaX`#{QvmvKScU}=ePe|cK>>-#==0~MCZXAn5
zvY&zI$3lH}XA4VfeP$a57gj9;HXA*CGX_^WYfGaYgaf-T>%diAZSCcgZ`O|=jXvR}
zX={ZfgO}HA1ec|LOBX?cX$PcmR>q;UC)0GnnBFUSR$KjO&>5}ulT4JW<`9>T9DxkC
zZ*F0FA4jeq0Ms)8e}n<{-|r297z2&_-0pt-^A^#6L+*F{W86bXLDwJg_4mDgB)|{f
zEBXfs`jGe=2udsee#__~rH3!p{H7EKI)C3;_>;y%_`^pBzu`xq-rjfk?*|FL!T(nH
zeNXnsxZnOH=rP2vjQBU~$L1gQXnz91z;6D8{p{F2ggEahJM4Ni2mW^&)n!C{9$1I4fiAYC5S&_!bALj3u5Hy13~;j<$*>1`yBo4{9HiZ
s@4HNYI{&{9(?j?Fdk^pb2L5L-kP(OaesZzFu)!KYRlNN$Hjj>F&-=r=Xy8$Gg#Eah~(x{q&!?
z?!DpK^IP|tHEUMQ$Voy#!U67Eo~g9v_dovmfC7CxTiY2tk^9df@IQxW+ZkHe{~8GU
zomNp_BNP%C06-5301*5=(7;;X(bCY$fzid%g7F?&5<4Q(!GzGQoztJ1OQ`>zVGZtujk8NAZ`V#Uw&$dYBDxG1f6D)rAlS(
z`t546CC3*P9LVwDS#x6620i^DH=(3HOCxD)NT0
z&nmL=RI$Sc))>qktgSu+%Fr$Ps}6Q{m~ts@Sb=QONYR6L$%3zPgrbH$5=CIWlDYh7PpCS%qVH+w$k_+NDume*3E#Q0{JvAK_^hA?cOv^FA`1lQD|
zQhL8%%a*-*4n6BRd*(Tx=Lz(Py`gZ=f44U)zTrZZ!~0mEB($$X@YeN$P`p~}&V>@(
zuFs%7%cg9zu}a;~-)iH)rg7%-dS_d>Oc+gAFcSJ@@2T1hz3I*Q)=Bm^VJq5K`LH;!
zv9}aXXKKyzw#yZ0GsZqtPoSI)4$E!$lShrzv96rfLXz=0goPDk!|ikxX2~
zW0iGf=+#2?u-X%|#NY~7#`D-o6k+^U)R_aT77sZ*?S@An!Rml24eR;iLo}r=IqC4{YMe@z
z-e;bYBRq$iAAVmj+@IT!aB9{jH`MGgfZ|fEQ(%Po*Y^;j_POU2ucECTZ;y$@<%tN4LPWjnH_dFpek
zmAAaZ$+!@~dAwefbbEGIH4a*Z`LgI<(`#lExM4Hn3)Q2R6brX~oM9A%&^nKlk-%f0
zjTMR~pR}ZJ2w7fTtA5>Y`U+!_t!#69Y~ZzDWQo4-JP5A$#8Cy&S1(rGFSSfA
zts$bCS;aJxs-b?bW#g-WPwi+6pqyAfIhU4p6WGuC1+O^f)|;`MB5*_BD~HS_$tIGp
zENxTrhJMM$1n2TZFDV3Y4qw+2Q-G;p*Ci6pe%r=CYCuB}I*#$=F}U@aovz+Q$isq>&xnI%4RjHJXY|)d!KjbY*@SMAXb9
zXyARPNV*hPDADnvOyZ?A36CUnDf`rC-7cUy_1uJn(`!4M>z$38hW1rCcfCd67uxCS
zmleyB6?oeUrAEMY7SmN{B-Q2q%DvBn&ns+(XClH}PzK+ZDJ8dLRgRLJ?)V~{6Ta0?
zIt%jcynG#glpu}MnXqX6Gbfr&R+W=eqCs%_-zu95O5vpNu{SY*<7Y
z1ck_kh3uhWCL%%z3E%gQnI}SB-QofHvr>yFn20fh$Dzd>Er`hm0EiIy=ojJX{slVn
z%aL9(kSZH6c%pqpsUE&6`W#s0Jd}FQDCMZ2F0CenQqG~sBD4#7NswifK`!~Jihv+X
z0>@qR1y8IWw0PU(o`>LZR+}nb8a3HACN>*&%r2ReHK&tx{A`o|Y&fV}j<@^FHf6?;
zI&mm)bXxgRm_s@liy^Y>KGM;9w3Hgy_Azj!X?3MZ)937|4+p5%ic7-#oCQb(tSo{!
zZ$ykKMqS}ELZjtzZgR&@cI!xPP-k((PR0XuV73xOvYQ~KV6IiJRqrIU_%uSUmPbH#
zs8rLcRFeYB2@(rCs8@>@L9?8IC`y4SMityslxjNP4%8=Cu;x@algRx_sz46v@2bp5
z6s+?NdMAe_5tD%=eQ!G^Yl$0{UKB3b6fQ9oxM3IIfjThT5u)J!t%absicLX_8*wY8
zvrr`u-jfVV{*kk($j>QSnfL`NH6+
z_b>MYy*y|XG-Vt=e&91g0s?X&Ya*e$!!KU@}_)!o2`$G4(o*hsl_DItC(uae(
zE@)=G)bL4bJ4%m9A5*7kt`*K24n^|Lz>@$@s{H+<)sOZVVEP35d5^+u)2O?d
z51q28p1+77qsd>B^102oJQ31I2}^#H*+#*&wd!{OY2C4A`KnPw7tR0K%N4&F>U}(@
z&jB;kcvN%rdWNOb2E|Us<{v-Wzbj8!BGXs;WQ1c5>7|rdpI#o3Pr!m6&Dum+cyhye
zY!4eR6}M69)#LkSxxU23>f1;DlM4k}^w*|(UyA36NUovO^GuNxb}sdmKf(+JX6Ny~
zBreF-7uSF0Od};s>S2Sc$X?XUb5PiqxnI^V_wiyV0>LYWU}3X><${kZDgUQ@}bOi`14Q=*}+
z3LG%9PQ|@MW~2{ixhbH+X>YHcRE!mmS*2+}p>Qy0kUwzFn7yON^NA168=F0gP(MWh
zhD?EkI{9zZrQn`avR~3Pn`hu*oFgf+Czamc91JE;^frmXahVcwh2|zrMEi|-%XTo&
z%j)F|Rqroo-!|k7Cvj(o#3&w$CWX`&$v;ZnW8Xbl?`N1*pI39ah&DcW%l{^q+Mp8K
zurk;5kU)_qDztL8ZbCs`1U>!b6PkICrI6~CE~b?ORH?@ekWI1%>A|EBWgEe@5I1Pu
ze&93h)PwJFfU?={NSj+%5-gjSZYm?WWF38hz4~48YN>Z-6#h%?
z1cId%PwN>QIH%S()7tc;S$j~n8;w!?zYykwpU2|nCFY5*swQXKFa#Gld3&jbB=fVm
zr#P>8R2iecV1LB6n>(~}1oPrFP#=q_HFvXRCyaw~KNoT-j_Fdu6vkSDO`4^VW=v{v
zKiBVhOfr!(9Urn!Q`pbzy!Ioa+8pyea*yuEBM
zQE4S%nTyWx&>h&{A$r2(plmHT0Kkg~03iPi(d`{vEe!4NQ=BH{dHH!JlpD;*<+eml
zFc!#M#GzKHJi|JvbWGI<_HAWxD!;O_4KbvZy6n!)A@{K{u8;3bWJl7e9}z_>CRK_j
z5p?Um!P($43Ke(p;^5g2(|I09!?nZpV~gy_nmvD?Sb(!Ax403a3f&%bC_A5Qa+#
z0(b0%(xZB1Bkuh)S3?M+H&B8=Kn7~mCF0R^5q0?b%Wa(vM(RdtCLwGBWejG`^hgRa
z=xA0Yy-Z%99d;FEVto_=Sx%UN#Iy^B&U7n2GZ?ayy4_fONwdAa#+dDLlTW9`%B%i>3iHL5sCq5
z^b{zDICY~+{ExnUpvrF!0W*sw20K`~jNp=^zU%YY2xOpD4a9L9pTBM~cHAWIsmndw
zMGwq!jB!gVoN4Yg6pdIaMPo$$V4qT@SSJv5TmWg;o--odLTIQRs1As?{*UnCwd_byv
zKsr;DdknE-46$c>zGvKZNkR&P+GOfS(WN7HWxi*`lvjjwo{K_Db~R%<=&vKM0`xf$
zU*U1)M|&*VpvOX120Hb;>#dnz)CbC?*yhdzV>TxwNmkCCFT|o_>rxJnm7$fp`<_%}
z#LHIG1$k*{ON;UnAm;X2O_XcygxL?(iE!i#j9a+udh0~yxiTZndfySVgQpn>jZtd
zB$>BhAM6IFdimMIZ58IKQ54^PT&r6zS)>iGm`-
zobTyhZ<(AU{;A{tE)6^a={P6@m9w+9d6@N+V%6h31!eudpzUyAH0Kv%DY|=YI#sy6n8C4gb-c>=xWw3f
zii*cZ3vZDmW|JChC_Kt-B4f%fP3Gkq#Dq_^h@dah%2?R+g7N~Vi*vURJemg@A5dlC
zsR_PM3Dceo8h3#CItKi~_S0FG+m5GiLV445pu8Vp;e7QkAPnEm#_&)CYR@2n
zw=q{`2*5;&i|qR&uEcqrw?%10O9c4(2X1o_>@+2k&pK*O$3x&odO1I$r-QGU
z-rQ$SAlC)GwpOCOP-tUPHifKsJ%!=aGg(z;hL$Tcj)+jjREg^Ww}jEmi@iv}y9Xr!
zi&EEHYmk5q5C8zQpZ3Pe(NfRQ&eY2IUdls>^ASKMlmKnYLq1M#8@Z}ErTHmkMLzKy
z
sx|5_GU?!T4c(tjpK@VI>QEyzpP+74dTo!hD(|
zd1)2mnd`&G&Mp+JLwNOr2VqrWx=kbz-RfHAg(^@UO|5K!J%4Kwo5!rC`c4$*or5qG
zvuB%pNtoK~>q1E7P$)^7CF;~wZ{qW*7LB4fJctx$p@hy1=*PEt1t}6tjB!|t5LBz9_|5FKWl`aqoVMC;7&}I-R39b=dwX?9a0=nuM)<9#
z@KE|N)ypoJnj&Fw;AleQq<|l8I=(y7Dk58+n02g5)~KadnZ^F_R+>NMZN1E3EoNUP
zxG>&Og1l*rjU1%C$vrZr`TuHEGPpJr)wwP`R81g
z=7o*4XaMVI50Juu5KXTR0+-=+c@q@Mq)I!K%qlduK)Z5X7+_hrN%
zV}29^V@4z(m{9_?DF>T)=9PuAO`phbOK0;7h#5Ki4iQr+lvrC+hbVsr3PvVhZw+t=
zVigI_7O1SPDNHh1s>xwk+VP*_rPY4vBP>n`eGJ4c2xd9gP_zsd?jVWzh8jvpoiv^;
zRlej9>>KU2K~!1(B=>Pj^&Z2aEOZLXRJZ9$_&Xn9vvGr8YQwO)o0tyo$0TIcmT);_PW)wEe-!z~ov&*xL1J(RJ@}yKd*StmOpL6p
z9SrT5f7ME*!=597lOhP0y=ZU_VGLvL7_>stIR+pqlOXxa>G3wxYu+}V-8Q~Hvf^K0
z!?d+Yp~u0}P80X>?eXN%(9zt&|27$z$*jaqj_QcwUZx^+63x1!NIO7MHqLUwtllbd
zEA4$?u!lQ;2eWbr@zV$V;L=n^ziJj_+&N(Y0F<9x{=r{$yty^-yKUe2w&G_wg@IZa
zZl(0h;xpt8ST`3+(gbr(>Dbue0Fq=Cq02=qZ
zaouXJ`W2Gu09)cVl2@($zF%K^hHr5P#!t^vn`mTR=MCda^1JxP7GaYCuee7DYV1oT
z!#!;m2sCX~Y+9wN0IM0b-&(2-`JcQZaje{oJ@CP_xYm~u^p~4nMI%B6d}~>F4PTYH
z3p?eb+e=Wj0wJ7n$lv$TzqHD&r}r80Yro0RJM531Pfd>KQf?kZyO4_N9nl~yxC3bc
zI!FuD1+A?dK-GM0MOPa`d(C@AtyUTU)$>uVudyIt2bNMVF~(S>Q1THJGBOu
z1g_4CCjv1h1u{1hP6l_2XUGlhDk~gMkx20zCaxQCKH+lu1MAG*whR)Bs9X$LuxPsn
z;VNjRY)O)NF$gJ2eqh1cZey0$`w&xy5Wg?q)Cbqu<>Enu!3{1-F2Q#=w}B)vHyO8R
zHLUQ()XHMbU1f9bCM1$$JzLGA$mL`-z6z#g`kF%Z)$+^iOLt+z{s^)uPq-aV%QyKQ2a$aVt5s4@$3FXtvv3)nhJ0K7_Zf706ttUIDsJg#gu(^1hm`!CP6f$UCT-Yv+_
zPKk&dg3zJ~YeU`-zSXdDO>IjGXmjv%Ot?L
zd=YvY$$tg;_db5*I!_h@TDc9-bH9SWgEU8b2W!jw6-*s|4%g0v;=fuHH#e_{O_pQI
zu?7@&Bpx@#H!*ra#c+Bm0*SnGc+k;f-jJvrf|$igh1gT!1KxMIVluwJZ5;@Y5rcqe
zr27Jq2hPFLK9YcmDp20wjZjC5e11F{PZo##mQ;NhL6f*^xA*}kcc@BDk*LIHMI~cH
z74co<)t|>rl4zM^Edx~yOxFU
z(c@M4wtMdzko&3-*;q-@CEeZ0ePC=Z&R5r~Z?Le+U+Br^Z3FM%m;%-w@`
zL(jr=JNI>}lx$RWsR7|Zvq
zhqKU!vXjxh%*vhUp-)z?ebk6W2r{=qGGDSU>A!`V`L-Gn-O8y4ZbB6_6j;2(VMOAhhV(K@%`e;
z^;)*hfQMmpj5Ss1Tf#saq$%(qVXm2h?+z}$MZK+FlQa2zNc(S<{nN)2f>ic_kN>sq
z--Dq4LoZJqk+6~h(oB2M3GlB2M|(pD2T*SDT`_Y∈JZF`GjP*_8~tf`KBI_W5pN
zR{-?Zr)oGTIv=l23Fp5!#z>4=okC9UdmXXrZ*6@oV^=MEF^NQ{Y+;{3gCS#PL3{e?
ztaj*eLKh@;8>b@Xd{OULE9(H3!nkd@LD)Ct1daKx-o-rOihQqxwKi>rs^Q=Wgfp%$
zGH1Xb)`+^MeR62}$rqhg1l$v9m$U+6_*T|lixkQno1Wql0kIavDRmiTQE*%qxLx(w
z>DIQbF2oUR07B26jZLC|Zd6wlV>Pa^a$_lYm{v+bgeZ;_8A-qB#x4A8oO+fq>b6Ak
zc>04rd4Ip?qz*6Y;
z^mf`Jg;QSCTIUX`voupJBgMc2p+IZZIIbo8I#XbrZ6KfmMxh)}O3{LwRW{i1j1&38
zrh)B{$-F=7XKpwYdRI?o@7LU1IUD9O&BFupUVp1yXaHAd7ic-VVgFc8eQV461Na}y
zIk{-JMuG#qqHfEn67x!dW1{MD>fW)-JbcERcD8GTjIoc}@|5C;R*IB4|Kurs#Wj*%Kv>q}QTz)F0|>7+O9aeE
za%pX3kp(9fg?^faunm$v9))7SZ1Fo)jbtj!a))%P5`EKmRKjJkt*F^-@waO-xZWvu
zrl)cwN3Nri$mSd8FxGWE?yPhWzIE49VjFpG&x`vkR*B$*O)9CLzhvjcQPupEc;kWH
z)G(<1tlclU;&!07vOUm>$E$<@4|vWPR~2SHKa*T|5lT`LCBxt2MD7y*Win%ss9-+D>CmfTN3f{j-CJo-VUfo~GHWS(0LPw4Q
zV4%wBaUZlIcb}RG@a~QducFtA*z_;08f;|yF;Sx6N1)U5aKWA
zV&$Nyt7q}O43j#xXw^=F0kf|{x%|smDHH8g)d^F
z9NukuSe&WY?DjxbY|}NX8KvNs$*Fr4pP$Y2=yl)^HW%OLtiZoWHJZietYNqtD@s
z&!AoEoK1KUWriT8rf2SPS4<&|G}5!s({*#QveUO@a$wUpV%L4DZ@_3{W&8zU
z-~Q8P%$lB#&dSNL%_Hz}JOTRlHb@G1MXg3KdD=9_2vSV@n8z-!aHt(9v|KS}_e$w%
ztHFm|(AqlWqTIAbcy$#B<@kK_iqZ$T^ZcklB`q*;48VWiJpwTXYWK0-ef#Go(tktl
zXZ)kxL&!nTAO7|CyZ-mxq<@g0FR8zQps@1qn@SHUJ-nUsn^GKT|9xlSPZ|&54^Iw$
z!#O}_3E$zr&k=ru|GnV%CD|YCe){;Jk6#h-Z`hB?KP=Jy1Ofmr{)GK3*gk|mEI$5*
z=YgVy?=1gSiu{fLH`n*opv@YY~i}b)esvA1ptt7X3s40A{~1-?!gG;GZ$qeO={u
zbH)5iL;k2@{7*s;OCP@p5o7&B=noPP*?5>T|3*{d{LcjXA%TY(+iwD&aQ|3p{a^Xp
zLjn);rQZY!@%|w2PxkZ>{V-YijW!2K_4}ItmAX8{|G5nJq3`de3HtXt{&%tK??Ct=
zsfW?&Z&FZ1|B(7KR(%M67!Cb~PZIwF|1&mv2!H5Uf5Ur8e+l9bpYRa>--5sdnXJDA
z@duR$8u{;i^tbVA`bp}i@&9Qxe{80Q=KuE`w*ChGr!$a~g!;a7u>shCkDx5U?cR$3
F{vTu%SS$bl
literal 0
HcmV?d00001
From 88507b007b216148496d4fdb2e1afa76441afa0b Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Tue, 13 Oct 2026 15:15:49 +0200
Subject: [PATCH 15/36] test: add original Studio documents for Office
comparison
---
scripts/fixtures/word-acceptance/README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/scripts/fixtures/word-acceptance/README.md b/scripts/fixtures/word-acceptance/README.md
index 1275888..ec33017 100644
--- a/scripts/fixtures/word-acceptance/README.md
+++ b/scripts/fixtures/word-acceptance/README.md
@@ -18,3 +18,8 @@ Package SHA256: `dcee6cc39436baf91cf2558afedfbc202e044ca14dbf72c7bfdf4b381e5c0cc
These files are inputs to visual acceptance, not proof that Office has rendered
or passed them. Execution results are documented separately.
+
+`original-studio-scores.docx` and `original-studio-no-scores.docx` are generated
+from the immutable pre-harmonisation Studio renderer and adapter at
+`2504265721a59c7c65425072951ce82ab16f0fb8`, using the same synthetic rich corpus
+and dependency versions. They support direct same-engine visual comparison.
From 6bfa2ca487890cb54a69c861f833f1535e64c7f4 Mon Sep 17 00:00:00 2001
From: jurei733 <67505990+jurei733@users.noreply.github.com>
Date: Tue, 13 Oct 2026 15:20:43 +0200
Subject: [PATCH 16/36] test: include immutable Studio Office baselines
---
.../original-studio-no-scores.docx | Bin 0 -> 10639 bytes
.../word-acceptance/original-studio-scores.docx | Bin 0 -> 10763 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 scripts/fixtures/word-acceptance/original-studio-no-scores.docx
create mode 100644 scripts/fixtures/word-acceptance/original-studio-scores.docx
diff --git a/scripts/fixtures/word-acceptance/original-studio-no-scores.docx b/scripts/fixtures/word-acceptance/original-studio-no-scores.docx
new file mode 100644
index 0000000000000000000000000000000000000000..97017194fe1719bb33c997236f2e31ab363c555c
GIT binary patch
literal 10639
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
literal 0
HcmV?d00001
diff --git a/scripts/fixtures/word-acceptance/original-studio-scores.docx b/scripts/fixtures/word-acceptance/original-studio-scores.docx
new file mode 100644
index 0000000000000000000000000000000000000000..7f6a5dcb413b9748576ef2fc54f6dbafc813fc1e
GIT binary patch
literal 10763
zcmc(FWn5L;^Ecfo-5{Nk(g+CB-QC@dgh)tt$3alKJETFnySq~f3CZW6S5fZozIa~!
z_xfxO9M*UCteII;d&x?GL%@ODU!LYtT0egI=LaP4)5XT#@R{s?PJ#b5MaSOA(&6_+
zm>;yPSuzKaKtVw0AV5Iy|DI@QW8h?EWbMe{YGuiA4=surlK#wy(5aKvo0?5vKwN2w
z#qxeCk&d?7sy5Q;vjm
z2B-``Nq^k~0YUvG$3G=_kUD2QSBvSd^Nz6;`aqbrM;gCt%rWxi7=#py@Tj!+C!FCY
zR(2w>5W(d!e0?A%m{;aYryXY>rK=4nqYh@MH`GAQQ@cAlPEQWy?2Fi&=Y!vdCP})Y
z6IKGIoI^^7!*~e8k<@kg(wcUwL_eBtj}XJn2<(NE7wIfEC4Fn`mV$)G00q|@O>6%m
z(5FK4MMHV@QgV2`YPmQx+B8?YKC1NNN@RV1ve0P7Y_)-jds(PvJelk)6Ji&u8OCP&
z$0{mg5>5P9^0JTt_J*)DHlr69su6js;DokL(A5XlW)xheS3o#Qy(=n`peUoIby?U{yF8x_
zk@?J@bkTD;BMMgr(TEUWZT8XeqQ(Y{`AoqLNZO_@OdwQ##S0Wk2|Ce!WyVw0$zI`1
zxTsj|*sR^EOmb{F5j_C-bY`Y`%70${zU^$86sZV@_%VU*yiJv`5tFUDS!J0;ay@RE`zxAF6pxIv98I
zuTl@`^oZBvr_iS+(Cm)2r&ZO?+Ctq_vAR$?hWgFDAbJ;-=?g;F+ApAcNa^NmWp;=o
zdu|M2V7DD5wiM*s;Hl{7<98gE8nyRfo`_*|J*&_CnCQo6Z
zzW4+cuKvzhB8343JLWXQUbOpEE7v2t*4koSJ&Q1+8v~EIr_E-sBQMpR?bM~^t+VQv
z!;CM`mbuEdx2xBOm&kJz%U=T_+qHL#aUnXgO#^+GX=8J~=v(zG&1Q&ACf>%?gTscW
zzidrjrH(Vp|0rLa%2QF?O0$z@`b5HBliM>28>8`0PEXm>Xk
zh`BYYZt%svkYw(uMKybSwYFkj`l`y}n0k=8oaU80YC>hsUm$z2vJdZM+O)pKHGuQytQ0O)Y8AsUB)ki^%Zu$unj1;rzoR=VhaPL
zMgtP0T0{r$hri60=wMh3LeHn9IucGiGMtaAEE)RsLLEj6Aaba{F>?4FUarh8nuO-L
z0=tl~FB!`X#oqY~Xi4U`pdIf-KXg88Q)J9b>uM(Rp*=e#96f0>6nvNU8&hK>?3UjV00Th@0%^w8rSX^T@m?;E+mYi_8Nq#Bdk55J})d
z!gO~#O5SihXFiQ*aVjy~C1hp;jw-PVDBw5Z{*pjeBlCc)a!PvMNlbBzPH0F^T#+k%
zB~`i~DXcccN;Y|hq7wt-hDu1T8>X=ehSxKTxJdy86&H0jR}2i*O@jQTpLMo%;4qZf
zB(~qJo2&D?`)OK@<|C~x^iKsz1@YL#hy{TU4;%(Q92NL*T;JiG0IaDl6PS@X=#l0-
zyX(D;jrz4Azw6F*sf(NDBSu6K30hyeFyOGdfN0*YlI$LRCE-tZzsM}a=zhm|LOGIc
zP2bnbB~YW6B5_x5;dB^eWWg1b<1SkfUJFYnc%5z#af*A~Ikb@ZlKZX-ws3_uz$mnm
z$!Ok@qiV*z_`Zg2xrO>6
zRcV{3vU~@YP&U8j{2rb`)f`2n#Gvk^MYM@aJN!#>KXD3i`zf#Gkhd>5lzD2-UpAk9
zCy9e4O2JN*S_5rcDwPs+h!&qBDx0M@eIw@9igp?#&K1pi=8({)h~5UhmY%QXbTD54
z70}j9^YY*@rIGoXn6tJ|LEu{$8p8Gx_OMN9|MLv2kT>6=XmljlTq1RRJyx}w-m%Vn
zD7H=f*6~lg1xuA3UUx#TKq*G7aDQe?C8ErVZ=aAVWKE-*TUc%7LSMUG14kOe^@;)n
z>puE!=Se_h;Sg3=D)czvCd|!CsfekHZLuZ3H@YO9bLX$nNYys_WO$aeA!@%DVPv^9
zl(uwvC^BDg7=16_672nJ)Pd0JM@e9iSIMfO5y97
z3=v(s1EJTBO?dZ>-9;uAg{xe$&dcfcl?AQ?-Q9j_#DwBH5pFdRvM=4IVii(8GB}eamqOwcSp_D$fZnn^OZNO*Kp?;{3
za(IF6kEZ3bNLfDA{?=RNcz({;8P-$K+d>cBxBz=rCes~qWAjR!dE?SeB|@y@wZ*0n
zn@%8~csgZN>$<^u*{XEWpci+npp9NANsXH1mtYEMC$HC;6{=(XOmvQmEUNGJ2y($L
zVsLWSLNX5vCFN`5+m$qzb>j825eEpj5IMdc%)FIF1VeN;b-39eB?<6Fg~!$%J6>|^
z40v)O3q~Z4?U_^Qi%gzOfx{PTnr(d{+XnP0Iu<%Pf{e`5`z8?PuL=s!$7&Gad+Er+
zBX~aP!&gq3$;QP9zaBH^4Xt1pL#Eqx86*{alV%!C9tvIY=&~>NUgY1l45naXKcYB@nkc9zJ)QEc;!B7
z3nnOOO&GjPh8or~O4}MDtm_ara=aBCw~pJmFI${?n{bL-9#h
zblu4oGBx->eX38Z@Az2t@iTCH@nu#oL!uE|4wpbiq29I~P59WsZnlpvGQuLLn)anR
zxO&6Mq81fWmt?V!S_CH;kM|b4W6^cFks}m>JfR~)F~Y7LR^o>1t`I6bxz}Lj-!X
zcp1(qOLf=du^vEAqZWYeHad6RY~r**+Etr?E+eOuO$R5O8*PJnjgInro#dzFn$kXcUqw;1wljk?6Mkq&{J_ExW$#QyS-
zjJ5c7%aHa$=peP6_ClGU+UJLg!d^Q&@8$hd<^9tbBi*BkoT7<5+j2c)uZ!XV^y=fO
z^&*QWY|6YZh{&%9XgwE%7VWD?bkW{KT=^TYBdX$Zqv?4;3H=DSdW!y?SwiE
z)V^ZR`M89nO-$gwv(8htaqpZD+
z?c;jAeQN0$JFs5&1#XA?I`j850~>pz`^}IQt!2^1i0*$U-s73l$()oGR*G0cfsk#v
z&p_6NJLwT=sC;)bny-}PQZKnkiTst*ifyUj`Hc6;=r(Q?od~R{wcof@*kpn5W#AK{
zM9e}qTysZ|h|S8?>h;dn6c$X)$mN*rk*4+PS92(qL1kMSvi&Ae!%XwoIjVsoQ@VW@
z>=qz0#~#5L5EQDqwOHBCtRG|K59Q3fG`V3Qx`utg2zV%PTCtwLRk;1)OY-Sy90D}F
z%ZLNVsQWXK(!IJuS}4{t$_t0@mwchg;tMvx;2-0b$z57}>>P^}2G9fHbhOUkEt8P@
zYInjQjvQ-OZ;g4s=u%#l2=(xXcI~o$8$o;;WYo82y0xC+`bLc&C3QWtsaZovWvgS->X(X%}@!GO)07f3gdzm)N_nzt-|eQN`hupt5n$dg|V$J)tC
z-^kv~+T>o$0||5Cvy3SII^@T^9NxCFl`~3n6UvIbVp+(`WKeV-ftHkXL&G79RW+W~
zd}3WZJrY*5X#
zmiu5dPV81hjP+!~C)pV5!%&Y#08f4;isCE{>13=g6!}2##+8|4mbYD%Z|pOvkLdVS
z8Yq5K2dx=dS(I%^K-&B<&`0AeDn53oh7(d&
zj3al6BH1Vn5XOzyHkgorkB`mDP$#bYLFmJv#I8J78qE?C+PIx9Ctr{=BQ-}(HTmF<
zgT>|5l?nGP$wHWYo$35Z$t;_sv97~srep*_w5jlVd0l3J!P58DP8^j&g`?KJz&pFV
z3t|NBT%v~HOC2u;r57-r1mnmy>&pn)V@SK7@i;k&t9>s=!T$3BDQF=8Ma@E$NNw4%t14bHvL)t=~la0Qp6
zMDb`c-r=cMTL+nmxwCh+@6%3f?}PsmdDDLZNbOKc?#
zgMdXx-1V3#;kSGJxuZv2u4}A-VsHoEc)hOk1(3i<5QIwv
z>s*2vLYY4ITO;Xy13^?KMtUc!&(lPwb=z=$+wkVZns1&J!_F2!hmEQ8Ud+e0%adDE
zS8EgR>v+HiCM7mfR3{Yo5*4A-D3%>Xnm*!^QRY)7jTZ4+Deoi01Dv@#=;h-_iO%Of
z#`Yu9T#?Wy$39AQMaJZk
z$7gX~Vx!)IqMmv^8N6wON0%lZH@P9X5cY5be&nAMg>}h{dkZP|^^QCbleA>I>K!+z
z;j%ijxM?Zr&KI)*+)2Ke*12(Hjrw~Y
zrubt@s%ny$t$Zdg`h;0IGb@m;u`(f#(fb0@*<(V_wyoN56q9KiQ7O8TX&folM|!3v
zYCe75oUv&!3Jtv#95;csKH^AOUA3QE^fjGO9{gkt@po4>WNXp=wo>T#`Y$Ym>P!Jd
zloUs>1bHZptLX60&i4VPANt>{u`eW>u(N-6B-H(et2>pzwiRz{an9<5b1-P>7Vll5
zY88_v;*gM(wABVyz(-Zhx1hjw9Y4ZAFU+LJ+l^6}f3QfgK=W5q-fl@yw*V)%fA3{$m-*$nwTs^B3#Y
zEn$5@Fu`<@>3ArBNNM-`UC06tUc)V^^ur$iX|NEA8lR(prf>%|1vH>3XuPzsb_90g
zbrfIQ8aZg)TWgh4AFv;favevdGG1%T4^y?#vIc|S3tf9g!Pc(bx5$5WUN{zjKF