UNPKG

@csvbox/angular2

Version:

Standalone Angular component for csvbox.io supporting Angular version 14 till 19

325 lines 42 kB
import { Component, ViewChild, Input, SecurityContext } from '@angular/core'; import { insertCSS } from './utils/insertCSS'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; const appVersion = '1.1.16'; export class CSVBoxButtonComponent { constructor(sanitizer) { this.sanitizer = sanitizer; this.isModalShown = false; this.user = null; this.dynamicColumns = null; this.licenseKey = null; this.options = null; this.uuid = ''; this.customDomain = null; this.dataLocation = null; this.language = null; this.environment = null; this.isIframeLoaded = false; this.openModalOnIframeLoad = false; this.lazy = false; this.safeUrl = null; this.iframe = null; this.disabled = true; this.holder = null; } ngOnInit() { this.uuid = this.generateUuid(); let domain = this.customDomain ? this.customDomain : "app.csvbox.io"; if (this.dataLocation) { domain = `${this.dataLocation}-${domain}`; } 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) { const environment = JSON.stringify(this.environment).replace(/['"]/g, (match) => '\\' + match); iframeUrl += `&env=${environment}`; } this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl)); } generateUuid() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } ngOnChanges(changes) { if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) { this.updateUserVariable(changes['user'].currentValue); } } updateUserVariable(data) { this.user = data; if (this.iframe && this.iframe.contentWindow) { this.iframe.contentWindow.postMessage({ "customer": data }, "*"); } } ngAfterContentInit() { window.addEventListener("message", (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") { const 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(); } else if (event.data.type && event.data.type === "data-push-status") { if (event.data.data.import_status === "success") { if (event.data.row_data) { const primary_row_data = event.data.row_data; const headers = event.data.headers; const rows = []; const dynamic_columns_indexes = event.data.dynamicColumnsIndexes; const virtual_columns_indexes = event.data.virtualColumnsIndexes || []; primary_row_data.forEach((row_data) => { const x = {}; const dynamic_columns = {}; const virtual_data = {}; row_data.data && row_data.data.forEach((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); }); const 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 { const 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 { const 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(); } } initImporter() { if (this.loadStarted) this.loadStarted(); insertCSS(); const iframe = document.createElement("iframe"); this.iframe = iframe; iframe.setAttribute("src", this.safeUrl?.toString() || ''); iframe.frameBorder = "0"; const self = this; iframe.onload = 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); } 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.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); CSVBoxButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CSVBoxButtonComponent, isStandalone: true, selector: "csvbox-button", inputs: { onImport: "onImport", onReady: "onReady", onClose: "onClose", onSubmit: "onSubmit", isImported: "isImported", isReady: "isReady", isClosed: "isClosed", isSubmitted: "isSubmitted", importerReady: "importerReady", closed: "closed", submitted: "submitted", imported: "imported", loadStarted: "loadStarted", user: "user", dynamicColumns: "dynamicColumns", licenseKey: "licenseKey", options: "options", uuid: "uuid", customDomain: "customDomain", dataLocation: "dataLocation", language: "language", environment: "environment", isIframeLoaded: "isIframeLoaded", openModalOnIframeLoad: "openModalOnIframeLoad", lazy: "lazy", disabled: "disabled" }, viewQueries: [{ propertyName: "initiator", first: true, predicate: ["initiator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <div> <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid"> <ng-content></ng-content> </button> </div> `, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, decorators: [{ type: Component, args: [{ selector: 'csvbox-button', standalone: true, template: ` <div> <button [disabled]="disabled" #initiator (click)="openModal()" [attr.data-csvbox-token]="uuid"> <ng-content></ng-content> </button> </div> ` }] }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, 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 }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDO0FBYzVCLE1BQU0sT0FBTyxxQkFBcUI7SUEwQ2hDLFlBQW1CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUF4QzFDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBbUJaLFNBQUksR0FBa0MsSUFBSSxDQUFDO1FBQzNDLG1CQUFjLEdBQWtDLElBQUksQ0FBQztRQUNyRCxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxZQUFPLEdBQWtDLElBQUksQ0FBQztRQUM5QyxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDL0IsZ0JBQVcsR0FBa0MsSUFBSSxDQUFDO1FBRWxELG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBRS9CLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFJbEMsV0FBTSxHQUEwQixJQUFJLENBQUM7SUFGUSxDQUFDO0lBSTlDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFH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MkZBR1UscUJBQXFCO2tCQVpqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7R0FNVDtpQkFDRjttR0FNNEMsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNoQyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi91dGlscy9pbnNlcnRDU1MnO1xuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4xNic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiICNpbml0aWF0b3IgKGNsaWNrKT1cIm9wZW5Nb2RhbCgpXCIgW2F0dHIuZGF0YS1jc3Zib3gtdG9rZW5dPVwidXVpZFwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcblxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdpbml0aWF0b3InLCB7IHN0YXRpYzogZmFsc2UgfSkgaW5pdGlhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25DbG9zZT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ/OiAobWV0YWRhdGE6IGFueSkgPT4gdm9pZDtcblxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgY2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogKCkgPT4gdm9pZDtcblxuICBASW5wdXQoKSB1c2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjdXN0b21Eb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IFNhZmVVcmwgfCBudWxsID0gbnVsbDtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51dWlkID0gdGhpcy5nZW5lcmF0ZVV1aWQoKTtcbiAgICBsZXQgZG9tYWluID0gdGhpcy5jdXN0b21Eb21haW4gPyB0aGlzLmN1c3RvbURvbWFpbiA6IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIGlmICh0aGlzLmRhdGFMb2NhdGlvbikgeyBkb21haW4gPSBgJHt0aGlzLmRhdGFMb2NhdGlvbn0tJHtkb21haW59YDsgfVxuICAgIGxldCBpZnJhbWVVcmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn0vZW1iZWQvJHt0aGlzLmxpY2Vuc2VLZXl9YDtcbiAgICBpZnJhbWVVcmwgKz0gYD9saWJyYXJ5LXZlcnNpb249JHthcHBWZXJzaW9ufWA7XG4gICAgaWZyYW1lVXJsICs9IFwiJmZyYW1ld29yaz1hbmd1bGFyXCI7XG4gICAgaWYgKHRoaXMuZGF0YUxvY2F0aW9uKSB7XG4gICAgICBpZnJhbWVVcmwgKz0gXCImcHJldmVudFJlZGlyZWN0XCI7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhbmd1YWdlKSB7XG4gICAgICBpZnJhbWVVcmwgKz0gXCImbGFuZ3VhZ2U9XCIgKyB0aGlzLmxhbmd1YWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudCkge1xuICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVudmlyb25tZW50KS5yZXBsYWNlKC9bJ1wiXS9nLCAobWF0Y2gpID0+ICdcXFxcJyArIG1hdGNoKTtcbiAgICAgIGlmcmFtZVVybCArPSBgJmVudj0ke2Vudmlyb25tZW50fWA7XG4gICAgfVxuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIGdlbmVyYXRlVXVpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5kYXRhICYmIGV2ZW50LmRhdGEuZGF0YS51bmlxdWVfdG9rZW4gPT09IHRoaXMudXVpZCkge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgJiYgZXZlbnQuZGF0YS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xuICAgICAgICAgICAgbWV0YWRhdGFbXCJjb2x1bW5fbWFwcGluZ3NcIl0gPSBldmVudC5kYXRhLmNvbHVtbl9tYXBwaW5nO1xuICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWV0YWRhdGEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJtaXR0ZWQpIHRoaXMuaXNTdWJtaXR0ZWQobWV0YWRhdGEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJkYXRhLXB1c2gtc3RhdHVzXCIpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRhdGEuaW1wb3J0X3N0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEucm93X2RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5X3Jvd19kYXRhID0gZXZlbnQuZGF0YS5yb3dfZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gZXZlbnQuZGF0YS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY19jb2x1bW5zX2luZGV4ZXMgPSBldmVudC5kYXRhLmR5bmFtaWNDb2x1bW5zSW5kZXhlcztcbiAgICAgICAgICAgICAgICBjb25zdCB2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcyA9IGV2ZW50LmRhdGEudmlydHVhbENvbHVtbnNJbmRleGVzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgcHJpbWFyeV9yb3dfZGF0YS5mb3JFYWNoKChyb3dfZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB4OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljX2NvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxfZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICByb3dfZGF0YS5kYXRhICYmIHJvd19kYXRhLmRhdGEuZm9yRWFjaCgoY29sOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sID09PSB1bmRlZmluZWQpIHsgY29sID0gXCJcIjsgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkeW5hbWljX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNfY29sdW1uc1toZWFkZXJzW2ldXSA9IGNvbDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aXJ0dWFsX2NvbHVtbnNfaW5kZXhlcy5pbmNsdWRlcyhpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxfZGF0YVtoZWFkZXJzW2ldXSA9IGNvbDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB4W2hlYWRlcnNbaV1dID0gY29sO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmIChyb3dfZGF0YSAmJiByb3dfZGF0YS51bm1hcHBlZF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHhbXCJfdW5tYXBwZWRfZGF0YVwiXSA9IHJvd19kYXRhLnVubWFwcGVkX2RhdGE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoZHluYW1pY19jb2x1bW5zICYmIE9iamVjdC5rZXlzKGR5bmFtaWNfY29sdW1ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB4W1wiX2R5bmFtaWNfZGF0YVwiXSA9IGR5bmFtaWNfY29sdW1ucztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh2aXJ0dWFsX2RhdGEgJiYgT2JqZWN0LmtleXModmlydHVhbF9kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHhbXCJfdmlydHVhbF9kYXRhXCJdID0gdmlydHVhbF9kYXRhO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcm93cy5wdXNoKHgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGF0YS5kYXRhO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicm93c1wiXSA9IHJvd3M7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFbXCJjb2x1bW5fbWFwcGluZ3NcIl0gPSBldmVudC5kYXRhLmNvbHVtbl9tYXBwaW5nO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wicmF3X2NvbHVtbnNcIl0gPSBldmVudC5kYXRhLnJhd19jb2x1bW5zO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhW1wiaWdub3JlZF9jb2x1bW5zXCJdID0gZXZlbnQuZGF0YS5pZ25vcmVkX2NvbHVtbl9yb3c7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlLCBtZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGV2ZW50LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgZGVsZXRlIG1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UsIG1ldGFkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YS50eXBlICYmIGV2ZW50LmRhdGEudHlwZSA9PT0gXCJjc3Zib3gtdXBsb2FkLXN1Y2Nlc3NmdWxcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEudHlwZSAmJiBldmVudC5kYXRhLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5sYXp5KSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBpbml0SW1wb3J0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcblxuICAgIGluc2VydENTUygpO1xuXG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICB0aGlzLmlmcmFtZSA9IGlmcmFtZTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsIHRoaXMuc2FmZVVybD8udG9TdHJpbmcoKSB8fCAnJyk7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIFwiY3VzdG9tZXJcIjogc2VsZi51c2VyID8gc2VsZi51c2VyIDogbnVsbCxcbiAgICAgICAgICBcImNvbHVtbnNcIjogc2VsZi5keW5hbWljQ29sdW1ucyA/IHNlbGYuZHluYW1pY0NvbHVtbnMgOiBudWxsLFxuICAgICAgICAgIFwib3B0aW9uc1wiOiBzZWxmLm9wdGlvbnMgPyBzZWxmLm9wdGlvbnMgOiBudWxsLFxuICAgICAgICAgIFwidW5pcXVlX3Rva2VuXCI6IHNlbGYudXVpZFxuICAgICAgICB9LCBcIipcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZi5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgc2VsZi5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuaG9sZGVyLmNsYXNzTGlzdC5hZGQoJ2NzdmJveC1ob2xkZXInKTtcbiAgICB0aGlzLmhvbGRlci5zZXRBdHRyaWJ1dGUoJ2lkJywgYGNzdmJveC1lbWJlZC0ke3RoaXMudXVpZH1gKTtcbiAgICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXG4gICAgICAnYmVmb3JlZW5kJywgdGhpcy5ob2xkZXJcbiAgICApO1xuICB9XG5cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgIGlmICghdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5pc01vZGFsU2hvd24pIHtcbiAgICAgIGlmICh0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=