ngx-firebase-cms
Version:
Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)
417 lines • 40 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Output, ViewChild, ElementRef, Renderer2, Inject } from '@angular/core';
import { EditorService } from '../../service/editor.service';
import { DOCUMENT } from '@angular/common';
import { NzMessageService } from 'ng-zorro-antd';
import { AngularFireStorage } from '@angular/fire/storage';
var EditorToolbarComponent = /** @class */ (function () {
function EditorToolbarComponent(storage, message, _renderer, editorService, _document) {
this.storage = storage;
this.message = message;
this._renderer = _renderer;
this.editorService = editorService;
this._document = _document;
this.id = '';
this.htmlMode = false;
this.showToolbar = true;
this.block = 'default';
this.fontId = 0;
this.fontSize = '5';
this.customClassId = -1;
this.tagMap = {
BLOCKQUOTE: "indent",
A: "link"
};
this.select = ["H1", "H2", "H3", "H4", "H5", "H6", "P", "PRE", "DIV"];
this.buttons = ["bold", "italic", "underline", "strikeThrough", "subscript", "superscript", "justifyLeft", "justifyCenter", "justifyRight", "justifyFull", "indent", "outdent", "insertUnorderedList", "insertOrderedList", "link"];
this.execute = new EventEmitter();
}
/**
* @return {?}
*/
EditorToolbarComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @param {?} command
* @return {?}
*/
EditorToolbarComponent.prototype.triggerCommand = /**
* @param {?} command
* @return {?}
*/
function (command) {
this.execute.emit(command);
};
/**
* @return {?}
*/
EditorToolbarComponent.prototype.triggerButtons = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.showToolbar) {
return;
}
this.buttons.forEach((/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var result = _this._document.queryCommandState(e);
/** @type {?} */
var elementById = _this._document.getElementById(e + '-' + _this.id);
if (result) {
_this._renderer.addClass(elementById, "active");
}
else {
_this._renderer.removeClass(elementById, "active");
}
}));
};
/**
* @param {?} nodes
* @return {?}
*/
EditorToolbarComponent.prototype.triggerBlocks = /**
* @param {?} nodes
* @return {?}
*/
function (nodes) {
var _this = this;
if (!this.showToolbar) {
return;
}
/** @type {?} */
var found = false;
this.select.forEach((/**
* @param {?} y
* @return {?}
*/
function (y) {
/** @type {?} */
var node = nodes.find((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.nodeName === y; }));
if (node !== undefined && y === node.nodeName) {
if (found === false) {
_this.block = node.nodeName.toLowerCase();
found = true;
}
}
else if (found === false) {
_this.block = 'default';
}
}));
found = false;
if (this.fonts) {
this.fonts.forEach((/**
* @param {?} y
* @param {?} index
* @return {?}
*/
function (y, index) {
/** @type {?} */
var node = nodes.find((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (x instanceof HTMLFontElement) {
return x.face === y.name;
}
}));
if (node !== undefined) {
if (found === false) {
_this.fontId = index;
found = true;
}
}
else if (found === false) {
_this.fontId = _this.defaultFontId;
}
}));
}
found = false;
if (this.customClasses) {
this.customClasses.forEach((/**
* @param {?} y
* @param {?} index
* @return {?}
*/
function (y, index) {
/** @type {?} */
var node = nodes.find((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (x instanceof Element) {
return x.className === y.class;
}
}));
if (node !== undefined) {
if (found === false) {
_this.customClassId = index;
found = true;
}
}
else if (found === false) {
_this.customClassId = -1;
}
}));
}
Object.keys(this.tagMap).map((/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var elementById = _this._document.getElementById(_this.tagMap[e] + '-' + _this.id);
/** @type {?} */
var node = nodes.find((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.nodeName === e; }));
if (node !== undefined && e === node.nodeName) {
_this._renderer.addClass(elementById, "active");
}
else {
_this._renderer.removeClass(elementById, "active");
}
}));
};
/**
* @return {?}
*/
EditorToolbarComponent.prototype.insertUrl = /**
* @return {?}
*/
function () {
/** @type {?} */
var url = prompt("Insert URL link", 'http:\/\/');
if (url && url !== '' && url !== 'http://') {
this.editorService.createLink(url);
}
};
/**
* @param {?} color
* @param {?} where
* @return {?}
*/
EditorToolbarComponent.prototype.insertColor = /**
* @param {?} color
* @param {?} where
* @return {?}
*/
function (color, where) {
this.editorService.insertColor(color, where);
this.execute.emit("");
};
/**
* @param {?} fontId
* @return {?}
*/
EditorToolbarComponent.prototype.setFontName = /**
* @param {?} fontId
* @return {?}
*/
function (fontId) {
this.editorService.setFontName(this.fonts[fontId].name);
this.execute.emit("");
};
/**
* @param {?} fontSize
* @return {?}
*/
EditorToolbarComponent.prototype.setFontSize = /**
* @param {?} fontSize
* @return {?}
*/
function (fontSize) {
this.editorService.setFontSize(fontSize);
this.execute.emit("");
};
/**
* @param {?} m
* @return {?}
*/
EditorToolbarComponent.prototype.setEditorMode = /**
* @param {?} m
* @return {?}
*/
function (m) {
/** @type {?} */
var toggleEditorModeButton = this._document.getElementById("toggleEditorMode" + '-' + this.id);
if (m) {
this._renderer.addClass(toggleEditorModeButton, "active");
}
else {
this._renderer.removeClass(toggleEditorModeButton, "active");
}
this.htmlMode = m;
};
/**
* @param {?} event
* @return {?}
*/
EditorToolbarComponent.prototype.onFileChanged = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
/** @type {?} */
var file = event.target.files[0];
console.log(file.type);
if (file.type !== "image/jpeg") {
this.message.error("File type should be JPEG");
this.fileReset();
return false;
}
else if (file.size / 1024 / 1024 > 1) {
this.message.error("File size should be less than 1 Mb");
this.fileReset();
return false;
}
else {
/** @type {?} */
var timestamp = new Date().valueOf();
/** @type {?} */
var filePath_1 = "/media/" + timestamp + ".jpeg";
this.storage.upload(filePath_1, file)
.then((/**
* @param {?} res
* @return {?}
*/
function (res) {
return _this.storage.ref(filePath_1).getDownloadURL().toPromise();
}))
.then((/**
* @param {?} url
* @return {?}
*/
function (url) {
_this.message.success("Image uploaded");
_this.editorService.insertImage(url);
_this.fileReset();
}))
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) {
_this.message.error(err);
}));
}
};
/**
* @return {?}
*/
EditorToolbarComponent.prototype.fileReset = /**
* @return {?}
*/
function () {
this.myInputFile.nativeElement.value = "";
};
/**
* @param {?} classId
* @return {?}
*/
EditorToolbarComponent.prototype.setCustomClass = /**
* @param {?} classId
* @return {?}
*/
function (classId) {
this.editorService.createCustomClass(this.customClasses[classId]);
};
EditorToolbarComponent.decorators = [
{ type: Component, args: [{
selector: 'aq-editor-toolbar',
template: "<div class=\"angular-editor-toolbar\" *ngIf=\"showToolbar\">\n <nz-button-group>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" (click)=\"triggerCommand('undo')\" nzTitle=\"Undo\" tabindex=\"-1\">\n <i nz-icon nzType=\"undo\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" (click)=\"triggerCommand('redo')\" nzTitle=\"Redo\" tabindex=\"-1\">\n <i nz-icon nzType=\"redo\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-button-group>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'bold-'+id\" (click)=\"triggerCommand('bold')\" nzTitle=\"Bold\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"bold\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'italic-'+id\" (click)=\"triggerCommand('italic')\" nzTitle=\"Italic\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"italic\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'underline-'+id\" (click)=\"triggerCommand('underline')\" nzTitle=\"Underline\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"underline\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'strikeThrough-'+id\" (click)=\"triggerCommand('strikeThrough')\" nzTitle=\"Strike Through\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"strikethrough\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'subscript-'+id\" (click)=\"triggerCommand('subscript')\" nzTitle=\"subscript\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n x<sub>2</sub>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'superscript-'+id\" (click)=\"triggerCommand('superscript')\" nzTitle=\"superscript\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n x<sup>2</sup>\n </button>\n </nz-button-group>\n\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'justifyLeft-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Left\" nz-button (click)=\"triggerCommand('justifyLeft')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-left\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyCenter-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Center\" nz-button (click)=\"triggerCommand('justifyCenter')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-center\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyRight-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Right\" nz-button (click)=\"triggerCommand('justifyRight')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-right\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyFull-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Full\" nz-button (click)=\"triggerCommand('justifyFull')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"bars\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'indent-'+id\" type=\"button\" nz-tooltip nzTitle=\"Indent\" nz-button (click)=\"triggerCommand('indent')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"menu-unfold\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'outdent-'+id\" type=\"button\" nz-tooltip nzTitle=\"Outdent\" nz-button (click)=\"triggerCommand('outdent')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"menu-fold\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'insertUnorderedList-'+id\" type=\"button\" nz-tooltip nzTitle=\"Unordered List\" nz-button (click)=\"triggerCommand('insertUnorderedList')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"unordered-list\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'insertOrderedList-'+id\" type=\"button\" nz-tooltip nzTitle=\"Ordered List\" nz-button (click)=\"triggerCommand('insertOrderedList')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"ordered-list\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-input-group nzCompact>\n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Formatting\" [id]=\"'heading-'+id\" nzPlaceHolder=\"Formatting\" class=\"select-heading\" [(ngModel)]=\"block\" (ngModelChange)=\"triggerCommand(block)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"h1\" nzValue=\"h1\" nzLabel=\"H1\"></nz-option>\n <nz-option class=\"h2\" nzValue=\"h2\" nzLabel=\"H2\"></nz-option>\n <nz-option class=\"h3\" nzValue=\"h3\" nzLabel=\"H3\"></nz-option>\n <nz-option class=\"h4\" nzValue=\"h4\" nzLabel=\"H4\"></nz-option>\n <nz-option class=\"h5\" nzValue=\"h5\" nzLabel=\"H5\"></nz-option>\n <nz-option class=\"h6\" nzValue=\"h6\" nzLabel=\"H6\"></nz-option>\n <nz-option class=\"p\" nzValue=\"p\" nzLabel=\"P\"></nz-option>\n <nz-option class=\"pre\" nzValue=\"pre\" nzLabel=\"Pre\"></nz-option>\n <nz-option class=\"div\" nzValue=\"div\" nzLabel=\"Div\"></nz-option>\n <nz-option class=\"default\" nzValue=\"default\" nzLabel=\"Default\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Font Name\" nzPlaceHolder=\"Font Name\" [id]=\"'fontSelector-'+id\" class=\"select-font\" [(ngModel)]=\"fontId\" (ngModelChange)=\"setFontName(fontId)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option *ngFor=\"let item of fonts; let i = index\" [class]=\"item.class\" [nzValue]=\"i\" [nzLabel]=\"item.name\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Font Size\" nzPlaceHolder=\"Font Sizing\" [id]=\"'fontSizeSelector-'+id\" class=\"select-font-size\" [(ngModel)]=\"fontSize\" (ngModelChange)=\"setFontSize(fontSize)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"size1\" nzValue=\"1\" nzLabel=\"1\"></nz-option>\n <nz-option class=\"size2\" nzValue=\"2\" nzLabel=\"2\"></nz-option>\n <nz-option class=\"size3\" nzValue=\"3\" nzLabel=\"3\"></nz-option>\n <nz-option class=\"size4\" nzValue=\"4\" nzLabel=\"4\"></nz-option>\n <nz-option class=\"size5\" nzValue=\"5\" nzLabel=\"5\"></nz-option>\n <nz-option class=\"size6\" nzValue=\"6\" nzLabel=\"6\"></nz-option>\n <nz-option class=\"size7\" nzValue=\"7\" nzLabel=\"7\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;margin-right:4px;\" nz-tooltip nzTitle=\"Custom Style\" nzPlaceHolder=\"Custom Class\" [id]=\"'customClassSelector-'+id\" class=\"select-custom-style\" [(ngModel)]=\"customClassId\" (ngModelChange)=\"setCustomClass(customClassId)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"\" [nzValue]=\"-1\" nzLabel=\"Clear Class\"></nz-option>\n <nz-option *ngFor=\"let item of customClasses; let i = index\" [class]=\"item.class\" [nzValue]=\"i\" [nzLabel]=\"item.name\"></nz-option>\n </nz-select>\n\n <button nzSize=\"large\" [id]=\"'foregroundColorPicker-'+id\" type=\"button\" nz-button (click)=\"fgInput.click()\" nz-tooltip nzTitle=\"Text Color\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <span class=\"color-label foreground\">\n <i nz-icon nzType=\"font-colors\" nzTheme=\"outline\"></i>\n </span>\n </button> \n\n <button nzSize=\"large\" [id]=\"'backgroundColorPicker-'+id\" type=\"button\" nz-button (click)=\"bgInput.click()\" nz-tooltip nzTitle=\"Background Color\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <span class=\"color-label background\">\n <i nz-icon nzType=\"bg-colors\" nzTheme=\"outline\"></i>\n </span>\n </button>\n\n <button nzSize=\"large\" [id]=\"'link-'+id\" type=\"button\" nz-button (click)=\"insertUrl()\" nz-tooltip nzTitle=\"Insert Link\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"link\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-button (click)=\"triggerCommand('unlink')\" nz-tooltip nzTitle=\"Unlink\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"disconnect\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-button (click)=\"fileInput.click()\" nz-tooltip nzTitle=\"Insert Image\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"picture\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-tooltip nzTitle=\"Horizontal Line\" nz-button (click)=\"triggerCommand('insertHorizontalRule')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"minus\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-tooltip nzTitle=\"Clear Formatting\" nz-button (click)=\"triggerCommand('removeFormat')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\"></i>\n </button>\n \n <button nzSize=\"large\" [id]=\"'toggleEditorMode-'+id\" type=\"button\" nz-tooltip nzTitle=\"HTML Code\" nz-button (click)=\"triggerCommand('toggleEditorMode')\" tabindex=\"-1\">\n <i nz-icon nzType=\"code\" nzTheme=\"outline\"></i>\n </button>\n </nz-input-group>\n \n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\" #fgInput>\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\" #bgInput>\n <input style=\"display: none\" accept=\"image/*\" type=\"file\" (change)=\"onFileChanged($event)\" #fileInput>\n</div>",
styles: [".ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only{padding:0 15px}.ant-btn-group{margin-right:4px;margin-bottom:4px}.select{width:100px;margin-right:4px;margin-bottom:4px}"]
}] }
];
/** @nocollapse */
EditorToolbarComponent.ctorParameters = function () { return [
{ type: AngularFireStorage },
{ type: NzMessageService },
{ type: Renderer2 },
{ type: EditorService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
]; };
EditorToolbarComponent.propDecorators = {
execute: [{ type: Output }],
myInputFile: [{ type: ViewChild, args: ['fileInput',] }]
};
return EditorToolbarComponent;
}());
export { EditorToolbarComponent };
if (false) {
/** @type {?} */
EditorToolbarComponent.prototype.id;
/** @type {?} */
EditorToolbarComponent.prototype.htmlMode;
/** @type {?} */
EditorToolbarComponent.prototype.showToolbar;
/** @type {?} */
EditorToolbarComponent.prototype.block;
/** @type {?} */
EditorToolbarComponent.prototype.defaultFontId;
/** @type {?} */
EditorToolbarComponent.prototype.fontId;
/** @type {?} */
EditorToolbarComponent.prototype.fontSize;
/** @type {?} */
EditorToolbarComponent.prototype.fonts;
/** @type {?} */
EditorToolbarComponent.prototype.customClassId;
/** @type {?} */
EditorToolbarComponent.prototype.customClasses;
/** @type {?} */
EditorToolbarComponent.prototype.tagMap;
/** @type {?} */
EditorToolbarComponent.prototype.select;
/** @type {?} */
EditorToolbarComponent.prototype.buttons;
/** @type {?} */
EditorToolbarComponent.prototype.execute;
/** @type {?} */
EditorToolbarComponent.prototype.myInputFile;
/**
* @type {?}
* @private
*/
EditorToolbarComponent.prototype.storage;
/**
* @type {?}
* @private
*/
EditorToolbarComponent.prototype.message;
/**
* @type {?}
* @private
*/
EditorToolbarComponent.prototype._renderer;
/**
* @type {?}
* @private
*/
EditorToolbarComponent.prototype.editorService;
/**
* @type {?}
* @private
*/
EditorToolbarComponent.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpcmViYXNlLWNtcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmUvZWRpdG9yLXRvb2xiYXIvZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTNEO0lBK0JFLGdDQUNVLE9BQTJCLEVBQzNCLE9BQXlCLEVBQ3pCLFNBQW9CLEVBQ3BCLGFBQTRCLEVBQ1YsU0FBYztRQUpoQyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsY0FBUyxHQUFULFNBQVMsQ0FBSztRQTdCMUMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUNSLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUVsQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLEdBQUcsQ0FBQztRQUdmLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFHbkIsV0FBTSxHQUFHO1lBQ1AsVUFBVSxFQUFFLFFBQVE7WUFDcEIsQ0FBQyxFQUFF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dWpVQUE4Qzs7aUJBRS9DOzs7O2dCQVJRLGtCQUFrQjtnQkFEbEIsZ0JBQWdCO2dCQUpnRCxTQUFTO2dCQUV6RSxhQUFhO2dEQTJDakIsTUFBTSxTQUFDLFFBQVE7OzswQkFSakIsTUFBTTs4QkFDTixTQUFTLFNBQUMsV0FBVzs7SUF3S3hCLDZCQUFDO0NBQUEsQUFyTUQsSUFxTUM7U0FoTVksc0JBQXNCOzs7SUFFakMsb0NBQVE7O0lBQ1IsMENBQWlCOztJQUNqQiw2Q0FBbUI7O0lBRW5CLHVDQUFrQjs7SUFDbEIsK0NBQWM7O0lBQ2Qsd0NBQVc7O0lBQ1gsMENBQWU7O0lBQ2YsdUNBQWM7O0lBRWQsK0NBQW1COztJQUNuQiwrQ0FBNkI7O0lBRTdCLHdDQUdFOztJQUVGLHdDQUFnRTs7SUFDaEUseUNBQThOOztJQUU5Tix5Q0FBb0U7O0lBQ3BFLDZDQUErQzs7Ozs7SUFHN0MseUNBQW1DOzs7OztJQUNuQyx5Q0FBaUM7Ozs7O0lBQ2pDLDJDQUE0Qjs7Ozs7SUFDNUIsK0NBQW9DOzs7OztJQUNwQywyQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvbnQsIEN1c3RvbUNsYXNzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL2VkaXRvcic7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZVN0b3JhZ2UgfSBmcm9tICdAYW5ndWxhci9maXJlL3N0b3JhZ2UnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXEtZWRpdG9yLXRvb2xiYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgaWQgPSAnJztcbiAgaHRtbE1vZGUgPSBmYWxzZTtcbiAgc2hvd1Rvb2xiYXIgPSB0cnVlO1xuXG4gIGJsb2NrID0gJ2RlZmF1bHQnO1xuICBkZWZhdWx0Rm9udElkO1xuICBmb250SWQgPSAwO1xuICBmb250U2l6ZSA9ICc1JztcbiAgZm9udHM6IEZvbnRbXTtcblxuICBjdXN0b21DbGFzc0lkID0gLTE7XG4gIGN1c3RvbUNsYXNzZXM6IEN1c3RvbUNsYXNzW107XG5cbiAgdGFnTWFwID0ge1xuICAgIEJMT0NLUVVPVEU6IFwiaW5kZW50XCIsXG4gICAgQTogXCJsaW5rXCJcbiAgfTtcblxuICBzZWxlY3QgPSBbXCJIMVwiLCBcIkgyXCIsIFwiSDNcIiwgXCJINFwiLCBcIkg1XCIsIFwiSDZcIiwgXCJQXCIsIFwiUFJFXCIsIFwiRElWXCJdXG4gIGJ1dHRvbnMgPSBbXCJib2xkXCIsIFwiaXRhbGljXCIsIFwidW5kZXJsaW5lXCIsIFwic3RyaWtlVGhyb3VnaFwiLCBcInN1YnNjcmlwdFwiLCBcInN1cGVyc2NyaXB0XCIsIFwianVzdGlmeUxlZnRcIiwgXCJqdXN0aWZ5Q2VudGVyXCIsIFwianVzdGlmeVJpZ2h0XCIsIFwianVzdGlmeUZ1bGxcIiwgXCJpbmRlbnRcIiwgXCJvdXRkZW50XCIsIFwiaW5zZXJ0VW5vcmRlcmVkTGlzdFwiLCBcImluc2VydE9yZGVyZWRMaXN0XCIsIFwibGlua1wiXVxuXG4gIEBPdXRwdXQoKSBleGVjdXRlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIG15SW5wdXRGaWxlOiBFbGVtZW50UmVmXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBBbmd1bGFyRmlyZVN0b3JhZ2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlOiBOek1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlLCBcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55XG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgXG4gIH1cblxuICB0cmlnZ2VyQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4ZWN1dGUuZW1pdChjb21tYW5kKTtcbiAgfVxuXG4gIHRyaWdnZXJCdXR0b25zKCkge1xuICAgIGlmICghdGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKGUpO1xuICAgICAgY29uc3QgZWxlbWVudEJ5SWQgPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlICsgJy0nICsgdGhpcy5pZCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnRCeUlkLCBcImFjdGl2ZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRCeUlkLCBcImFjdGl2ZVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyaWdnZXJCbG9ja3Mobm9kZXM6IE5vZGVbXSkge1xuICAgIGlmICghdGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdC5mb3JFYWNoKHkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmZpbmQoeCA9PiB4Lm5vZGVOYW1lID09PSB5KTtcbiAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQgJiYgeSA9PT0gbm9kZS5ub2RlTmFtZSkge1xuICAgICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5ibG9jayA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm91bmQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuYmxvY2sgPSAnZGVmYXVsdCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmZvbnRzKSB7XG4gICAgICB0aGlzLmZvbnRzLmZvckVhY2goKHksIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5maW5kKHggPT4ge1xuICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgSFRNTEZvbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4geC5mYWNlID09PSB5Lm5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChmb3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9udElkID0gaW5kZXg7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuZm9udElkID0gdGhpcy5kZWZhdWx0Rm9udElkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzZXMpIHtcbiAgICAgIHRoaXMuY3VzdG9tQ2xhc3Nlcy5mb3JFYWNoKCh5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuZmluZCh4ID0+IHtcbiAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB4LmNsYXNzTmFtZSA9PT0geS5jbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21DbGFzc0lkID0gaW5kZXg7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuY3VzdG9tQ2xhc3NJZCA9IC0xO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRhZ01hcCkubWFwKGUgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudEJ5SWQgPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhZ01hcFtlXSArICctJyArIHRoaXMuaWQpO1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmZpbmQoeCA9PiB4Lm5vZGVOYW1lID09PSBlKTtcbiAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQgJiYgZSA9PT0gbm9kZS5ub2RlTmFtZSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50QnlJZCwgXCJhY3RpdmVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50QnlJZCwgXCJhY3RpdmVcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpbnNlcnRVcmwoKSB7XG4gICAgY29uc3QgdXJsID0gcHJvbXB0KFwiSW5zZXJ0IFVSTCBsaW5rXCIsICdodHRwOlxcL1xcLycpO1xuICAgIGlmICh1cmwgJiYgdXJsICE9PSAnJyAmJiB1cmwgIT09ICdodHRwOi8vJykge1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmNyZWF0ZUxpbmsodXJsKTtcbiAgICB9XG4gIH1cblxuICBpbnNlcnRDb2xvcihjb2xvcjogc3RyaW5nLCB3aGVyZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydENvbG9yKGNvbG9yLCB3aGVyZSk7XG4gICAgdGhpcy5leGVjdXRlLmVtaXQoXCJcIik7XG4gIH1cblxuICBzZXRGb250TmFtZShmb250SWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRGb250TmFtZSh0aGlzLmZvbnRzW2ZvbnRJZF0ubmFtZSk7XG4gICAgdGhpcy5leGVjdXRlLmVtaXQoXCJcIik7XG4gIH1cblxuICBzZXRGb250U2l6ZShmb250U2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICB0aGlzLmV4ZWN1dGUuZW1pdChcIlwiKTtcbiAgfVxuXG4gIHNldEVkaXRvck1vZGUobTogYm9vbGVhbikge1xuICAgIGNvbnN0IHRvZ2dsZUVkaXRvck1vZGVCdXR0b24gPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRvZ2dsZUVkaXRvck1vZGVcIiArICctJyArIHRoaXMuaWQpO1xuICAgIGlmIChtKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0b2dnbGVFZGl0b3JNb2RlQnV0dG9uLCBcImFjdGl2ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModG9nZ2xlRWRpdG9yTW9kZUJ1dHRvbiwgXCJhY3RpdmVcIik7XG4gICAgfVxuICAgIHRoaXMuaHRtbE1vZGUgPSBtO1xuICB9XG5cbiAgb25GaWxlQ2hhbmdlZChldmVudCkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF1cbiAgICBjb25zb2xlLmxvZyhmaWxlLnR5cGUpXG4gICAgaWYoZmlsZS50eXBlICE9PSBcImltYWdlL2pwZWdcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKFwiRmlsZSB0eXBlIHNob3VsZCBiZSBKUEVHXCIpXG4gICAgICB0aGlzLmZpbGVSZXNldCgpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGZpbGUuc2l6ZS8xMDI0LzEwMjQgPiAxKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoXCJGaWxlIHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIE1iXCIpXG4gICAgICB0aGlzLmZpbGVSZXNldCgpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpXG4gICAgICBsZXQgZmlsZVBhdGggPSBgL21lZGlhLyR7dGltZXN0YW1wfS5qcGVnYFxuICAgICAgdGhpcy5zdG9yYWdlLnVwbG9hZChmaWxlUGF0aCwgZmlsZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnJlZihmaWxlUGF0aCkuZ2V0RG93bmxvYWRVUkwoKS50b1Byb21pc2UoKVxuICAgICAgICB9KVxuICAgICAgICAudGhlbih1cmwgPT4ge1xuICAgICAgICAgIHRoaXMubWVzc2FnZS5zdWNjZXNzKFwiSW1hZ2UgdXBsb2FkZWRcIilcbiAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0SW1hZ2UodXJsKVxuICAgICAgICAgIHRoaXMuZmlsZVJlc2V0KClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKGVycilcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmaWxlUmVzZXQoKSB7XG4gICAgdGhpcy5teUlucHV0RmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHNldEN1c3RvbUNsYXNzKGNsYXNzSWQ6IG51bWJlcikge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5jcmVhdGVDdXN0b21DbGFzcyh0aGlzLmN1c3RvbUNsYXNzZXNbY2xhc3NJZF0pO1xuICB9XG59Il19