UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

428 lines 45.6 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'; export class DragDropService { /** * @param {?} ngZone */ constructor(ngZone) { 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 {?} */ (event) => { const { offsetLeft, offsetTop } = this.dragOffset; const { clientX, clientY } = event; requestAnimationFrame((/** * @return {?} */ () => { 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 {?} */ newSubscription() { this.subscription.unsubscribe(); return this.subscription = Observable.create().subscribe(); } /** * @return {?} */ enableDraggedCloneNodeFollowMouse() { 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 {?} */ const parentElement = this.dragItemParentName === '' ? this.dragCloneNode : document.querySelector(this.dragItemParentName); /** @type {?} */ const dragItemChildren = parentElement.querySelectorAll(this.dragItemChildrenName); this.interceptChildNode(parentElement, dragItemChildren); } // 拷贝canvas的内容 /** @type {?} */ const originCanvasArr = this.draggedEl.querySelectorAll('canvas'); /** @type {?} */ const targetCanvasArr = this.dragCloneNode.querySelectorAll('canvas'); [].forEach.call(targetCanvasArr, (/** * @param {?} canvas * @param {?} index * @return {?} */ (canvas, index) => { canvas.getContext('2d').drawImage(originCanvasArr[index], 0, 0); })); this.ngZone.runOutsideAngular((/** * @return {?} */ () => { 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 {?} */ const 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 {?} */ const badge = document.createElement('div'); badge.innerText = this.batchDragData.length + ''; badge.classList.add('batch-dragged-node-count'); node.style.position = 'relative'; /** @type {?} */ const 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 {?} */ let stack = 2; if (this.batchDragData.length === 2) { stack = 1; } for (let i = 0; i < stack; i++) { /** @type {?} */ const stackNode = this.dragCloneNode.cloneNode(false); /** @type {?} */ const 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 {?} */ () => { setTimeout((/** * @return {?} */ () => { if (this.draggedEl) { this.draggedEl.style.display = 'none'; this.dragElShowHideEvent.next(false); if (this.dragOriginPlaceholder) { this.dragOriginPlaceholder.style.display = 'block'; } } })); })); } } /** * @return {?} */ disableDraggedCloneNodeFollowMouse() { 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 {?} */ interceptChildNode(parentNode, childNodeList) { /** @type {?} */ const interceptOptions = { root: parentNode }; this.intersectionObserver = new IntersectionObserver(this.setChildNodeHide, interceptOptions); [].forEach.call(childNodeList, (/** * @param {?} childNode * @return {?} */ childNode => { this.intersectionObserver.observe(childNode); })); } /** * @param {?} entries * @return {?} */ setChildNodeHide(entries) { entries.forEach((/** * @param {?} element * @return {?} */ element => { const { isIntersecting, target: childNode } = element; if (isIntersecting) { childNode.style.display = 'block'; } else { childNode.style.display = 'none'; } })); } /** * @param {?=} identity * @param {?=} order * @return {?} */ getBatchDragData(identity, order = 'draggedElFirst') { /** @type {?} */ const result = this.batchDragData.map((/** * @param {?} dragData * @return {?} */ dragData => dragData.dragData)); if (typeof order === 'function') { result.sort((/** @type {?} */ (order))); } else if (order === 'draggedElFirst') { /** @type {?} */ let dragData = this.dragData; if (identity) { /** @type {?} */ const realDragData = this.batchDragData.filter((/** * @param {?} dd * @return {?} */ dd => 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(); } * @return {?} */ cleanBatchDragData() { /** @type {?} */ const batchDragData = this.batchDragData; if (this.batchDragData) { this.batchDragData .filter((/** * @param {?} dragData * @return {?} */ dragData => dragData.draggable)) .map((/** * @param {?} dragData * @return {?} */ dragData => dragData.draggable)) .forEach((/** * @param {?} draggable * @return {?} */ draggable => draggable.batchDraggable.dragData = undefined)); this.batchDragData = undefined; this.batchDragGroup = undefined; } return batchDragData; } /** * @param {?} source * @param {?} target * @return {?} */ copyStyle(source, target) { ['id', 'class', 'style', 'draggable'].forEach((/** * @param {?} att * @return {?} */ function (att) { target.removeAttribute(att); })); // copy style (without transitions) /** @type {?} */ const computedStyle = getComputedStyle(source); for (let i = 0; i < computedStyle.length; i++) { /** @type {?} */ const key = computedStyle[i]; if (key.indexOf('transition') < 0) { target.style[key] = computedStyle[key]; } } target.style.pointerEvents = 'none'; // and repeat for all children for (let i = 0; i < source.children.length; i++) { this.copyStyle(source.children[i], target.children[i]); } } } DragDropService.decorators = [ { type: Injectable } ]; /** @nocollapse */ DragDropService.ctorParameters = () => [ { type: NgZone } ]; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kcmFnZHJvcC8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL2RyYWctZHJvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJeEMsTUFBTSxPQUFPLGVBQWU7Ozs7SUFrRDFCLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBckNsQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixjQUFTLEdBQWlCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ2xDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQWdCcEMsaUJBQVksR0FBaUIsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdELG1CQUFjLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUk3Qix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIseUJBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzFCLHlCQUFvQixHQUFRLElBQUksQ0FBQzs7UUFNakMsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQWdMN0MsMEJBQXFCOzs7O1FBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtrQkFDMUIsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVU7a0JBQ3pDLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxHQUFHLEtB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IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEcmFnRHJvcFRvdWNoIH0gZnJvbSAnLi4vdG91Y2gtc3VwcG9ydC9kcmFnZHJvcC10b3VjaCc7XHJcbmltcG9ydCB7IERyYWdnYWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vLi4vZGlyZWN0aXZlcy9kcmFnZ2FibGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMnO1xyXG5pbXBvcnQgeyBEcmFnUHJldmlld0RpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcFNlcnZpY2Uge1xyXG4gIGRyYWdEYXRhOiBhbnk7XHJcbiAgZHJhZ2dlZEVsOiBhbnk7XHJcbiAgZHJhZ2dlZEVsSWRlbnRpdHk6IGFueTtcclxuICBiYXRjaERyYWdEYXRhOiBBcnJheTx7XHJcbiAgICBpZGVudGl0eT86IGFueTtcclxuICAgIGRyYWdnYWJsZTogRHJhZ2dhYmxlRGlyZWN0aXZlO1xyXG4gICAgZHJhZ0RhdGE6IGFueTtcclxuICB9PjtcclxuICBiYXRjaERyYWdHcm91cDogc3RyaW5nO1xyXG4gIGJhdGNoRHJhZ1N0eWxlOiBBcnJheTxzdHJpbmc+O1xyXG4gIGJhdGNoRHJhZ2dpbmc6IGJvb2xlYW47XHJcbiAgc2NvcGU6IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgZHJvcFRhcmdldHMgPSBbXTtcclxuICBkcm9wRXZlbnQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgZHJhZ0VuZEV2ZW50ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIGRyYWdTdGFydEV2ZW50ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIGRyb3BPbkl0ZW06IGJvb2xlYW47XHJcbiAgZHJhZ0ZvbGxvdzogYm9vbGVhbjtcclxuICBkcmFnRm9sbG93T3B0aW9uczoge1xyXG4gICAgYXBwZW5kVG9Cb2R5PzogYm9vbGVhbjtcclxuICB9O1xyXG4gIGRyb3BPbk9yaWdpbjogYm9vbGVhbjtcclxuICBkcmFnZ2VkRWxGb2xsb3dpbmdNb3VzZTogYm9vbGVhbjtcclxuICBkcmFnT2Zmc2V0OiB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcclxuICAgIG9mZnNldFRvcDogbnVtYmVyO1xyXG4gICAgd2lkdGg/OiBudW1iZXI7XHJcbiAgICBoZWlnaHQ/OiBudW1iZXI7XHJcbiAgfTtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IE9ic2VydmFibGUuY3JlYXRlKCkuc3Vic2NyaWJlKCk7XHJcbiAgZHJhZ0VtcHR5SW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICBkcmFnQ2xvbmVOb2RlOiBhbnk7XHJcbiAgZHJhZ09yaWdpblBsYWNlaG9sZGVyOiBhbnk7XHJcbiAgZHJhZ0l0ZW1Db250YWluZXI6IGFueTtcclxuICBkcmFnSXRlbVBhcmVudE5hbWUgPSAnJztcclxuICBkcmFnSXRlbUNoaWxkcmVuTmFtZSA9ICcnO1xyXG4gIGludGVyc2VjdGlvbk9ic2VydmVyOiBhbnkgPSBudWxsO1xyXG4gIHN1YjtcclxuICBkcmFnT3JpZ2luUGxhY2Vob2xkZXJOZXh0U2libGluZzogYW55O1xyXG4gIHRvdWNoSW5zdGFuY2U7XHJcblxyXG4gIC8q5Y2P5ZCM5ouW5ou96ZyA6KaBICovXHJcbiAgZHJhZ0VsU2hvd0hpZGVFdmVudCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZHJhZ1N5bmNHcm91cERpcmVjdGl2ZXM7XHJcbiAgLyrpooTop4jlip/og70gKi9cclxuICBkcmFnUHJldmlld0RpcmVjdGl2ZTogRHJhZ1ByZXZpZXdEaXJlY3RpdmU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcclxuICAgIHRoaXMudG91Y2hJbnN0YW5jZSA9IERyYWdEcm9wVG91Y2guZ2V0SW5zdGFuY2UoKTtcclxuICAgIC8vIHNlcnZpY2Ugbm90IHN1cHBvcnQgT25Jbml0LCBvbmx5IHN1cHBvcnQgT25EZXN0cm95LCBzbyB3cml0ZSBpbiBjb25zdHJ1Y3RvclxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIHRoaXMuZHJhZ0VtcHR5SW1hZ2Uuc3JjID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFEVWxFUVZRSW1XTmdZR0JnQUFBQUJRQUJoNkZPMUFBQUFBQkpSVTVFcmtKZ2dnPT0nOyAvLyBzYWZhcmnnmoRpbWflv4XpobvopoHmnIlzcmNcclxuICB9XHJcbiAgbmV3U3Vic2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHJldHVybiB0aGlzLnN1YnNjcmlwdGlvbiA9IE9ic2VydmFibGUuY3JlYXRlKCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBlbmFibGVEcmFnZ2VkQ2xvbmVOb2RlRm9sbG93TW91c2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lTm9kZSkge1xyXG4gICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyID0gdGhpcy5kcmFnZ2VkRWwucGFyZW50RWxlbWVudDtcclxuICAgICAgaWYgKHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5jcmVhdGVQcmV2aWV3KCk7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlID0gdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5nZXRQcmV2aWV3RWxlbWVudCgpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZSA9IHRoaXMuZHJhZ2dlZEVsLmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgaWYgKHRoaXMuZHJhZ0ZvbGxvd09wdGlvbnMgJiYgdGhpcy5kcmFnRm9sbG93T3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcclxuICAgICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICB0aGlzLmNvcHlTdHlsZSh0aGlzLmRyYWdnZWRFbCwgdGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZHJhZ0l0ZW1DaGlsZHJlbk5hbWUgIT09ICcnKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuZHJhZ0l0ZW1QYXJlbnROYW1lID09PSAnJyA/IHRoaXMuZHJhZ0Nsb25lTm9kZSA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5kcmFnSXRlbVBhcmVudE5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGRyYWdJdGVtQ2hpbGRyZW4gPSBwYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5kcmFnSXRlbUNoaWxkcmVuTmFtZSk7XHJcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRDaGlsZE5vZGUocGFyZW50RWxlbWVudCwgZHJhZ0l0ZW1DaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5ou36LSdY2FudmFz55qE5YaF5a65XHJcbiAgICAgIGNvbnN0IG9yaWdpbkNhbnZhc0FyciA9IHRoaXMuZHJhZ2dlZEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCB0YXJnZXRDYW52YXNBcnIgPSB0aGlzLmRyYWdDbG9uZU5vZGUucXVlcnlTZWxlY3RvckFsbCgnY2FudmFzJyk7XHJcbiAgICAgIFtdLmZvckVhY2guY2FsbCh0YXJnZXRDYW52YXNBcnIsIChjYW52YXMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKG9yaWdpbkNhbnZhc0FycltpbmRleF0sIDAsIDApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZm9sbG93TW91c2U0Q2xvbmVOb2RlLCB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogdHJ1ZX0pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLndpZHRoID0gdGhpcy5kcmFnT2Zmc2V0LndpZHRoICsgJ3B4JztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLmhlaWdodCA9IHRoaXMuZHJhZ09mZnNldC5oZWlnaHQgKyAncHgnO1xyXG5cclxuICAgICAgaWYgKCEodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZVxyXG4gICAgICAgICYmIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdUZW1wbGF0ZVxyXG4gICAgICAgICYmIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdPcHRpb25zXHJcbiAgICAgICAgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld09wdGlvbnMuc2tpcEJhdGNoUHJldmlldykpIHtcclxuICAgICAgLy8g5om56YeP5ouW5ou95qC35byPXHJcbiAgICAgIGlmICh0aGlzLmJhdGNoRHJhZ2dpbmcgJiYgdGhpcy5iYXRjaERyYWdEYXRhICYmIHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGggPiAxICkge1xyXG4gICAgICAgIC8vIOWIm+W7uuS4gOS4quiKgueCueWuueWZqFxyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lTm9kZSk7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdiYXRjaC1kcmFnZ2VkLW5vZGUnKTtcclxuXHJcbiAgICAgICAgLyog6K6h5pWw5qC35byP5a6a5L2NICovXHJcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnU3R5bGUgJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5sZW5ndGggJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5pbmRleE9mKCdiYWRnZScpID4gLTEpIHtcclxuICAgICAgICAgIGNvbnN0IGJhZGdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICBiYWRnZS5pbm5lclRleHQgPSB0aGlzLmJhdGNoRHJhZ0RhdGEubGVuZ3RoICsgJyc7XHJcbiAgICAgICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCdiYXRjaC1kcmFnZ2VkLW5vZGUtY291bnQnKTtcclxuICAgICAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICByaWdodDogJzVweCcsXHJcbiAgICAgICAgICAgIHRvcDogJy0xMnB4JyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnMjRweCcsXHJcbiAgICAgICAgICAgIHdpZHRoOiAnMjRweCcsXHJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogJzE0cHgnLFxyXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiAnMjRweCcsXHJcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IFsnIzUxNzBmZicsICd2YXIoLS1icmFuZC0xLCAjNTE3MGZmKSddXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgVXRpbHMuYWRkRWxTdHlsZXMoYmFkZ2UsIHN0eWxlKTtcclxuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoYmFkZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyog5bGC5Y+g5oSf5qC35byP5a6a5L2NICovXHJcbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnU3R5bGUgJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5sZW5ndGggJiYgdGhpcy5iYXRjaERyYWdTdHlsZS5pbmRleE9mKCdzdGFjaycpID4gLTEpIHtcclxuICAgICAgICAgIGxldCBzdGFjayA9IDI7XHJcbiAgICAgICAgICBpZiAodGhpcy5iYXRjaERyYWdEYXRhLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgICAgICBzdGFjayA9IDE7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tOb2RlID0gdGhpcy5kcmFnQ2xvbmVOb2RlLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrU3R5bGUgPSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgICAgbGVmdDogLTUgKiAoaSArIDEgKSArICdweCcsXHJcbiAgICAgICAgICAgICAgdG9wOiAtNSAqIChpICsgMSApICvjgIAncHgnLFxyXG4gICAgICAgICAgICAgIHpJbmRleDogLSAoaSArIDEpICsgJycsXHJcbiAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuZHJhZ09mZnNldC53aWR0aCArICdweCcsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmRyYWdPZmZzZXQuaGVpZ2h0ICsgJ3B4JyxcclxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgYm9yZGVyOiBbJzFweCBzb2xpZCAjNTE3MGZmJywgJzFweCBzb2xpZCB2YXIoLS1icmFuZC0xLCAjNTE3MGZmKSddXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIFV0aWxzLmFkZEVsU3R5bGVzKHN0YWNrTm9kZSwgc3RhY2tTdHlsZSk7XHJcbiAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3RhY2tOb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlID0gbm9kZTtcclxuICAgICAgfVxyXG4gICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5jbGFzc0xpc3QuYWRkKCdkcmFnLWNsb25lLW5vZGUnKTtcclxuICAgICAgaWYgKCEgKHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlKSkge1xyXG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS53aWR0aCA9IHRoaXMuZHJhZ09mZnNldC53aWR0aCArICdweCc7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLmhlaWdodCA9IHRoaXMuZHJhZ09mZnNldC5oZWlnaHQgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS56SW5kZXggPSAnMTA5MCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUudG9wID0gdGhpcy5kcmFnT2Zmc2V0LnRvcCArICdweCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS5sZWZ0ID0gdGhpcy5kcmFnT2Zmc2V0LmxlZnQgKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUud2lsbENoYW5nZSA9ICdsZWZ0LCB0b3AnO1xyXG4gICAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lTm9kZSk7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmRyYWdnZWRFbCkge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdFbFNob3dIaWRlRXZlbnQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyYWdPcmlnaW5QbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgIHRoaXMuZHJhZ09yaWdpblBsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc2FibGVEcmFnZ2VkQ2xvbmVOb2RlRm9sbG93TW91c2UoKSB7XHJcbiAgICBpZiAodGhpcy5kcmFnQ2xvbmVOb2RlKSB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5mb2xsb3dNb3VzZTRDbG9uZU5vZGUsIHtjYXB0dXJlOiB0cnVlfSk7XHJcbiAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgdGhpcy5kcmFnZ2VkRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICB0aGlzLmRyYWdFbFNob3dIaWRlRXZlbnQubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlICYmIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZHJhZ1ByZXZpZXdUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRlc3Ryb3lQcmV2aWV3KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmRyYWdJdGVtQ29udGFpbmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZXJjZXB0Q2hpbGROb2RlKHBhcmVudE5vZGUsIGNoaWxkTm9kZUxpc3QpIHtcclxuICAgIGNvbnN0IGludGVyY2VwdE9wdGlvbnMgPSB7XHJcbiAgICAgIHJvb3Q6IHBhcmVudE5vZGVcclxuICAgIH07XHJcbiAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMuc2V0Q2hpbGROb2RlSGlkZSwgaW50ZXJjZXB0T3B0aW9ucyk7XHJcbiAgICBbXS5mb3JFYWNoLmNhbGwoY2hpbGROb2RlTGlzdCwgY2hpbGROb2RlID0+IHtcclxuICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKGNoaWxkTm9kZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldENoaWxkTm9kZUhpZGUoZW50cmllcykge1xyXG4gICAgZW50cmllcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBjb25zdCB7aXNJbnRlcnNlY3RpbmcsIHRhcmdldDogY2hpbGROb2RlfSA9IGVsZW1lbnQ7XHJcbiAgICAgIGlmIChpc0ludGVyc2VjdGluZykge1xyXG4gICAgICAgIGNoaWxkTm9kZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaGlsZE5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmb2xsb3dNb3VzZTRDbG9uZU5vZGUgPSAoZXZlbnQpID0+IHtcclxuICAgIGNvbnN0IHtvZmZzZXRMZWZ0LCBvZmZzZXRUb3B9ID0gdGhpcy5kcmFnT2Zmc2V0O1xyXG4gICAgY29uc3Qge2NsaWVudFgsIGNsaWVudFl9ID0gZXZlbnQ7XHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lTm9kZSkgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLmxlZnQgPSAgY2xpZW50WCAtIG9mZnNldExlZnQgKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUudG9wID0gIGNsaWVudFkgLSBvZmZzZXRUb3AgKyAncHgnO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRCYXRjaERyYWdEYXRhKGlkZW50aXR5Pywgb3JkZXI6ICgoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcikgfCAnc2VsZWN0JyB8ICdkcmFnZ2VkRWxGaXJzdCcgPSAnZHJhZ2dlZEVsRmlyc3QnKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJhdGNoRHJhZ0RhdGEubWFwKGRyYWdEYXRhID0+IGRyYWdEYXRhLmRyYWdEYXRhKTtcclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmVzdWx0LnNvcnQoPCgoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcik+b3JkZXIpO1xyXG4gICAgfSBlbHNlIGlmIChvcmRlciA9PT0gJ2RyYWdnZWRFbEZpcnN0Jykge1xyXG4gICAgICBsZXQgZHJhZ0RhdGEgPSB0aGlzLmRyYWdEYXRhO1xyXG4gICAgICBpZiAoaWRlbnRpdHkpIHtcclxuICAgICAgICBjb25zdCByZWFsRHJhZ0RhdGEgPSB0aGlzLmJhdGNoRHJhZ0RhdGEuZmlsdGVyKGRkID0+IGRkLmlkZW50aXR5ID09PSBpZGVudGl0eSkucG9wKCkuZHJhZ0RhdGE7XHJcbiAgICAgICAgZHJhZ0RhdGEgPSByZWFsRHJhZ0RhdGE7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LnNwbGljZShyZXN1bHQuaW5kZXhPZihkcmFnRGF0YSksIDEpO1xyXG4gICAgICByZXN1bHQuc3BsaWNlKDAsIDAsIGRyYWdEYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgIH1cclxuXHJcbiAgIC8qKiB1c2FnZTpcclxuICAgICogY29uc3RydWN0b3IoLi4uLCBwcml2YXRlIGRyYWdEcm9wU2VydmljZTogRHJhZ0Ryb3BTZXJ2aWNlKSB7fVxyXG4gICAgKiBjbGVhbkJhdGNoRHJhZ0RhdGEoKSB7IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNsZWFuQmF0Y2hEcmFnRGF0YSgpOyB9XHJcbiAgICAqL1xyXG4gICBwdWJsaWMgY2xlYW5CYXRjaERyYWdEYXRhKCkge1xyXG4gICAgIGNvbnN0IGJhdGNoRHJhZ0RhdGEgPSB0aGlzLmJhdGNoRHJhZ0RhdGE7XHJcbiAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnRGF0YSkge1xyXG4gICAgICB0aGlzLmJhdGNoRHJhZ0RhdGFcclxuICAgICAgICAuZmlsdGVyKGRyYWdEYXRhID0+IGRyYWdEYXRhLmRyYWdnYWJsZSlcclxuICAgICAgICAubWFwKGRyYWdEYXRhID0+IGRyYWdEYXRhLmRyYWdnYWJsZSlcclxuICAgICAgICAuZm9yRWFjaChkcmFnZ2FibGUgPT4gZHJhZ2dhYmxlLmJhdGNoRHJhZ2dhYmxlLmRyYWdEYXRhID0gdW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5iYXRjaERyYWdEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmJhdGNoRHJhZ0dyb3VwID0gdW5kZWZpbmVkO1xyXG4gICAgIH1cclxuICAgICByZXR1cm4gYmF0Y2hEcmFnRGF0YTtcclxuICAgfVxyXG5cclxuICAgcHVibGljIGNvcHlTdHlsZShzb3VyY2UsIHRhcmdldCkge1xyXG4gICAgWydpZCcsICdjbGFzcycsICdzdHlsZScsICdkcmFnZ2FibGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHQpIHtcclxuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gY29weSBzdHlsZSAod2l0aG91dCB0cmFuc2l0aW9ucylcclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHNvdXJjZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXB1dGVkU3R5bGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0gY29tcHV0ZWRTdHlsZVtpXTtcclxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3RyYW5zaXRpb24nKSA8IDApIHtcclxuICAgICAgICAgIHRhcmdldC5zdHlsZVtrZXldID0gY29tcHV0ZWRTdHlsZVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0YXJnZXQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgLy8gYW5kIHJlcGVhdCBmb3IgYWxsIGNoaWxkcmVuXHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5jb3B5U3R5bGUoc291cmNlLmNoaWxkcmVuW2ldLCB0YXJnZXQuY2hpbGRyZW5baV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==