footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -22,9 +22,9 @@
22
22
  * Break semantics: If a stage calls breakFn(), commit and STOP.
23
23
  * Patch model: Stage writes into local patch; commitPatch() after return or throw.
24
24
  */
25
+ import { buildRuntimeStageId, joinPath } from 'foottrace';
25
26
  import { extractErrorInfo, thrownText } from '../../errors/errorInfo.js';
26
27
  import { refuseReservedId } from '../../ids/reservedIds.js';
27
- import { buildRuntimeStageId, joinPath } from '../../ids/runtimeStageId.js';
28
28
  import { isPauseSignal } from '../../pause/types.js';
29
29
  import { snapshotRunInput } from '../../scope/protection/readonlyInput.js';
30
30
  import { prefixNodeTree } from '../graph/prefixNodeTree.js';
@@ -36,7 +36,7 @@ import { ContinuationResolver } from '../handlers/ContinuationResolver.js';
36
36
  import { DeciderHandler } from '../handlers/DeciderHandler.js';
37
37
  import { NodeResolver } from '../handlers/NodeResolver.js';
38
38
  import { ParallelForEachHandler } from '../handlers/ParallelForEachHandler.js';
39
- import { queueBehind, raiseQueuedPause, ResumeEntry } from '../handlers/ResumeEntry.js';
39
+ import { queueBehind, raiseQueuedPause } from '../handlers/ResumeEntry.js';
40
40
  import { RuntimeStructureManager } from '../handlers/RuntimeStructureManager.js';
41
41
  import { SelectorHandler } from '../handlers/SelectorHandler.js';
42
42
  import { servedPause } from '../handlers/servedPause.js';
@@ -243,9 +243,7 @@ export class FlowchartTraverser {
243
243
  this.root = opts.root;
244
244
  this.entry = opts.entry;
245
245
  this.entryPendingPauses = opts.entry ? opts.pendingPauses : undefined;
246
- this.resume =
247
- opts.resume ??
248
- (opts.subflowStatesForResume ? ResumeEntry.fromCaptures(opts.subflowStatesForResume) : undefined);
246
+ this.resume = opts.resume;
249
247
  // Shallow-copy stageMap and subflows so that lazy-resolution mutations
250
248
  // (prefixed entries added during execution) stay scoped to THIS traverser
251
249
  // and do not escape to the shared FlowChart object. Without the copy,
@@ -1398,4 +1396,4 @@ export class FlowchartTraverser {
1398
1396
  }
1399
1397
  }
1400
1398
  }
