@mescius/activereportsjs-angular
Version:
ActiveReportsJS components for Angular
253 lines • 29.4 kB
JavaScript
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 || [],
});
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: "16.2.12", ngImport: i0, type: DesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DesignerComponent, selector: "gc-activereports-designer", inputs: { width: "width", height: "height", onInit: "onInit", dataSources: "dataSources", reportList: "reportList", masterReportList: "masterReportList", imageList: "imageList", themeList: "themeList", 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: "16.2.12", ngImport: i0, type: DesignerComponent, decorators: [{
type: Component,
args: [{ selector: 'gc-activereports-designer', template: "<div #designerRoot [style.width]=\"width\" [style.height]=\"height\"></div>\n" }]
}], ctorParameters: function () { return []; }, 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
}], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlcmVwb3J0cy9zcmMvbGliL2Rlc2lnbmVyL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZXJlcG9ydHMvc3JjL2xpYi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsY0FBYyxJQUFJLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQUd4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHdEUsU0FBUyxXQUFXLENBQUMsTUFBMEI7SUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUssTUFBc0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUF1QixFQUFFLElBQXVCO0lBQ3hFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RyxPQUFPLENBQ0wsaUJBQWlCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUMxSCxDQUFDO0FB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QUFtQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVBLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFHLEVBQUUsQ0FBQztTQUM5QjtRQUNELDRCQUE0QjtJQUM5QixDQUFDOytHQXJPVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixxa0JDakM5QiwrRUFDQTs7NEZEZ0NhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSwyQkFBMkI7MEVBTVMsV0FBVztzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU9uQyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQU1FLE1BQU07c0JBQWQsS0FBSztnQkFPUSxXQUFXO3NCQUF2QixLQUFLO2dCQVVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFRTyxRQUFRO3NCQUFwQixLQUFLO2dCQVlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBV08sUUFBUTtzQkFBcEIsS0FBSztnQkFZTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBV08sY0FBYztzQkFBMUIsS0FBSztnQkFlTyxNQUFNO3NCQUFsQixLQUFLO2dCQVlJLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBSZXBvcnREZXNpZ25lciBhcyBEZXNpZ25lck5TIH0gZnJvbSAnQGdyYXBlY2l0eS9hY3RpdmVyZXBvcnRzJztcbmltcG9ydCB7IERvY3VtZW50Q2hhbmdlZEV2ZW50QXJncyB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cy9yZXBvcnRkZXNpZ25lcic7XG5cbmV4cG9ydCB7IENvbG9yVGhlbWVzIH0gZnJvbSAnQGdyYXBlY2l0eS9hY3RpdmVyZXBvcnRzL3JlcG9ydGRlc2lnbmVyJztcbmV4cG9ydCB0eXBlIHsgQ29sb3JUaGVtZSB9IGZyb20gJ0BncmFwZWNpdHkvYWN0aXZlcmVwb3J0cy9yZXBvcnRkZXNpZ25lcic7XG5cbmZ1bmN0aW9uIGlzUmVwb3J0RGVmKHJlcG9ydD86IERlc2lnbmVyTlMuUmVwb3J0KTogcmVwb3J0IGlzIERlc2lnbmVyTlMuUmVwb3J0RGVmaW5pdGlvbiB7XG4gIHJldHVybiAhIShyZXBvcnQgJiYgKHJlcG9ydCBhcyBEZXNpZ25lck5TLlJlcG9ydERlZmluaXRpb24pLmRlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBoYXNSZXBvcnRDaGFuZ2VkKGN1cnI6IERlc2lnbmVyTlMuUmVwb3J0LCBwcmV2OiBEZXNpZ25lck5TLlJlcG9ydCkge1xuICBjb25zdCBkZWZpbml0aW9uQ2hhbmdlZCA9IChpc1JlcG9ydERlZihjdXJyKSAmJiBjdXJyLmRlZmluaXRpb24pICE9PSAoaXNSZXBvcnREZWYoY3VycikgJiYgY3Vyci5kZWZpbml0aW9uKTtcbiAgcmV0dXJuIChcbiAgICBkZWZpbml0aW9uQ2hhbmdlZCB8fCAoY3VyciAmJiBjdXJyLmlkKSAhPT0gKHByZXYgJiYgcHJldi5pZCkgfHwgKGN1cnIgJiYgY3Vyci5kaXNwbGF5TmFtZSkgIT09IChwcmV2ICYmIHByZXYuZGlzcGxheU5hbWUpXG4gICk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2djLWFjdGl2ZXJlcG9ydHMtZGVzaWduZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXNpZ25lci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoJ2Rlc2lnbmVyUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSByb290RWxlbWVudDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIF9kZXNpZ25lcj86IERlc2lnbmVyTlMuRGVzaWduZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICAvKiogU2V0cyBjb21wb25ldHMgd2lkdGggKi9cbiAgQElucHV0KCkgd2lkdGggPSAnMTAwJSc7XG4gIC8qKiBTZXRzIGNvbXBvbmV0cyBoZWlnaHQgKi9cbiAgQElucHV0KCkgaGVpZ2h0ID0gJzEwMCUnO1xuXG4gIFx0LyoqXG5cdCAqIENhbGxlZCBiZWZvcmUgZGVzaWduZXIgaW5pdGlhbGl6YXRpb24uXG5cdCAqIEByZXR1cm5zIERlc2lnbmVyQ29uZmlnIHRvIGluaXRpYWxpemUgZGVzaWduZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHRASW5wdXQoKSBvbkluaXQ/OiAoKSA9PiBEZXNpZ25lck5TLkRlc2lnbmVyQ29uZmlnO1xuXG4gIHByaXZhdGUgX2RhdGFTb3VyY2VzPzogRGVzaWduZXJOUy5EYXRhU291cmNlVGVtcGxhdGVbXTtcblx0LyoqXG5cdCAqIFNldHMgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICogQHBhcmFtIHZhbHVlIExpc3Qgb2YgRGF0YVNvdXJjZSB0ZW1wbGF0ZXNcblx0ICovXG4gIEBJbnB1dCgpIHNldCBkYXRhU291cmNlcyh2YWx1ZSkge1xuICAgIHRoaXMuX2RhdGFTb3VyY2VzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXREYXRhU291cmNlVGVtcGxhdGVzKHRoaXMuX2RhdGFTb3VyY2VzIHx8IFtdKTtcbiAgfVxuXHQvKiBHZXRzIERhdGFTb3VyY2UgdGVtcGxhdGVzICovXG4gIGdldCBkYXRhU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZXM7XG4gIH1cblxuXHQvKiogU2V0cyBleHRlcm5hbCByZXBvcnQgbGlzdC4gKi9cbiAgQElucHV0KCkgcmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG4gIC8qKiBTZXRzIGV4dGVybmFsIG1hc3RlciByZXBvcnQgbGlzdC4gKi9cbiAgQElucHV0KCkgbWFzdGVyUmVwb3J0TGlzdD86IERlc2lnbmVyTlMuUmVwb3J0UmVzb3VyY2VJbmZvW107XG5cdC8qKiBTZXRzIGV4dGVybmFsIGltYWdlIGxpc3QuICovXG4gIEBJbnB1dCgpIGltYWdlTGlzdD86IERlc2lnbmVyTlMuSW1hZ2VSZXNvdXJjZUluZm9bXTtcblx0LyoqIFNldHMgdGhlbWUgbGlzdC4gKi9cbiAgQElucHV0KCkgdGhlbWVMaXN0PzogRGVzaWduZXJOUy5UaGVtZVJlc291cmNlSW5mb1tdO1xuXG4gIHByaXZhdGUgX2FjdGlvbkhhbmRsZXJzOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzID0ge307XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbiByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJuIFByb21pc2Ugd2l0aCByZXBvcnQgaW5mbyBvciAndW5kZWZpbmVkJyBpZiBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZC5cblx0ICovXG4gIEBJbnB1dCgpIHNldCBvbkNyZWF0ZSh2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25DcmVhdGUnXSkge1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uQ3JlYXRlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG4gIH1cbiAgZ2V0IG9uQ3JlYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vbkNyZWF0ZTtcbiAgfVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIG9wZW5pbmcgcmVwb3J0LlxuXHQgKiBIYW5kbGVyIHJldHVybnMgUHJvbWlzZSB3aXRoIHJlcG9ydCBpbmZvIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cbiAgQElucHV0KCkgc2V0IG9uT3Blbih2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25PcGVuJ10pIHtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW4gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcbiAgfVxuICBnZXQgb25PcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vbk9wZW47XG4gIH1cblxuXHQvKipcblx0ICogU2V0cyBoYW5kbGVyIHRvIGJlIGNhbGxlZCBvbiByZXF1ZXN0IHRvIHJlbmRlciBjdXJyZW50IHJlcG9ydC5cblx0ICovXG4gIEBJbnB1dCgpIHNldCBvblJlbmRlcih2YWx1ZTogRGVzaWduZXJOUy5BY3Rpb25IYW5kbGVyc1snb25SZW5kZXInXSkge1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uUmVuZGVyID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Rlc2lnbmVyKSB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG4gIH1cbiAgZ2V0IG9uUmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25IYW5kbGVycy5vblJlbmRlcjtcbiAgfVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHNhdmluZyByZXBvcnQuXG5cdCAqIEhhbmRsZXIgcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHJlcG9ydCBpbmZvIGlmIHJlcG9ydCB3YXMgc2F2ZWQgb3IgJ3VuZGVmaW5lZCcgaWYgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQuXG5cdCAqL1xuICBASW5wdXQoKSBzZXQgb25TYXZlKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblNhdmUnXSkge1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9kZXNpZ25lcikgdGhpcy5fZGVzaWduZXIuc2V0QWN0aW9uSGFuZGxlcnModGhpcy5fYWN0aW9uSGFuZGxlcnMpO1xuICB9XG4gIGdldCBvblNhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZTtcbiAgfVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhhbmRsZXIgdG8gYmUgY2FsbGVkIG9uIHNhdmluZyByZXBvcnQgYXMgbmV3LlxuXHQgKiBIYW5kbGVyIHJldHVybnMgUHJvbWlzZSB3aXRoIG5ldyByZXBvcnQgaW5mbyBpZiByZXBvcnQgd2FzIHNhdmVkIG9yICd1bmRlZmluZWQnIGlmIG9wZXJhdGlvbiB3YXMgY2FuY2VsbGVkLlxuXHQgKi9cbiAgQElucHV0KCkgc2V0IG9uU2F2ZUFzKHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvblNhdmVBcyddKSB7XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlcnMub25TYXZlQXMgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcbiAgfVxuICBnZXQgb25TYXZlQXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uU2F2ZUFzO1xuICB9XG5cblx0LyoqXG5cdCAqIFNldHMgaGFuZGxlciB0byBiZSBjYWxsZWQgb24gb3BlbiBjdXN0b20gZmlsZSBtZW51LlxuXHQgKi9cbiAgQElucHV0KCkgc2V0IG9uT3BlbkZpbGVNZW51KHZhbHVlOiBEZXNpZ25lck5TLkFjdGlvbkhhbmRsZXJzWydvbk9wZW5GaWxlTWVudSddKSB7XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlcnMub25PcGVuRmlsZU1lbnUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fZGVzaWduZXIpIHRoaXMuX2Rlc2lnbmVyLnNldEFjdGlvbkhhbmRsZXJzKHRoaXMuX2FjdGlvbkhhbmRsZXJzKTtcbiAgfVxuICBnZXQgb25PcGVuRmlsZU1lbnUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbkhhbmRsZXJzLm9uT3BlbkZpbGVNZW51O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVwb3J0OiBEZXNpZ25lck5TLlJlcG9ydDtcblxuICBwcml2YXRlIF9kaXNwb3NhYmxlczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICAvKipcbiAgICogV2F0Y2ggcmVwb3J0IHByb3BlcnR5XG4gICovXG4gIEBJbnB1dCgpIHNldCByZXBvcnQodmFsdWU6IERlc2lnbmVyTlMuUmVwb3J0KSB7XG4gICAgaWYgKGhhc1JlcG9ydENoYW5nZWQodmFsdWUsIHRoaXMuX3JlcG9ydCkpIHtcbiAgICAgIHRoaXMuX3JlcG9ydCA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlKSB0aGlzLnNldFJlcG9ydCh2YWx1ZSAsICdvdmVycmlkZScpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZGVzaWduZXIuY3JlYXRlUmVwb3J0KHsgcmVwb3J0VHlwZTogJ0NQTCcgfSwgJ292ZXJyaWRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIGRvY3VtZW50Q2hhbmdlZCBldmVudC4gKi9cbiAgQE91dHB1dCgpIGRvY3VtZW50Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RG9jdW1lbnRDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLm9uSW5pdD8uKCk7XG4gICAgdGhpcy5fZGVzaWduZXIgPSBuZXcgRGVzaWduZXJOUy5EZXNpZ25lcih0aGlzLnJvb3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fZGVzaWduZXIuc2V0UmVzb3VyY2VQcm92aWRlcih7XG4gICAgICBnZXRJbWFnZXNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLmltYWdlTGlzdCB8fCBbXSxcbiAgICAgIGdldFJlcG9ydHNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnJlcG9ydExpc3QgfHwgW10sXG4gICAgICBnZXRNYXN0ZXJSZXBvcnRMaXN0OiBhc3luYyAoKSA9PiB0aGlzLm1hc3RlclJlcG9ydExpc3QgfHwgW10sXG4gICAgICBnZXRUaGVtZXNMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnRoZW1lTGlzdCB8fCBbXSxcbiAgICB9KTtcbiAgICB0aGlzLl9kZXNpZ25lci5zZXRBY3Rpb25IYW5kbGVycyh0aGlzLl9hY3Rpb25IYW5kbGVycyk7XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZXMpIHRoaXMuX2Rlc2lnbmVyLnNldERhdGFTb3VyY2VUZW1wbGF0ZXModGhpcy5fZGF0YVNvdXJjZXMgfHwgW10pO1xuICAgIGlmICh0aGlzLl9yZXBvcnQpIHRoaXMuc2V0UmVwb3J0KHRoaXMuX3JlcG9ydCwgJ292ZXJyaWRlJyk7XG5cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKFxuICAgICAgdGhpcy5fZGVzaWduZXIuZG9jdW1lbnRDaGFuZ2VkLnJlZ2lzdGVyKGFyZ3MgPT4gdGhpcy5kb2N1bWVudENoYW5nZWQuZW1pdChhcmdzKSksXG4gICAgKTtcbiAgfVxuXG5cdC8qKlxuXHQgKiBTZXRzIHJlcG9ydC5cblx0ICogQHBhcmFtIHJlcG9ydCBSZXBvcnQgaW5mbyB0byBsb2FkLlxuXHQgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG4gICAqIEBwYXJhbSBpc0RpcnR5SW5pdGlhbCBJbml0aWFsIHZhbHVlIGZvciAnZGlydHknIHN0YXRlIGFmdGVyIGxvYWQuXG5cdCAqL1xuICBzZXRSZXBvcnQocmVwb3J0OiBEZXNpZ25lck5TLlJlcG9ydCwgd2hlbkRpcnR5PzogRGVzaWduZXJOUy5XaGVuRGlydHksIGlzRGlydHlJbml0aWFsPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fZGVzaWduZXIpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIHJldHVybiB0aGlzLl9kZXNpZ25lci5zZXRSZXBvcnQocmVwb3J0LCB3aGVuRGlydHksIGlzRGlydHlJbml0aWFsKTtcbiAgfVxuXG4gIC8qKiBHZXRzIGN1cnJlbnQgcmVwb3J0LiAqL1xuICBnZXRSZXBvcnQoKTogUHJvbWlzZTxEZXNpZ25lck5TLlJlcG9ydEluZm8+IHtcbiAgICBpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkgYXMgYW55O1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmdldFJlcG9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAgKiBDcmVhdGVzIHJlcG9ydC5cbiAgICAqIEBwYXJhbSByZXBvcnRJbmZvIFJlcG9ydCBpbmZvIHRvIGxvYWQuXG4gICAgKiBAcGFyYW0gd2hlbkRpcnR5IEFjdGlvbiB0byBwZXJmb3JtIGluIGNhc2Ugb2YgJ2RpcnR5JyByZXBvcnQuXG4gICAgKi9cbiAgY3JlYXRlUmVwb3J0KHJlcG9ydEluZm86IERlc2lnbmVyTlMuTmV3UmVwb3J0SW5mbywgd2hlbkRpcnR5PzogRGVzaWduZXJOUy5XaGVuRGlydHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2Rlc2lnbmVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2lnbmVyLmNyZWF0ZVJlcG9ydChyZXBvcnRJbmZvLCB3aGVuRGlydHkpO1xuICB9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgY29tbWFuZC5cblx0ICogQHBhcmFtIGNtZCBDb21tYW5kIG5hbWUuXG5cdCAqL1xuICBwcm9jZXNzQ29tbWFuZChjbWQ6IERlc2lnbmVyTlMuRGVzaWduZXJDb21tYW5kKSB7XG4gICAgaWYgKCF0aGlzLl9kZXNpZ25lcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2Rlc2lnbmVyLnByb2Nlc3NDb21tYW5kKGNtZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmb2N1cyB0byBEZXNpZ25lci5cbiAgICovXG5cdGZvY3VzKCkge1xuXHRcdGlmKHRoaXMuX2Rlc2lnbmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIkRlc2lnbmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcIik7XG5cdFx0dGhpcy5fZGVzaWduZXIuZm9jdXMoKTtcblx0fVxuXG5cdC8qKlxuICAgKiBHZXRzIEFQSSB0byBtYW5pcHVsYXRlIGRlc2lnbmVyLlxuICAgKi9cbiAgZ2V0RWRpdG9yQVBJKCk6IFByb21pc2U8RGVzaWduZXJOUy5FZGl0b3JBUEk+IHtcblx0XHRpZih0aGlzLl9kZXNpZ25lciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJEZXNpZ25lciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0XCIpO1xuXHRcdHJldHVybiB0aGlzLl9kZXNpZ25lci5nZXRFZGl0b3JBUEkoKTtcblx0fVxuXG5cdC8qXG4gICAqIEFjY2VzcyB0byB0aGUgbWVudSBhbmQgc2lkZWJhciBwYW5lbHNcbiAgICovXG5cdGdldFBhbmVsc0FQSSgpOiBQcm9taXNlPERlc2lnbmVyTlMuUGFuZWxzQVBJPiB7XG5cdFx0aWYodGhpcy5fZGVzaWduZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldFwiKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuZ2V0UGFuZWxzQVBJKCk7XG5cdH1cblxuXHQvKlxuICAgKiBNYW5pcHVsYXRlIG5vdGlmaWNhdGlvbnMgcGFuZWwuXG4gICAqL1xuXHRnZXROb3RpZmljYXRpb25zQVBJKCk6IFByb21pc2U8RGVzaWduZXJOUy5Ob3RpZmljYXRpb25zQVBJPiB7XG5cdFx0aWYodGhpcy5fZGVzaWduZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiRGVzaWduZXIgaXMgbm90IGluaXRpYWxpemVkIHlldFwiKTtcblx0XHRyZXR1cm4gdGhpcy5fZGVzaWduZXIuZ2V0Tm90aWZpY2F0aW9uc0FQSSgpO1xuXHR9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuc2hpZnQoKSEoKTtcbiAgICB9XG4gICAgLy8gdGhpcy5fZGVzaWduZXIuZGlzcG9zZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNkZXNpZ25lclJvb3QgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIj48L2Rpdj5cbiJdfQ==