semantifold 0.1.1 → 0.3.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 (399) hide show
  1. package/README.md +42 -10
  2. package/build/index.d.ts +32 -3
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +99 -4
  5. package/build/src/acceptance.d.ts +32 -0
  6. package/build/src/acceptance.d.ts.map +1 -0
  7. package/build/src/acceptance.js +358 -0
  8. package/build/src/array.d.ts +7 -0
  9. package/build/src/array.d.ts.map +1 -0
  10. package/build/src/array.js +18 -0
  11. package/build/src/artifact-path.d.ts +13 -0
  12. package/build/src/artifact-path.d.ts.map +1 -0
  13. package/build/src/artifact-path.js +30 -0
  14. package/build/src/artifacts.d.ts +7 -0
  15. package/build/src/artifacts.d.ts.map +1 -0
  16. package/build/src/artifacts.js +389 -0
  17. package/build/src/backends/c-runtime.d.ts +3 -0
  18. package/build/src/backends/c-runtime.d.ts.map +1 -0
  19. package/build/src/backends/c-runtime.js +151 -0
  20. package/build/src/backends/c-validation.d.ts +12 -0
  21. package/build/src/backends/c-validation.d.ts.map +1 -0
  22. package/build/src/backends/c-validation.js +85 -0
  23. package/build/src/backends/c.d.ts +31 -0
  24. package/build/src/backends/c.d.ts.map +1 -0
  25. package/build/src/backends/c.js +308 -0
  26. package/build/src/backends/cpp-runtime.d.ts +3 -0
  27. package/build/src/backends/cpp-runtime.d.ts.map +1 -0
  28. package/build/src/backends/cpp-runtime.js +99 -0
  29. package/build/src/backends/cpp-validation.d.ts +9 -0
  30. package/build/src/backends/cpp-validation.d.ts.map +1 -0
  31. package/build/src/backends/cpp-validation.js +74 -0
  32. package/build/src/backends/cpp.d.ts +16 -0
  33. package/build/src/backends/cpp.d.ts.map +1 -0
  34. package/build/src/backends/cpp.js +285 -0
  35. package/build/src/backends/csharp.d.ts +20 -0
  36. package/build/src/backends/csharp.d.ts.map +1 -0
  37. package/build/src/backends/csharp.js +259 -0
  38. package/build/src/backends/go.d.ts +20 -0
  39. package/build/src/backends/go.d.ts.map +1 -0
  40. package/build/src/backends/go.js +374 -0
  41. package/build/src/backends/identifiers.d.ts +12 -0
  42. package/build/src/backends/identifiers.d.ts.map +1 -1
  43. package/build/src/backends/identifiers.js +79 -2
  44. package/build/src/backends/index.d.ts.map +1 -1
  45. package/build/src/backends/index.js +27 -37
  46. package/build/src/backends/native-validation.d.ts +9 -0
  47. package/build/src/backends/native-validation.d.ts.map +1 -0
  48. package/build/src/backends/native-validation.js +59 -0
  49. package/build/src/backends/ordered-expressions.d.ts +74 -0
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -0
  51. package/build/src/backends/ordered-expressions.js +159 -0
  52. package/build/src/backends/python.d.ts +8 -0
  53. package/build/src/backends/python.d.ts.map +1 -0
  54. package/build/src/backends/python.js +162 -0
  55. package/build/src/backends/scalars.d.ts.map +1 -1
  56. package/build/src/backends/scalars.js +8 -2
  57. package/build/src/backends/shared.d.ts.map +1 -1
  58. package/build/src/backends/shared.js +67 -19
  59. package/build/src/binary-mapping.d.ts +32 -0
  60. package/build/src/binary-mapping.d.ts.map +1 -0
  61. package/build/src/binary-mapping.js +285 -0
  62. package/build/src/diagnostic.d.ts +36 -4
  63. package/build/src/diagnostic.d.ts.map +1 -1
  64. package/build/src/diagnostic.js +42 -3
  65. package/build/src/frontends/c-parser.d.ts +20 -0
  66. package/build/src/frontends/c-parser.d.ts.map +1 -0
  67. package/build/src/frontends/c-parser.js +14 -0
  68. package/build/src/frontends/c.d.ts +220 -0
  69. package/build/src/frontends/c.d.ts.map +1 -0
  70. package/build/src/frontends/c.js +750 -0
  71. package/build/src/frontends/cpp-parser.d.ts +11 -0
  72. package/build/src/frontends/cpp-parser.d.ts.map +1 -0
  73. package/build/src/frontends/cpp-parser.js +15 -0
  74. package/build/src/frontends/cpp.d.ts +227 -0
  75. package/build/src/frontends/cpp.d.ts.map +1 -0
  76. package/build/src/frontends/cpp.js +784 -0
  77. package/build/src/frontends/csharp.d.ts +14 -0
  78. package/build/src/frontends/csharp.d.ts.map +1 -0
  79. package/build/src/frontends/csharp.js +708 -0
  80. package/build/src/frontends/go.d.ts +15 -0
  81. package/build/src/frontends/go.d.ts.map +1 -0
  82. package/build/src/frontends/go.js +712 -0
  83. package/build/src/frontends/index.d.ts.map +1 -1
  84. package/build/src/frontends/index.js +5 -23
  85. package/build/src/frontends/python.d.ts +14 -0
  86. package/build/src/frontends/python.d.ts.map +1 -0
  87. package/build/src/frontends/python.js +615 -0
  88. package/build/src/frontends/scalars.d.ts.map +1 -1
  89. package/build/src/frontends/scalars.js +21 -1
  90. package/build/src/language-registry.d.ts +113 -0
  91. package/build/src/language-registry.d.ts.map +1 -0
  92. package/build/src/language-registry.js +421 -0
  93. package/build/src/mapping.js +3 -2
  94. package/build/src/semantic/location.d.ts +7 -0
  95. package/build/src/semantic/location.d.ts.map +1 -1
  96. package/build/src/semantic/location.js +10 -1
  97. package/build/src/semantic/provenance.js +3 -3
  98. package/build/src/semantic/types.d.ts +399 -2
  99. package/build/src/semantic/types.d.ts.map +1 -1
  100. package/build/src/semantic/types.js +110 -2
  101. package/build/src/subprocess.d.ts +38 -0
  102. package/build/src/subprocess.d.ts.map +1 -0
  103. package/build/src/subprocess.js +233 -0
  104. package/build/src/timeout.d.ts +8 -0
  105. package/build/src/timeout.d.ts.map +1 -0
  106. package/build/src/timeout.js +11 -0
  107. package/build/src/toolchains.d.ts +107 -0
  108. package/build/src/toolchains.d.ts.map +1 -0
  109. package/build/src/toolchains.js +417 -0
  110. package/docs/architecture.md +23 -5
  111. package/docs/c.md +60 -0
  112. package/docs/cpp.md +61 -0
  113. package/docs/goals.md +4 -2
  114. package/docs/language-support.md +46 -6
  115. package/docs/parser-qualification.md +219 -0
  116. package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
  117. package/docs/source-maps.md +38 -5
  118. package/docs/standard-library-portability.md +190 -0
  119. package/docs/testing.md +131 -3
  120. package/index.js +109 -4
  121. package/node_modules/node-addon-api/LICENSE.md +9 -0
  122. package/node_modules/node-addon-api/README.md +95 -0
  123. package/node_modules/node-addon-api/common.gypi +21 -0
  124. package/node_modules/node-addon-api/except.gypi +25 -0
  125. package/node_modules/node-addon-api/index.js +14 -0
  126. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  127. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  128. package/node_modules/node-addon-api/napi.h +3463 -0
  129. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  130. package/node_modules/node-addon-api/node_api.gyp +9 -0
  131. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  132. package/node_modules/node-addon-api/nothing.c +0 -0
  133. package/node_modules/node-addon-api/package-support.json +21 -0
  134. package/node_modules/node-addon-api/package.json +481 -0
  135. package/node_modules/node-addon-api/tools/README.md +73 -0
  136. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  137. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  138. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  139. package/node_modules/node-gyp-build/LICENSE +21 -0
  140. package/node_modules/node-gyp-build/README.md +58 -0
  141. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  142. package/node_modules/node-gyp-build/bin.js +84 -0
  143. package/node_modules/node-gyp-build/build-test.js +19 -0
  144. package/node_modules/node-gyp-build/index.js +6 -0
  145. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  146. package/node_modules/node-gyp-build/optional.js +7 -0
  147. package/node_modules/node-gyp-build/package.json +43 -0
  148. package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
  149. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
  150. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
  151. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
  152. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
  153. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
  154. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
  155. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  156. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  157. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  158. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  159. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  160. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  161. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  162. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  163. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
  164. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
  165. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  166. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
  167. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  168. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  169. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
  170. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
  171. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
  172. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
  173. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
  174. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
  175. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
  176. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
  177. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  178. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  179. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  180. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  181. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  182. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  183. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  184. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  185. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  186. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  187. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  188. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  189. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  190. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  191. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  192. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  193. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  194. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  195. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  196. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  197. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  198. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  199. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  200. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  236. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  237. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
  238. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  239. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
  240. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  241. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  242. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  243. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
  244. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
  245. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
  246. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  247. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  248. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
  249. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
  250. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
  251. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
  252. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
  253. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
  254. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
  255. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
  256. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
  257. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
  258. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
  259. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
  260. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
  261. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
  262. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
  263. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
  264. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
  265. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
  266. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
  267. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
  268. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
  269. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
  270. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
  271. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
  272. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
  273. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
  274. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
  275. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
  276. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
  277. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
  278. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
  279. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
  280. package/node_modules/tree-sitter/LICENSE +21 -0
  281. package/node_modules/tree-sitter/README.md +128 -0
  282. package/node_modules/tree-sitter/binding.gyp +88 -0
  283. package/node_modules/tree-sitter/index.js +950 -0
  284. package/node_modules/tree-sitter/package.json +76 -0
  285. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  286. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  287. package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  288. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  289. package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  290. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  291. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  292. package/node_modules/tree-sitter/src/binding.cc +35 -0
  293. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  294. package/node_modules/tree-sitter/src/conversions.h +22 -0
  295. package/node_modules/tree-sitter/src/language.cc +105 -0
  296. package/node_modules/tree-sitter/src/language.h +17 -0
  297. package/node_modules/tree-sitter/src/logger.cc +70 -0
  298. package/node_modules/tree-sitter/src/logger.h +19 -0
  299. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  300. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  301. package/node_modules/tree-sitter/src/node.cc +1088 -0
  302. package/node_modules/tree-sitter/src/node.h +30 -0
  303. package/node_modules/tree-sitter/src/parser.cc +332 -0
  304. package/node_modules/tree-sitter/src/parser.h +35 -0
  305. package/node_modules/tree-sitter/src/query.cc +425 -0
  306. package/node_modules/tree-sitter/src/query.h +40 -0
  307. package/node_modules/tree-sitter/src/tree.cc +316 -0
  308. package/node_modules/tree-sitter/src/tree.h +45 -0
  309. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  310. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  311. package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
  312. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  313. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  314. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  315. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  316. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  317. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  318. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  319. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  320. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  321. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  322. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  323. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  324. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  325. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  326. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  327. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  328. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  329. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
  330. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  331. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  332. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
  333. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
  334. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  335. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  336. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
  337. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  338. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  339. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  340. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  341. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  342. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
  343. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  344. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  345. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  346. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  347. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  348. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  349. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  350. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  351. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  352. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  353. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  354. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  355. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  356. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
  357. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  358. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
  359. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  360. package/package.json +24 -6
  361. package/src/acceptance.js +380 -0
  362. package/src/array.js +19 -0
  363. package/src/artifact-path.js +34 -0
  364. package/src/artifacts.js +420 -0
  365. package/src/backends/c-runtime.js +151 -0
  366. package/src/backends/c-validation.js +83 -0
  367. package/src/backends/c.js +308 -0
  368. package/src/backends/cpp-runtime.js +99 -0
  369. package/src/backends/cpp-validation.js +70 -0
  370. package/src/backends/cpp.js +285 -0
  371. package/src/backends/csharp.js +270 -0
  372. package/src/backends/go.js +383 -0
  373. package/src/backends/identifiers.js +80 -1
  374. package/src/backends/index.js +23 -32
  375. package/src/backends/native-validation.js +64 -0
  376. package/src/backends/ordered-expressions.js +161 -0
  377. package/src/backends/python.js +175 -0
  378. package/src/backends/scalars.js +8 -1
  379. package/src/backends/shared.js +64 -17
  380. package/src/binary-mapping.js +305 -0
  381. package/src/diagnostic.js +34 -2
  382. package/src/frontends/c-parser.js +17 -0
  383. package/src/frontends/c.js +780 -0
  384. package/src/frontends/cpp-parser.js +18 -0
  385. package/src/frontends/cpp.js +816 -0
  386. package/src/frontends/csharp.js +759 -0
  387. package/src/frontends/go.js +770 -0
  388. package/src/frontends/index.js +5 -20
  389. package/src/frontends/python.js +689 -0
  390. package/src/frontends/scalars.js +20 -0
  391. package/src/language-registry.js +454 -0
  392. package/src/mapping.js +2 -1
  393. package/src/semantic/location.js +10 -0
  394. package/src/semantic/provenance.js +2 -2
  395. package/src/semantic/types.js +124 -1
  396. package/src/subprocess.js +232 -0
  397. package/src/timeout.js +12 -0
  398. package/src/toolchains.js +448 -0
  399. package/tsconfig.json +1 -0
