velocious 1.0.562 → 1.0.564

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 (245) hide show
  1. package/README.md +5 -1
  2. package/build/background-jobs/cron-expression.js +12 -13
  3. package/build/background-jobs/main.js +6 -6
  4. package/build/background-jobs/runner-graceful-shutdown.js +2 -3
  5. package/build/background-jobs/scheduler.js +3 -3
  6. package/build/background-jobs/worker.js +8 -9
  7. package/build/beacon/client.js +3 -4
  8. package/build/configuration-types.js +1 -0
  9. package/build/configuration.js +44 -3
  10. package/build/database/drivers/sqlite/web-persistence.js +2 -5
  11. package/build/database/pool/async-tracked-multi-connection.js +65 -15
  12. package/build/database/pool/base.js +23 -7
  13. package/build/database/query/index.js +21 -22
  14. package/build/database/query/model-class-query.js +5 -6
  15. package/build/database/record/attachments/normalize-input.js +9 -10
  16. package/build/database/record/attachments/store.js +2 -2
  17. package/build/database/record/auditing.js +7 -8
  18. package/build/database/record/index.js +4 -5
  19. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  20. package/build/frontend-model-controller.js +49 -56
  21. package/build/frontend-models/base.js +17 -19
  22. package/build/frontend-models/outgoing-event-buffer.js +3 -4
  23. package/build/frontend-models/query.js +40 -44
  24. package/build/frontend-models/resource-definition.js +7 -8
  25. package/build/frontend-models/transport-serialization.js +10 -12
  26. package/build/frontend-models/websocket-channel.js +12 -13
  27. package/build/http-server/client/websocket-session.js +7 -8
  28. package/build/http-server/client-delivery-queue.js +167 -0
  29. package/build/http-server/server-client.js +9 -0
  30. package/build/http-server/websocket-event-log-store.js +4 -6
  31. package/build/http-server/websocket-events-host.js +42 -12
  32. package/build/http-server/worker-handler/in-process.js +53 -14
  33. package/build/http-server/worker-handler/index.js +88 -18
  34. package/build/http-server/worker-handler/worker-thread.js +2 -2
  35. package/build/plugins/sqljs-wasm-route.js +3 -5
  36. package/build/src/background-jobs/cron-expression.d.ts +0 -12
  37. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  38. package/build/src/background-jobs/cron-expression.js +13 -13
  39. package/build/src/background-jobs/main.d.ts.map +1 -1
  40. package/build/src/background-jobs/main.js +7 -7
  41. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
  42. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
  43. package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
  44. package/build/src/background-jobs/scheduler.d.ts +0 -3
  45. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  46. package/build/src/background-jobs/scheduler.js +4 -4
  47. package/build/src/background-jobs/worker.d.ts +0 -8
  48. package/build/src/background-jobs/worker.d.ts.map +1 -1
  49. package/build/src/background-jobs/worker.js +9 -9
  50. package/build/src/beacon/client.d.ts +0 -4
  51. package/build/src/beacon/client.d.ts.map +1 -1
  52. package/build/src/beacon/client.js +4 -4
  53. package/build/src/configuration-types.d.ts +8 -0
  54. package/build/src/configuration-types.d.ts.map +1 -1
  55. package/build/src/configuration-types.js +2 -1
  56. package/build/src/configuration.d.ts +34 -1
  57. package/build/src/configuration.d.ts.map +1 -1
  58. package/build/src/configuration.js +40 -4
  59. package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
  60. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
  61. package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
  62. package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
  63. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  64. package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
  65. package/build/src/database/pool/base.d.ts +53 -4
  66. package/build/src/database/pool/base.d.ts.map +1 -1
  67. package/build/src/database/pool/base.js +23 -6
  68. package/build/src/database/query/index.d.ts +18 -39
  69. package/build/src/database/query/index.d.ts.map +1 -1
  70. package/build/src/database/query/index.js +22 -22
  71. package/build/src/database/query/model-class-query.d.ts +0 -5
  72. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  73. package/build/src/database/query/model-class-query.js +6 -6
  74. package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
  75. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  76. package/build/src/database/record/attachments/normalize-input.js +10 -10
  77. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  78. package/build/src/database/record/attachments/store.js +2 -2
  79. package/build/src/database/record/auditing.d.ts +17 -24
  80. package/build/src/database/record/auditing.d.ts.map +1 -1
  81. package/build/src/database/record/auditing.js +8 -8
  82. package/build/src/database/record/index.d.ts +4 -4
  83. package/build/src/database/record/index.d.ts.map +1 -1
  84. package/build/src/database/record/index.js +5 -5
  85. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
  86. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  87. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
  88. package/build/src/frontend-model-controller.d.ts +1 -1
  89. package/build/src/frontend-model-controller.d.ts.map +1 -1
  90. package/build/src/frontend-model-controller.js +50 -50
  91. package/build/src/frontend-models/base.d.ts.map +1 -1
  92. package/build/src/frontend-models/base.js +18 -18
  93. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  94. package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
  95. package/build/src/frontend-models/query.d.ts +56 -37
  96. package/build/src/frontend-models/query.d.ts.map +1 -1
  97. package/build/src/frontend-models/query.js +39 -39
  98. package/build/src/frontend-models/resource-definition.d.ts +0 -7
  99. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  100. package/build/src/frontend-models/resource-definition.js +8 -8
  101. package/build/src/frontend-models/transport-serialization.d.ts +0 -10
  102. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  103. package/build/src/frontend-models/transport-serialization.js +11 -11
  104. package/build/src/frontend-models/websocket-channel.d.ts +0 -12
  105. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  106. package/build/src/frontend-models/websocket-channel.js +13 -13
  107. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  108. package/build/src/http-server/client/websocket-session.js +8 -8
  109. package/build/src/http-server/client-delivery-queue.d.ts +121 -0
  110. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -0
  111. package/build/src/http-server/client-delivery-queue.js +152 -0
  112. package/build/src/http-server/server-client.d.ts +6 -0
  113. package/build/src/http-server/server-client.d.ts.map +1 -1
  114. package/build/src/http-server/server-client.js +10 -1
  115. package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
  116. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  117. package/build/src/http-server/websocket-event-log-store.js +5 -5
  118. package/build/src/http-server/websocket-events-host.d.ts +15 -4
  119. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  120. package/build/src/http-server/websocket-events-host.js +39 -13
  121. package/build/src/http-server/worker-handler/in-process.d.ts +19 -1
  122. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  123. package/build/src/http-server/worker-handler/in-process.js +50 -14
  124. package/build/src/http-server/worker-handler/index.d.ts +36 -4
  125. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  126. package/build/src/http-server/worker-handler/index.js +82 -18
  127. package/build/src/http-server/worker-handler/worker-thread.js +3 -3
  128. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  129. package/build/src/plugins/sqljs-wasm-route.js +4 -4
  130. package/build/src/sync/conflict-strategy.d.ts +0 -15
  131. package/build/src/sync/conflict-strategy.d.ts.map +1 -1
  132. package/build/src/sync/conflict-strategy.js +3 -3
  133. package/build/src/sync/device-identity.d.ts +0 -45
  134. package/build/src/sync/device-identity.d.ts.map +1 -1
  135. package/build/src/sync/device-identity.js +4 -4
  136. package/build/src/sync/local-mutation-log.d.ts +0 -41
  137. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  138. package/build/src/sync/local-mutation-log.js +9 -9
  139. package/build/src/sync/offline-grant.d.ts +0 -26
  140. package/build/src/sync/offline-grant.d.ts.map +1 -1
  141. package/build/src/sync/offline-grant.js +4 -4
  142. package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
  143. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  144. package/build/src/sync/peer-mutation-bundle.js +3 -3
  145. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  146. package/build/src/sync/server-change-feed.js +33 -33
  147. package/build/src/sync/sync-api-client.d.ts +0 -9
  148. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  149. package/build/src/sync/sync-api-client.js +2 -2
  150. package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
  151. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  152. package/build/src/sync/sync-envelope-replay-service.js +18 -18
  153. package/build/src/sync/sync-resource-base.d.ts +0 -7
  154. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  155. package/build/src/sync/sync-resource-base.js +2 -2
  156. package/build/src/sync/sync-scope-store.d.ts +0 -9
  157. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  158. package/build/src/sync/sync-scope-store.js +10 -10
  159. package/build/src/testing/test-filter-parser.d.ts +0 -10
  160. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  161. package/build/src/testing/test-filter-parser.js +11 -11
  162. package/build/src/testing/test-runner.d.ts +25 -91
  163. package/build/src/testing/test-runner.d.ts.map +1 -1
  164. package/build/src/testing/test-runner.js +113 -98
  165. package/build/src/testing/test.d.ts +8 -0
  166. package/build/src/testing/test.d.ts.map +1 -1
  167. package/build/src/testing/test.js +9 -9
  168. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  169. package/build/src/utils/backtrace-cleaner.js +9 -9
  170. package/build/src/utils/model-scope.d.ts +0 -8
  171. package/build/src/utils/model-scope.d.ts.map +1 -1
  172. package/build/src/utils/model-scope.js +3 -3
  173. package/build/src/utils/ransack.d.ts +52 -19
  174. package/build/src/utils/ransack.d.ts.map +1 -1
  175. package/build/src/utils/ransack.js +26 -26
  176. package/build/sync/conflict-strategy.js +3 -6
  177. package/build/sync/device-identity.js +4 -9
  178. package/build/sync/local-mutation-log.js +9 -14
  179. package/build/sync/offline-grant.js +4 -7
  180. package/build/sync/peer-mutation-bundle.js +2 -4
  181. package/build/sync/server-change-feed.js +32 -34
  182. package/build/sync/sync-api-client.js +1 -2
  183. package/build/sync/sync-envelope-replay-service.js +17 -19
  184. package/build/sync/sync-resource-base.js +1 -2
  185. package/build/sync/sync-scope-store.js +9 -10
  186. package/build/testing/test-filter-parser.js +10 -11
  187. package/build/testing/test-runner.js +116 -108
  188. package/build/testing/test.js +8 -9
  189. package/build/tsconfig.tsbuildinfo +1 -1
  190. package/build/utils/backtrace-cleaner.js +8 -9
  191. package/build/utils/model-scope.js +3 -4
  192. package/build/utils/ransack.js +27 -34
  193. package/package.json +3 -1
  194. package/scripts/eslint-rules/typedefs-first.js +67 -0
  195. package/scripts/prewarm-chromedriver.js +26 -0
  196. package/src/background-jobs/cron-expression.js +12 -13
  197. package/src/background-jobs/main.js +6 -6
  198. package/src/background-jobs/runner-graceful-shutdown.js +2 -3
  199. package/src/background-jobs/scheduler.js +3 -3
  200. package/src/background-jobs/worker.js +8 -9
  201. package/src/beacon/client.js +3 -4
  202. package/src/configuration-types.js +1 -0
  203. package/src/configuration.js +44 -3
  204. package/src/database/drivers/sqlite/web-persistence.js +2 -5
  205. package/src/database/pool/async-tracked-multi-connection.js +65 -15
  206. package/src/database/pool/base.js +23 -7
  207. package/src/database/query/index.js +21 -22
  208. package/src/database/query/model-class-query.js +5 -6
  209. package/src/database/record/attachments/normalize-input.js +9 -10
  210. package/src/database/record/attachments/store.js +2 -2
  211. package/src/database/record/auditing.js +7 -8
  212. package/src/database/record/index.js +4 -5
  213. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  214. package/src/frontend-model-controller.js +49 -56
  215. package/src/frontend-models/base.js +17 -19
  216. package/src/frontend-models/outgoing-event-buffer.js +3 -4
  217. package/src/frontend-models/query.js +40 -44
  218. package/src/frontend-models/resource-definition.js +7 -8
  219. package/src/frontend-models/transport-serialization.js +10 -12
  220. package/src/frontend-models/websocket-channel.js +12 -13
  221. package/src/http-server/client/websocket-session.js +7 -8
  222. package/src/http-server/client-delivery-queue.js +167 -0
  223. package/src/http-server/server-client.js +9 -0
  224. package/src/http-server/websocket-event-log-store.js +4 -6
  225. package/src/http-server/websocket-events-host.js +42 -12
  226. package/src/http-server/worker-handler/in-process.js +53 -14
  227. package/src/http-server/worker-handler/index.js +88 -18
  228. package/src/http-server/worker-handler/worker-thread.js +2 -2
  229. package/src/plugins/sqljs-wasm-route.js +3 -5
  230. package/src/sync/conflict-strategy.js +3 -6
  231. package/src/sync/device-identity.js +4 -9
  232. package/src/sync/local-mutation-log.js +9 -14
  233. package/src/sync/offline-grant.js +4 -7
  234. package/src/sync/peer-mutation-bundle.js +2 -4
  235. package/src/sync/server-change-feed.js +32 -34
  236. package/src/sync/sync-api-client.js +1 -2
  237. package/src/sync/sync-envelope-replay-service.js +17 -19
  238. package/src/sync/sync-resource-base.js +1 -2
  239. package/src/sync/sync-scope-store.js +9 -10
  240. package/src/testing/test-filter-parser.js +10 -11
  241. package/src/testing/test-runner.js +116 -108
  242. package/src/testing/test.js +8 -9
  243. package/src/utils/backtrace-cleaner.js +8 -9
  244. package/src/utils/model-scope.js +3 -4
  245. package/src/utils/ransack.js +27 -34
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
2
  import Client from "../client/index.js";
