semantifold 0.3.0 → 0.5.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 (303) hide show
  1. package/README.md +61 -15
  2. package/build/index.d.ts +52 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +60 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/android.d.ts +49 -0
  11. package/build/src/backends/android.d.ts.map +1 -0
  12. package/build/src/backends/android.js +1274 -0
  13. package/build/src/backends/c-validation.d.ts.map +1 -1
  14. package/build/src/backends/c-validation.js +7 -3
  15. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  16. package/build/src/backends/cpp-validation.js +7 -3
  17. package/build/src/backends/csharp.js +7 -1
  18. package/build/src/backends/dart-runtime.d.ts +2 -0
  19. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  20. package/build/src/backends/dart-runtime.js +41 -0
  21. package/build/src/backends/dart.d.ts +20 -0
  22. package/build/src/backends/dart.d.ts.map +1 -0
  23. package/build/src/backends/dart.js +321 -0
  24. package/build/src/backends/effects.d.ts +60 -0
  25. package/build/src/backends/effects.d.ts.map +1 -0
  26. package/build/src/backends/effects.js +746 -0
  27. package/build/src/backends/go.js +18 -4
  28. package/build/src/backends/identifiers.d.ts +36 -4
  29. package/build/src/backends/identifiers.d.ts.map +1 -1
  30. package/build/src/backends/identifiers.js +160 -10
  31. package/build/src/backends/index.d.ts.map +1 -1
  32. package/build/src/backends/index.js +27 -4
  33. package/build/src/backends/ios.d.ts +68 -0
  34. package/build/src/backends/ios.d.ts.map +1 -0
  35. package/build/src/backends/ios.js +1503 -0
  36. package/build/src/backends/java.d.ts.map +1 -1
  37. package/build/src/backends/java.js +429 -36
  38. package/build/src/backends/javascript.d.ts +6 -0
  39. package/build/src/backends/javascript.d.ts.map +1 -1
  40. package/build/src/backends/javascript.js +380 -24
  41. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  42. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  43. package/build/src/backends/kotlin-runtime.js +29 -0
  44. package/build/src/backends/kotlin.d.ts +33 -0
  45. package/build/src/backends/kotlin.d.ts.map +1 -0
  46. package/build/src/backends/kotlin.js +138 -0
  47. package/build/src/backends/native-validation.d.ts +2 -2
  48. package/build/src/backends/native-validation.d.ts.map +1 -1
  49. package/build/src/backends/native-validation.js +2 -2
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  51. package/build/src/backends/ordered-expressions.js +39 -7
  52. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  53. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  54. package/build/src/backends/php-stdlib-support.js +227 -0
  55. package/build/src/backends/php.d.ts.map +1 -1
  56. package/build/src/backends/php.js +448 -33
  57. package/build/src/backends/program.d.ts +83 -0
  58. package/build/src/backends/program.d.ts.map +1 -0
  59. package/build/src/backends/program.js +1309 -0
  60. package/build/src/backends/python.js +7 -1
  61. package/build/src/backends/ruby.d.ts.map +1 -1
  62. package/build/src/backends/ruby.js +310 -24
  63. package/build/src/backends/rust-runtime.d.ts +7 -0
  64. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  65. package/build/src/backends/rust-runtime.js +32 -0
  66. package/build/src/backends/rust-validation.d.ts +9 -0
  67. package/build/src/backends/rust-validation.d.ts.map +1 -0
  68. package/build/src/backends/rust-validation.js +78 -0
  69. package/build/src/backends/rust.d.ts +24 -0
  70. package/build/src/backends/rust.d.ts.map +1 -0
  71. package/build/src/backends/rust.js +344 -0
  72. package/build/src/backends/scalars.d.ts +14 -6
  73. package/build/src/backends/scalars.d.ts.map +1 -1
  74. package/build/src/backends/scalars.js +167 -17
  75. package/build/src/backends/shared.d.ts +23 -4
  76. package/build/src/backends/shared.d.ts.map +1 -1
  77. package/build/src/backends/shared.js +2174 -62
  78. package/build/src/backends/stdlib-support.d.ts +14 -0
  79. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  80. package/build/src/backends/stdlib-support.js +237 -0
  81. package/build/src/backends/swift-runtime.d.ts +3 -0
  82. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  83. package/build/src/backends/swift-runtime.js +14 -0
  84. package/build/src/backends/swift.d.ts +8 -0
  85. package/build/src/backends/swift.d.ts.map +1 -0
  86. package/build/src/backends/swift.js +127 -0
  87. package/build/src/backends/typescript.d.ts.map +1 -1
  88. package/build/src/backends/typescript.js +344 -24
  89. package/build/src/backends/wasm.d.ts +43 -0
  90. package/build/src/backends/wasm.d.ts.map +1 -0
  91. package/build/src/backends/wasm.js +2164 -0
  92. package/build/src/backends/writer.d.ts +255 -4
  93. package/build/src/backends/writer.d.ts.map +1 -1
  94. package/build/src/backends/writer.js +491 -3
  95. package/build/src/diagnostic.d.ts +4 -3
  96. package/build/src/diagnostic.d.ts.map +1 -1
  97. package/build/src/diagnostic.js +5 -3
  98. package/build/src/frontends/c.d.ts.map +1 -1
  99. package/build/src/frontends/c.js +5 -3
  100. package/build/src/frontends/cpp.d.ts.map +1 -1
  101. package/build/src/frontends/cpp.js +5 -3
  102. package/build/src/frontends/csharp.d.ts.map +1 -1
  103. package/build/src/frontends/csharp.js +7 -3
  104. package/build/src/frontends/dart.d.ts +10 -0
  105. package/build/src/frontends/dart.d.ts.map +1 -0
  106. package/build/src/frontends/dart.js +913 -0
  107. package/build/src/frontends/index.d.ts +3 -1
  108. package/build/src/frontends/index.d.ts.map +1 -1
  109. package/build/src/frontends/index.js +15 -5
  110. package/build/src/frontends/java.d.ts +110 -1
  111. package/build/src/frontends/java.d.ts.map +1 -1
  112. package/build/src/frontends/java.js +1725 -70
  113. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  114. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  115. package/build/src/frontends/javascript-typescript.js +1825 -93
  116. package/build/src/frontends/kotlin.d.ts +10 -0
  117. package/build/src/frontends/kotlin.d.ts.map +1 -0
  118. package/build/src/frontends/kotlin.js +685 -0
  119. package/build/src/frontends/php.d.ts +118 -1
  120. package/build/src/frontends/php.d.ts.map +1 -1
  121. package/build/src/frontends/php.js +1583 -76
  122. package/build/src/frontends/program.d.ts +74 -0
  123. package/build/src/frontends/program.d.ts.map +1 -0
  124. package/build/src/frontends/program.js +989 -0
  125. package/build/src/frontends/ruby.d.ts +68 -1
  126. package/build/src/frontends/ruby.d.ts.map +1 -1
  127. package/build/src/frontends/ruby.js +1446 -101
  128. package/build/src/frontends/rust-parser.d.ts +11 -0
  129. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  130. package/build/src/frontends/rust-parser.js +15 -0
  131. package/build/src/frontends/rust.d.ts +14 -0
  132. package/build/src/frontends/rust.d.ts.map +1 -0
  133. package/build/src/frontends/rust.js +715 -0
  134. package/build/src/frontends/scalars.d.ts +10 -0
  135. package/build/src/frontends/scalars.d.ts.map +1 -1
  136. package/build/src/frontends/scalars.js +28 -2
  137. package/build/src/frontends/swift.d.ts +10 -0
  138. package/build/src/frontends/swift.d.ts.map +1 -0
  139. package/build/src/frontends/swift.js +860 -0
  140. package/build/src/frontends/types.d.ts +186 -0
  141. package/build/src/frontends/types.d.ts.map +1 -0
  142. package/build/src/frontends/types.js +634 -0
  143. package/build/src/language-registry.d.ts +46 -4
  144. package/build/src/language-registry.d.ts.map +1 -1
  145. package/build/src/language-registry.js +177 -13
  146. package/build/src/mapping.d.ts +2 -2
  147. package/build/src/mapping.d.ts.map +1 -1
  148. package/build/src/mapping.js +31 -10
  149. package/build/src/semantic/capabilities.d.ts +66 -0
  150. package/build/src/semantic/capabilities.d.ts.map +1 -0
  151. package/build/src/semantic/capabilities.js +649 -0
  152. package/build/src/semantic/effects.d.ts +26 -0
  153. package/build/src/semantic/effects.d.ts.map +1 -0
  154. package/build/src/semantic/effects.js +764 -0
  155. package/build/src/semantic/generics.d.ts +23 -0
  156. package/build/src/semantic/generics.d.ts.map +1 -0
  157. package/build/src/semantic/generics.js +61 -0
  158. package/build/src/semantic/lifetime.d.ts +37 -0
  159. package/build/src/semantic/lifetime.d.ts.map +1 -0
  160. package/build/src/semantic/lifetime.js +527 -0
  161. package/build/src/semantic/provenance.d.ts +9 -2
  162. package/build/src/semantic/provenance.d.ts.map +1 -1
  163. package/build/src/semantic/provenance.js +462 -20
  164. package/build/src/semantic/scalars.d.ts +11 -0
  165. package/build/src/semantic/scalars.d.ts.map +1 -1
  166. package/build/src/semantic/scalars.js +16 -1
  167. package/build/src/semantic/stdlib.d.ts +254 -0
  168. package/build/src/semantic/stdlib.d.ts.map +1 -0
  169. package/build/src/semantic/stdlib.js +880 -0
  170. package/build/src/semantic/types.d.ts +3108 -178
  171. package/build/src/semantic/types.d.ts.map +1 -1
  172. package/build/src/semantic/types.js +730 -15
  173. package/build/src/semantic/validate.d.ts +85 -5
  174. package/build/src/semantic/validate.d.ts.map +1 -1
  175. package/build/src/semantic/validate.js +2576 -98
  176. package/build/src/stdlib-facades.d.ts +304 -0
  177. package/build/src/stdlib-facades.d.ts.map +1 -0
  178. package/build/src/stdlib-facades.js +1167 -0
  179. package/build/src/stdlib-negotiation.d.ts +69 -0
  180. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  181. package/build/src/stdlib-negotiation.js +403 -0
  182. package/build/src/stdlib-providers.d.ts +72 -0
  183. package/build/src/stdlib-providers.d.ts.map +1 -0
  184. package/build/src/stdlib-providers.js +339 -0
  185. package/build/src/toolchains.d.ts +55 -1
  186. package/build/src/toolchains.d.ts.map +1 -1
  187. package/build/src/toolchains.js +15 -4
  188. package/docs/android.md +79 -0
  189. package/docs/architecture.md +47 -13
  190. package/docs/dart.md +60 -0
  191. package/docs/goals.md +3 -3
  192. package/docs/ios.md +121 -0
  193. package/docs/kotlin.md +42 -0
  194. package/docs/language-support.md +238 -26
  195. package/docs/multi-file-modules.md +52 -0
  196. package/docs/parser-qualification.md +121 -8
  197. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  198. package/docs/rust.md +88 -0
  199. package/docs/source-maps.md +17 -7
  200. package/docs/specification.md +5 -0
  201. package/docs/standard-library-portability.md +39 -8
  202. package/docs/swift.md +44 -0
  203. package/docs/testing.md +381 -4
  204. package/docs/webassembly.md +52 -0
  205. package/index.js +66 -8
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  236. package/package.json +5 -2
  237. package/src/artifact-path.js +47 -2
  238. package/src/artifacts.js +67 -0
  239. package/src/backends/android.js +1370 -0
  240. package/src/backends/c-validation.js +6 -1
  241. package/src/backends/cpp-validation.js +6 -1
  242. package/src/backends/csharp.js +3 -0
  243. package/src/backends/dart-runtime.js +41 -0
  244. package/src/backends/dart.js +326 -0
  245. package/src/backends/effects.js +705 -0
  246. package/src/backends/go.js +14 -2
  247. package/src/backends/identifiers.js +166 -9
  248. package/src/backends/index.js +27 -2
  249. package/src/backends/ios.js +1612 -0
  250. package/src/backends/java.js +454 -36
  251. package/src/backends/javascript.js +389 -23
  252. package/src/backends/kotlin-runtime.js +29 -0
  253. package/src/backends/kotlin.js +144 -0
  254. package/src/backends/native-validation.js +1 -1
  255. package/src/backends/ordered-expressions.js +40 -6
  256. package/src/backends/php-stdlib-support.js +239 -0
  257. package/src/backends/php.js +469 -32
  258. package/src/backends/program.js +1408 -0
  259. package/src/backends/python.js +3 -0
  260. package/src/backends/ruby.js +326 -23
  261. package/src/backends/rust-runtime.js +34 -0
  262. package/src/backends/rust-validation.js +75 -0
  263. package/src/backends/rust.js +335 -0
  264. package/src/backends/scalars.js +141 -16
  265. package/src/backends/shared.js +2314 -115
  266. package/src/backends/stdlib-support.js +234 -0
  267. package/src/backends/swift-runtime.js +14 -0
  268. package/src/backends/swift.js +132 -0
  269. package/src/backends/typescript.js +349 -23
  270. package/src/backends/wasm.js +2208 -0
  271. package/src/backends/writer.js +545 -2
  272. package/src/diagnostic.js +4 -2
  273. package/src/frontends/c.js +4 -2
  274. package/src/frontends/cpp.js +4 -2
  275. package/src/frontends/csharp.js +4 -2
  276. package/src/frontends/dart.js +963 -0
  277. package/src/frontends/index.js +14 -4
  278. package/src/frontends/java.js +1977 -69
  279. package/src/frontends/javascript-typescript.js +2046 -102
  280. package/src/frontends/kotlin.js +713 -0
  281. package/src/frontends/php.js +1725 -79
  282. package/src/frontends/program.js +1062 -0
  283. package/src/frontends/ruby.js +1624 -98
  284. package/src/frontends/rust-parser.js +18 -0
  285. package/src/frontends/rust.js +714 -0
  286. package/src/frontends/scalars.js +31 -1
  287. package/src/frontends/swift.js +893 -0
  288. package/src/frontends/types.js +750 -0
  289. package/src/language-registry.js +182 -12
  290. package/src/mapping.js +33 -9
  291. package/src/semantic/capabilities.js +671 -0
  292. package/src/semantic/effects.js +737 -0
  293. package/src/semantic/generics.js +58 -0
  294. package/src/semantic/lifetime.js +517 -0
  295. package/src/semantic/provenance.js +412 -19
  296. package/src/semantic/scalars.js +17 -0
  297. package/src/semantic/stdlib.js +921 -0
  298. package/src/semantic/types.js +810 -14
  299. package/src/semantic/validate.js +2934 -209
  300. package/src/stdlib-facades.js +1211 -0
  301. package/src/stdlib-negotiation.js +446 -0
  302. package/src/stdlib-providers.js +377 -0
  303. package/src/toolchains.js +16 -3
