UNPKG

@foblex/flow

Version:

An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.

137 lines 19 kB
import { __decorate } from "tslib"; import { inject, Injectable } from '@angular/core'; import { FExecutionRegister, FMediator } from '@foblex/mediator'; import { FSingleSelectRequest } from './f-single-select.request'; import { isValidEventTrigger, UpdateItemAndChildrenLayersRequest } from '../../domain'; import { FComponentsStore } from '../../f-storage'; import { FDraggableDataContext } from '../f-draggable-data-context'; import * as i0 from "@angular/core"; /** * Implements the functionality for selecting elements in a graphical interface. * This class handles both single and multi-selection, updating the selection state * of elements and managing related data. * * Logic flow: * 1. **Validate the selection event**: * - The event is considered valid if it occurs within the flow boundaries * and there are no active draggable data operations. * * 2. **Determine the target element to select**: * - The target element is determined based on the event’s target. * It can be a node, a group of nodes, or a connection. * - If no element is found, the current selection state is cleared. * * 3. **Update element layers**: * - If an element is found, its visual layer and the layers of its child elements are updated. * * 4. **Single or multi-selection**: * - If the event meets the criteria for multi-selection (e.g., a modifier key is pressed), * multi-selection logic is applied. * - Otherwise, single-selection logic is used. * * 5. **Single-selection logic**: * - If the element is not selected and can be selected: * - Clear the selection of all other elements. * - Mark the current element as selected. * - If the element cannot be selected, the current selection is cleared. * * 6. **Multi-selection logic**: * - If the element is already selected, it is removed from the selection. * - If the element is not selected and can be selected, it is added to the selection. * * 7. **Manage selection state**: * - Adding or removing an element from the selection triggers the corresponding methods. * - Selection state is tracked in the shared context for future use. */ let FSingleSelectExecution = class FSingleSelectExecution { _fMediator = inject(FMediator); _fComponentsStore = inject(FComponentsStore); _fDraggableDataContext = inject(FDraggableDataContext); handle(request) { if (!this._isValid(request)) { return; } const fItem = this._getItemToSelect(request.event); setTimeout(() => this._updateItemAndChildrenLayers(fItem)); this._isMultiSelect(request) ? this._multiSelect(fItem) : this._singleSelect(fItem); } _isValid(request) { return this._isEventInFlowBounds(request.event) && this._fDraggableDataContext.isEmpty(); } _isEventInFlowBounds(event) { return this._fComponentsStore.fFlow.hostElement.contains(event.targetElement); } _getItemToSelect(event) { return this._getNodeOrGroup(event.targetElement) || this._getConnection(event.targetElement); } _getNodeOrGroup(targetElement) { return this._fComponentsStore.fNodes.find((x) => (x).isContains(targetElement)); } _getConnection(element) { return this._fComponentsStore.fConnections .find(c => c.isContains(element) || c.fConnectionCenter?.nativeElement?.contains(element)); } _updateItemAndChildrenLayers(fItem) { if (fItem) { this._fMediator.execute(new UpdateItemAndChildrenLayersRequest(fItem, fItem.hostElement.parentElement)); } } _isMultiSelect(request) { return isValidEventTrigger(request.event.originalEvent, request.fMultiSelectTrigger); } _singleSelect(fItem) { if (fItem) { if (this._isItemNotSelectedAndSelectable(fItem)) { this._clearSelection(); this._selectItem(fItem); } else if (fItem.fSelectionDisabled) { this._clearSelection(); } } else { this._clearSelection(); } } _isItemNotSelectedAndSelectable(item) { return !item.isSelected() && !item.fSelectionDisabled; } _clearSelection() { this._fDraggableDataContext.selectedItems.forEach((x) => { x.unmarkAsSelected(); this._fDraggableDataContext.markSelectionAsChanged(); }); this._fDraggableDataContext.selectedItems = []; } _multiSelect(fItem) { if (fItem && !fItem.fSelectionDisabled) { fItem.isSelected() ? this._deselectItem(fItem) : this._selectItem(fItem); } } _deselectItem(fItem) { this._removeItemFromSelectedItems(fItem); fItem.unmarkAsSelected(); this._fDraggableDataContext.markSelectionAsChanged(); } _removeItemFromSelectedItems(fItem) { const indexInSelection = this._fDraggableDataContext.selectedItems.indexOf(fItem); if (indexInSelection > -1) { this._fDraggableDataContext.selectedItems.splice(indexInSelection, 1); } } _selectItem(fItem) { this._fDraggableDataContext.selectedItems.push(fItem); fItem.markAsSelected(); this._fDraggableDataContext.markSelectionAsChanged(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution }); }; FSingleSelectExecution = __decorate([ FExecutionRegister(FSingleSelectRequest) ], FSingleSelectExecution); export { FSingleSelectExecution }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1zaW5nbGUtc2VsZWN0LmV4ZWN1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi1kcmFnZ2FibGUvZi1zaW5nbGUtc2VsZWN0L2Ytc2luZ2xlLXNlbGVjdC5leGVjdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBS3BFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7QUFJSSxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUFzQjtJQUVoQixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sQ0FBQyxPQUE2QjtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFLENB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Qjs7QUFBdEIsc0JBQXNCO0lBRGxDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO0dBQzVCLHNCQUFzQixDQW9HbEM7OzRGQXBHWSxzQkFBc0I7a0JBRmxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZFeGVjdXRpb25SZWdpc3RlciwgRk1lZGlhdG9yLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBGU2luZ2xlU2VsZWN0UmVxdWVzdCB9IGZyb20gJy4vZi1zaW5nbGUtc2VsZWN0LnJlcXVlc3QnO1xuaW1wb3J0IHsgaXNWYWxpZEV2ZW50VHJpZ2dlciwgVXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzUmVxdWVzdCB9IGZyb20gJy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGQ29ubmVjdGlvbkJhc2UgfSBmcm9tICcuLi8uLi9mLWNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgRkNvbXBvbmVudHNTdG9yZSB9IGZyb20gJy4uLy4uL2Ytc3RvcmFnZSc7XG5pbXBvcnQgeyBGRHJhZ2dhYmxlRGF0YUNvbnRleHQgfSBmcm9tICcuLi9mLWRyYWdnYWJsZS1kYXRhLWNvbnRleHQnO1xuaW1wb3J0IHsgSVNlbGVjdGFibGUgfSBmcm9tICcuLi8uLi9taXhpbnMnO1xuaW1wb3J0IHsgRk5vZGVCYXNlIH0gZnJvbSAnLi4vLi4vZi1ub2RlJztcbmltcG9ydCB7SVBvaW50ZXJFdmVudH0gZnJvbSBcIi4uLy4uL2RyYWctdG9vbGtpdFwiO1xuXG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHNlbGVjdGluZyBlbGVtZW50cyBpbiBhIGdyYXBoaWNhbCBpbnRlcmZhY2UuXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgYm90aCBzaW5nbGUgYW5kIG11bHRpLXNlbGVjdGlvbiwgdXBkYXRpbmcgdGhlIHNlbGVjdGlvbiBzdGF0ZVxuICogb2YgZWxlbWVudHMgYW5kIG1hbmFnaW5nIHJlbGF0ZWQgZGF0YS5cbiAqXG4gKiBMb2dpYyBmbG93OlxuICogMS4gKipWYWxpZGF0ZSB0aGUgc2VsZWN0aW9uIGV2ZW50Kio6XG4gKiAgICAtIFRoZSBldmVudCBpcyBjb25zaWRlcmVkIHZhbGlkIGlmIGl0IG9jY3VycyB3aXRoaW4gdGhlIGZsb3cgYm91bmRhcmllc1xuICogICAgICBhbmQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBkcmFnZ2FibGUgZGF0YSBvcGVyYXRpb25zLlxuICpcbiAqIDIuICoqRGV0ZXJtaW5lIHRoZSB0YXJnZXQgZWxlbWVudCB0byBzZWxlY3QqKjpcbiAqICAgIC0gVGhlIHRhcmdldCBlbGVtZW50IGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGV2ZW504oCZcyB0YXJnZXQuXG4gKiAgICAgIEl0IGNhbiBiZSBhIG5vZGUsIGEgZ3JvdXAgb2Ygbm9kZXMsIG9yIGEgY29ubmVjdGlvbi5cbiAqICAgIC0gSWYgbm8gZWxlbWVudCBpcyBmb3VuZCwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlIGlzIGNsZWFyZWQuXG4gKlxuICogMy4gKipVcGRhdGUgZWxlbWVudCBsYXllcnMqKjpcbiAqICAgIC0gSWYgYW4gZWxlbWVudCBpcyBmb3VuZCwgaXRzIHZpc3VhbCBsYXllciBhbmQgdGhlIGxheWVycyBvZiBpdHMgY2hpbGQgZWxlbWVudHMgYXJlIHVwZGF0ZWQuXG4gKlxuICogNC4gKipTaW5nbGUgb3IgbXVsdGktc2VsZWN0aW9uKio6XG4gKiAgICAtIElmIHRoZSBldmVudCBtZWV0cyB0aGUgY3JpdGVyaWEgZm9yIG11bHRpLXNlbGVjdGlvbiAoZS5nLiwgYSBtb2RpZmllciBrZXkgaXMgcHJlc3NlZCksXG4gKiAgICAgIG11bHRpLXNlbGVjdGlvbiBsb2dpYyBpcyBhcHBsaWVkLlxuICogICAgLSBPdGhlcndpc2UsIHNpbmdsZS1zZWxlY3Rpb24gbG9naWMgaXMgdXNlZC5cbiAqXG4gKiA1LiAqKlNpbmdsZS1zZWxlY3Rpb24gbG9naWMqKjpcbiAqICAgIC0gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkIGFuZCBjYW4gYmUgc2VsZWN0ZWQ6XG4gKiAgICAgIC0gQ2xlYXIgdGhlIHNlbGVjdGlvbiBvZiBhbGwgb3RoZXIgZWxlbWVudHMuXG4gKiAgICAgIC0gTWFyayB0aGUgY3VycmVudCBlbGVtZW50IGFzIHNlbGVjdGVkLlxuICogICAgLSBJZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc2VsZWN0ZWQsIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBjbGVhcmVkLlxuICpcbiAqIDYuICoqTXVsdGktc2VsZWN0aW9uIGxvZ2ljKio6XG4gKiAgICAtIElmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICogICAgLSBJZiB0aGUgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQgYW5kIGNhbiBiZSBzZWxlY3RlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqXG4gKiA3LiAqKk1hbmFnZSBzZWxlY3Rpb24gc3RhdGUqKjpcbiAqICAgIC0gQWRkaW5nIG9yIHJlbW92aW5nIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2VsZWN0aW9uIHRyaWdnZXJzIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMuXG4gKiAgICAtIFNlbGVjdGlvbiBzdGF0ZSBpcyB0cmFja2VkIGluIHRoZSBzaGFyZWQgY29udGV4dCBmb3IgZnV0dXJlIHVzZS5cbiAqL1xuXG5ASW5qZWN0YWJsZSgpXG5ARkV4ZWN1dGlvblJlZ2lzdGVyKEZTaW5nbGVTZWxlY3RSZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIEZTaW5nbGVTZWxlY3RFeGVjdXRpb24gaW1wbGVtZW50cyBJRXhlY3V0aW9uPEZTaW5nbGVTZWxlY3RSZXF1ZXN0LCB2b2lkPiB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZk1lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZDb21wb25lbnRzU3RvcmUgPSBpbmplY3QoRkNvbXBvbmVudHNTdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZEcmFnZ2FibGVEYXRhQ29udGV4dCA9IGluamVjdChGRHJhZ2dhYmxlRGF0YUNvbnRleHQpO1xuXG4gIHB1YmxpYyBoYW5kbGUocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWQocmVxdWVzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmSXRlbSA9IHRoaXMuX2dldEl0ZW1Ub1NlbGVjdChyZXF1ZXN0LmV2ZW50KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fdXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzKGZJdGVtKSk7XG5cbiAgICB0aGlzLl9pc011bHRpU2VsZWN0KHJlcXVlc3QpID8gdGhpcy5fbXVsdGlTZWxlY3QoZkl0ZW0pIDogdGhpcy5fc2luZ2xlU2VsZWN0KGZJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWQocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFdmVudEluRmxvd0JvdW5kcyhyZXF1ZXN0LmV2ZW50KSAmJiB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNFdmVudEluRmxvd0JvdW5kcyhldmVudDogSVBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZGbG93IS5ob3N0RWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEl0ZW1Ub1NlbGVjdChldmVudDogSVBvaW50ZXJFdmVudCk6IElTZWxlY3RhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Tm9kZU9yR3JvdXAoZXZlbnQudGFyZ2V0RWxlbWVudCkgfHwgdGhpcy5fZ2V0Q29ubmVjdGlvbihldmVudC50YXJnZXRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vZGVPckdyb3VwKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRk5vZGVCYXNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mTm9kZXMuZmluZCgoeCkgPT4gKHgpLmlzQ29udGFpbnModGFyZ2V0RWxlbWVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29ubmVjdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQpOiBGQ29ubmVjdGlvbkJhc2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZDb25uZWN0aW9uc1xuICAgICAgLmZpbmQoYyA9PiBjLmlzQ29udGFpbnMoZWxlbWVudCkgfHwgYy5mQ29ubmVjdGlvbkNlbnRlcj8ubmF0aXZlRWxlbWVudD8uY29udGFpbnMoZWxlbWVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzKGZJdGVtPzogSVNlbGVjdGFibGUpOiB2b2lkIHtcbiAgICBpZiAoZkl0ZW0pIHtcbiAgICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KFxuICAgICAgICBuZXcgVXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzUmVxdWVzdChmSXRlbSwgZkl0ZW0uaG9zdEVsZW1lbnQucGFyZW50RWxlbWVudCEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzTXVsdGlTZWxlY3QocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZEV2ZW50VHJpZ2dlcihyZXF1ZXN0LmV2ZW50Lm9yaWdpbmFsRXZlbnQsIHJlcXVlc3QuZk11bHRpU2VsZWN0VHJpZ2dlcik7XG4gIH1cblxuICBwcml2YXRlIF9zaW5nbGVTZWxlY3QoZkl0ZW0/OiBJU2VsZWN0YWJsZSk6IHZvaWQge1xuICAgIGlmIChmSXRlbSkge1xuICAgICAgaWYgKHRoaXMuX2lzSXRlbU5vdFNlbGVjdGVkQW5kU2VsZWN0YWJsZShmSXRlbSkpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0SXRlbShmSXRlbSk7XG4gICAgICB9IGVsc2UgaWYgKGZJdGVtLmZTZWxlY3Rpb25EaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzSXRlbU5vdFNlbGVjdGVkQW5kU2VsZWN0YWJsZShpdGVtOiBJU2VsZWN0YWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXRlbS5pc1NlbGVjdGVkKCkgJiYgIWl0ZW0uZlNlbGVjdGlvbkRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgeC51bm1hcmtBc1NlbGVjdGVkKCk7XG4gICAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQubWFya1NlbGVjdGlvbkFzQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dC5zZWxlY3RlZEl0ZW1zID0gW107XG4gIH1cblxuICBwcml2YXRlIF9tdWx0aVNlbGVjdChmSXRlbT86IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgaWYgKGZJdGVtICYmICFmSXRlbS5mU2VsZWN0aW9uRGlzYWJsZWQpIHtcbiAgICAgIGZJdGVtLmlzU2VsZWN0ZWQoKSA/IHRoaXMuX2Rlc2VsZWN0SXRlbShmSXRlbSkgOiB0aGlzLl9zZWxlY3RJdGVtKGZJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXNlbGVjdEl0ZW0oZkl0ZW06IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVtb3ZlSXRlbUZyb21TZWxlY3RlZEl0ZW1zKGZJdGVtKTtcbiAgICBmSXRlbS51bm1hcmtBc1NlbGVjdGVkKCk7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0Lm1hcmtTZWxlY3Rpb25Bc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUl0ZW1Gcm9tU2VsZWN0ZWRJdGVtcyhmSXRlbTogSVNlbGVjdGFibGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleEluU2VsZWN0aW9uID0gdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuaW5kZXhPZihmSXRlbSk7XG4gICAgaWYgKGluZGV4SW5TZWxlY3Rpb24gPiAtMSkge1xuICAgICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4SW5TZWxlY3Rpb24sIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEl0ZW0oZkl0ZW06IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMucHVzaChmSXRlbSk7XG4gICAgZkl0ZW0ubWFya0FzU2VsZWN0ZWQoKTtcbiAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQubWFya1NlbGVjdGlvbkFzQ2hhbmdlZCgpO1xuICB9XG59XG4iXX0=