@foblex/flow 18.3.0 → 18.4.0

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 (120) hide show
  1. package/AI.md +69 -0
  2. package/README.md +40 -3
  3. package/STYLING.md +35 -0
  4. package/domain/f-connection/index.d.ts +1 -0
  5. package/domain/f-connection/providers.d.ts +2 -1
  6. package/domain/f-connection/redraw-connections/redraw-connections.d.ts +1 -0
  7. package/domain/f-connection/resolve-connection-endpoint-rotation-context/index.d.ts +2 -0
  8. package/domain/f-connection/resolve-connection-endpoint-rotation-context/resolve-connection-endpoint-rotation-context-request.d.ts +8 -0
  9. package/domain/f-connection/resolve-connection-endpoint-rotation-context/resolve-connection-endpoint-rotation-context.d.ts +10 -0
  10. package/domain/f-draggable/on-pointer-move/on-pointer-move-request.d.ts +1 -1
  11. package/domain/f-draggable/on-pointer-move/on-pointer-move.d.ts +1 -0
  12. package/domain/get-normalized-connector-rect/get-normalized-connector-rect.d.ts +8 -0
  13. package/domain/providers.d.ts +1 -1
  14. package/esm2022/domain/f-connection/index.mjs +2 -1
  15. package/esm2022/domain/f-connection/providers.mjs +3 -1
  16. package/esm2022/domain/f-connection/redraw-connections/redraw-connections.mjs +6 -2
  17. package/esm2022/domain/f-connection/resolve-connection-endpoint-rotation-context/index.mjs +3 -0
  18. package/esm2022/domain/f-connection/resolve-connection-endpoint-rotation-context/resolve-connection-endpoint-rotation-context-request.mjs +8 -0
  19. package/esm2022/domain/f-connection/resolve-connection-endpoint-rotation-context/resolve-connection-endpoint-rotation-context.mjs +35 -0
  20. package/esm2022/domain/f-draggable/on-pointer-move/on-pointer-move-request.mjs +1 -1
  21. package/esm2022/domain/f-draggable/on-pointer-move/on-pointer-move.mjs +6 -2
  22. package/esm2022/domain/get-normalized-connector-rect/get-normalized-connector-rect.mjs +33 -3
  23. package/esm2022/f-auto-pan/f-auto-pan-base.mjs +11 -0
  24. package/esm2022/f-auto-pan/f-auto-pan.mjs +38 -0
  25. package/esm2022/f-auto-pan/index.mjs +4 -0
  26. package/esm2022/f-auto-pan/providers.mjs +3 -0
  27. package/esm2022/f-canvas/f-canvas.component.mjs +2 -2
  28. package/esm2022/f-connection-v2/components/connection-content/f-connection-content.mjs +18 -4
  29. package/esm2022/f-connection-v2/utils/connection-behaviour/connection-behaviour-builder-request.mjs +6 -2
  30. package/esm2022/f-connection-v2/utils/connection-behaviour/connection-behaviour-builder.mjs +3 -1
  31. package/esm2022/f-connection-v2/utils/connection-behaviour/models/i-calculate-behavior-request.mjs +1 -1
  32. package/esm2022/f-connection-v2/utils/connection-behaviour/utils/floating-behavior.mjs +8 -8
  33. package/esm2022/f-connection-v2/utils/connection-behaviour/utils/get-rotated-rounded-rect-intersection.mjs +35 -0
  34. package/esm2022/f-connection-worker/features/calculate-connection-worker-payload-item/calculate-connection-worker-payload-item.mjs +13 -1
  35. package/esm2022/f-connection-worker/model/i-f-connection-worker-rect.mjs +1 -1
  36. package/esm2022/f-connection-worker/model/i-f-connection-worker-request-item.mjs +1 -1
  37. package/esm2022/f-connection-worker/worker/connection-worker-runtime.mjs +13 -1
  38. package/esm2022/f-draggable/auto-pan/auto-pan.utils.mjs +58 -0
  39. package/esm2022/f-draggable/auto-pan/index.mjs +7 -0
  40. package/esm2022/f-draggable/auto-pan/providers.mjs +5 -0
  41. package/esm2022/f-draggable/auto-pan/run-auto-pan-frame/index.mjs +3 -0
  42. package/esm2022/f-draggable/auto-pan/run-auto-pan-frame/run-auto-pan-frame-request.mjs +4 -0
  43. package/esm2022/f-draggable/auto-pan/run-auto-pan-frame/run-auto-pan-frame.mjs +97 -0
  44. package/esm2022/f-draggable/auto-pan/stop-auto-pan/index.mjs +3 -0
  45. package/esm2022/f-draggable/auto-pan/stop-auto-pan/stop-auto-pan-request.mjs +4 -0
  46. package/esm2022/f-draggable/auto-pan/stop-auto-pan/stop-auto-pan.mjs +32 -0
  47. package/esm2022/f-draggable/auto-pan/stored-pointer-event.mjs +25 -0
  48. package/esm2022/f-draggable/auto-pan/sync-auto-pan/index.mjs +3 -0
  49. package/esm2022/f-draggable/auto-pan/sync-auto-pan/sync-auto-pan-request.mjs +4 -0
  50. package/esm2022/f-draggable/auto-pan/sync-auto-pan/sync-auto-pan.mjs +75 -0
  51. package/esm2022/f-draggable/connection/create-connection/create-connection-handler/create-connection-handler.mjs +7 -4
  52. package/esm2022/f-draggable/connection/reassign-connection/reassign-connection-handler/reassign-connection-source-handler.mjs +7 -4
  53. package/esm2022/f-draggable/connection/reassign-connection/reassign-connection-handler/reassign-connection-target-handler.mjs +7 -4
  54. package/esm2022/f-draggable/drag-canvas/drag-canvas-handler/drag-canvas-handler.mjs +6 -3
  55. package/esm2022/f-draggable/drag-node/drag-node-dependent-connection-handlers/drag-node-connection-handler-base.mjs +6 -3
  56. package/esm2022/f-draggable/f-draggable-data-context.mjs +14 -1
  57. package/esm2022/f-draggable/f-draggable.directive.mjs +4 -1
  58. package/esm2022/f-draggable/index.mjs +2 -1
  59. package/esm2022/f-draggable/providers.mjs +3 -1
  60. package/esm2022/f-draggable/resize-node/resize-node-handler/resize-node-dependent-connection-handlers/resize-node-connection-handler-base.mjs +6 -3
  61. package/esm2022/f-flow/f-flow.component.mjs +2 -2
  62. package/esm2022/f-flow.module.mjs +20 -16
  63. package/esm2022/f-storage/f-components-store.mjs +3 -1
  64. package/esm2022/f-zoom/f-zoom.directive.mjs +9 -11
  65. package/esm2022/f-zoom/wheel-zoom.utils.mjs +34 -0
  66. package/esm2022/public-api.mjs +2 -1
  67. package/f-auto-pan/f-auto-pan-base.d.ts +11 -0
  68. package/f-auto-pan/f-auto-pan.d.ts +13 -0
  69. package/f-auto-pan/index.d.ts +3 -0
  70. package/f-auto-pan/providers.d.ts +2 -0
  71. package/f-connection-v2/utils/connection-behaviour/connection-behaviour-builder-request.d.ts +4 -1
  72. package/f-connection-v2/utils/connection-behaviour/models/i-calculate-behavior-request.d.ts +7 -1
  73. package/f-connection-v2/utils/connection-behaviour/utils/floating-behavior.d.ts +1 -1
  74. package/f-connection-v2/utils/connection-behaviour/utils/get-rotated-rounded-rect-intersection.d.ts +3 -0
  75. package/f-connection-worker/features/calculate-connection-worker-payload-item/calculate-connection-worker-payload-item.d.ts +1 -0
  76. package/f-connection-worker/model/i-f-connection-worker-rect.d.ts +4 -0
  77. package/f-connection-worker/model/i-f-connection-worker-request-item.d.ts +2 -0
  78. package/f-draggable/auto-pan/auto-pan.utils.d.ts +6 -0
  79. package/f-draggable/auto-pan/index.d.ts +6 -0
  80. package/f-draggable/auto-pan/providers.d.ts +4 -0
  81. package/f-draggable/auto-pan/run-auto-pan-frame/index.d.ts +2 -0
  82. package/f-draggable/auto-pan/run-auto-pan-frame/run-auto-pan-frame-request.d.ts +3 -0
  83. package/f-draggable/auto-pan/run-auto-pan-frame/run-auto-pan-frame.d.ts +21 -0
  84. package/f-draggable/auto-pan/stop-auto-pan/index.d.ts +2 -0
  85. package/f-draggable/auto-pan/stop-auto-pan/stop-auto-pan-request.d.ts +3 -0
  86. package/f-draggable/auto-pan/stop-auto-pan/stop-auto-pan.d.ts +10 -0
  87. package/f-draggable/auto-pan/stored-pointer-event.d.ts +12 -0
  88. package/f-draggable/auto-pan/sync-auto-pan/index.d.ts +2 -0
  89. package/f-draggable/auto-pan/sync-auto-pan/sync-auto-pan-request.d.ts +3 -0
  90. package/f-draggable/auto-pan/sync-auto-pan/sync-auto-pan.d.ts +19 -0
  91. package/f-draggable/connection/create-connection/create-connection-handler/create-connection-handler.d.ts +1 -0
  92. package/f-draggable/connection/reassign-connection/reassign-connection-handler/reassign-connection-source-handler.d.ts +1 -0
  93. package/f-draggable/connection/reassign-connection/reassign-connection-handler/reassign-connection-target-handler.d.ts +1 -0
  94. package/f-draggable/drag-node/drag-node-dependent-connection-handlers/drag-node-connection-handler-base.d.ts +1 -0
  95. package/f-draggable/f-draggable-data-context.d.ts +7 -1
  96. package/f-draggable/index.d.ts +1 -0
  97. package/f-draggable/providers.d.ts +1 -1
  98. package/f-draggable/resize-node/resize-node-handler/resize-node-dependent-connection-handlers/resize-node-connection-handler-base.d.ts +1 -0
  99. package/f-flow.module.d.ts +17 -16
  100. package/f-storage/f-components-store.d.ts +2 -0
  101. package/f-zoom/f-zoom.directive.d.ts +0 -1
  102. package/f-zoom/wheel-zoom.utils.d.ts +3 -0
  103. package/fesm2022/foblex-flow.mjs +7648 -7120
  104. package/fesm2022/foblex-flow.mjs.map +1 -1
  105. package/package.json +7 -7
  106. package/public-api.d.ts +1 -0
  107. package/schematics/ng-add/index.js +63 -2
  108. package/schematics/ng-add/index.js.map +1 -1
  109. package/schematics/shared/foblex-dependencies.js +1 -1
  110. package/styles/_index.scss +31 -0
  111. package/styles/default.scss +4 -0
  112. package/styles/domains/_connection.scss +175 -0
  113. package/styles/domains/_connector.scss +150 -0
  114. package/styles/domains/_external-item.scss +44 -0
  115. package/styles/domains/_flow-canvas.scss +41 -0
  116. package/styles/domains/_node-group.scss +230 -0
  117. package/styles/domains/_plugins.scss +100 -0
  118. package/styles/tokens/_ff-aliases.scss +117 -0
  119. package/styles/tokens/_primitive.scss +86 -0
  120. package/styles/tokens/_semantic.scss +131 -0
package/AI.md ADDED
@@ -0,0 +1,69 @@
1
+ # AI Guide for `@foblex/flow`
2
+
3
+ Use this file as a strict control layer for code generation. Prefer verified package API and examples over assumptions.
4
+
5
+ ## What This Library Is
6
+
7
+ `@foblex/flow` is an Angular-native library for building node-based editors, workflow builders, and interactive graph UIs.
8
+ It provides rendering, connectors, interactions, selection, zoom, and connection drawing. Your app still owns the graph data.
9
+
10
+ ## Core Mental Model
11
+
12
+ - The library does **not** own your graph state.
13
+ - Your app owns nodes, groups, connections, ids, validation, and persistence.
14
+ - Angular templates render the current state.
15
+ - User actions emit events from `fDraggable` or model outputs.
16
+ - Your app updates state.
17
+ - Angular rerenders.
18
+
19
+ ## Verified Building Blocks
20
+
21
+ - `<f-flow>`: root flow host.
22
+ - `<f-canvas>`: canvas/viewport container.
23
+ - `[fNode]` and `[fGroup]`: place nodes and groups in the template.
24
+ - `[fNodeOutput]` with `fOutputId`: output connector.
25
+ - `[fNodeInput]` with `fInputId`: input connector.
26
+ - `[fNodeOutlet]`: outlet-style connector surface for advanced connection creation patterns.
27
+ - `<f-connection>`: render an existing connection between connectors.
28
+ - `<f-connection-for-create>`: optional preview connection used during drag-to-connect UX.
29
+ - `fDraggable` on `<f-flow>`: enables pointer interactions and emits interaction events.
30
+
31
+ ## Hard Rules
32
+
33
+ - Never invent Inputs, Outputs, methods, directives, or selectors.
34
+ - Do **not** assume React Flow style APIs such as `[nodes]`, `[edges]`, `setNodes()`, `addEdge()`, `useNodesState()`, or similar patterns.
35
+ - Do **not** assume a built-in graph store. The app owns state.
36
+ - Connections are connector-to-connector, not generic node-to-node edges.
37
+ - Template connections use `fOutputId -> fInputId`.
38
+ - Do **not** interpret `[fNodes]` or `[fConnections]` as graph-state inputs. In this package they are content-projection markers used with `ngProjectAs` in some examples.
39
+ - Examples may include app-specific state, layout logic, persistence, undo/redo, toolbars, or validation. Those are example implementations, not built-in package features.
40
+ - Some exports are low-level, compatibility-oriented, or testing-oriented. Do not treat every export from `@foblex/flow` as the recommended app-facing API.
41
+ - If a symbol, selector, event, or behavior is not confirmed in the installed package, say: `not found in @foblex/flow`.
42
+
43
+ ## Correct Usage Pattern
44
+
45
+ - Render nodes and groups from your Angular state using normal Angular templates.
46
+ - Put connectors on the node element itself or on child elements with `fNodeOutput` / `fNodeInput`.
47
+ - Render persisted connections explicitly with `<f-connection>`.
48
+ - Add `fDraggable` to `<f-flow>` when you want drag, selection, connect, reassign, or drop interactions.
49
+ - Handle events such as `fCreateConnection`, `fReassignConnection`, `fMoveNodes`, `fSelectionChange`, `fCreateNode`, `fDropToGroup`, and `fConnectionWaypointsChanged`.
50
+ - Update your own state in those handlers, then let Angular rerender.
51
+ - Use node/group position bindings and change outputs to keep positions in app state when needed.
52
+
53
+ ## Naming Distinction
54
+
55
+ - In templates, connector ids are `fOutputId` and `fInputId`.
56
+ - In `FCreateConnectionEvent`, prefer `sourceId`, `targetId`, and `dropPosition`.
57
+ - `FCreateConnectionEvent` still exposes legacy aliases `fOutputId`, `fInputId`, and `fDropPosition`.
58
+ - In `FReassignConnectionEvent`, prefer `connectionId`, `endpoint`, `previousSourceId`, `nextSourceId`, `previousTargetId`, `nextTargetId`, and `dropPosition`.
59
+ - `FReassignConnectionEvent` still exposes legacy aliases such as `oldSourceId`, `newSourceId`, `oldTargetId`, `newTargetId`, and `dropPoint`.
60
+ - Other current event classes also prefer non-`f*` names when both versions exist, for example `nodeIds` over `fNodeIds` and `nodes` over `fNodes`.
61
+ - Examples may still show compatibility names in handlers. Prefer the current non-deprecated event property names when generating new code.
62
+
63
+ ## Styling
64
+
65
+ See [STYLING.md](./STYLING.md).
66
+
67
+ ## Fallback Rule
68
+
69
+ If something cannot be verified from the installed package, answer with: `not found in @foblex/flow`.
package/README.md CHANGED
@@ -23,7 +23,7 @@ Foblex Flow gives Angular teams a simple way to start building graph-based produ
23
23
 
