ngx-surveys
Version:
Angular 18+ survey / form builder
308 lines • 46.5 kB
JavaScript
import { Injectable } from '@angular/core';
import * as _ from 'lodash';
import { ReplaySubject } from 'rxjs';
import * as i0 from "@angular/core";
export class NgxSurveyService {
constructor() {
this.onFilesSelected = new ReplaySubject(1);
this.errorMessages = {
require: "Field required",
minLength: "Must be more than {value} characters",
maxLength: "Must be less than {value} characters",
setLength: "{value} Digit Number Required",
numeric: "The entry can only contain numbers",
email: "Not valid email"
};
}
initForm(form, formValues) {
//console.log(form, formValues);
form.forEach(section => {
if (section.name) {
const groupedItems = _.groupBy(_.filter(section.items, item => !item.name), item => item.type);
_.each(groupedItems, (items, type) => {
if (type) {
section.items[_.indexOf(section.items, _.first(items))] = {
type: type,
items: items,
name: section.name,
isSectionValueItem: true,
};
_.each(items, (item) => {
section.items = _.without(section.items, item);
});
}
});
}
});
const visibilityValuesInTableConvert = (item) => {
if (item.visibilityValuesInTable) {
const tableItem = _.first(_.map(form, (section) => {
return _.find(section.items, (item) => {
if (!item.items) {
return item.actionUpdatesTableValue;
}
else {
return _.find(item.items, item => item.actionUpdatesTableValue);
}
});
}));
const newValues = [];
if (tableItem) {
_.each(item.visibilityValuesInTable, (val) => {
let valItem = _.find(tableItem.items, item => item.title === val);
newValues.push(valItem && valItem.optionValue ? valItem.optionValue : val);
});
}
item.visibilityValuesInTable = newValues;
}
};
_.each(form, (section) => {
visibilityValuesInTableConvert(section);
_.each(section.items, (item) => {
visibilityValuesInTableConvert(item);
if (item.type === 'radio' && section.allowsMultipleSelection) {
item.multiple = true;
}
if (item.multiple && _.isString(item.value)) {
if (_.isString(item.value)) {
try {
item.value = JSON.parse(item.value);
}
catch (err) {
console.log(err);
}
}
}
if (formValues[item.name] !== undefined) {
item.value = formValues[item.name];
if (item.type === 'date' && !_.isString(item.value)) {
//item.value = this.getDateStr(formValues[item.name]);
}
//item.readOnly = item.readOnly || _.contains(this.readOnlyFields, item.name);
if (item.multiple && _.isString(item.value)) {
item.value = JSON.parse(item.value);
}
if (item.type === 'numericRating' && _.isString(item.value)) {
item.value = parseInt(item.value);
}
}
if (item.isSectionValueItem && section.sectionValidation && !item.fieldValidation) {
item.fieldValidation = section.sectionValidation;
}
});
if (section.subtitle) {
section.subtitle = section.subtitle.replace(new RegExp('\n', 'g'), '<br />');
}
});
//console.log(form);
return form;
}
isItemVisible(form, section, item) {
let res = true;
if (item.visibilityValuesInSection && item.visibilityValuesInSection.length) {
let sectionItems = section.items?.filter(item => item.isSectionValueItem).length ? section.items?.filter(item => item.isSectionValueItem) : section.items?.filter(item => item.actionUpdatesSectionValue);
res = sectionItems.filter((sItem) => {
const valArr = _.isArray(sItem.value) ? sItem.value : [sItem.value];
return valArr.find(val => item.visibilityValuesInSection.find(arr => arr.indexOf(val) >= 0));
}).length === item.visibilityValuesInSection.length;
}
if (item.visibilityValuesInTable && item.visibilityValuesInTable.length) {
let tableItem = _.first(_.map(form, (section) => {
return _.find(section.items, (item) => {
if (!item.items) {
return item.actionUpdatesTableValue;
}
else {
return _.find(item.items, item => item.actionUpdatesTableValue);
}
});
}));
if (tableItem) {
res = item.visibilityValuesInTable.indexOf(tableItem.value) >= 0;
}
}
if (section.visibilityValuesInTable && section.visibilityValuesInTable.length) {
let sectionTableItem = _.first(_.map(form, (section) => {
return _.find(section.items, (item) => {
if (!item.items) {
return item.actionReloadsTable;
}
else {
return _.find(item.items, item => item.actionReloadsTable);
}
});
}));
if (sectionTableItem) {
res = section.visibilityValuesInTable.indexOf(sectionTableItem.value) >= 0;
}
}
return res;
}
;
isSectionVisible(form, section) {
let res = false;
_.each(section.items, (item) => {
if (this.isItemVisible(form, section, item)) {
res = true;
}
});
return !section.items ? this.isItemVisible(form, section, {}) : res;
}
;
getErrors(item) {
if (item.fieldValidations) {
let errors = [];
_.each(item.fieldValidations.rules, (rule) => {
const err = this.checkValidationRule(item, rule);
if (err) {
errors.push(err);
}
});
errors = _.flatten(errors);
if (item.fieldValidations.type === 'OR') {
return errors.length === item.fieldValidations.rules.length ? [errors[errors.length - 1]] : [];
}
return errors;
}
const err = this.checkValidationRule(item, item.fieldValidation);
return err ? [err] : [];
}
;
checkValidationRule(item, rule) {
let res;
let errorMessages = _.clone(this.errorMessages);
//console.log(item);
if (rule && rule.minLength >= 0 && rule.minLength === rule.maxLength) {
rule.setLength = rule.maxLength;
delete rule.minLength;
delete rule.maxLength;
}
let validationObj = rule || item.sectionValidation;
let isNumericError = !/^\d+$/.test(item.value) && validationObj && validationObj.numeric;
if (!validationObj) {
//console.log('!validationObj', item);
}
if (item.type === 'label') {
return res;
}
_.each(validationObj, (param, name) => {
if (name === 'minCount') {
name = 'minLength';
}
let message = '';
let itemValue = '' + item.value;
switch (name) {
case "setLength":
if (item.value === undefined || (item.value && itemValue.length !== param) || isNumericError) {
message = errorMessages[name].replace('{value}', param);
if (item.keyboardType && item.keyboardType === 'number-pad') {
message = message.replace('characters', 'digits');
}
res = {
type: name,
message: message
};
}
else if (item.value === null) {
//console.log(item);
res = {
type: 'require',
message: errorMessages.require
};
}
break;
case "minLength":
if (!_.isObject(item.value) && (item.value === null || item.value === undefined || !item.value || (item.value?.length || 0) < param || isNumericError)) {
//console.log(isNumericError, param, item, rule, name);
if (param > 1) {
message = errorMessages[name].replace('{value}', param);
if (item.keyboardType && item.keyboardType === 'number-pad') {
message = message.replace('characters', 'digits');
}
res = {
type: name,
message: message
};
}
else if (!item.value || !item?.value?.length) {
//console.log(item);
res = {
type: 'require',
message: errorMessages.require
};
}
else if (isNumericError) {
res = {
type: 'numeric',
message: errorMessages.numeric
};
}
}
if (item.name === 'email' && !res?.length) {
let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if (!re.test(item.value)) {
res = {
type: 'email',
message: errorMessages.email
};
}
}
break;
case "optionKeyValues":
if (!item.value || !item.value.length) {
res = {
type: 'require',
message: errorMessages.require
};
}
else {
if (item.value.find(op => !op.optionValue || !op.label)) {
res = {
type: 'require',
message: 'All options should have Value and Labels defined'
};
}
}
break;
default:
break;
}
});
return res;
}
;
getValue(form, validateAll = false) {
let value = {};
let valid = true;
let firstError;
_.each(_.filter(form, (section) => this.isSectionVisible(form, section)), (section) => {
_.each(_.filter(section.items, (item) => this.isItemVisible(form, section, item)), (item) => {
//value[item.name] = _.isArray(item.value) ? JSON.stringify(item.value) : item.value;
value[item.name] = item.value;
if (validateAll) {
item.errors = this.getErrors(item);
if (item.errors && item.errors.length) {
if (!firstError) {
firstError = item;
}
valid = false;
}
}
});
});
return {
valid,
value,
firstError
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NgxSurveyService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1cnZleS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1cnZleXMvc3JjL2xpYi9uZ3gtc3VydmV5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtyQyxNQUFNLE9BQU8sZ0JBQWdCO0lBRXpCO1FBSU8sb0JBQWUsR0FBZ0MsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEUsa0JBQWEsR0FBTztZQUN2QixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFNBQVMsRUFBRSxzQ0FBc0M7WUFDakQsU0FBUyxFQUFFLHNDQUFzQztZQUNqRCxTQUFTLEVBQUUsK0JBQStCO1lBQzFDLE9BQU8sRUFBRSxvQ0FBb0M7WUFDN0MsS0FBSyxFQUFFLGlCQUFpQjtTQUMzQixDQUFDO0lBWEYsQ0FBQztJQWFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVTtRQUM1QixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUEsRUFBRTtZQUNsQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUEsRUFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQSxFQUFFLENBQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzRixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRTtvQkFDaEMs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QUFFLENBQUMsSUFBSSxFQUFDLEVBQUUsQ0FBQSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBQyxFQUFFO2dCQUNyRixxRkFBcUY7Z0JBRXJGLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxXQUFXLEVBQUMsQ0FBQztvQkFDYixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQzt3QkFDdEIsQ0FBQzt3QkFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNsQixDQUFDO2dCQUNMLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNILEtBQUs7WUFDTCxLQUFLO1lBQ0wsVUFBVTtTQUNiLENBQUM7SUFDTixDQUFDOytHQXRUUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZmLE1BQU07OzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtSXRlbUVycm9yLCBTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9mb3JtLWl0ZW0nO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hTdXJ2ZXlTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIG9uRmlsZXNTZWxlY3RlZDogUmVwbGF5U3ViamVjdDxTdXJ2ZXlGaWxlW10+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgICBwdWJsaWMgZXJyb3JNZXNzYWdlczogYW55PSB7XG4gICAgICAgIHJlcXVpcmU6IFwiRmllbGQgcmVxdWlyZWRcIixcbiAgICAgICAgbWluTGVuZ3RoOiBcIk11c3QgYmUgbW9yZSB0aGFuIHt2YWx1ZX0gY2hhcmFjdGVyc1wiLFxuICAgICAgICBtYXhMZW5ndGg6IFwiTXVzdCBiZSBsZXNzIHRoYW4ge3ZhbHVlfSBjaGFyYWN0ZXJzXCIsXG4gICAgICAgIHNldExlbmd0aDogXCJ7dmFsdWV9IERpZ2l0IE51bWJlciBSZXF1aXJlZFwiLFxuICAgICAgICBudW1lcmljOiBcIlRoZSBlbnRyeSBjYW4gb25seSBjb250YWluIG51bWJlcnNcIixcbiAgICAgICAgZW1haWw6IFwiTm90IHZhbGlkIGVtYWlsXCJcbiAgICB9O1xuXG4gICAgcHVibGljIGluaXRGb3JtKGZvcm0sIGZvcm1WYWx1ZXMpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmb3JtLCBmb3JtVmFsdWVzKTtcbiAgICAgICAgZm9ybS5mb3JFYWNoKHNlY3Rpb249PntcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkSXRlbXMgPSBfLmdyb3VwQnkoXy5maWx0ZXIoc2VjdGlvbi5pdGVtcywgaXRlbT0+IWl0ZW0ubmFtZSksIGl0ZW09Pml0ZW0udHlwZSk7XG5cbiAgICAgICAgICAgICAgICBfLmVhY2goZ3JvdXBlZEl0ZW1zLCAoaXRlbXMsIHR5cGUpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLml0ZW1zW18uaW5kZXhPZihzZWN0aW9uLml0ZW1zLCBfLmZpcnN0KGl0ZW1zKSldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25WYWx1ZUl0ZW06IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGl0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLml0ZW1zID0gXy53aXRob3V0KHNlY3Rpb24uaXRlbXMsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBjb25zdCB2aXNpYmlsaXR5VmFsdWVzSW5UYWJsZUNvbnZlcnQgPSAoaXRlbSk9PntcbiAgICAgICAgICAgIGlmIChpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVJdGVtID0gXy5maXJzdChfLm1hcChmb3JtLCAoc2VjdGlvbik9PntcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZmluZChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmFjdGlvblVwZGF0ZXNUYWJsZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKGl0ZW0uaXRlbXMsIGl0ZW09Pml0ZW0uYWN0aW9uVXBkYXRlc1RhYmxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gPGFueVtdPltdO1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgXy5lYWNoKGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luVGFibGUsICh2YWwpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsSXRlbSA9IF8uZmluZCh0YWJsZUl0ZW0uaXRlbXMsIGl0ZW09Pml0ZW0udGl0bGU9PT12YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWVzLnB1c2godmFsSXRlbSAmJiB2YWxJdGVtLm9wdGlvblZhbHVlID8gdmFsSXRlbS5vcHRpb25WYWx1ZSA6IHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlID0gbmV3VmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIF8uZWFjaChmb3JtLCAoc2VjdGlvbik9PntcbiAgICAgICAgICAgIHZpc2liaWxpdHlWYWx1ZXNJblRhYmxlQ29udmVydChzZWN0aW9uKTtcbiAgICAgICAgICAgIF8uZWFjaChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5VmFsdWVzSW5UYWJsZUNvbnZlcnQoaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3JhZGlvJyAmJiBzZWN0aW9uLmFsbG93c011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5tdWx0aXBsZSAmJiBfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlc1tpdGVtLm5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IGZvcm1WYWx1ZXNbaXRlbS5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2RhdGUnICYmICFfLmlzU3RyaW5nKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2l0ZW0udmFsdWUgPSB0aGlzLmdldERhdGVTdHIoZm9ybVZhbHVlc1tpdGVtLm5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2l0ZW0ucmVhZE9ubHkgPSBpdGVtLnJlYWRPbmx5IHx8IF8uY29udGFpbnModGhpcy5yZWFkT25seUZpZWxkcywgaXRlbS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubXVsdGlwbGUgJiYgXy5pc1N0cmluZyhpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbnVtZXJpY1JhdGluZycgJiYgXy5pc1N0cmluZyhpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHBhcnNlSW50KGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzU2VjdGlvblZhbHVlSXRlbSAmJiBzZWN0aW9uLnNlY3Rpb25WYWxpZGF0aW9uICYmICFpdGVtLmZpZWxkVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmZpZWxkVmFsaWRhdGlvbiA9IHNlY3Rpb24uc2VjdGlvblZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb24uc3VidGl0bGUgPSBzZWN0aW9uLnN1YnRpdGxlLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxuJywgJ2cnKSwgJzxiciAvPicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhmb3JtKTtcbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgcHVibGljIGlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkge1xuICAgICAgICBsZXQgcmVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luU2VjdGlvbiAmJiBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgc2VjdGlvbkl0ZW1zID0gc2VjdGlvbi5pdGVtcz8uZmlsdGVyKGl0ZW09Pml0ZW0uaXNTZWN0aW9uVmFsdWVJdGVtKS5sZW5ndGggPyBzZWN0aW9uLml0ZW1zPy5maWx0ZXIoaXRlbT0+aXRlbS5pc1NlY3Rpb25WYWx1ZUl0ZW0pIDogc2VjdGlvbi5pdGVtcz8uZmlsdGVyKGl0ZW09Pml0ZW0uYWN0aW9uVXBkYXRlc1NlY3Rpb25WYWx1ZSk7XG5cbiAgICAgICAgICAgIHJlcyA9IHNlY3Rpb25JdGVtcy5maWx0ZXIoKHNJdGVtKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbEFycj1fLmlzQXJyYXkoc0l0ZW0udmFsdWUpID8gc0l0ZW0udmFsdWUgOiBbc0l0ZW0udmFsdWVdO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxBcnIuZmluZCh2YWw9PlxuICAgICAgICAgICAgICAgICAgICBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24uZmluZChhcnI9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLmluZGV4T2YodmFsKT49MFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5sZW5ndGg9PT1pdGVtLnZpc2liaWxpdHlWYWx1ZXNJblNlY3Rpb24ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlICYmIGl0ZW0udmlzaWJpbGl0eVZhbHVlc0luVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgdGFibGVJdGVtID0gXy5maXJzdChfLm1hcChmb3JtLCAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoc2VjdGlvbi5pdGVtcywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5hY3Rpb25VcGRhdGVzVGFibGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmZpbmQoaXRlbS5pdGVtcywgaXRlbT0+aXRlbS5hY3Rpb25VcGRhdGVzVGFibGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmICh0YWJsZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXMgPSBpdGVtLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlLmluZGV4T2YodGFibGVJdGVtLnZhbHVlKT49MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWN0aW9uLnZpc2liaWxpdHlWYWx1ZXNJblRhYmxlICYmIHNlY3Rpb24udmlzaWJpbGl0eVZhbHVlc0luVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgc2VjdGlvblRhYmxlSXRlbSA9IF8uZmlyc3QoXy5tYXAoZm9ybSwgKHNlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5maW5kKHNlY3Rpb24uaXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWN0aW9uUmVsb2Fkc1RhYmxlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZmluZChpdGVtLml0ZW1zLCBpdGVtPT5pdGVtLmFjdGlvblJlbG9hZHNUYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uVGFibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gc2VjdGlvbi52aXNpYmlsaXR5VmFsdWVzSW5UYWJsZS5pbmRleE9mKHNlY3Rpb25UYWJsZUl0ZW0udmFsdWUpPj0wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgcHVibGljIGlzU2VjdGlvblZpc2libGUoZm9ybSwgc2VjdGlvbikge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG4gICAgICAgIF8uZWFjaChzZWN0aW9uLml0ZW1zLCAoaXRlbSk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICFzZWN0aW9uLml0ZW1zID8gdGhpcy5pc0l0ZW1WaXNpYmxlKGZvcm0sIHNlY3Rpb24sIHt9KSA6IHJlcztcbiAgICB9O1xuXG4gICAgZ2V0RXJyb3JzKGl0ZW0pOiBGb3JtSXRlbUVycm9yW10ge1xuICAgICAgICBpZiAoaXRlbS5maWVsZFZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JzID0gPEZvcm1JdGVtRXJyb3IgW10+IFtdO1xuICAgICAgICAgICAgXy5lYWNoKGl0ZW0uZmllbGRWYWxpZGF0aW9ucy5ydWxlcywgKHJ1bGUpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gIDxGb3JtSXRlbUVycm9yPiB0aGlzLmNoZWNrVmFsaWRhdGlvblJ1bGUoaXRlbSwgcnVsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXJyb3JzID0gXy5mbGF0dGVuKGVycm9ycyk7XG4gICAgICAgICAgICBpZiAoaXRlbS5maWVsZFZhbGlkYXRpb25zLnR5cGUgPT09ICdPUicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA9PT0gaXRlbS5maWVsZFZhbGlkYXRpb25zLnJ1bGVzLmxlbmd0aCA/IFtlcnJvcnNbZXJyb3JzLmxlbmd0aC0xXV0gOiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyPXRoaXMuY2hlY2tWYWxpZGF0aW9uUnVsZShpdGVtLCBpdGVtLmZpZWxkVmFsaWRhdGlvbik7XG4gICAgICAgIHJldHVybiBlcnIgPyBbZXJyXSA6IFtdO1xuICAgIH07XG5cbiAgICBjaGVja1ZhbGlkYXRpb25SdWxlKGl0ZW0sIHJ1bGUpIDogRm9ybUl0ZW1FcnJvciB7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2VzPV8uY2xvbmUodGhpcy5lcnJvck1lc3NhZ2VzKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtKTtcbiAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5taW5MZW5ndGggPj0gMCAmJiBydWxlLm1pbkxlbmd0aCA9PT0gcnVsZS5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHJ1bGUuc2V0TGVuZ3RoID0gcnVsZS5tYXhMZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgcnVsZS5taW5MZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgcnVsZS5tYXhMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbGlkYXRpb25PYmogPSBydWxlIHx8IGl0ZW0uc2VjdGlvblZhbGlkYXRpb247XG4gICAgICAgIGxldCBpc051bWVyaWNFcnJvciA9ICEvXlxcZCskLy50ZXN0KGl0ZW0udmFsdWUpICYmIHZhbGlkYXRpb25PYmogJiYgdmFsaWRhdGlvbk9iai5udW1lcmljO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb25PYmopIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJyF2YWxpZGF0aW9uT2JqJywgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0udHlwZT09PSdsYWJlbCcpe1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIF8uZWFjaCh2YWxpZGF0aW9uT2JqLCAocGFyYW0sIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnbWluQ291bnQnKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9ICdtaW5MZW5ndGgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgIGxldCBpdGVtVmFsdWUgPSAnJyArIGl0ZW0udmFsdWU7XG5cbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzZXRMZW5ndGhcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoaXRlbS52YWx1ZSAmJiBpdGVtVmFsdWUubGVuZ3RoICE9PSBwYXJhbSkgfHwgaXNOdW1lcmljRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2VzW25hbWVdLnJlcGxhY2UoJ3t2YWx1ZX0nLCBwYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlib2FyZFR5cGUgJiYgaXRlbS5rZXlib2FyZFR5cGUgPT09ICdudW1iZXItcGFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ2NoYXJhY3RlcnMnLCAnZGlnaXRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVxdWlyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcy5yZXF1aXJlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtaW5MZW5ndGhcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzT2JqZWN0KGl0ZW0udmFsdWUpICYmIChpdGVtLnZhbHVlID09PSBudWxsIHx8IGl0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXRlbS52YWx1ZSB8fCAoaXRlbS52YWx1ZT8ubGVuZ3RoIHx8IDApIDwgcGFyYW0gfHwgaXNOdW1lcmljRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGlzTnVtZXJpY0Vycm9yLCBwYXJhbSwgaXRlbSwgcnVsZSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZXNbbmFtZV0ucmVwbGFjZSgne3ZhbHVlfScsIHBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlib2FyZFR5cGUgJiYgaXRlbS5rZXlib2FyZFR5cGUgPT09ICdudW1iZXItcGFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCdjaGFyYWN0ZXJzJywgJ2RpZ2l0cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWl0ZW0udmFsdWUgfHwgIWl0ZW0/LnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcy5yZXF1aXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTnVtZXJpY0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzLm51bWVyaWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09ICdlbWFpbCcgJiYgIXJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmUgPSAvXigoW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmUudGVzdChpdGVtLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXMuZW1haWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvcHRpb25LZXlWYWx1ZXNcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnZhbHVlIHx8ICFpdGVtLnZhbHVlLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXM9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzLnJlcXVpcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZS5maW5kKG9wPT4hb3Aub3B0aW9uVmFsdWUgfHwgIW9wLmxhYmVsKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWxsIG9wdGlvbnMgc2hvdWxkIGhhdmUgVmFsdWUgYW5kIExhYmVscyBkZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWUoZm9ybSwgdmFsaWRhdGVBbGw6Ym9vbGVhbj1mYWxzZSl7XG4gICAgICAgIGxldCB2YWx1ZSA9IHt9O1xuICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgICAgICBsZXQgZmlyc3RFcnJvcjtcbiAgICAgICAgXy5lYWNoKF8uZmlsdGVyKGZvcm0sIChzZWN0aW9uKT0+dGhpcy5pc1NlY3Rpb25WaXNpYmxlKGZvcm0sIHNlY3Rpb24pKSwgKHNlY3Rpb24pPT57XG4gICAgICAgICAgICBfLmVhY2goXy5maWx0ZXIoc2VjdGlvbi5pdGVtcywgKGl0ZW0pPT50aGlzLmlzSXRlbVZpc2libGUoZm9ybSwgc2VjdGlvbiwgaXRlbSkpLCAoaXRlbSk9PntcbiAgICAgICAgICAgICAgICAvL3ZhbHVlW2l0ZW0ubmFtZV0gPSBfLmlzQXJyYXkoaXRlbS52YWx1ZSkgPyBKU09OLnN0cmluZ2lmeShpdGVtLnZhbHVlKSA6IGl0ZW0udmFsdWU7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZVtpdGVtLm5hbWVdID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVBbGwpe1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycyA9IHRoaXMuZ2V0RXJyb3JzKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5lcnJvcnMgJiYgaXRlbS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEVycm9yID0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWxpZCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZmlyc3RFcnJvclxuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==