@firestitch/html-editor 9.4.3 → 9.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://@firestitch/html-editor/app/consts/rich-buttons.const.ts","ng://@firestitch/html-editor/app/consts/text-buttons.const.ts","ng://@firestitch/html-editor/app/consts/paragraph-buttons.const.ts","ng://@firestitch/html-editor/app/injects/config.inject.ts","ng://@firestitch/html-editor/app/utils/loader.ts","ng://@firestitch/html-editor/app/services/froala-loader.service.ts","ng://@firestitch/html-editor/app/components/html-editor/html-editor.component.ts","ng://@firestitch/html-editor/app/components/html-renderer/html-renderer.component.ts","ng://@firestitch/html-editor/app/fs-html-editor.module.ts","ng://@firestitch/html-editor/app/classes/plugin.ts","ng://@firestitch/html-editor/app/plugins/mention.plugin.ts","ng://@firestitch/html-editor/app/plugins/checklist.plugin.ts","ng://@firestitch/html-editor/app/plugins/code.plugin.ts","ng://@firestitch/html-editor/app/plugins/screen-record.plugin.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","this","constructor","prototype","create","__assign","assign","t","s","i","n","arguments","length","call","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","__read","o","m","ar","error","RichButtons","TextButtons","ParagraphButtons","FS_HTML_EDITOR_DEFAULT_CONFIG","InjectionToken","FS_HTML_EDITOR_CONFIG","resourceBase","stylesBase","head","files","resourcePaths","stylesPaths","ResourceLoader","document","getElementsByTagName","Map","froala","align","colors","image","link","lists","paragraph_format","table","url","video","quote","draggable","setResourceBase","path","setStylesBase","loadResource","resourceName","scriptPath","has","obs$","Observable","obs","script","createElement","src","appendChild","onload","complete","onerror","err","pipe","shareReplay","set","get","loadStyles","stylePath","style","id","rel","href","FsFroalaLoaderService","_defaultConfig","_froalaLoaded","BehaviorSubject","_defaultPluginsLoaded","_ready$","combineLatest","map","_a","_b","FroalaReady","assetsJSPath","assetsCSSPath","_load","getValue","_FroalaEditor","_this","tap","window","FroalaEditor","_froalaDone","concatMap","_loadPlugins","_defaultPluginsDone","subscribe","imports","defaultPlugins","reduce","acc","pluginName","import$","Optional","type","Inject","args","Injectable","providedIn","FsHtmlEditorComponent","_cdRef","_fr","classFocused","classDisabled","config","initialized","_initialize$","ReplaySubject","_destroy$","Subject","onChange","data","onTouched","elRef","nativeElement","_html","_editor","ready$","ngOnInit","autofocus","disabled","initOnClick","_listenLazyInit","ngAfterViewInit","hasContent","el","querySelector","innerHTML","innerText","initialize","options","_createConfig","_initPlugins","_createOptions","markForCheck","disable","froalaConfig","events","on","_change","html","div","querySelectorAll","forEach","attributes","name_1","name","removeAttribute","upload","fetch","getAttribute","res","blob","_processImageUpload","setAttribute","blobs","editor","insert","remove","selection","node","from","find","textContent","range","createRange","sel","getSelection","setStart","_getTextNode","offset","collapse","removeAllRanges","addRange","focus","takeUntil","nodeType","Node","TEXT_NODE","childNodes","uninitializedClick","event","defaultPrevented","target_1","nodeName","targetTarget_1","setTimeout","initClick","updateSize","dispatchEvent","Event","validate","control","maxLength","length_1","maxLengthError","keys","cursorPosition","setAtEnd","$el","setAtStart","restore","elSelection","element","scrollIntoView","block","clear","writeValue","setHtml","registerOnChange","fn","registerOnTouched","ngOnDestroy","destroy","merge","plugins","plugin","PLUGINS","buttons","button","DefineIcon","NAME","PATH","svgPath","RegisterCommand","icon","title","tooltip","undo","showOnMobile","refreshAfterCallback","callback","click","refresh","activationKey","placeholderText","placeholder","linkAlwaysBlank","tabSpaces","typingTimer","tooltips","wordPasteModal","imageDefaultWidth","imageDefaultAlign","quickInsertEnabled","paragraphDefaultSelection","videoUpload","paragraphFormat","N","H1","H2","H3","H4","BLOCKQUOTE","paragraphFormatSelection","toolbarButtonsXS","moreText","buttonsVisible","moreParagraph","moreRich","toolbarButtons","froalaReady$","filter","ready","switchMap","baseNode","nodeValue","baseOffset","ChangeDetectorRef","HostBinding","ViewChild","ElementRef","Input","FsHtmlEditorComponent_1","Component","selector","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","changeDetection","ChangeDetectionStrategy","OnPush","FsHtmlRendererComponent","sanitized","trustedHtml","bypassSecurityTrustHtml","DomSanitizer","FsHtmlEditorModule","forRoot","ngModule","FsHtmlEditorModule_1","useValue","useFactory","FsHtmlEditorConfigFactory","deps","NgModule","CommonModule","FsSkeletonModule","exports","declarations","Plugin","MentionPlugin","_super","iconPath","_closeAll","_tribute","showMenuForCollection","Tribute","values","debounce","_loadValues","bind","searchOpts","pre","post","skip","containerClass","itemClass","menuItemClass","trigger","allowSpaces","menuItemTemplate","item","original","selectTemplate","selectedTemplate","firstElementChild","classList","add","outerHTML","_tributes","attach","isActive","tribute","menu","hideMenu","keyword","cb","ChecklistPlugin","li","offsetX","items","concat","__spread","contains","CodePlugin","codeEl","_getCodeEl","toString","replace","keyCode","preventDefault","stopPropagation","stopImmediatePropagation","br","base","nextSibling","splice","parentElement","ScreenRecordPlugin","navigator","mediaDevices","getDisplayMedia","stream","chunks","mediaRecorder","MediaRecorder","mimeType","addEventListener","stop","getTracks","track","Blob","maxWidth","size","start","catch","toPromise","_getEl","popups","hideAll","_activeEl","_showPopup","POPUP_TEMPLATES","SVG_KEY","_createPopup","buildList","$popup","setContainer","$","left","offsetLeft","offsetWidth","show","parentNode"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","export const RichButtons = [\n 'insertTable',\n 'insertImage',\n 'insertLink',\n 'insertVideo',\n];\n","export const TextButtons = [\n 'paragraphFormat',\n 'code',\n 'bold',\n 'italic',\n 'underline',\n 'strikeThrough',\n 'subscript',\n 'superscript',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'inlineClass',\n 'inlineStyle',\n 'clearFormatting',\n 'quote',\n];\n","export const ParagraphButtons = [\n 'align',\n 'formatOL',\n 'formatUL',\n 'checklist',\n 'indent',\n 'outdent',\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_HTML_EDITOR_DEFAULT_CONFIG = new InjectionToken<any[]>('fs-html-editor.default-config');\nexport const FS_HTML_EDITOR_CONFIG = new InjectionToken<any[]>('fs-html-editor.config');\n","import { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n\nfunction resourceLoaderFactory() {\n let resourceBase = '/assets/js/froala/';\n let stylesBase = '/assets/css/';\n\n const head = document.getElementsByTagName('head')[0];\n const files = new Map<string, Observable<unknown>>();\n\n const resourcePaths = {\n froala: 'froala_editor.min.js',\n align: 'plugins/align.min.js',\n colors: 'plugins/colors.min.js',\n image: 'plugins/image.min.js',\n link: 'plugins/link.min.js',\n lists: 'plugins/lists.min.js',\n paragraph_format: 'plugins/paragraph_format.min.js',\n table: 'plugins/table.min.js',\n url: 'plugins/url.min.js',\n video: 'plugins/video.min.js',\n quote: 'plugins/quote.min.js',\n draggable: 'plugins/draggable.min.js',\n }\n\n const stylesPaths = {\n froala: 'froala_editor.pkgd.min.css',\n }\n\n const loadResource = function (scriptPath: string): Observable<unknown> {\n if (!files.has(scriptPath)) {\n const obs$ = new Observable((obs) => {\n\n const script = document.createElement('script');\n script.src = scriptPath;\n\n head.appendChild(script);\n\n script.onload = () => {\n obs.next();\n obs.complete();\n };\n\n script.onerror = (err) => {\n obs.error(err);\n }\n })\n .pipe(\n shareReplay(1),\n );\n\n files.set(scriptPath, obs$);\n }\n\n return files.get(scriptPath);\n };\n\n const loadStyles = function (stylePath: string): Observable<unknown> {\n if (!files.has(stylePath)) {\n const obs$ = new Observable((obs) => {\n const style = document.createElement('link');\n style.id = stylePath;\n style.rel = 'stylesheet';\n style.href = `${stylePath}`;\n\n head.appendChild(style);\n\n style.onload = () => {\n obs.next();\n obs.complete();\n };\n\n style.onerror = (err) => {\n obs.error(err);\n }\n });\n\n files.set(stylePath, obs$);\n }\n\n return files.get(stylePath);\n };\n\n return {\n setResourceBase: (path: string) => {\n resourceBase = path;\n },\n setStylesBase: (path: string) => {\n stylesBase = path;\n },\n loadResource: (resourceName: string) => {\n const path = resourcePaths[resourceName] || resourceName;\n\n return loadResource(resourceBase + path);\n },\n loadStyles: (resourceName: string) => {\n const path = stylesPaths[resourceName] || resourceName;\n\n return loadStyles(stylesBase + path);\n }\n }\n}\n\n\nexport const ResourceLoader = resourceLoaderFactory();\n","import { Inject, Injectable, Optional } from '@angular/core';\n\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { concatMap, map, shareReplay, tap } from 'rxjs/operators';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../injects/config.inject';\nimport { FsHtmlEditorConfig } from '../interfaces/html-editor-config';\n\nimport { ResourceLoader } from '../utils/loader';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsFroalaLoaderService {\n\n private _FroalaEditor: unknown;\n\n private _froalaLoaded = new BehaviorSubject(false);\n private _defaultPluginsLoaded = new BehaviorSubject(false);\n\n private _ready$ = combineLatest([this._froalaLoaded, this._defaultPluginsLoaded])\n .pipe(\n map(([FroalaReady, pluginsRead]) => {\n return pluginsRead && FroalaReady;\n }),\n shareReplay(1),\n );\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig: FsHtmlEditorConfig,\n ) {\n if (this._defaultConfig) {\n if (this._defaultConfig.assetsJSPath) {\n ResourceLoader.setResourceBase(this._defaultConfig.assetsJSPath)\n }\n\n if (this._defaultConfig.assetsCSSPath) {\n ResourceLoader.setStylesBase(this._defaultConfig.assetsCSSPath)\n }\n }\n\n this._load();\n }\n\n public get ready$(): Observable<boolean> {\n return this._ready$;\n }\n\n public get ready(): boolean {\n return this._froalaLoaded.getValue() && this._defaultPluginsLoaded.getValue();\n }\n\n public get FroalaEditor(): any {\n return this._FroalaEditor;\n }\n\n private _load() {\n combineLatest([\n ResourceLoader.loadResource('froala'),\n ResourceLoader.loadStyles('froala')\n ])\n .pipe(\n tap(() => {\n this._FroalaEditor = (window as any).FroalaEditor;\n this._froalaDone();\n }),\n concatMap(() => {\n return this._loadPlugins();\n }),\n tap(() => {\n this._defaultPluginsDone();\n }),\n )\n .subscribe();\n }\n\n private _loadPlugins(): Observable<unknown> {\n const imports = this._defaultConfig\n .defaultPlugins\n .reduce((acc, pluginName) => {\n const import$ = ResourceLoader.loadResource(pluginName);\n\n acc.push(import$);\n\n return acc;\n }, []);\n\n return combineLatest(imports);\n }\n\n private _froalaDone() {\n this._froalaLoaded.next(true);\n }\n\n private _defaultPluginsDone() {\n this._defaultPluginsLoaded.next(true);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\n\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\nimport { filter, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { merge } from 'lodash-es';\n\nimport { PluginButton } from './../../interfaces/plugin-button';\nimport { FsHtmlEditorConfig } from '../../interfaces/html-editor-config';\nimport { RichButtons } from './../../consts/rich-buttons.const';\nimport { TextButtons } from './../../consts/text-buttons.const';\nimport { ParagraphButtons } from './../../consts/paragraph-buttons.const';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';\nimport { Plugin } from './../../classes/plugin';\n\nimport { FsFroalaLoaderService } from '../../services/froala-loader.service';\n\n\n@Component({\n selector: 'fs-html-editor',\n templateUrl: 'html-editor.component.html',\n styleUrls: ['html-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {\n\n @HostBinding('class.focused') classFocused = false;\n @HostBinding('class.disabled') classDisabled = false;\n\n @ViewChild('elRef') public elRef: ElementRef;\n\n @Input() public config: FsHtmlEditorConfig = {};\n\n public initialized = false;\n\n private _editor: any;\n private _html: string;\n private _initialize$ = new ReplaySubject();\n private _destroy$ = new Subject();\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig,\n private _cdRef: ChangeDetectorRef,\n private _fr: FsFroalaLoaderService,\n ) { }\n\n public onChange = (data: any) => {}\n public onTouched = () => {}\n\n public get el(): any {\n return this.elRef.nativeElement;\n }\n\n public get html(): string {\n return this._html;\n }\n\n public get editor(): any {\n return this._editor;\n }\n\n public get froalaReady$(): Observable<boolean> {\n return this._fr.ready$;\n }\n\n public ngOnInit(): void {\n this.config = this.config || {};\n this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;\n this.initialized = !this.config.initOnClick;\n this._listenLazyInit();\n }\n\n public ngAfterViewInit() {\n if (!this.config.initOnClick || !this.hasContent()) {\n this.initialized = true;\n this._initialize$.next();\n }\n }\n\n public hasContent() {\n const el = document.createElement('div');\n\n if (el.querySelector('img')) {\n return true;\n }\n\n el.innerHTML = this._html;\n return !!el.innerText.length;\n }\n\n public initialize(options: any = {}) {\n const config = this._createConfig();\n\n this._initPlugins(config);\n this.el.innerHTML = this._html;\n\n this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {\n this._cdRef.markForCheck();\n if (config.disabled) {\n this.disable();\n }\n\n if (config.froalaConfig.events) {\n if (config.froalaConfig.events.initialized) {\n config.froalaConfig.events.initialized();\n }\n }\n\n this._editor.events.on('focus', () => {\n this.classFocused = true;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('blur', () => {\n this.classFocused = false;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('contentChanged', () => {\n this._change(this._editor.html.get());\n });\n\n this._editor.events.on('paste.afterCleanup', (html) => {\n var div = document.createElement('div');\n div.innerHTML = html;\n div.querySelectorAll('*')\n .forEach((el) => {\n for (var i = 0; i < el.attributes.length; i++) {\n const name = el.attributes[0].name;\n if (name !== 'href') {\n el.removeAttribute(name);\n }\n }\n });\n return div.innerHTML;\n });\n\n this._editor.events.on('keydown', () => {\n this.onTouched();\n });\n\n if (this.config.image && this.config.image.upload) {\n this._editor.events.on('image.beforePasteUpload', (image) => {\n\n fetch(image.getAttribute('src'))\n .then((res) => {\n res.blob()\n .then((blob) => {\n this._processImageUpload(blob)\n .subscribe((url) => {\n image.setAttribute('src', url);\n image.removeAttribute('data-fr-image-pasted');\n });\n });\n });\n\n return false;\n });\n\n this._editor.events.on('image.beforeUpload', (blobs) => {\n this._processImageUpload(blobs[0]).subscribe((url) => {\n this.editor.image.insert(url, null, null, this.editor.image.get());\n });\n return false;\n });\n }\n\n if (this.el.querySelector('.fr-second-toolbar')) {\n this.el.querySelector('.fr-second-toolbar').remove();\n }\n\n const selection = options.selection;\n\n if (selection) {\n const node: any = Array.from(this.el.querySelectorAll('.fr-element *')).find((node: any) => {\n return selection.node === node.textContent;\n });\n\n if (node) {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this._getTextNode(node), selection.offset);\n range.collapse(true)\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (this.config.autofocus) {\n this.focus();\n }\n } else if (this.config.autofocus) {\n this.focus();\n }\n\n });\n }\n\n private _processImageUpload(blob) {\n return this.config.image.upload(blob)\n .pipe(\n takeUntil(this._destroy$),\n );\n }\n\n private _getTextNode(node) {\n if (node) {\n if (node.nodeType === Node.TEXT_NODE) {\n return node;\n }\n if (node.childNodes) {\n return this._getTextNode(node.childNodes[0]);\n }\n }\n }\n\n public uninitializedClick(event: UIEvent): void {\n if (!event.defaultPrevented) {\n const target: any = event.target;\n if (target && target.nodeName === 'A' && target.getAttribute('href')) {\n const targetTarget = target.getAttribute('target');\n target.setAttribute('target', '_blank');\n setTimeout(() => {\n if (targetTarget) {\n target.setAttribute('target', targetTarget);\n } else {\n target.removeAttribute('target');\n }\n });\n } else {\n if (this.config.initClick) {\n this.config.initClick(event);\n }\n this._initialize$.next();\n this.initialized = true;\n }\n }\n }\n\n public updateSize() {\n // Hack: To trigger the toolbar button size modes\n window.dispatchEvent(new Event('resize'));\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n\n const err: any = {};\n if (this.config.maxLength && this._html) {\n const maxLength = this.config.maxLength;\n const length = this._html.length;\n if (length > maxLength) {\n err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;\n }\n }\n\n return Object.keys(err).length ? err : null;\n }\n\n public focus(options?: { cursorPosition?: 'start' | 'end' }) {\n options = options ? options : {};\n\n if (options.cursorPosition === 'end') {\n this.editor.selection.setAtEnd(this.editor.$el.get(0));\n } else {\n this.editor.selection.setAtStart(this.editor.$el.get(0));\n }\n\n this.editor.selection.restore();\n\n const elSelection = this.editor.selection.element();\n if (elSelection) {\n elSelection.scrollIntoView({ block: 'center' });\n }\n }\n\n public clear() {\n this.writeValue('');\n }\n\n public disable() {\n this.classDisabled = true;\n }\n\n public setHtml(html) {\n this.writeValue(html);\n }\n\n public writeValue(html: string): void {\n this._html = html || '';\n\n this._cdRef.markForCheck();\n // SP-T2298 timeout needed for the case, when froala was already initated and\n // second instance opened in dialog/drawer. In this case init step pass much faster, writeValue trigger\n // after init and froala ignore new html. At the same time froala was initied but editor not yet, and next\n // code doesn't work without timeout. We've got time range when too late for initiate value, and to early\n // for change event.\n setTimeout(() => {\n if (this.editor && this.editor.html) {\n try {\n this.editor.html.set(this._html);\n } catch (e) {\n }\n }\n });\n }\n\n public registerOnChange(fn: (data: any) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public ngOnDestroy() {\n this._initialize$.complete();\n this._destroy$.next();\n this._destroy$.complete();\n this.destroy();\n }\n\n public destroy() {\n if (this.editor) {\n this.editor.destroy();\n }\n this.initialized = false;\n this._cdRef.markForCheck();\n this.el.innerHTML = '';\n }\n\n private _createConfig(): FsHtmlEditorConfig {\n return merge({ froalaConfig: {} }, this._defaultConfig, this.config);\n }\n\n private _change(html): void {\n this._html = html;\n this.onChange(html);\n }\n\n private _initPlugins(config) {\n\n (config.plugins || []).forEach((plugin: Plugin) => {\n this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {\n plugin.editor = editor;\n plugin.initialize();\n return plugin;\n };\n\n (plugin.config.buttons || []).forEach((button: PluginButton) => {\n this._fr.FroalaEditor.DefineIcon(button.name, {\n NAME: button.name,\n PATH: button.svgPath,\n });\n\n this._fr.FroalaEditor.RegisterCommand(button.name, {\n icon: button.name,\n title: button.tooltip,\n undo: button.undo,\n focus: button.focus,\n showOnMobile: button.showOnMobile,\n refreshAfterCallback: button.refreshAfterCallback,\n callback: function () {\n if (button.click) {\n button.click(this);\n }\n },\n refresh: function (button) {\n if (button.refresh) {\n button.refresh(this, button);\n }\n }\n });\n });\n\n });\n }\n\n private _createOptions() {\n const config = this._createConfig();\n\n return merge(\n // For some reason editor store somewhere pointer on default config object and dublicate options each time on init\n // Extra merge level fixed this problem and allow to init config properly without legacy data\n {},\n {\n key: config.activationKey,\n placeholderText: config.placeholder,\n linkAlwaysBlank: true,\n tabSpaces: 2,\n typingTimer: 250,\n tooltips: false,\n wordPasteModal: false,\n imageDefaultWidth: 0,\n imageDefaultAlign: 'left',\n quickInsertEnabled: false,\n paragraphDefaultSelection: 'Format',\n videoUpload: false,\n paragraphFormat: {\n N: 'Normal',\n H1: 'Heading 1',\n H2: 'Heading 2',\n H3: 'Heading 3',\n H4: 'Heading 4',\n BLOCKQUOTE: 'Quote',\n },\n paragraphFormatSelection: true,\n toolbarButtonsXS: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 1,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 2,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 0,\n },\n },\n toolbarButtons: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 3,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 5,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 3,\n },\n },\n },\n config.froalaConfig,\n );\n }\n\n private _listenLazyInit() {\n this.froalaReady$\n .pipe(\n filter((ready) => ready),\n switchMap(() => this._initialize$)\n )\n .subscribe(() => {\n const selection: any = window.getSelection();\n const options: any = {};\n if (selection.baseNode) {\n options.selection = {\n node: selection.baseNode.nodeValue,\n offset: selection.baseOffset,\n };\n }\n this.initialize(options);\n });\n }\n}\n","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ChangeDetectionStrategy, Component, Input, ChangeDetectorRef } from '@angular/core';\n\n\n@Component({\n selector: 'fs-html-renderer',\n templateUrl: 'html-renderer.component.html',\n styleUrls: ['html-renderer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlRendererComponent {\n\n @Input('html') public set setHtml(html) {\n this.trustedHtml = this.sanitized.bypassSecurityTrustHtml(html);\n this._cdRef.markForCheck();\n }\n\n public trustedHtml: SafeHtml;\n\n public constructor(\n private sanitized: DomSanitizer,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsSkeletonModule } from '@firestitch/skeleton';\n\nimport { FsHtmlEditorComponent } from './components/html-editor/html-editor.component';\nimport { FsHtmlRendererComponent } from './components/html-renderer/html-renderer.component';\nimport { FsHtmlEditorConfig } from './interfaces/html-editor-config';\nimport { FS_HTML_EDITOR_CONFIG, FS_HTML_EDITOR_DEFAULT_CONFIG } from './injects/config.inject';\nimport { DefaultPlugin } from './enums/default-plugin.enum';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FsSkeletonModule,\n ],\n exports: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n declarations: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n})\nexport class FsHtmlEditorModule {\n static forRoot(config: FsHtmlEditorConfig = {}): ModuleWithProviders<FsHtmlEditorModule> {\n return {\n ngModule: FsHtmlEditorModule,\n providers: [\n { provide: FS_HTML_EDITOR_DEFAULT_CONFIG, useValue: config },\n {\n provide: FS_HTML_EDITOR_CONFIG,\n useFactory: FsHtmlEditorConfigFactory,\n deps: [FS_HTML_EDITOR_DEFAULT_CONFIG]\n }\n ]\n };\n }\n}\n\nexport function FsHtmlEditorConfigFactory(config: FsHtmlEditorConfig) {\n return {\n defaultPlugins: [\n DefaultPlugin.Align,\n DefaultPlugin.Colors,\n DefaultPlugin.Image,\n DefaultPlugin.Link,\n DefaultPlugin.Lists,\n DefaultPlugin.ParagraphFormat,\n DefaultPlugin.Quote,\n DefaultPlugin.Table,\n DefaultPlugin.Url,\n DefaultPlugin.Video,\n DefaultPlugin.Draggable,\n ],\n ...config\n };\n}\n","// import { FroalaEditor } from 'froala-editor';\nimport { PluginConfig } from './../interfaces/plugin-config';\n\nexport class Plugin {\n\n public config: PluginConfig;\n public editor: any;\n\n public initialize() {}\n public destroy() {}\n\n}\n","import { debounce } from 'lodash-es';\nimport Tribute, { TributeItem } from 'tributejs';\n\nimport { MentionPluginConfig } from './configs/mention-plugin.config';\n\nimport { Plugin } from '../classes/plugin';\n\n\nexport class MentionPlugin extends Plugin {\n\n private static _tributes = [];\n private _tribute;\n\n public constructor(public config: MentionPluginConfig) {\n super();\n this.config = {\n ...config,\n buttons: [\n {\n name: config.name,\n tooltip: config.tooltip,\n svgPath: config.iconPath,\n click: (editor) => {\n this._closeAll();\n this._tribute.showMenuForCollection(editor.el);\n }\n }\n ]\n };\n\n this._tribute = new Tribute({\n values: debounce(this._loadValues.bind(this), 200),\n searchOpts: {\n pre: '',\n post: '',\n skip: true\n },\n containerClass: `fs-html-editor-mention-container ${this.config.containerClass || ''}`,\n itemClass: `fs-html-editor-mention-menu-item ${this.config.menuItemClass || ''}`,\n trigger: this.config.trigger,\n allowSpaces: true,\n menuItemTemplate: (item: TributeItem<any>) => {\n return this.config.menuItemTemplate(item.original);\n },\n selectTemplate: (item: TributeItem<any>) => {\n const template = this.config.selectedTemplate(item.original);\n\n let p = document.createElement('p');\n p.innerHTML = template;\n\n let node = p.firstElementChild;\n if (!node) {\n node = document.createElement('span');\n node.innerHTML = template;\n }\n\n node.setAttribute('contenteditable', 'false');\n node.classList.add('fr-deletable');\n\n return node.outerHTML;\n },\n });\n\n MentionPlugin._tributes.push(this._tribute);\n }\n\n public initialize() {\n this._tribute.attach(this.editor.el);\n this.editor.events.on('keydown', (e) => {\n if (e.key === 'Enter' && this._tribute.isActive) {\n return false;\n }\n }, true);\n }\n\n public destroy() {}\n\n private _closeAll() {\n MentionPlugin._tributes.forEach((tribute) => {\n if (tribute.menu) {\n tribute.hideMenu();\n }\n });\n }\n\n private _loadValues(keyword, cb) {\n return this.config.fetch(keyword)\n .subscribe((data) => {\n cb(data);\n });\n }\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class ChecklistPlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'checklist' }) {\n super();\n this.config = {\n ...config,\n name: 'checklist',\n buttons: [\n {\n name: 'checklist',\n svgPath: 'M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z',\n click: (editor) => {\n editor.html.insert('<ul class=\"checklist\"><li></li></ul>');\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('click', (e) => {\n const li = e.target;\n if (li.nodeName === 'LI' && e.offsetX < 0) {\n\n const items = [li, ...li.querySelectorAll('li')];\n\n if (li.classList.contains('checked')) {\n items.forEach((item) => {\n item.classList.remove('checked');\n });\n } else {\n items.forEach((item) => {\n item.classList.add('checked');\n });\n }\n }\n\n }, false);\n }\n\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class CodePlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'code' }) {\n super();\n this.config = {\n ...config,\n name: 'code',\n buttons: [\n {\n name: 'code',\n svgPath: 'M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z',\n click: (editor) => {\n const node = editor.selection.get();\n const codeEl = this._getCodeEl(node.baseNode);\n if (codeEl) {\n codeEl.classList.remove('code');\n } else {\n editor.html.insert('<p class=\"code\">' + editor.selection.get().toString().replace(/\\n{1,}/g,'<br>') + '</p>');\n }\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('keydown', (e) => {\n if (e.keyCode === 13) {\n const selection = this.editor.selection.get();\n\n if (selection && this._getCodeEl(selection.baseNode)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n let br = '<br>';\n const base = selection.baseNode;\n if (base.nodeName === '#text' && selection.baseOffset === base.length) {\n\n if (!(base.nextSibling && base.nextSibling.nodeName === 'BR')) {\n br += '<br>';\n }\n } else {\n const el: any = Array.from(base.childNodes).splice(selection.baseOffset - 1, 1).pop();\n if (el && el.nodeName !== 'BR') {\n br += '<br>';\n }\n }\n\n this.editor.html.insert(br);\n return false;\n }\n }\n }, true);\n }\n\n public destroy() {}\n\n private _getCodeEl(el) {\n\n if (el) {\n if (el.classList && el.classList.contains('code')) {\n return el;\n }\n\n if (el.parentElement) {\n return this._getCodeEl(el.parentElement);\n }\n }\n\n return null;\n }\n}\n","import { ScreenRecordPluginConfig } from './configs/screen-record-plugin.config';\nimport { Plugin } from '../classes/plugin';\nimport { ResourceLoader } from '../utils/loader';\n\n\ndeclare var MediaRecorder: any;\n\nexport class ScreenRecordPlugin extends Plugin {\n\n private _activeEl;\n\n public constructor(public config: ScreenRecordPluginConfig = {}) {\n super();\n\n this.config = {\n ...config,\n name: config.name || 'screenRecord',\n buttons: [\n {\n name: 'screenRecord',\n svgPath: `M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z`,\n tooltip: 'Screen Record',\n click: (editor) => {\n\n (<any>navigator).mediaDevices.getDisplayMedia({ video: true })\n .then((stream) => {\n const chunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n let mediaRecorder = new MediaRecorder(stream, options);\n\n stream.addEventListener('inactive', (e) => {\n mediaRecorder.stop();\n mediaRecorder = null;\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n\n const blob = new Blob(chunks, { type: 'video/webm' });\n config.upload(blob)\n .subscribe((url) => {\n editor.html.insert(`<span class=\"fr-screen-record fr-deletable fr-draggable\"><video controls style=\"max-width:${config.maxWidth}\"><source src=\"${url}\" type=\"video/webm\"></video></span>`);\n });\n });\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n if (event.data && event.data.size > 0) {\n chunks.push(event.data);\n }\n });\n\n mediaRecorder.start(10);\n })\n .catch((e) => { });\n }\n }\n ]\n };\n }\n\n public async initialize() {\n await ResourceLoader.loadStyles('froala')\n .toPromise();\n\n const FroalaEditor = (window as any).FroalaEditor;\n\n this.editor.events.on('mouseup', (e) => {\n const el = this._getEl(e.target);\n\n if (el) {\n this.editor.popups.hideAll();\n this._activeEl = el;\n this._showPopup(el);\n }\n });\n\n FroalaEditor.POPUP_TEMPLATES[\"screenRecordPlugin.popup\"] = '[_BUTTONS_]';\n\n FroalaEditor.DefineIcon('popupClose', { NAME: 'trash', SVG_KEY: 'remove' });\n FroalaEditor.RegisterCommand('popupClose', {\n title: 'Remove',\n undo: false,\n focus: false,\n callback: () => {\n if (this._activeEl) {\n this._activeEl.remove();\n }\n }\n });\n }\n\n private _createPopup() {\n\n const template = {\n buttons: `<div class=\"fr-buttons\">${this.editor.button.buildList(['popupClose'])}</div>`,\n };\n\n return this.editor.popups.create('screenRecordPlugin.popup', template);\n }\n\n private _showPopup (el) {\n var $popup = this.editor.popups.get('screenRecordPlugin.popup');\n\n if (!$popup) {\n $popup = this._createPopup();\n }\n\n this.editor.popups.setContainer('screenRecordPlugin.popup', this.editor.$(el));\n\n const left = el.offsetLeft + el.offsetWidth / 2;\n\n this.editor.popups.show('screenRecordPlugin.popup', left, null);\n }\n\n private _getEl(el) {\n if (el && el.classList) {\n if (el.classList.contains('fr-screen-record'))\n return el;\n\n return this._getEl(el.parentNode);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","ng://@firestitch/html-editor/app/consts/rich-buttons.const.ts","ng://@firestitch/html-editor/app/consts/text-buttons.const.ts","ng://@firestitch/html-editor/app/consts/paragraph-buttons.const.ts","ng://@firestitch/html-editor/app/injects/config.inject.ts","ng://@firestitch/html-editor/app/utils/loader.ts","ng://@firestitch/html-editor/app/services/froala-loader.service.ts","ng://@firestitch/html-editor/app/components/html-editor/html-editor.component.ts","ng://@firestitch/html-editor/app/components/html-renderer/html-renderer.component.ts","ng://@firestitch/html-editor/app/fs-html-editor.module.ts","ng://@firestitch/html-editor/app/classes/plugin.ts","ng://@firestitch/html-editor/app/plugins/mention.plugin.ts","ng://@firestitch/html-editor/app/plugins/checklist.plugin.ts","ng://@firestitch/html-editor/app/plugins/code.plugin.ts","ng://@firestitch/html-editor/app/plugins/screen-record.plugin.ts"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__extends","__","this","constructor","prototype","create","__assign","assign","t","s","i","n","arguments","length","call","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","__read","o","m","ar","error","RichButtons","TextButtons","ParagraphButtons","FS_HTML_EDITOR_DEFAULT_CONFIG","InjectionToken","FS_HTML_EDITOR_CONFIG","resourceBase","stylesBase","head","files","resourcePaths","stylesPaths","ResourceLoader","document","getElementsByTagName","Map","froala","align","colors","image","link","lists","paragraph_format","table","url","video","quote","draggable","setResourceBase","path","setStylesBase","loadResource","resourceName","scriptPath","has","obs$","Observable","obs","script","createElement","src","appendChild","onload","complete","onerror","err","pipe","shareReplay","set","get","loadStyles","stylePath","style","id","rel","href","FsFroalaLoaderService","_defaultConfig","_froalaLoaded","BehaviorSubject","_defaultPluginsLoaded","_ready$","combineLatest","map","_a","_b","FroalaReady","assetsJSPath","assetsCSSPath","_load","getValue","_FroalaEditor","_this","tap","window","FroalaEditor","_froalaDone","concatMap","_loadPlugins","_defaultPluginsDone","subscribe","imports","defaultPlugins","reduce","acc","pluginName","import$","Optional","type","Inject","args","Injectable","providedIn","FsHtmlEditorComponent","_cdRef","_fr","classFocused","classDisabled","config","initialized","_initialize$","ReplaySubject","_destroy$","Subject","onChange","data","onTouched","elRef","nativeElement","_html","_editor","ready$","ngOnInit","autofocus","disabled","initOnClick","_listenLazyInit","ngAfterViewInit","hasContent","el","querySelector","innerHTML","innerText","initialize","options","_createConfig","_initPlugins","_createOptions","markForCheck","disable","froalaConfig","events","on","editorHTML","html","_change","div","querySelectorAll","forEach","attributes","name_1","name","removeAttribute","upload","fetch","getAttribute","res","blob","_processImageUpload","setAttribute","blobs","editor","insert","remove","selection","node","from","find","textContent","range","createRange","sel","getSelection","setStart","_getTextNode","offset","collapse","removeAllRanges","addRange","focus","takeUntil","nodeType","Node","TEXT_NODE","childNodes","uninitializedClick","event","defaultPrevented","target_1","nodeName","targetTarget_1","setTimeout","initClick","updateSize","dispatchEvent","Event","validate","control","maxLength","length_1","maxLengthError","keys","cursorPosition","setAtEnd","$el","setAtStart","restore","elSelection","element","scrollIntoView","block","clear","writeValue","setHtml","registerOnChange","fn","registerOnTouched","ngOnDestroy","destroy","merge","plugins","plugin","PLUGINS","buttons","button","DefineIcon","NAME","PATH","svgPath","RegisterCommand","icon","title","tooltip","undo","showOnMobile","refreshAfterCallback","callback","click","refresh","activationKey","placeholderText","placeholder","linkAlwaysBlank","tabSpaces","typingTimer","tooltips","wordPasteModal","imageDefaultWidth","imageDefaultAlign","quickInsertEnabled","paragraphDefaultSelection","videoUpload","paragraphFormat","N","H1","H2","H3","H4","BLOCKQUOTE","paragraphFormatSelection","toolbarButtonsXS","moreText","buttonsVisible","moreParagraph","moreRich","toolbarButtons","froalaReady$","filter","ready","switchMap","baseNode","nodeValue","baseOffset","ChangeDetectorRef","HostBinding","ViewChild","ElementRef","Input","FsHtmlEditorComponent_1","Component","selector","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","NG_VALIDATORS","changeDetection","ChangeDetectionStrategy","OnPush","FsHtmlRendererComponent","sanitized","trustedHtml","bypassSecurityTrustHtml","DomSanitizer","FsHtmlEditorModule","forRoot","ngModule","FsHtmlEditorModule_1","useValue","useFactory","FsHtmlEditorConfigFactory","deps","NgModule","CommonModule","FsSkeletonModule","exports","declarations","Plugin","MentionPlugin","_super","iconPath","_closeAll","_tribute","showMenuForCollection","Tribute","values","debounce","_loadValues","bind","searchOpts","pre","post","skip","containerClass","itemClass","menuItemClass","trigger","allowSpaces","menuItemTemplate","item","original","selectTemplate","selectedTemplate","firstElementChild","classList","add","outerHTML","_tributes","attach","isActive","tribute","menu","hideMenu","keyword","cb","ChecklistPlugin","li","offsetX","items","concat","__spread","contains","CodePlugin","codeEl","_getCodeEl","toString","replace","keyCode","preventDefault","stopPropagation","stopImmediatePropagation","br","base","nextSibling","splice","parentElement","ScreenRecordPlugin","navigator","mediaDevices","getDisplayMedia","stream","chunks","mediaRecorder","MediaRecorder","mimeType","addEventListener","stop","getTracks","track","Blob","maxWidth","size","start","catch","toPromise","_getEl","popups","hideAll","_activeEl","_showPopup","POPUP_TEMPLATES","SVG_KEY","_createPopup","buildList","$popup","setContainer","$","left","offsetLeft","offsetWidth","show","parentNode"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","export const RichButtons = [\n 'insertTable',\n 'insertImage',\n 'insertLink',\n 'insertVideo',\n];\n","export const TextButtons = [\n 'paragraphFormat',\n 'code',\n 'bold',\n 'italic',\n 'underline',\n 'strikeThrough',\n 'subscript',\n 'superscript',\n 'fontFamily',\n 'fontSize',\n 'textColor',\n 'backgroundColor',\n 'inlineClass',\n 'inlineStyle',\n 'clearFormatting',\n 'quote',\n];\n","export const ParagraphButtons = [\n 'align',\n 'formatOL',\n 'formatUL',\n 'checklist',\n 'indent',\n 'outdent',\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_HTML_EDITOR_DEFAULT_CONFIG = new InjectionToken<any[]>('fs-html-editor.default-config');\nexport const FS_HTML_EDITOR_CONFIG = new InjectionToken<any[]>('fs-html-editor.config');\n","import { Observable } from 'rxjs';\nimport { shareReplay } from 'rxjs/operators';\n\nfunction resourceLoaderFactory() {\n let resourceBase = '/assets/js/froala/';\n let stylesBase = '/assets/css/';\n\n const head = document.getElementsByTagName('head')[0];\n const files = new Map<string, Observable<unknown>>();\n\n const resourcePaths = {\n froala: 'froala_editor.min.js',\n align: 'plugins/align.min.js',\n colors: 'plugins/colors.min.js',\n image: 'plugins/image.min.js',\n link: 'plugins/link.min.js',\n lists: 'plugins/lists.min.js',\n paragraph_format: 'plugins/paragraph_format.min.js',\n table: 'plugins/table.min.js',\n url: 'plugins/url.min.js',\n video: 'plugins/video.min.js',\n quote: 'plugins/quote.min.js',\n draggable: 'plugins/draggable.min.js',\n }\n\n const stylesPaths = {\n froala: 'froala_editor.pkgd.min.css',\n }\n\n const loadResource = function (scriptPath: string): Observable<unknown> {\n if (!files.has(scriptPath)) {\n const obs$ = new Observable((obs) => {\n\n const script = document.createElement('script');\n script.src = scriptPath;\n\n head.appendChild(script);\n\n script.onload = () => {\n obs.next();\n obs.complete();\n };\n\n script.onerror = (err) => {\n obs.error(err);\n }\n })\n .pipe(\n shareReplay(1),\n );\n\n files.set(scriptPath, obs$);\n }\n\n return files.get(scriptPath);\n };\n\n const loadStyles = function (stylePath: string): Observable<unknown> {\n if (!files.has(stylePath)) {\n const obs$ = new Observable((obs) => {\n const style = document.createElement('link');\n style.id = stylePath;\n style.rel = 'stylesheet';\n style.href = `${stylePath}`;\n\n head.appendChild(style);\n\n style.onload = () => {\n obs.next();\n obs.complete();\n };\n\n style.onerror = (err) => {\n obs.error(err);\n }\n });\n\n files.set(stylePath, obs$);\n }\n\n return files.get(stylePath);\n };\n\n return {\n setResourceBase: (path: string) => {\n resourceBase = path;\n },\n setStylesBase: (path: string) => {\n stylesBase = path;\n },\n loadResource: (resourceName: string) => {\n const path = resourcePaths[resourceName] || resourceName;\n\n return loadResource(resourceBase + path);\n },\n loadStyles: (resourceName: string) => {\n const path = stylesPaths[resourceName] || resourceName;\n\n return loadStyles(stylesBase + path);\n }\n }\n}\n\n\nexport const ResourceLoader = resourceLoaderFactory();\n","import { Inject, Injectable, Optional } from '@angular/core';\n\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { concatMap, map, shareReplay, tap } from 'rxjs/operators';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../injects/config.inject';\nimport { FsHtmlEditorConfig } from '../interfaces/html-editor-config';\n\nimport { ResourceLoader } from '../utils/loader';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsFroalaLoaderService {\n\n private _FroalaEditor: unknown;\n\n private _froalaLoaded = new BehaviorSubject(false);\n private _defaultPluginsLoaded = new BehaviorSubject(false);\n\n private _ready$ = combineLatest([this._froalaLoaded, this._defaultPluginsLoaded])\n .pipe(\n map(([FroalaReady, pluginsRead]) => {\n return pluginsRead && FroalaReady;\n }),\n shareReplay(1),\n );\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig: FsHtmlEditorConfig,\n ) {\n if (this._defaultConfig) {\n if (this._defaultConfig.assetsJSPath) {\n ResourceLoader.setResourceBase(this._defaultConfig.assetsJSPath)\n }\n\n if (this._defaultConfig.assetsCSSPath) {\n ResourceLoader.setStylesBase(this._defaultConfig.assetsCSSPath)\n }\n }\n\n this._load();\n }\n\n public get ready$(): Observable<boolean> {\n return this._ready$;\n }\n\n public get ready(): boolean {\n return this._froalaLoaded.getValue() && this._defaultPluginsLoaded.getValue();\n }\n\n public get FroalaEditor(): any {\n return this._FroalaEditor;\n }\n\n private _load() {\n combineLatest([\n ResourceLoader.loadResource('froala'),\n ResourceLoader.loadStyles('froala')\n ])\n .pipe(\n tap(() => {\n this._FroalaEditor = (window as any).FroalaEditor;\n this._froalaDone();\n }),\n concatMap(() => {\n return this._loadPlugins();\n }),\n tap(() => {\n this._defaultPluginsDone();\n }),\n )\n .subscribe();\n }\n\n private _loadPlugins(): Observable<unknown> {\n const imports = this._defaultConfig\n .defaultPlugins\n .reduce((acc, pluginName) => {\n const import$ = ResourceLoader.loadResource(pluginName);\n\n acc.push(import$);\n\n return acc;\n }, []);\n\n return combineLatest(imports);\n }\n\n private _froalaDone() {\n this._froalaLoaded.next(true);\n }\n\n private _defaultPluginsDone() {\n this._defaultPluginsLoaded.next(true);\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\n\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\nimport { filter, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { merge } from 'lodash-es';\n\nimport { PluginButton } from './../../interfaces/plugin-button';\nimport { FsHtmlEditorConfig } from '../../interfaces/html-editor-config';\nimport { RichButtons } from './../../consts/rich-buttons.const';\nimport { TextButtons } from './../../consts/text-buttons.const';\nimport { ParagraphButtons } from './../../consts/paragraph-buttons.const';\n\nimport { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';\nimport { Plugin } from './../../classes/plugin';\n\nimport { FsFroalaLoaderService } from '../../services/froala-loader.service';\n\n\n@Component({\n selector: 'fs-html-editor',\n templateUrl: 'html-editor.component.html',\n styleUrls: ['html-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => FsHtmlEditorComponent),\n multi: true\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {\n\n @HostBinding('class.focused') classFocused = false;\n @HostBinding('class.disabled') classDisabled = false;\n\n @ViewChild('elRef') public elRef: ElementRef;\n\n @Input() public config: FsHtmlEditorConfig = {};\n\n public initialized = false;\n\n private _editor: any;\n private _html: string;\n private _initialize$ = new ReplaySubject();\n private _destroy$ = new Subject();\n\n constructor(\n @Optional() @Inject(FS_HTML_EDITOR_CONFIG) private _defaultConfig,\n private _cdRef: ChangeDetectorRef,\n private _fr: FsFroalaLoaderService,\n ) { }\n\n public onChange = (data: any) => {}\n public onTouched = () => {}\n\n public get el(): any {\n return this.elRef.nativeElement;\n }\n\n public get html(): string {\n return this._html;\n }\n\n public get editor(): any {\n return this._editor;\n }\n\n public get froalaReady$(): Observable<boolean> {\n return this._fr.ready$;\n }\n\n public ngOnInit(): void {\n this.config = this.config || {};\n this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;\n this.initialized = !this.config.initOnClick;\n this._listenLazyInit();\n }\n\n public ngAfterViewInit() {\n if (!this.config.initOnClick || !this.hasContent()) {\n this.initialized = true;\n this._initialize$.next();\n }\n }\n\n public hasContent() {\n const el = document.createElement('div');\n\n if (el.querySelector('img')) {\n return true;\n }\n\n el.innerHTML = this._html;\n return !!el.innerText.length;\n }\n\n public initialize(options: any = {}) {\n const config = this._createConfig();\n\n this._initPlugins(config);\n this.el.innerHTML = this._html;\n\n this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {\n this._cdRef.markForCheck();\n if (config.disabled) {\n this.disable();\n }\n\n if (config.froalaConfig.events) {\n if (config.froalaConfig.events.initialized) {\n config.froalaConfig.events.initialized();\n }\n }\n\n this._editor.events.on('focus', () => {\n this.classFocused = true;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('blur', () => {\n this.classFocused = false;\n this._cdRef.markForCheck();\n });\n\n this._editor.events.on('contentChanged', () => {\n const editorHTML = this._editor.html.get();\n\n if (this.html !== editorHTML) {\n this._change(editorHTML);\n }\n });\n\n this._editor.events.on('paste.afterCleanup', (html) => {\n var div = document.createElement('div');\n div.innerHTML = html;\n div.querySelectorAll('*')\n .forEach((el) => {\n for (var i = 0; i < el.attributes.length; i++) {\n const name = el.attributes[0].name;\n if (name !== 'href') {\n el.removeAttribute(name);\n }\n }\n });\n return div.innerHTML;\n });\n\n this._editor.events.on('keydown', () => {\n this.onTouched();\n });\n\n if (this.config.image && this.config.image.upload) {\n this._editor.events.on('image.beforePasteUpload', (image) => {\n\n fetch(image.getAttribute('src'))\n .then((res) => {\n res.blob()\n .then((blob) => {\n this._processImageUpload(blob)\n .subscribe((url) => {\n image.setAttribute('src', url);\n image.removeAttribute('data-fr-image-pasted');\n });\n });\n });\n\n return false;\n });\n\n this._editor.events.on('image.beforeUpload', (blobs) => {\n this._processImageUpload(blobs[0]).subscribe((url) => {\n this.editor.image.insert(url, null, null, this.editor.image.get());\n });\n return false;\n });\n }\n\n if (this.el.querySelector('.fr-second-toolbar')) {\n this.el.querySelector('.fr-second-toolbar').remove();\n }\n\n const selection = options.selection;\n\n if (selection) {\n const node: any = Array.from(this.el.querySelectorAll('.fr-element *')).find((node: any) => {\n return selection.node === node.textContent;\n });\n\n if (node) {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this._getTextNode(node), selection.offset);\n range.collapse(true)\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else if (this.config.autofocus) {\n this.focus();\n }\n } else if (this.config.autofocus) {\n this.focus();\n }\n\n });\n }\n\n private _processImageUpload(blob) {\n return this.config.image.upload(blob)\n .pipe(\n takeUntil(this._destroy$),\n );\n }\n\n private _getTextNode(node) {\n if (node) {\n if (node.nodeType === Node.TEXT_NODE) {\n return node;\n }\n if (node.childNodes) {\n return this._getTextNode(node.childNodes[0]);\n }\n }\n }\n\n public uninitializedClick(event: UIEvent): void {\n if (!event.defaultPrevented) {\n const target: any = event.target;\n if (target && target.nodeName === 'A' && target.getAttribute('href')) {\n const targetTarget = target.getAttribute('target');\n target.setAttribute('target', '_blank');\n setTimeout(() => {\n if (targetTarget) {\n target.setAttribute('target', targetTarget);\n } else {\n target.removeAttribute('target');\n }\n });\n } else {\n if (this.config.initClick) {\n this.config.initClick(event);\n }\n this._initialize$.next();\n this.initialized = true;\n }\n }\n }\n\n public updateSize() {\n // Hack: To trigger the toolbar button size modes\n window.dispatchEvent(new Event('resize'));\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n\n const err: any = {};\n if (this.config.maxLength && this._html) {\n const maxLength = this.config.maxLength;\n const length = this._html.length;\n if (length > maxLength) {\n err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;\n }\n }\n\n return Object.keys(err).length ? err : null;\n }\n\n public focus(options?: { cursorPosition?: 'start' | 'end' }) {\n options = options ? options : {};\n\n if (options.cursorPosition === 'end') {\n this.editor.selection.setAtEnd(this.editor.$el.get(0));\n } else {\n this.editor.selection.setAtStart(this.editor.$el.get(0));\n }\n\n this.editor.selection.restore();\n\n const elSelection = this.editor.selection.element();\n if (elSelection) {\n elSelection.scrollIntoView({ block: 'center' });\n }\n }\n\n public clear() {\n this.writeValue('');\n }\n\n public disable() {\n this.classDisabled = true;\n }\n\n public setHtml(html) {\n this.writeValue(html);\n }\n\n public writeValue(html: string): void {\n this._html = html || '';\n\n this._cdRef.markForCheck();\n // SP-T2298 timeout needed for the case, when froala was already initated and\n // second instance opened in dialog/drawer. In this case init step pass much faster, writeValue trigger\n // after init and froala ignore new html. At the same time froala was initied but editor not yet, and next\n // code doesn't work without timeout. We've got time range when too late for initiate value, and to early\n // for change event.\n setTimeout(() => {\n if (this.editor && this.editor.html) {\n try {\n this.editor.html.set(this._html);\n } catch (e) {\n }\n }\n });\n }\n\n public registerOnChange(fn: (data: any) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public ngOnDestroy() {\n this._initialize$.complete();\n this._destroy$.next();\n this._destroy$.complete();\n this.destroy();\n }\n\n public destroy() {\n if (this.editor) {\n this.editor.destroy();\n }\n this.initialized = false;\n this._cdRef.markForCheck();\n this.el.innerHTML = '';\n }\n\n private _createConfig(): FsHtmlEditorConfig {\n return merge({ froalaConfig: {} }, this._defaultConfig, this.config);\n }\n\n private _change(html): void {\n this._html = html;\n this.onChange(html);\n }\n\n private _initPlugins(config) {\n\n (config.plugins || []).forEach((plugin: Plugin) => {\n this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {\n plugin.editor = editor;\n plugin.initialize();\n return plugin;\n };\n\n (plugin.config.buttons || []).forEach((button: PluginButton) => {\n this._fr.FroalaEditor.DefineIcon(button.name, {\n NAME: button.name,\n PATH: button.svgPath,\n });\n\n this._fr.FroalaEditor.RegisterCommand(button.name, {\n icon: button.name,\n title: button.tooltip,\n undo: button.undo,\n focus: button.focus,\n showOnMobile: button.showOnMobile,\n refreshAfterCallback: button.refreshAfterCallback,\n callback: function () {\n if (button.click) {\n button.click(this);\n }\n },\n refresh: function (button) {\n if (button.refresh) {\n button.refresh(this, button);\n }\n }\n });\n });\n\n });\n }\n\n private _createOptions() {\n const config = this._createConfig();\n\n return merge(\n // For some reason editor store somewhere pointer on default config object and dublicate options each time on init\n // Extra merge level fixed this problem and allow to init config properly without legacy data\n {},\n {\n key: config.activationKey,\n placeholderText: config.placeholder,\n linkAlwaysBlank: true,\n tabSpaces: 2,\n typingTimer: 250,\n tooltips: false,\n wordPasteModal: false,\n imageDefaultWidth: 0,\n imageDefaultAlign: 'left',\n quickInsertEnabled: false,\n paragraphDefaultSelection: 'Format',\n videoUpload: false,\n paragraphFormat: {\n N: 'Normal',\n H1: 'Heading 1',\n H2: 'Heading 2',\n H3: 'Heading 3',\n H4: 'Heading 4',\n BLOCKQUOTE: 'Quote',\n },\n paragraphFormatSelection: true,\n toolbarButtonsXS: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 1,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 2,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 0,\n },\n },\n toolbarButtons: {\n moreText: {\n buttons: TextButtons,\n buttonsVisible: 3,\n },\n moreParagraph: {\n buttons: ParagraphButtons,\n buttonsVisible: 5,\n },\n moreRich: {\n buttons: RichButtons,\n buttonsVisible: 3,\n },\n },\n },\n config.froalaConfig,\n );\n }\n\n private _listenLazyInit() {\n this.froalaReady$\n .pipe(\n filter((ready) => ready),\n switchMap(() => this._initialize$)\n )\n .subscribe(() => {\n const selection: any = window.getSelection();\n const options: any = {};\n if (selection.baseNode) {\n options.selection = {\n node: selection.baseNode.nodeValue,\n offset: selection.baseOffset,\n };\n }\n this.initialize(options);\n });\n }\n}\n","import { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ChangeDetectionStrategy, Component, Input, ChangeDetectorRef } from '@angular/core';\n\n\n@Component({\n selector: 'fs-html-renderer',\n templateUrl: 'html-renderer.component.html',\n styleUrls: ['html-renderer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsHtmlRendererComponent {\n\n @Input('html') public set setHtml(html) {\n this.trustedHtml = this.sanitized.bypassSecurityTrustHtml(html);\n this._cdRef.markForCheck();\n }\n\n public trustedHtml: SafeHtml;\n\n public constructor(\n private sanitized: DomSanitizer,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsSkeletonModule } from '@firestitch/skeleton';\n\nimport { FsHtmlEditorComponent } from './components/html-editor/html-editor.component';\nimport { FsHtmlRendererComponent } from './components/html-renderer/html-renderer.component';\nimport { FsHtmlEditorConfig } from './interfaces/html-editor-config';\nimport { FS_HTML_EDITOR_CONFIG, FS_HTML_EDITOR_DEFAULT_CONFIG } from './injects/config.inject';\nimport { DefaultPlugin } from './enums/default-plugin.enum';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FsSkeletonModule,\n ],\n exports: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n declarations: [\n FsHtmlEditorComponent,\n FsHtmlRendererComponent,\n ],\n})\nexport class FsHtmlEditorModule {\n static forRoot(config: FsHtmlEditorConfig = {}): ModuleWithProviders<FsHtmlEditorModule> {\n return {\n ngModule: FsHtmlEditorModule,\n providers: [\n { provide: FS_HTML_EDITOR_DEFAULT_CONFIG, useValue: config },\n {\n provide: FS_HTML_EDITOR_CONFIG,\n useFactory: FsHtmlEditorConfigFactory,\n deps: [FS_HTML_EDITOR_DEFAULT_CONFIG]\n }\n ]\n };\n }\n}\n\nexport function FsHtmlEditorConfigFactory(config: FsHtmlEditorConfig) {\n return {\n defaultPlugins: [\n DefaultPlugin.Align,\n DefaultPlugin.Colors,\n DefaultPlugin.Image,\n DefaultPlugin.Link,\n DefaultPlugin.Lists,\n DefaultPlugin.ParagraphFormat,\n DefaultPlugin.Quote,\n DefaultPlugin.Table,\n DefaultPlugin.Url,\n DefaultPlugin.Video,\n DefaultPlugin.Draggable,\n ],\n ...config\n };\n}\n","// import { FroalaEditor } from 'froala-editor';\nimport { PluginConfig } from './../interfaces/plugin-config';\n\nexport class Plugin {\n\n public config: PluginConfig;\n public editor: any;\n\n public initialize() {}\n public destroy() {}\n\n}\n","import { debounce } from 'lodash-es';\nimport Tribute, { TributeItem } from 'tributejs';\n\nimport { MentionPluginConfig } from './configs/mention-plugin.config';\n\nimport { Plugin } from '../classes/plugin';\n\n\nexport class MentionPlugin extends Plugin {\n\n private static _tributes = [];\n private _tribute;\n\n public constructor(public config: MentionPluginConfig) {\n super();\n this.config = {\n ...config,\n buttons: [\n {\n name: config.name,\n tooltip: config.tooltip,\n svgPath: config.iconPath,\n click: (editor) => {\n this._closeAll();\n this._tribute.showMenuForCollection(editor.el);\n }\n }\n ]\n };\n\n this._tribute = new Tribute({\n values: debounce(this._loadValues.bind(this), 200),\n searchOpts: {\n pre: '',\n post: '',\n skip: true\n },\n containerClass: `fs-html-editor-mention-container ${this.config.containerClass || ''}`,\n itemClass: `fs-html-editor-mention-menu-item ${this.config.menuItemClass || ''}`,\n trigger: this.config.trigger,\n allowSpaces: true,\n menuItemTemplate: (item: TributeItem<any>) => {\n return this.config.menuItemTemplate(item.original);\n },\n selectTemplate: (item: TributeItem<any>) => {\n const template = this.config.selectedTemplate(item.original);\n\n let p = document.createElement('p');\n p.innerHTML = template;\n\n let node = p.firstElementChild;\n if (!node) {\n node = document.createElement('span');\n node.innerHTML = template;\n }\n\n node.setAttribute('contenteditable', 'false');\n node.classList.add('fr-deletable');\n\n return node.outerHTML;\n },\n });\n\n MentionPlugin._tributes.push(this._tribute);\n }\n\n public initialize() {\n this._tribute.attach(this.editor.el);\n this.editor.events.on('keydown', (e) => {\n if (e.key === 'Enter' && this._tribute.isActive) {\n return false;\n }\n }, true);\n }\n\n public destroy() {}\n\n private _closeAll() {\n MentionPlugin._tributes.forEach((tribute) => {\n if (tribute.menu) {\n tribute.hideMenu();\n }\n });\n }\n\n private _loadValues(keyword, cb) {\n return this.config.fetch(keyword)\n .subscribe((data) => {\n cb(data);\n });\n }\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class ChecklistPlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'checklist' }) {\n super();\n this.config = {\n ...config,\n name: 'checklist',\n buttons: [\n {\n name: 'checklist',\n svgPath: 'M8.4,10.3l-1.2,1.2l4,4L20,6.7l-1.2-1.2l-7.6,7.6L8.4,10.3z M18.2,18.2H5.8V5.8h8.9V4H5.8C4.8,4,4,4.8,4,5.8v12.4c0,1,0.8,1.8,1.8,1.8h12.4c1,0,1.8-0.8,1.8-1.8v-7.1h-1.8V18.2z',\n click: (editor) => {\n editor.html.insert('<ul class=\"checklist\"><li></li></ul>');\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('click', (e) => {\n const li = e.target;\n if (li.nodeName === 'LI' && e.offsetX < 0) {\n\n const items = [li, ...li.querySelectorAll('li')];\n\n if (li.classList.contains('checked')) {\n items.forEach((item) => {\n item.classList.remove('checked');\n });\n } else {\n items.forEach((item) => {\n item.classList.add('checked');\n });\n }\n }\n\n }, false);\n }\n\n}\n","import { Plugin } from '../classes/plugin';\n\nimport { PluginConfig } from './../interfaces/plugin-config';\n\n\nexport class CodePlugin extends Plugin {\n\n public constructor(public config: PluginConfig = { name: 'code' }) {\n super();\n this.config = {\n ...config,\n name: 'code',\n buttons: [\n {\n name: 'code',\n svgPath: 'M8.9,7.3L4.2,12l4.7,4.7l1.1-1.1L6.4,12L10,8.4L8.9,7.3z M15.1,7.3L14,8.4l3.6,3.6L14,15.6l1.1,1.1l4.7-4.7L15.1,7.3z',\n click: (editor) => {\n const node = editor.selection.get();\n const codeEl = this._getCodeEl(node.baseNode);\n if (codeEl) {\n codeEl.classList.remove('code');\n } else {\n editor.html.insert('<p class=\"code\">' + editor.selection.get().toString().replace(/\\n{1,}/g,'<br>') + '</p>');\n }\n }\n }\n ]\n };\n }\n\n public initialize() {\n this.editor.events.on('keydown', (e) => {\n if (e.keyCode === 13) {\n const selection = this.editor.selection.get();\n\n if (selection && this._getCodeEl(selection.baseNode)) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n let br = '<br>';\n const base = selection.baseNode;\n if (base.nodeName === '#text' && selection.baseOffset === base.length) {\n\n if (!(base.nextSibling && base.nextSibling.nodeName === 'BR')) {\n br += '<br>';\n }\n } else {\n const el: any = Array.from(base.childNodes).splice(selection.baseOffset - 1, 1).pop();\n if (el && el.nodeName !== 'BR') {\n br += '<br>';\n }\n }\n\n this.editor.html.insert(br);\n return false;\n }\n }\n }, true);\n }\n\n public destroy() {}\n\n private _getCodeEl(el) {\n\n if (el) {\n if (el.classList && el.classList.contains('code')) {\n return el;\n }\n\n if (el.parentElement) {\n return this._getCodeEl(el.parentElement);\n }\n }\n\n return null;\n }\n}\n","import { ScreenRecordPluginConfig } from './configs/screen-record-plugin.config';\nimport { Plugin } from '../classes/plugin';\nimport { ResourceLoader } from '../utils/loader';\n\n\ndeclare var MediaRecorder: any;\n\nexport class ScreenRecordPlugin extends Plugin {\n\n private _activeEl;\n\n public constructor(public config: ScreenRecordPluginConfig = {}) {\n super();\n\n this.config = {\n ...config,\n name: config.name || 'screenRecord',\n buttons: [\n {\n name: 'screenRecord',\n svgPath: `M14.7,7.7v6.1H7.1V7.7H14.7 M16.3,9.6V6.9c0-0.4-0.3-0.8-0.8-0.8H6.4c-0.4,0-0.8,0.3-0.8,0.8v7.6c0,0.4,0.3,0.8,0.8,0.8h9.1c0.4,0,0.8-0.3,0.8-0.8v-2.7l1.7,1.7c0.3,0.3,0.8,0.3,1.1,0c0.1-0.1,0.2-0.3,0.2-0.5V8.4c0-0.4-0.3-0.8-0.8-0.8\n\tc-0.2,0-0.4,0.1-0.5,0.2L16.3,9.6z M21.5,1.6H2.9c-0.7,0-1.3,0.7-1.3,1.6v14.6c0,0.9,0.6,1.6,1.3,1.6h7.6v1.1l-5,1c-0.2,0-0.4,0.3-0.4,0.6c0,0.3,0.2,0.4,0.4,0.4c0,0,0,0,0.1,0l5.3-1h2.6l5.3,1c0,0,0,0,0.1,0c0.2,0,0.4-0.2,0.4-0.4\n c0-0.3-0.1-0.6-0.4-0.6l-5-1v-1.1h7.6c0.7,0,1.3-0.7,1.3-1.6V3.2C22.9,2.3,22.3,1.6,21.5,1.6z M21.1,17.3H3.3V3.7h17.8L21.1,17.3L21.1,17.3z`,\n tooltip: 'Screen Record',\n click: (editor) => {\n\n (<any>navigator).mediaDevices.getDisplayMedia({ video: true })\n .then((stream) => {\n const chunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n let mediaRecorder = new MediaRecorder(stream, options);\n\n stream.addEventListener('inactive', (e) => {\n mediaRecorder.stop();\n mediaRecorder = null;\n stream.getTracks().forEach((track) => track.stop());\n stream = null;\n\n const blob = new Blob(chunks, { type: 'video/webm' });\n config.upload(blob)\n .subscribe((url) => {\n editor.html.insert(`<span class=\"fr-screen-record fr-deletable fr-draggable\"><video controls style=\"max-width:${config.maxWidth}\"><source src=\"${url}\" type=\"video/webm\"></video></span>`);\n });\n });\n\n mediaRecorder.addEventListener('dataavailable', (event) => {\n if (event.data && event.data.size > 0) {\n chunks.push(event.data);\n }\n });\n\n mediaRecorder.start(10);\n })\n .catch((e) => { });\n }\n }\n ]\n };\n }\n\n public async initialize() {\n await ResourceLoader.loadStyles('froala')\n .toPromise();\n\n const FroalaEditor = (window as any).FroalaEditor;\n\n this.editor.events.on('mouseup', (e) => {\n const el = this._getEl(e.target);\n\n if (el) {\n this.editor.popups.hideAll();\n this._activeEl = el;\n this._showPopup(el);\n }\n });\n\n FroalaEditor.POPUP_TEMPLATES[\"screenRecordPlugin.popup\"] = '[_BUTTONS_]';\n\n FroalaEditor.DefineIcon('popupClose', { NAME: 'trash', SVG_KEY: 'remove' });\n FroalaEditor.RegisterCommand('popupClose', {\n title: 'Remove',\n undo: false,\n focus: false,\n callback: () => {\n if (this._activeEl) {\n this._activeEl.remove();\n }\n }\n });\n }\n\n private _createPopup() {\n\n const template = {\n buttons: `<div class=\"fr-buttons\">${this.editor.button.buildList(['popupClose'])}</div>`,\n };\n\n return this.editor.popups.create('screenRecordPlugin.popup', template);\n }\n\n private _showPopup (el) {\n var $popup = this.editor.popups.get('screenRecordPlugin.popup');\n\n if (!$popup) {\n $popup = this._createPopup();\n }\n\n this.editor.popups.setContainer('screenRecordPlugin.popup', this.editor.$(el));\n\n const left = el.offsetLeft + el.offsetWidth / 2;\n\n this.editor.popups.show('screenRecordPlugin.popup', left, null);\n }\n\n private _getEl(el) {\n if (el && el.classList) {\n if (el.classList.contains('fr-screen-record'))\n return el;\n\n return this._getEl(el.parentNode);\n }\n }\n}\n"]}
@@ -79,7 +79,10 @@ let FsHtmlEditorComponent = FsHtmlEditorComponent_1 = class FsHtmlEditorComponen
79
79
  this._cdRef.markForCheck();
