UNPKG

ngx-diagrams

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

433 lines 29.3 kB
/** * @fileoverview added by tsickle * Generated from: lib/models/node.model.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { BehaviorSubject } from 'rxjs'; import { BaseModel } from './base.model'; import { distinctUntilChanged, map, takeUntil } from 'rxjs/operators'; import { mapToArray } from '../utils/tool-kit.util'; /** * @template P */ var /** * @template P */ NodeModel = /** @class */ (function (_super) { tslib_1.__extends(NodeModel, _super); function NodeModel(nodeType, id, extras, x, y, width, height, logPrefix) { if (nodeType === void 0) { nodeType = 'default'; } if (extras === void 0) { extras = {}; } if (x === void 0) { x = 0; } if (y === void 0) { y = 0; } if (width === void 0) { width = 0; } if (height === void 0) { height = 0; } if (logPrefix === void 0) { logPrefix = '[Node]'; } var _this = _super.call(this, nodeType, id, logPrefix) || this; _this._extras = new BehaviorSubject(extras); _this._ports = new BehaviorSubject({}); _this._dimensions = new BehaviorSubject({ width: width, height: height }); _this._coords = new BehaviorSubject({ x: x, y: y }); _this.extras$ = _this._extras.asObservable(); _this.ports$ = _this._ports.asObservable(); _this.coords$ = _this._coords.asObservable(); _this.dimensions$ = _this._dimensions.asObservable(); return _this; } /** * @return {?} */ NodeModel.prototype.getCoords = /** * @return {?} */ function () { return this._coords.getValue(); }; /** * @param {?} __0 * @return {?} */ NodeModel.prototype.setCoords = /** * @param {?} __0 * @return {?} */ function (_a) { var x = _a.x, y = _a.y; var _b = this.getCoords(), oldX = _b.x, oldY = _b.y; Object.values(this._ports.getValue()).forEach((/** * @param {?} port * @return {?} */ function (port) { Object.values(port.getLinks()).forEach((/** * @param {?} link * @return {?} */ function (link) { /** @type {?} */ var point = link.getPointForPort(port); var _a = point.getCoords(), pointX = _a.x, pointY = _a.y; point.setCoords({ x: pointX + x - oldX, y: pointY + y - oldY }); })); })); this._coords.next({ x: x, y: y }); }; // TODO: implement better transition on auto arrange! // TODO: implement better transition on auto arrange! /** * @param {?} __0 * @return {?} */ NodeModel.prototype.transitionToCoords = // TODO: implement better transition on auto arrange! /** * @param {?} __0 * @return {?} */ function (_a) { var x = _a.x, y = _a.y; // const transitionCompleted = new ReplaySubject(1); // let { x: oldX, y: oldY } = this.getCoords(); // console.log(x, y, oldX, oldY); // interval(0) // .pipe(takeUntil(transitionCompleted)) // .subscribe( // () => { // if (oldX < x) { // oldX++; // } else if (oldX > x) { // oldX--; // } // if (y > oldY) { // oldY++; // } else if (y < oldY) { // oldY--; // } // Object.values(this._ports.getValue()).forEach(port => { // Object.values(port.getLinks()).forEach(link => { // const point = link.getPointForPort(port); // const { x: pointX, y: pointY } = point.getCoords(); // point.setCoords({ x: pointX + x - oldX, y: pointY + y - oldY }); // }); // }); // this._coords.next({ x: oldX, y: oldY }); // if (x === oldX && y === oldY) { // transitionCompleted.next(true); // transitionCompleted.complete(); // } // }, // err => { // console.error(err); // }, // () => { // console.log('finished transition'); // } // ); }; // TODO: override selectionChanges and replace this with it (convert to rx) // TODO: override selectionChanges and replace this with it (convert to rx) /** * @return {?} */ NodeModel.prototype.getSelectedEntities = // TODO: override selectionChanges and replace this with it (convert to rx) /** * @return {?} */ function () { /** @type {?} */ var entities = _super.prototype.getSelectedEntities.call(this); // add the points of each link that are selected here if (this.getSelected()) { Object.values(this._ports.getValue()).forEach((/** * @param {?} port * @return {?} */ function (port) { /** @type {?} */ var links = Object.values(port.getLinks()); entities = entities.concat(links.map((/** * @param {?} link * @return {?} */ function (link) { return link.getPointForPort(port); }))); })); } this.log('selectedEntities', entities); return entities; }; // TODO: map to BaseEvent // TODO: map to BaseEvent /** * @return {?} */ NodeModel.prototype.coordsChanges = // TODO: map to BaseEvent /** * @return {?} */ function () { return this.coords$.pipe(takeUntil(this.onEntityDestroy())); }; /** * @return {?} */ NodeModel.prototype.selectCoords = /** * @return {?} */ function () { return this.coords$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged()); }; /** * @return {?} */ NodeModel.prototype.selectX = /** * @return {?} */ function () { return this.selectCoords().pipe(map((/** * @param {?} c * @return {?} */ function (c) { return c.x; })), this.withLog('selectX'), distinctUntilChanged()); }; /** * @return {?} */ NodeModel.prototype.selectY = /** * @return {?} */ function () { return this.selectCoords().pipe(map((/** * @param {?} c * @return {?} */ function (c) { return c.y; })), this.withLog('selectY'), distinctUntilChanged()); }; /** * Assign a port to the node and set the node as its getParent * @returns the inserted port */ /** * Assign a port to the node and set the node as its getParent * @param {?} port * @return {?} the inserted port */ NodeModel.prototype.addPort = /** * Assign a port to the node and set the node as its getParent * @param {?} port * @return {?} the inserted port */ function (port) { var _a; port.setParent(this); this._ports.next(tslib_1.__assign({}, this._ports.value, (_a = {}, _a[port.id] = port, _a))); return port; }; /** * @param {?} id * @return {?} */ NodeModel.prototype.getPort = /** * @param {?} id * @return {?} */ function (id) { return this._ports.value[id]; }; /** * @param {?=} selector * @return {?} */ NodeModel.prototype.selectPorts = /** * @param {?=} selector * @return {?} */ function (selector) { // TODO: implement selector // TODO: create coerce func return this.ports$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged(), map((/** * @param {?} ports * @return {?} */ function (ports) { return mapToArray(ports); })), this.withLog('selectPorts')); }; /** * @param {?=} ids * @return {?} */ NodeModel.prototype.getPorts = /** * @param {?=} ids * @return {?} */ function (ids) { return this._ports.getValue(); }; /** * @param {?} __0 * @return {?} */ NodeModel.prototype.setDimensions = /** * @param {?} __0 * @return {?} */ function (_a) { var width = _a.width, height = _a.height; this._dimensions.next({ width: width, height: height }); }; /** * @return {?} */ NodeModel.prototype.getDimensions = /** * @return {?} */ function () { return this._dimensions.getValue(); }; // TODO: return BaseEvent extension // TODO: return BaseEvent extension /** * @return {?} */ NodeModel.prototype.dimensionChanges = // TODO: return BaseEvent extension /** * @return {?} */ function () { return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged(), this.withLog('DimensionChanges')); }; /** * @return {?} */ NodeModel.prototype.getHeight = /** * @return {?} */ function () { return this._dimensions.getValue().height; }; /** * @return {?} */ NodeModel.prototype.getWidth = /** * @return {?} */ function () { return this._dimensions.getValue().width; }; /** * @return {?} */ NodeModel.prototype.selectWidth = /** * @return {?} */ function () { return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), map((/** * @param {?} d * @return {?} */ function (d) { return d.width; })), distinctUntilChanged(), this.withLog('selectWidth')); }; /** * @return {?} */ NodeModel.prototype.selectHeight = /** * @return {?} */ function () { return this.dimensions$.pipe(takeUntil(this.onEntityDestroy()), map((/** * @param {?} d * @return {?} */ function (d) { return d.width; })), distinctUntilChanged(), this.withLog('selectHeight')); }; /** * @param {?} extras * @return {?} */ NodeModel.prototype.setExtras = /** * @param {?} extras * @return {?} */ function (extras) { this._extras.next(extras); }; /** * @return {?} */ NodeModel.prototype.getExtras = /** * @return {?} */ function () { return this._extras.getValue(); }; /** * @template E * @param {?=} selector * @return {?} */ NodeModel.prototype.selectExtras = /** * @template E * @param {?=} selector * @return {?} */ function (selector) { // TODO: impl selector return this.extras$.pipe(takeUntil(this.onEntityDestroy()), distinctUntilChanged()); }; return NodeModel; }(BaseModel)); /** * @template P */ export { NodeModel }; if (false) { /** @type {?} */ NodeModel.prototype.id; /** @type {?} */ NodeModel.prototype.diagramEngine; /** * @type {?} * @private */ NodeModel.prototype._extras; /** * @type {?} * @private */ NodeModel.prototype._ports; /** * @type {?} * @private */ NodeModel.prototype._coords; /** * @type {?} * @private */ NodeModel.prototype._dimensions; /** * @type {?} * @private */ NodeModel.prototype.extras$; /** * @type {?} * @private */ NodeModel.prototype.ports$; /** * @type {?} * @private */ NodeModel.prototype.coords$; /** * @type {?} * @private */ NodeModel.prototype.dimensions$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1kaWFncmFtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbHMvbm9kZS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RSxPQUFPLEVBQU0sVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFFeEQ7Ozs7SUFBZ0UscUNBQXVCO0lBYXRGLG1CQUNDLFFBQTRCLEVBQzVCLEVBQVcsRUFDWCxNQUFpQyxFQUNqQyxDQUFhLEVBQ2IsQ0FBYSxFQUNiLEtBQWlCLEVBQ2pCLE1BQWtCLEVBQ2xCLFNBQW9CO1FBUHBCLHlCQUFBLEVBQUEsb0JBQTRCO1FBRTVCLHVCQUFBLEVBQUEsV0FBaUM7UUFDakMsa0JBQUEsRUFBQSxLQUFhO1FBQ2Isa0JBQUEsRUFBQSxLQUFhO1FBQ2Isc0JBQUEsRUFBQSxTQUFpQjtRQUNqQix1QkFBQSxFQUFBLFVBQWtCO1FBQ2xCLDBCQUFBLEVBQUEsb0JBQW9CO1FBUnJCLFlBVUMsa0JBQU0sUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsU0FTOUI7UUFSQSxLQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsS0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBYSxFQUFFLEtBQUssT0FBQSxFQUFFLE1BQU0sUUFBQSxFQUFFLENBQUMsQ0FBQztRQUN0RSxLQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7SUFDcEQsQ0FBQzs7OztJQUVELDZCQUFTOzs7SUFBVDtRQUNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNoQyxDQUFDOzs7OztJQUVELDZCQUFTOzs7O0lBQVQsVUFBVSxFQUFnQjtZQUFkLFFBQUMsRUFBRSxRQUFDO1FBQ1QsSUFBQSxxQkFBdUMsRUFBckMsV0FBTyxFQUFFLFdBQTRCO1FBRTdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFBLElBQUk7WUFDakQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQSxJQUFJOztvQkFDcEMsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxJQUFBLHNCQUE0QyxFQUExQyxhQUFTLEVBQUUsYUFBK0I7Z0JBQ2xELEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqRSxDQUFDLEVBQUMsQ0FBQztRQUNKLENBQUMsRUFBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUEsRUFBRSxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHFEQUFxRDs7Ozs7O0lBQ3JELHNDQUFrQjs7Ozs7O0lBQWxCLFVBQW1CLEVBQWdCO1lBQWQsUUFBQyxFQUFFLFFBQUM7UUFDeEIsb0RBQW9EO1FBQ3BELCtDQUErQztRQUMvQyxpQ0FBaUM7UUFDakMsY0FBYztRQUNkLHlDQUF5QztRQUN6QyxlQUFlO1FBQ2YsWUFBWTtRQUNaLHFCQUFxQjtRQUNyQixjQUFjO1FBQ2QsNEJBQTRCO1FBQzVCLGNBQWM7UUFDZCxPQUFPO1FBQ1AscUJBQXFCO1FBQ3JCLGNBQWM7UUFDZCw0QkFBNEI7UUFDNUIsY0FBYztRQUNkLE9BQU87UUFDUCw2REFBNkQ7UUFDN0QsdURBQXVEO1FBQ3ZELGlEQUFpRDtRQUNqRCwyREFBMkQ7UUFDM0Qsd0VBQXdFO1FBQ3hFLFVBQVU7UUFDVixTQUFTO1FBQ1QsOENBQThDO1FBQzlDLHFDQUFxQztRQUNyQyxzQ0FBc0M7UUFDdEMsc0NBQXNDO1FBQ3RDLE9BQU87UUFDUCxPQUFPO1FBQ1AsYUFBYTtRQUNiLHlCQUF5QjtRQUN6QixPQUFPO1FBQ1AsWUFBWTtRQUNaLHlDQUF5QztRQUN6QyxNQUFNO1FBQ04sTUFBTTtJQUNQLENBQUM7SUFFRCwyRUFBMkU7Ozs7O0lBQzNFLHVDQUFtQjs7Ozs7SUFBbkI7O1lBQ0ssUUFBUSxHQUFHLGlCQUFNLG1CQUFtQixXQUFFO1FBRTFDLHFEQUFxRDtRQUNyRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQSxJQUFJOztvQkFDM0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1QyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FDekIsS0FBSyxDQUFDLEdBQUc7Ozs7Z0JBQUMsVUFBQSxJQUFJO29CQUNiLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsQ0FBQyxFQUFDLENBQ0YsQ0FBQztZQUNILENBQUMsRUFBQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFRCx5QkFBeUI7Ozs7O0lBQ3pCLGlDQUFhOzs7OztJQUFiO1FBQ0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDOzs7O0lBRUQsZ0NBQVk7OztJQUFaO1FBQ0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdkIsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUNqQyxvQkFBb0IsRUFBRSxDQUN0QixDQUFDO0lBQ0gsQ0FBQzs7OztJQUVELDJCQUFPOzs7SUFBUDtRQUNDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDOUIsR0FBRzs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLENBQUMsRUFBSCxDQUFHLEVBQUMsRUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUN2QixvQkFBb0IsRUFBRSxDQUN0QixDQUFDO0lBQ0gsQ0FBQzs7OztJQUVELDJCQUFPOzs7SUFBUDtRQUNDLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDOUIsR0FBRzs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLENBQUMsRUFBSCxDQUFHLEVBQUMsRUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUN2QixvQkFBb0IsRUFBRSxDQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0gsMkJBQU87Ozs7O0lBQVAsVUFBUSxJQUFPOztRQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLHNCQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxlQUFHLElBQUksQ0FBQyxFQUFFLElBQUcsSUFBSSxPQUFHLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDOzs7OztJQUVELDJCQUFPOzs7O0lBQVAsVUFBUSxFQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDOzs7OztJQUVELCtCQUFXOzs7O0lBQVgsVUFBWSxRQUFvQztRQUMvQywyQkFBMkI7UUFDM0IsMkJBQTJCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFDakMsb0JBQW9CLEVBQUUsRUFDdEIsR0FBRzs7OztRQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFqQixDQUFpQixFQUFDLEVBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQzNCLENBQUM7SUFDSCxDQUFDOzs7OztJQUVELDRCQUFROzs7O0lBQVIsVUFBUyxHQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOzs7OztJQUVELGlDQUFhOzs7O0lBQWIsVUFBYyxFQUE2QjtZQUEzQixnQkFBSyxFQUFFLGtCQUFNO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7SUFFRCxpQ0FBYTs7O0lBQWI7UUFDQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1DQUFtQzs7Ozs7SUFDbkMsb0NBQWdCOzs7OztJQUFoQjtRQUNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFDakMsb0JBQW9CLEVBQUUsRUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUNoQyxDQUFDO0lBQ0gsQ0FBQzs7OztJQUVELDZCQUFTOzs7SUFBVDtRQUNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDM0MsQ0FBQzs7OztJQUVELDRCQUFROzs7SUFBUjtRQUNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVELCtCQUFXOzs7SUFBWDtRQUNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFDakMsR0FBRzs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssRUFBUCxDQUFPLEVBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FDM0IsQ0FBQztJQUNILENBQUM7Ozs7SUFFRCxnQ0FBWTs7O0lBQVo7UUFDQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQ2pDLEdBQUc7Ozs7UUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLEVBQVAsQ0FBTyxFQUFDLEVBQ2pCLG9CQUFvQixFQUFFLEVBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQzVCLENBQUM7SUFDSCxDQUFDOzs7OztJQUVELDZCQUFTOzs7O0lBQVQsVUFBVSxNQUFXO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7Ozs7SUFFRCw2QkFBUzs7O0lBQVQ7UUFDQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7Ozs7O0lBRUQsZ0NBQVk7Ozs7O0lBQVosVUFBc0IsUUFBdUQ7UUFDNUUsc0JBQXNCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3ZCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFDakMsb0JBQW9CLEVBQUUsQ0FDdEIsQ0FBQztJQUNILENBQUM7SUFDRixnQkFBQztBQUFELENBQUMsQUFwT0QsQ0FBZ0UsU0FBUyxHQW9PeEU7Ozs7Ozs7SUFuT0EsdUJBQU87O0lBQ1Asa0NBQTZCOzs7OztJQUU3Qiw0QkFBZ0U7Ozs7O0lBQ2hFLDJCQUE2RDs7Ozs7SUFDN0QsNEJBQWtEOzs7OztJQUNsRCxnQ0FBMEQ7Ozs7O0lBQzFELDRCQUEyRDs7Ozs7SUFDM0QsMkJBQXdEOzs7OztJQUN4RCw0QkFBNkM7Ozs7O0lBQzdDLGdDQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9ydE1vZGVsIH0gZnJvbSAnLi9wb3J0Lm1vZGVsJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWFncmFtTW9kZWwgfSBmcm9tICcuL2RpYWdyYW0ubW9kZWwnO1xuaW1wb3J0IHsgQ29vcmRzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb29yZHMuaW50ZXJmYWNlLmpzJztcbmltcG9ydCB7IERpYWdyYW1FbmdpbmUgfSBmcm9tICcuLi9zZXJ2aWNlcy9lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kaW1lbnNpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRCwgbWFwVG9BcnJheSB9IGZyb20gJy4uL3V0aWxzL3Rvb2wta2l0LnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgTm9kZU1vZGVsPFAgZXh0ZW5kcyBQb3J0TW9kZWwgPSBQb3J0TW9kZWw+IGV4dGVuZHMgQmFzZU1vZGVsPERpYWdyYW1Nb2RlbD4ge1xuXHRpZDogSUQ7XG5cdGRpYWdyYW1FbmdpbmU6IERpYWdyYW1FbmdpbmU7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfZXh0cmFzOiBCZWhhdmlvclN1YmplY3Q8eyBbczogc3RyaW5nXTogYW55IH0+O1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wb3J0czogQmVoYXZpb3JTdWJqZWN0PHsgW3M6IHN0cmluZ106IFAgfT47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2Nvb3JkczogQmVoYXZpb3JTdWJqZWN0PENvb3Jkcz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RpbWVuc2lvbnM6IEJlaGF2aW9yU3ViamVjdDxEaW1lbnNpb25zPjtcblx0cHJpdmF0ZSByZWFkb25seSBleHRyYXMkOiBPYnNlcnZhYmxlPHsgW3M6IHN0cmluZ106IGFueSB9Pjtcblx0cHJpdmF0ZSByZWFkb25seSBwb3J0cyQ6IE9ic2VydmFibGU8eyBbczogc3RyaW5nXTogUCB9Pjtcblx0cHJpdmF0ZSByZWFkb25seSBjb29yZHMkOiBPYnNlcnZhYmxlPENvb3Jkcz47XG5cdHByaXZhdGUgcmVhZG9ubHkgZGltZW5zaW9ucyQ6IE9ic2VydmFibGU8RGltZW5zaW9ucz47XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0bm9kZVR5cGU6IHN0cmluZyA9ICdkZWZhdWx0Jyxcblx0XHRpZD86IHN0cmluZyxcblx0XHRleHRyYXM6IHsgW3M6IHN0cmluZ106IGFueSB9ID0ge30sXG5cdFx0eDogbnVtYmVyID0gMCxcblx0XHR5OiBudW1iZXIgPSAwLFxuXHRcdHdpZHRoOiBudW1iZXIgPSAwLFxuXHRcdGhlaWdodDogbnVtYmVyID0gMCxcblx0XHRsb2dQcmVmaXggPSAnW05vZGVdJ1xuXHQpIHtcblx0XHRzdXBlcihub2RlVHlwZSwgaWQsIGxvZ1ByZWZpeCk7XG5cdFx0dGhpcy5fZXh0cmFzID0gbmV3IEJlaGF2aW9yU3ViamVjdChleHRyYXMpO1xuXHRcdHRoaXMuX3BvcnRzID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG5cdFx0dGhpcy5fZGltZW5zaW9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGltZW5zaW9ucz4oeyB3aWR0aCwgaGVpZ2h0IH0pO1xuXHRcdHRoaXMuX2Nvb3JkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29vcmRzPih7IHgsIHkgfSk7XG5cdFx0dGhpcy5leHRyYXMkID0gdGhpcy5fZXh0cmFzLmFzT2JzZXJ2YWJsZSgpO1xuXHRcdHRoaXMucG9ydHMkID0gdGhpcy5fcG9ydHMuYXNPYnNlcnZhYmxlKCk7XG5cdFx0dGhpcy5jb29yZHMkID0gdGhpcy5fY29vcmRzLmFzT2JzZXJ2YWJsZSgpO1xuXHRcdHRoaXMuZGltZW5zaW9ucyQgPSB0aGlzLl9kaW1lbnNpb25zLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0Z2V0Q29vcmRzKCk6IENvb3JkcyB7XG5cdFx0cmV0dXJuIHRoaXMuX2Nvb3Jkcy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2V0Q29vcmRzKHsgeCwgeSB9OiBDb29yZHMpIHtcblx0XHRjb25zdCB7IHg6IG9sZFgsIHk6IG9sZFkgfSA9IHRoaXMuZ2V0Q29vcmRzKCk7XG5cblx0XHRPYmplY3QudmFsdWVzKHRoaXMuX3BvcnRzLmdldFZhbHVlKCkpLmZvckVhY2gocG9ydCA9PiB7XG5cdFx0XHRPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSkuZm9yRWFjaChsaW5rID0+IHtcblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHRcdFx0Y29uc3QgeyB4OiBwb2ludFgsIHk6IHBvaW50WSB9ID0gcG9pbnQuZ2V0Q29vcmRzKCk7XG5cdFx0XHRcdHBvaW50LnNldENvb3Jkcyh7IHg6IHBvaW50WCArIHggLSBvbGRYLCB5OiBwb2ludFkgKyB5IC0gb2xkWSB9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5fY29vcmRzLm5leHQoeyB4LCB5IH0pO1xuXHR9XG5cblx0Ly8gVE9ETzogaW1wbGVtZW50IGJldHRlciB0cmFuc2l0aW9uIG9uIGF1dG8gYXJyYW5nZSFcblx0dHJhbnNpdGlvblRvQ29vcmRzKHsgeCwgeSB9OiBDb29yZHMpIHtcblx0XHQvLyBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGVkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cdFx0Ly8gbGV0IHsgeDogb2xkWCwgeTogb2xkWSB9ID0gdGhpcy5nZXRDb29yZHMoKTtcblx0XHQvLyBjb25zb2xlLmxvZyh4LCB5LCBvbGRYLCBvbGRZKTtcblx0XHQvLyBpbnRlcnZhbCgwKVxuXHRcdC8vIFx0LnBpcGUodGFrZVVudGlsKHRyYW5zaXRpb25Db21wbGV0ZWQpKVxuXHRcdC8vIFx0LnN1YnNjcmliZShcblx0XHQvLyBcdFx0KCkgPT4ge1xuXHRcdC8vIFx0XHRcdGlmIChvbGRYIDwgeCkge1xuXHRcdC8vIFx0XHRcdFx0b2xkWCsrO1xuXHRcdC8vIFx0XHRcdH0gZWxzZSBpZiAob2xkWCA+IHgpIHtcblx0XHQvLyBcdFx0XHRcdG9sZFgtLTtcblx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0aWYgKHkgPiBvbGRZKSB7XG5cdFx0Ly8gXHRcdFx0XHRvbGRZKys7XG5cdFx0Ly8gXHRcdFx0fSBlbHNlIGlmICh5IDwgb2xkWSkge1xuXHRcdC8vIFx0XHRcdFx0b2xkWS0tO1xuXHRcdC8vIFx0XHRcdH1cblx0XHQvLyBcdFx0XHRPYmplY3QudmFsdWVzKHRoaXMuX3BvcnRzLmdldFZhbHVlKCkpLmZvckVhY2gocG9ydCA9PiB7XG5cdFx0Ly8gXHRcdFx0XHRPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSkuZm9yRWFjaChsaW5rID0+IHtcblx0XHQvLyBcdFx0XHRcdFx0Y29uc3QgcG9pbnQgPSBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHQvLyBcdFx0XHRcdFx0Y29uc3QgeyB4OiBwb2ludFgsIHk6IHBvaW50WSB9ID0gcG9pbnQuZ2V0Q29vcmRzKCk7XG5cdFx0Ly8gXHRcdFx0XHRcdHBvaW50LnNldENvb3Jkcyh7IHg6IHBvaW50WCArIHggLSBvbGRYLCB5OiBwb2ludFkgKyB5IC0gb2xkWSB9KTtcblx0XHQvLyBcdFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdH0pO1xuXHRcdC8vIFx0XHRcdHRoaXMuX2Nvb3Jkcy5uZXh0KHsgeDogb2xkWCwgeTogb2xkWSB9KTtcblx0XHQvLyBcdFx0XHRpZiAoeCA9PT0gb2xkWCAmJiB5ID09PSBvbGRZKSB7XG5cdFx0Ly8gXHRcdFx0XHR0cmFuc2l0aW9uQ29tcGxldGVkLm5leHQodHJ1ZSk7XG5cdFx0Ly8gXHRcdFx0XHR0cmFuc2l0aW9uQ29tcGxldGVkLmNvbXBsZXRlKCk7XG5cdFx0Ly8gXHRcdFx0fVxuXHRcdC8vIFx0XHR9LFxuXHRcdC8vIFx0XHRlcnIgPT4ge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyKTtcblx0XHQvLyBcdFx0fSxcblx0XHQvLyBcdFx0KCkgPT4ge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdmaW5pc2hlZCB0cmFuc2l0aW9uJyk7XG5cdFx0Ly8gXHRcdH1cblx0XHQvLyBcdCk7XG5cdH1cblxuXHQvLyBUT0RPOiBvdmVycmlkZSBzZWxlY3Rpb25DaGFuZ2VzIGFuZCByZXBsYWNlIHRoaXMgd2l0aCBpdCAoY29udmVydCB0byByeClcblx0Z2V0U2VsZWN0ZWRFbnRpdGllcygpIHtcblx0XHRsZXQgZW50aXRpZXMgPSBzdXBlci5nZXRTZWxlY3RlZEVudGl0aWVzKCk7XG5cblx0XHQvLyBhZGQgdGhlIHBvaW50cyBvZiBlYWNoIGxpbmsgdGhhdCBhcmUgc2VsZWN0ZWQgaGVyZVxuXHRcdGlmICh0aGlzLmdldFNlbGVjdGVkKCkpIHtcblx0XHRcdE9iamVjdC52YWx1ZXModGhpcy5fcG9ydHMuZ2V0VmFsdWUoKSkuZm9yRWFjaChwb3J0ID0+IHtcblx0XHRcdFx0Y29uc3QgbGlua3MgPSBPYmplY3QudmFsdWVzKHBvcnQuZ2V0TGlua3MoKSk7XG5cdFx0XHRcdGVudGl0aWVzID0gZW50aXRpZXMuY29uY2F0KFxuXHRcdFx0XHRcdGxpbmtzLm1hcChsaW5rID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2coJ3NlbGVjdGVkRW50aXRpZXMnLCBlbnRpdGllcyk7XG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9XG5cblx0Ly8gVE9ETzogbWFwIHRvIEJhc2VFdmVudFxuXHRjb29yZHNDaGFuZ2VzKCk6IE9ic2VydmFibGU8Q29vcmRzPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29vcmRzJC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRW50aXR5RGVzdHJveSgpKSk7XG5cdH1cblxuXHRzZWxlY3RDb29yZHMoKTogT2JzZXJ2YWJsZTxDb29yZHM+IHtcblx0XHRyZXR1cm4gdGhpcy5jb29yZHMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG5cdFx0KTtcblx0fVxuXG5cdHNlbGVjdFgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5zZWxlY3RDb29yZHMoKS5waXBlKFxuXHRcdFx0bWFwKGMgPT4gYy54KSxcblx0XHRcdHRoaXMud2l0aExvZygnc2VsZWN0WCcpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuXHRcdCk7XG5cdH1cblxuXHRzZWxlY3RZKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2VsZWN0Q29vcmRzKCkucGlwZShcblx0XHRcdG1hcChjID0+IGMueSksXG5cdFx0XHR0aGlzLndpdGhMb2coJ3NlbGVjdFknKSxcblx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFzc2lnbiBhIHBvcnQgdG8gdGhlIG5vZGUgYW5kIHNldCB0aGUgbm9kZSBhcyBpdHMgZ2V0UGFyZW50XG5cdCAqIEByZXR1cm5zIHRoZSBpbnNlcnRlZCBwb3J0XG5cdCAqL1xuXHRhZGRQb3J0KHBvcnQ6IFApOiBQIHtcblx0XHRwb3J0LnNldFBhcmVudCh0aGlzKTtcblx0XHR0aGlzLl9wb3J0cy5uZXh0KHsgLi4udGhpcy5fcG9ydHMudmFsdWUsIFtwb3J0LmlkXTogcG9ydCB9KTtcblx0XHRyZXR1cm4gcG9ydDtcblx0fVxuXG5cdGdldFBvcnQoaWQ6IElEKTogUCB7XG5cdFx0cmV0dXJuIHRoaXMuX3BvcnRzLnZhbHVlW2lkXTtcblx0fVxuXG5cdHNlbGVjdFBvcnRzKHNlbGVjdG9yPzogKCkgPT4gYm9vbGVhbiB8IElEIHwgSURbXSk6IE9ic2VydmFibGU8UFtdPiB7XG5cdFx0Ly8gVE9ETzogaW1wbGVtZW50IHNlbGVjdG9yXG5cdFx0Ly8gVE9ETzogY3JlYXRlIGNvZXJjZSBmdW5jXG5cdFx0cmV0dXJuIHRoaXMucG9ydHMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuXHRcdFx0bWFwKHBvcnRzID0+IG1hcFRvQXJyYXkocG9ydHMpKSxcblx0XHRcdHRoaXMud2l0aExvZygnc2VsZWN0UG9ydHMnKVxuXHRcdCk7XG5cdH1cblxuXHRnZXRQb3J0cyhpZHM/OiBJRFtdKTogeyBbczogc3RyaW5nXTogUCB8IFBbXSB9IHtcblx0XHRyZXR1cm4gdGhpcy5fcG9ydHMuZ2V0VmFsdWUoKTtcblx0fVxuXG5cdHNldERpbWVuc2lvbnMoeyB3aWR0aCwgaGVpZ2h0IH06IERpbWVuc2lvbnMpIHtcblx0XHR0aGlzLl9kaW1lbnNpb25zLm5leHQoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuXHR9XG5cblx0Z2V0RGltZW5zaW9ucygpOiBEaW1lbnNpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fZGltZW5zaW9ucy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0Ly8gVE9ETzogcmV0dXJuIEJhc2VFdmVudCBleHRlbnNpb25cblx0ZGltZW5zaW9uQ2hhbmdlcygpOiBPYnNlcnZhYmxlPERpbWVuc2lvbnM+IHtcblx0XHRyZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcblx0XHRcdHRoaXMud2l0aExvZygnRGltZW5zaW9uQ2hhbmdlcycpXG5cdFx0KTtcblx0fVxuXG5cdGdldEhlaWdodCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9kaW1lbnNpb25zLmdldFZhbHVlKCkuaGVpZ2h0O1xuXHR9XG5cblx0Z2V0V2lkdGgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fZGltZW5zaW9ucy5nZXRWYWx1ZSgpLndpZHRoO1xuXHR9XG5cblx0c2VsZWN0V2lkdGgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcblx0XHRyZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0bWFwKGQgPT4gZC53aWR0aCksXG5cdFx0XHRkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuXHRcdFx0dGhpcy53aXRoTG9nKCdzZWxlY3RXaWR0aCcpXG5cdFx0KTtcblx0fVxuXG5cdHNlbGVjdEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXHRcdHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnBpcGUoXG5cdFx0XHR0YWtlVW50aWwodGhpcy5vbkVudGl0eURlc3Ryb3koKSksXG5cdFx0XHRtYXAoZCA9PiBkLndpZHRoKSxcblx0XHRcdGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG5cdFx0XHR0aGlzLndpdGhMb2coJ3NlbGVjdEhlaWdodCcpXG5cdFx0KTtcblx0fVxuXG5cdHNldEV4dHJhcyhleHRyYXM6IGFueSkge1xuXHRcdHRoaXMuX2V4dHJhcy5uZXh0KGV4dHJhcyk7XG5cdH1cblxuXHRnZXRFeHRyYXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4dHJhcy5nZXRWYWx1ZSgpO1xuXHR9XG5cblx0c2VsZWN0RXh0cmFzPEUgPSBhbnk+KHNlbGVjdG9yPzogKGV4dHJhOiBFKSA9PiBFW2tleW9mIEVdIHwgc3RyaW5nIHwgc3RyaW5nW10pIHtcblx0XHQvLyBUT0RPOiBpbXBsIHNlbGVjdG9yXG5cdFx0cmV0dXJuIHRoaXMuZXh0cmFzJC5waXBlKFxuXHRcdFx0dGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpLFxuXHRcdFx0ZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuXHRcdCk7XG5cdH1cbn1cbiJdfQ==