UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

469 lines 47.3 kB
/** * @fileoverview added by tsickle * Generated from: services/drag-drop.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, NgZone } from '@angular/core'; import { Observable, Subject } from 'rxjs'; import { DragDropTouch } from '../touch-support/dragdrop-touch'; import { Utils } from '../shared/utils'; var DragDropService = /** @class */ (function () { function DragDropService(ngZone) { var _this = this; this.ngZone = ngZone; this.dropTargets = []; this.dropEvent = new Subject(); this.dragEndEvent = new Subject(); this.dragStartEvent = new Subject(); this.subscription = Observable.create().subscribe(); this.dragEmptyImage = new Image(); this.dragItemParentName = ''; this.dragItemChildrenName = ''; this.intersectionObserver = null; /*协同拖拽需要 */ this.dragElShowHideEvent = new Subject(); this.followMouse4CloneNode = (/** * @param {?} event * @return {?} */ function (event) { var _a = _this.dragOffset, offsetLeft = _a.offsetLeft, offsetTop = _a.offsetTop; var clientX = event.clientX, clientY = event.clientY; requestAnimationFrame((/** * @return {?} */ function () { if (!_this.dragCloneNode) { return; } _this.dragCloneNode.style.left = clientX - offsetLeft + 'px'; _this.dragCloneNode.style.top = clientY - offsetTop + 'px'; })); }); this.touchInstance = DragDropTouch.getInstance(); // service not support OnInit, only support OnDestroy, so write in constructor // tslint:disable-next-line: max-line-length this.dragEmptyImage.src = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=='; // safari的img必须要有src } /** * @return {?} */ DragDropService.prototype.newSubscription = /** * @return {?} */ function () { this.subscription.unsubscribe(); return this.subscription = Observable.create().subscribe(); }; /** * @return {?} */ DragDropService.prototype.enableDraggedCloneNodeFollowMouse = /** * @return {?} */ function () { var _this = this; if (!this.dragCloneNode) { this.dragItemContainer = this.draggedEl.parentElement; if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) { this.dragPreviewDirective.createPreview(); this.dragCloneNode = this.dragPreviewDirective.getPreviewElement(); this.dragItemContainer = document.body; } else { this.dragCloneNode = this.draggedEl.cloneNode(true); } this.dragCloneNode.style.margin = '0'; if (this.dragFollowOptions && this.dragFollowOptions.appendToBody) { this.dragItemContainer = document.body; this.copyStyle(this.draggedEl, this.dragCloneNode); } if (this.dragItemChildrenName !== '') { /** @type {?} */ var parentElement = this.dragItemParentName === '' ? this.dragCloneNode : document.querySelector(this.dragItemParentName); /** @type {?} */ var dragItemChildren = parentElement.querySelectorAll(this.dragItemChildrenName); this.interceptChildNode(parentElement, dragItemChildren); } // 拷贝canvas的内容 /** @type {?} */ var originCanvasArr_1 = this.draggedEl.querySelectorAll('canvas'); /** @type {?} */ var targetCanvasArr = this.dragCloneNode.querySelectorAll('canvas'); [].forEach.call(targetCanvasArr, (/** * @param {?} canvas * @param {?} index * @return {?} */ function (canvas, index) { canvas.getContext('2d').drawImage(originCanvasArr_1[index], 0, 0); })); this.ngZone.runOutsideAngular((/** * @return {?} */ function () { document.addEventListener('dragover', _this.followMouse4CloneNode, { capture: true, passive: true }); })); this.dragCloneNode.style.width = this.dragOffset.width + 'px'; this.dragCloneNode.style.height = this.dragOffset.height + 'px'; if (!(this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate && this.dragPreviewDirective.dragPreviewOptions && this.dragPreviewDirective.dragPreviewOptions.skipBatchPreview)) { // 批量拖拽样式 if (this.batchDragging && this.batchDragData && this.batchDragData.length > 1) { // 创建一个节点容器 /** @type {?} */ var node = document.createElement('div'); node.appendChild(this.dragCloneNode); node.classList.add('batch-dragged-node'); /* 计数样式定位 */ if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('badge') > -1) { /** @type {?} */ var badge = document.createElement('div'); badge.innerText = this.batchDragData.length + ''; badge.classList.add('batch-dragged-node-count'); node.style.position = 'relative'; /** @type {?} */ var style = { position: 'absolute', right: '5px', top: '-12px', height: '24px', width: '24px', borderRadius: '12px', fontSize: '14px', lineHeight: '24px', textAlign: 'center', color: '#fff', background: ['#5170ff', 'var(--brand-1, #5170ff)'] }; Utils.addElStyles(badge, style); node.appendChild(badge); } /* 层叠感样式定位 */ if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('stack') > -1) { /** @type {?} */ var stack = 2; if (this.batchDragData.length === 2) { stack = 1; } for (var i = 0; i < stack; i++) { /** @type {?} */ var stackNode = this.dragCloneNode.cloneNode(false); /** @type {?} */ var stackStyle = { position: 'absolute', left: -5 * (i + 1) + 'px', top: -5 * (i + 1) + 'px', zIndex: -(i + 1) + '', width: this.dragOffset.width + 'px', height: this.dragOffset.height + 'px', background: '#fff', border: ['1px solid #5170ff', '1px solid var(--brand-1, #5170ff)'] }; Utils.addElStyles(stackNode, stackStyle); node.appendChild(stackNode); } } this.dragCloneNode = node; } } this.dragCloneNode.classList.add('drag-clone-node'); if (!(this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate)) { this.dragCloneNode.style.width = this.dragOffset.width + 'px'; this.dragCloneNode.style.height = this.dragOffset.height + 'px'; } this.dragCloneNode.style.position = 'fixed'; this.dragCloneNode.style.zIndex = '1090'; this.dragCloneNode.style.pointerEvents = 'none'; this.dragCloneNode.style.top = this.dragOffset.top + 'px'; this.dragCloneNode.style.left = this.dragOffset.left + 'px'; this.dragCloneNode.style.willChange = 'left, top'; this.dragItemContainer.appendChild(this.dragCloneNode); this.ngZone.runOutsideAngular((/** * @return {?} */ function () { setTimeout((/** * @return {?} */ function () { if (_this.draggedEl) { _this.draggedEl.style.display = 'none'; _this.dragElShowHideEvent.next(false); if (_this.dragOriginPlaceholder) { _this.dragOriginPlaceholder.style.display = 'block'; } } })); })); } }; /** * @return {?} */ DragDropService.prototype.disableDraggedCloneNodeFollowMouse = /** * @return {?} */ function () { if (this.dragCloneNode) { document.removeEventListener('dragover', this.followMouse4CloneNode, { capture: true }); this.dragItemContainer.removeChild(this.dragCloneNode); this.draggedEl.style.display = ''; this.dragElShowHideEvent.next(true); } if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) { this.dragPreviewDirective.destroyPreview(); } this.dragCloneNode = undefined; this.dragItemContainer = undefined; if (this.intersectionObserver) { this.intersectionObserver.disconnect(); } }; /** * @param {?} parentNode * @param {?} childNodeList * @return {?} */ DragDropService.prototype.interceptChildNode = /** * @param {?} parentNode * @param {?} childNodeList * @return {?} */ function (parentNode, childNodeList) { var _this = this; /** @type {?} */ var interceptOptions = { root: parentNode }; this.intersectionObserver = new IntersectionObserver(this.setChildNodeHide, interceptOptions); [].forEach.call(childNodeList, (/** * @param {?} childNode * @return {?} */ function (childNode) { _this.intersectionObserver.observe(childNode); })); }; /** * @param {?} entries * @return {?} */ DragDropService.prototype.setChildNodeHide = /** * @param {?} entries * @return {?} */ function (entries) { entries.forEach((/** * @param {?} element * @return {?} */ function (element) { var isIntersecting = element.isIntersecting, childNode = element.target; if (isIntersecting) { childNode.style.display = 'block'; } else { childNode.style.display = 'none'; } })); }; /** * @param {?=} identity * @param {?=} order * @return {?} */ DragDropService.prototype.getBatchDragData = /** * @param {?=} identity * @param {?=} order * @return {?} */ function (identity, order) { if (order === void 0) { order = 'draggedElFirst'; } /** @type {?} */ var result = this.batchDragData.map((/** * @param {?} dragData * @return {?} */ function (dragData) { return dragData.dragData; })); if (typeof order === 'function') { result.sort((/** @type {?} */ (order))); } else if (order === 'draggedElFirst') { /** @type {?} */ var dragData = this.dragData; if (identity) { /** @type {?} */ var realDragData = this.batchDragData.filter((/** * @param {?} dd * @return {?} */ function (dd) { return dd.identity === identity; })).pop().dragData; dragData = realDragData; } result.splice(result.indexOf(dragData), 1); result.splice(0, 0, dragData); } return result; }; /** usage: * constructor(..., private dragDropService: DragDropService) {} * cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); } */ /** * usage: * constructor(..., private dragDropService: DragDropService) {} * cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); } * @return {?} */ DragDropService.prototype.cleanBatchDragData = /** * usage: * constructor(..., private dragDropService: DragDropService) {} * cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); } * @return {?} */ function () { /** @type {?} */ var batchDragData = this.batchDragData; if (this.batchDragData) { this.batchDragData .filter((/** * @param {?} dragData * @return {?} */ function (dragData) { return dragData.draggable; })) .map((/** * @param {?} dragData * @return {?} */ function (dragData) { return dragData.draggable; })) .forEach((/** * @param {?} draggable * @return {?} */ function (draggable) { return draggable.batchDraggable.dragData = undefined; })); this.batchDragData = undefined; this.batchDragGroup = undefined; } return batchDragData; }; /** * @param {?} source * @param {?} target * @return {?} */ DragDropService.prototype.copyStyle = /** * @param {?} source * @param {?} target * @return {?} */ function (source, target) { ['id', 'class', 'style', 'draggable'].forEach((/** * @param {?} att * @return {?} */ function (att) { target.removeAttribute(att); })); // copy style (without transitions) /** @type {?} */ var computedStyle = getComputedStyle(source); for (var i = 0; i < computedStyle.length; i++) { /** @type {?} */ var key = computedStyle[i]; if (key.indexOf('transition') < 0) { target.style[key] = computedStyle[key]; } } target.style.pointerEvents = 'none'; // and repeat for all children for (var i = 0; i < source.children.length; i++) { this.copyStyle(source.children[i], target.children[i]); } }; DragDropService.decorators = [ { type: Injectable } ]; /** @nocollapse */ DragDropService.ctorParameters = function () { return [ { type: NgZone } ]; }; return DragDropService; }()); export { DragDropService }; if (false) { /** @type {?} */ DragDropService.prototype.dragData; /** @type {?} */ DragDropService.prototype.draggedEl; /** @type {?} */ DragDropService.prototype.draggedElIdentity; /** @type {?} */ DragDropService.prototype.batchDragData; /** @type {?} */ DragDropService.prototype.batchDragGroup; /** @type {?} */ DragDropService.prototype.batchDragStyle; /** @type {?} */ DragDropService.prototype.batchDragging; /** @type {?} */ DragDropService.prototype.scope; /** @type {?} */ DragDropService.prototype.dropTargets; /** @type {?} */ DragDropService.prototype.dropEvent; /** @type {?} */ DragDropService.prototype.dragEndEvent; /** @type {?} */ DragDropService.prototype.dragStartEvent; /** @type {?} */ DragDropService.prototype.dropOnItem; /** @type {?} */ DragDropService.prototype.dragFollow; /** @type {?} */ DragDropService.prototype.dragFollowOptions; /** @type {?} */ DragDropService.prototype.dropOnOrigin; /** @type {?} */ DragDropService.prototype.draggedElFollowingMouse; /** @type {?} */ DragDropService.prototype.dragOffset; /** @type {?} */ DragDropService.prototype.subscription; /** @type {?} */ DragDropService.prototype.dragEmptyImage; /** @type {?} */ DragDropService.prototype.dragCloneNode; /** @type {?} */ DragDropService.prototype.dragOriginPlaceholder; /** @type {?} */ DragDropService.prototype.dragItemContainer; /** @type {?} */ DragDropService.prototype.dragItemParentName; /** @type {?} */ DragDropService.prototype.dragItemChildrenName; /** @type {?} */ DragDropService.prototype.intersectionObserver; /** @type {?} */ DragDropService.prototype.sub; /** @type {?} */ DragDropService.prototype.dragOriginPlaceholderNextSibling; /** @type {?} */ DragDropService.prototype.touchInstance; /** @type {?} */ DragDropService.prototype.dragElShowHideEvent; /** @type {?} */ DragDropService.prototype.dragSyncGroupDirectives; /** @type {?} */ DragDropService.prototype.dragPreviewDirective; /** @type {?} */ DragDropService.prototype.followMouse4CloneNode; /** * @type {?} * @private */ DragDropService.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kcmFnZHJvcC8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL2RyYWctZHJvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHeEM7SUFtREUseUJBQW9CLE1BQWM7UUFBbEMsaUJBS0M7UUFMbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXJDbEMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNsQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFnQnBDLGlCQUFZLEdBQWlCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3RCxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFJN0IsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBUSxJQUFJLENBQUM7O1FBTWpDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFnTDdDLDBCQUFxQjs7OztRQUFHLFVBQUMsS0FBSztZQUN0QixJQUFBLHFCQUF5QyxFQUF4QywwQkFBVSxFQUFFLHdCQUE0QjtZQUN4QyxJQUFBLHVCQUFPLEVBQUUsdUJBQU87WUFDdkIscUJBQXFCOzs7WUFBQztnQkFDcEIsSUFBSSxDQUFD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QTZDOztJQUM3QyxrREFBd0I7O0lBRXhCLCtDQUEyQzs7SUE2SzNDLGdEQVFDOzs7OztJQW5MVyxpQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERyYWdEcm9wVG91Y2ggfSBmcm9tICcuLi90b3VjaC1zdXBwb3J0L2RyYWdkcm9wLXRvdWNoJztcclxuaW1wb3J0IHsgRHJhZ2dhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi9kaXJlY3RpdmVzL2RyYWdnYWJsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL3NoYXJlZC91dGlscyc7XHJcbmltcG9ydCB7IERyYWdQcmV2aWV3RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kcmFnLXByZXZpZXcuZGlyZWN0aXZlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERyYWdEcm9wU2VydmljZSB7XHJcbiAgZHJhZ0RhdGE6IGFueTtcclxuICBkcmFnZ2VkRWw6IGFueTtcclxuICBkcmFnZ2VkRWxJZGVudGl0eTogYW55O1xyXG4gIGJhdGNoRHJhZ0RhdGE6IEFycmF5PHtcclxuICAgIGlkZW50aXR5PzogYW55O1xyXG4gICAgZHJhZ2dhYmxlOiBEcmFnZ2FibGVEaXJlY3RpdmU7XHJcbiAgICBkcmFnRGF0YTogYW55O1xyXG4gIH0+O1xyXG4gIGJhdGNoRHJhZ0dyb3VwOiBzdHJpbmc7XHJcbiAgYmF0Y2hEcmFnU3R5bGU6IEFycmF5PHN0cmluZz47XHJcbiAgYmF0Y2hEcmFnZ2luZzogYm9vbGVhbjtcclxuICBzY29wZTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICBkcm9wVGFyZ2V0cyA9IFtdO1xyXG4gIGRyb3BFdmVudDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICBkcmFnRW5kRXZlbnQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgZHJhZ1N0YXJ0RXZlbnQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgZHJvcE9uSXRlbTogYm9vbGVhbjtcclxuICBkcmFnRm9sbG93OiBib29sZWFuO1xyXG4gIGRyYWdGb2xsb3dPcHRpb25zOiB7XHJcbiAgICBhcHBlbmRUb0JvZHk/OiBib29sZWFuO1xyXG4gIH07XHJcbiAgZHJvcE9uT3JpZ2luOiBib29sZWFuO1xyXG4gIGRyYWdnZWRFbEZvbGxvd2luZ01vdXNlOiBib29sZWFuO1xyXG4gIGRyYWdPZmZzZXQ6IHtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xyXG4gICAgb2Zmc2V0VG9wOiBudW1iZXI7XHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuICAgIGhlaWdodD86IG51bWJlcjtcclxuICB9O1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gT2JzZXJ2YWJsZS5jcmVhdGUoKS5zdWJzY3JpYmUoKTtcclxuICBkcmFnRW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gIGRyYWdDbG9uZU5vZGU6IGFueTtcclxuICBkcmFnT3JpZ2luUGxhY2Vob2xkZXI6IGFueTtcclxuICBkcmFnSXRlbUNvbnRhaW5lcjogYW55O1xyXG4gIGRyYWdJdGVtUGFyZW50TmFtZSA9ICcnO1xyXG4gIGRyYWdJdGVtQ2hpbGRyZW5OYW1lID0gJyc7XHJcbiAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IGFueSA9IG51bGw7XHJcbiAgc3ViO1xyXG4gIGRyYWdPcmlnaW5QbGFjZWhvbGRlck5leHRTaWJsaW5nOiBhbnk7XHJcbiAgdG91Y2hJbnN0YW5jZTtcclxuXHJcbiAgLyrljY/lkIzmi5bmi73pnIDopoEgKi9cclxuICBkcmFnRWxTaG93SGlkZUV2ZW50ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBkcmFnU3luY0dyb3VwRGlyZWN0aXZlcztcclxuICAvKumihOiniOWKn+iDvSAqL1xyXG4gIGRyYWdQcmV2aWV3RGlyZWN0aXZlOiBEcmFnUHJldmlld0RpcmVjdGl2ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xyXG4gICAgdGhpcy50b3VjaEluc3RhbmNlID0gRHJhZ0Ryb3BUb3VjaC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgLy8gc2VydmljZSBub3Qgc3VwcG9ydCBPbkluaXQsIG9ubHkgc3VwcG9ydCBPbkRlc3Ryb3ksIHNvIHdyaXRlIGluIGNvbnN0cnVjdG9yXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgdGhpcy5kcmFnRW1wdHlJbWFnZS5zcmMgPSAnZGF0YTppbWFnZS9naWY7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQURVbEVRVlFJbVdOZ1lHQmdBQUFBQlFBQmg2Rk8xQUFBQUFCSlJVNUVya0pnZ2c9PSc7IC8vIHNhZmFyaeeahGltZ+W/hemhu+imgeaciXNyY1xyXG4gIH1cclxuICBuZXdTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uID0gT2JzZXJ2YWJsZS5jcmVhdGUoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZURyYWdnZWRDbG9uZU5vZGVGb2xsb3dNb3VzZSgpIHtcclxuICAgIGlmICghdGhpcy5kcmFnQ2xvbmVOb2RlKSB7XHJcbiAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSB0aGlzLmRyYWdnZWRFbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICBpZiAodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZSAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmNyZWF0ZVByZXZpZXcoKTtcclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmdldFByZXZpZXdFbGVtZW50KCk7XHJcbiAgICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlID0gdGhpcy5kcmFnZ2VkRWwuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICBpZiAodGhpcy5kcmFnRm9sbG93T3B0aW9ucyAmJiB0aGlzLmRyYWdGb2xsb3dPcHRpb25zLmFwcGVuZFRvQm9keSkge1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIHRoaXMuY29weVN0eWxlKHRoaXMuZHJhZ2dlZEVsLCB0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5kcmFnSXRlbUNoaWxkcmVuTmFtZSAhPT0gJycpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5kcmFnSXRlbVBhcmVudE5hbWUgPT09ICcnID8gdGhpcy5kcmFnQ2xvbmVOb2RlIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdJdGVtUGFyZW50TmFtZSk7XHJcbiAgICAgICAgY29uc3QgZHJhZ0l0ZW1DaGlsZHJlbiA9IHBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLmRyYWdJdGVtQ2hpbGRyZW5OYW1lKTtcclxuICAgICAgICB0aGlzLmludGVyY2VwdENoaWxkTm9kZShwYXJlbnRFbGVtZW50LCBkcmFnSXRlbUNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDmi7fotJ1jYW52YXPnmoTlhoXlrrlcclxuICAgICAgY29uc3Qgb3JpZ2luQ2FudmFzQXJyID0gdGhpcy5kcmFnZ2VkRWwucXVlcnlTZWxlY3RvckFsbCgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IHRhcmdldENhbnZhc0FyciA9IHRoaXMuZHJhZ0Nsb25lTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKTtcclxuICAgICAgW10uZm9yRWFjaC5jYWxsKHRhcmdldENhbnZhc0FyciwgKGNhbnZhcywgaW5kZXgpID0+IHtcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2Uob3JpZ2luQ2FudmFzQXJyW2luZGV4XSwgMCwgMCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5mb2xsb3dNb3VzZTRDbG9uZU5vZGUsIHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUud2lkdGggPSB0aGlzLmRyYWdPZmZzZXQud2lkdGggKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcblxyXG4gICAgICBpZiAoISh0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlXHJcbiAgICAgICAgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlXHJcbiAgICAgICAgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld09wdGlvbnNcclxuICAgICAgICAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3T3B0aW9ucy5za2lwQmF0Y2hQcmV2aWV3KSkge1xyXG4gICAgICAvLyDmibnph4/mi5bmi73moLflvI9cclxuICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnZ2luZyAmJiB0aGlzLmJhdGNoRHJhZ0RhdGEgJiYgdGhpcy5iYXRjaERyYWdEYXRhLmxlbmd0aCA+IDEgKSB7XHJcbiAgICAgICAgLy8g5Yib5bu65LiA5Liq6IqC54K55a655ZmoXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ2JhdGNoLWRyYWdnZWQtbm9kZScpO1xyXG5cclxuICAgICAgICAvKiDorqHmlbDmoLflvI/lrprkvY0gKi9cclxuICAgICAgICBpZiAodGhpcy5iYXRjaERyYWdTdHlsZSAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmxlbmd0aCAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmluZGV4T2YoJ2JhZGdlJykgPiAtMSkge1xyXG4gICAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGJhZGdlLmlubmVyVGV4dCA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGggKyAnJztcclxuICAgICAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ2JhdGNoLWRyYWdnZWQtbm9kZS1jb3VudCcpO1xyXG4gICAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgIHJpZ2h0OiAnNXB4JyxcclxuICAgICAgICAgICAgdG9wOiAnLTEycHgnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICcyNHB4JyxcclxuICAgICAgICAgICAgd2lkdGg6ICcyNHB4JyxcclxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXHJcbiAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXHJcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6ICcyNHB4JyxcclxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgY29sb3I6ICcjZmZmJyxcclxuICAgICAgICAgICAgYmFja2dyb3VuZDogWycjNTE3MGZmJywgJ3ZhcigtLWJyYW5kLTEsICM1MTcwZmYpJ11cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBVdGlscy5hZGRFbFN0eWxlcyhiYWRnZSwgc3R5bGUpO1xyXG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChiYWRnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiDlsYLlj6DmhJ/moLflvI/lrprkvY0gKi9cclxuICAgICAgICBpZiAodGhpcy5iYXRjaERyYWdTdHlsZSAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmxlbmd0aCAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmluZGV4T2YoJ3N0YWNrJykgPiAtMSkge1xyXG4gICAgICAgICAgbGV0IHN0YWNrID0gMjtcclxuICAgICAgICAgIGlmICh0aGlzLmJhdGNoRHJhZ0RhdGEubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgIHN0YWNrID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2s7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja05vZGUgPSB0aGlzLmRyYWdDbG9uZU5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tTdHlsZSA9IHtcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgICBsZWZ0OiAtNSAqIChpICsgMSApICsgJ3B4JyxcclxuICAgICAgICAgICAgICB0b3A6IC01ICogKGkgKyAxICkgK+OAgCdweCcsXHJcbiAgICAgICAgICAgICAgekluZGV4OiAtIChpICsgMSkgKyAnJyxcclxuICAgICAgICAgICAgICB3aWR0aDogdGhpcy5kcmFnT2Zmc2V0LndpZHRoICsgJ3B4JyxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuZHJhZ09mZnNldC5oZWlnaHQgKyAncHgnLFxyXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcclxuICAgICAgICAgICAgICBib3JkZXI6IFsnMXB4IHNvbGlkICM1MTcwZmYnLCAnMXB4IHNvbGlkIHZhcigtLWJyYW5kLTEsICM1MTcwZmYpJ11cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgVXRpbHMuYWRkRWxTdHlsZXMoc3RhY2tOb2RlLCBzdGFja1N0eWxlKTtcclxuICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdGFja05vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLmNsYXNzTGlzdC5hZGQoJ2RyYWctY2xvbmUtbm9kZScpO1xyXG4gICAgICBpZiAoISAodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZSAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3VGVtcGxhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLndpZHRoID0gdGhpcy5kcmFnT2Zmc2V0LndpZHRoICsgJ3B4JztcclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnpJbmRleCA9ICcxMDkwJztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS50b3AgPSB0aGlzLmRyYWdPZmZzZXQudG9wICsgJ3B4JztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLmxlZnQgPSB0aGlzLmRyYWdPZmZzZXQubGVmdCArICdweCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS53aWxsQ2hhbmdlID0gJ2xlZnQsIHRvcCc7XHJcbiAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZEVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsU2hvd0hpZGVFdmVudC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ09yaWdpblBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kcmFnT3JpZ2luUGxhY2Vob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9ICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzYWJsZURyYWdnZWRDbG9uZU5vZGVGb2xsb3dNb3VzZSgpIHtcclxuICAgIGlmICh0aGlzLmRyYWdDbG9uZU5vZGUpIHtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmZvbGxvd01vdXNlNENsb25lTm9kZSwge2NhcHR1cmU6IHRydWV9KTtcclxuICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB0aGlzLmRyYWdnZWRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgIHRoaXMuZHJhZ0VsU2hvd0hpZGVFdmVudC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZGVzdHJveVByZXZpZXcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZHJhZ0Nsb25lTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnRlcmNlcHRDaGlsZE5vZGUocGFyZW50Tm9kZSwgY2hpbGROb2RlTGlzdCkge1xyXG4gICAgY29uc3QgaW50ZXJjZXB0T3B0aW9ucyA9IHtcclxuICAgICAgcm9vdDogcGFyZW50Tm9kZVxyXG4gICAgfTtcclxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5zZXRDaGlsZE5vZGVIaWRlLCBpbnRlcmNlcHRPcHRpb25zKTtcclxuICAgIFtdLmZvckVhY2guY2FsbChjaGlsZE5vZGVMaXN0LCBjaGlsZE5vZGUgPT4ge1xyXG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUoY2hpbGROb2RlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hpbGROb2RlSGlkZShlbnRyaWVzKSB7XHJcbiAgICBlbnRyaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHtpc0ludGVyc2VjdGluZywgdGFyZ2V0OiBjaGlsZE5vZGV9ID0gZWxlbWVudDtcclxuICAgICAgaWYgKGlzSW50ZXJzZWN0aW5nKSB7XHJcbiAgICAgICAgY2hpbGROb2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNoaWxkTm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvbGxvd01vdXNlNENsb25lTm9kZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3Qge29mZnNldExlZnQsIG9mZnNldFRvcH0gPSB0aGlzLmRyYWdPZmZzZXQ7XHJcbiAgICBjb25zdCB7Y2xpZW50WCwgY2xpZW50WX0gPSBldmVudDtcclxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5kcmFnQ2xvbmVOb2RlKSB7IHJldHVybjsgfVxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubGVmdCA9ICBjbGllbnRYIC0gb2Zmc2V0TGVmdCArICdweCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS50b3AgPSAgY2xpZW50WSAtIG9mZnNldFRvcCArICdweCc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhdGNoRHJhZ0RhdGEoaWRlbnRpdHk/LCBvcmRlcjogKChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyKSB8ICdzZWxlY3QnIHwgJ2RyYWdnZWRFbEZpcnN0JyA9ICdkcmFnZ2VkRWxGaXJzdCcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5tYXAoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ0RhdGEpO1xyXG4gICAgaWYgKHR5cGVvZiBvcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICByZXN1bHQuc29ydCg8KChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyKT5vcmRlcik7XHJcbiAgICB9IGVsc2UgaWYgKG9yZGVyID09PSAnZHJhZ2dlZEVsRmlyc3QnKSB7XHJcbiAgICAgIGxldCBkcmFnRGF0YSA9IHRoaXMuZHJhZ0RhdGE7XHJcbiAgICAgIGlmIChpZGVudGl0eSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWxEcmFnRGF0YSA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5maWx0ZXIoZGQgPT4gZGQuaWRlbnRpdHkgPT09IGlkZW50aXR5KS5wb3AoKS5kcmFnRGF0YTtcclxuICAgICAgICBkcmFnRGF0YSA9IHJlYWxEcmFnRGF0YTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQuc3BsaWNlKHJlc3VsdC5pbmRleE9mKGRyYWdEYXRhKSwgMSk7XHJcbiAgICAgIHJlc3VsdC5zcGxpY2UoMCwgMCwgZHJhZ0RhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICAgfVxyXG5cclxuICAgLyoqIHVzYWdlOlxyXG4gICAgKiBjb25zdHJ1Y3RvciguLi4sIHByaXZhdGUgZHJhZ0Ryb3BTZXJ2aWNlOiBEcmFnRHJvcFNlcnZpY2UpIHt9XHJcbiAgICAqIGNsZWFuQmF0Y2hEcmFnRGF0YSgpIHsgdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2xlYW5CYXRjaERyYWdEYXRhKCk7IH1cclxuICAgICovXHJcbiAgIHB1YmxpYyBjbGVhbkJhdGNoRHJhZ0RhdGEoKSB7XHJcbiAgICAgY29uc3QgYmF0Y2hEcmFnRGF0YSA9IHRoaXMuYmF0Y2hEcmFnRGF0YTtcclxuICAgICBpZiAodGhpcy5iYXRjaERyYWdEYXRhKSB7XHJcbiAgICAgIHRoaXMuYmF0Y2hEcmFnRGF0YVxyXG4gICAgICAgIC5maWx0ZXIoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ2dhYmxlKVxyXG4gICAgICAgIC5tYXAoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ2dhYmxlKVxyXG4gICAgICAgIC5mb3JFYWNoKGRyYWdnYWJsZSA9PiBkcmFnZ2FibGUuYmF0Y2hEcmFnZ2FibGUuZHJhZ0RhdGEgPSB1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmJhdGNoRHJhZ0RhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuYmF0Y2hEcmFnR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiBiYXRjaERyYWdEYXRhO1xyXG4gICB9XHJcblxyXG4gICBwdWJsaWMgY29weVN0eWxlKHNvdXJjZSwgdGFyZ2V0KSB7XHJcbiAgICBbJ2lkJywgJ2NsYXNzJywgJ3N0eWxlJywgJ2RyYWdnYWJsZSddLmZvckVhY2goZnVuY3Rpb24gKGF0dCkge1xyXG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb3B5IHN0eWxlICh3aXRob3V0IHRyYW5zaXRpb25zKVxyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoc291cmNlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHV0ZWRTdHlsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSBjb21wdXRlZFN0eWxlW2ldO1xyXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZigndHJhbnNpdGlvbicpIDwgMCkge1xyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlW2tleV0gPSBjb21wdXRlZFN0eWxlW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRhcmdldC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAvLyBhbmQgcmVwZWF0IGZvciBhbGwgY2hpbGRyZW5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLmNvcHlTdHlsZShzb3VyY2UuY2hpbGRyZW5baV0sIHRhcmdldC5jaGlsZHJlbltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIl19