@decaf-ts/core 0.9.0 → 0.9.1-9.tasks

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 (554) hide show
  1. package/README.md +1 -1
  2. package/dist/core.cjs +6705 -2
  3. package/dist/core.js +6932 -2
  4. package/lib/auth/constants.cjs +1 -1
  5. package/lib/auth/decorators.cjs +1 -1
  6. package/lib/auth/index.cjs +1 -1
  7. package/lib/esm/auth/constants.js +1 -1
  8. package/lib/esm/auth/decorators.js +1 -1
  9. package/lib/esm/auth/index.js +1 -1
  10. package/lib/esm/fs/FilesystemAdapter.d.ts +1 -0
  11. package/lib/esm/fs/FilesystemAdapter.js +3 -2
  12. package/lib/esm/fs/FsDispatch.js +1 -1
  13. package/lib/esm/fs/helpers.js +1 -1
  14. package/lib/esm/fs/index.js +1 -1
  15. package/lib/esm/fs/indexStore.js +1 -1
  16. package/lib/esm/fs/locks/FilesystemLock.js +1 -1
  17. package/lib/esm/fs/locks/FilesystemMultiLock.js +1 -1
  18. package/lib/esm/fs/types.d.ts +6 -0
  19. package/lib/esm/fs/types.js +1 -1
  20. package/lib/esm/identity/decorators.js +1 -1
  21. package/lib/esm/identity/index.js +1 -1
  22. package/lib/esm/index.d.ts +1 -1
  23. package/lib/esm/index.js +2 -2
  24. package/lib/esm/interfaces/ContextuallyLogged.js +1 -1
  25. package/lib/esm/interfaces/ErrorParser.js +1 -1
  26. package/lib/esm/interfaces/Executor.js +1 -1
  27. package/lib/esm/interfaces/Observable.js +1 -1
  28. package/lib/esm/interfaces/Observer.js +1 -1
  29. package/lib/esm/interfaces/Paginatable.js +1 -1
  30. package/lib/esm/interfaces/Queriable.js +1 -1
  31. package/lib/esm/interfaces/RawExecutor.js +1 -1
  32. package/lib/esm/interfaces/SequenceOptions.js +1 -1
  33. package/lib/esm/interfaces/index.js +1 -1
  34. package/lib/esm/migrations/Migration.js +1 -1
  35. package/lib/esm/migrations/MigrationService.js +1 -1
  36. package/lib/esm/migrations/MigrationTasks.js +1 -1
  37. package/lib/esm/migrations/constants.js +1 -1
  38. package/lib/esm/migrations/decorators.js +1 -1
  39. package/lib/esm/migrations/index.js +1 -1
  40. package/lib/esm/migrations/types.js +1 -1
  41. package/lib/esm/model/BaseModel.js +1 -1
  42. package/lib/esm/model/SequenceModel.js +1 -1
  43. package/lib/esm/model/construction.d.ts +1 -1
  44. package/lib/esm/model/construction.js +25 -3
  45. package/lib/esm/model/decorators.js +1 -1
  46. package/lib/esm/model/index.js +1 -1
  47. package/lib/esm/model/indexing.js +1 -1
  48. package/lib/esm/model/types.js +1 -1
  49. package/lib/esm/overrides/Metadata.js +1 -1
  50. package/lib/esm/overrides/Model.js +1 -1
  51. package/lib/esm/overrides/ModelBuilder.js +1 -1
  52. package/lib/esm/overrides/index.js +1 -1
  53. package/lib/esm/overrides/injectables.js +1 -1
  54. package/lib/esm/overrides/overrides.js +29 -1
  55. package/lib/esm/persistence/Adapter.js +14 -2
  56. package/lib/esm/persistence/Context.js +1 -1
  57. package/lib/esm/persistence/ContextLock.js +1 -1
  58. package/lib/esm/persistence/Dispatch.d.ts +7 -0
  59. package/lib/esm/persistence/Dispatch.js +20 -3
  60. package/lib/esm/persistence/ObserverHandler.js +1 -1
  61. package/lib/esm/persistence/Sequence.js +1 -1
  62. package/lib/esm/persistence/constants.js +2 -1
  63. package/lib/esm/persistence/decorators.js +1 -1
  64. package/lib/esm/persistence/errors.js +1 -1
  65. package/lib/esm/persistence/event-filters.js +1 -1
  66. package/lib/esm/persistence/generators.js +1 -1
  67. package/lib/esm/persistence/index.js +1 -1
  68. package/lib/esm/persistence/transactions.js +1 -1
  69. package/lib/esm/persistence/types.d.ts +1 -0
  70. package/lib/esm/persistence/types.js +1 -1
  71. package/lib/esm/query/Condition.js +1 -1
  72. package/lib/esm/query/MethodQueryBuilder.js +1 -1
  73. package/lib/esm/query/Paginator.js +1 -1
  74. package/lib/esm/query/Statement.js +1 -1
  75. package/lib/esm/query/constants.js +1 -1
  76. package/lib/esm/query/decorators.js +1 -1
  77. package/lib/esm/query/errors.js +1 -1
  78. package/lib/esm/query/index.js +1 -1
  79. package/lib/esm/query/options.js +1 -1
  80. package/lib/esm/query/selectors.js +1 -1
  81. package/lib/esm/query/types.js +1 -1
  82. package/lib/esm/query/utils.js +1 -1
  83. package/lib/esm/ram/RamAdapter.js +1 -1
  84. package/lib/esm/ram/RamPaginator.js +1 -1
  85. package/lib/esm/ram/RamStatement.js +1 -1
  86. package/lib/esm/ram/constants.js +1 -1
  87. package/lib/esm/ram/handlers.js +1 -1
  88. package/lib/esm/ram/index.js +1 -1
  89. package/lib/esm/ram/types.js +1 -1
  90. package/lib/esm/repository/Repository.d.ts +2 -2
  91. package/lib/esm/repository/Repository.js +19 -16
  92. package/lib/esm/repository/constants.js +1 -1
  93. package/lib/esm/repository/decorators.js +2 -2
  94. package/lib/esm/repository/errors.js +1 -1
  95. package/lib/esm/repository/index.js +1 -1
  96. package/lib/esm/repository/injectables.js +4 -2
  97. package/lib/esm/repository/types.js +1 -1
  98. package/lib/esm/repository/utils.js +1 -1
  99. package/lib/esm/services/ModelService.d.ts +4 -5
  100. package/lib/esm/services/ModelService.js +4 -2
  101. package/lib/esm/services/PersistenceService.js +1 -1
  102. package/lib/esm/services/index.js +1 -1
  103. package/lib/esm/services/services.js +1 -1
  104. package/lib/esm/tasks/CleanUpTask.js +1 -1
  105. package/lib/esm/tasks/TaskContext.d.ts +3 -1
  106. package/lib/esm/tasks/TaskContext.js +9 -2
  107. package/lib/esm/tasks/TaskEngine.d.ts +2 -0
  108. package/lib/esm/tasks/TaskEngine.js +84 -20
  109. package/lib/esm/tasks/TaskErrors.js +1 -1
  110. package/lib/esm/tasks/TaskEventBus.js +1 -1
  111. package/lib/esm/tasks/TaskEventService.d.ts +7 -0
  112. package/lib/esm/tasks/TaskEventService.js +16 -0
  113. package/lib/esm/tasks/TaskHandler.js +1 -1
  114. package/lib/esm/tasks/TaskHandlerRegistry.js +1 -1
  115. package/lib/esm/tasks/TaskService.d.ts +5 -1
  116. package/lib/esm/tasks/TaskService.js +11 -37
  117. package/lib/esm/tasks/TaskStateChangeError.js +1 -1
  118. package/lib/esm/tasks/TaskTracker.js +1 -1
  119. package/lib/esm/tasks/builder.js +1 -1
  120. package/lib/esm/tasks/constants.js +1 -1
  121. package/lib/esm/tasks/decorators.js +1 -1
  122. package/lib/esm/tasks/index.d.ts +1 -0
  123. package/lib/esm/tasks/index.js +2 -1
  124. package/lib/esm/tasks/logging.js +4 -7
  125. package/lib/esm/tasks/models/TaskBackoffModel.js +1 -1
  126. package/lib/esm/tasks/models/TaskErrorModel.js +1 -1
  127. package/lib/esm/tasks/models/TaskEventModel.js +1 -1
  128. package/lib/esm/tasks/models/TaskIOSerializer.js +1 -1
  129. package/lib/esm/tasks/models/TaskLogEntryModel.d.ts +1 -0
  130. package/lib/esm/tasks/models/TaskLogEntryModel.js +6 -2
  131. package/lib/esm/tasks/models/TaskModel.js +1 -1
  132. package/lib/esm/tasks/models/TaskStepResultModel.js +1 -1
  133. package/lib/esm/tasks/models/TaskStepSpecModel.d.ts +1 -0
  134. package/lib/esm/tasks/models/TaskStepSpecModel.js +7 -3
  135. package/lib/esm/tasks/models/index.js +1 -1
  136. package/lib/esm/tasks/types.d.ts +7 -3
  137. package/lib/esm/tasks/types.js +1 -1
  138. package/lib/esm/tasks/utils.js +1 -1
  139. package/lib/esm/utils/ContextualLoggedClass.js +1 -1
  140. package/lib/esm/utils/decorators.js +1 -1
  141. package/lib/esm/utils/errors.js +1 -1
  142. package/lib/esm/utils/index.js +1 -1
  143. package/lib/esm/utils/throttling.js +1 -1
  144. package/lib/esm/utils/types.js +1 -1
  145. package/lib/esm/utils/utils.d.ts +2 -1
  146. package/lib/esm/utils/utils.js +23 -6
  147. package/lib/esm/workers/TaskEngine.js +15 -4
  148. package/lib/esm/workers/WorkThreadEnvironment.js +1 -1
  149. package/lib/esm/workers/index.js +1 -1
  150. package/lib/esm/workers/messages.js +1 -1
  151. package/lib/esm/workers/types.js +1 -1
  152. package/lib/esm/workers/workerThread.js +36 -8
  153. package/lib/fs/FilesystemAdapter.cjs +3 -2
  154. package/lib/fs/FilesystemAdapter.d.ts +1 -0
  155. package/lib/fs/FsDispatch.cjs +1 -1
  156. package/lib/fs/helpers.cjs +1 -1
  157. package/lib/fs/index.cjs +1 -1
  158. package/lib/fs/indexStore.cjs +1 -1
  159. package/lib/fs/locks/FilesystemLock.cjs +1 -1
  160. package/lib/fs/locks/FilesystemMultiLock.cjs +1 -1
  161. package/lib/fs/types.cjs +1 -1
  162. package/lib/fs/types.d.ts +6 -0
  163. package/lib/identity/decorators.cjs +1 -1
  164. package/lib/identity/index.cjs +1 -1
  165. package/lib/index.cjs +2 -2
  166. package/lib/index.d.ts +1 -1
  167. package/lib/interfaces/ContextuallyLogged.cjs +1 -1
  168. package/lib/interfaces/ErrorParser.cjs +1 -1
  169. package/lib/interfaces/Executor.cjs +1 -1
  170. package/lib/interfaces/Observable.cjs +1 -1
  171. package/lib/interfaces/Observer.cjs +1 -1
  172. package/lib/interfaces/Paginatable.cjs +1 -1
  173. package/lib/interfaces/Queriable.cjs +1 -1
  174. package/lib/interfaces/RawExecutor.cjs +1 -1
  175. package/lib/interfaces/SequenceOptions.cjs +1 -1
  176. package/lib/interfaces/index.cjs +1 -1
  177. package/lib/migrations/Migration.cjs +1 -1
  178. package/lib/migrations/MigrationService.cjs +1 -1
  179. package/lib/migrations/MigrationTasks.cjs +1 -1
  180. package/lib/migrations/constants.cjs +1 -1
  181. package/lib/migrations/decorators.cjs +1 -1
  182. package/lib/migrations/index.cjs +1 -1
  183. package/lib/migrations/types.cjs +1 -1
  184. package/lib/model/BaseModel.cjs +1 -1
  185. package/lib/model/SequenceModel.cjs +1 -1
  186. package/lib/model/construction.cjs +25 -3
  187. package/lib/model/construction.d.ts +1 -1
  188. package/lib/model/decorators.cjs +1 -1
  189. package/lib/model/index.cjs +1 -1
  190. package/lib/model/indexing.cjs +1 -1
  191. package/lib/model/types.cjs +1 -1
  192. package/lib/overrides/Metadata.cjs +1 -1
  193. package/lib/overrides/Model.cjs +1 -1
  194. package/lib/overrides/ModelBuilder.cjs +1 -1
  195. package/lib/overrides/index.cjs +1 -1
  196. package/lib/overrides/injectables.cjs +1 -1
  197. package/lib/overrides/overrides.cjs +29 -1
  198. package/lib/persistence/Adapter.cjs +14 -2
  199. package/lib/persistence/Context.cjs +1 -1
  200. package/lib/persistence/ContextLock.cjs +1 -1
  201. package/lib/persistence/Dispatch.cjs +20 -3
  202. package/lib/persistence/Dispatch.d.ts +7 -0
  203. package/lib/persistence/ObserverHandler.cjs +1 -1
  204. package/lib/persistence/Sequence.cjs +1 -1
  205. package/lib/persistence/constants.cjs +2 -1
  206. package/lib/persistence/decorators.cjs +1 -1
  207. package/lib/persistence/errors.cjs +1 -1
  208. package/lib/persistence/event-filters.cjs +1 -1
  209. package/lib/persistence/generators.cjs +1 -1
  210. package/lib/persistence/index.cjs +1 -1
  211. package/lib/persistence/transactions.cjs +1 -1
  212. package/lib/persistence/types.cjs +1 -1
  213. package/lib/persistence/types.d.ts +1 -0
  214. package/lib/query/Condition.cjs +1 -1
  215. package/lib/query/MethodQueryBuilder.cjs +1 -1
  216. package/lib/query/Paginator.cjs +1 -1
  217. package/lib/query/Statement.cjs +1 -1
  218. package/lib/query/constants.cjs +1 -1
  219. package/lib/query/decorators.cjs +1 -1
  220. package/lib/query/errors.cjs +1 -1
  221. package/lib/query/index.cjs +1 -1
  222. package/lib/query/options.cjs +1 -1
  223. package/lib/query/selectors.cjs +1 -1
  224. package/lib/query/types.cjs +1 -1
  225. package/lib/query/utils.cjs +1 -1
  226. package/lib/ram/RamAdapter.cjs +1 -1
  227. package/lib/ram/RamPaginator.cjs +1 -1
  228. package/lib/ram/RamStatement.cjs +1 -1
  229. package/lib/ram/constants.cjs +1 -1
  230. package/lib/ram/handlers.cjs +1 -1
  231. package/lib/ram/index.cjs +1 -1
  232. package/lib/ram/types.cjs +1 -1
  233. package/lib/repository/Repository.cjs +19 -16
  234. package/lib/repository/Repository.d.ts +2 -2
  235. package/lib/repository/constants.cjs +1 -1
  236. package/lib/repository/decorators.cjs +2 -2
  237. package/lib/repository/errors.cjs +1 -1
  238. package/lib/repository/index.cjs +1 -1
  239. package/lib/repository/injectables.cjs +4 -2
  240. package/lib/repository/types.cjs +1 -1
  241. package/lib/repository/utils.cjs +1 -1
  242. package/lib/services/ModelService.cjs +4 -2
  243. package/lib/services/ModelService.d.ts +4 -5
  244. package/lib/services/PersistenceService.cjs +1 -1
  245. package/lib/services/index.cjs +1 -1
  246. package/lib/services/services.cjs +1 -1
  247. package/lib/tasks/CleanUpTask.cjs +1 -1
  248. package/lib/tasks/TaskContext.cjs +9 -2
  249. package/lib/tasks/TaskContext.d.ts +3 -1
  250. package/lib/tasks/TaskEngine.cjs +84 -20
  251. package/lib/tasks/TaskEngine.d.ts +2 -0
  252. package/lib/tasks/TaskErrors.cjs +1 -1
  253. package/lib/tasks/TaskEventBus.cjs +1 -1
  254. package/lib/tasks/TaskEventService.cjs +20 -0
  255. package/lib/tasks/TaskEventService.d.ts +7 -0
  256. package/lib/tasks/TaskHandler.cjs +1 -1
  257. package/lib/tasks/TaskHandlerRegistry.cjs +1 -1
  258. package/lib/tasks/TaskService.cjs +10 -36
  259. package/lib/tasks/TaskService.d.ts +5 -1
  260. package/lib/tasks/TaskStateChangeError.cjs +1 -1
  261. package/lib/tasks/TaskTracker.cjs +1 -1
  262. package/lib/tasks/builder.cjs +1 -1
  263. package/lib/tasks/constants.cjs +1 -1
  264. package/lib/tasks/decorators.cjs +1 -1
  265. package/lib/tasks/index.cjs +2 -1
  266. package/lib/tasks/index.d.ts +1 -0
  267. package/lib/tasks/logging.cjs +4 -7
  268. package/lib/tasks/models/TaskBackoffModel.cjs +1 -1
  269. package/lib/tasks/models/TaskErrorModel.cjs +1 -1
  270. package/lib/tasks/models/TaskEventModel.cjs +1 -1
  271. package/lib/tasks/models/TaskIOSerializer.cjs +1 -1
  272. package/lib/tasks/models/TaskLogEntryModel.cjs +5 -1
  273. package/lib/tasks/models/TaskLogEntryModel.d.ts +1 -0
  274. package/lib/tasks/models/TaskModel.cjs +1 -1
  275. package/lib/tasks/models/TaskStepResultModel.cjs +1 -1
  276. package/lib/tasks/models/TaskStepSpecModel.cjs +6 -2
  277. package/lib/tasks/models/TaskStepSpecModel.d.ts +1 -0
  278. package/lib/tasks/models/index.cjs +1 -1
  279. package/lib/tasks/types.cjs +1 -1
  280. package/lib/tasks/types.d.ts +7 -3
  281. package/lib/tasks/utils.cjs +1 -1
  282. package/lib/utils/ContextualLoggedClass.cjs +1 -1
  283. package/lib/utils/decorators.cjs +1 -1
  284. package/lib/utils/errors.cjs +1 -1
  285. package/lib/utils/index.cjs +1 -1
  286. package/lib/utils/throttling.cjs +1 -1
  287. package/lib/utils/types.cjs +1 -1
  288. package/lib/utils/utils.cjs +22 -5
  289. package/lib/utils/utils.d.ts +2 -1
  290. package/lib/workers/TaskEngine.cjs +15 -4
  291. package/lib/workers/WorkThreadEnvironment.cjs +1 -1
  292. package/lib/workers/index.cjs +1 -1
  293. package/lib/workers/messages.cjs +1 -1
  294. package/lib/workers/types.cjs +1 -1
  295. package/lib/workers/workerThread.cjs +35 -7
  296. package/package.json +1 -1
  297. package/dist/core.cjs.map +0 -1
  298. package/dist/core.js.map +0 -1
  299. package/lib/auth/constants.js.map +0 -1
  300. package/lib/auth/decorators.js.map +0 -1
  301. package/lib/auth/index.js.map +0 -1
  302. package/lib/esm/auth/constants.js.map +0 -1
  303. package/lib/esm/auth/decorators.js.map +0 -1
  304. package/lib/esm/auth/index.js.map +0 -1
  305. package/lib/esm/fs/FilesystemAdapter.js.map +0 -1
  306. package/lib/esm/fs/FsDispatch.js.map +0 -1
  307. package/lib/esm/fs/helpers.js.map +0 -1
  308. package/lib/esm/fs/index.js.map +0 -1
  309. package/lib/esm/fs/indexStore.js.map +0 -1
  310. package/lib/esm/fs/locks/FilesystemLock.js.map +0 -1
  311. package/lib/esm/fs/locks/FilesystemMultiLock.js.map +0 -1
  312. package/lib/esm/fs/types.js.map +0 -1
  313. package/lib/esm/identity/decorators.js.map +0 -1
  314. package/lib/esm/identity/index.js.map +0 -1
  315. package/lib/esm/index.js.map +0 -1
  316. package/lib/esm/interfaces/ContextuallyLogged.js.map +0 -1
  317. package/lib/esm/interfaces/ErrorParser.js.map +0 -1
  318. package/lib/esm/interfaces/Executor.js.map +0 -1
  319. package/lib/esm/interfaces/Observable.js.map +0 -1
  320. package/lib/esm/interfaces/Observer.js.map +0 -1
  321. package/lib/esm/interfaces/Paginatable.js.map +0 -1
  322. package/lib/esm/interfaces/Queriable.js.map +0 -1
  323. package/lib/esm/interfaces/RawExecutor.js.map +0 -1
  324. package/lib/esm/interfaces/SequenceOptions.js.map +0 -1
  325. package/lib/esm/interfaces/index.js.map +0 -1
  326. package/lib/esm/migrations/Migration.js.map +0 -1
  327. package/lib/esm/migrations/MigrationService.js.map +0 -1
  328. package/lib/esm/migrations/MigrationTasks.js.map +0 -1
  329. package/lib/esm/migrations/constants.js.map +0 -1
  330. package/lib/esm/migrations/decorators.js.map +0 -1
  331. package/lib/esm/migrations/index.js.map +0 -1
  332. package/lib/esm/migrations/types.js.map +0 -1
  333. package/lib/esm/model/BaseModel.js.map +0 -1
  334. package/lib/esm/model/SequenceModel.js.map +0 -1
  335. package/lib/esm/model/construction.js.map +0 -1
  336. package/lib/esm/model/decorators.js.map +0 -1
  337. package/lib/esm/model/index.js.map +0 -1
  338. package/lib/esm/model/indexing.js.map +0 -1
  339. package/lib/esm/model/types.js.map +0 -1
  340. package/lib/esm/overrides/Metadata.js.map +0 -1
  341. package/lib/esm/overrides/Model.js.map +0 -1
  342. package/lib/esm/overrides/ModelBuilder.js.map +0 -1
  343. package/lib/esm/overrides/index.js.map +0 -1
  344. package/lib/esm/overrides/injectables.js.map +0 -1
  345. package/lib/esm/overrides/overrides.js.map +0 -1
  346. package/lib/esm/persistence/Adapter.js.map +0 -1
  347. package/lib/esm/persistence/Context.js.map +0 -1
  348. package/lib/esm/persistence/ContextLock.js.map +0 -1
  349. package/lib/esm/persistence/Dispatch.js.map +0 -1
  350. package/lib/esm/persistence/ObserverHandler.js.map +0 -1
  351. package/lib/esm/persistence/Sequence.js.map +0 -1
  352. package/lib/esm/persistence/constants.js.map +0 -1
  353. package/lib/esm/persistence/decorators.js.map +0 -1
  354. package/lib/esm/persistence/errors.js.map +0 -1
  355. package/lib/esm/persistence/event-filters.js.map +0 -1
  356. package/lib/esm/persistence/generators.js.map +0 -1
  357. package/lib/esm/persistence/index.js.map +0 -1
  358. package/lib/esm/persistence/transactions.js.map +0 -1
  359. package/lib/esm/persistence/types.js.map +0 -1
  360. package/lib/esm/query/Condition.js.map +0 -1
  361. package/lib/esm/query/MethodQueryBuilder.js.map +0 -1
  362. package/lib/esm/query/Paginator.js.map +0 -1
  363. package/lib/esm/query/Statement.js.map +0 -1
  364. package/lib/esm/query/constants.js.map +0 -1
  365. package/lib/esm/query/decorators.js.map +0 -1
  366. package/lib/esm/query/errors.js.map +0 -1
  367. package/lib/esm/query/index.js.map +0 -1
  368. package/lib/esm/query/options.js.map +0 -1
  369. package/lib/esm/query/selectors.js.map +0 -1
  370. package/lib/esm/query/types.js.map +0 -1
  371. package/lib/esm/query/utils.js.map +0 -1
  372. package/lib/esm/ram/RamAdapter.js.map +0 -1
  373. package/lib/esm/ram/RamPaginator.js.map +0 -1
  374. package/lib/esm/ram/RamStatement.js.map +0 -1
  375. package/lib/esm/ram/constants.js.map +0 -1
  376. package/lib/esm/ram/handlers.js.map +0 -1
  377. package/lib/esm/ram/index.js.map +0 -1
  378. package/lib/esm/ram/types.js.map +0 -1
  379. package/lib/esm/repository/Repository.js.map +0 -1
  380. package/lib/esm/repository/constants.js.map +0 -1
  381. package/lib/esm/repository/decorators.js.map +0 -1
  382. package/lib/esm/repository/errors.js.map +0 -1
  383. package/lib/esm/repository/index.js.map +0 -1
  384. package/lib/esm/repository/injectables.js.map +0 -1
  385. package/lib/esm/repository/types.js.map +0 -1
  386. package/lib/esm/repository/utils.js.map +0 -1
  387. package/lib/esm/services/ModelService.js.map +0 -1
  388. package/lib/esm/services/PersistenceService.js.map +0 -1
  389. package/lib/esm/services/index.js.map +0 -1
  390. package/lib/esm/services/services.js.map +0 -1
  391. package/lib/esm/tasks/CleanUpTask.js.map +0 -1
  392. package/lib/esm/tasks/TaskContext.js.map +0 -1
  393. package/lib/esm/tasks/TaskEngine.js.map +0 -1
  394. package/lib/esm/tasks/TaskErrors.js.map +0 -1
  395. package/lib/esm/tasks/TaskEventBus.js.map +0 -1
  396. package/lib/esm/tasks/TaskHandler.js.map +0 -1
  397. package/lib/esm/tasks/TaskHandlerRegistry.js.map +0 -1
  398. package/lib/esm/tasks/TaskService.js.map +0 -1
  399. package/lib/esm/tasks/TaskStateChangeError.js.map +0 -1
  400. package/lib/esm/tasks/TaskTracker.js.map +0 -1
  401. package/lib/esm/tasks/builder.js.map +0 -1
  402. package/lib/esm/tasks/constants.js.map +0 -1
  403. package/lib/esm/tasks/decorators.js.map +0 -1
  404. package/lib/esm/tasks/index.js.map +0 -1
  405. package/lib/esm/tasks/logging.js.map +0 -1
  406. package/lib/esm/tasks/models/TaskBackoffModel.js.map +0 -1
  407. package/lib/esm/tasks/models/TaskErrorModel.js.map +0 -1
  408. package/lib/esm/tasks/models/TaskEventModel.js.map +0 -1
  409. package/lib/esm/tasks/models/TaskIOSerializer.js.map +0 -1
  410. package/lib/esm/tasks/models/TaskLogEntryModel.js.map +0 -1
  411. package/lib/esm/tasks/models/TaskModel.js.map +0 -1
  412. package/lib/esm/tasks/models/TaskStepResultModel.js.map +0 -1
  413. package/lib/esm/tasks/models/TaskStepSpecModel.js.map +0 -1
  414. package/lib/esm/tasks/models/index.js.map +0 -1
  415. package/lib/esm/tasks/types.js.map +0 -1
  416. package/lib/esm/tasks/utils.js.map +0 -1
  417. package/lib/esm/utils/ContextualLoggedClass.js.map +0 -1
  418. package/lib/esm/utils/decorators.js.map +0 -1
  419. package/lib/esm/utils/errors.js.map +0 -1
  420. package/lib/esm/utils/index.js.map +0 -1
  421. package/lib/esm/utils/throttling.js.map +0 -1
  422. package/lib/esm/utils/types.js.map +0 -1
  423. package/lib/esm/utils/utils.js.map +0 -1
  424. package/lib/esm/workers/TaskEngine.js.map +0 -1
  425. package/lib/esm/workers/WorkThreadEnvironment.js.map +0 -1
  426. package/lib/esm/workers/index.js.map +0 -1
  427. package/lib/esm/workers/messages.js.map +0 -1
  428. package/lib/esm/workers/types.js.map +0 -1
  429. package/lib/esm/workers/workerThread.js.map +0 -1
  430. package/lib/fs/FilesystemAdapter.js.map +0 -1
  431. package/lib/fs/FsDispatch.js.map +0 -1
  432. package/lib/fs/helpers.js.map +0 -1
  433. package/lib/fs/index.js.map +0 -1
  434. package/lib/fs/indexStore.js.map +0 -1
  435. package/lib/fs/locks/FilesystemLock.js.map +0 -1
  436. package/lib/fs/locks/FilesystemMultiLock.js.map +0 -1
  437. package/lib/fs/types.js.map +0 -1
  438. package/lib/identity/decorators.js.map +0 -1
  439. package/lib/identity/index.js.map +0 -1
  440. package/lib/index.js.map +0 -1
  441. package/lib/interfaces/ContextuallyLogged.js.map +0 -1
  442. package/lib/interfaces/ErrorParser.js.map +0 -1
  443. package/lib/interfaces/Executor.js.map +0 -1
  444. package/lib/interfaces/Observable.js.map +0 -1
  445. package/lib/interfaces/Observer.js.map +0 -1
  446. package/lib/interfaces/Paginatable.js.map +0 -1
  447. package/lib/interfaces/Queriable.js.map +0 -1
  448. package/lib/interfaces/RawExecutor.js.map +0 -1
  449. package/lib/interfaces/SequenceOptions.js.map +0 -1
  450. package/lib/interfaces/index.js.map +0 -1
  451. package/lib/migrations/Migration.js.map +0 -1
  452. package/lib/migrations/MigrationService.js.map +0 -1
  453. package/lib/migrations/MigrationTasks.js.map +0 -1
  454. package/lib/migrations/constants.js.map +0 -1
  455. package/lib/migrations/decorators.js.map +0 -1
  456. package/lib/migrations/index.js.map +0 -1
  457. package/lib/migrations/types.js.map +0 -1
  458. package/lib/model/BaseModel.js.map +0 -1
  459. package/lib/model/SequenceModel.js.map +0 -1
  460. package/lib/model/construction.js.map +0 -1
  461. package/lib/model/decorators.js.map +0 -1
  462. package/lib/model/index.js.map +0 -1
  463. package/lib/model/indexing.js.map +0 -1
  464. package/lib/model/types.js.map +0 -1
  465. package/lib/overrides/Metadata.js.map +0 -1
  466. package/lib/overrides/Model.js.map +0 -1
  467. package/lib/overrides/ModelBuilder.js.map +0 -1
  468. package/lib/overrides/index.js.map +0 -1
  469. package/lib/overrides/injectables.js.map +0 -1
  470. package/lib/overrides/overrides.js.map +0 -1
  471. package/lib/persistence/Adapter.js.map +0 -1
  472. package/lib/persistence/Context.js.map +0 -1
  473. package/lib/persistence/ContextLock.js.map +0 -1
  474. package/lib/persistence/Dispatch.js.map +0 -1
  475. package/lib/persistence/ObserverHandler.js.map +0 -1
  476. package/lib/persistence/Sequence.js.map +0 -1
  477. package/lib/persistence/constants.js.map +0 -1
  478. package/lib/persistence/decorators.js.map +0 -1
  479. package/lib/persistence/errors.js.map +0 -1
  480. package/lib/persistence/event-filters.js.map +0 -1
  481. package/lib/persistence/generators.js.map +0 -1
  482. package/lib/persistence/index.js.map +0 -1
  483. package/lib/persistence/transactions.js.map +0 -1
  484. package/lib/persistence/types.js.map +0 -1
  485. package/lib/query/Condition.js.map +0 -1
  486. package/lib/query/MethodQueryBuilder.js.map +0 -1
  487. package/lib/query/Paginator.js.map +0 -1
  488. package/lib/query/Statement.js.map +0 -1
  489. package/lib/query/constants.js.map +0 -1
  490. package/lib/query/decorators.js.map +0 -1
  491. package/lib/query/errors.js.map +0 -1
  492. package/lib/query/index.js.map +0 -1
  493. package/lib/query/options.js.map +0 -1
  494. package/lib/query/selectors.js.map +0 -1
  495. package/lib/query/types.js.map +0 -1
  496. package/lib/query/utils.js.map +0 -1
  497. package/lib/ram/RamAdapter.js.map +0 -1
  498. package/lib/ram/RamPaginator.js.map +0 -1
  499. package/lib/ram/RamStatement.js.map +0 -1
  500. package/lib/ram/constants.js.map +0 -1
  501. package/lib/ram/handlers.js.map +0 -1
  502. package/lib/ram/index.js.map +0 -1
  503. package/lib/ram/types.js.map +0 -1
  504. package/lib/repository/Repository.js.map +0 -1
  505. package/lib/repository/constants.js.map +0 -1
  506. package/lib/repository/decorators.js.map +0 -1
  507. package/lib/repository/errors.js.map +0 -1
  508. package/lib/repository/index.js.map +0 -1
  509. package/lib/repository/injectables.js.map +0 -1
  510. package/lib/repository/types.js.map +0 -1
  511. package/lib/repository/utils.js.map +0 -1
  512. package/lib/services/ModelService.js.map +0 -1
  513. package/lib/services/PersistenceService.js.map +0 -1
  514. package/lib/services/index.js.map +0 -1
  515. package/lib/services/services.js.map +0 -1
  516. package/lib/tasks/CleanUpTask.js.map +0 -1
  517. package/lib/tasks/TaskContext.js.map +0 -1
  518. package/lib/tasks/TaskEngine.js.map +0 -1
  519. package/lib/tasks/TaskErrors.js.map +0 -1
  520. package/lib/tasks/TaskEventBus.js.map +0 -1
  521. package/lib/tasks/TaskHandler.js.map +0 -1
  522. package/lib/tasks/TaskHandlerRegistry.js.map +0 -1
  523. package/lib/tasks/TaskService.js.map +0 -1
  524. package/lib/tasks/TaskStateChangeError.js.map +0 -1
  525. package/lib/tasks/TaskTracker.js.map +0 -1
  526. package/lib/tasks/builder.js.map +0 -1
  527. package/lib/tasks/constants.js.map +0 -1
  528. package/lib/tasks/decorators.js.map +0 -1
  529. package/lib/tasks/index.js.map +0 -1
  530. package/lib/tasks/logging.js.map +0 -1
  531. package/lib/tasks/models/TaskBackoffModel.js.map +0 -1
  532. package/lib/tasks/models/TaskErrorModel.js.map +0 -1
  533. package/lib/tasks/models/TaskEventModel.js.map +0 -1
  534. package/lib/tasks/models/TaskIOSerializer.js.map +0 -1
  535. package/lib/tasks/models/TaskLogEntryModel.js.map +0 -1
  536. package/lib/tasks/models/TaskModel.js.map +0 -1
  537. package/lib/tasks/models/TaskStepResultModel.js.map +0 -1
  538. package/lib/tasks/models/TaskStepSpecModel.js.map +0 -1
  539. package/lib/tasks/models/index.js.map +0 -1
  540. package/lib/tasks/types.js.map +0 -1
  541. package/lib/tasks/utils.js.map +0 -1
  542. package/lib/utils/ContextualLoggedClass.js.map +0 -1
  543. package/lib/utils/decorators.js.map +0 -1
  544. package/lib/utils/errors.js.map +0 -1
  545. package/lib/utils/index.js.map +0 -1
  546. package/lib/utils/throttling.js.map +0 -1
  547. package/lib/utils/types.js.map +0 -1
  548. package/lib/utils/utils.js.map +0 -1
  549. package/lib/workers/TaskEngine.js.map +0 -1
  550. package/lib/workers/WorkThreadEnvironment.js.map +0 -1
  551. package/lib/workers/index.js.map +0 -1
  552. package/lib/workers/messages.js.map +0 -1
  553. package/lib/workers/types.js.map +0 -1
  554. package/lib/workers/workerThread.js.map +0 -1
