@rangertechnologies/ngnxt
Version:
This library was used for creating dymanic UI based on the input JSON/data
351 lines • 35.2 kB
JavaScript
// AP-11APR25
import { Injectable } from '@angular/core';
import { v4 as uuidv4 } from 'uuid';
import * as i0 from "@angular/core";
export class TemplateService {
// templates = [
// {
// templateId: 1,
// templateName: 'Invoice',
// content: 'Invoice template with customer details',
// elements: [
// {
// type: 'Text',
// questionText: 'Customer Name',
// style: { showLabel: true },
// size: 12
// },
// {
// type: 'Date',
// questionText: 'Invoice Date',
// style: { showLabel: true }
// },
// {
// type: 'Table',
// questionText: 'Items',
// fieldsMeta: JSON.stringify([
// {
// label: 'Item',
// fieldName: 'item',
// type: 'Text',
// uniqueIdentifier: 'temp1'
// },
// {
// label: 'Quantity',
// fieldName: 'qty',
// type: 'Number',
// uniqueIdentifier: 'temp2'
// }
// ]),
// tableConfig: {
// isNosIndicator: true,
// addInlineRecord: true,
// isPagination: true
// }
// }
// ]
// },
// {
// templateId: 2,
// templateName: 'Registration',
// content: 'User registration form template',
// elements: [
// {
// type: 'Text',
// questionText: 'Full Name',
// style: { showLabel: true },
// size: 12
// },
// {
// type: 'Text',
// questionText: 'Email Address',
// style: { showLabel: true },
// size: 12
// },
// {
// type: 'Date',
// questionText: 'Date of Birth',
// style: { showLabel: true }
// }
// ]
// },
// {
// templateId: 3,
// templateName: 'Employee Detail',
// content: 'Template to capture employee details',
// elements: [
// {
// type: 'Text',
// questionText: 'Employee ID',
// style: { showLabel: true },
// size: 6
// },
// {
// type: 'Text',
// questionText: 'Employee Name',
// style: { showLabel: true },
// size: 6
// },
// {
// type: 'Table',
// questionText: 'Previous Work Experience',
// fieldsMeta: JSON.stringify([
// {
// label: 'Company Name',
// fieldName: 'company',
// type: 'Text',
// uniqueIdentifier: 'emp1'
// },
// {
// label: 'Years Worked',
// fieldName: 'years',
// type: 'Number',
// uniqueIdentifier: 'emp2'
// }
// ]),
// tableConfig: {
// isNosIndicator: false,
// addInlineRecord: true,
// isPagination: true
// }
// }
// ]
// },
// {
// templateId: 4,
// templateName: 'Feedback',
// content: 'Feedback form for services or products',
// elements: [
// {
// type: 'Text',
// questionText: 'Your Name',
// style: { showLabel: true },
// size: 12
// },
// {
// type: 'Text',
// questionText: 'Feedback',
// style: { showLabel: true },
// size: 12
// },
// {
// type: 'Table',
// questionText: 'Service Ratings',
// fieldsMeta: JSON.stringify([
// {
// label: 'Service',
// fieldName: 'service',
// type: 'Text',
// uniqueIdentifier: 'fb1'
// },
// {
// label: 'Rating (1-5)',
// fieldName: 'rating',
// type: 'Number',
// uniqueIdentifier: 'fb2'
// }
// ]),
// tableConfig: {
// isNosIndicator: false,
// addInlineRecord: true,
// isPagination: false
// }
// }
// ]
// }
// ];
templates = [];
unique_id;
book;
formElements = [];
constructor() {
this.newBook();
}
getTemplates() {
return this.templates;
}
initializeElementFromTemplate(templateElement, index) {
const unique_id = uuidv4();
const baseElement = {
id: unique_id,
uid: unique_id,
type: templateElement.type,
name: null,
questionText: templateElement.questionText || null,
question: templateElement.question || null,
helpText: null,
errorMessage: null,
isReadOnly: false,
isHidden: false,
required: false,
referenceField: null,
additionalRichContent: null,
groupName: null,
isDateBackward: false,
title: null,
subTitle: null,
size: templateElement.size || 12,
isDateForward: false,
isOptional: false,
isTitle: false,
nextQuestion: null,
allowedFileExtensions: null,
questionNumber: index + 1,
order: index + 1,
style: {
labelClass: null,
labelStyle: null,
labelValueStyle: null,
inputClass: null,
inputStyle: null,
showLabel: templateElement?.style?.showLabel ?? true,
bookStyle: null,
direction: 'ltr',
questionStyle: null,
},
subText: {
endpoint: null,
variable: null,
field: null,
defaultField: null,
sourceQuestionId: null,
valueField: null,
labelField: null,
isDependentField: false,
dependentValue: null,
queryField: null,
queryValue: null,
queryValueReference: null,
uniqueKey: null,
},
imageData: null,
boolean: false,
options: templateElement.options
? this.initializeOptions(templateElement.options)
: null,
imageSize: templateElement.type === 'Image' ? { width: 150, height: 150 } : null,
tableConfig: templateElement.type === 'Table' ? {
isNosIndicator: true,
addInlineRecord: true,
isPagination: true,
actionButton: true,
isDeleteRow: true,
isEditRow: true,
searchBar: true,
isButtons: true,
itemsPerPage: 10,
} : null,
fieldsMeta: templateElement.fieldsMeta
? this.initializeFieldsMeta(templateElement.fieldsMeta)
: null,
};
return { ...baseElement, ...templateElement };
}
initializeOptions(options) {
return options.map(option => ({
...option,
id: uuidv4()
}));
}
initializeFieldsMeta(fieldsMeta) {
try {
const parsed = JSON.parse(fieldsMeta);
return parsed.map((field) => ({
...field,
uniqueIdentifier: uuidv4()
}));
}
catch (e) {
console.error('Error parsing fieldsMeta:', e);
return [];
}
}
// In TemplateService
download() {
if (!this.formElements || !Array.isArray(this.formElements)) {
console.error('Invalid formElements');
return null;
}
// Clean elements for export (same as FormBuilderService)
this.formElements.forEach(element => {
// Remove qbReferenceQuestions for 'book' type
if (element.type === 'book') {
delete element.qbReferenceQuestions;
}
// Process subText to match FormBuilderService's format
if (element.subText) {
try {
// Convert subText to object if string
element.subText = typeof element.subText === 'string'
? JSON.parse(element.subText)
: { ...element.subText };
// Convert field to array if string
if (typeof element.subText.field === 'string') {
element.subText.field = element.subText.field.split(',').map(i => i.trim());
}
// Stringify subText for storage
element.subText = JSON.stringify(element.subText);
}
catch (e) {
console.error('Error processing subText:', e);
element.subText = '{}';
}
}
});
// Update book structure (same as FormBuilderService)
if (!this.book)
this.newBook(); // Ensure book exists
if (this.book.bookQuestionsMap && this.unique_id) {
this.book.bookQuestionsMap[this.unique_id].subQuestions = this.formElements;
}
// Prepare sqOptions (same format as FormBuilderService)
const sqOptions = {};
this.formElements.forEach(element => {
if (['Dropdown', 'Radio', 'Checkbox'].includes(element.type)) {
sqOptions[element.id] = {
...element,
options: element.options?.map(opt => ({
...opt,
// Ensure UUIDs are preserved
id: opt.id || uuidv4(),
uniqueIdentifier: opt.uniqueIdentifier || uuidv4()
})) || []
};
}
});
this.book.sqOptions = sqOptions;
return JSON.parse(JSON.stringify(this.book)); // Return clean copy
}
// Add the newBook() method if missing
newBook() {
this.unique_id = uuidv4();
this.book = {
bookQuestionsMap: {
[this.unique_id]: {
subQuestions: [],
type: 'Book'
}
},
questionbook: {
action: JSON.stringify([
{ name: "Cancel", eventtoemit: "close" },
{ name: "Save", eventtoemit: "submit", method: "POST" }
])
},
records: [{
id: this.unique_id,
title: 'Untitled Template',
subQuestions: []
}]
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TemplateService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9zZXJ2aWNlcy90ZW1wbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWE7QUFDYixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtwQyxNQUFNLE9BQU8sZUFBZTtJQUMxQixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLHFCQUFxQjtJQUNyQiwrQkFBK0I7SUFDL0IseURBQXlEO0lBQ3pELGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gseUJBQXlCO0lBQ3pCLHlDQUF5QztJQUN6QyxzQ0FBc0M7SUFDdEMsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxXQUFXO0lBQ1gseUJBQXlCO0lBQ3pCLHdDQUF3QztJQUN4QyxxQ0FBcUM7SUFDckMsV0FBVztJQUNYLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsaUNBQWlDO0lBQ2pDLHVDQUF1QztJQUN2QyxlQUFlO0lBQ2YsOEJBQThCO0lBQzlCLGtDQUFrQztJQUNsQyw0QkFBNEI7SUFDNUIseUNBQXlDO0lBQ3pDLGVBQWU7SUFDZixjQUFjO0lBQ2QsaUNBQWlDO0lBQ2pDLGdDQUFnQztJQUNoQyw4QkFBOEI7SUFDOUIsd0NBQXdDO0lBQ3hDLGNBQWM7SUFDZCxjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLGtDQUFrQztJQUNsQyxtQ0FBbUM7SUFDbkMsK0JBQStCO0lBQy9CLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLG9DQUFvQztJQUNwQyxrREFBa0Q7SUFDbEQsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIscUNBQXFDO0lBQ3JDLHNDQUFzQztJQUN0QyxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIseUNBQXlDO0lBQ3pDLHNDQUFzQztJQUN0QyxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIseUNBQXlDO0lBQ3pDLHFDQUFxQztJQUNyQyxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLHVDQUF1QztJQUN2Qyx1REFBdUQ7SUFDdkQsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIsdUNBQXVDO0lBQ3ZDLHNDQUFzQztJQUN0QyxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIseUNBQXlDO0lBQ3pDLHNDQUFzQztJQUN0QyxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsb0RBQW9EO0lBQ3BELHVDQUF1QztJQUN2QyxjQUFjO0lBQ2QscUNBQXFDO0lBQ3JDLG9DQUFvQztJQUNwQyw0QkFBNEI7SUFDNUIsdUNBQXVDO0lBQ3ZDLGVBQWU7SUFDZixjQUFjO0lBQ2QscUNBQXFDO0lBQ3JDLGtDQUFrQztJQUNsQyw4QkFBOEI7SUFDOUIsdUNBQXVDO0lBQ3ZDLGNBQWM7SUFDZCxjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLG1DQUFtQztJQUNuQyxtQ0FBbUM7SUFDbkMsK0JBQStCO0lBQy9CLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLGdDQUFnQztJQUNoQyx5REFBeUQ7SUFDekQsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIscUNBQXFDO0lBQ3JDLHNDQUFzQztJQUN0QyxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIsb0NBQW9DO0lBQ3BDLHNDQUFzQztJQUN0QyxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsMkNBQTJDO0lBQzNDLHVDQUF1QztJQUN2QyxjQUFjO0lBQ2QsZ0NBQWdDO0lBQ2hDLG9DQUFvQztJQUNwQyw0QkFBNEI7SUFDNUIsc0NBQXNDO0lBQ3RDLGVBQWU7SUFDZixjQUFjO0lBQ2QscUNBQXFDO0lBQ3JDLG1DQUFtQztJQUNuQyw4QkFBOEI7SUFDOUIsc0NBQXNDO0lBQ3RDLGNBQWM7SUFDZCxjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLG1DQUFtQztJQUNuQyxtQ0FBbUM7SUFDbkMsZ0NBQWdDO0lBQ2hDLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLE1BQU07SUFDTixLQUFLO0lBRUwsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVmLFNBQVMsQ0FBTTtJQUNmLElBQUksQ0FBTTtJQUNWLFlBQVksR0FBVSxFQUFFLENBQUM7SUFDekI7UUFDRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUNELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNELDZCQUE2QixDQUFDLGVBQW9CLEVBQUUsS0FBYTtRQUMvRCxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRztZQUNsQixFQUFFLEVBQUUsU0FBUztZQUNiLEdBQUcsRUFBRSxTQUFTO1lBQ2QsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO1lBQzFCLElBQUksRUFBRSxJQUFJO1lBQ1YsWUFBWSxFQUFFLGVBQWUsQ0FBQyxZQUFZLElBQUksSUFBSTtZQUNsRCxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVEsSUFBSSxJQUFJO1lBQzFDLFFBQVEsRUFBRSxJQUFJO1lBQ2QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztZQUNmLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsU0FBUyxFQUFFLElBQUk7WUFDZixjQUFjLEVBQUUsS0FBSztZQUNyQixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNoQyxhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsS0FBSztZQUNkLFlBQVksRUFBRSxJQUFJO1lBQ2xCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsY0FBYyxFQUFFLEtBQUssR0FBRyxDQUFDO1lBQ3pCLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQztZQUNoQixLQUFLLEVBQUU7Z0JBQ0wsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixlQUFlLEVBQUUsSUFBSTtnQkFDckIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixTQUFTLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLElBQUksSUFBSTtnQkFDcEQsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxJQUFJO2dCQUNYLFlBQVksRUFBRSxJQUFJO2dCQUNsQixnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLGdCQUFnQixFQUFFLEtBQUs7Z0JBQ3ZCLGNBQWMsRUFBRSxJQUFJO2dCQUNwQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLFNBQVMsRUFBRSxJQUFJO2FBQ2hCO1lBQ0QsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTztnQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO2dCQUNqRCxDQUFDLENBQUMsSUFBSTtZQUNSLFNBQVMsRUFDUCxlQUFlLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN2RSxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxjQUFjLEVBQUUsSUFBSTtnQkFDcEIsZUFBZSxFQUFFLElBQUk7Z0JBQ3JCLFlBQVksRUFBRSxJQUFJO2dCQUNsQixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFlBQVksRUFBRSxFQUFFO2FBQ2pCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDUixVQUFVLEVBQUUsZUFBZSxDQUFDLFVBQVU7Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDO1FBRUYsT0FBTyxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQWM7UUFDdEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixHQUFHLE1BQU07WUFDVCxFQUFFLEVBQUUsTUFBTSxFQUFFO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBa0I7UUFDN0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLEdBQUcsS0FBSztnQkFDUixnQkFBZ0IsRUFBRSxNQUFNLEVBQUU7YUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUNILHFCQUFxQjtJQUNyQixRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEMsOENBQThDO1lBQzlDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDdEMsQ0FBQztZQUVELHVEQUF1RDtZQUN2RCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDO29CQUNILHNDQUFzQztvQkFDdEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUTt3QkFDbkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLEVBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUM7b0JBRXpCLG1DQUFtQztvQkFDbkMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUM5QyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQzlFLENBQUM7b0JBRUQsZ0NBQWdDO29CQUNoQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDOUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMscUJBQXFCO1FBRXJELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUUsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRztvQkFDdEIsR0FBRyxPQUFPO29CQUNWLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3BDLEdBQUcsR0FBRzt3QkFDTiw2QkFBNkI7d0JBQzdCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLE1BQU0sRUFBRTt3QkFDdEIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixJQUFJLE1BQU0sRUFBRTtxQkFDbkQsQ0FBQyxDQUFDLElBQUksRUFBRTtpQkFDVixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CO0lBQ3BFLENBQUM7SUFFRCxzQ0FBc0M7SUFDOUIsT0FBTztRQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksR0FBRztZQUNWLGdCQUFnQixFQUFFO2dCQUNoQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDaEIsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLElBQUksRUFBRSxNQUFNO2lCQUNiO2FBQ0Y7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ3JCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFO29CQUN4QyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2lCQUN4RCxDQUFDO2FBQ0g7WUFDRCxPQUFPLEVBQUUsQ0FBQztvQkFDUixFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ2xCLEtBQUssRUFBRSxtQkFBbUI7b0JBQzFCLFlBQVksRUFBRSxFQUFFO2lCQUNqQixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7d0dBN1ZZLGVBQWU7NEdBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVAtMTFBUFIyNVxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU2VydmljZSB7XG4gIC8vIHRlbXBsYXRlcyA9IFtcbiAgLy8gICB7XG4gIC8vICAgICB0ZW1wbGF0ZUlkOiAxLFxuICAvLyAgICAgdGVtcGxhdGVOYW1lOiAnSW52b2ljZScsXG4gIC8vICAgICBjb250ZW50OiAnSW52b2ljZSB0ZW1wbGF0ZSB3aXRoIGN1c3RvbWVyIGRldGFpbHMnLFxuICAvLyAgICAgZWxlbWVudHM6IFtcbiAgLy8gICAgICAgeyBcbiAgLy8gICAgICAgICB0eXBlOiAnVGV4dCcsIFxuICAvLyAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0N1c3RvbWVyIE5hbWUnLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9LFxuICAvLyAgICAgICAgIHNpemU6IDEyXG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIHsgXG4gIC8vICAgICAgICAgdHlwZTogJ0RhdGUnLCBcbiAgLy8gICAgICAgICBxdWVzdGlvblRleHQ6ICdJbnZvaWNlIERhdGUnLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9XG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICB0eXBlOiAnVGFibGUnLFxuICAvLyAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0l0ZW1zJyxcbiAgLy8gICAgICAgICBmaWVsZHNNZXRhOiBKU09OLnN0cmluZ2lmeShbXG4gIC8vICAgICAgICAgICB7IFxuICAvLyAgICAgICAgICAgICBsYWJlbDogJ0l0ZW0nLCBcbiAgLy8gICAgICAgICAgICAgZmllbGROYW1lOiAnaXRlbScsIFxuICAvLyAgICAgICAgICAgICB0eXBlOiAnVGV4dCcsXG4gIC8vICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6ICd0ZW1wMScgXG4gIC8vICAgICAgICAgICB9LFxuICAvLyAgICAgICAgICAge1xuICAvLyAgICAgICAgICAgICBsYWJlbDogJ1F1YW50aXR5JyxcbiAgLy8gICAgICAgICAgICAgZmllbGROYW1lOiAncXR5JyxcbiAgLy8gICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gIC8vICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6ICd0ZW1wMidcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICBdKSxcbiAgLy8gICAgICAgICB0YWJsZUNvbmZpZzoge1xuICAvLyAgICAgICAgICAgaXNOb3NJbmRpY2F0b3I6IHRydWUsXG4gIC8vICAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gIC8vICAgICAgICAgICBpc1BhZ2luYXRpb246IHRydWVcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIF1cbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIHRlbXBsYXRlSWQ6IDIsXG4gIC8vICAgICB0ZW1wbGF0ZU5hbWU6ICdSZWdpc3RyYXRpb24nLFxuICAvLyAgICAgY29udGVudDogJ1VzZXIgcmVnaXN0cmF0aW9uIGZvcm0gdGVtcGxhdGUnLFxuICAvLyAgICAgZWxlbWVudHM6IFtcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgLy8gICAgICAgICBxdWVzdGlvblRleHQ6ICdGdWxsIE5hbWUnLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9LFxuICAvLyAgICAgICAgIHNpemU6IDEyXG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICB0eXBlOiAnVGV4dCcsXG4gIC8vICAgICAgICAgcXVlc3Rpb25UZXh0OiAnRW1haWwgQWRkcmVzcycsXG4gIC8vICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gIC8vICAgICAgICAgc2l6ZTogMTJcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHR5cGU6ICdEYXRlJyxcbiAgLy8gICAgICAgICBxdWVzdGlvblRleHQ6ICdEYXRlIG9mIEJpcnRoJyxcbiAgLy8gICAgICAgICBzdHlsZTogeyBzaG93TGFiZWw6IHRydWUgfVxuICAvLyAgICAgICB9XG4gIC8vICAgICBdXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICB0ZW1wbGF0ZUlkOiAzLFxuICAvLyAgICAgdGVtcGxhdGVOYW1lOiAnRW1wbG95ZWUgRGV0YWlsJyxcbiAgLy8gICAgIGNvbnRlbnQ6ICdUZW1wbGF0ZSB0byBjYXB0dXJlIGVtcGxveWVlIGRldGFpbHMnLFxuICAvLyAgICAgZWxlbWVudHM6IFtcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgLy8gICAgICAgICBxdWVzdGlvblRleHQ6ICdFbXBsb3llZSBJRCcsXG4gIC8vICAgICAgICAgc3R5bGU6IHsgc2hvd0xhYmVsOiB0cnVlIH0sXG4gIC8vICAgICAgICAgc2l6ZTogNlxuICAvLyAgICAgICB9LFxuICAvLyAgICAgICB7XG4gIC8vICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAvLyAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ0VtcGxveWVlIE5hbWUnLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9LFxuICAvLyAgICAgICAgIHNpemU6IDZcbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHR5cGU6ICdUYWJsZScsXG4gIC8vICAgICAgICAgcXVlc3Rpb25UZXh0OiAnUHJldmlvdXMgV29yayBFeHBlcmllbmNlJyxcbiAgLy8gICAgICAgICBmaWVsZHNNZXRhOiBKU09OLnN0cmluZ2lmeShbXG4gIC8vICAgICAgICAgICB7XG4gIC8vICAgICAgICAgICAgIGxhYmVsOiAnQ29tcGFueSBOYW1lJyxcbiAgLy8gICAgICAgICAgICAgZmllbGROYW1lOiAnY29tcGFueScsXG4gIC8vICAgICAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgLy8gICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ2VtcDEnXG4gIC8vICAgICAgICAgICB9LFxuICAvLyAgICAgICAgICAge1xuICAvLyAgICAgICAgICAgICBsYWJlbDogJ1llYXJzIFdvcmtlZCcsXG4gIC8vICAgICAgICAgICAgIGZpZWxkTmFtZTogJ3llYXJzJyxcbiAgLy8gICAgICAgICAgICAgdHlwZTogJ051bWJlcicsXG4gIC8vICAgICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6ICdlbXAyJ1xuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIF0pLFxuICAvLyAgICAgICAgIHRhYmxlQ29uZmlnOiB7XG4gIC8vICAgICAgICAgICBpc05vc0luZGljYXRvcjogZmFsc2UsXG4gIC8vICAgICAgICAgICBhZGRJbmxpbmVSZWNvcmQ6IHRydWUsXG4gIC8vICAgICAgICAgICBpc1BhZ2luYXRpb246IHRydWVcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIF1cbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIHRlbXBsYXRlSWQ6IDQsXG4gIC8vICAgICB0ZW1wbGF0ZU5hbWU6ICdGZWVkYmFjaycsXG4gIC8vICAgICBjb250ZW50OiAnRmVlZGJhY2sgZm9ybSBmb3Igc2VydmljZXMgb3IgcHJvZHVjdHMnLFxuICAvLyAgICAgZWxlbWVudHM6IFtcbiAgLy8gICAgICAge1xuICAvLyAgICAgICAgIHR5cGU6ICdUZXh0JyxcbiAgLy8gICAgICAgICBxdWVzdGlvblRleHQ6ICdZb3VyIE5hbWUnLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9LFxuICAvLyAgICAgICAgIHNpemU6IDEyXG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICB0eXBlOiAnVGV4dCcsXG4gIC8vICAgICAgICAgcXVlc3Rpb25UZXh0OiAnRmVlZGJhY2snLFxuICAvLyAgICAgICAgIHN0eWxlOiB7IHNob3dMYWJlbDogdHJ1ZSB9LFxuICAvLyAgICAgICAgIHNpemU6IDEyXG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgIHtcbiAgLy8gICAgICAgICB0eXBlOiAnVGFibGUnLFxuICAvLyAgICAgICAgIHF1ZXN0aW9uVGV4dDogJ1NlcnZpY2UgUmF0aW5ncycsXG4gIC8vICAgICAgICAgZmllbGRzTWV0YTogSlNPTi5zdHJpbmdpZnkoW1xuICAvLyAgICAgICAgICAge1xuICAvLyAgICAgICAgICAgICBsYWJlbDogJ1NlcnZpY2UnLFxuICAvLyAgICAgICAgICAgICBmaWVsZE5hbWU6ICdzZXJ2aWNlJyxcbiAgLy8gICAgICAgICAgICAgdHlwZTogJ1RleHQnLFxuICAvLyAgICAgICAgICAgICB1bmlxdWVJZGVudGlmaWVyOiAnZmIxJ1xuICAvLyAgICAgICAgICAgfSxcbiAgLy8gICAgICAgICAgIHtcbiAgLy8gICAgICAgICAgICAgbGFiZWw6ICdSYXRpbmcgKDEtNSknLFxuICAvLyAgICAgICAgICAgICBmaWVsZE5hbWU6ICdyYXRpbmcnLFxuICAvLyAgICAgICAgICAgICB0eXBlOiAnTnVtYmVyJyxcbiAgLy8gICAgICAgICAgICAgdW5pcXVlSWRlbnRpZmllcjogJ2ZiMidcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICBdKSxcbiAgLy8gICAgICAgICB0YWJsZUNvbmZpZzoge1xuICAvLyAgICAgICAgICAgaXNOb3NJbmRpY2F0b3I6IGZhbHNlLFxuICAvLyAgICAgICAgICAgYWRkSW5saW5lUmVjb3JkOiB0cnVlLFxuICAvLyAgICAgICAgICAgaXNQYWdpbmF0aW9uOiBmYWxzZVxuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfVxuICAvLyAgICAgXVxuICAvLyAgIH1cbiAgLy8gXTtcbiAgXG4gIHRlbXBsYXRlcyA9IFtdO1xuICBcbiAgdW5pcXVlX2lkOiBhbnk7XG4gIGJvb2s6IGFueTtcbiAgZm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5ld0Jvb2soKTsgXG4gIH1cbiAgZ2V0VGVtcGxhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcztcbiAgfVxuICBpbml0aWFsaXplRWxlbWVudEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUVsZW1lbnQ6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgdW5pcXVlX2lkID0gdXVpZHY0KCk7XG4gICAgY29uc3QgYmFzZUVsZW1lbnQgPSB7XG4gICAgICBpZDogdW5pcXVlX2lkLFxuICAgICAgdWlkOiB1bmlxdWVfaWQsXG4gICAgICB0eXBlOiB0ZW1wbGF0ZUVsZW1lbnQudHlwZSxcbiAgICAgIG5hbWU6IG51bGwsXG4gICAgICBxdWVzdGlvblRleHQ6IHRlbXBsYXRlRWxlbWVudC5xdWVzdGlvblRleHQgfHwgbnVsbCxcbiAgICAgIHF1ZXN0aW9uOiB0ZW1wbGF0ZUVsZW1lbnQucXVlc3Rpb24gfHwgbnVsbCxcbiAgICAgIGhlbHBUZXh0OiBudWxsLFxuICAgICAgZXJyb3JNZXNzYWdlOiBudWxsLFxuICAgICAgaXNSZWFkT25seTogZmFsc2UsXG4gICAgICBpc0hpZGRlbjogZmFsc2UsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICByZWZlcmVuY2VGaWVsZDogbnVsbCxcbiAgICAgIGFkZGl0aW9uYWxSaWNoQ29udGVudDogbnVsbCxcbiAgICAgIGdyb3VwTmFtZTogbnVsbCxcbiAgICAgIGlzRGF0ZUJhY2t3YXJkOiBmYWxzZSxcbiAgICAgIHRpdGxlOiBudWxsLFxuICAgICAgc3ViVGl0bGU6IG51bGwsXG4gICAgICBzaXplOiB0ZW1wbGF0ZUVsZW1lbnQuc2l6ZSB8fCAxMixcbiAgICAgIGlzRGF0ZUZvcndhcmQ6IGZhbHNlLFxuICAgICAgaXNPcHRpb25hbDogZmFsc2UsXG4gICAgICBpc1RpdGxlOiBmYWxzZSxcbiAgICAgIG5leHRRdWVzdGlvbjogbnVsbCxcbiAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogbnVsbCxcbiAgICAgIHF1ZXN0aW9uTnVtYmVyOiBpbmRleCArIDEsXG4gICAgICBvcmRlcjogaW5kZXggKyAxLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgbGFiZWxDbGFzczogbnVsbCxcbiAgICAgICAgbGFiZWxTdHlsZTogbnVsbCxcbiAgICAgICAgbGFiZWxWYWx1ZVN0eWxlOiBudWxsLFxuICAgICAgICBpbnB1dENsYXNzOiBudWxsLFxuICAgICAgICBpbnB1dFN0eWxlOiBudWxsLFxuICAgICAgICBzaG93TGFiZWw6IHRlbXBsYXRlRWxlbWVudD8uc3R5bGU/LnNob3dMYWJlbCA/PyB0cnVlLFxuICAgICAgICBib29rU3R5bGU6IG51bGwsXG4gICAgICAgIGRpcmVjdGlvbjogJ2x0cicsXG4gICAgICAgIHF1ZXN0aW9uU3R5bGU6IG51bGwsXG4gICAgICB9LFxuICAgICAgc3ViVGV4dDoge1xuICAgICAgICBlbmRwb2ludDogbnVsbCxcbiAgICAgICAgdmFyaWFibGU6IG51bGwsXG4gICAgICAgIGZpZWxkOiBudWxsLFxuICAgICAgICBkZWZhdWx0RmllbGQ6IG51bGwsXG4gICAgICAgIHNvdXJjZVF1ZXN0aW9uSWQ6IG51bGwsXG4gICAgICAgIHZhbHVlRmllbGQ6IG51bGwsXG4gICAgICAgIGxhYmVsRmllbGQ6IG51bGwsXG4gICAgICAgIGlzRGVwZW5kZW50RmllbGQ6IGZhbHNlLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZTogbnVsbCxcbiAgICAgICAgcXVlcnlGaWVsZDogbnVsbCxcbiAgICAgICAgcXVlcnlWYWx1ZTogbnVsbCxcbiAgICAgICAgcXVlcnlWYWx1ZVJlZmVyZW5jZTogbnVsbCxcbiAgICAgICAgdW5pcXVlS2V5OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGltYWdlRGF0YTogbnVsbCxcbiAgICAgIGJvb2xlYW46IGZhbHNlLFxuICAgICAgb3B0aW9uczogdGVtcGxhdGVFbGVtZW50Lm9wdGlvbnNcbiAgICAgICAgPyB0aGlzLmluaXRpYWxpemVPcHRpb25zKHRlbXBsYXRlRWxlbWVudC5vcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICBpbWFnZVNpemU6XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudC50eXBlID09PSAnSW1hZ2UnID8geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDE1MCB9IDogbnVsbCxcbiAgICAgIHRhYmxlQ29uZmlnOiB0ZW1wbGF0ZUVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IHtcbiAgICAgICAgaXNOb3NJbmRpY2F0b3I6IHRydWUsXG4gICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgaXNQYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBhY3Rpb25CdXR0b246IHRydWUsXG4gICAgICAgIGlzRGVsZXRlUm93OiB0cnVlLFxuICAgICAgICBpc0VkaXRSb3c6IHRydWUsXG4gICAgICAgIHNlYXJjaEJhcjogdHJ1ZSxcbiAgICAgICAgaXNCdXR0b25zOiB0cnVlLFxuICAgICAgICBpdGVtc1BlclBhZ2U6IDEwLFxuICAgICAgfSA6IG51bGwsXG4gICAgICBmaWVsZHNNZXRhOiB0ZW1wbGF0ZUVsZW1lbnQuZmllbGRzTWV0YVxuICAgICAgICA/IHRoaXMuaW5pdGlhbGl6ZUZpZWxkc01ldGEodGVtcGxhdGVFbGVtZW50LmZpZWxkc01ldGEpXG4gICAgICAgIDogbnVsbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgLi4uYmFzZUVsZW1lbnQsIC4uLnRlbXBsYXRlRWxlbWVudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW9ucyhvcHRpb25zOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICAuLi5vcHRpb24sXG4gICAgICBpZDogdXVpZHY0KClcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGaWVsZHNNZXRhKGZpZWxkc01ldGE6IHN0cmluZyk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZmllbGRzTWV0YSk7XG4gICAgICByZXR1cm4gcGFyc2VkLm1hcCgoZmllbGQ6IGFueSkgPT4gKHtcbiAgICAgICAgLi4uZmllbGQsXG4gICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6IHV1aWR2NCgpXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBmaWVsZHNNZXRhOicsIGUpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuLy8gSW4gVGVtcGxhdGVTZXJ2aWNlXG5kb3dubG9hZCgpIHtcbiAgaWYgKCF0aGlzLmZvcm1FbGVtZW50cyB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmZvcm1FbGVtZW50cykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGZvcm1FbGVtZW50cycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ2xlYW4gZWxlbWVudHMgZm9yIGV4cG9ydCAoc2FtZSBhcyBGb3JtQnVpbGRlclNlcnZpY2UpXG4gIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgLy8gUmVtb3ZlIHFiUmVmZXJlbmNlUXVlc3Rpb25zIGZvciAnYm9vaycgdHlwZVxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdib29rJykge1xuICAgICAgZGVsZXRlIGVsZW1lbnQucWJSZWZlcmVuY2VRdWVzdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBzdWJUZXh0IHRvIG1hdGNoIEZvcm1CdWlsZGVyU2VydmljZSdzIGZvcm1hdFxuICAgIGlmIChlbGVtZW50LnN1YlRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENvbnZlcnQgc3ViVGV4dCB0byBvYmplY3QgaWYgc3RyaW5nXG4gICAgICAgIGVsZW1lbnQuc3ViVGV4dCA9IHR5cGVvZiBlbGVtZW50LnN1YlRleHQgPT09ICdzdHJpbmcnIFxuICAgICAgICAgID8gSlNPTi5wYXJzZShlbGVtZW50LnN1YlRleHQpIFxuICAgICAgICAgIDogey4uLmVsZW1lbnQuc3ViVGV4dH07XG5cbiAgICAgICAgLy8gQ29udmVydCBmaWVsZCB0byBhcnJheSBpZiBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnN1YlRleHQuZmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZWxlbWVudC5zdWJUZXh0LmZpZWxkID0gZWxlbWVudC5zdWJUZXh0LmZpZWxkLnNwbGl0KCcsJykubWFwKGkgPT4gaS50cmltKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RyaW5naWZ5IHN1YlRleHQgZm9yIHN0b3JhZ2VcbiAgICAgICAgZWxlbWVudC5zdWJUZXh0ID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudC5zdWJUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBzdWJUZXh0OicsIGUpO1xuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSAne30nO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gVXBkYXRlIGJvb2sgc3RydWN0dXJlIChzYW1lIGFzIEZvcm1CdWlsZGVyU2VydmljZSlcbiAgaWYgKCF0aGlzLmJvb2spIHRoaXMubmV3Qm9vaygpOyAvLyBFbnN1cmUgYm9vayBleGlzdHNcbiAgXG4gIGlmICh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcCAmJiB0aGlzLnVuaXF1ZV9pZCkge1xuICAgIHRoaXMuYm9vay5ib29rUXVlc3Rpb25zTWFwW3RoaXMudW5pcXVlX2lkXS5zdWJRdWVzdGlvbnMgPSB0aGlzLmZvcm1FbGVtZW50cztcbiAgfVxuXG4gIC8vIFByZXBhcmUgc3FPcHRpb25zIChzYW1lIGZvcm1hdCBhcyBGb3JtQnVpbGRlclNlcnZpY2UpXG4gIGNvbnN0IHNxT3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGlmIChbJ0Ryb3Bkb3duJywgJ1JhZGlvJywgJ0NoZWNrYm94J10uaW5jbHVkZXMoZWxlbWVudC50eXBlKSkge1xuICAgICAgc3FPcHRpb25zW2VsZW1lbnQuaWRdID0ge1xuICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICBvcHRpb25zOiBlbGVtZW50Lm9wdGlvbnM/Lm1hcChvcHQgPT4gKHtcbiAgICAgICAgICAuLi5vcHQsXG4gICAgICAgICAgLy8gRW5zdXJlIFVVSURzIGFyZSBwcmVzZXJ2ZWRcbiAgICAgICAgICBpZDogb3B0LmlkIHx8IHV1aWR2NCgpLFxuICAgICAgICAgIHVuaXF1ZUlkZW50aWZpZXI6IG9wdC51bmlxdWVJZGVudGlmaWVyIHx8IHV1aWR2NCgpXG4gICAgICAgIH0pKSB8fCBbXVxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuYm9vay5zcU9wdGlvbnMgPSBzcU9wdGlvbnM7XG4gIFxuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmJvb2spKTsgLy8gUmV0dXJuIGNsZWFuIGNvcHlcbn1cblxuLy8gQWRkIHRoZSBuZXdCb29rKCkgbWV0aG9kIGlmIG1pc3NpbmdcbnByaXZhdGUgbmV3Qm9vaygpIHtcbiAgdGhpcy51bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgdGhpcy5ib29rID0ge1xuICAgIGJvb2tRdWVzdGlvbnNNYXA6IHtcbiAgICAgIFt0aGlzLnVuaXF1ZV9pZF06IHtcbiAgICAgICAgc3ViUXVlc3Rpb25zOiBbXSxcbiAgICAgICAgdHlwZTogJ0Jvb2snXG4gICAgICB9XG4gICAgfSxcbiAgICBxdWVzdGlvbmJvb2s6IHtcbiAgICAgIGFjdGlvbjogSlNPTi5zdHJpbmdpZnkoW1xuICAgICAgICB7IG5hbWU6IFwiQ2FuY2VsXCIsIGV2ZW50dG9lbWl0OiBcImNsb3NlXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIlNhdmVcIiwgZXZlbnR0b2VtaXQ6IFwic3VibWl0XCIsIG1ldGhvZDogXCJQT1NUXCIgfVxuICAgICAgXSlcbiAgICB9LFxuICAgIHJlY29yZHM6IFt7XG4gICAgICBpZDogdGhpcy51bmlxdWVfaWQsXG4gICAgICB0aXRsZTogJ1VudGl0bGVkIFRlbXBsYXRlJyxcbiAgICAgIHN1YlF1ZXN0aW9uczogW11cbiAgICB9XVxuICB9O1xufVxuICBcbiAgXG59XG4iXX0=