verben-workflow-ui 0.2.2 → 0.2.4

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.
Files changed (47) hide show
  1. package/esm2022/lib/components/designer/models/types.mjs +1 -1
  2. package/esm2022/lib/components/designer/services/wf-mapper.service.mjs +3 -3
  3. package/esm2022/lib/components/workflow-designer/conditions-popup/conditions-popup.component.mjs +76 -0
  4. package/esm2022/lib/components/workflow-designer/decision-popup/decision-popup.component.mjs +65 -0
  5. package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +245 -17
  6. package/esm2022/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.mjs +26 -14
  7. package/esm2022/lib/components/workflow-designer/services/connection.service.mjs +220 -0
  8. package/esm2022/lib/components/workflow-designer/services/node-management.service.mjs +288 -0
  9. package/esm2022/lib/components/workflow-designer/services/popup.service.mjs +235 -0
  10. package/esm2022/lib/components/workflow-designer/services/swimlane.service.mjs +145 -0
  11. package/esm2022/lib/components/workflow-designer/services/transformer.service.mjs +260 -0
  12. package/esm2022/lib/components/workflow-designer/stage-dialog/stage-dialog.component.mjs +67 -11
  13. package/esm2022/lib/components/workflow-designer/stage-node/stage-node.component.mjs +9 -18
  14. package/esm2022/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +30 -24
  15. package/esm2022/lib/components/workflow-designer/workflow-data.service.mjs +2 -2
  16. package/esm2022/lib/components/workflow-designer/workflow-designer.component.mjs +138 -96
  17. package/esm2022/lib/components/workflow-designer/workflow-designer.module.mjs +27 -3
  18. package/esm2022/lib/components/workflow-designer/workflow-designer.state.mjs +243 -205
  19. package/esm2022/lib/components/workflow-designer/workflow-designer.types.mjs +1 -1
  20. package/esm2022/lib/models/SwimLane.mjs +1 -1
  21. package/esm2022/lib/models/Workflow.mjs +1 -1
  22. package/esm2022/lib/models/WorkflowStage.mjs +1 -1
  23. package/esm2022/lib/services/http-web-request.service.mjs +2 -2
  24. package/fesm2022/verben-workflow-ui.mjs +2644 -1005
  25. package/fesm2022/verben-workflow-ui.mjs.map +1 -1
  26. package/lib/components/designer/models/types.d.ts +1 -1
  27. package/lib/components/workflow-designer/conditions-popup/conditions-popup.component.d.ts +34 -0
  28. package/lib/components/workflow-designer/decision-popup/decision-popup.component.d.ts +26 -0
  29. package/lib/components/workflow-designer/designer-canvas/designer-canvas.component.d.ts +35 -1
  30. package/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.d.ts +14 -3
  31. package/lib/components/workflow-designer/services/connection.service.d.ts +85 -0
  32. package/lib/components/workflow-designer/services/node-management.service.d.ts +52 -0
  33. package/lib/components/workflow-designer/services/popup.service.d.ts +139 -0
  34. package/lib/components/workflow-designer/services/swimlane.service.d.ts +51 -0
  35. package/lib/components/workflow-designer/services/transformer.service.d.ts +36 -0
  36. package/lib/components/workflow-designer/stage-dialog/stage-dialog.component.d.ts +17 -2
  37. package/lib/components/workflow-designer/stage-node/stage-node.component.d.ts +2 -2
  38. package/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.d.ts +7 -1
  39. package/lib/components/workflow-designer/workflow-designer.component.d.ts +2 -1
  40. package/lib/components/workflow-designer/workflow-designer.module.d.ts +6 -4
  41. package/lib/components/workflow-designer/workflow-designer.state.d.ts +17 -1
  42. package/lib/components/workflow-designer/workflow-designer.types.d.ts +2 -0
  43. package/lib/models/SwimLane.d.ts +1 -0
  44. package/lib/models/Workflow.d.ts +1 -0
  45. package/lib/models/WorkflowStage.d.ts +1 -1
  46. package/package.json +1 -1
  47. package/styles/styles.css +23 -0
@@ -41,22 +41,24 @@ export class WorkflowDesignerComponent {
41
41
  this.isSaving = true;
42
42
  // Transform the UI model to the API model
43
43
  const workflowModel = this.state.transformToWorkflowModel();
44
- // Save to the backend
45
- this.dataService
46
- .saveWorkflows([workflowModel])
47
- .then((response) => {
48
- console.log('Workflow saved successfully:', response);
49
- // If the API returns an updated workflow, we might want to reload it
50
- if (response?.Result?.Code) {
51
- this.workflowCode = response.Result.Code;
52
- }
53
- this.isSaving = false;
54
- })
55
- .catch((error) => {
56
- console.error('Error saving workflow:', error);
57
- this.isSaving = false;
58
- // Handle error - show a notification, etc.
59
- });
44
+ if (workflowModel) {
45
+ // Save to the backend
46
+ this.dataService
47
+ .saveWorkflows([workflowModel])
48
+ .then((response) => {
49
+ console.log('Workflow saved successfully:', response);
50
+ // If the API returns an updated workflow, we might want to reload it
51
+ if (response?.Result?.Code) {
52
+ this.workflowCode = response.Result.Code;
53
+ }
54
+ this.isSaving = false;
55
+ })
56
+ .catch((error) => {
57
+ console.error('Error saving workflow:', error);
58
+ this.isSaving = false;
59
+ // Handle error - show a notification, etc.
60
+ });
61
+ }
60
62
  }