@@ -51,6 +51,13 @@ export declare function utf8ByteOffsetToUtf16Offset(source: string, byteOffset:
51
51
  * @returns {import("./types.js").SourceLocation} Source location.
52
52
  */
53
53
  export declare function locationFromOffsets(filename: string, source: string, startOffset: number, endOffset: number): import("./types.js").SourceLocation;
54
+ /**
55
+ * Checks the one-based lexicographic order of a source range's endpoints.
56
+ * @param {import("./types.js").SourcePoint} start - Inclusive range start.
57
+ * @param {import("./types.js").SourcePoint} end - Exclusive range end.
58
+ * @returns {boolean} Whether end is at or after start.
59
+ */
60
+ export declare function isSourceRangeOrdered(start: import("./types.js").SourcePoint, end: import("./types.js").SourcePoint): boolean;
54
61
  /**
55
62
  * Builds a location spanning a complete source file.
56
63
  * @param {string} filename - Originating filename.
@@ -1 +1 @@
1
- {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../../src/semantic/location.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAJnB,MAImB,EAAE,MAAM,EAH3B,MAG2B,GAFzB,OAAO,YAAY,EAAE,WAAW,CA6B5C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAHjC,MAGiC,GAF/B;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAC,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAJzB;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAIZ,EAAE,MAAM,EAHjC,MAGiC,GAF/B,OAAO,YAAY,EAAE,WAAW,CAqB5C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAL1B;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAKX,EAAE,IAAI,EAJhC,MAIgC,EAAE,MAAM,EAHxC,MAGwC,GAFtC,MAAM,CAYlB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAJvC,MAIuC,EAAE,UAAU,EAHnD,MAGmD,GAFjD,MAAM,CAsBlB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EANjC,MAMiC,EAAE,MAAM,EALzC,MAKyC,EAAE,WAAW,EAJtD,MAIsD,EAAE,SAAS,EAHjE,MAGiE,GAF/D,OAAO,YAAY,EAAE,cAAc,CAQ/C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAJ5B,MAI4B,EAAE,MAAM,EAHpC,MAGoC,GAFlC,OAAO,YAAY,EAAE,cAAc,CAI/C"}
1
+ {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../../src/semantic/location.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAJnB,MAImB,EAAE,MAAM,EAH3B,MAG2B,GAFzB,OAAO,YAAY,EAAE,WAAW,CA6B5C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAHjC,MAGiC,GAF/B;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAC,CAalD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAJzB;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAIZ,EAAE,MAAM,EAHjC,MAGiC,GAF/B,OAAO,YAAY,EAAE,WAAW,CAqB5C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAL1B;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAKX,EAAE,IAAI,EAJhC,MAIgC,EAAE,MAAM,EAHxC,MAGwC,GAFtC,MAAM,CAYlB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAJvC,MAIuC,EAAE,UAAU,EAHnD,MAGmD,GAFjD,MAAM,CAsBlB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EANjC,MAMiC,EAAE,MAAM,EALzC,MAKyC,EAAE,WAAW,EAJtD,MAIsD,EAAE,SAAS,EAHjE,MAGiE,GAF/D,OAAO,YAAY,EAAE,cAAc,CAQ/C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAJ/B,OAAO,YAAY,EAAE,WAIU,EAAE,GAAG,EAHpC,OAAO,YAAY,EAAE,WAGe,GAFlC,OAAO,CAInB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAJ5B,MAI4B,EAAE,MAAM,EAHpC,MAGoC,GAFlC,OAAO,YAAY,EAAE,cAAc,CAI/C"}
@@ -130,6 +130,15 @@ export function locationFromOffsets(filename, source, startOffset, endOffset) {
130
130
  end: pointAt(source, endOffset)
131
131
  };
132
132
  }
133
+ /**
134
+ * Checks the one-based lexicographic order of a source range's endpoints.
135
+ * @param {import("./types.js").SourcePoint} start - Inclusive range start.
136
+ * @param {import("./types.js").SourcePoint} end - Exclusive range end.
137
+ * @returns {boolean} Whether end is at or after start.
138
+ */
139
+ export function isSourceRangeOrdered(start, end) {
140
+ return end.line > start.line || end.line == start.line && end.column >= start.column;
141
+ }
133
142
  /**
134
143
  * Builds a location spanning a complete source file.
135
144
  * @param {string} filename - Originating filename.
@@ -139,4 +148,4 @@ export function locationFromOffsets(filename, source, startOffset, endOffset) {
139
148
  export function moduleLocation(filename, source) {
140
149
  return locationFromOffsets(filename, source, 0, source.length);
141
150
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvbG9jYXRpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLFVBQVUsQ0FBQywwQkFBMEIsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0lBQ1osSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBRWpCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxFQUFFLENBQUE7b0JBQ04sS0FBSyxFQUFFLENBQUE7b0JBQ1AsU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxFQUFFLENBQUE7Z0JBQ04sU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDdkIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEVBQUUsQ0FBQTtZQUNOLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBTTtJQUMxQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRXRCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDbkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUk7Z0JBQUUsS0FBSyxFQUFFLENBQUE7WUFDdEMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDNUIsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUk7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNO0lBQzFDLE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBSyxDQUFBO0lBRWxDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksVUFBVSxD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SSxVQUFVLENBQUMsZ0NBQWdDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDMUYsS0FBSyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxJQUFJLEtBQUssSUFBSSxVQUFVO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFBO0lBRTdDLE1BQU0sSUFBSSxVQUFVLENBQUMsZ0NBQWdDLFVBQVUsRUFBRSxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUztJQUMxRSxPQUFPO1FBQ0wsUUFBUTtRQUNSLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUNuQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7S0FDaEMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU07SUFDN0MsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc291cmNlIG9mZnNldCB0byBhIG9uZS1iYXNlZCBwb2ludC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgb2Zmc2V0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IFNvdXJjZSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50QXQoc291cmNlLCBvZmZzZXQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG9mZnNldCkgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzb3VyY2UubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc291cmNlIG9mZnNldDogJHtvZmZzZXR9YClcbiAgfVxuXG4gIGxldCBsaW5lID0gMVxuICBsZXQgbGluZVN0YXJ0ID0gMFxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvZmZzZXQ7IGluZGV4KyspIHtcbiAgICBpZiAoc291cmNlW2luZGV4XSA9PSBcIlxcclwiKSB7XG4gICAgICBpZiAoc291cmNlW2luZGV4ICsgMV0gPT0gXCJcXG5cIikge1xuICAgICAgICBpZiAoaW5kZXggKyAxIDwgb2Zmc2V0KSB7XG4gICAgICAgICAgbGluZSsrXG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIGxpbmVTdGFydCA9IGluZGV4ICsgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lKytcbiAgICAgICAgbGluZVN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzb3VyY2VbaW5kZXhdID09IFwiXFxuXCIpIHtcbiAgICAgIGxpbmUrK1xuICAgICAgbGluZVN0YXJ0ID0gaW5kZXggKyAxXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtjb2x1bW46IG9mZnNldCAtIGxpbmVTdGFydCArIDEsIGxpbmUsIG9mZnNldH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSByZXVzYWJsZSBVVEYtMTYgbGluZSBpbmRleCBpbiBvbmUgcGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7e3NvdXJjZTogc3RyaW5nLCBsaW5lU3RhcnRzOiBudW1iZXJbXX19IENvb3JkaW5hdGUgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlKSB7XG4gIGNvbnN0IGxpbmVTdGFydHMgPSBbMF1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmIChzb3VyY2VbaW5kZXhdID09IFwiXFxyXCIpIHtcbiAgICAgIGlmIChzb3VyY2VbaW5kZXggKyAxXSA9PSBcIlxcblwiKSBpbmRleCsrXG4gICAgICBsaW5lU3RhcnRzLnB1c2goaW5kZXggKyAxKVxuICAgIH0gZWxzZSBpZiAoc291cmNlW2luZGV4XSA9PSBcIlxcblwiKSBsaW5lU3RhcnRzLnB1c2goaW5kZXggKyAxKVxuICB9XG5cbiAgcmV0dXJuIHtsaW5lU3RhcnRzLCBzb3VyY2V9XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2Zmc2V0IHdpdGggYSByZXVzYWJsZSBjb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHt7c291cmNlOiBzdHJpbmcsIGxpbmVTdGFydHM6IG51bWJlcltdfX0gaW5kZXggLSBDb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBTb3VyY2UgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkUG9pbnRBdChpbmRleCwgb2Zmc2V0KSB7XG4gIGNvbnN0IHtsaW5lU3RhcnRzLCBzb3VyY2V9ID0gaW5kZXhcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNvdXJjZS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBzb3VyY2Ugb2Zmc2V0OiAke29mZnNldH1gKVxuICB9XG5cbiAgbGV0IGxvdyA9IDBcbiAgbGV0IGhpZ2ggPSBsaW5lU3RhcnRzLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKGxpbmVTdGFydHNbbWlkZGxlXSA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBsaW5lSW5kZXggPSBsb3cgLSAxXG5cbiAgcmV0dXJuIHtjb2x1bW46IG9mZnNldCAtIGxpbmVTdGFydHNbbGluZUluZGV4XSArIDEsIGxpbmU6IGxpbmVJbmRleCArIDEsIG9mZnNldH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbm9uaWNhbCBvbmUtYmFzZWQgVVRGLTE2IGxpbmUvY29sdW1uIHBhaXIgdG8gaXRzIHVuaXF1ZSBvZmZzZXQuXG4gKiBAcGFyYW0ge3tzb3VyY2U6IHN0cmluZywgbGluZVN0YXJ0czogbnVtYmVyW119fSBpbmRleCAtIENvb3JkaW5hdGUgaW5kZXguXG4gKiBAcGFyYW0ge251bWJlcn0gbGluZSAtIE9uZS1iYXNlZCBsaW5lLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbiAtIE9uZS1iYXNlZCBVVEYtMTYgY29sdW1uLlxuICogQHJldHVybnMge251bWJlcn0gU291cmNlIG9mZnNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4ZWRPZmZzZXRBdChpbmRleCwgbGluZSwgY29sdW1uKSB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSB8fCBsaW5lID4gaW5kZXgubGluZVN0YXJ0cy5sZW5ndGggfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc291cmNlIHBvc2l0aW9uICR7bGluZX06JHtjb2x1bW59LmApXG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gaW5kZXgubGluZVN0YXJ0c1tsaW5lIC0gMV0gKyBjb2x1bW4gLSAxXG4gIGNvbnN0IHBvaW50ID0gaW5kZXhlZFBvaW50QXQoaW5kZXgsIG9mZnNldClcblxuICBpZiAocG9pbnQubGluZSAhPSBsaW5lIHx8IHBvaW50LmNvbHVtbiAhPSBjb2x1bW4pIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHNvdXJjZSBwb3NpdGlvbiAke2xpbmV9OiR7Y29sdW1ufS5gKVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBhcnNlciBVVEYtOCBieXRlIG9mZnNldCB0byBTZW1hbnRpZm9sZCdzIFVURi0xNiBzb3VyY2Ugb2Zmc2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBieXRlT2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtOCBieXRlIG9mZnNldC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFplcm8tYmFzZWQgVVRGLTE2IG9mZnNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhCeXRlT2Zmc2V0VG9VdGYxNk9mZnNldChzb3VyY2UsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJ5dGVPZmZzZXQpIHx8IGJ5dGVPZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcblxuICBsZXQgYnl0ZXMgPSAwXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7KSB7XG4gICAgaWYgKGJ5dGVzID09IGJ5dGVPZmZzZXQpIHJldHVybiBpbmRleFxuXG4gICAgY29uc3QgY29kZVBvaW50ID0gc291cmNlLmNvZGVQb2ludEF0KGluZGV4KVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcblxuICAgIGJ5dGVzICs9IGNvZGVQb2ludCA8PSAweDdGID8gMSA6IGNvZGVQb2ludCA8PSAweDdGRiA/IDIgOiBjb2RlUG9pbnQgPD0gMHhGRkZGID8gMyA6IDRcbiAgICBpZiAoYnl0ZXMgPiBieXRlT2Zmc2V0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcbiAgICBpbmRleCArPSBjb2RlUG9pbnQgPiAweEZGRkYgPyAyIDogMVxuICB9XG5cbiAgaWYgKGJ5dGVzID09IGJ5dGVPZmZzZXQpIHJldHVybiBzb3VyY2UubGVuZ3RoXG5cbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgVVRGLTggc291cmNlIG9mZnNldDogJHtieXRlT2Zmc2V0fWApXG59XG5cbi8qKlxuICogQnVpbGRzIGEgbm9ybWFsaXplZCBzb3VyY2UgbG9jYXRpb24gZnJvbSBvZmZzZXRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0T2Zmc2V0IC0gSW5jbHVzaXZlIHN0YXJ0IG9mZnNldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRPZmZzZXQgLSBFeGNsdXNpdmUgZW5kIG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBTb3VyY2UgbG9jYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlbmFtZSxcbiAgICBzdGFydDogcG9pbnRBdChzb3VyY2UsIHN0YXJ0T2Zmc2V0KSxcbiAgICBlbmQ6IHBvaW50QXQoc291cmNlLCBlbmRPZmZzZXQpXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsb2NhdGlvbiBzcGFubmluZyBhIGNvbXBsZXRlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IFNvdXJjZSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZUxvY2F0aW9uKGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGxvY2F0aW9uRnJvbU9mZnNldHMoZmlsZW5hbWUsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aClcbn1cbiJdfQ==
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvbG9jYXRpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEUsTUFBTSxJQUFJLFVBQVUsQ0FBQywwQkFBMEIsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBO0lBQ1osSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBRWpCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxFQUFFLENBQUE7b0JBQ04sS0FBSyxFQUFFLENBQUE7b0JBQ1AsU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxFQUFFLENBQUE7Z0JBQ04sU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7WUFDdkIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEVBQUUsQ0FBQTtZQUNOLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBTTtJQUMxQyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRXRCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDbkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUk7Z0JBQUUsS0FBSyxFQUFFLENBQUE7WUFDdEMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDNUIsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUk7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsQ0FBQTtBQUM3QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNO0lBQzFDLE1BQU0sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBSyxDQUFBO0lBRWxDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksVUFBVSxD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SSxVQUFVLENBQUMsZ0NBQWdDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDMUYsS0FBSyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxJQUFJLEtBQUssSUFBSSxVQUFVO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFBO0lBRTdDLE1BQU0sSUFBSSxVQUFVLENBQUMsZ0NBQWdDLFVBQVUsRUFBRSxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUztJQUMxRSxPQUFPO1FBQ0wsUUFBUTtRQUNSLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUNuQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7S0FDaEMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsR0FBRztJQUM3QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO0FBQ3RGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU07SUFDN0MsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc291cmNlIG9mZnNldCB0byBhIG9uZS1iYXNlZCBwb2ludC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgb2Zmc2V0LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IFNvdXJjZSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50QXQoc291cmNlLCBvZmZzZXQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG9mZnNldCkgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzb3VyY2UubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc291cmNlIG9mZnNldDogJHtvZmZzZXR9YClcbiAgfVxuXG4gIGxldCBsaW5lID0gMVxuICBsZXQgbGluZVN0YXJ0ID0gMFxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvZmZzZXQ7IGluZGV4KyspIHtcbiAgICBpZiAoc291cmNlW2luZGV4XSA9PSBcIlxcclwiKSB7XG4gICAgICBpZiAoc291cmNlW2luZGV4ICsgMV0gPT0gXCJcXG5cIikge1xuICAgICAgICBpZiAoaW5kZXggKyAxIDwgb2Zmc2V0KSB7XG4gICAgICAgICAgbGluZSsrXG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIGxpbmVTdGFydCA9IGluZGV4ICsgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lKytcbiAgICAgICAgbGluZVN0YXJ0ID0gaW5kZXggKyAxXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzb3VyY2VbaW5kZXhdID09IFwiXFxuXCIpIHtcbiAgICAgIGxpbmUrK1xuICAgICAgbGluZVN0YXJ0ID0gaW5kZXggKyAxXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtjb2x1bW46IG9mZnNldCAtIGxpbmVTdGFydCArIDEsIGxpbmUsIG9mZnNldH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSByZXVzYWJsZSBVVEYtMTYgbGluZSBpbmRleCBpbiBvbmUgcGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBDb21wbGV0ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyB7e3NvdXJjZTogc3RyaW5nLCBsaW5lU3RhcnRzOiBudW1iZXJbXX19IENvb3JkaW5hdGUgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlKSB7XG4gIGNvbnN0IGxpbmVTdGFydHMgPSBbMF1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmIChzb3VyY2VbaW5kZXhdID09IFwiXFxyXCIpIHtcbiAgICAgIGlmIChzb3VyY2VbaW5kZXggKyAxXSA9PSBcIlxcblwiKSBpbmRleCsrXG4gICAgICBsaW5lU3RhcnRzLnB1c2goaW5kZXggKyAxKVxuICAgIH0gZWxzZSBpZiAoc291cmNlW2luZGV4XSA9PSBcIlxcblwiKSBsaW5lU3RhcnRzLnB1c2goaW5kZXggKyAxKVxuICB9XG5cbiAgcmV0dXJuIHtsaW5lU3RhcnRzLCBzb3VyY2V9XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2Zmc2V0IHdpdGggYSByZXVzYWJsZSBjb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHt7c291cmNlOiBzdHJpbmcsIGxpbmVTdGFydHM6IG51bWJlcltdfX0gaW5kZXggLSBDb29yZGluYXRlIGluZGV4LlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBTb3VyY2UgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkUG9pbnRBdChpbmRleCwgb2Zmc2V0KSB7XG4gIGNvbnN0IHtsaW5lU3RhcnRzLCBzb3VyY2V9ID0gaW5kZXhcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNvdXJjZS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBzb3VyY2Ugb2Zmc2V0OiAke29mZnNldH1gKVxuICB9XG5cbiAgbGV0IGxvdyA9IDBcbiAgbGV0IGhpZ2ggPSBsaW5lU3RhcnRzLmxlbmd0aFxuXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuXG4gICAgaWYgKGxpbmVTdGFydHNbbWlkZGxlXSA8PSBvZmZzZXQpIGxvdyA9IG1pZGRsZSArIDFcbiAgICBlbHNlIGhpZ2ggPSBtaWRkbGVcbiAgfVxuICBjb25zdCBsaW5lSW5kZXggPSBsb3cgLSAxXG5cbiAgcmV0dXJuIHtjb2x1bW46IG9mZnNldCAtIGxpbmVTdGFydHNbbGluZUluZGV4XSArIDEsIGxpbmU6IGxpbmVJbmRleCArIDEsIG9mZnNldH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbm9uaWNhbCBvbmUtYmFzZWQgVVRGLTE2IGxpbmUvY29sdW1uIHBhaXIgdG8gaXRzIHVuaXF1ZSBvZmZzZXQuXG4gKiBAcGFyYW0ge3tzb3VyY2U6IHN0cmluZywgbGluZVN0YXJ0czogbnVtYmVyW119fSBpbmRleCAtIENvb3JkaW5hdGUgaW5kZXguXG4gKiBAcGFyYW0ge251bWJlcn0gbGluZSAtIE9uZS1iYXNlZCBsaW5lLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbiAtIE9uZS1iYXNlZCBVVEYtMTYgY29sdW1uLlxuICogQHJldHVybnMge251bWJlcn0gU291cmNlIG9mZnNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4ZWRPZmZzZXRBdChpbmRleCwgbGluZSwgY29sdW1uKSB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSB8fCBsaW5lID4gaW5kZXgubGluZVN0YXJ0cy5sZW5ndGggfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgc291cmNlIHBvc2l0aW9uICR7bGluZX06JHtjb2x1bW59LmApXG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gaW5kZXgubGluZVN0YXJ0c1tsaW5lIC0gMV0gKyBjb2x1bW4gLSAxXG4gIGNvbnN0IHBvaW50ID0gaW5kZXhlZFBvaW50QXQoaW5kZXgsIG9mZnNldClcblxuICBpZiAocG9pbnQubGluZSAhPSBsaW5lIHx8IHBvaW50LmNvbHVtbiAhPSBjb2x1bW4pIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHNvdXJjZSBwb3NpdGlvbiAke2xpbmV9OiR7Y29sdW1ufS5gKVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBhcnNlciBVVEYtOCBieXRlIG9mZnNldCB0byBTZW1hbnRpZm9sZCdzIFVURi0xNiBzb3VyY2Ugb2Zmc2V0LlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBieXRlT2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtOCBieXRlIG9mZnNldC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFplcm8tYmFzZWQgVVRGLTE2IG9mZnNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhCeXRlT2Zmc2V0VG9VdGYxNk9mZnNldChzb3VyY2UsIGJ5dGVPZmZzZXQpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJ5dGVPZmZzZXQpIHx8IGJ5dGVPZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcblxuICBsZXQgYnl0ZXMgPSAwXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7KSB7XG4gICAgaWYgKGJ5dGVzID09IGJ5dGVPZmZzZXQpIHJldHVybiBpbmRleFxuXG4gICAgY29uc3QgY29kZVBvaW50ID0gc291cmNlLmNvZGVQb2ludEF0KGluZGV4KVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcblxuICAgIGJ5dGVzICs9IGNvZGVQb2ludCA8PSAweDdGID8gMSA6IGNvZGVQb2ludCA8PSAweDdGRiA/IDIgOiBjb2RlUG9pbnQgPD0gMHhGRkZGID8gMyA6IDRcbiAgICBpZiAoYnl0ZXMgPiBieXRlT2Zmc2V0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBVVEYtOCBzb3VyY2Ugb2Zmc2V0OiAke2J5dGVPZmZzZXR9YClcbiAgICBpbmRleCArPSBjb2RlUG9pbnQgPiAweEZGRkYgPyAyIDogMVxuICB9XG5cbiAgaWYgKGJ5dGVzID09IGJ5dGVPZmZzZXQpIHJldHVybiBzb3VyY2UubGVuZ3RoXG5cbiAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgVVRGLTggc291cmNlIG9mZnNldDogJHtieXRlT2Zmc2V0fWApXG59XG5cbi8qKlxuICogQnVpbGRzIGEgbm9ybWFsaXplZCBzb3VyY2UgbG9jYXRpb24gZnJvbSBvZmZzZXRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gQ29tcGxldGUgc291cmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0T2Zmc2V0IC0gSW5jbHVzaXZlIHN0YXJ0IG9mZnNldC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRPZmZzZXQgLSBFeGNsdXNpdmUgZW5kIG9mZnNldC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBTb3VyY2UgbG9jYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlbmFtZSxcbiAgICBzdGFydDogcG9pbnRBdChzb3VyY2UsIHN0YXJ0T2Zmc2V0KSxcbiAgICBlbmQ6IHBvaW50QXQoc291cmNlLCBlbmRPZmZzZXQpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIG9uZS1iYXNlZCBsZXhpY29ncmFwaGljIG9yZGVyIG9mIGEgc291cmNlIHJhbmdlJ3MgZW5kcG9pbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSByYW5nZSBzdGFydC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIHJhbmdlIGVuZC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGVuZCBpcyBhdCBvciBhZnRlciBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU291cmNlUmFuZ2VPcmRlcmVkKHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIGVuZC5saW5lID4gc3RhcnQubGluZSB8fCBlbmQubGluZSA9PSBzdGFydC5saW5lICYmIGVuZC5jb2x1bW4gPj0gc3RhcnQuY29sdW1uXG59XG5cbi8qKlxuICogQnVpbGRzIGEgbG9jYXRpb24gc3Bhbm5pbmcgYSBjb21wbGV0ZSBzb3VyY2UgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmF0aW5nIGZpbGVuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIENvbXBsZXRlIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBTb3VyY2UgbG9jYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2R1bGVMb2NhdGlvbihmaWxlbmFtZSwgc291cmNlKSB7XG4gIHJldHVybiBsb2NhdGlvbkZyb21PZmZzZXRzKGZpbGVuYW1lLCBzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgpXG59XG4iXX0=
@@ -162,7 +162,7 @@ export function createGenerationIndex(module, providedSources = []) {
162
162
  */
163
163
  function addSource(filename, content, language) {
164
164
  if (typeof filename != "string" || content !== null && typeof content != "string" ||
165
- language !== null && !["php", "ruby", "javascript", "typescript", "java"].includes(language)) {
165
+ language !== null && !["php", "ruby", "javascript", "typescript", "java", "python", "csharp", "go", "c", "cpp"].includes(language)) {
166
166
  throw new TypeError("Malformed semantic source registry entry.");
167
167
  }
168
168
  const existing = sources.find((source) => source.filename == filename && source.content == content);
@@ -212,7 +212,7 @@ function usableSourceProvenance(provenance) {
212
212
  if (!source || typeof source.id != "string" || sourceIds.has(source.id) || typeof source.filename != "string" ||
213
213
  source.filename.length == 0 ||
214
214
  source.content !== null && typeof source.content != "string" || source.language !== null &&
215
- !["php", "ruby", "javascript", "typescript", "java"].includes(source.language))
215
+ !["php", "ruby", "javascript", "typescript", "java", "python", "csharp", "go", "c", "cpp"].includes(source.language))
216
216
  return undefined;
217
217
  sourceIds.add(source.id);
218
218
  }
@@ -574,4 +574,4 @@ function resolveSymbols(module, records) {
574
574
  symbol.references.push({ location, nodeId: record.id, role });
575
575
  }
576
576
  }
