UNPKG

@csvbox/angular

Version:
423 lines 43.9 kB
/** * @fileoverview added by tsickle * Generated from: lib/csvbox-button.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, Input, SecurityContext } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { insertCSS } from '../utlis/insertCSS'; /** @type {?} */ const appVersion = '1.1.16'; export class CSVBoxButtonComponent { /** * @param {?} sanitizer */ constructor(sanitizer) { this.sanitizer = sanitizer; this.isModalShown = false; this.uuid = null; this.customDomain = null; this.dataLocation = null; this.language = null; this.isIframeLoaded = false; this.openModalOnIframeLoad = false; this.lazy = false; this.iframe = null; this.disabled = true; } /** * @return {?} */ ngOnInit() { this.uuid = this.generateUuid(); /** @type {?} */ let domain = this.customDomain ? this.customDomain : "app.csvbox.io"; if (this.dataLocation) { domain = `${this.dataLocation}-${domain}`; } /** @type {?} */ let iframeUrl = `https://${domain}/embed/${this.licenseKey}`; iframeUrl += `?library-version=${appVersion}`; iframeUrl += "&framework=angular"; if (this.dataLocation) { iframeUrl += "&preventRedirect"; } if (this.language) { iframeUrl += "&language" + this.language; } if (this.environment) { /** @type {?} */ let environment = JSON.stringify(this.environment).replace(/['"]/g, (/** * @param {?} match * @return {?} */ function (match) { return '\\' + match; })); iframeUrl += `&env=${environment}`; } this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl)); } /** * @return {?} */ generateUuid() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes["user"] && changes['user'].currentValue != changes['user'].previousValue) { this.updateUserVariabe(changes['user'].currentValue); } } /** * @param {?} data * @return {?} */ updateUserVariabe(data) { this.user = data; if (this.iframe && this.iframe.contentWindow) { this.iframe.contentWindow.postMessage({ "customer": data }, "*"); } } /** * @return {?} */ ngAfterContentInit() { window.addEventListener("message", (/** * @param {?} event * @return {?} */ (event) => { if (event && typeof event.data == "object") { if (event.data && event.data.data && event.data.data.unique_token == this.uuid) { if (event.data.type && event.data.type == "data-on-submit") { /** @type {?} */ let metadata = event.data.data; metadata["column_mappings"] = event.data.column_mapping; delete metadata["unique_token"]; if (this.onSubmit) this.onSubmit(metadata); if (this.isSubmitted) this.isSubmitted(metadata); if (this.submitted) this.submitted(metadata); } else if (event.data.type && event.data.type == "data-push-status") { if (event.data.data.import_status == "success") { if (event.data.row_data) { /** @type {?} */ let primary_row_data = event.data.row_data; /** @type {?} */ let headers = event.data.headers; /** @type {?} */ let rows = []; /** @type {?} */ let dynamic_columns_indexes = event.data.dynamicColumnsIndexes; /** @type {?} */ let virtual_columns_indexes = event.data.virtualColumnsIndexes || []; primary_row_data.forEach((/** * @param {?} row_data * @return {?} */ (row_data) => { /** @type {?} */ let x = {}; /** @type {?} */ let dynamic_columns = {}; /** @type {?} */ let virtual_data = {}; row_data.data && row_data.data.forEach((/** * @param {?} col * @param {?} i * @return {?} */ (col, i) => { if (col == undefined) { col = ""; } ; if (dynamic_columns_indexes.includes(i)) { dynamic_columns[headers[i]] = col; } else if (virtual_columns_indexes.includes(i)) { virtual_data[headers[i]] = col; } else { x[headers[i]] = col; } })); if (row_data && row_data.unmapped_data) { x["_unmapped_data"] = row_data.unmapped_data; } if (dynamic_columns && Object.keys(dynamic_columns).length > 0) { x["_dynamic_data"] = dynamic_columns; } if (virtual_data && Object.keys(virtual_data).length > 0) { x["_virtual_data"] = virtual_data; } rows.push(x); })); /** @type {?} */ let metadata = event.data.data; metadata["rows"] = rows; metadata["column_mappings"] = event.data.column_mapping; metadata["raw_columns"] = event.data.raw_columns; metadata["ignored_columns"] = event.data.ignored_column_row; delete metadata["unique_token"]; if (this.onImport) this.onImport(true, metadata); if (this.isImported) this.isImported(true, metadata); if (this.imported) this.imported(true, metadata); } else { /** @type {?} */ let metadata = event.data.data; delete metadata["unique_token"]; if (this.onImport) this.onImport(true, metadata); if (this.isImported) this.isImported(true, metadata); if (this.imported) this.imported(true, metadata); } } else { /** @type {?} */ let metadata = event.data.data; delete metadata["unique_token"]; if (this.onImport) this.onImport(false, metadata); if (this.isImported) this.isImported(false, metadata); if (this.imported) this.imported(false, metadata); } } else if (event.data.type && event.data.type == "csvbox-modal-hidden") { if (this.holder) this.holder.style.display = 'none'; this.isModalShown = false; if (this.onClose) this.onClose(); if (this.isClosed) this.isClosed(); if (this.closed) this.closed(); } else if (event.data.type && event.data.type == "csvbox-upload-successful") { if (this.onImport) this.onImport(true); if (this.isImported) this.isImported(true); if (this.imported) this.imported(true); } else if (event.data.type && event.data.type == "csvbox-upload-failed") { if (this.onImport) this.onImport(false); if (this.isImported) this.isImported(false); if (this.imported) this.imported(false); } } } }), false); if (this.lazy) { this.disabled = false; } else { this.disabled = true; this.initImporter(); } } /** * @return {?} */ initImporter() { if (this.loadStarted) this.loadStarted(); insertCSS(); /** @type {?} */ let iframe = document.createElement("iframe"); this.iframe = iframe; iframe.setAttribute("src", this.safeUrl); iframe.frameBorder = "0"; /** @type {?} */ let self = this; iframe.onload = (/** * @return {?} */ function () { if (self.onReady) self.onReady(); if (self.isReady) self.isReady(); if (self.importerReady) self.importerReady(); self.disabled = false; self.isIframeLoaded = true; if (self.iframe && self.iframe.contentWindow) { self.iframe.contentWindow.postMessage({ "customer": self.user ? self.user : null, "columns": self.dynamicColumns ? self.dynamicColumns : null, "options": self.options ? self.options : null, "unique_token": self.uuid }, "*"); } if (self.openModalOnIframeLoad) { self.openModal(); } }); this.holder = document.createElement('div'); this.holder.classList.add('csvbox-holder'); this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`); this.holder.appendChild(iframe); document.body.insertAdjacentElement('beforeend', this.holder); } /** * @return {?} */ openModal() { if (this.lazy) { if (!this.iframe) { this.openModalOnIframeLoad = true; this.initImporter(); return; } } if (!this.isModalShown) { if (this.isIframeLoaded) { this.isModalShown = true; if (this.holder) this.holder.style.display = 'block'; if (this.iframe && this.iframe.contentWindow) { this.iframe.contentWindow.postMessage('openModal', '*'); } } else { this.openModalOnIframeLoad = true; } } } } CSVBoxButtonComponent.decorators = [ { type: Component, args: [{ selector: 'csvbox-button', template: ` <div> <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid"> <ng-content></ng-content> </button> </div> ` }] } ]; /** @nocollapse */ CSVBoxButtonComponent.ctorParameters = () => [ { type: DomSanitizer } ]; CSVBoxButtonComponent.propDecorators = { initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }], onImport: [{ type: Input }], onReady: [{ type: Input }], onClose: [{ type: Input }], onSubmit: [{ type: Input }], isImported: [{ type: Input }], isReady: [{ type: Input }], isClosed: [{ type: Input }], isSubmitted: [{ type: Input }], importerReady: [{ type: Input }], closed: [{ type: Input }], submitted: [{ type: Input }], imported: [{ type: Input }], loadStarted: [{ type: Input }], user: [{ type: Input }], dynamicColumns: [{ type: Input }], licenseKey: [{ type: Input }], options: [{ type: Input }], uuid: [{ type: Input }], customDomain: [{ type: Input }], dataLocation: [{ type: Input }], language: [{ type: Input }], environment: [{ type: Input }], isIframeLoaded: [{ type: Input }], openModalOnIframeLoad: [{ type: Input }], lazy: [{ type: Input }], disabled: [{ type: Input }] }; if (false) { /** @type {?} */ CSVBoxButtonComponent.prototype.isModalShown; /** @type {?} */ CSVBoxButtonComponent.prototype.initiator; /** @type {?} */ CSVBoxButtonComponent.prototype.onImport; /** @type {?} */ CSVBoxButtonComponent.prototype.onReady; /** @type {?} */ CSVBoxButtonComponent.prototype.onClose; /** @type {?} */ CSVBoxButtonComponent.prototype.onSubmit; /** @type {?} */ CSVBoxButtonComponent.prototype.isImported; /** @type {?} */ CSVBoxButtonComponent.prototype.isReady; /** @type {?} */ CSVBoxButtonComponent.prototype.isClosed; /** @type {?} */ CSVBoxButtonComponent.prototype.isSubmitted; /** @type {?} */ CSVBoxButtonComponent.prototype.importerReady; /** @type {?} */ CSVBoxButtonComponent.prototype.closed; /** @type {?} */ CSVBoxButtonComponent.prototype.submitted; /** @type {?} */ CSVBoxButtonComponent.prototype.imported; /** @type {?} */ CSVBoxButtonComponent.prototype.loadStarted; /** @type {?} */ CSVBoxButtonComponent.prototype.user; /** @type {?} */ CSVBoxButtonComponent.prototype.dynamicColumns; /** @type {?} */ CSVBoxButtonComponent.prototype.licenseKey; /** @type {?} */ CSVBoxButtonComponent.prototype.options; /** @type {?} */ CSVBoxButtonComponent.prototype.uuid; /** @type {?} */ CSVBoxButtonComponent.prototype.customDomain; /** @type {?} */ CSVBoxButtonComponent.prototype.dataLocation; /** @type {?} */ CSVBoxButtonComponent.prototype.language; /** @type {?} */ CSVBoxButtonComponent.prototype.environment; /** @type {?} */ CSVBoxButtonComponent.prototype.isIframeLoaded; /** @type {?} */ CSVBoxButtonComponent.prototype.openModalOnIframeLoad; /** @type {?} */ CSVBoxButtonComponent.prototype.lazy; /** @type {?} */ CSVBoxButtonComponent.prototype.safeUrl; /** @type {?} */ CSVBoxButtonComponent.prototype.iframe; /** @type {?} */ CSVBoxButtonComponent.prototype.disabled; /** @type {?} */ CSVBoxButtonComponent.prototype.holder; /** @type {?} */ CSVBoxButtonComponent.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY3N2Ym94L2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztNQUV6QyxVQUFVLEdBQUcsUUFBUTtBQWEzQixNQUFNLE9BQU8scUJBQXFCOzs7O0lBMENoQyxZQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBeEN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXVCWixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLGlCQUFZLEdBQVcsSUFBSSxDQUFDO1FBQzVCLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFHeEIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRXZDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFJL0IsV0FBTSxHQUFHLElBQUksQ0FBQztRQUVMLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7WUFDNUIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWU7UUFDcEUsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFB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OzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzt1QkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBRUwsS0FBSztvQ0FDTCxLQUFLO21CQUVMLEtBQUs7dUJBTUwsS0FBSzs7OztJQXRDTiw2Q0FBcUI7O0lBRXJCLDBDQUF3RDs7SUFDeEQseUNBQTRCOztJQUM1Qix3Q0FBMkI7O0lBQzNCLHdDQUEyQjs7SUFDM0IseUNBQTRCOztJQUU1QiwyQ0FBOEI7O0lBQzlCLHdDQUEyQjs7SUFDM0IseUNBQTRCOztJQUM1Qiw0Q0FBK0I7O0lBRS9CLDhDQUFpQzs7SUFDakMsdUNBQTBCOztJQUMxQiwwQ0FBNkI7O0lBQzdCLHlDQUE0Qjs7SUFDNUIsNENBQStCOztJQUUvQixxQ0FBc0I7O0lBQ3RCLCtDQUFnQzs7SUFDaEMsMkNBQTRCOztJQUM1Qix3Q0FBeUI7O0lBQ3pCLHFDQUE2Qjs7SUFDN0IsNkNBQXFDOztJQUNyQyw2Q0FBcUM7O0lBQ3JDLHlDQUFpQzs7SUFDakMsNENBQTZCOztJQUU3QiwrQ0FBeUM7O0lBQ3pDLHNEQUFnRDs7SUFFaEQscUNBQStCOztJQUUvQix3Q0FBYTs7SUFFYix1Q0FBYzs7SUFFZCx5Q0FBa0M7O0lBSWxDLHVDQUFZOztJQUZBLDBDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgU2VjdXJpdHlDb250ZXh0LFxyXG4gIEFmdGVyQ29udGVudEluaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBpbnNlcnRDU1MgfSBmcm9tICcuLi91dGxpcy9pbnNlcnRDU1MnO1xyXG5cclxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdj5cclxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAjaW5pdGlhdG9yIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgaXNNb2RhbFNob3duID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XHJcbiAgQElucHV0KCkgb25JbXBvcnQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uUmVhZHk6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uQ2xvc2U6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIG9uU3VibWl0OiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KCkgaXNJbXBvcnRlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgaXNSZWFkeTogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgaXNDbG9zZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkOiBGdW5jdGlvbjtcclxuXHJcbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeTogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgY2xvc2VkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBzdWJtaXR0ZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIGltcG9ydGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKSBsb2FkU3RhcnRlZDogRnVuY3Rpb247XHJcblxyXG4gIEBJbnB1dCgpIHVzZXI6IE9iamVjdDtcclxuICBASW5wdXQoKSBkeW5hbWljQ29sdW1uczogT2JqZWN0O1xyXG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IFN0cmluZztcclxuICBASW5wdXQoKSBvcHRpb25zOiBPYmplY3Q7XHJcbiAgQElucHV0KCkgdXVpZDogU3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBjdXN0b21Eb21haW46IFN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBTdHJpbmcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiBPYmplY3Q7XHJcblxyXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2FmZVVybDogYW55O1xyXG5cclxuICBpZnJhbWUgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6RG9tU2FuaXRpemVyKSB7fVxyXG5cclxuICBob2xkZXI6IGFueTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnV1aWQgPSB0aGlzLmdlbmVyYXRlVXVpZCgpO1xyXG4gICAgbGV0IGRvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluID8gdGhpcy5jdXN0b21Eb21haW4gOiBcImFwcC5jc3Zib3guaW9cIjtcclxuICAgIGlmKHRoaXMuZGF0YUxvY2F0aW9uKSB7IGRvbWFpbiA9IGAke3RoaXMuZGF0YUxvY2F0aW9ufS0ke2RvbWFpbn1gOyB9XHJcbiAgICBsZXQgaWZyYW1lVXJsID0gYGh0dHBzOi8vJHtkb21haW59L2VtYmVkLyR7dGhpcy5saWNlbnNlS2V5fWA7XHJcbiAgICBpZnJhbWVVcmwgKz0gYD9saWJyYXJ5LXZlcnNpb249JHsgYXBwVmVyc2lvbiB9YDtcclxuICAgIGlmcmFtZVVybCArPSBcIiZmcmFtZXdvcms9YW5ndWxhclwiO1xyXG4gICAgaWYodGhpcy5kYXRhTG9jYXRpb24pIHtcclxuICAgICAgaWZyYW1lVXJsICs9IFwiJnByZXZlbnRSZWRpcmVjdFwiO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5sYW5ndWFnZSl7XHJcbiAgICAgIGlmcmFtZVVybCArPSBcIiZsYW5ndWFnZVwiICsgdGhpcy5sYW5ndWFnZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZW52aXJvbm1lbnQpIHtcclxuICAgICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5lbnZpcm9ubWVudCkucmVwbGFjZSgvWydcIl0vZywgZnVuY3Rpb24obWF0Y2gpIHtcclxuICAgICAgICAgIHJldHVybiAnXFxcXCcgKyBtYXRjaDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmcmFtZVVybCArPSBgJmVudj0ke2Vudmlyb25tZW50fWA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhZmVVcmwgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaWZyYW1lVXJsKSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVV1aWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgdGhpcy51cGRhdGVVc2VyVmFyaWFiZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGEpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlciA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXHJcbiAgICAgIH0sIFwiKlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgaWYoZXZlbnQgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGlmKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5kYXRhICYmIGV2ZW50LmRhdGEuZGF0YS51bmlxdWVfdG9rZW4gPT0gdGhpcy51dWlkKSB7XHJcbiAgICAgICAgICBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xyXG4gICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgIG1ldGFkYXRhW1wiY29sdW1uX21hcHBpbmdzXCJdID0gZXZlbnQuZGF0YS5jb2x1bW5fbWFwcGluZztcclxuICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vblN1Ym1pdCkgdGhpcy5vblN1Ym1pdChtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3VibWl0dGVkKSB0aGlzLmlzU3VibWl0dGVkKG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXRhZGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xyXG4gICAgICAgICAgICBpZihldmVudC5kYXRhLmRhdGEuaW1wb3J0X3N0YXR1cyA9PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQuZGF0YS5yb3dfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmltYXJ5X3Jvd19kYXRhID0gZXZlbnQuZGF0YS5yb3dfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVycyA9IGV2ZW50LmRhdGEuaGVhZGVycztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcm93cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkeW5hbWljX2NvbHVtbnNfaW5kZXhlcyA9IGV2ZW50LmRhdGEuZHluYW1pY0NvbHVtbnNJbmRleGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcyA9IGV2ZW50LmRhdGEudmlydHVhbENvbHVtbnNJbmRleGVzIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5X3Jvd19kYXRhLmZvckVhY2goKHJvd19kYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgeCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGR5bmFtaWNfY29sdW1ucyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHZpcnR1YWxfZGF0YSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIHJvd19kYXRhLmRhdGEgJiYgcm93X2RhdGEuZGF0YS5mb3JFYWNoKChjb2wsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb2wgPT0gdW5kZWZpbmVkKXsgY29sID0gXCJcIn07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGR5bmFtaWNfY29sdW1uc19pbmRleGVzLmluY2x1ZGVzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29sdW1uc1toZWFkZXJzW2ldXSA9IGNvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlydHVhbF9kYXRhW2hlYWRlcnNbaV1dID0gY29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbaGVhZGVyc1tpXV0gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihyb3dfZGF0YSAmJiByb3dfZGF0YS51bm1hcHBlZF9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhbXCJfdW5tYXBwZWRfZGF0YVwiXSA9IHJvd19kYXRhLnVubWFwcGVkX2RhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZihkeW5hbWljX2NvbHVtbnMgJiYgT2JqZWN0LmtleXMoZHluYW1pY19jb2x1bW5zKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhbXCJfZHluYW1pY19kYXRhXCJdID0gZHluYW1pY19jb2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYodmlydHVhbF9kYXRhICYmIE9iamVjdC5rZXlzKHZpcnR1YWxfZGF0YSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4W1wiX3ZpcnR1YWxfZGF0YVwiXSA9IHZpcnR1YWxfZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHJvd3MucHVzaCh4KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBldmVudC5kYXRhLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyb3dzXCJdID0gcm93cztcclxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVtcImNvbHVtbl9tYXBwaW5nc1wiXSA9IGV2ZW50LmRhdGEuY29sdW1uX21hcHBpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJyYXdfY29sdW1uc1wiXSA9IGV2ZW50LmRhdGEucmF3X2NvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJpZ25vcmVkX2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLmlnbm9yZWRfY29sdW1uX3JvdztcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT0gXCJjc3Zib3gtdXBsb2FkLXN1Y2Nlc3NmdWxcIikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZihldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICBpZih0aGlzLmxhenkpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0SW1wb3J0ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xyXG5cclxuICAgIGluc2VydENTUygpO1xyXG5cclxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XHJcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybCk7XHJcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuXHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoc2VsZi5vblJlYWR5KSBzZWxmLm9uUmVhZHkoKTtcclxuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XHJcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xyXG5cclxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcclxuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIFwiY3VzdG9tZXJcIiA6IHNlbGYudXNlciA/IHNlbGYudXNlciA6IG51bGwsXHJcbiAgICAgICAgICBcImNvbHVtbnNcIiA6IHNlbGYuZHluYW1pY0NvbHVtbnMgPyBzZWxmLmR5bmFtaWNDb2x1bW5zIDogbnVsbCxcclxuICAgICAgICAgIFwib3B0aW9uc1wiIDogc2VsZi5vcHRpb25zID8gc2VsZi5vcHRpb25zIDogbnVsbCxcclxuICAgICAgICAgIFwidW5pcXVlX3Rva2VuXCI6IHNlbGYudXVpZFxyXG4gICAgICAgIH0sIFwiKlwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xyXG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xyXG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XHJcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG5cclxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxyXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZih0aGlzLmxhenkpIHtcclxuICAgICAgaWYoIXRoaXMuaWZyYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZighdGhpcy5pc01vZGFsU2hvd24pIHtcclxuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xyXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xyXG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=