@firestitch/report 18.0.16 → 18.0.17

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.
@@ -1,12 +1,13 @@
1
- import { SemanticEntityFunction, SemanticEntityFunctions } from '../../interfaces/report.interface';
1
+ import { SemanticEntityFunction, SemanticEntityFunctions, SemanticFunctionSource } from '../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
3
  export interface EntityFunctionsDialogData {
4
4
  entityKey: string;
5
- source: 'model' | 'handler';
5
+ source: SemanticFunctionSource;
6
6
  }
7
7
  export declare class EntityFunctionsComponent {
8
8
  private static readonly KIND_COLORS;
9
9
  private static readonly KIND_ORDER;
10
+ private static readonly SOURCE_LABELS;
10
11
  private readonly _data;
11
12
  readonly entityKey: string;
12
13
  readonly sourceLabel: string;
@@ -1,19 +1,28 @@
1
- import { SemanticBuildEntity, SemanticBuildStage, SemanticBuildStatus, SemanticBuildTable } from '../../../../interfaces/report.interface';
1
+ import { SemanticBuildEntity, SemanticBuildStatus, SemanticBuildTable, SemanticFunctionSource } from '../../../../interfaces/report.interface';
2
2
  import * as i0 from "@angular/core";
3
+ interface SemanticUnitView {
4
+ key: string;
5
+ name: string;
6
+ hasTable: boolean;
7
+ entity: SemanticBuildEntity | null;
8
+ model: string | null;
9
+ functionCount: number;
10
+ }
3
11
  export declare class SemanticDatabaseComponent {
4
12
  private static readonly ACTIVE_STATES;
5
13
  private static readonly STATE_LABELS;
6
- private static readonly DONE_COLOR;
7
14
  private static readonly PENDING_COLOR;
8
- readonly stageKeys: string[];
9
- readonly stageLabels: Record<string, string>;
15
+ private static readonly NAME_SUFFIX;
10
16
  readonly status: import("@angular/core").WritableSignal<SemanticBuildStatus>;
17
+ readonly filter: import("@angular/core").WritableSignal<string>;
11
18
  readonly building: import("@angular/core").WritableSignal<boolean>;
12
19
  readonly buildActive: import("@angular/core").Signal<boolean>;
13
20
  readonly buildStateLabel: import("@angular/core").Signal<string>;
14
21
  readonly hasCatalog: import("@angular/core").Signal<boolean>;
15
22
  readonly excludedTables: import("@angular/core").Signal<SemanticBuildTable[]>;
16
23
  readonly unlinkedJunctions: import("@angular/core").Signal<SemanticBuildTable[]>;
24
+ readonly units: import("@angular/core").Signal<SemanticUnitView[]>;
25
+ readonly filteredUnits: import("@angular/core").Signal<SemanticUnitView[]>;
17
26
  readonly coverage: import("@angular/core").Signal<string>;
18
27
  private readonly _tables;
19
28
  private _buildFinalized;
@@ -51,16 +60,29 @@ export declare class SemanticDatabaseComponent {
51
60
  * confirms success.
52
61
  */
53
62
  private _announceOutcome;
54
- stageColor(stage: SemanticBuildStage): string;
55
- stageTooltip(stage: SemanticBuildStage): string;
63
+ pendingColor(): string;
64
+ /**
65
+ * The build stages this row is still owed, or [] when it is fully built. A
66
+ * stopped or interrupted build is the only way to get a non-empty list.
67
+ */
68
+ pendingStages(unit: SemanticUnitView): string[];
69
+ setFilter(value: string): void;
56
70
  /**
57
- * Open the child dialog listing one group of an entity's cached functions —
58
- * the model class's or the handler class's. The dialog fetches fresh on open,
59
- * so the tab never holds function payloads.
71
+ * Open the child dialog listing one group of a unit's cached functions — an
72
+ * entity's model or handler class, or a standalone class's code. The dialog
73
+ * fetches fresh on open, so the tab never holds function payloads.
60
74
  */
61
- openFunctions(entity: SemanticBuildEntity, source: 'model' | 'handler'): void;
75
+ openFunctions(unit: SemanticUnitView, source: SemanticFunctionSource): void;
62
76
  private _init;
77
+ /**
78
+ * What a reader recognizes the unit by: its class's short name, minus the
79
+ * `Model` suffix that every model carries and none of them are distinguished
80
+ * by. Falls back to the cache key for a unit whose class could not be
81
+ * resolved, so a row never renders nameless.
82
+ */
83
+ private _displayName;
63
84
  private _refreshStatus;
64
85
  static ɵfac: i0.ɵɵFactoryDeclaration<SemanticDatabaseComponent, never>;
65
86
  static ɵcmp: i0.ɵɵComponentDeclaration<SemanticDatabaseComponent, "fs-ai-report-global-settings-semantic-database", never, {}, {}, never, never, true, never>;
66
87
  }
88
+ export {};
@@ -210,6 +210,8 @@ export interface SemanticBuildEnum {
210
210
  export interface SemanticBuildEntity {
211
211
  key: string;
212
212
  table: string;
213
+ model: string | null;
214
+ handler: string | null;
213
215
  columns: number;
214
216
  relationships: number;
215
217
  enums: SemanticBuildEnum[];
@@ -219,6 +221,11 @@ export interface SemanticBuildEntity {
219
221
  handlerFunctionCount: number;
220
222
  stages: Record<string, SemanticBuildStage>;
221
223
  }
224
+ export interface SemanticBuildClass {
225
+ key: string;
226
+ model: string | null;
227
+ functionCount: number;
228
+ }
222
229
  export type SemanticTableClassification = 'entity' | 'junction' | 'excluded';
223
230
  export interface SemanticBuildTable {
224
231
  table: string;
@@ -229,14 +236,17 @@ export interface SemanticBuildTable {
229
236
  export interface SemanticBuildDetail {
230
237
  generatedAt: Date | null;
231
238
  entityCount: number;
239
+ classCount: number;
232
240
  functionCount: number;
233
241
  entities: SemanticBuildEntity[];
242
+ classes: SemanticBuildClass[];
234
243
  tableCount: number;
235
244
  junctionCount: number;
236
245
  unlinkedJunctionCount: number;
237
246
  excludedCount: number;
238
247
  tables: SemanticBuildTable[];
239
248
  }
249
+ export type SemanticFunctionSource = 'model' | 'handler' | 'class';
240
250
  export interface SemanticEntityFunction {
241
251
  class: string;
242
252
  method: string;
@@ -244,7 +254,7 @@ export interface SemanticEntityFunction {
244
254
  kind: string;
245
255
  summary: string;
246
256
  produces: string;
247
- source: 'model' | 'handler';
257
+ source: SemanticFunctionSource;
248
258
  }
249
259
  export interface SemanticEntityFunctions {
250
260
  entity: string;
@@ -12,10 +12,10 @@ import * as i1 from "@firestitch/chip";
12
12
  import * as i2 from "@firestitch/date";
13
13
  import * as i3 from "@firestitch/dialog";
14
14
  import * as i4 from "@firestitch/skeleton";
15
- // One group of an entity's AI-classified cached code functions — the model
16
- // class's or the handler class's, per the source it was opened for. Fetched on
17
- // open from the shared per-entity endpoint (one payload carries both groups,
18
- // each row tagged with its source) and filtered client-side.
15
+ // One group of a unit's AI-classified cached code functions — an entity's model
16
+ // or handler class, or the single group of a standalone code class. Fetched on
17
+ // open from the shared per-key endpoint (one payload carries every group, each
18
+ // row tagged with its source) and filtered client-side.
19
19
  export class EntityFunctionsComponent {
20
20
  // One color per AI classification kind, so a function's nature reads at a glance.
21
21
  static KIND_COLORS = {
@@ -28,15 +28,23 @@ export class EntityFunctionsComponent {
28
28
  };
29
29
  // Interesting logic first: derived values and rules, then data access, then the rest.
30
30
  static KIND_ORDER = ['calculation', 'business-rule', 'query', 'mutation', 'accessor', 'other'];
31
+ // The dialog title per group. A standalone class has no model/handler split,
32
+ // so its one group is just the code the build read.
33
+ static SOURCE_LABELS = {
34
+ model: 'Model functions',
35
+ handler: 'Handler functions',
36
+ class: 'Code functions',
37
+ };
31
38
  _data = inject(MAT_DIALOG_DATA);
32
39
  entityKey = this._data.entityKey;
33
- sourceLabel = this._data.source === 'model' ? 'Model functions' : 'Handler functions';
40
+ sourceLabel = EntityFunctionsComponent.SOURCE_LABELS[this._data.source];
34
41
  // null until loaded — gates the list behind the skeleton.
35
42
  entityFunctions = signal(null);
36
- // The class this group's functions were discovered from.
43
+ // The class this group's functions were discovered from. A standalone code
44
+ // class has no handler, so its group reads the model slot like 'model' does.
37
45
  discoveredClass = computed(() => {
38
46
  const loaded = this.entityFunctions();
39
- return this._data.source === 'model' ? loaded?.modelClass : loaded?.handlerClass;
47
+ return this._data.source === 'handler' ? loaded?.handlerClass : loaded?.modelClass;
40
48
  });
41
49
  // This group's functions, ordered by kind priority then method name.
42
50
  functions = computed(() => this._sortFunctions((this.entityFunctions()?.functions ?? [])
@@ -78,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
78
86
  FsSkeletonModule,
79
87
  ], template: "<fs-dialog>\n <fs-dialog-title>\n {{ entityKey }} \u2014 {{ sourceLabel }}\n </fs-dialog-title>\n <mat-dialog-content>\n <div *fsSkeleton=\"entityFunctions()\">\n @if (entityFunctions(); as fns) {\n @if (functions().length) {\n @if (fns.generatedAt) {\n <div class=\"hint functions-generated\">\n Discovered from {{ discoveredClass() }} &middot;\n <fs-date\n [date]=\"fns.generatedAt\"\n format=\"date-time\">\n </fs-date>\n </div>\n }\n <div class=\"functions-list\">\n @for (fn of functions(); track fn.class + '::' + fn.method) {\n <div class=\"function-row\">\n <div class=\"function-head\">\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"kindColor(fn.kind)\"\n color=\"#ffffff\">\n {{ fn.kind }}\n </fs-chip>\n <code class=\"function-method\">{{ fn.method }}</code>\n </div>\n <div class=\"function-summary\">{{ fn.summary }}</div>\n @if (fn.produces) {\n <div class=\"function-produces hint\">Produces: {{ fn.produces }}</div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"hint\">\n No functions cached for this entity yet \u2014 run a build to discover its code.\n </div>\n }\n }\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".hint{margin:0;color:#0009;font-size:13px;line-height:1.5}.functions-generated{margin-bottom:10px}.functions-list{display:flex;flex-direction:column}.functions-list .function-row{display:flex;flex-direction:column;gap:3px;padding:10px 0}.functions-list .function-row+.function-row{border-top:1px solid rgba(0,0,0,.08)}.functions-list .function-row .function-head{display:flex;align-items:center;gap:8px}.functions-list .function-row .function-method{font-family:monospace;font-size:13px;font-weight:600}.functions-list .function-row .function-summary{color:#000000bf}.functions-list .function-row .function-produces{padding-left:10px}\n"] }]
80
88
  }], ctorParameters: () => [] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFhcEQsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UsNkRBQTZEO0FBaUI3RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4QixlQUFlLEVBQUUsU0FBUztRQUMxQixPQUFPLEVBQUUsU0FBUztRQUNsQixVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsU0FBUztRQUNyQixPQUFPLEVBQUUsU0FBUztLQUNuQixDQUFDO0lBRUYsc0ZBQXNGO0lBQzlFLE1BQU0sQ0FBVSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRS9GLEtBQUssR0FBRyxNQUFNLENBQTRCLGVBQWUsQ0FBQyxDQUFDO0lBRTVELFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNqQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7SUFFdEcsMERBQTBEO0lBQzFDLGVBQWUsR0FBRyxNQUFNLENBQWlDLElBQUksQ0FBQyxDQUFDO0lBRS9FLHlEQUF5RDtJQUN6QyxlQUFlLEdBQUcsUUFBUSxDQUFnQixHQUFHLEVBQUU7UUFDN0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDO0lBQ25GLENBQUMsQ0FBQyxDQUFDO0lBRUgscUVBQXFFO0lBQ3JELFNBQVMsR0FBRyxRQUFRLENBQTJCLEdBQUcsRUFBRSxDQUNsRSxJQUFJLENBQUMsY0FBYyxDQUNqQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1NBQ3RDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUNuRCxDQUNGLENBQUM7SUFFRjtRQUNFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQzthQUM3RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMxQixTQUFTLENBQUMsQ0FBQyxlQUF3QyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sU0FBUyxDQUFDLElBQVk7UUFDM0IsT0FBTyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNsRyxDQUFDO0lBRU8sY0FBYyxDQUFDLFNBQW1DO1FBQ3hELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQzthQUNsQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDYixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqRSxPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZO1FBQzVCLE1BQU0sSUFBSSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RSxDQUFDO3dHQS9EVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qix3RUM1Q3JDLG95REFzREEsc3JCRHBCSSxTQUFTLGlMQUNULGdCQUFnQix5R0FDaEIsZ0JBQWdCLDRIQUNoQixjQUFjLG9MQUNkLFlBQVkscVhBQ1osWUFBWSw0SUFDWixjQUFjLDhUQUNkLGdCQUFnQjs7NEZBR1Asd0JBQXdCO2tCQWhCcEMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixjQUFjO3dCQUNkLGdCQUFnQjtxQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBGc0NoaXBNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jaGlwJztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbixcbiAgU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhIHtcbiAgZW50aXR5S2V5OiBzdHJpbmc7XG4gIHNvdXJjZTogJ21vZGVsJyB8ICdoYW5kbGVyJztcbn1cblxuXG4vLyBPbmUgZ3JvdXAgb2YgYW4gZW50aXR5J3MgQUktY2xhc3NpZmllZCBjYWNoZWQgY29kZSBmdW5jdGlvbnMg4oCUIHRoZSBtb2RlbFxuLy8gY2xhc3MncyBvciB0aGUgaGFuZGxlciBjbGFzcydzLCBwZXIgdGhlIHNvdXJjZSBpdCB3YXMgb3BlbmVkIGZvci4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWVudGl0eSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBib3RoIGdyb3Vwcyxcbi8vIGVhY2ggcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGEgPSBpbmplY3Q8RW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5S2V5ID0gdGhpcy5fZGF0YS5lbnRpdHlLZXk7XG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VMYWJlbCA9IHRoaXMuX2RhdGEuc291cmNlID09PSAnbW9kZWwnID8gJ01vZGVsIGZ1bmN0aW9ucycgOiAnSGFuZGxlciBmdW5jdGlvbnMnO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ21vZGVsJyA/IGxvYWRlZD8ubW9kZWxDbGFzcyA6IGxvYWRlZD8uaGFuZGxlckNsYXNzO1xuICB9KTtcblxuICAvLyBUaGlzIGdyb3VwJ3MgZnVuY3Rpb25zLCBvcmRlcmVkIGJ5IGtpbmQgcHJpb3JpdHkgdGhlbiBtZXRob2QgbmFtZS5cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9ucyA9IGNvbXB1dGVkPFNlbWFudGljRW50aXR5RnVuY3Rpb25bXT4oKCkgPT5cbiAgICB0aGlzLl9zb3J0RnVuY3Rpb25zKFxuICAgICAgKHRoaXMuZW50aXR5RnVuY3Rpb25zKCk/LmZ1bmN0aW9ucyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcigoZm4pID0+IGZuLnNvdXJjZSA9PT0gdGhpcy5fZGF0YS5zb3VyY2UpLFxuICAgICksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaW5qZWN0KFJlcG9ydERhdGEpLnNlbWFudGljRW50aXR5RnVuY3Rpb25zKHRoaXMuX2RhdGEuZW50aXR5S2V5KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChlbnRpdHlGdW5jdGlvbnM6IFNlbWFudGljRW50aXR5RnVuY3Rpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuZW50aXR5RnVuY3Rpb25zLnNldChlbnRpdHlGdW5jdGlvbnMpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMga2luZENvbG9yKGtpbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SU1traW5kXSA/PyBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9DT0xPUlMub3RoZXI7XG4gIH1cblxuICBwcml2YXRlIF9zb3J0RnVuY3Rpb25zKGZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdKTogU2VtYW50aWNFbnRpdHlGdW5jdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLmZ1bmN0aW9uc11cbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGtpbmREaWZmID0gdGhpcy5fa2luZFJhbmsoYS5raW5kKSAtIHRoaXMuX2tpbmRSYW5rKGIua2luZCk7XG5cbiAgICAgICAgcmV0dXJuIGtpbmREaWZmICE9PSAwID8ga2luZERpZmYgOiBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfa2luZFJhbmsoa2luZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCByYW5rID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIuaW5kZXhPZihraW5kKTtcblxuICAgIHJldHVybiByYW5rID09PSAtMSA/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX09SREVSLmxlbmd0aCA6IHJhbms7XG4gIH1cbn1cbiIsIjxmcy1kaWFsb2c+XG4gIDxmcy1kaWFsb2ctdGl0bGU+XG4gICAge3sgZW50aXR5S2V5IH19IOKAlCB7eyBzb3VyY2VMYWJlbCB9fVxuICA8L2ZzLWRpYWxvZy10aXRsZT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2ICpmc1NrZWxldG9uPVwiZW50aXR5RnVuY3Rpb25zKClcIj5cbiAgICAgIEBpZiAoZW50aXR5RnVuY3Rpb25zKCk7IGFzIGZucykge1xuICAgICAgICBAaWYgKGZ1bmN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIEBpZiAoZm5zLmdlbmVyYXRlZEF0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGludCBmdW5jdGlvbnMtZ2VuZXJhdGVkXCI+XG4gICAgICAgICAgICAgIERpc2NvdmVyZWQgZnJvbSB7eyBkaXNjb3ZlcmVkQ2xhc3MoKSB9fSAmbWlkZG90O1xuICAgICAgICAgICAgICA8ZnMtZGF0ZVxuICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZm5zLmdlbmVyYXRlZEF0XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1hdD1cImRhdGUtdGltZVwiPlxuICAgICAgICAgICAgICA8L2ZzLWRhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9ucy1saXN0XCI+XG4gICAgICAgICAgICBAZm9yIChmbiBvZiBmdW5jdGlvbnMoKTsgdHJhY2sgZm4uY2xhc3MgKyAnOjonICsgZm4ubWV0aG9kKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICBzaXplPVwidGlueVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJraW5kQ29sb3IoZm4ua2luZClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiI2ZmZmZmZlwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBmbi5raW5kIH19XG4gICAgICAgICAgICAgICAgICA8L2ZzLWNoaXA+XG4gICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImZ1bmN0aW9uLW1ldGhvZFwiPnt7IGZuLm1ldGhvZCB9fTwvY29kZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tc3VtbWFyeVwiPnt7IGZuLnN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICBAaWYgKGZuLnByb2R1Y2VzKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb24tcHJvZHVjZXMgaGludFwiPlByb2R1Y2VzOiB7eyBmbi5wcm9kdWNlcyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50XCI+XG4gICAgICAgICAgICBObyBmdW5jdGlvbnMgY2FjaGVkIGZvciB0aGlzIGVudGl0eSB5ZXQg4oCUIHJ1biBhIGJ1aWxkIHRvIGRpc2NvdmVyIGl0cyBjb2RlLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICBDbG9zZVxuICAgIDwvYnV0dG9uPlxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbjwvZnMtZGlhbG9nPlxuIl19
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9lbnRpdHktZnVuY3Rpb25zL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZW50aXR5LWZ1bmN0aW9ucy9lbnRpdHktZnVuY3Rpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFjcEQsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usd0RBQXdEO0FBaUJ4RCxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGtGQUFrRjtJQUMxRSxNQUFNLENBQVUsV0FBVyxHQUEyQjtRQUM1RCxhQUFhLEVBQUUsU0FBUztRQUN4Qixl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TyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9ELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsQ0FBQzt3R0F4RVUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isd0VDN0NyQyxveURBc0RBLHNyQkRuQkksU0FBUyxpTEFDVCxnQkFBZ0IseUdBQ2hCLGdCQUFnQiw0SEFDaEIsY0FBYyxvTEFDZCxZQUFZLHFYQUNaLFlBQVksNElBQ1osY0FBYyw4VEFDZCxnQkFBZ0I7OzRGQUdQLHdCQUF3QjtrQkFoQnBDLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNDaGlwTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY2hpcCc7XG5pbXBvcnQgeyBGc0RhdGVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb24sXG4gIFNlbWFudGljRW50aXR5RnVuY3Rpb25zLFxuICBTZW1hbnRpY0Z1bmN0aW9uU291cmNlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RnVuY3Rpb25zRGlhbG9nRGF0YSB7XG4gIGVudGl0eUtleTogc3RyaW5nO1xuICBzb3VyY2U6IFNlbWFudGljRnVuY3Rpb25Tb3VyY2U7XG59XG5cblxuLy8gT25lIGdyb3VwIG9mIGEgdW5pdCdzIEFJLWNsYXNzaWZpZWQgY2FjaGVkIGNvZGUgZnVuY3Rpb25zIOKAlCBhbiBlbnRpdHkncyBtb2RlbFxuLy8gb3IgaGFuZGxlciBjbGFzcywgb3IgdGhlIHNpbmdsZSBncm91cCBvZiBhIHN0YW5kYWxvbmUgY29kZSBjbGFzcy4gRmV0Y2hlZCBvblxuLy8gb3BlbiBmcm9tIHRoZSBzaGFyZWQgcGVyLWtleSBlbmRwb2ludCAob25lIHBheWxvYWQgY2FycmllcyBldmVyeSBncm91cCwgZWFjaFxuLy8gcm93IHRhZ2dlZCB3aXRoIGl0cyBzb3VyY2UpIGFuZCBmaWx0ZXJlZCBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LWZ1bmN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VudGl0eS1mdW5jdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIEZzQ2hpcE1vZHVsZSxcbiAgICBGc0RhdGVNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50IHtcblxuICAvLyBPbmUgY29sb3IgcGVyIEFJIGNsYXNzaWZpY2F0aW9uIGtpbmQsIHNvIGEgZnVuY3Rpb24ncyBuYXR1cmUgcmVhZHMgYXQgYSBnbGFuY2UuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtJTkRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdjYWxjdWxhdGlvbic6ICcjMTU2NWMwJyxcbiAgICAnYnVzaW5lc3MtcnVsZSc6ICcjNmExYjlhJyxcbiAgICAncXVlcnknOiAnIzAwNjk1YycsXG4gICAgJ211dGF0aW9uJzogJyNlNjUxMDAnLFxuICAgICdhY2Nlc3Nvcic6ICcjNTQ2ZTdhJyxcbiAgICAnb3RoZXInOiAnIzc1NzU3NScsXG4gIH07XG5cbiAgLy8gSW50ZXJlc3RpbmcgbG9naWMgZmlyc3Q6IGRlcml2ZWQgdmFsdWVzIGFuZCBydWxlcywgdGhlbiBkYXRhIGFjY2VzcywgdGhlbiB0aGUgcmVzdC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgS0lORF9PUkRFUiA9IFsnY2FsY3VsYXRpb24nLCAnYnVzaW5lc3MtcnVsZScsICdxdWVyeScsICdtdXRhdGlvbicsICdhY2Nlc3NvcicsICdvdGhlciddO1xuXG4gIC8vIFRoZSBkaWFsb2cgdGl0bGUgcGVyIGdyb3VwLiBBIHN0YW5kYWxvbmUgY2xhc3MgaGFzIG5vIG1vZGVsL2hhbmRsZXIgc3BsaXQsXG4gIC8vIHNvIGl0cyBvbmUgZ3JvdXAgaXMganVzdCB0aGUgY29kZSB0aGUgYnVpbGQgcmVhZC5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU09VUkNFX0xBQkVMUzogUmVjb3JkPFNlbWFudGljRnVuY3Rpb25Tb3VyY2UsIHN0cmluZz4gPSB7XG4gICAgbW9kZWw6ICdNb2RlbCBmdW5jdGlvbnMnLFxuICAgIGhhbmRsZXI6ICdIYW5kbGVyIGZ1bmN0aW9ucycsXG4gICAgY2xhc3M6ICdDb2RlIGZ1bmN0aW9ucycsXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YSA9IGluamVjdDxFbnRpdHlGdW5jdGlvbnNEaWFsb2dEYXRhPihNQVRfRElBTE9HX0RBVEEpO1xuXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHlLZXkgPSB0aGlzLl9kYXRhLmVudGl0eUtleTtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZUxhYmVsID0gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LlNPVVJDRV9MQUJFTFNbdGhpcy5fZGF0YS5zb3VyY2VdO1xuXG4gIC8vIG51bGwgdW50aWwgbG9hZGVkIOKAlCBnYXRlcyB0aGUgbGlzdCBiZWhpbmQgdGhlIHNrZWxldG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5RnVuY3Rpb25zID0gc2lnbmFsPFNlbWFudGljRW50aXR5RnVuY3Rpb25zIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNsYXNzIHRoaXMgZ3JvdXAncyBmdW5jdGlvbnMgd2VyZSBkaXNjb3ZlcmVkIGZyb20uIEEgc3RhbmRhbG9uZSBjb2RlXG4gIC8vIGNsYXNzIGhhcyBubyBoYW5kbGVyLCBzbyBpdHMgZ3JvdXAgcmVhZHMgdGhlIG1vZGVsIHNsb3QgbGlrZSAnbW9kZWwnIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBkaXNjb3ZlcmVkQ2xhc3MgPSBjb21wdXRlZDxzdHJpbmcgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy5lbnRpdHlGdW5jdGlvbnMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhLnNvdXJjZSA9PT0gJ2hhbmRsZXInID8gbG9hZGVkPy5oYW5kbGVyQ2xhc3MgOiBsb2FkZWQ/Lm1vZGVsQ2xhc3M7XG4gIH0pO1xuXG4gIC8vIFRoaXMgZ3JvdXAncyBmdW5jdGlvbnMsIG9yZGVyZWQgYnkga2luZCBwcmlvcml0eSB0aGVuIG1ldGhvZCBuYW1lLlxuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25zID0gY29tcHV0ZWQ8U2VtYW50aWNFbnRpdHlGdW5jdGlvbltdPigoKSA9PlxuICAgIHRoaXMuX3NvcnRGdW5jdGlvbnMoXG4gICAgICAodGhpcy5lbnRpdHlGdW5jdGlvbnMoKT8uZnVuY3Rpb25zID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChmbikgPT4gZm4uc291cmNlID09PSB0aGlzLl9kYXRhLnNvdXJjZSksXG4gICAgKSxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpbmplY3QoUmVwb3J0RGF0YSkuc2VtYW50aWNFbnRpdHlGdW5jdGlvbnModGhpcy5fZGF0YS5lbnRpdHlLZXkpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKGVudGl0eUZ1bmN0aW9uczogU2VtYW50aWNFbnRpdHlGdW5jdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5lbnRpdHlGdW5jdGlvbnMuc2V0KGVudGl0eUZ1bmN0aW9ucyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBraW5kQ29sb3Ioa2luZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfQ09MT1JTW2tpbmRdID8/IEVudGl0eUZ1bmN0aW9uc0NvbXBvbmVudC5LSU5EX0NPTE9SUy5vdGhlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NvcnRGdW5jdGlvbnMoZnVuY3Rpb25zOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10pOiBTZW1hbnRpY0VudGl0eUZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBbLi4uZnVuY3Rpb25zXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qga2luZERpZmYgPSB0aGlzLl9raW5kUmFuayhhLmtpbmQpIC0gdGhpcy5fa2luZFJhbmsoYi5raW5kKTtcblxuICAgICAgICByZXR1cm4ga2luZERpZmYgIT09IDAgPyBraW5kRGlmZiA6IGEubWV0aG9kLmxvY2FsZUNvbXBhcmUoYi5tZXRob2QpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9raW5kUmFuayhraW5kOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJhbmsgPSBFbnRpdHlGdW5jdGlvbnNDb21wb25lbnQuS0lORF9PUkRFUi5pbmRleE9mKGtpbmQpO1xuXG4gICAgcmV0dXJuIHJhbmsgPT09IC0xID8gRW50aXR5RnVuY3Rpb25zQ29tcG9uZW50LktJTkRfT1JERVIubGVuZ3RoIDogcmFuaztcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGZzLWRpYWxvZy10aXRsZT5cbiAgICB7eyBlbnRpdHlLZXkgfX0g4oCUIHt7IHNvdXJjZUxhYmVsIH19XG4gIDwvZnMtZGlhbG9nLXRpdGxlPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKmZzU2tlbGV0b249XCJlbnRpdHlGdW5jdGlvbnMoKVwiPlxuICAgICAgQGlmIChlbnRpdHlGdW5jdGlvbnMoKTsgYXMgZm5zKSB7XG4gICAgICAgIEBpZiAoZnVuY3Rpb25zKCkubGVuZ3RoKSB7XG4gICAgICAgICAgQGlmIChmbnMuZ2VuZXJhdGVkQXQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaW50IGZ1bmN0aW9ucy1nZW5lcmF0ZWRcIj5cbiAgICAgICAgICAgICAgRGlzY292ZXJlZCBmcm9tIHt7IGRpc2NvdmVyZWRDbGFzcygpIH19ICZtaWRkb3Q7XG4gICAgICAgICAgICAgIDxmcy1kYXRlXG4gICAgICAgICAgICAgICAgICBbZGF0ZV09XCJmbnMuZ2VuZXJhdGVkQXRcIlxuICAgICAgICAgICAgICAgICAgZm9ybWF0PVwiZGF0ZS10aW1lXCI+XG4gICAgICAgICAgICAgIDwvZnMtZGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVuY3Rpb25zLWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKGZuIG9mIGZ1bmN0aW9ucygpOyB0cmFjayBmbi5jbGFzcyArICc6OicgKyBmbi5tZXRob2QpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bmN0aW9uLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgICA8ZnMtY2hpcFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ0aW55XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImtpbmRDb2xvcihmbi5raW5kKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCIjZmZmZmZmXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGZuLmtpbmQgfX1cbiAgICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZnVuY3Rpb24tbWV0aG9kXCI+e3sgZm4ubWV0aG9kIH19PC9jb2RlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1zdW1tYXJ5XCI+e3sgZm4uc3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZiAoZm4ucHJvZHVjZXMpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5jdGlvbi1wcm9kdWNlcyBoaW50XCI+UHJvZHVjZXM6IHt7IGZuLnByb2R1Y2VzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhpbnRcIj5cbiAgICAgICAgICAgIE5vIGZ1bmN0aW9ucyBjYWNoZWQgZm9yIHRoaXMgZW50aXR5IHlldCDigJQgcnVuIGEgYnVpbGQgdG8gZGlzY292ZXIgaXRzIGNvZGUuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIENsb3NlXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=