80
80
  });
81
81
  this._editor.events.on('contentChanged', () => {
82
- this._change(this._editor.html.get());
82
+ const editorHTML = this._editor.html.get();
83
+ if (this.html !== editorHTML) {
84
+ this._change(editorHTML);
85
+ }
83
86
  });
84
87
  this._editor.events.on('paste.afterCleanup', (html) => {
85
88
  var div = document.createElement('div');
@@ -417,4 +420,4 @@ FsHtmlEditorComponent = FsHtmlEditorComponent_1 = __decorate([
417
420
  FsFroalaLoaderService])
418
421
  ], FsHtmlEditorComponent);
419
422
  export { FsHtmlEditorComponent };
420
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvaHRtbC1lZGl0b3IvIiwic291cmNlcyI6WyJhcHAvY29tcG9uZW50cy9odG1sLWVkaXRvci9odG1sLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBcUI3RSxJQUFhLHFCQUFxQiw2QkFBbEMsTUFBYSxxQkFBcUI7SUFnQmhDLFlBQ3FELGNBQWMsRUFDekQsTUFBeUIsRUFDekIsR0FBMEI7UUFGaUIsbUJBQWMsR0FBZCxjQUFjLENBQUE7UUFDekQsV0FBTSxH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Q29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgUGx1Z2luQnV0dG9uIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL3BsdWdpbi1idXR0b24nO1xuaW1wb3J0IHsgRnNIdG1sRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9odG1sLWVkaXRvci1jb25maWcnO1xuaW1wb3J0IHsgUmljaEJ1dHRvbnMgfSBmcm9tICcuLy4uLy4uL2NvbnN0cy9yaWNoLWJ1dHRvbnMuY29uc3QnO1xuaW1wb3J0IHsgVGV4dEJ1dHRvbnMgfSBmcm9tICcuLy4uLy4uL2NvbnN0cy90ZXh0LWJ1dHRvbnMuY29uc3QnO1xuaW1wb3J0IHsgUGFyYWdyYXBoQnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3BhcmFncmFwaC1idXR0b25zLmNvbnN0JztcblxuaW1wb3J0IHsgRlNfSFRNTF9FRElUT1JfQ09ORklHIH0gZnJvbSAnLi4vLi4vaW5qZWN0cy9jb25maWcuaW5qZWN0JztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJy4vLi4vLi4vY2xhc3Nlcy9wbHVnaW4nO1xuXG5pbXBvcnQgeyBGc0Zyb2FsYUxvYWRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcm9hbGEtbG9hZGVyLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWh0bWwtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICdodG1sLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydodG1sLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZzSHRtbEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZzSHRtbEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGc0h0bWxFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uRGVzdHJveSB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb2N1c2VkJykgY2xhc3NGb2N1c2VkID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQnKSBjbGFzc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZWxSZWYnKSBwdWJsaWMgZWxSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZzogRnNIdG1sRWRpdG9yQ29uZmlnID0ge307XG5cbiAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZWRpdG9yOiBhbnk7XG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZztcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChGU19IVE1MX0VESVRPUl9DT05GSUcpIHByaXZhdGUgX2RlZmF1bHRDb25maWcsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX2ZyOiBGc0Zyb2FsYUxvYWRlclNlcnZpY2UsXG4gICkgeyB9XG5cbiAgcHVibGljIG9uQ2hhbmdlID0gKGRhdGE6IGFueSkgPT4ge31cbiAgcHVibGljIG9uVG91Y2hlZCA9ICgpID0+IHt9XG5cbiAgcHVibGljIGdldCBlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnJvYWxhUmVhZHkkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9mci5yZWFkeSQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZy5hdXRvZm9jdXMgPSB0aGlzLmNvbmZpZy5hdXRvZm9jdXMgIT09IGZhbHNlICYmICF0aGlzLmNvbmZpZy5kaXNhYmxlZDtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gIXRoaXMuY29uZmlnLmluaXRPbkNsaWNrO1xuICAgIHRoaXMuX2xpc3RlbkxhenlJbml0KCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaW5pdE9uQ2xpY2sgfHwgIXRoaXMuaGFzQ29udGVudCgpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemUkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFzQ29udGVudCgpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaWYgKGVsLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBlbC5pbm5lckhUTUwgPSB0aGlzLl9odG1sO1xuICAgIHJldHVybiAhIWVsLmlubmVyVGV4dC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZShvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NyZWF0ZUNvbmZpZygpO1xuXG4gICAgdGhpcy5faW5pdFBsdWdpbnMoY29uZmlnKTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMuX2h0bWw7XG5cbiAgICB0aGlzLl9lZGl0b3IgPSBuZXcgdGhpcy5fZnIuRnJvYWxhRWRpdG9yKHRoaXMuZWwsIHRoaXMuX2NyZWF0ZU9wdGlvbnMoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9hbGFDb25maWcuZXZlbnRzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMuaW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdmb2N1cycsICgpID0+IHtcbiAgICAgICAgdGhpcy5jbGFzc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdibHVyJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdjb250ZW50Q2hhbmdlZCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hhbmdlKHRoaXMuX2VkaXRvci5odG1sLmdldCgpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdwYXN0ZS5hZnRlckNsZWFudXAnLCAoaHRtbCkgPT4ge1xuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBkaXYucXVlcnlTZWxlY3RvckFsbCgnKicpXG4gICAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsLmF0dHJpYnV0ZXNbMF0ubmFtZTtcbiAgICAgICAgICAgICAgaWYgKG5hbWUgIT09ICdocmVmJykge1xuICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdrZXlkb3duJywgKCkgPT4ge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5pbWFnZSAmJiB0aGlzLmNvbmZpZy5pbWFnZS51cGxvYWQpIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignaW1hZ2UuYmVmb3JlUGFzdGVVcGxvYWQnLCAoaW1hZ2UpID0+IHtcblxuICAgICAgICAgIGZldGNoKGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJykpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHJlcy5ibG9iKClcbiAgICAgICAgICAgICAgICAudGhlbigoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2IpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHVybCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZnItaW1hZ2UtcGFzdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2ltYWdlLmJlZm9yZVVwbG9hZCcsIChibG9icykgPT4ge1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJbWFnZVVwbG9hZChibG9ic1swXSkuc3Vic2NyaWJlKCh1cmwpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmltYWdlLmluc2VydCh1cmwsIG51bGwsIG51bGwsIHRoaXMuZWRpdG9yLmltYWdlLmdldCgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuZnItc2Vjb25kLXRvb2xiYXInKSkge1xuICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mci1zZWNvbmQtdG9vbGJhcicpLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBvcHRpb25zLnNlbGVjdGlvbjtcblxuICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCBub2RlOiBhbnkgPSBBcnJheS5mcm9tKHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmZyLWVsZW1lbnQgKicpKS5maW5kKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLm5vZGUgPT09IG5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRoaXMuX2dldFRleHROb2RlKG5vZGUpLCBzZWxlY3Rpb24ub2Zmc2V0KTtcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NJbWFnZVVwbG9hZChibG9iKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmltYWdlLnVwbG9hZChibG9iKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGV4dE5vZGUobm9kZSkge1xuICAgIGlmIChub2RlKSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUZXh0Tm9kZShub2RlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmluaXRpYWxpemVkQ2xpY2soZXZlbnQ6IFVJRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IHRhcmdldDogYW55ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGFyZ2V0ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRhcmdldFRhcmdldCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgdGFyZ2V0VGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbml0Q2xpY2spIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5pbml0Q2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUkLm5leHQoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNpemUoKSB7XG4gICAgLy8gSGFjazogVG8gdHJpZ2dlciB0aGUgdG9vbGJhciBidXR0b24gc2l6ZSBtb2Rlc1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVzaXplJykpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcblxuICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29uZmlnLm1heExlbmd0aCAmJiB0aGlzLl9odG1sKSB7XG4gICAgICBjb25zdCBtYXhMZW5ndGggPSB0aGlzLmNvbmZpZy5tYXhMZW5ndGg7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9odG1sLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgZXJyLm1heExlbmd0aEVycm9yID0gYE11c3QgYmUgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnMgb3IgZmV3ZXIuIFlvdSBlbnRlcmVkICR7bGVuZ3RofSBjaGFyYWN0ZXJzLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVycikubGVuZ3RoID8gZXJyIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogeyBjdXJzb3JQb3NpdGlvbj86ICdzdGFydCcgfCAnZW5kJyB9KSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cbiAgICBpZiAob3B0aW9ucy5jdXJzb3JQb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNlbGVjdGlvbi5zZXRBdEVuZCh0aGlzLmVkaXRvci4kZWwuZ2V0KDApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnNldEF0U3RhcnQodGhpcy5lZGl0b3IuJGVsLmdldCgwKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnJlc3RvcmUoKTtcblxuICAgIGNvbnN0IGVsU2VsZWN0aW9uID0gdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmVsZW1lbnQoKTtcbiAgICBpZiAoZWxTZWxlY3Rpb24pIHtcbiAgICAgIGVsU2VsZWN0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUoJycpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKSB7XG4gICAgdGhpcy5jbGFzc0Rpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIdG1sKGh0bWwpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUoaHRtbCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sID0gaHRtbCB8fCAnJztcblxuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIFNQLVQyMjk4IHRpbWVvdXQgbmVlZGVkIGZvciB0aGUgY2FzZSwgd2hlbiBmcm9hbGEgd2FzIGFscmVhZHkgaW5pdGF0ZWQgYW5kXG4gICAgLy8gc2Vjb25kIGluc3RhbmNlIG9wZW5lZCBpbiBkaWFsb2cvZHJhd2VyLiBJbiB0aGlzIGNhc2UgaW5pdCBzdGVwIHBhc3MgbXVjaCBmYXN0ZXIsIHdyaXRlVmFsdWUgdHJpZ2dlclxuICAgIC8vIGFmdGVyIGluaXQgYW5kIGZyb2FsYSBpZ25vcmUgbmV3IGh0bWwuIEF0IHRoZSBzYW1lIHRpbWUgZnJvYWxhIHdhcyBpbml0aWVkIGJ1dCBlZGl0b3Igbm90IHlldCwgYW5kIG5leHRcbiAgICAvLyBjb2RlIGRvZXNuJ3Qgd29yayB3aXRob3V0IHRpbWVvdXQuIFdlJ3ZlIGdvdCB0aW1lIHJhbmdlIHdoZW4gdG9vIGxhdGUgZm9yIGluaXRpYXRlIHZhbHVlLCBhbmQgdG8gZWFybHlcbiAgICAvLyBmb3IgY2hhbmdlIGV2ZW50LlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZWRpdG9yICYmIHRoaXMuZWRpdG9yLmh0bWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmVkaXRvci5odG1sLnNldCh0aGlzLl9odG1sKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZSQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUNvbmZpZygpOiBGc0h0bWxFZGl0b3JDb25maWcge1xuICAgIHJldHVybiBtZXJnZSh7IGZyb2FsYUNvbmZpZzoge30gfSwgdGhpcy5fZGVmYXVsdENvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlKGh0bWwpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICB0aGlzLm9uQ2hhbmdlKGh0bWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFBsdWdpbnMoY29uZmlnKSB7XG5cbiAgICAoY29uZmlnLnBsdWdpbnMgfHwgW10pLmZvckVhY2goKHBsdWdpbjogUGx1Z2luKSA9PiB7XG4gICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuUExVR0lOU1twbHVnaW4uY29uZmlnLm5hbWVdID0gZnVuY3Rpb24gKGVkaXRvcikge1xuICAgICAgICBwbHVnaW4uZWRpdG9yID0gZWRpdG9yO1xuICAgICAgICBwbHVnaW4uaW5pdGlhbGl6ZSgpO1xuICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgICAgfTtcblxuICAgICAgKHBsdWdpbi5jb25maWcuYnV0dG9ucyB8fCBbXSkuZm9yRWFjaCgoYnV0dG9uOiBQbHVnaW5CdXR0b24pID0+IHtcbiAgICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLkRlZmluZUljb24oYnV0dG9uLm5hbWUsIHtcbiAgICAgICAgICBOQU1FOiBidXR0b24ubmFtZSxcbiAgICAgICAgICBQQVRIOiBidXR0b24uc3ZnUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLlJlZ2lzdGVyQ29tbWFuZChidXR0b24ubmFtZSwge1xuICAgICAgICAgIGljb246IGJ1dHRvbi5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBidXR0b24udG9vbHRpcCxcbiAgICAgICAgICB1bmRvOiBidXR0b24udW5kbyxcbiAgICAgICAgICBmb2N1czogYnV0dG9uLmZvY3VzLFxuICAgICAgICAgIHNob3dPbk1vYmlsZTogYnV0dG9uLnNob3dPbk1vYmlsZSxcbiAgICAgICAgICByZWZyZXNoQWZ0ZXJDYWxsYmFjazogYnV0dG9uLnJlZnJlc2hBZnRlckNhbGxiYWNrLFxuICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLmNsaWNrKSB7XG4gICAgICAgICAgICAgIGJ1dHRvbi5jbGljayh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgICAgIGlmIChidXR0b24ucmVmcmVzaCkge1xuICAgICAgICAgICAgICBidXR0b24ucmVmcmVzaCh0aGlzLCBidXR0b24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlT3B0aW9ucygpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jcmVhdGVDb25maWcoKTtcblxuICAgIHJldHVybiBtZXJnZShcbiAgICAgIC8vIEZvciBzb21lIHJlYXNvbiBlZGl0b3Igc3RvcmUgc29tZXdoZXJlIHBvaW50ZXIgb24gZGVmYXVsdCBjb25maWcgb2JqZWN0IGFuZCBkdWJsaWNhdGUgb3B0aW9ucyBlYWNoIHRpbWUgb24gaW5pdFxuICAgICAgLy8gRXh0cmEgbWVyZ2UgbGV2ZWwgZml4ZWQgdGhpcyBwcm9ibGVtIGFuZCBhbGxvdyB0byBpbml0IGNvbmZpZyBwcm9wZXJseSB3aXRob3V0IGxlZ2FjeSBkYXRhXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBjb25maWcuYWN0aXZhdGlvbktleSxcbiAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiBjb25maWcucGxhY2Vob2xkZXIsXG4gICAgICAgIGxpbmtBbHdheXNCbGFuazogdHJ1ZSxcbiAgICAgICAgdGFiU3BhY2VzOiAyLFxuICAgICAgICB0eXBpbmdUaW1lcjogMjUwLFxuICAgICAgICB0b29sdGlwczogZmFsc2UsXG4gICAgICAgIHdvcmRQYXN0ZU1vZGFsOiBmYWxzZSxcbiAgICAgICAgaW1hZ2VEZWZhdWx0V2lkdGg6IDAsXG4gICAgICAgIGltYWdlRGVmYXVsdEFsaWduOiAnbGVmdCcsXG4gICAgICAgIHF1aWNrSW5zZXJ0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHBhcmFncmFwaERlZmF1bHRTZWxlY3Rpb246ICdGb3JtYXQnLFxuICAgICAgICB2aWRlb1VwbG9hZDogZmFsc2UsXG4gICAgICAgIHBhcmFncmFwaEZvcm1hdDoge1xuICAgICAgICAgIE46ICdOb3JtYWwnLFxuICAgICAgICAgIEgxOiAnSGVhZGluZyAxJyxcbiAgICAgICAgICBIMjogJ0hlYWRpbmcgMicsXG4gICAgICAgICAgSDM6ICdIZWFkaW5nIDMnLFxuICAgICAgICAgIEg0OiAnSGVhZGluZyA0JyxcbiAgICAgICAgICBCTE9DS1FVT1RFOiAnUXVvdGUnLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhZ3JhcGhGb3JtYXRTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIHRvb2xiYXJCdXR0b25zWFM6IHtcbiAgICAgICAgICBtb3JlVGV4dDoge1xuICAgICAgICAgICAgYnV0dG9uczogVGV4dEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVQYXJhZ3JhcGg6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFBhcmFncmFwaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVSaWNoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBSaWNoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRvb2xiYXJCdXR0b25zOiB7XG4gICAgICAgICAgbW9yZVRleHQ6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFRleHRCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUGFyYWdyYXBoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBQYXJhZ3JhcGhCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUmljaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUmljaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZy5mcm9hbGFDb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkxhenlJbml0KCkge1xuICAgIHRoaXMuZnJvYWxhUmVhZHkkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChyZWFkeSkgPT4gcmVhZHkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5faW5pdGlhbGl6ZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnkgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHt9O1xuICAgICAgICBpZiAoc2VsZWN0aW9uLmJhc2VOb2RlKSB7XG4gICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICBub2RlOiBzZWxlY3Rpb24uYmFzZU5vZGUubm9kZVZhbHVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBzZWxlY3Rpb24uYmFzZU9mZnNldCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZShvcHRpb25zKTtcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvaHRtbC1lZGl0b3IvIiwic291cmNlcyI6WyJhcHAvY29tcG9uZW50cy9odG1sLWVkaXRvci9odG1sLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBcUI3RSxJQUFhLHFCQUFxQiw2QkFBbEMsTUFBYSxxQkFBcUI7SUFnQmhDLFlBQ3FELGNBQWMsRUFDekQsTUFBeUIsRUFDekIsR0FBMEI7UUFGaUIsbUJBQWMsR0FBZCxjQUFjLENBQUE7UUFDekQsV0FBTSxH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Q0FBQyxDQUFBOzZDQUMxQixpQkFBaUI7UUFDcEIscUJBQXFCO0dBbkJ6QixxQkFBcUIsQ0FvYmpDO1NBcGJZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBQbHVnaW5CdXR0b24gfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvcGx1Z2luLWJ1dHRvbic7XG5pbXBvcnQgeyBGc0h0bWxFZGl0b3JDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2h0bWwtZWRpdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBSaWNoQnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3JpY2gtYnV0dG9ucy5jb25zdCc7XG5pbXBvcnQgeyBUZXh0QnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3RleHQtYnV0dG9ucy5jb25zdCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvcGFyYWdyYXBoLWJ1dHRvbnMuY29uc3QnO1xuXG5pbXBvcnQgeyBGU19IVE1MX0VESVRPUl9DT05GSUcgfSBmcm9tICcuLi8uLi9pbmplY3RzL2NvbmZpZy5pbmplY3QnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL3BsdWdpbic7XG5cbmltcG9ydCB7IEZzRnJvYWxhTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zyb2FsYS1sb2FkZXIuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtaHRtbC1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJ2h0bWwtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2h0bWwtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNIdG1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNIdG1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZzSHRtbEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvY3VzZWQnKSBjbGFzc0ZvY3VzZWQgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kaXNhYmxlZCcpIGNsYXNzRGlzYWJsZWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdlbFJlZicpIHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBGc0h0bWxFZGl0b3JDb25maWcgPSB7fTtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9lZGl0b3I6IGFueTtcbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nO1xuICBwcml2YXRlIF9pbml0aWFsaXplJCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZTX0hUTUxfRURJVE9SX0NPTkZJRykgcHJpdmF0ZSBfZGVmYXVsdENvbmZpZyxcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfZnI6IEZzRnJvYWxhTG9hZGVyU2VydmljZSxcbiAgKSB7IH1cblxuICBwdWJsaWMgb25DaGFuZ2UgPSAoZGF0YTogYW55KSA9PiB7fVxuICBwdWJsaWMgb25Ub3VjaGVkID0gKCkgPT4ge31cblxuICBwdWJsaWMgZ2V0IGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgcHVibGljIGdldCBlZGl0b3IoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmcm9hbGFSZWFkeSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyLnJlYWR5JDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIHRoaXMuY29uZmlnLmF1dG9mb2N1cyA9IHRoaXMuY29uZmlnLmF1dG9mb2N1cyAhPT0gZmFsc2UgJiYgIXRoaXMuY29uZmlnLmRpc2FibGVkO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSAhdGhpcy5jb25maWcuaW5pdE9uQ2xpY2s7XG4gICAgdGhpcy5fbGlzdGVuTGF6eUluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pbml0T25DbGljayB8fCAhdGhpcy5oYXNDb250ZW50KCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZSQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNDb250ZW50KCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBpZiAoZWwucXVlcnlTZWxlY3RvcignaW1nJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGVsLmlubmVySFRNTCA9IHRoaXMuX2h0bWw7XG4gICAgcmV0dXJuICEhZWwuaW5uZXJUZXh0Lmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplKG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5fY3JlYXRlQ29uZmlnKCk7XG5cbiAgICB0aGlzLl9pbml0UGx1Z2lucyhjb25maWcpO1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gdGhpcy5faHRtbDtcblxuICAgIHRoaXMuX2VkaXRvciA9IG5ldyB0aGlzLl9mci5Gcm9hbGFFZGl0b3IodGhpcy5lbCwgdGhpcy5fY3JlYXRlT3B0aW9ucygpLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIGlmIChjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuZnJvYWxhQ29uZmlnLmV2ZW50cykge1xuICAgICAgICBpZiAoY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBjb25maWcuZnJvYWxhQ29uZmlnLmV2ZW50cy5pbml0aWFsaXplZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsYXNzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2JsdXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xhc3NGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2NvbnRlbnRDaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3JIVE1MID0gdGhpcy5fZWRpdG9yLmh0bWwuZ2V0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaHRtbCAhPT0gZWRpdG9ySFRNTCkge1xuICAgICAgICAgIHRoaXMuX2NoYW5nZShlZGl0b3JIVE1MKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ3Bhc3RlLmFmdGVyQ2xlYW51cCcsIChodG1sKSA9PiB7XG4gICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCcqJylcbiAgICAgICAgICAuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWwuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZWwuYXR0cmlidXRlc1swXS5uYW1lO1xuICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2hyZWYnKSB7XG4gICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2tleWRvd24nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLmltYWdlICYmIHRoaXMuY29uZmlnLmltYWdlLnVwbG9hZCkge1xuICAgICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdpbWFnZS5iZWZvcmVQYXN0ZVVwbG9hZCcsIChpbWFnZSkgPT4ge1xuXG4gICAgICAgICAgZmV0Y2goaW1hZ2UuZ2V0QXR0cmlidXRlKCdzcmMnKSlcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgcmVzLmJsb2IoKVxuICAgICAgICAgICAgICAgIC50aGVuKChibG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW1hZ2VVcGxvYWQoYmxvYilcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgodXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLCB1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1mci1pbWFnZS1wYXN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignaW1hZ2UuYmVmb3JlVXBsb2FkJywgKGJsb2JzKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2JzWzBdKS5zdWJzY3JpYmUoKHVybCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaW1hZ2UuaW5zZXJ0KHVybCwgbnVsbCwgbnVsbCwgdGhpcy5lZGl0b3IuaW1hZ2UuZ2V0KCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mci1zZWNvbmQtdG9vbGJhcicpKSB7XG4gICAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZyLXNlY29uZC10b29sYmFyJykucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IG9wdGlvbnMuc2VsZWN0aW9uO1xuXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vZGU6IGFueSA9IEFycmF5LmZyb20odGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuZnItZWxlbWVudCAqJykpLmZpbmQoKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24ubm9kZSA9PT0gbm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGhpcy5fZ2V0VGV4dE5vZGUobm9kZSksIHNlbGVjdGlvbi5vZmZzZXQpO1xuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2IpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW1hZ2UudXBsb2FkKGJsb2IpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRleHROb2RlKG5vZGUuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVuaW5pdGlhbGl6ZWRDbGljayhldmVudDogVUlFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5ub2RlTmFtZSA9PT0gJ0EnICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgICBjb25zdCB0YXJnZXRUYXJnZXQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGFyZ2V0VGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCB0YXJnZXRUYXJnZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRDbGljaykge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmluaXRDbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSQubmV4dCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU2l6ZSgpIHtcbiAgICAvLyBIYWNrOiBUbyB0cmlnZ2VyIHRoZSB0b29sYmFyIGJ1dHRvbiBzaXplIG1vZGVzXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5jb25maWcubWF4TGVuZ3RoICYmIHRoaXMuX2h0bWwpIHtcbiAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMuY29uZmlnLm1heExlbmd0aDtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX2h0bWwubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke21heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGZvY3VzKG9wdGlvbnM/OiB7IGN1cnNvclBvc2l0aW9uPzogJ3N0YXJ0JyB8ICdlbmQnIH0pIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmN1cnNvclBvc2l0aW9uID09PSAnZW5kJykge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnNldEF0RW5kKHRoaXMuZWRpdG9yLiRlbC5nZXQoMCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24uc2V0QXRTdGFydCh0aGlzLmVkaXRvci4kZWwuZ2V0KDApKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24ucmVzdG9yZSgpO1xuXG4gICAgY29uc3QgZWxTZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb24uZWxlbWVudCgpO1xuICAgIGlmIChlbFNlbGVjdGlvbikge1xuICAgICAgZWxTZWxlY3Rpb24uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmNsYXNzRGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHNldEh0bWwoaHRtbCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZShodG1sKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2h0bWwgPSBodG1sIHx8ICcnO1xuXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgLy8gU1AtVDIyOTggdGltZW91dCBuZWVkZWQgZm9yIHRoZSBjYXNlLCB3aGVuIGZyb2FsYSB3YXMgYWxyZWFkeSBpbml0YXRlZCBhbmRcbiAgICAvLyBzZWNvbmQgaW5zdGFuY2Ugb3BlbmVkIGluIGRpYWxvZy9kcmF3ZXIuIEluIHRoaXMgY2FzZSBpbml0IHN0ZXAgcGFzcyBtdWNoIGZhc3Rlciwgd3JpdGVWYWx1ZSB0cmlnZ2VyXG4gICAgLy8gYWZ0ZXIgaW5pdCBhbmQgZnJvYWxhIGlnbm9yZSBuZXcgaHRtbC4gQXQgdGhlIHNhbWUgdGltZSBmcm9hbGEgd2FzIGluaXRpZWQgYnV0IGVkaXRvciBub3QgeWV0LCBhbmQgbmV4dFxuICAgIC8vIGNvZGUgZG9lc24ndCB3b3JrIHdpdGhvdXQgdGltZW91dC4gV2UndmUgZ290IHRpbWUgcmFuZ2Ugd2hlbiB0b28gbGF0ZSBmb3IgaW5pdGlhdGUgdmFsdWUsIGFuZCB0byBlYXJseVxuICAgIC8vIGZvciBjaGFuZ2UgZXZlbnQuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IuaHRtbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yLmh0bWwuc2V0KHRoaXMuX2h0bWwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ29uZmlnKCk6IEZzSHRtbEVkaXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIG1lcmdlKHsgZnJvYWxhQ29uZmlnOiB7fSB9LCB0aGlzLl9kZWZhdWx0Q29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9jaGFuZ2UoaHRtbCk6IHZvaWQge1xuICAgIHRoaXMuX2h0bWwgPSBodG1sO1xuICAgIHRoaXMub25DaGFuZ2UoaHRtbCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0UGx1Z2lucyhjb25maWcpIHtcblxuICAgIChjb25maWcucGx1Z2lucyB8fCBbXSkuZm9yRWFjaCgocGx1Z2luOiBQbHVnaW4pID0+IHtcbiAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5QTFVHSU5TW3BsdWdpbi5jb25maWcubmFtZV0gPSBmdW5jdGlvbiAoZWRpdG9yKSB7XG4gICAgICAgIHBsdWdpbi5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICAgIHBsdWdpbi5pbml0aWFsaXplKCk7XG4gICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICB9O1xuXG4gICAgICAocGx1Z2luLmNvbmZpZy5idXR0b25zIHx8IFtdKS5mb3JFYWNoKChidXR0b246IFBsdWdpbkJ1dHRvbikgPT4ge1xuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuRGVmaW5lSWNvbihidXR0b24ubmFtZSwge1xuICAgICAgICAgIE5BTUU6IGJ1dHRvbi5uYW1lLFxuICAgICAgICAgIFBBVEg6IGJ1dHRvbi5zdmdQYXRoLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuUmVnaXN0ZXJDb21tYW5kKGJ1dHRvbi5uYW1lLCB7XG4gICAgICAgICAgaWNvbjogYnV0dG9uLm5hbWUsXG4gICAgICAgICAgdGl0bGU6IGJ1dHRvbi50b29sdGlwLFxuICAgICAgICAgIHVuZG86IGJ1dHRvbi51bmRvLFxuICAgICAgICAgIGZvY3VzOiBidXR0b24uZm9jdXMsXG4gICAgICAgICAgc2hvd09uTW9iaWxlOiBidXR0b24uc2hvd09uTW9iaWxlLFxuICAgICAgICAgIHJlZnJlc2hBZnRlckNhbGxiYWNrOiBidXR0b24ucmVmcmVzaEFmdGVyQ2FsbGJhY2ssXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChidXR0b24uY2xpY2spIHtcbiAgICAgICAgICAgICAgYnV0dG9uLmNsaWNrKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5yZWZyZXNoKSB7XG4gICAgICAgICAgICAgIGJ1dHRvbi5yZWZyZXNoKHRoaXMsIGJ1dHRvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVPcHRpb25zKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NyZWF0ZUNvbmZpZygpO1xuXG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIGVkaXRvciBzdG9yZSBzb21ld2hlcmUgcG9pbnRlciBvbiBkZWZhdWx0IGNvbmZpZyBvYmplY3QgYW5kIGR1YmxpY2F0ZSBvcHRpb25zIGVhY2ggdGltZSBvbiBpbml0XG4gICAgICAvLyBFeHRyYSBtZXJnZSBsZXZlbCBmaXhlZCB0aGlzIHByb2JsZW0gYW5kIGFsbG93IHRvIGluaXQgY29uZmlnIHByb3Blcmx5IHdpdGhvdXQgbGVnYWN5IGRhdGFcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IGNvbmZpZy5hY3RpdmF0aW9uS2V5LFxuICAgICAgICBwbGFjZWhvbGRlclRleHQ6IGNvbmZpZy5wbGFjZWhvbGRlcixcbiAgICAgICAgbGlua0Fsd2F5c0JsYW5rOiB0cnVlLFxuICAgICAgICB0YWJTcGFjZXM6IDIsXG4gICAgICAgIHR5cGluZ1RpbWVyOiAyNTAsXG4gICAgICAgIHRvb2x0aXBzOiBmYWxzZSxcbiAgICAgICAgd29yZFBhc3RlTW9kYWw6IGZhbHNlLFxuICAgICAgICBpbWFnZURlZmF1bHRXaWR0aDogMCxcbiAgICAgICAgaW1hZ2VEZWZhdWx0QWxpZ246ICdsZWZ0JyxcbiAgICAgICAgcXVpY2tJbnNlcnRFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgcGFyYWdyYXBoRGVmYXVsdFNlbGVjdGlvbjogJ0Zvcm1hdCcsXG4gICAgICAgIHZpZGVvVXBsb2FkOiBmYWxzZSxcbiAgICAgICAgcGFyYWdyYXBoRm9ybWF0OiB7XG4gICAgICAgICAgTjogJ05vcm1hbCcsXG4gICAgICAgICAgSDE6ICdIZWFkaW5nIDEnLFxuICAgICAgICAgIEgyOiAnSGVhZGluZyAyJyxcbiAgICAgICAgICBIMzogJ0hlYWRpbmcgMycsXG4gICAgICAgICAgSDQ6ICdIZWFkaW5nIDQnLFxuICAgICAgICAgIEJMT0NLUVVPVEU6ICdRdW90ZScsXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFncmFwaEZvcm1hdFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgdG9vbGJhckJ1dHRvbnNYUzoge1xuICAgICAgICAgIG1vcmVUZXh0OiB7XG4gICAgICAgICAgICBidXR0b25zOiBUZXh0QnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVBhcmFncmFwaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUGFyYWdyYXBoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVJpY2g6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFJpY2hCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdG9vbGJhckJ1dHRvbnM6IHtcbiAgICAgICAgICBtb3JlVGV4dDoge1xuICAgICAgICAgICAgYnV0dG9uczogVGV4dEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVQYXJhZ3JhcGg6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFBhcmFncmFwaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogNSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVSaWNoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBSaWNoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmZyb2FsYUNvbmZpZyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuTGF6eUluaXQoKSB7XG4gICAgdGhpcy5mcm9hbGFSZWFkeSRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHJlYWR5KSA9PiByZWFkeSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9pbml0aWFsaXplJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb246IGFueSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgIGlmIChzZWxlY3Rpb24uYmFzZU5vZGUpIHtcbiAgICAgICAgICBvcHRpb25zLnNlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIG5vZGU6IHNlbGVjdGlvbi5iYXNlTm9kZS5ub2RlVmFsdWUsXG4gICAgICAgICAgICBvZmZzZXQ6IHNlbGVjdGlvbi5iYXNlT2Zmc2V0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplKG9wdGlvbnMpO1xuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==