61
63
  loadWorkflow(code) {
62
64
  this.isLoading = true;
@@ -64,7 +66,10 @@ export class WorkflowDesignerComponent {
64
66
  .getWorkflowWithParam(code)
65
67
  .then((response) => {
66
68
  if (response && response.Result) {
67
- this.parseWorkflowData(response.Result);
69
+ // Store the workflow ID
70
+ const wf = response.Result[0];
71
+ this.state.setWorkflowId(wf.Id);
72
+ this.parseWorkflowData(wf);
68
73
  }
69
74
  this.isLoading = false;
70
75
  })
@@ -75,64 +80,115 @@ export class WorkflowDesignerComponent {
75
80
  }
76
81
  // Method to parse workflow data from API and populate the designer
77
82
  parseWorkflowData(workflow) {
83
+ // Store the complete workflow
84
+ this.state.workflow = workflow;
78
85
  // Clear existing state
79
86
  this.state.swimlanes = [];
80
87
  this.state.connections = [];
88
+ this.state.swimlaneRecord = {};
89
+ this.state.stageRecord = {};
90
+ this.state.actionRecord = {};
81
91
  // Set workflow form if exists
82
92
  if (workflow.Form) {
83
93
  this.state.setWorkflowForm(workflow.Form, workflow.FormName || 'Workflow Form');
84
94
  }
95
+ // Store the workflow ID
96
+ this.state.setWorkflowId(workflow.Id);
85
97
  // Process swimlanes first
86
98
  if (workflow.Lanes && workflow.Lanes.length) {
87
99
  workflow.Lanes.sort((a, b) => a.Position - b.Position).forEach((lane) => {
88
- this.state.addSwimlane(lane.Name || `Lane ${lane.Position}`, lane.Tags || []);
100
+ // Store original lane in record
101
+ this.state.swimlaneRecord[lane.Id] = lane;
102
+ // Add swimlane to UI model with the original ID
103
+ const swimlane = {
104
+ order: lane.Position,
105
+ label: lane.Name || `Lane ${lane.Position}`,
106
+ tags: lane.Tags || [],
107
+ nodes: [],
108
+ id: lane.Id, // Store the original ID
109
+ };
110
+ this.state.swimlanes.push(swimlane);
111
+ // Register loaded object
112
+ this.state.registerLoadedObject(lane.Id, lane.Code);
89
113
  });
90
114
  }
91
115
  // Process stages
92
116
  if (workflow.Stages && workflow.Stages.length) {
93
117
  workflow.Stages.forEach((stage) => {
94
- // Find swimlane index
95
- const swimlaneIndex = this.findSwimlaneIndexByLaneId(stage.SwimLane);
118
+ // Store original stage in record
119
+ this.state.stageRecord[stage.Id] = stage;
120
+ // Find swimlane index by SwimLane ID
121
+ const swimlaneIndex = this.state.swimlanes.findIndex((lane) => lane.id === stage.SwimLane);
96
122
  if (swimlaneIndex !== -1) {
97
123
  const x = stage.Coordinates?.X || 100;
98
124
  const y = stage.Coordinates?.Y || 50;
99
- this.state.addNode(swimlaneIndex, 'stage', x, y, {
100
- Name: stage.Name,
101
- Description: stage.Description,
102
- Duration: stage.Duration,
103
- PassOnRule: stage.PassOnRule,
104
- ActorRule: stage.ActorRule,
105
- MinNoOfActor: stage.MinNoOfActor,
106
- Tags: stage.Tags || [],
107
- IsParallel: stage.IsParallel,
108
- IsEntryPoint: stage.IsEntryPoint,
109
- IsExitPoint: stage.IsExitPoint,
110
- Id: stage.Id,
111
- });
125
+ // Create node with original ID
126
+ const node = {
127
+ id: stage.Id, // Use original ID
128
+ type: 'stage',
129
+ x: x,
130
+ y: y - swimlaneIndex * 263 - 40, // Adjust Y for swimlane offset
131
+ width: 169,
132
+ height: 100,
133
+ isStartNode: stage.IsEntryPoint,
134
+ stageData: {
135
+ Name: stage.Name,
136
+ Description: stage.Description,
137
+ Duration: stage.Duration,
138
+ PassOnRule: stage.PassOnRule,
139
+ ActorRule: stage.ActorRule,
140
+ MinNoOfActor: stage.MinNoOfActor,
141
+ Tags: stage.Tags || [],
142
+ IsParallel: stage.IsParallel,
143
+ IsEntryPoint: stage.IsEntryPoint,
144
+ IsExitPoint: stage.IsExitPoint,
145
+ Id: stage.Id, // Keep original ID
146
+ },
147
+ connectionPoints: [], // Initialize with empty array
148
+ };
149
+ // Generate connection points
150
+ node.connectionPoints = this.state.generateConnectionPoints(node);
151
+ // Add node to swimlane
152
+ this.state.swimlanes[swimlaneIndex].nodes =
153
+ this.state.swimlanes[swimlaneIndex].nodes || [];
154
+ this.state.swimlanes[swimlaneIndex].nodes.push(node);
155
+ // If this is a start node, update state
156
+ if (stage.IsEntryPoint) {
157
+ this.state.startNodeId = stage.Id;
158
+ }
159
+ // Register loaded stage
160
+ this.state.registerLoadedObject(stage.Id, stage.Code);
112
161
  }
113
162
  });
114
163
  }
115
164
  // Process connections/actions
116
165
  if (workflow.Actions && workflow.Actions.length) {
117
166
  workflow.Actions.forEach((action) => {
167
+ // Store original action in record
168
+ this.state.actionRecord[action.Id] = action;
118
169
  // Find source and target nodes
119
170
  const sourceNodeInfo = this.state.findNodeById(action.FromStage);
120
171
  const targetNodeInfo = this.state.findNodeById(action.ToStage);
121
172
  if (sourceNodeInfo && targetNodeInfo) {
122
173
  // Find suitable connection points
123
- const sourcePoint = sourceNodeInfo.node.connectionPoints?.[0];
124
- const targetPoint = targetNodeInfo.node.connectionPoints?.[0];
174
+ const sourceNode = sourceNodeInfo.node;
175
+ const targetNode = targetNodeInfo.node;
176
+ const sourcePoint = sourceNode.connectionPoints?.find((p) => p.type === 'right' || p.type === 'bottom');
177
+ const targetPoint = targetNode.connectionPoints?.find((p) => p.type === 'left' || p.type === 'top');
125
178
  if (sourcePoint && targetPoint) {
126
179
  const connection = {
127
- id: action.Id,
180
+ id: action.Id, // Use original ID
128
181
  sourceNodeId: action.FromStage,
129
182
  targetNodeId: action.ToStage,
130
183
  sourcePointId: sourcePoint.id,
131
184
  targetPointId: targetPoint.id,
132
185
  sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,
133
186
  targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,
187
+ condition: action.PassOnRule || '',
134
188
  };
135
189
  this.state.connections.push(connection);
190
+ // Register loaded action
191
+ this.state.registerLoadedObject(action.Id, action.Code);
136
192
  }
137
193
  }
138
194
  });
@@ -140,8 +196,11 @@ export class WorkflowDesignerComponent {
140
196
  }
141
197
  // Helper method to find swimlane index by Lane ID
142
198
  findSwimlaneIndexByLaneId(laneId) {
143
- // In a real implementation, you would maintain a mapping between API lane IDs and UI swimlane indices
144
- // For now we'll just return the index based on position
199
+ // First check our mapping
200
+ if (this.state.laneIdToIndexMap.has(laneId)) {
201
+ return this.state.laneIdToIndexMap.get(laneId);
202
+ }
203
+ // Fallback to the original logic (for backward compatibility)
145
204
  const parts = laneId.split('-');
146
205
  if (parts.length > 1) {
147
206
  const index = parseInt(parts[1]);
@@ -198,18 +257,18 @@ export class WorkflowDesignerComponent {
198
257
  console.log('Opening swimlane dialog for new swimlane');
199
258
  this.editingSwimlaneIndex = null; // Set to null to indicate creating a new swimlane
200
259
  this.openSwimlaneDialog();
260
+ this.selectedTool = null;
201
261
  break;
202
262
  case 'stage':
203
263
  if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {
204
264
  console.log(`Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`);
205
- // Store position for later node creation
206
- this.pendingStagePosition = {
207
- swimlaneIndex,
208
- x: event.x,
209
- y: event.y,
210
- };
211
- // Show stage properties dialog
212
- this.showStageDialog = true;
265
+ // Create the stage directly with default properties
266
+ const node = this.state.addNode(swimlaneIndex, 'stage', event.x, event.y, { Name: 'New Stage' } // Add default properties
267
+ );
268
+ if (node) {
269
+ // Reset the selected tool after placing a node
270
+ this.selectedTool = null;
271
+ }
213
272
  }
214
273
  break;
215
274
  case 'decision':
@@ -255,56 +314,39 @@ export class WorkflowDesignerComponent {
255
314
  this.editingSwimlaneIndex = null;
256
315
  }
257
316
  onStageDialogSaved(stageData) {
258
- if (this.pendingStagePosition) {
259
- // Create the stage node
260
- const node = this.state.addNode(this.pendingStagePosition.swimlaneIndex, 'stage', this.pendingStagePosition.x, this.pendingStagePosition.y, stageData);
261
- console.log('Source point on dialog save:', this.state.draggingConnectionData.sourcePoint);
262
- console.log('Is creating from connection:', this.isCreatingStageFromConnection);
263
- if (node) {
264
- // If this was created from a connection, create the connection
265
- if (this.isCreatingStageFromConnection &&
266
- this.pendingConnectionSourcePoint) {
267
- console.log('Using stored source point:', this.pendingConnectionSourcePoint);
268
- // Find a suitable connection point on the new node
269
- if (node.connectionPoints && node.connectionPoints.length > 0) {
270
- const sourcePoint = this.pendingConnectionSourcePoint;
271
- // Find opposing type connection point
272
- const opposingType = {
273
- right: 'left',
274
- left: 'right',
275
- top: 'bottom',
276
- bottom: 'top',
277
- }[sourcePoint.type];
278
- const targetPoint = node.connectionPoints.find((p) => p.type === opposingType);
279
- if (targetPoint) {
280
- // Create the connection using our stored source data
281
- const connection = {
282
- id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
283
- sourceNodeId: sourcePoint.nodeId,
284
- targetNodeId: node.id,
285
- sourcePointId: sourcePoint.id,
286
- targetPointId: targetPoint.id,
287
- sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex,
288
- targetSwimlaneIndex: this.pendingStagePosition.swimlaneIndex,
289
- };
290
- // Add connection to the state
291
- this.state.connections.push(connection);
292
- console.log('Created connection:', connection);
293
- }
294
- }
295
- // End the connection drag
296
- // this.state.endConnectionDrag();
317
+ if (this.canvasRef.activeStageId) {
318
+ // Editing an existing stage
319
+ const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);
320
+ if (nodeInfo) {
321
+ // Update the stage data
322
+ nodeInfo.node.stageData = {
323
+ ...nodeInfo.node.stageData,
324
+ ...stageData,
325
+ };
326
+ console.log('Updated stage data:', nodeInfo.node.stageData);
327
+ }
328
+ this.canvasRef.activeStageId = null;
329
+ }
330
+ else if (this.pendingStagePosition) {
331
+ if (this.canvasRef.activeStageId) {
332
+ // Editing an existing stage
333
+ const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);
334
+ if (nodeInfo) {
335
+ // Update the stage data
336
+ nodeInfo.node.stageData = {
337
+ ...nodeInfo.node.stageData,
338
+ ...stageData,
339
+ };
340
+ console.log('Updated stage data:', nodeInfo.node.stageData);
297
341
  }
298
- // Reset the selected tool after placing a node
299
- this.selectedTool = null;
342
+ this.canvasRef.activeStageId = null;
343
+ }
344
+ else if (this.pendingStagePosition) {
345
+ // Creating a new stage (keep existing logic for this case)
346
+ // ...existing code...
300
347
  }
301
- // Clear pending data
302
- this.pendingStagePosition = null;
303
- this.isCreatingStageFromConnection = false;
304
- this.pendingConnectionSourcePoint = null;
305
- this.pendingConnectionSourceSwimlaneIndex = null;
348
+ this.showStageDialog = false;
306
349
  }
307
- console.log('Connections after adding new one:', this.state.connections);
308
350
  this.showStageDialog = false;
309
351
  }
310
352
  onSubflowSelected() {
@@ -312,15 +354,15 @@ export class WorkflowDesignerComponent {
312
354
  this.selectedTool = null;
313
355
  }
314
356
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerComponent, deps: [{ token: i1.WorkflowDesignerState }, { token: i2.WorkflowDataService }], target: i0.ɵɵFactoryTarget.Component });
315
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WorkflowDesignerComponent, selector: "lib-workflow-designer", inputs: { workflowCode: "workflowCode" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true }], ngImport: i0, template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>Workflow Designer</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n (toolSelected)=\"onToolSelected($event)\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"\n editingSwimlaneIndex !== null\n ? {\n name: state.swimlanes[editingSwimlaneIndex].label,\n tags: state.swimlanes[editingSwimlaneIndex].tags\n }\n : null\n \"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.DesignerToolbarComponent, selector: "lib-designer-toolbar", inputs: ["selectedTool", "isSaving"], outputs: ["toolSelected", "saveWorkflow"] }, { kind: "component", type: i5.DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: ["selectedTool"], outputs: ["clickedPosition", "subflowSelected", "showStageDialog"] }, { kind: "component", type: i6.SwimlaneDialogComponent, selector: "lib-swimlane-dialog", inputs: ["visible", "swimlaneData"], outputs: ["closed", "created"] }, { kind: "component", type: i7.StageDialogComponent, selector: "lib-stage-dialog", inputs: ["visible", "stageData"], outputs: ["closed", "saved"] }] });
357
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WorkflowDesignerComponent, selector: "lib-workflow-designer", inputs: { workflowCode: "workflowCode" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true }], ngImport: i0, template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>Workflow Designer</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n [isSaving]=\"isSaving\"\n (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"\n editingSwimlaneIndex !== null\n ? {\n name: state.swimlanes[editingSwimlaneIndex].label,\n tags: state.swimlanes[editingSwimlaneIndex].tags\n }\n : null\n \"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.DesignerToolbarComponent, selector: "lib-designer-toolbar", inputs: ["selectedTool", "isSaving"], outputs: ["toolSelected", "saveWorkflow"] }, { kind: "component", type: i5.DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: ["selectedTool"], outputs: ["clickedPosition", "subflowSelected", "showStageDialog", "stagePropertiesUpdated"] }, { kind: "component", type: i6.SwimlaneDialogComponent, selector: "lib-swimlane-dialog", inputs: ["visible", "swimlaneData"], outputs: ["closed", "created"] }, { kind: "component", type: i7.StageDialogComponent, selector: "lib-stage-dialog", inputs: ["visible", "stageData"], outputs: ["closed", "saved"] }] });
316
358
  }
317
359
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerComponent, decorators: [{
318
360
  type: Component,
319
- args: [{ selector: 'lib-workflow-designer', template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>Workflow Designer</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n (toolSelected)=\"onToolSelected($event)\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"\n editingSwimlaneIndex !== null\n ? {\n name: state.swimlanes[editingSwimlaneIndex].label,\n tags: state.swimlanes[editingSwimlaneIndex].tags\n }\n : null\n \"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
361
+ args: [{ selector: 'lib-workflow-designer', template: "<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>Workflow Designer</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n [isSaving]=\"isSaving\"\n (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"\n editingSwimlaneIndex !== null\n ? {\n name: state.swimlanes[editingSwimlaneIndex].label,\n tags: state.swimlanes[editingSwimlaneIndex].tags\n }\n : null\n \"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n</div>\n", styles: [".workflow-designer{display:flex;flex-direction:column;height:100vh;background-color:#f8fafc}.workflow-header{padding:1rem;background-color:#fff;border-bottom:1px solid #e2e8f0}.workflow-header h1{font-size:1.25rem;font-weight:600;color:#334155;margin:0}.loading-overlay{position:absolute;inset:0;background-color:#ffffffb3;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:1000}.loading-spinner{border:4px solid #f3f3f3;border-top:4px solid #d8b4fe;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite}.loading-text{margin-top:1rem;font-size:1rem;color:#7e22ce}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
320
362
  }], ctorParameters: () => [{ type: i1.WorkflowDesignerState }, { type: i2.WorkflowDataService }], propDecorators: { canvasRef: [{
321
363
  type: ViewChild,
322
364
  args: ['canvasRef']
323
365
  }], workflowCode: [{
324
366
  type: Input
325
367
  }] } });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBYTVELE1BQU0sT0FBTyx5QkFBeUI7SUF3QjNCO0lBQ0M7SUF4QmMsU0FBUyxDQUEyQjtJQUNuRCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUU1QywwQkFBMEI7SUFDMUIsWUFBWSxHQUFhLElBQUksQ0FBQztJQUM5QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFFcEMsa0NBQWtDO0lBQ2xDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsb0JBQW9CLEdBQ2xCLElBQUksQ0FBQztJQUNQLGdCQUFnQixHQUEyQixFQUFFLENBQUM7SUFFOUMsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUMzQyw2QkFBNkIsR0FBWSxLQUFLLENBQUM7SUFFL0MsNEJBQTRCLEdBQTJCLElBQUksQ0FBQztJQUM1RCxvQ0FBb0MsR0FBa0IsSUFBSSxDQUFDO0lBRTNELFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNTLEtBQTRCLEVBQzNCLFdBQWdDO1FBRGpDLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtJ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QixDQUFDLGFBQWE7NkJBQzdELENBQUM7NEJBRUYsOEJBQThCOzRCQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ2pELENBQUM7b0JBQ0gsQ0FBQztvQkFFRCwwQkFBMEI7b0JBQzFCLGtDQUFrQztnQkFDcEMsQ0FBQztnQkFFRCwrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzNCLENBQUM7WUFFRCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO1lBQzNDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7WUFDekMsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLElBQUksQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxpQkFBaUI7UUFDZix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQzt3R0E1WlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsK01DYnRDLDY1Q0FpREE7OzRGRHBDYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCOzRIQUtULFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uUG9pbnQsIFRvb2xUeXBlIH0gZnJvbSAnLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuL3dvcmtmbG93LWRlc2lnbmVyLnN0YXRlJztcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uLy4uL21vZGVscy9UYWcnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdGFnZSB9IGZyb20gJy4uLy4uL21vZGVscy9Xb3JrZmxvd1N0YWdlJztcbmltcG9ydCB7IERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci1jYW52YXMvZGVzaWduZXItY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXb3JrZmxvd0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd29ya2Zsb3ctZGVzaWduZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVzaWduZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdjYW52YXNSZWYnKSBjYW52YXNSZWYhOiBEZXNpZ25lckNhbnZhc0NvbXBvbmVudDtcbiAgQElucHV0KCkgd29ya2Zsb3dDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDdXJyZW50bHkgc2VsZWN0ZWQgdG9vbFxuICBzZWxlY3RlZFRvb2w6IFRvb2xUeXBlID0gbnVsbDtcbiAgc2hvd1N3aW1sYW5lRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gTmV3IHByb3BlcnRpZXMgZm9yIHN0YWdlIGRpYWxvZ1xuICBzaG93U3RhZ2VEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGVuZGluZ1N0YWdlUG9zaXRpb246IHsgc3dpbWxhbmVJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgcGVuZGluZ1N0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPiA9IHt9O1xuXG4gIGVkaXRpbmdTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgaXNDcmVhdGluZ1N0YWdlRnJvbUNvbm5lY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50OiBDb25uZWN0aW9uUG9pbnQgfCBudWxsID0gbnVsbDtcbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHdvcmtmbG93IGRhdGEgaWYgY29kZSBpcyBwcm92aWRlZFxuICAgIGlmICh0aGlzLndvcmtmbG93Q29kZSkge1xuICAgICAgdGhpcy5sb2FkV29ya2Zsb3codGhpcy53b3JrZmxvd0NvZGUpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVXb3JrZmxvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG5cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIFVJIG1vZGVsIHRvIHRoZSBBUEkgbW9kZWxcbiAgICBjb25zdCB3b3JrZmxvd01vZGVsID0gdGhpcy5zdGF0ZS50cmFuc2Zvcm1Ub1dvcmtmbG93TW9kZWwoKTtcblxuICAgIC8vIFNhdmUgdG8gdGhlIGJhY2tlbmRcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuc2F2ZVdvcmtmbG93cyhbd29ya2Zsb3dNb2RlbF0pXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dvcmtmbG93IHNhdmVkIHN1Y2Nlc3NmdWxseTonLCByZXNwb25zZSk7XG4gICAgICAgIC8vIElmIHRoZSBBUEkgcmV0dXJucyBhbiB1cGRhdGVkIHdvcmtmbG93LCB3ZSBtaWdodCB3YW50IHRvIHJlbG9hZCBpdFxuICAgICAgICBpZiAocmVzcG9uc2U/LlJlc3VsdD8uQ29kZSkge1xuICAgICAgICAgIHRoaXMud29ya2Zsb3dDb2RlID0gcmVzcG9uc2UuUmVzdWx0LkNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIHdvcmtmbG93OicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3IgLSBzaG93IGEgbm90aWZpY2F0aW9uLCBldGMuXG4gICAgICB9KTtcbiAgfVxuXG4gIGxvYWRXb3JrZmxvdyhjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgLmdldFdvcmtmbG93V2l0aFBhcmFtKGNvZGUpXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLlJlc3VsdCkge1xuICAgICAgICAgIHRoaXMucGFyc2VXb3JrZmxvd0RhdGEocmVzcG9uc2UuUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvdzonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBwYXJzZSB3b3JrZmxvdyBkYXRhIGZyb20gQVBJIGFuZCBwb3B1bGF0ZSB0aGUgZGVzaWduZXJcbiAgcGFyc2VXb3JrZmxvd0RhdGEod29ya2Zsb3c6IGFueSk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIHN0YXRlXG4gICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zID0gW107XG5cbiAgICAvLyBTZXQgd29ya2Zsb3cgZm9ybSBpZiBleGlzdHNcbiAgICBpZiAod29ya2Zsb3cuRm9ybSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oXG4gICAgICAgIHdvcmtmbG93LkZvcm0sXG4gICAgICAgIHdvcmtmbG93LkZvcm1OYW1lIHx8ICdXb3JrZmxvdyBGb3JtJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHN3aW1sYW5lcyBmaXJzdFxuICAgIGlmICh3b3JrZmxvdy5MYW5lcyAmJiB3b3JrZmxvdy5MYW5lcy5sZW5ndGgpIHtcbiAgICAgIHdvcmtmbG93LkxhbmVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBhLlBvc2l0aW9uIC0gYi5Qb3NpdGlvbikuZm9yRWFjaChcbiAgICAgICAgKGxhbmU6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhdGUuYWRkU3dpbWxhbmUoXG4gICAgICAgICAgICBsYW5lLk5hbWUgfHwgYExhbmUgJHtsYW5lLlBvc2l0aW9ufWAsXG4gICAgICAgICAgICBsYW5lLlRhZ3MgfHwgW11cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RhZ2VzXG4gICAgaWYgKHdvcmtmbG93LlN0YWdlcyAmJiB3b3JrZmxvdy5TdGFnZXMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5TdGFnZXMuZm9yRWFjaCgoc3RhZ2U6IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHN3aW1sYW5lIGluZGV4XG4gICAgICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSB0aGlzLmZpbmRTd2ltbGFuZUluZGV4QnlMYW5lSWQoc3RhZ2UuU3dpbUxhbmUpO1xuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBjb25zdCB4ID0gc3RhZ2UuQ29vcmRpbmF0ZXM/LlggfHwgMTAwO1xuICAgICAgICAgIGNvbnN0IHkgPSBzdGFnZS5Db29yZGluYXRlcz8uWSB8fCA1MDtcblxuICAgICAgICAgIHRoaXMuc3RhdGUuYWRkTm9kZShzd2ltbGFuZUluZGV4LCAnc3RhZ2UnLCB4LCB5LCB7XG4gICAgICAgICAgICBOYW1lOiBzdGFnZS5OYW1lLFxuICAgICAgICAgICAgRGVzY3JpcHRpb246IHN0YWdlLkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgRHVyYXRpb246IHN0YWdlLkR1cmF0aW9uLFxuICAgICAgICAgICAgUGFzc09uUnVsZTogc3RhZ2UuUGFzc09uUnVsZSxcbiAgICAgICAgICAgIEFjdG9yUnVsZTogc3RhZ2UuQWN0b3JSdWxlLFxuICAgICAgICAgICAgTWluTm9PZkFjdG9yOiBzdGFnZS5NaW5Ob09mQWN0b3IsXG4gICAgICAgICAgICBUYWdzOiBzdGFnZS5UYWdzIHx8IFtdLFxuICAgICAgICAgICAgSXNQYXJhbGxlbDogc3RhZ2UuSXNQYXJhbGxlbCxcbiAgICAgICAgICAgIElzRW50cnlQb2ludDogc3RhZ2UuSXNFbnRyeVBvaW50LFxuICAgICAgICAgICAgSXNFeGl0UG9pbnQ6IHN0YWdlLklzRXhpdFBvaW50LFxuICAgICAgICAgICAgSWQ6IHN0YWdlLklkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGNvbm5lY3Rpb25zL2FjdGlvbnNcbiAgICBpZiAod29ya2Zsb3cuQWN0aW9ucyAmJiB3b3JrZmxvdy5BY3Rpb25zLmxlbmd0aCkge1xuICAgICAgd29ya2Zsb3cuQWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IGFueSkgPT4ge1xuICAgICAgICAvLyBGaW5kIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzXG4gICAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoYWN0aW9uLkZyb21TdGFnZSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoYWN0aW9uLlRvU3RhZ2UpO1xuXG4gICAgICAgIGlmIChzb3VyY2VOb2RlSW5mbyAmJiB0YXJnZXROb2RlSW5mbykge1xuICAgICAgICAgIC8vIEZpbmQgc3VpdGFibGUgY29ubmVjdGlvbiBwb2ludHNcbiAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGVJbmZvLm5vZGUuY29ubmVjdGlvblBvaW50cz8uWzBdO1xuICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gdGFyZ2V0Tm9kZUluZm8ubm9kZS5jb25uZWN0aW9uUG9pbnRzPy5bMF07XG5cbiAgICAgICAgICBpZiAoc291cmNlUG9pbnQgJiYgdGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBhY3Rpb24uSWQsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogYWN0aW9uLkZyb21TdGFnZSxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBhY3Rpb24uVG9TdGFnZSxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzb3VyY2VOb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiB0YXJnZXROb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMucHVzaChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZmluZCBzd2ltbGFuZSBpbmRleCBieSBMYW5lIElEXG4gIGZpbmRTd2ltbGFuZUluZGV4QnlMYW5lSWQobGFuZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgeW91IHdvdWxkIG1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIEFQSSBsYW5lIElEcyBhbmQgVUkgc3dpbWxhbmUgaW5kaWNlc1xuICAgIC8vIEZvciBub3cgd2UnbGwganVzdCByZXR1cm4gdGhlIGluZGV4IGJhc2VkIG9uIHBvc2l0aW9uXG4gICAgY29uc3QgcGFydHMgPSBsYW5lSWQuc3BsaXQoJy0nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChwYXJ0c1sxXSk7XG4gICAgICBpZiAoIWlzTmFOKGluZGV4KSAmJiBpbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIEhhbmRsZSB0b29sIHNlbGVjdGlvbiBmcm9tIHRvb2xiYXJcbiAgb25Ub29sU2VsZWN0ZWQodG9vbDogVG9vbFR5cGUpOiB2b2lkIHtcbiAgICAvLyBUb2dnbGUgc2VsZWN0aW9uIGlmIHRoZSBzYW1lIHRvb2wgaXMgY2xpY2tlZCBhZ2FpblxuICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gdGhpcy5zZWxlY3RlZFRvb2wgPT09IHRvb2wgPyBudWxsIDogdG9vbDtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgdG9vbDonLCB0aGlzLnNlbGVjdGVkVG9vbCk7XG4gIH1cblxuICBvcGVuU3dpbWxhbmVEaWFsb2coKSB7XG4gICAgdGhpcy5zaG93U3dpbWxhbmVEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgb25TaG93U3RhZ2VEaWFsb2coZXZlbnQ6IHsgcG9zaXRpb246IGFueTsgaXNGcm9tQ29ubmVjdGlvbjogYm9vbGVhbiB9KSB7XG4gICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIHNob3dTdGFnZURpYWxvZyBldmVudDonLCBldmVudCk7XG4gICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbiA9IGV2ZW50LnBvc2l0aW9uO1xuICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nID0gdHJ1ZTtcblxuICAgIC8vIElmIHRoaXMgaXMgZnJvbSBhIGNvbm5lY3Rpb24gY3JlYXRpb24sIHN0b3JlIHRoYXQgaW5mb1xuICAgIHRoaXMuaXNDcmVhdGluZ1N0YWdlRnJvbUNvbm5lY3Rpb24gPSBldmVudC5pc0Zyb21Db25uZWN0aW9uO1xuXG4gICAgLy8gU3RvcmUgdGhlIHNvdXJjZSBwb2ludCBkYXRhIGJlZm9yZSBpdCBnZXRzIGxvc3RcbiAgICBpZiAoXG4gICAgICBldmVudC5pc0Zyb21Db25uZWN0aW9uICYmXG4gICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnRcbiAgICApIHtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVN3aW1sYW5lSW5kZXggPz8gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnU3RvcmVkIHNvdXJjZSBwb2ludCBmb3IgY29ubmVjdGlvbjonLFxuICAgICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1N0YWdlIGRpYWxvZyBzdGF0ZTonLCB7XG4gICAgICBwZW5kaW5nUG9zaXRpb246IHRoaXMucGVuZGluZ1N0YWdlUG9zaXRpb24sXG4gICAgICBpc1Zpc2libGU6IHRoaXMuc2hvd1N0YWdlRGlhbG9nLFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2FudmFzUG9zaXRpb25DbGljayhldmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBlZGl0IHN3aW1sYW5lIGV2ZW50XG4gICAgaWYgKFxuICAgICAgZXZlbnQueCA9PT0gLTEgJiZcbiAgICAgIGV2ZW50LnkgPj0gMCAmJlxuICAgICAgZXZlbnQueSA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ0VkaXRpbmcgc3dpbWxhbmUnLCBldmVudC55KTtcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBldmVudC55O1xuICAgICAgdGhpcy5vcGVuU3dpbWxhbmVEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgY2FudmFzIGNsaWNrIGhhbmRsaW5nXG4gICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IoZXZlbnQueSAvIDI2Myk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICBjYXNlICdzd2ltbGFuZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdPcGVuaW5nIHN3aW1sYW5lIGRpYWxvZyBmb3IgbmV3IHN3aW1sYW5lJyk7XG4gICAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsOyAvLyBTZXQgdG8gbnVsbCB0byBpbmRpY2F0ZSBjcmVhdGluZyBhIG5ldyBzd2ltbGFuZVxuICAgICAgICB0aGlzLm9wZW5Td2ltbGFuZURpYWxvZygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0YWdlJzpcbiAgICAgICAgaWYgKHN3aW1sYW5lSW5kZXggPj0gMCAmJiBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nICR7dGhpcy5zZWxlY3RlZFRvb2x9IHRvIHN3aW1sYW5lICR7c3dpbWxhbmVJbmRleH1gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFN0b3JlIHBvc2l0aW9uIGZvciBsYXRlciBub2RlIGNyZWF0aW9uXG4gICAgICAgICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICB4OiBldmVudC54LFxuICAgICAgICAgICAgeTogZXZlbnQueSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gU2hvdyBzdGFnZSBwcm9wZXJ0aWVzIGRpYWxvZ1xuICAgICAgICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlY2lzaW9uJzpcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBBZGRpbmcgJHt0aGlzLnNlbGVjdGVkVG9vbH0gdG8gc3dpbWxhbmUgJHtzd2ltbGFuZUluZGV4fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICAgICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRvb2wsXG4gICAgICAgICAgICBldmVudC54LFxuICAgICAgICAgICAgZXZlbnQueVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3RlZCB0b29sIGFmdGVyIHBsYWNpbmcgYSBub2RlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3ViZmxvdyc6XG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ID49IDAgJiYgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYEFkZGluZyAke3RoaXMuc2VsZWN0ZWRUb29sfSB0byBzd2ltbGFuZSAke3N3aW1sYW5lSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gU2hvdyBzdWJmbG93IHdvcmtmbG93IHNlbGVjdGlvbiBwb3B1cFxuICAgICAgICAgIHRoaXMuY2FudmFzUmVmLnNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoXG4gICAgICAgICAgICBldmVudC54LFxuICAgICAgICAgICAgZXZlbnQueSxcbiAgICAgICAgICAgIHN3aW1sYW5lSW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25Td2ltbGFuZURpYWxvZ0ZpbGxlZChldmVudDogeyB0YWdzOiBUYWdbXTsgbmFtZTogc3RyaW5nIH0pIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdTd2ltbGFuZSBkaWFsb2cgZmlsbGVkOicsXG4gICAgICBldmVudCxcbiAgICAgICdFZGl0aW5nIGluZGV4OicsXG4gICAgICB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4XG4gICAgKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgbmFtZSBpcyBub3QgZW1wdHlcbiAgICBpZiAoIWV2ZW50Lm5hbWUgfHwgZXZlbnQubmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTd2ltbGFuZSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4ICE9PSBudWxsKSB7XG4gICAgICAvLyBVcGRhdGUgZXhpc3Rpbmcgc3dpbWxhbmVcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnVXBkYXRpbmcgZXhpc3Rpbmcgc3dpbWxhbmUgYXQgaW5kZXg6JyxcbiAgICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlU3dpbWxhbmUoXG4gICAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXgsXG4gICAgICAgIGV2ZW50Lm5hbWUsXG4gICAgICAgIGV2ZW50LnRhZ3NcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgc3dpbWxhbmVcbiAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyBuZXcgc3dpbWxhbmUnKTtcbiAgICAgIHRoaXMuc3RhdGUuYWRkU3dpbWxhbmUoZXZlbnQubmFtZSwgZXZlbnQudGFncyk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93U3dpbWxhbmVEaWFsb2cgPSBmYWxzZTtcbiAgICB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIG9uU3RhZ2VEaWFsb2dTYXZlZChzdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT4pIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbikge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBub2RlXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICB0aGlzLnBlbmRpbmdTdGFnZVBvc2l0aW9uLnN3aW1sYW5lSW5kZXgsXG4gICAgICAgICdzdGFnZScsXG4gICAgICAgIHRoaXMucGVuZGluZ1N0YWdlUG9zaXRpb24ueCxcbiAgICAgICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbi55LFxuICAgICAgICBzdGFnZURhdGFcbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnU291cmNlIHBvaW50IG9uIGRpYWxvZyBzYXZlOicsXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludFxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnSXMgY3JlYXRpbmcgZnJvbSBjb25uZWN0aW9uOicsXG4gICAgICAgIHRoaXMuaXNDcmVhdGluZ1N0YWdlRnJvbUNvbm5lY3Rpb25cbiAgICAgICk7XG5cbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIC8vIElmIHRoaXMgd2FzIGNyZWF0ZWQgZnJvbSBhIGNvbm5lY3Rpb24sIGNyZWF0ZSB0aGUgY29ubmVjdGlvblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5pc0NyZWF0aW5nU3RhZ2VGcm9tQ29ubmVjdGlvbiAmJlxuICAgICAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICdVc2luZyBzdG9yZWQgc291cmNlIHBvaW50OicsXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRmluZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBub2RlXG4gICAgICAgICAgaWYgKG5vZGUuY29ubmVjdGlvblBvaW50cyAmJiBub2RlLmNvbm5lY3Rpb25Qb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQ7XG5cbiAgICAgICAgICAgIC8vIEZpbmQgb3Bwb3NpbmcgdHlwZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgICBjb25zdCBvcHBvc2luZ1R5cGUgPSB7XG4gICAgICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IG5vZGUuY29ubmVjdGlvblBvaW50cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRQb2ludCkge1xuICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb24gdXNpbmcgb3VyIHN0b3JlZCBzb3VyY2UgZGF0YVxuICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IHNvdXJjZVBvaW50Lm5vZGVJZCxcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXghLFxuICAgICAgICAgICAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ1N0YWdlUG9zaXRpb24uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAvLyBBZGQgY29ubmVjdGlvbiB0byB0aGUgc3RhdGVcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnXG4gICAgICAgICAgLy8gdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIG5vZGVcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRvb2wgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciBwZW5kaW5nIGRhdGFcbiAgICAgIHRoaXMucGVuZGluZ1N0YWdlUG9zaXRpb24gPSBudWxsO1xuICAgICAgdGhpcy5pc0NyZWF0aW5nU3RhZ2VGcm9tQ29ubmVjdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID0gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnQ29ubmVjdGlvbnMgYWZ0ZXIgYWRkaW5nIG5ldyBvbmU6JywgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyk7XG5cbiAgICB0aGlzLnNob3dTdGFnZURpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgb25TdWJmbG93U2VsZWN0ZWQoKSB7XG4gICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIHN1YmZsb3cgbm9kZVxuICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIndvcmtmbG93LWRlc2lnbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ3b3JrZmxvdy1oZWFkZXJcIj5cbiAgICA8aDE+V29ya2Zsb3cgRGVzaWduZXI8L2gxPlxuICA8L2Rpdj5cblxuICA8IS0tIFRvb2xiYXIgQ29tcG9uZW50IC0tPlxuICA8bGliLWRlc2lnbmVyLXRvb2xiYXJcbiAgICBbc2VsZWN0ZWRUb29sXT1cInNlbGVjdGVkVG9vbFwiXG4gICAgKHRvb2xTZWxlY3RlZCk9XCJvblRvb2xTZWxlY3RlZCgkZXZlbnQpXCJcbiAgPlxuICA8L2xpYi1kZXNpZ25lci10b29sYmFyPlxuXG4gIDwhLS0gU2hvdyBsb2FkaW5nIGluZGljYXRvciBpZiBuZWVkZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+TG9hZGluZyB3b3JrZmxvdy4uLjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENhbnZhcyBDb21wb25lbnQgLS0+XG4gIDxsaWItZGVzaWduZXItY2FudmFzXG4gICAgW3NlbGVjdGVkVG9vbF09XCJzZWxlY3RlZFRvb2xcIlxuICAgIChjbGlja2VkUG9zaXRpb24pPVwiaGFuZGxlQ2FudmFzUG9zaXRpb25DbGljaygkZXZlbnQpXCJcbiAgICAoc3ViZmxvd1NlbGVjdGVkKT1cIm9uU3ViZmxvd1NlbGVjdGVkKClcIlxuICAgIChzaG93U3RhZ2VEaWFsb2cpPVwib25TaG93U3RhZ2VEaWFsb2coJGV2ZW50KVwiXG4gICAgI2NhbnZhc1JlZlxuICA+XG4gIDwvbGliLWRlc2lnbmVyLWNhbnZhcz5cblxuICA8bGliLXN3aW1sYW5lLWRpYWxvZ1xuICAgIFt2aXNpYmxlXT1cInNob3dTd2ltbGFuZURpYWxvZ1wiXG4gICAgW3N3aW1sYW5lRGF0YV09XCJcbiAgICAgIGVkaXRpbmdTd2ltbGFuZUluZGV4ICE9PSBudWxsXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbmFtZTogc3RhdGUuc3dpbWxhbmVzW2VkaXRpbmdTd2ltbGFuZUluZGV4XS5sYWJlbCxcbiAgICAgICAgICAgIHRhZ3M6IHN0YXRlLnN3aW1sYW5lc1tlZGl0aW5nU3dpbWxhbmVJbmRleF0udGFnc1xuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsXG4gICAgXCJcbiAgICAoY3JlYXRlZCk9XCJvblN3aW1sYW5lRGlhbG9nRmlsbGVkKCRldmVudClcIlxuICAgIChjbG9zZWQpPVwic2hvd1N3aW1sYW5lRGlhbG9nID0gZmFsc2VcIlxuICA+PC9saWItc3dpbWxhbmUtZGlhbG9nPlxuXG4gIDxsaWItc3RhZ2UtZGlhbG9nXG4gICAgW3Zpc2libGVdPVwic2hvd1N0YWdlRGlhbG9nXCJcbiAgICBbc3RhZ2VEYXRhXT1cInBlbmRpbmdTdGFnZURhdGFcIlxuICAgIChjbG9zZWQpPVwic2hvd1N0YWdlRGlhbG9nID0gZmFsc2VcIlxuICAgIChzYXZlZCk9XCJvblN0YWdlRGlhbG9nU2F2ZWQoJGV2ZW50KVwiXG4gID48L2xpYi1zdGFnZS1kaWFsb2c+XG48L2Rpdj5cbiJdfQ==
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBYzVELE1BQU0sT0FBTyx5QkFBeUI7SUF3QjNCO0lBQ0M7SUF4QmMsU0FBUyxDQUEyQjtJQUNuRCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUU1QywwQkFBMEI7SUFDMUIsWUFBWSxHQUFhLElBQUksQ0FBQztJQUM5QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFFcEMsa0NBQWtDO0lBQ2xDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsb0JBQW9CLEdBQ2xCLElBQUksQ0FBQztJQUNQLGdCQUFnQixHQUEyQixFQUFFLENBQUM7SUFFOUMsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUMzQyw2QkFBNkIsR0FBWSxLQUFLLENBQUM7SUFFL0MsNEJBQTRCLEdBQTJCLElBQUksQ0FBQztJQUM1RCxvQ0FBb0MsR0FBa0IsSUFBSSxDQUFDO0lBRTNELFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixZQUNTLEtBQTRCLEVBQzNCLFdBQWdDO1FBRGpDLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtJ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Q2Isd0JBQXdCO29CQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRzt3QkFDeEIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVM7d0JBQzFCLEdBQUcsU0FBUztxQkFDYixDQUFDO29CQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDdEMsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNyQywyREFBMkQ7Z0JBQzNELHNCQUFzQjtZQUN4QixDQUFDO1lBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxpQkFBaUI7UUFDZix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQzt3R0EvYlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsK01DZHRDLGkrQ0FtREE7OzRGRHJDYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCOzRIQUtULFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYixZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uUG9pbnQsIE5vZGUsIFRvb2xUeXBlIH0gZnJvbSAnLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuL3dvcmtmbG93LWRlc2lnbmVyLnN0YXRlJztcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uLy4uL21vZGVscy9UYWcnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdGFnZSB9IGZyb20gJy4uLy4uL21vZGVscy9Xb3JrZmxvd1N0YWdlJztcbmltcG9ydCB7IERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci1jYW52YXMvZGVzaWduZXItY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXb3JrZmxvd0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgV29ya2Zsb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvV29ya2Zsb3cnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItd29ya2Zsb3ctZGVzaWduZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVzaWduZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdjYW52YXNSZWYnKSBjYW52YXNSZWYhOiBEZXNpZ25lckNhbnZhc0NvbXBvbmVudDtcbiAgQElucHV0KCkgd29ya2Zsb3dDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDdXJyZW50bHkgc2VsZWN0ZWQgdG9vbFxuICBzZWxlY3RlZFRvb2w6IFRvb2xUeXBlID0gbnVsbDtcbiAgc2hvd1N3aW1sYW5lRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gTmV3IHByb3BlcnRpZXMgZm9yIHN0YWdlIGRpYWxvZ1xuICBzaG93U3RhZ2VEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGVuZGluZ1N0YWdlUG9zaXRpb246IHsgc3dpbWxhbmVJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgcGVuZGluZ1N0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPiA9IHt9O1xuXG4gIGVkaXRpbmdTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgaXNDcmVhdGluZ1N0YWdlRnJvbUNvbm5lY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50OiBDb25uZWN0aW9uUG9pbnQgfCBudWxsID0gbnVsbDtcbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHdvcmtmbG93IGRhdGEgaWYgY29kZSBpcyBwcm92aWRlZFxuICAgIGlmICh0aGlzLndvcmtmbG93Q29kZSkge1xuICAgICAgdGhpcy5sb2FkV29ya2Zsb3codGhpcy53b3JrZmxvd0NvZGUpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVXb3JrZmxvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG5cbiAgICAvLyBUcmFuc2Zvcm0gdGhlIFVJIG1vZGVsIHRvIHRoZSBBUEkgbW9kZWxcbiAgICBjb25zdCB3b3JrZmxvd01vZGVsID0gdGhpcy5zdGF0ZS50cmFuc2Zvcm1Ub1dvcmtmbG93TW9kZWwoKTtcblxuICAgIGlmICh3b3JrZmxvd01vZGVsKSB7XG4gICAgICAvLyBTYXZlIHRvIHRoZSBiYWNrZW5kXG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5zYXZlV29ya2Zsb3dzKFt3b3JrZmxvd01vZGVsXSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1dvcmtmbG93IHNhdmVkIHN1Y2Nlc3NmdWxseTonLCByZXNwb25zZSk7XG4gICAgICAgICAgLy8gSWYgdGhlIEFQSSByZXR1cm5zIGFuIHVwZGF0ZWQgd29ya2Zsb3csIHdlIG1pZ2h0IHdhbnQgdG8gcmVsb2FkIGl0XG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5SZXN1bHQ/LkNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMud29ya2Zsb3dDb2RlID0gcmVzcG9uc2UuUmVzdWx0LkNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyB3b3JrZmxvdzonLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIC8vIEhhbmRsZSBlcnJvciAtIHNob3cgYSBub3RpZmljYXRpb24sIGV0Yy5cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFdvcmtmbG93KGNvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZ2V0V29ya2Zsb3dXaXRoUGFyYW0oY29kZSlcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuUmVzdWx0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIHdvcmtmbG93IElEXG4gICAgICAgICAgY29uc3Qgd2YgPSByZXNwb25zZS5SZXN1bHRbMF07XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0lkKHdmLklkKTtcbiAgICAgICAgICB0aGlzLnBhcnNlV29ya2Zsb3dEYXRhKHdmKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB3b3JrZmxvdzonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBwYXJzZSB3b3JrZmxvdyBkYXRhIGZyb20gQVBJIGFuZCBwb3B1bGF0ZSB0aGUgZGVzaWduZXJcbiAgcGFyc2VXb3JrZmxvd0RhdGEod29ya2Zsb3c6IFdvcmtmbG93KTogdm9pZCB7XG4gICAgLy8gU3RvcmUgdGhlIGNvbXBsZXRlIHdvcmtmbG93XG4gICAgdGhpcy5zdGF0ZS53b3JrZmxvdyA9IHdvcmtmbG93O1xuXG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3RhdGVcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcyA9IFtdO1xuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLnN3aW1sYW5lUmVjb3JkID0ge307XG4gICAgdGhpcy5zdGF0ZS5zdGFnZVJlY29yZCA9IHt9O1xuICAgIHRoaXMuc3RhdGUuYWN0aW9uUmVjb3JkID0ge307XG5cbiAgICAvLyBTZXQgd29ya2Zsb3cgZm9ybSBpZiBleGlzdHNcbiAgICBpZiAod29ya2Zsb3cuRm9ybSkge1xuICAgICAgdGhpcy5zdGF0ZS5zZXRXb3JrZmxvd0Zvcm0oXG4gICAgICAgIHdvcmtmbG93LkZvcm0sXG4gICAgICAgIHdvcmtmbG93LkZvcm1OYW1lIHx8ICdXb3JrZmxvdyBGb3JtJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSB0aGUgd29ya2Zsb3cgSURcbiAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93SWQod29ya2Zsb3cuSWQpO1xuXG4gICAgLy8gUHJvY2VzcyBzd2ltbGFuZXMgZmlyc3RcbiAgICBpZiAod29ya2Zsb3cuTGFuZXMgJiYgd29ya2Zsb3cuTGFuZXMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5MYW5lcy5zb3J0KChhLCBiKSA9PiBhLlBvc2l0aW9uIC0gYi5Qb3NpdGlvbikuZm9yRWFjaCgobGFuZSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcmlnaW5hbCBsYW5lIGluIHJlY29yZFxuICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lUmVjb3JkW2xhbmUuSWRdID0gbGFuZTtcblxuICAgICAgICAvLyBBZGQgc3dpbWxhbmUgdG8gVUkgbW9kZWwgd2l0aCB0aGUgb3JpZ2luYWwgSURcbiAgICAgICAgY29uc3Qgc3dpbWxhbmUgPSB7XG4gICAgICAgICAgb3JkZXI6IGxhbmUuUG9zaXRpb24sXG4gICAgICAgICAgbGFiZWw6IGxhbmUuTmFtZSB8fCBgTGFuZSAke2xhbmUuUG9zaXRpb259YCxcbiAgICAgICAgICB0YWdzOiBsYW5lLlRhZ3MgfHwgW10sXG4gICAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICAgIGlkOiBsYW5lLklkLCAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgSURcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5wdXNoKHN3aW1sYW5lKTtcblxuICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgb2JqZWN0XG4gICAgICAgIHRoaXMuc3RhdGUucmVnaXN0ZXJMb2FkZWRPYmplY3QobGFuZS5JZCwgbGFuZS5Db2RlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RhZ2VzXG4gICAgaWYgKHdvcmtmbG93LlN0YWdlcyAmJiB3b3JrZmxvdy5TdGFnZXMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5TdGFnZXMuZm9yRWFjaCgoc3RhZ2UpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgb3JpZ2luYWwgc3RhZ2UgaW4gcmVjb3JkXG4gICAgICAgIHRoaXMuc3RhdGUuc3RhZ2VSZWNvcmRbc3RhZ2UuSWRdID0gc3RhZ2U7XG5cbiAgICAgICAgLy8gRmluZCBzd2ltbGFuZSBpbmRleCBieSBTd2ltTGFuZSBJRFxuICAgICAgICBjb25zdCBzd2ltbGFuZUluZGV4ID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXMuZmluZEluZGV4KFxuICAgICAgICAgIChsYW5lKSA9PiBsYW5lLmlkID09PSBzdGFnZS5Td2ltTGFuZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHggPSBzdGFnZS5Db29yZGluYXRlcz8uWCB8fCAxMDA7XG4gICAgICAgICAgY29uc3QgeSA9IHN0YWdlLkNvb3JkaW5hdGVzPy5ZIHx8IDUwO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIG5vZGUgd2l0aCBvcmlnaW5hbCBJRFxuICAgICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgICAgICBpZDogc3RhZ2UuSWQsIC8vIFVzZSBvcmlnaW5hbCBJRFxuICAgICAgICAgICAgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCxcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5IC0gc3dpbWxhbmVJbmRleCAqIDI2MyAtIDQwLCAvLyBBZGp1c3QgWSBmb3Igc3dpbWxhbmUgb2Zmc2V0XG4gICAgICAgICAgICB3aWR0aDogMTY5LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDAsXG4gICAgICAgICAgICBpc1N0YXJ0Tm9kZTogc3RhZ2UuSXNFbnRyeVBvaW50LFxuICAgICAgICAgICAgc3RhZ2VEYXRhOiB7XG4gICAgICAgICAgICAgIE5hbWU6IHN0YWdlLk5hbWUsXG4gICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBzdGFnZS5EZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgRHVyYXRpb246IHN0YWdlLkR1cmF0aW9uLFxuICAgICAgICAgICAgICBQYXNzT25SdWxlOiBzdGFnZS5QYXNzT25SdWxlLFxuICAgICAgICAgICAgICBBY3RvclJ1bGU6IHN0YWdlLkFjdG9yUnVsZSxcbiAgICAgICAgICAgICAgTWluTm9PZkFjdG9yOiBzdGFnZS5NaW5Ob09mQWN0b3IsXG4gICAgICAgICAgICAgIFRhZ3M6IHN0YWdlLlRhZ3MgfHwgW10sXG4gICAgICAgICAgICAgIElzUGFyYWxsZWw6IHN0YWdlLklzUGFyYWxsZWwsXG4gICAgICAgICAgICAgIElzRW50cnlQb2ludDogc3RhZ2UuSXNFbnRyeVBvaW50LFxuICAgICAgICAgICAgICBJc0V4aXRQb2ludDogc3RhZ2UuSXNFeGl0UG9pbnQsXG4gICAgICAgICAgICAgIElkOiBzdGFnZS5JZCwgLy8gS2VlcCBvcmlnaW5hbCBJRFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25Qb2ludHM6IFtdLCAvLyBJbml0aWFsaXplIHdpdGggZW1wdHkgYXJyYXlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgY29ubmVjdGlvbiBwb2ludHNcbiAgICAgICAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMgPSB0aGlzLnN0YXRlLmdlbmVyYXRlQ29ubmVjdGlvblBvaW50cyhub2RlKTtcblxuICAgICAgICAgIC8vIEFkZCBub2RlIHRvIHN3aW1sYW5lXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMgPVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMgfHwgW107XG4gICAgICAgICAgdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMucHVzaChub2RlKTtcblxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdGFydCBub2RlLCB1cGRhdGUgc3RhdGVcbiAgICAgICAgICBpZiAoc3RhZ2UuSXNFbnRyeVBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXJ0Tm9kZUlkID0gc3RhZ2UuSWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVnaXN0ZXIgbG9hZGVkIHN0YWdlXG4gICAgICAgICAgdGhpcy5zdGF0ZS5yZWdpc3RlckxvYWRlZE9iamVjdChzdGFnZS5JZCwgc3RhZ2UuQ29kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgY29ubmVjdGlvbnMvYWN0aW9uc1xuICAgIGlmICh3b3JrZmxvdy5BY3Rpb25zICYmIHdvcmtmbG93LkFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICB3b3JrZmxvdy5BY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICAvLyBTdG9yZSBvcmlnaW5hbCBhY3Rpb24gaW4gcmVjb3JkXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aW9uUmVjb3JkW2FjdGlvbi5JZF0gPSBhY3Rpb247XG5cbiAgICAgICAgLy8gRmluZCBzb3VyY2UgYW5kIHRhcmdldCBub2Rlc1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGFjdGlvbi5Gcm9tU3RhZ2UpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGFjdGlvbi5Ub1N0YWdlKTtcblxuICAgICAgICBpZiAoc291cmNlTm9kZUluZm8gJiYgdGFyZ2V0Tm9kZUluZm8pIHtcbiAgICAgICAgICAvLyBGaW5kIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVJbmZvLm5vZGU7XG5cbiAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09ICdyaWdodCcgfHwgcC50eXBlID09PSAnYm90dG9tJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IHRhcmdldE5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09ICdsZWZ0JyB8fCBwLnR5cGUgPT09ICd0b3AnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChzb3VyY2VQb2ludCAmJiB0YXJnZXRQb2ludCkge1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGFjdGlvbi5JZCwgLy8gVXNlIG9yaWdpbmFsIElEXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogYWN0aW9uLkZyb21TdGFnZSxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBhY3Rpb24uVG9TdGFnZSxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzb3VyY2VOb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiB0YXJnZXROb2RlSW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICBjb25kaXRpb246IGFjdGlvbi5QYXNzT25SdWxlIHx8ICcnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBsb2FkZWQgYWN0aW9uXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyTG9hZGVkT2JqZWN0KGFjdGlvbi5JZCwgYWN0aW9uLkNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBmaW5kIHN3aW1sYW5lIGluZGV4IGJ5IExhbmUgSURcbiAgZmluZFN3aW1sYW5lSW5kZXhCeUxhbmVJZChsYW5lSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gRmlyc3QgY2hlY2sgb3VyIG1hcHBpbmdcbiAgICBpZiAodGhpcy5zdGF0ZS5sYW5lSWRUb0luZGV4TWFwLmhhcyhsYW5lSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS5sYW5lSWRUb0luZGV4TWFwLmdldChsYW5lSWQpITtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbG9naWMgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIGNvbnN0IHBhcnRzID0gbGFuZUlkLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQocGFydHNbMV0pO1xuICAgICAgaWYgKCFpc05hTihpbmRleCkgJiYgaW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIEhhbmRsZSB0b29sIHNlbGVjdGlvbiBmcm9tIHRvb2xiYXJcbiAgb25Ub29sU2VsZWN0ZWQodG9vbDogVG9vbFR5cGUpOiB2b2lkIHtcbiAgICAvLyBUb2dnbGUgc2VsZWN0aW9uIGlmIHRoZSBzYW1lIHRvb2wgaXMgY2xpY2tlZCBhZ2FpblxuICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gdGhpcy5zZWxlY3RlZFRvb2wgPT09IHRvb2wgPyBudWxsIDogdG9vbDtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgdG9vbDonLCB0aGlzLnNlbGVjdGVkVG9vbCk7XG4gIH1cblxuICBvcGVuU3dpbWxhbmVEaWFsb2coKSB7XG4gICAgdGhpcy5zaG93U3dpbWxhbmVEaWFsb2cgPSB0cnVlO1xuICB9XG5cbiAgb25TaG93U3RhZ2VEaWFsb2coZXZlbnQ6IHsgcG9zaXRpb246IGFueTsgaXNGcm9tQ29ubmVjdGlvbjogYm9vbGVhbiB9KSB7XG4gICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIHNob3dTdGFnZURpYWxvZyBldmVudDonLCBldmVudCk7XG4gICAgdGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbiA9IGV2ZW50LnBvc2l0aW9uO1xuICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nID0gdHJ1ZTtcblxuICAgIC8vIElmIHRoaXMgaXMgZnJvbSBhIGNvbm5lY3Rpb24gY3JlYXRpb24sIHN0b3JlIHRoYXQgaW5mb1xuICAgIHRoaXMuaXNDcmVhdGluZ1N0YWdlRnJvbUNvbm5lY3Rpb24gPSBldmVudC5pc0Zyb21Db25uZWN0aW9uO1xuXG4gICAgLy8gU3RvcmUgdGhlIHNvdXJjZSBwb2ludCBkYXRhIGJlZm9yZSBpdCBnZXRzIGxvc3RcbiAgICBpZiAoXG4gICAgICBldmVudC5pc0Zyb21Db25uZWN0aW9uICYmXG4gICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnRcbiAgICApIHtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVN3aW1sYW5lSW5kZXggPz8gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnU3RvcmVkIHNvdXJjZSBwb2ludCBmb3IgY29ubmVjdGlvbjonLFxuICAgICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1N0YWdlIGRpYWxvZyBzdGF0ZTonLCB7XG4gICAgICBwZW5kaW5nUG9zaXRpb246IHRoaXMucGVuZGluZ1N0YWdlUG9zaXRpb24sXG4gICAgICBpc1Zpc2libGU6IHRoaXMuc2hvd1N0YWdlRGlhbG9nLFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2FudmFzUG9zaXRpb25DbGljayhldmVudDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBlZGl0IHN3aW1sYW5lIGV2ZW50XG4gICAgaWYgKFxuICAgICAgZXZlbnQueCA9PT0gLTEgJiZcbiAgICAgIGV2ZW50LnkgPj0gMCAmJlxuICAgICAgZXZlbnQueSA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aFxuICAgICkge1xuICAgICAgY29uc29sZS5sb2coJ0VkaXRpbmcgc3dpbWxhbmUnLCBldmVudC55KTtcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBldmVudC55O1xuICAgICAgdGhpcy5vcGVuU3dpbWxhbmVEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgY2FudmFzIGNsaWNrIGhhbmRsaW5nXG4gICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IoZXZlbnQueSAvIDI2Myk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICBjYXNlICdzd2ltbGFuZSc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdPcGVuaW5nIHN3aW1sYW5lIGRpYWxvZyBmb3IgbmV3IHN3aW1sYW5lJyk7XG4gICAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsOyAvLyBTZXQgdG8gbnVsbCB0byBpbmRpY2F0ZSBjcmVhdGluZyBhIG5ldyBzd2ltbGFuZVxuICAgICAgICB0aGlzLm9wZW5Td2ltbGFuZURpYWxvZygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RhZ2UnOlxuICAgICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBBZGRpbmcgJHt0aGlzLnNlbGVjdGVkVG9vbH0gdG8gc3dpbWxhbmUgJHtzd2ltbGFuZUluZGV4fWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaXJlY3RseSB3aXRoIGRlZmF1bHQgcHJvcGVydGllc1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICAgICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgJ3N0YWdlJyxcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55LFxuICAgICAgICAgICAgeyBOYW1lOiAnTmV3IFN0YWdlJyB9IC8vIEFkZCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3RlZCB0b29sIGFmdGVyIHBsYWNpbmcgYSBub2RlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVjaXNpb24nOlxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIGlmIChzd2ltbGFuZUluZGV4ID49IDAgJiYgc3dpbWxhbmVJbmRleCA8IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYEFkZGluZyAke3RoaXMuc2VsZWN0ZWRUb29sfSB0byBzd2ltbGFuZSAke3N3aW1sYW5lSW5kZXh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhdGUuYWRkTm9kZShcbiAgICAgICAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbCxcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdGVkIHRvb2wgYWZ0ZXIgcGxhY2luZyBhIG5vZGVcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUb29sID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdWJmbG93JzpcbiAgICAgICAgaWYgKHN3aW1sYW5lSW5kZXggPj0gMCAmJiBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgQWRkaW5nICR7dGhpcy5zZWxlY3RlZFRvb2x9IHRvIHN3aW1sYW5lICR7c3dpbWxhbmVJbmRleH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBTaG93IHN1YmZsb3cgd29ya2Zsb3cgc2VsZWN0aW9uIHBvcHVwXG4gICAgICAgICAgdGhpcy5jYW52YXNSZWYuc2hvd1N1YmZsb3dTZWxlY3Rpb25Qb3B1cChcbiAgICAgICAgICAgIGV2ZW50LngsXG4gICAgICAgICAgICBldmVudC55LFxuICAgICAgICAgICAgc3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN3aW1sYW5lRGlhbG9nRmlsbGVkKGV2ZW50OiB7IHRhZ3M6IFRhZ1tdOyBuYW1lOiBzdHJpbmcgfSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1N3aW1sYW5lIGRpYWxvZyBmaWxsZWQ6JyxcbiAgICAgIGV2ZW50LFxuICAgICAgJ0VkaXRpbmcgaW5kZXg6JyxcbiAgICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXhcbiAgICApO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBuYW1lIGlzIG5vdCBlbXB0eVxuICAgIGlmICghZXZlbnQubmFtZSB8fCBldmVudC5uYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1N3aW1sYW5lIG5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggIT09IG51bGwpIHtcbiAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBzd2ltbGFuZVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdVcGRhdGluZyBleGlzdGluZyBzd2ltbGFuZSBhdCBpbmRleDonLFxuICAgICAgICB0aGlzLmVkaXRpbmdTd2ltbGFuZUluZGV4XG4gICAgICApO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTd2ltbGFuZShcbiAgICAgICAgdGhpcy5lZGl0aW5nU3dpbWxhbmVJbmRleCxcbiAgICAgICAgZXZlbnQubmFtZSxcbiAgICAgICAgZXZlbnQudGFnc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBzd2ltbGFuZVxuICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIG5ldyBzd2ltbGFuZScpO1xuICAgICAgdGhpcy5zdGF0ZS5hZGRTd2ltbGFuZShldmVudC5uYW1lLCBldmVudC50YWdzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTd2ltbGFuZURpYWxvZyA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ1N3aW1sYW5lSW5kZXggPSBudWxsO1xuICB9XG5cbiAgb25TdGFnZURpYWxvZ1NhdmVkKHN0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPikge1xuICAgIGlmICh0aGlzLmNhbnZhc1JlZi5hY3RpdmVTdGFnZUlkKSB7XG4gICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHRoaXMuY2FudmFzUmVmLmFjdGl2ZVN0YWdlSWQpO1xuICAgICAgaWYgKG5vZGVJbmZvKSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhZ2UgZGF0YVxuICAgICAgICBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSA9IHtcbiAgICAgICAgICAuLi5ub2RlSW5mby5ub2RlLnN0YWdlRGF0YSxcbiAgICAgICAgICAuLi5zdGFnZURhdGEsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGVkIHN0YWdlIGRhdGE6Jywgbm9kZUluZm8ubm9kZS5zdGFnZURhdGEpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYW52YXNSZWYuYWN0aXZlU3RhZ2VJZCA9IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmdTdGFnZVBvc2l0aW9uKSB7XG4gICAgICBpZiAodGhpcy5jYW52YXNSZWYuYWN0aXZlU3RhZ2VJZCkge1xuICAgICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQodGhpcy5jYW52YXNSZWYuYWN0aXZlU3RhZ2VJZCk7XG4gICAgICAgIGlmIChub2RlSW5mbykge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhZ2UgZGF0YVxuICAgICAgICAgIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhID0ge1xuICAgICAgICAgICAgLi4ubm9kZUluZm8ubm9kZS5zdGFnZURhdGEsXG4gICAgICAgICAgICAuLi5zdGFnZURhdGEsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlZCBzdGFnZSBkYXRhOicsIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbnZhc1JlZi5hY3RpdmVTdGFnZUlkID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nU3RhZ2VQb3NpdGlvbikge1xuICAgICAgICAvLyBDcmVhdGluZyBhIG5ldyBzdGFnZSAoa2VlcCBleGlzdGluZyBsb2dpYyBmb3IgdGhpcyBjYXNlKVxuICAgICAgICAvLyAuLi5leGlzdGluZyBjb2RlLi4uXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvd1N0YWdlRGlhbG9nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93U3RhZ2VEaWFsb2cgPSBmYWxzZTtcbiAgfVxuXG4gIG9uU3ViZmxvd1NlbGVjdGVkKCkge1xuICAgIC8vIFJlc2V0IHRoZSBzZWxlY3RlZCB0b29sIGFmdGVyIHBsYWNpbmcgYSBzdWJmbG93IG5vZGVcbiAgICB0aGlzLnNlbGVjdGVkVG9vbCA9IG51bGw7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3b3JrZmxvdy1kZXNpZ25lclwiPlxuICA8ZGl2IGNsYXNzPVwid29ya2Zsb3ctaGVhZGVyXCI+XG4gICAgPGgxPldvcmtmbG93IERlc2lnbmVyPC9oMT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUb29sYmFyIENvbXBvbmVudCAtLT5cbiAgPGxpYi1kZXNpZ25lci10b29sYmFyXG4gICAgW3NlbGVjdGVkVG9vbF09XCJzZWxlY3RlZFRvb2xcIlxuICAgIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gICAgKHRvb2xTZWxlY3RlZCk9XCJvblRvb2xTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAoc2F2ZVdvcmtmbG93KT1cInNhdmVXb3JrZmxvdygpXCJcbiAgPlxuICA8L2xpYi1kZXNpZ25lci10b29sYmFyPlxuXG4gIDwhLS0gU2hvdyBsb2FkaW5nIGluZGljYXRvciBpZiBuZWVkZWQgLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNwaW5uZXJcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+TG9hZGluZyB3b3JrZmxvdy4uLjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENhbnZhcyBDb21wb25lbnQgLS0+XG4gIDxsaWItZGVzaWduZXItY2FudmFzXG4gICAgW3NlbGVjdGVkVG9vbF09XCJzZWxlY3RlZFRvb2xcIlxuICAgIChjbGlja2VkUG9zaXRpb24pPVwiaGFuZGxlQ2FudmFzUG9zaXRpb25DbGljaygkZXZlbnQpXCJcbiAgICAoc3ViZmxvd1NlbGVjdGVkKT1cIm9uU3ViZmxvd1NlbGVjdGVkKClcIlxuICAgIChzaG93U3RhZ2VEaWFsb2cpPVwib25TaG93U3RhZ2VEaWFsb2coJGV2ZW50KVwiXG4gICAgI2NhbnZhc1JlZlxuICA+XG4gIDwvbGliLWRlc2lnbmVyLWNhbnZhcz5cblxuICA8bGliLXN3aW1sYW5lLWRpYWxvZ1xuICAgIFt2aXNpYmxlXT1cInNob3dTd2ltbGFuZURpYWxvZ1wiXG4gICAgW3N3aW1sYW5lRGF0YV09XCJcbiAgICAgIGVkaXRpbmdTd2ltbGFuZUluZGV4ICE9PSBudWxsXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbmFtZTogc3RhdGUuc3dpbWxhbmVzW2VkaXRpbmdTd2ltbGFuZUluZGV4XS5sYWJlbCxcbiAgICAgICAgICAgIHRhZ3M6IHN0YXRlLnN3aW1sYW5lc1tlZGl0aW5nU3dpbWxhbmVJbmRleF0udGFnc1xuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsXG4gICAgXCJcbiAgICAoY3JlYXRlZCk9XCJvblN3aW1sYW5lRGlhbG9nRmlsbGVkKCRldmVudClcIlxuICAgIChjbG9zZWQpPVwic2hvd1N3aW1sYW5lRGlhbG9nID0gZmFsc2VcIlxuICA+PC9saWItc3dpbWxhbmUtZGlhbG9nPlxuXG4gIDxsaWItc3RhZ2UtZGlhbG9nXG4gICAgW3Zpc2libGVdPVwic2hvd1N0YWdlRGlhbG9nXCJcbiAgICBbc3RhZ2VEYXRhXT1cInBlbmRpbmdTdGFnZURhdGFcIlxuICAgIChjbG9zZWQpPVwic2hvd1N0YWdlRGlhbG9nID0gZmFsc2VcIlxuICAgIChzYXZlZCk9XCJvblN0YWdlRGlhbG9nU2F2ZWQoJGV2ZW50KVwiXG4gID48L2xpYi1zdGFnZS1kaWFsb2c+XG48L2Rpdj5cbiJdfQ==
@@ -8,6 +8,13 @@ import { VerbenDialogueModule, VerbenPopUpModule } from 'verben-ng-ui';
8
8
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
9
9
  import { StageNodeComponent } from './stage-node/stage-node.component';
10
10
  import { StageDialogComponent } from './stage-dialog/stage-dialog.component';
11
+ import { ConditionsPopupComponent } from './conditions-popup/conditions-popup.component';
12
+ import { NodeManagementService } from './services/node-management.service';
13
+ import { ConnectionService } from './services/connection.service';
14
+ import { SwimlaneService } from './services/swimlane.service';
15
+ import { TransformerService } from './services/transformer.service';
16
+ import { PopupService } from './services/popup.service';
17
+ import { DecisionPopupComponent } from './decision-popup/decision-popup.component';
11
18
  import * as i0 from "@angular/core";
12
19
  export class WorkflowDesignerModule {
13
20
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -16,12 +23,20 @@ export class WorkflowDesignerModule {
16
23
  DesignerCanvasComponent,
17
24
  SwimlaneDialogComponent,
18
25
  StageNodeComponent,
19
- StageDialogComponent], imports: [CommonModule,
26
+ StageDialogComponent,
27
+ ConditionsPopupComponent,
28
+ DecisionPopupComponent], imports: [CommonModule,
20
29
  VerbenDialogueModule,
21
30
  FormsModule,
22
31
  ReactiveFormsModule,
23
32
  VerbenPopUpModule], exports: [WorkflowDesignerComponent] });
24
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerModule, imports: [CommonModule,
33
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerModule, providers: [
34
+ NodeManagementService,
35
+ ConnectionService,
36
+ SwimlaneService,
37
+ TransformerService,
38
+ PopupService,
39
+ ], imports: [CommonModule,
25
40
  VerbenDialogueModule,
26
41
  FormsModule,
27
42
  ReactiveFormsModule,
@@ -37,6 +52,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
37
52
  SwimlaneDialogComponent,
38
53
  StageNodeComponent,
39
54
  StageDialogComponent,
55
+ ConditionsPopupComponent,
56
+ DecisionPopupComponent,
40
57
  ],
41
58
  imports: [
42
59
  CommonModule,
@@ -45,7 +62,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
45
62
  ReactiveFormsModule,
46
63
  VerbenPopUpModule,
47
64
  ],
65
+ providers: [
66
+ NodeManagementService,
67
+ ConnectionService,
68
+ SwimlaneService,
69
+ TransformerService,
70
+ PopupService,
71
+ ],
48
72
  exports: [WorkflowDesignerComponent],
49
73
  }]
50
74
  }] });
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7QUFvQjdFLE1BQU0sT0FBTyxzQkFBc0I7d0dBQXRCLHNCQUFzQjt5R0FBdEIsc0JBQXNCLGlCQWhCL0IseUJBQXlCO1lBQ3pCLHdCQUF3QjtZQUN4Qix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBQ3ZCLGtCQUFrQjtZQUNsQixvQkFBb0IsYUFHcEIsWUFBWTtZQUNaLG9CQUFvQjtZQUNwQixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLGlCQUFpQixhQUVULHlCQUF5Qjt5R0FFeEIsc0JBQXNCLFlBUi9CLFlBQVk7WUFDWixvQkFBb0I7WUFDcEIsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixpQkFBaUI7OzRGQUlSLHNCQUFzQjtrQkFsQmxDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHlCQUF5Qjt3QkFDekIsd0JBQXdCO3dCQUN4Qix1QkFBdUI7d0JBQ3ZCLHVCQUF1Qjt3QkFDdkIsa0JBQWtCO3dCQUNsQixvQkFBb0I7cUJBQ3JCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLG9CQUFvQjt3QkFDcEIsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEI7b0JBQ0QsT0FBTyxFQUFFLENBQUMseUJBQXlCLENBQUM7aUJBQ3JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyQ29tcG9uZW50IH0gZnJvbSAnLi93b3JrZmxvdy1kZXNpZ25lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVzaWduZXJUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci10b29sYmFyL2Rlc2lnbmVyLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IH0gZnJvbSAnLi9kZXNpZ25lci1jYW52YXMvZGVzaWduZXItY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTd2ltbGFuZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vc3dpbWxhbmUtZGlhbG9nL3N3aW1sYW5lLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmVyYmVuRGlhbG9ndWVNb2R1bGUsIFZlcmJlblBvcFVwTW9kdWxlIH0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3RhZ2VOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9zdGFnZS1ub2RlL3N0YWdlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFN0YWdlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9zdGFnZS1kaWFsb2cvc3RhZ2UtZGlhbG9nLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFdvcmtmbG93RGVzaWduZXJDb21wb25lbnQsXG4gICAgRGVzaWduZXJUb29sYmFyQ29tcG9uZW50LFxuICAgIERlc2lnbmVyQ2FudmFzQ29tcG9uZW50LFxuICAgIFN3aW1sYW5lRGlhbG9nQ29tcG9uZW50LFxuICAgIFN0YWdlTm9kZUNvbXBvbmVudCxcbiAgICBTdGFnZURpYWxvZ0NvbXBvbmVudCxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBWZXJiZW5EaWFsb2d1ZU1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZlcmJlblBvcFVwTW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbV29ya2Zsb3dEZXNpZ25lckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVzaWduZXJNb2R1bGUge31cbiJdfQ==
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy93b3JrZmxvdy1kZXNpZ25lci93b3JrZmxvdy1kZXNpZ25lci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOztBQTZCbkYsTUFBTSxPQUFPLHNCQUFzQjt3R0FBdEIsc0JBQXNCO3lHQUF0QixzQkFBc0IsaUJBekIvQix5QkFBeUI7WUFDekIsd0JBQXdCO1lBQ3hCLHVCQUF1QjtZQUN2Qix1QkFBdUI7WUFDdkIsa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQix3QkFBd0I7WUFDeEIsc0JBQXNCLGFBR3RCLFlBQVk7WUFDWixvQkFBb0I7WUFDcEIsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixpQkFBaUIsYUFTVCx5QkFBeUI7eUdBRXhCLHNCQUFzQixhQVR0QjtZQUNULHFCQUFxQjtZQUNyQixpQkFBaUI7WUFDakIsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQixZQUFZO1NBQ2IsWUFaQyxZQUFZO1lBQ1osb0JBQW9CO1lBQ3BCLFdBQVc7WUFDWCxtQkFBbUI7WUFDbkIsaUJBQWlCOzs0RkFXUixzQkFBc0I7a0JBM0JsQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWix5QkFBeUI7d0JBQ3pCLHdCQUF3Qjt3QkFDeEIsdUJBQXVCO3dCQUN2Qix1QkFBdUI7d0JBQ3ZCLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQix3QkFBd0I7d0JBQ3hCLHNCQUFzQjtxQkFDdkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1QscUJBQXFCO3dCQUNyQixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxDQUFDLHlCQUF5QixDQUFDO2lCQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgV29ya2Zsb3dEZXNpZ25lckNvbXBvbmVudCB9IGZyb20gJy4vd29ya2Zsb3ctZGVzaWduZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERlc2lnbmVyVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vZGVzaWduZXItdG9vbGJhci9kZXNpZ25lci10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZXNpZ25lckNhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4vZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3dpbWxhbmVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3N3aW1sYW5lLWRpYWxvZy9zd2ltbGFuZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFZlcmJlbkRpYWxvZ3VlTW9kdWxlLCBWZXJiZW5Qb3BVcE1vZHVsZSB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN0YWdlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vc3RhZ2Utbm9kZS9zdGFnZS1ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGFnZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vc3RhZ2UtZGlhbG9nL3N0YWdlLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29uZGl0aW9uc1BvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9jb25kaXRpb25zLXBvcHVwL2NvbmRpdGlvbnMtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVNYW5hZ2VtZW50U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbm9kZS1tYW5hZ2VtZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTd2ltbGFuZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3N3aW1sYW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNmb3JtZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cmFuc2Zvcm1lci5zZXJ2aWNlJztcbmltcG9ydCB7IFBvcHVwU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcG9wdXAuc2VydmljZSc7XG5pbXBvcnQgeyBEZWNpc2lvblBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi9kZWNpc2lvbi1wb3B1cC9kZWNpc2lvbi1wb3B1cC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBXb3JrZmxvd0Rlc2lnbmVyQ29tcG9uZW50LFxuICAgIERlc2lnbmVyVG9vbGJhckNvbXBvbmVudCxcbiAgICBEZXNpZ25lckNhbnZhc0NvbXBvbmVudCxcbiAgICBTd2ltbGFuZURpYWxvZ0NvbXBvbmVudCxcbiAgICBTdGFnZU5vZGVDb21wb25lbnQsXG4gICAgU3RhZ2VEaWFsb2dDb21wb25lbnQsXG4gICAgQ29uZGl0aW9uc1BvcHVwQ29tcG9uZW50LFxuICAgIERlY2lzaW9uUG9wdXBDb21wb25lbnQsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVmVyYmVuRGlhbG9ndWVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWZXJiZW5Qb3BVcE1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTm9kZU1hbmFnZW1lbnRTZXJ2aWNlLFxuICAgIENvbm5lY3Rpb25TZXJ2aWNlLFxuICAgIFN3aW1sYW5lU2VydmljZSxcbiAgICBUcmFuc2Zvcm1lclNlcnZpY2UsXG4gICAgUG9wdXBTZXJ2aWNlLFxuICBdLFxuICBleHBvcnRzOiBbV29ya2Zsb3dEZXNpZ25lckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RGVzaWduZXJNb2R1bGUge31cbiJdfQ==