@@ -1,20 +1,127 @@
1
1
  // @ts-check
2
2
  import { createGenerationIndex } from "../semantic/provenance.js";
3
+ /**
4
+ * Collects every caller-controlled binding spelling before synthetic names are chosen.
5
+ * @param {unknown} root - Semantic graph.
6
+ * @returns {Set<string>} Used source names.
7
+ */
8
+ function collectBindingNames(root) {
9
+ const names = new Set();
10
+ const pending = [root];
11
+ const seen = new Set();
12
+ while (pending.length > 0) {
13
+ const value = pending.pop();
14
+ if (!value || typeof value != "object" || seen.has(value))
15
+ continue;
16
+ seen.add(value);
17
+ if (!Array.isArray(value) && typeof Reflect.get(value, "name") == "string")
18
+ names.add(Reflect.get(value, "name"));
19
+ for (const child of Array.isArray(value) ? value : Object.values(value)) {
20
+ if (child && typeof child == "object")
21
+ pending.push(child);
22
+ }
23
+ }
24
+ return names;
25
+ }
26
+ /**
27
+ * Converts a logical module identity to its canonical target type segment.
28
+ * @param {string} id - Logical module identity.
29
+ * @returns {string} Portable target class/module name.
30
+ */
31
+ function moduleClassName(id) {
32
+ return id.split(/[._-]+/u).map((part) => `${part[0].toUpperCase()}${part.slice(1)}`).join("");
33
+ }
34
+ /**
35
+ * Looks up one declaration name in its owning program module.
36
+ * @param {Partial<import("../semantic/types.js").SemanticProgramModule>} module - Owning module.
37
+ * @param {string} declarationId - Stable declaration identity.
38
+ * @returns {string} Declaration name.
39
+ */
40
+ function declarationName(module, declarationId) {
41
+ const declaration = [...module.functions ?? [], ...module.records ?? [], ...module.classes ?? [], ...module.errors ?? []]
42
+ .find(({ id }) => id == declarationId);
43
+ if (!declaration)
44
+ throw new RangeError(`Unknown program declaration '${declarationId}'.`);
45
+ return declaration.name;
46
+ }
47
+ /**
48
+ * Chooses an unqualified target binding without treating a source-profile qualifier as semantic identity.
49
+ * @param {import("../semantic/types.js").SemanticProgram} program - Owning program.
50
+ * @param {import("../semantic/types.js").SemanticProgramModule} module - Importing module.
51
+ * @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
52
+ * @returns {string} Target-local binding spelling.
53
+ */
54
+ export function programImportName(program, module, imported) {
55
+ const source = program.sources.find(({ filename }) => filename == module.sourceFilename);
56
+ if (!source)
57
+ throw new RangeError(`Program module '${module.id}' has no registered source.`);
58
+ return source.language == "ruby" || source.language == "java" ? imported.importedName : imported.localName;
59
+ }
3
60
  /** Source-aware deterministic generated-output builder. */
4
61
  export class SourceWriter {
5
62
  /**
6
63
  * Creates a source-aware writer.
7
64
  * @param {object} options - Writer options.
8
65
  * @param {string} options.filename - Output filename.
9
- * @param {import("../semantic/types.js").SemanticLanguage} options.language - Output language.
66
+ * @param {import("../semantic/types.js").GeneratedTextLanguage} options.language - Output text language.
10
67
  * @param {import("../semantic/types.js").SemanticModule} options.module - Semantic module.
68
+ * @param {import("../semantic/types.js").SemanticProgram} [options.program] - Owning multi-file program.
69
+ * @param {Map<string, string>} [options.programPaths] - Planned artifact path by module identity.
11
70
  * @param {{filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]} [options.sources] - Caller-provided sources.
71
+ * @param {Record<string, string>} [options.stdlibProviderEntries] - Used operation to protected native entry for a linked stdlib provider.
72
+ * @param {string} [options.stdlibProviderPath] - Planned stdlib provider artifact path.
73
+ * @param {string[]} [options.stdlibProviderPaths] - Planned stdlib provider artifact paths.
74
+ * @param {string[]} [options.stdlibProviderImports] - Ordered provider names this module must import.
75
+ * @param {string} [options.stdlibProviderOwnerModule] - Java owner module identity hosting the shared support block and shims.
76
+ * @param {string[]} [options.stdlibProviderShims] - Java owner program-wide used operations exposed as public static shims.
77
+ * @param {(expression: import("../semantic/types.js").CallExpression) => string} [options.callNameResolver] - Target-container call spelling override.
78
+ * @param {string} [options.callArgumentSuffix] - Synthetic trailing argument for every semantic function call.
79
+ * @param {boolean} [options.methodStringEquality] - Emit string equality through the platform String method.
12
80
  */
13
- constructor({ filename, language, module, sources }) {
81
+ constructor({ callArgumentSuffix, callNameResolver, filename, language, methodStringEquality, module, program, programPaths, sources, stdlibProviderEntries, stdlibProviderPath, stdlibProviderPaths, stdlibProviderImports, stdlibProviderOwnerModule, stdlibProviderShims }) {
14
82
  const index = createGenerationIndex(module, sources);
15
83
  this.filename = filename;
16
84
  this.language = language;
85
+ this.module = module;
86
+ this.program = program;
87
+ this.programPaths = programPaths;
88
+ this.callArgumentSuffix = callArgumentSuffix;
89
+ this.callNameResolver = callNameResolver;
90
+ this.methodStringEquality = methodStringEquality ?? false;
17
91
  this.index = index;
92
+ this.stdlibProviderEntries = stdlibProviderEntries;
93
+ this.stdlibProviderPath = stdlibProviderPath;
94
+ this.stdlibProviderPaths = stdlibProviderPaths ?? (stdlibProviderPath ? [stdlibProviderPath] : undefined);
95
+ this.stdlibProviderImports = stdlibProviderImports;
96
+ this.stdlibProviderOwnerModule = stdlibProviderOwnerModule;
97
+ this.stdlibProviderShims = stdlibProviderShims;
98
+ const programRecords = program?.modules.flatMap((programModule) => programModule.records ?? []) ?? module.records ?? [];
99
+ const programClasses = program?.modules.flatMap((programModule) => programModule.classes ?? []) ?? module.classes ?? [];
100
+ const capabilityFailures = module.capabilities?.flatMap(({ failures }) => failures) ?? [];
101
+ const programErrors = program?.modules.flatMap((programModule) => [
102
+ ...(programModule.errors ?? []),
103
+ ...(programModule.capabilities?.flatMap(({ failures }) => failures) ?? [])
104
+ ]) ?? [...module.errors ?? [], ...capabilityFailures];
105
+ const programFunctions = program?.modules.flatMap((programModule) => programModule.functions) ?? module.functions;
106
+ this.records = new Map(programRecords.map((record) => [record.id, record]));
107
+ this.classes = new Map(programClasses.map((declaration) => [declaration.id, declaration]));
108
+ this.errors = new Map(programErrors.map((error) => [error.id, error]));
109
+ this.resources = new Map((module.capabilities?.flatMap(({ resources }) => resources) ?? []).map((resource) => [resource.id, resource]));
110
+ this.effectOperations = new Map((module.capabilities?.flatMap(({ operations }) => operations) ?? []).map((operation) => [operation.id, operation]));
111
+ this.effectOperationModules = new Map((module.capabilities?.flatMap((capability) => capability.operations.map((operation) => [operation.id, capability.authorityId])) ?? []));
112
+ this.fields = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, field])));
113
+ this.fieldRecords = new Map(programRecords.flatMap((record) => record.fields.map((field) => [field.id, record])));
114
+ this.privateFields = new Map(programClasses.flatMap((declaration) => declaration.fields.map((field) => [field.id, field])));
115
+ this.methods = new Map(programClasses.flatMap((declaration) => declaration.methods.map((method) => [method.id, method])));
116
+ this.typeParameters = new Map([...programRecords, ...programFunctions].flatMap((declaration) => (declaration.typeParameters ?? []).map((parameter) => [parameter.id, parameter])));
117
+ this.referenceClassEmissionDepth = 0;
118
+ /** @type {Map<string, import("../semantic/types.js").SemanticProgramModule>} */
119
+ this.declarationModules = new Map(program?.modules.flatMap((programModule) => [
120
+ ...(programModule.records ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
121
+ ...(programModule.classes ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
122
+ ...(programModule.errors ?? []).map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule])),
123
+ ...programModule.functions.map((declaration) => /** @type {const} */ ([/** @type {string} */ (declaration.id), programModule]))
124
+ ]) ?? []);
18
125
  /** @type {string[]} */
19
126
  this.parts = [];
20
127
  /** @type {import("../semantic/types.js").SemantifoldMappingSpan[]} */
@@ -22,6 +129,63 @@ export class SourceWriter {
22
129
  this.offset = 0;
23
130
  this.line = 1;
24
131
  this.column = 1;
132
+ /** @type {Map<import("../semantic/types.js").Expression, string>} */
133
+ this.effectTemporaryNames = new Map();
134
+ /** @type {Map<import("../semantic/types.js").Expression, string>} */
135
+ this.effectReplacementNames = new Map();
136
+ /** @type {import("../semantic/types.js").Expression | undefined} */
137
+ this.effectDefinition = undefined;
138
+ this.usedBindingNames = collectBindingNames(module);
139
+ }
140
+ /**
141
+ * Installs the effect expressions lowered immediately before the current statement.
142
+ * @param {import("../semantic/types.js").Expression[]} expressions - Ordered expressions.
143
+ * @returns {void}
144
+ */
145
+ planEffectReplacements(expressions) {
146
+ this.effectReplacementNames = new Map(expressions.map((expression) => [expression, this.effectTemporaryName(expression)]));
147
+ }
148
+ /**
149
+ * Allocates a collision-safe name for one deterministic effect site.
150
+ * @param {import("../semantic/types.js").Expression} expression - Effectful expression.
151
+ * @returns {string} Stable temporary name.
152
+ */
153
+ effectTemporaryName(expression) {
154
+ const known = this.effectTemporaryNames.get(expression);
155
+ if (known)
156
+ return known;
157
+ const site = typeof Reflect.get(expression, "effectSiteId") == "string"
158
+ ? Reflect.get(expression, "effectSiteId").slice("effect:".length) : String(this.effectTemporaryNames.size);
159
+ let name = `__semantifold_effect_${site}`;
160
+ while (this.usedBindingNames.has(name))
161
+ name = `${name}_`;
162
+ this.usedBindingNames.add(name);
163
+ this.effectTemporaryNames.set(expression, name);
164
+ return name;
165
+ }
166
+ /**
167
+ * Returns the planned temporary replacement outside its own definition.
168
+ * @param {import("../semantic/types.js").Expression} expression - Candidate expression.
169
+ * @returns {string | undefined} Temporary name.
170
+ */
171
+ effectReplacementName(expression) {
172
+ return this.effectDefinition === expression ? undefined : this.effectReplacementNames.get(expression);
173
+ }
174
+ /**
175
+ * Emits one effect definition without recursively replacing itself.
176
+ * @param {import("../semantic/types.js").Expression} expression - Defined expression.
177
+ * @param {() => void} emit - Target expression emitter.
178
+ * @returns {void}
179
+ */
180
+ emitEffectDefinition(expression, emit) {
181
+ const previous = this.effectDefinition;
182
+ this.effectDefinition = expression;
183
+ try {
184
+ emit();
185
+ }
186
+ finally {
187
+ this.effectDefinition = previous;
188
+ }
25
189
  }
