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
@@ -11,6 +11,15 @@ export class WorkflowDesignerState {
11
11
  draggingConnectionData = {};
12
12
  workflowFormId = null;
13
13
  workflowFormName = null;
14
+ workflowId = null;
15
+ workflow = null;
16
+ swimlaneRecord = {};
17
+ stageRecord = {};
18
+ actionRecord = {};
19
+ setWorkflowId(id) {
20
+ this.workflowId = id;
21
+ }
22
+ laneIdToIndexMap = new Map();
14
23
  connectionRules = {
15
24
  stage: ['stage', 'decision', 'subflow', 'form'],
16
25
  decision: ['stage'], // Decisions can only connect to Stages
@@ -32,6 +41,9 @@ export class WorkflowDesignerState {
32
41
  },
33
42
  ]);
34
43
  }
44
+ registerLaneMapping(laneId, swimlaneIndex) {
45
+ this.laneIdToIndexMap.set(laneId, swimlaneIndex);
46
+ }
35
47
  // Add this method to generate connection points for a node
36
48
  generateConnectionPoints(node) {
37
49
  const points = [];
@@ -170,7 +182,7 @@ export class WorkflowDesignerState {
170
182
  }
171
183
  return points;
172
184
  }
173
- addNode(swimlaneIndex, type, x, y, stageData, workflowData) {
185
+ addNode(swimlaneIndex, type, x, y, stageData, workflowData, useExistingId = false) {
174
186
  if (!this.swimlanes[swimlaneIndex] ||
175
187
  !type ||
176
188
  (type !== 'stage' &&
@@ -181,15 +193,17 @@ export class WorkflowDesignerState {
181
193
  }
182
194
  // Adjust position relative to swimlane
183
195
  const adjustedY = y - swimlaneIndex * 263 - 40; // Subtracting header height
184
- // Generate a unique ID
185
- const id = `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
196
+ // Generate a unique ID or use existing
197
+ const id = useExistingId && stageData?.Id
198
+ ? stageData.Id
199
+ : `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
186
200
  // Create node with dimensions based on type
187
201
  const node = {
188
202
  id,
189
203
  type,
190
204
  x,
191
205
  y: adjustedY,
192
- width: type === 'subflow' ? 88 : 169, // Width from SVG
206
+ width: type === 'subflow' ? 150 : 169, // Width from SVG
193
207
  height: 100, // Height from SVG
194
208
  isStartNode: false, // Default to false
195
209
  stageData: stageData || {}, // Store stage data
@@ -335,119 +349,6 @@ export class WorkflowDesignerState {
335
349
  const sourceNodeType = sourceNodeInfo.node.type;
336
350
  return this.connectionRules[sourceNodeType] || [];
337
351
  }
338
- // transformToWorkflowModel(): Workflow {
339
- // // Create base workflow object
340
- // const workflow: Workflow = {
341
- // Name: 'New Workflow', // Default name or get it from somewhere
342
- // Description: '', // Default description
343
- // StageEntryRule: '',
344
- // AssignmentType: TaskAssignmentType.AutoRoute, // Default assignment type
345
- // Status: Status.Active, // Default status
346
- // Actions: [],
347
- // Lanes: [],
348
- // Stages: [],
349
- // };
350
- // // Transform swimlanes to SwimLane[]
351
- // workflow.Lanes = this.swimlanes.map((swimlane, index) => {
352
- // return {
353
- // Id: `lane-${index}`,
354
- // Workflow: workflow.Id,
355
- // Tags: swimlane.tags,
356
- // Position: swimlane.order,
357
- // Coordinates: { X: 0, Y: swimlane.order * 263 }, // Calculate Y position based on order
358
- // Size: { Width: 3000, Height: 263 }, // Default size
359
- // // Add other required properties from BaseModel
360
- // Code: '',
361
- // TenantId: '',
362
- // id: `lane-${index}`,
363
- // ServiceName: '',
364
- // CreatedAt: new Date(),
365
- // UpdatedAt: new Date(),
366
- // DataState: ObjectState.New,
367
- // };
368
- // });
369
- // // Transform nodes to WorkflowStage[]
370
- // const stages: WorkflowStage[] = [];
371
- // this.swimlanes.forEach((swimlane, swimlaneIndex) => {
372
- // swimlane.nodes?.forEach((node) => {
373
- // if (node.type === 'stage') {
374
- // // Create a stage from the node
375
- // const stage: WorkflowStage = {
376
- // Id: node.id,
377
- // Workflow: workflow.Id,
378
- // Name: node.stageData?.Name || 'Unnamed Stage',
379
- // Description: node.stageData?.Description || '',
380
- // Duration: node.stageData?.Duration || 0,
381
- // PassOnRule: node.stageData?.PassOnRule || '',
382
- // ActorRule: node.stageData?.ActorRule || StageActorRule.None,
383
- // MinNoOfActor: node.stageData?.MinNoOfActor || 0,
384
- // IsParallel: false, // Default value, will be updated below
385
- // IsEntryPoint: node.isStartNode,
386
- // IsExitPoint: false, // Determine based on connections
387
- // Tags: node.stageData?.Tags || [],
388
- // Forms: node.stageData?.Forms || [],
389
- // AllowMultiSubProcess: false,
390
- // AssignmentType:
391
- // node.stageData?.AssignmentType || TaskAssignmentType.AutoRoute,
392
- // SubWorkFlow: node.stageData?.SubWorkFlow || '',
393
- // SwimLane: workflow.Lanes[swimlaneIndex].Id,
394
- // Coordinates: { X: node.x, Y: node.y },
395
- // IsSubProcess: false,
396
- // // Add other required properties from BaseModel
397
- // Code: '',
398
- // TenantId: '',
399
- // id: node.id,
400
- // ServiceName: '',
401
- // CreatedAt: new Date(),
402
- // UpdatedAt: new Date(),
403
- // DataState: ObjectState.New,
404
- // };
405
- // stages.push(stage);
406
- // }
407
- // });
408
- // });
409
- // // Now process the connections to set IsParallel on target stages
410
- // this.connections.forEach((conn) => {
411
- // const sourceNodeInfo = this.findNodeById(conn.sourceNodeId);
412
- // if (
413
- // sourceNodeInfo &&
414
- // sourceNodeInfo.node.type === 'stage' &&
415
- // sourceNodeInfo.node.stageData?.hasParallel === true
416
- // ) {
417
- // // Find the target stage in our stages array
418
- // const targetStage = stages.find((s) => s.Id === conn.targetNodeId);
419
- // if (targetStage) {
420
- // // Set IsParallel to true for this target stage
421
- // targetStage.IsParallel = true;
422
- // }
423
- // }
424
- // });
425
- // // Transform connections to WorkflowAction[]
426
- // workflow.Actions = this.connections.map((conn) => {
427
- // const sourceNode = this.findNodeById(conn.sourceNodeId)?.node;
428
- // const targetNode = this.findNodeById(conn.targetNodeId)?.node;
429
- // return {
430
- // Id: conn.id,
431
- // Workflow: workflow.Id,
432
- // Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${
433
- // targetNode?.stageData?.Name || 'Unknown'
434
- // }`,
435
- // FromStage: conn.sourceNodeId,
436
- // ToStage: conn.targetNodeId,
437
- // IsParallel: targetNode?.stageData?.IsParallel || false,
438
- // // Add other required properties from BaseModel
439
- // Code: '',
440
- // TenantId: '',
441
- // id: conn.id,
442
- // ServiceName: '',
443
- // CreatedAt: new Date(),
444
- // UpdatedAt: new Date(),
445
- // DataState: ObjectState.New,
446
- // };
447
- // });
448
- // workflow.Stages = stages;
449
- // return workflow;
450
- // }
451
352
  updateSwimlane(index, name, tags) {
452
353
  console.log('State: Updating swimlane at index', index, 'with name', name, 'and tags', tags);
453
354
  if (index >= 0 && index < this.swimlanes.length) {
@@ -463,116 +364,253 @@ export class WorkflowDesignerState {
463
364
  }
464
365
  }
465
366
  transformToWorkflowModel() {
466
- // Create base workflow object
467
- const workflow = {
468
- Id: '', // Will be assigned by backend on first save
469
- Code: '',
470
- TenantId: '',
471
- id: '',
472
- ServiceName: '',
473
- CreatedAt: new Date(),
474
- UpdatedAt: new Date(),
475
- DataState: ObjectState.New,
476
- Name: 'New Workflow', // Default name or get it from somewhere
477
- Description: '', // Default description
478
- StageEntryRule: '',
479
- Form: this.workflowFormId || undefined,
480
- AssignmentType: TaskAssignmentType.AutoRoute, // Default assignment type
481
- Status: Status.Active, // Default status
482
- Actions: [],
483
- Lanes: [],
484
- Stages: [],
485
- };
486
- // Transform swimlanes to SwimLane[]
487
- workflow.Lanes = this.swimlanes.map((swimlane, index) => {
488
- return {
489
- Id: `lane-${index}`,
490
- Code: '',
367
+ // Use stored workflow if available, otherwise create a new one
368
+ const workflow = this.workflow
369
+ ? { ...this.workflow }
370
+ : {
371
+ // BaseModel properties
372
+ Id: this.wasLoadedFromApi(this.workflowId || '')
373
+ ? this.workflowId || ''
374
+ : '',
375
+ Code: this.getCodeForObject(this.workflowId || ''),
491
376
  TenantId: '',
492
- id: `lane-${index}`,
377
+ id: this.wasLoadedFromApi(this.workflowId || '')
378
+ ? this.workflowId || ''
379
+ : '',
493
380
  ServiceName: '',
494
381
  CreatedAt: new Date(),
495
382
  UpdatedAt: new Date(),
496
- DataState: ObjectState.New,
497
- Workflow: workflow.Id,
498
- Tags: swimlane.tags || [],
499
- Position: swimlane.order,
500
- Coordinates: { X: 0, Y: swimlane.order * 263 }, // Calculate Y position based on order
501
- Size: { Width: 3000, Height: 263 }, // Default size
383
+ DataState: this.wasLoadedFromApi(this.workflowId || '')
384
+ ? ObjectState.Changed
385
+ : ObjectState.New,
386
+ // Workflow specific properties
387
+ Name: 'New Workflow',
388
+ Description: '',
389
+ StageEntryRule: '',
390
+ Form: this.workflowFormId || undefined,
391
+ AssignmentType: TaskAssignmentType.AutoRoute,
392
+ Operation: '',
393
+ Status: Status.Active,
394
+ Actions: [],
395
+ Lanes: [],
396
+ Stages: [],
502
397
  };
398
+ // Update workflow form if changed
399
+ if (this.workflowFormId !== this.workflow?.Form) {
400
+ workflow.Form = this.workflowFormId || workflow.Form;
401
+ }
402
+ // Transform swimlanes to SwimLane[]
403
+ workflow.Lanes = this.swimlanes.map((swimlane) => {
404
+ // Check if this is an existing swimlane
405
+ if (swimlane.id && this.swimlaneRecord[swimlane.id]) {
406
+ // Update existing lane with changed values
407
+ const existingLane = this.swimlaneRecord[swimlane.id];
408
+ return {
409
+ ...existingLane,
410
+ Tags: swimlane.tags,
411
+ Position: swimlane.order,
412
+ Coordinates: { X: 0, Y: swimlane.order * 263 },
413
+ DataState: ObjectState.Changed,
414
+ UpdatedAt: new Date(),
415
+ };
416
+ }
417
+ else {
418
+ // Generate a new ID for new swimlanes if not already set
419
+ const laneId = swimlane.id ||
420
+ `lane-${Date.now()}-${Math.floor(Math.random() * 1000)}`;
421
+ // Create new lane
422
+ return {
423
+ Id: '',
424
+ Code: '',
425
+ TenantId: '',
426
+ id: laneId,
427
+ ServiceName: '',
428
+ CreatedAt: new Date(),
429
+ UpdatedAt: new Date(),
430
+ DataState: ObjectState.New,
431
+ Workflow: workflow.Id,
432
+ Tags: swimlane.tags || [],
433
+ Position: swimlane.order,
434
+ Coordinates: { X: 0, Y: swimlane.order * 263 },
435
+ Size: { Width: 3000, Height: 263 },
436
+ };
437
+ }
503
438
  });
504
439
  // Transform nodes to WorkflowStage[]
505
440
  const stages = [];
506
441
  this.swimlanes.forEach((swimlane, swimlaneIndex) => {
507
442
  swimlane.nodes?.forEach((node) => {
508
443
  if (node.type === 'stage') {
509
- // Create a stage from the node
510
- const stage = {
511
- Id: node.id,
512
- Code: '',
513
- TenantId: '',
514
- id: node.id,
515
- ServiceName: '',
516
- CreatedAt: new Date(),
517
- UpdatedAt: new Date(),
518
- DataState: ObjectState.New,
519
- Workflow: workflow.Id,
520
- Name: node.stageData?.Name || 'Unnamed Stage',
521
- Description: node.stageData?.Description || '',
522
- Duration: node.stageData?.Duration || 0,
523
- PassOnRule: node.stageData?.PassOnRule || '',
524
- ActorRule: node.stageData?.ActorRule || StageActorRule.None,
525
- MinNoOfActor: node.stageData?.MinNoOfActor || 0,
526
- IsParallel: node.stageData?.IsParallel || false,
527
- IsEntryPoint: node.isStartNode,
528
- IsExitPoint: false, // Determine based on outgoing connections
529
- Tags: node.stageData?.Tags || [],
530
- Forms: node.stageData?.formId ? [node.stageData.formId] : [],
531
- AllowMultiSubProcess: false,
532
- AssignmentType: TaskAssignmentType.AutoRoute,
533
- SubWorkFlow: '',
534
- SwimLane: workflow.Lanes[swimlaneIndex].Id,
535
- Coordinates: { X: node.x, Y: node.y },
536
- IsSubProcess: false,
537
- };
538
- stages.push(stage);
444
+ // Check if this is an existing stage
445
+ if (this.stageRecord[node.id]) {
446
+ // Update existing stage with changed values
447
+ const existingStage = this.stageRecord[node.id];
448
+ // Create a new object with updated properties
449
+ const updatedStage = {
450
+ ...existingStage,
451
+ DataState: ObjectState.Changed,
452
+ UpdatedAt: new Date(),
453
+ };
454
+ // Update properties that may have changed
455
+ if (node.stageData?.Name !== undefined)
456
+ updatedStage.Name = node.stageData.Name;
457
+ if (node.stageData?.Description !== undefined)
458
+ updatedStage.Description = node.stageData.Description;
459
+ if (node.stageData?.Duration !== undefined)
460
+ updatedStage.Duration = node.stageData.Duration;
461
+ if (node.stageData?.PassOnRule !== undefined)
462
+ updatedStage.PassOnRule = node.stageData.PassOnRule;
463
+ if (node.stageData?.ActorRule !== undefined)
464
+ updatedStage.ActorRule = node.stageData.ActorRule;
465
+ if (node.stageData?.MinNoOfActor !== undefined)
466
+ updatedStage.MinNoOfActor = node.stageData.MinNoOfActor;
467
+ if (node.stageData?.IsParallel !== undefined)
468
+ updatedStage.IsParallel = node.stageData.IsParallel;
469
+ if (node.stageData?.Tags)
470
+ updatedStage.Tags = node.stageData.Tags;
471
+ // Always update these properties
472
+ updatedStage.IsEntryPoint = node.isStartNode;
473
+ updatedStage.Coordinates = { X: node.x, Y: node.y };
474
+ updatedStage.SwimLane = this.swimlanes[swimlaneIndex].id || '';
475
+ // Add to stages
476
+ stages.push(updatedStage);
477
+ }
478
+ else {
479
+ // Create a new stage
480
+ stages.push({
481
+ Id: '',
482
+ Code: '',
483
+ TenantId: '',
484
+ id: node.id,
485
+ ServiceName: '',
486
+ CreatedAt: new Date(),
487
+ UpdatedAt: new Date(),
488
+ DataState: ObjectState.New,
489
+ Workflow: workflow.Id,
490
+ Name: node.stageData?.Name || 'Unnamed Stage',
491
+ Description: node.stageData?.Description || '',
492
+ Duration: node.stageData?.Duration || 0,
493
+ PassOnRule: node.stageData?.PassOnRule || '',
494
+ ActorRule: node.stageData?.ActorRule || StageActorRule.None,
495
+ MinNoOfActor: node.stageData?.MinNoOfActor || 0,
496
+ IsParallel: node.stageData?.IsParallel || false,
497
+ IsEntryPoint: node.isStartNode,
498
+ IsExitPoint: false, // Will be updated below
499
+ Tags: node.stageData?.Tags || [],
500
+ Form: node.stageData?.formId ?? '',
501
+ AllowMultiSubProcess: false,
502
+ AssignmentType: TaskAssignmentType.AutoRoute,
503
+ SubWorkFlow: '',
504
+ SwimLane: this.swimlanes[swimlaneIndex].id || '',
505
+ Coordinates: { X: node.x, Y: node.y },
506
+ IsSubProcess: false,
507
+ Key: node.stageData?.Key || undefined,
508
+ });
509
+ }
539
510
  }
540
511
  });
541
512
  });
542
- // Check which stages have no outgoing connections - they are exit points
543
- this.connections.forEach((conn) => {
544
- const targetStage = stages.find((s) => s.Id === conn.targetNodeId);
545
- if (targetStage) {
546
- // Check if this target has any outgoing connections
547
- const hasOutgoingConnections = this.connections.some((c) => c.sourceNodeId === targetStage.Id);
548
- if (!hasOutgoingConnections) {
549
- targetStage.IsExitPoint = true;
550
- }
513
+ // Determine which stages are exit points (no outgoing connections)
514
+ stages.forEach((stage) => {
515
+ const hasOutgoingConnections = this.connections.some((conn) => conn.sourceNodeId === stage.Id || conn.sourceNodeId === stage.id);
516
+ if (!hasOutgoingConnections) {
517
+ stage.IsExitPoint = true;
551
518
  }
552
519
  });
553
520
  // Transform connections to WorkflowAction[]
554
- workflow.Actions = this.connections.map((conn) => {
521
+ const actions = [];
522
+ this.connections.forEach((conn) => {
555
523
  const sourceNode = this.findNodeById(conn.sourceNodeId)?.node;
556
524
  const targetNode = this.findNodeById(conn.targetNodeId)?.node;
557
- return {
558
- Id: conn.id,
559
- Code: '',
560
- TenantId: '',
561
- id: conn.id,
562
- ServiceName: '',
563
- CreatedAt: new Date(),
564
- UpdatedAt: new Date(),
565
- DataState: ObjectState.New,
566
- Workflow: workflow.Id,
567
- Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'}`,
568
- FromStage: conn.sourceNodeId,
569
- ToStage: conn.targetNodeId,
570
- IsParallel: sourceNode?.stageData?.hasParallel || false,
571
- };
525
+ // Check if this is an existing action
526
+ if (this.actionRecord[conn.id]) {
527
+ // Update existing action with changed values
528
+ const existingAction = this.actionRecord[conn.id];
529
+ // Create updated action with changed properties
530
+ const updatedAction = {
531
+ ...existingAction,
532
+ DataState: ObjectState.Changed,
533
+ UpdatedAt: new Date(),
534
+ };
535
+ // Update properties that may have changed
536
+ updatedAction.Name = `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'}`;
537
+ updatedAction.IsParallel = sourceNode?.stageData?.hasParallel || false;
538
+ updatedAction.PassOnRule = conn.condition || '';
539
+ actions.push(updatedAction);
540
+ }
541
+ else {
542
+ // Create a new action
543
+ actions.push({
544
+ Id: '',
545
+ Code: '',
546
+ TenantId: '',
547
+ id: conn.id,
548
+ ServiceName: '',
549
+ CreatedAt: new Date(),
550
+ UpdatedAt: new Date(),
551
+ DataState: ObjectState.New,
552
+ Workflow: workflow.Id,
553
+ Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'}`,
554
+ FromStage: conn.sourceNodeId,
555
+ ToStage: conn.targetNodeId,
556
+ IsParallel: sourceNode?.stageData?.hasParallel || false,
557
+ PassOnRule: conn.condition || '',
558
+ });
559
+ }
560
+ });
561
+ // Add deleted objects with Removed state
562
+ Object.keys(this.stageRecord).forEach((stageId) => {
563
+ const exists = stages.some((stage) => stage.Id === stageId || stage.id === stageId);
564
+ if (!exists) {
565
+ const stage = this.stageRecord[stageId];
566
+ stages.push({
567
+ ...stage,
568
+ DataState: ObjectState.Removed,
569
+ UpdatedAt: new Date(),
570
+ });
571
+ }
572
+ });
573
+ Object.keys(this.actionRecord).forEach((actionId) => {
574
+ const exists = actions.some((action) => action.Id === actionId || action.id === actionId);
575
+ if (!exists) {
576
+ const action = this.actionRecord[actionId];
577
+ actions.push({
578
+ ...action,
579
+ DataState: ObjectState.Removed,
580
+ UpdatedAt: new Date(),
581
+ });
582
+ }
583
+ });
584
+ // Handle deleted swimlanes
585
+ Object.keys(this.swimlaneRecord).forEach((laneId) => {
586
+ const exists = workflow.Lanes.some((lane) => lane.Id === laneId || lane.id === laneId);
587
+ if (!exists) {
588
+ const lane = this.swimlaneRecord[laneId];
589
+ workflow.Lanes.push({
590
+ ...lane,
591
+ DataState: ObjectState.Removed,
592
+ UpdatedAt: new Date(),
593
+ });
594
+ }
572
595
  });
573
596
  workflow.Stages = stages;
597
+ workflow.Actions = actions;
574
598
  return workflow;
575
599
  }
600
+ // Add a new property to track loaded objects
601
+ loadedObjectIds = {}; // Format: { id: code }
602
+ // Add a method to register loaded objects
603
+ registerLoadedObject(id, code) {
604
+ this.loadedObjectIds[id] = code;
605
+ }
606
+ // Method to check if an object was loaded from API
607
+ wasLoadedFromApi(id) {
608
+ return id in this.loadedObjectIds;
609
+ }
610
+ // Method to get the code for a loaded object
611
+ getCodeForObject(id) {
612
+ return this.loadedObjectIds[id] || '';
613
+ }
576
614
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
577
615
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDesignerState, providedIn: 'root' });
578
616
  }
@@ -582,4 +620,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
582
620
  providedIn: 'root',
583
621
  }]
584
622
  }] });
585
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFVM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBSzdDLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsU0FBUyxHQUFtQixFQUFFLENBQUM7SUFDL0IsV0FBVyxHQUFrQixJQUFJLENBQUMsQ0FBQyx1Q0FBdUM7SUFDMUUsV0FBVyxHQUFpQixFQUFFLENBQUM7SUFDL0Isc0JBQXNCLEdBT2xCLEVBQUUsQ0FBQztJQUNQLGNBQWMsR0FBa0IsSUFBSSxDQUFDO0lBQ3JDLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFFdEIsZUFBZSxHQUE2QjtRQUMzRCxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7UUFDL0MsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsdUNBQXVDO1FBQzVELDJDQUEyQztRQUMzQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7S0FDL0IsQ0FBQztJQUVGLGVBQWUsQ0FBQyxNQUFxQixFQUFFLFFBQXVCO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZLEVBQUUsSUFBVztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3JDO2dCQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07Z0JBQzVCLEtBQUssRUFBRSxJQUFJO2dCQUNYLElBQUk7Z0JBQ0osS0FBSyxFQUFFLEVBQUU7YUFDVjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwyREFBMkQ7SUFDM0Qsd0JBQXdCLENBQUMsSUFBVTtRQUNqQyxNQUFNLE1BQU0sR0FBc0IsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQztRQUV0RCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsdURBQXVEO1lBRXZELGtCQUFrQjtZQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDZixDQUFDLEVBQUUsQ0FBQztvQkFDSixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsS0FBSztpQkFDWixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztvQkFDYixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsT0FBTztpQkFDZCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQscUJBQXFCO1lBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNmLENBQUMsRUFBRSxDQUFDO29CQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDZCxJQUFJLEVBQUUsUUFBUTtpQkFDZixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsbUJBQW1CO1lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNmLENBQUMsRUFBRSxDQUFDO29CQUNKLENBQUMsRUFBRSxDQUFDO29CQUNKLElBQUksRUFBRSxNQUFNO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLGlEQUFpRDtZQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLFFBQVE7Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDZixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUNqQixDQUFDLEVBQUUsQ0FBQztnQkFDSixJQUFJLEVBQUUsS0FBSzthQUNaLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsVUFBVTtnQkFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDYixDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsT0FBTzthQUNkLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsV0FBVztnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQ2pCLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDZCxJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsU0FBUztnQkFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQywwREFBMEQ7WUFFMUQsMkNBQTJDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNmLENBQUMsRUFBRSxDQUFDO29CQUNKLENBQUMsRUFBRSxDQUFDO29CQUNKLElBQUksRUFBRSxNQUFNO2lCQUNiLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLGdEQUFnRDtZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLFFBQVE7Z0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDZixDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUNqQixDQUFDLEVBQUUsQ0FBQztnQkFDSixJQUFJLEVBQUUsS0FBSzthQUNaLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsWUFBWTtnQkFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDYixDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsT0FBTzthQUNkLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsZUFBZTtnQkFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDYixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLElBQUksRUFBRSxPQUFPO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxXQUFXO2dCQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2YsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFDakIsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNkLElBQUksRUFBRSxRQUFRO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxjQUFjO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2YsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN4QixJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsV0FBVztnQkFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLENBQ0wsYUFBcUIsRUFDckIsSUFBYyxFQUNkLENBQVMsRUFDVCxDQUFTLEVBQ1QsU0FBa0MsRUFDbEMsWUFBMkM7UUFFM0MsSUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQzlCLENBQUMsSUFBSTtZQUNMLENBQUMsSUFBSSxLQUFLLE9BQU87Z0JBQ2YsSUFBSSxLQUFLLFVBQVU7Z0JBQ25CLElBQUksS0FBSyxNQUFNO2dCQUNmLElBQUksS0FBSyxTQUFTLENBQUMsRUFDckIsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsYUFBYSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyw0QkFBNEI7UUFFNUUsdUJBQXVCO1FBQ3ZCLE1BQU0sRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBRXZFLDRDQUE0QztRQUM1QyxNQUFNLElBQUksR0FBUztZQUNqQixFQUFFO1lBQ0YsSUFBSTtZQUNKLENBQUM7WUFDRCxDQUFDLEVBQUUsU0FBUztZQUNaLEtBQUssRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUI7WUFDdkQsTUFBTSxFQUFFLEdBQUcsRUFBRSxrQkFBa0I7WUFDL0IsV0FBVyxFQUFFLEtBQUssRUFBRSxtQkFBbUI7WUFDdkMsU0FBUyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUUsbUJBQW1CO1lBQy9DLFlBQVksRUFBRSxZQUFZLElBQUksSUFBSTtTQUNuQyxDQUFDO1FBRUYsOEVBQThFO1FBQzlFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUMxQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUMxRCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsWUFBWSxDQUFDLEVBQVU7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLEtBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixPQUFlO1FBRWYsSUFBSSxDQUFDLHNCQUFzQixHQUFHO1lBQzVCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLG1CQUFtQixFQUFFLGFBQWE7WUFDbEMsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUUsT0FBTztZQUNmLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFFBQVEsRUFBRSxPQUFPO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUNyRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNoRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNyRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUM7SUFDbkQsQ0FBQztJQUVELHFCQUFxQjtRQU9uQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUxRCxNQUFNLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FDNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQztRQUV6RCxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU1RCw4Q0FBOEM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUVoRyxPQUFPO1lBQ0wsTUFBTTtZQUNOLE1BQU07WUFDTixJQUFJLEVBQUUsUUFBUSxJQUFJLE1BQU07WUFDeEIsSUFBSSxFQUFFLFFBQVEsSUFBSSxNQUFNO1lBQ3hCLG1CQUFtQjtTQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUNkLFlBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLG1CQUEyQjtRQUUzQixNQUFNLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBRXpFLElBQUksQ0FBQyxXQUFXLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFlO1lBQzdCLEVBQUUsRUFBRSxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRTtZQUM1RCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDaEMsWUFBWSxFQUFFLFlBQVk7WUFDMUIsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLGFBQWEsRUFBRSxhQUFhO1lBQzVCLG1CQUFtQixFQUFFLG1CQUFtQjtZQUN4QyxtQkFBbUIsRUFBRSxtQkFBbUI7U0FDekMsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCwyQkFBMkIsRUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQ3ZCLGFBQWEsQ0FDZCxDQUFDO1FBQ0YsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxpQkFBaUIsQ0FBQyxVQUFzQjtRQVF0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBRXZDLHlCQUF5QjtRQUN6QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUNuRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsYUFBYSxDQUN6QyxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FDbkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLGFBQWEsQ0FDekMsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUNWLFVBQVUsQ0FBQyxDQUFDO1lBQ1osV0FBVyxDQUFDLENBQUM7WUFDYixDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUNSLFVBQVUsQ0FBQyxDQUFDO1lBQ1osV0FBVyxDQUFDLENBQUM7WUFDYixDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFOUMsT0FBTztZQUNMLE1BQU07WUFDTixNQUFNO1lBQ04sSUFBSTtZQUNKLElBQUk7WUFDSixtQkFBbUIsRUFBRSxVQUFVLENBQUMsbUJBQW1CO1lBQ25ELG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxtQkFBbUI7U0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsVUFBVSxDQUFDLGNBQXNCLEVBQUUsY0FBc0I7UUFDdkQsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssQ0FDeEUsQ0FBQztJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0MsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDdEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLG1DQUFtQztJQUNuQyxpQ0FBaUM7SUFDakMscUVBQXFFO0lBQ3JFLDhDQUE4QztJQUM5QywwQkFBMEI7SUFDMUIsK0VBQStFO0lBQy9FLCtDQUErQztJQUMvQyxtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixPQUFPO0lBRVAseUNBQXlDO0lBQ3pDLCtEQUErRDtJQUMvRCxlQUFlO0lBQ2YsNkJBQTZCO0lBQzdCLCtCQUErQjtJQUMvQiw2QkFBNkI7SUFDN0Isa0NBQWtDO0lBQ2xDLCtGQUErRjtJQUMvRiw0REFBNEQ7SUFDNUQsd0RBQXdEO0lBQ3hELGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsNkJBQTZCO0lBQzdCLHlCQUF5QjtJQUN6QiwrQkFBK0I7SUFDL0IsK0JBQStCO0lBQy9CLG9DQUFvQztJQUNwQyxTQUFTO0lBQ1QsUUFBUTtJQUVSLDBDQUEwQztJQUMxQyx3Q0FBd0M7SUFFeEMsMERBQTBEO0lBQzFELDBDQUEwQztJQUMxQyxxQ0FBcUM7SUFDckMsMENBQTBDO0lBQzFDLHlDQUF5QztJQUN6Qyx5QkFBeUI7SUFDekIsbUNBQW1DO0lBQ25DLDJEQUEyRDtJQUMzRCw0REFBNEQ7SUFDNUQscURBQXFEO0lBQ3JELDBEQUEwRDtJQUMxRCx5RUFBeUU7SUFDekUsNkRBQTZEO0lBQzdELHVFQUF1RTtJQUN2RSw0Q0FBNEM7SUFDNUMsa0VBQWtFO0lBQ2xFLDhDQUE4QztJQUM5QyxnREFBZ0Q7SUFDaEQseUNBQXlDO0lBQ3pDLDRCQUE0QjtJQUM1Qiw4RUFBOEU7SUFDOUUsNERBQTREO0lBQzVELHdEQUF3RDtJQUN4RCxtREFBbUQ7SUFDbkQsaUNBQWlDO0lBQ2pDLDREQUE0RDtJQUM1RCxzQkFBc0I7SUFDdEIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7SUFDN0IsbUNBQW1DO0lBQ25DLG1DQUFtQztJQUNuQyx3Q0FBd0M7SUFDeEMsYUFBYTtJQUViLDhCQUE4QjtJQUM5QixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFFUixzRUFBc0U7SUFDdEUseUNBQXlDO0lBQ3pDLG1FQUFtRTtJQUVuRSxXQUFXO0lBQ1gsMEJBQTBCO0lBQzFCLGdEQUFnRDtJQUNoRCw0REFBNEQ7SUFDNUQsVUFBVTtJQUNWLHFEQUFxRDtJQUNyRCw0RUFBNEU7SUFDNUUsMkJBQTJCO0lBQzNCLDBEQUEwRDtJQUMxRCx5Q0FBeUM7SUFDekMsVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBRVIsaURBQWlEO0lBQ2pELHdEQUF3RDtJQUN4RCxxRUFBcUU7SUFDckUscUVBQXFFO0lBRXJFLGVBQWU7SUFDZixxQkFBcUI7SUFDckIsK0JBQStCO0lBQy9CLDZFQUE2RTtJQUM3RSxtREFBbUQ7SUFDbkQsWUFBWTtJQUNaLHNDQUFzQztJQUN0QyxvQ0FBb0M7SUFDcEMsZ0VBQWdFO0lBQ2hFLHdEQUF3RDtJQUN4RCxrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQix5QkFBeUI7SUFDekIsK0JBQStCO0lBQy9CLCtCQUErQjtJQUMvQixvQ0FBb0M7SUFDcEMsU0FBUztJQUNULFFBQVE7SUFFUiw4QkFBOEI7SUFFOUIscUJBQXFCO0lBQ3JCLElBQUk7SUFFSixjQUFjLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFXO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQ1QsbUNBQW1DLEVBQ25DLEtBQUssRUFDTCxXQUFXLEVBQ1gsSUFBSSxFQUNKLFVBQVUsRUFDVixJQUFJLENBQ0wsQ0FBQztRQUVGLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHO2dCQUN0QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUN4QixLQUFLLEVBQUUsSUFBSTtnQkFDWCxJQUFJLEVBQUUsSUFBSTthQUNYLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsOEJBQThCO1FBQzlCLE1BQU0sUUFBUSxHQUFhO1lBQ3pCLEVBQUUsRUFBRSxFQUFFLEVBQUUsNENBQTRDO1lBQ3BELElBQUksRUFBRSxFQUFFO1lBQ1IsUUFBUSxFQUFFLEVBQUU7WUFDWixFQUFFLEVBQUUsRUFBRTtZQUNOLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNyQixTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7WUFDMUIsSUFBSSxFQUFFLGNBQWMsRUFBRSx3Q0FBd0M7WUFDOUQsV0FBVyxFQUFFLEVBQUUsRUFBRSxzQkFBc0I7WUFDdkMsY0FBYyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksU0FBUztZQUN0QyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsU0FBUyxFQUFFLDBCQUEwQjtZQUN4RSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxpQkFBaUI7WUFDeEMsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUVGLG9DQUFvQztRQUNwQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLFFBQVEsS0FBSyxFQUFFO2dCQUNuQixJQUFJLEVBQUUsRUFBRTtnQkFDUixRQUFRLEVBQUUsRUFBRTtnQkFDWixFQUFFLEVBQUUsUUFBUSxLQUFLLEVBQUU7Z0JBQ25CLFdBQVcsRUFBRSxFQUFFO2dCQUNmLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDckIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQzFCLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDckIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDekIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUN4QixXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFFLHNDQUFzQztnQkFDdEYsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsZUFBZTthQUNwRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRTtZQUNqRCxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQzFCLCtCQUErQjtvQkFDL0IsTUFBTSxLQUFLLEdBQWtCO3dCQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLEVBQUU7d0JBQ1IsUUFBUSxFQUFFLEVBQUU7d0JBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO3dCQUNYLFdBQVcsRUFBRSxFQUFFO3dCQUNmLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTt3QkFDckIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO3dCQUNyQixTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7d0JBQzFCLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWU7d0JBQzdDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsSUFBSSxFQUFFO3dCQUM5QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLElBQUksQ0FBQzt3QkFDdkMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUU7d0JBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsSUFBSSxjQUFjLENBQUMsSUFBSTt3QkFDM0QsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxJQUFJLENBQUM7d0JBQy9DLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsSUFBSSxLQUFLO3dCQUMvQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVc7d0JBQzlCLFdBQVcsRUFBRSxLQUFLLEVBQUUsMENBQTBDO3dCQUM5RCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTt3QkFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQzVELG9CQUFvQixFQUFFLEtBQUs7d0JBQzNCLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO3dCQUM1QyxXQUFXLEVBQUUsRUFBRTt3QkFDZixRQUFRLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFO3dCQUMxQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDckMsWUFBWSxFQUFFLEtBQUs7cUJBQ3BCLENBQUM7b0JBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixvREFBb0Q7Z0JBQ3BELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ2xELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxFQUFFLENBQ3pDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQzVCLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBRTlELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNYLElBQUksRUFBRSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxFQUFFO2dCQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDckIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUMxQixRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ3JCLElBQUksRUFBRSxlQUFlLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLFNBQVMsT0FDM0QsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksU0FDakMsRUFBRTtnQkFDRixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDMUIsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxJQUFJLEtBQUs7YUFDeEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFekIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0Fwc0JVLHFCQUFxQjs0R0FBckIscUJBQXFCLGNBRnBCLE1BQU07OzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUsXG4gIFN3aW1sYW5lSXRlbSxcbiAgVG9vbFR5cGUsXG59IGZyb20gJy4vd29ya2Zsb3ctZGVzaWduZXIudHlwZXMnO1xuaW1wb3J0IHsgVGFnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1RhZyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N0YWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1dvcmtmbG93U3RhZ2UnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcbmltcG9ydCB7IFN0YWdlQWN0b3JSdWxlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1N0YWdlQWN0b3JSdWxlJztcbmltcG9ydCB7IFRhc2tBc3NpZ25tZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9UYXNrQXNzaWdubWVudFR5cGUnO1xuaW1wb3J0IHsgV29ya2Zsb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvV29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0YXR1cyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUge1xuICBzd2ltbGFuZXM6IFN3aW1sYW5lSXRlbVtdID0gW107XG4gIHN0YXJ0Tm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIElEIG9mIHRoZSBmaXJzdC9zdGFydCBub2RlXG4gIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9uW10gPSBbXTtcbiAgZHJhZ2dpbmdDb25uZWN0aW9uRGF0YToge1xuICAgIHNvdXJjZVBvaW50PzogQ29ubmVjdGlvblBvaW50O1xuICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg/OiBudW1iZXI7XG4gICAgc3RhcnRYPzogbnVtYmVyO1xuICAgIHN0YXJ0WT86IG51bWJlcjtcbiAgICBjdXJyZW50WD86IG51bWJlcjtcbiAgICBjdXJyZW50WT86IG51bWJlcjtcbiAgfSA9IHt9O1xuICB3b3JrZmxvd0Zvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHdvcmtmbG93Rm9ybU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgc3RhZ2U6IFsnc3RhZ2UnLCAnZGVjaXNpb24nLCAnc3ViZmxvdycsICdmb3JtJ10sXG4gICAgZGVjaXNpb246IFsnc3RhZ2UnXSwgLy8gRGVjaXNpb25zIGNhbiBvbmx5IGNvbm5lY3QgdG8gU3RhZ2VzXG4gICAgLy8gJ2FjdGlvbic6IFsnc3RhZ2UnLCAnZm9ybScsICdkZWNpc2lvbiddLFxuICAgIGZvcm06IFtdLFxuICAgIHN1YmZsb3c6IFsnc3RhZ2UnLCAnZGVjaXNpb24nXSxcbiAgfTtcblxuICBzZXRXb3JrZmxvd0Zvcm0oZm9ybUlkOiBzdHJpbmcgfCBudWxsLCBmb3JtTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMud29ya2Zsb3dGb3JtSWQgPSBmb3JtSWQ7XG4gICAgdGhpcy53b3JrZmxvd0Zvcm1OYW1lID0gZm9ybU5hbWU7XG4gIH1cblxuICBhZGRTd2ltbGFuZShuYW1lOiBzdHJpbmcsIHRhZ3M6IFRhZ1tdKSB7XG4gICAgdGhpcy5zd2ltbGFuZXMgPSB0aGlzLnN3aW1sYW5lcy5jb25jYXQoW1xuICAgICAge1xuICAgICAgICBvcmRlcjogdGhpcy5zd2ltbGFuZXMubGVuZ3RoLFxuICAgICAgICBsYWJlbDogbmFtZSxcbiAgICAgICAgdGFncyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBjb25uZWN0aW9uIHBvaW50cyBmb3IgYSBub2RlXG4gIGdlbmVyYXRlQ29ubmVjdGlvblBvaW50cyhub2RlOiBOb2RlKTogQ29ubmVjdGlvblBvaW50W10ge1xuICAgIGNvbnN0IHBvaW50czogQ29ubmVjdGlvblBvaW50W10gPSBbXTtcbiAgICBjb25zdCBzcGFjaW5nID0gNTA7IC8vIFNwYWNlIGJldHdlZW4gY29ubmVjdGlvbiBwb2ludHNcblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIFJlY3Rhbmd1bGFyIHNoYXBlcyAtIGFkZCBwb2ludHMgYXJvdW5kIHRoZSByZWN0YW5nbGVcblxuICAgICAgLy8gVG9wIGVkZ2UgcG9pbnRzXG4gICAgICBmb3IgKGxldCB4ID0gc3BhY2luZzsgeCA8IG5vZGUud2lkdGg7IHggKz0gc3BhY2luZykge1xuICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGAke25vZGUuaWR9LXRvcC0ke3h9YCxcbiAgICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHR5cGU6ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmlnaHQgZWRnZSBwb2ludHNcbiAgICAgIGZvciAobGV0IHkgPSBzcGFjaW5nOyB5IDwgbm9kZS5oZWlnaHQ7IHkgKz0gc3BhY2luZykge1xuICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LSR7eX1gLFxuICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICB4OiBub2RlLndpZHRoLFxuICAgICAgICAgIHk6IHksXG4gICAgICAgICAgdHlwZTogJ3JpZ2h0JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJvdHRvbSBlZGdlIHBvaW50c1xuICAgICAgZm9yIChsZXQgeCA9IHNwYWNpbmc7IHggPCBub2RlLndpZHRoOyB4ICs9IHNwYWNpbmcpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBgJHtub2RlLmlkfS1ib3R0b20tJHt4fWAsXG4gICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgeTogbm9kZS5oZWlnaHQsXG4gICAgICAgICAgdHlwZTogJ2JvdHRvbScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWZ0IGVkZ2UgcG9pbnRzXG4gICAgICBmb3IgKGxldCB5ID0gc3BhY2luZzsgeSA8IG5vZGUuaGVpZ2h0OyB5ICs9IHNwYWNpbmcpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBgJHtub2RlLmlkfS1sZWZ0LSR7eX1gLFxuICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IHksXG4gICAgICAgICAgdHlwZTogJ2xlZnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgLy8gRGlhbW9uZCBzaGFwZSAtIGFkZCBwb2ludHMgYXQgdGhlIGZvdXIgY29ybmVyc1xuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tdG9wLTBgLFxuICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgIHg6IG5vZGUud2lkdGggLyAyLFxuICAgICAgICB5OiAwLFxuICAgICAgICB0eXBlOiAndG9wJyxcbiAgICAgIH0pO1xuXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS1yaWdodC0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiBub2RlLndpZHRoLFxuICAgICAgICB5OiBub2RlLmhlaWdodCAvIDIsXG4gICAgICAgIHR5cGU6ICdyaWdodCcsXG4gICAgICB9KTtcblxuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tYm90dG9tLTBgLFxuICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgIHg6IG5vZGUud2lkdGggLyAyLFxuICAgICAgICB5OiBub2RlLmhlaWdodCxcbiAgICAgICAgdHlwZTogJ2JvdHRvbScsXG4gICAgICB9KTtcblxuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tbGVmdC0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiBub2RlLmhlaWdodCAvIDIsXG4gICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnZm9ybScpIHtcbiAgICAgIC8vIEZvcm0gb25seSBoYXMgaW5wdXQgY29ubmVjdGlvbiBwb2ludHMsIG5vIG91dHB1dCBwb2ludHNcblxuICAgICAgLy8gTGVmdCBlZGdlIHBvaW50cyAoZm9yIGlucHV0IGNvbm5lY3Rpb25zKVxuICAgICAgZm9yIChsZXQgeSA9IHNwYWNpbmc7IHkgPCBub2RlLmhlaWdodDsgeSArPSBzcGFjaW5nKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogYCR7bm9kZS5pZH0tbGVmdC0ke3l9YCxcbiAgICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdzdWJmbG93Jykge1xuICAgICAgLy8gSGV4YWdvbiBzaGFwZSAtIGFkZCBwb2ludHMgYXQgdGhlIHNpeCBjb3JuZXJzXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS10b3AtMGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCAvIDIsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHR5cGU6ICd0b3AnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LXRvcGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCxcbiAgICAgICAgeTogbm9kZS5oZWlnaHQgLyA0LFxuICAgICAgICB0eXBlOiAncmlnaHQnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LWJvdHRvbWAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCxcbiAgICAgICAgeTogKG5vZGUuaGVpZ2h0ICogMykgLyA0LFxuICAgICAgICB0eXBlOiAncmlnaHQnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LWJvdHRvbS0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiBub2RlLndpZHRoIC8gMixcbiAgICAgICAgeTogbm9kZS5oZWlnaHQsXG4gICAgICAgIHR5cGU6ICdib3R0b20nLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LWxlZnQtYm90dG9tYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAobm9kZS5oZWlnaHQgKiAzKSAvIDQsXG4gICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgIH0pO1xuXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS1sZWZ0LXRvcGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogbm9kZS5oZWlnaHQgLyA0LFxuICAgICAgICB0eXBlOiAnbGVmdCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgYWRkTm9kZShcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXIsXG4gICAgdHlwZTogVG9vbFR5cGUsXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBzdGFnZURhdGE/OiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+LFxuICAgIHdvcmtmbG93RGF0YT86IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdIHx8XG4gICAgICAhdHlwZSB8fFxuICAgICAgKHR5cGUgIT09ICdzdGFnZScgJiZcbiAgICAgICAgdHlwZSAhPT0gJ2RlY2lzaW9uJyAmJlxuICAgICAgICB0eXBlICE9PSAnZm9ybScgJiZcbiAgICAgICAgdHlwZSAhPT0gJ3N1YmZsb3cnKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQWRqdXN0IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHN3aW1sYW5lXG4gICAgY29uc3QgYWRqdXN0ZWRZID0geSAtIHN3aW1sYW5lSW5kZXggKiAyNjMgLSA0MDsgLy8gU3VidHJhY3RpbmcgaGVhZGVyIGhlaWdodFxuXG4gICAgLy8gR2VuZXJhdGUgYSB1bmlxdWUgSURcbiAgICBjb25zdCBpZCA9IGAke3R5cGV9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gO1xuXG4gICAgLy8gQ3JlYXRlIG5vZGUgd2l0aCBkaW1lbnNpb25zIGJhc2VkIG9uIHR5cGVcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xuICAgICAgaWQsXG4gICAgICB0eXBlLFxuICAgICAgeCxcbiAgICAgIHk6IGFkanVzdGVkWSxcbiAgICAgIHdpZHRoOiB0eXBlID09PSAnc3ViZmxvdycgPyA4OCA6IDE2OSwgLy8gV2lkdGggZnJvbSBTVkdcbiAgICAgIGhlaWdodDogMTAwLCAvLyBIZWlnaHQgZnJvbSBTVkdcbiAgICAgIGlzU3RhcnROb2RlOiBmYWxzZSwgLy8gRGVmYXVsdCB0byBmYWxzZVxuICAgICAgc3RhZ2VEYXRhOiBzdGFnZURhdGEgfHwge30sIC8vIFN0b3JlIHN0YWdlIGRhdGFcbiAgICAgIHdvcmtmbG93RGF0YTogd29ya2Zsb3dEYXRhIHx8IG51bGwsXG4gICAgfTtcblxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIGVudGlyZSB3b3JrZmxvdywgbWFyayBpdCBhcyB0aGUgc3RhcnQgbm9kZVxuICAgIGlmICh0aGlzLmdldE5vZGVDb3VudCgpID09PSAwKSB7XG4gICAgICBub2RlLmlzU3RhcnROb2RlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhcnROb2RlSWQgPSBpZDtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBjb25uZWN0aW9uIHBvaW50cyBmb3IgdGhlIG5vZGVcbiAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMgPSB0aGlzLmdlbmVyYXRlQ29ubmVjdGlvblBvaW50cyhub2RlKTtcblxuICAgIC8vIEFkZCBub2RlIHRvIHRoZSBzd2ltbGFuZVxuICAgIGlmICghdGhpcy5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0ubm9kZXMpIHtcbiAgICAgIHRoaXMuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdLm5vZGVzID0gW107XG4gICAgfVxuICAgIHRoaXMuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdLm5vZGVzLnB1c2gobm9kZSk7XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8vIEhlbHBlciB0byBnZXQgdG90YWwgbm9kZSBjb3VudCBhY3Jvc3MgYWxsIHN3aW1sYW5lc1xuICBnZXROb2RlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zd2ltbGFuZXMucmVkdWNlKFxuICAgICAgKGNvdW50LCBzd2ltbGFuZSkgPT4gY291bnQgKyAoc3dpbWxhbmUubm9kZXM/Lmxlbmd0aCB8fCAwKSxcbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgLy8gRmluZCBhIG5vZGUgYnkgSUQgKHVzZWZ1bCBmb3IgbGF0ZXIgb3BlcmF0aW9ucylcbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiB7IG5vZGU6IE5vZGU7IHN3aW1sYW5lSW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN3aW1sYW5lc1tpXTtcbiAgICAgIGNvbnN0IG5vZGUgPSBzd2ltbGFuZS5ub2Rlcz8uZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgc3dpbWxhbmVJbmRleDogaSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXJ0Q29ubmVjdGlvbkRyYWcoXG4gICAgcG9pbnQ6IENvbm5lY3Rpb25Qb2ludCxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXIsXG4gICAgZ2xvYmFsWDogbnVtYmVyLFxuICAgIGdsb2JhbFk6IG51bWJlclxuICApIHtcbiAgICB0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEgPSB7XG4gICAgICBzb3VyY2VQb2ludDogcG9pbnQsXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgc3RhcnRYOiBnbG9iYWxYLFxuICAgICAgc3RhcnRZOiBnbG9iYWxZLFxuICAgICAgY3VycmVudFg6IGdsb2JhbFgsXG4gICAgICBjdXJyZW50WTogZ2xvYmFsWSxcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlQ29ubmVjdGlvbkRyYWcoY3VycmVudFg6IG51bWJlciwgY3VycmVudFk6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQpIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5jdXJyZW50WCA9IGN1cnJlbnRYO1xuICAgICAgdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLmN1cnJlbnRZID0gY3VycmVudFk7XG4gICAgfVxuICB9XG5cbiAgZW5kQ29ubmVjdGlvbkRyYWcoKSB7XG4gICAgY29uc29sZS5sb2coJ0VuZGluZyBjb25uZWN0aW9uIGRyYWcsIGNsZWFyaW5nIGRhdGEnKTtcbiAgICAvLyBDbGVhciBkcmFnZ2luZyBkYXRhXG4gICAgdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhID0ge307XG4gIH1cblxuICBpc0Nvbm5lY3Rpb25EcmFnZ2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aERhdGEoKToge1xuICAgIHN0YXJ0WDogbnVtYmVyO1xuICAgIHN0YXJ0WTogbnVtYmVyO1xuICAgIGVuZFg6IG51bWJlcjtcbiAgICBlbmRZOiBudW1iZXI7XG4gICAgc291cmNlU3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgeyBzb3VyY2VQb2ludCwgc291cmNlU3dpbWxhbmVJbmRleCwgY3VycmVudFgsIGN1cnJlbnRZIH0gPVxuICAgICAgdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChzb3VyY2VQb2ludC5ub2RlSWQpPy5ub2RlO1xuXG4gICAgaWYgKCFub2RlIHx8IHNvdXJjZVN3aW1sYW5lSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgc3RhcnQgcG9pbnQgaW4gZ2xvYmFsIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3RhcnRYID0gbm9kZS54ICsgc291cmNlUG9pbnQueDtcbiAgICBjb25zdCBzdGFydFkgPSBub2RlLnkgKyBzb3VyY2VQb2ludC55ICsgKHNvdXJjZVN3aW1sYW5lSW5kZXggKiAyNjMgKyA0MCk7IC8vIEFkZCBzd2ltbGFuZSBvZmZzZXRcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFgsXG4gICAgICBzdGFydFksXG4gICAgICBlbmRYOiBjdXJyZW50WCA/PyBzdGFydFgsXG4gICAgICBlbmRZOiBjdXJyZW50WSA/PyBzdGFydFksXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVDb25uZWN0aW9uKFxuICAgIHRhcmdldE5vZGVJZDogc3RyaW5nLFxuICAgIHRhcmdldFBvaW50SWQ6IHN0cmluZyxcbiAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogQ29ubmVjdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHsgc291cmNlUG9pbnQsIHNvdXJjZVN3aW1sYW5lSW5kZXggfSA9IHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YTtcblxuICAgIGlmICghc291cmNlUG9pbnQgfHwgc291cmNlU3dpbWxhbmVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIHNvdXJjZSBkYXRhIGZvciBjb25uZWN0aW9uJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0aW9uOiBDb25uZWN0aW9uID0ge1xuICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgc291cmNlTm9kZUlkOiBzb3VyY2VQb2ludC5ub2RlSWQsXG4gICAgICB0YXJnZXROb2RlSWQ6IHRhcmdldE5vZGVJZCxcbiAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnRJZCxcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiB0YXJnZXRTd2ltbGFuZUluZGV4LFxuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgY29uc29sZS5sb2coJ0NyZWF0ZWQgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdDb25uZWN0aW9ucyBhcnJheSBub3cgaGFzJyxcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoLFxuICAgICAgJ2Nvbm5lY3Rpb25zJ1xuICAgICk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gIH1cblxuICAvLyBBZGQgYSBtZXRob2QgdG8gZ2V0IGNvbm5lY3Rpb24gZGF0YSBmb3IgcmVuZGVyaW5nXG4gIGdldENvbm5lY3Rpb25EYXRhKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB7XG4gICAgc3RhcnRYOiBudW1iZXI7XG4gICAgc3RhcnRZOiBudW1iZXI7XG4gICAgZW5kWDogbnVtYmVyO1xuICAgIGVuZFk6IG51bWJlcjtcbiAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXI7XG4gICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZUluZm8gPSB0aGlzLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnRhcmdldE5vZGVJZCk7XG5cbiAgICBpZiAoIXNvdXJjZU5vZGVJbmZvIHx8ICF0YXJnZXROb2RlSW5mbykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVJbmZvLm5vZGU7XG5cbiAgICAvLyBGaW5kIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAocCkgPT4gcC5pZCA9PT0gY29ubmVjdGlvbi5zb3VyY2VQb2ludElkXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXRQb2ludCA9IHRhcmdldE5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgIChwKSA9PiBwLmlkID09PSBjb25uZWN0aW9uLnRhcmdldFBvaW50SWRcbiAgICApO1xuXG4gICAgaWYgKCFzb3VyY2VQb2ludCB8fCAhdGFyZ2V0UG9pbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBnbG9iYWwgY29vcmRpbmF0ZXNcbiAgICBjb25zdCBzdGFydFggPSBzb3VyY2VOb2RlLnggKyBzb3VyY2VQb2ludC54O1xuICAgIGNvbnN0IHN0YXJ0WSA9XG4gICAgICBzb3VyY2VOb2RlLnkgK1xuICAgICAgc291cmNlUG9pbnQueSArXG4gICAgICAoY29ubmVjdGlvbi5zb3VyY2VTd2ltbGFuZUluZGV4ICogMjYzICsgNDApO1xuXG4gICAgY29uc3QgZW5kWCA9IHRhcmdldE5vZGUueCArIHRhcmdldFBvaW50Lng7XG4gICAgY29uc3QgZW5kWSA9XG4gICAgICB0YXJnZXROb2RlLnkgK1xuICAgICAgdGFyZ2V0UG9pbnQueSArXG4gICAgICAoY29ubmVjdGlvbi50YXJnZXRTd2ltbGFuZUluZGV4ICogMjYzICsgNDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0WCxcbiAgICAgIHN0YXJ0WSxcbiAgICAgIGVuZFgsXG4gICAgICBlbmRZLFxuICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogY29ubmVjdGlvbi5zb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogY29ubmVjdGlvbi50YXJnZXRTd2ltbGFuZUluZGV4LFxuICAgIH07XG4gIH1cblxuICAvLyBBZGQgYSBtZXRob2QgdG8gY2hlY2sgaWYgYSBjb25uZWN0aW9uIGlzIGFsbG93ZWQgYmFzZWQgb24gbm9kZSB0eXBlc1xuICBjYW5Db25uZWN0KHNvdXJjZU5vZGVUeXBlOiBzdHJpbmcsIHRhcmdldE5vZGVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jb25uZWN0aW9uUnVsZXNbc291cmNlTm9kZVR5cGVdPy5pbmNsdWRlcyh0YXJnZXROb2RlVHlwZSkgfHwgZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLy8gQWRkIGEgbWV0aG9kIHRvIGdldCBhbGxvd2VkIG5vZGUgdHlwZXMgZm9yIHRoZSBjdXJyZW50IGRyYWdnaW5nIGNvbm5lY3Rpb25cbiAgZ2V0QWxsb3dlZFRhcmdldE5vZGVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuZmluZE5vZGVCeUlkKFxuICAgICAgdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50Lm5vZGVJZFxuICAgICk7XG4gICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU5vZGVUeXBlID0gc291cmNlTm9kZUluZm8ubm9kZS50eXBlO1xuXG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblJ1bGVzW3NvdXJjZU5vZGVUeXBlXSB8fCBbXTtcbiAgfVxuXG4gIC8vIHRyYW5zZm9ybVRvV29ya2Zsb3dNb2RlbCgpOiBXb3JrZmxvdyB7XG4gIC8vICAgLy8gQ3JlYXRlIGJhc2Ugd29ya2Zsb3cgb2JqZWN0XG4gIC8vICAgY29uc3Qgd29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICAvLyAgICAgTmFtZTogJ05ldyBXb3JrZmxvdycsIC8vIERlZmF1bHQgbmFtZSBvciBnZXQgaXQgZnJvbSBzb21ld2hlcmVcbiAgLy8gICAgIERlc2NyaXB0aW9uOiAnJywgLy8gRGVmYXVsdCBkZXNjcmlwdGlvblxuICAvLyAgICAgU3RhZ2VFbnRyeVJ1bGU6ICcnLFxuICAvLyAgICAgQXNzaWdubWVudFR5cGU6IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsIC8vIERlZmF1bHQgYXNzaWdubWVudCB0eXBlXG4gIC8vICAgICBTdGF0dXM6IFN0YXR1cy5BY3RpdmUsIC8vIERlZmF1bHQgc3RhdHVzXG4gIC8vICAgICBBY3Rpb25zOiBbXSxcbiAgLy8gICAgIExhbmVzOiBbXSxcbiAgLy8gICAgIFN0YWdlczogW10sXG4gIC8vICAgfTtcblxuICAvLyAgIC8vIFRyYW5zZm9ybSBzd2ltbGFuZXMgdG8gU3dpbUxhbmVbXVxuICAvLyAgIHdvcmtmbG93LkxhbmVzID0gdGhpcy5zd2ltbGFuZXMubWFwKChzd2ltbGFuZSwgaW5kZXgpID0+IHtcbiAgLy8gICAgIHJldHVybiB7XG4gIC8vICAgICAgIElkOiBgbGFuZS0ke2luZGV4fWAsXG4gIC8vICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgLy8gICAgICAgVGFnczogc3dpbWxhbmUudGFncyxcbiAgLy8gICAgICAgUG9zaXRpb246IHN3aW1sYW5lLm9yZGVyLFxuICAvLyAgICAgICBDb29yZGluYXRlczogeyBYOiAwLCBZOiBzd2ltbGFuZS5vcmRlciAqIDI2MyB9LCAvLyBDYWxjdWxhdGUgWSBwb3NpdGlvbiBiYXNlZCBvbiBvcmRlclxuICAvLyAgICAgICBTaXplOiB7IFdpZHRoOiAzMDAwLCBIZWlnaHQ6IDI2MyB9LCAvLyBEZWZhdWx0IHNpemVcbiAgLy8gICAgICAgLy8gQWRkIG90aGVyIHJlcXVpcmVkIHByb3BlcnRpZXMgZnJvbSBCYXNlTW9kZWxcbiAgLy8gICAgICAgQ29kZTogJycsXG4gIC8vICAgICAgIFRlbmFudElkOiAnJyxcbiAgLy8gICAgICAgaWQ6IGBsYW5lLSR7aW5kZXh9YCxcbiAgLy8gICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAvLyAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gIC8vICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgLy8gICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gIC8vICAgICB9O1xuICAvLyAgIH0pO1xuXG4gIC8vICAgLy8gVHJhbnNmb3JtIG5vZGVzIHRvIFdvcmtmbG93U3RhZ2VbXVxuICAvLyAgIGNvbnN0IHN0YWdlczogV29ya2Zsb3dTdGFnZVtdID0gW107XG5cbiAgLy8gICB0aGlzLnN3aW1sYW5lcy5mb3JFYWNoKChzd2ltbGFuZSwgc3dpbWxhbmVJbmRleCkgPT4ge1xuICAvLyAgICAgc3dpbWxhbmUubm9kZXM/LmZvckVhY2goKG5vZGUpID0+IHtcbiAgLy8gICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAvLyAgICAgICAgIC8vIENyZWF0ZSBhIHN0YWdlIGZyb20gdGhlIG5vZGVcbiAgLy8gICAgICAgICBjb25zdCBzdGFnZTogV29ya2Zsb3dTdGFnZSA9IHtcbiAgLy8gICAgICAgICAgIElkOiBub2RlLmlkLFxuICAvLyAgICAgICAgICAgV29ya2Zsb3c6IHdvcmtmbG93LklkLFxuICAvLyAgICAgICAgICAgTmFtZTogbm9kZS5zdGFnZURhdGE/Lk5hbWUgfHwgJ1VubmFtZWQgU3RhZ2UnLFxuICAvLyAgICAgICAgICAgRGVzY3JpcHRpb246IG5vZGUuc3RhZ2VEYXRhPy5EZXNjcmlwdGlvbiB8fCAnJyxcbiAgLy8gICAgICAgICAgIER1cmF0aW9uOiBub2RlLnN0YWdlRGF0YT8uRHVyYXRpb24gfHwgMCxcbiAgLy8gICAgICAgICAgIFBhc3NPblJ1bGU6IG5vZGUuc3RhZ2VEYXRhPy5QYXNzT25SdWxlIHx8ICcnLFxuICAvLyAgICAgICAgICAgQWN0b3JSdWxlOiBub2RlLnN0YWdlRGF0YT8uQWN0b3JSdWxlIHx8IFN0YWdlQWN0b3JSdWxlLk5vbmUsXG4gIC8vICAgICAgICAgICBNaW5Ob09mQWN0b3I6IG5vZGUuc3RhZ2VEYXRhPy5NaW5Ob09mQWN0b3IgfHwgMCxcbiAgLy8gICAgICAgICAgIElzUGFyYWxsZWw6IGZhbHNlLCAvLyBEZWZhdWx0IHZhbHVlLCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgLy8gICAgICAgICAgIElzRW50cnlQb2ludDogbm9kZS5pc1N0YXJ0Tm9kZSxcbiAgLy8gICAgICAgICAgIElzRXhpdFBvaW50OiBmYWxzZSwgLy8gRGV0ZXJtaW5lIGJhc2VkIG9uIGNvbm5lY3Rpb25zXG4gIC8vICAgICAgICAgICBUYWdzOiBub2RlLnN0YWdlRGF0YT8uVGFncyB8fCBbXSxcbiAgLy8gICAgICAgICAgIEZvcm1zOiBub2RlLnN0YWdlRGF0YT8uRm9ybXMgfHwgW10sXG4gIC8vICAgICAgICAgICBBbGxvd011bHRpU3ViUHJvY2VzczogZmFsc2UsXG4gIC8vICAgICAgICAgICBBc3NpZ25tZW50VHlwZTpcbiAgLy8gICAgICAgICAgICAgbm9kZS5zdGFnZURhdGE/LkFzc2lnbm1lbnRUeXBlIHx8IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsXG4gIC8vICAgICAgICAgICBTdWJXb3JrRmxvdzogbm9kZS5zdGFnZURhdGE/LlN1YldvcmtGbG93IHx8ICcnLFxuICAvLyAgICAgICAgICAgU3dpbUxhbmU6IHdvcmtmbG93LkxhbmVzW3N3aW1sYW5lSW5kZXhdLklkLFxuICAvLyAgICAgICAgICAgQ29vcmRpbmF0ZXM6IHsgWDogbm9kZS54LCBZOiBub2RlLnkgfSxcbiAgLy8gICAgICAgICAgIElzU3ViUHJvY2VzczogZmFsc2UsXG4gIC8vICAgICAgICAgICAvLyBBZGQgb3RoZXIgcmVxdWlyZWQgcHJvcGVydGllcyBmcm9tIEJhc2VNb2RlbFxuICAvLyAgICAgICAgICAgQ29kZTogJycsXG4gIC8vICAgICAgICAgICBUZW5hbnRJZDogJycsXG4gIC8vICAgICAgICAgICBpZDogbm9kZS5pZCxcbiAgLy8gICAgICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgLy8gICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgLy8gICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgLy8gICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAvLyAgICAgICAgIH07XG5cbiAgLy8gICAgICAgICBzdGFnZXMucHVzaChzdGFnZSk7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0pO1xuICAvLyAgIH0pO1xuXG4gIC8vICAgLy8gTm93IHByb2Nlc3MgdGhlIGNvbm5lY3Rpb25zIHRvIHNldCBJc1BhcmFsbGVsIG9uIHRhcmdldCBzdGFnZXNcbiAgLy8gICB0aGlzLmNvbm5lY3Rpb25zLmZvckVhY2goKGNvbm4pID0+IHtcbiAgLy8gICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5maW5kTm9kZUJ5SWQoY29ubi5zb3VyY2VOb2RlSWQpO1xuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIHNvdXJjZU5vZGVJbmZvICYmXG4gIC8vICAgICAgIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyAmJlxuICAvLyAgICAgICBzb3VyY2VOb2RlSW5mby5ub2RlLnN0YWdlRGF0YT8uaGFzUGFyYWxsZWwgPT09IHRydWVcbiAgLy8gICAgICkge1xuICAvLyAgICAgICAvLyBGaW5kIHRoZSB0YXJnZXQgc3RhZ2UgaW4gb3VyIHN0YWdlcyBhcnJheVxuICAvLyAgICAgICBjb25zdCB0YXJnZXRTdGFnZSA9IHN0YWdlcy5maW5kKChzKSA9PiBzLklkID09PSBjb25uLnRhcmdldE5vZGVJZCk7XG4gIC8vICAgICAgIGlmICh0YXJnZXRTdGFnZSkge1xuICAvLyAgICAgICAgIC8vIFNldCBJc1BhcmFsbGVsIHRvIHRydWUgZm9yIHRoaXMgdGFyZ2V0IHN0YWdlXG4gIC8vICAgICAgICAgdGFyZ2V0U3RhZ2UuSXNQYXJhbGxlbCA9IHRydWU7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcblxuICAvLyAgIC8vIFRyYW5zZm9ybSBjb25uZWN0aW9ucyB0byBXb3JrZmxvd0FjdGlvbltdXG4gIC8vICAgd29ya2Zsb3cuQWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbnMubWFwKChjb25uKSA9PiB7XG4gIC8vICAgICBjb25zdCBzb3VyY2VOb2RlID0gdGhpcy5maW5kTm9kZUJ5SWQoY29ubi5zb3VyY2VOb2RlSWQpPy5ub2RlO1xuICAvLyAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMuZmluZE5vZGVCeUlkKGNvbm4udGFyZ2V0Tm9kZUlkKT8ubm9kZTtcblxuICAvLyAgICAgcmV0dXJuIHtcbiAgLy8gICAgICAgSWQ6IGNvbm4uaWQsXG4gIC8vICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgLy8gICAgICAgTmFtZTogYEFjdGlvbiBmcm9tICR7c291cmNlTm9kZT8uc3RhZ2VEYXRhPy5OYW1lIHx8ICdVbmtub3duJ30gdG8gJHtcbiAgLy8gICAgICAgICB0YXJnZXROb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nXG4gIC8vICAgICAgIH1gLFxuICAvLyAgICAgICBGcm9tU3RhZ2U6IGNvbm4uc291cmNlTm9kZUlkLFxuICAvLyAgICAgICBUb1N0YWdlOiBjb25uLnRhcmdldE5vZGVJZCxcbiAgLy8gICAgICAgSXNQYXJhbGxlbDogdGFyZ2V0Tm9kZT8uc3RhZ2VEYXRhPy5Jc1BhcmFsbGVsIHx8IGZhbHNlLFxuICAvLyAgICAgICAvLyBBZGQgb3RoZXIgcmVxdWlyZWQgcHJvcGVydGllcyBmcm9tIEJhc2VNb2RlbFxuICAvLyAgICAgICBDb2RlOiAnJyxcbiAgLy8gICAgICAgVGVuYW50SWQ6ICcnLFxuICAvLyAgICAgICBpZDogY29ubi5pZCxcbiAgLy8gICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAvLyAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gIC8vICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgLy8gICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gIC8vICAgICB9O1xuICAvLyAgIH0pO1xuXG4gIC8vICAgd29ya2Zsb3cuU3RhZ2VzID0gc3RhZ2VzO1xuXG4gIC8vICAgcmV0dXJuIHdvcmtmbG93O1xuICAvLyB9XG5cbiAgdXBkYXRlU3dpbWxhbmUoaW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nLCB0YWdzOiBUYWdbXSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1N0YXRlOiBVcGRhdGluZyBzd2ltbGFuZSBhdCBpbmRleCcsXG4gICAgICBpbmRleCxcbiAgICAgICd3aXRoIG5hbWUnLFxuICAgICAgbmFtZSxcbiAgICAgICdhbmQgdGFncycsXG4gICAgICB0YWdzXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN3aW1sYW5lc1tpbmRleF0gPSB7XG4gICAgICAgIC4uLnRoaXMuc3dpbWxhbmVzW2luZGV4XSxcbiAgICAgICAgbGFiZWw6IG5hbWUsXG4gICAgICAgIHRhZ3M6IHRhZ3MsXG4gICAgICB9O1xuICAgICAgY29uc29sZS5sb2coJ1N3aW1sYW5lIHVwZGF0ZWQ6JywgdGhpcy5zd2ltbGFuZXNbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBzd2ltbGFuZSBpbmRleDonLCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtVG9Xb3JrZmxvd01vZGVsKCk6IFdvcmtmbG93IHtcbiAgICAvLyBDcmVhdGUgYmFzZSB3b3JrZmxvdyBvYmplY3RcbiAgICBjb25zdCB3b3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gICAgICBJZDogJycsIC8vIFdpbGwgYmUgYXNzaWduZWQgYnkgYmFja2VuZCBvbiBmaXJzdCBzYXZlXG4gICAgICBDb2RlOiAnJyxcbiAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgIGlkOiAnJyxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgTmFtZTogJ05ldyBXb3JrZmxvdycsIC8vIERlZmF1bHQgbmFtZSBvciBnZXQgaXQgZnJvbSBzb21ld2hlcmVcbiAgICAgIERlc2NyaXB0aW9uOiAnJywgLy8gRGVmYXVsdCBkZXNjcmlwdGlvblxuICAgICAgU3RhZ2VFbnRyeVJ1bGU6ICcnLFxuICAgICAgRm9ybTogdGhpcy53b3JrZmxvd0Zvcm1JZCB8fCB1bmRlZmluZWQsXG4gICAgICBBc3NpZ25tZW50VHlwZTogVGFza0Fzc2lnbm1lbnRUeXBlLkF1dG9Sb3V0ZSwgLy8gRGVmYXVsdCBhc3NpZ25tZW50IHR5cGVcbiAgICAgIFN0YXR1czogU3RhdHVzLkFjdGl2ZSwgLy8gRGVmYXVsdCBzdGF0dXNcbiAgICAgIEFjdGlvbnM6IFtdLFxuICAgICAgTGFuZXM6IFtdLFxuICAgICAgU3RhZ2VzOiBbXSxcbiAgICB9O1xuXG4gICAgLy8gVHJhbnNmb3JtIHN3aW1sYW5lcyB0byBTd2ltTGFuZVtdXG4gICAgd29ya2Zsb3cuTGFuZXMgPSB0aGlzLnN3aW1sYW5lcy5tYXAoKHN3aW1sYW5lLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSWQ6IGBsYW5lLSR7aW5kZXh9YCxcbiAgICAgICAgQ29kZTogJycsXG4gICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgaWQ6IGBsYW5lLSR7aW5kZXh9YCxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgICAgICAgVGFnczogc3dpbWxhbmUudGFncyB8fCBbXSxcbiAgICAgICAgUG9zaXRpb246IHN3aW1sYW5lLm9yZGVyLFxuICAgICAgICBDb29yZGluYXRlczogeyBYOiAwLCBZOiBzd2ltbGFuZS5vcmRlciAqIDI2MyB9LCAvLyBDYWxjdWxhdGUgWSBwb3NpdGlvbiBiYXNlZCBvbiBvcmRlclxuICAgICAgICBTaXplOiB7IFdpZHRoOiAzMDAwLCBIZWlnaHQ6IDI2MyB9LCAvLyBEZWZhdWx0IHNpemVcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gbm9kZXMgdG8gV29ya2Zsb3dTdGFnZVtdXG4gICAgY29uc3Qgc3RhZ2VzOiBXb3JrZmxvd1N0YWdlW10gPSBbXTtcblxuICAgIHRoaXMuc3dpbWxhbmVzLmZvckVhY2goKHN3aW1sYW5lLCBzd2ltbGFuZUluZGV4KSA9PiB7XG4gICAgICBzd2ltbGFuZS5ub2Rlcz8uZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgc3RhZ2UgZnJvbSB0aGUgbm9kZVxuICAgICAgICAgIGNvbnN0IHN0YWdlOiBXb3JrZmxvd1N0YWdlID0ge1xuICAgICAgICAgICAgSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICBDb2RlOiAnJyxcbiAgICAgICAgICAgIFRlbmFudElkOiAnJyxcbiAgICAgICAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgICBXb3JrZmxvdzogd29ya2Zsb3cuSWQsXG4gICAgICAgICAgICBOYW1lOiBub2RlLnN0YWdlRGF0YT8uTmFtZSB8fCAnVW5uYW1lZCBTdGFnZScsXG4gICAgICAgICAgICBEZXNjcmlwdGlvbjogbm9kZS5zdGFnZURhdGE/LkRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgRHVyYXRpb246IG5vZGUuc3RhZ2VEYXRhPy5EdXJhdGlvbiB8fCAwLFxuICAgICAgICAgICAgUGFzc09uUnVsZTogbm9kZS5zdGFnZURhdGE/LlBhc3NPblJ1bGUgfHwgJycsXG4gICAgICAgICAgICBBY3RvclJ1bGU6IG5vZGUuc3RhZ2VEYXRhPy5BY3RvclJ1bGUgfHwgU3RhZ2VBY3RvclJ1bGUuTm9uZSxcbiAgICAgICAgICAgIE1pbk5vT2ZBY3Rvcjogbm9kZS5zdGFnZURhdGE/Lk1pbk5vT2ZBY3RvciB8fCAwLFxuICAgICAgICAgICAgSXNQYXJhbGxlbDogbm9kZS5zdGFnZURhdGE/LklzUGFyYWxsZWwgfHwgZmFsc2UsXG4gICAgICAgICAgICBJc0VudHJ5UG9pbnQ6IG5vZGUuaXNTdGFydE5vZGUsXG4gICAgICAgICAgICBJc0V4aXRQb2ludDogZmFsc2UsIC8vIERldGVybWluZSBiYXNlZCBvbiBvdXRnb2luZyBjb25uZWN0aW9uc1xuICAgICAgICAgICAgVGFnczogbm9kZS5zdGFnZURhdGE/LlRhZ3MgfHwgW10sXG4gICAgICAgICAgICBGb3Jtczogbm9kZS5zdGFnZURhdGE/LmZvcm1JZCA/IFtub2RlLnN0YWdlRGF0YS5mb3JtSWRdIDogW10sXG4gICAgICAgICAgICBBbGxvd011bHRpU3ViUHJvY2VzczogZmFsc2UsXG4gICAgICAgICAgICBBc3NpZ25tZW50VHlwZTogVGFza0Fzc2lnbm1lbnRUeXBlLkF1dG9Sb3V0ZSxcbiAgICAgICAgICAgIFN1YldvcmtGbG93OiAnJyxcbiAgICAgICAgICAgIFN3aW1MYW5lOiB3b3JrZmxvdy5MYW5lc1tzd2ltbGFuZUluZGV4XS5JZCxcbiAgICAgICAgICAgIENvb3JkaW5hdGVzOiB7IFg6IG5vZGUueCwgWTogbm9kZS55IH0sXG4gICAgICAgICAgICBJc1N1YlByb2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzdGFnZXMucHVzaChzdGFnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgd2hpY2ggc3RhZ2VzIGhhdmUgbm8gb3V0Z29pbmcgY29ubmVjdGlvbnMgLSB0aGV5IGFyZSBleGl0IHBvaW50c1xuICAgIHRoaXMuY29ubmVjdGlvbnMuZm9yRWFjaCgoY29ubikgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0U3RhZ2UgPSBzdGFnZXMuZmluZCgocykgPT4gcy5JZCA9PT0gY29ubi50YXJnZXROb2RlSWQpO1xuICAgICAgaWYgKHRhcmdldFN0YWdlKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGhhcyBhbnkgb3V0Z29pbmcgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgaGFzT3V0Z29pbmdDb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbnMuc29tZShcbiAgICAgICAgICAoYykgPT4gYy5zb3VyY2VOb2RlSWQgPT09IHRhcmdldFN0YWdlLklkXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFoYXNPdXRnb2luZ0Nvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgdGFyZ2V0U3RhZ2UuSXNFeGl0UG9pbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gY29ubmVjdGlvbnMgdG8gV29ya2Zsb3dBY3Rpb25bXVxuICAgIHdvcmtmbG93LkFjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25zLm1hcCgoY29ubikgPT4ge1xuICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHRoaXMuZmluZE5vZGVCeUlkKGNvbm4uc291cmNlTm9kZUlkKT8ubm9kZTtcbiAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChjb25uLnRhcmdldE5vZGVJZCk/Lm5vZGU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIElkOiBjb25uLmlkLFxuICAgICAgICBDb2RlOiAnJyxcbiAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICBpZDogY29ubi5pZCxcbiAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgICAgICAgTmFtZTogYEFjdGlvbiBmcm9tICR7c291cmNlTm9kZT8uc3RhZ2VEYXRhPy5OYW1lIHx8ICdVbmtub3duJ30gdG8gJHtcbiAgICAgICAgICB0YXJnZXROb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nXG4gICAgICAgIH1gLFxuICAgICAgICBGcm9tU3RhZ2U6IGNvbm4uc291cmNlTm9kZUlkLFxuICAgICAgICBUb1N0YWdlOiBjb25uLnRhcmdldE5vZGVJZCxcbiAgICAgICAgSXNQYXJhbGxlbDogc291cmNlTm9kZT8uc3RhZ2VEYXRhPy5oYXNQYXJhbGxlbCB8fCBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB3b3JrZmxvdy5TdGFnZXMgPSBzdGFnZXM7XG5cbiAgICByZXR1cm4gd29ya2Zsb3c7XG4gIH1cbn1cbiJdfQ==
623
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctZGVzaWduZXIuc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL3dvcmtmbG93LWRlc2lnbmVyLnN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFVM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBTzdDLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsU0FBUyxHQUFtQixFQUFFLENBQUM7SUFDL0IsV0FBVyxHQUFrQixJQUFJLENBQUMsQ0FBQyx1Q0FBdUM7SUFDMUUsV0FBVyxHQUFpQixFQUFFLENBQUM7SUFDL0Isc0JBQXNCLEdBT2xCLEVBQUUsQ0FBQztJQUNQLGNBQWMsR0FBa0IsSUFBSSxDQUFDO0lBQ3JDLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFDdkMsVUFBVSxHQUFrQixJQUFJLENBQUM7SUFFakMsUUFBUSxHQUFvQixJQUFJLENBQUM7SUFDakMsY0FBYyxHQUE2QixFQUFFLENBQUM7SUFDOUMsV0FBVyxHQUFrQyxFQUFFLENBQUM7SUFDaEQsWUFBWSxHQUFtQyxFQUFFLENBQUM7SUFFbEQsYUFBYSxDQUFDLEVBQVU7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLGdCQUFnQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXhDLGVBQWUsR0FBNkI7UUFDM0QsS0FBSyxFQUFF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XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUsXG4gIFN3aW1sYW5lSXRlbSxcbiAgVG9vbFR5cGUsXG59IGZyb20gJy4vd29ya2Zsb3ctZGVzaWduZXIudHlwZXMnO1xuaW1wb3J0IHsgVGFnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1RhZyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N0YWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1dvcmtmbG93U3RhZ2UnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcbmltcG9ydCB7IFN0YWdlQWN0b3JSdWxlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1N0YWdlQWN0b3JSdWxlJztcbmltcG9ydCB7IFRhc2tBc3NpZ25tZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9UYXNrQXNzaWdubWVudFR5cGUnO1xuaW1wb3J0IHsgV29ya2Zsb3cgfSBmcm9tICcuLi8uLi9tb2RlbHMvV29ya2Zsb3cnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0YXR1cyc7XG5pbXBvcnQgeyBTd2ltTGFuZSB9IGZyb20gJy4uLy4uL21vZGVscy9Td2ltTGFuZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0FjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9Xb3JrZmxvd0FjdGlvbic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUge1xuICBzd2ltbGFuZXM6IFN3aW1sYW5lSXRlbVtdID0gW107XG4gIHN0YXJ0Tm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIElEIG9mIHRoZSBmaXJzdC9zdGFydCBub2RlXG4gIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9uW10gPSBbXTtcbiAgZHJhZ2dpbmdDb25uZWN0aW9uRGF0YToge1xuICAgIHNvdXJjZVBvaW50PzogQ29ubmVjdGlvblBvaW50O1xuICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg/OiBudW1iZXI7XG4gICAgc3RhcnRYPzogbnVtYmVyO1xuICAgIHN0YXJ0WT86IG51bWJlcjtcbiAgICBjdXJyZW50WD86IG51bWJlcjtcbiAgICBjdXJyZW50WT86IG51bWJlcjtcbiAgfSA9IHt9O1xuICB3b3JrZmxvd0Zvcm1JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHdvcmtmbG93Rm9ybU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB3b3JrZmxvd0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICB3b3JrZmxvdzogV29ya2Zsb3cgfCBudWxsID0gbnVsbDtcbiAgc3dpbWxhbmVSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFN3aW1MYW5lPiA9IHt9O1xuICBzdGFnZVJlY29yZDogUmVjb3JkPHN0cmluZywgV29ya2Zsb3dTdGFnZT4gPSB7fTtcbiAgYWN0aW9uUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBXb3JrZmxvd0FjdGlvbj4gPSB7fTtcblxuICBzZXRXb3JrZmxvd0lkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtmbG93SWQgPSBpZDtcbiAgfVxuXG4gIHB1YmxpYyBsYW5lSWRUb0luZGV4TWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgc3RhZ2U6IFsnc3RhZ2UnLCAnZGVjaXNpb24nLCAnc3ViZmxvdycsICdmb3JtJ10sXG4gICAgZGVjaXNpb246IFsnc3RhZ2UnXSwgLy8gRGVjaXNpb25zIGNhbiBvbmx5IGNvbm5lY3QgdG8gU3RhZ2VzXG4gICAgLy8gJ2FjdGlvbic6IFsnc3RhZ2UnLCAnZm9ybScsICdkZWNpc2lvbiddLFxuICAgIGZvcm06IFtdLFxuICAgIHN1YmZsb3c6IFsnc3RhZ2UnLCAnZGVjaXNpb24nXSxcbiAgfTtcblxuICBzZXRXb3JrZmxvd0Zvcm0oZm9ybUlkOiBzdHJpbmcgfCBudWxsLCBmb3JtTmFtZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMud29ya2Zsb3dGb3JtSWQgPSBmb3JtSWQ7XG4gICAgdGhpcy53b3JrZmxvd0Zvcm1OYW1lID0gZm9ybU5hbWU7XG4gIH1cblxuICBhZGRTd2ltbGFuZShuYW1lOiBzdHJpbmcsIHRhZ3M6IFRhZ1tdKSB7XG4gICAgdGhpcy5zd2ltbGFuZXMgPSB0aGlzLnN3aW1sYW5lcy5jb25jYXQoW1xuICAgICAge1xuICAgICAgICBvcmRlcjogdGhpcy5zd2ltbGFuZXMubGVuZ3RoLFxuICAgICAgICBsYWJlbDogbmFtZSxcbiAgICAgICAgdGFncyxcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHJlZ2lzdGVyTGFuZU1hcHBpbmcobGFuZUlkOiBzdHJpbmcsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubGFuZUlkVG9JbmRleE1hcC5zZXQobGFuZUlkLCBzd2ltbGFuZUluZGV4KTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBjb25uZWN0aW9uIHBvaW50cyBmb3IgYSBub2RlXG4gIGdlbmVyYXRlQ29ubmVjdGlvblBvaW50cyhub2RlOiBOb2RlKTogQ29ubmVjdGlvblBvaW50W10ge1xuICAgIGNvbnN0IHBvaW50czogQ29ubmVjdGlvblBvaW50W10gPSBbXTtcbiAgICBjb25zdCBzcGFjaW5nID0gNTA7IC8vIFNwYWNlIGJldHdlZW4gY29ubmVjdGlvbiBwb2ludHNcblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIFJlY3Rhbmd1bGFyIHNoYXBlcyAtIGFkZCBwb2ludHMgYXJvdW5kIHRoZSByZWN0YW5nbGVcblxuICAgICAgLy8gVG9wIGVkZ2UgcG9pbnRzXG4gICAgICBmb3IgKGxldCB4ID0gc3BhY2luZzsgeCA8IG5vZGUud2lkdGg7IHggKz0gc3BhY2luZykge1xuICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGAke25vZGUuaWR9LXRvcC0ke3h9YCxcbiAgICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHR5cGU6ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gUmlnaHQgZWRnZSBwb2ludHNcbiAgICAgIGZvciAobGV0IHkgPSBzcGFjaW5nOyB5IDwgbm9kZS5oZWlnaHQ7IHkgKz0gc3BhY2luZykge1xuICAgICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LSR7eX1gLFxuICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICB4OiBub2RlLndpZHRoLFxuICAgICAgICAgIHk6IHksXG4gICAgICAgICAgdHlwZTogJ3JpZ2h0JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJvdHRvbSBlZGdlIHBvaW50c1xuICAgICAgZm9yIChsZXQgeCA9IHNwYWNpbmc7IHggPCBub2RlLndpZHRoOyB4ICs9IHNwYWNpbmcpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBgJHtub2RlLmlkfS1ib3R0b20tJHt4fWAsXG4gICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgeTogbm9kZS5oZWlnaHQsXG4gICAgICAgICAgdHlwZTogJ2JvdHRvbScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWZ0IGVkZ2UgcG9pbnRzXG4gICAgICBmb3IgKGxldCB5ID0gc3BhY2luZzsgeSA8IG5vZGUuaGVpZ2h0OyB5ICs9IHNwYWNpbmcpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICAgIGlkOiBgJHtub2RlLmlkfS1sZWZ0LSR7eX1gLFxuICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IHksXG4gICAgICAgICAgdHlwZTogJ2xlZnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgLy8gRGlhbW9uZCBzaGFwZSAtIGFkZCBwb2ludHMgYXQgdGhlIGZvdXIgY29ybmVyc1xuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tdG9wLTBgLFxuICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgIHg6IG5vZGUud2lkdGggLyAyLFxuICAgICAgICB5OiAwLFxuICAgICAgICB0eXBlOiAndG9wJyxcbiAgICAgIH0pO1xuXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS1yaWdodC0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiBub2RlLndpZHRoLFxuICAgICAgICB5OiBub2RlLmhlaWdodCAvIDIsXG4gICAgICAgIHR5cGU6ICdyaWdodCcsXG4gICAgICB9KTtcblxuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tYm90dG9tLTBgLFxuICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgIHg6IG5vZGUud2lkdGggLyAyLFxuICAgICAgICB5OiBub2RlLmhlaWdodCxcbiAgICAgICAgdHlwZTogJ2JvdHRvbScsXG4gICAgICB9KTtcblxuICAgICAgcG9pbnRzLnB1c2goe1xuICAgICAgICBpZDogYCR7bm9kZS5pZH0tbGVmdC0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiBub2RlLmhlaWdodCAvIDIsXG4gICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnZm9ybScpIHtcbiAgICAgIC8vIEZvcm0gb25seSBoYXMgaW5wdXQgY29ubmVjdGlvbiBwb2ludHMsIG5vIG91dHB1dCBwb2ludHNcblxuICAgICAgLy8gTGVmdCBlZGdlIHBvaW50cyAoZm9yIGlucHV0IGNvbm5lY3Rpb25zKVxuICAgICAgZm9yIChsZXQgeSA9IHNwYWNpbmc7IHkgPCBub2RlLmhlaWdodDsgeSArPSBzcGFjaW5nKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgICBpZDogYCR7bm9kZS5pZH0tbGVmdC0ke3l9YCxcbiAgICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdzdWJmbG93Jykge1xuICAgICAgLy8gSGV4YWdvbiBzaGFwZSAtIGFkZCBwb2ludHMgYXQgdGhlIHNpeCBjb3JuZXJzXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS10b3AtMGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCAvIDIsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHR5cGU6ICd0b3AnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LXRvcGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCxcbiAgICAgICAgeTogbm9kZS5oZWlnaHQgLyA0LFxuICAgICAgICB0eXBlOiAncmlnaHQnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LXJpZ2h0LWJvdHRvbWAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogbm9kZS53aWR0aCxcbiAgICAgICAgeTogKG5vZGUuaGVpZ2h0ICogMykgLyA0LFxuICAgICAgICB0eXBlOiAncmlnaHQnLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LWJvdHRvbS0wYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiBub2RlLndpZHRoIC8gMixcbiAgICAgICAgeTogbm9kZS5oZWlnaHQsXG4gICAgICAgIHR5cGU6ICdib3R0b20nLFxuICAgICAgfSk7XG5cbiAgICAgIHBvaW50cy5wdXNoKHtcbiAgICAgICAgaWQ6IGAke25vZGUuaWR9LWxlZnQtYm90dG9tYCxcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAobm9kZS5oZWlnaHQgKiAzKSAvIDQsXG4gICAgICAgIHR5cGU6ICdsZWZ0JyxcbiAgICAgIH0pO1xuXG4gICAgICBwb2ludHMucHVzaCh7XG4gICAgICAgIGlkOiBgJHtub2RlLmlkfS1sZWZ0LXRvcGAsXG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogbm9kZS5oZWlnaHQgLyA0LFxuICAgICAgICB0eXBlOiAnbGVmdCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgYWRkTm9kZShcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXIsXG4gICAgdHlwZTogVG9vbFR5cGUsXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBzdGFnZURhdGE/OiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+LFxuICAgIHdvcmtmbG93RGF0YT86IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0sXG4gICAgdXNlRXhpc3RpbmdJZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XSB8fFxuICAgICAgIXR5cGUgfHxcbiAgICAgICh0eXBlICE9PSAnc3RhZ2UnICYmXG4gICAgICAgIHR5cGUgIT09ICdkZWNpc2lvbicgJiZcbiAgICAgICAgdHlwZSAhPT0gJ2Zvcm0nICYmXG4gICAgICAgIHR5cGUgIT09ICdzdWJmbG93JylcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEFkanVzdCBwb3NpdGlvbiByZWxhdGl2ZSB0byBzd2ltbGFuZVxuICAgIGNvbnN0IGFkanVzdGVkWSA9IHkgLSBzd2ltbGFuZUluZGV4ICogMjYzIC0gNDA7IC8vIFN1YnRyYWN0aW5nIGhlYWRlciBoZWlnaHRcblxuICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIElEIG9yIHVzZSBleGlzdGluZ1xuICAgIGNvbnN0IGlkID1cbiAgICAgIHVzZUV4aXN0aW5nSWQgJiYgc3RhZ2VEYXRhPy5JZFxuICAgICAgICA/IHN0YWdlRGF0YS5JZFxuICAgICAgICA6IGAke3R5cGV9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gO1xuXG4gICAgLy8gQ3JlYXRlIG5vZGUgd2l0aCBkaW1lbnNpb25zIGJhc2VkIG9uIHR5cGVcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xuICAgICAgaWQsXG4gICAgICB0eXBlLFxuICAgICAgeCxcbiAgICAgIHk6IGFkanVzdGVkWSxcbiAgICAgIHdpZHRoOiB0eXBlID09PSAnc3ViZmxvdycgPyAxNTAgOiAxNjksIC8vIFdpZHRoIGZyb20gU1ZHXG4gICAgICBoZWlnaHQ6IDEwMCwgLy8gSGVpZ2h0IGZyb20gU1ZHXG4gICAgICBpc1N0YXJ0Tm9kZTogZmFsc2UsIC8vIERlZmF1bHQgdG8gZmFsc2VcbiAgICAgIHN0YWdlRGF0YTogc3RhZ2VEYXRhIHx8IHt9LCAvLyBTdG9yZSBzdGFnZSBkYXRhXG4gICAgICB3b3JrZmxvd0RhdGE6IHdvcmtmbG93RGF0YSB8fCBudWxsLFxuICAgIH07XG5cbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBub2RlIGluIHRoZSBlbnRpcmUgd29ya2Zsb3csIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG5vZGVcbiAgICBpZiAodGhpcy5nZXROb2RlQ291bnQoKSA9PT0gMCkge1xuICAgICAgbm9kZS5pc1N0YXJ0Tm9kZSA9IHRydWU7XG4gICAgICB0aGlzLnN0YXJ0Tm9kZUlkID0gaWQ7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgY29ubmVjdGlvbiBwb2ludHMgZm9yIHRoZSBub2RlXG4gICAgbm9kZS5jb25uZWN0aW9uUG9pbnRzID0gdGhpcy5nZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludHMobm9kZSk7XG5cbiAgICAvLyBBZGQgbm9kZSB0byB0aGUgc3dpbWxhbmVcbiAgICBpZiAoIXRoaXMuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdLm5vZGVzKSB7XG4gICAgICB0aGlzLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XS5ub2RlcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnN3aW1sYW5lc1tzd2ltbGFuZUluZGV4XS5ub2Rlcy5wdXNoKG5vZGUpO1xuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvLyBIZWxwZXIgdG8gZ2V0IHRvdGFsIG5vZGUgY291bnQgYWNyb3NzIGFsbCBzd2ltbGFuZXNcbiAgZ2V0Tm9kZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3dpbWxhbmVzLnJlZHVjZShcbiAgICAgIChjb3VudCwgc3dpbWxhbmUpID0+IGNvdW50ICsgKHN3aW1sYW5lLm5vZGVzPy5sZW5ndGggfHwgMCksXG4gICAgICAwXG4gICAgKTtcbiAgfVxuXG4gIC8vIEZpbmQgYSBub2RlIGJ5IElEICh1c2VmdWwgZm9yIGxhdGVyIG9wZXJhdGlvbnMpXG4gIGZpbmROb2RlQnlJZChpZDogc3RyaW5nKTogeyBub2RlOiBOb2RlOyBzd2ltbGFuZUluZGV4OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zd2ltbGFuZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN3aW1sYW5lID0gdGhpcy5zd2ltbGFuZXNbaV07XG4gICAgICBjb25zdCBub2RlID0gc3dpbWxhbmUubm9kZXM/LmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGUsIHN3aW1sYW5lSW5kZXg6IGkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGFydENvbm5lY3Rpb25EcmFnKFxuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyLFxuICAgIGdsb2JhbFg6IG51bWJlcixcbiAgICBnbG9iYWxZOiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhID0ge1xuICAgICAgc291cmNlUG9pbnQ6IHBvaW50LFxuICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgIHN0YXJ0WDogZ2xvYmFsWCxcbiAgICAgIHN0YXJ0WTogZ2xvYmFsWSxcbiAgICAgIGN1cnJlbnRYOiBnbG9iYWxYLFxuICAgICAgY3VycmVudFk6IGdsb2JhbFksXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUNvbm5lY3Rpb25EcmFnKGN1cnJlbnRYOiBudW1iZXIsIGN1cnJlbnRZOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50KSB7XG4gICAgICB0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuY3VycmVudFggPSBjdXJyZW50WDtcbiAgICAgIHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5jdXJyZW50WSA9IGN1cnJlbnRZO1xuICAgIH1cbiAgfVxuXG4gIGVuZENvbm5lY3Rpb25EcmFnKCkge1xuICAgIGNvbnNvbGUubG9nKCdFbmRpbmcgY29ubmVjdGlvbiBkcmFnLCBjbGVhcmluZyBkYXRhJyk7XG4gICAgLy8gQ2xlYXIgZHJhZ2dpbmcgZGF0YVxuICAgIHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YSA9IHt9O1xuICB9XG5cbiAgaXNDb25uZWN0aW9uRHJhZ2dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50O1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvblBhdGhEYXRhKCk6IHtcbiAgICBzdGFydFg6IG51bWJlcjtcbiAgICBzdGFydFk6IG51bWJlcjtcbiAgICBlbmRYOiBudW1iZXI7XG4gICAgZW5kWTogbnVtYmVyO1xuICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHsgc291cmNlUG9pbnQsIHNvdXJjZVN3aW1sYW5lSW5kZXgsIGN1cnJlbnRYLCBjdXJyZW50WSB9ID1cbiAgICAgIHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5maW5kTm9kZUJ5SWQoc291cmNlUG9pbnQubm9kZUlkKT8ubm9kZTtcblxuICAgIGlmICghbm9kZSB8fCBzb3VyY2VTd2ltbGFuZUluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHN0YXJ0IHBvaW50IGluIGdsb2JhbCBjb29yZGluYXRlc1xuICAgIGNvbnN0IHN0YXJ0WCA9IG5vZGUueCArIHNvdXJjZVBvaW50Lng7XG4gICAgY29uc3Qgc3RhcnRZID0gbm9kZS55ICsgc291cmNlUG9pbnQueSArIChzb3VyY2VTd2ltbGFuZUluZGV4ICogMjYzICsgNDApOyAvLyBBZGQgc3dpbWxhbmUgb2Zmc2V0XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnRYLFxuICAgICAgc3RhcnRZLFxuICAgICAgZW5kWDogY3VycmVudFggPz8gc3RhcnRYLFxuICAgICAgZW5kWTogY3VycmVudFkgPz8gc3RhcnRZLFxuICAgICAgc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbihcbiAgICB0YXJnZXROb2RlSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRQb2ludElkOiBzdHJpbmcsXG4gICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IENvbm5lY3Rpb24gfCBudWxsIHtcbiAgICBjb25zdCB7IHNvdXJjZVBvaW50LCBzb3VyY2VTd2ltbGFuZUluZGV4IH0gPSB0aGlzLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGE7XG5cbiAgICBpZiAoIXNvdXJjZVBvaW50IHx8IHNvdXJjZVN3aW1sYW5lSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBzb3VyY2UgZGF0YSBmb3IgY29ubmVjdGlvbicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdGlvbjogQ29ubmVjdGlvbiA9IHtcbiAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgIHNvdXJjZU5vZGVJZDogc291cmNlUG9pbnQubm9kZUlkLFxuICAgICAgdGFyZ2V0Tm9kZUlkOiB0YXJnZXROb2RlSWQsXG4gICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50SWQsXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogdGFyZ2V0U3dpbWxhbmVJbmRleCxcbiAgICB9O1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnQ29ubmVjdGlvbnMgYXJyYXkgbm93IGhhcycsXG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLmxlbmd0aCxcbiAgICAgICdjb25uZWN0aW9ucydcbiAgICApO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xuICB9XG5cbiAgLy8gQWRkIGEgbWV0aG9kIHRvIGdldCBjb25uZWN0aW9uIGRhdGEgZm9yIHJlbmRlcmluZ1xuICBnZXRDb25uZWN0aW9uRGF0YShjb25uZWN0aW9uOiBDb25uZWN0aW9uKToge1xuICAgIHN0YXJ0WDogbnVtYmVyO1xuICAgIHN0YXJ0WTogbnVtYmVyO1xuICAgIGVuZFg6IG51bWJlcjtcbiAgICBlbmRZOiBudW1iZXI7XG4gICAgc291cmNlU3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgfSB8IG51bGwge1xuICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgIGNvbnN0IHRhcmdldE5vZGVJbmZvID0gdGhpcy5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi50YXJnZXROb2RlSWQpO1xuXG4gICAgaWYgKCFzb3VyY2VOb2RlSW5mbyB8fCAhdGFyZ2V0Tm9kZUluZm8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlSW5mby5ub2RlO1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXROb2RlSW5mby5ub2RlO1xuXG4gICAgLy8gRmluZCBjb25uZWN0aW9uIHBvaW50c1xuICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgKHApID0+IHAuaWQgPT09IGNvbm5lY3Rpb24uc291cmNlUG9pbnRJZFxuICAgICk7XG4gICAgY29uc3QgdGFyZ2V0UG9pbnQgPSB0YXJnZXROb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAocCkgPT4gcC5pZCA9PT0gY29ubmVjdGlvbi50YXJnZXRQb2ludElkXG4gICAgKTtcblxuICAgIGlmICghc291cmNlUG9pbnQgfHwgIXRhcmdldFBvaW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgZ2xvYmFsIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgc3RhcnRYID0gc291cmNlTm9kZS54ICsgc291cmNlUG9pbnQueDtcbiAgICBjb25zdCBzdGFydFkgPVxuICAgICAgc291cmNlTm9kZS55ICtcbiAgICAgIHNvdXJjZVBvaW50LnkgK1xuICAgICAgKGNvbm5lY3Rpb24uc291cmNlU3dpbWxhbmVJbmRleCAqIDI2MyArIDQwKTtcblxuICAgIGNvbnN0IGVuZFggPSB0YXJnZXROb2RlLnggKyB0YXJnZXRQb2ludC54O1xuICAgIGNvbnN0IGVuZFkgPVxuICAgICAgdGFyZ2V0Tm9kZS55ICtcbiAgICAgIHRhcmdldFBvaW50LnkgK1xuICAgICAgKGNvbm5lY3Rpb24udGFyZ2V0U3dpbWxhbmVJbmRleCAqIDI2MyArIDQwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFgsXG4gICAgICBzdGFydFksXG4gICAgICBlbmRYLFxuICAgICAgZW5kWSxcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IGNvbm5lY3Rpb24uc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IGNvbm5lY3Rpb24udGFyZ2V0U3dpbWxhbmVJbmRleCxcbiAgICB9O1xuICB9XG5cbiAgLy8gQWRkIGEgbWV0aG9kIHRvIGNoZWNrIGlmIGEgY29ubmVjdGlvbiBpcyBhbGxvd2VkIGJhc2VkIG9uIG5vZGUgdHlwZXNcbiAgY2FuQ29ubmVjdChzb3VyY2VOb2RlVHlwZTogc3RyaW5nLCB0YXJnZXROb2RlVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29ubmVjdGlvblJ1bGVzW3NvdXJjZU5vZGVUeXBlXT8uaW5jbHVkZXModGFyZ2V0Tm9kZVR5cGUpIHx8IGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFkZCBhIG1ldGhvZCB0byBnZXQgYWxsb3dlZCBub2RlIHR5cGVzIGZvciB0aGUgY3VycmVudCBkcmFnZ2luZyBjb25uZWN0aW9uXG4gIGdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLmZpbmROb2RlQnlJZChcbiAgICAgIHRoaXMuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludC5ub2RlSWRcbiAgICApO1xuICAgIGlmICghc291cmNlTm9kZUluZm8pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VOb2RlVHlwZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZTtcblxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25SdWxlc1tzb3VyY2VOb2RlVHlwZV0gfHwgW107XG4gIH1cblxuICB1cGRhdGVTd2ltbGFuZShpbmRleDogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIHRhZ3M6IFRhZ1tdKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnU3RhdGU6IFVwZGF0aW5nIHN3aW1sYW5lIGF0IGluZGV4JyxcbiAgICAgIGluZGV4LFxuICAgICAgJ3dpdGggbmFtZScsXG4gICAgICBuYW1lLFxuICAgICAgJ2FuZCB0YWdzJyxcbiAgICAgIHRhZ3NcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3dpbWxhbmVzW2luZGV4XSA9IHtcbiAgICAgICAgLi4udGhpcy5zd2ltbGFuZXNbaW5kZXhdLFxuICAgICAgICBsYWJlbDogbmFtZSxcbiAgICAgICAgdGFnczogdGFncyxcbiAgICAgIH07XG4gICAgICBjb25zb2xlLmxvZygnU3dpbWxhbmUgdXBkYXRlZDonLCB0aGlzLnN3aW1sYW5lc1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIHN3aW1sYW5lIGluZGV4OicsIGluZGV4KTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2Zvcm1Ub1dvcmtmbG93TW9kZWwoKTogV29ya2Zsb3cge1xuICAgIC8vIFVzZSBzdG9yZWQgd29ya2Zsb3cgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGNvbnN0IHdvcmtmbG93OiBXb3JrZmxvdyA9IHRoaXMud29ya2Zsb3dcbiAgICAgID8geyAuLi50aGlzLndvcmtmbG93IH1cbiAgICAgIDoge1xuICAgICAgICAgIC8vIEJhc2VNb2RlbCBwcm9wZXJ0aWVzXG4gICAgICAgICAgSWQ6IHRoaXMud2FzTG9hZGVkRnJvbUFwaSh0aGlzLndvcmtmbG93SWQgfHwgJycpXG4gICAgICAgICAgICA/IHRoaXMud29ya2Zsb3dJZCB8fCAnJ1xuICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICBDb2RlOiB0aGlzLmdldENvZGVGb3JPYmplY3QodGhpcy53b3JrZmxvd0lkIHx8ICcnKSxcbiAgICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgICAgaWQ6IHRoaXMud2FzTG9hZGVkRnJvbUFwaSh0aGlzLndvcmtmbG93SWQgfHwgJycpXG4gICAgICAgICAgICA/IHRoaXMud29ya2Zsb3dJZCB8fCAnJ1xuICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBEYXRhU3RhdGU6IHRoaXMud2FzTG9hZGVkRnJvbUFwaSh0aGlzLndvcmtmbG93SWQgfHwgJycpXG4gICAgICAgICAgICA/IE9iamVjdFN0YXRlLkNoYW5nZWRcbiAgICAgICAgICAgIDogT2JqZWN0U3RhdGUuTmV3LFxuXG4gICAgICAgICAgLy8gV29ya2Zsb3cgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgICAgIE5hbWU6ICdOZXcgV29ya2Zsb3cnLFxuICAgICAgICAgIERlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBTdGFnZUVudHJ5UnVsZTogJycsXG4gICAgICAgICAgRm9ybTogdGhpcy53b3JrZmxvd0Zvcm1JZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgQXNzaWdubWVudFR5cGU6IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsXG4gICAgICAgICAgT3BlcmF0aW9uOiAnJyxcbiAgICAgICAgICBTdGF0dXM6IFN0YXR1cy5BY3RpdmUsXG4gICAgICAgICAgQWN0aW9uczogW10sXG4gICAgICAgICAgTGFuZXM6IFtdLFxuICAgICAgICAgIFN0YWdlczogW10sXG4gICAgICAgIH07XG5cbiAgICAvLyBVcGRhdGUgd29ya2Zsb3cgZm9ybSBpZiBjaGFuZ2VkXG4gICAgaWYgKHRoaXMud29ya2Zsb3dGb3JtSWQgIT09IHRoaXMud29ya2Zsb3c/LkZvcm0pIHtcbiAgICAgIHdvcmtmbG93LkZvcm0gPSB0aGlzLndvcmtmbG93Rm9ybUlkIHx8IHdvcmtmbG93LkZvcm07XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHN3aW1sYW5lcyB0byBTd2ltTGFuZVtdXG4gICAgd29ya2Zsb3cuTGFuZXMgPSB0aGlzLnN3aW1sYW5lcy5tYXAoKHN3aW1sYW5lKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHN3aW1sYW5lXG4gICAgICBpZiAoc3dpbWxhbmUuaWQgJiYgdGhpcy5zd2ltbGFuZVJlY29yZFtzd2ltbGFuZS5pZF0pIHtcbiAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGxhbmUgd2l0aCBjaGFuZ2VkIHZhbHVlc1xuICAgICAgICBjb25zdCBleGlzdGluZ0xhbmUgPSB0aGlzLnN3aW1sYW5lUmVjb3JkW3N3aW1sYW5lLmlkXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5leGlzdGluZ0xhbmUsXG4gICAgICAgICAgVGFnczogc3dpbWxhbmUudGFncyxcbiAgICAgICAgICBQb3NpdGlvbjogc3dpbWxhbmUub3JkZXIsXG4gICAgICAgICAgQ29vcmRpbmF0ZXM6IHsgWDogMCwgWTogc3dpbWxhbmUub3JkZXIgKiAyNjMgfSxcbiAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQsXG4gICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgSUQgZm9yIG5ldyBzd2ltbGFuZXMgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGNvbnN0IGxhbmVJZCA9XG4gICAgICAgICAgc3dpbWxhbmUuaWQgfHxcbiAgICAgICAgICBgbGFuZS0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YDtcblxuICAgICAgICAvLyBDcmVhdGUgbmV3IGxhbmVcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBJZDogJycsXG4gICAgICAgICAgQ29kZTogJycsXG4gICAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICAgIGlkOiBsYW5lSWQsXG4gICAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgV29ya2Zsb3c6IHdvcmtmbG93LklkLFxuICAgICAgICAgIFRhZ3M6IHN3aW1sYW5lLnRhZ3MgfHwgW10sXG4gICAgICAgICAgUG9zaXRpb246IHN3aW1sYW5lLm9yZGVyLFxuICAgICAgICAgIENvb3JkaW5hdGVzOiB7IFg6IDAsIFk6IHN3aW1sYW5lLm9yZGVyICogMjYzIH0sXG4gICAgICAgICAgU2l6ZTogeyBXaWR0aDogMzAwMCwgSGVpZ2h0OiAyNjMgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRyYW5zZm9ybSBub2RlcyB0byBXb3JrZmxvd1N0YWdlW11cbiAgICBjb25zdCBzdGFnZXM6IFdvcmtmbG93U3RhZ2VbXSA9IFtdO1xuXG4gICAgdGhpcy5zd2ltbGFuZXMuZm9yRWFjaCgoc3dpbWxhbmUsIHN3aW1sYW5lSW5kZXgpID0+IHtcbiAgICAgIHN3aW1sYW5lLm5vZGVzPy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICAgICAgaWYgKHRoaXMuc3RhZ2VSZWNvcmRbbm9kZS5pZF0pIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBzdGFnZSB3aXRoIGNoYW5nZWQgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1N0YWdlID0gdGhpcy5zdGFnZVJlY29yZFtub2RlLmlkXTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHVwZGF0ZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFN0YWdlOiBXb3JrZmxvd1N0YWdlID0ge1xuICAgICAgICAgICAgICAuLi5leGlzdGluZ1N0YWdlLFxuICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQsXG4gICAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgbWF5IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgaWYgKG5vZGUuc3RhZ2VEYXRhPy5OYW1lICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5OYW1lID0gbm9kZS5zdGFnZURhdGEuTmFtZTtcbiAgICAgICAgICAgIGlmIChub2RlLnN0YWdlRGF0YT8uRGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgdXBkYXRlZFN0YWdlLkRlc2NyaXB0aW9uID0gbm9kZS5zdGFnZURhdGEuRGVzY3JpcHRpb247XG4gICAgICAgICAgICBpZiAobm9kZS5zdGFnZURhdGE/LkR1cmF0aW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5EdXJhdGlvbiA9IG5vZGUuc3RhZ2VEYXRhLkR1cmF0aW9uO1xuICAgICAgICAgICAgaWYgKG5vZGUuc3RhZ2VEYXRhPy5QYXNzT25SdWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5QYXNzT25SdWxlID0gbm9kZS5zdGFnZURhdGEuUGFzc09uUnVsZTtcbiAgICAgICAgICAgIGlmIChub2RlLnN0YWdlRGF0YT8uQWN0b3JSdWxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5BY3RvclJ1bGUgPSBub2RlLnN0YWdlRGF0YS5BY3RvclJ1bGU7XG4gICAgICAgICAgICBpZiAobm9kZS5zdGFnZURhdGE/Lk1pbk5vT2ZBY3RvciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICB1cGRhdGVkU3RhZ2UuTWluTm9PZkFjdG9yID0gbm9kZS5zdGFnZURhdGEuTWluTm9PZkFjdG9yO1xuICAgICAgICAgICAgaWYgKG5vZGUuc3RhZ2VEYXRhPy5Jc1BhcmFsbGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5Jc1BhcmFsbGVsID0gbm9kZS5zdGFnZURhdGEuSXNQYXJhbGxlbDtcbiAgICAgICAgICAgIGlmIChub2RlLnN0YWdlRGF0YT8uVGFncykgdXBkYXRlZFN0YWdlLlRhZ3MgPSBub2RlLnN0YWdlRGF0YS5UYWdzO1xuXG4gICAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIHRoZXNlIHByb3BlcnRpZXNcbiAgICAgICAgICAgIHVwZGF0ZWRTdGFnZS5Jc0VudHJ5UG9pbnQgPSBub2RlLmlzU3RhcnROb2RlO1xuICAgICAgICAgICAgdXBkYXRlZFN0YWdlLkNvb3JkaW5hdGVzID0geyBYOiBub2RlLngsIFk6IG5vZGUueSB9O1xuICAgICAgICAgICAgdXBkYXRlZFN0YWdlLlN3aW1MYW5lID0gdGhpcy5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF0uaWQgfHwgJyc7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0byBzdGFnZXNcbiAgICAgICAgICAgIHN0YWdlcy5wdXNoKHVwZGF0ZWRTdGFnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdGFnZVxuICAgICAgICAgICAgc3RhZ2VzLnB1c2goe1xuICAgICAgICAgICAgICBJZDogJycsXG4gICAgICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgICAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgICAgV29ya2Zsb3c6IHdvcmtmbG93LklkLFxuICAgICAgICAgICAgICBOYW1lOiBub2RlLnN0YWdlRGF0YT8uTmFtZSB8fCAnVW5uYW1lZCBTdGFnZScsXG4gICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBub2RlLnN0YWdlRGF0YT8uRGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICAgIER1cmF0aW9uOiBub2RlLnN0YWdlRGF0YT8uRHVyYXRpb24gfHwgMCxcbiAgICAgICAgICAgICAgUGFzc09uUnVsZTogbm9kZS5zdGFnZURhdGE/LlBhc3NPblJ1bGUgfHwgJycsXG4gICAgICAgICAgICAgIEFjdG9yUnVsZTogbm9kZS5zdGFnZURhdGE/LkFjdG9yUnVsZSB8fCBTdGFnZUFjdG9yUnVsZS5Ob25lLFxuICAgICAgICAgICAgICBNaW5Ob09mQWN0b3I6IG5vZGUuc3RhZ2VEYXRhPy5NaW5Ob09mQWN0b3IgfHwgMCxcbiAgICAgICAgICAgICAgSXNQYXJhbGxlbDogbm9kZS5zdGFnZURhdGE/LklzUGFyYWxsZWwgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIElzRW50cnlQb2ludDogbm9kZS5pc1N0YXJ0Tm9kZSxcbiAgICAgICAgICAgICAgSXNFeGl0UG9pbnQ6IGZhbHNlLCAvLyBXaWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgICAgICAgICAgVGFnczogbm9kZS5zdGFnZURhdGE/LlRhZ3MgfHwgW10sXG4gICAgICAgICAgICAgIEZvcm06IG5vZGUuc3RhZ2VEYXRhPy5mb3JtSWQgPz8gJycsXG4gICAgICAgICAgICAgIEFsbG93TXVsdGlTdWJQcm9jZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgQXNzaWdubWVudFR5cGU6IFRhc2tBc3NpZ25tZW50VHlwZS5BdXRvUm91dGUsXG4gICAgICAgICAgICAgIFN1YldvcmtGbG93OiAnJyxcbiAgICAgICAgICAgICAgU3dpbUxhbmU6IHRoaXMuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdLmlkIHx8ICcnLFxuICAgICAgICAgICAgICBDb29yZGluYXRlczogeyBYOiBub2RlLngsIFk6IG5vZGUueSB9LFxuICAgICAgICAgICAgICBJc1N1YlByb2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBLZXk6IG5vZGUuc3RhZ2VEYXRhPy5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIERldGVybWluZSB3aGljaCBzdGFnZXMgYXJlIGV4aXQgcG9pbnRzIChubyBvdXRnb2luZyBjb25uZWN0aW9ucylcbiAgICBzdGFnZXMuZm9yRWFjaCgoc3RhZ2UpID0+IHtcbiAgICAgIGNvbnN0IGhhc091dGdvaW5nQ29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25zLnNvbWUoXG4gICAgICAgIChjb25uKSA9PlxuICAgICAgICAgIGNvbm4uc291cmNlTm9kZUlkID09PSBzdGFnZS5JZCB8fCBjb25uLnNvdXJjZU5vZGVJZCA9PT0gc3RhZ2UuaWRcbiAgICAgICk7XG4gICAgICBpZiAoIWhhc091dGdvaW5nQ29ubmVjdGlvbnMpIHtcbiAgICAgICAgc3RhZ2UuSXNFeGl0UG9pbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIGNvbm5lY3Rpb25zIHRvIFdvcmtmbG93QWN0aW9uW11cbiAgICBjb25zdCBhY3Rpb25zOiBXb3JrZmxvd0FjdGlvbltdID0gW107XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zLmZvckVhY2goKGNvbm4pID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSB0aGlzLmZpbmROb2RlQnlJZChjb25uLnNvdXJjZU5vZGVJZCk/Lm5vZGU7XG4gICAgICBjb25zdCB0YXJnZXROb2RlID0gdGhpcy5maW5kTm9kZUJ5SWQoY29ubi50YXJnZXROb2RlSWQpPy5ub2RlO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4aXN0aW5nIGFjdGlvblxuICAgICAgaWYgKHRoaXMuYWN0aW9uUmVjb3JkW2Nvbm4uaWRdKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBhY3Rpb24gd2l0aCBjaGFuZ2VkIHZhbHVlc1xuICAgICAgICBjb25zdCBleGlzdGluZ0FjdGlvbiA9IHRoaXMuYWN0aW9uUmVjb3JkW2Nvbm4uaWRdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGFjdGlvbiB3aXRoIGNoYW5nZWQgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB1cGRhdGVkQWN0aW9uOiBXb3JrZmxvd0FjdGlvbiA9IHtcbiAgICAgICAgICAuLi5leGlzdGluZ0FjdGlvbixcbiAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLkNoYW5nZWQsXG4gICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgbWF5IGhhdmUgY2hhbmdlZFxuICAgICAgICB1cGRhdGVkQWN0aW9uLk5hbWUgPSBgQWN0aW9uIGZyb20gJHtcbiAgICAgICAgICBzb3VyY2VOb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nXG4gICAgICAgIH0gdG8gJHt0YXJnZXROb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nfWA7XG4gICAgICAgIHVwZGF0ZWRBY3Rpb24uSXNQYXJhbGxlbCA9IHNvdXJjZU5vZGU/LnN0YWdlRGF0YT8uaGFzUGFyYWxsZWwgfHwgZmFsc2U7XG4gICAgICAgIHVwZGF0ZWRBY3Rpb24uUGFzc09uUnVsZSA9IGNvbm4uY29uZGl0aW9uIHx8ICcnO1xuXG4gICAgICAgIGFjdGlvbnMucHVzaCh1cGRhdGVkQWN0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBhY3Rpb25cbiAgICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICBJZDogJycsXG4gICAgICAgICAgQ29kZTogJycsXG4gICAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICAgIGlkOiBjb25uLmlkLFxuICAgICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgIFdvcmtmbG93OiB3b3JrZmxvdy5JZCxcbiAgICAgICAgICBOYW1lOiBgQWN0aW9uIGZyb20gJHtzb3VyY2VOb2RlPy5zdGFnZURhdGE/Lk5hbWUgfHwgJ1Vua25vd24nfSB0byAke1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZT8uc3RhZ2VEYXRhPy5OYW1lIHx8ICdVbmtub3duJ1xuICAgICAgICAgIH1gLFxuICAgICAgICAgIEZyb21TdGFnZTogY29ubi5zb3VyY2VOb2RlSWQsXG4gICAgICAgICAgVG9TdGFnZTogY29ubi50YXJnZXROb2RlSWQsXG4gICAgICAgICAgSXNQYXJhbGxlbDogc291cmNlTm9kZT8uc3RhZ2VEYXRhPy5oYXNQYXJhbGxlbCB8fCBmYWxzZSxcbiAgICAgICAgICBQYXNzT25SdWxlOiBjb25uLmNvbmRpdGlvbiB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZGVsZXRlZCBvYmplY3RzIHdpdGggUmVtb3ZlZCBzdGF0ZVxuICAgIE9iamVjdC5rZXlzKHRoaXMuc3RhZ2VSZWNvcmQpLmZvckVhY2goKHN0YWdlSWQpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHN0YWdlcy5zb21lKFxuICAgICAgICAoc3RhZ2UpID0+IHN0YWdlLklkID09PSBzdGFnZUlkIHx8IHN0YWdlLmlkID09PSBzdGFnZUlkXG4gICAgICApO1xuXG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zdCBzdGFnZSA9IHRoaXMuc3RhZ2VSZWNvcmRbc3RhZ2VJZF07XG4gICAgICAgIHN0YWdlcy5wdXNoKHtcbiAgICAgICAgICAuLi5zdGFnZSxcbiAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLlJlbW92ZWQsXG4gICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuYWN0aW9uUmVjb3JkKS5mb3JFYWNoKChhY3Rpb25JZCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RzID0gYWN0aW9ucy5zb21lKFxuICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uSWQgPT09IGFjdGlvbklkIHx8IGFjdGlvbi5pZCA9PT0gYWN0aW9uSWRcbiAgICAgICk7XG5cbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uUmVjb3JkW2FjdGlvbklkXTtcbiAgICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5SZW1vdmVkLFxuICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZGVsZXRlZCBzd2ltbGFuZXNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnN3aW1sYW5lUmVjb3JkKS5mb3JFYWNoKChsYW5lSWQpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHdvcmtmbG93LkxhbmVzLnNvbWUoXG4gICAgICAgIChsYW5lKSA9PiBsYW5lLklkID09PSBsYW5lSWQgfHwgbGFuZS5pZCA9PT0gbGFuZUlkXG4gICAgICApO1xuXG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zdCBsYW5lID0gdGhpcy5zd2ltbGFuZVJlY29yZFtsYW5lSWRdO1xuICAgICAgICB3b3JrZmxvdy5MYW5lcy5wdXNoKHtcbiAgICAgICAgICAuLi5sYW5lLFxuICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuUmVtb3ZlZCxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd29ya2Zsb3cuU3RhZ2VzID0gc3RhZ2VzO1xuICAgIHdvcmtmbG93LkFjdGlvbnMgPSBhY3Rpb25zO1xuXG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgLy8gQWRkIGEgbmV3IHByb3BlcnR5IHRvIHRyYWNrIGxvYWRlZCBvYmplY3RzXG4gIGxvYWRlZE9iamVjdElkczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9OyAvLyBGb3JtYXQ6IHsgaWQ6IGNvZGUgfVxuXG4gIC8vIEFkZCBhIG1ldGhvZCB0byByZWdpc3RlciBsb2FkZWQgb2JqZWN0c1xuICByZWdpc3RlckxvYWRlZE9iamVjdChpZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRlZE9iamVjdElkc1tpZF0gPSBjb2RlO1xuICB9XG5cbiAgLy8gTWV0aG9kIHRvIGNoZWNrIGlmIGFuIG9iamVjdCB3YXMgbG9hZGVkIGZyb20gQVBJXG4gIHdhc0xvYWRlZEZyb21BcGkoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpZCBpbiB0aGlzLmxvYWRlZE9iamVjdElkcztcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBnZXQgdGhlIGNvZGUgZm9yIGEgbG9hZGVkIG9iamVjdFxuICBnZXRDb2RlRm9yT2JqZWN0KGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvYWRlZE9iamVjdElkc1tpZF0gfHwgJyc7XG4gIH1cbn1cbiJdfQ==