1401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4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QUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQzVCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGbG93Y2hhcnRUcmF2ZXJzZXIg4oCUIFByZS1vcmRlciBERlMgdHJhdmVyc2FsIG9mIFN0YWdlTm9kZSBncmFwaC5cbiAqXG4gKiBVbmlmaWVkIHRyYXZlcnNhbCBhbGdvcml0aG0gZm9yIGFsbCBub2RlIHNoYXBlcy4gYGV4ZWN1dGVOb2RlYCBpcyBhXG4gKiBUUkFNUE9MSU5FIGRyaXZlcjogaXQgcnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW5cbiAqIGEgZmxhdCBsb29wLCBmb2xsb3dpbmcgdGFpbCBjb250aW51YXRpb25zIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2VzLFxuICogZHluYW1pYyBuZXh0LCBmbGF0IGRlY2lkZXIgZGlzcGF0Y2gpIGl0ZXJhdGl2ZWx5IOKAlCBzbyBjaGFpbiBsZW5ndGggYW5kXG4gKiBsb29wIGl0ZXJhdGlvbnMgbmV2ZXIgZ3JvdyB0aGUgY2FsbCBzdGFjay4gT25seSB0cnVlIHRyZWUgbmVzdGluZyAoZm9ya1xuICogY2hpbGRyZW4sIHdpdGgtY29udGludWF0aW9uIGRlY2lkZXIvc2VsZWN0b3IgYnJhbmNoZXMsIHN1YmZsb3cgbW91bnRzKVxuICogcmVjdXJzZXMuXG4gKlxuICogRm9yIGVhY2ggbm9kZSwgZXhlY3V0ZU5vZGVTdGVwIGZvbGxvd3MgNyBwaGFzZXM6XG4gKiAgIDAuIENMQVNTSUZZICDigJQgc3ViZmxvdyBkZXRlY3Rpb24sIGVhcmx5IGRlbGVnYXRpb25cbiAqICAgMGIuIFBBUkFMTEVMLUZPUi1FQUNIIOKAlCBkeW5hbWljIGZhbi1vdXQgKGJyYW5jaGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBwYXlsb2FkKVxuICogICAxLiBWQUxJREFURSAg4oCUIG5vZGUgaW52YXJpYW50cywgcm9sZSBtYXJrZXJzXG4gKiAgIDIuIEVYRUNVVEUgICDigJQgcnVuIHN0YWdlIGZuLCBjb21taXQsIGJyZWFrIGNoZWNrXG4gKiAgIDMuIERZTkFNSUMgICDigJQgU3RhZ2VOb2RlIHJldHVybiBkZXRlY3Rpb24sIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24sIHN0cnVjdHVyZSB1cGRhdGVzXG4gKiAgIDQuIENISUxEUkVOICDigJQgZm9yay9zZWxlY3Rvci9kZWNpZGVyIGRpc3BhdGNoXG4gKiAgIDUuIENPTlRJTlVFICDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQgcmVzb2x1dGlvblxuICogICA2LiBMRUFGICAgICAg4oCUIG5vIGNvbnRpbnVhdGlvbiwgcmV0dXJuIG91dHB1dFxuICpcbiAqIEJyZWFrIHNlbWFudGljczogSWYgYSBzdGFnZSBjYWxscyBicmVha0ZuKCksIGNvbW1pdCBhbmQgU1RPUC5cbiAqIFBhdGNoIG1vZGVsOiBTdGFnZSB3cml0ZXMgaW50byBsb2NhbCBwYXRjaDsgY29tbWl0UGF0Y2goKSBhZnRlciByZXR1cm4gb3IgdGhyb3cuXG4gKi9cblxuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9yZXNlcnZlZElkcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkLCBqb2luUGF0aCB9IGZyb20gJy4uLy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IHNuYXBzaG90UnVuSW5wdXQgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSB9IGZyb20gJy4uL2hhbmRsZXJzL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUGFyYWxsZWxGb3JFYWNoSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHF1ZXVlQmVoaW5kLCByYWlzZVF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvc2VydmVkUGF1c2UuanMnO1xuaW1wb3J0IHsgbG9nZ2FibGVTdGFnZUVycm9yLCByZWNvcmRTdGFnZUVycm9yLCBzZXJ2ZWRTdGFnZUVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvVHJhdmVyc2FsRGVwdGhFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogQGludGVybmFsIEFjdHVhbCBydW50aW1lIG1vdW50IGFuY2VzdHJ5IGZvciB0aGUgb3duaW5nIGxvZywgbm90IHN0YXRpYyBzdWJmbG93UGF0aC4gKi9cbiAgZW1pdERyaWxsUGF0aD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS4yOC4wIOKAlCBwYXNzIHtAbGluayByZXN1bWV9LiBTdGlsbCBob25vdXJlZCwgdW5kZXIgdGhlXG4gICAqIHNhbWUgb25lLXNob3QgbGF3OiBlYWNoIGNhcHR1cmUgc2VlZHMgb25seSB0aGUgRklSU1QgZW50cnkgaW50byBpdHNcbiAgICogc3ViZmxvdyAoaW4gcGxhY2Ugb2YgdGhlIGlucHV0TWFwcGVyJ3MgdmFsdWVzKTsgbGF0ZXIgZW50cmllcyBhcmVcbiAgICogb3JkaW5hcnkuIElnbm9yZWQgd2hlbiBgcmVzdW1lYCBpcyBzZXQuXG4gICAqL1xuICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGZvbGxvd3MgYSBMT09QIGVkZ2UgKGEgYmFjay1yZWZlcmVuY2UgcmVzb2x2ZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCkuIEEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBoYW5kcyBzdWNoIGEgaG9wIGJhY2tcbiAgICogdG8gaXRzIGRlY2lkZXIgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhIG5vZGUgdGhlIGZyYW1lIHJhbiwgc28gdGhlIGxvb3BcbiAgICogcmUtZW50ZXJzIGF0IHRoZSB0YXJnZXQncyBvd24gbGV2ZWwg4oCUIGZsYXQsIG5ldmVyIG9uZSBmcmFtZSBwZXIgcGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiB0cnVlO1xufVxuXG4vKipcbiAqIFdoYXQgYSBkcml2ZXIgcmVjb3JkcyBmb3IgZWFjaCBzdGFnZSBjb250ZXh0IGl0IHJ1bnM6IGl0cyBORVNUSU5HIGRlcHRoXG4gKiAoc2VlIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgbmVzdGluZ0RlcHRoT2ZgKSBhbmQgdGhlIG5vZGUgaWRzIGVhY2ggZHJpdmVyXG4gKiBvbiBpdHMgQlJBTkNILUZSQU1FIGNoYWluIGhhcyBydW4g4oCUIGl0cyBvd24gbGFzdC4gQSBkZWNpZGVyIHdpdGggaXRzIG93blxuICogYG5leHRgIGhhbmRzIHRoYXQgY2hhaW4gdG8gaXRzIGJyYW5jaCBmcmFtZSwgc28gdGhlIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcFxuICogYmFjayBpbnRvIGFuIGVuY2xvc2luZyBkcml2ZXIgKGxlYXZlKSBmcm9tIGFueSBvdGhlciBqdW1wIChzdGF5KS5cbiAqL1xuaW50ZXJmYWNlIERyaXZlckZyYW1lIHtcbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmFuOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIC8qKiBUaGUgYG5leHRgLWNoYWluIGlkcyBvZiBldmVyeSBkZWNpZGVyIHdob3NlIGJyYW5jaCBmcmFtZSBlbmNsb3NlcyB0aGlzIGRyaXZlci4gKi9cbiAgcmVhZG9ubHkgdGFpbHM6IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbn1cblxuLyoqIFdoYXQgYSBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSBlbmNsb3NpbmcgcmFuLXNldHMsIGFuZCB0aGUgdGFpbHMgaXQgbWF5IGp1bXAgdG8uICovXG50eXBlIEVuY2xvc2luZ0ZyYW1lcyA9IFBpY2s8RHJpdmVyRnJhbWUsICdyYW4nIHwgJ3RhaWxzJz47XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgUmV0cnlQb2xpY3l9J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWRcbiAqICgxLWJhc2VkKS4gQW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUsIHBvc2l0aXZlIG51bWJlciDigJQgYSBtaXNzaW5nIGRpYWwsIGFcbiAqIG5lZ2F0aXZlIHZhbHVlLCBhIGBOYU5gIGZyb20gYSBjb25zdW1lcidzIGFyaXRobWV0aWMsIG9yIGEgdGhyb3dpbmcgZnVuY3Rpb25cbiAqIOKAlCBiZWNvbWVzIGAwYCwgaS5lLiByZXRyeSBpbW1lZGlhdGVseS4gQSBiYWNrb2ZmIGRpYWwgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gKiBjcmFzaCBhIHJ1biBvciBwYXJrIGl0IGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCYWNrb2ZmTXMoYmFja29mZk1zOiBudW1iZXIgfCAoKGF0dGVtcHQ6IG51bWJlcikgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCwgYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJhY2tvZmZNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBpZiAodHlwZW9mIGJhY2tvZmZNcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGJhY2tvZmZNcyhhdHRlbXB0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCByZXRocm93cyB0aGUgb3JpZ2luYWwgc3RhZ2UgZXJyb3IsIHNvIGEgY2FuY2VsbGVkIHJ1blxuICogbmV2ZXIgc2l0cyBvdXQgYSBsb25nIGJhY2tvZmYgYW5kIG5ldmVyIGxvc2VzIHRoZSBmYWlsdXJlIHRoYXQgY2F1c2VkIGl0LlxuICogVGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXIgYXJlIGFsd2F5cyBjbGVhbmVkIHVwLlxuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGRvbmUsIG1zKTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFdoZXJlIHRoZSBuZXh0IGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5lbnRyeSkuICovXG4gIHByaXZhdGUgZW50cnk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZ3MnIHBhdXNlcyByYWlzZWQgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcyDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLnBlbmRpbmdQYXVzZXMpLiAqL1xuICBwcml2YXRlIGVudHJ5UGVuZGluZ1BhdXNlczogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSwgc2hhcmVkIHdpdGggbmVzdGVkIHRyYXZlcnNlcnMuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbCBydW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBtb3VudCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqICB0cmF2ZXJzZXIuIEZhbGxiYWNrIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZm9yIHN0YWdlcyB3aG9zZSBjb250ZXh0IGhhc1xuICAgKiAgbm8gcGFyZW50ICh0aGUgc3ViZmxvdyByb290KS4gVW5kZWZpbmVkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0RHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFZhbGlkYXRlZCB2YWx1ZSBwYXNzZWQgdmlhIGBydW4oe2lucHV0fSlgLiBSb290IGJvdW5kYXJ5IG9ic2VydmVyc1xuICAgKiAgcmVjZWl2ZSBpdHMgcmV0YWluZWQgZm9ybTsgc3RhZ2UgYXJndW1lbnRzIGtlZXAgdGhlIG9yaWdpbmFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFRoZSBoYW5kbGVycycgc2hhcmVkIGRlcHMg4oCUIGl0cyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgbGVnJ3MgaW5wdXQgc25hcHNob3QsIHNldCBieSBgZXhlY3V0ZWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsRm9yRWFjaEhhbmRsZXI6IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSAoTkVTVElORyBkZXB0aCArIGJyYW5jaC1mcmFtZSByYW4tc2V0cykgb2YgdGhlIGRyaXZlciB0aGF0IHJhbiBlYWNoIHN0YWdlIGNvbnRleHQg4oCUIGRlcHRoIGlzIGFcbiAgICogcHJvcGVydHkgb2YgdGhlIGNhbGwgUEFUSCwgc28gaXQgdHJhdmVscyB3aXRoIHRoZSBjb250ZXh0cywgbm90IGluIG9uZVxuICAgKiBwZXItdHJhdmVyc2VyIGNvdW50ZXIuIEEgbmVzdGVkIGRyaXZlciAoZm9yay9zZWxlY3RvciBjaGlsZCwgYSBkZWNpZGVyJ3NcbiAgICogYnJhbmNoIGZyYW1lKSBzaXRzIG9uZSBsZXZlbCBiZWxvdyB0aGUgZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0c1xuICAgKiBvd24gY29udGV4dCB3YXMgY3JlYXRlZCBmcm9tIChgU3RhZ2VDb250ZXh0LnBhcmVudGApIOKAlCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBzaGFyZSBvbmUgZGVwdGgsIGFuZCA1MjAgY2hpbGRyZW4gb2Ygb25lIGZvcmsgYXJlIDUyMCBkcml2ZXJzXG4gICAqIGF0IHRoZSBzYW1lIGxldmVsICh0aHJvdWdoIDkuMzkuMCBhIHNoYXJlZCBjb3VudGVyIG1hZGUgdGhlbSA1MjAgbGV2ZWxzKS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgYWRkIGEgbGV2ZWwuXG4gICAqIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmQgdW5ib3VuZGVkXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXkgcmVjdXJzaXZlXG4gICAqIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVPZiA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgRHJpdmVyRnJhbWU+KCk7XG5cbiAgLyoqIGBuZXh0YC1jaGFpbiBpZHMgcGVyIGRlY2lkZXIgY29udGludWF0aW9uIGhlYWQgKGB0YWlsSWRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhaWxJZHMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzIHNoYXJlIHRoZWlyIHBhcmVudCdzIGRlcHRoICsgMSDigJQgYSBmb3JrIG9yIHNlbGVjdG9yIG9mIGFueSB3aWR0aCBpc1xuICAgKiBvbmUgbGV2ZWwsIG5ldmVyIG9uZSBsZXZlbCBwZXIgY2hpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSAodGhlIGJyZWFrIGZsYWdcbiAgICogYW5kIHRoZSByZXNvbHZlcidzIGxvb3AgY291bnRzIGFyZSBwZXIgaW5zdGFuY2UpLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXJcbiAgICogY29uY3VycmVudCBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID1cbiAgICAgIG9wdHMucmVzdW1lID8/XG4gICAgICAob3B0cy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lID8gUmVzdW1lRW50cnkuZnJvbUNhcHR1cmVzPFRPdXQsIFRTY29wZT4ob3B0cy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lKSA6IHVuZGVmaW5lZCk7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICAvLyBNaXNzaW5nIGFuY2VzdHJ5IGluIGEgaGFuZC1idWlsdCBuZXN0ZWQgdHJhdmVyc2VyIGlzIHVua25vd24sIG5ldmVyXG4gICAgLy8gZ3Vlc3NlZCBhcyByb290LiBUaGUgbm9ybWFsIHN1YmZsb3cgZmFjdG9yeSBzdXBwbGllcyB0aGUgZnVsbCBwYXRoLlxuICAgIGNvbnN0IGVtaXREcmlsbFBhdGggPVxuICAgICAgb3B0cy5lbWl0RHJpbGxQYXRoID8/IChvcHRzLnBhcmVudFN1YmZsb3dJZCB8fCBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPyB1bmRlZmluZWQgOiBbXSk7XG4gICAgdGhpcy5lbWl0RHJpbGxQYXRoID0gZW1pdERyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogT2JqZWN0LmZyZWV6ZShbLi4uZW1pdERyaWxsUGF0aF0pO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpLlxuICAgIC8vIEZyb20gYHJvb3RgLCBuZXZlciBmcm9tIGBlbnRyeWA6IGEgcmVzdW1lJ3Mgc3RhbmQtaW4gY2FycmllcyB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UncyBpZCwgYW5kIGEgbG9vcCBiYWNrIHRvIHRoYXQgaWQgbXVzdCBmaW5kIHRoZSBSRUFMIHN0YWdlLlxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gICAgdGhpcy5wYXJhbGxlbEZvckVhY2hIYW5kbGVyID0gbmV3IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLCB7XG4gICAgICBwcmVmaXhOb2RlVHJlZTogKG4sIHByZWZpeCkgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShuLCBwcmVmaXgpLFxuICAgICAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93OiAoc3ViZmxvd0lkLCByb290LCBjaGFydCkgPT4gdGhpcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCByb290LCBjaGFydCksXG4gICAgICBicmFuY2hTaGFyZWRTdGF0ZTogKHN1YmZsb3dJZCkgPT5cbiAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cy5nZXQoc3ViZmxvd0lkKT8udHJlZUNvbnRleHQ/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmU6IChub2RlSWQsIGJyYW5jaGVzKSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKG5vZGVJZCwgYnJhbmNoZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5lbnRyeSAmJiB7IGVudHJ5OiBzdWJmbG93T3B0cy5lbnRyeSB9KSwgLy8gYSByZXN1bWUgaG9wJ3MgZW50cnkgcG9pbnRcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBwYXJlbnQgZmFsbGJhY2sgZm9yXG4gICAgICAgIC8vIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZSBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIGJvdW5kYXJ5LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBlbWl0RHJpbGxQYXRoOlxuICAgICAgICAgIHRoaXMuZW1pdERyaWxsUGF0aCAhPT0gdW5kZWZpbmVkICYmIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRcbiAgICAgICAgICAgID8gWy4uLnRoaXMuZW1pdERyaWxsUGF0aCwgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cywgLy8gU2hhcmUgdmlzaXQgY291bnRzIOKAlCBsb29wSXRlcmF0aW9uIHN0YXlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHNcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IEJZIFJFRkVSRU5DRSwgc28gYSBob3AgdGFrZW5cbiAgICAgICAgLy8gYXQgYW55IGRlcHRoIGlzIHRha2VuIGZvciB0aGUgd2hvbGUgcnVuIOKAlCBhbmQgbmVzdGVkXG4gICAgICAgIC8vIFN1YmZsb3dFeGVjdXRvcnMgY2FuIHRha2UgdGhlIGRlZXBlciBob3BzIChlLmcuIFNlcXVlbmNlKEFnZW50KC4uLikpXG4gICAgICAgIC8vIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICAvLyBUaGUgbGVnJ3MgT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBpcyB0YWtlbiB3aGVuIHRoZSBsZWcgU1RBUlRTXG4gICAgICAvLyAoYGV4ZWN1dGVgKSwgbmV2ZXIgaGVyZTogYSBnZXR0ZXIgb24gdGhlIGlucHV0IG11c3Qgbm90IHJ1biBhdCBjb25zdHJ1Y3Rpb24uXG4gICAgICByZWFkT25seUNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIC8vIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgcGVyIGxlZyAocnVuLCByZXN1bWUsIHN1YmZsb3cgbW91bnQpLCB0YWtlbiBhcyB0aGVcbiAgICAvLyBsZWcgc3RhcnRzIOKAlCBuZXZlciBhdCBjb25zdHJ1Y3Rpb24gKGFuIGV4ZWN1dG9yIGNvbnN0cnVjdHMgYSB0cmF2ZXJzZXIgaXQgbWF5IG5ldmVyXG4gICAgLy8gcnVuKTogZXZlcnkgc2NvcGUgb2YgdGhlIGxlZyBnZXRzIGl0LCBzbyBlYWNoIHBheXMgTyhyb290IGtleXMpLCBub3QgTyhpbnB1dCkuXG4gICAgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCA9IHNuYXBzaG90UnVuSW5wdXQodGhpcy5yZWFkT25seUNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBSZXRhaW4gYXQgdGhlIGJvdW5kYXJ5LCBiZWZvcmUgZGlzcGF0Y2ggb3IgZGVmZXJyZWQgY2FwdHVyZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIG93bmVyIGFzIHN1YmZsb3cgZW50cnksIG5vdCBhIHJlY29yZGVyLWxvY2FsIHNjcnViIG9yIGxhdGVyIHdhbGsuXG4gICAgICAvLyBVbmRlciBhIHBvbGljeSB0aGUgd2FsayByZWFkcyB0aGUgbGVnJ3MgT05FIHNuYXBzaG90ICh0YWtlbiBhYm92ZSksIG5ldmVyIHRoZSBsaXZlIGlucHV0XG4gICAgICAvLyBhIHNlY29uZCB0aW1lOyB3aXRob3V0IG9uZSB0aGUgZXZlbnQgY2FycmllcyB0aGUgaW5wdXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICAgcmVkYWN0aW9uUnVsZSAmJiAhcmVkYWN0aW9uUnVsZS5pc0luZXJ0KClcbiAgICAgICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkodGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dClcbiAgICAgICAgICA6IHRoaXMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydChpbnB1dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgbGV0IHJldGFpbmVkUmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICAgIC8vIFJlYWQgdGhlIHNoYXJlZCBydWxlIG5vdyBzbyBtYXJrcyBtYWRlIGR1cmluZyBleGVjdXRpb24gYXBwbHkgdG9cbiAgICAgIC8vIHRoaXMgZXZlbnQuIEEgc2NydWIgZmFpbHVyZSBjbG9zZXMgdGhlIHJ1biBhcyBmYWlsZWQsIG5ldmVyIHJhdy5cbiAgICAgIHJldGFpbmVkUmVzdWx0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChcbiAgICAgICAgICByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSxcbiAgICAgICAgICByb290Q29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkVuZChyZXRhaW5lZFJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZS5wYXVzZURhdGEpLFxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgsXG4gICAgKTtcbiAgICB0aHJvdyByYWlzZVF1ZXVlZFBhdXNlKHdhaXRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFrIHN0YXRlIGNhcHR1cmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIG1vc3QgcmVjZW50IGBleGVjdXRlKClgLlxuICAgKiBgc2hvdWxkQnJlYWtgIGlzIHRydWUgd2hlbiBhIHN0YWdlIGNhbGxlZCBgc2NvcGUuJGJyZWFrKHJlYXNvbilgOyB0aGVcbiAgICogb3B0aW9uYWwgYHJlYXNvbmAgY2FycmllcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBwcm9wYWdhdGUgYW4gaW5uZXIgc3ViZmxvdydzIGJyZWFrIHVwIHRvXG4gICAqIHRoZSBwYXJlbnQgdHJhdmVyc2VyIHdoZW4gdGhlIG1vdW50IHNldHMgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcEJyZWFrRmxhZyB9O1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTdGFtcCB0aGUgcnVuJ3MgaWQgb250byB0aGUgcnVudGltZSBzbmFwc2hvdCBoZXJlIOKAlCB0aGUgdHJhdmVyc2VyIGlzXG4gICAgLy8gdGhlIHNpbmdsZSBhdXRob3JpdHkgZm9yIGBydW5JZGAgKGl0IGFscmVhZHkgc3RhbXBzIHRoZSBzYW1lIHZhbHVlIG9uXG4gICAgLy8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC9ldmVudCksIHdoaWxlIHRoZSBydW50aW1lIGlzIHJ1bi1hZ25vc3RpY1xuICAgIC8vIG1lbW9yeSAoaXRzIGdldFNuYXBzaG90IHJldHVybnMgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+KS5cbiAgICAvLyBGcmVzaCBwZXIgcnVuKCkgQU5EIHBlciByZXN1bWUoKSDigJQgc2VlIHJ1bm5lci9ydW5JZC50cy5cbiAgICByZXR1cm4geyAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyksIHJ1bklkOiB0aGlzLnJ1bklkIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSB0aGUgZGVjbGFyYXRpdmUgcmV0cnkgbG9vcCBsaXZlcyBIRVJFIGFuZCBub3doZXJlXG4gICAqIGVsc2U6IG9uZSBpbXBsZW1lbnRhdGlvbiBnaXZlcyBgcmV0cnlgIHRvIGV2ZXJ5IHN0YWdlIGtpbmQgdGhhdCBoYXMgYVxuICAgKiBmdW5jdGlvbiB0byByZXRyeS4gKFB1dHRpbmcgaXQgaW4gYFN0YWdlUnVubmVyYCB3b3VsZCBoYXZlIGJlZW4gd3Jvbmcg4oCUXG4gICAqIHRoZSBydW5uZXIgb3ducyB0aGUgc2NvcGUgYW5kIHRoZSBpbnRlcnJ1cHQgYm91bmRhcnksIGJ1dCBub3QgdGhlXG4gICAqIGBTdGFnZUNvbnRleHRgIHdob3NlIHN0YWdlZCB3cml0ZXMgYSBmYWlsZWQgYXR0ZW1wdCBtdXN0IGRpc2NhcmQuKVxuICAgKlxuICAgKiBXaXRoIG5vIGByZXRyeWAgcG9saWN5IHRoaXMgaXMgYSBzaW5nbGUgY2FsbCwgYnl0ZS1pZGVudGljYWwgdG8gdGhlXG4gICAqIHByZS05LjE1IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS4gSXQgZG9lcyBOT1RcbiAgICAvLyBjaGFuZ2UgYWNyb3NzIGF0dGVtcHRzOiBhdHRlbXB0cyBhcmUgaW50ZXJuYWwgdG8gT05FIHN0YWdlIGV4ZWN1dGlvbiDigJRcbiAgICAvLyBvbmUgcnVudGltZVN0YWdlSWQsIG9uZSBleGVjdXRpb24gaW5kZXgsIG9uZSBmaW5hbCBDb21taXRCdW5kbGUuXG4gICAgY29uc3QgcG9saWN5ID0gbm9kZS5yZXRyeTtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IHBvbGljeSA/IE1hdGguZmxvb3IocG9saWN5LmF0dGVtcHRzKSA6IDE7XG4gICAgaWYgKCFwb2xpY3kgfHwgIShtYXhBdHRlbXB0cyA+IDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgaXNGaW5hbEF0dGVtcHQgPSBhdHRlbXB0ID49IG1heEF0dGVtcHRzO1xuICAgICAgICAvLyBBIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgZmFpbHVyZSDigJQgcmV0cnlpbmcgaXQgd291bGRcbiAgICAgICAgLy8gcmUtcnVuIGEgc3RhZ2UgdGhhdCBhc2tlZCB0byBTVVNQRU5EIChhbmQgd291bGQgYnJlYWsgcmVzdW1lLCB3aGljaFxuICAgICAgICAvLyByZS1lbnRlcnMgdGhpcyBzdGFnZSBmcm9tIGl0cyB0b3ApLiBDb3ZlcnMgYm90aCByYWlzZSBzaGFwZXM6XG4gICAgICAgIC8vIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZXR1cm5pbmcgZGF0YSwgYW5kIGBpbnRlcnJ1cHQoKWAuXG4gICAgICAgIGlmIChpc0ZpbmFsQXR0ZW1wdCB8fCBpc1BhdXNlU2lnbmFsKGVycm9yKSB8fCAhdGhpcy5zaG91bGRSZXRyeShwb2xpY3ksIGVycm9yLCBjb250ZXh0KSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgY2FuY2VsbGVkIHJ1biBtdXN0IG5vdCBzaXQgdGhyb3VnaCBhIGJhY2tvZmYgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgaXNvbGF0aW9uOiBkcm9wIGV2ZXJ5dGhpbmcgdGhpcyBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAgIC8vIG5leHQgb25lIHN0YXJ0cy4gTm90aGluZyB3YXMgYXBwbGllZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByb2xsXG4gICAgICAgIC8vIGJhY2sg4oCUIHNlZSBTdGFnZUNvbnRleHQuZGlzY2FyZFN0YWdlZCgpLlxuICAgICAgICBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcblxuICAgICAgICBjb25zdCBkZWxheU1zID0gcmVzb2x2ZUJhY2tvZmZNcyhwb2xpY3kuYmFja29mZk1zLCBhdHRlbXB0KTtcbiAgICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiXG4gICAgICAgIC8vIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBvbmNlIGl0IGhhcyBhbHJlYWR5IGVsYXBzZWQuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG1heEF0dGVtcHRzLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc2VydmVkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGF5TXMgPiAwKSBhd2FpdCBzbGVlcChkZWxheU1zLCB0aGlzLnNpZ25hbCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFI1IGZvciBpZHMgYSBzdGFnZSBBRE9QVFMgYXQgcnVuIHRpbWUgKGEgcmV0dXJuZWQgU3RhZ2VOb2RlJ3MgYG5leHRgIGNoYWluLFxuICAgKiBgY2hpbGRyZW5gIGFuZCBzdWJmbG93IGlkcyk6IHRoZSBzYW1lIHJlZnVzYWwgdGhlIGJ1aWxkZXIncyBkb29ycyBhcHBseSDigJRcbiAgICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCDigJQgc28gXCJubyB1c2VyIGlkIGNhcnJpZXMgYVxuICAgKiBncmFtbWFyIGRlbGltaXRlclwiIHN0YXlzIHRydWUgYnkgY29uc3RydWN0aW9uLiBMb29wLXJlZiBzdHVicyAodGhleSBuYW1lIGFuXG4gICAqIGV4aXN0aW5nIG5vZGUpIGFuZCB0aGUgY2hhcnQncyBvd24gbm9kZXMgKGFkbWl0dGVkIGF0IGJ1aWxkOyBhIHByZWZpeGVkIGlkXG4gICAqIGNhcnJpZXMgYC9gIG9uIHB1cnBvc2UpIGFyZSBub3QgbmV3IGlkcyBhbmQgYXJlIHNraXBwZWQuIEEgc3ViZmxvd1xuICAgKiBkZWZpbml0aW9uJ3Mgb3duIHRyZWUgaXMgYSBidWlsdCBjaGFydCBhbmQgaXMgbm90IHdhbGtlZC5cbiAgICovXG4gIHByaXZhdGUgYWRtaXREeW5hbWljSWRzKG91dHB1dDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8ICFpc1N0YWdlTm9kZVJldHVybihvdXRwdXQpKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdCA9IG91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBjb25zdCByZWZ1c2UgPSAocmVmdXNhbDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIGR5bmFtaWMgU3RhZ2VOb2RlOiAke3JlZnVzYWx9YCk7XG4gICAgfTtcbiAgICBpZiAocm9vdC5zdWJmbG93SWQpIHJlZnVzZShyZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCByb290LnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtyb290Lm5leHQsIC4uLihyb290LmNoaWxkcmVuID8/IFtdKV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmICghbiB8fCBzZWVuLmhhcyhuKSB8fCBuLmlzTG9vcFJlZikgY29udGludWU7XG4gICAgICBzZWVuLmFkZChuKTtcbiAgICAgIGNvbnN0IHJlZnVzYWwgPVxuICAgICAgICByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN0YWdlIGlkJywgbi5pZCwgJ3N0YWdlJykgPz9cbiAgICAgICAgKG4uc3ViZmxvd0lkID8gcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgbi5zdWJmbG93SWQsICdzZWdtZW50JykgOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBPbmx5IGEgU1VTUEVDVCBpZCBwYXlzIGZvciB0aGUgY2hhcnQgbG9va3VwOiBhIGNoYXJ0IG5vZGUgKGFuZCB0aGVcbiAgICAgICAgLy8gY2hhcnQgYmVsb3cgaXQpIHdhcyBhZG1pdHRlZCBhdCBidWlsZC5cbiAgICAgICAgaWYgKHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuLmlkKSA9PT0gbikgY29udGludWU7XG4gICAgICAgIHJlZnVzZShyZWZ1c2FsKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnB1c2gobi5uZXh0LCAuLi4obi5jaGlsZHJlbiA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgcmV0cnlPbmAgZ2F0ZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgY291bnRzIGFzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuXG4gICAqICBwcmVkaWNhdGUgbXVzdCBuZXZlciB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGVuZGxlc3MgcmV0cnkgbG9vcC4gKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShcbiAgICBwb2xpY3k6IE5vbk51bGxhYmxlPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+WydyZXRyeSddPixcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghcG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcG9saWN5LnJldHJ5T24oZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAvLyBBIHByZWRpY2F0ZSBtYXkgcmV0aHJvdyB0aGUgc3RhZ2UncyBvd24gZXJyb3I6IHRoZSBsb2dnZXIgZ2V0cyB0aGUgc2VydmVkIGZvcm0uXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgcHJlZGljYXRlRXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW1wb2xpbmUgZHJpdmVyIOKAlCBwcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogUnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW4gYSBmbGF0IGxvb3A6IGV2ZXJ5XG4gICAqIFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2UsIGR5bmFtaWMgbmV4dCAvIGR5bmFtaWNcbiAgICogcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyIGRpc3BhdGNoKSBjb21lcyBiYWNrIGFzIGFcbiAgICogYENvbnRpbnVhdGlvbkhvcGAgYW5kIGlzIGZvbGxvd2VkIElURVJBVElWRUxZIOKAlCBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrXG4gICAqIG5vciB0aGUgcmV0YWluZWQgcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LlxuICAgKlxuICAgKiBSZWN1cnNpb24gcmVtYWlucyBPTkxZIGZvciB0cnVlIHRyZWUgbmVzdGluZyAoZWFjaCBnZXRzIGEgbmVzdGVkIGRyaXZlclxuICAgKiBjYWxsKTogZm9yayBjaGlsZHJlbiAoYENoaWxkcmVuRXhlY3V0b3JgKSwgc2VsZWN0b3IgYnJhbmNoZXMgKHBhcmFsbGVsXG4gICAqIGZhbi1vdXQpLCBkZWNpZGVyIGJyYW5jaCBkaXNwYXRjaCB3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGBuZXh0YFxuICAgKiAodGhlIGJyYW5jaCBtdXN0IGNvbXBsZXRlIEJFRk9SRSB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zKSwgYW5kXG4gICAqIHN1YmZsb3cgbW91bnRzIChmcmVzaCB0cmF2ZXJzZXI7IHRoZSBtb3VudCBmcmFtZSBzdGF5cyBpbiB0aGUgcGFyZW50KS5cbiAgICogYF9leGVjdXRlRGVwdGhgIHRoZXJlZm9yZSBjb3VudHMgY2hhcnQgQ09NUE9TSVRJT04gZGVwdGggb25seSwgZ3VhcmRlZFxuICAgKiBieSBgX21heERlcHRoYCAoZGVmYXVsdCBgTUFYX0VYRUNVVEVfREVQVEhgID0gNTAwKS5cbiAgICpcbiAgICogUGF1c2VTaWduYWw6IGEgZmxhdCBkZWNpZGVyIGRpc3BhdGNoIHJlY29yZHMgYW4gYEludm9rZXJTdGFtcGA7IGlmIHRoZVxuICAgKiBjb250aW51ZWQgY2hhaW4gbGF0ZXIgcGF1c2VzLCB0aGUgZHJpdmVyIHN0YW1wcyB0aGUgc2lnbmFsIGR1cmluZ1xuICAgKiB1bndpbmQg4oCUIHNhbWUgaW52b2tlciBjb250ZXh0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvXG4gICAqIHN0YW1wLCBpbm5lcm1vc3QgKG1vc3QgcmVjZW50IGRpc3BhdGNoKSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgZW5jbG9zaW5nPzogRW5jbG9zaW5nRnJhbWVzLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIERlcHRoIGlzIHRoZSBDQUxMIFBBVEgncyBuZXN0aW5nLCByZWFkIG9mZiB0aGUgY29udGV4dCB0aGlzIGRyaXZlciB3YXNcbiAgICAvLyBoYW5kZWQgKHNlZSBgX2ZyYW1lT2ZgKSDigJQgc2libGluZ3MgbmV2ZXIgY29uc3VtZSBpdC4gQSByZWFjaGVkIGNhcCBpcyBhXG4gICAgLy8gUlVOIGZhaWx1cmU6IGBvbkVycm9yYCBmaXJlcyBoZXJlIChubyBzdGFnZSByYW4gZm9yIHRoaXMgbm9kZSwgc28gbm9cbiAgICAvLyBzdGFnZSBjYXRjaCB3b3VsZCkgYW5kIGBDaGlsZHJlbkV4ZWN1dG9yYCByZXRocm93cyBpdCB3aGF0ZXZlciB0aGVcbiAgICAvLyBmYW4tb3V0J3MgZXJyb3IgbW9kZS5cbiAgICBjb25zdCBkZXB0aCA9IHRoaXMubmVzdGluZ0RlcHRoT2YoY29udGV4dCk7XG4gICAgaWYgKGRlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRyYXZlcnNhbERlcHRoRXJyb3IodGhpcy5fbWF4RGVwdGgsIG5vZGUubmFtZSk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgdGhyb3duVGV4dChlcnJvciksIGV4dHJhY3RFcnJvckluZm8oZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIEV2ZXJ5IGRyaXZlciByZW1lbWJlcnMgdGhlIG5vZGVzIGl0IHJhbi4gQSBkZWNpZGVyJ3MgQlJBTkNIIEZSQU1FXG4gICAgLy8gKGRlY2lkZXIgd2l0aCBpdHMgb3duIGBuZXh0YDsgYGVuY2xvc2luZ2AgPSB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnNcbiAgICAvLyBpdCBpcyBuZXN0ZWQgaW4gKyB0aGUgYG5leHRgIGNoYWlucyBvZiB0aGUgZGVjaWRlcnMgd2hvc2UgZnJhbWVzIGhvbGRcbiAgICAvLyBpdCkgTEVBVkVTIG9uIGEganVtcCBieSBpZCAoYSBgbG9vcGAgaG9wKSB0byBhIG5vZGUgdGhpcyBmcmFtZSBkaWQgbm90XG4gICAgLy8gcnVuIHRoYXQgaXMgZWl0aGVyIG9uZSBhbiBFTkNMT1NJTkcgZHJpdmVyIGFscmVhZHkgcmFuIChhIGxvb3AgYmFjaykgb3JcbiAgICAvLyBvbmUgb24gYW4gZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gKGEgZm9yd2FyZCBqdW1wIGludG8gdGhlXG4gICAgLy8gdGFpbCkg4oCUIHRoZSBob3AgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGRlY2lkZXIsIHdoaWNoIGZvbGxvd3MgaXQgZmxhdFxuICAgIC8vIGF0IGl0cyBvd24gbGV2ZWwgYW5kIHNraXBzIGl0cyBgbmV4dGAsIHNvIG5laXRoZXIgYSBsb29wIHN0YWNrcyBvbmVcbiAgICAvLyBmcmFtZSBwZXIgcGFzcyBub3IgYSB0YWlsIHJ1bnMgdHdpY2UuIEFueSBvdGhlciBqdW1wIChzaWRld2F5cyB0byBhXG4gICAgLy8gc2libGluZyBicmFuY2gpIHN0YXlzIGluIHRoZSBmcmFtZSwgYXMgdGhyb3VnaCA5LjM5LjAuXG4gICAgY29uc3QgcmFuSGVyZSA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IGZyYW1lOiBEcml2ZXJGcmFtZSA9IHtcbiAgICAgIGRlcHRoLFxuICAgICAgcmFuOiBlbmNsb3NpbmcgPyBbLi4uZW5jbG9zaW5nLnJhbiwgcmFuSGVyZV0gOiBbcmFuSGVyZV0sXG4gICAgICB0YWlsczogZW5jbG9zaW5nPy50YWlscyA/PyBbXSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lT2Yuc2V0KGN1cnJlbnQuY29udGV4dCwgZnJhbWUpO1xuICAgICAgICByYW5IZXJlLmFkZChjdXJyZW50Lm5vZGUuaWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5sb29wID09PSB0cnVlICYmICFyYW5IZXJlLmhhcyhyZXN1bHQubm9kZS5pZCkpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdC5ub2RlLmlkO1xuICAgICAgICAgIGNvbnN0IGhhcyA9IChpZHM6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4pID0+IGlkcy5oYXMoaWQpO1xuICAgICAgICAgIGlmIChlbmNsb3NpbmcucmFuLnNvbWUoaGFzKSB8fCBlbmNsb3NpbmcudGFpbHMuc29tZShoYXMpKSByZXR1cm4gcmVzdWx0OyAvLyB0aGUganVtcCBsZWF2ZXMgdGhpcyBmcmFtZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW52b2tlclN0YW1wKSAocGVuZGluZ0ludm9rZXJzID8/PSBbXSkucHVzaChyZXN1bHQuaW52b2tlclN0YW1wKTtcbiAgICAgICAgY3VycmVudCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gUmVwbGF5IGludm9rZXIgc3RhbXBzIG1vc3QtcmVjZW50LWZpcnN0LiBgc2V0SW52b2tlcmAgaXNcbiAgICAgIC8vIGZpcnN0LXdyaXRlLXdpbnMsIHNvIHRoZSBpbm5lcm1vc3QgZGlzcGF0Y2gncyBzdGFtcCBsYW5kcyDigJQgZXhhY3RseVxuICAgICAgLy8gdGhlIG9sZCBidWJibGUtdXAgb3JkZXIgdGhyb3VnaCBuZXN0ZWQgY2F0Y2ggZnJhbWVzLlxuICAgICAgaWYgKHBlbmRpbmdJbnZva2VycyAhPT0gdW5kZWZpbmVkICYmIGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBwZW5kaW5nSW52b2tlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKHBlbmRpbmdJbnZva2Vyc1tpXS5pbnZva2VyU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVzdGluZyBkZXB0aCBhIGRyaXZlciBoYW5kZWQgYGNvbnRleHRgIHJ1bnMgYXQ6IG9uZSBiZWxvdyB0aGVcbiAgICogZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0IHdhcyBjcmVhdGVkIGZyb20sIDEgYXQgdGhlIHRvcCAoYW5kIGZvclxuICAgKiBhIGNvbnRleHQgd2hvc2UgcGFyZW50IG5vIGRyaXZlciBvZiB0aGlzIHRyYXZlcnNlciByYW4g4oCUIGEgc3ViZmxvdydzXG4gICAqIHJvb3QsIGEgcmVzdW1lJ3Mgc3RhcnQpLiBSZWFkIGJ5IHRoZSBpbnN0cnVtZW50YXRpb24gaW5cbiAgICogYGJlbmNoL2RlcHRoLXByb2JlLnRzYCBhbmQgdGhlIHRyYW1wb2xpbmUgdGVzdHMuXG4gICAqL1xuICBwcml2YXRlIG5lc3RpbmdEZXB0aE9mKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgcmV0dXJuIChwYXJlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9mcmFtZU9mLmdldChwYXJlbnQpPy5kZXB0aCA/PyAwKSArIDE7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVycyBpdCBpc1xuICAgKiBuZXN0ZWQgaW4sIGFuZCBldmVyeSBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiBwbHVzIHRoaXMgb25lJ3MuXG4gICAqL1xuICBwcml2YXRlIGJyYW5jaEZyYW1lRm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgbmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBFbmNsb3NpbmdGcmFtZXMge1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5fZnJhbWVPZi5nZXQoY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmFuOiBvdXRlcj8ucmFuID8/IFtdLCB0YWlsczogWy4uLihvdXRlcj8udGFpbHMgPz8gW10pLCB0aGlzLnRhaWxJZHMobmV4dCldIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkcyBvbiBhIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4g4oCUIGBuZXh0YCwgaXRzIGBuZXh0YCwg4oCmIOKAlCB1cCB0byBhXG4gICAqIGxvb3AtcmVmIHN0dWIgKGEgYmFjay1lZGdlLCBub3QgdGhlIHRhaWwpLiBDYWNoZWQgcGVyIGNoYWluIGhlYWQuXG4gICAqL1xuICBwcml2YXRlIHRhaWxJZHMobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgaWRzID0gdGhpcy5fdGFpbElkcy5nZXQobmV4dCk7XG4gICAgaWYgKGlkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgZm9yIChsZXQgbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBuZXh0OyBuICYmICFuLmlzTG9vcFJlZiAmJiAhY2hhaW4uaGFzKG4uaWQpOyBuID0gbi5uZXh0KSB7XG4gICAgICAgIGNoYWluLmFkZChuLmlkKTtcbiAgICAgIH1cbiAgICAgIGlkcyA9IGNoYWluO1xuICAgICAgdGhpcy5fdGFpbElkcy5zZXQobmV4dCwgaWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGxvb3AgZWRnZSAoYSBgbG9vcFRvYCBzdHViIG9yIGEgYnktaWQgZHluYW1pYyBuZXh0KSBhbmQgaG9wIHRvXG4gICAqIGl0cyB0YXJnZXQuIFRoZSBob3AgaXMgZmxhZ2dlZCBgbG9vcGAgd2hlbiB0aGUgcmVzb2x2ZXIgZm9sbG93ZWQgYVxuICAgKiBiYWNrLXJlZmVyZW5jZSwgc28gYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcCB0aGF0IGxlYXZlc1xuICAgKiBpdCBmcm9tIG9uZSB0aGF0IHN0YXlzIGluc2lkZSBpdC5cbiAgICovXG4gIHByaXZhdGUgbG9vcEhvcChcbiAgICBsb29wUmVmOiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGxvb3BSZWYsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIGNvbnN0IGhvcCA9IHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlID09PSBsb29wUmVmID8gaG9wIDogeyAuLi5ob3AsIGxvb3A6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgZGVjaWRlcidzIG93biBgbmV4dGAgdGhlIHN0dWIgYGxvb3BUb2AgcGxhbnRlZCAob3IgYVxuICAgKiByZWZlcmVuY2Utb25seSBub2RlIOKAlCBubyBmbiwgbm8gY2hpbGRyZW4sIG5vIGRlY2lkZXIvc2VsZWN0b3IsIG5vdCBhXG4gICAqIHN1YmZsb3cgcm9vdCk/IFRoZSBzZWxlY3RvcidzIGFuZCB0aGUgbW91bnQncyBjb250aW51YXRpb24gYXNrXG4gICAqIGBpc0xvb3BSZWZgIGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdHViKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5leHQuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0KSAmJlxuICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0KT8ubGVuZ3RoICYmXG4gICAgICAgICFuZXh0LmRlY2lkZXJGbiAmJlxuICAgICAgICAhbmV4dC5zZWxlY3RvckZuICYmXG4gICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIE9ORSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzIOKAlCB0aGUgb2xkIHJlY3Vyc2l2ZSBgZXhlY3V0ZU5vZGVgXG4gICAqIGJvZHk7IG9ubHkgdGhlIHRhaWwgY2FsbHMgYmVjYW1lIGBDb250aW51YXRpb25Ib3BgIHJldHVybnMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUncyByZXN1bHQsIG9yIGEgaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AgdG8gZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZVN0ZXAoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAvLyBTdWJmbG93IG1ldGEgcmVhZHMgZ28gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5IOKAlCBhIG5vZGVcbiAgICAvLyBwYXRjaGVkIGJ5IGEgZHluYW1pYy1zdWJmbG93IHJldHVybiByZS1lbnRlcnMgZXhlY3V0ZU5vZGUgYW5kIG11c3RcbiAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgIGlmIChub2RlLmRlc2NyaXB0aW9uKSBjb250ZXh0LmRlc2NyaXB0aW9uID0gbm9kZS5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBlZmZTdWJmbG93SWQgPSB0aGlzLmVmZlN1YmZsb3dJZChub2RlKTtcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgLy8gKGJ1ZmZlcmVkIGJ5IHJ1bnRpbWVTdGFnZUlkKSBhbmQgZmxvdyBldmVudHMgKGZsdXNoZWQgYnkgdHJhdmVyc2FsQ29udGV4dC5ydW50aW1lU3RhZ2VJZClcbiAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChub2RlLmlkLCBpZHgpO1xuICAgIGNvbnRleHQuYmluZEVtaXRPcmlnaW4odGhpcy5ydW5JZCwgdGhpcy5lbWl0RHJpbGxQYXRoKTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFI1IGF0IHRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIHRoZSBidWlsZGVyXG4gICAgICAgIC8vIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXQgdGFrZXMgdGhlIHN0YWdlJ3NcbiAgICAgICAgLy8gZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNJZHMoc3RhZ2VPdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXVzZURhdGEpLFxuICAgICAgICAgICAgZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICByZXR1cm5lZER5bmFtaWNOb2RlID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIC8vIFJ1bnRpbWUgc3RydWN0dXJlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IGRpYWdub3N0aWMgdGV4dCBtYXkgYmVcbiAgICAgIC8vIG1hc2tlZCAob3IgdXNlci13cml0dGVuKSBhbmQgbXVzdCBuZXZlciBkZWNpZGUgY2FwdHVyZSBiZWhhdmlvci5cbiAgICAgIGlmIChyZXR1cm5lZER5bmFtaWNOb2RlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkgcmV0dXJuIHRoaXMubG9vcEhvcChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZToge30sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIC8vIFByZWZpeGVkIGxpa2UgdGhlIGJ1aWxkZXIncyBgX21vdW50U3ViZmxvd2AgKDkuMzcuMCBmaXgpOiB3aXRob3V0IGl0XG4gICAgICAgIC8vIGV2ZXJ5IGJyYW5jaCByYW4gaXRzIG5lc3RlZCBzdWJmbG93J3Mgc3RhZ2VzIHVuZGVyIE9ORSBpZC5cbiAgICAgICAgdGhpcy5zdWJmbG93c1tqb2luUGF0aChzdWJmbG93SWQsIGtleSldID0ge1xuICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBzdWJmbG93SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IFJVTiB0aW1lIChsYXp5IHN1YmZsb3dzLFxuICAgKiB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIG9mIGBhZGRQYXJhbGxlbEZvckVhY2hgKSDigJQgdGhlIG9uZSBwcmVmaXhlcixcbiAgICogYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AsIHdoaWNoIHRoZSBidWlsZGVyIGNhbGxzIGF0IG1vdW50IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
1399
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRS9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUs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VyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUN4QyxXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUNyRCxVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsNkVBQTZFO1FBQzdFLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBQUM7WUFDdkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUN6QyxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUM1QixVQUFVLENBQUMsa0JBQWtCLENBQzlCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDBiLiBQQVJBTExFTC1GT1ItRUFDSCDigJQgZHluYW1pYyBmYW4tb3V0IChicmFuY2hlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGF5bG9hZClcbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGpvaW5QYXRoIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9yZXNlcnZlZElkcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IHNuYXBzaG90UnVuSW5wdXQgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSB9IGZyb20gJy4uL2hhbmRsZXJzL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUGFyYWxsZWxGb3JFYWNoSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvc2VydmVkUGF1c2UuanMnO1xuaW1wb3J0IHsgbG9nZ2FibGVTdGFnZUVycm9yLCByZWNvcmRTdGFnZUVycm9yLCBzZXJ2ZWRTdGFnZUVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvVHJhdmVyc2FsRGVwdGhFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogQGludGVybmFsIEFjdHVhbCBydW50aW1lIG1vdW50IGFuY2VzdHJ5IGZvciB0aGUgb3duaW5nIGxvZywgbm90IHN0YXRpYyBzdWJmbG93UGF0aC4gKi9cbiAgZW1pdERyaWxsUGF0aD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGZvbGxvd3MgYSBMT09QIGVkZ2UgKGEgYmFjay1yZWZlcmVuY2UgcmVzb2x2ZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCkuIEEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBoYW5kcyBzdWNoIGEgaG9wIGJhY2tcbiAgICogdG8gaXRzIGRlY2lkZXIgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhIG5vZGUgdGhlIGZyYW1lIHJhbiwgc28gdGhlIGxvb3BcbiAgICogcmUtZW50ZXJzIGF0IHRoZSB0YXJnZXQncyBvd24gbGV2ZWwg4oCUIGZsYXQsIG5ldmVyIG9uZSBmcmFtZSBwZXIgcGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiB0cnVlO1xufVxuXG4vKipcbiAqIFdoYXQgYSBkcml2ZXIgcmVjb3JkcyBmb3IgZWFjaCBzdGFnZSBjb250ZXh0IGl0IHJ1bnM6IGl0cyBORVNUSU5HIGRlcHRoXG4gKiAoc2VlIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgbmVzdGluZ0RlcHRoT2ZgKSBhbmQgdGhlIG5vZGUgaWRzIGVhY2ggZHJpdmVyXG4gKiBvbiBpdHMgQlJBTkNILUZSQU1FIGNoYWluIGhhcyBydW4g4oCUIGl0cyBvd24gbGFzdC4gQSBkZWNpZGVyIHdpdGggaXRzIG93blxuICogYG5leHRgIGhhbmRzIHRoYXQgY2hhaW4gdG8gaXRzIGJyYW5jaCBmcmFtZSwgc28gdGhlIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcFxuICogYmFjayBpbnRvIGFuIGVuY2xvc2luZyBkcml2ZXIgKGxlYXZlKSBmcm9tIGFueSBvdGhlciBqdW1wIChzdGF5KS5cbiAqL1xuaW50ZXJmYWNlIERyaXZlckZyYW1lIHtcbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmFuOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIC8qKiBUaGUgYG5leHRgLWNoYWluIGlkcyBvZiBldmVyeSBkZWNpZGVyIHdob3NlIGJyYW5jaCBmcmFtZSBlbmNsb3NlcyB0aGlzIGRyaXZlci4gKi9cbiAgcmVhZG9ubHkgdGFpbHM6IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbn1cblxuLyoqIFdoYXQgYSBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSBlbmNsb3NpbmcgcmFuLXNldHMsIGFuZCB0aGUgdGFpbHMgaXQgbWF5IGp1bXAgdG8uICovXG50eXBlIEVuY2xvc2luZ0ZyYW1lcyA9IFBpY2s8RHJpdmVyRnJhbWUsICdyYW4nIHwgJ3RhaWxzJz47XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgUmV0cnlQb2xpY3l9J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWRcbiAqICgxLWJhc2VkKS4gQW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUsIHBvc2l0aXZlIG51bWJlciDigJQgYSBtaXNzaW5nIGRpYWwsIGFcbiAqIG5lZ2F0aXZlIHZhbHVlLCBhIGBOYU5gIGZyb20gYSBjb25zdW1lcidzIGFyaXRobWV0aWMsIG9yIGEgdGhyb3dpbmcgZnVuY3Rpb25cbiAqIOKAlCBiZWNvbWVzIGAwYCwgaS5lLiByZXRyeSBpbW1lZGlhdGVseS4gQSBiYWNrb2ZmIGRpYWwgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gKiBjcmFzaCBhIHJ1biBvciBwYXJrIGl0IGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCYWNrb2ZmTXMoYmFja29mZk1zOiBudW1iZXIgfCAoKGF0dGVtcHQ6IG51bWJlcikgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCwgYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJhY2tvZmZNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBpZiAodHlwZW9mIGJhY2tvZmZNcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGJhY2tvZmZNcyhhdHRlbXB0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCByZXRocm93cyB0aGUgb3JpZ2luYWwgc3RhZ2UgZXJyb3IsIHNvIGEgY2FuY2VsbGVkIHJ1blxuICogbmV2ZXIgc2l0cyBvdXQgYSBsb25nIGJhY2tvZmYgYW5kIG5ldmVyIGxvc2VzIHRoZSBmYWlsdXJlIHRoYXQgY2F1c2VkIGl0LlxuICogVGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXIgYXJlIGFsd2F5cyBjbGVhbmVkIHVwLlxuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGRvbmUsIG1zKTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFdoZXJlIHRoZSBuZXh0IGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5lbnRyeSkuICovXG4gIHByaXZhdGUgZW50cnk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZ3MnIHBhdXNlcyByYWlzZWQgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcyDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLnBlbmRpbmdQYXVzZXMpLiAqL1xuICBwcml2YXRlIGVudHJ5UGVuZGluZ1BhdXNlczogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSwgc2hhcmVkIHdpdGggbmVzdGVkIHRyYXZlcnNlcnMuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbCBydW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBtb3VudCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqICB0cmF2ZXJzZXIuIEZhbGxiYWNrIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZm9yIHN0YWdlcyB3aG9zZSBjb250ZXh0IGhhc1xuICAgKiAgbm8gcGFyZW50ICh0aGUgc3ViZmxvdyByb290KS4gVW5kZWZpbmVkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0RHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFZhbGlkYXRlZCB2YWx1ZSBwYXNzZWQgdmlhIGBydW4oe2lucHV0fSlgLiBSb290IGJvdW5kYXJ5IG9ic2VydmVyc1xuICAgKiAgcmVjZWl2ZSBpdHMgcmV0YWluZWQgZm9ybTsgc3RhZ2UgYXJndW1lbnRzIGtlZXAgdGhlIG9yaWdpbmFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFRoZSBoYW5kbGVycycgc2hhcmVkIGRlcHMg4oCUIGl0cyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgbGVnJ3MgaW5wdXQgc25hcHNob3QsIHNldCBieSBgZXhlY3V0ZWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsRm9yRWFjaEhhbmRsZXI6IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSAoTkVTVElORyBkZXB0aCArIGJyYW5jaC1mcmFtZSByYW4tc2V0cykgb2YgdGhlIGRyaXZlciB0aGF0IHJhbiBlYWNoIHN0YWdlIGNvbnRleHQg4oCUIGRlcHRoIGlzIGFcbiAgICogcHJvcGVydHkgb2YgdGhlIGNhbGwgUEFUSCwgc28gaXQgdHJhdmVscyB3aXRoIHRoZSBjb250ZXh0cywgbm90IGluIG9uZVxuICAgKiBwZXItdHJhdmVyc2VyIGNvdW50ZXIuIEEgbmVzdGVkIGRyaXZlciAoZm9yay9zZWxlY3RvciBjaGlsZCwgYSBkZWNpZGVyJ3NcbiAgICogYnJhbmNoIGZyYW1lKSBzaXRzIG9uZSBsZXZlbCBiZWxvdyB0aGUgZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0c1xuICAgKiBvd24gY29udGV4dCB3YXMgY3JlYXRlZCBmcm9tIChgU3RhZ2VDb250ZXh0LnBhcmVudGApIOKAlCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBzaGFyZSBvbmUgZGVwdGgsIGFuZCA1MjAgY2hpbGRyZW4gb2Ygb25lIGZvcmsgYXJlIDUyMCBkcml2ZXJzXG4gICAqIGF0IHRoZSBzYW1lIGxldmVsICh0aHJvdWdoIDkuMzkuMCBhIHNoYXJlZCBjb3VudGVyIG1hZGUgdGhlbSA1MjAgbGV2ZWxzKS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgYWRkIGEgbGV2ZWwuXG4gICAqIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmQgdW5ib3VuZGVkXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXkgcmVjdXJzaXZlXG4gICAqIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVPZiA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgRHJpdmVyRnJhbWU+KCk7XG5cbiAgLyoqIGBuZXh0YC1jaGFpbiBpZHMgcGVyIGRlY2lkZXIgY29udGludWF0aW9uIGhlYWQgKGB0YWlsSWRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhaWxJZHMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzIHNoYXJlIHRoZWlyIHBhcmVudCdzIGRlcHRoICsgMSDigJQgYSBmb3JrIG9yIHNlbGVjdG9yIG9mIGFueSB3aWR0aCBpc1xuICAgKiBvbmUgbGV2ZWwsIG5ldmVyIG9uZSBsZXZlbCBwZXIgY2hpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSAodGhlIGJyZWFrIGZsYWdcbiAgICogYW5kIHRoZSByZXNvbHZlcidzIGxvb3AgY291bnRzIGFyZSBwZXIgaW5zdGFuY2UpLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXJcbiAgICogY29uY3VycmVudCBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID0gb3B0cy5yZXN1bWU7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICAvLyBNaXNzaW5nIGFuY2VzdHJ5IGluIGEgaGFuZC1idWlsdCBuZXN0ZWQgdHJhdmVyc2VyIGlzIHVua25vd24sIG5ldmVyXG4gICAgLy8gZ3Vlc3NlZCBhcyByb290LiBUaGUgbm9ybWFsIHN1YmZsb3cgZmFjdG9yeSBzdXBwbGllcyB0aGUgZnVsbCBwYXRoLlxuICAgIGNvbnN0IGVtaXREcmlsbFBhdGggPVxuICAgICAgb3B0cy5lbWl0RHJpbGxQYXRoID8/IChvcHRzLnBhcmVudFN1YmZsb3dJZCB8fCBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPyB1bmRlZmluZWQgOiBbXSk7XG4gICAgdGhpcy5lbWl0RHJpbGxQYXRoID0gZW1pdERyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogT2JqZWN0LmZyZWV6ZShbLi4uZW1pdERyaWxsUGF0aF0pO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpLlxuICAgIC8vIEZyb20gYHJvb3RgLCBuZXZlciBmcm9tIGBlbnRyeWA6IGEgcmVzdW1lJ3Mgc3RhbmQtaW4gY2FycmllcyB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UncyBpZCwgYW5kIGEgbG9vcCBiYWNrIHRvIHRoYXQgaWQgbXVzdCBmaW5kIHRoZSBSRUFMIHN0YWdlLlxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gICAgdGhpcy5wYXJhbGxlbEZvckVhY2hIYW5kbGVyID0gbmV3IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLCB7XG4gICAgICBwcmVmaXhOb2RlVHJlZTogKG4sIHByZWZpeCkgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShuLCBwcmVmaXgpLFxuICAgICAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93OiAoc3ViZmxvd0lkLCByb290LCBjaGFydCkgPT4gdGhpcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCByb290LCBjaGFydCksXG4gICAgICBicmFuY2hTaGFyZWRTdGF0ZTogKHN1YmZsb3dJZCkgPT5cbiAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cy5nZXQoc3ViZmxvd0lkKT8udHJlZUNvbnRleHQ/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmU6IChub2RlSWQsIGJyYW5jaGVzKSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKG5vZGVJZCwgYnJhbmNoZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5lbnRyeSAmJiB7IGVudHJ5OiBzdWJmbG93T3B0cy5lbnRyeSB9KSwgLy8gYSByZXN1bWUgaG9wJ3MgZW50cnkgcG9pbnRcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBwYXJlbnQgZmFsbGJhY2sgZm9yXG4gICAgICAgIC8vIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZSBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIGJvdW5kYXJ5LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBlbWl0RHJpbGxQYXRoOlxuICAgICAgICAgIHRoaXMuZW1pdERyaWxsUGF0aCAhPT0gdW5kZWZpbmVkICYmIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRcbiAgICAgICAgICAgID8gWy4uLnRoaXMuZW1pdERyaWxsUGF0aCwgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cywgLy8gU2hhcmUgdmlzaXQgY291bnRzIOKAlCBsb29wSXRlcmF0aW9uIHN0YXlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHNcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IEJZIFJFRkVSRU5DRSwgc28gYSBob3AgdGFrZW5cbiAgICAgICAgLy8gYXQgYW55IGRlcHRoIGlzIHRha2VuIGZvciB0aGUgd2hvbGUgcnVuIOKAlCBhbmQgbmVzdGVkXG4gICAgICAgIC8vIFN1YmZsb3dFeGVjdXRvcnMgY2FuIHRha2UgdGhlIGRlZXBlciBob3BzIChlLmcuIFNlcXVlbmNlKEFnZW50KC4uLikpXG4gICAgICAgIC8vIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICAvLyBUaGUgbGVnJ3MgT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBpcyB0YWtlbiB3aGVuIHRoZSBsZWcgU1RBUlRTXG4gICAgICAvLyAoYGV4ZWN1dGVgKSwgbmV2ZXIgaGVyZTogYSBnZXR0ZXIgb24gdGhlIGlucHV0IG11c3Qgbm90IHJ1biBhdCBjb25zdHJ1Y3Rpb24uXG4gICAgICByZWFkT25seUNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIC8vIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgcGVyIGxlZyAocnVuLCByZXN1bWUsIHN1YmZsb3cgbW91bnQpLCB0YWtlbiBhcyB0aGVcbiAgICAvLyBsZWcgc3RhcnRzIOKAlCBuZXZlciBhdCBjb25zdHJ1Y3Rpb24gKGFuIGV4ZWN1dG9yIGNvbnN0cnVjdHMgYSB0cmF2ZXJzZXIgaXQgbWF5IG5ldmVyXG4gICAgLy8gcnVuKTogZXZlcnkgc2NvcGUgb2YgdGhlIGxlZyBnZXRzIGl0LCBzbyBlYWNoIHBheXMgTyhyb290IGtleXMpLCBub3QgTyhpbnB1dCkuXG4gICAgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCA9IHNuYXBzaG90UnVuSW5wdXQodGhpcy5yZWFkT25seUNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBSZXRhaW4gYXQgdGhlIGJvdW5kYXJ5LCBiZWZvcmUgZGlzcGF0Y2ggb3IgZGVmZXJyZWQgY2FwdHVyZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIG93bmVyIGFzIHN1YmZsb3cgZW50cnksIG5vdCBhIHJlY29yZGVyLWxvY2FsIHNjcnViIG9yIGxhdGVyIHdhbGsuXG4gICAgICAvLyBVbmRlciBhIHBvbGljeSB0aGUgd2FsayByZWFkcyB0aGUgbGVnJ3MgT05FIHNuYXBzaG90ICh0YWtlbiBhYm92ZSksIG5ldmVyIHRoZSBsaXZlIGlucHV0XG4gICAgICAvLyBhIHNlY29uZCB0aW1lOyB3aXRob3V0IG9uZSB0aGUgZXZlbnQgY2FycmllcyB0aGUgaW5wdXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICAgcmVkYWN0aW9uUnVsZSAmJiAhcmVkYWN0aW9uUnVsZS5pc0luZXJ0KClcbiAgICAgICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkodGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dClcbiAgICAgICAgICA6IHRoaXMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydChpbnB1dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgbGV0IHJldGFpbmVkUmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICAgIC8vIFJlYWQgdGhlIHNoYXJlZCBydWxlIG5vdyBzbyBtYXJrcyBtYWRlIGR1cmluZyBleGVjdXRpb24gYXBwbHkgdG9cbiAgICAgIC8vIHRoaXMgZXZlbnQuIEEgc2NydWIgZmFpbHVyZSBjbG9zZXMgdGhlIHJ1biBhcyBmYWlsZWQsIG5ldmVyIHJhdy5cbiAgICAgIHJldGFpbmVkUmVzdWx0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChcbiAgICAgICAgICByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSxcbiAgICAgICAgICByb290Q29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkVuZChyZXRhaW5lZFJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZS5wYXVzZURhdGEpLFxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgsXG4gICAgKTtcbiAgICB0aHJvdyByYWlzZVF1ZXVlZFBhdXNlKHdhaXRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFrIHN0YXRlIGNhcHR1cmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIG1vc3QgcmVjZW50IGBleGVjdXRlKClgLlxuICAgKiBgc2hvdWxkQnJlYWtgIGlzIHRydWUgd2hlbiBhIHN0YWdlIGNhbGxlZCBgc2NvcGUuJGJyZWFrKHJlYXNvbilgOyB0aGVcbiAgICogb3B0aW9uYWwgYHJlYXNvbmAgY2FycmllcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBwcm9wYWdhdGUgYW4gaW5uZXIgc3ViZmxvdydzIGJyZWFrIHVwIHRvXG4gICAqIHRoZSBwYXJlbnQgdHJhdmVyc2VyIHdoZW4gdGhlIG1vdW50IHNldHMgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcEJyZWFrRmxhZyB9O1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTdGFtcCB0aGUgcnVuJ3MgaWQgb250byB0aGUgcnVudGltZSBzbmFwc2hvdCBoZXJlIOKAlCB0aGUgdHJhdmVyc2VyIGlzXG4gICAgLy8gdGhlIHNpbmdsZSBhdXRob3JpdHkgZm9yIGBydW5JZGAgKGl0IGFscmVhZHkgc3RhbXBzIHRoZSBzYW1lIHZhbHVlIG9uXG4gICAgLy8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC9ldmVudCksIHdoaWxlIHRoZSBydW50aW1lIGlzIHJ1bi1hZ25vc3RpY1xuICAgIC8vIG1lbW9yeSAoaXRzIGdldFNuYXBzaG90IHJldHVybnMgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+KS5cbiAgICAvLyBGcmVzaCBwZXIgcnVuKCkgQU5EIHBlciByZXN1bWUoKSDigJQgc2VlIHJ1bm5lci9ydW5JZC50cy5cbiAgICByZXR1cm4geyAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyksIHJ1bklkOiB0aGlzLnJ1bklkIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSB0aGUgZGVjbGFyYXRpdmUgcmV0cnkgbG9vcCBsaXZlcyBIRVJFIGFuZCBub3doZXJlXG4gICAqIGVsc2U6IG9uZSBpbXBsZW1lbnRhdGlvbiBnaXZlcyBgcmV0cnlgIHRvIGV2ZXJ5IHN0YWdlIGtpbmQgdGhhdCBoYXMgYVxuICAgKiBmdW5jdGlvbiB0byByZXRyeS4gKFB1dHRpbmcgaXQgaW4gYFN0YWdlUnVubmVyYCB3b3VsZCBoYXZlIGJlZW4gd3Jvbmcg4oCUXG4gICAqIHRoZSBydW5uZXIgb3ducyB0aGUgc2NvcGUgYW5kIHRoZSBpbnRlcnJ1cHQgYm91bmRhcnksIGJ1dCBub3QgdGhlXG4gICAqIGBTdGFnZUNvbnRleHRgIHdob3NlIHN0YWdlZCB3cml0ZXMgYSBmYWlsZWQgYXR0ZW1wdCBtdXN0IGRpc2NhcmQuKVxuICAgKlxuICAgKiBXaXRoIG5vIGByZXRyeWAgcG9saWN5IHRoaXMgaXMgYSBzaW5nbGUgY2FsbCwgYnl0ZS1pZGVudGljYWwgdG8gdGhlXG4gICAqIHByZS05LjE1IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS4gSXQgZG9lcyBOT1RcbiAgICAvLyBjaGFuZ2UgYWNyb3NzIGF0dGVtcHRzOiBhdHRlbXB0cyBhcmUgaW50ZXJuYWwgdG8gT05FIHN0YWdlIGV4ZWN1dGlvbiDigJRcbiAgICAvLyBvbmUgcnVudGltZVN0YWdlSWQsIG9uZSBleGVjdXRpb24gaW5kZXgsIG9uZSBmaW5hbCBDb21taXRCdW5kbGUuXG4gICAgY29uc3QgcG9saWN5ID0gbm9kZS5yZXRyeTtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IHBvbGljeSA/IE1hdGguZmxvb3IocG9saWN5LmF0dGVtcHRzKSA6IDE7XG4gICAgaWYgKCFwb2xpY3kgfHwgIShtYXhBdHRlbXB0cyA+IDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgaXNGaW5hbEF0dGVtcHQgPSBhdHRlbXB0ID49IG1heEF0dGVtcHRzO1xuICAgICAgICAvLyBBIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgZmFpbHVyZSDigJQgcmV0cnlpbmcgaXQgd291bGRcbiAgICAgICAgLy8gcmUtcnVuIGEgc3RhZ2UgdGhhdCBhc2tlZCB0byBTVVNQRU5EIChhbmQgd291bGQgYnJlYWsgcmVzdW1lLCB3aGljaFxuICAgICAgICAvLyByZS1lbnRlcnMgdGhpcyBzdGFnZSBmcm9tIGl0cyB0b3ApLiBDb3ZlcnMgYm90aCByYWlzZSBzaGFwZXM6XG4gICAgICAgIC8vIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZXR1cm5pbmcgZGF0YSwgYW5kIGBpbnRlcnJ1cHQoKWAuXG4gICAgICAgIGlmIChpc0ZpbmFsQXR0ZW1wdCB8fCBpc1BhdXNlU2lnbmFsKGVycm9yKSB8fCAhdGhpcy5zaG91bGRSZXRyeShwb2xpY3ksIGVycm9yLCBjb250ZXh0KSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgY2FuY2VsbGVkIHJ1biBtdXN0IG5vdCBzaXQgdGhyb3VnaCBhIGJhY2tvZmYgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgaXNvbGF0aW9uOiBkcm9wIGV2ZXJ5dGhpbmcgdGhpcyBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAgIC8vIG5leHQgb25lIHN0YXJ0cy4gTm90aGluZyB3YXMgYXBwbGllZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByb2xsXG4gICAgICAgIC8vIGJhY2sg4oCUIHNlZSBTdGFnZUNvbnRleHQuZGlzY2FyZFN0YWdlZCgpLlxuICAgICAgICBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcblxuICAgICAgICBjb25zdCBkZWxheU1zID0gcmVzb2x2ZUJhY2tvZmZNcyhwb2xpY3kuYmFja29mZk1zLCBhdHRlbXB0KTtcbiAgICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiXG4gICAgICAgIC8vIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBvbmNlIGl0IGhhcyBhbHJlYWR5IGVsYXBzZWQuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG1heEF0dGVtcHRzLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc2VydmVkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGF5TXMgPiAwKSBhd2FpdCBzbGVlcChkZWxheU1zLCB0aGlzLnNpZ25hbCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFI1IGZvciBpZHMgYSBzdGFnZSBBRE9QVFMgYXQgcnVuIHRpbWUgKGEgcmV0dXJuZWQgU3RhZ2VOb2RlJ3MgYG5leHRgIGNoYWluLFxuICAgKiBgY2hpbGRyZW5gIGFuZCBzdWJmbG93IGlkcyk6IHRoZSBzYW1lIHJlZnVzYWwgdGhlIGJ1aWxkZXIncyBkb29ycyBhcHBseSDigJRcbiAgICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCDigJQgc28gXCJubyB1c2VyIGlkIGNhcnJpZXMgYVxuICAgKiBncmFtbWFyIGRlbGltaXRlclwiIHN0YXlzIHRydWUgYnkgY29uc3RydWN0aW9uLiBMb29wLXJlZiBzdHVicyAodGhleSBuYW1lIGFuXG4gICAqIGV4aXN0aW5nIG5vZGUpIGFuZCB0aGUgY2hhcnQncyBvd24gbm9kZXMgKGFkbWl0dGVkIGF0IGJ1aWxkOyBhIHByZWZpeGVkIGlkXG4gICAqIGNhcnJpZXMgYC9gIG9uIHB1cnBvc2UpIGFyZSBub3QgbmV3IGlkcyBhbmQgYXJlIHNraXBwZWQuIEEgc3ViZmxvd1xuICAgKiBkZWZpbml0aW9uJ3Mgb3duIHRyZWUgaXMgYSBidWlsdCBjaGFydCBhbmQgaXMgbm90IHdhbGtlZC5cbiAgICovXG4gIHByaXZhdGUgYWRtaXREeW5hbWljSWRzKG91dHB1dDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8ICFpc1N0YWdlTm9kZVJldHVybihvdXRwdXQpKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdCA9IG91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBjb25zdCByZWZ1c2UgPSAocmVmdXNhbDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIGR5bmFtaWMgU3RhZ2VOb2RlOiAke3JlZnVzYWx9YCk7XG4gICAgfTtcbiAgICBpZiAocm9vdC5zdWJmbG93SWQpIHJlZnVzZShyZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCByb290LnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtyb290Lm5leHQsIC4uLihyb290LmNoaWxkcmVuID8/IFtdKV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmICghbiB8fCBzZWVuLmhhcyhuKSB8fCBuLmlzTG9vcFJlZikgY29udGludWU7XG4gICAgICBzZWVuLmFkZChuKTtcbiAgICAgIGNvbnN0IHJlZnVzYWwgPVxuICAgICAgICByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN0YWdlIGlkJywgbi5pZCwgJ3N0YWdlJykgPz9cbiAgICAgICAgKG4uc3ViZmxvd0lkID8gcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgbi5zdWJmbG93SWQsICdzZWdtZW50JykgOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBPbmx5IGEgU1VTUEVDVCBpZCBwYXlzIGZvciB0aGUgY2hhcnQgbG9va3VwOiBhIGNoYXJ0IG5vZGUgKGFuZCB0aGVcbiAgICAgICAgLy8gY2hhcnQgYmVsb3cgaXQpIHdhcyBhZG1pdHRlZCBhdCBidWlsZC5cbiAgICAgICAgaWYgKHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuLmlkKSA9PT0gbikgY29udGludWU7XG4gICAgICAgIHJlZnVzZShyZWZ1c2FsKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnB1c2gobi5uZXh0LCAuLi4obi5jaGlsZHJlbiA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgcmV0cnlPbmAgZ2F0ZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgY291bnRzIGFzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuXG4gICAqICBwcmVkaWNhdGUgbXVzdCBuZXZlciB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGVuZGxlc3MgcmV0cnkgbG9vcC4gKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShcbiAgICBwb2xpY3k6IE5vbk51bGxhYmxlPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+WydyZXRyeSddPixcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghcG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcG9saWN5LnJldHJ5T24oZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAvLyBBIHByZWRpY2F0ZSBtYXkgcmV0aHJvdyB0aGUgc3RhZ2UncyBvd24gZXJyb3I6IHRoZSBsb2dnZXIgZ2V0cyB0aGUgc2VydmVkIGZvcm0uXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgcHJlZGljYXRlRXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW1wb2xpbmUgZHJpdmVyIOKAlCBwcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogUnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW4gYSBmbGF0IGxvb3A6IGV2ZXJ5XG4gICAqIFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2UsIGR5bmFtaWMgbmV4dCAvIGR5bmFtaWNcbiAgICogcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyIGRpc3BhdGNoKSBjb21lcyBiYWNrIGFzIGFcbiAgICogYENvbnRpbnVhdGlvbkhvcGAgYW5kIGlzIGZvbGxvd2VkIElURVJBVElWRUxZIOKAlCBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrXG4gICAqIG5vciB0aGUgcmV0YWluZWQgcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LlxuICAgKlxuICAgKiBSZWN1cnNpb24gcmVtYWlucyBPTkxZIGZvciB0cnVlIHRyZWUgbmVzdGluZyAoZWFjaCBnZXRzIGEgbmVzdGVkIGRyaXZlclxuICAgKiBjYWxsKTogZm9yayBjaGlsZHJlbiAoYENoaWxkcmVuRXhlY3V0b3JgKSwgc2VsZWN0b3IgYnJhbmNoZXMgKHBhcmFsbGVsXG4gICAqIGZhbi1vdXQpLCBkZWNpZGVyIGJyYW5jaCBkaXNwYXRjaCB3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGBuZXh0YFxuICAgKiAodGhlIGJyYW5jaCBtdXN0IGNvbXBsZXRlIEJFRk9SRSB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zKSwgYW5kXG4gICAqIHN1YmZsb3cgbW91bnRzIChmcmVzaCB0cmF2ZXJzZXI7IHRoZSBtb3VudCBmcmFtZSBzdGF5cyBpbiB0aGUgcGFyZW50KS5cbiAgICogYF9leGVjdXRlRGVwdGhgIHRoZXJlZm9yZSBjb3VudHMgY2hhcnQgQ09NUE9TSVRJT04gZGVwdGggb25seSwgZ3VhcmRlZFxuICAgKiBieSBgX21heERlcHRoYCAoZGVmYXVsdCBgTUFYX0VYRUNVVEVfREVQVEhgID0gNTAwKS5cbiAgICpcbiAgICogUGF1c2VTaWduYWw6IGEgZmxhdCBkZWNpZGVyIGRpc3BhdGNoIHJlY29yZHMgYW4gYEludm9rZXJTdGFtcGA7IGlmIHRoZVxuICAgKiBjb250aW51ZWQgY2hhaW4gbGF0ZXIgcGF1c2VzLCB0aGUgZHJpdmVyIHN0YW1wcyB0aGUgc2lnbmFsIGR1cmluZ1xuICAgKiB1bndpbmQg4oCUIHNhbWUgaW52b2tlciBjb250ZXh0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvXG4gICAqIHN0YW1wLCBpbm5lcm1vc3QgKG1vc3QgcmVjZW50IGRpc3BhdGNoKSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgZW5jbG9zaW5nPzogRW5jbG9zaW5nRnJhbWVzLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIERlcHRoIGlzIHRoZSBDQUxMIFBBVEgncyBuZXN0aW5nLCByZWFkIG9mZiB0aGUgY29udGV4dCB0aGlzIGRyaXZlciB3YXNcbiAgICAvLyBoYW5kZWQgKHNlZSBgX2ZyYW1lT2ZgKSDigJQgc2libGluZ3MgbmV2ZXIgY29uc3VtZSBpdC4gQSByZWFjaGVkIGNhcCBpcyBhXG4gICAgLy8gUlVOIGZhaWx1cmU6IGBvbkVycm9yYCBmaXJlcyBoZXJlIChubyBzdGFnZSByYW4gZm9yIHRoaXMgbm9kZSwgc28gbm9cbiAgICAvLyBzdGFnZSBjYXRjaCB3b3VsZCkgYW5kIGBDaGlsZHJlbkV4ZWN1dG9yYCByZXRocm93cyBpdCB3aGF0ZXZlciB0aGVcbiAgICAvLyBmYW4tb3V0J3MgZXJyb3IgbW9kZS5cbiAgICBjb25zdCBkZXB0aCA9IHRoaXMubmVzdGluZ0RlcHRoT2YoY29udGV4dCk7XG4gICAgaWYgKGRlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRyYXZlcnNhbERlcHRoRXJyb3IodGhpcy5fbWF4RGVwdGgsIG5vZGUubmFtZSk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgdGhyb3duVGV4dChlcnJvciksIGV4dHJhY3RFcnJvckluZm8oZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIEV2ZXJ5IGRyaXZlciByZW1lbWJlcnMgdGhlIG5vZGVzIGl0IHJhbi4gQSBkZWNpZGVyJ3MgQlJBTkNIIEZSQU1FXG4gICAgLy8gKGRlY2lkZXIgd2l0aCBpdHMgb3duIGBuZXh0YDsgYGVuY2xvc2luZ2AgPSB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnNcbiAgICAvLyBpdCBpcyBuZXN0ZWQgaW4gKyB0aGUgYG5leHRgIGNoYWlucyBvZiB0aGUgZGVjaWRlcnMgd2hvc2UgZnJhbWVzIGhvbGRcbiAgICAvLyBpdCkgTEVBVkVTIG9uIGEganVtcCBieSBpZCAoYSBgbG9vcGAgaG9wKSB0byBhIG5vZGUgdGhpcyBmcmFtZSBkaWQgbm90XG4gICAgLy8gcnVuIHRoYXQgaXMgZWl0aGVyIG9uZSBhbiBFTkNMT1NJTkcgZHJpdmVyIGFscmVhZHkgcmFuIChhIGxvb3AgYmFjaykgb3JcbiAgICAvLyBvbmUgb24gYW4gZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gKGEgZm9yd2FyZCBqdW1wIGludG8gdGhlXG4gICAgLy8gdGFpbCkg4oCUIHRoZSBob3AgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGRlY2lkZXIsIHdoaWNoIGZvbGxvd3MgaXQgZmxhdFxuICAgIC8vIGF0IGl0cyBvd24gbGV2ZWwgYW5kIHNraXBzIGl0cyBgbmV4dGAsIHNvIG5laXRoZXIgYSBsb29wIHN0YWNrcyBvbmVcbiAgICAvLyBmcmFtZSBwZXIgcGFzcyBub3IgYSB0YWlsIHJ1bnMgdHdpY2UuIEFueSBvdGhlciBqdW1wIChzaWRld2F5cyB0byBhXG4gICAgLy8gc2libGluZyBicmFuY2gpIHN0YXlzIGluIHRoZSBmcmFtZSwgYXMgdGhyb3VnaCA5LjM5LjAuXG4gICAgY29uc3QgcmFuSGVyZSA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IGZyYW1lOiBEcml2ZXJGcmFtZSA9IHtcbiAgICAgIGRlcHRoLFxuICAgICAgcmFuOiBlbmNsb3NpbmcgPyBbLi4uZW5jbG9zaW5nLnJhbiwgcmFuSGVyZV0gOiBbcmFuSGVyZV0sXG4gICAgICB0YWlsczogZW5jbG9zaW5nPy50YWlscyA/PyBbXSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lT2Yuc2V0KGN1cnJlbnQuY29udGV4dCwgZnJhbWUpO1xuICAgICAgICByYW5IZXJlLmFkZChjdXJyZW50Lm5vZGUuaWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5sb29wID09PSB0cnVlICYmICFyYW5IZXJlLmhhcyhyZXN1bHQubm9kZS5pZCkpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdC5ub2RlLmlkO1xuICAgICAgICAgIGNvbnN0IGhhcyA9IChpZHM6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4pID0+IGlkcy5oYXMoaWQpO1xuICAgICAgICAgIGlmIChlbmNsb3NpbmcucmFuLnNvbWUoaGFzKSB8fCBlbmNsb3NpbmcudGFpbHMuc29tZShoYXMpKSByZXR1cm4gcmVzdWx0OyAvLyB0aGUganVtcCBsZWF2ZXMgdGhpcyBmcmFtZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW52b2tlclN0YW1wKSAocGVuZGluZ0ludm9rZXJzID8/PSBbXSkucHVzaChyZXN1bHQuaW52b2tlclN0YW1wKTtcbiAgICAgICAgY3VycmVudCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gUmVwbGF5IGludm9rZXIgc3RhbXBzIG1vc3QtcmVjZW50LWZpcnN0LiBgc2V0SW52b2tlcmAgaXNcbiAgICAgIC8vIGZpcnN0LXdyaXRlLXdpbnMsIHNvIHRoZSBpbm5lcm1vc3QgZGlzcGF0Y2gncyBzdGFtcCBsYW5kcyDigJQgZXhhY3RseVxuICAgICAgLy8gdGhlIG9sZCBidWJibGUtdXAgb3JkZXIgdGhyb3VnaCBuZXN0ZWQgY2F0Y2ggZnJhbWVzLlxuICAgICAgaWYgKHBlbmRpbmdJbnZva2VycyAhPT0gdW5kZWZpbmVkICYmIGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBwZW5kaW5nSW52b2tlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKHBlbmRpbmdJbnZva2Vyc1tpXS5pbnZva2VyU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVzdGluZyBkZXB0aCBhIGRyaXZlciBoYW5kZWQgYGNvbnRleHRgIHJ1bnMgYXQ6IG9uZSBiZWxvdyB0aGVcbiAgICogZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0IHdhcyBjcmVhdGVkIGZyb20sIDEgYXQgdGhlIHRvcCAoYW5kIGZvclxuICAgKiBhIGNvbnRleHQgd2hvc2UgcGFyZW50IG5vIGRyaXZlciBvZiB0aGlzIHRyYXZlcnNlciByYW4g4oCUIGEgc3ViZmxvdydzXG4gICAqIHJvb3QsIGEgcmVzdW1lJ3Mgc3RhcnQpLiBSZWFkIGJ5IHRoZSBpbnN0cnVtZW50YXRpb24gaW5cbiAgICogYGJlbmNoL2RlcHRoLXByb2JlLnRzYCBhbmQgdGhlIHRyYW1wb2xpbmUgdGVzdHMuXG4gICAqL1xuICBwcml2YXRlIG5lc3RpbmdEZXB0aE9mKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgcmV0dXJuIChwYXJlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9mcmFtZU9mLmdldChwYXJlbnQpPy5kZXB0aCA/PyAwKSArIDE7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVycyBpdCBpc1xuICAgKiBuZXN0ZWQgaW4sIGFuZCBldmVyeSBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiBwbHVzIHRoaXMgb25lJ3MuXG4gICAqL1xuICBwcml2YXRlIGJyYW5jaEZyYW1lRm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgbmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBFbmNsb3NpbmdGcmFtZXMge1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5fZnJhbWVPZi5nZXQoY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmFuOiBvdXRlcj8ucmFuID8/IFtdLCB0YWlsczogWy4uLihvdXRlcj8udGFpbHMgPz8gW10pLCB0aGlzLnRhaWxJZHMobmV4dCldIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkcyBvbiBhIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4g4oCUIGBuZXh0YCwgaXRzIGBuZXh0YCwg4oCmIOKAlCB1cCB0byBhXG4gICAqIGxvb3AtcmVmIHN0dWIgKGEgYmFjay1lZGdlLCBub3QgdGhlIHRhaWwpLiBDYWNoZWQgcGVyIGNoYWluIGhlYWQuXG4gICAqL1xuICBwcml2YXRlIHRhaWxJZHMobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgaWRzID0gdGhpcy5fdGFpbElkcy5nZXQobmV4dCk7XG4gICAgaWYgKGlkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgZm9yIChsZXQgbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBuZXh0OyBuICYmICFuLmlzTG9vcFJlZiAmJiAhY2hhaW4uaGFzKG4uaWQpOyBuID0gbi5uZXh0KSB7XG4gICAgICAgIGNoYWluLmFkZChuLmlkKTtcbiAgICAgIH1cbiAgICAgIGlkcyA9IGNoYWluO1xuICAgICAgdGhpcy5fdGFpbElkcy5zZXQobmV4dCwgaWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGxvb3AgZWRnZSAoYSBgbG9vcFRvYCBzdHViIG9yIGEgYnktaWQgZHluYW1pYyBuZXh0KSBhbmQgaG9wIHRvXG4gICAqIGl0cyB0YXJnZXQuIFRoZSBob3AgaXMgZmxhZ2dlZCBgbG9vcGAgd2hlbiB0aGUgcmVzb2x2ZXIgZm9sbG93ZWQgYVxuICAgKiBiYWNrLXJlZmVyZW5jZSwgc28gYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcCB0aGF0IGxlYXZlc1xuICAgKiBpdCBmcm9tIG9uZSB0aGF0IHN0YXlzIGluc2lkZSBpdC5cbiAgICovXG4gIHByaXZhdGUgbG9vcEhvcChcbiAgICBsb29wUmVmOiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGxvb3BSZWYsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIGNvbnN0IGhvcCA9IHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlID09PSBsb29wUmVmID8gaG9wIDogeyAuLi5ob3AsIGxvb3A6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgZGVjaWRlcidzIG93biBgbmV4dGAgdGhlIHN0dWIgYGxvb3BUb2AgcGxhbnRlZCAob3IgYVxuICAgKiByZWZlcmVuY2Utb25seSBub2RlIOKAlCBubyBmbiwgbm8gY2hpbGRyZW4sIG5vIGRlY2lkZXIvc2VsZWN0b3IsIG5vdCBhXG4gICAqIHN1YmZsb3cgcm9vdCk/IFRoZSBzZWxlY3RvcidzIGFuZCB0aGUgbW91bnQncyBjb250aW51YXRpb24gYXNrXG4gICAqIGBpc0xvb3BSZWZgIGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdHViKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5leHQuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0KSAmJlxuICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0KT8ubGVuZ3RoICYmXG4gICAgICAgICFuZXh0LmRlY2lkZXJGbiAmJlxuICAgICAgICAhbmV4dC5zZWxlY3RvckZuICYmXG4gICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIE9ORSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzIOKAlCB0aGUgb2xkIHJlY3Vyc2l2ZSBgZXhlY3V0ZU5vZGVgXG4gICAqIGJvZHk7IG9ubHkgdGhlIHRhaWwgY2FsbHMgYmVjYW1lIGBDb250aW51YXRpb25Ib3BgIHJldHVybnMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUncyByZXN1bHQsIG9yIGEgaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AgdG8gZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZVN0ZXAoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAvLyBTdWJmbG93IG1ldGEgcmVhZHMgZ28gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5IOKAlCBhIG5vZGVcbiAgICAvLyBwYXRjaGVkIGJ5IGEgZHluYW1pYy1zdWJmbG93IHJldHVybiByZS1lbnRlcnMgZXhlY3V0ZU5vZGUgYW5kIG11c3RcbiAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgIGlmIChub2RlLmRlc2NyaXB0aW9uKSBjb250ZXh0LmRlc2NyaXB0aW9uID0gbm9kZS5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBlZmZTdWJmbG93SWQgPSB0aGlzLmVmZlN1YmZsb3dJZChub2RlKTtcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgLy8gKGJ1ZmZlcmVkIGJ5IHJ1bnRpbWVTdGFnZUlkKSBhbmQgZmxvdyBldmVudHMgKGZsdXNoZWQgYnkgdHJhdmVyc2FsQ29udGV4dC5ydW50aW1lU3RhZ2VJZClcbiAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChub2RlLmlkLCBpZHgpO1xuICAgIGNvbnRleHQuYmluZEVtaXRPcmlnaW4odGhpcy5ydW5JZCwgdGhpcy5lbWl0RHJpbGxQYXRoKTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFI1IGF0IHRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIHRoZSBidWlsZGVyXG4gICAgICAgIC8vIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXQgdGFrZXMgdGhlIHN0YWdlJ3NcbiAgICAgICAgLy8gZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNJZHMoc3RhZ2VPdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXVzZURhdGEpLFxuICAgICAgICAgICAgZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICByZXR1cm5lZER5bmFtaWNOb2RlID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIC8vIFJ1bnRpbWUgc3RydWN0dXJlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IGRpYWdub3N0aWMgdGV4dCBtYXkgYmVcbiAgICAgIC8vIG1hc2tlZCAob3IgdXNlci13cml0dGVuKSBhbmQgbXVzdCBuZXZlciBkZWNpZGUgY2FwdHVyZSBiZWhhdmlvci5cbiAgICAgIGlmIChyZXR1cm5lZER5bmFtaWNOb2RlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkgcmV0dXJuIHRoaXMubG9vcEhvcChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZToge30sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIC8vIFByZWZpeGVkIGxpa2UgdGhlIGJ1aWxkZXIncyBgX21vdW50U3ViZmxvd2AgKDkuMzcuMCBmaXgpOiB3aXRob3V0IGl0XG4gICAgICAgIC8vIGV2ZXJ5IGJyYW5jaCByYW4gaXRzIG5lc3RlZCBzdWJmbG93J3Mgc3RhZ2VzIHVuZGVyIE9ORSBpZC5cbiAgICAgICAgdGhpcy5zdWJmbG93c1tqb2luUGF0aChzdWJmbG93SWQsIGtleSldID0ge1xuICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBzdWJmbG93SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IFJVTiB0aW1lIChsYXp5IHN1YmZsb3dzLFxuICAgKiB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIG9mIGBhZGRQYXJhbGxlbEZvckVhY2hgKSDigJQgdGhlIG9uZSBwcmVmaXhlcixcbiAgICogYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AsIHdoaWNoIHRoZSBidWlsZGVyIGNhbGxzIGF0IG1vdW50IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19