403 lines
68 KiB
JavaScript
403 lines
68 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const src_1 = require("../src");
|
|
const yaml = require("js-yaml");
|
|
describe('FrontmatterGenerator', () => {
|
|
const baseOptions = {
|
|
generator: 'fss-parse-pdf',
|
|
version: '1.0.0',
|
|
title: 'Test Document'
|
|
};
|
|
describe('generate()', () => {
|
|
it('should return empty string for none mode', () => {
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, {}, undefined, 'none');
|
|
expect(result).toBe('');
|
|
});
|
|
it('should generate valid YAML frontmatter', () => {
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions);
|
|
expect(result).toMatch(/^---\n/);
|
|
expect(result).toMatch(/\n---$/);
|
|
// Extract and parse YAML
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed).toBeDefined();
|
|
});
|
|
it('should include core required fields', () => {
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.profile).toBe(src_1.DEFAULTS.profile);
|
|
expect(parsed.generator).toBe('fss-parse-pdf');
|
|
expect(parsed.version).toBe('1.0.0');
|
|
expect(parsed.title).toBe('Test Document');
|
|
expect(parsed.extraction_confidence).toBe(src_1.DEFAULTS.extractionConfidence);
|
|
expect(parsed.content_quality).toBe(src_1.DEFAULTS.contentQuality);
|
|
expect(parsed.created).toBeDefined();
|
|
});
|
|
it('should include source_file when provided', () => {
|
|
const options = {
|
|
...baseOptions,
|
|
sourcePath: '/path/to/file.pdf'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(options);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.source_file).toBe('/path/to/file.pdf');
|
|
});
|
|
it('should use custom profile when provided', () => {
|
|
const options = {
|
|
...baseOptions,
|
|
profile: 'technical'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(options);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.profile).toBe('technical');
|
|
});
|
|
it('should add LLM enrichment placeholders when no enrichment provided', () => {
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.summary).toBe('');
|
|
expect(parsed.tags).toEqual([]);
|
|
expect(parsed.category).toBe('');
|
|
});
|
|
it('should include LLM enrichment fields when provided', () => {
|
|
const enrichment = {
|
|
summary: 'Test summary',
|
|
tags: ['tag1', 'tag2'],
|
|
category: 'technical',
|
|
audience: 'expert',
|
|
doc_purpose: 'reference',
|
|
complexity: 4,
|
|
actionable: true,
|
|
key_technologies: ['TypeScript', 'Node.js']
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, {}, enrichment);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.summary).toBe('Test summary');
|
|
expect(parsed.tags).toEqual(['tag1', 'tag2']);
|
|
expect(parsed.category).toBe('technical');
|
|
expect(parsed.audience).toBe('expert');
|
|
expect(parsed.doc_purpose).toBe('reference');
|
|
expect(parsed.complexity).toBe(4);
|
|
expect(parsed.actionable).toBe(true);
|
|
expect(parsed.key_technologies).toEqual(['TypeScript', 'Node.js']);
|
|
});
|
|
});
|
|
describe('balanced mode', () => {
|
|
it('should include only balanced fields from deterministic', () => {
|
|
const deterministic = {
|
|
word_count: 1000,
|
|
page_count: 5,
|
|
character_count: 5000,
|
|
has_tables: true,
|
|
_internal_field: 'should be excluded',
|
|
rare_field: 'should be excluded in balanced'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(1000);
|
|
expect(parsed.page_count).toBe(5);
|
|
expect(parsed.character_count).toBe(5000);
|
|
expect(parsed.has_tables).toBe(true);
|
|
expect(parsed._internal_field).toBeUndefined();
|
|
expect(parsed.rare_field).toBeUndefined();
|
|
});
|
|
it('should exclude null and undefined balanced fields', () => {
|
|
const deterministic = {
|
|
word_count: 1000,
|
|
page_count: null,
|
|
character_count: undefined
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(1000);
|
|
expect(parsed.page_count).toBeUndefined();
|
|
expect(parsed.character_count).toBeUndefined();
|
|
});
|
|
});
|
|
describe('complete mode', () => {
|
|
it('should include all deterministic fields', () => {
|
|
const deterministic = {
|
|
word_count: 1000,
|
|
page_count: 5,
|
|
custom_field: 'included',
|
|
nested: { deep: 'value' }
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'complete');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(1000);
|
|
expect(parsed.page_count).toBe(5);
|
|
expect(parsed.custom_field).toBe('included');
|
|
expect(parsed.nested).toEqual({ deep: 'value' });
|
|
});
|
|
it('should exclude fields starting with underscore', () => {
|
|
const deterministic = {
|
|
word_count: 1000,
|
|
_private: 'excluded'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'complete');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(1000);
|
|
expect(parsed._private).toBeUndefined();
|
|
});
|
|
it('should convert Date objects to ISO strings', () => {
|
|
const testDate = new Date('2024-01-15T10:30:00Z');
|
|
const deterministic = {
|
|
modified: testDate
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'complete');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.modified).toBe('2024-01-15T10:30:00.000Z');
|
|
});
|
|
});
|
|
describe('generateMarkdown()', () => {
|
|
it('should prepend frontmatter to content', () => {
|
|
const content = '# My Document\n\nContent here';
|
|
const result = src_1.FrontmatterGenerator.generateMarkdown(baseOptions, { word_count: 100 }, content);
|
|
expect(result).toMatch(/^---\n/);
|
|
expect(result).toContain('# My Document');
|
|
expect(result).toContain('Content here');
|
|
});
|
|
it('should return only content for none mode', () => {
|
|
const content = '# My Document\n\nContent here';
|
|
const result = src_1.FrontmatterGenerator.generateMarkdown(baseOptions, { word_count: 100 }, content, undefined, 'none');
|
|
expect(result).toBe(content);
|
|
});
|
|
it('should separate frontmatter and content with double newline', () => {
|
|
const content = '# My Document';
|
|
const result = src_1.FrontmatterGenerator.generateMarkdown(baseOptions, {}, content);
|
|
expect(result).toMatch(/---\n\n#/);
|
|
});
|
|
});
|
|
describe('parser-specific scenarios', () => {
|
|
it('should handle PDF metadata', () => {
|
|
const pdfDeterministic = {
|
|
word_count: 5000,
|
|
page_count: 20,
|
|
character_count: 25000,
|
|
has_tables: true,
|
|
has_images: true,
|
|
table_count: 5,
|
|
image_count: 10,
|
|
has_toc: true,
|
|
has_forms: false,
|
|
encrypted: false,
|
|
author: 'John Doe'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-pdf', profile: 'technical' }, pdfDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(5000);
|
|
expect(parsed.page_count).toBe(20);
|
|
expect(parsed.has_tables).toBe(true);
|
|
expect(parsed.table_count).toBe(5);
|
|
expect(parsed.author).toBe('John Doe');
|
|
});
|
|
it('should handle email metadata', () => {
|
|
const emailDeterministic = {
|
|
from: 'sender@example.com',
|
|
to: 'recipient@example.com',
|
|
date: '2024-01-15T10:30:00Z',
|
|
message_id: '<abc123@example.com>',
|
|
has_attachments: true,
|
|
attachment_count: 3,
|
|
word_count: 500,
|
|
importance: 'high'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-email' }, emailDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.from).toBe('sender@example.com');
|
|
expect(parsed.to).toBe('recipient@example.com');
|
|
expect(parsed.has_attachments).toBe(true);
|
|
expect(parsed.attachment_count).toBe(3);
|
|
expect(parsed.importance).toBe('high');
|
|
});
|
|
it('should handle audio metadata', () => {
|
|
const audioDeterministic = {
|
|
duration: 3600,
|
|
duration_seconds: 3600,
|
|
bitrate: 320,
|
|
sample_rate: 44100,
|
|
codec: 'mp3',
|
|
has_transcript: true,
|
|
speaker_count: 3,
|
|
language: 'en'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-audio', profile: 'meeting' }, audioDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.duration).toBe(3600);
|
|
expect(parsed.bitrate).toBe(320);
|
|
expect(parsed.has_transcript).toBe(true);
|
|
expect(parsed.speaker_count).toBe(3);
|
|
});
|
|
it('should handle image metadata', () => {
|
|
const imageDeterministic = {
|
|
width: 1920,
|
|
height: 1080,
|
|
format: 'png',
|
|
file_size: 2048000,
|
|
channels: 4,
|
|
has_alpha: true,
|
|
ocr_confidence: 0.95
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-image' }, imageDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.width).toBe(1920);
|
|
expect(parsed.height).toBe(1080);
|
|
expect(parsed.format).toBe('png');
|
|
expect(parsed.ocr_confidence).toBe(0.95);
|
|
});
|
|
it('should handle video metadata', () => {
|
|
const videoDeterministic = {
|
|
duration: 7200,
|
|
width: 1920,
|
|
height: 1080,
|
|
fps: 30,
|
|
aspect_ratio: '16:9',
|
|
bitrate: 8000,
|
|
video_codec: 'h264',
|
|
audio_codec: 'aac'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-video', profile: 'meeting' }, videoDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.duration).toBe(7200);
|
|
expect(parsed.fps).toBe(30);
|
|
expect(parsed.aspect_ratio).toBe('16:9');
|
|
});
|
|
it('should handle presentation metadata', () => {
|
|
const presentationDeterministic = {
|
|
slide_count: 25,
|
|
total_slides: 25,
|
|
word_count: 3000,
|
|
has_images: true,
|
|
image_count: 15,
|
|
chart_count: 5,
|
|
has_speaker_notes: true,
|
|
author: 'Jane Smith'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-presentation', profile: 'technical' }, presentationDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.slide_count).toBe(25);
|
|
expect(parsed.chart_count).toBe(5);
|
|
expect(parsed.has_speaker_notes).toBe(true);
|
|
});
|
|
it('should handle excel metadata', () => {
|
|
const excelDeterministic = {
|
|
sheet_count: 3,
|
|
row_count: 1000,
|
|
column_count: 20,
|
|
author: 'Data Analyst'
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-excel' }, excelDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.sheet_count).toBe(3);
|
|
expect(parsed.row_count).toBe(1000);
|
|
expect(parsed.column_count).toBe(20);
|
|
});
|
|
it('should handle diagram metadata', () => {
|
|
const diagramDeterministic = {
|
|
diagram_count: 5,
|
|
diagram_type: 'flowchart',
|
|
valid_diagrams: 4,
|
|
invalid_diagrams: 1,
|
|
node_count: 20,
|
|
edge_count: 25
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-diagram', profile: 'schema' }, diagramDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.diagram_count).toBe(5);
|
|
expect(parsed.valid_diagrams).toBe(4);
|
|
expect(parsed.node_count).toBe(20);
|
|
});
|
|
it('should handle data parser metadata', () => {
|
|
const dataDeterministic = {
|
|
record_count: 10000,
|
|
format_detected: 'json',
|
|
file_size: 5000000,
|
|
column_count: 15
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate({ ...baseOptions, generator: 'fss-parse-data' }, dataDeterministic, undefined, 'balanced');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.record_count).toBe(10000);
|
|
expect(parsed.format_detected).toBe('json');
|
|
});
|
|
});
|
|
describe('edge cases', () => {
|
|
it('should handle empty deterministic object', () => {
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, {});
|
|
expect(result).toMatch(/^---\n/);
|
|
expect(result).toMatch(/\n---$/);
|
|
});
|
|
it('should handle missing title with default', () => {
|
|
const options = {
|
|
generator: 'test',
|
|
version: '1.0.0',
|
|
title: ''
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(options);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.title).toBe('Untitled');
|
|
});
|
|
it('should handle arrays in deterministic fields', () => {
|
|
const deterministic = {
|
|
recipients: ['a@test.com', 'b@test.com']
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic, undefined, 'complete');
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.recipients).toEqual(['a@test.com', 'b@test.com']);
|
|
});
|
|
it('should handle custom extraction confidence and quality', () => {
|
|
const options = {
|
|
...baseOptions,
|
|
extractionConfidence: 0.85,
|
|
contentQuality: 1.2
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(options);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.extraction_confidence).toBe(0.85);
|
|
expect(parsed.content_quality).toBe(1.2);
|
|
});
|
|
it('should handle zero values correctly', () => {
|
|
const deterministic = {
|
|
word_count: 0,
|
|
page_count: 0
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.word_count).toBe(0);
|
|
expect(parsed.page_count).toBe(0);
|
|
});
|
|
it('should handle boolean false values', () => {
|
|
const deterministic = {
|
|
has_tables: false,
|
|
encrypted: false
|
|
};
|
|
const result = src_1.FrontmatterGenerator.generate(baseOptions, deterministic);
|
|
const yamlContent = result.replace(/^---\n/, '').replace(/\n---$/, '');
|
|
const parsed = yaml.load(yamlContent);
|
|
expect(parsed.has_tables).toBe(false);
|
|
expect(parsed.encrypted).toBe(false);
|
|
});
|
|
});
|
|
});
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9yLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnZW5lcmF0b3IudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGdDQU9nQjtBQUNoQixnQ0FBZ0M7QUFFaEMsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxNQUFNLFdBQVcsR0FBdUI7UUFDdEMsU0FBUyxFQUFFLGVBQWU7UUFDMUIsT0FBTyxFQUFFLE9BQU87UUFDaEIsS0FBSyxFQUFFLGVBQWU7S0FDdkIsQ0FBQztJQUVGLFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUcsMEJBQW9CLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2hELE1BQU0sTUFBTSxHQUFHLDBCQUFvQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFakMseUJBQXlCO1lBQ3pCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQXdCLENBQUM7WUFDN0QsTUFBTSxD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SUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZyb250bWF0dGVyR2VuZXJhdG9yLFxuICBGcm9udG1hdHRlck9wdGlvbnMsXG4gIERldGVybWluaXN0aWNGaWVsZHMsXG4gIExMTUVucmljaG1lbnQsXG4gIE91dHB1dE1vZGUsXG4gIERFRkFVTFRTXG59IGZyb20gJy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5kZXNjcmliZSgnRnJvbnRtYXR0ZXJHZW5lcmF0b3InLCAoKSA9PiB7XG4gIGNvbnN0IGJhc2VPcHRpb25zOiBGcm9udG1hdHRlck9wdGlvbnMgPSB7XG4gICAgZ2VuZXJhdG9yOiAnZnNzLXBhcnNlLXBkZicsXG4gICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICB0aXRsZTogJ1Rlc3QgRG9jdW1lbnQnXG4gIH07XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBub25lIG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywge30sIHVuZGVmaW5lZCwgJ25vbmUnKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB2YWxpZCBZQU1MIGZyb250bWF0dGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoYmFzZU9wdGlvbnMpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvXi0tLVxcbi8pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvXFxuLS0tJC8pO1xuXG4gICAgICAvLyBFeHRyYWN0IGFuZCBwYXJzZSBZQU1MXG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBleHBlY3QocGFyc2VkKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGNvcmUgcmVxdWlyZWQgZmllbGRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoYmFzZU9wdGlvbnMpO1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSByZXN1bHQucmVwbGFjZSgvXi0tLVxcbi8sICcnKS5yZXBsYWNlKC9cXG4tLS0kLywgJycpO1xuICAgICAgY29uc3QgcGFyc2VkID0geWFtbC5sb2FkKHlhbWxDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgICBleHBlY3QocGFyc2VkLnByb2ZpbGUpLnRvQmUoREVGQVVMVFMucHJvZmlsZSk7XG4gICAgICBleHBlY3QocGFyc2VkLmdlbmVyYXRvcikudG9CZSgnZnNzLXBhcnNlLXBkZicpO1xuICAgICAgZXhwZWN0KHBhcnNlZC52ZXJzaW9uKS50b0JlKCcxLjAuMCcpO1xuICAgICAgZXhwZWN0KHBhcnNlZC50aXRsZSkudG9CZSgnVGVzdCBEb2N1bWVudCcpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5leHRyYWN0aW9uX2NvbmZpZGVuY2UpLnRvQmUoREVGQVVMVFMuZXh0cmFjdGlvbkNvbmZpZGVuY2UpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5jb250ZW50X3F1YWxpdHkpLnRvQmUoREVGQVVMVFMuY29udGVudFF1YWxpdHkpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5jcmVhdGVkKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHNvdXJjZV9maWxlIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zOiBGcm9udG1hdHRlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxuICAgICAgICBzb3VyY2VQYXRoOiAnL3BhdGgvdG8vZmlsZS5wZGYnXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUob3B0aW9ucyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuc291cmNlX2ZpbGUpLnRvQmUoJy9wYXRoL3RvL2ZpbGUucGRmJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBjdXN0b20gcHJvZmlsZSB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uczogRnJvbnRtYXR0ZXJPcHRpb25zID0ge1xuICAgICAgICAuLi5iYXNlT3B0aW9ucyxcbiAgICAgICAgcHJvZmlsZTogJ3RlY2huaWNhbCdcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC5wcm9maWxlKS50b0JlKCd0ZWNobmljYWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIExMTSBlbnJpY2htZW50IHBsYWNlaG9sZGVycyB3aGVuIG5vIGVucmljaG1lbnQgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuc3VtbWFyeSkudG9CZSgnJyk7XG4gICAgICBleHBlY3QocGFyc2VkLnRhZ3MpLnRvRXF1YWwoW10pO1xuICAgICAgZXhwZWN0KHBhcnNlZC5jYXRlZ29yeSkudG9CZSgnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgTExNIGVucmljaG1lbnQgZmllbGRzIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbnJpY2htZW50OiBMTE1FbnJpY2htZW50ID0ge1xuICAgICAgICBzdW1tYXJ5OiAnVGVzdCBzdW1tYXJ5JyxcbiAgICAgICAgdGFnczogWyd0YWcxJywgJ3RhZzInXSxcbiAgICAgICAgY2F0ZWdvcnk6ICd0ZWNobmljYWwnLFxuICAgICAgICBhdWRpZW5jZTogJ2V4cGVydCcsXG4gICAgICAgIGRvY19wdXJwb3NlOiAncmVmZXJlbmNlJyxcbiAgICAgICAgY29tcGxleGl0eTogNCxcbiAgICAgICAgYWN0aW9uYWJsZTogdHJ1ZSxcbiAgICAgICAga2V5X3RlY2hub2xvZ2llczogWydUeXBlU2NyaXB0JywgJ05vZGUuanMnXVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKGJhc2VPcHRpb25zLCB7fSwgZW5yaWNobWVudCk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuc3VtbWFyeSkudG9CZSgnVGVzdCBzdW1tYXJ5Jyk7XG4gICAgICBleHBlY3QocGFyc2VkLnRhZ3MpLnRvRXF1YWwoWyd0YWcxJywgJ3RhZzInXSk7XG4gICAgICBleHBlY3QocGFyc2VkLmNhdGVnb3J5KS50b0JlKCd0ZWNobmljYWwnKTtcbiAgICAgIGV4cGVjdChwYXJzZWQuYXVkaWVuY2UpLnRvQmUoJ2V4cGVydCcpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5kb2NfcHVycG9zZSkudG9CZSgncmVmZXJlbmNlJyk7XG4gICAgICBleHBlY3QocGFyc2VkLmNvbXBsZXhpdHkpLnRvQmUoNCk7XG4gICAgICBleHBlY3QocGFyc2VkLmFjdGlvbmFibGUpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocGFyc2VkLmtleV90ZWNobm9sb2dpZXMpLnRvRXF1YWwoWydUeXBlU2NyaXB0JywgJ05vZGUuanMnXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdiYWxhbmNlZCBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBvbmx5IGJhbGFuY2VkIGZpZWxkcyBmcm9tIGRldGVybWluaXN0aWMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICB3b3JkX2NvdW50OiAxMDAwLFxuICAgICAgICBwYWdlX2NvdW50OiA1LFxuICAgICAgICBjaGFyYWN0ZXJfY291bnQ6IDUwMDAsXG4gICAgICAgIGhhc190YWJsZXM6IHRydWUsXG4gICAgICAgIF9pbnRlcm5hbF9maWVsZDogJ3Nob3VsZCBiZSBleGNsdWRlZCcsXG4gICAgICAgIHJhcmVfZmllbGQ6ICdzaG91bGQgYmUgZXhjbHVkZWQgaW4gYmFsYW5jZWQnXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoYmFzZU9wdGlvbnMsIGRldGVybWluaXN0aWMsIHVuZGVmaW5lZCwgJ2JhbGFuY2VkJyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQud29yZF9jb3VudCkudG9CZSgxMDAwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQucGFnZV9jb3VudCkudG9CZSg1KTtcbiAgICAgIGV4cGVjdChwYXJzZWQuY2hhcmFjdGVyX2NvdW50KS50b0JlKDUwMDApO1xuICAgICAgZXhwZWN0KHBhcnNlZC5oYXNfdGFibGVzKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5faW50ZXJuYWxfZmllbGQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChwYXJzZWQucmFyZV9maWVsZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleGNsdWRlIG51bGwgYW5kIHVuZGVmaW5lZCBiYWxhbmNlZCBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICB3b3JkX2NvdW50OiAxMDAwLFxuICAgICAgICBwYWdlX2NvdW50OiBudWxsIGFzIGFueSxcbiAgICAgICAgY2hhcmFjdGVyX2NvdW50OiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywgZGV0ZXJtaW5pc3RpYywgdW5kZWZpbmVkLCAnYmFsYW5jZWQnKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC53b3JkX2NvdW50KS50b0JlKDEwMDApO1xuICAgICAgZXhwZWN0KHBhcnNlZC5wYWdlX2NvdW50KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QocGFyc2VkLmNoYXJhY3Rlcl9jb3VudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tcGxldGUgbW9kZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgYWxsIGRldGVybWluaXN0aWMgZmllbGRzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgd29yZF9jb3VudDogMTAwMCxcbiAgICAgICAgcGFnZV9jb3VudDogNSxcbiAgICAgICAgY3VzdG9tX2ZpZWxkOiAnaW5jbHVkZWQnLFxuICAgICAgICBuZXN0ZWQ6IHsgZGVlcDogJ3ZhbHVlJyB9XG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoYmFzZU9wdGlvbnMsIGRldGVybWluaXN0aWMsIHVuZGVmaW5lZCwgJ2NvbXBsZXRlJyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQud29yZF9jb3VudCkudG9CZSgxMDAwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQucGFnZV9jb3VudCkudG9CZSg1KTtcbiAgICAgIGV4cGVjdChwYXJzZWQuY3VzdG9tX2ZpZWxkKS50b0JlKCdpbmNsdWRlZCcpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5uZXN0ZWQpLnRvRXF1YWwoeyBkZWVwOiAndmFsdWUnIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleGNsdWRlIGZpZWxkcyBzdGFydGluZyB3aXRoIHVuZGVyc2NvcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICB3b3JkX2NvdW50OiAxMDAwLFxuICAgICAgICBfcHJpdmF0ZTogJ2V4Y2x1ZGVkJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKGJhc2VPcHRpb25zLCBkZXRlcm1pbmlzdGljLCB1bmRlZmluZWQsICdjb21wbGV0ZScpO1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSByZXN1bHQucmVwbGFjZSgvXi0tLVxcbi8sICcnKS5yZXBsYWNlKC9cXG4tLS0kLywgJycpO1xuICAgICAgY29uc3QgcGFyc2VkID0geWFtbC5sb2FkKHlhbWxDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgICBleHBlY3QocGFyc2VkLndvcmRfY291bnQpLnRvQmUoMTAwMCk7XG4gICAgICBleHBlY3QocGFyc2VkLl9wcml2YXRlKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgRGF0ZSBvYmplY3RzIHRvIElTTyBzdHJpbmdzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0xNVQxMDozMDowMFonKTtcbiAgICAgIGNvbnN0IGRldGVybWluaXN0aWM6IERldGVybWluaXN0aWNGaWVsZHMgPSB7XG4gICAgICAgIG1vZGlmaWVkOiB0ZXN0RGF0ZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKGJhc2VPcHRpb25zLCBkZXRlcm1pbmlzdGljLCB1bmRlZmluZWQsICdjb21wbGV0ZScpO1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSByZXN1bHQucmVwbGFjZSgvXi0tLVxcbi8sICcnKS5yZXBsYWNlKC9cXG4tLS0kLywgJycpO1xuICAgICAgY29uc3QgcGFyc2VkID0geWFtbC5sb2FkKHlhbWxDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgICBleHBlY3QocGFyc2VkLm1vZGlmaWVkKS50b0JlKCcyMDI0LTAxLTE1VDEwOjMwOjAwLjAwMFonKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dlbmVyYXRlTWFya2Rvd24oKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXBlbmQgZnJvbnRtYXR0ZXIgdG8gY29udGVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAnIyBNeSBEb2N1bWVudFxcblxcbkNvbnRlbnQgaGVyZSc7XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZU1hcmtkb3duKFxuICAgICAgICBiYXNlT3B0aW9ucyxcbiAgICAgICAgeyB3b3JkX2NvdW50OiAxMDAgfSxcbiAgICAgICAgY29udGVudFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvXi0tLVxcbi8pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCcjIE15IERvY3VtZW50Jyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oJ0NvbnRlbnQgaGVyZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gb25seSBjb250ZW50IGZvciBub25lIG1vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gJyMgTXkgRG9jdW1lbnRcXG5cXG5Db250ZW50IGhlcmUnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGVNYXJrZG93bihcbiAgICAgICAgYmFzZU9wdGlvbnMsXG4gICAgICAgIHsgd29yZF9jb3VudDogMTAwIH0sXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgJ25vbmUnXG4gICAgICApO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlKGNvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXBhcmF0ZSBmcm9udG1hdHRlciBhbmQgY29udGVudCB3aXRoIGRvdWJsZSBuZXdsaW5lJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGVudCA9ICcjIE15IERvY3VtZW50JztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlTWFya2Rvd24oXG4gICAgICAgIGJhc2VPcHRpb25zLFxuICAgICAgICB7fSxcbiAgICAgICAgY29udGVudFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvLS0tXFxuXFxuIy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VyLXNwZWNpZmljIHNjZW5hcmlvcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBQREYgbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwZGZEZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICB3b3JkX2NvdW50OiA1MDAwLFxuICAgICAgICBwYWdlX2NvdW50OiAyMCxcbiAgICAgICAgY2hhcmFjdGVyX2NvdW50OiAyNTAwMCxcbiAgICAgICAgaGFzX3RhYmxlczogdHJ1ZSxcbiAgICAgICAgaGFzX2ltYWdlczogdHJ1ZSxcbiAgICAgICAgdGFibGVfY291bnQ6IDUsXG4gICAgICAgIGltYWdlX2NvdW50OiAxMCxcbiAgICAgICAgaGFzX3RvYzogdHJ1ZSxcbiAgICAgICAgaGFzX2Zvcm1zOiBmYWxzZSxcbiAgICAgICAgZW5jcnlwdGVkOiBmYWxzZSxcbiAgICAgICAgYXV0aG9yOiAnSm9obiBEb2UnXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoXG4gICAgICAgIHsgLi4uYmFzZU9wdGlvbnMsIGdlbmVyYXRvcjogJ2Zzcy1wYXJzZS1wZGYnLCBwcm9maWxlOiAndGVjaG5pY2FsJyB9LFxuICAgICAgICBwZGZEZXRlcm1pbmlzdGljLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICdiYWxhbmNlZCdcbiAgICAgICk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQud29yZF9jb3VudCkudG9CZSg1MDAwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQucGFnZV9jb3VudCkudG9CZSgyMCk7XG4gICAgICBleHBlY3QocGFyc2VkLmhhc190YWJsZXMpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocGFyc2VkLnRhYmxlX2NvdW50KS50b0JlKDUpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5hdXRob3IpLnRvQmUoJ0pvaG4gRG9lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbWFpbCBtZXRhZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IGVtYWlsRGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgZnJvbTogJ3NlbmRlckBleGFtcGxlLmNvbScsXG4gICAgICAgIHRvOiAncmVjaXBpZW50QGV4YW1wbGUuY29tJyxcbiAgICAgICAgZGF0ZTogJzIwMjQtMDEtMTVUMTA6MzA6MDBaJyxcbiAgICAgICAgbWVzc2FnZV9pZDogJzxhYmMxMjNAZXhhbXBsZS5jb20+JyxcbiAgICAgICAgaGFzX2F0dGFjaG1lbnRzOiB0cnVlLFxuICAgICAgICBhdHRhY2htZW50X2NvdW50OiAzLFxuICAgICAgICB3b3JkX2NvdW50OiA1MDAsXG4gICAgICAgIGltcG9ydGFuY2U6ICdoaWdoJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKFxuICAgICAgICB7IC4uLmJhc2VPcHRpb25zLCBnZW5lcmF0b3I6ICdmc3MtcGFyc2UtZW1haWwnIH0sXG4gICAgICAgIGVtYWlsRGV0ZXJtaW5pc3RpYyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAnYmFsYW5jZWQnXG4gICAgICApO1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSByZXN1bHQucmVwbGFjZSgvXi0tLVxcbi8sICcnKS5yZXBsYWNlKC9cXG4tLS0kLywgJycpO1xuICAgICAgY29uc3QgcGFyc2VkID0geWFtbC5sb2FkKHlhbWxDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgICBleHBlY3QocGFyc2VkLmZyb20pLnRvQmUoJ3NlbmRlckBleGFtcGxlLmNvbScpO1xuICAgICAgZXhwZWN0KHBhcnNlZC50bykudG9CZSgncmVjaXBpZW50QGV4YW1wbGUuY29tJyk7XG4gICAgICBleHBlY3QocGFyc2VkLmhhc19hdHRhY2htZW50cykudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChwYXJzZWQuYXR0YWNobWVudF9jb3VudCkudG9CZSgzKTtcbiAgICAgIGV4cGVjdChwYXJzZWQuaW1wb3J0YW5jZSkudG9CZSgnaGlnaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYXVkaW8gbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhdWRpb0RldGVybWluaXN0aWM6IERldGVybWluaXN0aWNGaWVsZHMgPSB7XG4gICAgICAgIGR1cmF0aW9uOiAzNjAwLFxuICAgICAgICBkdXJhdGlvbl9zZWNvbmRzOiAzNjAwLFxuICAgICAgICBiaXRyYXRlOiAzMjAsXG4gICAgICAgIHNhbXBsZV9yYXRlOiA0NDEwMCxcbiAgICAgICAgY29kZWM6ICdtcDMnLFxuICAgICAgICBoYXNfdHJhbnNjcmlwdDogdHJ1ZSxcbiAgICAgICAgc3BlYWtlcl9jb3VudDogMyxcbiAgICAgICAgbGFuZ3VhZ2U6ICdlbidcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShcbiAgICAgICAgeyAuLi5iYXNlT3B0aW9ucywgZ2VuZXJhdG9yOiAnZnNzLXBhcnNlLWF1ZGlvJywgcHJvZmlsZTogJ21lZXRpbmcnIH0sXG4gICAgICAgIGF1ZGlvRGV0ZXJtaW5pc3RpYyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAnYmFsYW5jZWQnXG4gICAgICApO1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSByZXN1bHQucmVwbGFjZSgvXi0tLVxcbi8sICcnKS5yZXBsYWNlKC9cXG4tLS0kLywgJycpO1xuICAgICAgY29uc3QgcGFyc2VkID0geWFtbC5sb2FkKHlhbWxDb250ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgICBleHBlY3QocGFyc2VkLmR1cmF0aW9uKS50b0JlKDM2MDApO1xuICAgICAgZXhwZWN0KHBhcnNlZC5iaXRyYXRlKS50b0JlKDMyMCk7XG4gICAgICBleHBlY3QocGFyc2VkLmhhc190cmFuc2NyaXB0KS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5zcGVha2VyX2NvdW50KS50b0JlKDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgaW1hZ2UgbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbWFnZURldGVybWluaXN0aWM6IERldGVybWluaXN0aWNGaWVsZHMgPSB7XG4gICAgICAgIHdpZHRoOiAxOTIwLFxuICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgIGZvcm1hdDogJ3BuZycsXG4gICAgICAgIGZpbGVfc2l6ZTogMjA0ODAwMCxcbiAgICAgICAgY2hhbm5lbHM6IDQsXG4gICAgICAgIGhhc19hbHBoYTogdHJ1ZSxcbiAgICAgICAgb2NyX2NvbmZpZGVuY2U6IDAuOTVcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShcbiAgICAgICAgeyAuLi5iYXNlT3B0aW9ucywgZ2VuZXJhdG9yOiAnZnNzLXBhcnNlLWltYWdlJyB9LFxuICAgICAgICBpbWFnZURldGVybWluaXN0aWMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgJ2JhbGFuY2VkJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC53aWR0aCkudG9CZSgxOTIwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQuaGVpZ2h0KS50b0JlKDEwODApO1xuICAgICAgZXhwZWN0KHBhcnNlZC5mb3JtYXQpLnRvQmUoJ3BuZycpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5vY3JfY29uZmlkZW5jZSkudG9CZSgwLjk1KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHZpZGVvIG1ldGFkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmlkZW9EZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICBkdXJhdGlvbjogNzIwMCxcbiAgICAgICAgd2lkdGg6IDE5MjAsXG4gICAgICAgIGhlaWdodDogMTA4MCxcbiAgICAgICAgZnBzOiAzMCxcbiAgICAgICAgYXNwZWN0X3JhdGlvOiAnMTY6OScsXG4gICAgICAgIGJpdHJhdGU6IDgwMDAsXG4gICAgICAgIHZpZGVvX2NvZGVjOiAnaDI2NCcsXG4gICAgICAgIGF1ZGlvX2NvZGVjOiAnYWFjJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKFxuICAgICAgICB7IC4uLmJhc2VPcHRpb25zLCBnZW5lcmF0b3I6ICdmc3MtcGFyc2UtdmlkZW8nLCBwcm9maWxlOiAnbWVldGluZycgfSxcbiAgICAgICAgdmlkZW9EZXRlcm1pbmlzdGljLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICdiYWxhbmNlZCdcbiAgICAgICk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuZHVyYXRpb24pLnRvQmUoNzIwMCk7XG4gICAgICBleHBlY3QocGFyc2VkLmZwcykudG9CZSgzMCk7XG4gICAgICBleHBlY3QocGFyc2VkLmFzcGVjdF9yYXRpbykudG9CZSgnMTY6OScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcHJlc2VudGF0aW9uIG1ldGFkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJlc2VudGF0aW9uRGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgc2xpZGVfY291bnQ6IDI1LFxuICAgICAgICB0b3RhbF9zbGlkZXM6IDI1LFxuICAgICAgICB3b3JkX2NvdW50OiAzMDAwLFxuICAgICAgICBoYXNfaW1hZ2VzOiB0cnVlLFxuICAgICAgICBpbWFnZV9jb3VudDogMTUsXG4gICAgICAgIGNoYXJ0X2NvdW50OiA1LFxuICAgICAgICBoYXNfc3BlYWtlcl9ub3RlczogdHJ1ZSxcbiAgICAgICAgYXV0aG9yOiAnSmFuZSBTbWl0aCdcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShcbiAgICAgICAgeyAuLi5iYXNlT3B0aW9ucywgZ2VuZXJhdG9yOiAnZnNzLXBhcnNlLXByZXNlbnRhdGlvbicsIHByb2ZpbGU6ICd0ZWNobmljYWwnIH0sXG4gICAgICAgIHByZXNlbnRhdGlvbkRldGVybWluaXN0aWMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgJ2JhbGFuY2VkJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC5zbGlkZV9jb3VudCkudG9CZSgyNSk7XG4gICAgICBleHBlY3QocGFyc2VkLmNoYXJ0X2NvdW50KS50b0JlKDUpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5oYXNfc3BlYWtlcl9ub3RlcykudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGV4Y2VsIG1ldGFkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhjZWxEZXRlcm1pbmlzdGljOiBEZXRlcm1pbmlzdGljRmllbGRzID0ge1xuICAgICAgICBzaGVldF9jb3VudDogMyxcbiAgICAgICAgcm93X2NvdW50OiAxMDAwLFxuICAgICAgICBjb2x1bW5fY291bnQ6IDIwLFxuICAgICAgICBhdXRob3I6ICdEYXRhIEFuYWx5c3QnXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUoXG4gICAgICAgIHsgLi4uYmFzZU9wdGlvbnMsIGdlbmVyYXRvcjogJ2Zzcy1wYXJzZS1leGNlbCcgfSxcbiAgICAgICAgZXhjZWxEZXRlcm1pbmlzdGljLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICdiYWxhbmNlZCdcbiAgICAgICk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuc2hlZXRfY291bnQpLnRvQmUoMyk7XG4gICAgICBleHBlY3QocGFyc2VkLnJvd19jb3VudCkudG9CZSgxMDAwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQuY29sdW1uX2NvdW50KS50b0JlKDIwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGRpYWdyYW0gbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkaWFncmFtRGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgZGlhZ3JhbV9jb3VudDogNSxcbiAgICAgICAgZGlhZ3JhbV90eXBlOiAnZmxvd2NoYXJ0JyxcbiAgICAgICAgdmFsaWRfZGlhZ3JhbXM6IDQsXG4gICAgICAgIGludmFsaWRfZGlhZ3JhbXM6IDEsXG4gICAgICAgIG5vZGVfY291bnQ6IDIwLFxuICAgICAgICBlZGdlX2NvdW50OiAyNVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKFxuICAgICAgICB7IC4uLmJhc2VPcHRpb25zLCBnZW5lcmF0b3I6ICdmc3MtcGFyc2UtZGlhZ3JhbScsIHByb2ZpbGU6ICdzY2hlbWEnIH0sXG4gICAgICAgIGRpYWdyYW1EZXRlcm1pbmlzdGljLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICdiYWxhbmNlZCdcbiAgICAgICk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuZGlhZ3JhbV9jb3VudCkudG9CZSg1KTtcbiAgICAgIGV4cGVjdChwYXJzZWQudmFsaWRfZGlhZ3JhbXMpLnRvQmUoNCk7XG4gICAgICBleHBlY3QocGFyc2VkLm5vZGVfY291bnQpLnRvQmUoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZGF0YSBwYXJzZXIgbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhRGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgcmVjb3JkX2NvdW50OiAxMDAwMCxcbiAgICAgICAgZm9ybWF0X2RldGVjdGVkOiAnanNvbicsXG4gICAgICAgIGZpbGVfc2l6ZTogNTAwMDAwMCxcbiAgICAgICAgY29sdW1uX2NvdW50OiAxNVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEZyb250bWF0dGVyR2VuZXJhdG9yLmdlbmVyYXRlKFxuICAgICAgICB7IC4uLmJhc2VPcHRpb25zLCBnZW5lcmF0b3I6ICdmc3MtcGFyc2UtZGF0YScgfSxcbiAgICAgICAgZGF0YURldGVybWluaXN0aWMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgJ2JhbGFuY2VkJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC5yZWNvcmRfY291bnQpLnRvQmUoMTAwMDApO1xuICAgICAgZXhwZWN0KHBhcnNlZC5mb3JtYXRfZGV0ZWN0ZWQpLnRvQmUoJ2pzb24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2VkZ2UgY2FzZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgZGV0ZXJtaW5pc3RpYyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywge30pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvXi0tLVxcbi8pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaCgvXFxuLS0tJC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWlzc2luZyB0aXRsZSB3aXRoIGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zOiBGcm9udG1hdHRlck9wdGlvbnMgPSB7XG4gICAgICAgIGdlbmVyYXRvcjogJ3Rlc3QnLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICB0aXRsZTogJydcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC50aXRsZSkudG9CZSgnVW50aXRsZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGFycmF5cyBpbiBkZXRlcm1pbmlzdGljIGZpZWxkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGRldGVybWluaXN0aWM6IERldGVybWluaXN0aWNGaWVsZHMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFsnYUB0ZXN0LmNvbScsICdiQHRlc3QuY29tJ11cbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywgZGV0ZXJtaW5pc3RpYywgdW5kZWZpbmVkLCAnY29tcGxldGUnKTtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gcmVzdWx0LnJlcGxhY2UoL14tLS1cXG4vLCAnJykucmVwbGFjZSgvXFxuLS0tJC8sICcnKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZCh5YW1sQ29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgZXhwZWN0KHBhcnNlZC5yZWNpcGllbnRzKS50b0VxdWFsKFsnYUB0ZXN0LmNvbScsICdiQHRlc3QuY29tJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY3VzdG9tIGV4dHJhY3Rpb24gY29uZmlkZW5jZSBhbmQgcXVhbGl0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IEZyb250bWF0dGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uYmFzZU9wdGlvbnMsXG4gICAgICAgIGV4dHJhY3Rpb25Db25maWRlbmNlOiAwLjg1LFxuICAgICAgICBjb250ZW50UXVhbGl0eTogMS4yXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRnJvbnRtYXR0ZXJHZW5lcmF0b3IuZ2VuZXJhdGUob3B0aW9ucyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuZXh0cmFjdGlvbl9jb25maWRlbmNlKS50b0JlKDAuODUpO1xuICAgICAgZXhwZWN0KHBhcnNlZC5jb250ZW50X3F1YWxpdHkpLnRvQmUoMS4yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8gdmFsdWVzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRldGVybWluaXN0aWM6IERldGVybWluaXN0aWNGaWVsZHMgPSB7XG4gICAgICAgIHdvcmRfY291bnQ6IDAsXG4gICAgICAgIHBhZ2VfY291bnQ6IDBcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywgZGV0ZXJtaW5pc3RpYyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQud29yZF9jb3VudCkudG9CZSgwKTtcbiAgICAgIGV4cGVjdChwYXJzZWQucGFnZV9jb3VudCkudG9CZSgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJvb2xlYW4gZmFsc2UgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGV0ZXJtaW5pc3RpYzogRGV0ZXJtaW5pc3RpY0ZpZWxkcyA9IHtcbiAgICAgICAgaGFzX3RhYmxlczogZmFsc2UsXG4gICAgICAgIGVuY3J5cHRlZDogZmFsc2VcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBGcm9udG1hdHRlckdlbmVyYXRvci5nZW5lcmF0ZShiYXNlT3B0aW9ucywgZGV0ZXJtaW5pc3RpYyk7XG4gICAgICBjb25zdCB5YW1sQ29udGVudCA9IHJlc3VsdC5yZXBsYWNlKC9eLS0tXFxuLywgJycpLnJlcGxhY2UoL1xcbi0tLSQvLCAnJyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIGV4cGVjdChwYXJzZWQuaGFzX3RhYmxlcykudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QocGFyc2VkLmVuY3J5cHRlZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|