26
190
  /**
27
191
  * Returns generated content so far.
@@ -38,6 +202,330 @@ export class SourceWriter {
38
202
  occurrencePath(node) {
39
203
  return this.index.recordFor(node).path;
40
204
  }
205
+ /**
206
+ * Resolves a validated nominal declaration identity for target emission.
207
+ * @param {string} declarationId - Semantic record identity.
208
+ * @returns {import("../semantic/types.js").RecordDeclaration} Record declaration.
209
+ */
210
+ recordForId(declarationId) {
211
+ const record = this.records.get(declarationId);
212
+ if (!record)
213
+ throw new RangeError(`Unknown validated record identity '${declarationId}'.`);
214
+ return record;
215
+ }
216
+ /**
217
+ * Returns the target spelling for a nominal record identity.
218
+ * @param {string} declarationId - Stable record declaration identity.
219
+ * @param {boolean} [valuePosition] - Whether the binding must exist at runtime.
220
+ * @returns {string} Target record spelling.
221
+ */
222
+ recordNameForId(declarationId, valuePosition = false) {
223
+ const record = this.recordForId(declarationId);
224
+ const owner = this.declarationModules.get(declarationId);
225
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId && (!valuePosition || !item.typeOnly));
226
+ if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
227
+ return `${moduleClassName(owner.id)}::${record.name}`;
228
+ }
229
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
230
+ return this.importNameFor(imported);
231
+ }
232
+ return record.name;
233
+ }
234
+ /**
235
+ * Resolves one validated reference class.
236
+ * @param {string} declarationId - Stable class identity.
237
+ * @returns {import("../semantic/types.js").ClassDeclaration} Class declaration.
238
+ */
239
+ classForId(declarationId) {
240
+ const declaration = this.classes.get(declarationId);
241
+ if (!declaration)
242
+ throw new RangeError(`Unknown validated reference class identity '${declarationId}'.`);
243
+ return declaration;
244
+ }
245
+ /**
246
+ * Returns the target spelling of one reference class.
247
+ * @param {string} declarationId - Stable class identity.
248
+ * @returns {string} Target spelling.
249
+ */
250
+ classNameForId(declarationId) {
251
+ const declaration = this.classForId(declarationId);
252
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
253
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
254
+ return this.importNameFor(imported);
255
+ }
256
+ return declaration.name;
257
+ }
258
+ /**
259
+ * Resolves one validated owned-resource declaration.
260
+ * @param {string} resourceId - Stable resource identity.
261
+ * @returns {import("../semantic/types.js").EffectResourceDeclaration} Resource declaration.
262
+ */
263
+ resourceForId(resourceId) {
264
+ const resource = this.resources.get(resourceId);
265
+ if (!resource)
266
+ throw new RangeError(`Unknown validated resource identity '${resourceId}'.`);
267
+ return resource;
268
+ }
269
+ /**
270
+ * Resolves one validated capability operation declaration.
271
+ * @param {string} operationId - Stable operation identity.
272
+ * @returns {import("../semantic/types.js").EffectOperationDeclaration} Operation declaration.
273
+ */
274
+ effectOperationForId(operationId) {
275
+ const operation = this.effectOperations.get(operationId);
276
+ if (!operation)
277
+ throw new RangeError(`Unknown validated effect operation identity '${operationId}'.`);
278
+ return operation;
279
+ }
280
+ /**
281
+ * Resolves one validated private field.
282
+ * @param {string} fieldId - Stable private-field identity.
283
+ * @returns {import("../semantic/types.js").PrivateField} Field declaration.
284
+ */
285
+ privateFieldForId(fieldId) {
286
+ const field = this.privateFields.get(fieldId);
287
+ if (!field)
288
+ throw new RangeError(`Unknown validated private field identity '${fieldId}'.`);
289
+ return field;
290
+ }
291
+ /**
292
+ * Resolves one validated receiver method.
293
+ * @param {string} methodId - Stable method identity.
294
+ * @returns {import("../semantic/types.js").MethodDeclaration} Method declaration.
295
+ */
296
+ methodForId(methodId) {
297
+ const method = this.methods.get(methodId);
298
+ if (!method)
299
+ throw new RangeError(`Unknown validated method identity '${methodId}'.`);
300
+ return method;
301
+ }
302
+ /**
303
+ * Resolves one validated declaration-scoped type parameter.
304
+ * @param {string} parameterId - Stable type-parameter identity.
305
+ * @returns {import("../semantic/types.js").TypeParameter} Type parameter.
306
+ */
307
+ typeParameterForId(parameterId) {
308
+ const parameter = this.typeParameters.get(parameterId);
309
+ if (!parameter)
310
+ throw new RangeError(`Unknown validated type parameter identity '${parameterId}'.`);
311
+ return parameter;
312
+ }
313
+ /**
314
+ * Returns the validated nominal error declaration for an identity.
315
+ * @param {string} declarationId - Stable error identity.
316
+ * @returns {import("../semantic/types.js").ErrorDeclaration | import("../semantic/types.js").EffectFailureDeclaration} Error declaration.
317
+ */
318
+ errorForId(declarationId) {
319
+ const error = this.errors.get(declarationId);
320
+ if (!error)
321
+ throw new RangeError(`Unknown validated error identity '${declarationId}'.`);
322
+ return error;
323
+ }
324
+ /**
325
+ * Returns the target-visible spelling for one nominal error identity.
326
+ * @param {string} declarationId - Stable error identity.
327
+ * @returns {string} Target-visible name.
328
+ */
329
+ errorNameForId(declarationId) {
330
+ const error = this.errorForId(declarationId);
331
+ const owner = this.declarationModules.get(declarationId);
332
+ const imported = this.#programModule()?.imports.find((item) => item.declarationId == declarationId);
333
+ if (this.program && owner && owner.id != Reflect.get(this.module, "id") && this.language == "ruby") {
334
+ return `${moduleClassName(owner.id)}::${error.name}`;
335
+ }
336
+ if (imported && (this.language == "javascript" || this.language == "typescript" || this.language == "php")) {
337
+ return this.importNameFor(imported);
338
+ }
339
+ return owner ? error.name : this.capabilityNominalName(error.name);
340
+ }
341
+ /**
342
+ * Returns the target spelling for a nominal name owned by a compiler-authorized capability.
343
+ * PHP program entries live in a generated namespace while stdlib provider classes remain
344
+ * global, so PHP program mode fully qualifies capability names.
345
+ * @param {string} name - Declared nominal name.
346
+ * @returns {string} Target spelling.
347
+ */
348
+ capabilityNominalName(name) {
349
+ return this.program && this.language == "php" ? `\\${name}` : name;
350
+ }
351
+ /**
352
+ * Returns the target spelling for a resolved function call.
353
+ * @param {import("../semantic/types.js").CallExpression} expression - Resolved call.
354
+ * @returns {string} Target call name.
355
+ */
356
+ callNameFor(expression) {
357
+ if (this.callNameResolver)
358
+ return this.callNameResolver(expression);
359
+ const declarationId = expression.resolution?.declarationId;
360
+ const owner = declarationId ? this.declarationModules.get(declarationId) : undefined;
361
+ const imported = declarationId ? this.#programModule()?.imports.find((item) => item.declarationId == declarationId) : undefined;
362
+ if (this.language == "java" && !this.program && this.referenceClassEmissionDepth > 0)
363
+ return `Main.${expression.callee}`;
364
+ if (!declarationId || !this.program || !owner || owner.id == Reflect.get(this.module, "id"))
365
+ return expression.callee;
366
+ if (this.language == "ruby" || this.language == "java")
367
+ return `${moduleClassName(owner.id)}.${declarationName(owner, declarationId)}`;
368
+ if (imported)
369
+ return this.importNameFor(imported);
370
+ return declarationName(owner, declarationId);
371
+ }
372
+ /**
373
+ * Returns a target-container trailing argument for a semantic call.
374
+ * @param {import("../semantic/types.js").CallExpression} _expression - Resolved semantic call.
375
+ * @returns {string | undefined} Synthetic argument spelling, when configured.
376
+ */
377
+ callArgumentSuffixFor(_expression) {
378
+ return this.callArgumentSuffix;
379
+ }
380
+ /**
381
+ * Reports whether string equality must avoid a target runtime helper.
382
+ * @returns {boolean} Whether to emit the platform String method.
383
+ */
384
+ usesMethodStringEquality() {
385
+ return this.methodStringEquality;
386
+ }
387
+ /** Marks emission as occurring inside one top-level reference class. */
388
+ beginReferenceClassEmission() {
389
+ this.referenceClassEmissionDepth += 1;
390
+ }
391
+ /** Ends one balanced top-level reference-class emission scope. */
392
+ endReferenceClassEmission() {
393
+ if (this.referenceClassEmissionDepth == 0)
394
+ throw new RangeError("Reference-class emission scope is not active.");
395
+ this.referenceClassEmissionDepth -= 1;
396
+ }
397
+ /**
398
+ * Returns the target-local binding for one resolved import.
399
+ * @param {import("../semantic/types.js").SemanticImport} imported - Resolved import.
400
+ * @returns {string} Emitted import name.
401
+ */
402
+ importNameFor(imported) {
403
+ const module = this.#programModule();
404
+ if (!this.program || !module)
405
+ throw new RangeError("Import names require a validated semantic program.");
406
+ return programImportName(this.program, module, imported);
407
+ }
408
+ /**
409
+ * Reports whether one local declaration is exported by the current program module.
410
+ * @param {string | undefined} declarationId - Declaration identity.
411
+ * @returns {boolean} Whether it has a same-name program export.
412
+ */
413
+ isDirectlyExported(declarationId) {
414
+ const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
415
+ return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId && item.exportedName == declarationName(module, declarationId)));
416
+ }
417
+ /**
418
+ * Reports whether one export edge uses its declaration's emitted name.
419
+ * @param {import("../semantic/types.js").SemanticExport} exported - Current export edge.
420
+ * @returns {boolean} Whether this edge is represented by the declaration prefix.
421
+ */
422
+ isDirectExport(exported) {
423
+ return exported.exportedName == declarationName(this.module, exported.declarationId);
424
+ }
425
+ /**
426
+ * Reports whether one local declaration has any public program export.
427
+ * @param {string | undefined} declarationId - Declaration identity.
428
+ * @returns {boolean} Whether the declaration is exported.
429
+ */
430
+ isExported(declarationId) {
431
+ const module = /** @type {Partial<import("../semantic/types.js").SemanticProgramModule>} */ (this.module);
432
+ return typeof declarationId == "string" && Boolean(module.exports?.some((item) => item.declarationId == declarationId));
433
+ }
434
+ /**
435
+ * Returns whether this is the selected program entry module.
436
+ * @returns {boolean} Whether this writer owns the selected entry.
437
+ */
438
+ isProgramEntry() {
439
+ return this.program?.entryModule == Reflect.get(this.module, "id");
440
+ }
441
+ /**
442
+ * Returns the canonical class/module segment for a logical module identity.
443
+ * @param {string} moduleId - Logical module identity.
444
+ * @returns {string} Target class/module name.
445
+ */
446
+ programModuleName(moduleId) {
447
+ if (!this.program?.modules.some(({ id }) => id == moduleId))
448
+ throw new RangeError(`Unknown program module '${moduleId}'.`);
449
+ return moduleClassName(moduleId);
450
+ }
451
+ /**
452
+ * Finds the current module in the complete program.
453
+ * @returns {import("../semantic/types.js").SemanticProgramModule | undefined} Current program module.
454
+ */
455
+ #programModule() {
456
+ if (!this.program)
457
+ return undefined;
458
+ return this.program.modules.find(({ id }) => id == Reflect.get(this.module, "id"));
459
+ }
460
+ /**
461
+ * Returns a relative ESM/require specifier for a planned dependency artifact.
462
+ * @param {string} moduleId - Dependency module identity.
463
+ * @param {string} [extension] - Optional replacement extension.
464
+ * @returns {string} Relative POSIX specifier.
465
+ */
466
+ relativeModuleSpecifier(moduleId, extension) {
467
+ const targetPath = this.programPaths?.get(moduleId);
468
+ if (!targetPath)
469
+ throw new RangeError(`Unknown planned module path '${moduleId}'.`);
470
+ const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
471
+ const from = this.filename.split("/").slice(0, -1);
472
+ const to = adjustedTarget.split("/");
473
+ let common = 0;
474
+ while (common < from.length && common < to.length && from[common] == to[common])
475
+ common++;
476
+ const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
477
+ return relative.startsWith(".") ? relative : `./${relative}`;
478
+ }
479
+ /**
480
+ * Returns the protected native entry for one used stdlib provider operation.
481
+ * @param {import("../semantic/types.js").EffectOperationDeclaration} operation - Canonical operation declaration.
482
+ * @returns {string | undefined} Linked protected entry, or undefined when the operation stays inlined.
483
+ */
484
+ stdlibProviderEntryFor(operation) {
485
+ const module = this.effectOperationModules.get(operation.id);
486
+ return module === undefined ? undefined : this.stdlibProviderEntries?.[`${module}\u0000${operation.name}`];
487
+ }
488
+ /**
489
+ * Returns a relative specifier for the planned stdlib provider artifact.
490
+ * @param {string} [extension] - Optional replacement extension.
491
+ * @param {string} [providerPath] - One selected provider artifact path.
492
+ * @returns {string} Relative POSIX specifier.
493
+ */
494
+ stdlibProviderSpecifier(extension, providerPath) {
495
+ const targetPath = providerPath ?? this.stdlibProviderPath ?? this.stdlibProviderPaths?.[0];
496
+ if (!targetPath)
497
+ throw new RangeError("A stdlib provider specifier requires a planned provider path.");
498
+ const adjustedTarget = extension ? targetPath.replace(/\.[^./]+$/u, extension) : targetPath;
499
+ const from = this.filename.split("/").slice(0, -1);
500
+ const to = adjustedTarget.split("/");
501
+ let common = 0;
502
+ while (common < from.length && common < to.length && from[common] == to[common])
503
+ common++;
504
+ const relative = [...from.slice(common).map(() => ".."), ...to.slice(common)].join("/");
505
+ return relative.startsWith(".") ? relative : `./${relative}`;
506
+ }
507
+ /**
508
+ * Resolves a validated field identity for target emission.
509
+ * @param {string} fieldId - Semantic field identity.
510
+ * @returns {import("../semantic/types.js").RecordField} Record field.
511
+ */
512
+ fieldForId(fieldId) {
513
+ const field = this.fields.get(fieldId);
514
+ if (!field)
515
+ throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
516
+ return field;
517
+ }
518
+ /**
519
+ * Resolves the record declaration that owns a validated field identity.
520
+ * @param {string} fieldId - Semantic field identity.
521
+ * @returns {import("../semantic/types.js").RecordDeclaration} Owning record.
522
+ */
523
+ recordForFieldId(fieldId) {
524
+ const record = this.fieldRecords.get(fieldId);
525
+ if (!record)
526
+ throw new RangeError(`Unknown validated field identity '${fieldId}'.`);
527
+ return record;
528
+ }
41
529
  /**
42
530
  * Reports whether an exact parser-owned role range is available.
43
531
  * @param {import("../semantic/types.js").SemanticNode} node - Semantic node occurrence.
@@ -204,4 +692,4 @@ function relatedOriginKey(origin) {
204
692
  origin.role ?? null
205
693
  ]);
206
694
  }
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0QsMkRBQTJEO0FBQzNELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQix1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsSUFBSTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFBO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxPQUFNO1FBRTVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUMzRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQTtRQUM3RixNQUFNLFNBQVMsR0FBRyxXQUFXLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDMUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVE7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNwRixDQUFDLENBQUMsU0FBUyxDQUFBO1FBRWIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDakIsV0FBVyxFQUFFLFNBQVM7WUFDdEIsSUFBSSxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsSUFBSTtZQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDakIsTUFBTTtZQUNOLElBQUk7WUFDSixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7U0FDMUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEdBQUcsRUFBRSxFQUFFLFlBQVksR0FBRyxFQUFFO1FBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTTtRQUU1QiwwQkFBMEI7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN0QixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUU5RCxPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxVQUFVLEdBQUc7b0JBQ2pCLEdBQUcsT0FBTztvQkFDVixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsRUFBRTtvQkFDbkMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUztpQkFDaEMsQ0FBQTtnQkFDRCxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFFeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFBRSxPQUFPLEVBQUUsQ0FBQTtnQkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFFYixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDckIsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsRUFBQyxDQUFDLENBQUE7SUFDckcsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU07UUFDSixPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsT0FBTztZQUN6QixTQUFTLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBQztZQUNqRixLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN2QyxNQUFNLEVBQUUsb0JBQW9CO1lBQzVCLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQzNDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxPQUFPLEVBQUUsQ0FBQztTQUNYLENBQUE7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVU7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELENBQUMsQ0FBQTtRQUV4RyxNQUFNLEtBQUssR0FBRyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUE7UUFFekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7WUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1lBQ2pCLENBQUM7O2dCQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUN0QixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsdUZBQXVGLENBQUMsQ0FDdEcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQzFGLENBQUE7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNkLEdBQUcsT0FBTztZQUNWLFNBQVMsRUFBRTtnQkFDVCxHQUFHLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQztnQkFDaEUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixLQUFLO2FBQ047U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVE7UUFDOUIsaUNBQWlDO1FBQ2pDLElBQUksZ0JBQWdCLENBQUE7UUFFcEIsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUTtZQUFFLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUE7YUFDakgsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFBO1FBQy9HLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUE7UUFDdEgsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksZ0JBQWdCLENBQUM7WUFDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFNUYsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO0lBQzVFLENBQUM7Q0FDRjtBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQU07SUFDL0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVE7UUFBRSxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDNUYsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFFbkQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFBO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNO0lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQixNQUFNLENBQUMsUUFBUTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtRQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQzVCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU07UUFDMUIsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQ3JCLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN2QixNQUFNLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2NyZWF0ZUdlbmVyYXRpb25JbmRleH0gZnJvbSBcIi4uL3NlbWFudGljL3Byb3ZlbmFuY2UuanNcIlxuXG4vKiogU291cmNlLWF3YXJlIGRldGVybWluaXN0aWMgZ2VuZXJhdGVkLW91dHB1dCBidWlsZGVyLiAqL1xuZXhwb3J0IGNsYXNzIFNvdXJjZVdyaXRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc291cmNlLWF3YXJlIHdyaXRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBXcml0ZXIgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZmlsZW5hbWUgLSBPdXRwdXQgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gb3B0aW9ucy5sYW5ndWFnZSAtIE91dHB1dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2ZpbGVuYW1lLCBsYW5ndWFnZSwgbW9kdWxlLCBzb3VyY2VzfSkge1xuICAgIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSwgc291cmNlcylcblxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgdGhpcy5wYXJ0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuW119ICovXG4gICAgdGhpcy5zcGFucyA9IFtdXG4gICAgdGhpcy5vZmZzZXQgPSAwXG4gICAgdGhpcy5saW5lID0gMVxuICAgIHRoaXMuY29sdW1uID0gMVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2VuZXJhdGVkIGNvbnRlbnQgc28gZmFyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBHZW5lcmF0ZWQgY29udGVudC5cbiAgICovXG4gIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEpTT04gUG9pbnRlciBmb3Igb25lIHVuYW1iaWd1b3VzIHNlbWFudGljIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDdXJyZW50IG9jY3VycmVuY2UgcGF0aC5cbiAgICovXG4gIG9jY3VycmVuY2VQYXRoKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSkucGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBhbiBleGFjdCBwYXJzZXItb3duZWQgcm9sZSByYW5nZSBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFNlbWFudGljIHRva2VuIHJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSByb2xlIGhhcyBhbiBleGFjdCBzb3VyY2UgcmFuZ2UuXG4gICAqL1xuICBoYXNSYW5nZShub2RlLCBwYXRoLCByb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpLnJhbmdlc1tyb2xlXSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRleHQgbWFwcGVkIHRvIGEgc2VtYW50aWMgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFubm90YXRpb24gLSBNYXBwaW5nIGFubm90YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlfSBhbm5vdGF0aW9uLm5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCJ9IGFubm90YXRpb24ubWFwcGluZ0tpbmQgLSBNYXBwaW5nIHByZWNpc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLnJvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbm5vdGF0aW9uLm5hbWVdIC0gU291cmNlIE1hcCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucGF0aF0gLSBKU09OIFBvaW50ZXIgZm9yIGEgc2hhcmVkIG5vZGUgb2NjdXJyZW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXBwZWQodGV4dCwge21hcHBpbmdLaW5kLCBuYW1lLCBub2RlLCBwYXRoLCByb2xlfSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHBhdGgpXG4gICAgY29uc3Qgcm9sZUxvY2F0aW9uID0gcm9sZSA/IHJlY29yZC5yYW5nZXNbcm9sZV0gOiB1bmRlZmluZWRcbiAgICBjb25zdCBvcmlnaW4gPSByb2xlTG9jYXRpb24gPyB0aGlzLiNzb3VyY2VPcmlnaW4ocm9sZUxvY2F0aW9uLCByZWNvcmQub3JpZ2luKSA6IHJlY29yZC5vcmlnaW5cbiAgICBjb25zdCBwcmVjaXNpb24gPSBtYXBwaW5nS2luZCA9PSBcImV4YWN0XCIgJiYgcm9sZSAmJiAhcm9sZUxvY2F0aW9uID8gXCJhbmNob3JcIiA6IG1hcHBpbmdLaW5kXG4gICAgY29uc3Qgc3ltYm9sID0gcmVjb3JkLnN5bWJvbElkXG4gICAgICA/IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHJlY29yZC5zeW1ib2xJZClcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLiNhcHBlbmQodGV4dCwge1xuICAgICAgbWFwcGluZ0tpbmQ6IHByZWNpc2lvbixcbiAgICAgIG5hbWU6IG5hbWUgPz8gc3ltYm9sPy5uYW1lLFxuICAgICAgbm9kZUlkOiByZWNvcmQuaWQsXG4gICAgICBvcmlnaW4sXG4gICAgICByb2xlLFxuICAgICAgc3ltYm9sSWQ6IHJlY29yZC5zeW1ib2xJZFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHNvdXJjZS1mcmVlIHNjYWZmb2xkaW5nIHdpdGggb3B0aW9uYWwgc2VtYW50aWMgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBHZW5lcmF0ZWQgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIFN0YWJsZSByZWFzb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNOb2RlW119IFtyZWxhdGVkTm9kZXNdIC0gUmVsYXRlZCBub2Rlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKVtdfSBbcmVsYXRlZFBhdGhzXSAtIE9jY3VycmVuY2UgcGF0aHMgZm9yIHNoYXJlZCByZWxhdGVkIG5vZGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN5bnRoZXRpYyh0ZXh0LCByZWFzb24sIHJlbGF0ZWROb2RlcyA9IFtdLCByZWxhdGVkUGF0aHMgPSBbXSkge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gcmVsYXRlZE5vZGVzLmZsYXRNYXAoKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlLCByZWxhdGVkUGF0aHNbaW5kZXhdKVxuXG4gICAgICByZXR1cm4gcmVsYXRlZE9yaWdpbnNGb3IocmVjb3JkLm9yaWdpbikuZmxhdE1hcCgocmVsYXRlZCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZXh0dWFsID0ge1xuICAgICAgICAgIC4uLnJlbGF0ZWQsXG4gICAgICAgICAgbm9kZUlkOiByZWxhdGVkLm5vZGVJZCA/PyByZWNvcmQuaWQsXG4gICAgICAgICAgcm9sZTogcmVsYXRlZC5yb2xlID8/IFwiY29udGV4dFwiXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gcmVsYXRlZE9yaWdpbktleShjb250ZXh0dWFsKVxuXG4gICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gW11cbiAgICAgICAgc2Vlbi5hZGQoa2V5KVxuXG4gICAgICAgIHJldHVybiBbY29udGV4dHVhbF1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7bWFwcGluZ0tpbmQ6IFwic3ludGhldGljXCIsIG9yaWdpbjoge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbiwgcmVsYXRlZE9yaWdpbnN9fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpdGF0aXZlIHJpY2ggbWFwIGZvciB0aGUgY3VycmVudCBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nfSBNYXBwaW5nLlxuICAgKi9cbiAgZmluaXNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgICBnZW5lcmF0ZWQ6IHtjb250ZW50OiB0aGlzLmNvZGUsIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLCBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZX0sXG4gICAgICBub2RlczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5ub2Rlc10sXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRNYXBwaW5nXCIsXG4gICAgICBzb3VyY2VzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXNdLFxuICAgICAgc3BhbnM6IFsuLi50aGlzLnNwYW5zXSxcbiAgICAgIHN5bWJvbHM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc3ltYm9sc10sXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG1hcHBlZCBzcGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59IGFubm90YXRpb24gLSBTcGFuIGFubm90YXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgI2FwcGVuZCh0ZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoXCJcXHJcIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0ZWQgb3V0cHV0IG11c3QgdXNlIGRldGVybWluaXN0aWMgTEYgbGluZSBlbmRpbmdzLlwiKVxuXG4gICAgY29uc3Qgc3RhcnQgPSB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fVxuXG4gICAgdGhpcy5wYXJ0cy5wdXNoKHRleHQpXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRleHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB0aGlzLm9mZnNldCsrXG4gICAgICBpZiAodGV4dFtpbmRleF0gPT0gXCJcXG5cIikge1xuICAgICAgICB0aGlzLmxpbmUrK1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDFcbiAgICAgIH0gZWxzZSB0aGlzLmNvbHVtbisrXG4gICAgfVxuICAgIGNvbnN0IGNvbXBhY3QgPSAvKiogQHR5cGUge09taXQ8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWZvbGRNYXBwaW5nU3BhbiwgXCJnZW5lcmF0ZWRcIj59ICovIChcbiAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgKVxuXG4gICAgdGhpcy5zcGFucy5wdXNoKHtcbiAgICAgIC4uLmNvbXBhY3QsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgZW5kOiB7Y29sdW1uOiB0aGlzLmNvbHVtbiwgbGluZTogdGhpcy5saW5lLCBvZmZzZXQ6IHRoaXMub2Zmc2V0fSxcbiAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsXG4gICAgICAgIHN0YXJ0XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0IHJvbGUgb3JpZ2luIHVzaW5nIGNhbm9uaWNhbCBzb3VyY2UgaWRlbnRpdGllcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByb2xlIHJhbmdlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBmYWxsYmFjayAtIE93bmluZyBvcmlnaW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gUm9sZSBvcmlnaW4uXG4gICAqL1xuICAjc291cmNlT3JpZ2luKGxvY2F0aW9uLCBmYWxsYmFjaykge1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmYWxsYmFja1NvdXJjZUlkXG5cbiAgICBpZiAoZmFsbGJhY2sua2luZCA9PSBcInNvdXJjZVwiICYmIGZhbGxiYWNrLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2suc291cmNlSWRcbiAgICBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwiZGVyaXZlZFwiKSB7XG4gICAgICBmYWxsYmFja1NvdXJjZUlkID0gZmFsbGJhY2sub3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfSBlbHNlIGlmIChmYWxsYmFjay5raW5kID09IFwic3ludGhldGljXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5yZWxhdGVkT3JpZ2lucy5maW5kKChvcmlnaW4pID0+IG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSk/LnNvdXJjZUlkXG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGZhbGxiYWNrU291cmNlSWQpID8/XG4gICAgICB0aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSlcblxuICAgIHJldHVybiBzb3VyY2UgPyB7a2luZDogXCJzb3VyY2VcIiwgbG9jYXRpb24sIHNvdXJjZUlkOiBzb3VyY2UuaWR9IDogZmFsbGJhY2tcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZHMgZXZlcnkgY2xvc2VkIHByb3ZlbmFuY2UgcmFuZ2UgaW4gc2VtYW50aWMgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119IFJlbGF0ZWQgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiByZWxhdGVkT3JpZ2luc0ZvcihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBbe2xvY2F0aW9uOiBvcmlnaW4ubG9jYXRpb24sIHNvdXJjZUlkOiBvcmlnaW4uc291cmNlSWR9XVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1xuXG4gIHJldHVybiBvcmlnaW4ucmVsYXRlZE9yaWdpbnNcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGlkZW50aXR5IGZvciBvbmUgY29udGV4dHVhbCByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbn0gb3JpZ2luIC0gUmVsYXRlZCBvcmlnaW4uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5LZXkob3JpZ2luKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgb3JpZ2luLnNvdXJjZUlkLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5maWxlbmFtZSxcbiAgICBvcmlnaW4ubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgIG9yaWdpbi5sb2NhdGlvbi5lbmQub2Zmc2V0LFxuICAgIG9yaWdpbi5ub2RlSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4uc3ltYm9sSWQgPz8gbnVsbCxcbiAgICBvcmlnaW4ucm9sZSA/PyBudWxsXG4gIF0pXG59XG4iXX0=
695
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL3dyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsSUFBSTtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV0QixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUTtRQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2pILEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFL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QyxDQUFDLFFBQVEsQ0FBQTtJQUM1RSxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0lBQy9CLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRO1FBQUUsT0FBTyxDQUFDLEVBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFBO0lBRW5ELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsTUFBTTtJQUM5QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsTUFBTSxDQUFDLFFBQVE7UUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVE7UUFDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUM1QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQzFCLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtRQUNyQixNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7UUFDdkIsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJO0tBQ3BCLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVHZW5lcmF0aW9uSW5kZXh9IGZyb20gXCIuLi9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzXCJcblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBjYWxsZXItY29udHJvbGxlZCBiaW5kaW5nIHNwZWxsaW5nIGJlZm9yZSBzeW50aGV0aWMgbmFtZXMgYXJlIGNob3Nlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcm9vdCAtIFNlbWFudGljIGdyYXBoLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBVc2VkIHNvdXJjZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEJpbmRpbmdOYW1lcyhyb290KSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcIm9iamVjdFwiIHx8IHNlZW4uaGFzKHZhbHVlKSkgY29udGludWVcbiAgICBzZWVuLmFkZCh2YWx1ZSlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpID09IFwic3RyaW5nXCIpIG5hbWVzLmFkZChSZWZsZWN0LmdldCh2YWx1ZSwgXCJuYW1lXCIpKVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dpY2FsIG1vZHVsZSBpZGVudGl0eSB0byBpdHMgY2Fub25pY2FsIHRhcmdldCB0eXBlIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFBvcnRhYmxlIHRhcmdldCBjbGFzcy9tb2R1bGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlQ2xhc3NOYW1lKGlkKSB7XG4gIHJldHVybiBpZC5zcGxpdCgvWy5fLV0rL3UpLm1hcCgocGFydCkgPT4gYCR7cGFydFswXS50b1VwcGVyQ2FzZSgpfSR7cGFydC5zbGljZSgxKX1gKS5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogTG9va3MgdXAgb25lIGRlY2xhcmF0aW9uIG5hbWUgaW4gaXRzIG93bmluZyBwcm9ncmFtIG1vZHVsZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSBtb2R1bGUgLSBPd25pbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBEZWNsYXJhdGlvbiBuYW1lLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvbk5hbWUobW9kdWxlLCBkZWNsYXJhdGlvbklkKSB7XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gWy4uLm1vZHVsZS5mdW5jdGlvbnMgPz8gW10sIC4uLm1vZHVsZS5yZWNvcmRzID8/IFtdLCAuLi5tb2R1bGUuY2xhc3NlcyA/PyBbXSwgLi4ubW9kdWxlLmVycm9ycyA/PyBbXV1cbiAgICAuZmluZCgoe2lkfSkgPT4gaWQgPT0gZGVjbGFyYXRpb25JZClcblxuICBpZiAoIWRlY2xhcmF0aW9uKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwcm9ncmFtIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uSWR9Jy5gKVxuXG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lXG59XG5cbi8qKlxuICogQ2hvb3NlcyBhbiB1bnF1YWxpZmllZCB0YXJnZXQgYmluZGluZyB3aXRob3V0IHRyZWF0aW5nIGEgc291cmNlLXByb2ZpbGUgcXVhbGlmaWVyIGFzIHNlbWFudGljIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW19IHByb2dyYW0gLSBPd25pbmcgcHJvZ3JhbS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlfSBtb2R1bGUgLSBJbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0ltcG9ydH0gaW1wb3J0ZWQgLSBSZXNvbHZlZCBpbXBvcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQtbG9jYWwgYmluZGluZyBzcGVsbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2dyYW1JbXBvcnROYW1lKHByb2dyYW0sIG1vZHVsZSwgaW1wb3J0ZWQpIHtcbiAgY29uc3Qgc291cmNlID0gcHJvZ3JhbS5zb3VyY2VzLmZpbmQoKHtmaWxlbmFtZX0pID0+IGZpbGVuYW1lID09IG1vZHVsZS5zb3VyY2VGaWxlbmFtZSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFByb2dyYW0gbW9kdWxlICcke21vZHVsZS5pZH0nIGhhcyBubyByZWdpc3RlcmVkIHNvdXJjZS5gKVxuXG4gIHJldHVybiBzb3VyY2UubGFuZ3VhZ2UgPT0gXCJydWJ5XCIgfHwgc291cmNlLmxhbmd1YWdlID09IFwiamF2YVwiID8gaW1wb3J0ZWQuaW1wb3J0ZWROYW1lIDogaW1wb3J0ZWQubG9jYWxOYW1lXG59XG5cbi8qKiBTb3VyY2UtYXdhcmUgZGV0ZXJtaW5pc3RpYyBnZW5lcmF0ZWQtb3V0cHV0IGJ1aWxkZXIuICovXG5leHBvcnQgY2xhc3MgU291cmNlV3JpdGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzb3VyY2UtYXdhcmUgd3JpdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFdyaXRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5maWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5HZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IG9wdGlvbnMubGFuZ3VhZ2UgLSBPdXRwdXQgdGV4dCBsYW5ndWFnZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gb3B0aW9ucy5tb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtfSBbb3B0aW9ucy5wcm9ncmFtXSAtIE93bmluZyBtdWx0aS1maWxlIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gW29wdGlvbnMucHJvZ3JhbVBhdGhzXSAtIFBsYW5uZWQgYXJ0aWZhY3QgcGF0aCBieSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfVtdfSBbb3B0aW9ucy5zb3VyY2VzXSAtIENhbGxlci1wcm92aWRlZCBzb3VyY2VzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLnN0ZGxpYlByb3ZpZGVyRW50cmllc10gLSBVc2VkIG9wZXJhdGlvbiB0byBwcm90ZWN0ZWQgbmF0aXZlIGVudHJ5IGZvciBhIGxpbmtlZCBzdGRsaWIgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlclBhdGhdIC0gUGxhbm5lZCBzdGRsaWIgcHJvdmlkZXIgYXJ0aWZhY3QgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJQYXRoc10gLSBQbGFubmVkIHN0ZGxpYiBwcm92aWRlciBhcnRpZmFjdCBwYXRocy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJJbXBvcnRzXSAtIE9yZGVyZWQgcHJvdmlkZXIgbmFtZXMgdGhpcyBtb2R1bGUgbXVzdCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdGRsaWJQcm92aWRlck93bmVyTW9kdWxlXSAtIEphdmEgb3duZXIgbW9kdWxlIGlkZW50aXR5IGhvc3RpbmcgdGhlIHNoYXJlZCBzdXBwb3J0IGJsb2NrIGFuZCBzaGltcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdGlvbnMuc3RkbGliUHJvdmlkZXJTaGltc10gLSBKYXZhIG93bmVyIHByb2dyYW0td2lkZSB1c2VkIG9wZXJhdGlvbnMgZXhwb3NlZCBhcyBwdWJsaWMgc3RhdGljIHNoaW1zLlxuICAgKiBAcGFyYW0geyhleHByZXNzaW9uOiBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbikgPT4gc3RyaW5nfSBbb3B0aW9ucy5jYWxsTmFtZVJlc29sdmVyXSAtIFRhcmdldC1jb250YWluZXIgY2FsbCBzcGVsbGluZyBvdmVycmlkZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbGxBcmd1bWVudFN1ZmZpeF0gLSBTeW50aGV0aWMgdHJhaWxpbmcgYXJndW1lbnQgZm9yIGV2ZXJ5IHNlbWFudGljIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubWV0aG9kU3RyaW5nRXF1YWxpdHldIC0gRW1pdCBzdHJpbmcgZXF1YWxpdHkgdGhyb3VnaCB0aGUgcGxhdGZvcm0gU3RyaW5nIG1ldGhvZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjYWxsQXJndW1lbnRTdWZmaXgsIGNhbGxOYW1lUmVzb2x2ZXIsIGZpbGVuYW1lLCBsYW5ndWFnZSwgbWV0aG9kU3RyaW5nRXF1YWxpdHksIG1vZHVsZSwgcHJvZ3JhbSwgcHJvZ3JhbVBhdGhzLCBzb3VyY2VzLFxuICAgIHN0ZGxpYlByb3ZpZGVyRW50cmllcywgc3RkbGliUHJvdmlkZXJQYXRoLCBzdGRsaWJQcm92aWRlclBhdGhzLCBzdGRsaWJQcm92aWRlckltcG9ydHMsIHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGUsXG4gICAgc3RkbGliUHJvdmlkZXJTaGltc30pIHtcbiAgICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUsIHNvdXJjZXMpXG5cbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2VcbiAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZVxuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW1cbiAgICB0aGlzLnByb2dyYW1QYXRocyA9IHByb2dyYW1QYXRoc1xuICAgIHRoaXMuY2FsbEFyZ3VtZW50U3VmZml4ID0gY2FsbEFyZ3VtZW50U3VmZml4XG4gICAgdGhpcy5jYWxsTmFtZVJlc29sdmVyID0gY2FsbE5hbWVSZXNvbHZlclxuICAgIHRoaXMubWV0aG9kU3RyaW5nRXF1YWxpdHkgPSBtZXRob2RTdHJpbmdFcXVhbGl0eSA/PyBmYWxzZVxuICAgIHRoaXMuaW5kZXggPSBpbmRleFxuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzID0gc3RkbGliUHJvdmlkZXJFbnRyaWVzXG4gICAgdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPSBzdGRsaWJQcm92aWRlclBhdGhcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyUGF0aHMgPSBzdGRsaWJQcm92aWRlclBhdGhzID8/IChzdGRsaWJQcm92aWRlclBhdGggPyBbc3RkbGliUHJvdmlkZXJQYXRoXSA6IHVuZGVmaW5lZClcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVySW1wb3J0cyA9IHN0ZGxpYlByb3ZpZGVySW1wb3J0c1xuICAgIHRoaXMuc3RkbGliUHJvdmlkZXJPd25lck1vZHVsZSA9IHN0ZGxpYlByb3ZpZGVyT3duZXJNb2R1bGVcbiAgICB0aGlzLnN0ZGxpYlByb3ZpZGVyU2hpbXMgPSBzdGRsaWJQcm92aWRlclNoaW1zXG4gICAgY29uc3QgcHJvZ3JhbVJlY29yZHMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkgPz8gbW9kdWxlLnJlY29yZHMgPz8gW11cbiAgICBjb25zdCBwcm9ncmFtQ2xhc3NlcyA9IHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gcHJvZ3JhbU1vZHVsZS5jbGFzc2VzID8/IFtdKSA/PyBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICAgIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlcyA9IG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXVxuICAgIGNvbnN0IHByb2dyYW1FcnJvcnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IFtcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmVycm9ycyA/PyBbXSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKSA/PyBbXSlcbiAgICBdKSA/PyBbLi4ubW9kdWxlLmVycm9ycyA/PyBbXSwgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXVxuICAgIGNvbnN0IHByb2dyYW1GdW5jdGlvbnMgPSBwcm9ncmFtPy5tb2R1bGVzLmZsYXRNYXAoKHByb2dyYW1Nb2R1bGUpID0+IHByb2dyYW1Nb2R1bGUuZnVuY3Rpb25zKSA/PyBtb2R1bGUuZnVuY3Rpb25zXG5cbiAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbcmVjb3JkLmlkLCByZWNvcmRdKSlcbiAgICB0aGlzLmNsYXNzZXMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb25dKSlcbiAgICB0aGlzLmVycm9ycyA9IG5ldyBNYXAocHJvZ3JhbUVycm9ycy5tYXAoKGVycm9yKSA9PiBbZXJyb3IuaWQsIGVycm9yXSkpXG4gICAgdGhpcy5yZXNvdXJjZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKSA/PyBbXSkubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLmlkLCByZXNvdXJjZV0pKVxuICAgIHRoaXMuZWZmZWN0T3BlcmF0aW9ucyA9IG5ldyBNYXAoKG1vZHVsZS5jYXBhYmlsaXRpZXM/LmZsYXRNYXAoKHtvcGVyYXRpb25zfSkgPT4gb3BlcmF0aW9ucykgPz8gW10pLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBvcGVyYXRpb25dKSlcbiAgICB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKChtb2R1bGUuY2FwYWJpbGl0aWVzPy5mbGF0TWFwKChjYXBhYmlsaXR5KSA9PlxuICAgICAgY2FwYWJpbGl0eS5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmlkLCBjYXBhYmlsaXR5LmF1dGhvcml0eUlkXSkpID8/IFtdKSlcbiAgICB0aGlzLmZpZWxkcyA9IG5ldyBNYXAocHJvZ3JhbVJlY29yZHMuZmxhdE1hcCgocmVjb3JkKSA9PiByZWNvcmQuZmllbGRzLm1hcCgoZmllbGQpID0+IFtmaWVsZC5pZCwgZmllbGRdKSkpXG4gICAgdGhpcy5maWVsZFJlY29yZHMgPSBuZXcgTWFwKHByb2dyYW1SZWNvcmRzLmZsYXRNYXAoKHJlY29yZCkgPT4gcmVjb3JkLmZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbZmllbGQuaWQsIHJlY29yZF0pKSlcbiAgICB0aGlzLnByaXZhdGVGaWVsZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLmlkLCBmaWVsZF0pKSlcbiAgICB0aGlzLm1ldGhvZHMgPSBuZXcgTWFwKHByb2dyYW1DbGFzc2VzLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5tZXRob2RzLm1hcCgobWV0aG9kKSA9PiBbbWV0aG9kLmlkLCBtZXRob2RdKSkpXG4gICAgdGhpcy50eXBlUGFyYW1ldGVycyA9IG5ldyBNYXAoWy4uLnByb2dyYW1SZWNvcmRzLCAuLi5wcm9ncmFtRnVuY3Rpb25zXS5mbGF0TWFwKChkZWNsYXJhdGlvbikgPT5cbiAgICAgIChkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkubWFwKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIuaWQsIHBhcmFtZXRlcl0pKSlcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA9IDBcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvZ3JhbU1vZHVsZT59ICovXG4gICAgdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMgPSBuZXcgTWFwKHByb2dyYW0/Lm1vZHVsZXMuZmxhdE1hcCgocHJvZ3JhbU1vZHVsZSkgPT4gW1xuICAgICAgLi4uKHByb2dyYW1Nb2R1bGUucmVjb3JkcyA/PyBbXSkubWFwKChkZWNsYXJhdGlvbikgPT4gLyoqIEB0eXBlIHtjb25zdH0gKi8gKFsvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSwgcHJvZ3JhbU1vZHVsZV0pKSxcbiAgICAgIC4uLihwcm9ncmFtTW9kdWxlLmNsYXNzZXMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi4ocHJvZ3JhbU1vZHVsZS5lcnJvcnMgPz8gW10pLm1hcCgoZGVjbGFyYXRpb24pID0+IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCksIHByb2dyYW1Nb2R1bGVdKSksXG4gICAgICAuLi5wcm9ncmFtTW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiAvKiogQHR5cGUge2NvbnN0fSAqLyAoWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLCBwcm9ncmFtTW9kdWxlXSkpXG4gICAgXSkgPz8gW10pXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLnBhcnRzID0gW11cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGlmb2xkTWFwcGluZ1NwYW5bXX0gKi9cbiAgICB0aGlzLnNwYW5zID0gW11cbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICB0aGlzLmxpbmUgPSAxXG4gICAgdGhpcy5jb2x1bW4gPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbiwgc3RyaW5nPn0gKi9cbiAgICB0aGlzLmVmZmVjdFJlcGxhY2VtZW50TmFtZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy51c2VkQmluZGluZ05hbWVzID0gY29sbGVjdEJpbmRpbmdOYW1lcyhtb2R1bGUpXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGVmZmVjdCBleHByZXNzaW9ucyBsb3dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3VycmVudCBzdGF0ZW1lbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBleHByZXNzaW9ucyAtIE9yZGVyZWQgZXhwcmVzc2lvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcGxhbkVmZmVjdFJlcGxhY2VtZW50cyhleHByZXNzaW9ucykge1xuICAgIHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcyA9IG5ldyBNYXAoZXhwcmVzc2lvbnMubWFwKChleHByZXNzaW9uKSA9PiBbZXhwcmVzc2lvbiwgdGhpcy5lZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pXSkpXG4gIH1cblxuICAvKipcbiAgICogQWxsb2NhdGVzIGEgY29sbGlzaW9uLXNhZmUgbmFtZSBmb3Igb25lIGRldGVybWluaXN0aWMgZWZmZWN0IHNpdGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEVmZmVjdGZ1bCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgdGVtcG9yYXJ5IG5hbWUuXG4gICAqL1xuICBlZmZlY3RUZW1wb3JhcnlOYW1lKGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBrbm93biA9IHRoaXMuZWZmZWN0VGVtcG9yYXJ5TmFtZXMuZ2V0KGV4cHJlc3Npb24pXG4gICAgaWYgKGtub3duKSByZXR1cm4ga25vd25cbiAgICBjb25zdCBzaXRlID0gdHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCJcbiAgICAgID8gUmVmbGVjdC5nZXQoZXhwcmVzc2lvbiwgXCJlZmZlY3RTaXRlSWRcIikuc2xpY2UoXCJlZmZlY3Q6XCIubGVuZ3RoKSA6IFN0cmluZyh0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNpemUpXG4gICAgbGV0IG5hbWUgPSBgX19zZW1hbnRpZm9sZF9lZmZlY3RfJHtzaXRlfWBcblxuICAgIHdoaWxlICh0aGlzLnVzZWRCaW5kaW5nTmFtZXMuaGFzKG5hbWUpKSBuYW1lID0gYCR7bmFtZX1fYFxuICAgIHRoaXMudXNlZEJpbmRpbmdOYW1lcy5hZGQobmFtZSlcbiAgICB0aGlzLmVmZmVjdFRlbXBvcmFyeU5hbWVzLnNldChleHByZXNzaW9uLCBuYW1lKVxuICAgIHJldHVybiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGxhbm5lZCB0ZW1wb3JhcnkgcmVwbGFjZW1lbnQgb3V0c2lkZSBpdHMgb3duIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUZW1wb3JhcnkgbmFtZS5cbiAgICovXG4gIGVmZmVjdFJlcGxhY2VtZW50TmFtZShleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0RGVmaW5pdGlvbiA9PT0gZXhwcmVzc2lvbiA/IHVuZGVmaW5lZCA6IHRoaXMuZWZmZWN0UmVwbGFjZW1lbnROYW1lcy5nZXQoZXhwcmVzc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBvbmUgZWZmZWN0IGRlZmluaXRpb24gd2l0aG91dCByZWN1cnNpdmVseSByZXBsYWNpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBEZWZpbmVkIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZW1pdCAtIFRhcmdldCBleHByZXNzaW9uIGVtaXR0ZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdEVmZmVjdERlZmluaXRpb24oZXhwcmVzc2lvbiwgZW1pdCkge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lZmZlY3REZWZpbml0aW9uXG4gICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gZXhwcmVzc2lvblxuICAgIHRyeSB7XG4gICAgICBlbWl0KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5lZmZlY3REZWZpbml0aW9uID0gcHJldmlvdXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZW5lcmF0ZWQgY29udGVudCBzbyBmYXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdlbmVyYXRlZCBjb250ZW50LlxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuam9pbihcIlwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgSlNPTiBQb2ludGVyIGZvciBvbmUgdW5hbWJpZ3VvdXMgc2VtYW50aWMgb2NjdXJyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgb2NjdXJyZW5jZSBwYXRoLlxuICAgKi9cbiAgb2NjdXJyZW5jZVBhdGgobm9kZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LnJlY29yZEZvcihub2RlKS5wYXRoXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSB2YWxpZGF0ZWQgbm9taW5hbCBkZWNsYXJhdGlvbiBpZGVudGl0eSBmb3IgdGFyZ2V0IGVtaXNzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFNlbWFudGljIHJlY29yZCBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBSZWNvcmQgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWNvcmQgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgcmVjb3JkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ZhbHVlUG9zaXRpb25dIC0gV2hldGhlciB0aGUgYmluZGluZyBtdXN0IGV4aXN0IGF0IHJ1bnRpbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCByZWNvcmQgc3BlbGxpbmcuXG4gICAqL1xuICByZWNvcmROYW1lRm9ySWQoZGVjbGFyYXRpb25JZCwgdmFsdWVQb3NpdGlvbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IG93bmVyID0gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpXG4gICAgY29uc3QgaW1wb3J0ZWQgPSB0aGlzLiNwcm9ncmFtTW9kdWxlKCk/LmltcG9ydHMuZmluZCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkICYmICghdmFsdWVQb3NpdGlvbiB8fCAhaXRlbS50eXBlT25seSkpXG5cbiAgICBpZiAodGhpcy5wcm9ncmFtICYmIG93bmVyICYmIG93bmVyLmlkICE9IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJydWJ5XCIpIHtcbiAgICAgIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfTo6JHtyZWNvcmQubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZC5uYW1lXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gICAqL1xuICBjbGFzc0ZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3Nlcy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCByZWZlcmVuY2UgY2xhc3MgaWRlbnRpdHkgJyR7ZGVjbGFyYXRpb25JZH0nLmApXG5cbiAgICByZXR1cm4gZGVjbGFyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlbGxpbmcgb2Ygb25lIHJlZmVyZW5jZSBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgY2xhc3MgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldCBzcGVsbGluZy5cbiAgICovXG4gIGNsYXNzTmFtZUZvcklkKGRlY2xhcmF0aW9uSWQpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHRoaXMuY2xhc3NGb3JJZChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKGltcG9ydGVkICYmICh0aGlzLmxhbmd1YWdlID09IFwiamF2YXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJ0eXBlc2NyaXB0XCIgfHwgdGhpcy5sYW5ndWFnZSA9PSBcInBocFwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcbiAgICB9XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBvbmUgdmFsaWRhdGVkIG93bmVkLXJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VJZCAtIFN0YWJsZSByZXNvdXJjZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdFJlc291cmNlRGVjbGFyYXRpb259IFJlc291cmNlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVzb3VyY2VGb3JJZChyZXNvdXJjZUlkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlcy5nZXQocmVzb3VyY2VJZClcbiAgICBpZiAoIXJlc291cmNlKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgcmVzb3VyY2UgaWRlbnRpdHkgJyR7cmVzb3VyY2VJZH0nLmApXG4gICAgcmV0dXJuIHJlc291cmNlXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBjYXBhYmlsaXR5IG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbklkIC0gU3RhYmxlIG9wZXJhdGlvbiBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9ufSBPcGVyYXRpb24gZGVjbGFyYXRpb24uXG4gICAqL1xuICBlZmZlY3RPcGVyYXRpb25Gb3JJZChvcGVyYXRpb25JZCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMuZWZmZWN0T3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uSWQpXG4gICAgaWYgKCFvcGVyYXRpb24pIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aXR5ICcke29wZXJhdGlvbklkfScuYClcbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFN0YWJsZSBwcml2YXRlLWZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHJpdmF0ZUZpZWxkfSBGaWVsZCBkZWNsYXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGVGaWVsZEZvcklkKGZpZWxkSWQpIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMucHJpdmF0ZUZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBwcml2YXRlIGZpZWxkIGlkZW50aXR5ICcke2ZpZWxkSWR9Jy5gKVxuXG4gICAgcmV0dXJuIGZpZWxkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIHZhbGlkYXRlZCByZWNlaXZlciBtZXRob2QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RJZCAtIFN0YWJsZSBtZXRob2QgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gTWV0aG9kIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgbWV0aG9kRm9ySWQobWV0aG9kSWQpIHtcbiAgICBjb25zdCBtZXRob2QgPSB0aGlzLm1ldGhvZHMuZ2V0KG1ldGhvZElkKVxuXG4gICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBtZXRob2QgaWRlbnRpdHkgJyR7bWV0aG9kSWR9Jy5gKVxuXG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1ldGVySWQgLSBTdGFibGUgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUGFyYW1ldGVyfSBUeXBlIHBhcmFtZXRlci5cbiAgICovXG4gIHR5cGVQYXJhbWV0ZXJGb3JJZChwYXJhbWV0ZXJJZCkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMudHlwZVBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlcklkKVxuXG4gICAgaWYgKCFwYXJhbWV0ZXIpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCB0eXBlIHBhcmFtZXRlciBpZGVudGl0eSAnJHtwYXJhbWV0ZXJJZH0nLmApXG5cbiAgICByZXR1cm4gcGFyYW1ldGVyXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGVkIG5vbWluYWwgZXJyb3IgZGVjbGFyYXRpb24gZm9yIGFuIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBlcnJvciBpZGVudGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RGYWlsdXJlRGVjbGFyYXRpb259IEVycm9yIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgZXJyb3JGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9ycy5nZXQoZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZXJyb3IpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBlcnJvciBpZGVudGl0eSAnJHtkZWNsYXJhdGlvbklkfScuYClcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhcmdldC12aXNpYmxlIHNwZWxsaW5nIGZvciBvbmUgbm9taW5hbCBlcnJvciBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRhcmdldC12aXNpYmxlIG5hbWUuXG4gICAqL1xuICBlcnJvck5hbWVGb3JJZChkZWNsYXJhdGlvbklkKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLmVycm9yRm9ySWQoZGVjbGFyYXRpb25JZClcbiAgICBjb25zdCBvd25lciA9IHRoaXMuZGVjbGFyYXRpb25Nb2R1bGVzLmdldChkZWNsYXJhdGlvbklkKVxuICAgIGNvbnN0IGltcG9ydGVkID0gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKHRoaXMucHJvZ3JhbSAmJiBvd25lciAmJiBvd25lci5pZCAhPSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSAmJiB0aGlzLmxhbmd1YWdlID09IFwicnVieVwiKSB7XG4gICAgICByZXR1cm4gYCR7bW9kdWxlQ2xhc3NOYW1lKG93bmVyLmlkKX06OiR7ZXJyb3IubmFtZX1gXG4gICAgfVxuICAgIGlmIChpbXBvcnRlZCAmJiAodGhpcy5sYW5ndWFnZSA9PSBcImphdmFzY3JpcHRcIiB8fCB0aGlzLmxhbmd1YWdlID09IFwidHlwZXNjcmlwdFwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIikpIHtcbiAgICAgIHJldHVybiB0aGlzLmltcG9ydE5hbWVGb3IoaW1wb3J0ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG93bmVyID8gZXJyb3IubmFtZSA6IHRoaXMuY2FwYWJpbGl0eU5vbWluYWxOYW1lKGVycm9yLm5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIG5vbWluYWwgbmFtZSBvd25lZCBieSBhIGNvbXBpbGVyLWF1dGhvcml6ZWQgY2FwYWJpbGl0eS5cbiAgICogUEhQIHByb2dyYW0gZW50cmllcyBsaXZlIGluIGEgZ2VuZXJhdGVkIG5hbWVzcGFjZSB3aGlsZSBzdGRsaWIgcHJvdmlkZXIgY2xhc3NlcyByZW1haW5cbiAgICogZ2xvYmFsLCBzbyBQSFAgcHJvZ3JhbSBtb2RlIGZ1bGx5IHF1YWxpZmllcyBjYXBhYmlsaXR5IG5hbWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIG5vbWluYWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IHNwZWxsaW5nLlxuICAgKi9cbiAgY2FwYWJpbGl0eU5vbWluYWxOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJwaHBcIiA/IGBcXFxcJHtuYW1lfWAgOiBuYW1lXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHNwZWxsaW5nIGZvciBhIHJlc29sdmVkIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQ2FsbEV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBSZXNvbHZlZCBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUYXJnZXQgY2FsbCBuYW1lLlxuICAgKi9cbiAgY2FsbE5hbWVGb3IoZXhwcmVzc2lvbikge1xuICAgIGlmICh0aGlzLmNhbGxOYW1lUmVzb2x2ZXIpIHJldHVybiB0aGlzLmNhbGxOYW1lUmVzb2x2ZXIoZXhwcmVzc2lvbilcbiAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uPy5kZWNsYXJhdGlvbklkXG4gICAgY29uc3Qgb3duZXIgPSBkZWNsYXJhdGlvbklkID8gdGhpcy5kZWNsYXJhdGlvbk1vZHVsZXMuZ2V0KGRlY2xhcmF0aW9uSWQpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgaW1wb3J0ZWQgPSBkZWNsYXJhdGlvbklkID8gdGhpcy4jcHJvZ3JhbU1vZHVsZSgpPy5pbXBvcnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZGVjbGFyYXRpb25JZCA9PSBkZWNsYXJhdGlvbklkKSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIgJiYgIXRoaXMucHJvZ3JhbSAmJiB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCA+IDApIHJldHVybiBgTWFpbi4ke2V4cHJlc3Npb24uY2FsbGVlfWBcbiAgICBpZiAoIWRlY2xhcmF0aW9uSWQgfHwgIXRoaXMucHJvZ3JhbSB8fCAhb3duZXIgfHwgb3duZXIuaWQgPT0gUmVmbGVjdC5nZXQodGhpcy5tb2R1bGUsIFwiaWRcIikpIHJldHVybiBleHByZXNzaW9uLmNhbGxlZVxuICAgIGlmICh0aGlzLmxhbmd1YWdlID09IFwicnVieVwiIHx8IHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHJldHVybiBgJHttb2R1bGVDbGFzc05hbWUob3duZXIuaWQpfS4ke2RlY2xhcmF0aW9uTmFtZShvd25lciwgZGVjbGFyYXRpb25JZCl9YFxuICAgIGlmIChpbXBvcnRlZCkgcmV0dXJuIHRoaXMuaW1wb3J0TmFtZUZvcihpbXBvcnRlZClcblxuICAgIHJldHVybiBkZWNsYXJhdGlvbk5hbWUob3duZXIsIGRlY2xhcmF0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHRhcmdldC1jb250YWluZXIgdHJhaWxpbmcgYXJndW1lbnQgZm9yIGEgc2VtYW50aWMgY2FsbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbn0gX2V4cHJlc3Npb24gLSBSZXNvbHZlZCBzZW1hbnRpYyBjYWxsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTeW50aGV0aWMgYXJndW1lbnQgc3BlbGxpbmcsIHdoZW4gY29uZmlndXJlZC5cbiAgICovXG4gIGNhbGxBcmd1bWVudFN1ZmZpeEZvcihfZXhwcmVzc2lvbikge1xuICAgIHJldHVybiB0aGlzLmNhbGxBcmd1bWVudFN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBzdHJpbmcgZXF1YWxpdHkgbXVzdCBhdm9pZCBhIHRhcmdldCBydW50aW1lIGhlbHBlci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdG8gZW1pdCB0aGUgcGxhdGZvcm0gU3RyaW5nIG1ldGhvZC5cbiAgICovXG4gIHVzZXNNZXRob2RTdHJpbmdFcXVhbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RTdHJpbmdFcXVhbGl0eVxuICB9XG5cbiAgLyoqIE1hcmtzIGVtaXNzaW9uIGFzIG9jY3VycmluZyBpbnNpZGUgb25lIHRvcC1sZXZlbCByZWZlcmVuY2UgY2xhc3MuICovXG4gIGJlZ2luUmVmZXJlbmNlQ2xhc3NFbWlzc2lvbigpIHtcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCArPSAxXG4gIH1cblxuICAvKiogRW5kcyBvbmUgYmFsYW5jZWQgdG9wLWxldmVsIHJlZmVyZW5jZS1jbGFzcyBlbWlzc2lvbiBzY29wZS4gKi9cbiAgZW5kUmVmZXJlbmNlQ2xhc3NFbWlzc2lvbigpIHtcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VDbGFzc0VtaXNzaW9uRGVwdGggPT0gMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSZWZlcmVuY2UtY2xhc3MgZW1pc3Npb24gc2NvcGUgaXMgbm90IGFjdGl2ZS5cIilcbiAgICB0aGlzLnJlZmVyZW5jZUNsYXNzRW1pc3Npb25EZXB0aCAtPSAxXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFyZ2V0LWxvY2FsIGJpbmRpbmcgZm9yIG9uZSByZXNvbHZlZCBpbXBvcnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNJbXBvcnR9IGltcG9ydGVkIC0gUmVzb2x2ZWQgaW1wb3J0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBFbWl0dGVkIGltcG9ydCBuYW1lLlxuICAgKi9cbiAgaW1wb3J0TmFtZUZvcihpbXBvcnRlZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IHRoaXMuI3Byb2dyYW1Nb2R1bGUoKVxuXG4gICAgaWYgKCF0aGlzLnByb2dyYW0gfHwgIW1vZHVsZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbXBvcnQgbmFtZXMgcmVxdWlyZSBhIHZhbGlkYXRlZCBzZW1hbnRpYyBwcm9ncmFtLlwiKVxuXG4gICAgcmV0dXJuIHByb2dyYW1JbXBvcnROYW1lKHRoaXMucHJvZ3JhbSwgbW9kdWxlLCBpbXBvcnRlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgb25lIGxvY2FsIGRlY2xhcmF0aW9uIGlzIGV4cG9ydGVkIGJ5IHRoZSBjdXJyZW50IHByb2dyYW0gbW9kdWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gZGVjbGFyYXRpb25JZCAtIERlY2xhcmF0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBoYXMgYSBzYW1lLW5hbWUgcHJvZ3JhbSBleHBvcnQuXG4gICAqL1xuICBpc0RpcmVjdGx5RXhwb3J0ZWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IC8qKiBAdHlwZSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSAqLyAodGhpcy5tb2R1bGUpXG5cbiAgICByZXR1cm4gdHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1vZHVsZS5leHBvcnRzPy5zb21lKChpdGVtKSA9PlxuICAgICAgaXRlbS5kZWNsYXJhdGlvbklkID09IGRlY2xhcmF0aW9uSWQgJiYgaXRlbS5leHBvcnRlZE5hbWUgPT0gZGVjbGFyYXRpb25OYW1lKG1vZHVsZSwgZGVjbGFyYXRpb25JZCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBvbmUgZXhwb3J0IGVkZ2UgdXNlcyBpdHMgZGVjbGFyYXRpb24ncyBlbWl0dGVkIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNFeHBvcnR9IGV4cG9ydGVkIC0gQ3VycmVudCBleHBvcnQgZWRnZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBlZGdlIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBkZWNsYXJhdGlvbiBwcmVmaXguXG4gICAqL1xuICBpc0RpcmVjdEV4cG9ydChleHBvcnRlZCkge1xuICAgIHJldHVybiBleHBvcnRlZC5leHBvcnRlZE5hbWUgPT0gZGVjbGFyYXRpb25OYW1lKHRoaXMubW9kdWxlLCBleHBvcnRlZC5kZWNsYXJhdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciBvbmUgbG9jYWwgZGVjbGFyYXRpb24gaGFzIGFueSBwdWJsaWMgcHJvZ3JhbSBleHBvcnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBkZWNsYXJhdGlvbklkIC0gRGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvcnRlZC5cbiAgICovXG4gIGlzRXhwb3J0ZWQoZGVjbGFyYXRpb25JZCkge1xuICAgIGNvbnN0IG1vZHVsZSA9IC8qKiBAdHlwZSB7UGFydGlhbDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb2dyYW1Nb2R1bGU+fSAqLyAodGhpcy5tb2R1bGUpXG5cbiAgICByZXR1cm4gdHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiBCb29sZWFuKG1vZHVsZS5leHBvcnRzPy5zb21lKChpdGVtKSA9PiBpdGVtLmRlY2xhcmF0aW9uSWQgPT0gZGVjbGFyYXRpb25JZCkpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgdGhlIHNlbGVjdGVkIHByb2dyYW0gZW50cnkgbW9kdWxlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIHdyaXRlciBvd25zIHRoZSBzZWxlY3RlZCBlbnRyeS5cbiAgICovXG4gIGlzUHJvZ3JhbUVudHJ5KCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyYW0/LmVudHJ5TW9kdWxlID09IFJlZmxlY3QuZ2V0KHRoaXMubW9kdWxlLCBcImlkXCIpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGNsYXNzL21vZHVsZSBzZWdtZW50IGZvciBhIGxvZ2ljYWwgbW9kdWxlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgLSBMb2dpY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGFyZ2V0IGNsYXNzL21vZHVsZSBuYW1lLlxuICAgKi9cbiAgcHJvZ3JhbU1vZHVsZU5hbWUobW9kdWxlSWQpIHtcbiAgICBpZiAoIXRoaXMucHJvZ3JhbT8ubW9kdWxlcy5zb21lKCh7aWR9KSA9PiBpZCA9PSBtb2R1bGVJZCkpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHByb2dyYW0gbW9kdWxlICcke21vZHVsZUlkfScuYClcblxuICAgIHJldHVybiBtb2R1bGVDbGFzc05hbWUobW9kdWxlSWQpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGN1cnJlbnQgbW9kdWxlIGluIHRoZSBjb21wbGV0ZSBwcm9ncmFtLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNQcm9ncmFtTW9kdWxlIHwgdW5kZWZpbmVkfSBDdXJyZW50IHByb2dyYW0gbW9kdWxlLlxuICAgKi9cbiAgI3Byb2dyYW1Nb2R1bGUoKSB7XG4gICAgaWYgKCF0aGlzLnByb2dyYW0pIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiB0aGlzLnByb2dyYW0ubW9kdWxlcy5maW5kKCh7aWR9KSA9PiBpZCA9PSBSZWZsZWN0LmdldCh0aGlzLm1vZHVsZSwgXCJpZFwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgRVNNL3JlcXVpcmUgc3BlY2lmaWVyIGZvciBhIHBsYW5uZWQgZGVwZW5kZW5jeSBhcnRpZmFjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC0gRGVwZW5kZW5jeSBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0ZW5zaW9uXSAtIE9wdGlvbmFsIHJlcGxhY2VtZW50IGV4dGVuc2lvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVsYXRpdmUgUE9TSVggc3BlY2lmaWVyLlxuICAgKi9cbiAgcmVsYXRpdmVNb2R1bGVTcGVjaWZpZXIobW9kdWxlSWQsIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSB0aGlzLnByb2dyYW1QYXRocz8uZ2V0KG1vZHVsZUlkKVxuXG4gICAgaWYgKCF0YXJnZXRQYXRoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBwbGFubmVkIG1vZHVsZSBwYXRoICcke21vZHVsZUlkfScuYClcbiAgICBjb25zdCBhZGp1c3RlZFRhcmdldCA9IGV4dGVuc2lvbiA/IHRhcmdldFBhdGgucmVwbGFjZSgvXFwuW14uL10rJC91LCBleHRlbnNpb24pIDogdGFyZ2V0UGF0aFxuICAgIGNvbnN0IGZyb20gPSB0aGlzLmZpbGVuYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSlcbiAgICBjb25zdCB0byA9IGFkanVzdGVkVGFyZ2V0LnNwbGl0KFwiL1wiKVxuICAgIGxldCBjb21tb24gPSAwXG5cbiAgICB3aGlsZSAoY29tbW9uIDwgZnJvbS5sZW5ndGggJiYgY29tbW9uIDwgdG8ubGVuZ3RoICYmIGZyb21bY29tbW9uXSA9PSB0b1tjb21tb25dKSBjb21tb24rK1xuICAgIGNvbnN0IHJlbGF0aXZlID0gWy4uLmZyb20uc2xpY2UoY29tbW9uKS5tYXAoKCkgPT4gXCIuLlwiKSwgLi4udG8uc2xpY2UoY29tbW9uKV0uam9pbihcIi9cIilcblxuICAgIHJldHVybiByZWxhdGl2ZS5zdGFydHNXaXRoKFwiLlwiKSA/IHJlbGF0aXZlIDogYC4vJHtyZWxhdGl2ZX1gXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvdGVjdGVkIG5hdGl2ZSBlbnRyeSBmb3Igb25lIHVzZWQgc3RkbGliIHByb3ZpZGVyIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FZmZlY3RPcGVyYXRpb25EZWNsYXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2Fub25pY2FsIG9wZXJhdGlvbiBkZWNsYXJhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gTGlua2VkIHByb3RlY3RlZCBlbnRyeSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBzdGF5cyBpbmxpbmVkLlxuICAgKi9cbiAgc3RkbGliUHJvdmlkZXJFbnRyeUZvcihvcGVyYXRpb24pIHtcbiAgICBjb25zdCBtb2R1bGUgPSB0aGlzLmVmZmVjdE9wZXJhdGlvbk1vZHVsZXMuZ2V0KG9wZXJhdGlvbi5pZClcblxuICAgIHJldHVybiBtb2R1bGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuc3RkbGliUHJvdmlkZXJFbnRyaWVzPy5bYCR7bW9kdWxlfVxcdTAwMDAke29wZXJhdGlvbi5uYW1lfWBdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlbGF0aXZlIHNwZWNpZmllciBmb3IgdGhlIHBsYW5uZWQgc3RkbGliIHByb3ZpZGVyIGFydGlmYWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dGVuc2lvbl0gLSBPcHRpb25hbCByZXBsYWNlbWVudCBleHRlbnNpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvdmlkZXJQYXRoXSAtIE9uZSBzZWxlY3RlZCBwcm92aWRlciBhcnRpZmFjdCBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZWxhdGl2ZSBQT1NJWCBzcGVjaWZpZXIuXG4gICAqL1xuICBzdGRsaWJQcm92aWRlclNwZWNpZmllcihleHRlbnNpb24sIHByb3ZpZGVyUGF0aCkge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwcm92aWRlclBhdGggPz8gdGhpcy5zdGRsaWJQcm92aWRlclBhdGggPz8gdGhpcy5zdGRsaWJQcm92aWRlclBhdGhzPy5bMF1cblxuICAgIGlmICghdGFyZ2V0UGF0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHN0ZGxpYiBwcm92aWRlciBzcGVjaWZpZXIgcmVxdWlyZXMgYSBwbGFubmVkIHByb3ZpZGVyIHBhdGguXCIpXG4gICAgY29uc3QgYWRqdXN0ZWRUYXJnZXQgPSBleHRlbnNpb24gPyB0YXJnZXRQYXRoLnJlcGxhY2UoL1xcLlteLi9dKyQvdSwgZXh0ZW5zaW9uKSA6IHRhcmdldFBhdGhcbiAgICBjb25zdCBmcm9tID0gdGhpcy5maWxlbmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpXG4gICAgY29uc3QgdG8gPSBhZGp1c3RlZFRhcmdldC5zcGxpdChcIi9cIilcbiAgICBsZXQgY29tbW9uID0gMFxuXG4gICAgd2hpbGUgKGNvbW1vbiA8IGZyb20ubGVuZ3RoICYmIGNvbW1vbiA8IHRvLmxlbmd0aCAmJiBmcm9tW2NvbW1vbl0gPT0gdG9bY29tbW9uXSkgY29tbW9uKytcbiAgICBjb25zdCByZWxhdGl2ZSA9IFsuLi5mcm9tLnNsaWNlKGNvbW1vbikubWFwKCgpID0+IFwiLi5cIiksIC4uLnRvLnNsaWNlKGNvbW1vbildLmpvaW4oXCIvXCIpXG5cbiAgICByZXR1cm4gcmVsYXRpdmUuc3RhcnRzV2l0aChcIi5cIikgPyByZWxhdGl2ZSA6IGAuLyR7cmVsYXRpdmV9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5IGZvciB0YXJnZXQgZW1pc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZElkIC0gU2VtYW50aWMgZmllbGQgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWNvcmRGaWVsZH0gUmVjb3JkIGZpZWxkLlxuICAgKi9cbiAgZmllbGRGb3JJZChmaWVsZElkKSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHZhbGlkYXRlZCBmaWVsZCBpZGVudGl0eSAnJHtmaWVsZElkfScuYClcblxuICAgIHJldHVybiBmaWVsZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSByZWNvcmQgZGVjbGFyYXRpb24gdGhhdCBvd25zIGEgdmFsaWRhdGVkIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRJZCAtIFNlbWFudGljIGZpZWxkIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IE93bmluZyByZWNvcmQuXG4gICAqL1xuICByZWNvcmRGb3JGaWVsZElkKGZpZWxkSWQpIHtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmZpZWxkUmVjb3Jkcy5nZXQoZmllbGRJZClcblxuICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biB2YWxpZGF0ZWQgZmllbGQgaWRlbnRpdHkgJyR7ZmllbGRJZH0nLmApXG5cbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0cyB3aGV0aGVyIGFuIGV4YWN0IHBhcnNlci1vd25lZCByb2xlIHJhbmdlIGlzIGF2YWlsYWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZvciBhIHNoYXJlZCBub2RlIG9jY3VycmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb2xlIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHJvbGUgaGFzIGFuIGV4YWN0IHNvdXJjZSByYW5nZS5cbiAgICovXG4gIGhhc1JhbmdlKG5vZGUsIHBhdGgsIHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSwgcGF0aCkucmFuZ2VzW3JvbGVdICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGV4dCBtYXBwZWQgdG8gYSBzZW1hbnRpYyBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYW5ub3RhdGlvbiAtIE1hcHBpbmcgYW5ub3RhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IGFubm90YXRpb24ubm9kZSAtIFNlbWFudGljIG5vZGUuXG4gICAqIEBwYXJhbSB7XCJleGFjdFwiIHwgXCJhbmNob3JcIn0gYW5ub3RhdGlvbi5tYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ucm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Fubm90YXRpb24ubmFtZV0gLSBTb3VyY2UgTWFwIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYW5ub3RhdGlvbi5wYXRoXSAtIEpTT04gUG9pbnRlciBmb3IgYSBzaGFyZWQgbm9kZSBvY2N1cnJlbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG1hcHBlZCh0ZXh0LCB7bWFwcGluZ0tpbmQsIG5hbWUsIG5vZGUsIHBhdGgsIHJvbGV9KSB7XG4gICAgaWYgKHRleHQubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5pbmRleC5yZWNvcmRGb3Iobm9kZSwgcGF0aClcbiAgICBjb25zdCByb2xlTG9jYXRpb24gPSByb2xlID8gcmVjb3JkLnJhbmdlc1tyb2xlXSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG9yaWdpbiA9IHJvbGVMb2NhdGlvbiA/IHRoaXMuI3NvdXJjZU9yaWdpbihyb2xlTG9jYXRpb24sIHJlY29yZC5vcmlnaW4pIDogcmVjb3JkLm9yaWdpblxuICAgIGNvbnN0IHByZWNpc2lvbiA9IG1hcHBpbmdLaW5kID09IFwiZXhhY3RcIiAmJiByb2xlICYmICFyb2xlTG9jYXRpb24gPyBcImFuY2hvclwiIDogbWFwcGluZ0tpbmRcbiAgICBjb25zdCBzeW1ib2wgPSByZWNvcmQuc3ltYm9sSWRcbiAgICAgID8gdGhpcy5pbmRleC5wcm92ZW5hbmNlLnN5bWJvbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gcmVjb3JkLnN5bWJvbElkKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuI2FwcGVuZCh0ZXh0LCB7XG4gICAgICBtYXBwaW5nS2luZDogcHJlY2lzaW9uLFxuICAgICAgbmFtZTogbmFtZSA/PyBzeW1ib2w/Lm5hbWUsXG4gICAgICBub2RlSWQ6IHJlY29yZC5pZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHJvbGUsXG4gICAgICBzeW1ib2xJZDogcmVjb3JkLnN5bWJvbElkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgc291cmNlLWZyZWUgc2NhZmZvbGRpbmcgd2l0aCBvcHRpb25hbCBzZW1hbnRpYyBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIEdlbmVyYXRlZCB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIHJlYXNvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVbXX0gW3JlbGF0ZWROb2Rlc10gLSBSZWxhdGVkIG5vZGVzLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCB1bmRlZmluZWQpW119IFtyZWxhdGVkUGF0aHNdIC0gT2NjdXJyZW5jZSBwYXRocyBmb3Igc2hhcmVkIHJlbGF0ZWQgbm9kZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3ludGhldGljKHRleHQsIHJlYXNvbiwgcmVsYXRlZE5vZGVzID0gW10sIHJlbGF0ZWRQYXRocyA9IFtdKSB7XG4gICAgaWYgKHRleHQubGVuZ3RoID09IDApIHJldHVyblxuXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gICAgY29uc3QgcmVsYXRlZE9yaWdpbnMgPSByZWxhdGVkTm9kZXMuZmxhdE1hcCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuaW5kZXgucmVjb3JkRm9yKG5vZGUsIHJlbGF0ZWRQYXRoc1tpbmRleF0pXG5cbiAgICAgIHJldHVybiByZWxhdGVkT3JpZ2luc0ZvcihyZWNvcmQub3JpZ2luKS5mbGF0TWFwKChyZWxhdGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWwgPSB7XG4gICAgICAgICAgLi4ucmVsYXRlZCxcbiAgICAgICAgICBub2RlSWQ6IHJlbGF0ZWQubm9kZUlkID8/IHJlY29yZC5pZCxcbiAgICAgICAgICByb2xlOiByZWxhdGVkLnJvbGUgPz8gXCJjb250ZXh0XCJcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSByZWxhdGVkT3JpZ2luS2V5KGNvbnRleHR1YWwpXG5cbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBbXVxuICAgICAgICBzZWVuLmFkZChrZXkpXG5cbiAgICAgICAgcmV0dXJuIFtjb250ZXh0dWFsXVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy4jYXBwZW5kKHRleHQsIHttYXBwaW5nS2luZDogXCJzeW50aGV0aWNcIiwgb3JpZ2luOiB7a2luZDogXCJzeW50aGV0aWNcIiwgcmVhc29uLCByZWxhdGVkT3JpZ2luc319KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml0YXRpdmUgcmljaCBtYXAgZm9yIHRoZSBjdXJyZW50IGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmd9IE1hcHBpbmcuXG4gICAqL1xuICBmaW5pc2goKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICAgIGdlbmVyYXRlZDoge2NvbnRlbnQ6IHRoaXMuY29kZSwgZmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlfSxcbiAgICAgIG5vZGVzOiBbLi4udGhpcy5pbmRleC5wcm92ZW5hbmNlLm5vZGVzXSxcbiAgICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZE1hcHBpbmdcIixcbiAgICAgIHNvdXJjZXM6IFsuLi50aGlzLmluZGV4LnByb3ZlbmFuY2Uuc291cmNlc10sXG4gICAgICBzcGFuczogWy4uLnRoaXMuc3BhbnNdLFxuICAgICAgc3ltYm9sczogWy4uLnRoaXMuaW5kZXgucHJvdmVuYW5jZS5zeW1ib2xzXSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBvbmUgbWFwcGVkIHNwYW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gR2VuZXJhdGVkIHRleHQuXG4gICAqIEBwYXJhbSB7T21pdDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBcImdlbmVyYXRlZFwiPn0gYW5ub3RhdGlvbiAtIFNwYW4gYW5ub3RhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAjYXBwZW5kKHRleHQsIGFubm90YXRpb24pIHtcbiAgICBpZiAodGV4dC5pbmNsdWRlcyhcIlxcclwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRlZCBvdXRwdXQgbXVzdCB1c2UgZGV0ZXJtaW5pc3RpYyBMRiBsaW5lIGVuZGluZ3MuXCIpXG5cbiAgICBjb25zdCBzdGFydCA9IHtjb2x1bW46IHRoaXMuY29sdW1uLCBsaW5lOiB0aGlzLmxpbmUsIG9mZnNldDogdGhpcy5vZmZzZXR9XG5cbiAgICB0aGlzLnBhcnRzLnB1c2godGV4dClcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGV4dC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHRoaXMub2Zmc2V0KytcbiAgICAgIGlmICh0ZXh0W2luZGV4XSA9PSBcIlxcblwiKSB7XG4gICAgICAgIHRoaXMubGluZSsrXG4gICAgICAgIHRoaXMuY29sdW1uID0gMVxuICAgICAgfSBlbHNlIHRoaXMuY29sdW1uKytcbiAgICB9XG4gICAgY29uc3QgY29tcGFjdCA9IC8qKiBAdHlwZSB7T21pdDxpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpZm9sZE1hcHBpbmdTcGFuLCBcImdlbmVyYXRlZFwiPn0gKi8gKFxuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGFubm90YXRpb24pLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSlcbiAgICApXG5cbiAgICB0aGlzLnNwYW5zLnB1c2goe1xuICAgICAgLi4uY29tcGFjdCxcbiAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICBlbmQ6IHtjb2x1bW46IHRoaXMuY29sdW1uLCBsaW5lOiB0aGlzLmxpbmUsIG9mZnNldDogdGhpcy5vZmZzZXR9LFxuICAgICAgICBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSxcbiAgICAgICAgc3RhcnRcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3Qgcm9sZSBvcmlnaW4gdXNpbmcgY2Fub25pY2FsIHNvdXJjZSBpZGVudGl0aWVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJvbGUgcmFuZ2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IGZhbGxiYWNrIC0gT3duaW5nIG9yaWdpbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBSb2xlIG9yaWdpbi5cbiAgICovXG4gICNzb3VyY2VPcmlnaW4obG9jYXRpb24sIGZhbGxiYWNrKSB7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGZhbGxiYWNrU291cmNlSWRcblxuICAgIGlmIChmYWxsYmFjay5raW5kID09IFwic291cmNlXCIgJiYgZmFsbGJhY2subG9jYXRpb24uZmlsZW5hbWUgPT0gbG9jYXRpb24uZmlsZW5hbWUpIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5zb3VyY2VJZFxuICAgIGVsc2UgaWYgKGZhbGxiYWNrLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHtcbiAgICAgIGZhbGxiYWNrU291cmNlSWQgPSBmYWxsYmFjay5vcmlnaW5zLmZpbmQoKG9yaWdpbikgPT4gb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKT8uc291cmNlSWRcbiAgICB9IGVsc2UgaWYgKGZhbGxiYWNrLmtpbmQgPT0gXCJzeW50aGV0aWNcIikge1xuICAgICAgZmFsbGJhY2tTb3VyY2VJZCA9IGZhbGxiYWNrLnJlbGF0ZWRPcmlnaW5zLmZpbmQoKG9yaWdpbikgPT4gb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKT8uc291cmNlSWRcbiAgICB9XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5pbmRleC5wcm92ZW5hbmNlLnNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gZmFsbGJhY2tTb3VyY2VJZCkgPz9cbiAgICAgIHRoaXMuaW5kZXgucHJvdmVuYW5jZS5zb3VyY2VzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKVxuXG4gICAgcmV0dXJuIHNvdXJjZSA/IHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH0gOiBmYWxsYmFja1xuICB9XG59XG5cbi8qKlxuICogRXhwYW5kcyBldmVyeSBjbG9zZWQgcHJvdmVuYW5jZSByYW5nZSBpbiBzZW1hbnRpYyBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIENsb3NlZCBwcm92ZW5hbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW5bXX0gUmVsYXRlZCByYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0ZWRPcmlnaW5zRm9yKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIFt7bG9jYXRpb246IG9yaWdpbi5sb2NhdGlvbiwgc291cmNlSWQ6IG9yaWdpbi5zb3VyY2VJZH1dXG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIikgcmV0dXJuIG9yaWdpbi5vcmlnaW5zXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGVybWluaXN0aWMgaWRlbnRpdHkgZm9yIG9uZSBjb250ZXh0dWFsIHJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSBvcmlnaW4gLSBSZWxhdGVkIG9yaWdpbi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRlZE9yaWdpbktleShvcmlnaW4pIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBvcmlnaW4uc291cmNlSWQsXG4gICAgb3JpZ2luLmxvY2F0aW9uLmZpbGVuYW1lLFxuICAgIG9yaWdpbi5sb2NhdGlvbi5zdGFydC5vZmZzZXQsXG4gICAgb3JpZ2luLmxvY2F0aW9uLmVuZC5vZmZzZXQsXG4gICAgb3JpZ2luLm5vZGVJZCA/PyBudWxsLFxuICAgIG9yaWdpbi5zeW1ib2xJZCA/PyBudWxsLFxuICAgIG9yaWdpbi5yb2xlID8/IG51bGxcbiAgXSlcbn1cbiJdfQ==