UNPKG

@mescius/activereportsjs-angular

Version:

ActiveReportsJS components for Angular

256 lines 29.9 kB
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; import { ReportDesigner as DesignerNS } from '@mescius/activereportsjs'; import * as i0 from "@angular/core"; export { ColorThemes } from '@mescius/activereportsjs/reportdesigner'; function isReportDef(report) { return !!(report && report.definition); } function hasReportChanged(curr, prev) { const definitionChanged = (isReportDef(curr) && curr.definition) !== (isReportDef(curr) && curr.definition); return definitionChanged || (curr && curr.id) !== (prev && prev.id) || (curr && curr.displayName) !== (prev && prev.displayName); } export class DesignerComponent { constructor() { /** Sets componets width */ this.width = '100%'; /** Sets componets height */ this.height = '100%'; this._actionHandlers = {}; this._disposables = []; /** documentChanged event. */ this.documentChanged = new EventEmitter(); } /** * Sets DataSource templates * @param value List of DataSource templates */ set dataSources(value) { this._dataSources = value; if (this._designer) this._designer.setDataSourceTemplates(this._dataSources || []); } /* Gets DataSource templates */ get dataSources() { return this._dataSources; } /** * Sets handler to be called on open report. * Handler return Promise with report info or 'undefined' if operation was cancelled. */ set onCreate(value) { this._actionHandlers.onCreate = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onCreate() { return this._actionHandlers.onCreate; } /** * Sets handler to be called on opening report. * Handler returns Promise with report info or 'undefined' if operation was cancelled. */ set onOpen(value) { this._actionHandlers.onOpen = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onOpen() { return this._actionHandlers.onOpen; } /** * Sets handler to be called on request to render current report. */ set onRender(value) { this._actionHandlers.onRender = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onRender() { return this._actionHandlers.onRender; } /** * Sets handler to be called on saving report. * Handler returns Promise with new report info if report was saved or 'undefined' if operation was cancelled. */ set onSave(value) { this._actionHandlers.onSave = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onSave() { return this._actionHandlers.onSave; } /** * Sets handler to be called on saving report as new. * Handler returns Promise with new report info if report was saved or 'undefined' if operation was cancelled. */ set onSaveAs(value) { this._actionHandlers.onSaveAs = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onSaveAs() { return this._actionHandlers.onSaveAs; } /** * Sets handler to be called on open custom file menu. */ set onOpenFileMenu(value) { this._actionHandlers.onOpenFileMenu = value; if (this._designer) this._designer.setActionHandlers(this._actionHandlers); } get onOpenFileMenu() { return this._actionHandlers.onOpenFileMenu; } /** * Watch report property */ set report(value) { if (hasReportChanged(value, this._report)) { this._report = value; if (value) this.setReport(value, 'override'); else { if (!this._designer) return; this._designer.createReport({ reportType: 'CPL' }, 'override'); } } } ngAfterViewInit() { const config = this.onInit?.(); this._designer = new DesignerNS.Designer(this.rootElement.nativeElement, config); this._designer.setResourceProvider({ getImagesList: async () => this.imageList || [], getReportsList: async () => this.reportList || [], getMasterReportList: async () => this.masterReportList || [], getThemesList: async () => this.themeList || [], getStylesheetList: async () => this.stylesheetList || [], }); this._designer.setActionHandlers(this._actionHandlers); if (this.dataSources) this._designer.setDataSourceTemplates(this._dataSources || []); if (this._report) this.setReport(this._report, 'override'); this._disposables.push(this._designer.documentChanged.register((args) => this.documentChanged.emit(args))); } /** * Sets report. * @param report Report info to load. * @param whenDirty Action to perform in case of 'dirty' report. * @param isDirtyInitial Initial value for 'dirty' state after load. */ setReport(report, whenDirty, isDirtyInitial) { if (!this._designer) return Promise.resolve(); return this._designer.setReport(report, whenDirty, isDirtyInitial); } /** Gets current report. */ getReport() { if (!this._designer) return Promise.resolve(); return this._designer.getReport(); } /** * Creates report. * @param reportInfo Report info to load. * @param whenDirty Action to perform in case of 'dirty' report. */ createReport(reportInfo, whenDirty) { if (!this._designer) return Promise.resolve(); return this._designer.createReport(reportInfo, whenDirty); } /** * Process command. * @param cmd Command name. */ processCommand(cmd) { if (!this._designer) return Promise.resolve(); return this._designer.processCommand(cmd); } /** * Returns focus to Designer. */ focus() { if (this._designer == null) throw new Error('Designer is not initialized yet'); this._designer.focus(); } /** * Gets API to manipulate designer. */ getEditorAPI() { if (this._designer == null) throw new Error('Designer is not initialized yet'); return this._designer.getEditorAPI(); } /* * Access to the menu and sidebar panels */ getPanelsAPI() { if (this._designer == null) throw new Error('Designer is not initialized yet'); return this._designer.getPanelsAPI(); } /* * Manipulate notifications panel. */ getNotificationsAPI() { if (this._designer == null) throw new Error('Designer is not initialized yet'); return this._designer.getNotificationsAPI(); } ngOnDestroy() { while (this._disposables.length) { this._disposables.shift()(); } // this._designer.dispose(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DesignerComponent, selector: "gc-activereports-designer", inputs: { width: "width", height: "height", onInit: "onInit", dataSources: "dataSources", reportList: "reportList", masterReportList: "masterReportList", imageList: "imageList", themeList: "themeList", stylesheetList: "stylesheetList", onCreate: "onCreate", onOpen: "onOpen", onRender: "onRender", onSave: "onSave", onSaveAs: "onSaveAs", onOpenFileMenu: "onOpenFileMenu", report: "report" }, outputs: { documentChanged: "documentChanged" }, viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["designerRoot"], descendants: true }], ngImport: i0, template: "<div #designerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n", styles: [""] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerComponent, decorators: [{ type: Component, args: [{ selector: 'gc-activereports-designer', template: "<div #designerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n" }] }], ctorParameters: () => [], propDecorators: { rootElement: [{ type: ViewChild, args: ['designerRoot', { static: false }] }], width: [{ type: Input }], height: [{ type: Input }], onInit: [{ type: Input }], dataSources: [{ type: Input }], reportList: [{ type: Input }], masterReportList: [{ type: Input }], imageList: [{ type: Input }], themeList: [{ type: Input }], stylesheetList: [{ type: Input }], onCreate: [{ type: Input }], onOpen: [{ type: Input }], onRender: [{ type: Input }], onSave: [{ type: Input }], onSaveAs: [{ type: Input }], onOpenFileMenu: [{ type: Input }], report: [{ type: Input }], documentChanged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlcmVwb3J0cy9zcmMvbGliL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLGNBQWMsSUFBSSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFHeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3RFLFNBQVMsV0FBVyxDQUFDLE1BQTBCO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFLLE1BQXNDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBdUIsRUFBRSxJQUF1QjtJQUN6RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUcsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEksQ0FBQztB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QUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVc7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUcsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCw0QkFBNEI7SUFDN0IsQ0FBQzsrR0FyT1csaUJBQWlCO21HQUFqQixpQkFBaUIsdW1CQ3RCOUIsK0VBQ0E7OzRGRHFCYSxpQkFBaUI7a0JBTDdCLFNBQVM7K0JBQ0MsMkJBQTJCO3dEQUtTLFdBQVc7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPbkMsS0FBSztzQkFBYixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFNRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT08sV0FBVztzQkFBdkIsS0FBSztnQkFVRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFRTyxRQUFRO3NCQUFwQixLQUFLO2dCQVlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBV08sUUFBUTtzQkFBcEIsS0FBSztnQkFZTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBV08sY0FBYztzQkFBMUIsS0FBSztnQkFlTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0RGVzaWduZXIgYXMgRGVzaWduZXJOUyB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cyc7XG5pbXBvcnQgeyBEb2N1bWVudENoYW5nZWRFdmVudEFyZ3MgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMvcmVwb3J0ZGVzaWduZXInO1xuXG5leHBvcnQgeyBDb2xvclRoZW1lcyB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cy9yZXBvcnRkZXNpZ25lcic7XG5leHBvcnQgdHlwZSB7IENvbG9yVGhlbWUgfSBmcm9tICdAZ3JhcGVjaXR5L2FjdGl2ZXJlcG9ydHMvcmVwb3J0ZGVzaWduZXInO1xuXG5mdW5jdGlvbiBpc1JlcG9ydERlZihyZXBvcnQ/OiBEZXNpZ25lck5TLlJlcG9ydCk6IHJlcG9ydCBpcyBEZXNpZ25lck5TLlJlcG9ydERlZmluaXRpb24ge1xuXHRyZXR1cm4gISEocmVwb3J0ICYmIChyZXBvcnQgYXMgRGVzaWduZXJOUy5SZXBvcnREZWZpbml0aW9uKS5kZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzUmVwb3J0Q2hhbmdlZChjdXJyOiBEZXNpZ25lck5TLlJlcG9ydCwgcHJldjogRGVzaWduZXJOUy5SZXBvcnQpIHtcblx0Y29uc3QgZGVmaW5pdGlvbkNoYW5nZWQgPSAoaXNSZXBvcnREZWYoY3VycikgJiYgY3Vyci5kZWZpbml0aW9uKSAhPT0gKGlzUmVwb3J0RGVmKGN1cnIpICYmIGN1cnIuZGVmaW5pdGlvbik7XG5cdHJldHVybiBkZWZpbml0aW9uQ2hhbmdlZCB8fCAoY3VyciAmJiBjdXJyLmlkKSAhPT0gKHByZXYgJiYgcHJldi5pZCkgfHwgKGN1cnIgJiYgY3Vyci5kaXNwbGF5TmFtZSkgIT09IChwcmV2ICYmIHByZXYuZGlzcGxheU5hbWUpO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdnYy1hY3RpdmVyZXBvcnRzLWRlc2lnbmVyJyxcblx0dGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vZGVzaWduZXIuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cdEBWaWV3Q2hpbGQoJ2Rlc2lnbmVyUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSByb290RWxlbWVudDogRWxlbWVudFJlZjtcblxuXHRwcml2YXRlIF9kZXNpZ25lcj86IERlc2lnbmVyTlMuRGVzaWduZXI7XG5cblx0Y29uc3RydWN0b3IoKSB7fVxuXG5cdC8qKiBTZXRzIGNvbXBvbmV0cyB3aWR0aCAqL1xuXHRASW5wdXQoKSB3aWR0aCA9ICcxMDAlJztcblx0LyoqIFNldHMgY29tcG9uZXRzIGhlaWdodCAqL1xuXHRASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSc7XG5cblx0LyoqXG5cdCAqIENhbGxlZCBiZWZvcmUgZGVzaWduZXIgaW5pdGlhbGl6YXRpb24uXG5cdCAqIEByZXR1cm5zIERlc2lnbmVyQ29uZmlnIHRvIGluaXRpYWxpemUgZGVzaWduZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHRASW5wdXQoKSBvbkluaXQ/OiAoKSA9PiBEZXNpZ25lck5TLkRlc2lnbmVyQ29uZmlnO1xuXG5cdHByaXZhdGUgX2RhdGFTb3VyY2VzPzogRGVzaWduZXJOUy5EYXRhU291cmNlVGVtcGxhdGVbXTtcblx0LyoqXG5cdCAqIFNldHMgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICogQHBhcmFtIHZhbHVlIExpc3Qgb2YgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICovXG5cdEBJbnB1dCgpIHNldCBkYXRhU291cmNlcyh2YWx1ZSkge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VzID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXREYXRhU291cmNlVGVtcGxhdGVzKHRoaXMuX2RhdGFTb3VyY2VzIHx8IFtdKTtcblx0fVxuXHQvKiBHZXRzIERhdGFTb3VyY2UgdGVtcGxhdGVzICovXG5cdGdldCBkYXRhU291cmNlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZXM7XG5cdH1cblxuXHQvKiogU2V0cyBleHRlcm5hbCByZXBvcnQgbGlzdC4gKi9cblx0QElucHV0KCkgcmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIGV4dGVybmFsIG1hc3RlciByZXBvcnQgbGlzdC4gKi9cblx0QElucHV0KCkgbWFzdGVyUmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIGV4dGVybmFsIGltYWdlIGxpc3QuICovXG5cdEBJbnB1dCgpIGltYWdlTGlzdD86IERlc2lnbmVyTlMuSW1hZ2VSZXNvdXJjZUluZm9bXTtcblx0LyoqIFNldHMgdGhlbWUgbGlzdC4gKi9cblx0QElucHV0KCkgdGhlbWVMaXN0PzogRGVzaWduZXJOUy5UaGVtZVJlc291cmNlSW5mb1tdO1xuXHQvKiogU2V0cyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZXJuYWwgc3R5bGVzaGVldHMuICovXG5cdEBJbnB1dCgpIHN0eWxlc2hlZXRMaXN0PzogRGVzaWduZXJOUy5TdHlsZXNoZWV0UmVzb3VyY2VJbmZvW107XG5cblx0cHJpdmF0ZSBfYWN0aW9uSGFuZGxlcnM6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnMgPSB7fTtcblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiBvcGVuIHJlcG9ydC5cblx0ICogSGFuZGxlciByZXR1cm4gUHJvbWlzZSB3aXRoIHJlcG9ydCBpbmZvIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uQ3JlYXRlKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbkNyZWF0ZSddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25DcmVhdGUgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25DcmVhdGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uQ3JlYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbmluZyByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggcmVwb3J0IGluZm8gb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25PcGVuKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbk9wZW4nXSkge1xuXHRcdHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3BlbiA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvbk9wZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3Blbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHJlcXVlc3QgdG8gcmVuZGVyIGN1cnJlbnQgcmVwb3J0LlxuXHQgKi9cblx0QElucHV0KCkgc2V0IG9uUmVuZGVyKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblJlbmRlciddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25SZW5kZXIgPSB2YWx1ZTtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcblx0fVxuXHRnZXQgb25SZW5kZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uUmVuZGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gc2F2aW5nIHJlcG9ydC5cblx0ICogSGFuZGxlciByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgcmVwb3J0IGluZm8gaWYgcmVwb3J0IHdhcyBzYXZlZCBvciAndW5kZWZpbmVkJyBpZiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZC5cblx0ICovXG5cdEBJbnB1dCgpIHNldCBvblNhdmUodmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uU2F2ZSddKSB7XG5cdFx0dGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlID0gdmFsdWU7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG5cdH1cblx0Z2V0IG9uU2F2ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gc2F2aW5nIHJlcG9ydCBhcyBuZXcuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHJlcG9ydCBpbmZvIGlmIHJlcG9ydCB3YXMgc2F2ZWQgb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25TYXZlQXModmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uU2F2ZUFzJ10pIHtcblx0XHR0aGlzLl9hY3Rpb25IYW5kbGVycy5vblNhdmVBcyA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvblNhdmVBcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlQXM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiBvcGVuIGN1c3RvbSBmaWxlIG1lbnUuXG5cdCAqL1xuXHRASW5wdXQoKSBzZXQgb25PcGVuRmlsZU1lbnUodmFsdWU6IERlc2lnbmVyTlMuQWN0aW9uSGFuZGxlcnNbJ29uT3BlbkZpbGVNZW51J10pIHtcblx0XHR0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW5GaWxlTWVudSA9IHZhbHVlO1xuXHRcdGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHR9XG5cdGdldCBvbk9wZW5GaWxlTWVudSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYWN0aW9uSGFuZGxlcnMub25PcGVuRmlsZU1lbnU7XG5cdH1cblxuXHRwcml2YXRlIF9yZXBvcnQ6IERlc2lnbmVyTlMuUmVwb3J0O1xuXG5cdHByaXZhdGUgX2Rpc3Bvc2FibGVzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG5cdC8qKlxuXHQgKiBXYXRjaCByZXBvcnQgcHJvcGVydHlcblx0ICovXG5cdEBJbnB1dCgpIHNldCByZXBvcnQodmFsdWU6IERlc2lnbmVyTlMuUmVwb3J0KSB7XG5cdFx0aWYgKGhhc1JlcG9ydENoYW5nZWQodmFsdWUsIHRoaXMuX3JlcG9ydCkpIHtcblx0XHRcdHRoaXMuX3JlcG9ydCA9IHZhbHVlO1xuXHRcdFx0aWYgKHZhbHVlKSB0aGlzLnNldFJlcG9ydCh2YWx1ZSwgJ292ZXJyaWRlJyk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9kZXNpZ25lcikgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLl9kZXNpZ25lci5jcmVhdGVSZXBvcnQoeyByZXBvcnRUeXBlOiAnQ1BMJyB9LCAnb3ZlcnJpZGUnKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiogZG9jdW1lbnRDaGFuZ2VkIGV2ZW50LiAqL1xuXHRAT3V0cHV0KCkgZG9jdW1lbnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEb2N1bWVudENoYW5nZWRFdmVudEFyZ3M+KCk7XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGNvbnN0IGNvbmZpZyA9IHRoaXMub25Jbml0Py4oKTtcblx0XHR0aGlzLl9kZXNpZ25lciA9IG5ldyBEZXNpZ25lck5TLkRlc2lnbmVyKHRoaXMucm9vdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcblx0XHR0aGlzLl9kZXNpZ25lci5zZXRSZXNvdXJjZVByb3ZpZGVyKHtcblx0XHRcdGdldEltYWdlc0xpc3Q6IGFzeW5jICgpID0+IHRoaXMuaW1hZ2VMaXN0IHx8IFtdLFxuXHRcdFx0Z2V0UmVwb3J0c0xpc3Q6IGFzeW5jICgpID0+IHRoaXMucmVwb3J0TGlzdCB8fCBbXSxcblx0XHRcdGdldE1hc3RlclJlcG9ydExpc3Q6IGFzeW5jICgpID0+IHRoaXMubWFzdGVyUmVwb3J0TGlzdCB8fCBbXSxcblx0XHRcdGdldFRoZW1lc0xpc3Q6IGFzeW5jICgpID0+IHRoaXMudGhlbWVMaXN0IHx8IFtdLFxuXHRcdFx0Z2V0U3R5bGVzaGVldExpc3Q6IGFzeW5jICgpID0+IHRoaXMuc3R5bGVzaGVldExpc3QgfHwgW10sXG5cdFx0fSk7XG5cdFx0dGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuXHRcdGlmICh0aGlzLmRhdGFTb3VyY2VzKSB0aGlzLl9kZXNpZ25lci5zZXREYXRhU291cmNlVGVtcGxhdGVzKHRoaXMuX2RhdGFTb3VyY2VzIHx8IFtdKTtcblx0XHRpZiAodGhpcy5fcmVwb3J0KSB0aGlzLnNldFJlcG9ydCh0aGlzLl9yZXBvcnQsICdvdmVycmlkZScpO1xuXG5cdFx0dGhpcy5fZGlzcG9zYWJsZXMucHVzaCh0aGlzLl9kZXNpZ25lci5kb2N1bWVudENoYW5nZWQucmVnaXN0ZXIoKGFyZ3MpID0+IHRoaXMuZG9jdW1lbnRDaGFuZ2VkLmVtaXQoYXJncykpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHJlcG9ydC5cblx0ICogQHBhcmFtIHJlcG9ydCBSZXBvcnQgaW5mbyB0byBsb2FkLlxuXHQgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG5cdCAqIEBwYXJhbSBpc0RpcnR5SW5pdGlhbCBJbml0aWFsIHZhbHVlIGZvciAnZGlydHknIHN0YXRlIGFmdGVyIGxvYWQuXG5cdCAqL1xuXHRzZXRSZXBvcnQocmVwb3J0OiBEZXNpZ25lck5TLlJlcG9ydCwgd2hlbkRpcnR5PzogRGVzaWduZXJOUy5XaGVuRGlydHksIGlzRGlydHlJbml0aWFsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5zZXRSZXBvcnQocmVwb3J0LCB3aGVuRGlydHksIGlzRGlydHlJbml0aWFsKTtcblx0fVxuXG5cdC8qKiBHZXRzIGN1cnJlbnQgcmVwb3J0LiAqL1xuXHRnZXRSZXBvcnQoKTogUHJvbWlzZTxEZXNpZ25lck5TLlJlcG9ydEluZm8+IHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkgYXMgYW55O1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmdldFJlcG9ydCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgcmVwb3J0LlxuXHQgKiBAcGFyYW0gcmVwb3J0SW5mbyBSZXBvcnQgaW5mbyB0byBsb2FkLlxuXHQgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG5cdCAqL1xuXHRjcmVhdGVSZXBvcnQocmVwb3J0SW5mbzogRGVzaWduZXJOUy5OZXdSZXBvcnRJbmZvLCB3aGVuRGlydHk/OiBEZXNpZ25lck5TLldoZW5EaXJ0eSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuY3JlYXRlUmVwb3J0KHJlcG9ydEluZm8sIHdoZW5EaXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyBjb21tYW5kLlxuXHQgKiBAcGFyYW0gY21kIENvbW1hbmQgbmFtZS5cblx0ICovXG5cdHByb2Nlc3NDb21tYW5kKGNtZDogRGVzaWduZXJOUy5EZXNpZ25lckNvbW1hbmQpIHtcblx0XHRpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIucHJvY2Vzc0NvbW1hbmQoY21kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGZvY3VzIHRvIERlc2lnbmVyLlxuXHQgKi9cblx0Zm9jdXMoKSB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHRoaXMuX2Rlc2lnbmVyLmZvY3VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBBUEkgdG8gbWFuaXB1bGF0ZSBkZXNpZ25lci5cblx0ICovXG5cdGdldEVkaXRvckFQSSgpOiBQcm9taXNlPERlc2lnbmVyTlMuRWRpdG9yQVBJPiB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRFZGl0b3JBUEkoKTtcblx0fVxuXG5cdC8qXG5cdCAqIEFjY2VzcyB0byB0aGUgbWVudSBhbmQgc2lkZWJhciBwYW5lbHNcblx0ICovXG5cdGdldFBhbmVsc0FQSSgpOiBQcm9taXNlPERlc2lnbmVyTlMuUGFuZWxzQVBJPiB7XG5cdFx0aWYgKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcignRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCcpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRQYW5lbHNBUEkoKTtcblx0fVxuXG5cdC8qXG5cdCAqIE1hbmlwdWxhdGUgbm90aWZpY2F0aW9ucyBwYW5lbC5cblx0ICovXG5cdGdldE5vdGlmaWNhdGlvbnNBUEkoKTogUHJvbWlzZTxEZXNpZ25lck5TLk5vdGlmaWNhdGlvbnNBUEk+IHtcblx0XHRpZiAodGhpcy5fZGVzaWduZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEZXNpZ25lciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Jyk7XG5cdFx0cmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmdldE5vdGlmaWNhdGlvbnNBUEkoKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHdoaWxlICh0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuX2Rpc3Bvc2FibGVzLnNoaWZ0KCkhKCk7XG5cdFx0fVxuXHRcdC8vIHRoaXMuX2Rlc2lnbmVyLmRpc3Bvc2UoKTtcblx0fVxufVxuIiwiPGRpdiAjZGVzaWduZXJSb290IFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0XCI+PC9kaXY+XG4iXX0=