bways-report 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -51
- package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
- package/esm2022/lib/core/index.mjs +3 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
- package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
- package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
- package/esm2022/lib/data-access/adapters/index.mjs +8 -3
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
- package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
- package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
- package/esm2022/lib/data-access/contracts/index.mjs +2 -1
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +555 -92
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +410 -12
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +149 -2
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +109 -6
- package/esm2022/lib/features/designer/designer.component.mjs +101 -12
- package/esm2022/lib/features/designer/index.mjs +4 -1
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
- package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
- package/esm2022/lib/features/export/index.mjs +2 -2
- package/esm2022/lib/features/export/models/export.models.mjs +1 -1
- package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
- package/esm2022/lib/features/runtime/index.mjs +2 -1
- package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +145 -24
- package/fesm2022/bways-report.mjs +6871 -753
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/index.d.ts +2 -0
- package/lib/core/models/report-datasource.model.d.ts +9 -0
- package/lib/core/models/report-definition.model.d.ts +2 -0
- package/lib/core/models/report-grid.model.d.ts +44 -0
- package/lib/core/services/report-session-context.service.d.ts +6 -1
- package/lib/core/utils/data-normalization.util.d.ts +15 -0
- package/lib/core/utils/report-parameter.util.d.ts +35 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
- package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
- package/lib/data-access/adapters/index.d.ts +7 -2
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
- package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
- package/lib/data-access/contracts/api-dtos.d.ts +67 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +5 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -0
- package/lib/features/designer/designer.component.d.ts +5 -0
- package/lib/features/designer/index.d.ts +4 -0
- package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
- package/lib/features/designer/services/designer-state.service.d.ts +1 -1
- package/lib/features/designer/services/report-template.service.d.ts +32 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
- package/lib/features/export/index.d.ts +2 -2
- package/lib/features/export/models/export.models.d.ts +23 -0
- package/lib/features/export/services/report-export.service.d.ts +31 -2
- package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
- package/lib/features/runtime/index.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +16 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
- package/lib/features/runtime/report-runtime.component.d.ts +83 -1
- package/lib/features/runtime/rpt-report.component.d.ts +66 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
- package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/provide-reporting.d.ts +79 -26
- package/package.json +2 -1
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.js +45 -0
- package/schematics/ng-add/schema.json +17 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { throwError } from 'rxjs';
|
|
3
|
+
import { ReportDataSourceAdapter } from '../../data-access/contracts/data-source.contract';
|
|
4
|
+
import { ReportSessionContextService } from '../../core/services/report-session-context.service';
|
|
5
|
+
import { findMissingCanvasFields, resolveExecutionDataSource, resolveParameterMappings, } from '../../core/utils/report-parameter.util';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Runs a report's result query. Shared by the Live Runtime, the designer's
|
|
9
|
+
* Live Preview and the designer canvas so all three behave identically.
|
|
10
|
+
*/
|
|
11
|
+
export class ReportExecutionService {
|
|
12
|
+
adapter = inject(ReportDataSourceAdapter, { optional: true });
|
|
13
|
+
session = inject(ReportSessionContextService, { optional: true });
|
|
14
|
+
/** Canvas field keys the user still has to fill before the report can run. */
|
|
15
|
+
getMissingFields(def, formValues) {
|
|
16
|
+
const ds = resolveExecutionDataSource(def);
|
|
17
|
+
return findMissingCanvasFields(ds?.parameterMappings, formValues);
|
|
18
|
+
}
|
|
19
|
+
execute(def, formValues) {
|
|
20
|
+
const ds = resolveExecutionDataSource(def);
|
|
21
|
+
if (!ds) {
|
|
22
|
+
return throwError(() => new Error('No data source configured. Select the Run Report button and choose a stored procedure in its Report Data section.'));
|
|
23
|
+
}
|
|
24
|
+
if (!this.adapter) {
|
|
25
|
+
return throwError(() => new Error('No ReportDataSourceAdapter provided to execute the data source.'));
|
|
26
|
+
}
|
|
27
|
+
const session = this.session?.getCurrentSessionContext() ?? {};
|
|
28
|
+
const resolved = resolveParameterMappings(ds.parameterMappings, session, formValues);
|
|
29
|
+
// Expand compound objects (e.g. dateRange: { from, to }) into top-level parameters
|
|
30
|
+
const flattenedFormValues = { ...formValues };
|
|
31
|
+
for (const [k, v] of Object.entries(formValues)) {
|
|
32
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
33
|
+
const obj = v;
|
|
34
|
+
if ('from' in obj && 'to' in obj) {
|
|
35
|
+
flattenedFormValues[`${k}_from`] = obj['from'];
|
|
36
|
+
flattenedFormValues[`${k}_to`] = obj['to'];
|
|
37
|
+
flattenedFormValues[`${k}From`] = obj['from'];
|
|
38
|
+
flattenedFormValues[`${k}To`] = obj['to'];
|
|
39
|
+
flattenedFormValues[`@${k}_from`] = obj['from'];
|
|
40
|
+
flattenedFormValues[`@${k}_to`] = obj['to'];
|
|
41
|
+
flattenedFormValues[`@${k}From`] = obj['from'];
|
|
42
|
+
flattenedFormValues[`@${k}To`] = obj['to'];
|
|
43
|
+
if (!flattenedFormValues['fromDate'])
|
|
44
|
+
flattenedFormValues['fromDate'] = obj['from'];
|
|
45
|
+
if (!flattenedFormValues['toDate'])
|
|
46
|
+
flattenedFormValues['toDate'] = obj['to'];
|
|
47
|
+
if (!flattenedFormValues['@fromDate'])
|
|
48
|
+
flattenedFormValues['@fromDate'] = obj['from'];
|
|
49
|
+
if (!flattenedFormValues['@toDate'])
|
|
50
|
+
flattenedFormValues['@toDate'] = obj['to'];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const params = { ...flattenedFormValues, ...resolved };
|
|
55
|
+
return this.adapter.execute({ ...ds, name: ds.name || ds.endpoint, type: ds.type ?? 'stored_procedure' }, params);
|
|
56
|
+
}
|
|
57
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExecutionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
58
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExecutionService, providedIn: 'root' });
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExecutionService, decorators: [{
|
|
61
|
+
type: Injectable,
|
|
62
|
+
args: [{ providedIn: 'root' }]
|
|
63
|
+
}] });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4ZWN1dGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvcnVudGltZS9yZXBvcnQtZXhlY3V0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNqRyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQix3QkFBd0IsR0FDekIsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFFaEQ7OztHQUdHO0FBRUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNoQixPQUFPLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUQsT0FBTyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRW5GLDhFQUE4RTtJQUM5RSxnQkFBZ0IsQ0FBQyxHQUFxQixFQUFFLFVBQW1DO1FBQ3pFLE1BQU0sRUFBRSxHQUFHLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sdUJBQXVCLENBQUMsRUFBRSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBcUIsRUFBRSxVQUFtQztRQUNoRSxNQUFNLEVBQUUsR0FBRywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRSxF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QUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxFQUM1RSxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUM7d0dBdkRVLHNCQUFzQjs0R0FBdEIsc0JBQXNCLGNBRFQsTUFBTTs7NEZBQ25CLHNCQUFzQjtrQkFEbEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9kYXRhLXNvdXJjZS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQge1xuICBmaW5kTWlzc2luZ0NhbnZhc0ZpZWxkcyxcbiAgcmVzb2x2ZUV4ZWN1dGlvbkRhdGFTb3VyY2UsXG4gIHJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyxcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9yZXBvcnQtcGFyYW1ldGVyLnV0aWwnO1xuXG4vKipcbiAqIFJ1bnMgYSByZXBvcnQncyByZXN1bHQgcXVlcnkuIFNoYXJlZCBieSB0aGUgTGl2ZSBSdW50aW1lLCB0aGUgZGVzaWduZXInc1xuICogTGl2ZSBQcmV2aWV3IGFuZCB0aGUgZGVzaWduZXIgY2FudmFzIHNvIGFsbCB0aHJlZSBiZWhhdmUgaWRlbnRpY2FsbHkuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhlY3V0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlciA9IGluamVjdChSZXBvcnREYXRhU291cmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uID0gaW5qZWN0KFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKiogQ2FudmFzIGZpZWxkIGtleXMgdGhlIHVzZXIgc3RpbGwgaGFzIHRvIGZpbGwgYmVmb3JlIHRoZSByZXBvcnQgY2FuIHJ1bi4gKi9cbiAgZ2V0TWlzc2luZ0ZpZWxkcyhkZWY6IFJlcG9ydERlZmluaXRpb24sIGZvcm1WYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRzID0gcmVzb2x2ZUV4ZWN1dGlvbkRhdGFTb3VyY2UoZGVmKTtcbiAgICByZXR1cm4gZmluZE1pc3NpbmdDYW52YXNGaWVsZHMoZHM/LnBhcmFtZXRlck1hcHBpbmdzLCBmb3JtVmFsdWVzKTtcbiAgfVxuXG4gIGV4ZWN1dGUoZGVmOiBSZXBvcnREZWZpbml0aW9uLCBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE9ic2VydmFibGU8dW5rbm93bltdPiB7XG4gICAgY29uc3QgZHMgPSByZXNvbHZlRXhlY3V0aW9uRGF0YVNvdXJjZShkZWYpO1xuICAgIGlmICghZHMpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdObyBkYXRhIHNvdXJjZSBjb25maWd1cmVkLiBTZWxlY3QgdGhlIFJ1biBSZXBvcnQgYnV0dG9uIGFuZCBjaG9vc2UgYSBzdG9yZWQgcHJvY2VkdXJlIGluIGl0cyBSZXBvcnQgRGF0YSBzZWN0aW9uLidcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdObyBSZXBvcnREYXRhU291cmNlQWRhcHRlciBwcm92aWRlZCB0byBleGVjdXRlIHRoZSBkYXRhIHNvdXJjZS4nKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvbj8uZ2V0Q3VycmVudFNlc3Npb25Db250ZXh0KCkgPz8ge307XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlUGFyYW1ldGVyTWFwcGluZ3MoZHMucGFyYW1ldGVyTWFwcGluZ3MsIHNlc3Npb24sIGZvcm1WYWx1ZXMpO1xuXG4gICAgLy8gRXhwYW5kIGNvbXBvdW5kIG9iamVjdHMgKGUuZy4gZGF0ZVJhbmdlOiB7IGZyb20sIHRvIH0pIGludG8gdG9wLWxldmVsIHBhcmFtZXRlcnNcbiAgICBjb25zdCBmbGF0dGVuZWRGb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uZm9ybVZhbHVlcyB9O1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGZvcm1WYWx1ZXMpKSB7XG4gICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgaWYgKCdmcm9tJyBpbiBvYmogJiYgJ3RvJyBpbiBvYmopIHtcbiAgICAgICAgICBmbGF0dGVuZWRGb3JtVmFsdWVzW2Ake2t9X2Zyb21gXSA9IG9ialsnZnJvbSddO1xuICAgICAgICAgIGZsYXR0ZW5lZEZvcm1WYWx1ZXNbYCR7a31fdG9gXSA9IG9ialsndG8nXTtcbiAgICAgICAgICBmbGF0dGVuZWRGb3JtVmFsdWVzW2Ake2t9RnJvbWBdID0gb2JqWydmcm9tJ107XG4gICAgICAgICAgZmxhdHRlbmVkRm9ybVZhbHVlc1tgJHtrfVRvYF0gPSBvYmpbJ3RvJ107XG4gICAgICAgICAgZmxhdHRlbmVkRm9ybVZhbHVlc1tgQCR7a31fZnJvbWBdID0gb2JqWydmcm9tJ107XG4gICAgICAgICAgZmxhdHRlbmVkRm9ybVZhbHVlc1tgQCR7a31fdG9gXSA9IG9ialsndG8nXTtcbiAgICAgICAgICBmbGF0dGVuZWRGb3JtVmFsdWVzW2BAJHtrfUZyb21gXSA9IG9ialsnZnJvbSddO1xuICAgICAgICAgIGZsYXR0ZW5lZEZvcm1WYWx1ZXNbYEAke2t9VG9gXSA9IG9ialsndG8nXTtcbiAgICAgICAgICBpZiAoIWZsYXR0ZW5lZEZvcm1WYWx1ZXNbJ2Zyb21EYXRlJ10pIGZsYXR0ZW5lZEZvcm1WYWx1ZXNbJ2Zyb21EYXRlJ10gPSBvYmpbJ2Zyb20nXTtcbiAgICAgICAgICBpZiAoIWZsYXR0ZW5lZEZvcm1WYWx1ZXNbJ3RvRGF0ZSddKSBmbGF0dGVuZWRGb3JtVmFsdWVzWyd0b0RhdGUnXSA9IG9ialsndG8nXTtcbiAgICAgICAgICBpZiAoIWZsYXR0ZW5lZEZvcm1WYWx1ZXNbJ0Bmcm9tRGF0ZSddKSBmbGF0dGVuZWRGb3JtVmFsdWVzWydAZnJvbURhdGUnXSA9IG9ialsnZnJvbSddO1xuICAgICAgICAgIGlmICghZmxhdHRlbmVkRm9ybVZhbHVlc1snQHRvRGF0ZSddKSBmbGF0dGVuZWRGb3JtVmFsdWVzWydAdG9EYXRlJ10gPSBvYmpbJ3RvJ107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IC4uLmZsYXR0ZW5lZEZvcm1WYWx1ZXMsIC4uLnJlc29sdmVkIH07XG5cbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmV4ZWN1dGUoXG4gICAgICB7IC4uLmRzLCBuYW1lOiBkcy5uYW1lIHx8IGRzLmVuZHBvaW50LCB0eXBlOiBkcy50eXBlID8/ICdzdG9yZWRfcHJvY2VkdXJlJyB9LFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxufVxuIl19
|