577
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVuYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFBO0FBRW5FLDZGQUE2RjtBQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVHQUF1RztBQUN2RyxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNO0lBQzFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU07SUFDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUU3QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQztJQUN2RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2Qyx1RUFBdUU7SUFDdkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMvQiw0REFBNEQ7SUFDNUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLEtBQUssTUFBTSxDQUFDLEtB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QUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQTtZQUN2RCxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFBO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFNBQVMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDM0MsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFNO1FBRXJCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQTtRQUVwRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBRTNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFBO1FBRW5GLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQzFCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDN0QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVDb29yZGluYXRlSW5kZXgsIGluZGV4ZWRQb2ludEF0fSBmcm9tIFwiLi9sb2NhdGlvbi5qc1wiXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pj59ICovXG5jb25zdCBwYXJzZXJSYW5nZXMgPSBuZXcgV2Vha01hcCgpXG4vKiogQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb29yZGluYXRlSW5kZXg+Pn0gKi9cbmNvbnN0IHNvdXJjZUNvb3JkaW5hdGVJbmRleGVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFJlY29yZHMgcGFyc2VyLXByb3ZpZGVkIHNlbWFudGljLXRva2VuIHJhbmdlcyB3aXRob3V0IGV4cG9zaW5nIHBhcnNlciB0cmVlcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlIC0gU2VtYW50aWMgbm9kZS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCByb2xlIHJhbmdlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFyc2VyUmFuZ2VzKG5vZGUsIHJhbmdlcykge1xuICBwYXJzZXJSYW5nZXMuc2V0KG5vZGUsIHJhbmdlcylcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHBhcnNlciByYW5nZXMgYW5kIHJldHVybnMgdGhlIHNhbWUgc2VtYW50aWMgbm9kZS5cbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBOb2RlXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBTZW1hbnRpYyBub2RlLlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHJvbGUgcmFuZ2VzLlxuICogQHJldHVybnMge05vZGV9IFRoZSBzYW1lIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGFyc2VyUmFuZ2VzKG5vZGUsIHJhbmdlcykge1xuICBzZXRQYXJzZXJSYW5nZXMobm9kZSwgcmFuZ2VzKVxuXG4gIHJldHVybiBub2RlXG59XG5cbi8qKlxuICogQWRkcyBkZXRlcm1pbmlzdGljIHByb3ZlbmFuY2UgdG8gYSB2YWxpZGF0ZWQgZnJvbnRlbmQgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgc2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtvYmplY3R9IHNvdXJjZSAtIFBhcnNlZCBzb3VyY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlLmZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9IHNvdXJjZS5sYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Uuc291cmNlIC0gRXhhY3Qgc291cmNlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gVGhlIHNhbWUgc2VtYW50aWMgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGVQYXJzZWRNb2R1bGUobW9kdWxlLCB7ZmlsZW5hbWUsIGxhbmd1YWdlLCBzb3VyY2V9KSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBbe2NvbnRlbnQ6IHNvdXJjZSwgZmlsZW5hbWUsIGlkOiBcInNvdXJjZTowXCIsIGxhbmd1YWdlfV1cbiAgY29uc3QgZW50cmllcyA9IHNlbWFudGljRW50cmllcyhtb2R1bGUpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlPn0gKi9cbiAgY29uc3QgcmVjb3Jkc0J5UGF0aCA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSAqL1xuICBjb25zdCByZWNvcmRzID0gW11cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGVudHJpZXMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcmFuZ2VzID0gcGFyc2VyUmFuZ2VzLmdldChlbnRyeS5ub2RlKSA/PyB7fVxuICAgIGNvbnN0IGxvY2F0aW9uID0gXCJsb2NhdGlvblwiIGluIGVudHJ5Lm5vZGUgPyBlbnRyeS5ub2RlLmxvY2F0aW9uIDogcmFuZ2VzLnR5cGUgPz8gZW50cnkub3duZXJMb2NhdGlvblxuICAgIGNvbnN0IHNvdXJjZVByb3ZlbmFuY2UgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gKi8gKHtcbiAgICAgIG9yaWdpbjoge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uLCBzb3VyY2VJZDogXCJzb3VyY2U6MFwifSxcbiAgICAgIHJhbmdlcyxcbiAgICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZE5vZGVQcm92ZW5hbmNlXCIsXG4gICAgICB2ZXJzaW9uOiAxXG4gICAgfSlcbiAgICBjb25zdCByZWNvcmQgPSB7XG4gICAgICBpZDogYG5vZGU6JHtpbmRleH1gLFxuICAgICAga2luZDogZW50cnkubm9kZS5raW5kLFxuICAgICAgb3JpZ2luOiBzb3VyY2VQcm92ZW5hbmNlLm9yaWdpbixcbiAgICAgIHBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICByYW5nZXM6IHNvdXJjZVByb3ZlbmFuY2UucmFuZ2VzXG4gICAgfVxuXG4gICAgcmVjb3Jkcy5wdXNoKHJlY29yZClcbiAgICByZWNvcmRzQnlQYXRoLnNldChlbnRyeS5wYXRoLCByZWNvcmQpXG4gICAgZW50cnkubm9kZS5zb3VyY2VQcm92ZW5hbmNlID0gc291cmNlUHJvdmVuYW5jZVxuICB9XG5cbiAgY29uc3Qgc3ltYm9scyA9IHJlc29sdmVTeW1ib2xzKG1vZHVsZSwgcmVjb3Jkc0J5UGF0aClcblxuICBtb2R1bGUucHJvdmVuYW5jZSA9IHtcbiAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgbm9kZXM6IHJlY29yZHMsXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwiLFxuICAgIHNvdXJjZXMsXG4gICAgc3ltYm9scyxcbiAgICB2ZXJzaW9uOiAxXG4gIH1cblxuICByZXR1cm4gbW9kdWxlXG59XG5cbi8qKlxuICogUmVidWlsZHMgY2Fub25pY2FsIGdlbmVyYXRpb24gbWV0YWRhdGEgd2l0aG91dCB0cnVzdGluZyBjYWxsZXItcHJvdmlkZWQgaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHt7ZmlsZW5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBsYW5ndWFnZT86IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX1bXX0gW3Byb3ZpZGVkU291cmNlc10gLSBBZGRpdGlvbmFsIHNvdXJjZSBjb250ZW50LlxuICogQHJldHVybnMge3twcm92ZW5hbmNlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZSwgcmVjb3JkRm9yOiAobm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIHBhdGg/OiBzdHJpbmcpID0+IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZX19IENhbm9uaWNhbCBpbmRleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUsIHByb3ZpZGVkU291cmNlcyA9IFtdKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBzZW1hbnRpY0VudHJpZXMobW9kdWxlKVxuICBjb25zdCBwcmlvclNvdXJjZXMgPSB1c2FibGVTb3VyY2VQcm92ZW5hbmNlKG1vZHVsZS5wcm92ZW5hbmNlKVxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSAqL1xuICBjb25zdCBzb3VyY2VzID0gW11cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSAqL1xuICBjb25zdCBwcmlvclNvdXJjZXNCeUlkID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBzb3VyY2Ugb2YgcHJvdmlkZWRTb3VyY2VzKSBhZGRTb3VyY2Uoc291cmNlLmZpbGVuYW1lLCBzb3VyY2UuY29udGVudCwgc291cmNlLmxhbmd1YWdlID8/IG51bGwpXG4gIGlmIChwcmlvclNvdXJjZXMpIHtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcmlvclNvdXJjZXMuc291cmNlcykge1xuICAgICAgY29uc3QgY2Fub25pY2FsID0gYWRkU291cmNlKHNvdXJjZS5maWxlbmFtZSwgc291cmNlLmNvbnRlbnQsIHNvdXJjZS5sYW5ndWFnZSlcblxuICAgICAgcHJpb3JTb3VyY2VzQnlJZC5zZXQoc291cmNlLmlkLCBjYW5vbmljYWwpXG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gXCJsb2NhdGlvblwiIGluIGVudHJ5Lm5vZGUgPyBlbnRyeS5ub2RlLmxvY2F0aW9uIDogZW50cnkub3duZXJMb2NhdGlvblxuXG4gICAgaWYgKCFzb3VyY2VzLnNvbWUoKHNvdXJjZSkgPT4gc291cmNlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKSkgYWRkU291cmNlKGxvY2F0aW9uLmZpbGVuYW1lLCBudWxsLCBudWxsKVxuICB9XG4gIGNvbnN0IHZlcmlmaWFibGVTb3VyY2VzID0gc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmNvbnRlbnQgIT0gbnVsbClcblxuICAvKiogQHR5cGUge01hcDxvYmplY3QsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdPn0gKi9cbiAgY29uc3QgcmVjb3Jkc0J5Tm9kZSA9IG5ldyBNYXAoKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZT59ICovXG4gIGNvbnN0IHJlY29yZHNCeVBhdGggPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IFtdXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBlbnRyaWVzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGxvY2F0ZWQgPSBcImxvY2F0aW9uXCIgaW4gZW50cnkubm9kZSA/IGVudHJ5Lm5vZGUubG9jYXRpb24gOiBlbnRyeS5vd25lckxvY2F0aW9uXG4gICAgY29uc3QgYXNzb2NpYXRlZCA9IHVzYWJsZU5vZGVQcm92ZW5hbmNlKGVudHJ5Lm5vZGUuc291cmNlUHJvdmVuYW5jZSlcbiAgICBjb25zdCByYW5nZXMgPSBhc3NvY2lhdGVkID8gdmFsaWRSYW5nZXMoYXNzb2NpYXRlZC5yYW5nZXMsIHZlcmlmaWFibGVTb3VyY2VzKSA6IHt9XG4gICAgY29uc3Qgbm9ybWFsaXplZE9yaWdpbiA9IGFzc29jaWF0ZWRcbiAgICAgID8gbm9ybWFsaXplT3JpZ2luKGFzc29jaWF0ZWQub3JpZ2luLCBwcmlvclNvdXJjZXNCeUlkLCB2ZXJpZmlhYmxlU291cmNlcylcbiAgICAgIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZmFsbGJhY2tTb3VyY2UgPSBzb3VyY2VGb3JMb2NhdGlvbihsb2NhdGVkLCBzb3VyY2VzKVxuICAgIGNvbnN0IG9yaWdpbiA9IG5vcm1hbGl6ZWRPcmlnaW4gPz8gc291cmNlT3JpZ2luKGZhbGxiYWNrU291cmNlLCBsb2NhdGVkKVxuXG4gICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgaWQ6IGBub2RlOiR7aW5kZXh9YCxcbiAgICAgIGtpbmQ6IGVudHJ5Lm5vZGUua2luZCxcbiAgICAgIG9yaWdpbixcbiAgICAgIHBhdGg6IGVudHJ5LnBhdGgsXG4gICAgICByYW5nZXNcbiAgICB9XG5cbiAgICByZWNvcmRzLnB1c2gocmVjb3JkKVxuICAgIHJlY29yZHNCeVBhdGguc2V0KGVudHJ5LnBhdGgsIHJlY29yZClcbiAgICBjb25zdCBvY2N1cnJlbmNlcyA9IHJlY29yZHNCeU5vZGUuZ2V0KGVudHJ5Lm5vZGUpID8/IFtdXG5cbiAgICBvY2N1cnJlbmNlcy5wdXNoKHJlY29yZClcbiAgICByZWNvcmRzQnlOb2RlLnNldChlbnRyeS5ub2RlLCBvY2N1cnJlbmNlcylcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHMgPSByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHNCeVBhdGgpXG4gIGNvbnN0IHByb3ZlbmFuY2UgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlfSAqLyAoe1xuICAgIGNvb3JkaW5hdGVTeXN0ZW06IFwidXRmMTZcIixcbiAgICBub2RlczogcmVjb3JkcyxcbiAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIsXG4gICAgc291cmNlcyxcbiAgICBzeW1ib2xzLFxuICAgIHZlcnNpb246IDFcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIHByb3ZlbmFuY2UsXG4gICAgcmVjb3JkRm9yKG5vZGUsIHBhdGgpIHtcbiAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gcmVjb3Jkc0J5Tm9kZS5nZXQobm9kZSlcblxuICAgICAgaWYgKCFvY2N1cnJlbmNlcykgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTZW1hbnRpYyBub2RlIGlzIG5vdCBwYXJ0IG9mIHRoaXMgbW9kdWxlLlwiKVxuICAgICAgaWYgKHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBvY2N1cnJlbmNlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5wYXRoID09IHBhdGgpXG5cbiAgICAgICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBTZW1hbnRpYyBub2RlIGRvZXMgbm90IG9jY3VyIGF0ICcke3BhdGh9Jy5gKVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICAgIH1cbiAgICAgIGlmIChvY2N1cnJlbmNlcy5sZW5ndGggIT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNoYXJlZCBzZW1hbnRpYyBub2RlIHJlcXVpcmVzIGFuIG9jY3VycmVuY2UgcGF0aC5cIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9jY3VycmVuY2VzWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBvbmUgY2Fub25pY2FsIHNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gU291cmNlIGZpbGVuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBTb3VyY2UgY29udGVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gQ2Fub25pY2FsIHNvdXJjZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFNvdXJjZShmaWxlbmFtZSwgY29udGVudCwgbGFuZ3VhZ2UpIHtcbiAgICBpZiAodHlwZW9mIGZpbGVuYW1lICE9IFwic3RyaW5nXCIgfHwgY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2YgY29udGVudCAhPSBcInN0cmluZ1wiIHx8XG4gICAgICBsYW5ndWFnZSAhPT0gbnVsbCAmJiAhW1wicGhwXCIsIFwicnVieVwiLCBcImphdmFzY3JpcHRcIiwgXCJ0eXBlc2NyaXB0XCIsIFwiamF2YVwiXS5pbmNsdWRlcyhsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNYWxmb3JtZWQgc2VtYW50aWMgc291cmNlIHJlZ2lzdHJ5IGVudHJ5LlwiKVxuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gc291cmNlcy5maW5kKChzb3VyY2UpID0+IHNvdXJjZS5maWxlbmFtZSA9PSBmaWxlbmFtZSAmJiBzb3VyY2UuY29udGVudCA9PSBjb250ZW50KVxuXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcblxuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSB7Y29udGVudCwgZmlsZW5hbWUsIGlkOiBgc291cmNlOiR7c291cmNlcy5sZW5ndGh9YCwgbGFuZ3VhZ2V9XG5cbiAgICBzb3VyY2VzLnB1c2gocmVnaXN0ZXJlZClcblxuICAgIHJldHVybiByZWdpc3RlcmVkXG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBzYWZlIHByaW1hcnkgb3JpZ2luYWwgbG9jYXRpb24gZm9yIGNsb3NlZCBwcm92ZW5hbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkfSBQcmltYXJ5IGxvY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbWFyeUxvY2F0aW9uKG9yaWdpbikge1xuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIikgcmV0dXJuIG9yaWdpbi5sb2NhdGlvblxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIpIHJldHVybiBvcmlnaW4ub3JpZ2luc1swXT8ubG9jYXRpb25cblxuICByZXR1cm4gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zWzBdPy5sb2NhdGlvblxufVxuXG4vKipcbiAqIEFjY2VwdHMgc291cmNlIG1ldGFkYXRhIG9ubHkgd2hlbiBpdCBpcyBhdHRhY2hlZCB0byB0aGUgc2VtYW50aWMgbm9kZSBpdCBkZXNjcmliZXMuXG4gKiBSZWdpc3RyeS1sb2NhbCBJRHMgYW5kIHBhdGhzIGFyZSBpbnRlbnRpb25hbGx5IGlnbm9yZWQgYW5kIHJlYnVpbHQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gcmVjb3JkIC0gQ2FuZGlkYXRlIG5vZGUgYXNzb2NpYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlIHwgdW5kZWZpbmVkfSBVc2FibGUgYXNzb2NpYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHVzYWJsZU5vZGVQcm92ZW5hbmNlKHJlY29yZCkge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2NoZW1hICE9IFwiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwiIHx8IHJlY29yZC52ZXJzaW9uICE9IDEgfHxcbiAgICAhcmVjb3JkLm9yaWdpbiB8fCB0eXBlb2YgcmVjb3JkLm9yaWdpbiAhPSBcIm9iamVjdFwiIHx8XG4gICAgIXJlY29yZC5yYW5nZXMgfHwgdHlwZW9mIHJlY29yZC5yYW5nZXMgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJlY29yZC5yYW5nZXMpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHJlY29yZFxufVxuXG4vKipcbiAqIFJldGFpbnMgYSB2YWxpZCBzb3VyY2UgcmVnaXN0cnkgaW5kZXBlbmRlbnRseSBmcm9tIHBvdGVudGlhbGx5IHN0YWxlIG5vZGUgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlIHwgdW5kZWZpbmVkfSBwcm92ZW5hbmNlIC0gQ2FuZGlkYXRlIHByb3ZlbmFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb3ZlbmFuY2UgfCB1bmRlZmluZWR9IFByb3ZlbmFuY2Ugd2l0aCBhIHVzYWJsZSBzb3VyY2UgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIHVzYWJsZVNvdXJjZVByb3ZlbmFuY2UocHJvdmVuYW5jZSkge1xuICBpZiAoIXByb3ZlbmFuY2UgfHwgcHJvdmVuYW5jZS5zY2hlbWEgIT0gXCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIiB8fCBwcm92ZW5hbmNlLnZlcnNpb24gIT0gMSB8fFxuICAgIHByb3ZlbmFuY2UuY29vcmRpbmF0ZVN5c3RlbSAhPSBcInV0ZjE2XCIgfHwgIUFycmF5LmlzQXJyYXkocHJvdmVuYW5jZS5zb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNvdXJjZUlkcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3ZlbmFuY2Uuc291cmNlcykge1xuICAgIGlmICghc291cmNlIHx8IHR5cGVvZiBzb3VyY2UuaWQgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2VJZHMuaGFzKHNvdXJjZS5pZCkgfHwgdHlwZW9mIHNvdXJjZS5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8XG4gICAgICBzb3VyY2UuZmlsZW5hbWUubGVuZ3RoID09IDAgfHxcbiAgICAgIHNvdXJjZS5jb250ZW50ICE9PSBudWxsICYmIHR5cGVvZiBzb3VyY2UuY29udGVudCAhPSBcInN0cmluZ1wiIHx8IHNvdXJjZS5sYW5ndWFnZSAhPT0gbnVsbCAmJlxuICAgICAgIVtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIl0uaW5jbHVkZXMoc291cmNlLmxhbmd1YWdlKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHNvdXJjZUlkcy5hZGQoc291cmNlLmlkKVxuICB9XG5cbiAgcmV0dXJuIHByb3ZlbmFuY2Vcbn1cblxuLyoqXG4gKiBSZXRhaW5zIG9ubHkgc2VsZi1jb25zaXN0ZW50IHNvdXJjZSByYW5nZXMuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gQ2FuZGlkYXRlIHJhbmdlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYW5vbmljYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj59IFNhZmUgcmFuZ2VzLlxuICovXG5mdW5jdGlvbiB2YWxpZFJhbmdlcyhyYW5nZXMsIHNvdXJjZXMpIHtcbiAgaWYgKCFyYW5nZXMgfHwgdHlwZW9mIHJhbmdlcyAhPSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmFuZ2VzKSkgcmV0dXJuIHt9XG5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPn0gKi9cbiAgY29uc3QgdmFsaWQgPSB7fVxuXG4gIGZvciAoY29uc3QgW3JvbGUsIGxvY2F0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyYW5nZXMpKSB7XG4gICAgaWYgKHZhbGlkTG9jYXRpb24obG9jYXRpb24sIHNvdXJjZXMpKSB2YWxpZFtyb2xlXSA9IGxvY2F0aW9uXG4gIH1cblxuICByZXR1cm4gdmFsaWRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgY2xvc2VkIG9yaWdpbiB3aGlsZSByZW1hcHBpbmcgdW50cnVzdGVkIHNvdXJjZSBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDYW5kaWRhdGUgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBwcmlvclNvdXJjZXMgLSBQcmlvci10by1jYW5vbmljYWwgc291cmNlIG1hcHBpbmcuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2Fub25pY2FsIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbiB8IHVuZGVmaW5lZH0gU2FmZSBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9yaWdpbihvcmlnaW4sIHByaW9yU291cmNlcywgc291cmNlcykge1xuICBpZiAoIW9yaWdpbiB8fCB0eXBlb2Ygb3JpZ2luICE9IFwib2JqZWN0XCIpIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzb3VyY2VcIiAmJiB2YWxpZExvY2F0aW9uKG9yaWdpbi5sb2NhdGlvbiwgc291cmNlcykpIHtcbiAgICBjb25zdCBjbGFpbWVkID0gcHJpb3JTb3VyY2VzLmdldChvcmlnaW4uc291cmNlSWQpXG4gICAgY29uc3Qgc291cmNlID0gY2xhaW1lZCAmJiBzb3VyY2VPd25zTG9jYXRpb24oY2xhaW1lZCwgb3JpZ2luLmxvY2F0aW9uKSA/IGNsYWltZWQgOiBzb3VyY2VGb3JMb2NhdGlvbihvcmlnaW4ubG9jYXRpb24sIHNvdXJjZXMpXG5cbiAgICByZXR1cm4gc291cmNlT3JpZ2luKHNvdXJjZSwgb3JpZ2luLmxvY2F0aW9uKVxuICB9XG4gIGlmIChvcmlnaW4ua2luZCA9PSBcImRlcml2ZWRcIiAmJiBBcnJheS5pc0FycmF5KG9yaWdpbi5vcmlnaW5zKSAmJiBvcmlnaW4ub3JpZ2lucy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb3JpZ2lucyA9IG9yaWdpbi5vcmlnaW5zLm1hcCgocmVsYXRlZCkgPT4gbm9ybWFsaXplUmVsYXRlZE9yaWdpbihyZWxhdGVkLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpKVxuXG4gICAgaWYgKG9yaWdpbnMuZXZlcnkoQm9vbGVhbikpIHJldHVybiB7a2luZDogXCJkZXJpdmVkXCIsIG9yaWdpbnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119ICovIChvcmlnaW5zKX1cbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJzeW50aGV0aWNcIiAmJiB0eXBlb2Ygb3JpZ2luLnJlYXNvbiA9PSBcInN0cmluZ1wiICYmIEFycmF5LmlzQXJyYXkob3JpZ2luLnJlbGF0ZWRPcmlnaW5zKSkge1xuICAgIGNvbnN0IHJlbGF0ZWRPcmlnaW5zID0gb3JpZ2luLnJlbGF0ZWRPcmlnaW5zLm1hcCgocmVsYXRlZCkgPT4gbm9ybWFsaXplUmVsYXRlZE9yaWdpbihyZWxhdGVkLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpKVxuXG4gICAgaWYgKHJlbGF0ZWRPcmlnaW5zLmV2ZXJ5KEJvb2xlYW4pKSB7XG4gICAgICByZXR1cm4ge2tpbmQ6IFwic3ludGhldGljXCIsIHJlYXNvbjogb3JpZ2luLnJlYXNvbiwgcmVsYXRlZE9yaWdpbnM6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luW119ICovIChyZWxhdGVkT3JpZ2lucyl9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgb25lIHJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlbGF0ZWRPcmlnaW59IHJlbGF0ZWQgLSBDYW5kaWRhdGUgcmVsYXRlZCBvcmlnaW4uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZT59IHByaW9yU291cmNlcyAtIFByaW9yIHNvdXJjZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2Fub25pY2FsIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2luIHwgdW5kZWZpbmVkfSBTYWZlIHJlbGF0ZWQgb3JpZ2luLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWxhdGVkT3JpZ2luKHJlbGF0ZWQsIHByaW9yU291cmNlcywgc291cmNlcykge1xuICBpZiAoIXJlbGF0ZWQgfHwgIXZhbGlkTG9jYXRpb24ocmVsYXRlZC5sb2NhdGlvbiwgc291cmNlcykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBjbGFpbWVkID0gcHJpb3JTb3VyY2VzLmdldChyZWxhdGVkLnNvdXJjZUlkKVxuICBjb25zdCBzb3VyY2UgPSBjbGFpbWVkICYmIHNvdXJjZU93bnNMb2NhdGlvbihjbGFpbWVkLCByZWxhdGVkLmxvY2F0aW9uKSA/IGNsYWltZWQgOiBzb3VyY2VGb3JMb2NhdGlvbihyZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2VzKVxuICBjb25zdCBub3JtYWxpemVkID0ge2xvY2F0aW9uOiByZWxhdGVkLmxvY2F0aW9uLCBzb3VyY2VJZDogc291cmNlLmlkfVxuXG4gIGlmICh0eXBlb2YgcmVsYXRlZC5yb2xlID09IFwic3RyaW5nXCIpIE9iamVjdC5hc3NpZ24obm9ybWFsaXplZCwge3JvbGU6IHJlbGF0ZWQucm9sZX0pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBDaGVja3Mgbm9ybWFsaXplZCBjb29yZGluYXRlcyBhZ2FpbnN0IGV4YWN0IHNvdXJjZSBjb250ZW50IHdoZW4gYXZhaWxhYmxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBSZWdpc3RlcmVkIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgbG9jYXRpb24gaXMgc2FmZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRMb2NhdGlvbihsb2NhdGlvbiwgc291cmNlcykge1xuICBpZiAoIWxvY2F0aW9uIHx8IHR5cGVvZiBsb2NhdGlvbi5maWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8ICFsb2NhdGlvbi5zdGFydCB8fCAhbG9jYXRpb24uZW5kIHx8XG4gICAgIU51bWJlci5pc0ludGVnZXIobG9jYXRpb24uc3RhcnQub2Zmc2V0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihsb2NhdGlvbi5lbmQub2Zmc2V0KSB8fCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgPCAwIHx8XG4gICAgbG9jYXRpb24uZW5kLm9mZnNldCA8IGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCB8fCAhdmFsaWRQb2ludFNoYXBlKGxvY2F0aW9uLnN0YXJ0KSB8fCAhdmFsaWRQb2ludFNoYXBlKGxvY2F0aW9uLmVuZCkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBzb3VyY2VzLmZpbHRlcigoc291cmNlKSA9PiBzb3VyY2UuZmlsZW5hbWUgPT0gbG9jYXRpb24uZmlsZW5hbWUpXG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXMuc29tZSgoc291cmNlKSA9PiBzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBsb2NhdGlvbikpXG59XG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgb25lIGlkZW50aWZpZWQgcmVnaXN0cnkgc291cmNlIG93bnMgYSBub3JtYWxpemVkIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IHNvdXJjZSAtIElkZW50aWZpZWQgc291cmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENhbmRpZGF0ZSBsb2NhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBzb3VyY2Ugb3ducyB0aGUgbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZU93bnNMb2NhdGlvbihzb3VyY2UsIGxvY2F0aW9uKSB7XG4gIGlmIChzb3VyY2UuZmlsZW5hbWUgIT0gbG9jYXRpb24uZmlsZW5hbWUpIHJldHVybiBmYWxzZVxuICBpZiAoc291cmNlLmNvbnRlbnQgPT0gbnVsbCkgcmV0dXJuIHRydWVcbiAgaWYgKGxvY2F0aW9uLmVuZC5vZmZzZXQgPiBzb3VyY2UuY29udGVudC5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBsZXQgY29vcmRpbmF0ZXMgPSBzb3VyY2VDb29yZGluYXRlSW5kZXhlcy5nZXQoc291cmNlKVxuXG4gIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICBjb29yZGluYXRlcyA9IGNyZWF0ZUNvb3JkaW5hdGVJbmRleChzb3VyY2UuY29udGVudClcbiAgICBzb3VyY2VDb29yZGluYXRlSW5kZXhlcy5zZXQoc291cmNlLCBjb29yZGluYXRlcylcbiAgfVxuXG4gIHJldHVybiBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCksIGxvY2F0aW9uLnN0YXJ0KSAmJlxuICAgIHNhbWVQb2ludChpbmRleGVkUG9pbnRBdChjb29yZGluYXRlcywgbG9jYXRpb24uZW5kLm9mZnNldCksIGxvY2F0aW9uLmVuZClcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGludGVnZXIgc2hhcGUgb2Ygb25lIHNvdXJjZSBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gcG9pbnQgLSBTb3VyY2UgcG9pbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBpcyBzdHJ1Y3R1cmFsbHkgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkUG9pbnRTaGFwZShwb2ludCkge1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwb2ludC5saW5lKSAmJiBwb2ludC5saW5lID49IDEgJiYgTnVtYmVyLmlzSW50ZWdlcihwb2ludC5jb2x1bW4pICYmIHBvaW50LmNvbHVtbiA+PSAxXG59XG5cbi8qKlxuICogQ29tcGFyZXMgbm9ybWFsaXplZCBzb3VyY2UgY29vcmRpbmF0ZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IGxlZnQgLSBMZWZ0IHBvaW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSByaWdodCAtIFJpZ2h0IHBvaW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgYWxsIGNvb3JkaW5hdGVzIG1hdGNoLlxuICovXG5mdW5jdGlvbiBzYW1lUG9pbnQobGVmdCwgcmlnaHQpIHtcbiAgcmV0dXJuIGxlZnQub2Zmc2V0ID09IHJpZ2h0Lm9mZnNldCAmJiBsZWZ0LmxpbmUgPT0gcmlnaHQubGluZSAmJiBsZWZ0LmNvbHVtbiA9PSByaWdodC5jb2x1bW5cbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgZGV0ZXJtaW5pc3RpYyBzb3VyY2Ugb3duaW5nIGEgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZX0gT3duaW5nIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gc291cmNlRm9yTG9jYXRpb24obG9jYXRpb24sIHNvdXJjZXMpIHtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5maW5kKChjYW5kaWRhdGUpID0+IHNvdXJjZU93bnNMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcblxuICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIHJlZ2lzdGVyZWQgc291cmNlIG93bnMgJHtsb2NhdGlvbi5maWxlbmFtZX06JHtsb2NhdGlvbi5zdGFydC5vZmZzZXR9LmApXG5cbiAgcmV0dXJuIHNvdXJjZVxufVxuXG4vKipcbiAqIENyZWF0ZXMgZGlyZWN0IHNvdXJjZSBwcm92ZW5hbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IHNvdXJjZSAtIFNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBMb2NhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZU9yaWdpbn0gT3JpZ2luLlxuICovXG5mdW5jdGlvbiBzb3VyY2VPcmlnaW4oc291cmNlLCBsb2NhdGlvbikge1xuICByZXR1cm4ge2tpbmQ6IFwic291cmNlXCIsIGxvY2F0aW9uLCBzb3VyY2VJZDogc291cmNlLmlkfVxufVxuXG4vKipcbiAqIEZpbmRzIG9uZSBub2RlIHByb3ZlbmFuY2UgcmVjb3JkIGJ5IHNlbWFudGljIG9iamVjdCBvciBub2RlIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlIHwgc3RyaW5nfSBub2RlIC0gU2VtYW50aWMgb2JqZWN0IG9yIG5vZGUgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlfSBQcm92ZW5hbmNlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVQcm92ZW5hbmNlKG1vZHVsZSwgbm9kZSkge1xuICByZXF1aXJlUHJvdmVuYW5jZShtb2R1bGUpXG4gIGNvbnN0IGluZGV4ID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSlcbiAgY29uc3QgcmVjb3JkID0gdHlwZW9mIG5vZGUgPT0gXCJzdHJpbmdcIlxuICAgID8gaW5kZXgucHJvdmVuYW5jZS5ub2Rlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBub2RlKVxuICAgIDogaW5kZXgucmVjb3JkRm9yKG5vZGUpXG5cbiAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbmtub3duIHNlbWFudGljIG5vZGU6ICR7bm9kZX1gKVxuXG4gIHJldHVybiByZWNvcmRcbn1cblxuLyoqXG4gKiBGaW5kcyBvbmUgc2VtYW50aWMgc3ltYm9sIHJlY29yZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHN5bWJvbElkIC0gU3ltYm9sIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlfSBTeW1ib2wgcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ltYm9sUHJvdmVuYW5jZShtb2R1bGUsIHN5bWJvbElkKSB7XG4gIHJlcXVpcmVQcm92ZW5hbmNlKG1vZHVsZSlcbiAgY29uc3Qgc3ltYm9sID0gY3JlYXRlR2VuZXJhdGlvbkluZGV4KG1vZHVsZSkucHJvdmVuYW5jZS5zeW1ib2xzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IHN5bWJvbElkKVxuXG4gIGlmICghc3ltYm9sKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBzZW1hbnRpYyBzeW1ib2w6ICR7c3ltYm9sSWR9YClcblxuICByZXR1cm4gc3ltYm9sXG59XG5cbi8qKlxuICogUmVxdWlyZXMgZnJvbnRlbmQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlfSBQcm92ZW5hbmNlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlUHJvdmVuYW5jZShtb2R1bGUpIHtcbiAgaWYgKCFtb2R1bGUucHJvdmVuYW5jZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlbWFudGljIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHNvdXJjZSBwcm92ZW5hbmNlLlwiKVxuXG4gIHJldHVybiBtb2R1bGUucHJvdmVuYW5jZVxufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBwdWJsaWMgc2VtYW50aWMgbm9kZXMgaW4gb25lIHN0YWJsZSBvcmRlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHJldHVybnMge3tub2RlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZSwgb3duZXJMb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgcGF0aDogc3RyaW5nfVtdfSBFbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VtYW50aWNFbnRyaWVzKG1vZHVsZSkge1xuICAvKiogQHR5cGUge3tub2RlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZSwgb3duZXJMb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiwgcGF0aDogc3RyaW5nfVtdfSAqL1xuICBjb25zdCBlbnRyaWVzID0gW11cblxuICB2aXNpdChtb2R1bGUsIFwiXCIsIG1vZHVsZS5sb2NhdGlvbilcblxuICByZXR1cm4gZW50cmllc1xuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIHNlbWFudGljIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZX0gbm9kZSAtIEN1cnJlbnQgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDdXJyZW50IEpTT04gUG9pbnRlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBvd25lckxvY2F0aW9uIC0gTmVhcmVzdCBsb2NhdGVkIG93bmVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGUsIHBhdGgsIG93bmVyTG9jYXRpb24pIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IFwibG9jYXRpb25cIiBpbiBub2RlID8gbm9kZS5sb2NhdGlvbiA6IG93bmVyTG9jYXRpb25cblxuICAgIGVudHJpZXMucHVzaCh7bm9kZSwgb3duZXJMb2NhdGlvbjogbG9jYXRpb24sIHBhdGh9KVxuXG4gICAgaWYgKG5vZGUua2luZCA9PSBcIk1vZHVsZVwiKSB7XG4gICAgICBub2RlLmZ1bmN0aW9ucy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgL2Z1bmN0aW9ucy8ke2luZGV4fWAsIGxvY2F0aW9uKSlcbiAgICAgIHZpc2l0KG5vZGUuZW50cnlQb2ludCwgXCIvZW50cnlQb2ludFwiLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIikge1xuICAgICAgbm9kZS5wYXJhbWV0ZXJzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3BhcmFtZXRlcnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICB2aXNpdChub2RlLnJldHVyblR5cGUsIGAke3BhdGh9L3JldHVyblR5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuYm9keSwgYCR7cGF0aH0vYm9keWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQmxvY2tcIikge1xuICAgICAgbm9kZS5zdGF0ZW1lbnRzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4gdmlzaXQoY2hpbGQsIGAke3BhdGh9L3N0YXRlbWVudHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJQYXJhbWV0ZXJcIikge1xuICAgICAgdmlzaXQobm9kZS50eXBlLCBgJHtwYXRofS90eXBlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudHlwZSwgYCR7cGF0aH0vdHlwZWAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5pbml0aWFsaXplciwgYCR7cGF0aH0vaW5pdGlhbGl6ZXJgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS50YXJnZXQsIGAke3BhdGh9L3RhcmdldGAsIGxvY2F0aW9uKVxuICAgICAgdmlzaXQobm9kZS5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIiB8fCBub2RlLmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChub2RlLmV4cHJlc3Npb24sIGAke3BhdGh9L2V4cHJlc3Npb25gLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuY29uZGl0aW9uLCBgJHtwYXRofS9jb25kaXRpb25gLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuY29uc2VxdWVudCwgYCR7cGF0aH0vY29uc2VxdWVudGAsIGxvY2F0aW9uKVxuICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlKSB2aXNpdChub2RlLmFsdGVybmF0ZSwgYCR7cGF0aH0vYWx0ZXJuYXRlYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJFbnRyeVBvaW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUuYm9keSwgYCR7cGF0aH0vYm9keWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUub3BlcmFuZCwgYCR7cGF0aH0vb3BlcmFuZGAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQmluYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdChub2RlLmxlZnQsIGAke3BhdGh9L2xlZnRgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUucmlnaHQsIGAke3BhdGh9L3JpZ2h0YCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBub2RlLmFyZ3VtZW50cy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgZGVjbGFyYXRpb25zIGFuZCByZWZlcmVuY2VzIGFmdGVyIHNlbWFudGljIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFZhbGlkYXRlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZT59IHJlY29yZHMgLSBOb2RlIHJlY29yZHMgYnkgb2NjdXJyZW5jZSBwYXRoLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IFN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTeW1ib2xzKG1vZHVsZSwgcmVjb3Jkcykge1xuICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119ICovXG4gIGNvbnN0IHN5bWJvbHMgPSBbXVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBkZWNsYXJhdGlvbl0gb2YgbW9kdWxlLmZ1bmN0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICBmdW5jdGlvbnMuc2V0KGRlY2xhcmF0aW9uLm5hbWUsIGRlY2xhcmUoZGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uLm5hbWUsIFwiZnVuY3Rpb25cIiwgYC9mdW5jdGlvbnMvJHtpbmRleH1gKSlcbiAgfVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBkZWNsYXJhdGlvbl0gb2YgbW9kdWxlLmZ1bmN0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvblBhdGggPSBgL2Z1bmN0aW9ucy8ke2luZGV4fWBcbiAgICBjb25zdCBzY29wZSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBbcGFyYW1ldGVySW5kZXgsIHBhcmFtZXRlcl0gb2YgZGVjbGFyYXRpb24ucGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgIHNjb3BlLnNldChwYXJhbWV0ZXIubmFtZSwgZGVjbGFyZShwYXJhbWV0ZXIsIHBhcmFtZXRlci5uYW1lLCBcInBhcmFtZXRlclwiLCBgJHtkZWNsYXJhdGlvblBhdGh9L3BhcmFtZXRlcnMvJHtwYXJhbWV0ZXJJbmRleH1gKSlcbiAgICB9XG4gICAgdmlzaXRCbG9jayhkZWNsYXJhdGlvbi5ib2R5LCBzY29wZSwgYCR7ZGVjbGFyYXRpb25QYXRofS9ib2R5YClcbiAgfVxuXG4gIHZpc2l0QmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpLCBcIi9lbnRyeVBvaW50L2JvZHlcIilcblxuICByZXR1cm4gc3ltYm9sc1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlcyBvbmUgY2Fub25pY2FsIHN5bWJvbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlBhcmFtZXRlciB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuTG9jYWxEZWNsYXJhdGlvbn0gbm9kZSAtIERlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFN5bWJvbCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNTeW1ib2xLaW5kfSBraW5kIC0gU3ltYm9sIGtpbmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRGVjbGFyYXRpb24gb2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTeW1ib2wgaWRlbnRpdHkuXG4gICAqL1xuICBmdW5jdGlvbiBkZWNsYXJlKG5vZGUsIG5hbWUsIGtpbmQsIHBhdGgpIHtcbiAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzLmdldChwYXRoKVxuXG4gICAgaWYgKCFyZWNvcmQpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwcm92ZW5hbmNlIGZvciAke25vZGUua2luZH0uYClcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVjb3JkLnJhbmdlcy5uYW1lID8/IG5vZGUubG9jYXRpb25cbiAgICBjb25zdCBpZCA9IGBzeW1ib2w6JHtzeW1ib2xzLmxlbmd0aH1gXG5cbiAgICByZWNvcmQuc3ltYm9sSWQgPSBpZFxuICAgIHN5bWJvbHMucHVzaCh7ZGVjbGFyYXRpb25Ob2RlSWQ6IHJlY29yZC5pZCwgaWQsIGtpbmQsIGxvY2F0aW9uLCBuYW1lLCByZWZlcmVuY2VzOiBbXX0pXG5cbiAgICByZXR1cm4gaWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyByZWZlcmVuY2VzIGluIG9uZSBsZXhpY2FsIGJsb2NrLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gcGFyZW50IC0gVmlzaWJsZSBiaW5kaW5ncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBTdGF0ZW1lbnQgc2VxdWVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdEJsb2NrKGJsb2NrLCBwYXJlbnQsIHBhdGgpIHtcbiAgICBjb25zdCBzY29wZSA9IG5ldyBNYXAocGFyZW50KVxuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0YXRlbWVudF0gb2YgYmxvY2suc3RhdGVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFBhdGggPSBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YFxuXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5pbml0aWFsaXplciwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2luaXRpYWxpemVyYClcbiAgICAgICAgc2NvcGUuc2V0KHN0YXRlbWVudC5uYW1lLCBkZWNsYXJlKHN0YXRlbWVudCwgc3RhdGVtZW50Lm5hbWUsIFwibG9jYWxcIiwgc3RhdGVtZW50UGF0aCkpXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICAgIHJlZmVyZW5jZShzdGF0ZW1lbnQudGFyZ2V0LCBzY29wZS5nZXQoc3RhdGVtZW50LnRhcmdldC5uYW1lKSwgXCJ3cml0ZVwiLCBgJHtzdGF0ZW1lbnRQYXRofS90YXJnZXRgKVxuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9leHByZXNzaW9uYClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmApXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdEV4cHJlc3Npb24oc3RhdGVtZW50LmNvbmRpdGlvbiwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2NvbmRpdGlvbmApXG4gICAgICAgIHZpc2l0QmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9jb25zZXF1ZW50YClcbiAgICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHZpc2l0QmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2FsdGVybmF0ZWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHJlZmVyZW5jZXMgaW4gb25lIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSBzY29wZSAtIFZpc2libGUgYmluZGluZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRXhwcmVzc2lvbiBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNjb3BlLCBwYXRoKSB7XG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHJlZmVyZW5jZShleHByZXNzaW9uLCBzY29wZS5nZXQoZXhwcmVzc2lvbi5uYW1lKSwgXCJyZWFkXCIsIHBhdGgpXG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgcmVmZXJlbmNlKGV4cHJlc3Npb24sIGZ1bmN0aW9ucy5nZXQoZXhwcmVzc2lvbi5jYWxsZWUpLCBcImNhbGxcIiwgcGF0aClcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhcmd1bWVudF0gb2YgZXhwcmVzc2lvbi5hcmd1bWVudHMuZW50cmllcygpKSB2aXNpdEV4cHJlc3Npb24oYXJndW1lbnQsIHNjb3BlLCBgJHtwYXRofS9hcmd1bWVudHMvJHtpbmRleH1gKVxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLm9wZXJhbmQsIHNjb3BlLCBgJHtwYXRofS9vcGVyYW5kYClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ubGVmdCwgc2NvcGUsIGAke3BhdGh9L2xlZnRgKVxuICAgICAgdmlzaXRFeHByZXNzaW9uKGV4cHJlc3Npb24ucmlnaHQsIHNjb3BlLCBgJHtwYXRofS9yaWdodGApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIG9uZSByZXNvbHZlZCBzeW1ib2wgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuSWRlbnRpZmllckV4cHJlc3Npb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNhbGxFeHByZXNzaW9ufSBub2RlIC0gUmVmZXJlbmNlIG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBzeW1ib2xJZCAtIFJlc29sdmVkIHN5bWJvbC5cbiAgICogQHBhcmFtIHtcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUmVmZXJlbmNlIG9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZWZlcmVuY2Uobm9kZSwgc3ltYm9sSWQsIHJvbGUsIHBhdGgpIHtcbiAgICBpZiAoIXN5bWJvbElkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHMuZ2V0KHBhdGgpXG4gICAgY29uc3Qgc3ltYm9sID0gc3ltYm9scy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzeW1ib2xJZClcblxuICAgIGlmICghcmVjb3JkIHx8ICFzeW1ib2wpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwcm92ZW5hbmNlIHdoaWxlIHJlc29sdmluZyAke25vZGUua2luZH0uYClcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVjb3JkLnJhbmdlc1tyb2xlID09IFwiY2FsbFwiID8gXCJjYWxsZWVcIiA6IFwibmFtZVwiXSA/PyBub2RlLmxvY2F0aW9uXG5cbiAgICByZWNvcmQuc3ltYm9sSWQgPSBzeW1ib2xJZFxuICAgIHN5bWJvbC5yZWZlcmVuY2VzLnB1c2goe2xvY2F0aW9uLCBub2RlSWQ6IHJlY29yZC5pZCwgcm9sZX0pXG4gIH1cbn1cbiJdfQ==
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmVuYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZW1hbnRpYy9wcm92ZW5hbmNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFBO0FBRW5FLDZGQUE2RjtBQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ2xDLHVHQUF1RztBQUN2RyxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNO0lBQzFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ2hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU07SUFDM0MsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUU3QixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBQztJQUN2RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN2Qyx1RUFBdUU7SUFDdkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUMvQiw0REFBNEQ7SUFDNUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLEtBQUssTUFBTSxDQUFDLEtB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ZWNrXG5cbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkUG9pbnRBdH0gZnJvbSBcIi4vbG9jYXRpb24uanNcIlxuXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj4+fSAqL1xuY29uc3QgcGFyc2VyUmFuZ2VzID0gbmV3IFdlYWtNYXAoKVxuLyoqIEB0eXBlIHtXZWFrTWFwPGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZSwgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29vcmRpbmF0ZUluZGV4Pj59ICovXG5jb25zdCBzb3VyY2VDb29yZGluYXRlSW5kZXhlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBSZWNvcmRzIHBhcnNlci1wcm92aWRlZCBzZW1hbnRpYy10b2tlbiByYW5nZXMgd2l0aG91dCBleHBvc2luZyBwYXJzZXIgdHJlZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gbm9kZSAtIFNlbWFudGljIG5vZGUuXG4gKiBAcGFyYW0ge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgcm9sZSByYW5nZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgcGFyc2VyUmFuZ2VzLnNldChub2RlLCByYW5nZXMpXG59XG5cbi8qKlxuICogUmVjb3JkcyBwYXJzZXIgcmFuZ2VzIGFuZCByZXR1cm5zIHRoZSBzYW1lIHNlbWFudGljIG5vZGUuXG4gKiBAdGVtcGxhdGUge29iamVjdH0gTm9kZVxuICogQHBhcmFtIHtOb2RlfSBub2RlIC0gU2VtYW50aWMgbm9kZS5cbiAqIEBwYXJhbSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCByb2xlIHJhbmdlcy5cbiAqIEByZXR1cm5zIHtOb2RlfSBUaGUgc2FtZSBub2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFBhcnNlclJhbmdlcyhub2RlLCByYW5nZXMpIHtcbiAgc2V0UGFyc2VyUmFuZ2VzKG5vZGUsIHJhbmdlcylcblxuICByZXR1cm4gbm9kZVxufVxuXG4vKipcbiAqIEFkZHMgZGV0ZXJtaW5pc3RpYyBwcm92ZW5hbmNlIHRvIGEgdmFsaWRhdGVkIGZyb250ZW5kIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzb3VyY2UgLSBQYXJzZWQgc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZS5maWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBzb3VyY2UubGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlLnNvdXJjZSAtIEV4YWN0IHNvdXJjZSBjb250ZW50LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFRoZSBzYW1lIHNlbWFudGljIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm90YXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwge2ZpbGVuYW1lLCBsYW5ndWFnZSwgc291cmNlfSkge1xuICBjb25zdCBzb3VyY2VzID0gW3tjb250ZW50OiBzb3VyY2UsIGZpbGVuYW1lLCBpZDogXCJzb3VyY2U6MFwiLCBsYW5ndWFnZX1dXG4gIGNvbnN0IGVudHJpZXMgPSBzZW1hbnRpY0VudHJpZXMobW9kdWxlKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZT59ICovXG4gIGNvbnN0IHJlY29yZHNCeVBhdGggPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2VbXX0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IFtdXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBlbnRyaWVzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJhbmdlcyA9IHBhcnNlclJhbmdlcy5nZXQoZW50cnkubm9kZSkgPz8ge31cbiAgICBjb25zdCBsb2NhdGlvbiA9IFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlID8gZW50cnkubm9kZS5sb2NhdGlvbiA6IHJhbmdlcy50eXBlID8/IGVudHJ5Lm93bmVyTG9jYXRpb25cbiAgICBjb25zdCBzb3VyY2VQcm92ZW5hbmNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9ICovICh7XG4gICAgICBvcmlnaW46IHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IFwic291cmNlOjBcIn0sXG4gICAgICByYW5nZXMsXG4gICAgICBzY2hlbWE6IFwiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwiLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH0pXG4gICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgaWQ6IGBub2RlOiR7aW5kZXh9YCxcbiAgICAgIGtpbmQ6IGVudHJ5Lm5vZGUua2luZCxcbiAgICAgIG9yaWdpbjogc291cmNlUHJvdmVuYW5jZS5vcmlnaW4sXG4gICAgICBwYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgcmFuZ2VzOiBzb3VyY2VQcm92ZW5hbmNlLnJhbmdlc1xuICAgIH1cblxuICAgIHJlY29yZHMucHVzaChyZWNvcmQpXG4gICAgcmVjb3Jkc0J5UGF0aC5zZXQoZW50cnkucGF0aCwgcmVjb3JkKVxuICAgIGVudHJ5Lm5vZGUuc291cmNlUHJvdmVuYW5jZSA9IHNvdXJjZVByb3ZlbmFuY2VcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHMgPSByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHNCeVBhdGgpXG5cbiAgbW9kdWxlLnByb3ZlbmFuY2UgPSB7XG4gICAgY29vcmRpbmF0ZVN5c3RlbTogXCJ1dGYxNlwiLFxuICAgIG5vZGVzOiByZWNvcmRzLFxuICAgIHNjaGVtYTogXCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIixcbiAgICBzb3VyY2VzLFxuICAgIHN5bWJvbHMsXG4gICAgdmVyc2lvbjogMVxuICB9XG5cbiAgcmV0dXJuIG1vZHVsZVxufVxuXG4vKipcbiAqIFJlYnVpbGRzIGNhbm9uaWNhbCBnZW5lcmF0aW9uIG1ldGFkYXRhIHdpdGhvdXQgdHJ1c3RpbmcgY2FsbGVyLXByb3ZpZGVkIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2ZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGFuZ3VhZ2U/OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTGFuZ3VhZ2V9W119IFtwcm92aWRlZFNvdXJjZXNdIC0gQWRkaXRpb25hbCBzb3VyY2UgY29udGVudC5cbiAqIEByZXR1cm5zIHt7cHJvdmVuYW5jZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1Byb3ZlbmFuY2UsIHJlY29yZEZvcjogKG5vZGU6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlLCBwYXRoPzogc3RyaW5nKSA9PiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2V9fSBDYW5vbmljYWwgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0aW9uSW5kZXgobW9kdWxlLCBwcm92aWRlZFNvdXJjZXMgPSBbXSkge1xuICBjb25zdCBlbnRyaWVzID0gc2VtYW50aWNFbnRyaWVzKG1vZHVsZSlcbiAgY29uc3QgcHJpb3JTb3VyY2VzID0gdXNhYmxlU291cmNlUHJvdmVuYW5jZShtb2R1bGUucHJvdmVuYW5jZSlcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gKi9cbiAgY29uc3Qgc291cmNlcyA9IFtdXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gKi9cbiAgY29uc3QgcHJpb3JTb3VyY2VzQnlJZCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHByb3ZpZGVkU291cmNlcykgYWRkU291cmNlKHNvdXJjZS5maWxlbmFtZSwgc291cmNlLmNvbnRlbnQsIHNvdXJjZS5sYW5ndWFnZSA/PyBudWxsKVxuICBpZiAocHJpb3JTb3VyY2VzKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgcHJpb3JTb3VyY2VzLnNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGFkZFNvdXJjZShzb3VyY2UuZmlsZW5hbWUsIHNvdXJjZS5jb250ZW50LCBzb3VyY2UubGFuZ3VhZ2UpXG5cbiAgICAgIHByaW9yU291cmNlc0J5SWQuc2V0KHNvdXJjZS5pZCwgY2Fub25pY2FsKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IFwibG9jYXRpb25cIiBpbiBlbnRyeS5ub2RlID8gZW50cnkubm9kZS5sb2NhdGlvbiA6IGVudHJ5Lm93bmVyTG9jYXRpb25cblxuICAgIGlmICghc291cmNlcy5zb21lKChzb3VyY2UpID0+IHNvdXJjZS5maWxlbmFtZSA9PSBsb2NhdGlvbi5maWxlbmFtZSkpIGFkZFNvdXJjZShsb2NhdGlvbi5maWxlbmFtZSwgbnVsbCwgbnVsbClcbiAgfVxuICBjb25zdCB2ZXJpZmlhYmxlU291cmNlcyA9IHNvdXJjZXMuZmlsdGVyKChzb3VyY2UpID0+IHNvdXJjZS5jb250ZW50ICE9IG51bGwpXG5cbiAgLyoqIEB0eXBlIHtNYXA8b2JqZWN0LCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2VbXT59ICovXG4gIGNvbnN0IHJlY29yZHNCeU5vZGUgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSAqL1xuICBjb25zdCByZWNvcmRzQnlQYXRoID0gbmV3IE1hcCgpXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGVQcm92ZW5hbmNlW119ICovXG4gIGNvbnN0IHJlY29yZHMgPSBbXVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBsb2NhdGVkID0gXCJsb2NhdGlvblwiIGluIGVudHJ5Lm5vZGUgPyBlbnRyeS5ub2RlLmxvY2F0aW9uIDogZW50cnkub3duZXJMb2NhdGlvblxuICAgIGNvbnN0IGFzc29jaWF0ZWQgPSB1c2FibGVOb2RlUHJvdmVuYW5jZShlbnRyeS5ub2RlLnNvdXJjZVByb3ZlbmFuY2UpXG4gICAgY29uc3QgcmFuZ2VzID0gYXNzb2NpYXRlZCA/IHZhbGlkUmFuZ2VzKGFzc29jaWF0ZWQucmFuZ2VzLCB2ZXJpZmlhYmxlU291cmNlcykgOiB7fVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmlnaW4gPSBhc3NvY2lhdGVkXG4gICAgICA/IG5vcm1hbGl6ZU9yaWdpbihhc3NvY2lhdGVkLm9yaWdpbiwgcHJpb3JTb3VyY2VzQnlJZCwgdmVyaWZpYWJsZVNvdXJjZXMpXG4gICAgICA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGZhbGxiYWNrU291cmNlID0gc291cmNlRm9yTG9jYXRpb24obG9jYXRlZCwgc291cmNlcylcbiAgICBjb25zdCBvcmlnaW4gPSBub3JtYWxpemVkT3JpZ2luID8/IHNvdXJjZU9yaWdpbihmYWxsYmFja1NvdXJjZSwgbG9jYXRlZClcblxuICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgIGlkOiBgbm9kZToke2luZGV4fWAsXG4gICAgICBraW5kOiBlbnRyeS5ub2RlLmtpbmQsXG4gICAgICBvcmlnaW4sXG4gICAgICBwYXRoOiBlbnRyeS5wYXRoLFxuICAgICAgcmFuZ2VzXG4gICAgfVxuXG4gICAgcmVjb3Jkcy5wdXNoKHJlY29yZClcbiAgICByZWNvcmRzQnlQYXRoLnNldChlbnRyeS5wYXRoLCByZWNvcmQpXG4gICAgY29uc3Qgb2NjdXJyZW5jZXMgPSByZWNvcmRzQnlOb2RlLmdldChlbnRyeS5ub2RlKSA/PyBbXVxuXG4gICAgb2NjdXJyZW5jZXMucHVzaChyZWNvcmQpXG4gICAgcmVjb3Jkc0J5Tm9kZS5zZXQoZW50cnkubm9kZSwgb2NjdXJyZW5jZXMpXG4gIH1cblxuICBjb25zdCBzeW1ib2xzID0gcmVzb2x2ZVN5bWJvbHMobW9kdWxlLCByZWNvcmRzQnlQYXRoKVxuICBjb25zdCBwcm92ZW5hbmNlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZX0gKi8gKHtcbiAgICBjb29yZGluYXRlU3lzdGVtOiBcInV0ZjE2XCIsXG4gICAgbm9kZXM6IHJlY29yZHMsXG4gICAgc2NoZW1hOiBcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwiLFxuICAgIHNvdXJjZXMsXG4gICAgc3ltYm9scyxcbiAgICB2ZXJzaW9uOiAxXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwcm92ZW5hbmNlLFxuICAgIHJlY29yZEZvcihub2RlLCBwYXRoKSB7XG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IHJlY29yZHNCeU5vZGUuZ2V0KG5vZGUpXG5cbiAgICAgIGlmICghb2NjdXJyZW5jZXMpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VtYW50aWMgbm9kZSBpcyBub3QgcGFydCBvZiB0aGlzIG1vZHVsZS5cIilcbiAgICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gb2NjdXJyZW5jZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUucGF0aCA9PSBwYXRoKVxuXG4gICAgICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2VtYW50aWMgbm9kZSBkb2VzIG5vdCBvY2N1ciBhdCAnJHtwYXRofScuYClcblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgICB9XG4gICAgICBpZiAob2NjdXJyZW5jZXMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTaGFyZWQgc2VtYW50aWMgbm9kZSByZXF1aXJlcyBhbiBvY2N1cnJlbmNlIHBhdGguXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvY2N1cnJlbmNlc1swXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgb25lIGNhbm9uaWNhbCBzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSAtIFNvdXJjZSBmaWxlbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBjb250ZW50IC0gU291cmNlIGNvbnRlbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IENhbm9uaWNhbCBzb3VyY2UuXG4gICAqL1xuICBmdW5jdGlvbiBhZGRTb3VyY2UoZmlsZW5hbWUsIGNvbnRlbnQsIGxhbmd1YWdlKSB7XG4gICAgaWYgKHR5cGVvZiBmaWxlbmFtZSAhPSBcInN0cmluZ1wiIHx8IGNvbnRlbnQgIT09IG51bGwgJiYgdHlwZW9mIGNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgbGFuZ3VhZ2UgIT09IG51bGwgJiYgIVtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIiwgXCJweXRob25cIiwgXCJjc2hhcnBcIiwgXCJnb1wiLCBcImNcIiwgXCJjcHBcIl0uaW5jbHVkZXMobGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWFsZm9ybWVkIHNlbWFudGljIHNvdXJjZSByZWdpc3RyeSBlbnRyeS5cIilcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHNvdXJjZXMuZmluZCgoc291cmNlKSA9PiBzb3VyY2UuZmlsZW5hbWUgPT0gZmlsZW5hbWUgJiYgc291cmNlLmNvbnRlbnQgPT0gY29udGVudClcblxuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG5cbiAgICBjb25zdCByZWdpc3RlcmVkID0ge2NvbnRlbnQsIGZpbGVuYW1lLCBpZDogYHNvdXJjZToke3NvdXJjZXMubGVuZ3RofWAsIGxhbmd1YWdlfVxuXG4gICAgc291cmNlcy5wdXNoKHJlZ2lzdGVyZWQpXG5cbiAgICByZXR1cm4gcmVnaXN0ZXJlZFxuICB9XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgc2FmZSBwcmltYXJ5IG9yaWdpbmFsIGxvY2F0aW9uIGZvciBjbG9zZWQgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZH0gUHJpbWFyeSBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW1hcnlMb2NhdGlvbihvcmlnaW4pIHtcbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIpIHJldHVybiBvcmlnaW4ubG9jYXRpb25cbiAgaWYgKG9yaWdpbi5raW5kID09IFwiZGVyaXZlZFwiKSByZXR1cm4gb3JpZ2luLm9yaWdpbnNbMF0/LmxvY2F0aW9uXG5cbiAgcmV0dXJuIG9yaWdpbi5yZWxhdGVkT3JpZ2luc1swXT8ubG9jYXRpb25cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHNvdXJjZSBtZXRhZGF0YSBvbmx5IHdoZW4gaXQgaXMgYXR0YWNoZWQgdG8gdGhlIHNlbWFudGljIG5vZGUgaXQgZGVzY3JpYmVzLlxuICogUmVnaXN0cnktbG9jYWwgSURzIGFuZCBwYXRocyBhcmUgaW50ZW50aW9uYWxseSBpZ25vcmVkIGFuZCByZWJ1aWx0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2UgfCB1bmRlZmluZWR9IHJlY29yZCAtIENhbmRpZGF0ZSBub2RlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gVXNhYmxlIGFzc29jaWF0aW9uLlxuICovXG5mdW5jdGlvbiB1c2FibGVOb2RlUHJvdmVuYW5jZShyZWNvcmQpIHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNjaGVtYSAhPSBcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIiB8fCByZWNvcmQudmVyc2lvbiAhPSAxIHx8XG4gICAgIXJlY29yZC5vcmlnaW4gfHwgdHlwZW9mIHJlY29yZC5vcmlnaW4gIT0gXCJvYmplY3RcIiB8fFxuICAgICFyZWNvcmQucmFuZ2VzIHx8IHR5cGVvZiByZWNvcmQucmFuZ2VzICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQucmFuZ2VzKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiByZWNvcmRcbn1cblxuLyoqXG4gKiBSZXRhaW5zIGEgdmFsaWQgc291cmNlIHJlZ2lzdHJ5IGluZGVwZW5kZW50bHkgZnJvbSBwb3RlbnRpYWxseSBzdGFsZSBub2RlIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZSB8IHVuZGVmaW5lZH0gcHJvdmVuYW5jZSAtIENhbmRpZGF0ZSBwcm92ZW5hbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNQcm92ZW5hbmNlIHwgdW5kZWZpbmVkfSBQcm92ZW5hbmNlIHdpdGggYSB1c2FibGUgc291cmNlIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiB1c2FibGVTb3VyY2VQcm92ZW5hbmNlKHByb3ZlbmFuY2UpIHtcbiAgaWYgKCFwcm92ZW5hbmNlIHx8IHByb3ZlbmFuY2Uuc2NoZW1hICE9IFwiU2VtYW50aWZvbGRQcm92ZW5hbmNlXCIgfHwgcHJvdmVuYW5jZS52ZXJzaW9uICE9IDEgfHxcbiAgICBwcm92ZW5hbmNlLmNvb3JkaW5hdGVTeXN0ZW0gIT0gXCJ1dGYxNlwiIHx8ICFBcnJheS5pc0FycmF5KHByb3ZlbmFuY2Uuc291cmNlcykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2VJZHMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwcm92ZW5hbmNlLnNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLmlkICE9IFwic3RyaW5nXCIgfHwgc291cmNlSWRzLmhhcyhzb3VyY2UuaWQpIHx8IHR5cGVvZiBzb3VyY2UuZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fFxuICAgICAgc291cmNlLmZpbGVuYW1lLmxlbmd0aCA9PSAwIHx8XG4gICAgICBzb3VyY2UuY29udGVudCAhPT0gbnVsbCAmJiB0eXBlb2Ygc291cmNlLmNvbnRlbnQgIT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UubGFuZ3VhZ2UgIT09IG51bGwgJiZcbiAgICAgICFbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCIsIFwicHl0aG9uXCIsIFwiY3NoYXJwXCIsIFwiZ29cIiwgXCJjXCIsIFwiY3BwXCJdLmluY2x1ZGVzKHNvdXJjZS5sYW5ndWFnZSkpIHJldHVybiB1bmRlZmluZWRcbiAgICBzb3VyY2VJZHMuYWRkKHNvdXJjZS5pZClcbiAgfVxuXG4gIHJldHVybiBwcm92ZW5hbmNlXG59XG5cbi8qKlxuICogUmV0YWlucyBvbmx5IHNlbGYtY29uc2lzdGVudCBzb3VyY2UgcmFuZ2VzLlxuICogQHBhcmFtIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIENhbmRpZGF0ZSByYW5nZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2Fub25pY2FsIHNvdXJjZXMuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj4+fSBTYWZlIHJhbmdlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRSYW5nZXMocmFuZ2VzLCBzb3VyY2VzKSB7XG4gIGlmICghcmFuZ2VzIHx8IHR5cGVvZiByYW5nZXMgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHJhbmdlcykpIHJldHVybiB7fVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbj59ICovXG4gIGNvbnN0IHZhbGlkID0ge31cblxuICBmb3IgKGNvbnN0IFtyb2xlLCBsb2NhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmFuZ2VzKSkge1xuICAgIGlmICh2YWxpZExvY2F0aW9uKGxvY2F0aW9uLCBzb3VyY2VzKSkgdmFsaWRbcm9sZV0gPSBsb2NhdGlvblxuICB9XG5cbiAgcmV0dXJuIHZhbGlkXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGNsb3NlZCBvcmlnaW4gd2hpbGUgcmVtYXBwaW5nIHVudHJ1c3RlZCBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2FuZGlkYXRlIG9yaWdpbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlPn0gcHJpb3JTb3VyY2VzIC0gUHJpb3ItdG8tY2Fub25pY2FsIHNvdXJjZSBtYXBwaW5nLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNPcmlnaW4gfCB1bmRlZmluZWR9IFNhZmUgb3JpZ2luLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVPcmlnaW4ob3JpZ2luLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpIHtcbiAgaWYgKCFvcmlnaW4gfHwgdHlwZW9mIG9yaWdpbiAhPSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic291cmNlXCIgJiYgdmFsaWRMb2NhdGlvbihvcmlnaW4ubG9jYXRpb24sIHNvdXJjZXMpKSB7XG4gICAgY29uc3QgY2xhaW1lZCA9IHByaW9yU291cmNlcy5nZXQob3JpZ2luLnNvdXJjZUlkKVxuICAgIGNvbnN0IHNvdXJjZSA9IGNsYWltZWQgJiYgc291cmNlT3duc0xvY2F0aW9uKGNsYWltZWQsIG9yaWdpbi5sb2NhdGlvbikgPyBjbGFpbWVkIDogc291cmNlRm9yTG9jYXRpb24ob3JpZ2luLmxvY2F0aW9uLCBzb3VyY2VzKVxuXG4gICAgcmV0dXJuIHNvdXJjZU9yaWdpbihzb3VyY2UsIG9yaWdpbi5sb2NhdGlvbilcbiAgfVxuICBpZiAob3JpZ2luLmtpbmQgPT0gXCJkZXJpdmVkXCIgJiYgQXJyYXkuaXNBcnJheShvcmlnaW4ub3JpZ2lucykgJiYgb3JpZ2luLm9yaWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG9yaWdpbnMgPSBvcmlnaW4ub3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IG5vcm1hbGl6ZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSlcblxuICAgIGlmIChvcmlnaW5zLmV2ZXJ5KEJvb2xlYW4pKSByZXR1cm4ge2tpbmQ6IFwiZGVyaXZlZFwiLCBvcmlnaW5zOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSAqLyAob3JpZ2lucyl9XG4gIH1cbiAgaWYgKG9yaWdpbi5raW5kID09IFwic3ludGhldGljXCIgJiYgdHlwZW9mIG9yaWdpbi5yZWFzb24gPT0gXCJzdHJpbmdcIiAmJiBBcnJheS5pc0FycmF5KG9yaWdpbi5yZWxhdGVkT3JpZ2lucykpIHtcbiAgICBjb25zdCByZWxhdGVkT3JpZ2lucyA9IG9yaWdpbi5yZWxhdGVkT3JpZ2lucy5tYXAoKHJlbGF0ZWQpID0+IG5vcm1hbGl6ZVJlbGF0ZWRPcmlnaW4ocmVsYXRlZCwgcHJpb3JTb3VyY2VzLCBzb3VyY2VzKSlcblxuICAgIGlmIChyZWxhdGVkT3JpZ2lucy5ldmVyeShCb29sZWFuKSkge1xuICAgICAgcmV0dXJuIHtraW5kOiBcInN5bnRoZXRpY1wiLCByZWFzb246IG9yaWdpbi5yZWFzb24sIHJlbGF0ZWRPcmlnaW5zOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbltdfSAqLyAocmVsYXRlZE9yaWdpbnMpfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG9uZSByZWxhdGVkIG9yaWdpbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWxhdGVkT3JpZ2lufSByZWxhdGVkIC0gQ2FuZGlkYXRlIHJlbGF0ZWQgb3JpZ2luLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2U+fSBwcmlvclNvdXJjZXMgLSBQcmlvciBzb3VyY2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2VbXX0gc291cmNlcyAtIENhbm9uaWNhbCBzb3VyY2VzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVsYXRlZE9yaWdpbiB8IHVuZGVmaW5lZH0gU2FmZSByZWxhdGVkIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVsYXRlZE9yaWdpbihyZWxhdGVkLCBwcmlvclNvdXJjZXMsIHNvdXJjZXMpIHtcbiAgaWYgKCFyZWxhdGVkIHx8ICF2YWxpZExvY2F0aW9uKHJlbGF0ZWQubG9jYXRpb24sIHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3QgY2xhaW1lZCA9IHByaW9yU291cmNlcy5nZXQocmVsYXRlZC5zb3VyY2VJZClcbiAgY29uc3Qgc291cmNlID0gY2xhaW1lZCAmJiBzb3VyY2VPd25zTG9jYXRpb24oY2xhaW1lZCwgcmVsYXRlZC5sb2NhdGlvbikgPyBjbGFpbWVkIDogc291cmNlRm9yTG9jYXRpb24ocmVsYXRlZC5sb2NhdGlvbiwgc291cmNlcylcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtsb2NhdGlvbjogcmVsYXRlZC5sb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH1cblxuICBpZiAodHlwZW9mIHJlbGF0ZWQucm9sZSA9PSBcInN0cmluZ1wiKSBPYmplY3QuYXNzaWduKG5vcm1hbGl6ZWQsIHtyb2xlOiByZWxhdGVkLnJvbGV9KVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogQ2hlY2tzIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMgYWdhaW5zdCBleGFjdCBzb3VyY2UgY29udGVudCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gUmVnaXN0ZXJlZCBzb3VyY2VzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvY2F0aW9uIGlzIHNhZmUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkTG9jYXRpb24obG9jYXRpb24sIHNvdXJjZXMpIHtcbiAgaWYgKCFsb2NhdGlvbiB8fCB0eXBlb2YgbG9jYXRpb24uZmlsZW5hbWUgIT0gXCJzdHJpbmdcIiB8fCAhbG9jYXRpb24uc3RhcnQgfHwgIWxvY2F0aW9uLmVuZCB8fFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxvY2F0aW9uLnN0YXJ0Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIobG9jYXRpb24uZW5kLm9mZnNldCkgfHwgbG9jYXRpb24uc3RhcnQub2Zmc2V0IDwgMCB8fFxuICAgIGxvY2F0aW9uLmVuZC5vZmZzZXQgPCBsb2NhdGlvbi5zdGFydC5vZmZzZXQgfHwgIXZhbGlkUG9pbnRTaGFwZShsb2NhdGlvbi5zdGFydCkgfHwgIXZhbGlkUG9pbnRTaGFwZShsb2NhdGlvbi5lbmQpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBjYW5kaWRhdGVzID0gc291cmNlcy5maWx0ZXIoKHNvdXJjZSkgPT4gc291cmNlLmZpbGVuYW1lID09IGxvY2F0aW9uLmZpbGVuYW1lKVxuXG4gIHJldHVybiBjYW5kaWRhdGVzLnNvbWUoKHNvdXJjZSkgPT4gc291cmNlT3duc0xvY2F0aW9uKHNvdXJjZSwgbG9jYXRpb24pKVxufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IG9uZSBpZGVudGlmaWVkIHJlZ2lzdHJ5IHNvdXJjZSBvd25zIGEgbm9ybWFsaXplZCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBJZGVudGlmaWVkIHNvdXJjZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYW5kaWRhdGUgbG9jYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc291cmNlIG93bnMgdGhlIGxvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBzb3VyY2VPd25zTG9jYXRpb24oc291cmNlLCBsb2NhdGlvbikge1xuICBpZiAoc291cmNlLmZpbGVuYW1lICE9IGxvY2F0aW9uLmZpbGVuYW1lKSByZXR1cm4gZmFsc2VcbiAgaWYgKHNvdXJjZS5jb250ZW50ID09IG51bGwpIHJldHVybiB0cnVlXG4gIGlmIChsb2NhdGlvbi5lbmQub2Zmc2V0ID4gc291cmNlLmNvbnRlbnQubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgbGV0IGNvb3JkaW5hdGVzID0gc291cmNlQ29vcmRpbmF0ZUluZGV4ZXMuZ2V0KHNvdXJjZSlcblxuICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgY29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlLmNvbnRlbnQpXG4gICAgc291cmNlQ29vcmRpbmF0ZUluZGV4ZXMuc2V0KHNvdXJjZSwgY29vcmRpbmF0ZXMpXG4gIH1cblxuICByZXR1cm4gc2FtZVBvaW50KGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBsb2NhdGlvbi5zdGFydC5vZmZzZXQpLCBsb2NhdGlvbi5zdGFydCkgJiZcbiAgICBzYW1lUG9pbnQoaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIGxvY2F0aW9uLmVuZC5vZmZzZXQpLCBsb2NhdGlvbi5lbmQpXG59XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBpbnRlZ2VyIHNoYXBlIG9mIG9uZSBzb3VyY2UgcG9pbnQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlUG9pbnR9IHBvaW50IC0gU291cmNlIHBvaW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgaXQgaXMgc3RydWN0dXJhbGx5IHZhbGlkLlxuICovXG5mdW5jdGlvbiB2YWxpZFBvaW50U2hhcGUocG9pbnQpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocG9pbnQubGluZSkgJiYgcG9pbnQubGluZSA+PSAxICYmIE51bWJlci5pc0ludGVnZXIocG9pbnQuY29sdW1uKSAmJiBwb2ludC5jb2x1bW4gPj0gMVxufVxuXG4vKipcbiAqIENvbXBhcmVzIG5vcm1hbGl6ZWQgc291cmNlIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZVBvaW50fSBsZWZ0IC0gTGVmdCBwb2ludC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VQb2ludH0gcmlnaHQgLSBSaWdodCBwb2ludC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGFsbCBjb29yZGluYXRlcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gc2FtZVBvaW50KGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBsZWZ0Lm9mZnNldCA9PSByaWdodC5vZmZzZXQgJiYgbGVmdC5saW5lID09IHJpZ2h0LmxpbmUgJiYgbGVmdC5jb2x1bW4gPT0gcmlnaHQuY29sdW1uXG59XG5cbi8qKlxuICogRmluZHMgdGhlIGRldGVybWluaXN0aWMgc291cmNlIG93bmluZyBhIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBDYW5vbmljYWwgc291cmNlcy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlZ2lzdGVyZWRTb3VyY2V9IE93bmluZyBzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIHNvdXJjZUZvckxvY2F0aW9uKGxvY2F0aW9uLCBzb3VyY2VzKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBzb3VyY2VPd25zTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG5cbiAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBSYW5nZUVycm9yKGBObyByZWdpc3RlcmVkIHNvdXJjZSBvd25zICR7bG9jYXRpb24uZmlsZW5hbWV9OiR7bG9jYXRpb24uc3RhcnQub2Zmc2V0fS5gKVxuXG4gIHJldHVybiBzb3VyY2Vcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGRpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWdpc3RlcmVkU291cmNlfSBzb3VyY2UgLSBTb3VyY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VPcmlnaW59IE9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gc291cmNlT3JpZ2luKHNvdXJjZSwgbG9jYXRpb24pIHtcbiAgcmV0dXJuIHtraW5kOiBcInNvdXJjZVwiLCBsb2NhdGlvbiwgc291cmNlSWQ6IHNvdXJjZS5pZH1cbn1cblxuLyoqXG4gKiBGaW5kcyBvbmUgbm9kZSBwcm92ZW5hbmNlIHJlY29yZCBieSBzZW1hbnRpYyBvYmplY3Qgb3Igbm9kZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZSB8IHN0cmluZ30gbm9kZSAtIFNlbWFudGljIG9iamVjdCBvciBub2RlIGlkZW50aXR5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNOb2RlUHJvdmVuYW5jZX0gUHJvdmVuYW5jZSByZWNvcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlUHJvdmVuYW5jZShtb2R1bGUsIG5vZGUpIHtcbiAgcmVxdWlyZVByb3ZlbmFuY2UobW9kdWxlKVxuICBjb25zdCBpbmRleCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUpXG4gIGNvbnN0IHJlY29yZCA9IHR5cGVvZiBub2RlID09IFwic3RyaW5nXCJcbiAgICA/IGluZGV4LnByb3ZlbmFuY2Uubm9kZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gbm9kZSlcbiAgICA6IGluZGV4LnJlY29yZEZvcihub2RlKVxuXG4gIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5rbm93biBzZW1hbnRpYyBub2RlOiAke25vZGV9YClcblxuICByZXR1cm4gcmVjb3JkXG59XG5cbi8qKlxuICogRmluZHMgb25lIHNlbWFudGljIHN5bWJvbCByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzeW1ib2xJZCAtIFN5bWJvbCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZX0gU3ltYm9sIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbFByb3ZlbmFuY2UobW9kdWxlLCBzeW1ib2xJZCkge1xuICByZXF1aXJlUHJvdmVuYW5jZShtb2R1bGUpXG4gIGNvbnN0IHN5bWJvbCA9IGNyZWF0ZUdlbmVyYXRpb25JbmRleChtb2R1bGUpLnByb3ZlbmFuY2Uuc3ltYm9scy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzeW1ib2xJZClcblxuICBpZiAoIXN5bWJvbCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVua25vd24gc2VtYW50aWMgc3ltYm9sOiAke3N5bWJvbElkfWApXG5cbiAgcmV0dXJuIHN5bWJvbFxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGZyb250ZW5kIHByb3ZlbmFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljUHJvdmVuYW5jZX0gUHJvdmVuYW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZVByb3ZlbmFuY2UobW9kdWxlKSB7XG4gIGlmICghbW9kdWxlLnByb3ZlbmFuY2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZW1hbnRpYyBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzb3VyY2UgcHJvdmVuYW5jZS5cIilcblxuICByZXR1cm4gbW9kdWxlLnByb3ZlbmFuY2Vcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgcHVibGljIHNlbWFudGljIG5vZGVzIGluIG9uZSBzdGFibGUgb3JkZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gRW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbWFudGljRW50cmllcyhtb2R1bGUpIHtcbiAgLyoqIEB0eXBlIHt7bm9kZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGUsIG93bmVyTG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHBhdGg6IHN0cmluZ31bXX0gKi9cbiAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgdmlzaXQobW9kdWxlLCBcIlwiLCBtb2R1bGUubG9jYXRpb24pXG5cbiAgcmV0dXJuIGVudHJpZXNcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBzZW1hbnRpYyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY05vZGV9IG5vZGUgLSBDdXJyZW50IG5vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gQ3VycmVudCBKU09OIFBvaW50ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gb3duZXJMb2NhdGlvbiAtIE5lYXJlc3QgbG9jYXRlZCBvd25lci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChub2RlLCBwYXRoLCBvd25lckxvY2F0aW9uKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSBcImxvY2F0aW9uXCIgaW4gbm9kZSA/IG5vZGUubG9jYXRpb24gOiBvd25lckxvY2F0aW9uXG5cbiAgICBlbnRyaWVzLnB1c2goe25vZGUsIG93bmVyTG9jYXRpb246IGxvY2F0aW9uLCBwYXRofSlcblxuICAgIGlmIChub2RlLmtpbmQgPT0gXCJNb2R1bGVcIikge1xuICAgICAgbm9kZS5mdW5jdGlvbnMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYC9mdW5jdGlvbnMvJHtpbmRleH1gLCBsb2NhdGlvbikpXG4gICAgICB2aXNpdChub2RlLmVudHJ5UG9pbnQsIFwiL2VudHJ5UG9pbnRcIiwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpIHtcbiAgICAgIG5vZGUucGFyYW1ldGVycy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9wYXJhbWV0ZXJzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgICAgdmlzaXQobm9kZS5yZXR1cm5UeXBlLCBgJHtwYXRofS9yZXR1cm5UeXBlYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkJsb2NrXCIpIHtcbiAgICAgIG5vZGUuc3RhdGVtZW50cy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHZpc2l0KGNoaWxkLCBgJHtwYXRofS9zdGF0ZW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUGFyYW1ldGVyXCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudHlwZSwgYCR7cGF0aH0vdHlwZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICB2aXNpdChub2RlLnR5cGUsIGAke3BhdGh9L3R5cGVgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuaW5pdGlhbGl6ZXIsIGAke3BhdGh9L2luaXRpYWxpemVyYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJBc3NpZ25tZW50U3RhdGVtZW50XCIpIHtcbiAgICAgIHZpc2l0KG5vZGUudGFyZ2V0LCBgJHtwYXRofS90YXJnZXRgLCBsb2NhdGlvbilcbiAgICAgIHZpc2l0KG5vZGUuZXhwcmVzc2lvbiwgYCR7cGF0aH0vZXhwcmVzc2lvbmAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgfHwgbm9kZS5raW5kID09IFwiUHJpbnRTdGF0ZW1lbnRcIikge1xuICAgICAgdmlzaXQobm9kZS5leHByZXNzaW9uLCBgJHtwYXRofS9leHByZXNzaW9uYCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB2aXNpdChub2RlLmNvbmRpdGlvbiwgYCR7cGF0aH0vY29uZGl0aW9uYCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLmNvbnNlcXVlbnQsIGAke3BhdGh9L2NvbnNlcXVlbnRgLCBsb2NhdGlvbilcbiAgICAgIGlmIChub2RlLmFsdGVybmF0ZSkgdmlzaXQobm9kZS5hbHRlcm5hdGUsIGAke3BhdGh9L2FsdGVybmF0ZWAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiRW50cnlQb2ludFwiKSB7XG4gICAgICB2aXNpdChub2RlLmJvZHksIGAke3BhdGh9L2JvZHlgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdChub2RlLm9wZXJhbmQsIGAke3BhdGh9L29wZXJhbmRgLCBsb2NhdGlvbilcbiAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgICAgdmlzaXQobm9kZS5sZWZ0LCBgJHtwYXRofS9sZWZ0YCwgbG9jYXRpb24pXG4gICAgICB2aXNpdChub2RlLnJpZ2h0LCBgJHtwYXRofS9yaWdodGAsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09IFwiQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB2aXNpdChjaGlsZCwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YCwgbG9jYXRpb24pKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGRlY2xhcmF0aW9ucyBhbmQgcmVmZXJlbmNlcyBhZnRlciBzZW1hbnRpYyB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBWYWxpZGF0ZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVByb3ZlbmFuY2U+fSByZWNvcmRzIC0gTm9kZSByZWNvcmRzIGJ5IG9jY3VycmVuY2UgcGF0aC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBTeW1ib2xzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3ltYm9scyhtb2R1bGUsIHJlY29yZHMpIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSAqL1xuICBjb25zdCBzeW1ib2xzID0gW11cbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgZnVuY3Rpb25zLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJlKGRlY2xhcmF0aW9uLCBkZWNsYXJhdGlvbi5uYW1lLCBcImZ1bmN0aW9uXCIsIGAvZnVuY3Rpb25zLyR7aW5kZXh9YCkpXG4gIH1cblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25QYXRoID0gYC9mdW5jdGlvbnMvJHtpbmRleH1gXG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBwYXJhbWV0ZXJdIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICBzY29wZS5zZXQocGFyYW1ldGVyLm5hbWUsIGRlY2xhcmUocGFyYW1ldGVyLCBwYXJhbWV0ZXIubmFtZSwgXCJwYXJhbWV0ZXJcIiwgYCR7ZGVjbGFyYXRpb25QYXRofS9wYXJhbWV0ZXJzLyR7cGFyYW1ldGVySW5kZXh9YCkpXG4gICAgfVxuICAgIHZpc2l0QmxvY2soZGVjbGFyYXRpb24uYm9keSwgc2NvcGUsIGAke2RlY2xhcmF0aW9uUGF0aH0vYm9keWApXG4gIH1cblxuICB2aXNpdEJsb2NrKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIG5ldyBNYXAoKSwgXCIvZW50cnlQb2ludC9ib2R5XCIpXG5cbiAgcmV0dXJuIHN5bWJvbHNcblxuICAvKipcbiAgICogRGVjbGFyZXMgb25lIGNhbm9uaWNhbCBzeW1ib2wuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5QYXJhbWV0ZXIgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkxvY2FsRGVjbGFyYXRpb259IG5vZGUgLSBEZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBTeW1ib2wgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBraW5kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlY2xhcmF0aW9uIG9jY3VycmVuY2UgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3ltYm9sIGlkZW50aXR5LlxuICAgKi9cbiAgZnVuY3Rpb24gZGVjbGFyZShub2RlLCBuYW1lLCBraW5kLCBwYXRoKSB7XG4gICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkcy5nZXQocGF0aClcblxuICAgIGlmICghcmVjb3JkKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcHJvdmVuYW5jZSBmb3IgJHtub2RlLmtpbmR9LmApXG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlY29yZC5yYW5nZXMubmFtZSA/PyBub2RlLmxvY2F0aW9uXG4gICAgY29uc3QgaWQgPSBgc3ltYm9sOiR7c3ltYm9scy5sZW5ndGh9YFxuXG4gICAgcmVjb3JkLnN5bWJvbElkID0gaWRcbiAgICBzeW1ib2xzLnB1c2goe2RlY2xhcmF0aW9uTm9kZUlkOiByZWNvcmQuaWQsIGlkLCBraW5kLCBsb2NhdGlvbiwgbmFtZSwgcmVmZXJlbmNlczogW119KVxuXG4gICAgcmV0dXJuIGlkXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgcmVmZXJlbmNlcyBpbiBvbmUgbGV4aWNhbCBibG9jay5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIHN0cmluZz59IHBhcmVudCAtIFZpc2libGUgYmluZGluZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gU3RhdGVtZW50IHNlcXVlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRCbG9jayhibG9jaywgcGFyZW50LCBwYXRoKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgTWFwKHBhcmVudClcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGF0ZW1lbnRdIG9mIGJsb2NrLnN0YXRlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRQYXRoID0gYCR7cGF0aH0vc3RhdGVtZW50cy8ke2luZGV4fWBcblxuICAgICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9pbml0aWFsaXplcmApXG4gICAgICAgIHNjb3BlLnNldChzdGF0ZW1lbnQubmFtZSwgZGVjbGFyZShzdGF0ZW1lbnQsIHN0YXRlbWVudC5uYW1lLCBcImxvY2FsXCIsIHN0YXRlbWVudFBhdGgpKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgICByZWZlcmVuY2Uoc3RhdGVtZW50LnRhcmdldCwgc2NvcGUuZ2V0KHN0YXRlbWVudC50YXJnZXQubmFtZSksIFwid3JpdGVcIiwgYCR7c3RhdGVtZW50UGF0aH0vdGFyZ2V0YClcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vZXhwcmVzc2lvbmApXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0RXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGAke3N0YXRlbWVudFBhdGh9L2V4cHJlc3Npb25gKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXRFeHByZXNzaW9uKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9jb25kaXRpb25gKVxuICAgICAgICB2aXNpdEJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBzY29wZSwgYCR7c3RhdGVtZW50UGF0aH0vY29uc2VxdWVudGApXG4gICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdEJsb2NrKHN0YXRlbWVudC5hbHRlcm5hdGUsIHNjb3BlLCBgJHtzdGF0ZW1lbnRQYXRofS9hbHRlcm5hdGVgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyByZWZlcmVuY2VzIGluIG9uZSBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7TWFwPHN0cmluZywgc3RyaW5nPn0gc2NvcGUgLSBWaXNpYmxlIGJpbmRpbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEV4cHJlc3Npb24gb2NjdXJyZW5jZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLCBzY29wZSwgcGF0aCkge1xuICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZWZlcmVuY2UoZXhwcmVzc2lvbiwgc2NvcGUuZ2V0KGV4cHJlc3Npb24ubmFtZSksIFwicmVhZFwiLCBwYXRoKVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJlZmVyZW5jZShleHByZXNzaW9uLCBmdW5jdGlvbnMuZ2V0KGV4cHJlc3Npb24uY2FsbGVlKSwgXCJjYWxsXCIsIHBhdGgpXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYXJndW1lbnRdIG9mIGV4cHJlc3Npb24uYXJndW1lbnRzLmVudHJpZXMoKSkgdmlzaXRFeHByZXNzaW9uKGFyZ3VtZW50LCBzY29wZSwgYCR7cGF0aH0vYXJndW1lbnRzLyR7aW5kZXh9YClcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlVuYXJ5RXhwcmVzc2lvblwiKSB7XG4gICAgICB2aXNpdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5vcGVyYW5kLCBzY29wZSwgYCR7cGF0aH0vb3BlcmFuZGApXG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCaW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLmxlZnQsIHNjb3BlLCBgJHtwYXRofS9sZWZ0YClcbiAgICAgIHZpc2l0RXhwcmVzc2lvbihleHByZXNzaW9uLnJpZ2h0LCBzY29wZSwgYCR7cGF0aH0vcmlnaHRgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBvbmUgcmVzb2x2ZWQgc3ltYm9sIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLklkZW50aWZpZXJFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DYWxsRXhwcmVzc2lvbn0gbm9kZSAtIFJlZmVyZW5jZSBub2RlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gc3ltYm9sSWQgLSBSZXNvbHZlZCBzeW1ib2wuXG4gICAqIEBwYXJhbSB7XCJyZWFkXCIgfCBcIndyaXRlXCIgfCBcImNhbGxcIn0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFJlZmVyZW5jZSBvY2N1cnJlbmNlIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVmZXJlbmNlKG5vZGUsIHN5bWJvbElkLCByb2xlLCBwYXRoKSB7XG4gICAgaWYgKCFzeW1ib2xJZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzLmdldChwYXRoKVxuICAgIGNvbnN0IHN5bWJvbCA9IHN5bWJvbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gc3ltYm9sSWQpXG5cbiAgICBpZiAoIXJlY29yZCB8fCAhc3ltYm9sKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcHJvdmVuYW5jZSB3aGlsZSByZXNvbHZpbmcgJHtub2RlLmtpbmR9LmApXG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlY29yZC5yYW5nZXNbcm9sZSA9PSBcImNhbGxcIiA/IFwiY2FsbGVlXCIgOiBcIm5hbWVcIl0gPz8gbm9kZS5sb2NhdGlvblxuXG4gICAgcmVjb3JkLnN5bWJvbElkID0gc3ltYm9sSWRcbiAgICBzeW1ib2wucmVmZXJlbmNlcy5wdXNoKHtsb2NhdGlvbiwgbm9kZUlkOiByZWNvcmQuaWQsIHJvbGV9KVxuICB9XG59XG4iXX0=