24
24
  Use it to create workflow builders, AI low-code tools, call-flow editors, UML diagrams, internal back-office tools, and other node-based interfaces while keeping your own state, validation, persistence, and domain logic.
25
25
 
26
- It works with Angular 15+, SSR, standalone components, and zoneless-friendly application setups.
26
+ Current `18.x` releases target Angular `17.3+`. If your app is on Angular 12-17.2, check the [Angular Version Compatibility](https://flow.foblex.com/docs/angular-version-compatibility) guide first and pin the matching Foblex Flow line before installing.
27
27
 
28
28
  ## Why Foblex Flow
29
29
 
@@ -53,16 +53,52 @@ It works with Angular 15+, SSR, standalone components, and zoneless-friendly app
53
53
 
54
54
  ## Install
55
55
 
56
+ These install commands are for the current `18.x` line. For Angular 12-17.2 apps, use the [Angular Version Compatibility](https://flow.foblex.com/docs/angular-version-compatibility) guide first so you do not accidentally install a newer incompatible line.
57
+
56
58
  ```bash
57
59
  ng add @foblex/flow
58
60
  ```
59
61
 
60
- If you prefer manual installation:
62
+ For Nx workspaces:
63
+
64
+ ```bash
65
+ nx g @foblex/flow:add
66
+ ```
67
+
68
+ `ng add` installs the required companion packages automatically. If you prefer manual installation, install them explicitly:
61
69
 
62
70
  ```bash
63
- npm install @foblex/flow
71
+ npm install @foblex/flow @foblex/platform@^1.0.4 @foblex/mediator@^1.1.3 @foblex/2d@^1.2.2 @foblex/utils@^1.1.1
64
72
  ```
65
73
 
74
+ `ng add` also wires the shipped default theme into application styles by adding `node_modules/@foblex/flow/styles/default.scss` when the entry is missing.
75
+
76
+ ## Default Theme
77
+
78
+ Use the default theme when you want styled nodes, connectors, connections, minimap, selection area, and helper plugins immediately.
79
+
80
+ ```json
81
+ "styles": [
82
+ "src/styles.scss",
83
+ "node_modules/@foblex/flow/styles/default.scss"
84
+ ]
85
+ ```
86
+
87
+ If you prefer selective SCSS mixins instead of one full entrypoint:
88
+
89
+ ```scss
90
+ @use '@foblex/flow/styles' as flow-theme;
91
+
92
+ @include flow-theme.theme-tokens();
93
+ @include flow-theme.flow-canvas();
94
+ @include flow-theme.node-group();
95
+ @include flow-theme.connector();
96
+ @include flow-theme.connection-all();
97
+ @include flow-theme.plugins();
98
+ ```
99
+
100
+ Full guide: [Default Theme and Styling](https://flow.foblex.com/docs/default-theme-and-styling)
101
+
66
102
  ## Minimal Example
67
103
 
68
104
  ```html
@@ -104,6 +140,7 @@ npm install @foblex/flow
104
140
  ## Resources
105
141
 
106
142
  - [Get Started](https://flow.foblex.com/docs/get-started)
143
+ - [Angular Version Compatibility](https://flow.foblex.com/docs/angular-version-compatibility)
107
144
  - [Documentation](https://flow.foblex.com/docs/intro)
108
145
  - [Examples](https://flow.foblex.com/examples/overview)
109
146
  - [Articles](https://flow.foblex.com/blog/overview)
package/STYLING.md ADDED
@@ -0,0 +1,35 @@
1
+ # Styling Guide for `@foblex/flow`
2
+
3
+ ## Introduction
4
+
5
+ Styling in `@foblex/flow` depends partly on CSS classes applied by the library at runtime.
6
+ Observed host/base classes in source include `.f-flow`, `.f-canvas`, `.f-node`, `.f-group`, `.f-connection`, `.f-node-input`, `.f-node-output`, and `.f-node-outlet`.
7
+
8
+ ## Observed Runtime Classes
9
+
10
+ - Observed in source and examples: `.f-selected` for selected nodes, groups, connections, and minimap items.
11
+ - Observed in source: `.f-dragging` is applied during drag sequences. It is used on dragged items and also on the flow host during an active drag sequence.
12
+ - Observed in source and examples: `.f-connections-dragging` is applied while connection creation/reassignment is looking for valid targets.
13
+ - Observed in source and examples: `.f-connector-connectable` marks connectors that are currently valid connection targets.
14
+ - Observed in source: `.f-node-output-connected` and `.f-node-input-connected` mark connectors that are currently connected.
15
+ - Observed in source: `.f-node-output-not-connectable` and `.f-node-input-not-connectable` mark connectors that are present but currently not connectable.
16
+ - Observed in source: `.f-grouping-drop-active` and `.f-grouping-over-boundary` are applied during drop-to-group interactions.
17
+ - Observed in source: `.f-node-dragging-disabled`, `.f-node-selection-disabled`, `.f-group-dragging-disabled`, `.f-group-selection-disabled`, `.f-connection-reassign-disabled`, and `.f-connection-selection-disabled` are host modifier classes for disabled interaction states.
18
+ - Observed in source: `.f-node-input-disabled`, `.f-node-output-disabled`, and `.f-node-outlet-disabled` are connector/outlet disabled-state classes.
19
+ - Observed in source: `.f-node-input-multiple`, `.f-node-output-multiple`, and `.f-node-output-self-connectable` are connector capability/modifier classes.
20
+
21
+ ## Safe Styling Approach
22
+
23
+ - Prefer styling your own semantic classes first, then combine them with high-level Foblex host classes.
24
+ - Safe selectors usually start from host elements such as `.f-node`, `.f-group`, `.f-connection`, `.f-node-input`, `.f-node-output`, and `.f-node-outlet`.
25
+ - For state styling, prefer selectors like `.my-node.f-selected`, `.my-connector.f-node-input-connected`, or `f-flow.f-connections-dragging .f-node-input`.
26
+ - Avoid depending on deep internal DOM structure for connections, markers, or helper overlays unless you inspect the runtime DOM in the installed version.
27
+ - If you need a very specific selector, inspect the rendered DOM first instead of assuming structure from examples.
28
+
29
+ ## Warnings
30
+
31
+ - Not every runtime class should be treated as stable public styling API.
32
+ - Some classes are clearly internal interaction/animation helpers, for example `.f-canvas-dragging`, `.f-scaled-animate`, `.f-external-item-preview`, and `.f-external-item-placeholder`.
33
+ - `.canvas-dragging` is a deprecated compatibility alias. Prefer `.f-canvas-dragging`.
34
+ - Example styles prove that a class exists, not that it is guaranteed stable across versions.
35
+ - If a class is not verified in source or shipped examples, do not invent it. Say: `not found in @foblex/flow`.
@@ -4,6 +4,7 @@ export * from './add-connection-to-store';
4
4
  export * from './add-snap-connection-to-store';
5
5
  export * from './create-connection-markers';
6
6
  export * from './redraw-connections';
7
+ export * from './resolve-connection-endpoint-rotation-context';
7
8
  export * from './remove-connection-for-create-from-store';
8
9
  export * from './remove-connection-from-store';
9
10
  export * from './remove-connection-marker-from-store';
@@ -8,8 +8,9 @@ import { RemoveSnapConnectionFromStore } from './remove-snap-connection-from-sto
8
8
  import { AddConnectionMarkerToStore } from './add-connection-marker-to-store';
9
9
  import { RemoveConnectionMarkerFromStore } from './remove-connection-marker-from-store';
10
10
  import { RedrawConnections } from './redraw-connections';
11
+ import { ResolveConnectionEndpointRotationContext } from './resolve-connection-endpoint-rotation-context';
11
12
  import { RemoveConnectionWaypoint } from './remove-connection-waypoint';
12
13
  /**
13
14
  * This file exports all the connection-related features for the F-Flow domain.
14
15
  */
15
- export declare const F_CONNECTION_FEATURES: (typeof AddConnectionForCreateToStore | typeof AddConnectionMarkerToStore | typeof AddConnectionToStore | typeof AddSnapConnectionToStore | typeof CreateConnectionMarkers | typeof RedrawConnections | typeof RemoveConnectionForCreateFromStore | typeof RemoveConnectionFromStore | typeof RemoveConnectionMarkerFromStore | typeof RemoveSnapConnectionFromStore | typeof RemoveConnectionWaypoint)[];
16
+ export declare const F_CONNECTION_FEATURES: (typeof AddConnectionForCreateToStore | typeof AddConnectionMarkerToStore | typeof AddConnectionToStore | typeof AddSnapConnectionToStore | typeof CreateConnectionMarkers | typeof RedrawConnections | typeof ResolveConnectionEndpointRotationContext | typeof RemoveConnectionForCreateFromStore | typeof RemoveConnectionFromStore | typeof RemoveConnectionMarkerFromStore | typeof RemoveSnapConnectionFromStore | typeof RemoveConnectionWaypoint)[];
@@ -19,6 +19,7 @@ export declare class RedrawConnections implements IExecution<RedrawConnectionsRe
19
19
  private _setupConnection;
20
20
  private _setupConnectionWithLine;
21
21
  private _calculateConnectionLine;
22
+ private _resolveRotationContext;
22
23
  private _resolveConnectionConnectors;
23
24
  private _resolveConnectionContext;
24
25
  private _createMarkers;
@@ -0,0 +1,2 @@
1
+ export * from './resolve-connection-endpoint-rotation-context';
2
+ export * from './resolve-connection-endpoint-rotation-context-request';
@@ -0,0 +1,8 @@
1
+ import { FConnectorBase } from '../../../f-connectors';
2
+ import { IConnectionEndpointRotationContext } from '../../../f-connection-v2';
3
+ export declare class ResolveConnectionEndpointRotationContextRequest {
4
+ readonly connector?: FConnectorBase | undefined;
5
+ static readonly fToken: unique symbol;
6
+ constructor(connector?: FConnectorBase | undefined);
7
+ }
8
+ export type TResolveConnectionEndpointRotationContextResponse = IConnectionEndpointRotationContext | undefined;
@@ -0,0 +1,10 @@
1
+ import { IExecution } from '@foblex/mediator';
2
+ import { ResolveConnectionEndpointRotationContextRequest, TResolveConnectionEndpointRotationContextResponse } from './resolve-connection-endpoint-rotation-context-request';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ResolveConnectionEndpointRotationContext implements IExecution<ResolveConnectionEndpointRotationContextRequest, TResolveConnectionEndpointRotationContextResponse> {
5
+ private readonly _store;
6
+ private readonly _mediator;
7
+ handle({ connector, }: ResolveConnectionEndpointRotationContextRequest): TResolveConnectionEndpointRotationContextResponse;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<ResolveConnectionEndpointRotationContext, never>;
9
+ static ɵprov: i0.ɵɵInjectableDeclaration<ResolveConnectionEndpointRotationContext>;
10
+ }
@@ -1,4 +1,4 @@
1
- import { IPointerEvent } from "../../../drag-toolkit";
1
+ import { IPointerEvent } from '../../../drag-toolkit';
2
2
  export declare class OnPointerMoveRequest {
3
3
  event: IPointerEvent;
4
4
  static readonly fToken: unique symbol;
@@ -7,6 +7,7 @@ import * as i0 from "@angular/core";
7
7
  * when the drag started, and updates the draggable items accordingly.
8
8
  */
9
9
  export declare class OnPointerMove implements IExecution<OnPointerMoveRequest, void> {
10
+ private readonly _mediator;
10
11
  private readonly _store;
11
12
  private get _hostElement();
12
13
  private readonly _dragContext;
@@ -17,9 +17,17 @@ export declare class GetNormalizedConnectorRect implements IExecution<GetNormali
17
17
  private _getRoundedRect;
18
18
  private _getComputedStyle;
19
19
  private _toPixels;
20
+ private _getSystemRadius;
21
+ /**
22
+ * Mirrors CSS border-radius normalization so oversized values like `999px`
23
+ * collapse to the largest valid circular radii for the current rect.
24
+ */
25
+ private _normalizeCircularBorderRadii;
26
+ private _getRadiusScaleFactor;
20
27
  private _normalizePosition;
21
28
  private _unscaleSize;
22
29
  private _getUnscaledRect;
30
+ private _unscaleRadius;
23
31
  private _getOffsetSize;
24
32
  static ɵfac: i0.ɵɵFactoryDeclaration<GetNormalizedConnectorRect, never>;
25
33
  static ɵprov: i0.ɵɵInjectableDeclaration<GetNormalizedConnectorRect>;
@@ -10,4 +10,4 @@ import { GetNormalizedConnectorRect } from './get-normalized-connector-rect';
10
10
  * draggable elements, flow, line alignment, nodes, selection, zoom,
11
11
  * and various utility executions.
12
12
  */
13
- export declare const COMMON_PROVIDERS: (typeof import("../f-cache").FCache | typeof import("../f-cache").InvalidateFCacheNode | typeof import("../f-cache").RegisterFCacheNode | typeof import("../f-cache").UnregisterFCacheNode | typeof import("../f-cache").RegisterFCacheConnector | typeof import("../f-cache").UnregisterFCacheConnector | typeof import("../f-cache").GetCachedFCacheRect | typeof import("../f-cache").SetFCacheConnectorRect | typeof import("../f-cache").SetFCacheNodeRect | typeof import("../f-cache").UpdateFCacheRectByElement | typeof import("./f-canvas").AddCanvasToStore | typeof import("./f-canvas").CenterGroupOrNode | typeof import("./f-canvas").FitToFlow | typeof import("./f-canvas").InputCanvasPosition | typeof import("./f-canvas").InputCanvasScale | typeof import("./f-canvas").RedrawCanvasWithAnimation | typeof import("./f-canvas").ResetScaleAndCenter | typeof import("./f-canvas").UpdateScale | typeof import("./f-connection").AddConnectionForCreateToStore | typeof import("./f-connection").AddConnectionMarkerToStore | typeof import("./f-connection").AddConnectionToStore | typeof import("./f-connection").AddSnapConnectionToStore | typeof import("./f-connection").CreateConnectionMarkers | typeof import("./f-connection").RemoveConnectionFromStore | typeof import("./f-connection").RemoveConnectionMarkerFromStore | typeof import("./f-connection").RemoveConnectionWaypoint | typeof import("./f-background").AddPatternToBackground | typeof import("./f-background").SetBackgroundTransform | typeof import("./f-connectors").AddConnectorToStore | typeof import("./f-connectors").RemoveConnectorFromStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPosition | typeof import("./f-connectors").CalculateSourceConnectorsToConnect | typeof import("./f-connectors").CalculateTargetConnectorsToConnect | typeof import("./f-connectors").GetConnectorRectReference | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStore | typeof import("./f-draggable").OnPointerMove | typeof import("./f-flow").AddFlowToStore | typeof import("./f-flow").CalculateNodesState | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateConnectableSideByConnectedPositions | typeof import("./f-node").CalculateConnectableSideByInternalPosition | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateConnectorsConnectableSides | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").UpdateNodeWhenStateOrSizeChanged | typeof import("./f-node").RemoveNodeFromStore | typeof import("./f-selection").Select | typeof import("./f-selection").SelectAndUpdateNodeLayer | typeof import("./f-zoom").SetZoom | typeof import("./minimap").MinimapCalculateViewport | typeof GetDeepChildrenNodesAndGroups | typeof GetNormalizedConnectorRect | typeof GetNormalizedElementRect | typeof GetNormalizedPoint | typeof SortItemsByParent | typeof UpdateItemAndChildrenLayers | typeof MoveFrontElementsBeforeTargetElement)[];
13
+ export declare const COMMON_PROVIDERS: (typeof import("../f-cache").FCache | typeof import("../f-cache").InvalidateFCacheNode | typeof import("../f-cache").RegisterFCacheNode | typeof import("../f-cache").UnregisterFCacheNode | typeof import("../f-cache").RegisterFCacheConnector | typeof import("../f-cache").UnregisterFCacheConnector | typeof import("../f-cache").GetCachedFCacheRect | typeof import("../f-cache").SetFCacheConnectorRect | typeof import("../f-cache").SetFCacheNodeRect | typeof import("../f-cache").UpdateFCacheRectByElement | typeof import("./f-canvas").AddCanvasToStore | typeof import("./f-canvas").CenterGroupOrNode | typeof import("./f-canvas").FitToFlow | typeof import("./f-canvas").InputCanvasPosition | typeof import("./f-canvas").InputCanvasScale | typeof import("./f-canvas").RedrawCanvasWithAnimation | typeof import("./f-canvas").ResetScaleAndCenter | typeof import("./f-canvas").UpdateScale | typeof import("./f-connection").AddConnectionForCreateToStore | typeof import("./f-connection").AddConnectionMarkerToStore | typeof import("./f-connection").AddConnectionToStore | typeof import("./f-connection").AddSnapConnectionToStore | typeof import("./f-connection").CreateConnectionMarkers | typeof import("./f-connection").ResolveConnectionEndpointRotationContext | typeof import("./f-connection").RemoveConnectionFromStore | typeof import("./f-connection").RemoveConnectionMarkerFromStore | typeof import("./f-connection").RemoveConnectionWaypoint | typeof import("./f-background").AddPatternToBackground | typeof import("./f-background").SetBackgroundTransform | typeof import("./f-connectors").AddConnectorToStore | typeof import("./f-connectors").RemoveConnectorFromStore | typeof import("./f-connectors").CalculateClosestConnector | typeof import("./f-connectors").FindConnectableConnectorUsingPriorityAndPosition | typeof import("./f-connectors").CalculateSourceConnectorsToConnect | typeof import("./f-connectors").CalculateTargetConnectorsToConnect | typeof import("./f-connectors").GetConnectorRectReference | typeof import("./f-connectors").MarkConnectableConnectors | typeof import("./f-connectors").UnmarkConnectableConnectors | typeof import("./f-draggable").AddDndToStore | typeof import("./f-draggable").OnPointerMove | typeof import("./f-flow").AddFlowToStore | typeof import("./f-flow").CalculateNodesState | typeof import("./f-node").AddNodeToStore | typeof import("./f-node").CalculateConnectableSideByConnectedPositions | typeof import("./f-node").CalculateConnectableSideByInternalPosition | typeof import("./f-node").CalculateInputConnections | typeof import("./f-node").CalculateConnectorsConnectableSides | typeof import("./f-node").CalculateNodesBoundingBoxNormalizedPosition | typeof import("./f-node").CalculateOutputConnections | typeof import("./f-node").FitToChildNodesAndGroups | typeof import("./f-node").GetChildNodeIds | typeof import("./f-node").GetNodePadding | typeof import("./f-node").GetParentNodes | typeof import("./f-node").UpdateNodeWhenStateOrSizeChanged | typeof import("./f-node").RemoveNodeFromStore | typeof import("./f-selection").Select | typeof import("./f-selection").SelectAndUpdateNodeLayer | typeof import("./f-zoom").SetZoom | typeof import("./minimap").MinimapCalculateViewport | typeof GetDeepChildrenNodesAndGroups | typeof GetNormalizedConnectorRect | typeof GetNormalizedElementRect | typeof GetNormalizedPoint | typeof SortItemsByParent | typeof UpdateItemAndChildrenLayers | typeof MoveFrontElementsBeforeTargetElement)[];
@@ -4,10 +4,11 @@ export * from './add-connection-to-store';
4
4
  export * from './add-snap-connection-to-store';
5
5
  export * from './create-connection-markers';
6
6
  export * from './redraw-connections';
7
+ export * from './resolve-connection-endpoint-rotation-context';
7
8
  export * from './remove-connection-for-create-from-store';
8
9
  export * from './remove-connection-from-store';
9
10
  export * from './remove-connection-marker-from-store';
10
11
  export * from './remove-connection-waypoint';
11
12
  export * from './remove-snap-connection-from-store';
12
13
  export * from './providers';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWNvbm5lY3Rpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxjQUFjLGtDQUFrQyxDQUFDO0FBRWpELGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUUvQyxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLGNBQWMsc0JBQXNCLENBQUM7QUFFckMsY0FBYywyQ0FBMkMsQ0FBQztBQUUxRCxjQUFjLGdDQUFnQyxDQUFDO0FBRS9DLGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxjQUFjLHFDQUFxQyxDQUFDO0FBRXBELGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hZGQtY29ubmVjdGlvbi1mb3ItY3JlYXRlLXRvLXN0b3JlJztcblxuZXhwb3J0ICogZnJvbSAnLi9hZGQtY29ubmVjdGlvbi1tYXJrZXItdG8tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FkZC1jb25uZWN0aW9uLXRvLXN0b3JlJztcblxuZXhwb3J0ICogZnJvbSAnLi9hZGQtc25hcC1jb25uZWN0aW9uLXRvLXN0b3JlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jcmVhdGUtY29ubmVjdGlvbi1tYXJrZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9yZWRyYXctY29ubmVjdGlvbnMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLWZvci1jcmVhdGUtZnJvbS1zdG9yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24tZnJvbS1zdG9yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24tbWFya2VyLWZyb20tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLXdheXBvaW50JztcblxuZXhwb3J0ICogZnJvbSAnLi9yZW1vdmUtc25hcC1jb25uZWN0aW9uLWZyb20tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVycyc7XG4iXX0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWNvbm5lY3Rpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCxjQUFjLGtDQUFrQyxDQUFDO0FBRWpELGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUUvQyxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLGNBQWMsc0JBQXNCLENBQUM7QUFFckMsY0FBYyxnREFBZ0QsQ0FBQztBQUUvRCxjQUFjLDJDQUEyQyxDQUFDO0FBRTFELGNBQWMsZ0NBQWdDLENBQUM7QUFFL0MsY0FBYyx1Q0FBdUMsQ0FBQztBQUV0RCxjQUFjLDhCQUE4QixDQUFDO0FBRTdDLGNBQWMscUNBQXFDLENBQUM7QUFFcEQsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FkZC1jb25uZWN0aW9uLWZvci1jcmVhdGUtdG8tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FkZC1jb25uZWN0aW9uLW1hcmtlci10by1zdG9yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vYWRkLWNvbm5lY3Rpb24tdG8tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FkZC1zbmFwLWNvbm5lY3Rpb24tdG8tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1jb25uZWN0aW9uLW1hcmtlcnMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JlZHJhdy1jb25uZWN0aW9ucyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLWZvci1jcmVhdGUtZnJvbS1zdG9yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24tZnJvbS1zdG9yZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24tbWFya2VyLWZyb20tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLXdheXBvaW50JztcblxuZXhwb3J0ICogZnJvbSAnLi9yZW1vdmUtc25hcC1jb25uZWN0aW9uLWZyb20tc3RvcmUnO1xuXG5leHBvcnQgKiBmcm9tICcuL3Byb3ZpZGVycyc7XG4iXX0=
@@ -8,6 +8,7 @@ import { RemoveSnapConnectionFromStore } from './remove-snap-connection-from-sto
8
8
  import { AddConnectionMarkerToStore } from './add-connection-marker-to-store';
9
9
  import { RemoveConnectionMarkerFromStore } from './remove-connection-marker-from-store';
10
10
  import { RedrawConnections } from './redraw-connections';
11
+ import { ResolveConnectionEndpointRotationContext } from './resolve-connection-endpoint-rotation-context';
11
12
  import { RemoveConnectionWaypoint } from './remove-connection-waypoint';
12
13
  /**
13
14
  * This file exports all the connection-related features for the F-Flow domain.
@@ -19,10 +20,11 @@ export const F_CONNECTION_FEATURES = [
19
20
  AddSnapConnectionToStore,
20
21
  CreateConnectionMarkers,
21
22
  RedrawConnections,
23
+ ResolveConnectionEndpointRotationContext,
22
24
  RemoveConnectionForCreateFromStore,
23
25
  RemoveConnectionFromStore,
24
26
  RemoveConnectionMarkerFromStore,
25
27
  RemoveSnapConnectionFromStore,
26
28
  RemoveConnectionWaypoint,
27
29
  ];
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1jb25uZWN0aW9uL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV4RTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLDZCQUE2QjtJQUU3QiwwQkFBMEI7SUFFMUIsb0JBQW9CO0lBRXBCLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkIsaUJBQWlCO0lBRWpCLGtDQUFrQztJQUVsQyx5QkFBeUI7SUFFekIsK0JBQStCO0lBRS9CLDZCQUE2QjtJQUU3Qix3QkFBd0I7Q0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyZWF0ZUNvbm5lY3Rpb25NYXJrZXJzIH0gZnJvbSAnLi9jcmVhdGUtY29ubmVjdGlvbi1tYXJrZXJzJztcbmltcG9ydCB7IEFkZENvbm5lY3Rpb25Gb3JDcmVhdGVUb1N0b3JlIH0gZnJvbSAnLi9hZGQtY29ubmVjdGlvbi1mb3ItY3JlYXRlLXRvLXN0b3JlJztcbmltcG9ydCB7IEFkZENvbm5lY3Rpb25Ub1N0b3JlIH0gZnJvbSAnLi9hZGQtY29ubmVjdGlvbi10by1zdG9yZSc7XG5pbXBvcnQgeyBBZGRTbmFwQ29ubmVjdGlvblRvU3RvcmUgfSBmcm9tICcuL2FkZC1zbmFwLWNvbm5lY3Rpb24tdG8tc3RvcmUnO1xuaW1wb3J0IHsgUmVtb3ZlQ29ubmVjdGlvbkZvckNyZWF0ZUZyb21TdG9yZSB9IGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24tZm9yLWNyZWF0ZS1mcm9tLXN0b3JlJztcbmltcG9ydCB7IFJlbW92ZUNvbm5lY3Rpb25Gcm9tU3RvcmUgfSBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLWZyb20tc3RvcmUnO1xuaW1wb3J0IHsgUmVtb3ZlU25hcENvbm5lY3Rpb25Gcm9tU3RvcmUgfSBmcm9tICcuL3JlbW92ZS1zbmFwLWNvbm5lY3Rpb24tZnJvbS1zdG9yZSc7XG5pbXBvcnQgeyBBZGRDb25uZWN0aW9uTWFya2VyVG9TdG9yZSB9IGZyb20gJy4vYWRkLWNvbm5lY3Rpb24tbWFya2VyLXRvLXN0b3JlJztcbmltcG9ydCB7IFJlbW92ZUNvbm5lY3Rpb25NYXJrZXJGcm9tU3RvcmUgfSBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLW1hcmtlci1mcm9tLXN0b3JlJztcbmltcG9ydCB7IFJlZHJhd0Nvbm5lY3Rpb25zIH0gZnJvbSAnLi9yZWRyYXctY29ubmVjdGlvbnMnO1xuaW1wb3J0IHsgUmVtb3ZlQ29ubmVjdGlvbldheXBvaW50IH0gZnJvbSAnLi9yZW1vdmUtY29ubmVjdGlvbi13YXlwb2ludCc7XG5cbi8qKlxuICogVGhpcyBmaWxlIGV4cG9ydHMgYWxsIHRoZSBjb25uZWN0aW9uLXJlbGF0ZWQgZmVhdHVyZXMgZm9yIHRoZSBGLUZsb3cgZG9tYWluLlxuICovXG5leHBvcnQgY29uc3QgRl9DT05ORUNUSU9OX0ZFQVRVUkVTID0gW1xuICBBZGRDb25uZWN0aW9uRm9yQ3JlYXRlVG9TdG9yZSxcblxuICBBZGRDb25uZWN0aW9uTWFya2VyVG9TdG9yZSxcblxuICBBZGRDb25uZWN0aW9uVG9TdG9yZSxcblxuICBBZGRTbmFwQ29ubmVjdGlvblRvU3RvcmUsXG5cbiAgQ3JlYXRlQ29ubmVjdGlvbk1hcmtlcnMsXG5cbiAgUmVkcmF3Q29ubmVjdGlvbnMsXG5cbiAgUmVtb3ZlQ29ubmVjdGlvbkZvckNyZWF0ZUZyb21TdG9yZSxcblxuICBSZW1vdmVDb25uZWN0aW9uRnJvbVN0b3JlLFxuXG4gIFJlbW92ZUNvbm5lY3Rpb25NYXJrZXJGcm9tU3RvcmUsXG5cbiAgUmVtb3ZlU25hcENvbm5lY3Rpb25Gcm9tU3RvcmUsXG5cbiAgUmVtb3ZlQ29ubmVjdGlvbldheXBvaW50LFxuXTtcbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1jb25uZWN0aW9uL3Byb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMxRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV4RTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBQ25DLDZCQUE2QjtJQUU3QiwwQkFBMEI7SUFFMUIsb0JBQW9CO0lBRXBCLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkIsaUJBQWlCO0lBRWpCLHdDQUF3QztJQUV4QyxrQ0FBa0M7SUFFbEMseUJBQXlCO0lBRXpCLCtCQUErQjtJQUUvQiw2QkFBNkI7SUFFN0Isd0JBQXdCO0NBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcmVhdGVDb25uZWN0aW9uTWFya2VycyB9IGZyb20gJy4vY3JlYXRlLWNvbm5lY3Rpb24tbWFya2Vycyc7XG5pbXBvcnQgeyBBZGRDb25uZWN0aW9uRm9yQ3JlYXRlVG9TdG9yZSB9IGZyb20gJy4vYWRkLWNvbm5lY3Rpb24tZm9yLWNyZWF0ZS10by1zdG9yZSc7XG5pbXBvcnQgeyBBZGRDb25uZWN0aW9uVG9TdG9yZSB9IGZyb20gJy4vYWRkLWNvbm5lY3Rpb24tdG8tc3RvcmUnO1xuaW1wb3J0IHsgQWRkU25hcENvbm5lY3Rpb25Ub1N0b3JlIH0gZnJvbSAnLi9hZGQtc25hcC1jb25uZWN0aW9uLXRvLXN0b3JlJztcbmltcG9ydCB7IFJlbW92ZUNvbm5lY3Rpb25Gb3JDcmVhdGVGcm9tU3RvcmUgfSBmcm9tICcuL3JlbW92ZS1jb25uZWN0aW9uLWZvci1jcmVhdGUtZnJvbS1zdG9yZSc7XG5pbXBvcnQgeyBSZW1vdmVDb25uZWN0aW9uRnJvbVN0b3JlIH0gZnJvbSAnLi9yZW1vdmUtY29ubmVjdGlvbi1mcm9tLXN0b3JlJztcbmltcG9ydCB7IFJlbW92ZVNuYXBDb25uZWN0aW9uRnJvbVN0b3JlIH0gZnJvbSAnLi9yZW1vdmUtc25hcC1jb25uZWN0aW9uLWZyb20tc3RvcmUnO1xuaW1wb3J0IHsgQWRkQ29ubmVjdGlvbk1hcmtlclRvU3RvcmUgfSBmcm9tICcuL2FkZC1jb25uZWN0aW9uLW1hcmtlci10by1zdG9yZSc7XG5pbXBvcnQgeyBSZW1vdmVDb25uZWN0aW9uTWFya2VyRnJvbVN0b3JlIH0gZnJvbSAnLi9yZW1vdmUtY29ubmVjdGlvbi1tYXJrZXItZnJvbS1zdG9yZSc7XG5pbXBvcnQgeyBSZWRyYXdDb25uZWN0aW9ucyB9IGZyb20gJy4vcmVkcmF3LWNvbm5lY3Rpb25zJztcbmltcG9ydCB7IFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHQgfSBmcm9tICcuL3Jlc29sdmUtY29ubmVjdGlvbi1lbmRwb2ludC1yb3RhdGlvbi1jb250ZXh0JztcbmltcG9ydCB7IFJlbW92ZUNvbm5lY3Rpb25XYXlwb2ludCB9IGZyb20gJy4vcmVtb3ZlLWNvbm5lY3Rpb24td2F5cG9pbnQnO1xuXG4vKipcbiAqIFRoaXMgZmlsZSBleHBvcnRzIGFsbCB0aGUgY29ubmVjdGlvbi1yZWxhdGVkIGZlYXR1cmVzIGZvciB0aGUgRi1GbG93IGRvbWFpbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEZfQ09OTkVDVElPTl9GRUFUVVJFUyA9IFtcbiAgQWRkQ29ubmVjdGlvbkZvckNyZWF0ZVRvU3RvcmUsXG5cbiAgQWRkQ29ubmVjdGlvbk1hcmtlclRvU3RvcmUsXG5cbiAgQWRkQ29ubmVjdGlvblRvU3RvcmUsXG5cbiAgQWRkU25hcENvbm5lY3Rpb25Ub1N0b3JlLFxuXG4gIENyZWF0ZUNvbm5lY3Rpb25NYXJrZXJzLFxuXG4gIFJlZHJhd0Nvbm5lY3Rpb25zLFxuXG4gIFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHQsXG5cbiAgUmVtb3ZlQ29ubmVjdGlvbkZvckNyZWF0ZUZyb21TdG9yZSxcblxuICBSZW1vdmVDb25uZWN0aW9uRnJvbVN0b3JlLFxuXG4gIFJlbW92ZUNvbm5lY3Rpb25NYXJrZXJGcm9tU3RvcmUsXG5cbiAgUmVtb3ZlU25hcENvbm5lY3Rpb25Gcm9tU3RvcmUsXG5cbiAgUmVtb3ZlQ29ubmVjdGlvbldheXBvaW50LFxuXTtcbiJdfQ==
@@ -7,6 +7,7 @@ import { CreateConnectionMarkersRequest } from '../create-connection-markers';
7
7
  import { ConnectionBehaviourBuilder, ConnectionBehaviourBuilderRequest, } from '../../../f-connection-v2';
8
8
  import { BrowserService } from '@foblex/platform';
9
9
  import { CalculateConnectionsUsingConnectionWorkerRequest, ResolveConnectionWorkerConnectorsRequest, ResolveConnectionWorkerContextRequest, ShouldUseConnectionWorkerRequest, } from '../../../f-connection-worker';
10
+ import { ResolveConnectionEndpointRotationContextRequest, } from '../resolve-connection-endpoint-rotation-context';
10
11
  import * as i0 from "@angular/core";
11
12
  const CONNECTIONS_PER_SLICE_LIMIT = 500;
12
13
  const SLICE_BUDGET_MS = 6;
@@ -74,7 +75,10 @@ let RedrawConnections = class RedrawConnections {
74
75
  connection.isSelected() ? connection.markAsSelected() : null;
75
76
  }
76
77
  _calculateConnectionLine(connection, context) {
77
- return this._connectionBehaviour.handle(new ConnectionBehaviourBuilderRequest(context.sourceRect, context.targetRect, connection, context.source.fConnectableSide, context.target.fConnectableSide));
78
+ return this._connectionBehaviour.handle(new ConnectionBehaviourBuilderRequest(context.sourceRect, context.targetRect, connection, context.source.fConnectableSide, context.target.fConnectableSide, this._resolveRotationContext(context.source), this._resolveRotationContext(context.target)));
79
+ }
80
+ _resolveRotationContext(connector) {
81
+ return this._mediator.execute(new ResolveConnectionEndpointRotationContextRequest(connector));
78
82
  }
79
83
  _resolveConnectionConnectors(connection) {
80
84
  return this._mediator.execute(new ResolveConnectionWorkerConnectorsRequest(connection));
@@ -262,4 +266,4 @@ function serializeContents(contents) {
262
266
  })
263
267
  .join(';');
264
268
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcmF3LWNvbm5lY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1jb25uZWN0aW9uL3JlZHJhdy1jb25uZWN0aW9ucy9yZWRyYXctY29ubmVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGlDQUFpQyxHQUlsQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsZ0RBQWdELEVBSWhELHdDQUF3QyxFQUN4QyxxQ0FBcUMsRUFDckMsZ0NBQWdDLEdBQ2pDLE1BQU0sOEJBQThCLENBQUM7O0FBRXRDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBQ3hDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQjs7OztHQUlHO0FBR0ksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7SUFDWCxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNsQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMxRCxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FB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RUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDL0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBc0I7SUFDNUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pDLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFNBQXFDO0lBQy9ELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsUUFBMkM7SUFDcEUsT0FBTyxRQUFRO1NBQ1osR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDZixPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElMaW5lLCBJUm91bmRlZFJlY3QgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkcmF3Q29ubmVjdGlvbnNSZXF1ZXN0IH0gZnJvbSAnLi9yZWRyYXctY29ubmVjdGlvbnMtcmVxdWVzdCc7XG5pbXBvcnQgeyBGQ29tcG9uZW50c1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IEZDb25uZWN0b3JCYXNlIH0gZnJvbSAnLi4vLi4vLi4vZi1jb25uZWN0b3JzJztcbmltcG9ydCB7IEZFeGVjdXRpb25SZWdpc3RlciwgRk1lZGlhdG9yLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBDcmVhdGVDb25uZWN0aW9uTWFya2Vyc1JlcXVlc3QgfSBmcm9tICcuLi9jcmVhdGUtY29ubmVjdGlvbi1tYXJrZXJzJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25CZWhhdmlvdXJCdWlsZGVyLFxuICBDb25uZWN0aW9uQmVoYXZpb3VyQnVpbGRlclJlcXVlc3QsXG4gIEVGQ29ubmVjdGFibGVTaWRlLFxuICBGQ29ubmVjdGlvbkJhc2UsXG4gIEZDb25uZWN0aW9uQ29udGVudEJhc2UsXG59IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdGlvbi12Mic7XG5pbXBvcnQgeyBCcm93c2VyU2VydmljZSB9IGZyb20gJ0Bmb2JsZXgvcGxhdGZvcm0nO1xuaW1wb3J0IHtcbiAgQ2FsY3VsYXRlQ29ubmVjdGlvbnNVc2luZ0Nvbm5lY3Rpb25Xb3JrZXJSZXF1ZXN0LFxuICBJRkNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzLFxuICBJRkNvbm5lY3Rpb25Xb3JrZXJDb250ZXh0LFxuICBJRkNvbm5lY3Rpb25Xb3JrZXJSZXN1bHRJdGVtLFxuICBSZXNvbHZlQ29ubmVjdGlvbldvcmtlckNvbm5lY3RvcnNSZXF1ZXN0LFxuICBSZXNvbHZlQ29ubmVjdGlvbldvcmtlckNvbnRleHRSZXF1ZXN0LFxuICBTaG91bGRVc2VDb25uZWN0aW9uV29ya2VyUmVxdWVzdCxcbn0gZnJvbSAnLi4vLi4vLi4vZi1jb25uZWN0aW9uLXdvcmtlcic7XG5cbmNvbnN0IENPTk5FQ1RJT05TX1BFUl9TTElDRV9MSU1JVCA9IDUwMDtcbmNvbnN0IFNMSUNFX0JVREdFVF9NUyA9IDY7XG5cbi8qKlxuICogRXhlY3V0aW9uIHRoYXQgcmVkcmF3cyBjb25uZWN0aW9ucyBpbiB0aGUgRkNvbXBvbmVudHNTdG9yZS5cbiAqIEl0IHJlc2V0cyBjb25uZWN0b3JzLCBzZXRzIG1hcmtlcnMgZm9yIHRlbXBvcmFyeSBhbmQgc25hcCBjb25uZWN0aW9ucyxcbiAqIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb25zIGJhc2VkIG9uIHRoZSBzdG9yZWQgb3V0cHV0cyBhbmQgaW5wdXRzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5ARkV4ZWN1dGlvblJlZ2lzdGVyKFJlZHJhd0Nvbm5lY3Rpb25zUmVxdWVzdClcbmV4cG9ydCBjbGFzcyBSZWRyYXdDb25uZWN0aW9ucyBpbXBsZW1lbnRzIElFeGVjdXRpb248UmVkcmF3Q29ubmVjdGlvbnNSZXF1ZXN0LCB2b2lkPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0b3JlID0gaW5qZWN0KEZDb21wb25lbnRzU3RvcmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25uZWN0aW9uQmVoYXZpb3VyID0gaW5qZWN0KENvbm5lY3Rpb25CZWhhdmlvdXJCdWlsZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnJvd3NlciA9IGluamVjdChCcm93c2VyU2VydmljZSk7XG5cbiAgcHJpdmF0ZSBfcmVuZGVyVGlja2V0ID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29ubmVjdGVkSW5QcmV2aW91c1JlbmRlciA9IG5ldyBTZXQ8RkNvbm5lY3RvckJhc2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nvbm5lY3Rpb25SZW5kZXJDYWNoZSA9IG5ldyBXZWFrTWFwPFxuICAgIEZDb25uZWN0aW9uQmFzZSxcbiAgICB7IHNpZ25hdHVyZTogc3RyaW5nOyBwYXRoRWxlbWVudDogU1ZHRWxlbWVudCB9XG4gID4oKTtcblxuICBwdWJsaWMgaGFuZGxlKF9yZXF1ZXN0OiBSZWRyYXdDb25uZWN0aW9uc1JlcXVlc3QpOiB2b2lkIHtcbiAgICBjb25zdCByZW5kZXJUaWNrZXQgPSArK3RoaXMuX3JlbmRlclRpY2tldDtcbiAgICBjb25zdCBub2Rlc1JldmlzaW9uID0gdGhpcy5fc3RvcmUubm9kZXNSZXZpc2lvbjtcbiAgICB0aGlzLl9yZXNldENvbm5lY3RlZENvbm5lY3RvcnMoKTtcblxuICAgIGNvbnN0IGluc3RhbmNlRm9yQ3JlYXRlID0gdGhpcy5fc3RvcmUuY29ubmVjdGlvbnMuZ2V0Rm9yQ3JlYXRlKCk7XG4gICAgaWYgKGluc3RhbmNlRm9yQ3JlYXRlKSB7XG4gICAgICB0aGlzLl9jcmVhdGVNYXJrZXJzKGluc3RhbmNlRm9yQ3JlYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZUZvclNuYXAgPSB0aGlzLl9zdG9yZS5jb25uZWN0aW9ucy5nZXRGb3JTbmFwKCk7XG4gICAgaWYgKGluc3RhbmNlRm9yU25hcCkge1xuICAgICAgdGhpcy5fY3JlYXRlTWFya2VycyhpbnN0YW5jZUZvclNuYXApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX3N0b3JlLmNvbm5lY3Rpb25zLmdldEFsbCgpXTtcbiAgICBjb25zdCBjb25uZWN0b3JSZWN0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgSVJvdW5kZWRSZWN0PigpO1xuXG4gICAgaWYgKHRoaXMuX3Nob3VsZFVzZVdvcmtlcihjb25uZWN0aW9ucy5sZW5ndGgpKSB7XG4gICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25zVXNpbmdXb3JrZXIoXG4gICAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgICBjb25uZWN0b3JSZWN0Q2FjaGUsXG4gICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgbm9kZXNSZXZpc2lvbixcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uc0NodW5rZWQoY29ubmVjdGlvbnMsIGNvbm5lY3RvclJlY3RDYWNoZSwgMCwgcmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2V0Q29ubmVjdGVkQ29ubmVjdG9ycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZEluUHJldmlvdXNSZW5kZXIuc2l6ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29ubmVjdG9yIG9mIHRoaXMuX2Nvbm5lY3RlZEluUHJldmlvdXNSZW5kZXIpIHtcbiAgICAgIGNvbm5lY3Rvci5yZXNldENvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIHRoaXMuX2Nvbm5lY3RlZEluUHJldmlvdXNSZW5kZXIuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQ29ubmVjdGlvbihjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsIGNhY2hlOiBNYXA8c3RyaW5nLCBJUm91bmRlZFJlY3Q+KTogdm9pZCB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3Jlc29sdmVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uLCBjYWNoZSk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2NhbGN1bGF0ZUNvbm5lY3Rpb25MaW5lKGNvbm5lY3Rpb24sIGNvbnRleHQpO1xuXG4gICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uV2l0aExpbmUoY29ubmVjdGlvbiwgY29udGV4dC5zb3VyY2UsIGNvbnRleHQudGFyZ2V0LCBsaW5lKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQ29ubmVjdGlvbldpdGhMaW5lKFxuICAgIGNvbm5lY3Rpb246IEZDb25uZWN0aW9uQmFzZSxcbiAgICBzb3VyY2U6IEZDb25uZWN0b3JCYXNlLFxuICAgIHRhcmdldDogRkNvbm5lY3RvckJhc2UsXG4gICAgbGluZTogSUxpbmUsXG4gICk6IHZvaWQge1xuICAgIHNvdXJjZS5zZXRDb25uZWN0ZWQodGFyZ2V0KTtcbiAgICB0YXJnZXQuc2V0Q29ubmVjdGVkKHNvdXJjZSk7XG4gICAgdGhpcy5fY29ubmVjdGVkSW5QcmV2aW91c1JlbmRlci5hZGQoc291cmNlKTtcbiAgICB0aGlzLl9jb25uZWN0ZWRJblByZXZpb3VzUmVuZGVyLmFkZCh0YXJnZXQpO1xuXG4gICAgY29uc3QgbWFya2Vyc0NoYW5nZWQgPSB0aGlzLl9jcmVhdGVNYXJrZXJzKGNvbm5lY3Rpb24pO1xuICAgIGlmICghbWFya2Vyc0NoYW5nZWQgJiYgIXRoaXMuX3Nob3VsZFJlZHJhd0Nvbm5lY3Rpb24oY29ubmVjdGlvbiwgbGluZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25uZWN0aW9uLnNldExpbmUobGluZSk7XG4gICAgY29ubmVjdGlvbi5pbml0aWFsaXplKCk7XG4gICAgY29ubmVjdGlvbi5pc1NlbGVjdGVkKCkgPyBjb25uZWN0aW9uLm1hcmtBc1NlbGVjdGVkKCkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlQ29ubmVjdGlvbkxpbmUoXG4gICAgY29ubmVjdGlvbjogRkNvbm5lY3Rpb25CYXNlLFxuICAgIGNvbnRleHQ6IElGQ29ubmVjdGlvbldvcmtlckNvbnRleHQsXG4gICk6IElMaW5lIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkJlaGF2aW91ci5oYW5kbGUoXG4gICAgICBuZXcgQ29ubmVjdGlvbkJlaGF2aW91ckJ1aWxkZXJSZXF1ZXN0KFxuICAgICAgICBjb250ZXh0LnNvdXJjZVJlY3QsXG4gICAgICAgIGNvbnRleHQudGFyZ2V0UmVjdCxcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgY29udGV4dC5zb3VyY2UuZkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICAgY29udGV4dC50YXJnZXQuZkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVDb25uZWN0aW9uQ29ubmVjdG9ycyhcbiAgICBjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsXG4gICk6IElGQ29ubmVjdGlvbldvcmtlckNvbm5lY3RvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZTxJRkNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzIHwgbnVsbD4oXG4gICAgICBuZXcgUmVzb2x2ZUNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzUmVxdWVzdChjb25uZWN0aW9uKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUNvbm5lY3Rpb25Db250ZXh0KFxuICAgIGNvbm5lY3Rpb246IEZDb25uZWN0aW9uQmFzZSxcbiAgICBjYWNoZTogTWFwPHN0cmluZywgSVJvdW5kZWRSZWN0PixcbiAgKTogSUZDb25uZWN0aW9uV29ya2VyQ29udGV4dCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYXRvci5leGVjdXRlPElGQ29ubmVjdGlvbldvcmtlckNvbnRleHQgfCBudWxsPihcbiAgICAgIG5ldyBSZXNvbHZlQ29ubmVjdGlvbldvcmtlckNvbnRleHRSZXF1ZXN0KGNvbm5lY3Rpb24sIGNhY2hlKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTWFya2Vycyhjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZTxib29sZWFuPihuZXcgQ3JlYXRlQ29ubmVjdGlvbk1hcmtlcnNSZXF1ZXN0KGNvbm5lY3Rpb24pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Nob3VsZFJlZHJhd0Nvbm5lY3Rpb24oY29ubmVjdGlvbjogRkNvbm5lY3Rpb25CYXNlLCBsaW5lOiBJTGluZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gY29ubmVjdGlvbi5mUGF0aCgpLmhvc3RFbGVtZW50O1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNyZWF0ZUNvbm5lY3Rpb25SZW5kZXJTaWduYXR1cmUoY29ubmVjdGlvbiwgbGluZSk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fY29ubmVjdGlvblJlbmRlckNhY2hlLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoY2FjaGVkPy5zaWduYXR1cmUgPT09IHNpZ25hdHVyZSAmJiBjYWNoZWQucGF0aEVsZW1lbnQgPT09IHBhdGhFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdGlvblJlbmRlckNhY2hlLnNldChjb25uZWN0aW9uLCB7IHNpZ25hdHVyZSwgcGF0aEVsZW1lbnQgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQ29ubmVjdGlvbnNVc2luZ1dvcmtlcihcbiAgICBjb25uZWN0aW9uczogcmVhZG9ubHkgRkNvbm5lY3Rpb25CYXNlW10sXG4gICAgY29ubmVjdG9yUmVjdENhY2hlOiBNYXA8c3RyaW5nLCBJUm91bmRlZFJlY3Q+LFxuICAgIHJlbmRlclRpY2tldDogbnVtYmVyLFxuICAgIG5vZGVzUmV2aXNpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fbWVkaWF0b3JcbiAgICAgIC5leGVjdXRlPFByb21pc2U8cmVhZG9ubHkgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbVtdIHwgbnVsbD4+KFxuICAgICAgICBuZXcgQ2FsY3VsYXRlQ29ubmVjdGlvbnNVc2luZ0Nvbm5lY3Rpb25Xb3JrZXJSZXF1ZXN0KGNvbm5lY3Rpb25zLCBjb25uZWN0b3JSZWN0Q2FjaGUpLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdHMpIHtcbiAgICAgICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25zQ2h1bmtlZChcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgICAgICAgY29ubmVjdG9yUmVjdENhY2hlLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgICAgIG5vZGVzUmV2aXNpb24sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdvcmtlclJlc3VsdHMgPSB0aGlzLl9hbGlnbldvcmtlclJlc3VsdHNUb0Nvbm5lY3Rpb25JbmRleGVzKFxuICAgICAgICAgIHJlc3VsdHMsXG4gICAgICAgICAgY29ubmVjdGlvbnMubGVuZ3RoLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2FwcGx5V29ya2VyUmVzdWx0c0NodW5rZWQoXG4gICAgICAgICAgY29ubmVjdGlvbnMsXG4gICAgICAgICAgd29ya2VyUmVzdWx0cyxcbiAgICAgICAgICBjb25uZWN0b3JSZWN0Q2FjaGUsXG4gICAgICAgICAgMCxcbiAgICAgICAgICByZW5kZXJUaWNrZXQsXG4gICAgICAgICAgbm9kZXNSZXZpc2lvbixcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbnNDaHVua2VkKFxuICAgICAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgICAgIGNvbm5lY3RvclJlY3RDYWNoZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgICBub2Rlc1JldmlzaW9uLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVdvcmtlclJlc3VsdHNDaHVua2VkKFxuICAgIGNvbm5lY3Rpb25zOiByZWFkb25seSBGQ29ubmVjdGlvbkJhc2VbXSxcbiAgICB3b3JrZXJSZXN1bHRzOiByZWFkb25seSAoSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSB8IHVuZGVmaW5lZClbXSxcbiAgICBjb25uZWN0b3JSZWN0Q2FjaGU6IE1hcDxzdHJpbmcsIElSb3VuZGVkUmVjdD4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHJlbmRlclRpY2tldDogbnVtYmVyLFxuICAgIG5vZGVzUmV2aXNpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZVN0YXJ0ID0gdGhpcy5fbm93KCk7XG4gICAgbGV0IGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgIHdoaWxlIChcbiAgICAgIGVuZEluZGV4IDwgY29ubmVjdGlvbnMubGVuZ3RoICYmXG4gICAgICBwcm9jZXNzZWQgPCBDT05ORUNUSU9OU19QRVJfU0xJQ0VfTElNSVQgJiZcbiAgICAgIHRoaXMuX2lzV2l0aGluU2xpY2VCdWRnZXQoc2xpY2VTdGFydClcbiAgICApIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tlbmRJbmRleF07XG4gICAgICBjb25zdCByZXN1bHQgPSB3b3JrZXJSZXN1bHRzW2VuZEluZGV4XTtcblxuICAgICAgaWYgKHRoaXMuX2lzV29ya2VyUmVzdWx0U3VwcG9ydGVkKHJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdG9ycyA9IHRoaXMuX3Jlc29sdmVDb25uZWN0aW9uQ29ubmVjdG9ycyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb25uZWN0b3JzKSB7XG4gICAgICAgICAgZW5kSW5kZXgrKztcbiAgICAgICAgICBwcm9jZXNzZWQrKztcblxuICAgICAgICAgIGlmICghdGhpcy5faXNDdXJyZW50UmVuZGVyQ29udGV4dChyZW5kZXJUaWNrZXQsIG5vZGVzUmV2aXNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25uZWN0aW9uLl9hcHBseVJlc29sdmVkU2lkZXNUb0Nvbm5lY3Rpb24oXG4gICAgICAgICAgICByZXN1bHQuc291cmNlU2lkZSBhcyBFRkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICAgICAgIHJlc3VsdC50YXJnZXRTaWRlIGFzIEVGQ29ubmVjdGFibGVTaWRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uV2l0aExpbmUoXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgY29ubmVjdG9ycy5zb3VyY2UsXG4gICAgICAgICAgICBjb25uZWN0b3JzLnRhcmdldCxcbiAgICAgICAgICAgIHJlc3VsdC5saW5lLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbihjb25uZWN0aW9uLCBjb25uZWN0b3JSZWN0Q2FjaGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb24oY29ubmVjdGlvbiwgY29ubmVjdG9yUmVjdENhY2hlKTtcbiAgICAgIH1cblxuICAgICAgZW5kSW5kZXgrKztcbiAgICAgIHByb2Nlc3NlZCsrO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZEluZGV4ID49IGNvbm5lY3Rpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PlxuICAgICAgdGhpcy5fYXBwbHlXb3JrZXJSZXN1bHRzQ2h1bmtlZChcbiAgICAgICAgY29ubmVjdGlvbnMsXG4gICAgICAgIHdvcmtlclJlc3VsdHMsXG4gICAgICAgIGNvbm5lY3RvclJlY3RDYWNoZSxcbiAgICAgICAgZW5kSW5kZXgsXG4gICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgbm9kZXNSZXZpc2lvbixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduV29ya2VyUmVzdWx0c1RvQ29ubmVjdGlvbkluZGV4ZXMoXG4gICAgcmVzdWx0czogcmVhZG9ubHkgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbVtdLFxuICAgIGNvbm5lY3Rpb25Db3VudDogbnVtYmVyLFxuICApOiAoSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSB8IHVuZGVmaW5lZClbXSB7XG4gICAgY29uc3QgYWxpZ25lZDogKElGQ29ubmVjdGlvbldvcmtlclJlc3VsdEl0ZW0gfCB1bmRlZmluZWQpW10gPSBuZXcgQXJyYXkoY29ubmVjdGlvbkNvdW50KTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVzdWx0Lm9yaWdpbmFsSW5kZXg7XG4gICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjb25uZWN0aW9uQ291bnQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFsaWduZWRbaW5kZXhdID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBhbGlnbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNXb3JrZXJSZXN1bHRTdXBwb3J0ZWQoXG4gICAgcmVzdWx0OiBJRkNvbm5lY3Rpb25Xb3JrZXJSZXN1bHRJdGVtIHwgdW5kZWZpbmVkLFxuICApOiByZXN1bHQgaXMgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSAmIHtcbiAgICBzb3VyY2VTaWRlOiBzdHJpbmc7XG4gICAgdGFyZ2V0U2lkZTogc3RyaW5nO1xuICAgIGxpbmU6IElMaW5lO1xuICB9IHtcbiAgICByZXR1cm4gISEocmVzdWx0Py5zdXBwb3J0ZWQgJiYgcmVzdWx0LnNvdXJjZVNpZGUgJiYgcmVzdWx0LnRhcmdldFNpZGUgJiYgcmVzdWx0LmxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBDb25uZWN0aW9uc0NodW5rZWQoXG4gICAgY29ubmVjdGlvbnM6IHJlYWRvbmx5IEZDb25uZWN0aW9uQmFzZVtdLFxuICAgIGNvbm5lY3RvclJlY3RDYWNoZTogTWFwPHN0cmluZywgSVJvdW5kZWRSZWN0PixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgcmVuZGVyVGlja2V0OiBudW1iZXIsXG4gICAgbm9kZXNSZXZpc2lvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlU3RhcnQgPSB0aGlzLl9ub3coKTtcbiAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuXG4gICAgd2hpbGUgKFxuICAgICAgZW5kSW5kZXggPCBjb25uZWN0aW9ucy5sZW5ndGggJiZcbiAgICAgIHByb2Nlc3NlZCA8IENPTk5FQ1RJT05TX1BFUl9TTElDRV9MSU1JVCAmJlxuICAgICAgdGhpcy5faXNXaXRoaW5TbGljZUJ1ZGdldChzbGljZVN0YXJ0KVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2VuZEluZGV4XSwgY29ubmVjdG9yUmVjdENhY2hlKTtcbiAgICAgIGVuZEluZGV4Kys7XG4gICAgICBwcm9jZXNzZWQrKztcblxuICAgICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmRJbmRleCA+PSBjb25uZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbnNDaHVua2VkKFxuICAgICAgICBjb25uZWN0aW9ucyxcbiAgICAgICAgY29ubmVjdG9yUmVjdENhY2hlLFxuICAgICAgICBlbmRJbmRleCxcbiAgICAgICAgcmVuZGVyVGlja2V0LFxuICAgICAgICBub2Rlc1JldmlzaW9uLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2hvdWxkVXNlV29ya2VyKGNvbm5lY3Rpb25Db3VudDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhdG9yLmV4ZWN1dGU8Ym9vbGVhbj4obmV3IFNob3VsZFVzZUNvbm5lY3Rpb25Xb3JrZXJSZXF1ZXN0KGNvbm5lY3Rpb25Db3VudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDdXJyZW50UmVuZGVyQ29udGV4dChyZW5kZXJUaWNrZXQ6IG51bWJlciwgbm9kZXNSZXZpc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlbmRlclRpY2tldCA9PT0gdGhpcy5fcmVuZGVyVGlja2V0ICYmIG5vZGVzUmV2aXNpb24gPT09IHRoaXMuX3N0b3JlLm5vZGVzUmV2aXNpb247XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB0aGlzLl9icm93c2VyLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIGlmICghd2luZG93UmVmKSB7XG4gICAgICBjYWxsYmFjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93UmVmLnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIF9ub3coKTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJmb3JtYW5jZVJlZiA9IHRoaXMuX2Jyb3dzZXIuZG9jdW1lbnQuZGVmYXVsdFZpZXc/LnBlcmZvcm1hbmNlO1xuXG4gICAgcmV0dXJuIHBlcmZvcm1hbmNlUmVmID8gcGVyZm9ybWFuY2VSZWYubm93KCkgOiBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNXaXRoaW5TbGljZUJ1ZGdldChzbGljZVN0YXJ0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2Jyb3dzZXIuaXNCcm93c2VyKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ub3coKSAtIHNsaWNlU3RhcnQgPCBTTElDRV9CVURHRVRfTVM7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvblJlbmRlclNpZ25hdHVyZShjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsIGxpbmU6IElMaW5lKTogc3RyaW5nIHtcbiAgY29uc3QgeyBzb3VyY2VTaWRlLCB0YXJnZXRTaWRlIH0gPSBjb25uZWN0aW9uLmdldFJlc29sdmVkU2lkZXMoKTtcblxuICByZXR1cm4gW1xuICAgIGNvbm5lY3Rpb24uZkJlaGF2aW9yLFxuICAgIGNvbm5lY3Rpb24uZlR5cGUsXG4gICAgY29ubmVjdGlvbi5mUmFkaXVzLFxuICAgIGNvbm5lY3Rpb24uZk9mZnNldCxcbiAgICBjb25uZWN0aW9uLmZSZWFzc2lnbmFibGVTdGFydCgpLFxuICAgIHNlcmlhbGl6ZUNvbnRlbnRzKGNvbm5lY3Rpb24uZkNvbnRlbnRzKCkgfHwgW10pLFxuICAgIHNvdXJjZVNpZGUsXG4gICAgdGFyZ2V0U2lkZSxcbiAgICBzZXJpYWxpemVQb2ludChsaW5lLnBvaW50MSksXG4gICAgc2VyaWFsaXplUG9pbnQobGluZS5wb2ludDIpLFxuICAgIHNlcmlhbGl6ZVdheXBvaW50cyhjb25uZWN0aW9uLmZXYXlwb2ludHMoKT8ud2F5cG9pbnRzKCkgfHwgW10pLFxuICBdLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUG9pbnQocG9pbnQ6IElMaW5lWydwb2ludDEnXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtwb2ludC54fToke3BvaW50Lnl9YDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplV2F5cG9pbnRzKHdheXBvaW50czogcmVhZG9ubHkgSUxpbmVbJ3BvaW50MSddW10pOiBzdHJpbmcge1xuICByZXR1cm4gd2F5cG9pbnRzLm1hcChzZXJpYWxpemVQb2ludCkuam9pbignOycpO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVDb250ZW50cyhjb250ZW50czogcmVhZG9ubHkgRkNvbm5lY3Rpb25Db250ZW50QmFzZVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRzXG4gICAgLm1hcCgoY29udGVudCkgPT4ge1xuICAgICAgcmV0dXJuIFtjb250ZW50LnBvc2l0aW9uKCksIGNvbnRlbnQub2Zmc2V0KCksIGNvbnRlbnQuYWxpZ24oKV0uam9pbignOicpO1xuICAgIH0pXG4gICAgLmpvaW4oJzsnKTtcbn1cbiJdfQ==
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkcmF3LWNvbm5lY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kb21haW4vZi1jb25uZWN0aW9uL3JlZHJhdy1jb25uZWN0aW9ucy9yZWRyYXctY29ubmVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXRELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGlDQUFpQyxHQUlsQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsZ0RBQWdELEVBSWhELHdDQUF3QyxFQUN4QyxxQ0FBcUMsRUFDckMsZ0NBQWdDLEdBQ2pDLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUNMLCtDQUErQyxHQUVoRCxNQUFNLGlEQUFpRCxDQUFDOztBQUV6RCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztBQUN4QyxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFFMUI7Ozs7R0FJRztBQUdJLElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWlCO0lBQ1gsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbEMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLDBCQUEw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QUs7UUFDaEIsVUFBVSxDQUFDLE9BQU87UUFDbEIsVUFBVSxDQUFDLE9BQU87UUFDbEIsVUFBVSxDQUFDLGtCQUFrQixFQUFFO1FBQy9CLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsVUFBVTtRQUNWLFVBQVU7UUFDVixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixrQkFBa0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO0tBQy9ELENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQXNCO0lBQzVDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxTQUFxQztJQUMvRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFFBQTJDO0lBQ3BFLE9BQU8sUUFBUTtTQUNaLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJTGluZSwgSVJvdW5kZWRSZWN0IH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlZHJhd0Nvbm5lY3Rpb25zUmVxdWVzdCB9IGZyb20gJy4vcmVkcmF3LWNvbm5lY3Rpb25zLXJlcXVlc3QnO1xuaW1wb3J0IHsgRkNvbXBvbmVudHNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL2Ytc3RvcmFnZSc7XG5pbXBvcnQgeyBGQ29ubmVjdG9yQmFzZSB9IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdG9ycyc7XG5pbXBvcnQgeyBGRXhlY3V0aW9uUmVnaXN0ZXIsIEZNZWRpYXRvciwgSUV4ZWN1dGlvbiB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgQ3JlYXRlQ29ubmVjdGlvbk1hcmtlcnNSZXF1ZXN0IH0gZnJvbSAnLi4vY3JlYXRlLWNvbm5lY3Rpb24tbWFya2Vycyc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uQmVoYXZpb3VyQnVpbGRlcixcbiAgQ29ubmVjdGlvbkJlaGF2aW91ckJ1aWxkZXJSZXF1ZXN0LFxuICBFRkNvbm5lY3RhYmxlU2lkZSxcbiAgRkNvbm5lY3Rpb25CYXNlLFxuICBGQ29ubmVjdGlvbkNvbnRlbnRCYXNlLFxufSBmcm9tICcuLi8uLi8uLi9mLWNvbm5lY3Rpb24tdjInO1xuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICdAZm9ibGV4L3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIENhbGN1bGF0ZUNvbm5lY3Rpb25zVXNpbmdDb25uZWN0aW9uV29ya2VyUmVxdWVzdCxcbiAgSUZDb25uZWN0aW9uV29ya2VyQ29ubmVjdG9ycyxcbiAgSUZDb25uZWN0aW9uV29ya2VyQ29udGV4dCxcbiAgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSxcbiAgUmVzb2x2ZUNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzUmVxdWVzdCxcbiAgUmVzb2x2ZUNvbm5lY3Rpb25Xb3JrZXJDb250ZXh0UmVxdWVzdCxcbiAgU2hvdWxkVXNlQ29ubmVjdGlvbldvcmtlclJlcXVlc3QsXG59IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdGlvbi13b3JrZXInO1xuaW1wb3J0IHtcbiAgUmVzb2x2ZUNvbm5lY3Rpb25FbmRwb2ludFJvdGF0aW9uQ29udGV4dFJlcXVlc3QsXG4gIFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2UsXG59IGZyb20gJy4uL3Jlc29sdmUtY29ubmVjdGlvbi1lbmRwb2ludC1yb3RhdGlvbi1jb250ZXh0JztcblxuY29uc3QgQ09OTkVDVElPTlNfUEVSX1NMSUNFX0xJTUlUID0gNTAwO1xuY29uc3QgU0xJQ0VfQlVER0VUX01TID0gNjtcblxuLyoqXG4gKiBFeGVjdXRpb24gdGhhdCByZWRyYXdzIGNvbm5lY3Rpb25zIGluIHRoZSBGQ29tcG9uZW50c1N0b3JlLlxuICogSXQgcmVzZXRzIGNvbm5lY3RvcnMsIHNldHMgbWFya2VycyBmb3IgdGVtcG9yYXJ5IGFuZCBzbmFwIGNvbm5lY3Rpb25zLFxuICogYW5kIHNldHMgdXAgY29ubmVjdGlvbnMgYmFzZWQgb24gdGhlIHN0b3JlZCBvdXRwdXRzIGFuZCBpbnB1dHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbkBGRXhlY3V0aW9uUmVnaXN0ZXIoUmVkcmF3Q29ubmVjdGlvbnNSZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIFJlZHJhd0Nvbm5lY3Rpb25zIGltcGxlbWVudHMgSUV4ZWN1dGlvbjxSZWRyYXdDb25uZWN0aW9uc1JlcXVlc3QsIHZvaWQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RvcmUgPSBpbmplY3QoRkNvbXBvbmVudHNTdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Nvbm5lY3Rpb25CZWhhdmlvdXIgPSBpbmplY3QoQ29ubmVjdGlvbkJlaGF2aW91ckJ1aWxkZXIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9icm93c2VyID0gaW5qZWN0KEJyb3dzZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIF9yZW5kZXJUaWNrZXQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25uZWN0ZWRJblByZXZpb3VzUmVuZGVyID0gbmV3IFNldDxGQ29ubmVjdG9yQmFzZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29ubmVjdGlvblJlbmRlckNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgRkNvbm5lY3Rpb25CYXNlLFxuICAgIHsgc2lnbmF0dXJlOiBzdHJpbmc7IHBhdGhFbGVtZW50OiBTVkdFbGVtZW50IH1cbiAgPigpO1xuXG4gIHB1YmxpYyBoYW5kbGUoX3JlcXVlc3Q6IFJlZHJhd0Nvbm5lY3Rpb25zUmVxdWVzdCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmRlclRpY2tldCA9ICsrdGhpcy5fcmVuZGVyVGlja2V0O1xuICAgIGNvbnN0IG5vZGVzUmV2aXNpb24gPSB0aGlzLl9zdG9yZS5ub2Rlc1JldmlzaW9uO1xuICAgIHRoaXMuX3Jlc2V0Q29ubmVjdGVkQ29ubmVjdG9ycygpO1xuXG4gICAgY29uc3QgaW5zdGFuY2VGb3JDcmVhdGUgPSB0aGlzLl9zdG9yZS5jb25uZWN0aW9ucy5nZXRGb3JDcmVhdGUoKTtcbiAgICBpZiAoaW5zdGFuY2VGb3JDcmVhdGUpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZU1hcmtlcnMoaW5zdGFuY2VGb3JDcmVhdGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlRm9yU25hcCA9IHRoaXMuX3N0b3JlLmNvbm5lY3Rpb25zLmdldEZvclNuYXAoKTtcbiAgICBpZiAoaW5zdGFuY2VGb3JTbmFwKSB7XG4gICAgICB0aGlzLl9jcmVhdGVNYXJrZXJzKGluc3RhbmNlRm9yU25hcCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fc3RvcmUuY29ubmVjdGlvbnMuZ2V0QWxsKCldO1xuICAgIGNvbnN0IGNvbm5lY3RvclJlY3RDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBJUm91bmRlZFJlY3Q+KCk7XG5cbiAgICBpZiAodGhpcy5fc2hvdWxkVXNlV29ya2VyKGNvbm5lY3Rpb25zLmxlbmd0aCkpIHtcbiAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbnNVc2luZ1dvcmtlcihcbiAgICAgICAgY29ubmVjdGlvbnMsXG4gICAgICAgIGNvbm5lY3RvclJlY3RDYWNoZSxcbiAgICAgICAgcmVuZGVyVGlja2V0LFxuICAgICAgICBub2Rlc1JldmlzaW9uLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25zQ2h1bmtlZChjb25uZWN0aW9ucywgY29ubmVjdG9yUmVjdENhY2hlLCAwLCByZW5kZXJUaWNrZXQsIG5vZGVzUmV2aXNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRDb25uZWN0ZWRDb25uZWN0b3JzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGVkSW5QcmV2aW91c1JlbmRlci5zaXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25uZWN0b3Igb2YgdGhpcy5fY29ubmVjdGVkSW5QcmV2aW91c1JlbmRlcikge1xuICAgICAgY29ubmVjdG9yLnJlc2V0Q29ubmVjdGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdGVkSW5QcmV2aW91c1JlbmRlci5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBDb25uZWN0aW9uKGNvbm5lY3Rpb246IEZDb25uZWN0aW9uQmFzZSwgY2FjaGU6IE1hcDxzdHJpbmcsIElSb3VuZGVkUmVjdD4pOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fcmVzb2x2ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24sIGNhY2hlKTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lID0gdGhpcy5fY2FsY3VsYXRlQ29ubmVjdGlvbkxpbmUoY29ubmVjdGlvbiwgY29udGV4dCk7XG5cbiAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25XaXRoTGluZShjb25uZWN0aW9uLCBjb250ZXh0LnNvdXJjZSwgY29udGV4dC50YXJnZXQsIGxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBDb25uZWN0aW9uV2l0aExpbmUoXG4gICAgY29ubmVjdGlvbjogRkNvbm5lY3Rpb25CYXNlLFxuICAgIHNvdXJjZTogRkNvbm5lY3RvckJhc2UsXG4gICAgdGFyZ2V0OiBGQ29ubmVjdG9yQmFzZSxcbiAgICBsaW5lOiBJTGluZSxcbiAgKTogdm9pZCB7XG4gICAgc291cmNlLnNldENvbm5lY3RlZCh0YXJnZXQpO1xuICAgIHRhcmdldC5zZXRDb25uZWN0ZWQoc291cmNlKTtcbiAgICB0aGlzLl9jb25uZWN0ZWRJblByZXZpb3VzUmVuZGVyLmFkZChzb3VyY2UpO1xuICAgIHRoaXMuX2Nvbm5lY3RlZEluUHJldmlvdXNSZW5kZXIuYWRkKHRhcmdldCk7XG5cbiAgICBjb25zdCBtYXJrZXJzQ2hhbmdlZCA9IHRoaXMuX2NyZWF0ZU1hcmtlcnMoY29ubmVjdGlvbik7XG4gICAgaWYgKCFtYXJrZXJzQ2hhbmdlZCAmJiAhdGhpcy5fc2hvdWxkUmVkcmF3Q29ubmVjdGlvbihjb25uZWN0aW9uLCBsaW5lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbm5lY3Rpb24uc2V0TGluZShsaW5lKTtcbiAgICBjb25uZWN0aW9uLmluaXRpYWxpemUoKTtcbiAgICBjb25uZWN0aW9uLmlzU2VsZWN0ZWQoKSA/IGNvbm5lY3Rpb24ubWFya0FzU2VsZWN0ZWQoKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVDb25uZWN0aW9uTGluZShcbiAgICBjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsXG4gICAgY29udGV4dDogSUZDb25uZWN0aW9uV29ya2VyQ29udGV4dCxcbiAgKTogSUxpbmUge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uQmVoYXZpb3VyLmhhbmRsZShcbiAgICAgIG5ldyBDb25uZWN0aW9uQmVoYXZpb3VyQnVpbGRlclJlcXVlc3QoXG4gICAgICAgIGNvbnRleHQuc291cmNlUmVjdCxcbiAgICAgICAgY29udGV4dC50YXJnZXRSZWN0LFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBjb250ZXh0LnNvdXJjZS5mQ29ubmVjdGFibGVTaWRlLFxuICAgICAgICBjb250ZXh0LnRhcmdldC5mQ29ubmVjdGFibGVTaWRlLFxuICAgICAgICB0aGlzLl9yZXNvbHZlUm90YXRpb25Db250ZXh0KGNvbnRleHQuc291cmNlKSxcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVJvdGF0aW9uQ29udGV4dChjb250ZXh0LnRhcmdldCksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNvbHZlUm90YXRpb25Db250ZXh0KFxuICAgIGNvbm5lY3RvcjogSUZDb25uZWN0aW9uV29ya2VyQ29udGV4dFsnc291cmNlJ10sXG4gICk6IFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2Uge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYXRvci5leGVjdXRlPFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2U+KFxuICAgICAgbmV3IFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHRSZXF1ZXN0KGNvbm5lY3RvciksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVDb25uZWN0aW9uQ29ubmVjdG9ycyhcbiAgICBjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsXG4gICk6IElGQ29ubmVjdGlvbldvcmtlckNvbm5lY3RvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZTxJRkNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzIHwgbnVsbD4oXG4gICAgICBuZXcgUmVzb2x2ZUNvbm5lY3Rpb25Xb3JrZXJDb25uZWN0b3JzUmVxdWVzdChjb25uZWN0aW9uKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUNvbm5lY3Rpb25Db250ZXh0KFxuICAgIGNvbm5lY3Rpb246IEZDb25uZWN0aW9uQmFzZSxcbiAgICBjYWNoZTogTWFwPHN0cmluZywgSVJvdW5kZWRSZWN0PixcbiAgKTogSUZDb25uZWN0aW9uV29ya2VyQ29udGV4dCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYXRvci5leGVjdXRlPElGQ29ubmVjdGlvbldvcmtlckNvbnRleHQgfCBudWxsPihcbiAgICAgIG5ldyBSZXNvbHZlQ29ubmVjdGlvbldvcmtlckNvbnRleHRSZXF1ZXN0KGNvbm5lY3Rpb24sIGNhY2hlKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTWFya2Vycyhjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZTxib29sZWFuPihuZXcgQ3JlYXRlQ29ubmVjdGlvbk1hcmtlcnNSZXF1ZXN0KGNvbm5lY3Rpb24pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Nob3VsZFJlZHJhd0Nvbm5lY3Rpb24oY29ubmVjdGlvbjogRkNvbm5lY3Rpb25CYXNlLCBsaW5lOiBJTGluZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gY29ubmVjdGlvbi5mUGF0aCgpLmhvc3RFbGVtZW50O1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGNyZWF0ZUNvbm5lY3Rpb25SZW5kZXJTaWduYXR1cmUoY29ubmVjdGlvbiwgbGluZSk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fY29ubmVjdGlvblJlbmRlckNhY2hlLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoY2FjaGVkPy5zaWduYXR1cmUgPT09IHNpZ25hdHVyZSAmJiBjYWNoZWQucGF0aEVsZW1lbnQgPT09IHBhdGhFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdGlvblJlbmRlckNhY2hlLnNldChjb25uZWN0aW9uLCB7IHNpZ25hdHVyZSwgcGF0aEVsZW1lbnQgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwQ29ubmVjdGlvbnNVc2luZ1dvcmtlcihcbiAgICBjb25uZWN0aW9uczogcmVhZG9ubHkgRkNvbm5lY3Rpb25CYXNlW10sXG4gICAgY29ubmVjdG9yUmVjdENhY2hlOiBNYXA8c3RyaW5nLCBJUm91bmRlZFJlY3Q+LFxuICAgIHJlbmRlclRpY2tldDogbnVtYmVyLFxuICAgIG5vZGVzUmV2aXNpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fbWVkaWF0b3JcbiAgICAgIC5leGVjdXRlPFByb21pc2U8cmVhZG9ubHkgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbVtdIHwgbnVsbD4+KFxuICAgICAgICBuZXcgQ2FsY3VsYXRlQ29ubmVjdGlvbnNVc2luZ0Nvbm5lY3Rpb25Xb3JrZXJSZXF1ZXN0KGNvbm5lY3Rpb25zLCBjb25uZWN0b3JSZWN0Q2FjaGUpLFxuICAgICAgKVxuICAgICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdHMpIHtcbiAgICAgICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb25zQ2h1bmtlZChcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgICAgICAgY29ubmVjdG9yUmVjdENhY2hlLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgICAgIG5vZGVzUmV2aXNpb24sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdvcmtlclJlc3VsdHMgPSB0aGlzLl9hbGlnbldvcmtlclJlc3VsdHNUb0Nvbm5lY3Rpb25JbmRleGVzKFxuICAgICAgICAgIHJlc3VsdHMsXG4gICAgICAgICAgY29ubmVjdGlvbnMubGVuZ3RoLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2FwcGx5V29ya2VyUmVzdWx0c0NodW5rZWQoXG4gICAgICAgICAgY29ubmVjdGlvbnMsXG4gICAgICAgICAgd29ya2VyUmVzdWx0cyxcbiAgICAgICAgICBjb25uZWN0b3JSZWN0Q2FjaGUsXG4gICAgICAgICAgMCxcbiAgICAgICAgICByZW5kZXJUaWNrZXQsXG4gICAgICAgICAgbm9kZXNSZXZpc2lvbixcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbnNDaHVua2VkKFxuICAgICAgICAgIGNvbm5lY3Rpb25zLFxuICAgICAgICAgIGNvbm5lY3RvclJlY3RDYWNoZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgICBub2Rlc1JldmlzaW9uLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVdvcmtlclJlc3VsdHNDaHVua2VkKFxuICAgIGNvbm5lY3Rpb25zOiByZWFkb25seSBGQ29ubmVjdGlvbkJhc2VbXSxcbiAgICB3b3JrZXJSZXN1bHRzOiByZWFkb25seSAoSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSB8IHVuZGVmaW5lZClbXSxcbiAgICBjb25uZWN0b3JSZWN0Q2FjaGU6IE1hcDxzdHJpbmcsIElSb3VuZGVkUmVjdD4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIHJlbmRlclRpY2tldDogbnVtYmVyLFxuICAgIG5vZGVzUmV2aXNpb246IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZVN0YXJ0ID0gdGhpcy5fbm93KCk7XG4gICAgbGV0IGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgIHdoaWxlIChcbiAgICAgIGVuZEluZGV4IDwgY29ubmVjdGlvbnMubGVuZ3RoICYmXG4gICAgICBwcm9jZXNzZWQgPCBDT05ORUNUSU9OU19QRVJfU0xJQ0VfTElNSVQgJiZcbiAgICAgIHRoaXMuX2lzV2l0aGluU2xpY2VCdWRnZXQoc2xpY2VTdGFydClcbiAgICApIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uc1tlbmRJbmRleF07XG4gICAgICBjb25zdCByZXN1bHQgPSB3b3JrZXJSZXN1bHRzW2VuZEluZGV4XTtcblxuICAgICAgaWYgKHRoaXMuX2lzV29ya2VyUmVzdWx0U3VwcG9ydGVkKHJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdG9ycyA9IHRoaXMuX3Jlc29sdmVDb25uZWN0aW9uQ29ubmVjdG9ycyhjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb25uZWN0b3JzKSB7XG4gICAgICAgICAgZW5kSW5kZXgrKztcbiAgICAgICAgICBwcm9jZXNzZWQrKztcblxuICAgICAgICAgIGlmICghdGhpcy5faXNDdXJyZW50UmVuZGVyQ29udGV4dChyZW5kZXJUaWNrZXQsIG5vZGVzUmV2aXNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25uZWN0aW9uLl9hcHBseVJlc29sdmVkU2lkZXNUb0Nvbm5lY3Rpb24oXG4gICAgICAgICAgICByZXN1bHQuc291cmNlU2lkZSBhcyBFRkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICAgICAgIHJlc3VsdC50YXJnZXRTaWRlIGFzIEVGQ29ubmVjdGFibGVTaWRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uV2l0aExpbmUoXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgY29ubmVjdG9ycy5zb3VyY2UsXG4gICAgICAgICAgICBjb25uZWN0b3JzLnRhcmdldCxcbiAgICAgICAgICAgIHJlc3VsdC5saW5lLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbihjb25uZWN0aW9uLCBjb25uZWN0b3JSZWN0Q2FjaGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXR1cENvbm5lY3Rpb24oY29ubmVjdGlvbiwgY29ubmVjdG9yUmVjdENhY2hlKTtcbiAgICAgIH1cblxuICAgICAgZW5kSW5kZXgrKztcbiAgICAgIHByb2Nlc3NlZCsrO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZEluZGV4ID49IGNvbm5lY3Rpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PlxuICAgICAgdGhpcy5fYXBwbHlXb3JrZXJSZXN1bHRzQ2h1bmtlZChcbiAgICAgICAgY29ubmVjdGlvbnMsXG4gICAgICAgIHdvcmtlclJlc3VsdHMsXG4gICAgICAgIGNvbm5lY3RvclJlY3RDYWNoZSxcbiAgICAgICAgZW5kSW5kZXgsXG4gICAgICAgIHJlbmRlclRpY2tldCxcbiAgICAgICAgbm9kZXNSZXZpc2lvbixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduV29ya2VyUmVzdWx0c1RvQ29ubmVjdGlvbkluZGV4ZXMoXG4gICAgcmVzdWx0czogcmVhZG9ubHkgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbVtdLFxuICAgIGNvbm5lY3Rpb25Db3VudDogbnVtYmVyLFxuICApOiAoSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSB8IHVuZGVmaW5lZClbXSB7XG4gICAgY29uc3QgYWxpZ25lZDogKElGQ29ubmVjdGlvbldvcmtlclJlc3VsdEl0ZW0gfCB1bmRlZmluZWQpW10gPSBuZXcgQXJyYXkoY29ubmVjdGlvbkNvdW50KTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVzdWx0Lm9yaWdpbmFsSW5kZXg7XG4gICAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjb25uZWN0aW9uQ291bnQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFsaWduZWRbaW5kZXhdID0gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBhbGlnbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNXb3JrZXJSZXN1bHRTdXBwb3J0ZWQoXG4gICAgcmVzdWx0OiBJRkNvbm5lY3Rpb25Xb3JrZXJSZXN1bHRJdGVtIHwgdW5kZWZpbmVkLFxuICApOiByZXN1bHQgaXMgSUZDb25uZWN0aW9uV29ya2VyUmVzdWx0SXRlbSAmIHtcbiAgICBzb3VyY2VTaWRlOiBzdHJpbmc7XG4gICAgdGFyZ2V0U2lkZTogc3RyaW5nO1xuICAgIGxpbmU6IElMaW5lO1xuICB9IHtcbiAgICByZXR1cm4gISEocmVzdWx0Py5zdXBwb3J0ZWQgJiYgcmVzdWx0LnNvdXJjZVNpZGUgJiYgcmVzdWx0LnRhcmdldFNpZGUgJiYgcmVzdWx0LmxpbmUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBDb25uZWN0aW9uc0NodW5rZWQoXG4gICAgY29ubmVjdGlvbnM6IHJlYWRvbmx5IEZDb25uZWN0aW9uQmFzZVtdLFxuICAgIGNvbm5lY3RvclJlY3RDYWNoZTogTWFwPHN0cmluZywgSVJvdW5kZWRSZWN0PixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgcmVuZGVyVGlja2V0OiBudW1iZXIsXG4gICAgbm9kZXNSZXZpc2lvbjogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzQ3VycmVudFJlbmRlckNvbnRleHQocmVuZGVyVGlja2V0LCBub2Rlc1JldmlzaW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlU3RhcnQgPSB0aGlzLl9ub3coKTtcbiAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuXG4gICAgd2hpbGUgKFxuICAgICAgZW5kSW5kZXggPCBjb25uZWN0aW9ucy5sZW5ndGggJiZcbiAgICAgIHByb2Nlc3NlZCA8IENPTk5FQ1RJT05TX1BFUl9TTElDRV9MSU1JVCAmJlxuICAgICAgdGhpcy5faXNXaXRoaW5TbGljZUJ1ZGdldChzbGljZVN0YXJ0KVxuICAgICkge1xuICAgICAgdGhpcy5fc2V0dXBDb25uZWN0aW9uKGNvbm5lY3Rpb25zW2VuZEluZGV4XSwgY29ubmVjdG9yUmVjdENhY2hlKTtcbiAgICAgIGVuZEluZGV4Kys7XG4gICAgICBwcm9jZXNzZWQrKztcblxuICAgICAgaWYgKCF0aGlzLl9pc0N1cnJlbnRSZW5kZXJDb250ZXh0KHJlbmRlclRpY2tldCwgbm9kZXNSZXZpc2lvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmRJbmRleCA+PSBjb25uZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgIHRoaXMuX3NldHVwQ29ubmVjdGlvbnNDaHVua2VkKFxuICAgICAgICBjb25uZWN0aW9ucyxcbiAgICAgICAgY29ubmVjdG9yUmVjdENhY2hlLFxuICAgICAgICBlbmRJbmRleCxcbiAgICAgICAgcmVuZGVyVGlja2V0LFxuICAgICAgICBub2Rlc1JldmlzaW9uLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2hvdWxkVXNlV29ya2VyKGNvbm5lY3Rpb25Db3VudDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhdG9yLmV4ZWN1dGU8Ym9vbGVhbj4obmV3IFNob3VsZFVzZUNvbm5lY3Rpb25Xb3JrZXJSZXF1ZXN0KGNvbm5lY3Rpb25Db3VudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDdXJyZW50UmVuZGVyQ29udGV4dChyZW5kZXJUaWNrZXQ6IG51bWJlciwgbm9kZXNSZXZpc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlbmRlclRpY2tldCA9PT0gdGhpcy5fcmVuZGVyVGlja2V0ICYmIG5vZGVzUmV2aXNpb24gPT09IHRoaXMuX3N0b3JlLm5vZGVzUmV2aXNpb247XG4gIH1cblxuICBwcml2YXRlIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB0aGlzLl9icm93c2VyLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIGlmICghd2luZG93UmVmKSB7XG4gICAgICBjYWxsYmFjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93UmVmLnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gIH1cblxuICBwcml2YXRlIF9ub3coKTogbnVtYmVyIHtcbiAgICBjb25zdCBwZXJmb3JtYW5jZVJlZiA9IHRoaXMuX2Jyb3dzZXIuZG9jdW1lbnQuZGVmYXVsdFZpZXc/LnBlcmZvcm1hbmNlO1xuXG4gICAgcmV0dXJuIHBlcmZvcm1hbmNlUmVmID8gcGVyZm9ybWFuY2VSZWYubm93KCkgOiBEYXRlLm5vdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNXaXRoaW5TbGljZUJ1ZGdldChzbGljZVN0YXJ0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2Jyb3dzZXIuaXNCcm93c2VyKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ub3coKSAtIHNsaWNlU3RhcnQgPCBTTElDRV9CVURHRVRfTVM7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvblJlbmRlclNpZ25hdHVyZShjb25uZWN0aW9uOiBGQ29ubmVjdGlvbkJhc2UsIGxpbmU6IElMaW5lKTogc3RyaW5nIHtcbiAgY29uc3QgeyBzb3VyY2VTaWRlLCB0YXJnZXRTaWRlIH0gPSBjb25uZWN0aW9uLmdldFJlc29sdmVkU2lkZXMoKTtcblxuICByZXR1cm4gW1xuICAgIGNvbm5lY3Rpb24uZkJlaGF2aW9yLFxuICAgIGNvbm5lY3Rpb24uZlR5cGUsXG4gICAgY29ubmVjdGlvbi5mUmFkaXVzLFxuICAgIGNvbm5lY3Rpb24uZk9mZnNldCxcbiAgICBjb25uZWN0aW9uLmZSZWFzc2lnbmFibGVTdGFydCgpLFxuICAgIHNlcmlhbGl6ZUNvbnRlbnRzKGNvbm5lY3Rpb24uZkNvbnRlbnRzKCkgfHwgW10pLFxuICAgIHNvdXJjZVNpZGUsXG4gICAgdGFyZ2V0U2lkZSxcbiAgICBzZXJpYWxpemVQb2ludChsaW5lLnBvaW50MSksXG4gICAgc2VyaWFsaXplUG9pbnQobGluZS5wb2ludDIpLFxuICAgIHNlcmlhbGl6ZVdheXBvaW50cyhjb25uZWN0aW9uLmZXYXlwb2ludHMoKT8ud2F5cG9pbnRzKCkgfHwgW10pLFxuICBdLmpvaW4oJ3wnKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUG9pbnQocG9pbnQ6IElMaW5lWydwb2ludDEnXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtwb2ludC54fToke3BvaW50Lnl9YDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplV2F5cG9pbnRzKHdheXBvaW50czogcmVhZG9ubHkgSUxpbmVbJ3BvaW50MSddW10pOiBzdHJpbmcge1xuICByZXR1cm4gd2F5cG9pbnRzLm1hcChzZXJpYWxpemVQb2ludCkuam9pbignOycpO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVDb250ZW50cyhjb250ZW50czogcmVhZG9ubHkgRkNvbm5lY3Rpb25Db250ZW50QmFzZVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRzXG4gICAgLm1hcCgoY29udGVudCkgPT4ge1xuICAgICAgcmV0dXJuIFtjb250ZW50LnBvc2l0aW9uKCksIGNvbnRlbnQub2Zmc2V0KCksIGNvbnRlbnQuYWxpZ24oKV0uam9pbignOicpO1xuICAgIH0pXG4gICAgLmpvaW4oJzsnKTtcbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './resolve-connection-endpoint-rotation-context';
2
+ export * from './resolve-connection-endpoint-rotation-context-request';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWNvbm5lY3Rpb24vcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnREFBZ0QsQ0FBQztBQUUvRCxjQUFjLHdEQUF3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9yZXNvbHZlLWNvbm5lY3Rpb24tZW5kcG9pbnQtcm90YXRpb24tY29udGV4dCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQtcmVxdWVzdCc7XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export class ResolveConnectionEndpointRotationContextRequest {
2
+ connector;
3
+ static fToken = Symbol('ResolveConnectionEndpointRotationContextRequest');
4
+ constructor(connector) {
5
+ this.connector = connector;
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQtcmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZG9tYWluL2YtY29ubmVjdGlvbi9yZXNvbHZlLWNvbm5lY3Rpb24tZW5kcG9pbnQtcm90YXRpb24tY29udGV4dC9yZXNvbHZlLWNvbm5lY3Rpb24tZW5kcG9pbnQtcm90YXRpb24tY29udGV4dC1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTywrQ0FBK0M7SUFHOUI7SUFGNUIsTUFBTSxDQUFVLE1BQU0sR0FBRyxNQUFNLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUVuRixZQUE0QixTQUEwQjtRQUExQixjQUFTLEdBQVQsU0FBUyxDQUFpQjtJQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGQ29ubmVjdG9yQmFzZSB9IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdG9ycyc7XG5pbXBvcnQgeyBJQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vZi1jb25uZWN0aW9uLXYyJztcblxuZXhwb3J0IGNsYXNzIFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHRSZXF1ZXN0IHtcbiAgc3RhdGljIHJlYWRvbmx5IGZUb2tlbiA9IFN5bWJvbCgnUmVzb2x2ZUNvbm5lY3Rpb25FbmRwb2ludFJvdGF0aW9uQ29udGV4dFJlcXVlc3QnKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29ubmVjdG9yPzogRkNvbm5lY3RvckJhc2UpIHt9XG59XG5cbmV4cG9ydCB0eXBlIFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2UgPVxuICB8IElDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHRcbiAgfCB1bmRlZmluZWQ7XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { __decorate } from "tslib";
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { FExecutionRegister, FMediator } from '@foblex/mediator';
4
+ import { FComponentsStore } from '../../../f-storage';
5
+ import { GetNormalizedElementRectRequest } from '../../get-normalized-element-rect';
6
+ import { ResolveConnectionEndpointRotationContextRequest, } from './resolve-connection-endpoint-rotation-context-request';
7
+ import * as i0 from "@angular/core";
8
+ let ResolveConnectionEndpointRotationContext = class ResolveConnectionEndpointRotationContext {
9
+ _store = inject(FComponentsStore);
10
+ _mediator = inject(FMediator);
11
+ handle({ connector, }) {
12
+ if (!connector) {
13
+ return undefined;
14
+ }
15
+ const node = this._store.nodes.get(connector.fNodeId);
16
+ if (!node || !node._rotate) {
17
+ return undefined;
18
+ }
19
+ const nodeRect = this._mediator.execute(new GetNormalizedElementRectRequest(node.hostElement));
20
+ return {
21
+ rotationDeg: node._rotate,
22
+ pivot: nodeRect.gravityCenter,
23
+ };
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResolveConnectionEndpointRotationContext, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
26
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResolveConnectionEndpointRotationContext });
27
+ };
28
+ ResolveConnectionEndpointRotationContext = __decorate([
29
+ FExecutionRegister(ResolveConnectionEndpointRotationContextRequest)
30
+ ], ResolveConnectionEndpointRotationContext);
31
+ export { ResolveConnectionEndpointRotationContext };
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResolveConnectionEndpointRotationContext, decorators: [{
33
+ type: Injectable
34
+ }] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWNvbm5lY3Rpb24vcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQvcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRixPQUFPLEVBQ0wsK0NBQStDLEdBRWhELE1BQU0sd0RBQXdELENBQUM7O0FBSXpELElBQU0sd0NBQXdDLEdBQTlDLE1BQU0sd0NBQXdDO0lBT2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNsQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sQ0FBQyxFQUNaLFNBQVMsR0FDdUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ3JDLElBQUksK0JBQStCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUN0RCxDQUFDO1FBRUYsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixLQUFLLEVBQUUsUUFBUSxDQUFDLGFBQWE7U0FDOUIsQ0FBQztJQUNKLENBQUM7d0dBOUJVLHdDQUF3Qzs0R0FBeEMsd0NBQXdDOztBQUF4Qyx3Q0FBd0M7SUFEcEQsa0JBQWtCLENBQUMsK0NBQStDLENBQUM7R0FDdkQsd0NBQXdDLENBK0JwRDs7NEZBL0JZLHdDQUF3QztrQkFGcEQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElSZWN0IH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZFeGVjdXRpb25SZWdpc3RlciwgRk1lZGlhdG9yLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBGQ29tcG9uZW50c1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QgfSBmcm9tICcuLi8uLi9nZXQtbm9ybWFsaXplZC1lbGVtZW50LXJlY3QnO1xuaW1wb3J0IHtcbiAgUmVzb2x2ZUNvbm5lY3Rpb25FbmRwb2ludFJvdGF0aW9uQ29udGV4dFJlcXVlc3QsXG4gIFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2UsXG59IGZyb20gJy4vcmVzb2x2ZS1jb25uZWN0aW9uLWVuZHBvaW50LXJvdGF0aW9uLWNvbnRleHQtcmVxdWVzdCc7XG5cbkBJbmplY3RhYmxlKClcbkBGRXhlY3V0aW9uUmVnaXN0ZXIoUmVzb2x2ZUNvbm5lY3Rpb25FbmRwb2ludFJvdGF0aW9uQ29udGV4dFJlcXVlc3QpXG5leHBvcnQgY2xhc3MgUmVzb2x2ZUNvbm5lY3Rpb25FbmRwb2ludFJvdGF0aW9uQ29udGV4dFxuICBpbXBsZW1lbnRzXG4gICAgSUV4ZWN1dGlvbjxcbiAgICAgIFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHRSZXF1ZXN0LFxuICAgICAgVFJlc29sdmVDb25uZWN0aW9uRW5kcG9pbnRSb3RhdGlvbkNvbnRleHRSZXNwb25zZVxuICAgID5cbntcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RvcmUgPSBpbmplY3QoRkNvbXBvbmVudHNTdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG5cbiAgcHVibGljIGhhbmRsZSh7XG4gICAgY29ubmVjdG9yLFxuICB9OiBSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVxdWVzdCk6IFRSZXNvbHZlQ29ubmVjdGlvbkVuZHBvaW50Um90YXRpb25Db250ZXh0UmVzcG9uc2Uge1xuICAgIGlmICghY29ubmVjdG9yKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9zdG9yZS5ub2Rlcy5nZXQoY29ubmVjdG9yLmZOb2RlSWQpO1xuICAgIGlmICghbm9kZSB8fCAhbm9kZS5fcm90YXRlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVSZWN0ID0gdGhpcy5fbWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4oXG4gICAgICBuZXcgR2V0Tm9ybWFsaXplZEVsZW1lbnRSZWN0UmVxdWVzdChub2RlLmhvc3RFbGVtZW50KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdGF0aW9uRGVnOiBub2RlLl9yb3RhdGUsXG4gICAgICBwaXZvdDogbm9kZVJlY3QuZ3Jhdml0eUNlbnRlcixcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -5,4 +5,4 @@ export class OnPointerMoveRequest {
5
5
  this.event = event;
6
6
  }
7
7
  }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tcG9pbnRlci1tb3ZlLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWRyYWdnYWJsZS9vbi1wb2ludGVyLW1vdmUvb24tcG9pbnRlci1tb3ZlLXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLG9CQUFvQjtJQUl0QjtJQUhULE1BQU0sQ0FBVSxNQUFNLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFeEQsWUFDUyxLQUFvQjtRQUFwQixVQUFLLEdBQUwsS0FBSyxDQUFlO0lBRTdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUG9pbnRlckV2ZW50IH0gZnJvbSBcIi4uLy4uLy4uL2RyYWctdG9vbGtpdFwiO1xuXG5leHBvcnQgY2xhc3MgT25Qb2ludGVyTW92ZVJlcXVlc3Qge1xuICBzdGF0aWMgcmVhZG9ubHkgZlRva2VuID0gU3ltYm9sKCdPblBvaW50ZXJNb3ZlUmVxdWVzdCcpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBldmVudDogSVBvaW50ZXJFdmVudCxcbiAgKSB7XG4gIH1cbn1cbiJdfQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tcG9pbnRlci1tb3ZlLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2RvbWFpbi9mLWRyYWdnYWJsZS9vbi1wb2ludGVyLW1vdmUvb24tcG9pbnRlci1tb3ZlLXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLG9CQUFvQjtJQUdaO0lBRm5CLE1BQU0sQ0FBVSxNQUFNLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFeEQsWUFBbUIsS0FBb0I7UUFBcEIsVUFBSyxHQUFMLEtBQUssQ0FBZTtJQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUG9pbnRlckV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vZHJhZy10b29sa2l0JztcblxuZXhwb3J0IGNsYXNzIE9uUG9pbnRlck1vdmVSZXF1ZXN0IHtcbiAgc3RhdGljIHJlYWRvbmx5IGZUb2tlbiA9IFN5bWJvbCgnT25Qb2ludGVyTW92ZVJlcXVlc3QnKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXZlbnQ6IElQb2ludGVyRXZlbnQpIHt9XG59XG4iXX0=