bways-report 0.1.6 → 0.1.8
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 +293 -464
- package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
- package/esm2022/lib/core/index.mjs +2 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
- package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
- package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
- package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
- package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
- package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
- package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
- package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
- package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
- package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
- package/esm2022/lib/data-access/adapters/index.mjs +8 -1
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
- package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
- package/esm2022/lib/features/designer/designer.component.mjs +276 -21
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
- package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
- package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
- package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
- package/esm2022/lib/features/embed/index.mjs +5 -0
- package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
- package/esm2022/lib/features/index.mjs +2 -1
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
- package/esm2022/lib/features/routing/index.mjs +2 -2
- package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
- package/esm2022/lib/features/routing/report-routes.mjs +42 -1
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
- package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
- 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/components/number/rpt-number.component.mjs +9 -3
- package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
- package/esm2022/lib/provide-reporting.mjs +137 -7
- package/fesm2022/bways-report.mjs +4286 -859
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/config/bways-report-config.d.ts +161 -0
- package/lib/core/index.d.ts +1 -0
- package/lib/core/models/report-definition.model.d.ts +16 -0
- package/lib/core/services/report-session-context.service.d.ts +1 -0
- package/lib/core/tokens/reporting-config.token.d.ts +16 -0
- package/lib/core/utils/data-normalization.util.d.ts +10 -0
- package/lib/core/utils/report-parameter.util.d.ts +18 -1
- package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
- package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
- package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
- package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
- package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
- package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
- package/lib/data-access/adapters/index.d.ts +7 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
- package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
- package/lib/features/designer/designer.component.d.ts +15 -0
- package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
- package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
- package/lib/features/embed/bways-report-page.component.d.ts +61 -0
- package/lib/features/embed/index.d.ts +4 -0
- package/lib/features/embed/inject-report-menu.d.ts +44 -0
- package/lib/features/index.d.ts +1 -0
- package/lib/features/persistence/services/report-store.service.d.ts +5 -0
- package/lib/features/routing/index.d.ts +1 -1
- package/lib/features/routing/models/report-route.models.d.ts +3 -0
- package/lib/features/routing/report-routes.d.ts +40 -0
- package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
- package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
- package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
- package/lib/provide-reporting.d.ts +22 -6
- package/package.json +1 -1
|
@@ -92,11 +92,18 @@ export class DesignerStateService {
|
|
|
92
92
|
label: meta?.displayName ?? type,
|
|
93
93
|
key: `${type}_${Math.random().toString(36).substring(2, 6)}`,
|
|
94
94
|
};
|
|
95
|
+
const existingKeys = new Set(this.definition().components.map((c) => c.key).filter(Boolean));
|
|
96
|
+
const baseKey = overrides?.key ?? defaultConfig.key ?? `${type}_${Math.random().toString(36).substring(2, 6)}`;
|
|
97
|
+
let uniqueKey = baseKey;
|
|
98
|
+
let counter = 1;
|
|
99
|
+
while (existingKeys.has(uniqueKey)) {
|
|
100
|
+
uniqueKey = `${baseKey}_${counter++}`;
|
|
101
|
+
}
|
|
95
102
|
const newComponent = {
|
|
96
103
|
id: generateId(type),
|
|
97
104
|
type,
|
|
98
105
|
label: overrides?.label ?? defaultConfig.label ?? meta?.displayName ?? type,
|
|
99
|
-
key:
|
|
106
|
+
key: uniqueKey,
|
|
100
107
|
order: 0,
|
|
101
108
|
layout: {
|
|
102
109
|
columnSpan: overrides?.layout?.columnSpan ?? defaultConfig.layout?.columnSpan ?? (type === 'button' ? 2 : 4),
|
|
@@ -375,4 +382,4 @@ export class DesignerStateService {
|
|
|
375
382
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerStateService, decorators: [{
|
|
376
383
|
type: Injectable
|
|
377
384
|
}] });
|
|
378
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxpQ0FBaUM7SUFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBb0IsWUFBWSxDQUFDLENB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Qjs0R0FBcEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1sYXlvdXQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kYXRhc291cmNlLm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbGl0aWVzL2lkLWdlbmVyYXRvcic7XG5cbmV4cG9ydCB0eXBlIERlc2lnbmVyVmlld01vZGUgPSAnZGVzaWduJyB8ICdwcmV2aWV3JyB8ICdqc29uJztcbmV4cG9ydCB0eXBlIERlc2lnbmVyQWN0aXZlVGFiID0gJ3Byb3BlcnRpZXMnIHwgJ3JlcG9ydCcgfCAnZ3JpZCc7XG5cbmNvbnN0IE1BWF9ISVNUT1JZID0gMzA7XG5cbi8qKlxuICogRGVzaWduZXJTdGF0ZVNlcnZpY2UgY29vcmRpbmF0ZXMgc3RhdGUgZm9yIHRoZSB2aXN1YWwgcmVwb3J0IGRlc2lnbmVyLlxuICpcbiAqIFNjb3BlZCBhdCB0aGUgRGVzaWduZXIgY29tcG9uZW50IGxldmVsIChub3Qgcm9vdCkgdG8gZW5zdXJlIG11bHRpcGxlIGRlc2lnbmVyXG4gKiBpbnN0YW5jZXMgb3IgbmF2aWdhdGlvbiBmbG93cyByZW1haW4gc3RyaWN0bHkgaXNvbGF0ZWQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXNpZ25lclN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaXN0cnkgPSBpbmplY3QoQ29tcG9uZW50UmVnaXN0cnkpO1xuXG4gIC8qKiBDdXJyZW50IGFjdGl2ZSByZXBvcnQgZGVmaW5pdGlvbiAqL1xuICByZWFkb25seSBkZWZpbml0aW9uID0gc2lnbmFsPFJlcG9ydERlZmluaXRpb24+KHtcbiAgICBpZDogZ2VuZXJhdGVJZCgncnB0JyksXG4gICAgbmFtZTogJ1VudGl0bGVkIFJlcG9ydCcsXG4gICAgc2NoZW1hVmVyc2lvbjogMSxcbiAgICB2ZXJzaW9uOiAxLFxuICAgIGxheW91dDogeyBjb2x1bW5zOiAxMiwgZ2FwOiAxNiwgcGFkZGluZzogMjQsIGRpcmVjdGlvbjogJ2x0cicgfSxcbiAgICBjb21wb25lbnRzOiBbXSxcbiAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICBkYXRhU291cmNlczogW10sXG4gIH0pO1xuXG4gIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSUQgaW4gY2FudmFzICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29tcG9uZW50SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIEFjdGl2ZSBwcm9wZXJ0eSBlZGl0b3IgdGFiICovXG4gIHJlYWRvbmx5IGFjdGl2ZVRhYiA9IHNpZ25hbDxEZXNpZ25lckFjdGl2ZVRhYj4oJ3Byb3BlcnRpZXMnKTtcblxuICAvKiogQ3VycmVudCB2aWV3IG1vZGUgKGRlc2lnbiwgcHJldmlldywgb3IgcmF3IGpzb24pICovXG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gc2lnbmFsPERlc2lnbmVyVmlld01vZGU+KCdkZXNpZ24nKTtcblxuICAvKiogRGlydHkgZmxhZyBpbmRpY2F0aW5nIHVuc2F2ZWQgY2hhbmdlcyAqL1xuICByZWFkb25seSBpc0RpcnR5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBIaXN0b3J5IHN0YWNrIGZvciBVbmRvIC8gUmVkb1xuICBwcml2YXRlIHJlYWRvbmx5IGhpc3RvcnkgPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIHJlYWRvbmx5IGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID4gMCk7XG4gIHJlYWRvbmx5IGNhblJlZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmhpc3RvcnlJbmRleCgpID49IDAgJiYgdGhpcy5oaXN0b3J5SW5kZXgoKSA8IHRoaXMuaGlzdG9yeSgpLmxlbmd0aCAtIDEpO1xuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgY29tcG9uZW50IGluc3RhbmNlLCBvciBudWxsIGlmIG5vbmUgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSBjb21wdXRlZDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5pZCA9PT0gaWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBvciByZWxvYWRzIGEgcmVwb3J0IGRlZmluaXRpb24gaW50byB0aGUgZGVzaWduZXIuXG4gICAqL1xuICBsb2FkRGVmaW5pdGlvbihkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZikpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChjbG9uZWQpO1xuXG4gICAgLy8gUHJlc2VydmUgYWN0aXZlIGNvbXBvbmVudCBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzIGluIHRoZSBsb2FkZWQgZGVmaW5pdGlvblxuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZElkID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCk7XG4gICAgaWYgKGN1cnJlbnRTZWxlY3RlZElkICYmIGNsb25lZC5jb21wb25lbnRzLnNvbWUoKGMpID0+IGMuaWQgPT09IGN1cnJlbnRTZWxlY3RlZElkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChjdXJyZW50U2VsZWN0ZWRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZC5zZXQobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0RpcnR5LnNldChmYWxzZSk7XG4gICAgdGhpcy5oaXN0b3J5LnNldChbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjbG9uZWQpKV0pO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgY29tcG9uZW50IGZvciBwcm9wZXJ0eSBlZGl0aW5nLlxuICAgKi9cbiAgc2VsZWN0Q29tcG9uZW50KGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChpZCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoJ3Byb3BlcnRpZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIHZpZXcgbW9kZSAoZGVzaWduLCBsaXZlIHByZXZpZXcsIGpzb24gc2NoZW1hKS5cbiAgICovXG4gIHNldFZpZXdNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlLnNldChtb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIHRhYi5cbiAgICovXG4gIHNldEFjdGl2ZVRhYih0YWI6IERlc2lnbmVyQWN0aXZlVGFiKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KHRhYik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBjb21wb25lbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9udG8gdGhlIGNhbnZhcy5cbiAgICovXG4gIGFkZENvbXBvbmVudChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgdGFyZ2V0SW5kZXg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxSZXBvcnRDb21wb25lbnREZWZpbml0aW9uPlxuICApOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKHR5cGUpO1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBtZXRhPy5jcmVhdGVEZWZhdWx0Q29uZmlnKCkgPz8ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG1ldGE/LmRpc3BsYXlOYW1lID8/IHR5cGUsXG4gICAgICBrZXk6IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWAsXG4gICAgfTtcblxuICAgIGNvbnN0IG5ld0NvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZUlkKHR5cGUpLFxuICAgICAgdHlwZSxcbiAgICAgIGxhYmVsOiBvdmVycmlkZXM/LmxhYmVsID8/IGRlZmF1bHRDb25maWcubGFiZWwgPz8gbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogb3ZlcnJpZGVzPy5rZXkgPz8gZGVmYXVsdENvbmZpZy5rZXkgPz8gYCR7dHlwZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNil9YCxcbiAgICAgIG9yZGVyOiAwLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgIGNvbHVtblNwYW46IG92ZXJyaWRlcz8ubGF5b3V0Py5jb2x1bW5TcGFuID8/IGRlZmF1bHRDb25maWcubGF5b3V0Py5jb2x1bW5TcGFuID8/ICh0eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KSxcbiAgICAgICAgLi4uZGVmYXVsdENvbmZpZy5sYXlvdXQsXG4gICAgICAgIC4uLm92ZXJyaWRlcz8ubGF5b3V0LFxuICAgICAgfSxcbiAgICAgIHByb3BlcnRpZXM6IHsgLi4uKGRlZmF1bHRDb25maWcucHJvcGVydGllcyA/PyB7fSksIC4uLihvdmVycmlkZXM/LnByb3BlcnRpZXMgPz8ge30pIH0sXG4gICAgICB2YWxpZGF0aW9uOiBvdmVycmlkZXM/LnZhbGlkYXRpb24gPz8gKGRlZmF1bHRDb25maWcudmFsaWRhdGlvbiA/IHsgLi4uZGVmYXVsdENvbmZpZy52YWxpZGF0aW9uIH0gOiB1bmRlZmluZWQpLFxuICAgICAgZGF0YVNvdXJjZTogb3ZlcnJpZGVzPy5kYXRhU291cmNlID8/IChkZWZhdWx0Q29uZmlnLmRhdGFTb3VyY2UgPyB7IC4uLmRlZmF1bHRDb25maWcuZGF0YVNvdXJjZSB9IDogdW5kZWZpbmVkKSxcbiAgICAgIGVuYWJsZWQ6IG92ZXJyaWRlcz8uZW5hYmxlZCA/PyBkZWZhdWx0Q29uZmlnLmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBpZiAodGFyZ2V0SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRJbmRleCA+PSAwICYmIHRhcmdldEluZGV4IDw9IGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHRhcmdldEluZGV4LCAwLCBuZXdDb21wb25lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Q29tcG9uZW50cy5wdXNoKG5ld0NvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gUmVjYWxjdWxhdGUgb3JkZXIgaW5kaWNlc1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KG5ld0NvbXBvbmVudC5pZCk7XG4gICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IGl0cyBJRC5cbiAgICovXG4gIHJlbW92ZUNvbXBvbmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbHRlcigoYykgPT4gYy5pZCAhPT0gaWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvbmVudElkKCkgPT09IGlkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIER1cGxpY2F0ZXMgYW4gZXhpc3RpbmcgY29tcG9uZW50LlxuICAgKi9cbiAgZHVwbGljYXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbmQoKGMpID0+IGMuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGR1cGxpY2F0ZWQ6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gPSB7XG4gICAgICAuLi5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSksXG4gICAgICBpZDogZ2VuZXJhdGVJZChleGlzdGluZy50eXBlKSxcbiAgICAgIGtleTogZXhpc3Rpbmcua2V5ID8gYCR7ZXhpc3Rpbmcua2V5fV9jb3B5YCA6IHVuZGVmaW5lZCxcbiAgICAgIGxhYmVsOiBleGlzdGluZy5sYWJlbCA/IGAke2V4aXN0aW5nLmxhYmVsfSAoQ29weSlgIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IFsuLi50aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMClcbiAgICApO1xuICAgIGNvbnN0IGluZGV4ID0gY3VycmVudENvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBjLmlkID09PSBpZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKGluZGV4ICsgMSwgMCwgZHVwbGljYXRlZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQoZHVwbGljYXRlZC5pZCk7XG4gICAgcmV0dXJuIGR1cGxpY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSBjb21wb25lbnQgZnJvbSBwcmV2aW91cyBpbmRleCB0byBjdXJyZW50IGluZGV4IChlLmcuIGZyb20gQ0RLIGRyYWcgZHJvcCkuXG4gICAqL1xuICBtb3ZlQ29tcG9uZW50KHByZXZpb3VzSW5kZXg6IG51bWJlciwgY3VycmVudEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gY3VycmVudEluZGV4KSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IFsuLi50aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMClcbiAgICApO1xuICAgIGlmIChwcmV2aW91c0luZGV4IDwgMCB8fCBwcmV2aW91c0luZGV4ID49IGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnJlbnRJbmRleCwgY3VycmVudENvbXBvbmVudHMubGVuZ3RoIC0gMSkpO1xuXG4gICAgY29uc3QgW21vdmVkXSA9IGN1cnJlbnRDb21wb25lbnRzLnNwbGljZShwcmV2aW91c0luZGV4LCAxKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UodGFyZ2V0SWR4LCAwLCBtb3ZlZCk7XG4gICAgY3VycmVudENvbXBvbmVudHMuZm9yRWFjaCgoYywgaWR4KSA9PiAoYy5vcmRlciA9IGlkeCArIDEpKTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcGFydGlhbCBwcm9wZXJ0aWVzIG9mIGEgY29tcG9uZW50LlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50KGlkOiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYywgLi4udXBkYXRlcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc2luZ2xlIGNvbXBvbmVudCBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4gYHByb3BlcnRpZXNgLlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQ6IHN0cmluZywgcHJvcEtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IHtcbiAgICAgIGlmIChjLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLi4uKGMucHJvcGVydGllcyA/PyB7fSksXG4gICAgICAgICAgICBbcHJvcEtleV06IHZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbGF5b3V0IHByb3BlcnRpZXMgZm9yIGEgY29tcG9uZW50IChlLmcuIGNvbHVtblNwYW4pLlxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50TGF5b3V0KGlkOiBzdHJpbmcsIGxheW91dDogUGFydGlhbDxDb21wb25lbnRMYXlvdXREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5tYXAoKGMpID0+IHtcbiAgICAgIGlmIChjLmlkID09PSBpZCkge1xuICAgICAgICBjb25zdCBuZXh0TGF5b3V0ID0ge1xuICAgICAgICAgIC4uLihjLmxheW91dCA/PyB7fSksXG4gICAgICAgICAgLi4ubGF5b3V0LFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsYXlvdXQpIGFzIChrZXlvZiBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uKVtdKSB7XG4gICAgICAgICAgaWYgKGxheW91dFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXh0TGF5b3V0W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBsYXlvdXQ6IG5leHRMYXlvdXQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgY29tcG9uZW50czogY3VycmVudENvbXBvbmVudHMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcmVwb3J0LWxldmVsIHNldHRpbmdzIChuYW1lLCBkZXNjcmlwdGlvbiwgbGF5b3V0KS5cbiAgICovXG4gIHVwZGF0ZVJlcG9ydFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPFJlcG9ydERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICAuLi5zZXR0aW5ncyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBncmlkIGRlZmluaXRpb24gc2V0dGluZ3MuXG4gICAqL1xuICB1cGRhdGVHcmlkU2V0dGluZ3MoZ3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gfCB1bmRlZmluZWQsIG9wdGlvbnM/OiB7IHNraXBIaXN0b3J5PzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXBIaXN0b3J5KSB7XG4gICAgICB0aGlzLmRlZmluaXRpb24udXBkYXRlKChkZWYpID0+ICh7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgZ3JpZCxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgZ3JpZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvciB1cGRhdGVzIHRoZSBwcmltYXJ5IGRhdGEgc291cmNlIGZvciB0aGUgcmVwb3J0J3MgcmVzdWx0IGdyaWQuXG4gICAqL1xuICBzZXRHcmlkRGF0YVNvdXJjZShkczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdTb3VyY2VzID0gZGVmLmRhdGFTb3VyY2VzID8/IFtdO1xuICAgICAgY29uc3QgaWR4ID0gZXhpc3RpbmdTb3VyY2VzLmZpbmRJbmRleCgocykgPT4gcy5pZCA9PT0gZHMuaWQpO1xuICAgICAgbGV0IG5leHRTb3VyY2VzOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbltdO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIG5leHRTb3VyY2VzID0gWy4uLmV4aXN0aW5nU291cmNlc107XG4gICAgICAgIG5leHRTb3VyY2VzW2lkeF0gPSBkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTb3VyY2VzID0gW2RzLCAuLi5leGlzdGluZ1NvdXJjZXNdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkR3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICAgIC4uLihkZWYuZ3JpZCA/PyB7XG4gICAgICAgICAgZGF0YVNvdXJjZUlkOiBkcy5pZCxcbiAgICAgICAgICBjb2x1bW5zOiBbXSxcbiAgICAgICAgICBvcHRpb25zOiB7IHBhZ2luYXRpb246IHRydWUsIHBhZ2VTaXplOiAyNSwgc2hvd1Jvd051bWJlcnM6IHRydWUsIHNob3dGb290ZXI6IHRydWUgfSxcbiAgICAgICAgfSksXG4gICAgICAgIGRhdGFTb3VyY2VJZDogZHMuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGRhdGFTb3VyY2VzOiBuZXh0U291cmNlcyxcbiAgICAgICAgZ3JpZDogdXBkYXRlZEdyaWQsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBhcmFtZXRlciBtYXBwaW5ncyBmb3IgdGhlIHByaW1hcnkgZ3JpZCBkYXRhIHNvdXJjZS5cbiAgICovXG4gIHVwZGF0ZUdyaWREYXRhU291cmNlUGFyYW1ldGVycyhtYXBwaW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4ge1xuICAgICAgY29uc3QgZ3JpZERzSWQgPSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkO1xuICAgICAgY29uc3Qgc291cmNlcyA9IGRlZi5kYXRhU291cmNlcyA/PyBbXTtcbiAgICAgIGNvbnN0IHRhcmdldElkeCA9IHNvdXJjZXMuZmluZEluZGV4KChzKSA9PiBzLmlkID09PSBncmlkRHNJZCB8fCBzLm5hbWUgPT09IGdyaWREc0lkKTtcblxuICAgICAgaWYgKHRhcmdldElkeCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRTb3VyY2VzID0gWy4uLnNvdXJjZXNdO1xuICAgICAgICBuZXh0U291cmNlc1t0YXJnZXRJZHhdID0ge1xuICAgICAgICAgIC4uLm5leHRTb3VyY2VzW3RhcmdldElkeF0sXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZ3M6IG1hcHBpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZixcbiAgICAgICAgICBkYXRhU291cmNlczogbmV4dFNvdXJjZXMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWY7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJ0cyB0byB0aGUgcHJldmlvdXMgc3RhdGUgaW4gaGlzdG9yeS5cbiAgICovXG4gIHVuZG8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblVuZG8oKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5oaXN0b3J5SW5kZXgoKSAtIDE7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KG5ld0luZGV4KTtcbiAgICBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5oaXN0b3J5KClbbmV3SW5kZXhdKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KHJlc3RvcmVkKTtcbiAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHN0YXRlIGluIGhpc3RvcnkuXG4gICAqL1xuICByZWRvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHJldHVybjtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXdJbmRleCk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeSgpW25ld0luZGV4XSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChyZXN0b3JlZCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgY3VycmVudCBkZWZpbml0aW9uIHN0YXRlIGFzIHNhdmVkLlxuICAgKi9cbiAgbWFya1NhdmVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYW4gaW1tdXRhYmxlIHN0YXRlIGNoYW5nZSBhbmQgcHVzaGVzIHRvIGhpc3RvcnkuXG4gICAqL1xuICBwcml2YXRlIG11dGF0ZURlZmluaXRpb24odXBkYXRlcjogKGN1cnJlbnQ6IFJlcG9ydERlZmluaXRpb24pID0+IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdXBkYXRlcih0aGlzLmRlZmluaXRpb24oKSk7XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChuZXh0KTtcbiAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICAgIHRoaXMucHVzaEhpc3RvcnkobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIHB1c2hIaXN0b3J5KGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRIaXN0ID0gdGhpcy5oaXN0b3J5KCkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXgoKSArIDEpO1xuICAgIGN1cnJlbnRIaXN0LnB1c2goSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWYpKSk7XG4gICAgaWYgKGN1cnJlbnRIaXN0Lmxlbmd0aCA+IE1BWF9ISVNUT1JZKSB7XG4gICAgICBjdXJyZW50SGlzdC5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLmhpc3Rvcnkuc2V0KGN1cnJlbnRIaXN0KTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQoY3VycmVudEhpc3QubGVuZ3RoIC0gMSk7XG4gIH1cbn1cbiJdfQ==
|
|
385
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1yRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBS2xFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2Qjs7Ozs7R0FLRztBQUVILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEQsdUNBQXVDO0lBQzlCLFVBQVUsR0FBRyxNQUFNLENBQW1CO1FBQzdDLEVBQUUsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsYUFBYSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQy9ELFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUUzRCxpQ0FBaUM7SUFDeEIsU0FBUyxHQUFHLE1BQU0sQ0FBb0IsWUFBWSxDQUFDLENB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RSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQzt3R0FuYVUsb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRhdGFzb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlsaXRpZXMvaWQtZ2VuZXJhdG9yJztcblxuZXhwb3J0IHR5cGUgRGVzaWduZXJWaWV3TW9kZSA9ICdkZXNpZ24nIHwgJ3ByZXZpZXcnIHwgJ2pzb24nO1xuZXhwb3J0IHR5cGUgRGVzaWduZXJBY3RpdmVUYWIgPSAncHJvcGVydGllcycgfCAncmVwb3J0JyB8ICdncmlkJztcblxuY29uc3QgTUFYX0hJU1RPUlkgPSAzMDtcblxuLyoqXG4gKiBEZXNpZ25lclN0YXRlU2VydmljZSBjb29yZGluYXRlcyBzdGF0ZSBmb3IgdGhlIHZpc3VhbCByZXBvcnQgZGVzaWduZXIuXG4gKlxuICogU2NvcGVkIGF0IHRoZSBEZXNpZ25lciBjb21wb25lbnQgbGV2ZWwgKG5vdCByb290KSB0byBlbnN1cmUgbXVsdGlwbGUgZGVzaWduZXJcbiAqIGluc3RhbmNlcyBvciBuYXZpZ2F0aW9uIGZsb3dzIHJlbWFpbiBzdHJpY3RseSBpc29sYXRlZC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyU3RhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG5cbiAgLyoqIEN1cnJlbnQgYWN0aXZlIHJlcG9ydCBkZWZpbml0aW9uICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSBzaWduYWw8UmVwb3J0RGVmaW5pdGlvbj4oe1xuICAgIGlkOiBnZW5lcmF0ZUlkKCdycHQnKSxcbiAgICBuYW1lOiAnVW50aXRsZWQgUmVwb3J0JyxcbiAgICBzY2hlbWFWZXJzaW9uOiAxLFxuICAgIHZlcnNpb246IDEsXG4gICAgbGF5b3V0OiB7IGNvbHVtbnM6IDEyLCBnYXA6IDE2LCBwYWRkaW5nOiAyNCwgZGlyZWN0aW9uOiAnbHRyJyB9LFxuICAgIGNvbXBvbmVudHM6IFtdLFxuICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgIGRhdGFTb3VyY2VzOiBbXSxcbiAgfSk7XG5cbiAgLyoqIFNlbGVjdGVkIGNvbXBvbmVudCBJRCBpbiBjYW52YXMgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnRJZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvKiogQWN0aXZlIHByb3BlcnR5IGVkaXRvciB0YWIgKi9cbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gc2lnbmFsPERlc2lnbmVyQWN0aXZlVGFiPigncHJvcGVydGllcycpO1xuXG4gIC8qKiBDdXJyZW50IHZpZXcgbW9kZSAoZGVzaWduLCBwcmV2aWV3LCBvciByYXcganNvbikgKi9cbiAgcmVhZG9ubHkgdmlld01vZGUgPSBzaWduYWw8RGVzaWduZXJWaWV3TW9kZT4oJ2Rlc2lnbicpO1xuXG4gIC8qKiBEaXJ0eSBmbGFnIGluZGljYXRpbmcgdW5zYXZlZCBjaGFuZ2VzICovXG4gIHJlYWRvbmx5IGlzRGlydHkgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIEhpc3Rvcnkgc3RhY2sgZm9yIFVuZG8gLyBSZWRvXG4gIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeSA9IHNpZ25hbDxSZXBvcnREZWZpbml0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3J5SW5kZXggPSBzaWduYWw8bnVtYmVyPigtMSk7XG5cbiAgcmVhZG9ubHkgY2FuVW5kbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPiAwKTtcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaGlzdG9yeUluZGV4KCkgPj0gMCAmJiB0aGlzLmhpc3RvcnlJbmRleCgpIDwgdGhpcy5oaXN0b3J5KCkubGVuZ3RoIC0gMSk7XG5cbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBjb21wb25lbnQgaW5zdGFuY2UsIG9yIG51bGwgaWYgbm9uZSAqL1xuICByZWFkb25seSBzZWxlY3RlZENvbXBvbmVudCA9IGNvbXB1dGVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIG9yIHJlbG9hZHMgYSByZXBvcnQgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXNpZ25lci5cbiAgICovXG4gIGxvYWREZWZpbml0aW9uKGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkgYXMgUmVwb3J0RGVmaW5pdGlvbjtcbiAgICB0aGlzLmRlZmluaXRpb24uc2V0KGNsb25lZCk7XG5cbiAgICAvLyBQcmVzZXJ2ZSBhY3RpdmUgY29tcG9uZW50IHNlbGVjdGlvbiBpZiBpdCBzdGlsbCBleGlzdHMgaW4gdGhlIGxvYWRlZCBkZWZpbml0aW9uXG4gICAgY29uc3QgY3VycmVudFNlbGVjdGVkSWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQoKTtcbiAgICBpZiAoY3VycmVudFNlbGVjdGVkSWQgJiYgY2xvbmVkLmNvbXBvbmVudHMuc29tZSgoYykgPT4gYy5pZCA9PT0gY3VycmVudFNlbGVjdGVkSWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGN1cnJlbnRTZWxlY3RlZElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmhpc3Rvcnkuc2V0KFtKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNsb25lZCkpXSk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBjb21wb25lbnQgZm9yIHByb3BlcnR5IGVkaXRpbmcuXG4gICAqL1xuICBzZWxlY3RDb21wb25lbnQoaWQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9uZW50SWQuc2V0KGlkKTtcbiAgICBpZiAoaWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgncHJvcGVydGllcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhY3RpdmUgdmlldyBtb2RlIChkZXNpZ24sIGxpdmUgcHJldmlldywganNvbiBzY2hlbWEpLlxuICAgKi9cbiAgc2V0Vmlld01vZGUobW9kZTogRGVzaWduZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGUuc2V0KG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjdGl2ZSBlZGl0b3IgdGFiLlxuICAgKi9cbiAgc2V0QWN0aXZlVGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGNvbXBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb250byB0aGUgY2FudmFzLlxuICAgKi9cbiAgYWRkQ29tcG9uZW50KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB0YXJnZXRJbmRleD86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+XG4gICk6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnJlZ2lzdHJ5LnJlc29sdmUodHlwZSk7XG4gICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IG1ldGE/LmNyZWF0ZURlZmF1bHRDb25maWcoKSA/PyB7XG4gICAgICBpZDogZ2VuZXJhdGVJZCh0eXBlKSxcbiAgICAgIHR5cGUsXG4gICAgICBsYWJlbDogbWV0YT8uZGlzcGxheU5hbWUgPz8gdHlwZSxcbiAgICAgIGtleTogYCR7dHlwZX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgNil9YCxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldCh0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4gYy5rZXkpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3QgYmFzZUtleSA9IG92ZXJyaWRlcz8ua2V5ID8/IGRlZmF1bHRDb25maWcua2V5ID8/IGAke3R5cGV9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDYpfWA7XG4gICAgbGV0IHVuaXF1ZUtleSA9IGJhc2VLZXk7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIHdoaWxlIChleGlzdGluZ0tleXMuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgIHVuaXF1ZUtleSA9IGAke2Jhc2VLZXl9XyR7Y291bnRlcisrfWA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29tcG9uZW50OiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlSWQodHlwZSksXG4gICAgICB0eXBlLFxuICAgICAgbGFiZWw6IG92ZXJyaWRlcz8ubGFiZWwgPz8gZGVmYXVsdENvbmZpZy5sYWJlbCA/PyBtZXRhPy5kaXNwbGF5TmFtZSA/PyB0eXBlLFxuICAgICAga2V5OiB1bmlxdWVLZXksXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGxheW91dDoge1xuICAgICAgICBjb2x1bW5TcGFuOiBvdmVycmlkZXM/LmxheW91dD8uY29sdW1uU3BhbiA/PyBkZWZhdWx0Q29uZmlnLmxheW91dD8uY29sdW1uU3BhbiA/PyAodHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNCksXG4gICAgICAgIC4uLmRlZmF1bHRDb25maWcubGF5b3V0LFxuICAgICAgICAuLi5vdmVycmlkZXM/LmxheW91dCxcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLihkZWZhdWx0Q29uZmlnLnByb3BlcnRpZXMgPz8ge30pLCAuLi4ob3ZlcnJpZGVzPy5wcm9wZXJ0aWVzID8/IHt9KSB9LFxuICAgICAgdmFsaWRhdGlvbjogb3ZlcnJpZGVzPy52YWxpZGF0aW9uID8/IChkZWZhdWx0Q29uZmlnLnZhbGlkYXRpb24gPyB7IC4uLmRlZmF1bHRDb25maWcudmFsaWRhdGlvbiB9IDogdW5kZWZpbmVkKSxcbiAgICAgIGRhdGFTb3VyY2U6IG92ZXJyaWRlcz8uZGF0YVNvdXJjZSA/PyAoZGVmYXVsdENvbmZpZy5kYXRhU291cmNlID8geyAuLi5kZWZhdWx0Q29uZmlnLmRhdGFTb3VyY2UgfSA6IHVuZGVmaW5lZCksXG4gICAgICBlbmFibGVkOiBvdmVycmlkZXM/LmVuYWJsZWQgPz8gZGVmYXVsdENvbmZpZy5lbmFibGVkID8/IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gWy4uLnRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHNdLnNvcnQoXG4gICAgICAoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKVxuICAgICk7XG4gICAgaWYgKHRhcmdldEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0SW5kZXggPj0gMCAmJiB0YXJnZXRJbmRleCA8PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZSh0YXJnZXRJbmRleCwgMCwgbmV3Q29tcG9uZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudENvbXBvbmVudHMucHVzaChuZXdDb21wb25lbnQpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsY3VsYXRlIG9yZGVyIGluZGljZXNcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudChuZXdDb21wb25lbnQuaWQpO1xuICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNvbXBvbmVudCBieSBpdHMgSUQuXG4gICAqL1xuICByZW1vdmVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRzID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maWx0ZXIoKGMpID0+IGMuaWQgIT09IGlkKTtcbiAgICBjdXJyZW50Q29tcG9uZW50cy5mb3JFYWNoKChjLCBpZHgpID0+IChjLm9yZGVyID0gaWR4ICsgMSkpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb25lbnRJZCgpID09PSBpZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudElkLnNldChudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEdXBsaWNhdGVzIGFuIGV4aXN0aW5nIGNvbXBvbmVudC5cbiAgICovXG4gIGR1cGxpY2F0ZUNvbXBvbmVudChpZDogc3RyaW5nKTogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmlkID09PSBpZCk7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkdXBsaWNhdGVkOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uID0ge1xuICAgICAgLi4uSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleGlzdGluZykpLFxuICAgICAgaWQ6IGdlbmVyYXRlSWQoZXhpc3RpbmcudHlwZSksXG4gICAgICBrZXk6IGV4aXN0aW5nLmtleSA/IGAke2V4aXN0aW5nLmtleX1fY29weWAgOiB1bmRlZmluZWQsXG4gICAgICBsYWJlbDogZXhpc3RpbmcubGFiZWwgPyBgJHtleGlzdGluZy5sYWJlbH0gKENvcHkpYCA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBjb25zdCBpbmRleCA9IGN1cnJlbnRDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gYy5pZCA9PT0gaWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLnNwbGljZShpbmRleCArIDEsIDAsIGR1cGxpY2F0ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KGR1cGxpY2F0ZWQuaWQpO1xuICAgIHJldHVybiBkdXBsaWNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gcHJldmlvdXMgaW5kZXggdG8gY3VycmVudCBpbmRleCAoZS5nLiBmcm9tIENESyBkcmFnIGRyb3ApLlxuICAgKi9cbiAgbW92ZUNvbXBvbmVudChwcmV2aW91c0luZGV4OiBudW1iZXIsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPT09IGN1cnJlbnRJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSBbLi4udGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50c10uc29ydChcbiAgICAgIChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApXG4gICAgKTtcbiAgICBpZiAocHJldmlvdXNJbmRleCA8IDAgfHwgcHJldmlvdXNJbmRleCA+PSBjdXJyZW50Q29tcG9uZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJyZW50SW5kZXgsIGN1cnJlbnRDb21wb25lbnRzLmxlbmd0aCAtIDEpKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjdXJyZW50Q29tcG9uZW50cy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgY3VycmVudENvbXBvbmVudHMuc3BsaWNlKHRhcmdldElkeCwgMCwgbW92ZWQpO1xuICAgIGN1cnJlbnRDb21wb25lbnRzLmZvckVhY2goKGMsIGlkeCkgPT4gKGMub3JkZXIgPSBpZHggKyAxKSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHBhcnRpYWwgcHJvcGVydGllcyBvZiBhIGNvbXBvbmVudC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudChpZDogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudHMgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLm1hcCgoYykgPT4ge1xuICAgICAgaWYgKGMuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmMsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+ICh7XG4gICAgICAuLi5kZWYsXG4gICAgICBjb21wb25lbnRzOiBjdXJyZW50Q29tcG9uZW50cyxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHNpbmdsZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgd2l0aGluIGBwcm9wZXJ0aWVzYC5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudFByb3BlcnR5KGlkOiBzdHJpbmcsIHByb3BLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC4uLihjLnByb3BlcnRpZXMgPz8ge30pLFxuICAgICAgICAgICAgW3Byb3BLZXldOiB2YWx1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGxheW91dCBwcm9wZXJ0aWVzIGZvciBhIGNvbXBvbmVudCAoZS5nLiBjb2x1bW5TcGFuKS5cbiAgICovXG4gIHVwZGF0ZUNvbXBvbmVudExheW91dChpZDogc3RyaW5nLCBsYXlvdXQ6IFBhcnRpYWw8Q29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50cyA9IHRoaXMuZGVmaW5pdGlvbigpLmNvbXBvbmVudHMubWFwKChjKSA9PiB7XG4gICAgICBpZiAoYy5pZCA9PT0gaWQpIHtcbiAgICAgICAgY29uc3QgbmV4dExheW91dCA9IHtcbiAgICAgICAgICAuLi4oYy5sYXlvdXQgPz8ge30pLFxuICAgICAgICAgIC4uLmxheW91dCxcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGF5b3V0KSBhcyAoa2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbilbXSkge1xuICAgICAgICAgIGlmIChsYXlvdXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgbmV4dExheW91dFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgbGF5b3V0OiBuZXh0TGF5b3V0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG5cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGNvbXBvbmVudHM6IGN1cnJlbnRDb21wb25lbnRzLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHJlcG9ydC1sZXZlbCBzZXR0aW5ncyAobmFtZSwgZGVzY3JpcHRpb24sIGxheW91dCkuXG4gICAqL1xuICB1cGRhdGVSZXBvcnRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxSZXBvcnREZWZpbml0aW9uPik6IHZvaWQge1xuICAgIHRoaXMubXV0YXRlRGVmaW5pdGlvbigoZGVmKSA9PiAoe1xuICAgICAgLi4uZGVmLFxuICAgICAgLi4uc2V0dGluZ3MsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZ3JpZCBkZWZpbml0aW9uIHNldHRpbmdzLlxuICAgKi9cbiAgdXBkYXRlR3JpZFNldHRpbmdzKGdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogeyBza2lwSGlzdG9yeT86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy5za2lwSGlzdG9yeSkge1xuICAgICAgdGhpcy5kZWZpbml0aW9uLnVwZGF0ZSgoZGVmKSA9PiAoe1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGdyaWQsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmlzRGlydHkuc2V0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0ZURlZmluaXRpb24oKGRlZikgPT4gKHtcbiAgICAgIC4uLmRlZixcbiAgICAgIGdyaWQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3IgdXBkYXRlcyB0aGUgcHJpbWFyeSBkYXRhIHNvdXJjZSBmb3IgdGhlIHJlcG9ydCdzIHJlc3VsdCBncmlkLlxuICAgKi9cbiAgc2V0R3JpZERhdGFTb3VyY2UoZHM6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlcyA9IGRlZi5kYXRhU291cmNlcyA/PyBbXTtcbiAgICAgIGNvbnN0IGlkeCA9IGV4aXN0aW5nU291cmNlcy5maW5kSW5kZXgoKHMpID0+IHMuaWQgPT09IGRzLmlkKTtcbiAgICAgIGxldCBuZXh0U291cmNlczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb25bXTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICBuZXh0U291cmNlcyA9IFsuLi5leGlzdGluZ1NvdXJjZXNdO1xuICAgICAgICBuZXh0U291cmNlc1tpZHhdID0gZHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U291cmNlcyA9IFtkcywgLi4uZXhpc3RpbmdTb3VyY2VzXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZEdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uID0ge1xuICAgICAgICAuLi4oZGVmLmdyaWQgPz8ge1xuICAgICAgICAgIGRhdGFTb3VyY2VJZDogZHMuaWQsXG4gICAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgICAgb3B0aW9uczogeyBwYWdpbmF0aW9uOiB0cnVlLCBwYWdlU2l6ZTogMjUsIHNob3dSb3dOdW1iZXJzOiB0cnVlLCBzaG93Rm9vdGVyOiB0cnVlIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBkYXRhU291cmNlSWQ6IGRzLmlkLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBkYXRhU291cmNlczogbmV4dFNvdXJjZXMsXG4gICAgICAgIGdyaWQ6IHVwZGF0ZWRHcmlkLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBwYXJhbWV0ZXIgbWFwcGluZ3MgZm9yIHRoZSBwcmltYXJ5IGdyaWQgZGF0YSBzb3VyY2UuXG4gICAqL1xuICB1cGRhdGVHcmlkRGF0YVNvdXJjZVBhcmFtZXRlcnMobWFwcGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5tdXRhdGVEZWZpbml0aW9uKChkZWYpID0+IHtcbiAgICAgIGNvbnN0IGdyaWREc0lkID0gZGVmLmdyaWQ/LmRhdGFTb3VyY2VJZDtcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBkZWYuZGF0YVNvdXJjZXMgPz8gW107XG4gICAgICBjb25zdCB0YXJnZXRJZHggPSBzb3VyY2VzLmZpbmRJbmRleCgocykgPT4gcy5pZCA9PT0gZ3JpZERzSWQgfHwgcy5uYW1lID09PSBncmlkRHNJZCk7XG5cbiAgICAgIGlmICh0YXJnZXRJZHggPj0gMCkge1xuICAgICAgICBjb25zdCBuZXh0U291cmNlcyA9IFsuLi5zb3VyY2VzXTtcbiAgICAgICAgbmV4dFNvdXJjZXNbdGFyZ2V0SWR4XSA9IHtcbiAgICAgICAgICAuLi5uZXh0U291cmNlc1t0YXJnZXRJZHhdLFxuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBtYXBwaW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kZWYsXG4gICAgICAgICAgZGF0YVNvdXJjZXM6IG5leHRTb3VyY2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgdG8gdGhlIHByZXZpb3VzIHN0YXRlIGluIGhpc3RvcnkuXG4gICAqL1xuICB1bmRvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5VbmRvKCkpIHJldHVybjtcbiAgICBjb25zdCBuZXdJbmRleCA9IHRoaXMuaGlzdG9yeUluZGV4KCkgLSAxO1xuICAgIHRoaXMuaGlzdG9yeUluZGV4LnNldChuZXdJbmRleCk7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeSgpW25ld0luZGV4XSkpIGFzIFJlcG9ydERlZmluaXRpb247XG4gICAgdGhpcy5kZWZpbml0aW9uLnNldChyZXN0b3JlZCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlcyB0byB0aGUgbmV4dCBzdGF0ZSBpbiBoaXN0b3J5LlxuICAgKi9cbiAgcmVkbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVkbygpKSByZXR1cm47XG4gICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmhpc3RvcnlJbmRleCgpICsgMTtcbiAgICB0aGlzLmhpc3RvcnlJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpc3RvcnkoKVtuZXdJbmRleF0pKSBhcyBSZXBvcnREZWZpbml0aW9uO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQocmVzdG9yZWQpO1xuICAgIHRoaXMuaXNEaXJ0eS5zZXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBzdGF0ZSBhcyBzYXZlZC5cbiAgICovXG4gIG1hcmtTYXZlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlydHkuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGFuIGltbXV0YWJsZSBzdGF0ZSBjaGFuZ2UgYW5kIHB1c2hlcyB0byBoaXN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBtdXRhdGVEZWZpbml0aW9uKHVwZGF0ZXI6IChjdXJyZW50OiBSZXBvcnREZWZpbml0aW9uKSA9PiBSZXBvcnREZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIodGhpcy5kZWZpbml0aW9uKCkpO1xuICAgIHRoaXMuZGVmaW5pdGlvbi5zZXQobmV4dCk7XG4gICAgdGhpcy5pc0RpcnR5LnNldCh0cnVlKTtcbiAgICB0aGlzLnB1c2hIaXN0b3J5KG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXNoSGlzdG9yeShkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50SGlzdCA9IHRoaXMuaGlzdG9yeSgpLnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4KCkgKyAxKTtcbiAgICBjdXJyZW50SGlzdC5wdXNoKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmKSkpO1xuICAgIGlmIChjdXJyZW50SGlzdC5sZW5ndGggPiBNQVhfSElTVE9SWSkge1xuICAgICAgY3VycmVudEhpc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgdGhpcy5oaXN0b3J5LnNldChjdXJyZW50SGlzdCk7XG4gICAgdGhpcy5oaXN0b3J5SW5kZXguc2V0KGN1cnJlbnRIaXN0Lmxlbmd0aCAtIDEpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output, signal, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { ReportStoreService } from '../persistence/services/report-store.service';
|
|
6
|
+
import { DesignerComponent } from '../designer/designer.component';
|
|
7
|
+
import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
/**
|
|
11
|
+
* `<bways-report-builder>`
|
|
12
|
+
*
|
|
13
|
+
* Drop-in, single-tag visual report designer component for host applications.
|
|
14
|
+
*
|
|
15
|
+
* Wraps the full visual builder with:
|
|
16
|
+
* - Direct width and height inputs (`width="100%" height="calc(100vh - 64px)"`)
|
|
17
|
+
* - Built-in report selector dropdown and "+ New Report" button
|
|
18
|
+
* - Automatic persistence and menu synchronization
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```html
|
|
22
|
+
* <!-- Drop anywhere in your admin or report management page -->
|
|
23
|
+
* <bways-report-builder width="100%" height="calc(100vh - 64px)" />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class BwaysReportBuilderComponent {
|
|
27
|
+
store = inject(ReportStoreService);
|
|
28
|
+
destroyRef = inject(DestroyRef);
|
|
29
|
+
/** Width of the builder container. Defaults to '100%'. */
|
|
30
|
+
width = input('100%');
|
|
31
|
+
/** Height of the builder container. Defaults to '100%'. */
|
|
32
|
+
height = input('100%');
|
|
33
|
+
/** Initial report ID to open in the designer. */
|
|
34
|
+
reportId = input(undefined);
|
|
35
|
+
/** Whether to show the top switcher bar with report selector and "+ New" button. */
|
|
36
|
+
showReportList = input(true);
|
|
37
|
+
/** Emitted when a report definition is saved. */
|
|
38
|
+
saved = output();
|
|
39
|
+
/** Emitted when the report definition changes. */
|
|
40
|
+
definitionChange = output();
|
|
41
|
+
/** Emitted when a report is selected from the list. */
|
|
42
|
+
reportSelect = output();
|
|
43
|
+
activeReportId = signal(null);
|
|
44
|
+
reportsList = signal([]);
|
|
45
|
+
saveStatus = signal(null);
|
|
46
|
+
designerKey = signal(1);
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
if (this.reportId()) {
|
|
49
|
+
this.activeReportId.set(this.reportId());
|
|
50
|
+
}
|
|
51
|
+
this.refreshReports();
|
|
52
|
+
}
|
|
53
|
+
onSelectReport(id) {
|
|
54
|
+
const target = id ? id : null;
|
|
55
|
+
this.activeReportId.set(target);
|
|
56
|
+
this.designerKey.update((k) => k + 1);
|
|
57
|
+
if (target) {
|
|
58
|
+
this.reportSelect.emit(target);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
createNewReport() {
|
|
62
|
+
this.activeReportId.set(null);
|
|
63
|
+
this.designerKey.update((k) => k + 1);
|
|
64
|
+
}
|
|
65
|
+
onReportSaved(def) {
|
|
66
|
+
this.activeReportId.set(def.id);
|
|
67
|
+
this.saveStatus.set(`Saved "${def.name}"`);
|
|
68
|
+
this.saved.emit(def);
|
|
69
|
+
// Refresh store summaries so navigation reflects changes immediately
|
|
70
|
+
this.refreshReports();
|
|
71
|
+
setTimeout(() => {
|
|
72
|
+
this.saveStatus.set(null);
|
|
73
|
+
}, 3500);
|
|
74
|
+
}
|
|
75
|
+
refreshReports() {
|
|
76
|
+
this.store
|
|
77
|
+
.loadSummaries()
|
|
78
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
79
|
+
.subscribe({
|
|
80
|
+
next: (list) => this.reportsList.set(list),
|
|
81
|
+
error: (err) => console.warn('[bways-report] Failed to load reports list:', err),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
85
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: BwaysReportBuilderComponent, isStandalone: true, selector: "bways-report-builder", inputs: { width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, showReportList: { classPropertyName: "showReportList", publicName: "showReportList", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", definitionChange: "definitionChange", reportSelect: "reportSelect" }, ngImport: i0, template: `
|
|
86
|
+
<div
|
|
87
|
+
class="rpt-builder-container"
|
|
88
|
+
[style.width]="width()"
|
|
89
|
+
[style.height]="height()"
|
|
90
|
+
>
|
|
91
|
+
@if (showReportList()) {
|
|
92
|
+
<div class="rpt-builder-header">
|
|
93
|
+
<div class="rpt-header-left">
|
|
94
|
+
<span class="rpt-header-label">Report:</span>
|
|
95
|
+
<div class="rpt-select-wrapper">
|
|
96
|
+
<select
|
|
97
|
+
class="rpt-report-select"
|
|
98
|
+
[ngModel]="activeReportId() ?? ''"
|
|
99
|
+
(ngModelChange)="onSelectReport($event)"
|
|
100
|
+
>
|
|
101
|
+
<option value="">-- New Report (unsaved) --</option>
|
|
102
|
+
@for (item of reportsList(); track item.id) {
|
|
103
|
+
<option [value]="item.id">
|
|
104
|
+
{{ item.name }} {{ item.category ? '(' + item.category + ')' : '' }}
|
|
105
|
+
</option>
|
|
106
|
+
}
|
|
107
|
+
</select>
|
|
108
|
+
<rpt-icon name="chevron-down" [size]="12" class="rpt-select-arrow" />
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<button
|
|
112
|
+
type="button"
|
|
113
|
+
class="rpt-btn-new-report"
|
|
114
|
+
(click)="createNewReport()"
|
|
115
|
+
title="Create a new blank report"
|
|
116
|
+
>
|
|
117
|
+
<rpt-icon name="plus" [size]="14" />
|
|
118
|
+
<span>New</span>
|
|
119
|
+
</button>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<div class="rpt-header-right">
|
|
123
|
+
@if (saveStatus()) {
|
|
124
|
+
<span class="rpt-save-status">
|
|
125
|
+
<rpt-icon name="check" [size]="13" />
|
|
126
|
+
{{ saveStatus() }}
|
|
127
|
+
</span>
|
|
128
|
+
}
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
<div class="rpt-builder-designer-area">
|
|
134
|
+
@if (designerKey()) {
|
|
135
|
+
<rpt-designer
|
|
136
|
+
[reportId]="activeReportId() ?? undefined"
|
|
137
|
+
(save)="onReportSaved($event)"
|
|
138
|
+
(definitionChange)="definitionChange.emit($event)"
|
|
139
|
+
/>
|
|
140
|
+
}
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)}.rpt-builder-container{display:flex;flex-direction:column;position:relative;overflow:hidden;background:#f8fafc;box-sizing:border-box}.rpt-builder-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:10;flex-shrink:0}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-header-label{font-size:.8125rem;font-weight:600;color:#475569}.rpt-select-wrapper{position:relative;display:inline-flex;align-items:center}.rpt-report-select{appearance:none;-webkit-appearance:none;padding:5px 28px 5px 12px;font-size:.8125rem;font-weight:500;color:#0f172a;background:#f8fafc;border:1px solid #cbd5e1;border-radius:6px;outline:none;cursor:pointer;min-width:220px;transition:all .15s ease}.rpt-report-select:focus{background:#fff;border-color:#2563eb;box-shadow:0 0 0 2px #2563eb26}.rpt-select-arrow{position:absolute;right:10px;pointer-events:none;color:#64748b}.rpt-btn-new-report{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;border-radius:6px;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-btn-new-report:hover{background:#dbeafe;border-color:#93c5fd}.rpt-header-right{display:flex;align-items:center;gap:12px}.rpt-save-status{display:inline-flex;align-items:center;gap:5px;font-size:.75rem;font-weight:600;color:#16a34a;background:#f0fdf4;padding:3px 8px;border-radius:9999px;border:1px solid #bbf7d0;animation:rpt-status-fade .2s ease}@keyframes rpt-status-fade{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.rpt-builder-designer-area{flex:1;width:100%;height:100%;overflow:hidden;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: DesignerComponent, selector: "rpt-designer", inputs: ["reportId", "initialReport"], outputs: ["save", "definitionChange"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
144
|
+
}
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BwaysReportBuilderComponent, decorators: [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'bways-report-builder', standalone: true, imports: [CommonModule, FormsModule, DesignerComponent, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
148
|
+
<div
|
|
149
|
+
class="rpt-builder-container"
|
|
150
|
+
[style.width]="width()"
|
|
151
|
+
[style.height]="height()"
|
|
152
|
+
>
|
|
153
|
+
@if (showReportList()) {
|
|
154
|
+
<div class="rpt-builder-header">
|
|
155
|
+
<div class="rpt-header-left">
|
|
156
|
+
<span class="rpt-header-label">Report:</span>
|
|
157
|
+
<div class="rpt-select-wrapper">
|
|
158
|
+
<select
|
|
159
|
+
class="rpt-report-select"
|
|
160
|
+
[ngModel]="activeReportId() ?? ''"
|
|
161
|
+
(ngModelChange)="onSelectReport($event)"
|
|
162
|
+
>
|
|
163
|
+
<option value="">-- New Report (unsaved) --</option>
|
|
164
|
+
@for (item of reportsList(); track item.id) {
|
|
165
|
+
<option [value]="item.id">
|
|
166
|
+
{{ item.name }} {{ item.category ? '(' + item.category + ')' : '' }}
|
|
167
|
+
</option>
|
|
168
|
+
}
|
|
169
|
+
</select>
|
|
170
|
+
<rpt-icon name="chevron-down" [size]="12" class="rpt-select-arrow" />
|
|
171
|
+
</div>
|
|
172
|
+
|
|
173
|
+
<button
|
|
174
|
+
type="button"
|
|
175
|
+
class="rpt-btn-new-report"
|
|
176
|
+
(click)="createNewReport()"
|
|
177
|
+
title="Create a new blank report"
|
|
178
|
+
>
|
|
179
|
+
<rpt-icon name="plus" [size]="14" />
|
|
180
|
+
<span>New</span>
|
|
181
|
+
</button>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<div class="rpt-header-right">
|
|
185
|
+
@if (saveStatus()) {
|
|
186
|
+
<span class="rpt-save-status">
|
|
187
|
+
<rpt-icon name="check" [size]="13" />
|
|
188
|
+
{{ saveStatus() }}
|
|
189
|
+
</span>
|
|
190
|
+
}
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
<div class="rpt-builder-designer-area">
|
|
196
|
+
@if (designerKey()) {
|
|
197
|
+
<rpt-designer
|
|
198
|
+
[reportId]="activeReportId() ?? undefined"
|
|
199
|
+
(save)="onReportSaved($event)"
|
|
200
|
+
(definitionChange)="definitionChange.emit($event)"
|
|
201
|
+
/>
|
|
202
|
+
}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
`, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif)}.rpt-builder-container{display:flex;flex-direction:column;position:relative;overflow:hidden;background:#f8fafc;box-sizing:border-box}.rpt-builder-header{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;background:#fff;border-bottom:1px solid #e2e8f0;z-index:10;flex-shrink:0}.rpt-header-left{display:flex;align-items:center;gap:10px}.rpt-header-label{font-size:.8125rem;font-weight:600;color:#475569}.rpt-select-wrapper{position:relative;display:inline-flex;align-items:center}.rpt-report-select{appearance:none;-webkit-appearance:none;padding:5px 28px 5px 12px;font-size:.8125rem;font-weight:500;color:#0f172a;background:#f8fafc;border:1px solid #cbd5e1;border-radius:6px;outline:none;cursor:pointer;min-width:220px;transition:all .15s ease}.rpt-report-select:focus{background:#fff;border-color:#2563eb;box-shadow:0 0 0 2px #2563eb26}.rpt-select-arrow{position:absolute;right:10px;pointer-events:none;color:#64748b}.rpt-btn-new-report{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;border-radius:6px;font-size:.8125rem;font-weight:600;cursor:pointer;transition:all .15s ease}.rpt-btn-new-report:hover{background:#dbeafe;border-color:#93c5fd}.rpt-header-right{display:flex;align-items:center;gap:12px}.rpt-save-status{display:inline-flex;align-items:center;gap:5px;font-size:.75rem;font-weight:600;color:#16a34a;background:#f0fdf4;padding:3px 8px;border-radius:9999px;border:1px solid #bbf7d0;animation:rpt-status-fade .2s ease}@keyframes rpt-status-fade{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.rpt-builder-designer-area{flex:1;width:100%;height:100%;overflow:hidden;position:relative}\n"] }]
|
|
206
|
+
}] });
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYndheXMtcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZW1iZWQvYndheXMtcmVwb3J0LWJ1aWxkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7O0FBRXZGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQW1NSCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWpELDBEQUEwRDtJQUNqRCxLQUFLLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBRXZDLDJEQUEyRDtJQUNsRCxNQUFNLEdBQUcsS0FBSyxDQUFTLE1BQU0sQ0FBQyxDQUFDO0lBRXhDLGlEQUFpRDtJQUN4QyxRQUFRLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUV6RCxvRkFBb0Y7SUFDM0UsY0FBYyxHQUFH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NEZBK0w3RCwyQkFBMkI7a0JBbE12QyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLG1CQUN4RCx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25Jbml0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uLCBSZXBvcnRTdW1tYXJ5IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0U3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2Uvc2VydmljZXMvcmVwb3J0LXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVzaWduZXJDb21wb25lbnQgfSBmcm9tICcuLi9kZXNpZ25lci9kZXNpZ25lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5cbi8qKlxuICogYDxid2F5cy1yZXBvcnQtYnVpbGRlcj5gXG4gKlxuICogRHJvcC1pbiwgc2luZ2xlLXRhZyB2aXN1YWwgcmVwb3J0IGRlc2lnbmVyIGNvbXBvbmVudCBmb3IgaG9zdCBhcHBsaWNhdGlvbnMuXG4gKlxuICogV3JhcHMgdGhlIGZ1bGwgdmlzdWFsIGJ1aWxkZXIgd2l0aDpcbiAqIC0gRGlyZWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5wdXRzIChgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiY2FsYygxMDB2aCAtIDY0cHgpXCJgKVxuICogLSBCdWlsdC1pbiByZXBvcnQgc2VsZWN0b3IgZHJvcGRvd24gYW5kIFwiKyBOZXcgUmVwb3J0XCIgYnV0dG9uXG4gKiAtIEF1dG9tYXRpYyBwZXJzaXN0ZW5jZSBhbmQgbWVudSBzeW5jaHJvbml6YXRpb25cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYGh0bWxcbiAqIDwhLS0gRHJvcCBhbnl3aGVyZSBpbiB5b3VyIGFkbWluIG9yIHJlcG9ydCBtYW5hZ2VtZW50IHBhZ2UgLS0+XG4gKiA8YndheXMtcmVwb3J0LWJ1aWxkZXIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiY2FsYygxMDB2aCAtIDY0cHgpXCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdid2F5cy1yZXBvcnQtYnVpbGRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEZXNpZ25lckNvbXBvbmVudCwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicnB0LWJ1aWxkZXItY29udGFpbmVyXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aCgpXCJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwiaGVpZ2h0KClcIlxuICAgID5cbiAgICAgIEBpZiAoc2hvd1JlcG9ydExpc3QoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWJ1aWxkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1oZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtaGVhZGVyLWxhYmVsXCI+UmVwb3J0Ojwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LXJlcG9ydC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImFjdGl2ZVJlcG9ydElkKCkgPz8gJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0UmVwb3J0KCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5ldyBSZXBvcnQgKHVuc2F2ZWQpIC0tPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiByZXBvcnRzTGlzdCgpOyB0cmFjayBpdGVtLmlkKSB7XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fSB7eyBpdGVtLmNhdGVnb3J5ID8gJygnICsgaXRlbS5jYXRlZ29yeSArICcpJyA6ICcnIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEyXCIgY2xhc3M9XCJycHQtc2VsZWN0LWFycm93XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tbmV3LXJlcG9ydFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVOZXdSZXBvcnQoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ3JlYXRlIGEgbmV3IGJsYW5rIHJlcG9ydFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGx1c1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+TmV3PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWhlYWRlci1yaWdodFwiPlxuICAgICAgICAgICAgQGlmIChzYXZlU3RhdHVzKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtc2F2ZS1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIHt7IHNhdmVTdGF0dXMoKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2IGNsYXNzPVwicnB0LWJ1aWxkZXItZGVzaWduZXItYXJlYVwiPlxuICAgICAgICBAaWYgKGRlc2lnbmVyS2V5KCkpIHtcbiAgICAgICAgICA8cnB0LWRlc2lnbmVyXG4gICAgICAgICAgICBbcmVwb3J0SWRdPVwiYWN0aXZlUmVwb3J0SWQoKSA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgICAgKHNhdmUpPVwib25SZXBvcnRTYXZlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkZWZpbml0aW9uQ2hhbmdlKT1cImRlZmluaXRpb25DaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcIlNlZ29lIFVJXCIsIFJvYm90bywgc2Fucy1zZXJpZik7XG4gICAgfVxuXG4gICAgLnJwdC1idWlsZGVyLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG5cbiAgICAucnB0LWJ1aWxkZXItaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtaGVhZGVyLWxlZnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1oZWFkZXItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgfVxuXG4gICAgLnJwdC1zZWxlY3Qtd3JhcHBlciB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLnJwdC1yZXBvcnQtc2VsZWN0IHtcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBwYWRkaW5nOiA1cHggMjhweCA1cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYmQ1ZTE7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgbWluLXdpZHRoOiAyMjBweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlO1xuICAgIH1cblxuICAgIC5ycHQtcmVwb3J0LXNlbGVjdDpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMTUpO1xuICAgIH1cblxuICAgIC5ycHQtc2VsZWN0LWFycm93IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICB9XG5cbiAgICAucnB0LWJ0bi1uZXctcmVwb3J0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgcGFkZGluZzogNXB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGNvbG9yOiAjMjU2M2ViO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgfVxuXG4gICAgLnJwdC1idG4tbmV3LXJlcG9ydDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjOTNjNWZkO1xuICAgIH1cblxuICAgIC5ycHQtaGVhZGVyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgIH1cblxuICAgIC5ycHQtc2F2ZS1zdGF0dXMge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiYmY3ZDA7XG4gICAgICBhbmltYXRpb246IHJwdC1zdGF0dXMtZmFkZSAyMDBtcyBlYXNlO1xuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgcnB0LXN0YXR1cy1mYWRlIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7IH1cbiAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XG4gICAgfVxuXG4gICAgLnJwdC1idWlsZGVyLWRlc2lnbmVyLWFyZWEge1xuICAgICAgZmxleDogMTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBCd2F5c1JlcG9ydEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gaW5qZWN0KFJlcG9ydFN0b3JlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvKiogV2lkdGggb2YgdGhlIGJ1aWxkZXIgY29udGFpbmVyLiBEZWZhdWx0cyB0byAnMTAwJScuICovXG4gIHJlYWRvbmx5IHdpZHRoID0gaW5wdXQ8c3RyaW5nPignMTAwJScpO1xuXG4gIC8qKiBIZWlnaHQgb2YgdGhlIGJ1aWxkZXIgY29udGFpbmVyLiBEZWZhdWx0cyB0byAnMTAwJScuICovXG4gIHJlYWRvbmx5IGhlaWdodCA9IGlucHV0PHN0cmluZz4oJzEwMCUnKTtcblxuICAvKiogSW5pdGlhbCByZXBvcnQgSUQgdG8gb3BlbiBpbiB0aGUgZGVzaWduZXIuICovXG4gIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvcCBzd2l0Y2hlciBiYXIgd2l0aCByZXBvcnQgc2VsZWN0b3IgYW5kIFwiKyBOZXdcIiBidXR0b24uICovXG4gIHJlYWRvbmx5IHNob3dSZXBvcnRMaXN0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHJlcG9ydCBkZWZpbml0aW9uIGlzIHNhdmVkLiAqL1xuICByZWFkb25seSBzYXZlZCA9IG91dHB1dDxSZXBvcnREZWZpbml0aW9uPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHJlcG9ydCBkZWZpbml0aW9uIGNoYW5nZXMuICovXG4gIHJlYWRvbmx5IGRlZmluaXRpb25DaGFuZ2UgPSBvdXRwdXQ8UmVwb3J0RGVmaW5pdGlvbj4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcmVwb3J0IGlzIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QuICovXG4gIHJlYWRvbmx5IHJlcG9ydFNlbGVjdCA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlUmVwb3J0SWQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHJlcG9ydHNMaXN0ID0gc2lnbmFsPFJlcG9ydFN1bW1hcnlbXT4oW10pO1xuICByZWFkb25seSBzYXZlU3RhdHVzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBkZXNpZ25lcktleSA9IHNpZ25hbDxudW1iZXI+KDEpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlcG9ydElkKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlUmVwb3J0SWQuc2V0KHRoaXMucmVwb3J0SWQoKSEpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFJlcG9ydHMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0UmVwb3J0KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBpZCA/IGlkIDogbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldCh0YXJnZXQpO1xuICAgIHRoaXMuZGVzaWduZXJLZXkudXBkYXRlKChrKSA9PiBrICsgMSk7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgdGhpcy5yZXBvcnRTZWxlY3QuZW1pdCh0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZU5ld1JlcG9ydCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChudWxsKTtcbiAgICB0aGlzLmRlc2lnbmVyS2V5LnVwZGF0ZSgoaykgPT4gayArIDEpO1xuICB9XG5cbiAgb25SZXBvcnRTYXZlZChkZWY6IFJlcG9ydERlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVJlcG9ydElkLnNldChkZWYuaWQpO1xuICAgIHRoaXMuc2F2ZVN0YXR1cy5zZXQoYFNhdmVkIFwiJHtkZWYubmFtZX1cImApO1xuICAgIHRoaXMuc2F2ZWQuZW1pdChkZWYpO1xuXG4gICAgLy8gUmVmcmVzaCBzdG9yZSBzdW1tYXJpZXMgc28gbmF2aWdhdGlvbiByZWZsZWN0cyBjaGFuZ2VzIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5yZWZyZXNoUmVwb3J0cygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNhdmVTdGF0dXMuc2V0KG51bGwpO1xuICAgIH0sIDM1MDApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoUmVwb3J0cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlXG4gICAgICAubG9hZFN1bW1hcmllcygpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAobGlzdCkgPT4gdGhpcy5yZXBvcnRzTGlzdC5zZXQobGlzdCksXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tid2F5cy1yZXBvcnRdIEZhaWxlZCB0byBsb2FkIHJlcG9ydHMgbGlzdDonLCBlcnIpLFxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
|