angular-xml-editor
Version:
XML editor component for Angular
395 lines (394 loc) • 40.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Subject } from 'rxjs';
import { XmlEditorDebugger } from './xmlEditorDebugger';
import { XmlCursorPosMover } from './cursor/xmlCursorPosMover.class';
import { XmlCursor } from './cursor/xmlCursor.class';
import { XmlCursorPosSetter } from './cursor/xmlCursorPosSetter.class';
import { DomDummyNodeManager } from './dummyNodes/domDummyNodeManager.class';
import { XmlDomCleaner } from './xml-editing/xmlDomCleaner.class';
import { XmlEditDelete } from './xml-editing/xmlEditDeleteclass';
import { Xml2html } from './xml-html-converter/xml2html.class';
import { XmlEditInsert } from './xml-editing/xmlEditInsert.class';
var XmlEditorContext = /** @class */ (function () {
function XmlEditorContext(_document) {
this._document = _document;
this.actualCursor = new XmlCursor();
this.dummyNodeManager = new DomDummyNodeManager();
this.actualCursorChanged = new Subject();
this.debugService = new XmlEditorDebugger();
}
/**
* @return {?}
*/
XmlEditorContext.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.actualCursorChanged.unsubscribe();
};
/**
* @param {?} cursorPos
* @return {?}
*/
XmlEditorContext.prototype.setCursorPos = /**
* @param {?} cursorPos
* @return {?}
*/
function (cursorPos) {
this.actualCursor = cursorPos;
this.actualCursorChanged.next(cursorPos);
this.debugService.setActualCursorPos(cursorPos);
};
// /**
// * Executed command from editor header buttons
// * @param command string from triggerCommand
// */
// executeCommand(command: string) {
// if (command !== '') {
// this.commander.executeCommand(command);
// this.exec();
// }
// this.onEditorFocus();
// const cleanUpFirst = false;
// this.domDummyNodeManager.UpdateDummyNodes(this.xmlDocumentRootNode, cleanUpFirst);
// return;
// }
/**
* @param {?} mouseEvent
* @return {?}
*/
XmlEditorContext.prototype.mouseUp = /**
* @param {?} mouseEvent
* @return {?}
*/
function (mouseEvent) {
if (window.getSelection) {
/** @type {?} */
var userSelection = void 0;
userSelection = window.getSelection();
XmlCursorPosSetter.setFromSelection(this.actualCursor.StartPos, userSelection.anchorNode, userSelection.anchorOffset, this.debugService);
XmlCursorPosSetter.setFromSelection(this.actualCursor.EndPos, userSelection.focusNode, userSelection.focusOffset, this.debugService);
this.setCursorPos(this.actualCursor);
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
}
else {
throw new Error("can't get window.getSelection, target=" + JSON.stringify(mouseEvent.target));
}
};
/**
* @param {?} event
* @return {?}
*/
XmlEditorContext.prototype.keyDown = /**
* @param {?} event
* @return {?}
*/
function (event) {
console.log('keydown! key:' + event.key + ' / code:' + event.code);
switch (event.key) {
case 'Control':
this.keyCtrlIsDown = true;
break;
case 'Shift':
this.keyShiftIsDown = true;
break;
case 'c':
if (this.keyCtrlIsDown) {
// Copy
return false;
}
else {
if (this.insertText('c')) {
return false;
}
}
break;
case 'ArrowUp':
case 'ArrowDown':
return true;
case 'ArrowRight':
if (this.keyShiftIsDown) {
XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
this.actualCursor.StartPos.SetCursor(this.actualCursor.EndPos.ActualNode, this.actualCursor.EndPos.PosAtNode, this.actualCursor.EndPos.PosInTextnode);
}
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
this.setCursorPos(this.actualCursor);
return false;
case 'ArrowLeft':
if (this.keyShiftIsDown) {
XmlCursorPosMover.moveLeft(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlCursorPosMover.moveLeft(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
this.actualCursor.EndPos.SetCursor(this.actualCursor.StartPos.ActualNode, this.actualCursor.StartPos.PosAtNode, this.actualCursor.StartPos.PosInTextnode);
}
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
this.setCursorPos(this.actualCursor);
return false;
case 'Backspace':
if (this.actualCursor.isEmptySelection()) {
XmlEditDelete.deleteBefore(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlEditDelete.deleteSelection(this.actualCursor, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
this.actualCursor.EndPos.SetCursor(this.actualCursor.StartPos.ActualNode, this.actualCursor.StartPos.PosAtNode, this.actualCursor.StartPos.PosInTextnode);
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
return false;
case 'Delete':
if (this.actualCursor.isEmptySelection()) {
XmlEditDelete.deleteAfter(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlEditDelete.deleteSelection(this.actualCursor, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
return false;
case 'Enter':
return false;
default:
/** @type {?} */
var textInsert = event.key;
if (this.insertText(textInsert)) {
return false;
}
break;
}
return true;
};
/**
* @param {?} event
* @return {?}
*/
XmlEditorContext.prototype.keyUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
switch (event.key) {
case 'Control':
this.keyCtrlIsDown = false;
break;
case 'Shift':
this.actualCursor.sortStartAndEnd();
this.keyShiftIsDown = false;
break;
case 'ArrowLeft':
case 'ArrowRight':
this.actualCursor.show();
break;
case 'ArrowUp':
case 'ArrowDown':
case 'Backspace':
case 'Delete':
case 'Enter':
case 'Control':
case 'Shift':
break;
}
return true;
};
/**
* @param {?} text
* @return {?}
*/
XmlEditorContext.prototype.pasted = /**
* @param {?} text
* @return {?}
*/
function (text) {
alert('pasted: ' + text);
return false;
};
/**
* @return {?}
*/
XmlEditorContext.prototype.copied = /**
* @return {?}
*/
function () {
alert('copied');
return false;
};
/**
* @param {?} value
* @return {?}
*/
XmlEditorContext.prototype.insertText = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value === '' || value === null || value === undefined) {
return true;
}
/** @type {?} */
var inserted = false;
if (this.actualCursor.isEmptySelection()) {
inserted = XmlEditInsert.insertText(this.actualCursor.EndPos, value, this.actualCursor.xmlDocumentRootNode, this.config.rules, this.config.xmlSchema);
}
else {
inserted = XmlEditInsert.replaceWithText(this.actualCursor, value, this.actualCursor.xmlDocumentRootNode, this.config.rules, this.config.xmlSchema);
}
if (inserted) {
// character inserted -> move cursor right
// for (let index = 0; index < value.length; index++) {
// XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
// }
this.actualCursor.StartPos.SetCursor(this.actualCursor.EndPos.ActualNode, this.actualCursor.EndPos.PosAtNode, this.actualCursor.EndPos.PosInTextnode);
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
console.warn('text inserted!');
return true;
}
else {
console.warn('text NOT inserted!');
return false;
}
};
/** inserts a new element at the actual cursor pos */
/**
* inserts a new element at the actual cursor pos
* @param {?} element
* @return {?}
*/
XmlEditorContext.prototype.insertElement = /**
* inserts a new element at the actual cursor pos
* @param {?} element
* @return {?}
*/
function (element) {
/** @type {?} */
var html = new Xml2html(this.config.rules).createNewElementHtml(element);
this.domInsertHtml(html);
this.cleanUpAndUpdateDummyElements();
// this.actualCursor.show();
console.warn('element inserted!');
};
/**
* Create raw HTML
* @param {?} html HTML string
* @return {?}
*/
XmlEditorContext.prototype.domInsertHtml = /**
* Create raw HTML
* @param {?} html HTML string
* @return {?}
*/
function (html) {
if (document.getSelection) {
/** @type {?} */
var range = document.getSelection().getRangeAt(0);
range.insertNode(range.createContextualFragment(html));
}
else {
throw new Error('document.getSelection not defined!');
}
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
};
/**
* save selection when the editor is focussed out
*/
/**
* save selection when the editor is focussed out
* @return {?}
*/
XmlEditorContext.prototype.saveSelection = /**
* save selection when the editor is focussed out
* @return {?}
*/
function () {
if (window.getSelection) {
/** @type {?} */
var sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
this.savedSelection = sel.getRangeAt(0);
this.selectedText = sel.toString();
}
}
else if (this._document.getSelection && this._document.createRange) {
this.savedSelection = document.createRange();
}
else {
this.savedSelection = null;
}
};
/**
* restore selection when the editor is focussed in
*/
/**
* restore selection when the editor is focussed in
* @return {?}
*/
XmlEditorContext.prototype.restoreSelection = /**
* restore selection when the editor is focussed in
* @return {?}
*/
function () {
if (this.savedSelection) {
if (window.getSelection) {
/** @type {?} */
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(this.savedSelection);
return true;
}
else if (this._document.getSelection /*&& this.savedSelection.select*/) {
// this.savedSelection.select();
return true;
}
}
else {
return false;
}
};
/**
* @return {?}
*/
XmlEditorContext.prototype.cleanUpAndUpdateDummyElements = /**
* @return {?}
*/
function () {
this.dummyNodeManager.RemoveAllDummyNodes(this.actualCursor.xmlDocumentRootNode);
XmlDomCleaner.cleanUp(this.actualCursor.xmlDocumentRootNode, this.actualCursor);
this.dummyNodeManager.UpdateDummyNodes(this.actualCursor.xmlDocumentRootNode);
this.actualCursor.sortStartAndEnd();
};
return XmlEditorContext;
}());
export { XmlEditorContext };
if (false) {
/** @type {?} */
XmlEditorContext.prototype.debugService;
/** @type {?} */
XmlEditorContext.prototype.config;
/** @type {?} */
XmlEditorContext.prototype.actualCursorChanged;
/** @type {?} */
XmlEditorContext.prototype.actualCursor;
/** @type {?} */
XmlEditorContext.prototype.dummyNodeManager;
/** @type {?} */
XmlEditorContext.prototype.savedSelection;
/** @type {?} */
XmlEditorContext.prototype.selectedText;
/** @type {?} */
XmlEditorContext.prototype.keyCtrlIsDown;
/** @type {?} */
XmlEditorContext.prototype.keyShiftIsDown;
/** @type {?} */
XmlEditorContext.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdG9yQ29udGV4dC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL3htbEVkaXRvckNvbnRleHQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdsRSxJQUFBO0lBY0UsMEJBQW9CLFNBQW1CO1FBQW5CLGNBQVMsR0FBVCxTQUFTLENBQVU7NEJBVHhCLElBQUksU0FBUyxFQUFFO2dDQUNYLElBQUksbUJBQW1CLEVBQUU7UUFTMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUFhLENBQUM7UUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7S0FDN0M7Ozs7SUFFRCxzQ0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDeEM7Ozs7O0lBRUQsdUNBQVk7Ozs7SUFBWixVQUFhLFNBQW9CO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNqRDtJQUVELE1BQU07SUFDTixrREFBa0Q7SUFDbEQsZ0RBQWdEO0lBQ2hELE9BQU87SUFDUCxvQ0FBb0M7SUFDcEMsMEJBQTBCO0lBQzFCLDhDQUE4QztJQUM5QyxtQkFBbUI7SUFDbkIsTUFBTTtJQUNOLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsdUZBQXVGO0lBQ3ZGLFlBQVk7SUFDWixJQUFJOzs7OztJQUVKLGtDQUFPOzs7O0lBQVAsVUFBUSxVQUFzQjtRQUM1QixJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7O1lBQ3ZCLElBQUksYUFBYSxVQUFZO1lBQzdCLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6SSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBeUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFHLENBQUMsQ0FBQztTQUMvRjtLQUNGOzs7OztJQUVELGtDQUFPOzs7O0lBQVAsVUFBUSxLQUFvQjtRQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkUsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2pCLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsTUFBTTtZQUVSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsTUFBTTtZQUVSLEtBQUssR0FBRztnQkFDTixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7O29CQUV0QixPQUFPLEtBQUssQ0FBQztpQkFDZDtxQkFBTTtvQkFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3hCLE9BQU8sS0FBSyxDQUFDO3FCQUNkO2lCQUNGO2dCQUNELE1BQU07WUFFUixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssV0FBVztnQkFDZCxPQUFPLElBQUksQ0FBQztZQUVkLEtBQUssWUFBWTtnQkFDZixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZCLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pIO3FCQUFNO29CQUNMLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hILElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUN2SjtnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDckMsT0FBTyxLQUFLLENBQUM7WUFFZixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN2QixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoSDtxQkFBTTtvQkFDTCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNqSCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDM0o7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sS0FBSyxDQUFDO1lBRWYsS0FBSyxXQUFXO2dCQUNkLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO29CQUN4QyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEg7cUJBQU07b0JBQ0wsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUc7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFKLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUssUUFBUTtnQkFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtvQkFDeEMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2pIO3FCQUFNO29CQUNMLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVHO2dCQUNELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQztZQUVmLEtBQUssT0FBTztnQkFDVixPQUFPLEtBQUssQ0FBQztZQUVmOztnQkFDRSxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUM3QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQy9CLE9BQU8sS0FBSyxDQUFDO2lCQUNkO2dCQUNELE1BQU07U0FDVDtRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7O0lBRUQsZ0NBQUs7Ozs7SUFBTCxVQUFNLEtBQW9CO1FBQ3hCLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNqQixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLE1BQU07WUFFUixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsTUFBTTtZQUVSLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxPQUFPO2dCQUNWLE1BQU07U0FDVDtRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7O0lBRUQsaUNBQU07Ozs7SUFBTixVQUFPLElBQVk7UUFDakIsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQztLQUNkOzs7O0lBRUQsaUNBQU07OztJQUFOO1FBQ0UsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7Ozs7O0lBRUQscUNBQVU7Ozs7SUFBVixVQUFXLEtBQWE7UUFDdEIsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6RCxPQUFPLElBQUksQ0FBQztTQUNiOztRQUVELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUN4QyxRQUFRLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3ZKO2FBQU07WUFDTCxRQUFRLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcko7UUFFRCxJQUFJLFFBQVEsRUFBRTs7Ozs7WUFLWixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN0SixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDZDtLQUNGO0lBRUQscURBQXFEOzs7Ozs7SUFDckQsd0NBQWE7Ozs7O0lBQWIsVUFBYyxPQUF1Qjs7UUFDbkMsSUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDOztRQUVyQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDbkM7Ozs7OztJQU1NLHdDQUFhOzs7OztjQUFDLElBQVk7UUFDL0IsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFOztZQUN6QixJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDeEQ7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUNELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7O0lBRzNCOztPQUVHOzs7OztJQUNILHdDQUFhOzs7O0lBQWI7UUFDRSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7O1lBQ3ZCLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNwQztTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUNwRSxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM5QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7S0FDRjtJQUVEOztPQUVHOzs7OztJQUNILDJDQUFnQjs7OztJQUFoQjtRQUNFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7O2dCQUN2QixJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksb0NBQW9DOztnQkFFeEUsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7Ozs7SUFFRCx3REFBNkI7OztJQUE3QjtRQUNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDakYsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDckM7MkJBcFNIO0lBb1RDLENBQUE7QUFwU0QsNEJBb1NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBYbWxSdWxlRWxlbWVudCB9IGZyb20gJy4veG1sLXJ1bGVzLWNoZWNrL3htbFJ1bGVFbGVtZW50LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi94bWxFZGl0b3JDb25maWcnO1xyXG5pbXBvcnQgeyBYbWxFZGl0b3JEZWJ1Z2dlciB9IGZyb20gJy4veG1sRWRpdG9yRGVidWdnZXInO1xyXG5pbXBvcnQgeyBYbWxDdXJzb3JQb3NNb3ZlciB9IGZyb20gJy4vY3Vyc29yL3htbEN1cnNvclBvc01vdmVyLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sQ3Vyc29yIH0gZnJvbSAnLi9jdXJzb3IveG1sQ3Vyc29yLmNsYXNzJztcclxuaW1wb3J0IHsgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFhtbEN1cnNvclBvc1NldHRlciB9IGZyb20gJy4vY3Vyc29yL3htbEN1cnNvclBvc1NldHRlci5jbGFzcyc7XHJcbmltcG9ydCB7IERvbUR1bW15Tm9kZU1hbmFnZXIgfSBmcm9tICcuL2R1bW15Tm9kZXMvZG9tRHVtbXlOb2RlTWFuYWdlci5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbERvbUNsZWFuZXIgfSBmcm9tICcuL3htbC1lZGl0aW5nL3htbERvbUNsZWFuZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxFZGl0RGVsZXRlIH0gZnJvbSAnLi94bWwtZWRpdGluZy94bWxFZGl0RGVsZXRlY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuaW1wb3J0IHsgVG91Y2hTZXF1ZW5jZSB9IGZyb20gJ3NlbGVuaXVtLXdlYmRyaXZlcic7XHJcbmltcG9ydCB7IFhtbEVkaXRJbnNlcnQgfSBmcm9tICcuL3htbC1lZGl0aW5nL3htbEVkaXRJbnNlcnQuY2xhc3MnO1xyXG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJ3V0aWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFhtbEVkaXRvckNvbnRleHQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyBkZWJ1Z1NlcnZpY2U6IFhtbEVkaXRvckRlYnVnZ2VyO1xyXG4gIHB1YmxpYyBjb25maWc6IFhtbEVkaXRvckNvbmZpZztcclxuXHJcbiAgYWN0dWFsQ3Vyc29yQ2hhbmdlZDogU3ViamVjdDxYbWxDdXJzb3I+O1xyXG4gIGFjdHVhbEN1cnNvciA9IG5ldyBYbWxDdXJzb3IoKTtcclxuICBkdW1teU5vZGVNYW5hZ2VyID0gbmV3IERvbUR1bW15Tm9kZU1hbmFnZXIoKTtcclxuXHJcbiAgc2F2ZWRTZWxlY3Rpb246IFJhbmdlIHwgbnVsbDtcclxuICBzZWxlY3RlZFRleHQ6IHN0cmluZztcclxuXHJcbiAga2V5Q3RybElzRG93bjogYm9vbGVhbjtcclxuICBrZXlTaGlmdElzRG93bjogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50KSB7XHJcbiAgICB0aGlzLmFjdHVhbEN1cnNvckNoYW5nZWQgPSBuZXcgU3ViamVjdDxYbWxDdXJzb3I+KCk7XHJcbiAgICB0aGlzLmRlYnVnU2VydmljZSA9IG5ldyBYbWxFZGl0b3JEZWJ1Z2dlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbEN1cnNvckNoYW5nZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHNldEN1cnNvclBvcyhjdXJzb3JQb3M6IFhtbEN1cnNvcikge1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3IgPSBjdXJzb3JQb3M7XHJcbiAgICB0aGlzLmFjdHVhbEN1cnNvckNoYW5nZWQubmV4dChjdXJzb3JQb3MpO1xyXG4gICAgdGhpcy5kZWJ1Z1NlcnZpY2Uuc2V0QWN0dWFsQ3Vyc29yUG9zKGN1cnNvclBvcyk7XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgICogRXhlY3V0ZWQgY29tbWFuZCBmcm9tIGVkaXRvciBoZWFkZXIgYnV0dG9uc1xyXG4gIC8vICAgKiBAcGFyYW0gY29tbWFuZCBzdHJpbmcgZnJvbSB0cmlnZ2VyQ29tbWFuZFxyXG4gIC8vICAgKi9cclxuICAvLyBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcclxuICAvLyAgIGlmIChjb21tYW5kICE9PSAnJykge1xyXG4gIC8vICAgICB0aGlzLmNvbW1hbmRlci5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcclxuICAvLyAgICAgdGhpcy5leGVjKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLm9uRWRpdG9yRm9jdXMoKTtcclxuICAvLyAgIGNvbnN0IGNsZWFuVXBGaXJzdCA9IGZhbHNlO1xyXG4gIC8vICAgdGhpcy5kb21EdW1teU5vZGVNYW5hZ2VyLlVwZGF0ZUR1bW15Tm9kZXModGhpcy54bWxEb2N1bWVudFJvb3ROb2RlLCBjbGVhblVwRmlyc3QpO1xyXG4gIC8vICAgcmV0dXJuO1xyXG4gIC8vIH1cclxuXHJcbiAgbW91c2VVcChtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICBsZXQgdXNlclNlbGVjdGlvbjogU2VsZWN0aW9uO1xyXG4gICAgICB1c2VyU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBYbWxDdXJzb3JQb3NTZXR0ZXIuc2V0RnJvbVNlbGVjdGlvbih0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcywgdXNlclNlbGVjdGlvbi5hbmNob3JOb2RlLCB1c2VyU2VsZWN0aW9uLmFuY2hvck9mZnNldCwgdGhpcy5kZWJ1Z1NlcnZpY2UpO1xyXG4gICAgICBYbWxDdXJzb3JQb3NTZXR0ZXIuc2V0RnJvbVNlbGVjdGlvbih0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MsIHVzZXJTZWxlY3Rpb24uZm9jdXNOb2RlLCB1c2VyU2VsZWN0aW9uLmZvY3VzT2Zmc2V0LCB0aGlzLmRlYnVnU2VydmljZSk7XHJcbiAgICAgIHRoaXMuc2V0Q3Vyc29yUG9zKHRoaXMuYWN0dWFsQ3Vyc29yKTtcclxuICAgICAgdGhpcy5hY3R1YWxDdXJzb3Iuc29ydFN0YXJ0QW5kRW5kKCk7XHJcbiAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgZ2V0IHdpbmRvdy5nZXRTZWxlY3Rpb24sIHRhcmdldD0ke0pTT04uc3RyaW5naWZ5KG1vdXNlRXZlbnQudGFyZ2V0KX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnNvbGUubG9nKCdrZXlkb3duISBrZXk6JyArIGV2ZW50LmtleSArICcgLyBjb2RlOicgKyBldmVudC5jb2RlKTtcclxuXHJcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICBjYXNlICdDb250cm9sJzpcclxuICAgICAgICB0aGlzLmtleUN0cmxJc0Rvd24gPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnU2hpZnQnOlxyXG4gICAgICAgIHRoaXMua2V5U2hpZnRJc0Rvd24gPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnYyc6XHJcbiAgICAgICAgaWYgKHRoaXMua2V5Q3RybElzRG93bikge1xyXG4gICAgICAgICAgLy8gQ29weVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pbnNlcnRUZXh0KCdjJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgaWYgKHRoaXMua2V5U2hpZnRJc0Rvd24pIHtcclxuICAgICAgICAgIFhtbEN1cnNvclBvc01vdmVyLm1vdmVSaWdodCh0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgWG1sQ3Vyc29yUG9zTW92ZXIubW92ZVJpZ2h0KHRoaXMuYWN0dWFsQ3Vyc29yLkVuZFBvcywgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAgICAgdGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MuU2V0Q3Vyc29yKHRoaXMuYWN0dWFsQ3Vyc29yLkVuZFBvcy5BY3R1YWxOb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuUG9zQXROb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNvcnRTdGFydEFuZEVuZCgpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgICAgICB0aGlzLnNldEN1cnNvclBvcyh0aGlzLmFjdHVhbEN1cnNvcik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICBpZiAodGhpcy5rZXlTaGlmdElzRG93bikge1xyXG4gICAgICAgICAgWG1sQ3Vyc29yUG9zTW92ZXIubW92ZUxlZnQodGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFhtbEN1cnNvclBvc01vdmVyLm1vdmVMZWZ0KHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuU2V0Q3Vyc29yKHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLkFjdHVhbE5vZGUsIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlBvc0F0Tm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNvcnRTdGFydEFuZEVuZCgpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgICAgICB0aGlzLnNldEN1cnNvclBvcyh0aGlzLmFjdHVhbEN1cnNvcik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcclxuICAgICAgICBpZiAodGhpcy5hY3R1YWxDdXJzb3IuaXNFbXB0eVNlbGVjdGlvbigpKSB7XHJcbiAgICAgICAgICBYbWxFZGl0RGVsZXRlLmRlbGV0ZUJlZm9yZSh0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcywgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBYbWxFZGl0RGVsZXRlLmRlbGV0ZVNlbGVjdGlvbih0aGlzLmFjdHVhbEN1cnNvciwgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuU2V0Q3Vyc29yKHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLkFjdHVhbE5vZGUsIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlBvc0F0Tm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICAgICAgdGhpcy5jbGVhblVwQW5kVXBkYXRlRHVtbXlFbGVtZW50cygpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlICdEZWxldGUnOlxyXG4gICAgICAgIGlmICh0aGlzLmFjdHVhbEN1cnNvci5pc0VtcHR5U2VsZWN0aW9uKCkpIHtcclxuICAgICAgICAgIFhtbEVkaXREZWxldGUuZGVsZXRlQWZ0ZXIodGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgWG1sRWRpdERlbGV0ZS5kZWxldGVTZWxlY3Rpb24odGhpcy5hY3R1YWxDdXJzb3IsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhblVwQW5kVXBkYXRlRHVtbXlFbGVtZW50cygpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zdCB0ZXh0SW5zZXJ0ID0gZXZlbnQua2V5O1xyXG4gICAgICAgIGlmICh0aGlzLmluc2VydFRleHQodGV4dEluc2VydCkpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBrZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgY2FzZSAnQ29udHJvbCc6XHJcbiAgICAgICAgdGhpcy5rZXlDdHJsSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1NoaWZ0JzpcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zb3J0U3RhcnRBbmRFbmQoKTtcclxuICAgICAgICB0aGlzLmtleVNoaWZ0SXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgY2FzZSAnQmFja3NwYWNlJzpcclxuICAgICAgY2FzZSAnRGVsZXRlJzpcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICBjYXNlICdDb250cm9sJzpcclxuICAgICAgY2FzZSAnU2hpZnQnOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcGFzdGVkKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgYWxlcnQoJ3Bhc3RlZDogJyArIHRleHQpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29waWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgYWxlcnQoJ2NvcGllZCcpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0VGV4dCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGluc2VydGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuYWN0dWFsQ3Vyc29yLmlzRW1wdHlTZWxlY3Rpb24oKSkge1xyXG4gICAgICBpbnNlcnRlZCA9IFhtbEVkaXRJbnNlcnQuaW5zZXJ0VGV4dCh0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MsIHZhbHVlLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcywgdGhpcy5jb25maWcueG1sU2NoZW1hKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGluc2VydGVkID0gWG1sRWRpdEluc2VydC5yZXBsYWNlV2l0aFRleHQodGhpcy5hY3R1YWxDdXJzb3IsIHZhbHVlLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcywgdGhpcy5jb25maWcueG1sU2NoZW1hKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW5zZXJ0ZWQpIHtcclxuICAgICAgLy8gY2hhcmFjdGVyIGluc2VydGVkIC0+IG1vdmUgY3Vyc29yIHJpZ2h0XHJcbiAgICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgLy8gICBYbWxDdXJzb3JQb3NNb3Zlci5tb3ZlUmlnaHQodGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MuU2V0Q3Vyc29yKHRoaXMuYWN0dWFsQ3Vyc29yLkVuZFBvcy5BY3R1YWxOb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuUG9zQXROb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICAgIHRoaXMuY2xlYW5VcEFuZFVwZGF0ZUR1bW15RWxlbWVudHMoKTtcclxuICAgICAgdGhpcy5hY3R1YWxDdXJzb3Iuc2hvdygpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3RleHQgaW5zZXJ0ZWQhJyk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCd0ZXh0IE5PVCBpbnNlcnRlZCEnKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIGluc2VydHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgYWN0dWFsIGN1cnNvciBwb3MgKi9cclxuICBpbnNlcnRFbGVtZW50KGVsZW1lbnQ6IFhtbFJ1bGVFbGVtZW50KSB7XHJcbiAgICBjb25zdCBodG1sID0gbmV3IFhtbDJodG1sKHRoaXMuY29uZmlnLnJ1bGVzKS5jcmVhdGVOZXdFbGVtZW50SHRtbChlbGVtZW50KTtcclxuICAgIHRoaXMuZG9tSW5zZXJ0SHRtbChodG1sKTtcclxuICAgIHRoaXMuY2xlYW5VcEFuZFVwZGF0ZUR1bW15RWxlbWVudHMoKTtcclxuICAgIC8vIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgIGNvbnNvbGUud2FybignZWxlbWVudCBpbnNlcnRlZCEnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSByYXcgSFRNTFxyXG4gICAqIEBwYXJhbSBodG1sIEhUTUwgc3RyaW5nXHJcbiAgICovXHJcbiAgcHVibGljIGRvbUluc2VydEh0bWwoaHRtbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkuZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShyYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb2N1bWVudC5nZXRTZWxlY3Rpb24gbm90IGRlZmluZWQhJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFuVXBBbmRVcGRhdGVEdW1teUVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBzYXZlIHNlbGVjdGlvbiB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNzZWQgb3V0XHJcbiAgICovXHJcbiAgc2F2ZVNlbGVjdGlvbigpOiBhbnkge1xyXG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsLmdldFJhbmdlQXQgJiYgc2VsLnJhbmdlQ291bnQpIHtcclxuICAgICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBzZWwudG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9kb2N1bWVudC5nZXRTZWxlY3Rpb24gJiYgdGhpcy5fZG9jdW1lbnQuY3JlYXRlUmFuZ2UpIHtcclxuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlc3RvcmUgc2VsZWN0aW9uIHdoZW4gdGhlIGVkaXRvciBpcyBmb2N1c3NlZCBpblxyXG4gICAqL1xyXG4gIHJlc3RvcmVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4gICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgc2VsLmFkZFJhbmdlKHRoaXMuc2F2ZWRTZWxlY3Rpb24pO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2RvY3VtZW50LmdldFNlbGVjdGlvbiAvKiYmIHRoaXMuc2F2ZWRTZWxlY3Rpb24uc2VsZWN0Ki8pIHtcclxuICAgICAgICAvLyB0aGlzLnNhdmVkU2VsZWN0aW9uLnNlbGVjdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhblVwQW5kVXBkYXRlRHVtbXlFbGVtZW50cygpIHtcclxuICAgIHRoaXMuZHVtbXlOb2RlTWFuYWdlci5SZW1vdmVBbGxEdW1teU5vZGVzKHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUpO1xyXG4gICAgWG1sRG9tQ2xlYW5lci5jbGVhblVwKHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuYWN0dWFsQ3Vyc29yKTtcclxuICAgIHRoaXMuZHVtbXlOb2RlTWFuYWdlci5VcGRhdGVEdW1teU5vZGVzKHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUpO1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3Iuc29ydFN0YXJ0QW5kRW5kKCk7XHJcbiAgfVxyXG5cclxuICAvLyAvKiogY2hlY2sgYW55IHNsZWN0aW9uIGlzIG1hZGUgb3Igbm90ICovXHJcbiAgLy8gcHJpdmF0ZSBjaGVja1NlbGVjdGlvbigpOiBhbnkge1xyXG4gIC8vICAgY29uc3Qgc2xlY3RlZFRleHQgPSB0aGlzLnNhdmVkU2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gIC8vICAgaWYgKHNsZWN0ZWRUZXh0Lmxlbmd0aCA9PT0gMCkge1xyXG4gIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNlbGVjdGlvbiBNYWRlJyk7XHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXREZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yKHNlcGFyYXRvcjogc3RyaW5nKSB7XHJcbiAgLy8gICB0aGlzLl9kb2N1bWVudC5leGVjQ29tbWFuZCgnZGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcicsIGZhbHNlLCBzZXBhcmF0b3IpO1xyXG4gIC8vIH1cclxufVxyXG4iXX0=