3
+ import ClientDeliveryQueue from "../client-delivery-queue.js";
3
4
  import dispatchChannelSubscribers from "./channel-subscriber-dispatch.js";
4
5
  import Logger from "../../logger.js";
5
6
  import websocketEventsHost from "../websocket-events-host.js";
@@ -20,7 +21,7 @@ export default class VelociousHttpServerInProcessHandler {
20
21
  this.configuration = configuration;
21
22
  /**
22
23
  * Narrows the runtime value to the documented type.
23
- * @type {Record<number, {httpClient: Client, serverClient: import("../server-client.js").default}>} */
24
+ * @type {Record<number, {deliveryQueue: ClientDeliveryQueue, httpClient: Client, serverClient: import("../server-client.js").default}>} */
24
25
  this.clients = {};
25
26
  /** @type {Set<Promise<void>>} */
26
27
  this.pendingClientCloseCleanups = new Set();
@@ -47,22 +48,33 @@ export default class VelociousHttpServerInProcessHandler {
47
48
  configuration: this.configuration,
48
49
  remoteAddress: serverClient.remoteAddress
49
50
  });
50
- let deliveryQueue = Promise.resolve();
51
- const enqueueDelivery = (/** @type {() => Promise<void>} */ delivery) => {
52
- deliveryQueue = deliveryQueue
53
- .catch(() => { })
54
- .then(delivery);
55
- return deliveryQueue;
56
- };
57
- httpClient.events.on("output", (output) => {
51
+ const { maxBytes, maxFrames } = this.configuration.getWebsocketOutboundQueueLimits();
52
+ const deliveryQueue = new ClientDeliveryQueue({
53
+ clientCount,
54
+ maxBytes,
55
+ maxFrames,
56
+ onOverflow: (error) => {
57
+ deliveryQueue.destroy();
58
+ serverClient.destroy(error);
59
+ this._reportOutboundQueueOverflow({ clientCount, error });
60
+ }
61
+ });
62
+ httpClient.events.on("output", (output, { websocketFrame = false } = {}) => {
58
63
  if (output !== null && output !== undefined) {
59
- void enqueueDelivery(() => serverClient.send(output)).catch((error) => {
64
+ const delivery = () => serverClient.send(output);
65
+ const queued = websocketFrame
66
+ ? deliveryQueue.enqueueFrame({
67
+ byteLength: typeof output === "string" ? Buffer.byteLength(output) : output.byteLength,
68
+ delivery
69
+ })
70
+ : deliveryQueue.enqueueControl(delivery);
71
+ void queued.catch((error) => {
60
72
  this.logger.error(() => ["Failed to deliver client output", { clientCount }, error]);
61
73
  });
62
74
  }
63
75
  });
64
76
  httpClient.events.on("file", ({ filePath, sendBody, settle }) => {
65
- void enqueueDelivery(async () => {
77
+ void deliveryQueue.enqueueControl(async () => {
66
78
  await settle(await serverClient.sendFile(filePath, sendBody));
67
79
  }).catch((error) => {
68
80
  this.logger.error(() => ["Failed to deliver file response", { clientCount, filePath }, error]);
@@ -70,10 +82,11 @@ export default class VelociousHttpServerInProcessHandler {
70
82
  });
71
83
  });
72
84
  httpClient.events.on("close", () => {
73
- void enqueueDelivery(() => serverClient.end())
85
+ void deliveryQueue.enqueueControl(() => serverClient.end())
74
86
  .finally(() => delete this.clients[clientCount]);
75
87
  });
76
88
  serverClient.events.on("close", () => {
89
+ deliveryQueue.destroy();
77
90
  const cleanup = httpClient.abortPendingFileResponses()
78
91
  .catch((error) => {
79
92
  this.logger.warn("Failed to abort file responses after client close", error);
@@ -84,7 +97,7 @@ export default class VelociousHttpServerInProcessHandler {
84
97
  });
85
98
  this.pendingClientCloseCleanups.add(cleanup);
86
99
  });
87
- this.clients[clientCount] = { httpClient, serverClient };
100
+ this.clients[clientCount] = { deliveryQueue, httpClient, serverClient };
88
101
  // Create a message-port shim so ServerClient.onSocketData can route data
89
102
  // to the in-process HTTP Client without needing a real worker thread.
90
103
  const messagePortShim = /** @type {import("worker_threads").Worker} */ ( /** @type {?} */({
@@ -98,6 +111,22 @@ export default class VelociousHttpServerInProcessHandler {
98
111
  serverClient.setWorker(messagePortShim);
99
112
  serverClient.listen();
100
113
  }
114
+ /**
115
+ * Reports a per-client outbound queue overflow.
116
+ * @param {object} args - Overflow details.
117
+ * @param {number} args.clientCount - Affected client.
118
+ * @param {Error} args.error - Overflow error.
119
+ * @returns {void}
120
+ */
121
+ _reportOutboundQueueOverflow({ clientCount, error }) {
122
+ const errorPayload = {
123
+ context: { clientCount, websocketOutboundQueueOverflow: true, workerCount: this.workerCount },
124
+ error
125
+ };
126
+ const errorEvents = this.configuration.getErrorEvents();
127
+ errorEvents.emit("framework-error", errorPayload);
128
+ errorEvents.emit("all-error", { ...errorPayload, errorType: "framework-error" });
129
+ }
101
130
  /**
102
131
  * Runs stop.
103
132
  * @returns {Promise<void>} */
@@ -133,6 +162,13 @@ export default class VelociousHttpServerInProcessHandler {
133
162
  return;
134
163
  return this.configuration._broadcastToChannelLocal(channel, broadcastParams, body, { eventId });
135
164
  }
165
+ /**
166
+ * Gets the configuration-wide V2 broadcast target shared by in-process handlers.
167
+ * @returns {import("../../configuration.js").default} - Shared configuration target.
168
+ */
169
+ websocketV2BroadcastDispatchKey() {
170
+ return this.configuration;
171
+ }
136
172
  /**
137
173
  * Runs dispatch websocket event.
138
174
  * @param {object} args - Options object.
@@ -157,4 +193,4 @@ export default class VelociousHttpServerInProcessHandler {
157
193
  }
158
194
  }
159
195
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLDBCQUEwQixNQUFNLGtDQUFrQyxDQUFBO0FBQ3pFLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sbUJBQW1CLE1BQU0sNkJBQTZCLENBQUE7QUFFN0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLG1DQUFtQztJQUN0RDs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBRWxDOzsrR0FFdUc7UUFDdkcsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFakIsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFDOUIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDckYsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDeEIsQ0FBQztJQUVEOztrQ0FFOEI7SUFDOUIsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixJQUFJLENBQUMsV0FBVyxVQUFVLENBQUMsQ0FBQTtJQUNqRixDQUFDO0lB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QUE7WUFFM0MsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUTtZQUV0QixLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixvRUFBb0U7WUFDcEUsOERBQThEO1lBQzlELDhCQUE4QjtZQUM5QixLQUFLLDBCQUEwQixDQUFDLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUNqSSxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDbGllbnQgZnJvbSBcIi4uL2NsaWVudC9pbmRleC5qc1wiXG5pbXBvcnQgZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMgZnJvbSBcIi4vY2hhbm5lbC1zdWJzY3JpYmVyLWRpc3BhdGNoLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgd2Vic29ja2V0RXZlbnRzSG9zdCBmcm9tIFwiLi4vd2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzXCJcblxuLyoqXG4gKiBJbi1wcm9jZXNzIHdvcmtlciBoYW5kbGVyIHRoYXQgcHJvY2Vzc2VzIEhUVFAgcmVxdWVzdHMgaW4gdGhlIG1haW4gdGhyZWFkXG4gKiBpbnN0ZWFkIG9mIHNwYXduaW5nIGEgV29ya2VyIHRocmVhZC4gVGhpcyBhbGxvd3MgdGhlIHRlc3QgcnVubmVyJ3MgZGF0YWJhc2VcbiAqIGNvbm5lY3Rpb24gY29udGV4dCB0byBiZSBzaGFyZWQgd2l0aCBIVFRQIHJlcXVlc3QgaGFuZGxlcnMsIHNvIG1vZGVsLWNyZWF0ZWRcbiAqIHJlY29yZHMgaW4gdGVzdHMgYXJlIHZpc2libGUgdG8gSFRUUCBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJJblByb2Nlc3NIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy53b3JrZXJDb3VudCAtIFdvcmtlciBjb3VudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge1JlY29yZDxudW1iZXIsIHtodHRwQ2xpZW50OiBDbGllbnQsIHNlcnZlckNsaWVudDogaW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fT59ICovXG4gICAgdGhpcy5jbGllbnRzID0ge31cblxuICAgIC8qKiBAdHlwZSB7U2V0PFByb21pc2U8dm9pZD4+fSAqL1xuICAgIHRoaXMucGVuZGluZ0NsaWVudENsb3NlQ2xlYW51cHMgPSBuZXcgU2V0KClcblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMud29ya2VyQ291bnQgPSB3b3JrZXJDb3VudFxuICAgIHRoaXMudW5yZWdpc3RlckZyb21FdmVudHNIb3N0ID0gd2Vic29ja2V0RXZlbnRzSG9zdC5yZWdpc3RlcigvKiogQHR5cGUgez99ICovICh0aGlzKSlcbiAgICB0aGlzLl9zdG9wcGluZyA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IGBJbi1wcm9jZXNzIGhhbmRsZXIgJHt0aGlzLndvcmtlckNvdW50fSBzdGFydGVkYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBzb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZXJ2ZXItY2xpZW50LmpzXCIpLmRlZmF1bHR9IHNlcnZlckNsaWVudCAtIFNlcnZlciBjbGllbnQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYWRkU29ja2V0Q29ubmVjdGlvbihzZXJ2ZXJDbGllbnQpIHtcbiAgICBjb25zdCBjbGllbnRDb3VudCA9IHNlcnZlckNsaWVudC5jbGllbnRDb3VudFxuXG4gICAgY29uc3QgaHR0cENsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgY2xpZW50Q291bnQsXG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICByZW1vdGVBZGRyZXNzOiBzZXJ2ZXJDbGllbnQucmVtb3RlQWRkcmVzc1xuICAgIH0pXG5cbiAgICBsZXQgZGVsaXZlcnlRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpXG4gICAgY29uc3QgZW5xdWV1ZURlbGl2ZXJ5ID0gKC8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gKi8gZGVsaXZlcnkpID0+IHtcbiAgICAgIGRlbGl2ZXJ5UXVldWUgPSBkZWxpdmVyeVF1ZXVlXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgLnRoZW4oZGVsaXZlcnkpXG5cbiAgICAgIHJldHVybiBkZWxpdmVyeVF1ZXVlXG4gICAgfVxuXG4gICAgaHR0cENsaWVudC5ldmVudHMub24oXCJvdXRwdXRcIiwgKG91dHB1dCkgPT4ge1xuICAgICAgaWYgKG91dHB1dCAhPT0gbnVsbCAmJiBvdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2b2lkIGVucXVldWVEZWxpdmVyeSgoKSA9PiBzZXJ2ZXJDbGllbnQuc2VuZChvdXRwdXQpKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZGVsaXZlciBjbGllbnQgb3V0cHV0XCIsIHtjbGllbnRDb3VudH0sIGVycm9yXSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaHR0cENsaWVudC5ldmVudHMub24oXCJmaWxlXCIsICh7ZmlsZVBhdGgsIHNlbmRCb2R5LCBzZXR0bGV9KSA9PiB7XG4gICAgICB2b2lkIGVucXVldWVEZWxpdmVyeShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNldHRsZShhd2FpdCBzZXJ2ZXJDbGllbnQuc2VuZEZpbGUoZmlsZVBhdGgsIHNlbmRCb2R5KSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZGVsaXZlciBmaWxlIHJlc3BvbnNlXCIsIHtjbGllbnRDb3VudCwgZmlsZVBhdGh9LCBlcnJvcl0pXG4gICAgICAgIHZvaWQgc2V0dGxlKFwiYWJvcnRlZFwiKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaHR0cENsaWVudC5ldmVudHMub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICB2b2lkIGVucXVldWVEZWxpdmVyeSgoKSA9PiBzZXJ2ZXJDbGllbnQuZW5kKCkpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdKVxuICAgIH0pXG5cbiAgICBzZXJ2ZXJDbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgY2xlYW51cCA9IGh0dHBDbGllbnQuYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGFib3J0IGZpbGUgcmVzcG9uc2VzIGFmdGVyIGNsaWVudCBjbG9zZVwiLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaWVudENsb3NlQ2xlYW51cHMuZGVsZXRlKGNsZWFudXApXG4gICAgICAgICAgZGVsZXRlIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cbiAgICAgICAgfSlcblxuICAgICAgdGhpcy5wZW5kaW5nQ2xpZW50Q2xvc2VDbGVhbnVwcy5hZGQoY2xlYW51cClcbiAgICB9KVxuXG4gICAgdGhpcy5jbGllbnRzW2NsaWVudENvdW50XSA9IHtodHRwQ2xpZW50LCBzZXJ2ZXJDbGllbnR9XG5cbiAgICAvLyBDcmVhdGUgYSBtZXNzYWdlLXBvcnQgc2hpbSBzbyBTZXJ2ZXJDbGllbnQub25Tb2NrZXREYXRhIGNhbiByb3V0ZSBkYXRhXG4gICAgLy8gdG8gdGhlIGluLXByb2Nlc3MgSFRUUCBDbGllbnQgd2l0aG91dCBuZWVkaW5nIGEgcmVhbCB3b3JrZXIgdGhyZWFkLlxuICAgIGNvbnN0IG1lc3NhZ2VQb3J0U2hpbSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwid29ya2VyX3RocmVhZHNcIikuV29ya2VyfSAqLyAoLyoqIEB0eXBlIHs/fSAqLyAoe1xuICAgICAgcG9zdE1lc3NhZ2U6ICgvKiogQHR5cGUge3tjb21tYW5kOiBzdHJpbmcsIGNodW5rPzogQnVmZmVyIHwgVWludDhBcnJheSB8IHN0cmluZywgY2xpZW50Q291bnQ/OiBudW1iZXJ9fSAqLyBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbW1hbmQgPT09IFwiY2xpZW50V3JpdGVcIiAmJiBkYXRhLmNodW5rKSB7XG4gICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jaHVuayA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5mcm9tKGRhdGEuY2h1bmspIDogQnVmZmVyLmZyb20oZGF0YS5jaHVuaylcblxuICAgICAgICAgIGh0dHBDbGllbnQub25Xcml0ZShjaHVuaylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKVxuXG4gICAgc2VydmVyQ2xpZW50LnNldFdvcmtlcihtZXNzYWdlUG9ydFNoaW0pXG4gICAgc2VydmVyQ2xpZW50Lmxpc3RlbigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLl9zdG9wcGluZyA9IHRydWVcblxuICAgIGZvciAoY29uc3Qge2h0dHBDbGllbnQsIHNlcnZlckNsaWVudH0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNsaWVudHMpKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGh0dHBDbGllbnQuYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gYWJvcnQgZmlsZSByZXNwb25zZXMgZHVyaW5nIHNodXRkb3duXCIsIGVycm9yKVxuICAgICAgICB9KSxcbiAgICAgICAgc2VydmVyQ2xpZW50LmVuZCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gY2xvc2UgY2xpZW50IGR1cmluZyBzaHV0ZG93blwiLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wZW5kaW5nQ2xpZW50Q2xvc2VDbGVhbnVwcylcblxuICAgIHRoaXMuY2xpZW50cyA9IHt9XG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3Q/LigpXG4gIH1cblxuICAvKipcbiAgICogSW4tcHJvY2VzcyBoYW5kbGVyIHBhdGggZm9yIFYyIGNoYW5uZWwgYnJvYWRjYXN0cy4gTm8gd29ya2VyXG4gICAqIGJvdW5kYXJ5IHRvIGNyb3NzIOKAlCBkaXNwYXRjaCBkaXJlY3RseSB0byBhbnkgbWF0Y2hpbmcgbGl2ZVxuICAgKiBzdWJzY3JpcHRpb25zIG9uIHRoZSBzaGFyZWQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gYXJncy5ib2R5IC0gTWVzc2FnZSBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBQZXJzaXN0ZWQgZXZlbnQgaWQgZm9yIHJlcGxheS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNwYXRjaFdlYnNvY2tldFYyQnJvYWRjYXN0KHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGV2ZW50SWR9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHJldHVyblxuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5fYnJvYWRjYXN0VG9DaGFubmVsTG9jYWwoY2hhbm5lbCwgYnJvYWRjYXN0UGFyYW1zLCBib2R5LCB7ZXZlbnRJZH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkaXNwYXRjaCB3ZWJzb2NrZXQgZXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSkge1xuICAgIGZvciAoY29uc3Qge2h0dHBDbGllbnR9IG9mIE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGh0dHBDbGllbnQud2Vic29ja2V0U2Vzc2lvblxuXG4gICAgICBpZiAoIXNlc3Npb24pIGNvbnRpbnVlXG5cbiAgICAgIHZvaWQgc2Vzc2lvbi5zZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwge2NyZWF0ZWRBdCwgZXZlbnRJZH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbikge1xuICAgICAgLy8gSXNvbGF0ZSBzdWJzY3JpYmVyIGZhaWx1cmVzIGZyb20gYnJlYWtpbmcgdGhlIGluLXByb2Nlc3MgaGFuZGxlcixcbiAgICAgIC8vIGJ1dCBzdGlsbCBzdXJmYWNlIHRoZW0gdG8gdGhlIGZyYW1ld29yayBlcnJvciBldmVudHMgc28gYnVnXG4gICAgICAvLyByZXBvcnRlcnMgY2FuIHBpY2sgdGhlbSB1cC5cbiAgICAgIHZvaWQgZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMoe2NoYW5uZWwsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgY3JlYXRlZEF0LCBldmVudElkLCBsb2dnZXI6IHRoaXMubG9nZ2VyLCBwYXlsb2FkfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLG1CQUFtQixNQUFNLDZCQUE2QixDQUFBO0FBQzdELE9BQU8sMEJBQTBCLE1BQU0sa0NBQWtDLENBQUE7QUFDekUsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxtQkFBbUIsTUFBTSw2QkFBNkIsQ0FBQTtBQUU3RDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sbUNBQW1DO0lBQ3REOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUM7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFFbEM7O21KQUUySTtRQUMzSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVqQixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFFM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNyRixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUN4QixDQUFDO0lBRUQ7O2tDQUU4QjtJQUM5QixLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLElBQUksQ0FB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QUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQTtZQUUzQyxJQUFJLENBQUMsT0FBTztnQkFBRSxTQUFRO1lBRXRCLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLG9FQUFvRTtZQUNwRSw4REFBOEQ7WUFDOUQsOEJBQThCO1lBQzlCLEtBQUssMEJBQTBCLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1FBQ2pJLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENsaWVudCBmcm9tIFwiLi4vY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBDbGllbnREZWxpdmVyeVF1ZXVlIGZyb20gXCIuLi9jbGllbnQtZGVsaXZlcnktcXVldWUuanNcIlxuaW1wb3J0IGRpc3BhdGNoQ2hhbm5lbFN1YnNjcmliZXJzIGZyb20gXCIuL2NoYW5uZWwtc3Vic2NyaWJlci1kaXNwYXRjaC5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHdlYnNvY2tldEV2ZW50c0hvc3QgZnJvbSBcIi4uL3dlYnNvY2tldC1ldmVudHMtaG9zdC5qc1wiXG5cbi8qKlxuICogSW4tcHJvY2VzcyB3b3JrZXIgaGFuZGxlciB0aGF0IHByb2Nlc3NlcyBIVFRQIHJlcXVlc3RzIGluIHRoZSBtYWluIHRocmVhZFxuICogaW5zdGVhZCBvZiBzcGF3bmluZyBhIFdvcmtlciB0aHJlYWQuIFRoaXMgYWxsb3dzIHRoZSB0ZXN0IHJ1bm5lcidzIGRhdGFiYXNlXG4gKiBjb25uZWN0aW9uIGNvbnRleHQgdG8gYmUgc2hhcmVkIHdpdGggSFRUUCByZXF1ZXN0IGhhbmRsZXJzLCBzbyBtb2RlbC1jcmVhdGVkXG4gKiByZWNvcmRzIGluIHRlc3RzIGFyZSB2aXNpYmxlIHRvIEhUVFAgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVySW5Qcm9jZXNzSGFuZGxlciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3Mud29ya2VyQ291bnQgLSBXb3JrZXIgY291bnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgd29ya2VyQ291bnR9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCB7ZGVsaXZlcnlRdWV1ZTogQ2xpZW50RGVsaXZlcnlRdWV1ZSwgaHR0cENsaWVudDogQ2xpZW50LCBzZXJ2ZXJDbGllbnQ6IGltcG9ydChcIi4uL3NlcnZlci1jbGllbnQuanNcIikuZGVmYXVsdH0+fSAqL1xuICAgIHRoaXMuY2xpZW50cyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1NldDxQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgICB0aGlzLnBlbmRpbmdDbGllbnRDbG9zZUNsZWFudXBzID0gbmV3IFNldCgpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLndvcmtlckNvdW50ID0gd29ya2VyQ291bnRcbiAgICB0aGlzLnVucmVnaXN0ZXJGcm9tRXZlbnRzSG9zdCA9IHdlYnNvY2tldEV2ZW50c0hvc3QucmVnaXN0ZXIoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpXG4gICAgdGhpcy5fc3RvcHBpbmcgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBgSW4tcHJvY2VzcyBoYW5kbGVyICR7dGhpcy53b3JrZXJDb3VudH0gc3RhcnRlZGApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgc29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VydmVyLWNsaWVudC5qc1wiKS5kZWZhdWx0fSBzZXJ2ZXJDbGllbnQgLSBTZXJ2ZXIgY2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFNvY2tldENvbm5lY3Rpb24oc2VydmVyQ2xpZW50KSB7XG4gICAgY29uc3QgY2xpZW50Q291bnQgPSBzZXJ2ZXJDbGllbnQuY2xpZW50Q291bnRcblxuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgcmVtb3RlQWRkcmVzczogc2VydmVyQ2xpZW50LnJlbW90ZUFkZHJlc3NcbiAgICB9KVxuXG4gICAgY29uc3Qge21heEJ5dGVzLCBtYXhGcmFtZXN9ID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFdlYnNvY2tldE91dGJvdW5kUXVldWVMaW1pdHMoKVxuICAgIGNvbnN0IGRlbGl2ZXJ5UXVldWUgPSBuZXcgQ2xpZW50RGVsaXZlcnlRdWV1ZSh7XG4gICAgICBjbGllbnRDb3VudCxcbiAgICAgIG1heEJ5dGVzLFxuICAgICAgbWF4RnJhbWVzLFxuICAgICAgb25PdmVyZmxvdzogKGVycm9yKSA9PiB7XG4gICAgICAgIGRlbGl2ZXJ5UXVldWUuZGVzdHJveSgpXG4gICAgICAgIHNlcnZlckNsaWVudC5kZXN0cm95KGVycm9yKVxuICAgICAgICB0aGlzLl9yZXBvcnRPdXRib3VuZFF1ZXVlT3ZlcmZsb3coe2NsaWVudENvdW50LCBlcnJvcn0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGh0dHBDbGllbnQuZXZlbnRzLm9uKFwib3V0cHV0XCIsIChvdXRwdXQsIHt3ZWJzb2NrZXRGcmFtZSA9IGZhbHNlfSA9IHt9KSA9PiB7XG4gICAgICBpZiAob3V0cHV0ICE9PSBudWxsICYmIG91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJ5ID0gKCkgPT4gc2VydmVyQ2xpZW50LnNlbmQob3V0cHV0KVxuICAgICAgICBjb25zdCBxdWV1ZWQgPSB3ZWJzb2NrZXRGcmFtZVxuICAgICAgICAgID8gZGVsaXZlcnlRdWV1ZS5lbnF1ZXVlRnJhbWUoe1xuICAgICAgICAgICAgYnl0ZUxlbmd0aDogdHlwZW9mIG91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IEJ1ZmZlci5ieXRlTGVuZ3RoKG91dHB1dCkgOiBvdXRwdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIGRlbGl2ZXJ5XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IGRlbGl2ZXJ5UXVldWUuZW5xdWV1ZUNvbnRyb2woZGVsaXZlcnkpXG5cbiAgICAgICAgdm9pZCBxdWV1ZWQuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW1wiRmFpbGVkIHRvIGRlbGl2ZXIgY2xpZW50IG91dHB1dFwiLCB7Y2xpZW50Q291bnR9LCBlcnJvcl0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGh0dHBDbGllbnQuZXZlbnRzLm9uKFwiZmlsZVwiLCAoe2ZpbGVQYXRoLCBzZW5kQm9keSwgc2V0dGxlfSkgPT4ge1xuICAgICAgdm9pZCBkZWxpdmVyeVF1ZXVlLmVucXVldWVDb250cm9sKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgc2V0dGxlKGF3YWl0IHNlcnZlckNsaWVudC5zZW5kRmlsZShmaWxlUGF0aCwgc2VuZEJvZHkpKVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBkZWxpdmVyIGZpbGUgcmVzcG9uc2VcIiwge2NsaWVudENvdW50LCBmaWxlUGF0aH0sIGVycm9yXSlcbiAgICAgICAgdm9pZCBzZXR0bGUoXCJhYm9ydGVkXCIpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBodHRwQ2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHZvaWQgZGVsaXZlcnlRdWV1ZS5lbnF1ZXVlQ29udHJvbCgoKSA9PiBzZXJ2ZXJDbGllbnQuZW5kKCkpXG4gICAgICAgIC5maW5hbGx5KCgpID0+IGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdKVxuICAgIH0pXG5cbiAgICBzZXJ2ZXJDbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgZGVsaXZlcnlRdWV1ZS5kZXN0cm95KClcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBodHRwQ2xpZW50LmFib3J0UGVuZGluZ0ZpbGVSZXNwb25zZXMoKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBhYm9ydCBmaWxlIHJlc3BvbnNlcyBhZnRlciBjbGllbnQgY2xvc2VcIiwgZXJyb3IpXG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGllbnRDbG9zZUNsZWFudXBzLmRlbGV0ZShjbGVhbnVwKVxuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG4gICAgICAgIH0pXG5cbiAgICAgIHRoaXMucGVuZGluZ0NsaWVudENsb3NlQ2xlYW51cHMuYWRkKGNsZWFudXApXG4gICAgfSlcblxuICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSB7ZGVsaXZlcnlRdWV1ZSwgaHR0cENsaWVudCwgc2VydmVyQ2xpZW50fVxuXG4gICAgLy8gQ3JlYXRlIGEgbWVzc2FnZS1wb3J0IHNoaW0gc28gU2VydmVyQ2xpZW50Lm9uU29ja2V0RGF0YSBjYW4gcm91dGUgZGF0YVxuICAgIC8vIHRvIHRoZSBpbi1wcm9jZXNzIEhUVFAgQ2xpZW50IHdpdGhvdXQgbmVlZGluZyBhIHJlYWwgd29ya2VyIHRocmVhZC5cbiAgICBjb25zdCBtZXNzYWdlUG9ydFNoaW0gPSAvKiogQHR5cGUge2ltcG9ydChcIndvcmtlcl90aHJlYWRzXCIpLldvcmtlcn0gKi8gKC8qKiBAdHlwZSB7P30gKi8gKHtcbiAgICAgIHBvc3RNZXNzYWdlOiAoLyoqIEB0eXBlIHt7Y29tbWFuZDogc3RyaW5nLCBjaHVuaz86IEJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCBzdHJpbmcsIGNsaWVudENvdW50PzogbnVtYmVyfX0gKi8gZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YS5jb21tYW5kID09PSBcImNsaWVudFdyaXRlXCIgJiYgZGF0YS5jaHVuaykge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIGRhdGEuY2h1bmsgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLmNodW5rKSA6IEJ1ZmZlci5mcm9tKGRhdGEuY2h1bmspXG5cbiAgICAgICAgICBodHRwQ2xpZW50Lm9uV3JpdGUoY2h1bmspXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSlcblxuICAgIHNlcnZlckNsaWVudC5zZXRXb3JrZXIobWVzc2FnZVBvcnRTaGltKVxuICAgIHNlcnZlckNsaWVudC5saXN0ZW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgYSBwZXItY2xpZW50IG91dGJvdW5kIHF1ZXVlIG92ZXJmbG93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE92ZXJmbG93IGRldGFpbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNsaWVudENvdW50IC0gQWZmZWN0ZWQgY2xpZW50LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBhcmdzLmVycm9yIC0gT3ZlcmZsb3cgZXJyb3IuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlcG9ydE91dGJvdW5kUXVldWVPdmVyZmxvdyh7Y2xpZW50Q291bnQsIGVycm9yfSkge1xuICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgIGNvbnRleHQ6IHtjbGllbnRDb3VudCwgd2Vic29ja2V0T3V0Ym91bmRRdWV1ZU92ZXJmbG93OiB0cnVlLCB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJDb3VudH0sXG4gICAgICBlcnJvclxuICAgIH1cbiAgICBjb25zdCBlcnJvckV2ZW50cyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRFcnJvckV2ZW50cygpXG5cbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiZnJhbWV3b3JrLWVycm9yXCIsIGVycm9yUGF5bG9hZClcbiAgICBlcnJvckV2ZW50cy5lbWl0KFwiYWxsLWVycm9yXCIsIHsuLi5lcnJvclBheWxvYWQsIGVycm9yVHlwZTogXCJmcmFtZXdvcmstZXJyb3JcIn0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLl9zdG9wcGluZyA9IHRydWVcblxuICAgIGZvciAoY29uc3Qge2h0dHBDbGllbnQsIHNlcnZlckNsaWVudH0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNsaWVudHMpKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGh0dHBDbGllbnQuYWJvcnRQZW5kaW5nRmlsZVJlc3BvbnNlcygpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gYWJvcnQgZmlsZSByZXNwb25zZXMgZHVyaW5nIHNodXRkb3duXCIsIGVycm9yKVxuICAgICAgICB9KSxcbiAgICAgICAgc2VydmVyQ2xpZW50LmVuZCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJGYWlsZWQgdG8gY2xvc2UgY2xpZW50IGR1cmluZyBzaHV0ZG93blwiLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wZW5kaW5nQ2xpZW50Q2xvc2VDbGVhbnVwcylcblxuICAgIHRoaXMuY2xpZW50cyA9IHt9XG4gICAgdGhpcy51bnJlZ2lzdGVyRnJvbUV2ZW50c0hvc3Q/LigpXG4gIH1cblxuICAvKipcbiAgICogSW4tcHJvY2VzcyBoYW5kbGVyIHBhdGggZm9yIFYyIGNoYW5uZWwgYnJvYWRjYXN0cy4gTm8gd29ya2VyXG4gICAqIGJvdW5kYXJ5IHRvIGNyb3NzIOKAlCBkaXNwYXRjaCBkaXJlY3RseSB0byBhbnkgbWF0Y2hpbmcgbGl2ZVxuICAgKiBzdWJzY3JpcHRpb25zIG9uIHRoZSBzaGFyZWQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7P30gYXJncy5ib2R5IC0gTWVzc2FnZSBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBQZXJzaXN0ZWQgZXZlbnQgaWQgZm9yIHJlcGxheS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNwYXRjaFdlYnNvY2tldFYyQnJvYWRjYXN0KHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGV2ZW50SWR9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24pIHJldHVyblxuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5fYnJvYWRjYXN0VG9DaGFubmVsTG9jYWwoY2hhbm5lbCwgYnJvYWRjYXN0UGFyYW1zLCBib2R5LCB7ZXZlbnRJZH0pXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29uZmlndXJhdGlvbi13aWRlIFYyIGJyb2FkY2FzdCB0YXJnZXQgc2hhcmVkIGJ5IGluLXByb2Nlc3MgaGFuZGxlcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gU2hhcmVkIGNvbmZpZ3VyYXRpb24gdGFyZ2V0LlxuICAgKi9cbiAgd2Vic29ja2V0VjJCcm9hZGNhc3REaXNwYXRjaEtleSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkaXNwYXRjaCB3ZWJzb2NrZXQgZXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmV2ZW50SWRdIC0gRXZlbnQgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnBheWxvYWQgLSBQYXlsb2FkIGRhdGEuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGlzcGF0Y2hXZWJzb2NrZXRFdmVudCh7Y2hhbm5lbCwgY3JlYXRlZEF0LCBldmVudElkLCBwYXlsb2FkfSkge1xuICAgIGZvciAoY29uc3Qge2h0dHBDbGllbnR9IG9mIE9iamVjdC52YWx1ZXModGhpcy5jbGllbnRzKSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGh0dHBDbGllbnQud2Vic29ja2V0U2Vzc2lvblxuXG4gICAgICBpZiAoIXNlc3Npb24pIGNvbnRpbnVlXG5cbiAgICAgIHZvaWQgc2Vzc2lvbi5zZW5kRXZlbnQoY2hhbm5lbCwgcGF5bG9hZCwge2NyZWF0ZWRBdCwgZXZlbnRJZH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbikge1xuICAgICAgLy8gSXNvbGF0ZSBzdWJzY3JpYmVyIGZhaWx1cmVzIGZyb20gYnJlYWtpbmcgdGhlIGluLXByb2Nlc3MgaGFuZGxlcixcbiAgICAgIC8vIGJ1dCBzdGlsbCBzdXJmYWNlIHRoZW0gdG8gdGhlIGZyYW1ld29yayBlcnJvciBldmVudHMgc28gYnVnXG4gICAgICAvLyByZXBvcnRlcnMgY2FuIHBpY2sgdGhlbSB1cC5cbiAgICAgIHZvaWQgZGlzcGF0Y2hDaGFubmVsU3Vic2NyaWJlcnMoe2NoYW5uZWwsIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbiwgY3JlYXRlZEF0LCBldmVudElkLCBsb2dnZXI6IHRoaXMubG9nZ2VyLCBwYXlsb2FkfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -25,8 +25,8 @@ export default class VelociousHttpServerWorker {
25
25
  _debugSnapshotRequests: Map<number, {
26
26
  resolve: (snapshot: Record<string, unknown>) => void;
27
27
  }>;
28
- /** @type {Map<number, Promise<void>>} */
29
- _clientDeliveryQueues: Map<number, Promise<void>>;
28
+ /** @type {Map<number, ClientDeliveryQueue>} */
29
+ _clientDeliveryQueues: Map<number, ClientDeliveryQueue>;
30
30
  start(): Promise<any>;
31
31
  onStartCallback: ((value: any) => void) | null | undefined;
32
32
  _spawnWorker(): Promise<void>;
@@ -70,6 +70,7 @@ export default class VelociousHttpServerWorker {
70
70
  * @param {string} [data.filePath] - File path.
71
71
  * @param {boolean} [data.sendBody] - Whether to send the file body.
72
72
  * @param {number} [data.transferId] - File transfer id.
73
+ * @param {boolean} [data.websocketFrame] - Whether output is a completed WebSocket frame.
73
74
  * @param {string} [data.channel] - Channel name.
74
75
  * @param {number} [data.requestId] - Debug request id.
75
76
  * @param {Record<string, ?>} [data.snapshot] - Worker debug snapshot.
@@ -85,6 +86,7 @@ export default class VelociousHttpServerWorker {
85
86
  filePath?: string | undefined;
86
87
  sendBody?: boolean | undefined;
87
88
  transferId?: number | undefined;
89
+ websocketFrame?: boolean | undefined;
88
90
  channel?: string | undefined;
89
91
  requestId?: number | undefined;
90
92
  snapshot?: Record<string, any> | undefined;
@@ -94,11 +96,35 @@ export default class VelociousHttpServerWorker {
94
96
  }) => void;
95
97
  /**
96
98
  * Preserves socket output ordering for one client.
97
- * @param {number} clientCount - Client count.
99
+ * @param {import("../server-client.js").default} client - Client instance.
100
+ * @param {string | Uint8Array} output - Complete output buffer.
101
+ * @returns {Promise<void>} - Queued delivery.
102
+ */
103
+ enqueueClientFrame(client: import("../server-client.js").default, output: string | Uint8Array): Promise<void>;
104
+ /**
105
+ * Preserves ordering for a delivery that retains no complete output frame.
106
+ * @param {import("../server-client.js").default} client - Client instance.
98
107
  * @param {() => Promise<void>} delivery - Delivery operation.
99
108
  * @returns {Promise<void>} - Queued delivery.
100
109
  */
101
- enqueueClientDelivery(clientCount: number, delivery: () => Promise<void>): Promise<void>;
110
+ enqueueClientControl(client: import("../server-client.js").default, delivery: () => Promise<void>): Promise<void>;
111
+ /**
112
+ * Gets or creates one client's delivery queue.
113
+ * @param {import("../server-client.js").default} client - Client instance.
114
+ * @returns {ClientDeliveryQueue} - Client-owned delivery queue.
115
+ */
116
+ _deliveryQueueFor(client: import("../server-client.js").default): ClientDeliveryQueue;
117
+ /**
118
+ * Reports a per-client outbound queue overflow.
119
+ * @param {object} args - Overflow details.
120
+ * @param {number} args.clientCount - Affected client.
121
+ * @param {Error} args.error - Overflow error.
122
+ * @returns {void}
123
+ */
124
+ _reportOutboundQueueOverflow({ clientCount, error }: {
125
+ clientCount: number;
126
+ error: Error;
127
+ }): void;
102
128
  /**
103
129
  * Runs get debug snapshot.
104
130
  * @returns {Promise<Record<string, ?>>} - Worker-local debug snapshot.
@@ -142,6 +168,11 @@ export default class VelociousHttpServerWorker {
142
168
  eventId?: string | undefined;
143
169
  createdAt?: string | undefined;
144
170
  }): void;
171
+ /**
172
+ * Gets this worker's isolated V2 broadcast target.
173
+ * @returns {VelociousHttpServerWorker} - This worker handler.
174
+ */
175
+ websocketV2BroadcastDispatchKey(): VelociousHttpServerWorker;
145
176
  /**
146
177
  * Runs register with events host.
147
178
  * @returns {void} */
@@ -153,5 +184,6 @@ export default class VelociousHttpServerWorker {
153
184
  unregisterFromEventsHostIfNeeded(): void;
154
185
  }
155
186
  import Logger from "../../logger.js";
187
+ import ClientDeliveryQueue from "../client-delivery-queue.js";
156
188
  import { Worker } from "worker_threads";
157
189
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/index.js"],"names":[],"mappings":"AAoCA;IACE;;;;;OAKG;IACH,4CAHG;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC3B,WAAW,EAAxB,MAAM;KAChB,EAqBA;IAnBC,wDAAkC;IAElC;;uEAEmE;IACnE,SADU,MAAM,CAAC,MAAM,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAC9C;IAEjB,eAA8B;IAC9B,oBAA8B;IAC9B,uBAA0B;IAC1B,mBAAsB;IACtB,wBAAwB;IACxB;;+EAE2E;IAC3E,wBADU,GAAG,CAAC,MAAM,EAAE;QAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,IAAI,CAAA;KAAC,CAAC,CAChC;IAEvC,yCAAyC;IACzC,uBADW,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CACC;IAGxC,sBAKC;IAHG,2DAA8B;IAKlC,8BAgBC;IAXC,2BAOE;IAMJ;;;;OAIG;IACH,4BAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAehB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,IAAI,CAQhB;IAED;;;OAGG;IACH,gBAAiB,OAFN,OAEW,WAKrB;IAED;;;;OAIG;IACH,eAAgB,MAHL,MAGS,KAFP,IAAI,CAmBhB;IAhBC,gCAAsB;IAetB,6EAAwB;IAG1B;;;OAGG;IACH,oBAFa,IAAI,CAahB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAmB,MAdhB;QAAqB,OAAO,EAApB,MAAM;QACQ,WAAW;QACE,MAAM;QACnB,QAAQ;QACP,QAAQ;QACT,UAAU;QACV,OAAO;QACP,SAAS;QACE,QAAQ;QACxB,OAAO,GAAhB,OAAC;QACwB,eAAe;QAC/B,IAAI,GAAb,OAAC;KAGW,KAFV,IAAI,CAyGhB;IAED;;;;;OAKG;IACH,mCAJW,MAAM,YACN,MAAM,OAAO,CAAC,IAAI,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,oBAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAiCtC;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;;;OAQG;IACH,iEANG;QAAqB,OAAO,EAApB,MAAM;QACQ,SAAS;QACT,OAAO;QACb,OAAO,EAAf,OAAC;KACT,GAAU,IAAI,CAQhB;IAED;;;;;;;;;;OAUG;IACH,qFAPG;QAAqB,OAAO,EAApB,MAAM;QACkB,eAAe,EAAvC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;QACT,IAAI,EAAZ,OAAC;QACa,OAAO;QACP,SAAS;KAC/B,GAAU,IAAI,CAOhB;IAED;;yBAEqB;IACrB,0BADa,IAAI,CAKhB;IADC,0DAAkE;IAGpE;;yBAEqB;IACrB,oCADa,IAAI,CAMhB;CACF;mBA3akB,iBAAiB;uBACf,gBAAgB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/http-server/worker-handler/index.js"],"names":[],"mappings":"AAqCA;IACE;;;;;OAKG;IACH,4CAHG;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QAC3B,WAAW,EAAxB,MAAM;KAChB,EAqBA;IAnBC,wDAAkC;IAElC;;uEAEmE;IACnE,SADU,MAAM,CAAC,MAAM,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAC9C;IAEjB,eAA8B;IAC9B,oBAA8B;IAC9B,uBAA0B;IAC1B,mBAAsB;IACtB,wBAAwB;IACxB;;+EAE2E;IAC3E,wBADU,GAAG,CAAC,MAAM,EAAE;QAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,KAAK,IAAI,CAAA;KAAC,CAAC,CAChC;IAEvC,+CAA+C;IAC/C,uBADW,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CACL;IAGxC,sBAKC;IAHG,2DAA8B;IAKlC,8BAgBC;IAXC,2BAOE;IAMJ;;;;OAIG;IACH,4BAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,IAAI,CAehB;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,gBAAiB,OAFN,OAEW,WAKrB;IAED;;;;OAIG;IACH,eAAgB,MAHL,MAGS,KAFP,IAAI,CAmBhB;IAhBC,gCAAsB;IAetB,6EAAwB;IAG1B;;;OAGG;IACH,oBAFa,IAAI,CAiBhB;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAmB,MAfhB;QAAqB,OAAO,EAApB,MAAM;QACQ,WAAW;QACE,MAAM;QACnB,QAAQ;QACP,QAAQ;QACT,UAAU;QACT,cAAc;QACf,OAAO;QACP,SAAS;QACE,QAAQ;QACxB,OAAO,GAAhB,OAAC;QACwB,eAAe;QAC/B,IAAI,GAAb,OAAC;KAGW,KAFV,IAAI,CAkHhB;IAED;;;;;OAKG;IACH,2BAJW,OAAO,qBAAqB,EAAE,OAAO,UACrC,MAAM,GAAG,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CASzB;IAED;;;;;OAKG;IACH,6BAJW,OAAO,qBAAqB,EAAE,OAAO,YACrC,MAAM,OAAO,CAAC,IAAI,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;;OAIG;IACH,0BAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,mBAAmB,CAoB/B;IAED;;;;;;OAMG;IACH,qDAJG;QAAqB,WAAW,EAAxB,MAAM;QACM,KAAK,EAAjB,KAAK;KACb,GAAU,IAAI,CAWhB;IAED;;;OAGG;IACH,oBAFa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAiCtC;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;;;OAQG;IACH,iEANG;QAAqB,OAAO,EAApB,MAAM;QACQ,SAAS;QACT,OAAO;QACb,OAAO,EAAf,OAAC;KACT,GAAU,IAAI,CAQhB;IAED;;;;;;;;;;OAUG;IACH,qFAPG;QAAqB,OAAO,EAApB,MAAM;QACkB,eAAe,EAAvC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;QACT,IAAI,EAAZ,OAAC;QACa,OAAO;QACP,SAAS;KAC/B,GAAU,IAAI,CAOhB;IAED;;;OAGG;IACH,mCAFa,yBAAyB,CAIrC;IAED;;yBAEqB;IACrB,0BADa,IAAI,CAKhB;IADC,0DAAkE;IAGpE;;yBAEqB;IACrB,oCADa,IAAI,CAMhB;CACF;mBAjfkB,iBAAiB;gCACJ,6BAA6B;uBACxC,gBAAgB"}