@@ -136,4 +136,32 @@ injectable_decorators_1.Injectables.services = function () {
136
136
  injectable_decorators_1.Injectables.repositories = function () {
137
137
  return decoration_1.Metadata["innerGet"](Symbol.for(db_decorators_1.DBKeys.REPOSITORY));
138
138
  };
139
- //# sourceMappingURL=overrides.js.map
139
+ /**
140
+ * @description Merges two model instances into a new instance.
141
+ * @summary Creates a new model instance by combining properties from an old model and a new model.
142
+ * Properties from the new model override properties from the old model if they are defined.
143
+ * @template {M} - Type extending Model
144
+ * @param {M} oldModel - The original model instance
145
+ * @param {M} model - The new model instance with updated properties
146
+ * @return {M} A new model instance with merged properties
147
+ */
148
+ decorator_validation_1.Model.merge = function merge(oldModel, newModel, constructor) {
149
+ constructor = constructor || oldModel.constructor;
150
+ const extract = (model) => Object.entries(model).reduce((accum, [key, val]) => {
151
+ let hasOneToOneRelation = false;
152
+ try {
153
+ const relations = decorator_validation_1.Model.relations(constructor, key);
154
+ if (relations.key === "relation.one-to-one")
155
+ hasOneToOneRelation = true;
156
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
157
+ }
158
+ catch (e) {
159
+ hasOneToOneRelation = false;
160
+ }
161
+ if (typeof val !== "undefined" || hasOneToOneRelation)
162
+ accum[key] = val;
163
+ return accum;
164
+ }, {});
165
+ return new constructor(Object.assign({}, extract(oldModel), extract(newModel)));
166
+ }.bind(decorator_validation_1.Model);
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcnJpZGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL292ZXJyaWRlcy9vdmVycmlkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBNkQ7QUFDN0QseUVBQXVEO0FBQ3ZELDJEQUErRTtBQUMvRSwwREFBaUQ7QUFFakQsOERBQTJEO0FBQzNELHdEQUF5RDtBQUt6RCwyRUFBOEQ7QUFHOUQsd0RBQThDO0FBRzdDLHFCQUFnQixDQUFDLEtBQUssR0FBRyxTQUFTLEtBQUs7SUFHdEMsT0FBTyxxQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQVEsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBUSxDQUFDLENBQUM7QUFFaEIscUJBQWdCLENBQUMsT0FBTyxHQUFHLFNBQVMsT0FBTyxDQUMxQyxJQUFZO0lBRVosTUFBTSxJQUFJLEdBQUcscUJBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBUSxDQUFDLENBQUM7QUFFaEIscUJBQWdCLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxvQkFBb0IsQ0FFcEQsS0FBcUIsRUFBRSxFQUFpQjtJQUN4RCxNQUFNLFlBQVksR0FDaEIscUJBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLDJCQUFlLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDckQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JD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Q3hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVQsT0FBTyxJQUFJLFdBQVcsQ0FDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUN4RCxDQUFDO0FBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgREJLZXlzLCBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL0FkYXB0ZXJcIjtcblxuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZS9lcnJvcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRSZWxhdGlvbnNNZXRhZGF0YSB9IGZyb20gXCIuLi9tb2RlbFwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBJbmRleE1ldGFkYXRhIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3NlcnZpY2VzXCI7XG5pbXBvcnQgeyBUYXNrSGFuZGxlciB9IGZyb20gXCIuLi90YXNrcy9UYXNrSGFuZGxlclwiO1xuaW1wb3J0IHsgVGFza3NLZXkgfSBmcm9tIFwiLi4vdGFza3MvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvbiB9IGZyb20gXCIuLi9taWdyYXRpb25zL3R5cGVzXCI7XG5cbihNZXRhZGF0YSBhcyBhbnkpLnRhc2tzID0gZnVuY3Rpb24gdGFza3MoKTpcbiAgfCBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxUYXNrSGFuZGxlcjxhbnksIGFueT4+PlxuICB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoVGFza3NLZXkpKTtcbn0uYmluZChNZXRhZGF0YSk7XG5cbihNZXRhZGF0YSBhcyBhbnkpLnRhc2tGb3IgPSBmdW5jdGlvbiB0YXNrRm9yKFxuICB0eXBlOiBzdHJpbmdcbik6IENvbnN0cnVjdG9yPFRhc2tIYW5kbGVyPGFueSwgYW55Pj4gfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEudGFza3MoKTtcbiAgcmV0dXJuIG1ldGEgPyBtZXRhW3R5cGVdIDogdW5kZWZpbmVkO1xufS5iaW5kKE1ldGFkYXRhKTtcblxuKE1ldGFkYXRhIGFzIGFueSkudmFsaWRhdGlvbkV4Y2VwdGlvbnMgPSBmdW5jdGlvbiB2YWxpZGF0aW9uRXhjZXB0aW9uczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPih0aGlzOiBNZXRhZGF0YSwgbW9kZWw6IENvbnN0cnVjdG9yPE0+LCBvcDogT3BlcmF0aW9uS2V5cyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm9WYWxpZGF0aW9uOiBzdHJpbmdbXSA9XG4gICAgTWV0YWRhdGEuZ2V0KG1vZGVsLCBQZXJzaXN0ZW5jZUtleXMuTk9fVkFMSURBVEUpIHx8IFtdO1xuICBjb25zdCBub3ZhbGlkYXRpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobm9WYWxpZGF0aW9uKVxuICAgIC5maWx0ZXIoKFssIHZhbF0pID0+IHZhbC5pbmNsdWRlcyhvcCkpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gIGxldCBuZXN0ZWRSZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAob3AgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8IG9wID09PSBPcGVyYXRpb25LZXlzLlVQREFURSlcbiAgICBuZXN0ZWRSZWxzID0gTW9kZWwubmVzdGVkUmVsYXRpb25zKG1vZGVsKTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5ub3ZhbGlkYXRpb25FbnRyaWVzLCAuLi5uZXN0ZWRSZWxzXSldO1xufS5iaW5kKE1ldGFkYXRhKTtcblxuKE1ldGFkYXRhIGFzIGFueSkubWlncmF0aW9uc0ZvciA9IGZ1bmN0aW9uIDxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pixcbj4oYWRhcHRlcj86IEEpOiBDb25zdHJ1Y3RvcjxNaWdyYXRpb248YW55LCBBPj5bXSB7XG4gIGFkYXB0ZXIgPSBhZGFwdGVyID8/IChBZGFwdGVyLmN1cnJlbnQgYXMgQSk7XG4gIGlmICghYWRhcHRlcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYENvdWxkIG5vdCBnZXQgYWRhcHRlciBmb3IgbWlncmF0aW9uc2ApO1xuICBjb25zdCBtaWdyYXRpb25zID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShcbiAgICBTeW1ib2wuZm9yKFBlcnNpc3RlbmNlS2V5cy5NSUdSQVRJT04pLFxuICAgIGFkYXB0ZXIuYWxpYXNcbiAgKTtcbiAgcmV0dXJuIG1pZ3JhdGlvbnMubWFwKFxuICAgIChtOiB7IGNsYXNzOiBDb25zdHJ1Y3RvcjxNaWdyYXRpb248YW55LCBBPj4gfSkgPT4gbS5jbGFzc1xuICApO1xufS5iaW5kKE1ldGFkYXRhKTtcblxuKE1ldGFkYXRhIGFzIGFueSkubWlncmF0aW9ucyA9IGZ1bmN0aW9uIG1pZ3JhdGlvbnMoKTogW1xuICBzdHJpbmcsXG4gIENvbnN0cnVjdG9yPE1pZ3JhdGlvbjxhbnksIGFueT4+LFxuXVtdIHtcbiAgY29uc3QgbWlncmF0aW9uczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nLCBDb25zdHJ1Y3RvcjxNaWdyYXRpb248YW55LCBhbnk+Pj5cbiAgPiA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oXG4gICAgU3ltYm9sLmZvcihbUGVyc2lzdGVuY2VLZXlzLk1JR1JBVElPTiwgUGVyc2lzdGVuY2VLZXlzLkJZX0tFWV0uam9pbihcIi1cIikpXG4gICk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKG1pZ3JhdGlvbnMpXG4gICAgLmZsYXQoKVxuICAgIC5tYXAoKG0pID0+IFttLmNsYXNzLm5hbWUsIG0uY2xhc3NdKTtcbn0uYmluZChNZXRhZGF0YSk7XG5cbihNZXRhZGF0YSBhcyBhbnkpLnJlbGF0aW9ucyA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtOiBDb25zdHJ1Y3RvcjxNPixcbiAgcHJvcD86IGtleW9mIE1cbik6IHN0cmluZ1tdIHwgRXh0ZW5kZWRSZWxhdGlvbnNNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQobSwgUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFwcm9wKSByZXR1cm4gT2JqZWN0LmtleXMobWV0YSk7XG4gIGlmICghbWV0YVtwcm9wIGFzIHN0cmluZ10pXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTm8gcmVsYXRpb25zIG1ldGFkYXRhIGZvdW5kIGZvciBwcm9wZXJ0eSAke3Byb3AgYXMgc3RyaW5nfWBcbiAgICApO1xuICByZXR1cm4gbWV0YVtwcm9wIGFzIHN0cmluZ107XG59LmJpbmQoTWV0YWRhdGEpO1xuXG4oTW9kZWwgYXMgYW55KS5yZWxhdGlvbnMgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbTogQ29uc3RydWN0b3I8TT4gfCBNLFxuICBwcm9wPzoga2V5b2YgTVxuKTogc3RyaW5nW10gfCBFeHRlbmRlZFJlbGF0aW9uc01ldGFkYXRhIHtcbiAgcmV0dXJuIChcbiAgICBNZXRhZGF0YS5yZWxhdGlvbnMoXG4gICAgICBtIGluc3RhbmNlb2YgTW9kZWwgPyAobS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPikgOiBtLFxuICAgICAgcHJvcFxuICAgICkgfHwgW11cbiAgKTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLm5lc3RlZFJlbGF0aW9ucyA9IGZ1bmN0aW9uIDxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNLFxuICBleGlzdGluZ1JlbGF0aW9uczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10gfCBFeHRlbmRlZFJlbGF0aW9uc01ldGFkYXRhIHtcbiAgbGV0IGlubmVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZWxzID0gTWV0YWRhdGEuZ2V0KG1vZGVsIGFzIENvbnN0cnVjdG9yPE0+LCBQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKTtcbiAgaWYgKCFyZWxzIHx8ICFPYmplY3Qua2V5cyhyZWxzKS5sZW5ndGgpXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5leGlzdGluZ1JlbGF0aW9uc10pXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIHJlbHMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSByZWxzW3Byb3BdIGFzIGFueTtcbiAgICBpZiAocmVsYXRpb25NZXRhPy5jbGFzcyAmJiBNb2RlbC5yZWxhdGlvbnMocmVsYXRpb25NZXRhLmNsYXNzKSkge1xuICAgICAgY29uc3QgaW5uZXJNb2RlbFJlbHMgPSBNb2RlbC5yZWxhdGlvbnMocmVsYXRpb25NZXRhLmNsYXNzKSBhcyBzdHJpbmdbXTtcbiAgICAgIGNvbnN0IGlubmVyTW9kZWxEb3RSZWxzID0gaW5uZXJNb2RlbFJlbHMubWFwKChyKSA9PiBgJHtwcm9wfS4ke3J9YCk7XG4gICAgICBleGlzdGluZ1JlbGF0aW9ucyA9IFsuLi5leGlzdGluZ1JlbGF0aW9ucywgLi4uaW5uZXJNb2RlbERvdFJlbHNdO1xuICAgICAgaW5uZXIgPSBNb2RlbC5uZXN0ZWRSZWxhdGlvbnMocmVsYXRpb25NZXRhLmNsYXNzLCBleGlzdGluZ1JlbGF0aW9ucyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdSZWxhdGlvbnMsIC4uLmlubmVyXSldO1xufS5iaW5kKE1vZGVsKTtcblxuKE1vZGVsIGFzIGFueSkuZ2VuZXJhdGVkQnlTZXF1ZW5jZSA9IGZ1bmN0aW9uIGdlbmVyYXRlZEJ5U2VxdWVuY2U8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuPihtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+LCBwcm9wPzoga2V5b2YgTSk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25zdHIgPVxuICAgIHR5cGVvZiBtb2RlbCAhPT0gXCJmdW5jdGlvblwiID8gKG1vZGVsLmNvbnN0cnVjdG9yIGFzIGFueSkgOiBtb2RlbDtcbiAgY29uc3Qgc2VxID0gTW9kZWwuc2VxdWVuY2VGb3IoY29uc3RyKTtcbiAgcmV0dXJuICEhc2VxLmdlbmVyYXRlZDtcbn0uYmluZChNb2RlbCk7XG5cbihNb2RlbCBhcyBhbnkpLmZyb21UYWJsZSA9IGZ1bmN0aW9uIGZyb21UYWJsZTxNIGV4dGVuZHMgTW9kZWw+KFxuICB0YWJsZU5hbWU6IHN0cmluZ1xuKTogQ29uc3RydWN0b3I8TT4ge1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFBlcnNpc3RlbmNlS2V5cy5UQUJMRSkpO1xuICBpZiAoIW1ldGEgfHwgIW1ldGFbdGFibGVOYW1lXSB8fCAhTW9kZWwuZ2V0KG1ldGFbdGFibGVOYW1lXS5uYW1lKSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyB0YWJsZSBtZXRhZGF0YSBmb3VuZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIEB0YWJsZSgpP2BcbiAgICApO1xuICByZXR1cm4gTW9kZWwuZ2V0KG1ldGFbdGFibGVOYW1lXS5uYW1lKSBhcyBDb25zdHJ1Y3RvcjxNPjtcbn0uYmluZChNb2RlbCk7XG5cbihNZXRhZGF0YSBhcyBhbnkpLmNyZWF0ZWRCeSA9IGZ1bmN0aW9uIGNyZWF0ZWRCeTxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbDogTSB8IENvbnN0cnVjdG9yPE0+XG4pOiBrZXlvZiBNIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhLmdldChcbiAgICB0eXBlb2YgbW9kZWwgIT09IFwiZnVuY3Rpb25cIiA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWwsXG4gICAgUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQllcbiAgKTtcbiAgaWYgKCFtZXRhKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE5vIGNyZWF0ZWRCeSBtZXRhZGF0YSBmb3VuZCBmb3IgbW9kZWwuIGRpZCB5b3UgdXNlIEBjcmVhdGVkQnkoKT9gXG4gICAgKTtcbiAgcmV0dXJuIG1ldGE7XG59LmJpbmQoTWV0YWRhdGEpO1xuXG4oTWV0YWRhdGEgYXMgYW55KS51cGRhdGVkQnkgPSBmdW5jdGlvbiB1cGRhdGVkQnk8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKToga2V5b2YgTSB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS5nZXQoXG4gICAgdHlwZW9mIG1vZGVsICE9PSBcImZ1bmN0aW9uXCIgPyAobW9kZWwuY29uc3RydWN0b3IgYXMgYW55KSA6IG1vZGVsLFxuICAgIFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZXG4gICk7XG4gIGlmICghbWV0YSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBObyB1cGRhdGVkQnkgbWV0YWRhdGEgZm91bmQgZm9yIG1vZGVsLiBkaWQgeW91IHVzZSBAdXBkYXRlZEJ5KCk/YFxuICAgICk7XG4gIHJldHVybiBtZXRhO1xufS5iaW5kKE1ldGFkYXRhKTtcblxuKE1vZGVsIGFzIGFueSkudGFibGVOYW1lID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiB8IE1cbik6IHN0cmluZyB7XG4gIGNvbnN0IG9iaiA9XG4gICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSA6IG1vZGVsO1xuXG4gIGlmICghb2JqKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5hYmxlIHRvIGZpbmQgbW9kZWwgJHttb2RlbH1gKTtcblxuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IChtb2RlbCBhcyBhbnkpLFxuICAgIFBlcnNpc3RlbmNlS2V5cy5UQUJMRVxuICApO1xuXG4gIGlmIChtZXRhKSB7XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cbiAgaWYgKG1vZGVsIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICByZXR1cm4gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICByZXR1cm4gbW9kZWwubmFtZTtcbn07XG5cbihNb2RlbCBhcyBhbnkpLmNvbHVtbk5hbWUgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgTSxcbiAgYXR0cmlidXRlOiBrZXlvZiBNXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRhZGF0YSA9IE1ldGFkYXRhLmdldChcbiAgICBtb2RlbCBpbnN0YW5jZW9mIE1vZGVsID8gbW9kZWwuY29uc3RydWN0b3IgOiAobW9kZWwgYXMgYW55KSxcbiAgICBNZXRhZGF0YS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTiwgYXR0cmlidXRlIGFzIHN0cmluZylcbiAgKTtcbiAgcmV0dXJuIG1ldGFkYXRhID8gbWV0YWRhdGEgOiAoYXR0cmlidXRlIGFzIHN0cmluZyk7XG59O1xuXG4oTW9kZWwgYXMgYW55KS5kZWZhdWx0UXVlcnlBdHRyaWJ1dGVzID0gZnVuY3Rpb24gZGVmYXVsdFF1ZXJ5QXR0cmlidXRlczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuPihtOiBDb25zdHJ1Y3RvcjxNPiB8IE0sIHVzZURlZmF1bHQgPSBmYWxzZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY29uc3RyID0gdHlwZW9mIG0gPT09IFwiZnVuY3Rpb25cIiA/IG0gOiBtLmNvbnN0cnVjdG9yO1xuICBjb25zdCBtZXRhID0gTWV0YWRhdGEuZ2V0KFxuICAgIGNvbnN0ciBhcyBhbnksXG4gICAgTWV0YWRhdGEua2V5KFBlcnNpc3RlbmNlS2V5cy5ERUZBVUxUX1FVRVJZX0FUVFIpXG4gICk7XG4gIHJldHVybiBtZXRhID8gbWV0YSA6IHVzZURlZmF1bHQgPyBbTW9kZWwucGsobSkgYXMgc3RyaW5nXSA6IFtdO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VxdWVuY2VOYW1lID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG1vZGVsOiBNIHwgQ29uc3RydWN0b3I8TT4sXG4gIC4uLmFyZ3M6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICByZXR1cm4gW01vZGVsLnRhYmxlTmFtZShtb2RlbCksIC4uLmFyZ3NdLmpvaW4oXCJfXCIpO1xufTtcblxuKE1vZGVsIGFzIGFueSkuc2VxdWVuY2VGb3IgPSBmdW5jdGlvbiBzZXF1ZW5jZUZvcjxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBNLFxuICBwcm9wZXJ0eT86IGtleW9mIE1cbik6IFNlcXVlbmNlT3B0aW9ucyB7XG4gIGlmIChwcm9wZXJ0eSkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJub3QgY3VycmVudGx5IHN1cHBvcnRlZFwiKTtcbiAgY29uc3QgbWV0YWRhdGE6IFNlcXVlbmNlT3B0aW9ucyA9IE1vZGVsLnBrUHJvcHMoXG4gICAgbW9kZWwgaW5zdGFuY2VvZiBNb2RlbCA/IChtb2RlbC5jb25zdHJ1Y3RvciBhcyBhbnkpIDogbW9kZWxcbiAgKTtcbiAgaWYgKCFtZXRhZGF0YSlcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIFwiTm8gc2VxdWVuY2Ugb3B0aW9ucyBkZWZpbmVkIGZvciBtb2RlbC4gZGlkIHlvdSB1c2UgdGhlIEBwayBkZWNvcmF0b3I/XCJcbiAgICApO1xuICByZXR1cm4gbWV0YWRhdGEgYXMgU2VxdWVuY2VPcHRpb25zO1xufTtcblxuKE1vZGVsIGFzIGFueSkuaW5kZXhlcyA9IGZ1bmN0aW9uIGluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0gfCBDb25zdHJ1Y3RvcjxNPlxuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4+IHtcbiAgY29uc3QgaW5kZXhEZWNvcmF0b3JzID0gTWV0YWRhdGEuZ2V0KFxuICAgIG1vZGVsIGluc3RhbmNlb2YgTW9kZWwgPyBtb2RlbC5jb25zdHJ1Y3RvciA6IChtb2RlbCBhcyBhbnkpLFxuICAgIFBlcnNpc3RlbmNlS2V5cy5JTkRFWFxuICApO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhpbmRleERlY29yYXRvcnMgfHwge30pLnJlZHVjZShcbiAgICAoYWN1bTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4+LCB0OiBhbnkpID0+IHtcbiAgICAgIGFjdW1bdF0gPSB7IFtQZXJzaXN0ZW5jZUtleXMuSU5ERVhdOiBpbmRleERlY29yYXRvcnNbdF0gfTtcbiAgICAgIHJldHVybiBhY3VtO1xuICAgIH0sXG4gICAge31cbiAgKTtcbn07XG5cbihJbmplY3RhYmxlcyBhcyBhbnkpLnNlcnZpY2VzID0gZnVuY3Rpb24gPFMgZXh0ZW5kcyBTZXJ2aWNlPigpOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgQ29uc3RydWN0b3I8Uz5cbj4ge1xuICByZXR1cm4gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFBlcnNpc3RlbmNlS2V5cy5TRVJWSUNFKSkgYXMgUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBDb25zdHJ1Y3RvcjxTPlxuICA+O1xufTtcblxuKEluamVjdGFibGVzIGFzIGFueSkucmVwb3NpdG9yaWVzID0gZnVuY3Rpb24gPFxuICBSIGV4dGVuZHMgUmVwb3NpdG9yeTxhbnksIGFueT4sXG4+KCk6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFI+PiB7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoREJLZXlzLlJFUE9TSVRPUlkpKSBhcyBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIENvbnN0cnVjdG9yPFI+XG4gID47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXJnZXMgdHdvIG1vZGVsIGluc3RhbmNlcyBpbnRvIGEgbmV3IGluc3RhbmNlLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBtb2RlbCBpbnN0YW5jZSBieSBjb21iaW5pbmcgcHJvcGVydGllcyBmcm9tIGFuIG9sZCBtb2RlbCBhbmQgYSBuZXcgbW9kZWwuXG4gKiBQcm9wZXJ0aWVzIGZyb20gdGhlIG5ldyBtb2RlbCBvdmVycmlkZSBwcm9wZXJ0aWVzIGZyb20gdGhlIG9sZCBtb2RlbCBpZiB0aGV5IGFyZSBkZWZpbmVkLlxuICogQHRlbXBsYXRlIHtNfSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge019IG9sZE1vZGVsIC0gVGhlIG9yaWdpbmFsIG1vZGVsIGluc3RhbmNlXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG5ldyBtb2RlbCBpbnN0YW5jZSB3aXRoIHVwZGF0ZWQgcHJvcGVydGllc1xuICogQHJldHVybiB7TX0gQSBuZXcgbW9kZWwgaW5zdGFuY2Ugd2l0aCBtZXJnZWQgcHJvcGVydGllc1xuICovXG4oTW9kZWwgYXMgYW55KS5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gIG9sZE1vZGVsOiBNLFxuICBuZXdNb2RlbDogTSxcbiAgY29uc3RydWN0b3I/OiBDb25zdHJ1Y3RvcjxNPlxuKTogTSB7XG4gIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3IgfHwgKG9sZE1vZGVsLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdG9yPE0+KTtcblxuICBjb25zdCBleHRyYWN0ID0gKG1vZGVsOiBNKSA9PlxuICAgIE9iamVjdC5lbnRyaWVzKG1vZGVsKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBsZXQgaGFzT25lVG9PbmVSZWxhdGlvbiA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gTW9kZWwucmVsYXRpb25zKGNvbnN0cnVjdG9yLCBrZXkgYXMga2V5b2YgTSk7XG4gICAgICAgIGlmIChyZWxhdGlvbnMua2V5ID09PSBcInJlbGF0aW9uLm9uZS10by1vbmVcIikgaGFzT25lVG9PbmVSZWxhdGlvbiA9IHRydWU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgaGFzT25lVG9PbmVSZWxhdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWwgIT09IFwidW5kZWZpbmVkXCIgfHwgaGFzT25lVG9PbmVSZWxhdGlvbikgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG5cbiAgcmV0dXJuIG5ldyBjb25zdHJ1Y3RvcihcbiAgICBPYmplY3QuYXNzaWduKHt9LCBleHRyYWN0KG9sZE1vZGVsKSwgZXh0cmFjdChuZXdNb2RlbCkpXG4gICk7XG59LmJpbmQoTW9kZWwpO1xuIl19
@@ -371,6 +371,7 @@ class Adapter extends ContextualLoggedClass_1.AbsContextual {
371
371
  flags.correlationId ||
372
372
  `${correlationPrefix}|${operation}|${generators_1.UUID.instance.generate()}`;
373
373
  const log = (flags.logger || logging_1.Logging.for(this));
374
+ const cacheForPopulate = Object.assign({}, constants_1.DefaultAdapterFlags.cacheForPopulate, flags.cacheForPopulate);
374
375
  return Object.assign({}, constants_1.DefaultAdapterFlags, flags, {
375
376
  affectedTables: model
376
377
  ? [
@@ -384,6 +385,7 @@ class Adapter extends ContextualLoggedClass_1.AbsContextual {
384
385
  ]),
385
386
  ]
386
387
  : flags.affectedTables,
388
+ cacheForPopulate,
387
389
  args: args,
388
390
  writeOperation: constants_1.TransactionOperationKeys.includes(operation),
389
391
  timestamp: new Date(),
@@ -658,8 +660,8 @@ class Adapter extends ContextualLoggedClass_1.AbsContextual {
658
660
  if (!this.dispatch) {
659
661
  log.verbose(`Creating dispatch for ${this.alias}`);
660
662
  this.dispatch = this.Dispatch();
661
- this.dispatch.observe(this);
662
663
  }
664
+ this.dispatch.observe(this);
663
665
  return () => this.unObserve(observer);
664
666
  }
665
667
  /**
@@ -672,6 +674,16 @@ class Adapter extends ContextualLoggedClass_1.AbsContextual {
672
674
  if (!this.observerHandler)
673
675
  throw new db_decorators_1.InternalError("ObserverHandler not initialized. Did you register any observables?");
674
676
  this.observerHandler.unObserve(observer);
677
+ if (this.observerHandler.count() <= 0) {
678
+ this.log
679
+ .for(this.unObserve)
680
+ .debug("No active observers for adpter. Closing dispatcher and unobserving.");
681
+ this.dispatch?.close([]); // close first
682
+ this.dispatch?.unObserve(this); // unobserve later
683
+ // Once initialized, the Dispatch instance must be preserved,
684
+ // because it enhances the adapter’s original methods and links itself to them
685
+ // this.dispatch = undefined;
686
+ }
675
687
  this.log
676
688
  .for(this.unObserve)
677
689
  .debug(`Observer ${observer.toString()} removed`);
@@ -898,4 +910,4 @@ __decorate([
898
910
  __metadata("design:type", Object),
899
911
  __metadata("design:paramtypes", [])
900
912
  ], Adapter.prototype, "client", null);
901
- //# sourceMappingURL=Adapter.js.map
913
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQTRGQSw4REFpQ0M7QUE3SEQsMkRBT2lDO0FBRWpDLHlFQUl3QztBQUd4QywrQ0FJcUI7QUFLckIsK0NBQTJFO0FBQzNFLGlGQUEwRDtBQWMxRCwyREFBb0Q7QUFDcEQsMkNBQW9DO0FBQ3BDLHFEQUs4QjtBQUM5QixnRkFNd0M7QUFHeEMsZ0RBQWlEO0FBQ2pELGlEQUFvQztBQUNwQyxtREFBbUQ7QUFFbkQsTUFBTSxlQUFlLEdBQUcsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLENBQUM7QUFDdkUsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDOUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSywyQkFBYztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUNkLE9BQU8sR0FBRyxLQUFLLFVBQVU7WUFDdkIsQ0FBQyxDQUFFLEdBQW1CO1lBQ3RCLENBQUMsQ0FBRyxHQUFxQyxFQUFFLFdBRTNCLENBQUM7UUFDckIsTUFBTSxpQkFBaUIsR0FDckIsVUFBVSxJQUFJLE9BQU8scUJBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFVBQVU7WUFDL0QsQ0FBQyxDQUFDLHFCQUFRLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEIsSUFBSSxpQkFBaUIsSUFBSSxpQkFBaUIsS0FBSywyQkFBYztZQUMzRCxPQUFPLGlCQUFpQixDQUFDO1FBQzNCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FB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NkRBS3NCLGlCQUFPOztzQ0FnRXBDO0FBOFdEO0lBREMsSUFBQSxlQUFLLEdBQUU7Ozs7c0NBaUJQO0FBU0Q7SUFEQyxJQUFBLGVBQUssR0FBRTs7Ozt3Q0F3QlA7QUFpTEQ7SUFBQyxJQUFBLGVBQUssR0FBRTs7O3FDQU1QIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFByaW1hcnlLZXlUeXBlLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmVyXCI7XG5pbXBvcnQge1xuICBoYXNoT2JqLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvU2VxdWVuY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBSYXdQYWdlZEV4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUmF3RXhlY3V0b3JcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB0eXBlIHsgU2VxdWVuY2UgfSBmcm9tIFwiLi9TZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRXJyb3JQYXJzZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIi4uL3F1ZXJ5L1N0YXRlbWVudFwiO1xuaW1wb3J0IHsgZmluYWwsIEltcGVyc29uYXRhYmxlLCBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExvY2sgfSBmcm9tIFwiQGRlY2FmLXRzL3RyYW5zYWN0aW9uYWwtZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyRGlzcGF0Y2gsXG4gIHR5cGUgQWRhcHRlckZsYWdzLFxuICBBbGxPcGVyYXRpb25LZXlzLFxuICB0eXBlIEV2ZW50SWRzLFxuICBGbGFnc09mLFxuICB0eXBlIE9ic2VydmVyRmlsdGVyLFxuICBQZXJzaXN0ZW5jZU9ic2VydmFibGUsXG4gIFBlcnNpc3RlbmNlT2JzZXJ2ZXIsXG4gIFByZXBhcmVkTW9kZWwsXG4gIFJhd1Jlc3VsdCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIERlZmF1bHRGbGF2b3VyLFxuICBNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBYnNDb250ZXh0dWFsLFxuICBDb250ZXh0dWFsQXJncyxcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBNYXliZUNvbnRleHR1YWxBcmcsXG4gIE1ldGhvZE9yT3BlcmF0aW9uLFxufSBmcm9tIFwiLi4vdXRpbHMvQ29udGV4dHVhbExvZ2dlZENsYXNzXCI7XG5pbXBvcnQgeyBQYWdpbmF0b3IgfSBmcm9tIFwiLi4vcXVlcnkvUGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBQcmVwYXJlZFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS90eXBlc1wiO1xuaW1wb3J0IHsgcHJvbWlzZVNlcXVlbmNlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIi4vZ2VuZXJhdG9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlclRyYW5zYWN0aW9uIH0gZnJvbSBcIi4vQ29udGV4dExvY2tcIjtcblxuY29uc3QgZmxhdm91clJlc29sdmVyID0gRGVjb3JhdGlvbltcImZsYXZvdXJSZXNvbHZlclwiXS5iaW5kKERlY29yYXRpb24pO1xuRGVjb3JhdGlvbltcImZsYXZvdXJSZXNvbHZlclwiXSA9IChvYmo6IG9iamVjdCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZsYXZvdXJSZXNvbHZlcihvYmopO1xuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0ICE9PSBEZWZhdWx0Rmxhdm91cikgcmV0dXJuIHJlc3VsdDtcbiAgICBjb25zdCB0YXJnZXRDdG9yID1cbiAgICAgIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IChvYmogYXMgQ29uc3RydWN0b3IpXG4gICAgICAgIDogKChvYmogYXMgeyBjb25zdHJ1Y3Rvcj86IENvbnN0cnVjdG9yIH0pPy5jb25zdHJ1Y3RvciBhc1xuICAgICAgICAgICAgfCBDb25zdHJ1Y3RvclxuICAgICAgICAgICAgfCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRGbGF2b3VyID1cbiAgICAgIHRhcmdldEN0b3IgJiYgdHlwZW9mIE1ldGFkYXRhW1wicmVnaXN0ZXJlZEZsYXZvdXJcIl0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IE1ldGFkYXRhLnJlZ2lzdGVyZWRGbGF2b3VyKHRhcmdldEN0b3IpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWdpc3RlcmVkRmxhdm91ciAmJiByZWdpc3RlcmVkRmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXIpXG4gICAgICByZXR1cm4gcmVnaXN0ZXJlZEZsYXZvdXI7XG4gICAgY29uc3QgY3VycmVudEZsYXZvdXIgPSBBZGFwdGVyW1wiX2N1cnJlbnRGbGF2b3VyXCJdO1xuICAgIGlmIChjdXJyZW50Rmxhdm91cikge1xuICAgICAgY29uc3QgY2FjaGVkQWRhcHRlciA9IEFkYXB0ZXJbXCJfY2FjaGVcIl0/LltjdXJyZW50Rmxhdm91cl07XG4gICAgICBpZiAoY2FjaGVkQWRhcHRlcj8uZmxhdm91cikgcmV0dXJuIGNhY2hlZEFkYXB0ZXIuZmxhdm91cjtcbiAgICAgIHJldHVybiBjdXJyZW50Rmxhdm91cjtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xuICB9XG59O1xuXG5jb25zdCBBZGFwdGVyUHJveHlDbGVhbnVwID0gU3ltYm9sKFwiQWRhcHRlclByb3h5Q2xlYW51cFwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQ8VD4oXG4gIHJlc3VsdDogVFtdIHwgUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD5bXSxcbiAgY29udGludWVPbkVycm9yOiBib29sZWFuLFxuICBsb2c6IExvZ2dlcixcbiAgb3BlcmF0aW9uOiBzdHJpbmdcbik6IFRbXSB7XG4gIGlmICghY29udGludWVPbkVycm9yKSB7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUW107XG4gIH1cblxuICBjb25zdCBzZXR0bGVkID0gcmVzdWx0IGFzIFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+W107XG4gIGNvbnN0IGZ1bGZpbGxlZDogVFtdID0gW107XG4gIGNvbnN0IGVycm9yczogYW55W10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBzZXR0bGVkKSB7XG4gICAgaWYgKGVudHJ5LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgZnVsZmlsbGVkLnB1c2goZW50cnkudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaChlbnRyeS5yZWFzb24pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQnVsayAke29wZXJhdGlvbn0gZW5jb3VudGVyZWQgJHtlcnJvcnMubGVuZ3RofSBmYWlsdXJlKHMpIHdoaWxlIGNvbnRpbnVpbmdgXG4gICAgKTtcbiAgICBjb25zdCBhZ2dyZWdhdGUgPSBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICBlcnJvcnMsXG4gICAgICBgQnVsayAke29wZXJhdGlvbn0gZmFpbGVkIGZvciAke2Vycm9ycy5sZW5ndGh9IGl0ZW0ocylgXG4gICAgKTtcbiAgICAoYWdncmVnYXRlIGFzIGFueSkucmVzdWx0cyA9IHNldHRsZWQ7XG4gICAgdGhyb3cgYWdncmVnYXRlO1xuICB9XG4gIHJldHVybiBmdWxmaWxsZWQ7XG59XG5cbmV4cG9ydCB0eXBlIEFkYXB0ZXJTdWJDbGFzczxBPiA9XG4gIEEgZXh0ZW5kcyBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4gPyBBIDogbmV2ZXI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEZhY2FkZSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UgYWRhcHRlcnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZGF0YWJhc2UgYWRhcHRlcnMgaW4gdGhlIHBlcnNpc3RlbmNlIGxheWVyLiBUaGlzIGNsYXNzXG4gKiBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBwcm92aWRlIGEgY29uc2lzdGVudCBBUEkgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMsIG9ic2VydmVyXG4gKiBwYXR0ZXJuIHN1cHBvcnQsIGFuZCBlcnJvciBoYW5kbGluZy4gSXQgbWFuYWdlcyBhZGFwdGVyIHJlZ2lzdHJhdGlvbiwgQ1JVRCBvcGVyYXRpb25zLCBhbmRcbiAqIG9ic2VydmVyIG5vdGlmaWNhdGlvbnMuXG4gKiBAdGVtcGxhdGUgQ09ORklHIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHRlbXBsYXRlIFFVRVJZIC0gVGhlIHF1ZXJ5IG9iamVjdCB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBDT05URVhUIC0gVGhlIGNvbnRleHQgdHlwZVxuICogQHBhcmFtIHtDT05GSUd9IF9jb25maWcgLSBUaGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBkcml2ZXIgY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIGFkYXB0ZXIgdHlwZVxuICogQHBhcmFtIHtzdHJpbmd9IFtfYWxpYXNdIC0gT3B0aW9uYWwgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhpcyBhZGFwdGVyXG4gKiBAY2xhc3MgQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEltcGxlbWVudGluZyBhIGNvbmNyZXRlIGFkYXB0ZXJcbiAqIGNsYXNzIFBvc3RncmVzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8cGcuUG9vbENvbmZpZywgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLlBvb2xDb25maWcpIHtcbiAqICAgICBzdXBlcihjbGllbnQsICdwb3N0Z3JlcycpO1xuICogICB9XG4gKlxuICogICBhc3luYyBpbml0aWFsaXplKCkge1xuICogICAgIC8vIFNldCB1cCB0aGUgYWRhcHRlclxuICogICAgIGF3YWl0IHRoaXMubmF0aXZlLmNvbm5lY3QoKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKSB7XG4gKiAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIGNyZWF0aW5nIHJlY29yZHNcbiAqICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LmtleXMobW9kZWwpLmpvaW4oJywgJyk7XG4gKiAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCk7XG4gKiAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoXywgaSkgPT4gYCQke2krMX1gKS5qb2luKCcsICcpO1xuICpcbiAqICAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgSU5UTyAke3RhYmxlTmFtZX0gKCR7Y29sdW1uc30pIFZBTFVFUyAoJHtwbGFjZWhvbGRlcnN9KSBSRVRVUk5JTkcgKmA7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5uYXRpdmUucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gKiAgICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdO1xuICogICB9XG4gKlxuICogICAvLyBPdGhlciByZXF1aXJlZCBtZXRob2QgaW1wbGVtZW50YXRpb25zLi4uXG4gKiB9XG4gKlxuICogLy8gVXNpbmcgdGhlIGFkYXB0ZXJcbiAqIGNvbnN0IHBnQ2xpZW50ID0gbmV3IHBnLkNsaWVudChjb25uZWN0aW9uU3RyaW5nKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9zdGdyZXNBZGFwdGVyKHBnQ2xpZW50KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICpcbiAqIC8vIFNldCBhcyB0aGUgZGVmYXVsdCBhZGFwdGVyXG4gKiBBZGFwdGVyLnNldEN1cnJlbnQoJ3Bvc3RncmVzJyk7XG4gKlxuICogLy8gUGVyZm9ybSBvcGVyYXRpb25zXG4gKiBjb25zdCB1c2VyID0gYXdhaXQgYWRhcHRlci5jcmVhdGUoJ3VzZXJzJywgMSwgeyBuYW1lOiAnSm9obicsIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScgfSk7XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgQWRhcHRlciB7XG4gKiAgICAgK1kgbmF0aXZlXG4gKiAgICAgK3N0cmluZyBmbGF2b3VyXG4gKiAgICAgK3N0cmluZyBhbGlhc1xuICogICAgICtjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK3JlYWQodGFibGVOYW1lLCBpZClcbiAqICAgICArdXBkYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtkZWxldGUodGFibGVOYW1lLCBpZClcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3N0YXRpYyBjdXJyZW50XG4gKiAgICAgK3N0YXRpYyBnZXQoZmxhdm91cilcbiAqICAgICArc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cilcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgUmF3RXhlY3V0b3Ige1xuICogICAgICtyYXcocXVlcnkpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmFibGUge1xuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIE9ic2VydmVyIHtcbiAqICAgICArcmVmcmVzaCh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBFcnJvclBhcnNlciB7XG4gKiAgICAgK3BhcnNlRXJyb3IoZXJyKVxuICogICB9XG4gKlxuICogICBBZGFwdGVyIC0tfD4gUmF3RXhlY3V0b3JcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmFibGVcbiAqICAgQWRhcHRlciAtLXw+IE9ic2VydmVyXG4gKiAgIEFkYXB0ZXIgLS18PiBFcnJvclBhcnNlclxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWRhcHRlcjxcbiAgICBDT05GLFxuICAgIENPTk4sXG4gICAgUVVFUlksXG4gICAgQ09OVEVYVCBleHRlbmRzIENvbnRleHQ8QWRhcHRlckZsYWdzPiA9IENvbnRleHQ8QWRhcHRlckZsYWdzPixcbiAgPlxuICBleHRlbmRzIEFic0NvbnRleHR1YWw8Q09OVEVYVD5cbiAgaW1wbGVtZW50c1xuICAgIFJhd1BhZ2VkRXhlY3V0b3I8UVVFUlk+LFxuICAgIFBlcnNpc3RlbmNlT2JzZXJ2YWJsZTxDT05URVhUPixcbiAgICBQZXJzaXN0ZW5jZU9ic2VydmVyPENPTlRFWFQ+LFxuICAgIEltcGVyc29uYXRhYmxlPGFueSwgW1BhcnRpYWw8Q09ORj4sIC4uLmFueVtdXT4sXG4gICAgRXJyb3JQYXJzZXJcbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2N1cnJlbnRGbGF2b3VyPzogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4gPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VSZXBvc2l0b3J5OiBDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PGFueSwgYW55Pj47XG4gIHByaXZhdGUgc3RhdGljIF9iYXNlU2VxdWVuY2U6IENvbnN0cnVjdG9yPFNlcXVlbmNlPjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2Jhc2VEaXNwYXRjaDogQ29uc3RydWN0b3I8XG4gICAgRGlzcGF0Y2g8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PlxuICA+O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IEFkYXB0ZXJEaXNwYXRjaDxBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhUPj47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICBwcm90ZWN0ZWQgX2NsaWVudD86IENPTk47XG5cbiAgcHJvdGVjdGVkIHNodXRkb3duUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIGxvY2sgZm9yIHNodXRkb3duIG1lY2hhbmlzbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBpbnRlcm5hbExvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmF0aXZlIHBlcnNpc3RlbmNlIGNvbmZpZ1xuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICAgKiBAdGVtcGxhdGUgQ09ORlxuICAgKiBAcmV0dXJuIHtDT05GfSBUaGUgbmF0aXZlIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICovXG4gIGdldCBjb25maWcoKTogQ09ORiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlcidzIGFsaWFzIG9yIGZsYXZvciBuYW1lXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGFsaWFzIGlmIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGZsYXZvciBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIncyBpZGVudGlmaWVyXG4gICAqL1xuICBnZXQgYWxpYXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXMgfHwgdGhpcy5mbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGFkYXB0ZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PGFueSwgQWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgQ09OVEVYVD4+Pn0gVGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3JcbiAgICovXG4gIHJlcG9zaXRvcnk8XG4gICAgUiBleHRlbmRzIFJlcG9zaXRvcnk8YW55LCBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBDT05URVhUPj4sXG4gID4oKTogQ29uc3RydWN0b3I8Uj4ge1xuICAgIGlmICghQWRhcHRlci5fYmFzZVJlcG9zaXRvcnkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHJlcGxhY2VkIGxhemlseWBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2Jhc2VSZXBvc2l0b3J5IGFzIENvbnN0cnVjdG9yPFI+O1xuICB9XG5cbiAgdHJhbnNhY3Rpb25Mb2NrKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIG5ldyBBZGFwdGVyVHJhbnNhY3Rpb24odGhpcywgLi4uYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2h1dGRvd25Qcm94aWVzKC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPGFueT4pOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYXN5bmMgc2h1dGRvd25Qcm94aWVzKFxuICAgIGs6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxhbnk+XG4gICk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhc3luYyBzaHV0ZG93blByb3hpZXMoaz86IHN0cmluZywgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8YW55Pikge1xuICAgIGlmIChrICYmIHR5cGVvZiBrICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBhcmdzID0gW2ssIC4uLmFyZ3NdO1xuICAgICAgayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgeyBsb2cgfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMuc2h1dGRvd25Qcm94aWVzKTtcbiAgICBpZiAoIXRoaXMucHJveGllcykgcmV0dXJuO1xuICAgIGlmIChrICYmICEoayBpbiB0aGlzLnByb3hpZXMpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHByb3h5IGZvdW5kIGZvciAke2t9YCk7XG4gICAgY29uc3QgY2xlYW51cFByb3h5ID0gYXN5bmMgKHByb3h5PzogdHlwZW9mIHRoaXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGlmICghcHJveHkpIHJldHVybjtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSAocHJveHkgYXMgYW55KVtBZGFwdGVyUHJveHlDbGVhbnVwXTtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSBhd2FpdCBjbGVhbnVwKCk7XG4gICAgfTtcbiAgICBpZiAoIWspIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJveGllcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsZWFudXBQcm94eSh0aGlzLnByb3hpZXNba2V5XSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbGVhbnVwIHByb3hpZWQgYWRhcHRlciAke2tleX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5wcm94aWVzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBQcm94eSh0aGlzLnByb3hpZXNba10pO1xuICAgICAgICBkZWxldGUgdGhpcy5wcm94aWVzW2tdO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjbGVhbnVwIHByb3hpZWQgYWRhcHRlciAke2t9YCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTaHV0cyBkb3duIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3NhcnkgY2xlYW51cCB0YXNrcywgc3VjaCBhcyBjbG9zaW5nIGNvbm5lY3Rpb25zXG4gICAqIFdoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgZW5zdXJlIHRvIGNhbGwgdGhlIGJhc2UgbWV0aG9kIGZpcnN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2h1dGRvd24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHNodXRkb3duKC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDT05URVhUPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSAoXG4gICAgICBhd2FpdCB0aGlzLmxvZ0N0eChhcmdzLCBQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04sIHRydWUpXG4gICAgKS5mb3IodGhpcy5zaHV0ZG93bik7XG4gICAgYXdhaXQgdGhpcy5pbnRlcm5hbExvY2suYWNxdWlyZShQZXJzaXN0ZW5jZUtleXMuU0hVVERPV04pO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93blByb21pc2UpIHJldHVybiB0aGlzLnNodXRkb3duUHJvbWlzZTtcbiAgICAgIHRoaXMuc2h1dGRvd25Qcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBsb2csXG4gICAgICAgIH0gPSAvLyBUT0RPIHBhc3MgY29udGV4dCBhbG9uZy4gaXQgc2hvdWxkIGdvIGV2ZXJ5d2hlcmVcbiAgICAgICAgICAoYXdhaXQgdGhpcy5sb2dDdHgoYXJncywgUGVyc2lzdGVuY2VLZXlzLlNIVVRET1dOLCB0cnVlKSkuZm9yKFxuICAgICAgICAgICAgdGhpcy5zaHV0ZG93blxuICAgICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2h1dGRvd25Qcm94aWVzKC4uLmN0eEFyZ3MpO1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaCkgYXdhaXQgdGhpcy5kaXNwYXRjaC5jbG9zZSguLi5jdHhBcmdzKTtcbiAgICAgIH0pKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgc2h1dGRvd24gd3JhcHBlcjogJHtlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmludGVybmFsTG9jay5yZWxlYXNlKFBlcnNpc3RlbmNlS2V5cy5TSFVURE9XTik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNodXRkb3duUHJvbWlzZTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEVycm9yIGR1cmluZyBwcm94eSBzaHV0ZG93bmAsIGUgYXMgRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNodXRkb3duUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgYWRhcHRlciB3aXRoIHRoZSBuYXRpdmUgZHJpdmVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIGFkYXB0ZXIgY2FjaGVcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IENPTkYsXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHRoaXMuYWxpYXMgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYCR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIEFkYXB0ZXIuX2NhY2hlW3RoaXMuYWxpYXNdID0gdGhpcztcbiAgICBpZiAodGhpcy5hbGlhcyAhPT0gdGhpcy5mbGF2b3VyKSB7XG4gICAgICBBZGFwdGVyLl9jYWNoZVt0aGlzLmZsYXZvdXJdID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBDcmVhdGVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBwZXJzaXN0ZW5jZSBhZGFwdGVyYFxuICAgICk7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cikge1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgRGVmaW5lZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgYXMgY3VycmVudGApO1xuICAgICAgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB0aGlzLmFsaWFzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgc3RhdGVtZW50IGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgcXVlcmllcyBmb3IgYSBzcGVjaWZpYyBtb2RlbFxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1N0YXRlbWVudH0gQSBzdGF0ZW1lbnQgYnVpbGRlciBmb3IgdGhlIG1vZGVsXG4gICAqL1xuICBhYnN0cmFjdCBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEFkYXB0ZXJGbGFncz5cbiAgKTogU3RhdGVtZW50PE0sIEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIENPTlRFWFQ+LCBhbnk+O1xuXG4gIGFic3RyYWN0IFBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHF1ZXJ5OiBRVUVSWSB8IFByZXBhcmVkU3RhdGVtZW50PE0+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKTogUGFnaW5hdG9yPE0sIGFueSwgUVVFUlk+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBkaXNwYXRjaCBpbnN0YW5jZSBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge0Rpc3BhdGNofSBBIG5ldyBkaXNwYXRjaCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIERpc3BhdGNoKCk6IERpc3BhdGNoPEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIENPTlRFWFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBBZGFwdGVyLl9iYXNlRGlzcGF0Y2goKSBhcyBEaXNwYXRjaDxcbiAgICAgIEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIENPTlRFWFQ+XG4gICAgPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBvYnNlcnZlciBoYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBvYnNlcnZlciBoYW5kbGVyIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBBIG5ldyBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb2x1bW4gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFhdHRyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBkYXRhYmFzZSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGRhdGFiYXNlLXNwZWNpZmljIGVycm9ycyBpbnRvIHN0YW5kYXJkaXplZCBhcHBsaWNhdGlvbiBlcnJvcnNcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIG9yaWdpbmFsIGRhdGFiYXNlIGVycm9yXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gQSBzdGFuZGFyZGl6ZWQgZXJyb3JcbiAgICovXG4gIGFic3RyYWN0IHBhcnNlRXJyb3I8RSBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvciwgLi4uYXJnczogYW55W10pOiBFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBzZXR1cCBmb3IgdGhlIGFkYXB0ZXIsIHN1Y2ggYXMgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIFNlcXVlbmNlKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8Q09OVEVYVD4+XG4gICk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IEFkYXB0ZXIuX2Jhc2VTZXF1ZW5jZShvcHRpb25zLCB0aGlzLCBvdmVycmlkZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIHJlcG9zaXRvcnkgZmxhZ3MgZm9yIGFuIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBzZXQgb2YgZmxhZ3MgdGhhdCBkZXNjcmliZSBhIGRhdGFiYXNlIG9wZXJhdGlvbiwgY29tYmluaW5nIGRlZmF1bHQgZmxhZ3Mgd2l0aCBvdmVycmlkZXNcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBGbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gZmxhZ3MgLSBDdXN0b20gZmxhZyBvdmVycmlkZXNcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Rj59IFRoZSBjb21wbGV0ZSBzZXQgb2YgZmxhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdIHwgdW5kZWZpbmVkLFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZsYWdzT2Y8Q09OVEVYVD4+LFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDT05URVhUPlxuICApOiBQcm9taXNlPEZsYWdzT2Y8Q09OVEVYVD4+IHtcbiAgICBpZiAodHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJNb2RlbCBtdXN0IGJlIGEgY29uc3RydWN0b3Igb3IgYXJyYXkgb2YgY29uc3RydWN0b3JzIG9yIHVuZGVmaW5lZC4gdGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZVwiXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRNb2RlbCA9IEFycmF5LmlzQXJyYXkobW9kZWwpXG4gICAgICA/IG1vZGVsLmxlbmd0aFxuICAgICAgICA/IG1vZGVsWzBdXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgICA6IG1vZGVsO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uUHJlZml4ID0gdGFyZ2V0TW9kZWxcbiAgICAgID8gYCR7TW9kZWwudGFibGVOYW1lKHRhcmdldE1vZGVsKX1gXG4gICAgICA6IFwiXCI7XG4gICAgZmxhZ3MuY29ycmVsYXRpb25JZCA9XG4gICAgICBmbGFncy5jb3JyZWxhdGlvbklkIHx8XG4gICAgICBgJHtjb3JyZWxhdGlvblByZWZpeH18JHtvcGVyYXRpb259fCR7VVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpfWA7XG4gICAgY29uc3QgbG9nID0gKGZsYWdzLmxvZ2dlciB8fCBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSkpIGFzIExvZ2dlcjtcbiAgICBjb25zdCBjYWNoZUZvclBvcHVsYXRlID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgRGVmYXVsdEFkYXB0ZXJGbGFncy5jYWNoZUZvclBvcHVsYXRlLFxuICAgICAgZmxhZ3MuY2FjaGVGb3JQb3B1bGF0ZVxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRBZGFwdGVyRmxhZ3MsIGZsYWdzLCB7XG4gICAgICBhZmZlY3RlZFRhYmxlczogbW9kZWxcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5uZXcgU2V0KFtcbiAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwgOiBbbW9kZWxdKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICAgICAgIC4uLihmbGFncy5hZmZlY3RlZFRhYmxlc1xuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShmbGFncy5hZmZlY3RlZFRhYmxlcylcbiAgICAgICAgICAgICAgICAgID8gZmxhZ3MuYWZmZWN0ZWRUYWJsZXNcbiAgICAgICAgICAgICAgICAgIDogW2ZsYWdzLmFmZmVjdGVkVGFibGVzXVxuICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgXVxuICAgICAgICA6IGZsYWdzLmFmZmVjdGVkVGFibGVzLFxuICAgICAgY2FjaGVGb3JQb3B1bGF0ZSxcbiAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICB3cml0ZU9wZXJhdGlvbjogVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLmluY2x1ZGVzKG9wZXJhdGlvbiksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgIGlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllczogbW9kZWxcbiAgICAgICAgPyBNZXRhZGF0YS52YWxpZGF0aW9uRXhjZXB0aW9ucyhcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkobW9kZWwpICYmIG1vZGVsWzBdXG4gICAgICAgICAgICAgID8gKG1vZGVsWzBdIGFzIENvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICA6IChtb2RlbCBhcyBDb25zdHJ1Y3RvciksXG4gICAgICAgICAgICBvcGVyYXRpb24gYXMgYW55XG4gICAgICAgICAgKVxuICAgICAgICA6IFtdLFxuICAgICAgbG9nZ2VyOiBsb2csXG4gICAgfSkgYXMgdW5rbm93biBhcyBGbGFnc09mPENPTlRFWFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29udGV4dCBjb25zdHJ1Y3RvciBmb3IgdGhpcyBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZSB0byB0aGUgY29udGV4dCBjbGFzcyBjb25zdHJ1Y3RvciB1c2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBDb250ZXh0KCk6IENvbnN0cnVjdG9yPENPTlRFWFQ+IHtcbiAgICByZXR1cm4gQ29udGV4dDxGbGFnc09mPENPTlRFWFQ+PiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPENPTlRFWFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY29udGV4dCBmb3IgYSBkYXRhYmFzZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgY29udGV4dCBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkYXRhYmFzZSBvcGVyYXRpb24sIHVzZWQgZm9yIHRyYWNraW5nIGFuZCBhdWRpdGluZ1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMuQ1JFQVRFfE9wZXJhdGlvbktleXMuUkVBRHxPcGVyYXRpb25LZXlzLlVQREFURXxPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gb3ZlcnJpZGVzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEM+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGV4dCBvYmplY3RcbiAgICovXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBBbGxPcGVyYXRpb25LZXlzLFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGbGFnc09mPENPTlRFWFQ+PixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4gfCBDb25zdHJ1Y3RvcjxNPltdLFxuICAgIC4uLmFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0PGFueT4+XG4gICk6IFByb21pc2U8Q09OVEVYVD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5zaWxseShcbiAgICAgIGBjcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsID8gKEFycmF5LmlzQXJyYXkobW9kZWwpID8gbW9kZWwubWFwKChtKSA9PiBNb2RlbC50YWJsZU5hbWUobSkpIDogTW9kZWwudGFibGVOYW1lKG1vZGVsKSkgOiBcIm5vXCJ9IHRhYmxlICR7b3ZlcnJpZGVzICYmIE9iamVjdC5rZXlzKG92ZXJyaWRlcykgPyBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA6IFwibm9cIn0gd2l0aCBmbGFnIG92ZXJyaWRlc2BcbiAgICApO1xuICAgIGxldCBjdHggPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgY3R4ICE9PSBcInVuZGVmaW5lZFwiICYmICEoY3R4IGluc3RhbmNlb2YgQ29udGV4dCkpIHtcbiAgICAgIGFyZ3MucHVzaChjdHgpO1xuICAgICAgY3R4ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlcyA9IGN0eFxuICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgudG9PdmVycmlkZXMoKSwgb3ZlcnJpZGVzKVxuICAgICAgOiBvdmVycmlkZXM7XG4gICAgY29uc3QgZmxhZ3MgPSBhd2FpdCB0aGlzLmZsYWdzKFxuICAgICAgdHlwZW9mIG9wZXJhdGlvbiA9PT0gXCJzdHJpbmdcIiA/IG9wZXJhdGlvbiA6IG9wZXJhdGlvbi5uYW1lLFxuICAgICAgbW9kZWwsXG4gICAgICBvdmVycmlkZXMgYXMgUGFydGlhbDxGbGFnc09mPENPTlRFWFQ+PixcbiAgICAgIC4uLlsuLi5hcmdzLCBjdHhdLmZpbHRlcihCb29sZWFuKVxuICAgICk7XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICBpZiAoIShjdHggaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcbiAgICAgICAgY3R4LmFjY3VtdWxhdGUoe1xuICAgICAgICAgIGNoaWxkQ29udGV4dHM6IFtcbiAgICAgICAgICAgIC4uLihjdHguZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIpIHx8IFtdKSxcbiAgICAgICAgICAgIG5ld0N0eCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld0N0eDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPcCA9IGN0eC5nZXRPclVuZGVmaW5lZChcIm9wZXJhdGlvblwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGN0eC5nZXRPclVuZGVmaW5lZChcImFmZmVjdGVkVGFibGVzXCIpO1xuICAgICAgaWYgKFxuICAgICAgICAhY3VycmVudE9wIHx8XG4gICAgICAgIGN1cnJlbnRPcCAhPT0gb3BlcmF0aW9uIHx8XG4gICAgICAgIChtb2RlbCAmJiBtb2RlbCAhPT0gY3VycmVudE1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgICAgICAuLi5jdHhbXCJjYWNoZVwiXSxcbiAgICAgICAgICAuLi5mbGFncyxcbiAgICAgICAgICBwYXJlbnRDb250ZXh0OiBjdHgsXG4gICAgICAgIH0pIGFzIGFueTtcblxuICAgICAgICBjdHguYWNjdW11bGF0ZSh7XG4gICAgICAgICAgY2hpbGRDb250ZXh0czogW1xuICAgICAgICAgICAgLi4uKGN0eC5nZXRPclVuZGVmaW5lZChcImNoaWxkQ29udGV4dHNcIikgfHwgW10pLFxuICAgICAgICAgICAgbmV3Q3R4LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3Q3R4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5hY2N1bXVsYXRlKGZsYWdzKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQoKS5hY2N1bXVsYXRlKHtcbiAgICAgIC4uLmZsYWdzLFxuICAgIH0pIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gYXJncyAtIG9wdGlvbmFsIGFyZ3MgZm9yIHN1YmNsYXNzaW5nIHB1cnBvc2VzXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBQcmVwYXJlZE1vZGVsIHtcbiAgICBjb25zdCB7IGxvZyB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5wcmVwYXJlKTtcbiAgICBjb25zdCBzcGxpdCA9IG1vZGVsLnNlZ3JlZ2F0ZSgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHNwbGl0Lm1vZGVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgY29uc3QgbWFwcGVkUHJvcDogc3RyaW5nID0gTW9kZWwuY29sdW1uTmFtZShcbiAgICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcjxNPixcbiAgICAgICAgICBrZXkgYXMga2V5b2YgTVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5pc1Jlc2VydmVkKG1hcHBlZFByb3ApKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBQcm9wZXJ0eSBuYW1lICR7bWFwcGVkUHJvcH0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgICAgYWNjdW1bbWFwcGVkUHJvcF0gPSB2YWw7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgaWYgKChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0pIHtcbiAgICAgIC8vIFRPRE8gbW92byB0byBjb3VjaGRiXG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkOiByZXN1bHQsXG4gICAgICBpZDogbW9kZWxbTW9kZWwucGsobW9kZWwuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TT4pXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSB2YWx1ZVxuICAgKiBAcGFyYW0gW3RyYW5zaWVudF0gLSBUcmFuc2llbnQgcHJvcGVydGllcyB0byByZWF0dGFjaFxuICAgKiBAcGFyYW0gW2FyZ3NdIC0gb3B0aW9ucyBhcmdzIGZvciBzdWJjbGFzc2luZyBwdXJwb3Nlc1xuICAgKiBAcmV0dXJuIHtNfSBUaGUgcmVjb25zdHJ1Y3RlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBNIHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnJldmVydCk7XG4gICAgY29uc3QgcGsgPSBNb2RlbC5wayhjbGF6eik7XG4gICAgY29uc3QgbSA9IG5ldyBjbGF6eigpIGFzIE07XG4gICAgbVtwa10gPSBpZCBhcyBhbnk7XG4gICAgbG9nLnNpbGx5KGBSZWJ1aWxkaW5nIG1vZGVsICR7bS5jb25zdHJ1Y3Rvci5uYW1lfSBpZCAke2lkfWApO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gb2JqW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV07IC8vIFRPRE8gbW92ZSB0byBjb3VjaGRiXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMobSlcbiAgICAgIC5maWx0ZXIoKGspID0+IGsgIT09IHBrKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9XG4gICAgICAgICAgb2JqW01vZGVsLmNvbHVtbk5hbWUoY2xhenosIGtleSBhcyBrZXlvZiBNKV07XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIG0pO1xuXG4gICAgaWYgKGN0eC5nZXQoXCJyZWJ1aWxkV2l0aFRyYW5zaWVudFwiKSAmJiB0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSBpbiByZXN1bHQgJiZcbiAgICAgICAgICB0eXBlb2YgcmVzdWx0W2tleSBhcyBrZXlvZiB0eXBlb2YgcmVzdWx0XSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIC8vIFRPRE8gbW92ZSB0byBjb3VjaGRiXG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nICR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHttLmNvbnN0cnVjdG9yLm5hbWV9IGlkICR7aWR9OiAke21ldGFkYXRhfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBtZXRhZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIGEgbmV3IHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGluc2VydCBpbnRvXG4gICAqIEBwYXJhbSB7UHJpbWFyeUtleVR5cGV9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPixcbiAgICBpZDogUHJpbWFyeUtleVR5cGUsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q09OVEVYVD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgZm9yIHRoZSBuZXcgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgZGF0YSB0byBpbnNlcnQgZm9yIGVhY2ggcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q09OVEVYVD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmNyZWF0ZUFsbCk7XG4gICAgaWYgKCFpZCB8fCAhbW9kZWwpXG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSWRzIGFuZCBtb2RlbHMgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkXCIpO1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJZHMgYW5kIG1vZGVscyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgIGNvbnN0IHRhYmxlTGFiZWwgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5kZWJ1ZyhgQ3JlYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZUxhYmVsfSB0YWJsZWApO1xuICAgIGNvbnN0IGJyZWFrT25TaW5nbGVGYWlsdXJlID0gY3R4LmdldChcImJyZWFrT25TaW5nbGVGYWlsdXJlSW5CdWxrXCIpID8/IHRydWU7XG4gICAgY29uc3QgY29udGludWVPbkVycm9yID0gIWJyZWFrT25TaW5nbGVGYWlsdXJlO1xuICAgIGNvbnN0IHRhc2tzID0gaWQubWFwKFxuICAgICAgKGksIGNvdW50KSA9PiAoKSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZShcbiAgICAgICAgICBjbGF6eixcbiAgICAgICAgICBpLFxuICAgICAgICAgIG1vZGVsW2NvdW50XSxcbiAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgIGN0eC5vdmVycmlkZSh7IG5vRW1pdFNpbmdsZTogdHJ1ZSB9KSBhcyBDT05URVhUXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHJhd1Jlc3VsdCA9IGNvbnRpbnVlT25FcnJvclxuICAgICAgPyBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MsIHRydWUpXG4gICAgICA6IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcyk7XG4gICAgcmV0dXJuIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQoXG4gICAgICByYXdSZXN1bHQsXG4gICAgICBjb250aW51ZU9uRXJyb3IsXG4gICAgICBsb2csXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IHJlYWQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyByZWFkQWxsPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZVtdLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENPTlRFWFQ+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgeyBsb2csIGN0eCB9ID0gdGhpcy5sb2dDdHgoYXJncywgdGhpcy5yZWFkQWxsKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoY2xhenopO1xuICAgIGxvZy5kZWJ1ZyhgUmVhZGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBjb25zdCBicmVha09uU2luZ2xlRmFpbHVyZSA9IGN0eC5nZXQoXCJicmVha09uU2luZ2xlRmFpbHVyZUluQnVsa1wiKSA/PyB0cnVlO1xuICAgIGNvbnN0IGNvbnRpbnVlT25FcnJvciA9ICFicmVha09uU2luZ2xlRmFpbHVyZTtcbiAgICBjb25zdCB0YXNrcyA9IGlkLm1hcChcbiAgICAgIChpKSA9PiAoKSA9PlxuICAgICAgICB0aGlzLnJlYWQoXG4gICAgICAgICAgY2xhenosXG4gICAgICAgICAgaSxcbiAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgIGN0eC5vdmVycmlkZSh7IG5vRW1pdFNpbmdsZTogdHJ1ZSB9KSBhcyBDT05URVhUXG4gICAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHJhd1Jlc3VsdCA9IGNvbnRpbnVlT25FcnJvclxuICAgICAgPyBhd2FpdCBwcm9taXNlU2VxdWVuY2UodGFza3MsIHRydWUpXG4gICAgICA6IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcyk7XG4gICAgcmV0dXJuIHJlc29sdmVCdWxrU2VxdWVuY2VSZXN1bHQoXG4gICAgICByYXdSZXN1bHQsXG4gICAgICBjb250aW51ZU9uRXJyb3IsXG4gICAgICBsb2csXG4gICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTExcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBhbiBleGlzdGluZyByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtQcmltYXJ5S2V5VHlwZX0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gIG1vZGVsIC0gVGhlIG5ldyBkYXRhIGZvciB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgdXBkYXRlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBtdWx0aXBsZSBleGlzdGluZyByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBuZXcgZGF0YSBmb3IgZWFjaCByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGw8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHggfSA9IHRoaXMubG9nQ3R4KGFyZ3MsIHRoaXMudXBkYXRlQWxsKTtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgdGFibGVMYWJlbCA9IE1vZGVsLnRhYmxlTmFtZShjbGF6eik7XG4gICAgbG9nLmRlYnVnKGBVcGRhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTGFiZWx9IHRhYmxlYCk7XG4gICAgY29uc3QgYnJlYWtPblNpbmdsZUZhaWx1cmUgPSBjdHguZ2V0KFwiYnJlYWtPblNpbmdsZUZhaWx1cmVJbkJ1bGtcIikgPz8gdHJ1ZTtcbiAgICBjb25zdCBjb250aW51ZU9uRXJyb3IgPSAhYnJlYWtPblNpbmdsZUZhaWx1cmU7XG4gICAgY29uc3QgdGFza3MgPSBpZC5tYXAoXG4gICAgICAoaSwgY291bnQpID0+ICgpID0+XG4gICAgICAgIHRoaXMudXBkYXRlKFxuICAgICAgICAgIGNsYXp6LFxuICAgICAgICAgIGksXG4gICAgICAgICAgbW9kZWxbY291bnRdLFxuICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgY3R4Lm92ZXJyaWRlKHsgbm9FbWl0U2luZ2xlOiB0cnVlIH0pIGFzIENPTlRFWFRcbiAgICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcmF3UmVzdWx0ID0gY29udGludWVPbkVycm9yXG4gICAgICA/IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcywgdHJ1ZSlcbiAgICAgIDogYXdhaXQgcHJvbWlzZVNlcXVlbmNlKHRhc2tzKTtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bGtTZXF1ZW5jZVJlc3VsdChcbiAgICAgIHJhd1Jlc3VsdCxcbiAgICAgIGNvbnRpbnVlT25FcnJvcixcbiAgICAgIGxvZyxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZU5hbWU6IENvbnN0cnVjdG9yPE0+LFxuICAgIGlkOiBQcmltYXJ5S2V5VHlwZSxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxDT05URVhUPlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlTmFtZTogQ29uc3RydWN0b3I8TT4sXG4gICAgaWQ6IFByaW1hcnlLZXlUeXBlW10sXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q09OVEVYVD5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCB7IGxvZywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLmRlbGV0ZUFsbCk7XG4gICAgbG9nLmRlYnVnKGBEZWxldGluZyAke2lkLmxlbmd0aH0gZW50cmllcyBmcm9tICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGNvbnN0IGJyZWFrT25TaW5nbGVGYWlsdXJlID0gY3R4LmdldChcImJyZWFrT25TaW5nbGVGYWlsdXJlSW5CdWxrXCIpID8/IHRydWU7XG4gICAgY29uc3QgY29udGludWVPbkVycm9yID0gIWJyZWFrT25TaW5nbGVGYWlsdXJlO1xuICAgIGNvbnN0IHRhc2tzID0gaWQubWFwKFxuICAgICAgKGkpID0+ICgpID0+XG4gICAgICAgIHRoaXMuZGVsZXRlKFxuICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICBpLFxuICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgY3R4Lm92ZXJyaWRlKHsgbm9FbWl0U2luZ2xlOiB0cnVlIH0pIGFzIENPTlRFWFRcbiAgICAgICAgKVxuICAgICk7XG4gICAgY29uc3QgcmF3UmVzdWx0ID0gY29udGludWVPbkVycm9yXG4gICAgICA/IGF3YWl0IHByb21pc2VTZXF1ZW5jZSh0YXNrcywgdHJ1ZSlcbiAgICAgIDogYXdhaXQgcHJvbWlzZVNlcXVlbmNlKHRhc2tzKTtcbiAgICByZXR1cm4gcmVzb2x2ZUJ1bGtTZXF1ZW5jZVJlc3VsdChcbiAgICAgIHJhd1Jlc3VsdCxcbiAgICAgIGNvbnRpbnVlT25FcnJvcixcbiAgICAgIGxvZyxcbiAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWxsb3dzIGV4ZWN1dGluZyBkYXRhYmFzZS1zcGVjaWZpYyBxdWVyaWVzIGRpcmVjdGx5XG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHJhdyBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1F9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIGFic3RyYWN0IHJhdzxSLCBEIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcmF3SW5wdXQ6IFFVRVJZLFxuICAgIGRvY3NPbmx5OiBELFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENPTlRFWFQ+XG4gICk6IFByb21pc2U8UmF3UmVzdWx0PFIsIEQ+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgZGF0YWJhc2UgY2hhbmdlcy4gVGhlIG9ic2VydmVyIGNhbiBvcHRpb25hbGx5XG4gICAqIHByb3ZpZGUgYSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmVjZWl2ZSBvbmx5IHNwZWNpZmljIGV2ZW50cy5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6ICgpID0+IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJvYnNlcnZlckhhbmRsZXJcIiwge1xuICAgICAgICB2YWx1ZTogdGhpcy5PYnNlcnZlckhhbmRsZXIoKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMub2JzZXJ2ZSk7XG4gICAgbG9nLnNpbGx5KGBSZWdpc3RlcmluZyBuZXcgb2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfWApO1xuICAgIGlmICghdGhpcy5kaXNwYXRjaCkge1xuICAgICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIGRpc3BhdGNoIGZvciAke3RoaXMuYWxpYXN9YCk7XG4gICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5EaXNwYXRjaCgpO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2gub2JzZXJ2ZSh0aGlzKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIG9ic2VydmVyIHNvIGl0IG5vIGxvbmdlciByZWNlaXZlcyBkYXRhYmFzZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJIYW5kbGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiT2JzZXJ2ZXJIYW5kbGVyIG5vdCBpbml0aWFsaXplZC4gRGlkIHlvdSByZWdpc3RlciBhbnkgb2JzZXJ2YWJsZXM/XCJcbiAgICAgICk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgICBpZiAodGhpcy5vYnNlcnZlckhhbmRsZXIuY291bnQoKSA8PSAwKSB7XG4gICAgICB0aGlzLmxvZ1xuICAgICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgICAuZGVidWcoXG4gICAgICAgICAgXCJObyBhY3RpdmUgb2JzZXJ2ZXJzIGZvciBhZHB0ZXIuIENsb3NpbmcgZGlzcGF0Y2hlciBhbmQgdW5vYnNlcnZpbmcuXCJcbiAgICAgICAgKTtcblxuICAgICAgdGhpcy5kaXNwYXRjaD8uY2xvc2UoW10gYXMgYW55KTsgLy8gY2xvc2UgZmlyc3RcbiAgICAgIHRoaXMuZGlzcGF0Y2g/LnVuT2JzZXJ2ZSh0aGlzKTsgLy8gdW5vYnNlcnZlIGxhdGVyXG4gICAgICAvLyBPbmNlIGluaXRpYWxpemVkLCB0aGUgRGlzcGF0Y2ggaW5zdGFuY2UgbXVzdCBiZSBwcmVzZXJ2ZWQsXG4gICAgICAvLyBiZWNhdXNlIGl0IGVuaGFuY2VzIHRoZSBhZGFwdGVy4oCZcyBvcmlnaW5hbCBtZXRob2RzIGFuZCBsaW5rcyBpdHNlbGYgdG8gdGhlbVxuICAgICAgLy8gdGhpcy5kaXNwYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ1xuICAgICAgLmZvcih0aGlzLnVuT2JzZXJ2ZSlcbiAgICAgIC5kZWJ1ZyhgT2JzZXJ2ZXIgJHtvYnNlcnZlci50b1N0cmluZygpfSByZW1vdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE5vdGlmaWVzIGFsbCBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBTZW5kcyBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIG9ic2VydmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUgZGF0YWJhc2UsXG4gICAqIGZpbHRlcmluZyBiYXNlZCBvbiBlYWNoIG9ic2VydmVyJ3MgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb2JzZXJ2ZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gbm90aWZpZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVyczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIHRhYmxlOiBDb25zdHJ1Y3RvcjxNPiB8IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogQ29udGV4dHVhbEFyZ3M8Q09OVEVYVD5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IHsgY3R4LCBjdHhBcmdzIH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgaWYgKCFjdHguZ2V0KFwibm9FbWl0XCIpKSB7XG4gICAgICBjb25zdCBpc0J1bGsgPSBBcnJheS5pc0FycmF5KGlkKTtcbiAgICAgIGNvbnN0IGVtaXRTaW5nbGUgPSAhY3R4LmdldChcIm5vRW1pdFNpbmdsZVwiKTtcbiAgICAgIGNvbnN0IGVtaXRCdWxrID0gIWN0eC5nZXQoXCJub0VtaXRCdWxrXCIpO1xuICAgICAgaWYgKChpc0J1bGsgJiYgZW1pdEJ1bGspIHx8ICghaXNCdWxrICYmIGVtaXRTaW5nbGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICAuLi5jdHhBcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZyZXNoZXMgZGF0YSBiYXNlZCBvbiBhIGRhdGFiYXNlIGV2ZW50XG4gICAqIEBzdW1tYXJ5IEltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIHVwZGF0ZU9ic2VydmVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGV2ZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlZnJlc2ggaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIHJlZnJlc2g8TSBleHRlbmRzIE1vZGVsPihcbiAgICB0YWJsZTogQ29uc3RydWN0b3I8TT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENPTlRFWFQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGFwdGVyXG4gICAqL1xuICBvdmVycmlkZSB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmZsYXZvdXJ9IGFkYXB0ZXJgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBhZGFwdGVyIGZsYXZvciBhc3NvY2lhdGVkIHdpdGggYSBtb2RlbFxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgZmxhdm9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3NcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyIGZsYXZvciBuYW1lXG4gICAqL1xuICBzdGF0aWMgZmxhdm91ck9mPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IENvbnN0cnVjdG9yPE0+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gTWV0YWRhdGEuZmxhdm91ck9mKG1vZGVsKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgY3VycmVudEZsYXZvdXIoKSB7XG4gICAgaWYgKCFBZGFwdGVyLl9jdXJyZW50Rmxhdm91cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcGVyc2lzdGVuY2UgZmxhdm91ciBzZXQuIFBsZWFzZSBpbml0aWFsaXplIHlvdXIgYWRhcHRlcmBcbiAgICAgICk7XG4gICAgcmV0dXJuIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGFkYXB0ZXIgdGhhdCBpcyBjdXJyZW50bHkgc2V0IGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEByZXR1cm4ge0FkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pn0gVGhlIGN1cnJlbnQgYWRhcHRlclxuICAgKi9cbiAgc3RhdGljIGdldCBjdXJyZW50KCk6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFkYXB0ZXIuZ2V0KHRoaXMuY3VycmVudEZsYXZvdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbnJlZ2lzdGVycyBhbiBhZGFwdGVyIGJ5IGFsaWFzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgdGhlIGFkYXB0ZXIgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhbGlhcyBmcm9tIHRoZSBjYWNoZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWxpYXMgLSBUaGUgYWxpYXMgdGhhdCB3YXMgdXNlZCB0byByZWdpc3RlciB0aGUgYWRhcHRlclxuICAgKi9cbiAgc3RhdGljIHVucmVnaXN0ZXIoYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWFsaWFzKSByZXR1cm47XG4gICAgY29uc3QgYWRhcHRlciA9IEFkYXB0ZXIuX2NhY2hlW2FsaWFzXSBhc1xuICAgICAgfCBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYWRhcHRlcikgcmV0dXJuO1xuICAgIGRlbGV0ZSBBZGFwdGVyLl9jYWNoZVthbGlhc107XG4gICAgaWYgKEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyID09PSBhbGlhcykgQWRhcHRlci5fY3VycmVudEZsYXZvdXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgYWRhcHRlci5mbGF2b3VyICYmXG4gICAgICBBZGFwdGVyLl9jYWNoZVthZGFwdGVyLmZsYXZvdXJdICYmXG4gICAgICBBZGFwdGVyLl9jYWNoZVthZGFwdGVyLmZsYXZvdXJdID09PSBhZGFwdGVyXG4gICAgKSB7XG4gICAgICBkZWxldGUgQWRhcHRlci5fY2FjaGVbYWRhcHRlci5mbGF2b3VyXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYW4gYWRhcHRlciBieSBmbGF2b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGJ5IGl0cyBmbGF2b3IgbmFtZVxuICAgKiBAdGVtcGxhdGUgQ09ORiAtIFRoZSBkYXRhYmFzZSBkcml2ZXIgY29uZmlnXG4gICAqIEB0ZW1wbGF0ZSBDT05OIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAdGVtcGxhdGUgUVVFUlkgLSBUaGUgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7QWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgQ09OVEVYVD4gfCB1bmRlZmluZWR9IFRoZSBhZGFwdGVyIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8QSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4oXG4gICAgZmxhdm91cj86IGFueVxuICApOiBBIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXSBhcyBBO1xuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBObyBBZGFwdGVyIHJlZ2lzdGVyZWQgdW5kZXIgJHtmbGF2b3VyfS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQ2hhbmdlcyB3aGljaCBhZGFwdGVyIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gc2V0IGFzIGN1cnJlbnRcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRDdXJyZW50KGZsYXZvdXI6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnRGbGF2b3VyID0gZmxhdm91cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCBhbiBhZGFwdGVyIGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpZmljIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgYWRhcHRlciBmbGF2b3IgdG8gZmluZCBtb2RlbHMgZm9yXG4gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqL1xuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxNPltdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE1ldGFkYXRhLmZsYXZvdXJlZEFzKGZsYXZvdXIpLmZpbHRlcihcbiAgICAgICAgKE1vZGVsIGFzIGFueSkuaXNNb2RlbFxuICAgICAgKSBhcyBNb2RlbENvbnN0cnVjdG9yPE0+W107XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGVjb3JhdGlvbigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHByb3hpZXM/OiBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgdGhpcz47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmV0dXJuIHRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyLlxuICAgKiBAdGVtcGxhdGUgQ09OIC0gVGhlIHR5cGUgb2YgdGhlIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtDT059IFRoZSBjbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBhZGFwdGVyXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZnVuY3Rpb24gZ2V0Q2xpZW50XG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6Y29yZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENsaWVudCgpOiBDT05OO1xuXG4gIEBmaW5hbCgpXG4gIGdldCBjbGllbnQoKTogQ09OTiB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHRoaXMuX2NsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGZvcihjb25maWc6IFBhcnRpYWw8Q09ORj4sIC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgY2xlYW51cFByb3h5Q2xpZW50ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICAgIGNvbnN0IG1ldGhvZHMgPSBbXCJjYW5jZWxcIiwgXCJjbG9zZVwiLCBcImRlc3Ryb3lcIiwgXCJkaXNjb25uZWN0XCJdO1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICBjb25zdCBmbiA9IGNsaWVudFttZXRob2RdO1xuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuLmNhbGwoY2xpZW50KTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgYXdhaXQgcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShwcm94eSwgQWRhcHRlclByb3h5Q2xlYW51cCwge1xuICAgICAgdmFsdWU6IGNsZWFudXBQcm94eUNsaWVudCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMucHJveGllc1trZXldID0gcHJveHk7XG4gICAgcmV0dXJuIHByb3h5IGFzIHR5cGVvZiB0aGlzO1xuICB9XG5cbiAgbWlncmF0aW9ucygpIHtcbiAgICByZXR1cm4gTWV0YWRhdGEubWlncmF0aW9uc0Zvcih0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRRdWVyeVJ1bm5lcigpOiBQcm9taXNlPENPTk4+IHtcbiAgICByZXR1cm4gdGhpcyBhcyB1bmtub3duIGFzIENPTk47XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENPTlRFWFQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9EXG4gICk6IENvbnRleHR1YWxpemVkQXJnczxDT05URVhULCBBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENPTlRFWFQsIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9ELFxuICAgIGFsbG93Q3JlYXRlOiBmYWxzZVxuICApOiBDb250ZXh0dWFsaXplZEFyZ3M8Q09OVEVYVCwgQVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDT05URVhULCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogdHJ1ZSxcbiAgICBvdmVycmlkZXM/OiBQYXJ0aWFsPEZsYWdzT2Y8Q09OVEVYVD4+XG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPENPTlRFWFQsIEFSR1MsIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZT5cbiAgPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDT05URVhULCBBUkdTPixcbiAgICBvcGVyYXRpb246IE1FVEhPRCxcbiAgICBhbGxvd0NyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIG92ZXJyaWRlcz86IFBhcnRpYWw8RmxhZ3NPZjxDT05URVhUPj5cbiAgKTpcbiAgICB8IFByb21pc2U8XG4gICAgICAgIENvbnRleHR1YWxpemVkQXJnczxDT05URVhULCBBUkdTLCBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2U+XG4gICAgICA+XG4gICAgfCBDb250ZXh0dWFsaXplZEFyZ3M8Q09OVEVYVCwgQVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPiB7XG4gICAgcmV0dXJuIHN1cGVyLmxvZ0N0eChhcmdzLCBvcGVyYXRpb24sIGFsbG93Q3JlYXRlIGFzIGFueSwgb3ZlcnJpZGVzKTtcbiAgfVxufVxuIl19
@@ -89,4 +89,4 @@ class Context extends db_decorators_1.Context {
89
89
  }
90
90
  }
91
91
  exports.Context = Context;
92
- //# sourceMappingURL=Context.js.map
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJzaXN0ZW5jZS9Db250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUF3RTtBQUd4RSxNQUFhLE9BRVgsU0FBUSx1QkFBTTtJQUNkLFlBQVksR0FBa0I7UUFDNUIsS0FBSyxDQUFDLEdBQWUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBVyxFQUFFLEVBQVU7UUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksNkJBQWEsQ0FDckIscUNBQXFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FDdkQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZUFBZSxDQUNiLEdBQU0sRUFDTixVQUE2QixJQUFJLEdBQUcsRUFBRTtRQUV0QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSTtZQUFFLE9BQU8s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Q0FBQyxDQUFDOzRCQUNwQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDbkQsQ0FBQztxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDO1NBQ0YsQ0FBUyxDQUFDO0lBQ2IsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBd0IsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNoRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFVLENBQUMsQ0FBQztZQUNoQyxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFUSxVQUFVLENBQW1CLEtBQVE7UUFDNUMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBbUIsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUF2R0QsMEJBdUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGV4dCBhcyBDdHgsIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEFkYXB0ZXJGbGFncywgQ29udGV4dEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQ8XG4gIEYgZXh0ZW5kcyBDb250ZXh0RmxhZ3M8YW55PiA9IEFkYXB0ZXJGbGFnczxhbnk+LFxuPiBleHRlbmRzIEN0eDxGPiB7XG4gIGNvbnN0cnVjdG9yKGN0eD86IENvbnRleHQ8YW55Pikge1xuICAgIHN1cGVyKGN0eCBhcyBDdHg8YW55Pik7XG4gIH1cblxuICBwdXNoUGVuZGluZyhrZXk6IHN0cmluZywgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKSB8fCB7fTtcbiAgICBwZW5kaW5nW2tleV0gPSBwZW5kaW5nW2tleV0gfHwgW107XG4gICAgaWYgKHBlbmRpbmdba2V5XS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgVHJ5aW5nIHRvIHB1c2ggYSByZXBlYXRlZCBwZW5kaW5nICR7a2V5fSB0YXNrOiAke2lkfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHBlbmRpbmdba2V5XS5wdXNoKGlkKTtcbiAgICB0aGlzLmFjY3VtdWxhdGUoeyBwZW5kaW5nOiBwZW5kaW5nIH0pO1xuICB9XG5cbiAgZ2V0RnJvbUNoaWxkcmVuPEsgZXh0ZW5kcyBrZXlvZiBGPihcbiAgICBrZXk6IEssXG4gICAgdmlzaXRlZDogU2V0PENvbnRleHQ8YW55Pj4gPSBuZXcgU2V0KClcbiAgKTogRltLXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKHRoaXMpO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoa2V5KTtcbiAgICBpZiAocmVzICE9PSB1bmRlZmluZWQgJiYgcmVzICE9PSBudWxsKSByZXR1cm4gcmVzO1xuICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuZ2V0T3JVbmRlZmluZWQoXCJjaGlsZENvbnRleHRzXCIgYXMgSyk7XG4gICAgaWYgKGNoaWxkcmVuICYmIChjaGlsZHJlbiBhcyBhbnkpLmxlbmd0aCkge1xuICAgICAgY2hpbGRyZW4gPSAoY2hpbGRyZW4gYXMgYW55W10pLmZpbHRlcihcbiAgICAgICAgKGNoaWxkOiBhbnkpID0+ICF2aXNpdGVkLmhhcyhjaGlsZClcbiAgICAgICkgYXMgYW55O1xuICAgICAgaWYgKChjaGlsZHJlbiBhcyBhbnlbXSkubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSAoY2hpbGRyZW4gYXMgYW55W10pXG4gICAgICAgICAgLm1hcCgoY2hpbGQ6IGFueSkgPT4gY2hpbGQuZ2V0RnJvbUNoaWxkcmVuKGtleSwgdmlzaXRlZCkpXG4gICAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnlbXSwgZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWwpKSB7XG4gICAgICAgICAgICAgIGFjYy5wdXNoKC4uLmVsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwgIT09IHVuZGVmaW5lZCAmJiBlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBhY2MucHVzaChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgIC5maWx0ZXIoKGVsOiB1bmtub3duKSA9PiBlbCAhPT0gdW5kZWZpbmVkICYmIGVsICE9PSBudWxsKSBhcyBGW0tdW107XG4gICAgICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChyZXN1bHRzLnNvbWUoKGVsKSA9PiB0eXBlb2YgZWwgIT09IFwib2JqZWN0XCIpKSByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGVsKSA9PiBPYmplY3QuYXNzaWduKGFjYywgZWwpLFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxhbnksIGFueT5cbiAgICAgICAgKSBhcyBGW0tdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcGVuZGluZygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldEZyb21DaGlsZHJlbihcInBlbmRpbmdcIik7XG4gIH1cblxuICBnZXRPclVuZGVmaW5lZDxLIGV4dGVuZHMga2V5b2YgRj4oa2V5OiBLKTogRltLXSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmdldChrZXkpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUoY29uZjogUGFydGlhbDxGPikge1xuICAgIHJldHVybiBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0OiB0aGlzLCBwOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiZ2V0XCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldC5nZXQsIHtcbiAgICAgICAgICAgIGFwcGx5OiAoXG4gICAgICAgICAgICAgIG1ldGhvZDogdHlwZW9mIHRhcmdldC5nZXQsXG4gICAgICAgICAgICAgIF90aGlzQXJnOiB1bmtub3duLFxuICAgICAgICAgICAgICBhcmdBcnJheTogYW55W11cbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwcm9wID0gYXJnQXJyYXlbMF0gYXMga2V5b2YgRjtcbiAgICAgICAgICAgICAgaWYgKCFwcm9wKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgYEludmFsaWQgcHJvcGVydHkgYWNjZXNzIHRvIG92ZXJyaWRkZW4gY29udGV4dDogJHtwcm9wIGFzIHN0cmluZ31gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHByb3AgaW4gY29uZikgcmV0dXJuIGNvbmZbcHJvcF07XG4gICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KG1ldGhvZCwgcmVjZWl2ZXIsIGFyZ0FycmF5KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICB9KSBhcyB0aGlzO1xuICB9XG5cbiAgdG9PdmVycmlkZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUua2V5cygpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gdGhpcy5nZXQoa2V5IGFzIGFueSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiBDb250ZXh0PEYgJiBWPiB7XG4gICAgcmV0dXJuIHN1cGVyLmFjY3VtdWxhdGUodmFsdWUpIGFzIENvbnRleHQ8RiAmIFY+O1xuICB9XG59XG4iXX0=
@@ -77,4 +77,4 @@ class ContextLock extends transactional_decorators_1.Lock {
77
77
  }
78
78
  }
79
79
  exports.ContextLock = ContextLock;
80
- //# sourceMappingURL=ContextLock.js.map
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dExvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UvQ29udGV4dExvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUZBQTBEO0FBRTFELDJEQUF3RDtBQUV4RCxNQUFhLGtCQUFrQjtJQUM3QixZQUNZLE9BQVU7SUFDcEIsNkRBQTZEO0lBQzdELEdBQUcsSUFBVztRQUZKLFlBQU8sR0FBUCxPQUFPLENBQUc7SUFHbkIsQ0FBQztJQUVKLDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBVztRQUN4QixhQUFhO0lBQ2YsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBVztRQUN6QixZQUFZO0lBQ2QsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBVztRQUMzQixhQUFhO0lBQ2YsQ0FBQztDQUNGO0FBckJELGdEQXFCQztBQUVELE1BQWEsV0FBWSxTQUFRLCtCQUFJO0lBSW5DLFlBQXNCLGtCQUEyQztRQUMvRCxLQUFLLEVBQUUsQ0FBQztRQURZLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBeUI7UUFIekQsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDZCxTQUFJLEdBQVMsSUFBSSwrQkFBSSxFQUFFLENBQUM7SUFJM0MsQ0FBQztJQUVRLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFXO1FBQ25DLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRVEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQVc7UUFDbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQ3BDLElBQUksNkJBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsRUFDdkQsR0FBRyxJQUFJLENBQ1IsQ0FBQztZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFRLEVBQUUsR0FBRyxJQUFXO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQ3BDLElBQUksNkJBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsRUFDdkQsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSw2QkFBYSxDQUFDLG1DQUFtQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXRERCxrQ0FzREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NrIH0gZnJvbSBcIkBkZWNhZi10cy90cmFuc2FjdGlvbmFsLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgQWRhcHRlciB9IGZyb20gXCIuL0FkYXB0ZXJcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkYXB0ZXJUcmFuc2FjdGlvbjxBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBhZGFwdGVyOiBBLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHt9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBiZWdpbiguLi5hcmdzOiBhbnlbXSkge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgY29tbWl0KC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgLy9kbyBub3RoaW5nXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIHJvbGxiYWNrKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0TG9jayBleHRlbmRzIExvY2sge1xuICBwcml2YXRlIGFjcXVpcmVDb3VudDogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2s6IExvY2sgPSBuZXcgTG9jaygpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhZGFwdGVyVHJhbnNhY3Rpb246IEFkYXB0ZXJUcmFuc2FjdGlvbjxhbnk+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGFjcXVpcmUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIHRoaXMuYWNxdWlyZUNvdW50Kys7XG4gICAgaWYgKHRoaXMuYWNxdWlyZUNvdW50ID09PSAxKSB7XG4gICAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyVHJhbnNhY3Rpb24uYmVnaW4oLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9jay5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVsZWFzZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgdGhpcy5hY3F1aXJlQ291bnQtLTtcbiAgICBpZiAodGhpcy5hY3F1aXJlQ291bnQgPT09IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRhcHRlclRyYW5zYWN0aW9uLmNvbW1pdCguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyVHJhbnNhY3Rpb24ucm9sbGJhY2soXG4gICAgICAgICAgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBzdWJtaXQgdHJhbnNhY3Rpb246ICR7ZX1gKSxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5hY3F1aXJlQ291bnQgPCAwKSB7XG4gICAgICB0aGlzLmFjcXVpcmVDb3VudCA9IDA7XG4gICAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJvbGxiYWNrKGU6IEVycm9yLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRhcHRlclRyYW5zYWN0aW9uLnJvbGxiYWNrKFxuICAgICAgICBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHN1Ym1pdCB0cmFuc2FjdGlvbjogJHtlfWApLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gcm9sbGJhY2sgdHJhbnNhY3Rpb246ICR7ZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -40,6 +40,13 @@ class Dispatch extends ContextualLoggedClass_1.ContextualLoggedClass {
40
40
  */
41
41
  constructor() {
42
42
  super();
43
+ /**
44
+ * Indicates whether the dispatcher has already been initialized.
45
+ *
46
+ * @description Tracks the initialization state to prevent duplicate setup
47
+ * @summary Whether the dispatcher is initialized and ready to observe adapter operations
48
+ */
49
+ this.initialized = false;
43
50
  }
44
51
  logCtx(args, operation, allowCreate = false) {
45
52
  if (!this.adapter)
@@ -92,8 +99,15 @@ class Dispatch extends ContextualLoggedClass_1.ContextualLoggedClass {
92
99
  .verbose(`No adapter observed for dispatch; skipping initialization`);
93
100
  return;
94
101
  }
102
+ if (this.initialized) {
103
+ this.log
104
+ .for(this.initialize)
105
+ .debug("Dispatcher already initialized; skipping initialization to prevent duplicate setup");
106
+ return;
107
+ }
95
108
  const { log } = (await this.logCtx(args, constants_1.PersistenceKeys.INITIALIZATION, true)).for(this.initialize);
96
109
  log.verbose(`Initializing ${this.adapter}'s event Dispatch`);
110
+ this.initialized = true;
97
111
  const adapter = this.adapter;
98
112
  [
99
113
  db_decorators_1.OperationKeys.CREATE,
@@ -172,6 +186,8 @@ class Dispatch extends ContextualLoggedClass_1.ContextualLoggedClass {
172
186
  observe(observer) {
173
187
  if (!(observer instanceof Adapter_1.Adapter))
174
188
  throw new errors_1.UnsupportedError("Only Adapters can be observed by dispatch");
189
+ if (this.adapter)
190
+ return () => this.unObserve(this.adapter);
175
191
  this.adapter = observer;
176
192
  this.models = Adapter_1.Adapter.models(this.adapter.alias);
177
193
  this.initialize().then(() => this.log.verbose(`Dispatch initialized for ${this.adapter.alias} adapter`));
@@ -200,11 +216,12 @@ class Dispatch extends ContextualLoggedClass_1.ContextualLoggedClass {
200
216
  if (!model)
201
217
  throw new db_decorators_1.InternalError(`Model must be provided for observer update`);
202
218
  const table = model && typeof model === "string" ? model : decorator_validation_1.Model.tableName(model);
203
- const { log, ctxArgs, ctx } = this.logCtx(args, this.updateObservers);
204
219
  if (!this.adapter) {
205
- log.verbose(`No adapter observed for dispatch; skipping observer update for ${table}:${event}`);
220
+ const log = this.log.for(this.updateObservers);
221
+ log.debug(`No adapter observed for dispatch; skipping observer update for ${table}:${event}`);
206
222
  return;
207
223
  }
224
+ const { log, ctxArgs, ctx } = this.logCtx(args, this.updateObservers);
208
225
  try {
209
226
  log.debug(`dispatching observer refresh for ${event}:${table}: ${id}${ctx.get("observeFullResult") ? " - including result" : ""}`);
210
227
  await this.adapter.refresh(model, event, id, ...ctxArgs);
@@ -220,4 +237,4 @@ class Dispatch extends ContextualLoggedClass_1.ContextualLoggedClass {
220
237
  exports.Dispatch = Dispatch;
221
238
  if (Adapter_1.Adapter)
222
239
  Adapter_1.Adapter["_baseDispatch"] = Dispatch;
223
- //# sourceMappingURL=Dispatch.js.map
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVyc2lzdGVuY2UvRGlzcGF0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBSWlDO0FBQ2pDLHlFQUF5RTtBQUV6RSwyQ0FBb0M7QUFDcEMseUNBQTRDO0FBRzVDLGdGQU13QztBQUN4QywrQ0FBOEM7QUFFOUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFhLFFBQ1gsU0FBUSw2Q0FBbUM7SUF1QjNDOzs7T0FHRztJQUNIO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUF6QlY7Ozs7O1dBS0c7UUFDTyxnQkFBVyxHQUFZLEtBQUssQ0FBQztJQW9CdkMsQ0FBQztJQW1Da0IsTUFBTSxDQUl2QixJQUE0QyxFQUM1QyxTQUFpQixFQUNqQixjQUF1QixLQUFLO1FBYzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sSUFBSSw2QkFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBa0IsQ0FZNUQsQ0FBQztJQUNSLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQ0c7SUFDTyxLQUFLLENBQUMsVUFBVSxDQUN4QixHQUFHLElBQXNDO1FBRXpDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsa0VBQWtFO1lBQ2xFLDBFQUEwRTtZQUMxRSxxRUFBcUU7WUFDckUsSUFBSSxDQUFDLEdBQUc7aUJBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ3BCLE9BQU8sQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQ3hFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFD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WyJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIi4vQWRhcHRlclwiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlckRpc3BhdGNoLCBDb250ZXh0T2YsIEV2ZW50SWRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBDb250ZXh0dWFsQXJncyxcbiAgQ29udGV4dHVhbGl6ZWRBcmdzLFxuICBDb250ZXh0dWFsTG9nZ2VkQ2xhc3MsXG4gIE1heWJlQ29udGV4dHVhbEFyZyxcbiAgTWV0aG9kT3JPcGVyYXRpb24sXG59IGZyb20gXCIuLi91dGlscy9Db250ZXh0dWFsTG9nZ2VkQ2xhc3NcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVzIGRhdGFiYXNlIG9wZXJhdGlvbiBldmVudHMgdG8gb2JzZXJ2ZXJzXG4gKiBAc3VtbWFyeSBUaGUgRGlzcGF0Y2ggY2xhc3MgaW1wbGVtZW50cyB0aGUgT2JzZXJ2YWJsZSBpbnRlcmZhY2UgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmNlcHRpbmdcbiAqIGRhdGFiYXNlIG9wZXJhdGlvbnMgZnJvbSBhbiBBZGFwdGVyIGFuZCBub3RpZnlpbmcgb2JzZXJ2ZXJzIHdoZW4gY2hhbmdlcyBvY2N1ci4gSXQgdXNlcyBwcm94aWVzIHRvXG4gKiB3cmFwIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIGFuZCBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgb2JzZXJ2ZXIgdXBkYXRlcyBhZnRlciBvcGVyYXRpb25zIGNvbXBsZXRlLlxuICogQHRlbXBsYXRlIFkgLSBUaGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlciB0eXBlXG4gKiBAcGFyYW0ge3ZvaWR9IC0gTm8gY29uc3RydWN0b3IgcGFyYW1ldGVyc1xuICogQGNsYXNzIERpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRGlzcGF0Y2ggaW5zdGFuY2VcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IERpc3BhdGNoPFBvc3RncmVzRHJpdmVyPigpO1xuICpcbiAqIC8vIENvbm5lY3QgaXQgdG8gYW4gYWRhcHRlclxuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIoY29ubmVjdGlvbik7XG4gKiBkaXNwYXRjaC5vYnNlcnZlKGFkYXB0ZXIpO1xuICpcbiAqIC8vIE5vdyBhbnkgQ1JVRCBvcGVyYXRpb25zIG9uIHRoZSBhZGFwdGVyIHdpbGwgYXV0b21hdGljYWxseVxuICogLy8gdHJpZ2dlciBvYnNlcnZlciBub3RpZmljYXRpb25zXG4gKiBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxMjMsIHVzZXJNb2RlbCk7XG4gKiAvLyBPYnNlcnZlcnMgd2lsbCBiZSBub3RpZmllZCBhYm91dCB0aGUgY3JlYXRpb25cbiAqXG4gKiAvLyBXaGVuIGRvbmUsIHlvdSBjYW4gZGlzY29ubmVjdFxuICogZGlzcGF0Y2gudW5PYnNlcnZlKGFkYXB0ZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwYXRjaDxBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PlxuICBleHRlbmRzIENvbnRleHR1YWxMb2dnZWRDbGFzczxDb250ZXh0T2Y8QT4+XG4gIGltcGxlbWVudHMgQWRhcHRlckRpc3BhdGNoPEE+XG57XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlzcGF0Y2hlciBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhY2tzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBzZXR1cFxuICAgKiBAc3VtbWFyeSBXaGV0aGVyIHRoZSBkaXNwYXRjaGVyIGlzIGluaXRpYWxpemVkIGFuZCByZWFkeSB0byBvYnNlcnZlIGFkYXB0ZXIgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgYWRhcHRlciBiZWluZyBvYnNlcnZlZFxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2UgdG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXIgd2hvc2Ugb3BlcmF0aW9ucyBhcmUgYmVpbmcgbW9uaXRvcmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWRhcHRlcj86IEE7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIG1vZGVsIGNvbnN0cnVjdG9yc1xuICAgKiBAc3VtbWFyeSBBcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgbW9kZWxzITogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+W107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IERpc3BhdGNoIGluc3RhbmNlIHdpdGhvdXQgYW55IGFkYXB0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPiwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0RcbiAgKTogQ29udGV4dHVhbGl6ZWRBcmdzPFxuICAgIENvbnRleHRPZjxBPixcbiAgICBBUkdTLFxuICAgIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZVxuICA+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPiwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IGZhbHNlXG4gICk6IENvbnRleHR1YWxpemVkQXJnczxcbiAgICBDb250ZXh0T2Y8QT4sXG4gICAgQVJHUyxcbiAgICBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2VcbiAgPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGxvZ0N0eDxcbiAgICBBUkdTIGV4dGVuZHMgYW55W10gPSBhbnlbXSxcbiAgICBNRVRIT0QgZXh0ZW5kcyBNZXRob2RPck9wZXJhdGlvbiA9IE1ldGhvZE9yT3BlcmF0aW9uLFxuICA+KFxuICAgIGFyZ3M6IE1heWJlQ29udGV4dHVhbEFyZzxDb250ZXh0T2Y8QT4sIEFSR1M+LFxuICAgIG9wZXJhdGlvbjogTUVUSE9ELFxuICAgIGFsbG93Q3JlYXRlOiB0cnVlXG4gICk6IFByb21pc2U8XG4gICAgQ29udGV4dHVhbGl6ZWRBcmdzPENvbnRleHRPZjxBPiwgQVJHUywgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlPlxuICA+O1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbG9nQ3R4PFxuICAgIEFSR1MgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLFxuICAgIE1FVEhPRCBleHRlbmRzIE1ldGhvZE9yT3BlcmF0aW9uID0gTWV0aG9kT3JPcGVyYXRpb24sXG4gID4oXG4gICAgYXJnczogTWF5YmVDb250ZXh0dWFsQXJnPENvbnRleHRPZjxBPiwgQVJHUz4sXG4gICAgb3BlcmF0aW9uOiBNRVRIT0QsXG4gICAgYWxsb3dDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOlxuICAgIHwgUHJvbWlzZTxcbiAgICAgICAgQ29udGV4dHVhbGl6ZWRBcmdzPFxuICAgICAgICAgIENvbnRleHRPZjxBPixcbiAgICAgICAgICBBUkdTLFxuICAgICAgICAgIE1FVEhPRCBleHRlbmRzIHN0cmluZyA/IHRydWUgOiBmYWxzZVxuICAgICAgICA+XG4gICAgICA+XG4gICAgfCBDb250ZXh0dWFsaXplZEFyZ3M8XG4gICAgICAgIENvbnRleHRPZjxBPixcbiAgICAgICAgQVJHUyxcbiAgICAgICAgTUVUSE9EIGV4dGVuZHMgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlXG4gICAgICA+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJBZGFwdGVyIG5vdCBzZXQgeWV0XCIpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXJbXCJsb2dDdHhcIl0oYXJncywgb3BlcmF0aW9uLCBhbGxvd0NyZWF0ZSBhcyBhbnkpIGFzXG4gICAgICB8IENvbnRleHR1YWxpemVkQXJnczxcbiAgICAgICAgICBDb250ZXh0T2Y8QT4sXG4gICAgICAgICAgQVJHUyxcbiAgICAgICAgICBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgPlxuICAgICAgfCBQcm9taXNlPFxuICAgICAgICAgIENvbnRleHR1YWxpemVkQXJnczxcbiAgICAgICAgICAgIENvbnRleHRPZjxBPixcbiAgICAgICAgICAgIEFSR1MsXG4gICAgICAgICAgICBNRVRIT0QgZXh0ZW5kcyBzdHJpbmcgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICA+XG4gICAgICAgID47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaCBieSBwcm94eWluZyBhZGFwdGVyIG1ldGhvZHNcbiAgICogQHN1bW1hcnkgU2V0cyB1cCBwcm94aWVzIG9uIHRoZSBhZGFwdGVyJ3MgQ1JVRCBtZXRob2RzIHRvIGludGVyY2VwdCBvcGVyYXRpb25zIGFuZCBub3RpZnkgb2JzZXJ2ZXJzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIGFkYXB0ZXIgaXMgb2JzZXJ2ZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgUHJveHlcbiAgICpcbiAgICogICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBpbml0aWFsaXplKClcbiAgICogICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBDaGVjayBpZiBhZGFwdGVyIGV4aXN0c1xuICAgKiAgIGFsdCBObyBhZGFwdGVyXG4gICAqICAgICBEaXNwYXRjaC0tPj5EaXNwYXRjaDogVGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGxvb3AgRm9yIGVhY2ggQ1JVRCBtZXRob2RcbiAgICogICAgIERpc3BhdGNoLT4+QWRhcHRlcjogQ2hlY2sgaWYgbWV0aG9kIGV4aXN0c1xuICAgKiAgICAgYWx0IE1ldGhvZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgIERpc3BhdGNoLS0+PkRpc3BhdGNoOiBUaHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbmRcbiAgICpcbiAgICogICAgIERpc3BhdGNoLT4+QWRhcHRlcjogR2V0IHByb3BlcnR5IGRlc2NyaXB0b3JcbiAgICogICAgIGxvb3AgV2hpbGUgZGVzY3JpcHRvciBub3QgZm91bmRcbiAgICogICAgICAgRGlzcGF0Y2gtPj5BZGFwdGVyOiBDaGVjayBwcm90b3R5cGUgY2hhaW5cbiAgICogICAgIGVuZFxuICAgKlxuICAgKiAgICAgYWx0IERlc2NyaXB0b3Igbm90IGZvdW5kIG9yIG5vdCB3cml0YWJsZVxuICAgKiAgICAgICBEaXNwYXRjaC0+PkRpc3BhdGNoOiBMb2cgZXJyb3IgYW5kIGNvbnRpbnVlXG4gICAqICAgICBlbHNlIERlc2NyaXB0b3IgZm91bmQgYW5kIHdyaXRhYmxlXG4gICAqICAgICAgIERpc3BhdGNoLT4+UHJveHk6IENyZWF0ZSBwcm94eSBmb3IgbWV0aG9kXG4gICAqICAgICAgIERpc3BhdGNoLT4+QWRhcHRlcjogUmVwbGFjZSBtZXRob2Qgd2l0aCBwcm94eVxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgaW5pdGlhbGl6ZShcbiAgICAuLi5hcmdzOiBNYXliZUNvbnRleHR1YWxBcmc8Q29udGV4dE9mPEE+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgLy8gR3JhY2VmdWxseSBza2lwIGluaXRpYWxpemF0aW9uIHdoZW4gbm8gYWRhcHRlciBpcyBvYnNlcnZlZCB5ZXQuXG4gICAgICAvLyBTb21lIHRlc3RzIG9yIHNldHVwcyBtYXkgY29uc3RydWN0IGEgRGlzcGF0Y2ggYmVmb3JlIGNhbGxpbmcgb2JzZXJ2ZSgpLlxuICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZywgd2Ugbm8tb3Agc28gdGhhdCBsYXRlciBvYnNlcnZlKCkgY2FuIHByb2NlZWQuXG4gICAgICB0aGlzLmxvZ1xuICAgICAgICAuZm9yKHRoaXMuaW5pdGlhbGl6ZSlcbiAgICAgICAgLnZlcmJvc2UoYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBpbml0aWFsaXphdGlvbmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmxvZ1xuICAgICAgICAuZm9yKHRoaXMuaW5pdGlhbGl6ZSlcbiAgICAgICAgLmRlYnVnKFxuICAgICAgICAgIFwiRGlzcGF0Y2hlciBhbHJlYWR5IGluaXRpYWxpemVkOyBza2lwcGluZyBpbml0aWFsaXphdGlvbiB0byBwcmV2ZW50IGR1cGxpY2F0ZSBzZXR1cFwiXG4gICAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBsb2cgfSA9IChcbiAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KGFyZ3MsIFBlcnNpc3RlbmNlS2V5cy5JTklUSUFMSVpBVElPTiwgdHJ1ZSlcbiAgICApLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGxvZy52ZXJib3NlKGBJbml0aWFsaXppbmcgJHt0aGlzLmFkYXB0ZXJ9J3MgZXZlbnQgRGlzcGF0Y2hgKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+O1xuICAgIChcbiAgICAgIFtcbiAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICAgICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsXG4gICAgICAgIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLFxuICAgICAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCxcbiAgICAgIF0gYXMgKGtleW9mIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PilbXVxuICAgICkuZm9yRWFjaCgodG9XcmFwKSA9PiB7XG4gICAgICBpZiAoIWFkYXB0ZXJbdG9XcmFwXSlcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYE1ldGhvZCAke3RvV3JhcH0gbm90IGZvdW5kIGluICR7YWRhcHRlci5hbGlhc30gYWRhcHRlciB0byBiaW5kIE9ic2VydmFibGVzIERpc3BhdGNoYFxuICAgICAgICApO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYWRhcHRlciwgdG9XcmFwKTtcbiAgICAgIGxldCBwcm90bzogYW55ID0gYWRhcHRlcjtcbiAgICAgIHdoaWxlICghZGVzY3JpcHRvciAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCB0b1dyYXApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgIWRlc2NyaXB0b3Iud3JpdGFibGUpIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1ldGhvZCAke3RvV3JhcH0gdG8gYmluZCBPYnNlcnZhYmxlcyBEaXNwYXRjaGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnVsa1RvU2luZ2xlKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuQ1JFQVRFX0FMTDpcbiAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25LZXlzLkNSRUFURTtcbiAgICAgICAgICBjYXNlIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMOlxuICAgICAgICAgICAgcmV0dXJuIE9wZXJhdGlvbktleXMuVVBEQVRFO1xuICAgICAgICAgIGNhc2UgQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEw6XG4gICAgICAgICAgICByZXR1cm4gT3BlcmF0aW9uS2V5cy5ERUxFVEU7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGFyZSByZWFkIG9ubHkgcHJvcGVydGllc1xuICAgICAgYWRhcHRlclt0b1dyYXBdID0gbmV3IFByb3h5KGFkYXB0ZXJbdG9XcmFwXSwge1xuICAgICAgICBhcHBseTogYXN5bmMgKHRhcmdldDogYW55LCB0aGlzQXJnOiBBLCBhcmdBcnJheTogYW55W10pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzQXJnW1wibG9nQ3R4XCJdKFxuICAgICAgICAgICAgYXJnQXJyYXkuc2xpY2UoMyAtICg0IC0gYXJnQXJyYXkubGVuZ3RoKSwgYXJnQXJyYXkubGVuZ3RoKSxcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgW3RhYmxlTmFtZSwgaWRzLCBwYXlsb2FkXSA9IGFyZ0FycmF5O1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5hcHBseSh0aGlzQXJnLCBbXG4gICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICBpZHMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgLi4uY3R4QXJncyxcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdEFyZ3M6IFtzdHJpbmcsIHN0cmluZywgRXZlbnRJZHNdID0gW1xuICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgYnVsa1RvU2luZ2xlKHRvV3JhcCksXG4gICAgICAgICAgICBpZHMsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGlmIChjdHguZ2V0KFwib2JzZXJ2ZUZ1bGxSZXN1bHRcIikpIHtcbiAgICAgICAgICAgIHJlc3VsdEFyZ3MucHVzaChcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpXG4gICAgICAgICAgICAgICAgPyByZXN1bHQubWFwKChyKSA9PiB0YWJsZU5hbWUocikpXG4gICAgICAgICAgICAgICAgOiB0YWJsZU5hbWUocmVzdWx0KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMoLi4ucmVzdWx0QXJncywgLi4uY3R4QXJncykuY2F0Y2goKGU6IHVua25vd24pID0+XG4gICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZGlzcGF0Y2ggb2JzZXJ2ZXIgcmVmcmVzaCBmb3IgJHt0b1dyYXB9IG9uICR7dGFibGVOYW1lLm5hbWUgfHwgdGFibGVOYW1lfSBmb3IgJHtpZHN9OiAke2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIGRpc3BhdGNoXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3NhcnkgY2xlYW51cCB3aGVuIHRoZSBkaXNwYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2xvc2luZyBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBjbG9zZSguLi5jdHhBcmdzOiBDb250ZXh0dWFsQXJnczxDb250ZXh0T2Y8QT4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gdG8gbm90aGluZyBpbiB0aGlzIGluc3RhbmNlIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNsb3NpbmcgY29ubmVjdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIG9ic2VydmluZyBhbiBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENvbm5lY3RzIHRoaXMgZGlzcGF0Y2ggdG8gYW4gYWRhcHRlciB0byBtb25pdG9yIGl0cyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIG9ic2VydmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIG9ic2VydmUob2JzZXJ2ZXI6IEEpOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIShvYnNlcnZlciBpbnN0YW5jZW9mIEFkYXB0ZXIpKVxuICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJPbmx5IEFkYXB0ZXJzIGNhbiBiZSBvYnNlcnZlZCBieSBkaXNwYXRjaFwiKTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIpIHJldHVybiAoKSA9PiB0aGlzLnVuT2JzZXJ2ZSh0aGlzLmFkYXB0ZXIgYXMgT2JzZXJ2ZXIpO1xuXG4gICAgdGhpcy5hZGFwdGVyID0gb2JzZXJ2ZXI7XG4gICAgdGhpcy5tb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmFkYXB0ZXIuYWxpYXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZSgpLnRoZW4oKCkgPT5cbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoXG4gICAgICAgIGBEaXNwYXRjaCBpbml0aWFsaXplZCBmb3IgJHt0aGlzLmFkYXB0ZXIhLmFsaWFzfSBhZGFwdGVyYFxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdG9wcyBvYnNlcnZpbmcgYW4gYWRhcHRlclxuICAgKiBAc3VtbWFyeSBEaXNjb25uZWN0cyB0aGlzIGRpc3BhdGNoIGZyb20gYW4gYWRhcHRlclxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBhZGFwdGVyIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWRhcHRlciAhPT0gb2JzZXJ2ZXIpXG4gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgXCJPbmx5IHRoZSBhZGFwdGVyIHRoYXQgd2FzIHVzZWQgdG8gb2JzZXJ2ZSBjYW4gYmUgdW5vYnNlcnZlZFwiXG4gICAgICApO1xuICAgIHRoaXMuYWRhcHRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBvYnNlcnZlcnMgYWJvdXQgYSBkYXRhYmFzZSBldmVudFxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4gfCBzdHJpbmcsXG4gICAgZXZlbnQ6IE9wZXJhdGlvbktleXMgfCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMgfCBzdHJpbmcsXG4gICAgaWQ6IEV2ZW50SWRzLFxuICAgIC4uLmFyZ3M6IENvbnRleHR1YWxBcmdzPENvbnRleHRPZjxBPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFtb2RlbClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNb2RlbCBtdXN0IGJlIHByb3ZpZGVkIGZvciBvYnNlcnZlciB1cGRhdGVgKTtcbiAgICBjb25zdCB0YWJsZSA9XG4gICAgICBtb2RlbCAmJiB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IE1vZGVsLnRhYmxlTmFtZShtb2RlbCk7XG5cbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlT2JzZXJ2ZXJzKTtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGFkYXB0ZXIgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoOyBza2lwcGluZyBvYnNlcnZlciB1cGRhdGUgZm9yICR7dGFibGV9OiR7ZXZlbnR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGxvZywgY3R4QXJncywgY3R4IH0gPSB0aGlzLmxvZ0N0eChhcmdzLCB0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYGRpc3BhdGNoaW5nIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7ZXZlbnR9OiR7dGFibGV9OiAke2lkfSR7Y3R4LmdldChcIm9ic2VydmVGdWxsUmVzdWx0XCIpID8gXCIgLSBpbmNsdWRpbmcgcmVzdWx0XCIgOiBcIlwifWBcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIucmVmcmVzaChtb2RlbCwgZXZlbnQsIGlkLCAuLi5jdHhBcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggZGlzcGF0Y2g6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5hZGFwdGVyID8gdGhpcy5hZGFwdGVyLnRvU3RyaW5nKCkgOiBcInVuaW5pdGlhbGl6ZWRcIn0gZXZlbnQgZGlzcGF0Y2hgO1xuICB9XG59XG5cbmlmIChBZGFwdGVyKSBBZGFwdGVyW1wiX2Jhc2VEaXNwYXRjaFwiXSA9IERpc3BhdGNoO1xuIl19
@@ -32,6 +32,13 @@ import { ContextualArgs, ContextualizedArgs, ContextualLoggedClass, MaybeContext
32
32
  * ```
33
33
  */
34
34
  export declare class Dispatch<A extends Adapter<any, any, any, any>> extends ContextualLoggedClass<ContextOf<A>> implements AdapterDispatch<A> {
35
+ /**
36
+ * Indicates whether the dispatcher has already been initialized.
37
+ *
38
+ * @description Tracks the initialization state to prevent duplicate setup
39
+ * @summary Whether the dispatcher is initialized and ready to observe adapter operations
40
+ */
41
+ protected initialized: boolean;
35
42
  /**
36
43
  * @description The adapter being observed
37
44
  * @summary Reference to the database adapter whose operations are being monitored
@@ -142,4 +142,4 @@ class ObserverHandler {
142
142
  }
143
143
  }
144
144
  exports.ObserverHandler = ObserverHandler;
145
- //# sourceMappingURL=ObserverHandler.js.map
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT2JzZXJ2ZXJIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BlcnNpc3RlbmNlL09ic2VydmVySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwyREFJaUM7QUFHakMsZ0ZBR3dDO0FBR3hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBYSxlQUFlO0lBQTVCO1FBR0U7OztXQUdHO1FBQ2dCLGNBQVMsR0FHdEIsRUFBRSxDQUFDO0lBcUhYLENBQUM7SUFuSEM7Ozs7T0FJRztJQUNILEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsUUFBa0IsRUFBRSxNQUF1QjtRQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxNQUFNLElBQUksNkJBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1RCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLFFBQWtCO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE1BQU0sSUFBSSw2QkFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMENHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsS0FBOEIsRUFDOUIsS0FBcUQsRUFDckQsRUFBWSxFQUNaLEdBQUcsSUFBeUI7UUFFNUIsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyw2Q0FBcUIsQ0FBQyxNQUFNLENBQ25ELElBQUksQ0FBQyxlQUFlLEVBQ3BCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsR0FBRyxJQUFJLENBQ1IsQ0FBQztRQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FDdEMsSUFBSSxDQUFDLFNBQVM7YUFDWCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNaLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFDOUMsQ0FBQztZQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7Z0JBQ3BCLEdBQUcsQ0FBQyxLQUFLLENBQ1AsNkJBQTZCLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQzNELENBQUM7Z0JBQ0YsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDVCxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxVQUFVO2dCQUM5QixHQUFHLENBQUMsS0FBSyxDQUNQLCtCQUErQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FDaEYsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0hELDBDQStIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBPYnNlcnZlckZpbHRlciwgUGVyc2lzdGVuY2VPYnNlcnZhYmxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBDb250ZXh0dWFsQXJncyxcbiAgQ29udGV4dHVhbExvZ2dlZENsYXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvQ29udGV4dHVhbExvZ2dlZENsYXNzXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBvYnNlcnZlcnMgZm9yIGRhdGFiYXNlIGV2ZW50c1xuICogQHN1bW1hcnkgVGhlIE9ic2VydmVySGFuZGxlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPYnNlcnZhYmxlIGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBjZW50cmFsaXplZFxuICogd2F5IHRvIG1hbmFnZSBtdWx0aXBsZSBvYnNlcnZlcnMuIEl0IGFsbG93cyByZWdpc3RlcmluZyBvYnNlcnZlcnMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzIHRvIGNvbnRyb2xcbiAqIHdoaWNoIGV2ZW50cyB0aGV5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IsIGFuZCBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIG5vdGlmeWluZyBhbGwgcmVsZXZhbnRcbiAqIG9ic2VydmVycyB3aGVuIGRhdGFiYXNlIGV2ZW50cyBvY2N1ci5cbiAqIEBjbGFzcyBPYnNlcnZlckhhbmRsZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaGFuZGxlclxuICogY29uc3QgaGFuZGxlciA9IG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhbiBvYnNlcnZlclxuICogY29uc3QgbXlPYnNlcnZlciA9IHtcbiAqICAgcmVmcmVzaDogYXN5bmMgKHRhYmxlLCBldmVudCwgaWQpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgQ2hhbmdlIGluICR7dGFibGV9OiAke2V2ZW50fSBmb3IgSUQgJHtpZH1gKTtcbiAqICAgfVxuICogfTtcbiAqXG4gKiAvLyBBZGQgb2JzZXJ2ZXIgd2l0aCBhIGZpbHRlciBmb3Igb25seSB1c2VyIHRhYmxlIGV2ZW50c1xuICogaGFuZGxlci5vYnNlcnZlKG15T2JzZXJ2ZXIsICh0YWJsZSwgZXZlbnQsIGlkKSA9PiB0YWJsZSA9PT0gJ3VzZXJzJyk7XG4gKlxuICogLy8gTm90aWZ5IG9ic2VydmVycyBhYm91dCBhbiBldmVudFxuICogYXdhaXQgaGFuZGxlci51cGRhdGVPYnNlcnZlcnMobG9nZ2VyLCAndXNlcnMnLCAnQ1JFQVRFJywgMTIzKTtcbiAqXG4gKiAvLyBSZW1vdmUgYW4gb2JzZXJ2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkXG4gKiBoYW5kbGVyLnVuT2JzZXJ2ZShteU9ic2VydmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXJIYW5kbGVyPEMgZXh0ZW5kcyBDb250ZXh0PGFueT4gPSBDb250ZXh0PlxuICBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlT2JzZXJ2YWJsZTxDPlxue1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICogQHN1bW1hcnkgQXJyYXkgb2Ygb2JzZXJ2ZXIgb2JqZWN0cyBhbG9uZyB3aXRoIHRoZWlyIG9wdGlvbmFsIGZpbHRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlcnM6IHtcbiAgICBvYnNlcnZlcjogT2JzZXJ2ZXI7XG4gICAgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXI7XG4gIH1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvdW50IG9mIG9ic2VydmVycyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgaGFuZGxlclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvYnNlcnZlcnNcbiAgICovXG4gIGNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIG5ldyBvYnNlcnZlclxuICAgKiBAc3VtbWFyeSBBZGRzIGFuIG9ic2VydmVyIHRvIHRoZSBjb2xsZWN0aW9uIHdpdGggYW4gb3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJGaWx0ZXJ9IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZmlsdGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGljaCBldmVudHMgdGhlIG9ic2VydmVyIHJlY2VpdmVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlciwgZmlsdGVyPzogT2JzZXJ2ZXJGaWx0ZXIpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaCh7IG9ic2VydmVyOiBvYnNlcnZlciwgZmlsdGVyOiBmaWx0ZXIgfSk7XG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5PYnNlcnZlKG9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5yZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBvYnNlcnZlciBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyIC0gVGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5vYnNlcnZlcikuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBPYnNlcnZlclwiKTtcbiAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgcmVsZXZhbnQgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgRmlsdGVycyBvYnNlcnZlcnMgYmFzZWQgb24gdGhlaXIgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgY2FsbHMgcmVmcmVzaCBvbiBlYWNoIG1hdGNoaW5nIG9ic2VydmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfEJ1bGtDcnVkT3BlcmF0aW9uS2V5c3xzdHJpbmd9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHtFdmVudElkc30gaWQgLSBUaGUgaWRlbnRpZmllcihzKSBvZiB0aGUgYWZmZWN0ZWQgcmVjb3JkKHMpXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvYnNlcnZlcnNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgb2JzZXJ2ZXJzIGhhdmUgYmVlbiBub3RpZmllZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlckhhbmRsZXJcbiAgICogICBwYXJ0aWNpcGFudCBPYnNlcnZlclxuICAgKlxuICAgKiAgIENsaWVudC0+Pk9ic2VydmVySGFuZGxlcjogdXBkYXRlT2JzZXJ2ZXJzKGxvZywgdGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICpcbiAgICogICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlckhhbmRsZXI6IEZpbHRlciBvYnNlcnZlcnNcbiAgICpcbiAgICogICBsb29wIEZvciBlYWNoIG9ic2VydmVyIHdpdGggbWF0Y2hpbmcgZmlsdGVyXG4gICAqICAgICBhbHQgT2JzZXJ2ZXIgaGFzIGZpbHRlclxuICAgKiAgICAgICBPYnNlcnZlckhhbmRsZXItPj5PYnNlcnZlcjogQXBwbHkgZmlsdGVyKHRhYmxlLCBldmVudCwgaWQpXG4gICAqICAgICAgIGFsdCBGaWx0ZXIgdGhyb3dzIGVycm9yXG4gICAqICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgdHJ1ZVxuICAgKiAgICAgICAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVyOiByZWZyZXNoKHRhYmxlLCBldmVudCwgaWQsIC4uLmFyZ3MpXG4gICAqICAgICAgIGVsc2UgRmlsdGVyIHJldHVybnMgZmFsc2VcbiAgICogICAgICAgICBPYnNlcnZlckhhbmRsZXItLT4+T2JzZXJ2ZXJIYW5kbGVyOiBTa2lwIG9ic2VydmVyXG4gICAqICAgICAgIGVuZFxuICAgKiAgICAgZWxzZSBObyBmaWx0ZXJcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+T2JzZXJ2ZXI6IHJlZnJlc2godGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncylcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0+Pk9ic2VydmVySGFuZGxlcjogUHJvY2VzcyByZXN1bHRzXG4gICAqICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgIGFsdCBSZXN1bHQgaXMgcmVqZWN0ZWRcbiAgICogICAgICAgT2JzZXJ2ZXJIYW5kbGVyLT4+TG9nZ2VyOiBMb2cgZXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIE9ic2VydmVySGFuZGxlci0tPj5DbGllbnQ6IFJldHVyblxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+IHwgc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBDb250ZXh0dWFsQXJnczxhbnk+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgbG9nLCBjdHhBcmdzIH0gPSBDb250ZXh0dWFsTG9nZ2VkQ2xhc3MubG9nQ3R4PENvbnRleHQ+KFxuICAgICAgdGhpcy51cGRhdGVPYnNlcnZlcnMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBmYWxzZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLm9ic2VydmVyc1xuICAgICAgICAuZmlsdGVyKChvKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBmaWx0ZXIgfSA9IG87XG4gICAgICAgICAgaWYgKCFmaWx0ZXIpIHJldHVybiB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyKG1vZGVsLCBldmVudCwgaWQsIC4uLmN0eEFyZ3MpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmaWx0ZXIgb2JzZXJ2ZXIgJHtvLm9ic2VydmVyLnRvU3RyaW5nKCl9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKG8pID0+IHtcbiAgICAgICAgICBvLm9ic2VydmVyLnJlZnJlc2gobW9kZWwsIGV2ZW50LCBpZCwgLi4uY3R4QXJncyk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIG9ic2VydmFibGUgJHt0aGlzLm9ic2VydmVyc1tpXS50b1N0cmluZygpfTogJHtyZXN1bHQucmVhc29ufWBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIl19