ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
207 lines • 26.8 kB
JavaScript
import { EventEmitter } from '@angular/core';
import { Util } from '../../../util/util';
export class OFormCacheClass {
constructor(form) {
this.form = form;
this.initialDataCache = {};
this.valueChangesStack = [];
this._componentsSubscritpions = {};
this.blockCaching = false;
this.initializedCache = false;
this.onCacheStateChanges = new EventEmitter();
this.changedFormControls = [];
}
updateFormDataCache() {
this.formDataCache = this.form.getRegisteredFieldsValues();
}
addChangeToStack(comp) {
const currentValue = comp.getFormControl().value;
this.valueChangesStack.push({
attr: comp.getAttribute(),
value: currentValue
});
this.onCacheStateChanges.emit();
}
registerComponentCaching(comp) {
const attr = comp.getAttribute();
const listenTo = this.form.detectChangesOnBlur ? comp.onValueChange : comp.onChange;
if (!Util.isDefined(listenTo)) {
return;
}
this._componentsSubscritpions[attr] = listenTo.subscribe(() => {
if (this.initializedCache && !this.blockCaching && this.hasComponentChanged(attr, comp)) {
if (this.changedFormControls.indexOf(attr) === -1) {
this.changedFormControls.push(attr);
}
this.updateFormDataCache();
this.addChangeToStack(comp);
}
});
}
getCachedValue(attr) {
if (this.formDataCache && this.formDataCache.hasOwnProperty(attr)) {
return this.formDataCache[attr];
}
return undefined;
}
destroy() {
Object.keys(this._componentsSubscritpions).forEach((attr) => {
const subs = this._componentsSubscritpions[attr];
subs.unsubscribe();
});
this._componentsSubscritpions = {};
this.formDataCache = undefined;
this.changedFormControls = [];
}
removeUndefinedProperties(arg) {
Object.keys(arg).forEach((key) => {
if (arg[key] === undefined) {
delete arg[key];
}
});
return arg;
}
registerCache() {
const initialCache = this.form.getRegisteredFieldsValues();
this.removeUndefinedProperties(initialCache);
this.initializeCache(initialCache);
this.formDataCache = initialCache;
const components = this.form.getComponents();
const self = this;
Object.keys(components).forEach(attr => {
const comp = components[attr];
if (comp.isAutomaticRegistering()) {
self.registerComponentCaching(comp);
}
});
}
initializeCache(val) {
this.initialDataCache = val;
this.valueChangesStack = [];
this.onCacheStateChanges.emit();
this.initializedCache = true;
this.changedFormControls = [];
}
getInitialDataCache() {
return this.initialDataCache;
}
getDataCache() {
return this.formDataCache;
}
restartCache() {
this.formDataCache = undefined;
this.initializeCache({});
this.initializedCache = false;
this.onCacheStateChanges.emit();
}
setCacheSnapshot() {
this.initializeCache(this.getDataCache());
}
undoLastChange() {
const lastElement = this.valueChangesStack[this.valueChangesStack.length - 1];
if (lastElement) {
const lastCacheValue = this.getCacheLastValue(lastElement.attr);
const lastValue = (lastCacheValue !== null) ? lastCacheValue : this.initialDataCache[lastElement.attr];
this.undoComponentValue(lastElement.attr, lastValue);
this.updateFormDataCache();
this.onCacheStateChanges.emit();
}
}
undoComponentValue(attr, val) {
this.blockCaching = true;
const comp = this.form.getFieldReference(attr);
if (comp) {
comp.setValue(val);
}
this.blockCaching = false;
}
hasComponentChanged(attr, comp) {
const currentValue = comp.getFormControl().value;
const cache = this.formDataCache || this.initialDataCache;
return (currentValue !== cache[attr]);
}
getCacheLastValue(attr) {
this.updateChangesStack(attr);
let result = null;
for (let i = this.valueChangesStack.length - 1; i >= 0; i--) {
const current = this.valueChangesStack[i];
if (current.attr === attr) {
result = current.value;
break;
}
}
return result;
}
updateChangesStack(attr) {
let index;
for (let i = this.valueChangesStack.length - 1; i >= 0; i--) {
const current = this.valueChangesStack[i];
if (current.attr === attr) {
index = i;
break;
}
}
if (index !== undefined) {
for (let i = index; i >= 0; i--) {
const prev = this.valueChangesStack[i - 1];
const current = this.valueChangesStack[i];
if (current.attr === attr) {
this.valueChangesStack.splice(i, 1);
if (!prev || prev.attr === attr) {
continue;
}
else {
break;
}
}
}
}
if (this.valueChangesStack.length === 0) {
this.onCacheStateChanges.emit();
}
}
get isCacheStackEmpty() {
return (this.valueChangesStack.length === 0);
}
isInitialStateChanged(ignoreAttrs = []) {
const initialCache = Object.assign({}, this.initialDataCache);
let currentCache;
if (this.formDataCache) {
currentCache = Object.assign({}, this.formDataCache);
this.removeUndefinedProperties(currentCache);
}
else {
return false;
}
let initialKeys = Object.keys(initialCache);
let currentKeys = currentCache ? Object.keys(currentCache) : initialKeys;
if (ignoreAttrs.length) {
initialKeys = initialKeys.filter(key => !ignoreAttrs.includes(key));
currentKeys = currentKeys.filter(key => !ignoreAttrs.includes(key));
ignoreAttrs.forEach(key => delete initialCache[key]);
}
if (currentKeys.length === 0) {
return false;
}
if (initialKeys.length !== currentKeys.length) {
return true;
}
if (ignoreAttrs.length) {
initialKeys = initialKeys.filter(key => !ignoreAttrs.includes(key));
ignoreAttrs.forEach(key => delete initialCache[key]);
}
let res = false;
for (let i = 0, len = initialKeys.length; i < len; i++) {
const key = initialKeys[i];
res = (initialCache[key] !== currentCache[key]);
if (res) {
break;
}
}
return res;
}
getChangedFormControlsAttr() {
return this.changedFormControls;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNhY2hlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9jYWNoZS9vLWZvcm0uY2FjaGUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs3QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsTUFBTSxPQUFPLGVBQWU7SUFhMUIsWUFBc0IsSUFBZTtRQUFmLFNBQUksR0FBSixJQUFJLENBQVc7UUFYM0IscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBRTlCLHNCQUFpQixHQUFlLEVBQUUsQ0FBQztRQUNuQyw2QkFBd0IsR0FBUSxFQUFFLENBQUM7UUFDbkMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRTVDLHdCQUFtQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXZELHdCQUFtQixHQUFhLEVBQUUsQ0FBQztJQUc3QyxDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUEyQjtRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDekIsS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFUyx3QkFBd0IsQ0FB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dCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJRm9ybUNvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2Zvcm0tY29udHJvbC1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZm9ybS1kYXRhLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUJhc2UgfSBmcm9tICcuLi9vLWZvcm0tYmFzZS5jbGFzcyc7XG5cbmV4cG9ydCBjbGFzcyBPRm9ybUNhY2hlQ2xhc3Mge1xuXG4gIHByb3RlY3RlZCBpbml0aWFsRGF0YUNhY2hlOiBvYmplY3QgPSB7fTtcbiAgcHJvdGVjdGVkIGZvcm1EYXRhQ2FjaGU6IG9iamVjdDtcbiAgcHJvdGVjdGVkIHZhbHVlQ2hhbmdlc1N0YWNrOiBBcnJheTxhbnk+ID0gW107XG4gIHByb3RlY3RlZCBfY29tcG9uZW50c1N1YnNjcml0cGlvbnM6IGFueSA9IHt9O1xuICBwcm90ZWN0ZWQgYmxvY2tDYWNoaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpbml0aWFsaXplZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb25DYWNoZVN0YXRlQ2hhbmdlczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcm90ZWN0ZWQgY2hhbmdlZEZvcm1Db250cm9sczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZm9ybTogT0Zvcm1CYXNlKSB7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlRm9ybURhdGFDYWNoZSgpIHtcbiAgICB0aGlzLmZvcm1EYXRhQ2FjaGUgPSB0aGlzLmZvcm0uZ2V0UmVnaXN0ZXJlZEZpZWxkc1ZhbHVlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZENoYW5nZVRvU3RhY2soY29tcDogSUZvcm1Db250cm9sQ29tcG9uZW50KSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29tcC5nZXRGb3JtQ29udHJvbCgpLnZhbHVlO1xuICAgIHRoaXMudmFsdWVDaGFuZ2VzU3RhY2sucHVzaCh7XG4gICAgICBhdHRyOiBjb21wLmdldEF0dHJpYnV0ZSgpLFxuICAgICAgdmFsdWU6IGN1cnJlbnRWYWx1ZVxuICAgIH0pO1xuICAgIHRoaXMub25DYWNoZVN0YXRlQ2hhbmdlcy5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJDb21wb25lbnRDYWNoaW5nKGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCkge1xuICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgIGNvbnN0IGxpc3RlblRvID0gdGhpcy5mb3JtLmRldGVjdENoYW5nZXNPbkJsdXIgPyBjb21wLm9uVmFsdWVDaGFuZ2UgOiBjb21wLm9uQ2hhbmdlO1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQobGlzdGVuVG8pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NvbXBvbmVudHNTdWJzY3JpdHBpb25zW2F0dHJdID0gbGlzdGVuVG8uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkQ2FjaGUgJiYgIXRoaXMuYmxvY2tDYWNoaW5nICYmIHRoaXMuaGFzQ29tcG9uZW50Q2hhbmdlZChhdHRyLCBjb21wKSkge1xuICAgICAgICBpZiAodGhpcy5jaGFuZ2VkRm9ybUNvbnRyb2xzLmluZGV4T2YoYXR0cikgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkRm9ybUNvbnRyb2xzLnB1c2goYXR0cik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YUNhY2hlKCk7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlVG9TdGFjayhjb21wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENhY2hlZFZhbHVlKGF0dHI6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHRoaXMuZm9ybURhdGFDYWNoZSAmJiB0aGlzLmZvcm1EYXRhQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EYXRhQ2FjaGVbYXR0cl07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuX2NvbXBvbmVudHNTdWJzY3JpdHBpb25zKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICBjb25zdCBzdWJzOiBTdWJzY3JpcHRpb24gPSB0aGlzLl9jb21wb25lbnRzU3Vic2NyaXRwaW9uc1thdHRyXTtcbiAgICAgIHN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLl9jb21wb25lbnRzU3Vic2NyaXRwaW9ucyA9IHt9O1xuICAgIHRoaXMuZm9ybURhdGFDYWNoZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5nZWRGb3JtQ29udHJvbHMgPSBbXTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKGFyZzogYW55KTogYW55IHtcbiAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGFyZ1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIGFyZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhcmc7XG4gIH1cblxuICByZWdpc3RlckNhY2hlKCkge1xuICAgIGNvbnN0IGluaXRpYWxDYWNoZSA9IHRoaXMuZm9ybS5nZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCk7XG4gICAgdGhpcy5yZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKGluaXRpYWxDYWNoZSk7XG4gICAgdGhpcy5pbml0aWFsaXplQ2FjaGUoaW5pdGlhbENhY2hlKTtcbiAgICB0aGlzLmZvcm1EYXRhQ2FjaGUgPSBpbml0aWFsQ2FjaGU7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5mb3JtLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgY29uc3QgY29tcDogSUZvcm1EYXRhQ29tcG9uZW50ID0gY29tcG9uZW50c1thdHRyXTtcbiAgICAgIGlmIChjb21wLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSkge1xuICAgICAgICBzZWxmLnJlZ2lzdGVyQ29tcG9uZW50Q2FjaGluZyhjb21wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYWNoZSh2YWw6IGFueSkge1xuICAgIHRoaXMuaW5pdGlhbERhdGFDYWNoZSA9IHZhbDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrID0gW107XG4gICAgdGhpcy5vbkNhY2hlU3RhdGVDaGFuZ2VzLmVtaXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2FjaGUgPSB0cnVlO1xuICAgIHRoaXMuY2hhbmdlZEZvcm1Db250cm9scyA9IFtdO1xuICB9XG5cbiAgZ2V0SW5pdGlhbERhdGFDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsRGF0YUNhY2hlO1xuICB9XG5cbiAgZ2V0RGF0YUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1EYXRhQ2FjaGU7XG4gIH1cblxuICByZXN0YXJ0Q2FjaGUoKSB7XG4gICAgdGhpcy5mb3JtRGF0YUNhY2hlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHt9KTtcbiAgICB0aGlzLmluaXRpYWxpemVkQ2FjaGUgPSBmYWxzZTtcbiAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICB9XG5cbiAgc2V0Q2FjaGVTbmFwc2hvdCgpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDYWNoZSh0aGlzLmdldERhdGFDYWNoZSgpKTtcbiAgfVxuXG4gIHVuZG9MYXN0Q2hhbmdlKCkge1xuICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1t0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0RWxlbWVudCkge1xuICAgICAgY29uc3QgbGFzdENhY2hlVmFsdWUgPSB0aGlzLmdldENhY2hlTGFzdFZhbHVlKGxhc3RFbGVtZW50LmF0dHIpO1xuICAgICAgY29uc3QgbGFzdFZhbHVlID0gKGxhc3RDYWNoZVZhbHVlICE9PSBudWxsKSA/IGxhc3RDYWNoZVZhbHVlIDogdGhpcy5pbml0aWFsRGF0YUNhY2hlW2xhc3RFbGVtZW50LmF0dHJdO1xuICAgICAgdGhpcy51bmRvQ29tcG9uZW50VmFsdWUobGFzdEVsZW1lbnQuYXR0ciwgbGFzdFZhbHVlKTtcblxuICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YUNhY2hlKCk7XG4gICAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1bmRvQ29tcG9uZW50VmFsdWUoYXR0cjogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHRoaXMuYmxvY2tDYWNoaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wID0gdGhpcy5mb3JtLmdldEZpZWxkUmVmZXJlbmNlKGF0dHIpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb21wLnNldFZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHRoaXMuYmxvY2tDYWNoaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzQ29tcG9uZW50Q2hhbmdlZChhdHRyOiBzdHJpbmcsIGNvbXA6IElGb3JtQ29udHJvbENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbXAuZ2V0Rm9ybUNvbnRyb2woKS52YWx1ZTtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuZm9ybURhdGFDYWNoZSB8fCB0aGlzLmluaXRpYWxEYXRhQ2FjaGU7XG4gICAgcmV0dXJuIChjdXJyZW50VmFsdWUgIT09IGNhY2hlW2F0dHJdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYWNoZUxhc3RWYWx1ZShhdHRyOiBzdHJpbmcpOiBhbnkge1xuICAgIHRoaXMudXBkYXRlQ2hhbmdlc1N0YWNrKGF0dHIpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgIGlmIChjdXJyZW50LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgcmVzdWx0ID0gY3VycmVudC52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ2hhbmdlc1N0YWNrKGF0dHI6IHN0cmluZykge1xuICAgIGxldCBpbmRleDogbnVtYmVyO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnZhbHVlQ2hhbmdlc1N0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgIGlmIChjdXJyZW50LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMudmFsdWVDaGFuZ2VzU3RhY2tbaSAtIDFdO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy52YWx1ZUNoYW5nZXNTdGFja1tpXTtcbiAgICAgICAgaWYgKGN1cnJlbnQuYXR0ciA9PT0gYXR0cikge1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzU3RhY2suc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmF0dHIgPT09IGF0dHIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWVDaGFuZ2VzU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLm9uQ2FjaGVTdGF0ZUNoYW5nZXMuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0NhY2hlU3RhY2tFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMudmFsdWVDaGFuZ2VzU3RhY2subGVuZ3RoID09PSAwKTtcbiAgfVxuXG4gIGlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRyczogc3RyaW5nW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluaXRpYWxDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaW5pdGlhbERhdGFDYWNoZSk7XG4gICAgbGV0IGN1cnJlbnRDYWNoZTogb2JqZWN0O1xuICAgIGlmICh0aGlzLmZvcm1EYXRhQ2FjaGUpIHtcbiAgICAgIGN1cnJlbnRDYWNoZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZm9ybURhdGFDYWNoZSk7XG4gICAgICB0aGlzLnJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXMoY3VycmVudENhY2hlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKGluaXRpYWxDYWNoZSk7XG4gICAgbGV0IGN1cnJlbnRLZXlzID0gY3VycmVudENhY2hlID8gT2JqZWN0LmtleXMoY3VycmVudENhY2hlKSA6IGluaXRpYWxLZXlzO1xuXG4gICAgLy8gUmVtb3ZlIGlnbm9yZWQgZmllbGRzIGZyb20gdGVtcG9yYXJ5IGluaXRpYWwgY2FjaGUgZGF0YVxuICAgIGlmIChpZ25vcmVBdHRycy5sZW5ndGgpIHtcbiAgICAgIGluaXRpYWxLZXlzID0gaW5pdGlhbEtleXMuZmlsdGVyKGtleSA9PiAhaWdub3JlQXR0cnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICBjdXJyZW50S2V5cyA9IGN1cnJlbnRLZXlzLmZpbHRlcihrZXkgPT4gIWlnbm9yZUF0dHJzLmluY2x1ZGVzKGtleSkpO1xuICAgICAgaWdub3JlQXR0cnMuZm9yRWFjaChrZXkgPT4gZGVsZXRlIGluaXRpYWxDYWNoZVtrZXldKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxLZXlzLmxlbmd0aCAhPT0gY3VycmVudEtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGlnbm9yZWQgZmllbGRzIGZyb20gdGVtcG9yYXJ5IGluaXRpYWwgY2FjaGUgZGF0YVxuICAgIGlmIChpZ25vcmVBdHRycy5sZW5ndGgpIHtcbiAgICAgIGluaXRpYWxLZXlzID0gaW5pdGlhbEtleXMuZmlsdGVyKGtleSA9PiAhaWdub3JlQXR0cnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICBpZ25vcmVBdHRycy5mb3JFYWNoKGtleSA9PiBkZWxldGUgaW5pdGlhbENhY2hlW2tleV0pO1xuICAgIH1cblxuICAgIGxldCByZXMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5pdGlhbEtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGluaXRpYWxLZXlzW2ldO1xuICAgICAgLy8gVE9ETyBiZSBjYXJlZnVsIHdpdGggdHlwZXMgY29tcGFyaXNpb25zXG4gICAgICByZXMgPSAoaW5pdGlhbENhY2hlW2tleV0gIT09IGN1cnJlbnRDYWNoZVtrZXldKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZXRDaGFuZ2VkRm9ybUNvbnRyb2xzQXR0cigpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlZEZvcm1Db250cm9scztcbiAgfVxufVxuIl19