@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
428 lines • 45.6 kB
JavaScript
/**
* @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==