UNPKG

tree-ngx

Version:

A highly customizable Angular Tree Component, usable with minimal implementation.

403 lines 53.8 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { NodeSelectedState } from '../model/node-selected-state'; import { TreeMode } from '../model/tree-mode'; import { TreeUtil } from '../util/util'; import * as i0 from "@angular/core"; export class TreeService { constructor() { this.callbacks = {}; this.treeState = []; this.selectedItems = []; this.selectedStates = []; this.filterValue = ''; this.selectedItemsSubject = new BehaviorSubject(this.selectedItems); this.filterChangeSubject = new BehaviorSubject(this.filterValue); this.filterChangeSubject.pipe(debounceTime(300), distinctUntilChanged()).subscribe(it => { this.filterTraverse(this.treeState, this.filterValue); }); } toggleSelected(state) { this.toggleSelectedState(state, false); if (this.callbacks.toggle) { this.callbacks.toggle(state.nodeItem); } } toggleSelectedState(state, ignoreDisabled) { if (this.isDisabled(state, ignoreDisabled)) { return; } if (state.selectedState === NodeSelectedState.unChecked) { if (this.options.mode === TreeMode.SingleSelect) { this.clear(); this.setChecked(state, false, true, ignoreDisabled); } else { this.setChecked(state, true, false, ignoreDisabled); } } else if (state.selectedState === NodeSelectedState.checked) { if (this.options.mode === TreeMode.SingleSelect) { this.setUnchecked(state, false, true, ignoreDisabled); } else { this.setUnchecked(state, true, false, ignoreDisabled); } } else { if (this.anyActiveSelected(state) && !state.selected) { this.setUnchecked(state, true, false, ignoreDisabled); } else { this.setChecked(state, true, false, ignoreDisabled); } } if (state.parent && this.options.mode !== TreeMode.SingleSelect) { this.childStateChanged(state.parent); } } setInitialState() { this.setInitialSelectedState(this.treeState); } childStateChanged(state) { if (this.anyChildSelected(state)) { if (this.allChildrenSelected(state)) { this.setChecked(state, false); } else { this.setIndeterminate(state); } } else { this.setUnchecked(state, false); } if (state.parent) { this.childStateChanged(state.parent); } } checkBoxClick(state) { if (this.options.mode !== TreeMode.HideSelected) { this.toggleSelected(state); } } nameClick(state) { if (this.callbacks.nameClick) { this.callbacks.nameClick(state.nodeItem); } if (this.canToggleChildrenOnName()) { this.toggleSelected(state); } } toggleExpanded(value) { this.toggleExpandedTraverse(this.treeState, value); } clear() { for (let state of this.selectedStates) { state.selected = false; state.selectedState = NodeSelectedState.unChecked; } this.selectedItems.length = 0; this.selectedStates.length = 0; } addNodeById(nodeState, id) { let result = this.getNodeState(this.treeState, id, this.findById); if (result) { if (!result.children) { result.children = []; } this.addNewNode(nodeState, result); if (result.nodeItem.item && this.options.mode === TreeMode.MultiSelect) { this.removeSelected(result.nodeItem.item); } } } selectById(id) { let result = this.getNodeState(this.treeState, id, this.findById); if (result) { this.toggleSelected(result); } } editNameById(id, name) { const nodeState = this.getNodeState(this.treeState, id, this.findById); if (nodeState && nodeState.nodeItem) { nodeState.nodeItem.name = name; } } editItemById(id, item) { const nodeState = this.getNodeState(this.treeState, id, this.findById); if (nodeState && nodeState.nodeItem) { if (this.selectedItems.includes(nodeState.nodeItem.item)) { this.removeSelected(nodeState.nodeItem.item); this.selectedItems.push(item); this.selectedItemsSubject.next(this.selectedItems); } nodeState.nodeItem.item = item; } } deleteById(id) { let result = this.getNodeState(this.treeState, id, this.findById); if (result) { this.deleteByState(result); } } deleteByState(state) { this.delete(state); this.childStateChanged(state); this.filterTraverse(this.treeState, this.filterValue); } expandById(id) { const result = this.getNodeState(this.treeState, id, this.findById); if (result) { this.toggleExpandedTraverseAsc(result, true); } } collapseById(id) { const result = this.getNodeState(this.treeState, id, this.findById); if (result) { result.expanded = false; } } reEvaluateSelectedState(state) { if (this.options.mode !== TreeMode.SingleSelect) { if (!this.hasNoChildren(state)) { this.childStateChanged(state); for (const child of state.children) { this.reEvaluateSelectedState(child); } } } } filterChanged(value) { this.filterValue = value; this.filterChangeSubject.next(value); } canToggleChildrenOnName() { if (this.options.checkboxes === false) { if (this.options.mode === TreeMode.SingleSelect || this.options.mode === TreeMode.MultiSelect) { return true; } } return false; } getParentById(id) { const result = this.getNodeState(this.treeState, id, this.findById); if (result) { return result.parent.nodeItem; } return null; } forceFilterTraverse() { this.filterTraverse(this.treeState, this.filterValue); } setInitialSelectedState(nodeStates) { for (const state of nodeStates) { if (this.options.mode === TreeMode.MultiSelect) { if (state.nodeItem.selected && (!state.children || state.children.length === 0)) { this.toggleSelectedState(state, true); } } else { if (state.nodeItem.selected) { this.toggleSelectedState(state, true); } } this.setInitialSelectedState(state.children); } } delete(state) { while (state.children.length > 0) { this.delete(state.children.pop()); } this.removeSelected(state.nodeItem.item); this.remove(state); if (!state.parent) { this.deleteRoot(state, this.treeState, this.nodeItems); } } toggleExpandedTraverse(nodeStates, value) { for (let state of nodeStates) { state.expanded = value; this.toggleExpandedTraverse(state.children, value); } } deleteRoot(state, nodeStates, nodeItems) { let itemIndex = nodeItems.indexOf(state.nodeItem); if (itemIndex !== -1) { nodeItems.splice(itemIndex, 1); } let index = nodeStates.indexOf(state); if (index !== -1) { nodeStates.splice(index, 1); } } isDisabled(state, ignoreDisabled) { return (this.options.mode === TreeMode.NoSelect || (state.disabled && !ignoreDisabled)); } addNewNode(nodeState, parent) { nodeState.parent = parent; parent.children.push(nodeState); parent.nodeItem.children.push(nodeState.nodeItem); parent.markSelected = TreeUtil.getMarkSelected(parent.nodeItem, this.options); if (this.options.mode === TreeMode.MultiSelect) { this.childStateChanged(parent); } this.filterTraverse(this.treeState, this.filterValue); } remove(state) { if (state.parent) { state.parent.hasFilteredChildren = false; let itemIndex = state.parent.nodeItem.children.indexOf(state.nodeItem); if (itemIndex !== -1) { state.parent.nodeItem.children.splice(itemIndex, 1); } let index = state.parent.children.indexOf(state); if (index !== -1) { state.parent.children.splice(index, 1); } let filteredIndex = state.parent.filteredChildren.indexOf(state); if (filteredIndex !== -1) { state.parent.filteredChildren.splice(filteredIndex, 1); } } } anyChildSelected(state) { return state.children.find(it => { return it.selectedState === NodeSelectedState.checked || it.selectedState === NodeSelectedState.indeterminate; }) != null ? true : false; } allChildrenSelected(state) { return state.children.every(it => it.selectedState === NodeSelectedState.checked) && state.children.length === state.nodeItem.children.length; } toggleExpandedTraverseAsc(nodeState, value) { nodeState.expanded = value; if (nodeState.parent) { this.toggleExpandedTraverseAsc(nodeState.parent, value); } } setUnchecked(state, propogate, force, ignoreDisabled) { if (state.disabled && !ignoreDisabled) { return; } state.selectedState = NodeSelectedState.unChecked; state.selected = false; if (this.hasNoChildren(state) || force) { this.removeSelected(state.nodeItem.item); if (this.options.alwaysEmitSelected === true) { this.selectedItemsSubject.next(this.selectedItems); } if (this.callbacks.unSelect) { this.callbacks.unSelect(state.nodeItem); } } else if (propogate === true) { for (const child of state.children) { this.setUnchecked(child, propogate, force, ignoreDisabled); } } } setIndeterminate(state) { state.selectedState = NodeSelectedState.indeterminate; state.selected = false; } anyActiveSelected(state) { let result = state.children.filter(it => !it.disabled && it.selected).length > 0; for (const child of state.children) { if (!this.hasNoChildren(child) && this.anyActiveSelected(child)) { result = true; } } return result; } hasNoChildren(state) { return (!state.children || state.children.length === 0); } setChecked(state, propogate, force, ignoreDisabled) { if (state.disabled && !ignoreDisabled) { return; } state.selectedState = NodeSelectedState.checked; state.selected = true; if (this.hasNoChildren(state) || force) { this.addSelected(state); } else if (propogate === true) { for (const child of state.children) { this.setChecked(child, propogate, force, ignoreDisabled); } } } addSelected(state) { this.selectedItems.push(state.nodeItem.item); this.selectedStates.push(state); if (this.options.alwaysEmitSelected === true) { this.selectedItemsSubject.next(this.selectedItems); } if (this.callbacks.select) { this.callbacks.select(state.nodeItem); } } removeSelected(item) { let index = this.selectedItems.indexOf(item); if (index !== -1) { this.selectedItems.splice(index, 1); } } findById(state, arg) { return state.nodeItem.id === arg; } getNodeState(nodeStates, arg, compare) { let result = nodeStates.find(it => compare(it, arg)); if (result) { return result; } else { for (let state of nodeStates) { result = this.getNodeState(state.children, arg, compare); if (result) { return result; } } } return result; } connect() { return this.selectedItemsSubject.asObservable(); } applyFilter(state, filter) { state.filteredChildren = this.filter(state.children, filter); return state.filteredChildren.length > 0; } filter(states, value) { return states.filter(it => { if (this.options.mode === TreeMode.HideSelected && !it.selected) { return false; } if ((it.hasFilteredChildren || value === '' || it.nodeItem.name.toLowerCase().indexOf(value) !== -1)) { return true; } }); } filterTraverse(states, filter) { let results = []; for (let state of states) { if (state.children.length > 0) { state.hasFilteredChildren = false; state.hasFilteredChildren = this.filterTraverse(state.children, filter); let res = this.applyFilter(state, filter); if (res) { state.hasFilteredChildren = true; } results.push(state.hasFilteredChildren); } } return results.some(it => it === true); } } TreeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); TreeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TreeService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: TreeService, decorators: [{ type: Injectable }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3RyZWUtbmd4L3NyYy9zZXJ2aWNlL3RyZWUtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUd4QyxNQUFNLE9BQU8sV0FBVztJQWF0QjtRQVZPLGNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBZ0IsRUFBRSxDQUFDO1FBRzNCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBQzFCLG1CQUFjLEdBQWdCLEVBQUUsQ0FBQztRQUNqQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQix5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0Qsd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBR2xFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FB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QUFHLENBQUMsRUFBRTtnQkFDN0IsS0FBSyxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFeEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLElBQUksR0FBRyxFQUFFO29CQUNQLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7aUJBQ2xDO2dCQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDekM7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDOzt3R0EzZFUsV0FBVzs0R0FBWCxXQUFXOzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOb2RlSXRlbSB9IGZyb20gJy4uL21vZGVsL25vZGUtaXRlbSc7XHJcbmltcG9ydCB7IE5vZGVTdGF0ZSB9IGZyb20gJy4uL21vZGVsL25vZGUtc3RhdGUnO1xyXG5pbXBvcnQgeyBOb2RlU2VsZWN0ZWRTdGF0ZSB9IGZyb20gJy4uL21vZGVsL25vZGUtc2VsZWN0ZWQtc3RhdGUnO1xyXG5pbXBvcnQgeyBUcmVlTW9kZSB9IGZyb20gJy4uL21vZGVsL3RyZWUtbW9kZSc7XHJcbmltcG9ydCB7IFRyZWVPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWwvdHJlZS1vcHRpb25zJztcclxuaW1wb3J0IHsgVHJlZUNhbGxiYWNrcyB9IGZyb20gJy4uL21vZGVsL3RyZWUtY2FsbGJhY2tzJztcclxuaW1wb3J0IHsgVHJlZVV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHJlZVNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgb3B0aW9uczogVHJlZU9wdGlvbnM7XHJcbiAgcHVibGljIGNhbGxiYWNrczogVHJlZUNhbGxiYWNrcyA9IHt9O1xyXG4gIHB1YmxpYyB0cmVlU3RhdGU6IE5vZGVTdGF0ZVtdID0gW107XHJcbiAgcHVibGljIG5vZGVJdGVtczogTm9kZUl0ZW08YW55PltdO1xyXG5cclxuICBwcml2YXRlIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFN0YXRlczogTm9kZVN0YXRlW10gPSBbXTtcclxuICBwcml2YXRlIGZpbHRlclZhbHVlID0gJyc7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZEl0ZW1zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuICBwcml2YXRlIGZpbHRlckNoYW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZmlsdGVyVmFsdWUpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoaXQgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlclRyYXZlcnNlKHRoaXMudHJlZVN0YXRlLCB0aGlzLmZpbHRlclZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZVNlbGVjdGVkKHN0YXRlOiBOb2RlU3RhdGUpIHtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRTdGF0ZShzdGF0ZSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhbGxiYWNrcy50b2dnbGUpIHtcclxuICAgICAgdGhpcy5jYWxsYmFja3MudG9nZ2xlKHN0YXRlLm5vZGVJdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RlZFN0YXRlKHN0YXRlLCBpZ25vcmVEaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZChzdGF0ZSwgaWdub3JlRGlzYWJsZWQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUuc2VsZWN0ZWRTdGF0ZSA9PT0gTm9kZVNlbGVjdGVkU3RhdGUudW5DaGVja2VkKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PT0gVHJlZU1vZGUuU2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tlZChzdGF0ZSwgZmFsc2UsIHRydWUsIGlnbm9yZURpc2FibGVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNldENoZWNrZWQoc3RhdGUsIHRydWUsIGZhbHNlLCBpZ25vcmVEaXNhYmxlZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc2VsZWN0ZWRTdGF0ZSA9PT0gTm9kZVNlbGVjdGVkU3RhdGUuY2hlY2tlZCkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGUgPT09IFRyZWVNb2RlLlNpbmdsZVNlbGVjdCkge1xyXG4gICAgICAgIHRoaXMuc2V0VW5jaGVja2VkKHN0YXRlLCBmYWxzZSwgdHJ1ZSwgaWdub3JlRGlzYWJsZWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0VW5jaGVja2VkKHN0YXRlLCB0cnVlLCBmYWxzZSwgaWdub3JlRGlzYWJsZWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5hbnlBY3RpdmVTZWxlY3RlZChzdGF0ZSkgJiYgIXN0YXRlLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRVbmNoZWNrZWQoc3RhdGUsIHRydWUsIGZhbHNlLCBpZ25vcmVEaXNhYmxlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGVja2VkKHN0YXRlLCB0cnVlLCBmYWxzZSwgaWdub3JlRGlzYWJsZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlLnBhcmVudCAmJiB0aGlzLm9wdGlvbnMubW9kZSAhPT0gVHJlZU1vZGUuU2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgIHRoaXMuY2hpbGRTdGF0ZUNoYW5nZWQoc3RhdGUucGFyZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICB0aGlzLnNldEluaXRpYWxTZWxlY3RlZFN0YXRlKHRoaXMudHJlZVN0YXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGlsZFN0YXRlQ2hhbmdlZChzdGF0ZTogTm9kZVN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5hbnlDaGlsZFNlbGVjdGVkKHN0YXRlKSkge1xyXG4gICAgICBpZiAodGhpcy5hbGxDaGlsZHJlblNlbGVjdGVkKHN0YXRlKSkge1xyXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tlZChzdGF0ZSwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0SW5kZXRlcm1pbmF0ZShzdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0VW5jaGVja2VkKHN0YXRlLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlLnBhcmVudCkge1xyXG4gICAgICB0aGlzLmNoaWxkU3RhdGVDaGFuZ2VkKHN0YXRlLnBhcmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tCb3hDbGljayhzdGF0ZTogTm9kZVN0YXRlKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1vZGUgIT09IFRyZWVNb2RlLkhpZGVTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZVNlbGVjdGVkKHN0YXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuYW1lQ2xpY2soc3RhdGU6IE5vZGVTdGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzLm5hbWVDbGljaykge1xyXG4gICAgICB0aGlzLmNhbGxiYWNrcy5uYW1lQ2xpY2soc3RhdGUubm9kZUl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNhblRvZ2dsZUNoaWxkcmVuT25OYW1lKCkpIHtcclxuICAgICAgdGhpcy50b2dnbGVTZWxlY3RlZChzdGF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlRXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudG9nZ2xlRXhwYW5kZWRUcmF2ZXJzZSh0aGlzLnRyZWVTdGF0ZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgZm9yIChsZXQgc3RhdGUgb2YgdGhpcy5zZWxlY3RlZFN0YXRlcykge1xyXG4gICAgICBzdGF0ZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICBzdGF0ZS5zZWxlY3RlZFN0YXRlID0gTm9kZVNlbGVjdGVkU3RhdGUudW5DaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0YXRlcy5sZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZE5vZGVCeUlkKG5vZGVTdGF0ZTogTm9kZVN0YXRlLCBpZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5nZXROb2RlU3RhdGUodGhpcy50cmVlU3RhdGUsIGlkLCB0aGlzLmZpbmRCeUlkKTtcclxuXHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGlmICghcmVzdWx0LmNoaWxkcmVuKSB7XHJcbiAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYWRkTmV3Tm9kZShub2RlU3RhdGUsIHJlc3VsdCk7XHJcblxyXG4gICAgICBpZiAocmVzdWx0Lm5vZGVJdGVtLml0ZW0gJiYgdGhpcy5vcHRpb25zLm1vZGUgPT09IFRyZWVNb2RlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZChyZXN1bHQubm9kZUl0ZW0uaXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RCeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGxldCByZXN1bHQgPSB0aGlzLmdldE5vZGVTdGF0ZSh0aGlzLnRyZWVTdGF0ZSwgaWQsIHRoaXMuZmluZEJ5SWQpO1xyXG5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgdGhpcy50b2dnbGVTZWxlY3RlZChyZXN1bHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXROYW1lQnlJZChpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG5vZGVTdGF0ZSA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgdGhpcy5maW5kQnlJZCk7XHJcblxyXG4gICAgaWYgKG5vZGVTdGF0ZSAmJiBub2RlU3RhdGUubm9kZUl0ZW0pIHtcclxuICAgICAgbm9kZVN0YXRlLm5vZGVJdGVtLm5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRJdGVtQnlJZChpZDogc3RyaW5nLCBpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IG5vZGVTdGF0ZSA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgdGhpcy5maW5kQnlJZCk7XHJcblxyXG4gICAgaWYgKG5vZGVTdGF0ZSAmJiBub2RlU3RhdGUubm9kZUl0ZW0pIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhub2RlU3RhdGUubm9kZUl0ZW0uaXRlbSkpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKG5vZGVTdGF0ZS5ub2RlSXRlbS5pdGVtKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbm9kZVN0YXRlLm5vZGVJdGVtLml0ZW0gPSBpdGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZUJ5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgdGhpcy5maW5kQnlJZCk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlQnlTdGF0ZShyZXN1bHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZUJ5U3RhdGUoc3RhdGU6IE5vZGVTdGF0ZSkge1xyXG4gICAgdGhpcy5kZWxldGUoc3RhdGUpO1xyXG4gICAgdGhpcy5jaGlsZFN0YXRlQ2hhbmdlZChzdGF0ZSk7XHJcbiAgICB0aGlzLmZpbHRlclRyYXZlcnNlKHRoaXMudHJlZVN0YXRlLCB0aGlzLmZpbHRlclZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBhbmRCeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgdGhpcy5maW5kQnlJZCk7XHJcblxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkVHJhdmVyc2VBc2MocmVzdWx0LCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb2xsYXBzZUJ5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXROb2RlU3RhdGUodGhpcy50cmVlU3RhdGUsIGlkLCB0aGlzLmZpbmRCeUlkKTtcclxuXHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIHJlc3VsdC5leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlRXZhbHVhdGVTZWxlY3RlZFN0YXRlKHN0YXRlOiBOb2RlU3RhdGUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSAhPT0gVHJlZU1vZGUuU2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgIGlmICghdGhpcy5oYXNOb0NoaWxkcmVuKHN0YXRlKSkge1xyXG4gICAgICAgIHRoaXMuY2hpbGRTdGF0ZUNoYW5nZWQoc3RhdGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgIHRoaXMucmVFdmFsdWF0ZVNlbGVjdGVkU3RhdGUoY2hpbGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZWQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VTdWJqZWN0Lm5leHQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhblRvZ2dsZUNoaWxkcmVuT25OYW1lKCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jaGVja2JveGVzID09PSBmYWxzZSkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGUgPT09IFRyZWVNb2RlLlNpbmdsZVNlbGVjdCB8fCB0aGlzLm9wdGlvbnMubW9kZSA9PT0gVHJlZU1vZGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQYXJlbnRCeUlkKGlkOiBzdHJpbmcpOiBOb2RlSXRlbTxhbnk+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgdGhpcy5maW5kQnlJZCk7XHJcblxyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICByZXR1cm4gcmVzdWx0LnBhcmVudC5ub2RlSXRlbTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JjZUZpbHRlclRyYXZlcnNlKCkge1xyXG4gICAgdGhpcy5maWx0ZXJUcmF2ZXJzZSh0aGlzLnRyZWVTdGF0ZSwgdGhpcy5maWx0ZXJWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEluaXRpYWxTZWxlY3RlZFN0YXRlKG5vZGVTdGF0ZXM6IE5vZGVTdGF0ZVtdKSB7XHJcbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIG5vZGVTdGF0ZXMpIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09PSBUcmVlTW9kZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgIGlmIChzdGF0ZS5ub2RlSXRlbS5zZWxlY3RlZCAmJiAoIXN0YXRlLmNoaWxkcmVuIHx8IHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkpIHtcclxuICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRTdGF0ZShzdGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChzdGF0ZS5ub2RlSXRlbS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgdGhpcy50b2dnbGVTZWxlY3RlZFN0YXRlKHN0YXRlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkU3RhdGUoc3RhdGUuY2hpbGRyZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGUoc3RhdGU6IE5vZGVTdGF0ZSkge1xyXG4gICAgd2hpbGUgKHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWxldGUoc3RhdGUuY2hpbGRyZW4ucG9wKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoc3RhdGUubm9kZUl0ZW0uaXRlbSk7XHJcbiAgICB0aGlzLnJlbW92ZShzdGF0ZSk7XHJcblxyXG4gICAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcclxuICAgICAgdGhpcy5kZWxldGVSb290KHN0YXRlLCB0aGlzLnRyZWVTdGF0ZSwgdGhpcy5ub2RlSXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b2dnbGVFeHBhbmRlZFRyYXZlcnNlKG5vZGVTdGF0ZXM6IE5vZGVTdGF0ZVtdLCB2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgZm9yIChsZXQgc3RhdGUgb2Ygbm9kZVN0YXRlcykge1xyXG4gICAgICBzdGF0ZS5leHBhbmRlZCA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkVHJhdmVyc2Uoc3RhdGUuY2hpbGRyZW4sIHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlUm9vdChzdGF0ZTogTm9kZVN0YXRlLCBub2RlU3RhdGVzOiBOb2RlU3RhdGVbXSwgbm9kZUl0ZW1zOiBOb2RlSXRlbTxhbnk+W10pIHtcclxuICAgIGxldCBpdGVtSW5kZXggPSBub2RlSXRlbXMuaW5kZXhPZihzdGF0ZS5ub2RlSXRlbSk7XHJcblxyXG4gICAgaWYgKGl0ZW1JbmRleCAhPT0gLTEpIHtcclxuICAgICAgbm9kZUl0ZW1zLnNwbGljZShpdGVtSW5kZXgsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpbmRleCA9IG5vZGVTdGF0ZXMuaW5kZXhPZihzdGF0ZSk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICBub2RlU3RhdGVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRGlzYWJsZWQoc3RhdGU6IE5vZGVTdGF0ZSwgaWdub3JlRGlzYWJsZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiAodGhpcy5vcHRpb25zLm1vZGUgPT09IFRyZWVNb2RlLk5vU2VsZWN0IHx8IChzdGF0ZS5kaXNhYmxlZCAmJiAhaWdub3JlRGlzYWJsZWQpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkTmV3Tm9kZShub2RlU3RhdGU6IE5vZGVTdGF0ZSwgcGFyZW50OiBOb2RlU3RhdGUpOiB2b2lkIHtcclxuICAgIG5vZGVTdGF0ZS5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlU3RhdGUpO1xyXG4gICAgcGFyZW50Lm5vZGVJdGVtLmNoaWxkcmVuLnB1c2gobm9kZVN0YXRlLm5vZGVJdGVtKTtcclxuXHJcbiAgICBwYXJlbnQubWFya1NlbGVjdGVkID0gVHJlZVV0aWwuZ2V0TWFya1NlbGVjdGVkKHBhcmVudC5ub2RlSXRlbSwgdGhpcy5vcHRpb25zKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm1vZGUgPT09IFRyZWVNb2RlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgIHRoaXMuY2hpbGRTdGF0ZUNoYW5nZWQocGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlclRyYXZlcnNlKHRoaXMudHJlZVN0YXRlLCB0aGlzLmZpbHRlclZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlKHN0YXRlOiBOb2RlU3RhdGUpIHtcclxuICAgIGlmIChzdGF0ZS5wYXJlbnQpIHtcclxuICAgICAgc3RhdGUucGFyZW50Lmhhc0ZpbHRlcmVkQ2hpbGRyZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgIGxldCBpdGVtSW5kZXggPSBzdGF0ZS5wYXJlbnQubm9kZUl0ZW0uY2hpbGRyZW4uaW5kZXhPZihzdGF0ZS5ub2RlSXRlbSk7XHJcbiAgICAgIGlmIChpdGVtSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3RhdGUucGFyZW50Lm5vZGVJdGVtLmNoaWxkcmVuLnNwbGljZShpdGVtSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaW5kZXggPSBzdGF0ZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzdGF0ZSk7XHJcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzdGF0ZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGZpbHRlcmVkSW5kZXggPSBzdGF0ZS5wYXJlbnQuZmlsdGVyZWRDaGlsZHJlbi5pbmRleE9mKHN0YXRlKTtcclxuICAgICAgaWYgKGZpbHRlcmVkSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3RhdGUucGFyZW50LmZpbHRlcmVkQ2hpbGRyZW4uc3BsaWNlKGZpbHRlcmVkSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFueUNoaWxkU2VsZWN0ZWQoc3RhdGU6IE5vZGVTdGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuLmZpbmQoaXQgPT4ge1xyXG4gICAgICByZXR1cm4gaXQuc2VsZWN0ZWRTdGF0ZSA9PT0gTm9kZVNlbGVjdGVkU3RhdGUuY2hlY2tlZCB8fCBpdC5zZWxlY3RlZFN0YXRlID09PSBOb2RlU2VsZWN0ZWRTdGF0ZS5pbmRldGVybWluYXRlO1xyXG4gICAgfSkgIT0gbnVsbCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWxsQ2hpbGRyZW5TZWxlY3RlZChzdGF0ZTogTm9kZVN0YXRlKSB7XHJcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW4uZXZlcnkoaXQgPT4gaXQuc2VsZWN0ZWRTdGF0ZSA9PT0gTm9kZVNlbGVjdGVkU3RhdGUuY2hlY2tlZClcclxuICAgICAgJiYgc3RhdGUuY2hpbGRyZW4ubGVuZ3RoID09PSBzdGF0ZS5ub2RlSXRlbS5jaGlsZHJlbi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvZ2dsZUV4cGFuZGVkVHJhdmVyc2VBc2Mobm9kZVN0YXRlOiBOb2RlU3RhdGUsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBub2RlU3RhdGUuZXhwYW5kZWQgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAobm9kZVN0YXRlLnBhcmVudCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkVHJhdmVyc2VBc2Mobm9kZVN0YXRlLnBhcmVudCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVbmNoZWNrZWQoc3RhdGU6IE5vZGVTdGF0ZSwgcHJvcG9nYXRlOiBib29sZWFuLCBmb3JjZT86IGJvb2xlYW4sIGlnbm9yZURpc2FibGVkPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHN0YXRlLmRpc2FibGVkICYmICFpZ25vcmVEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGUuc2VsZWN0ZWRTdGF0ZSA9IE5vZGVTZWxlY3RlZFN0YXRlLnVuQ2hlY2tlZDtcclxuICAgIHN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzTm9DaGlsZHJlbihzdGF0ZSkgfHwgZm9yY2UpIHtcclxuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZChzdGF0ZS5ub2RlSXRlbS5pdGVtKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWx3YXlzRW1pdFNlbGVjdGVkID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrcy51blNlbGVjdCkge1xyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuU2VsZWN0KHN0YXRlLm5vZGVJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAocHJvcG9nYXRlID09PSB0cnVlKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdGUuY2hpbGRyZW4pIHtcclxuICAgICAgICB0aGlzLnNldFVuY2hlY2tlZChjaGlsZCwgcHJvcG9nYXRlLCBmb3JjZSwgaWdub3JlRGlzYWJsZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEluZGV0ZXJtaW5hdGUoc3RhdGUpIHtcclxuICAgIHN0YXRlLnNlbGVjdGVkU3RhdGUgPSBOb2RlU2VsZWN0ZWRTdGF0ZS5pbmRldGVybWluYXRlO1xyXG4gICAgc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW55QWN0aXZlU2VsZWN0ZWQoc3RhdGU6IE5vZGVTdGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdCA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihpdCA9PiAhaXQuZGlzYWJsZWQgJiYgaXQuc2VsZWN0ZWQpLmxlbmd0aCA+IDA7XHJcblxyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBzdGF0ZS5jaGlsZHJlbikge1xyXG4gICAgICBpZiAoIXRoaXMuaGFzTm9DaGlsZHJlbihjaGlsZCkgJiYgdGhpcy5hbnlBY3RpdmVTZWxlY3RlZChjaGlsZCkpIHtcclxuICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzTm9DaGlsZHJlbihzdGF0ZTogTm9kZVN0YXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCFzdGF0ZS5jaGlsZHJlbiB8fCBzdGF0ZS5jaGlsZHJlbi5sZW5ndGggPT09IDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDaGVja2VkKHN0YXRlOiBOb2RlU3RhdGUsIHByb3BvZ2F0ZTogYm9vbGVhbiwgZm9yY2U/OiBib29sZWFuLCBpZ25vcmVEaXNhYmxlZD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChzdGF0ZS5kaXNhYmxlZ