UNPKG

@alfresco/adf-content-services

Version:
134 lines 17.2 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Injectable } from '@angular/core'; import { DataSource } from '@angular/cdk/collections'; import { FlatTreeControl } from '@angular/cdk/tree'; import { BehaviorSubject } from 'rxjs'; import * as i0 from "@angular/core"; export class TreeService extends DataSource { get treeNodes() { return this.treeControl.dataNodes; } set treeNodes(nodes) { this.treeControl.dataNodes = nodes; this.treeNodesSource.next(nodes); } constructor() { super(); this.treeNodesSource = new BehaviorSubject([]); this.treeControl = new FlatTreeControl((node) => node.level, (node) => node.hasChildren); this.treeNodes = []; } /** * Expands node applying subnodes to it. * * @param nodeToExpand Node to be expanded * @param subNodes List of nodes that will be added as children of expanded node */ expandNode(nodeToExpand, subNodes) { if (nodeToExpand != null && subNodes != null && nodeToExpand.hasChildren) { this.treeControl.expand(nodeToExpand); const index = this.treeNodes.indexOf(nodeToExpand); this.treeNodes.splice(index + 1, 0, ...subNodes); nodeToExpand.isLoading = false; this.treeNodesSource.next(this.treeNodes); } } /** * Collapses a node removing all children from it. * * @param nodeToCollapse Node to be collapsed */ collapseNode(nodeToCollapse) { if (nodeToCollapse?.hasChildren) { this.treeControl.collapse(nodeToCollapse); const children = this.treeNodes.filter((node) => nodeToCollapse.id === node.parentId); children.forEach((child) => { this.collapseInnerNode(child); }); this.treeNodesSource.next(this.treeNodes); } } /** * Append more child nodes to already expanded parent node * * @param nodeToAppend Expanded parent node * @param subNodes List of nodes that will be added as children of expanded node */ appendNodes(nodeToAppend, subNodes) { if (nodeToAppend != null && subNodes != null) { const lastChild = this.treeNodes.filter((treeNode) => nodeToAppend.id === treeNode.parentId).pop(); const index = this.treeNodes.indexOf(lastChild); const children = this.treeControl.getDescendants(lastChild).length; this.treeNodes.splice(index + children + 1, 0, ...subNodes); nodeToAppend.isLoading = false; this.treeNodesSource.next(this.treeNodes); } } /** * Removes provided node from the tree * * @param node Node to be removed */ removeNode(node) { this.treeNodes.splice(this.treeNodes.indexOf(node), 1); } /** * Gets children of the node * * @param parentNode Parent node * @returns children of parent node */ getChildren(parentNode) { return this.treeNodes.filter((treeNode) => treeNode.parentId === parentNode.id); } /** * Checks if tree is empty * * @returns boolean */ isEmpty() { return !this.treeNodes.length; } /** * Gets parent node of given node. If node with parentNodeId is not found it returns undefined. * * @param parentNodeId Id of a parent node to be found * @returns parent node or undefined when not found */ getParentNode(parentNodeId) { return this.treeNodes.find((treeNode) => treeNode.id === parentNodeId); } connect() { return this.treeNodesSource.asObservable(); } disconnect() { } collapseInnerNode(nodeToCollapse) { const index = this.treeNodes.indexOf(nodeToCollapse); this.treeNodes.splice(index, 1); if (nodeToCollapse.hasChildren) { this.treeNodes.filter((node) => nodeToCollapse.id === node.parentId).forEach((child) => this.collapseInnerNode(child)); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TreeService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90cmVlL3NlcnZpY2VzL3RyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFLbkQsTUFBTSxPQUFnQixXQUFnQyxTQUFRLFVBQWE7SUFJdkUsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFaTCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1FBYWxELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQ2xDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUNwQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFJRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxZQUFlLEVBQUUsUUFBYTtRQUM1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Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxZQUFvQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBVyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTSxPQUFPO1FBQ1YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFTSxVQUFVLEtBQVUsQ0FBQztJQUVwQixpQkFBaUIsQ0FBQyxjQUFpQjtRQUN2QyxNQUFNLEtBQUssR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDakksQ0FBQztJQUNMLENBQUM7OEdBM0hpQixXQUFXO2tIQUFYLFdBQVcsY0FEUCxNQUFNOzsyRkFDVixXQUFXO2tCQURoQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtbm9kZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVHJlZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtcmVzcG9uc2UuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmVlU2VydmljZTxUIGV4dGVuZHMgVHJlZU5vZGU+IGV4dGVuZHMgRGF0YVNvdXJjZTxUPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IHRyZWVDb250cm9sOiBGbGF0VHJlZUNvbnRyb2w8VD47XG4gICAgcHVibGljIHRyZWVOb2Rlc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihbXSk7XG5cbiAgICBnZXQgdHJlZU5vZGVzKCk6IFRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDb250cm9sLmRhdGFOb2RlcztcbiAgICB9XG5cbiAgICBzZXQgdHJlZU5vZGVzKG5vZGVzOiBUW10pIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dChub2Rlcyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wgPSBuZXcgRmxhdFRyZWVDb250cm9sPFQ+KFxuICAgICAgICAgICAgKG5vZGUpID0+IG5vZGUubGV2ZWwsXG4gICAgICAgICAgICAobm9kZSkgPT4gbm9kZS5oYXNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgICB0aGlzLnRyZWVOb2RlcyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRTdWJOb2RlcyhwYXJlbnROb2RlSWQ6IHN0cmluZywgc2tpcENvdW50PzogbnVtYmVyLCBtYXhJdGVtcz86IG51bWJlciwgc2VhcmNoVGVybT86IHN0cmluZyk6IE9ic2VydmFibGU8VHJlZVJlc3BvbnNlPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgbm9kZSBhcHBseWluZyBzdWJub2RlcyB0byBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlVG9FeHBhbmQgTm9kZSB0byBiZSBleHBhbmRlZFxuICAgICAqIEBwYXJhbSBzdWJOb2RlcyBMaXN0IG9mIG5vZGVzIHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBjaGlsZHJlbiBvZiBleHBhbmRlZCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZE5vZGUobm9kZVRvRXhwYW5kOiBULCBzdWJOb2RlczogVFtdKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9FeHBhbmQgIT0gbnVsbCAmJiBzdWJOb2RlcyAhPSBudWxsICYmIG5vZGVUb0V4cGFuZC5oYXNDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQobm9kZVRvRXhwYW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLnRyZWVOb2Rlcy5pbmRleE9mKG5vZGVUb0V4cGFuZCk7XG4gICAgICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCAuLi5zdWJOb2Rlcyk7XG4gICAgICAgICAgICBub2RlVG9FeHBhbmQuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRyZWVOb2Rlc1NvdXJjZS5uZXh0KHRoaXMudHJlZU5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBhIG5vZGUgcmVtb3ZpbmcgYWxsIGNoaWxkcmVuIGZyb20gaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVRvQ29sbGFwc2UgTm9kZSB0byBiZSBjb2xsYXBzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VOb2RlKG5vZGVUb0NvbGxhcHNlOiBUKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9Db2xsYXBzZT8uaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudHJlZUNvbnRyb2wuY29sbGFwc2Uobm9kZVRvQ29sbGFwc2UpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW46IFRbXSA9IHRoaXMudHJlZU5vZGVzLmZpbHRlcigobm9kZTogVCkgPT4gbm9kZVRvQ29sbGFwc2UuaWQgPT09IG5vZGUucGFyZW50SWQpO1xuICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlSW5uZXJOb2RlKGNoaWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dCh0aGlzLnRyZWVOb2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBlbmQgbW9yZSBjaGlsZCBub2RlcyB0byBhbHJlYWR5IGV4cGFuZGVkIHBhcmVudCBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZVRvQXBwZW5kIEV4cGFuZGVkIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHN1Yk5vZGVzIExpc3Qgb2Ygbm9kZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGNoaWxkcmVuIG9mIGV4cGFuZGVkIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kTm9kZXMobm9kZVRvQXBwZW5kOiBULCBzdWJOb2RlczogVFtdKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlVG9BcHBlbmQgIT0gbnVsbCAmJiBzdWJOb2RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q2hpbGQ6IFQgPSB0aGlzLnRyZWVOb2Rlcy5maWx0ZXIoKHRyZWVOb2RlOiBUKSA9PiBub2RlVG9BcHBlbmQuaWQgPT09IHRyZWVOb2RlLnBhcmVudElkKS5wb3AoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLnRyZWVOb2Rlcy5pbmRleE9mKGxhc3RDaGlsZCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbjogbnVtYmVyID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhsYXN0Q2hpbGQpLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMudHJlZU5vZGVzLnNwbGljZShpbmRleCArIGNoaWxkcmVuICsgMSwgMCwgLi4uc3ViTm9kZXMpO1xuICAgICAgICAgICAgbm9kZVRvQXBwZW5kLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXNTb3VyY2UubmV4dCh0aGlzLnRyZWVOb2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHByb3ZpZGVkIG5vZGUgZnJvbSB0aGUgdHJlZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBiZSByZW1vdmVkXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZU5vZGUobm9kZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UodGhpcy50cmVlTm9kZXMuaW5kZXhPZihub2RlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGUgUGFyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBjaGlsZHJlbiBvZiBwYXJlbnQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDaGlsZHJlbihwYXJlbnROb2RlOiBUKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVzLmZpbHRlcigodHJlZU5vZGU6IFQpID0+IHRyZWVOb2RlLnBhcmVudElkID09PSBwYXJlbnROb2RlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHJlZSBpcyBlbXB0eVxuICAgICAqXG4gICAgICogQHJldHVybnMgYm9vbGVhblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudHJlZU5vZGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHBhcmVudCBub2RlIG9mIGdpdmVuIG5vZGUuIElmIG5vZGUgd2l0aCBwYXJlbnROb2RlSWQgaXMgbm90IGZvdW5kIGl0IHJldHVybnMgdW5kZWZpbmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudE5vZGVJZCBJZCBvZiBhIHBhcmVudCBub2RlIHRvIGJlIGZvdW5kXG4gICAgICogQHJldHVybnMgcGFyZW50IG5vZGUgb3IgdW5kZWZpbmVkIHdoZW4gbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmVudE5vZGUocGFyZW50Tm9kZUlkOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVzLmZpbmQoKHRyZWVOb2RlOiBUKSA9PiB0cmVlTm9kZS5pZCA9PT0gcGFyZW50Tm9kZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTm9kZXNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7fVxuXG4gICAgcHJpdmF0ZSBjb2xsYXBzZUlubmVyTm9kZShub2RlVG9Db2xsYXBzZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy50cmVlTm9kZXMuaW5kZXhPZihub2RlVG9Db2xsYXBzZSk7XG4gICAgICAgIHRoaXMudHJlZU5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGlmIChub2RlVG9Db2xsYXBzZS5oYXNDaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy50cmVlTm9kZXMuZmlsdGVyKChub2RlOiBUKSA9PiBub2RlVG9Db2xsYXBzZS5pZCA9PT0gbm9kZS5wYXJlbnRJZCkuZm9yRWFjaCgoY2hpbGQ6IFQpID0+IHRoaXMuY29sbGFwc2VJbm5lck5vZGUoY2hpbGQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==