cdktn 0.23.1 → 0.23.3

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 (432) hide show
  1. package/.jsii +1592 -1591
  2. package/.spec.swcrc +22 -0
  3. package/README.md +1 -1
  4. package/jest.config.js +18 -15
  5. package/lib/_tokens.js +1 -1
  6. package/lib/annotations.js +2 -2
  7. package/lib/app.js +2 -2
  8. package/lib/aspect.js +2 -2
  9. package/lib/backends/azurerm-backend.js +3 -3
  10. package/lib/backends/cloud-backend.js +5 -5
  11. package/lib/backends/consul-backend.js +3 -3
  12. package/lib/backends/cos-backend.js +3 -3
  13. package/lib/backends/gcs-backend.js +3 -3
  14. package/lib/backends/http-backend.js +3 -3
  15. package/lib/backends/index.js +1 -1
  16. package/lib/backends/local-backend.js +3 -3
  17. package/lib/backends/oss-backend.js +3 -3
  18. package/lib/backends/pg-backend.js +3 -3
  19. package/lib/backends/remote-backend.js +5 -5
  20. package/lib/backends/s3-backend.js +3 -3
  21. package/lib/backends/swift-backend.js +3 -3
  22. package/lib/complex-computed-list.js +25 -25
  23. package/lib/errors.d.ts +1 -2
  24. package/lib/errors.js +11 -8
  25. package/lib/features.js +1 -1
  26. package/lib/functions/helpers.js +1 -1
  27. package/lib/functions/terraform-functions.generated.js +2 -2
  28. package/lib/hcl/render.js +1 -1
  29. package/lib/importable-resource.js +2 -2
  30. package/lib/index.js +1 -1
  31. package/lib/manifest.js +4 -5
  32. package/lib/private/fs.d.ts +20 -5
  33. package/lib/private/fs.js +43 -69
  34. package/lib/private/unique.js +1 -1
  35. package/lib/resource.js +2 -2
  36. package/lib/runtime.js +1 -1
  37. package/lib/synthesize/index.js +1 -1
  38. package/lib/synthesize/synthesizer.js +4 -5
  39. package/lib/synthesize/types.js +1 -1
  40. package/lib/terraform-addressable.js +1 -1
  41. package/lib/terraform-asset.js +2 -2
  42. package/lib/terraform-backend.js +2 -2
  43. package/lib/terraform-conditions.js +1 -1
  44. package/lib/terraform-count.js +2 -2
  45. package/lib/terraform-data-resource.js +2 -2
  46. package/lib/terraform-data-source.js +2 -2
  47. package/lib/terraform-dependable.js +1 -1
  48. package/lib/terraform-dynamic-block.js +2 -2
  49. package/lib/terraform-dynamic-expression.js +2 -2
  50. package/lib/terraform-element.js +2 -2
  51. package/lib/terraform-functions.js +2 -2
  52. package/lib/terraform-hcl-module.js +2 -2
  53. package/lib/terraform-iterator.js +6 -6
  54. package/lib/terraform-local.js +2 -2
  55. package/lib/terraform-module-asset.js +1 -1
  56. package/lib/terraform-module.js +2 -2
  57. package/lib/terraform-operators.js +2 -2
  58. package/lib/terraform-output.js +2 -2
  59. package/lib/terraform-provider.js +2 -2
  60. package/lib/terraform-provisioner.js +2 -2
  61. package/lib/terraform-remote-state.js +2 -2
  62. package/lib/terraform-resource-targets.js +2 -2
  63. package/lib/terraform-resource.js +2 -2
  64. package/lib/terraform-stack.js +2 -2
  65. package/lib/terraform-variable.js +3 -3
  66. package/lib/testing/adapters/jest.js +1 -1
  67. package/lib/testing/index.js +7 -8
  68. package/lib/testing/matchers.js +2 -2
  69. package/lib/tfExpression.js +1 -1
  70. package/lib/tokens/index.js +1 -1
  71. package/lib/tokens/lazy.js +4 -4
  72. package/lib/tokens/private/dependency.js +1 -1
  73. package/lib/tokens/private/encoding.js +1 -1
  74. package/lib/tokens/private/intrinsic.d.ts +0 -5
  75. package/lib/tokens/private/intrinsic.js +2 -9
  76. package/lib/tokens/private/resolve.js +1 -1
  77. package/lib/tokens/private/stack-trace.d.ts +6 -0
  78. package/lib/tokens/private/stack-trace.js +14 -1
  79. package/lib/tokens/private/token-map.js +1 -1
  80. package/lib/tokens/private/uniqueid.js +1 -1
  81. package/lib/tokens/resolvable.js +4 -4
  82. package/lib/tokens/string-fragments.js +2 -2
  83. package/lib/tokens/token.js +3 -3
  84. package/lib/tsconfig.tsbuildinfo +1 -0
  85. package/lib/upgrade-id-aspect.js +2 -2
  86. package/lib/util.js +1 -1
  87. package/lib/validateEnvironment.js +1 -1
  88. package/lib/validations/index.js +1 -1
  89. package/lib/validations/validate-binary-version.js +1 -1
  90. package/lib/validations/validate-provider-presence.js +1 -1
  91. package/lib/validations/validate-terraform-version.js +1 -1
  92. package/node_modules/fflate/CHANGELOG.md +115 -0
  93. package/node_modules/{has-property-descriptors → fflate}/LICENSE +2 -2
  94. package/node_modules/fflate/README.md +558 -0
  95. package/node_modules/fflate/esm/browser.d.ts +1501 -0
  96. package/node_modules/fflate/esm/browser.js +2665 -0
  97. package/node_modules/fflate/esm/index.d.mts +1501 -0
  98. package/node_modules/fflate/esm/index.mjs +2679 -0
  99. package/node_modules/fflate/lib/browser.cjs +2688 -0
  100. package/node_modules/fflate/lib/browser.d.cts +1501 -0
  101. package/node_modules/fflate/lib/index.cjs +2668 -0
  102. package/node_modules/fflate/lib/index.d.ts +1501 -0
  103. package/node_modules/fflate/lib/node-worker.cjs +32 -0
  104. package/node_modules/fflate/lib/node.cjs +2700 -0
  105. package/node_modules/fflate/lib/node.d.cts +1501 -0
  106. package/node_modules/fflate/lib/worker.cjs +20 -0
  107. package/node_modules/fflate/package.json +127 -0
  108. package/node_modules/fflate/umd/index.js +1 -0
  109. package/node_modules/{yazl → safe-stable-stringify}/LICENSE +1 -1
  110. package/node_modules/safe-stable-stringify/esm/package.json +4 -0
  111. package/node_modules/safe-stable-stringify/esm/wrapper.d.ts +4 -0
  112. package/node_modules/safe-stable-stringify/esm/wrapper.js +6 -0
  113. package/node_modules/safe-stable-stringify/index.d.ts +22 -0
  114. package/node_modules/safe-stable-stringify/index.js +625 -0
  115. package/node_modules/safe-stable-stringify/package.json +65 -0
  116. package/node_modules/safe-stable-stringify/readme.md +179 -0
  117. package/package.json +21 -15
  118. package/tsconfig.json +6 -3
  119. package/tsconfig.test.json +12 -0
  120. package/lib/testing/__tests__/matchers.test.d.ts +0 -1
  121. package/lib/testing/__tests__/matchers.test.js +0 -205
  122. package/lib/testing/adapters/__tests__/index.test.d.ts +0 -1
  123. package/lib/testing/adapters/__tests__/index.test.js +0 -67
  124. package/lib/testing/adapters/__tests__/jest.test.d.ts +0 -1
  125. package/lib/testing/adapters/__tests__/jest.test.js +0 -41
  126. package/node_modules/buffer-crc32/LICENSE +0 -19
  127. package/node_modules/buffer-crc32/README.md +0 -55
  128. package/node_modules/buffer-crc32/dist/index.cjs +0 -306
  129. package/node_modules/buffer-crc32/dist/index.d.cts +0 -35
  130. package/node_modules/buffer-crc32/dist/index.d.mts +0 -35
  131. package/node_modules/buffer-crc32/dist/index.mjs +0 -304
  132. package/node_modules/buffer-crc32/index.d.ts +0 -35
  133. package/node_modules/buffer-crc32/package.json +0 -54
  134. package/node_modules/call-bind/.eslintignore +0 -1
  135. package/node_modules/call-bind/.eslintrc +0 -16
  136. package/node_modules/call-bind/.github/FUNDING.yml +0 -12
  137. package/node_modules/call-bind/.nycrc +0 -9
  138. package/node_modules/call-bind/CHANGELOG.md +0 -106
  139. package/node_modules/call-bind/LICENSE +0 -21
  140. package/node_modules/call-bind/README.md +0 -64
  141. package/node_modules/call-bind/callBound.js +0 -15
  142. package/node_modules/call-bind/index.js +0 -24
  143. package/node_modules/call-bind/package.json +0 -93
  144. package/node_modules/call-bind/test/callBound.js +0 -54
  145. package/node_modules/call-bind/test/index.js +0 -74
  146. package/node_modules/call-bind-apply-helpers/.eslintrc +0 -17
  147. package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +0 -12
  148. package/node_modules/call-bind-apply-helpers/.nycrc +0 -9
  149. package/node_modules/call-bind-apply-helpers/CHANGELOG.md +0 -30
  150. package/node_modules/call-bind-apply-helpers/LICENSE +0 -21
  151. package/node_modules/call-bind-apply-helpers/README.md +0 -62
  152. package/node_modules/call-bind-apply-helpers/actualApply.d.ts +0 -1
  153. package/node_modules/call-bind-apply-helpers/actualApply.js +0 -10
  154. package/node_modules/call-bind-apply-helpers/applyBind.d.ts +0 -19
  155. package/node_modules/call-bind-apply-helpers/applyBind.js +0 -10
  156. package/node_modules/call-bind-apply-helpers/functionApply.d.ts +0 -1
  157. package/node_modules/call-bind-apply-helpers/functionApply.js +0 -4
  158. package/node_modules/call-bind-apply-helpers/functionCall.d.ts +0 -1
  159. package/node_modules/call-bind-apply-helpers/functionCall.js +0 -4
  160. package/node_modules/call-bind-apply-helpers/index.d.ts +0 -64
  161. package/node_modules/call-bind-apply-helpers/index.js +0 -15
  162. package/node_modules/call-bind-apply-helpers/package.json +0 -85
  163. package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +0 -3
  164. package/node_modules/call-bind-apply-helpers/reflectApply.js +0 -4
  165. package/node_modules/call-bind-apply-helpers/test/index.js +0 -63
  166. package/node_modules/call-bind-apply-helpers/tsconfig.json +0 -9
  167. package/node_modules/call-bound/.eslintrc +0 -13
  168. package/node_modules/call-bound/.github/FUNDING.yml +0 -12
  169. package/node_modules/call-bound/.nycrc +0 -9
  170. package/node_modules/call-bound/CHANGELOG.md +0 -42
  171. package/node_modules/call-bound/LICENSE +0 -21
  172. package/node_modules/call-bound/README.md +0 -53
  173. package/node_modules/call-bound/index.d.ts +0 -94
  174. package/node_modules/call-bound/index.js +0 -19
  175. package/node_modules/call-bound/package.json +0 -99
  176. package/node_modules/call-bound/test/index.js +0 -61
  177. package/node_modules/call-bound/tsconfig.json +0 -10
  178. package/node_modules/define-data-property/.eslintrc +0 -24
  179. package/node_modules/define-data-property/.github/FUNDING.yml +0 -12
  180. package/node_modules/define-data-property/.nycrc +0 -13
  181. package/node_modules/define-data-property/CHANGELOG.md +0 -70
  182. package/node_modules/define-data-property/LICENSE +0 -21
  183. package/node_modules/define-data-property/README.md +0 -67
  184. package/node_modules/define-data-property/index.d.ts +0 -12
  185. package/node_modules/define-data-property/index.js +0 -56
  186. package/node_modules/define-data-property/package.json +0 -106
  187. package/node_modules/define-data-property/test/index.js +0 -392
  188. package/node_modules/define-data-property/tsconfig.json +0 -59
  189. package/node_modules/dunder-proto/.eslintrc +0 -5
  190. package/node_modules/dunder-proto/.github/FUNDING.yml +0 -12
  191. package/node_modules/dunder-proto/.nycrc +0 -13
  192. package/node_modules/dunder-proto/CHANGELOG.md +0 -24
  193. package/node_modules/dunder-proto/LICENSE +0 -21
  194. package/node_modules/dunder-proto/README.md +0 -54
  195. package/node_modules/dunder-proto/get.d.ts +0 -5
  196. package/node_modules/dunder-proto/get.js +0 -30
  197. package/node_modules/dunder-proto/package.json +0 -76
  198. package/node_modules/dunder-proto/set.d.ts +0 -5
  199. package/node_modules/dunder-proto/set.js +0 -35
  200. package/node_modules/dunder-proto/test/get.js +0 -34
  201. package/node_modules/dunder-proto/test/index.js +0 -4
  202. package/node_modules/dunder-proto/test/set.js +0 -50
  203. package/node_modules/dunder-proto/tsconfig.json +0 -9
  204. package/node_modules/es-define-property/.eslintrc +0 -13
  205. package/node_modules/es-define-property/.github/FUNDING.yml +0 -12
  206. package/node_modules/es-define-property/.nycrc +0 -9
  207. package/node_modules/es-define-property/CHANGELOG.md +0 -29
  208. package/node_modules/es-define-property/LICENSE +0 -21
  209. package/node_modules/es-define-property/README.md +0 -49
  210. package/node_modules/es-define-property/index.d.ts +0 -3
  211. package/node_modules/es-define-property/index.js +0 -14
  212. package/node_modules/es-define-property/package.json +0 -81
  213. package/node_modules/es-define-property/test/index.js +0 -56
  214. package/node_modules/es-define-property/tsconfig.json +0 -10
  215. package/node_modules/es-errors/.eslintrc +0 -5
  216. package/node_modules/es-errors/.github/FUNDING.yml +0 -12
  217. package/node_modules/es-errors/CHANGELOG.md +0 -40
  218. package/node_modules/es-errors/LICENSE +0 -21
  219. package/node_modules/es-errors/README.md +0 -55
  220. package/node_modules/es-errors/eval.d.ts +0 -3
  221. package/node_modules/es-errors/eval.js +0 -4
  222. package/node_modules/es-errors/index.d.ts +0 -3
  223. package/node_modules/es-errors/index.js +0 -4
  224. package/node_modules/es-errors/package.json +0 -80
  225. package/node_modules/es-errors/range.d.ts +0 -3
  226. package/node_modules/es-errors/range.js +0 -4
  227. package/node_modules/es-errors/ref.d.ts +0 -3
  228. package/node_modules/es-errors/ref.js +0 -4
  229. package/node_modules/es-errors/syntax.d.ts +0 -3
  230. package/node_modules/es-errors/syntax.js +0 -4
  231. package/node_modules/es-errors/test/index.js +0 -19
  232. package/node_modules/es-errors/tsconfig.json +0 -49
  233. package/node_modules/es-errors/type.d.ts +0 -3
  234. package/node_modules/es-errors/type.js +0 -4
  235. package/node_modules/es-errors/uri.d.ts +0 -3
  236. package/node_modules/es-errors/uri.js +0 -4
  237. package/node_modules/es-object-atoms/.eslintrc +0 -16
  238. package/node_modules/es-object-atoms/.github/FUNDING.yml +0 -12
  239. package/node_modules/es-object-atoms/CHANGELOG.md +0 -37
  240. package/node_modules/es-object-atoms/LICENSE +0 -21
  241. package/node_modules/es-object-atoms/README.md +0 -63
  242. package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +0 -3
  243. package/node_modules/es-object-atoms/RequireObjectCoercible.js +0 -11
  244. package/node_modules/es-object-atoms/ToObject.d.ts +0 -7
  245. package/node_modules/es-object-atoms/ToObject.js +0 -10
  246. package/node_modules/es-object-atoms/index.d.ts +0 -3
  247. package/node_modules/es-object-atoms/index.js +0 -4
  248. package/node_modules/es-object-atoms/isObject.d.ts +0 -3
  249. package/node_modules/es-object-atoms/isObject.js +0 -6
  250. package/node_modules/es-object-atoms/package.json +0 -80
  251. package/node_modules/es-object-atoms/test/index.js +0 -38
  252. package/node_modules/es-object-atoms/tsconfig.json +0 -6
  253. package/node_modules/function-bind/.eslintrc +0 -21
  254. package/node_modules/function-bind/.github/FUNDING.yml +0 -12
  255. package/node_modules/function-bind/.github/SECURITY.md +0 -3
  256. package/node_modules/function-bind/.nycrc +0 -13
  257. package/node_modules/function-bind/CHANGELOG.md +0 -136
  258. package/node_modules/function-bind/LICENSE +0 -20
  259. package/node_modules/function-bind/README.md +0 -46
  260. package/node_modules/function-bind/implementation.js +0 -84
  261. package/node_modules/function-bind/index.js +0 -5
  262. package/node_modules/function-bind/package.json +0 -87
  263. package/node_modules/function-bind/test/.eslintrc +0 -9
  264. package/node_modules/function-bind/test/index.js +0 -252
  265. package/node_modules/get-intrinsic/.eslintrc +0 -42
  266. package/node_modules/get-intrinsic/.github/FUNDING.yml +0 -12
  267. package/node_modules/get-intrinsic/.nycrc +0 -9
  268. package/node_modules/get-intrinsic/CHANGELOG.md +0 -186
  269. package/node_modules/get-intrinsic/LICENSE +0 -21
  270. package/node_modules/get-intrinsic/README.md +0 -71
  271. package/node_modules/get-intrinsic/index.js +0 -378
  272. package/node_modules/get-intrinsic/package.json +0 -97
  273. package/node_modules/get-intrinsic/test/GetIntrinsic.js +0 -274
  274. package/node_modules/get-proto/.eslintrc +0 -10
  275. package/node_modules/get-proto/.github/FUNDING.yml +0 -12
  276. package/node_modules/get-proto/.nycrc +0 -9
  277. package/node_modules/get-proto/CHANGELOG.md +0 -21
  278. package/node_modules/get-proto/LICENSE +0 -21
  279. package/node_modules/get-proto/Object.getPrototypeOf.d.ts +0 -5
  280. package/node_modules/get-proto/Object.getPrototypeOf.js +0 -6
  281. package/node_modules/get-proto/README.md +0 -50
  282. package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +0 -3
  283. package/node_modules/get-proto/Reflect.getPrototypeOf.js +0 -4
  284. package/node_modules/get-proto/index.d.ts +0 -5
  285. package/node_modules/get-proto/index.js +0 -27
  286. package/node_modules/get-proto/package.json +0 -81
  287. package/node_modules/get-proto/test/index.js +0 -68
  288. package/node_modules/get-proto/tsconfig.json +0 -9
  289. package/node_modules/gopd/.eslintrc +0 -16
  290. package/node_modules/gopd/.github/FUNDING.yml +0 -12
  291. package/node_modules/gopd/CHANGELOG.md +0 -45
  292. package/node_modules/gopd/LICENSE +0 -21
  293. package/node_modules/gopd/README.md +0 -40
  294. package/node_modules/gopd/gOPD.d.ts +0 -1
  295. package/node_modules/gopd/gOPD.js +0 -4
  296. package/node_modules/gopd/index.d.ts +0 -5
  297. package/node_modules/gopd/index.js +0 -15
  298. package/node_modules/gopd/package.json +0 -77
  299. package/node_modules/gopd/test/index.js +0 -36
  300. package/node_modules/gopd/tsconfig.json +0 -9
  301. package/node_modules/has-property-descriptors/.eslintrc +0 -13
  302. package/node_modules/has-property-descriptors/.github/FUNDING.yml +0 -12
  303. package/node_modules/has-property-descriptors/.nycrc +0 -9
  304. package/node_modules/has-property-descriptors/CHANGELOG.md +0 -35
  305. package/node_modules/has-property-descriptors/README.md +0 -43
  306. package/node_modules/has-property-descriptors/index.js +0 -22
  307. package/node_modules/has-property-descriptors/package.json +0 -77
  308. package/node_modules/has-property-descriptors/test/index.js +0 -57
  309. package/node_modules/has-symbols/.eslintrc +0 -11
  310. package/node_modules/has-symbols/.github/FUNDING.yml +0 -12
  311. package/node_modules/has-symbols/.nycrc +0 -9
  312. package/node_modules/has-symbols/CHANGELOG.md +0 -91
  313. package/node_modules/has-symbols/LICENSE +0 -21
  314. package/node_modules/has-symbols/README.md +0 -46
  315. package/node_modules/has-symbols/index.d.ts +0 -3
  316. package/node_modules/has-symbols/index.js +0 -14
  317. package/node_modules/has-symbols/package.json +0 -111
  318. package/node_modules/has-symbols/shams.d.ts +0 -3
  319. package/node_modules/has-symbols/shams.js +0 -45
  320. package/node_modules/has-symbols/test/index.js +0 -22
  321. package/node_modules/has-symbols/test/shams/core-js.js +0 -29
  322. package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +0 -29
  323. package/node_modules/has-symbols/test/tests.js +0 -58
  324. package/node_modules/has-symbols/tsconfig.json +0 -10
  325. package/node_modules/hasown/.eslintrc +0 -5
  326. package/node_modules/hasown/.github/FUNDING.yml +0 -12
  327. package/node_modules/hasown/.nycrc +0 -13
  328. package/node_modules/hasown/CHANGELOG.md +0 -40
  329. package/node_modules/hasown/LICENSE +0 -21
  330. package/node_modules/hasown/README.md +0 -40
  331. package/node_modules/hasown/index.d.ts +0 -3
  332. package/node_modules/hasown/index.js +0 -8
  333. package/node_modules/hasown/package.json +0 -92
  334. package/node_modules/hasown/tsconfig.json +0 -6
  335. package/node_modules/isarray/LICENSE +0 -21
  336. package/node_modules/isarray/README.md +0 -38
  337. package/node_modules/isarray/index.js +0 -5
  338. package/node_modules/isarray/package.json +0 -48
  339. package/node_modules/json-stable-stringify/.eslintrc +0 -31
  340. package/node_modules/json-stable-stringify/.github/FUNDING.yml +0 -12
  341. package/node_modules/json-stable-stringify/CHANGELOG.md +0 -160
  342. package/node_modules/json-stable-stringify/LICENSE +0 -21
  343. package/node_modules/json-stable-stringify/README.md +0 -157
  344. package/node_modules/json-stable-stringify/example/key_cmp.js +0 -9
  345. package/node_modules/json-stable-stringify/example/nested.js +0 -7
  346. package/node_modules/json-stable-stringify/example/str.js +0 -7
  347. package/node_modules/json-stable-stringify/example/value_cmp.js +0 -12
  348. package/node_modules/json-stable-stringify/index.d.ts +0 -25
  349. package/node_modules/json-stable-stringify/index.js +0 -124
  350. package/node_modules/json-stable-stringify/package.json +0 -88
  351. package/node_modules/json-stable-stringify/test/cmp.js +0 -33
  352. package/node_modules/json-stable-stringify/test/nested.js +0 -48
  353. package/node_modules/json-stable-stringify/test/replacer.js +0 -81
  354. package/node_modules/json-stable-stringify/test/space.js +0 -127
  355. package/node_modules/json-stable-stringify/test/str.js +0 -46
  356. package/node_modules/json-stable-stringify/test/to-json.js +0 -22
  357. package/node_modules/json-stable-stringify/tsconfig.json +0 -10
  358. package/node_modules/jsonify/.eslintrc +0 -21
  359. package/node_modules/jsonify/.github/FUNDING.yml +0 -12
  360. package/node_modules/jsonify/CHANGELOG.md +0 -48
  361. package/node_modules/jsonify/README.md +0 -66
  362. package/node_modules/jsonify/index.js +0 -4
  363. package/node_modules/jsonify/lib/parse.js +0 -261
  364. package/node_modules/jsonify/lib/stringify.js +0 -151
  365. package/node_modules/jsonify/package.json +0 -62
  366. package/node_modules/jsonify/test/parse.js +0 -20
  367. package/node_modules/jsonify/test/stringify.js +0 -18
  368. package/node_modules/math-intrinsics/.eslintrc +0 -16
  369. package/node_modules/math-intrinsics/.github/FUNDING.yml +0 -12
  370. package/node_modules/math-intrinsics/CHANGELOG.md +0 -24
  371. package/node_modules/math-intrinsics/LICENSE +0 -21
  372. package/node_modules/math-intrinsics/README.md +0 -50
  373. package/node_modules/math-intrinsics/abs.d.ts +0 -1
  374. package/node_modules/math-intrinsics/abs.js +0 -4
  375. package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +0 -3
  376. package/node_modules/math-intrinsics/constants/maxArrayLength.js +0 -4
  377. package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +0 -3
  378. package/node_modules/math-intrinsics/constants/maxSafeInteger.js +0 -5
  379. package/node_modules/math-intrinsics/constants/maxValue.d.ts +0 -3
  380. package/node_modules/math-intrinsics/constants/maxValue.js +0 -5
  381. package/node_modules/math-intrinsics/floor.d.ts +0 -1
  382. package/node_modules/math-intrinsics/floor.js +0 -4
  383. package/node_modules/math-intrinsics/isFinite.d.ts +0 -3
  384. package/node_modules/math-intrinsics/isFinite.js +0 -12
  385. package/node_modules/math-intrinsics/isInteger.d.ts +0 -3
  386. package/node_modules/math-intrinsics/isInteger.js +0 -16
  387. package/node_modules/math-intrinsics/isNaN.d.ts +0 -1
  388. package/node_modules/math-intrinsics/isNaN.js +0 -6
  389. package/node_modules/math-intrinsics/isNegativeZero.d.ts +0 -3
  390. package/node_modules/math-intrinsics/isNegativeZero.js +0 -6
  391. package/node_modules/math-intrinsics/max.d.ts +0 -1
  392. package/node_modules/math-intrinsics/max.js +0 -4
  393. package/node_modules/math-intrinsics/min.d.ts +0 -1
  394. package/node_modules/math-intrinsics/min.js +0 -4
  395. package/node_modules/math-intrinsics/mod.d.ts +0 -3
  396. package/node_modules/math-intrinsics/mod.js +0 -9
  397. package/node_modules/math-intrinsics/package.json +0 -86
  398. package/node_modules/math-intrinsics/pow.d.ts +0 -1
  399. package/node_modules/math-intrinsics/pow.js +0 -4
  400. package/node_modules/math-intrinsics/round.d.ts +0 -1
  401. package/node_modules/math-intrinsics/round.js +0 -4
  402. package/node_modules/math-intrinsics/sign.d.ts +0 -3
  403. package/node_modules/math-intrinsics/sign.js +0 -11
  404. package/node_modules/math-intrinsics/test/index.js +0 -192
  405. package/node_modules/math-intrinsics/tsconfig.json +0 -3
  406. package/node_modules/object-keys/.editorconfig +0 -13
  407. package/node_modules/object-keys/.eslintrc +0 -17
  408. package/node_modules/object-keys/.travis.yml +0 -277
  409. package/node_modules/object-keys/CHANGELOG.md +0 -232
  410. package/node_modules/object-keys/LICENSE +0 -21
  411. package/node_modules/object-keys/README.md +0 -76
  412. package/node_modules/object-keys/implementation.js +0 -122
  413. package/node_modules/object-keys/index.js +0 -32
  414. package/node_modules/object-keys/isArguments.js +0 -17
  415. package/node_modules/object-keys/package.json +0 -88
  416. package/node_modules/object-keys/test/index.js +0 -5
  417. package/node_modules/set-function-length/.eslintrc +0 -27
  418. package/node_modules/set-function-length/.github/FUNDING.yml +0 -12
  419. package/node_modules/set-function-length/.nycrc +0 -13
  420. package/node_modules/set-function-length/CHANGELOG.md +0 -70
  421. package/node_modules/set-function-length/LICENSE +0 -21
  422. package/node_modules/set-function-length/README.md +0 -56
  423. package/node_modules/set-function-length/env.d.ts +0 -9
  424. package/node_modules/set-function-length/env.js +0 -25
  425. package/node_modules/set-function-length/index.d.ts +0 -7
  426. package/node_modules/set-function-length/index.js +0 -42
  427. package/node_modules/set-function-length/package.json +0 -102
  428. package/node_modules/set-function-length/tsconfig.json +0 -9
  429. package/node_modules/yazl/README.md +0 -457
  430. package/node_modules/yazl/index.js +0 -826
  431. package/node_modules/yazl/package.json +0 -34
  432. package/tsconfig.tsbuildinfo +0 -1
package/lib/errors.js CHANGED
@@ -4,8 +4,8 @@
4
4
  * SPDX-License-Identifier: MPL-2.0
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.intrinsicNewError = exports.argToIntrinsicMustBePlainValue = exports.indexTooLargeToEncode = exports.canOnlyEncodePositiveIntegers = exports.doesNotImplementDependableTrait = exports.cannotConcatenateStringsInTokenizedMap = exports.mapValueAddedToReferenceList = exports.numberValueAddedToReferenceList = exports.cannotConcatenateStringsInTokenizedStringArray = exports.stringValueAddedToReferenceList = exports.cannotCalcIdForEmptySetOfComponents = exports.functionArgumentValidationFailure = exports.functionReceivedWrongNumberOfArgs = exports.listElementIsOfWrongType = exports.valueIsInvalidNumberOrToken = exports.valueIsInvalidStringOrToken = exports.encounteredAnnotationWithLevelError = exports.valueContainsUnescapedQuotes = exports.cloudBackendWorkspaceIsNotDefinedByName = exports.constructDependencyBelowV10 = exports.sourceOrTargetNotAnObject = exports.targetNotResolvableWithOverrides = exports.invalidStack = exports.expectNotGloballyAccessible = exports.jestNotInstantiated = exports.matchersFoundErrorsInStack = exports.matchersPathIsNotDirectory = exports.stackValidationFailure = exports.stackHasCircularDependency = exports.noStackForConstruct = exports.stackIdContainsWhitespace = exports.stackContainsDisallowedChar = exports.resourceGivenTwoMoveOperationsByTarget = exports.resourceGivenTwoMoveOperationsById = exports.resourceGivenTwoMoveOperationsByTargetAndId = exports.movedToResourceOfDifferentType = exports.moveTargetNotSet = exports.moveTargetAlreadySet = exports.modulesWithSameAlias = exports.iteratorOnResourceWithoutForEach = exports.iteratorOnResourceWithCount = exports.unresolvedTokenInConstructId = exports.dynamicBlockNotSupported = exports.assetTypeNotImplemented = exports.assetExpectsDirectory = exports.assetOutOfScopeOfCDKTFJson = exports.providerVersionMismatch = exports.appValidationFailure = exports.constructsOutsideOfStacks = exports.noAppFound = void 0;
8
- exports.terraformModuleHasChildren = exports.assetCanNotCreateZipArchive = exports.IdIncludesUnresolvedTokens = exports.unrecognizedTokenKey = exports.unknownNumberTokenFound = exports.mapKeyMustResolveToString = exports.constructsCannotBeResolved = exports.encodedMapTokenInScalarNumberContext = exports.encodedMapTokenInScalarStringContext = exports.encodedListTokenInScalarStringContext = exports.cannotResolveFunction = exports.unableToResolveCircularReference = void 0;
7
+ exports.unableToResolveCircularReference = exports.argToIntrinsicMustBePlainValue = exports.indexTooLargeToEncode = exports.canOnlyEncodePositiveIntegers = exports.doesNotImplementDependableTrait = exports.cannotConcatenateStringsInTokenizedMap = exports.mapValueAddedToReferenceList = exports.numberValueAddedToReferenceList = exports.cannotConcatenateStringsInTokenizedStringArray = exports.stringValueAddedToReferenceList = exports.cannotCalcIdForEmptySetOfComponents = exports.functionArgumentValidationFailure = exports.functionReceivedWrongNumberOfArgs = exports.listElementIsOfWrongType = exports.valueIsInvalidNumberOrToken = exports.valueIsInvalidStringOrToken = exports.encounteredAnnotationWithLevelError = exports.valueContainsUnescapedQuotes = exports.cloudBackendWorkspaceIsNotDefinedByName = exports.constructDependencyBelowV10 = exports.sourceOrTargetNotAnObject = exports.targetNotResolvableWithOverrides = exports.invalidStack = exports.expectNotGloballyAccessible = exports.jestNotInstantiated = exports.matchersFoundErrorsInStack = exports.matchersPathIsNotDirectory = exports.stackValidationFailure = exports.stackHasCircularDependency = exports.noStackForConstruct = exports.stackIdContainsWhitespace = exports.stackContainsDisallowedChar = exports.resourceGivenTwoMoveOperationsByTarget = exports.resourceGivenTwoMoveOperationsById = exports.resourceGivenTwoMoveOperationsByTargetAndId = exports.movedToResourceOfDifferentType = exports.moveTargetNotSet = exports.moveTargetAlreadySet = exports.modulesWithSameAlias = exports.iteratorOnResourceWithoutForEach = exports.iteratorOnResourceWithCount = exports.unresolvedTokenInConstructId = exports.dynamicBlockNotSupported = exports.assetTypeNotImplemented = exports.assetExpectsDirectory = exports.assetOutOfScopeOfCDKTFJson = exports.providerVersionMismatch = exports.appValidationFailure = exports.constructsOutsideOfStacks = exports.noAppFound = void 0;
8
+ exports.terraformModuleHasChildren = exports.assetCanNotCreateZipArchive = exports.IdIncludesUnresolvedTokens = exports.unrecognizedTokenKey = exports.unknownNumberTokenFound = exports.mapKeyMustResolveToString = exports.constructsCannotBeResolved = exports.encodedMapTokenInScalarNumberContext = exports.encodedMapTokenInScalarStringContext = exports.encodedListTokenInScalarStringContext = exports.cannotResolveFunction = void 0;
9
9
  const noAppFound = (constructPath) => new Error(`No app could be identified for the construct at path '${constructPath}' (likely a TerraformStack).
10
10
  The scope of CDKTN's TerraformStack class is a single App instance created by 'const app = new App()'. The App is your project's root, holding project configuration and validations.
11
11
  Learn more about the App: https://cdktn.io/docs/concepts/cdktn-architecture#app-class
@@ -211,7 +211,7 @@ Type of target: ${targetType}
211
211
  exports.sourceOrTargetNotAnObject = sourceOrTargetNotAnObject;
212
212
  const constructDependencyBelowV10 = () => new Error(`Version mismatch! CDKTN version 0.6 requires your constructs version to be v10 or above.
213
213
 
214
- Update your constructs dependency: https://cdk.tf/upgrade-constructs-v10
214
+ Update your constructs dependency: https://cdktn.io/docs/release/upgrade-guide-v0-6
215
215
  `);
216
216
  exports.constructDependencyBelowV10 = constructDependencyBelowV10;
217
217
  const cloudBackendWorkspaceIsNotDefinedByName = () => new Error(`The Cloud backend only supports cross-stack references if the workspace is defined by name (not by tags).
@@ -300,10 +300,13 @@ const indexTooLargeToEncode = (index) => new Error(`Received an index too large
300
300
 
301
301
  If you reach the maximum number of allowed Tokens (a limitation imposed by the way we encode Tokens and separate them from real numeric values) you can work around this issue by dividing a single application into multiple applications.`);
302
302
  exports.indexTooLargeToEncode = indexTooLargeToEncode;
303
- const argToIntrinsicMustBePlainValue = (value, creationStack) => new Error(`You can only use a plain value (not a function) while creating an Intrinsic token. We received the value '${value}' created at:\n${creationStack.join("\n")}. If you want to use a function, please use the Lazy class. For example: Lazy.anyValue({ produce: () => "Hello World" }).`);
303
+ const argToIntrinsicMustBePlainValue = (value, creationStack) => {
304
+ const createdAt = creationStack?.length
305
+ ? ` created at:\n${creationStack.join("\n")}`
306
+ : "";
307
+ return new Error(`You can only use a plain value (not a function) while creating an Intrinsic token. We received the value '${value}'${createdAt}. If you want to use a function, please use the Lazy class. For example: Lazy.anyValue({ produce: () => "Hello World" }).`);
308
+ };
304
309
  exports.argToIntrinsicMustBePlainValue = argToIntrinsicMustBePlainValue;
305
- const intrinsicNewError = (message, createdAt) => new Error(`${message}\nToken created:\n at ${createdAt}\nError thrown:`);
306
- exports.intrinsicNewError = intrinsicNewError;
307
310
  const unableToResolveCircularReference = (pathName) => new Error(`Unable to resolve object tree with circular reference at '${pathName}'.
308
311
 
309
312
  The depth of your object tree is over 200, indicating you probably have a cyclical reference. Inspect the construct creating this cyclic reference (most likely in '${pathName}') and ensure it does not infinitely nest constructs.`);
@@ -366,7 +369,7 @@ exports.IdIncludesUnresolvedTokens = IdIncludesUnresolvedTokens;
366
369
  const assetCanNotCreateZipArchive = (src, dest, error) => new Error(`A TerraformAsset trying to zip archive '${src}' into ${dest} failed: ${error}`);
367
370
  exports.assetCanNotCreateZipArchive = assetCanNotCreateZipArchive;
368
371
  const terraformModuleHasChildren = (pathName) => {
369
- return new Error(`Trying to add children to a TerraformModule at '${pathName}'. TerraformModules cannot have children, if you want to group resources or constructs in general together please use the Constructs class instead. See https://cdk.tf/constructs for more details.`);
372
+ return new Error(`Trying to add children to a TerraformModule at '${pathName}'. TerraformModules cannot have children, if you want to group resources or constructs in general together please use the Constructs class instead. See https://cdktn.io/docs/concepts/constructs for more details.`);
370
373
  };
371
374
  exports.terraformModuleHasChildren = terraformModuleHasChildren;
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7QUFLSSxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQXFCLEVBQUUsRUFBRSxDQUNsRCxJQUFJLEtBQUssQ0FDUCx5REFBeUQsYUFBYTs7O0tBR3JFLENBQ0YsQ0FBQztBQU5TLFFBQUEsVUFBVSxjQU1uQjtBQUVHLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNELE9BQU8sSUFBSSxLQUFLLENBQ2QsbUdBQW1HLFVBQVU7Q0FDaEgsQ0FDRSxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBTlcsUUFBQSx5QkFBeUIsNkJBTXBDO0FBRUssTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUN4RCxJQUFJLEtBQUssQ0FDUCw2REFBNkQsU0FBUzs7O0tBR3JFLENBQ0YsQ0FBQztBQU5TLFFBQUEsb0JBQW9CLHdCQU03QjtBQUVHLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxFQUFFLENBQzFDLElBQUksS0FBSyxDQUNQOztLQUVDLENBQ0YsQ0FBQztBQUxTLFFBQUEsdUJBQXVCLDJCQUtoQztBQUVHLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxFQUFVLEVBQUUsVUFBa0IsRUFBRSxFQUFFLENBQzNFLElBQUksS0FBSyxDQUNQLGtCQUFrQixFQUFFLHNDQUFzQyxVQUFVLCtFQUErRSxPQUFPLENBQUMsR0FBRyxFQUFFOzs7Ozs7Q0FNbkssQ0FDRSxDQUFDO0FBVFMsUUFBQSwwQkFBMEIsOEJBU25DO0FBRUcsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQVUsRUFBRSxVQUFrQixFQUFFLEVBQUUsQ0FDdEUsSUFBSSxLQUFLLENBQ1Asa0JBQWtCLEVBQUUsMEVBQTBFLFVBQVU7O0tBRXZHLENBQ0YsQ0FBQztBQUxTLFFBQUEscUJBQXFCLHlCQUs5QjtBQUVHLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxFQUFFLENBQzFDLElBQUksS0FBSyxDQUFDOzs7O0dBSVQsQ0FBQyxDQUFDO0FBTFEsUUFBQSx1QkFBdUIsMkJBSy9CO0FBRUUsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLGtCQUEwQixFQUFFLEVBQUUsQ0FDckUsSUFBSSxLQUFLLENBQ1A7Ozs7O0lBS0Esa0JBQWtCOztDQUVyQixDQUNFLENBQUM7QUFWUyxRQUFBLHdCQUF3Qiw0QkFVakM7QUFFRyxNQUFNLDRCQUE0QixHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FDekQsSUFBSSxLQUFLLENBQ1A7Z0NBQzRCLEVBQUU7Q0FDakMsQ0FDRSxDQUFDO0FBTFMsUUFBQSw0QkFBNEIsZ0NBS3JDO0FBRUcsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLEVBQUUsQ0FDOUMsSUFBSSxLQUFLLENBQ1A7OztrSkFHOEksQ0FDL0ksQ0FBQztBQU5TLFFBQUEsMkJBQTJCLCtCQU1wQztBQUVHLE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxFQUFFLENBQ25ELElBQUksS0FBSyxDQUFDO0dBQ1QsQ0FBQyxDQUFDO0FBRlEsUUFBQSxnQ0FBZ0Msb0NBRXhDO0FBRUUsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ3BELElBQUksS0FBSyxDQUFDLDRDQUE0QyxLQUFLOztHQUUxRCxDQUFDLENBQUM7QUFIUSxRQUFBLG9CQUFvQix3QkFHNUI7QUFFRSxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLE1BQWMsRUFDZCxnQkFBb0MsRUFDcEMsRUFBRSxDQUNGLElBQUksS0FBSyxDQUFDLFdBQVcsTUFBTSw2Q0FBNkMsZ0JBQWdCOytFQUNYLENBQUMsQ0FBQztBQUxwRSxRQUFBLG9CQUFvQix3QkFLZ0Q7QUFFMUUsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFBRSxPQUFlLEVBQUUsRUFBRSxDQUNsRSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU07O3VCQUVOLE1BQU07OztFQUczQixPQUFPO0NBQ1IsQ0FBQyxDQUFDO0FBUFUsUUFBQSxnQkFBZ0Isb0JBTzFCO0FBRUksTUFBTSw4QkFBOEIsR0FBRyxDQUM1QyxVQUFrQixFQUNsQixvQkFBNEIsRUFDNUIsdUJBQStCLEVBQy9CLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FBQzs7bUJBRU8sVUFBVSxxQkFBcUIsdUJBQXVCLDZDQUE2QyxvQkFBb0I7Ozs7Ozs7Q0FPekksQ0FBQyxDQUFDO0FBZFUsUUFBQSw4QkFBOEIsa0NBY3hDO0FBRUksTUFBTSwyQ0FBMkMsR0FBRyxDQUN6RCxFQUFVLEVBQ1YsY0FBc0IsRUFDdEIsT0FBcUMsRUFDckMsRUFBRSxDQUNGLElBQUksS0FBSyxDQUFDO2VBQ0csRUFBRTs7Z0JBRUQsY0FBYzs7VUFFcEIsT0FBTyxDQUFDLElBQUk7UUFDZCxPQUFPLENBQUMsRUFBRTs7Ozs7O0NBTWpCLENBQUMsQ0FBQztBQWpCVSxRQUFBLDJDQUEyQywrQ0FpQnJEO0FBRUksTUFBTSxrQ0FBa0MsR0FBRyxDQUNoRCxFQUFVLEVBQ1YsWUFBMEMsRUFDMUMsT0FBcUMsRUFDckMsRUFBRSxDQUNGLElBQUksS0FBSyxDQUFDO2VBQ0csRUFBRTs7O1VBR1AsWUFBWSxDQUFDLElBQUk7UUFDbkIsWUFBWSxDQUFDLEVBQUU7OztVQUdiLE9BQU8sQ0FBQyxJQUFJO1FBQ2QsT0FBTyxDQUFDLEVBQUU7Ozs7OztDQU1qQixDQUFDLENBQUM7QUFwQlUsUUFBQSxrQ0FBa0Msc0NBb0I1QztBQUVJLE1BQU0sc0NBQXNDLEdBQUcsQ0FDcEQsVUFBa0IsRUFDbEIsa0JBQTBCLEVBQzFCLGFBQXFCLEVBQ3JCLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsVUFBVSwrQ0FBK0MsYUFBYSxVQUFVLGtCQUFrQjs7Ozs7Q0FLN0gsQ0FBQyxDQUFDO0FBVlUsUUFBQSxzQ0FBc0MsMENBVWhEO0FBRUksTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxPQUFlLEVBQ2YsV0FBbUIsRUFDbkIsRUFBRSxDQUNGLElBQUksS0FBSyxDQUFDLDBDQUEwQyxPQUFPLDhDQUE4QyxXQUFXOzs7Q0FHckgsQ0FBQyxDQUFDO0FBUFUsUUFBQSwyQkFBMkIsK0JBT3JDO0FBRUksTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQzNELElBQUksS0FBSyxDQUFDLHlDQUF5QyxPQUFPOzsrRUFFbUIsT0FBTyxDQUFDLE9BQU8sQ0FDMUYsS0FBSyxFQUNMLEVBQUUsQ0FDSDtDQUNGLENBQUMsQ0FBQztBQVBVLFFBQUEseUJBQXlCLDZCQU9uQztBQUVJLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFxQixFQUFFLElBQVksRUFBRSxFQUFFLENBQ3pFLElBQUksS0FBSyxDQUFDLDJEQUEyRCxhQUFhLElBQUksSUFBSTs7Ozs7Q0FLM0YsQ0FBQyxDQUFDO0FBTlUsUUFBQSxtQkFBbUIsdUJBTTdCO0FBRUksTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxTQUF5QixFQUN6QixVQUEwQixFQUMxQixFQUFFLENBQ0YsSUFBSSxLQUFLLENBQUMseUJBQXlCLFVBQVUsT0FBTyxTQUFTOztpQkFFOUMsVUFBVSw0QkFBNEIsU0FBUyxzREFBc0QsU0FBUzs7O0NBRzlILENBQUMsQ0FBQztBQVRVLFFBQUEsMEJBQTBCLDhCQVNwQztBQUVJLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDMUQsSUFBSSxLQUFLLENBQUMsbURBQW1ELFNBQVM7OztDQUd2RSxDQUFDLENBQUM7QUFKVSxRQUFBLHNCQUFzQiwwQkFJaEM7QUFFSSxNQUFNLDBCQUEwQixHQUFHLENBQUMsWUFBb0IsRUFBRSxFQUFFLENBQ2pFLElBQUksS0FBSyxDQUFDOzsrRUFFbUUsWUFBWTs7OztzRkFJTCxDQUFDLENBQUM7QUFQM0UsUUFBQSwwQkFBMEIsOEJBT2lEO0FBRWpGLE1BQU0sMEJBQTBCLEdBQUcsQ0FDeEMsVUFBZSxFQUNmLFNBQWlCLEVBQ2pCLFdBQW1CLEVBQ25CLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FBQyxTQUFTLFVBQVUsb0JBQW9CLFNBQVMsS0FBSyxXQUFXOzs7Q0FHM0UsQ0FBQyxDQUFDO0FBUlUsUUFBQSwwQkFBMEIsOEJBUXBDO0FBRUksTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUUsQ0FDdEMsSUFBSSxLQUFLLENBQUM7Ozs7O0NBS1gsQ0FBQyxDQUFDO0FBTlUsUUFBQSxtQkFBbUIsdUJBTTdCO0FBRUksTUFBTSwyQkFBMkIsR0FBRyxHQUFHLEVBQUUsQ0FDOUMsSUFBSSxLQUFLLENBQUM7OztDQUdYLENBQUMsQ0FBQztBQUpVLFFBQUEsMkJBQTJCLCtCQUlyQztBQUVJLE1BQU0sWUFBWSxHQUFHLENBQUMsWUFBb0IsRUFBRSxZQUFvQixFQUFFLEVBQUUsQ0FDekUsSUFBSSxLQUFLLENBQUMsK0JBQStCLFlBQVk7OzsyRUFHb0IsWUFBWTs7Ozs7Ozs7Q0FRdEYsQ0FBQyxDQUFDO0FBWlUsUUFBQSxZQUFZLGdCQVl0QjtBQUVJLE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUNqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLE1BQU07OztDQUc1QixDQUFDLENBQUM7QUFKVSxRQUFBLGdDQUFnQyxvQ0FJMUM7QUFFSSxNQUFNLHlCQUF5QixHQUFHLENBQ3ZDLE1BQWMsRUFDZCxVQUFrQixFQUNsQixNQUFjLEVBQ2QsVUFBa0IsRUFDbEIsRUFBRSxDQUNGLElBQUksS0FBSyxDQUFDOzsyQkFFZSxNQUFNLHdDQUF3QyxNQUFNOztrQkFFN0QsVUFBVTtrQkFDVixVQUFVO0NBQzNCLENBQUMsQ0FBQztBQVpVLFFBQUEseUJBQXlCLDZCQVluQztBQUVJLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxFQUFFLENBQzlDLElBQUksS0FBSyxDQUFDOzs7Q0FHWCxDQUFDLENBQUM7QUFKVSxRQUFBLDJCQUEyQiwrQkFJckM7QUFFSSxNQUFNLHVDQUF1QyxHQUFHLEdBQUcsRUFBRSxDQUMxRCxJQUFJLEtBQUssQ0FBQzs7Ozs7Ozs7OztDQVVYLENBQUMsQ0FBQztBQVhVLFFBQUEsdUNBQXVDLDJDQVdqRDtBQUVJLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM1RCxJQUFJLEtBQUssQ0FDUCxnQkFBZ0IsS0FBSzs7OztnQkFJVCxLQUFLOzs7OztDQUtwQixDQUNFLENBQUM7QUFaUyxRQUFBLDRCQUE0QixnQ0FZckM7QUFFRyxNQUFNLG1DQUFtQyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FDcEUsSUFBSSxLQUFLLENBQUMsZ0RBQWdELE1BQU07OztDQUdqRSxDQUFDLENBQUM7QUFKVSxRQUFBLG1DQUFtQyx1Q0FJN0M7QUFFSSxNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDM0QsSUFBSSxLQUFLLENBQ1AsSUFBSSxLQUFLLDhJQUE4SSxDQUN4SixDQUFDO0FBSFMsUUFBQSwyQkFBMkIsK0JBR3BDO0FBRUcsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzNELElBQUksS0FBSyxDQUNQLEdBQUcsS0FBSyw2SUFBNkksQ0FDdEosQ0FBQztBQUhTLFFBQUEsMkJBQTJCLCtCQUdwQztBQUVHLE1BQU0sd0JBQXdCLEdBQUcsQ0FDdEMsS0FBWSxFQUNaLFFBQWdCLEVBQ2hCLEtBQWMsRUFDZCxFQUFFLENBQ0YsSUFBSSxLQUFLLENBQ1AsbUJBQW1CLEtBQUssZ0JBQWdCLFFBQVEsMkJBQTJCLEtBQUs7bUZBQ0QsQ0FDaEYsQ0FBQztBQVJTLFFBQUEsd0JBQXdCLDRCQVFqQztBQUVHLE1BQU0saUNBQWlDLEdBQUcsQ0FDL0MsSUFBWSxFQUNaLG1CQUEyQixFQUMzQixVQUFrQixFQUNsQixFQUFFLENBQ0YsSUFBSSxLQUFLLENBQ1AsWUFBWSxJQUFJLFVBQVUsbUJBQW1CLG1CQUFtQixVQUFVLG1FQUFtRSxDQUM5SSxDQUFDO0FBUFMsUUFBQSxpQ0FBaUMscUNBTzFDO0FBRUcsTUFBTSxpQ0FBaUMsR0FBRyxDQUMvQyxTQUFpQixFQUNqQixJQUFZLEVBQ1osS0FBYyxFQUNkLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCxZQUFZLFNBQVMsT0FBTyxJQUFJLDJCQUEyQixLQUFLLG9FQUFvRSxDQUNySSxDQUFDO0FBUFMsUUFBQSxpQ0FBaUMscUNBTzFDO0FBRUcsTUFBTSxtQ0FBbUMsR0FBRyxHQUFHLEVBQUUsQ0FDdEQsSUFBSSxLQUFLLENBQ1A7Ozs7dUhBSW1ILENBQ3BILENBQUM7QUFQUyxRQUFBLG1DQUFtQyx1Q0FPNUM7QUFFRyxNQUFNLCtCQUErQixHQUFHLENBQUMsU0FBbUIsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDJDQUEyQyxTQUFTOzs7O2dOQUl3SixDQUM3TSxDQUFDO0FBUFMsUUFBQSwrQkFBK0IsbUNBT3hDO0FBRUcsTUFBTSw4Q0FBOEMsR0FBRyxDQUM1RCxTQUFpQixFQUNqQixFQUFFLENBQ0YsSUFBSSxLQUFLLENBQ1AsZ0VBQWdFLFNBQVM7Ozs7d0hBSTJDLENBQ3JILENBQUM7QUFUUyxRQUFBLDhDQUE4QyxrREFTdkQ7QUFFRyxNQUFNLCtCQUErQixHQUFHLENBQUMsU0FBbUIsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDJDQUEyQyxTQUFTOzs7O2tKQUkwRixDQUMvSSxDQUFDO0FBUFMsUUFBQSwrQkFBK0IsbUNBT3hDO0FBRUcsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUMvRCxJQUFJLEtBQUssQ0FDUCwwQ0FBMEMsUUFBUTs7Ozs7b0ZBSzhCLENBQ2pGLENBQUM7QUFSUyxRQUFBLDRCQUE0QixnQ0FRckM7QUFFRyxNQUFNLHNDQUFzQyxHQUFHLENBQUMsWUFBaUIsRUFBRSxFQUFFLENBQzFFLElBQUksS0FBSyxDQUNQLHVEQUF1RCxZQUFZOzs7O2dKQUl5RSxDQUM3SSxDQUFDO0FBUFMsUUFBQSxzQ0FBc0MsMENBTy9DO0FBRUcsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLFFBQXFCLEVBQUUsRUFBRSxDQUN2RSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEscUNBQXFDLENBQUMsQ0FBQztBQURqRCxRQUFBLCtCQUErQixtQ0FDa0I7QUFFdkQsTUFBTSw2QkFBNkIsR0FBRyxHQUFHLEVBQUUsQ0FDaEQsSUFBSSxLQUFLLENBQ1Asa0dBQWtHLENBQ25HLENBQUM7QUFIUyxRQUFBLDZCQUE2QixpQ0FHdEM7QUFFRyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDckQsSUFBSSxLQUFLLENBQ1AsdURBQXVELEtBQUs7Ozs7Z1BBSWdMLENBQzdPLENBQUM7QUFQUyxRQUFBLHFCQUFxQix5QkFPOUI7QUFFRyxNQUFNLDhCQUE4QixHQUFHLENBQzVDLEtBQVUsRUFDVixhQUF1QixFQUN2QixFQUFFLENBQ0YsSUFBSSxLQUFLLENBQ1AsNkdBQTZHLEtBQUssa0JBQWtCLGFBQWEsQ0FBQyxJQUFJLENBQ3BKLElBQUksQ0FDTCw0SEFBNEgsQ0FDOUgsQ0FBQztBQVJTLFFBQUEsOEJBQThCLGtDQVF2QztBQUVHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsU0FBaUIsRUFBRSxFQUFFLENBQ3RFLElBQUksS0FBSyxDQUFDLEdBQUcsT0FBTyw0QkFBNEIsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDO0FBRGpFLFFBQUEsaUJBQWlCLHFCQUNnRDtBQUV2RSxNQUFNLGdDQUFnQyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQ25FLElBQUksS0FBSyxDQUFDLDZEQUE2RCxRQUFROztzS0FFcUYsUUFBUSx1REFBdUQsQ0FBQyxDQUFDO0FBSDFOLFFBQUEsZ0NBQWdDLG9DQUcwTDtBQUVoTyxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxHQUFRLEVBQUUsRUFBRSxDQUNsRSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsUUFBUSxNQUFNLEdBQUc7O2lJQUVzQyxDQUFDLENBQUM7QUFIdEgsUUFBQSxxQkFBcUIseUJBR2lHO0FBRW5JLE1BQU0sc0JBQXNCLEdBQUc7Ozs7Ozs7Ozs7O3FFQVdzQyxDQUFDO0FBRXRFLE1BQU0scUJBQXFCLEdBQUc7Ozs7Ozs7Ozs7O3FFQVd1QyxDQUFDO0FBRS9ELE1BQU0scUNBQXFDLEdBQUcsR0FBRyxFQUFFLENBQ3hELElBQUksS0FBSyxDQUFDO0VBQ1Ysc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0FBRmYsUUFBQSxxQ0FBcUMseUNBRXRCO0FBRXJCLE1BQU0sb0NBQW9DLEdBQUcsR0FBRyxFQUFFLENBQ3ZELElBQUksS0FBSyxDQUFDO0VBQ1YscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0FBRmQsUUFBQSxvQ0FBb0Msd0NBRXRCO0FBRXBCLE1BQU0sb0NBQW9DLEdBQUcsR0FBRyxFQUFFLENBQ3ZELElBQUksS0FBSyxDQUFDO0VBQ1YscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0FBRmQsUUFBQSxvQ0FBb0Msd0NBRXRCO0FBRXBCLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FDN0QsSUFBSSxLQUFLLENBQUMseUNBQXlDLFFBQVE7Ozs7O21IQUtzRCxDQUFDLENBQUM7QUFOeEcsUUFBQSwwQkFBMEIsOEJBTThFO0FBRTlHLE1BQU0seUJBQXlCLEdBQUcsQ0FDdkMsUUFBZ0IsRUFDaEIsR0FBVyxFQUNYLFdBQWdCLEVBQ2hCLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCxPQUFPLFFBQVEseUJBQXlCLEdBQUcsMkVBQTJFLE9BQU8sV0FBVyxtQkFBbUIsSUFBSSxDQUFDLFNBQVMsQ0FDdkssV0FBVyxDQUNaLHlEQUF5RCxDQUMzRCxDQUFDO0FBVFMsUUFBQSx5QkFBeUIsNkJBU2xDO0FBRUosTUFBTSx1QkFBdUIsR0FBRzs7d0dBRXdFLENBQUM7QUFFbEcsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUUsQ0FDMUMsSUFBSSxLQUFLLENBQ1AseURBQXlELHVCQUF1QixFQUFFLENBQ25GLENBQUM7QUFIUyxRQUFBLHVCQUF1QiwyQkFHaEM7QUFFRyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsTUFBTSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7QUFEOUQsUUFBQSxvQkFBb0Isd0JBQzBDO0FBRXBFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDRGQUE0RixnQkFBZ0Isb09BQW9PLENBQ2pWLENBQUM7QUFIUyxRQUFBLDBCQUEwQiw4QkFHbkM7QUFFRyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQVcsRUFDWCxJQUFZLEVBQ1osS0FBWSxFQUNaLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCwyQ0FBMkMsR0FBRyxVQUFVLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FDaEYsQ0FBQztBQVBTLFFBQUEsMkJBQTJCLCtCQU9wQztBQUVHLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDN0QsT0FBTyxJQUFJLEtBQUssQ0FDZCxtREFBbUQsUUFBUSxxTUFBcU0sQ0FDalEsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsMEJBQTBCLDhCQUlyQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgSURlcGVuZGFibGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiLi90ZXJyYWZvcm0tc3RhY2tcIjtcblxuZXhwb3J0IGNvbnN0IG5vQXBwRm91bmQgPSAoY29uc3RydWN0UGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYE5vIGFwcCBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nIChsaWtlbHkgYSBUZXJyYWZvcm1TdGFjaykuXG5UaGUgc2NvcGUgb2YgQ0RLVE4ncyBUZXJyYWZvcm1TdGFjayBjbGFzcyBpcyBhIHNpbmdsZSBBcHAgaW5zdGFuY2UgY3JlYXRlZCBieSAnY29uc3QgYXBwID0gbmV3IEFwcCgpJy4gVGhlIEFwcCBpcyB5b3VyIHByb2plY3QncyByb290LCBob2xkaW5nIHByb2plY3QgY29uZmlndXJhdGlvbiBhbmQgdmFsaWRhdGlvbnMuXG5MZWFybiBtb3JlIGFib3V0IHRoZSBBcHA6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jZGt0bi1hcmNoaXRlY3R1cmUjYXBwLWNsYXNzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNPdXRzaWRlT2ZTdGFja3MgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IGJ1bGxldExpc3QgPSBwYXRocy5tYXAoKHApID0+IGAgIC0gJHtwfWApLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYEZvdW5kIGNvbnN0cnVjdHMgb3V0c2lkZSBvZiBhIFRlcnJhZm9ybVN0YWNrIChkaWQgeW91IHBhc3Mgc2NvcGU9YXBwIGluc3RlYWQgb2Ygc2NvcGU9c3RhY2s/KTpcXG4ke2J1bGxldExpc3R9XG5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGFwcFZhbGlkYXRpb25GYWlsdXJlID0gKGVycm9yTGlzdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFwcC1sZXZlbCB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9XG5WYWxpZGF0aW9ucyBhbGxvdyBmb3IgZHluYW1pYyB2ZXJpZmljYXRpb24gb2YgeW91ciBwcm9qZWN0LlxuVG8gc2tpcCB2YWxpZGF0aW9ucywgYWRkICdza2lwVmFsaWRhdGlvbjogdHJ1ZScgdG8geW91ciBBcHAgY29uZmlnLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlclZlcnNpb25NaXNtYXRjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVmVyc2lvbiBtaXNtYXRjaCBkZXRlY3RlZDogWW91ciBwcm92aWRlciBiaW5kaW5ncyBhcmUgYnVpbHQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ0RLVG4uXG5VcGdyYWRlIHlvdXIgcHJlLWJ1aWx0IHByb3ZpZGVyIG9yIHJlLXJ1biBjZGt0biBnZXQgd2l0aCBhIG1vcmUgcmVjZW50IHZlcnNpb24gKD49IDAuMTApIG9mIHRoZSBjZGt0bi1jbGkuXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0T3V0T2ZTY29wZU9mQ0RLVEZKc29uID0gKGlkOiBzdHJpbmcsIGNvbmZpZ1BhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSB3YXMgY3JlYXRlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCAnJHtjb25maWdQYXRofScsIGJ1dCB3ZSBjYW5ub3QgZmluZCB0aGUgY2RrdGYuanNvbiB3aXRoaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke3Byb2Nlc3MuY3dkKCl9J1xuXG5UaGUgY2RrdGYuanNvbiBmaWxlIGlzIG5lZWRlZCB0byBlc3RhYmxpc2ggdGhlIGJhc2UgZm9yIHRoZSByZWxhdGl2ZSBwYXRoICh0aGUgJy4nIGluICcuL2Zvby9iYXInKS5cblxuUGxhY2UgYSBjZGt0Zi5qc29uIGF0IHRoZSByb290IG9mIHlvdXIgcHJvamVjdC4gTGVhcm4gbW9yZTogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0RXhwZWN0c0RpcmVjdG9yeSA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gZXhwZWN0cyBwYXRoIHRvIHBvaW50IHRvIGEgZGlyZWN0b3J5LiBJbnN0ZWFkLCB0aGlzIGZpbGUgd2FzIHBhc3NlZDogJyR7Y29uZmlnUGF0aH0nLiBQbGVhc2UgY29ycmVjdCB0aGUgcGF0aCB0byBwb2ludCB0byBhIGRpcmVjdG9yeS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRUeXBlTm90SW1wbGVtZW50ZWQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEFzc2V0IHR5cGUgaXMgbm90IGltcGxlbWVudGVkLlxuUG9zc2libGUgQXNzZXQgdHlwZXMgaW5jbHVkZTogRklMRSwgRElSRUNUT1JZLCBhbmQgQVJDSElWRS5cblRha2Ugb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBBc3NldFR5cGUgRW51bS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljQmxvY2tOb3RTdXBwb3J0ZWQgPSAoX2ZvcmVhY2hFeHByZXNzaW9uOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgV2UgZG8gbm90IHN1cHBvcnQgZGlyZWN0bHkgcmVzb2x2aW5nIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrLiBEeW5hbWljIGJsb2NrcyBhcmUgb25seSBzdXBwb3J0ZWQgb24gYmxvY2sgYXR0cmlidXRlcyBvZiByZXNvdXJjZXMsIGRhdGEgc291cmNlcywgYW5kIHByb3ZpZGVycy5cblxuWW91IGNhbiBjcmVhdGUgYSBUZXJyYWZvcm1EeW5hbWljQmxvY2sgYnkgY2FsbGluZyAnLmR5bmFtaWMnIG9uIGEgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGFuY2UuXG5cblRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3YXMgdXNlZCBmb3IgdGhlIGR5bmFtaWMgYmxvY2s6IC5keW5hbWljKHtcbiAgJHtfZm9yZWFjaEV4cHJlc3Npb259XG59KVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWRUb2tlbkluQ29uc3RydWN0SWQgPSAoaWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IHVzZSBhIHRva2VuIChlLmcuLCBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUpIGFzIHRoZSBpZCBvZiBhIGNvbnN0cnVjdC4gSWRzIG9mIGNvbnN0cnVjdHMgbXVzdCBiZSBrbm93biBhdCBzeW50aGVzaXMgdGltZSwgYW5kIHRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biB3aGVuIFRlcnJhZm9ybSBydW5zLiBQbGVhc2UgdXNlIGEgY29uY3JldGUgdmFsdWUgZm9yIHlvdXIgY29uc3RydWN0cyBJRCBpbnN0ZWFkLlxuWW91IHBhc3NlZCB0aGUgZm9sbG93aW5nIGlkOiBcIiR7aWR9XCJcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRoQ291bnQgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW5ub3QgY3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSByZXNvdXJjZSB3aXRoIGEgY291bnQgYXJndW1lbnQuXG5JbnN0ZWFkLCByZXVzZSB0aGlzIHJlc291cmNlJ3MgVGVycmFmb3JtQ291bnQgaW5zdGFuY2UgaW4gdGhlIHJlc291cmNlIHlvdSB3YW50IHRvIHVzZSBhcyBhbiBpdGVyYXRvci5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGFuIGl0ZXJhdG9yIHRvIHBvcHVsYXRlIGEgbGlzdCBhdHRyaWJ1dGUsIHJlcGxhY2UgdGhlIGNvdW50IG9uIHRoZSByZXNvdXJjZSB3aXRoIGFuIGl0ZXJhdG9yIHBhc3NlZCBpbnRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRob3V0Rm9yRWFjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aG91dCBhIGZvckVhY2ggYXJndW1lbnQuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBtb3JlIGluc3RhbmNlcyBvZiB0aGlzIHJlc291cmNlLCBwYXNzIGFuIGl0ZXJhdG9yIHRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50IG9mIHRoZSByZXNvdXJjZSBmaXJzdC5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVzV2l0aFNhbWVBbGlhcyA9IChhbGlhczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE11bHRpcGxlIHByb3ZpZGVycyBoYXZlIHRoZSBzYW1lIGFsaWFzOiBcIiR7YWxpYXN9XCJcbkVhY2ggcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGFsaWFzIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBwcm92aWRlcnMgb2YgdGhlIHNhbWUgdHlwZSB0byBtb2R1bGVzLlxuICBgKTtcblxuZXhwb3J0IGNvbnN0IG1vdmVUYXJnZXRBbHJlYWR5U2V0ID0gKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZnJpZW5kbHlVbmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgdGhlIGNvbnN0cnVjdCAke2ZyaWVuZGx5VW5pcXVlSWR9LlxuVGFyZ2V0IG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNhbWUgc3RhY2suYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0Tm90U2V0ID0gKHRhcmdldDogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0IFwiJHt0YXJnZXR9XCIgaGFzIG5vdCBiZWVuIHNldC5cbllvdSB0cmllZCB0byBtb3ZlIGEgcmVzb3VyY2Ugd2l0aG91dCBhIHRhcmdldC5cbkNhbGwgLmFkZE1vdmVUYXJnZXQoXCIke3RhcmdldH1cIikgb24gdGhlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgcmVzb3VyY2UgdG8uXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldHMgKGluIGNhc2UgeW91IGhhZCBhIHR5cG8pOlxuJHtlbnRyaWVzfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUgPSAoXG4gIG1vdmVUYXJnZXQ6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZGVzdGluYXRpb25SZXNvdXJjZVR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBXZSBkbyBub3Qgc3VwcG9ydCBtb3ZpbmcgcmVzb3VyY2VzIHRvIGEgZGlmZmVyZW50IHR5cGUuXG5cblRoZSBkZXN0aW5hdGlvbiBcIiR7bW92ZVRhcmdldH1cIidzIHJlc291cmNlIHR5cGUgJHtkZXN0aW5hdGlvblJlc291cmNlVHlwZX0gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXNvdXJjZSB0eXBlICgke29yaWdpbmFsUmVzb3VyY2VUeXBlfSkgeW91IGFyZSB0cnlpbmcgdG8gbW92ZS5cblxuSWYgdGhpcyB3YXMgaW50ZW50aW9uYWwsIHRyeSBpbXBvcnRpbmcgdGhlIGV4aXN0aW5nIHJlc291cmNlIGludG8geW91ciB0YXJnZXQgaW5zdGVhZC4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjaW1wb3J0aW5nLXJlc291cmNlc1xuXG5Ob3RlIHRoYXQgeW91IG11c3QgbWFudWFsbHkgcmVtb3ZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBmcm9tIHlvdXIgc3RhdGUgZmlsZSBhZnRlciBpbXBvcnRpbmcgaXQuIFVzZSB0aGUgXCJ0ZXJyYWZvcm0gc3RhdGUgcm1cIiBjb21tYW5kIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBzdGFjayB5b3UgZGVmaW5lZCB0aGlzIHJlc291cmNlIGluLiBMZWFybiBtb3JlOlxuaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2xpL2NvbW1hbmRzL3N0YXRlL3JtXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0QW5kSWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nVGFyZ2V0OiBzdHJpbmcsXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbk1vdmUgdGFyZ2V0OiBcIiR7ZXhpc3RpbmdUYXJnZXR9XCJcbk1vdmUgYnkgaWQ6IHtcbiAgZnJvbTogJHtuZXdNb3ZlLmZyb219XG4gIHRvOiAke25ld01vdmUudG99XG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbiAgbmV3TW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbikgPT5cbiAgbmV3IEVycm9yKGBcblRoZSByZXNvdXJjZSAke2lkfSBoYXMgYmVlbiBnaXZlbiB0d28gZGlmZmVyZW50IG1vdmUgb3BlcmF0aW9ucy5cblxue1xuICBmcm9tOiAke2V4aXN0aW5nTW92ZS5mcm9tfVxuICB0bzogJHtleGlzdGluZ01vdmUudG99XG59XG57XG4gIGZyb206ICR7bmV3TW92ZS5mcm9tfVxuICB0bzogJHtuZXdNb3ZlLnRvfSAoUmVzb3VyY2UgY2FsbGluZyB0aGUgbW92ZSB0byBvcGVyYXRpb24pXG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0ID0gKFxuICByZXNvdXJjZUlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZVRhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlVGFyZ2V0OiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgVGhlIHJlc291cmNlICR7cmVzb3VyY2VJZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlVGFyZ2V0czogXCIke25ld01vdmVUYXJnZXR9XCIgYW5kIFwiJHtleGlzdGluZ01vdmVUYXJnZXR9XCJcblxuQSByZXNvdXJjZSBjYW4gb25seSBiZSBtb3ZlZCBvbmNlIHBlciBwbGFuL2FwcGx5LlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9leGFtcGxlcy1hbmQtZ3VpZGVzL3JlZmFjdG9yaW5nIzp+OnRleHQ9TW92aW5nJTIwJTI2JTIwUmVuYW1pbmclMjBSZXNvdXJjZXMlMjBXaXRoaW4lMjBhJTIwU3RhY2tcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tDb250YWluc0Rpc2FsbG93ZWRDaGFyID0gKFxuICBzdGFja0lkOiBzdHJpbmcsXG4gIGludmFsaWRDaGFyOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBUZXJyYWZvcm0gc3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYW4gaW52YWxpZCBnbG9iIGNoYXJhY3RlcjogXCIke2ludmFsaWRDaGFyfVwiLlxuXG5HbG9iIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RhY2sgbmFtZXMgYmVjYXVzZSB3ZSB1c2UgdGhlbSB0byBkZXBsb3kgYW5kIGRlc3Ryb3kgbXVsdGlwbGUgc3RhY2tzLiBGb3IgZXhhbXBsZSwgJ2Nka3RuIGRlcGxveSBcXGAqLXByb2R1Y3Rpb25cXGAnIGRlcGxveXMgYWxsIHN0YWNrcyB3aXRoIG5hbWVzIHRoYXQgZW5kIGluICctcHJvZHVjdGlvbicuXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrSWRDb250YWluc1doaXRlc3BhY2UgPSAoc3RhY2tJZDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgVGVycmFmb3JtU3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblxuUGxlYXNlIHJlbW92ZSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHlvdXIgVGVycmFmb3JtU3RhY2sgaWQsIGxpa2Ugc286IFwiJHtzdGFja0lkLnJlcGxhY2UoXG4gICAgL1xccy9nLFxuICAgIFwiXCIsXG4gICl9XCJcbmApO1xuXG5leHBvcnQgY29uc3Qgbm9TdGFja0ZvckNvbnN0cnVjdCA9IChjb25zdHJ1Y3RQYXRoOiBzdHJpbmcsIGhpbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBObyBzdGFjayBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nJHtoaW50fVxuXG5Zb3UgY2FuIG9ubHkgdXNlIGNvbnN0cnVjdHMgYXMgcGFydCBvZiBhIFRlcnJhZm9ybVN0YWNrLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IENvbnN0cnVjdHMgdnMuIFRlcnJhZm9ybVN0YWNrcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIzp+OnRleHQ9Q29uc3RydWN0cyUyMHZzLiUyMFN0YWNrc1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IChcbiAgdGhpc1N0YWNrOiBUZXJyYWZvcm1TdGFjayxcbiAgZGVwZW5kZW5jeTogVGVycmFmb3JtU3RhY2ssXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGFkZCBkZXBlbmRlbmN5ICR7ZGVwZW5kZW5jeX0gdG8gJHt0aGlzU3RhY2t9LCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cblxuVGVycmFmb3JtU3RhY2sgJHtkZXBlbmRlbmN5fSBpcyBhbHJlYWR5IGRlcGVuZGVudCBvbiAke3RoaXNTdGFja30gZGlyZWN0bHksIG9yIGRlcGVuZGVudCBvbiBhIFRlcnJhZm9ybVN0YWNrIHdpdGhpbiAke3RoaXNTdGFja30uXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeSByZWZlcmVuY2VzLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3N0YWNrcyM6fjp0ZXh0PUNyb3NzJTJEU3RhY2slMjBSZWZlcmVuY2VzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUgPSAoZXJyb3JMaXN0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuXG5JZiB5b3Ugd2lzaCB0byBpZ25vcmUgdGhlc2UgdmFsaWRhdGlvbnMsIHBhc3MgJ3NraXBWYWxpZGF0aW9uOiB0cnVlJyB0byB5b3VyIEFwcCBjb25maWd1cmF0aW9uLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeSA9IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeS5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3RpbmcuZnVsbFN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5zeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuVGVzdGluZy5mdWxsU3ludGggcmV0dXJucyBhIGZpbGUgcGF0aCB0byBhIHRlbXBvcmFyeSB0ZXN0aW5nIGVudmlyb25tZW50LiBUZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c2ApO1xuXG5leHBvcnQgY29uc3QgbWF0Y2hlcnNGb3VuZEVycm9yc0luU3RhY2sgPSAoXG4gIGVycm9yQ291bnQ6IGFueSxcbiAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gIGRpYWdub3N0aWNzOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgRm91bmQgJHtlcnJvckNvdW50fSBFcnJvcnMgaW4gc3RhY2sgJHtzdGFja05hbWV9OiAke2RpYWdub3N0aWNzfVxuXG5UaGVzZSBlcnJvcnMgYXJlIG5vdCB0ZXN0IGZhaWx1cmVzLCBidXQgaXNzdWVzIHdpdGggdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtU3RhY2sgYmVpbmcgdGVzdGVkLiBGaXggdGhlIGFib3ZlIGlzc3VlcyBiZWZvcmUgcnVubmluZyB5b3VyIHRlc3RzIGFnYWluLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBqZXN0Tm90SW5zdGFudGlhdGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBKZXN0IHdhcyBub3QgcHJvcGVybHkgaW5zdGFudGlhdGVkLlxuXG5FbnN1cmUgeW91IGhhdmUgYSAnc2V0dXAuanMnIGZpbGUgaW4geW91ciBwcm9qZWN0J3MgZGlyZWN0b3J5IHRoYXQgY2FsbHMgJ2Nka3RuLlRlc3Rpbmcuc2V0dXBKZXN0KCknLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgZXhwZWN0Tm90R2xvYmFsbHlBY2Nlc3NpYmxlID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgZXhwZWN0IGZ1bmN0aW9uIGlzIG5vdCBnbG9iYWxseSBhY2Nlc3NpYmxlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFN0YWNrID0gKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBzdGFja0NvbnRlbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gc3RyaW5nIHBhc3NlZDogJHtzdGFja0NvbnRlbnR9XG5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykgdG8gJyR7ZnVuY3Rpb25OYW1lfScsIG5vdCBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuXG5UZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay4gQ0RLVE4gY2FuIHVzZSBhc3NlcnRpb25zIHdpdGggdGhpcyBKU09OIHRvIGNoZWNrIHRoZSBjb21wb3NpdGlvbiBvZiB5b3VyIHN0YWNrcywgbGlrZSBzbzogXCJUZXN0aW5nLnRvSGF2ZVJlc291cmNlKFRlc3Rpbmcuc3ludGgoJ1RlcnJhZm9ybVN0YWNrIGluc3RhbmNlJyksIFMzQnVja2V0KVwiXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c1xuYCk7XG5cbmV4cG9ydCBjb25zdCB0YXJnZXROb3RSZXNvbHZhYmxlV2l0aE92ZXJyaWRlcyA9ICh0YXJnZXQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBUYXJnZXQgKCR7dGFyZ2V0fSkgY2Fubm90IGJlIGEgcmVzb2x2YWJsZSB0b2tlbiBpZiB5b3Ugc3BlY2lmaWVkIG92ZXJyaWRlcy4gUmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHlvdSBhcmUgb3ZlcnJpZGluZyB3aXRoIGEgc3RhdGljIHZhbHVlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IFRva2VucywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbmApO1xuXG5leHBvcnQgY29uc3Qgc291cmNlT3JUYXJnZXROb3RBbk9iamVjdCA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIHNvdXJjZVR5cGU6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIHRhcmdldFR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBBbiBpc3N1ZSBvY2N1cnJlZCBkdXJpbmcgdGhlIHN5bnRoZXNpemF0aW9uIG9mIHlvdXIgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24uXG5cbkJvdGggdGhlIHNvdXJjZSBlbGVtZW50ICgke3NvdXJjZX0pIGFuZCBpdHMgY29udGFpbmluZyB0YXJnZXQgZWxlbWVudCAoJHt0YXJnZXR9KSBtdXN0IGJlIG9iamVjdHMuXG5cblR5cGUgb2Ygc291cmNlOiAke3NvdXJjZVR5cGV9XG5UeXBlIG9mIHRhcmdldDogJHt0YXJnZXRUeXBlfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3REZXBlbmRlbmN5QmVsb3dWMTAgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFZlcnNpb24gbWlzbWF0Y2ghIENES1ROIHZlcnNpb24gMC42IHJlcXVpcmVzIHlvdXIgY29uc3RydWN0cyB2ZXJzaW9uIHRvIGJlIHYxMCBvciBhYm92ZS5cblxuVXBkYXRlIHlvdXIgY29uc3RydWN0cyBkZXBlbmRlbmN5OiBodHRwczovL2Nkay50Zi91cGdyYWRlLWNvbnN0cnVjdHMtdjEwXG5gKTtcblxuZXhwb3J0IGNvbnN0IGNsb3VkQmFja2VuZFdvcmtzcGFjZUlzTm90RGVmaW5lZEJ5TmFtZSA9ICgpID0+XG4gIG5ldyBFcnJvcihgVGhlIENsb3VkIGJhY2tlbmQgb25seSBzdXBwb3J0cyBjcm9zcy1zdGFjayByZWZlcmVuY2VzIGlmIHRoZSB3b3Jrc3BhY2UgaXMgZGVmaW5lZCBieSBuYW1lIChub3QgYnkgdGFncykuXG5cblRvIHVzZSBjcm9zcy1zdGFjayByZWZlcmVuY2VzLCByZXBsYWNlIGFsbCBtZW50aW9ucyBvZiAnVGFnZ2VkQ2xvdWRXb3Jrc3BhY2VzJyB3aXRoICdOYW1lZENsb3VkV29ya3NwYWNlJywgbGlrZSBzbzpcblxubmV3IENsb3VkQmFja2VuZChzdGFjaywge1xuICAuLi5cbiAgd29ya3NwYWNlczogbmV3IE5hbWVkQ2xvdWRXb3Jrc3BhY2UoXCJteS1hcHBcIiksXG59KTtcblxuVG8gbGVhcm4gbW9yZSBhYm91dCBSZW1vdGUgQmFja2VuZHMsIHJlZmVyIHRvOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVtb3RlLWJhY2tlbmRzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlQ29udGFpbnNVbmVzY2FwZWRRdW90ZXMgPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3VyIHZhbHVlLCAnJHt2YWx1ZX0nLCBoYXMgdW5lc2NhcGVkIGRvdWJsZSBxdW90ZXMgaW4gaXQsIHNvIGl0IGNhbm5vdCBiZSB1c2VkIGFzIGEgdmFsdWUuXG5cblRvIHNhZmVseSB1c2UgdGhlIHZhbHVlLCB1c2UgRm4ucmF3U3RyaW5nIG9uIHlvdXIgc3RyaW5nLCBsaWtlIHNvOlxuXG5Gbi5yYXdTdHJpbmcoJyR7dmFsdWV9JylcblxuRG9pbmcgdGhpcyBlbnN1cmVzIENES1ROIGFuZCBUZXJyYWZvcm0gaW50ZXJwcmV0IHlvdXIgdmFsdWVzIGNvcnJlY3RseS5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCBidWlsdCBpbiBUZXJyYWZvcm0gZnVuY3Rpb25zIHdpdGhpbiBDREtUTiwgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9mdW5jdGlvbnNcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBlbmNvdW50ZXJlZEFubm90YXRpb25XaXRoTGV2ZWxFcnJvciA9IChlcnJvcnM6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBFbmNvdW50ZXJlZCBBbm5vdGF0aW9ucyB3aXRoIGxldmVsIFwiRVJST1JcIjpcXG4ke2Vycm9yc31cblxuRWl0aGVyIGZpeCB0aGUgaXNzdWVzIGFib3ZlLCBvciBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIENES1RGX0NPTlRJTlVFX1NZTlRIX09OX0VSUk9SX0FOTk9UQVRJT05TIHRvIGlnbm9yZSB0aGVzZSBhbm5vdGF0aW9ucy5cbmApO1xuXG5leHBvcnQgY29uc3QgdmFsdWVJc0ludmFsaWRTdHJpbmdPclRva2VuID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgJyR7dmFsdWV9JyBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbm9yIGEgdG9rZW4uIFRoaXMgZnVuY3Rpb24gb25seSBhY2NlcHRzIHN0cmluZ3Mgb3IgdG9rZW5zIHJlc29sdmluZyB0byBzdHJpbmdzLiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSBhY2NvcmRpbmdseS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdmFsdWVJc0ludmFsaWROdW1iZXJPclRva2VuID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgbnVtYmVyIG5vciBhIHRva2VuLiBUaGlzIGZ1bmN0aW9uIG9ubHkgYWNjZXB0cyBudW1iZXJzIG9yIHRva2VucyByZXNvbHZpbmcgdG8gbnVtYmVycy4gUGxlYXNlIGNoYW5nZSB5b3VyIGNvZGUgYWNjb3JkaW5nbHkuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGxpc3RFbGVtZW50SXNPZldyb25nVHlwZSA9IChcbiAgdmFsdWU6IGFueVtdLFxuICBwb3NpdGlvbjogbnVtYmVyLFxuICBlcnJvcjogdW5rbm93bixcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBFbGVtZW50IGluIGxpc3QgJHt2YWx1ZX0gYXQgcG9zaXRpb24gJHtwb3NpdGlvbn0gaXMgbm90IHRoZSByaWdodCB0eXBlOiAke2Vycm9yfS5cbiAgICBQbGVhc2UgZW5zdXJlIGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhpcyBmdW5jdGlvbi5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25SZWNlaXZlZFdyb25nTnVtYmVyT2ZBcmdzID0gKFxuICBuYW1lOiBzdHJpbmcsXG4gIGFyZ1ZhbGlkYXRvcnNMZW5ndGg6IG51bWJlcixcbiAgYXJnc0xlbmd0aDogbnVtYmVyLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEZ1bmN0aW9uICR7bmFtZX0gdGFrZXMgJHthcmdWYWxpZGF0b3JzTGVuZ3RofSBhcmd1bWVudHMsIGJ1dCAke2FyZ3NMZW5ndGh9IHdlcmUgcHJvdmlkZWQuIFBsZWFzZSBhZGQgdGhlIG1pc3NpbmcgYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbi5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25Bcmd1bWVudFZhbGlkYXRpb25GYWlsdXJlID0gKFxuICBhcmdOdW1iZXI6IG51bWJlcixcbiAgbmFtZTogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93bixcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBBcmd1bWVudCAke2FyZ051bWJlcn0gb2YgJHtuYW1lfSBmYWlsZWQgdGhlIHZhbGlkYXRpb246ICR7ZXJyb3J9LiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSB0byBwYXNzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgYXJndW1lbnQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENhbGNJZEZvckVtcHR5U2V0T2ZDb21wb25lbnRzID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBVbmFibGUgdG8gY2FsY3VsYXRlIGEgdW5pcXVlIGlkIGZvciBhbiBlbXB0eSBzZXQgb2YgY29tcG9uZW50cy5cblxuICAgIFRoaXMgaGFwcGVucyB3aGVuIHlvdSBhdHRlbXB0IHRvIGNyZWF0ZSBhIHVuaXF1ZSBpZCwgYnV0IGRvIG5vdCBwYXNzIGluIGFueSBjb25zdHJ1Y3Qgbm9kZSBpZHMuIFRoaXMgbWVhbnMgeW91ciBjb25zdHJ1Y3QgbGlrZWx5IGhhcyBubyBwYXJlbnQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLlxuXG4gICAgUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGNvbnN0cnVjdCBoYXMgYSBwYXJlbnQuIEZvciBleGFtcGxlOiAnbmV3IEFwcCh0aGlzKScgb3IgJ25ldyBUZXJyYWZvcm1TdGFjayh0aGlzLCAnc3RhY2snKScuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHN0cmluZ1ZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobGlzdFRva2VuOiBzdHJpbmdbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGxpc3QgdG9rZW4sIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgZXhwZWN0IHRoZSBlbGVtZW50cyBvZiBhIHRva2VuaXplZCBzdHJpbmcgYXJyYXkgdG8gYmUgYSBzaW5nbGUgdG9rZW4gc3RyaW5nLiBGb3IgZXhhbXBsZSwgW1wiJntUZlRva2VuW1Rva2VuLjFdfVwiXS5cblxuICAgIE9uZSBlbGVtZW50IGluIHlvdXIgYXJyYXkgY29uc2lzdHMgb2YgbW9yZSB0aGFuIGEgc2luZ2xlIHZhbHVlLiBUbyBhZGQgdmFsdWVzIHRvIGEgdG9rZW5pemVkIGxpc3QsIHVzZSBUZXJyYWZvcm0gZnVuY3Rpb25zIGluc3RlYWQuIEZvciBleGFtcGxlOiAnRm4uY29uY2F0KFt5b3VyUmVmZXJlbmNlZExpc3QsIFtcIm15XCIsIFwibmV3XCIsIFwiaXRlbXNcIl1dKScuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENvbmNhdGVuYXRlU3RyaW5nc0luVG9rZW5pemVkU3RyaW5nQXJyYXkgPSAoXG4gIGxpc3RUb2tlbjogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzIGluIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLiBPbmUgZWxlbWVudCBpbiB5b3VyIGFycmF5IGNvbnNpc3RzIG9mIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgc2luZ2xlIHRva2VuLlxuXG4gICAgWW91IGFyZSBsaWtlbHkgbXV0YXRpbmcgdGhlIHZhbHVlIGluc2lkZSB5b3VyIGFycmF5LCB3aGljaCBDREtUTiBjYW5ub3QgcmVzb2x2ZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBydW50aW1lIHZhbHVlLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBudW1iZXJWYWx1ZUFkZGVkVG9SZWZlcmVuY2VMaXN0ID0gKGxpc3RUb2tlbjogbnVtYmVyW10pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGFkZCBlbGVtZW50cyB0byBsaXN0IHRva2VuLCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIHVzZSB0b2tlbnMgdG8gcmVwcmVzZW50IHJ1bnRpbWUgdmFsdWVzIChlLmcuLCByZWZlcmVuY2VzIHRvIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2Ugb3IgZGF0YSBzb3VyY2VzKS4gTGlzdCB0b2tlbnMgZG9uJ3QgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlcyBiZWNhdXNlIHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBhdCBhcHBseSB0aW1lLCB3aGVyZWFzIHRva2VucyBhcmUgcHJlc2VudCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuXG4gICAgSWYgeW91IHdhbnQgdG8gYWRkIGEgdmFsdWUgdG8gYSB0b2tlbml6ZWQgbGlzdCwgdXNlIGEgVGVycmFmb3JtIGZ1bmN0aW9uIGluc3RlYWQuIEZvciBleGFtcGxlOiBGbi5jb25jYXQoW3lvdXJSZWZlcmVuY2VkTGlzdCwgWzQyLCA0MywgNDRdXSkuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IG1hcFZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobWFwVG9rZW46IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIG1hcCB0b2tlbiwgZ290OiAke21hcFRva2VufS4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBtZXJnZSBtdWx0aXBsZSBtYXBzLCBvciBpZiB5b3UgYWRkIGEgbmV3IGtleSB2YWx1ZSBwYWlyIHRvIHRoZSBtYXAgdG9rZW4uXG5cbiAgICBXZSB1c2UgdG9rZW5zIHRvIHJlcHJlc2VudCBydW50aW1lIHZhbHVlcyAoZS5nLiwgcmVmZXJlbmNlcyB0byBhdHRyaWJ1dGVzIG9mIHJlc291cmNlIG9yIGRhdGEgc291cmNlcykuIExpc3QgdG9rZW5zIGRvbid0IGNvbnRhaW4gdGhlIGFjdHVhbCB2YWx1ZXMgYmVjYXVzZSB0aG9zZSBhcmUgb25seSBhdmFpbGFibGUgYXQgYXBwbHkgdGltZSwgd2hlcmVhcyB0b2tlbnMgYXJlIHByZXNlbnQgZHVyaW5nIGNvbXBpbGUgdGltZS5cblxuICAgIEluc3RlYWQgb2YgYWRkaW5nIHRoZSB2YWx1ZSB0byB0aGUgdG9rZW5pemVkIG1hcCwgdXNlIGEgVGVycmFmb3JtIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZTogRm4ubWVyZ2UoW3lvdXJSZWZlcmVuY2VkTWFwLCB7IHlvdXI6ICd2YWx1ZScgfV0pLiBUaGlzIGNyZWF0ZXMgYSBuZXcgbWFwIFRva2VuIGZvciBhIHZhbHVlLCB3aGljaCBjb3VsZCBnZXQgcmVuZGVyZWQgYXM6XG4gICAgbWVyZ2UobXlfcmVzb3VyY2UucmVzb3VyY2VfbmFtZS5vbmVfc3BlY2lmaWNfbWFwX2F0dHJpYnV0ZSwgeyB5b3VyOiAnIHZhbHVlJyB9KWAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RDb25jYXRlbmF0ZVN0cmluZ3NJblRva2VuaXplZE1hcCA9ICh0b2tlbml6ZWRNYXA6IGFueSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgY29uY2F0ZW5hdGUgc3RyaW5ncyBpbiBhIHRva2VuaXplZCBtYXAsIGdvdDogJHt0b2tlbml6ZWRNYXB9LlxuXG4gICAgV2UgZXhwZWN0IHRoZSBlbGVtZW50cyBvZiBhIHRva2VuaXplZCBzdHJpbmcgYXJyYXkgdG8gYmUgYSBzaW5nbGUgdG9rZW4gc3RyaW5nLiBGb3IgZXhhbXBsZSwgW1wiJntUZlRva2VuW1Rva2VuLjFdfVwiXS4gQSBrZXkgaW4geW91ciBtYXAgY29uc2lzdHMgb2YgbW9yZSB0aGFuIGEgc3RyaW5nIHRva2VuIChlLmcuLCB0aGUgVG9rZW4gYW5kIGEgc3RhdGljIHN0cmluZyBvciBtdWx0aXBsZSBUb2tlbnMpLlxuXG4gICAgVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBtdXRhdGUgdGhlIGtleSBvZiB0aGUgbWFwLiBEbyBub3QgbXV0YXRlIHRva2VuaXplZCBNYXBzLCBiZWNhdXNlIGl0IG1ha2VzIGl0IGltcG9zc2libGUgZm9yIENES1ROIHRvIHRyYW5zbGF0ZSB0aGVtLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBkb2VzTm90SW1wbGVtZW50RGVwZW5kYWJsZVRyYWl0ID0gKGluc3RhbmNlOiBJRGVwZW5kYWJsZSkgPT5cbiAgbmV3IEVycm9yKGAke2luc3RhbmNlfSBkb2VzIG5vdCBpbXBsZW1lbnQgRGVwZW5kYWJsZVRyYWl0YCk7XG5cbmV4cG9ydCBjb25zdCBjYW5Pbmx5RW5jb2RlUG9zaXRpdmVJbnRlZ2VycyA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2FuIG9ubHkgZW5jb2RlIHBvc2l0aXZlIGludGVnZXJzIGludG8gVG9rZW5zLiBUaGlzIGlzIGEgYnVnIGluIENES1ROLCBwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGluZGV4VG9vTGFyZ2VUb0VuY29kZSA9IChpbmRleDogbnVtYmVyKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFJlY2VpdmVkIGFuIGluZGV4IHRvbyBsYXJnZSB0byBlbmNvZGUgaW50byBhIFRva2VuIDoke2luZGV4fS5cblxuICAgIFRoaXMgaGFwcGVucyBpZiB5b3UgaGF2ZSB0b28gbWFueSBUb2tlbnMgaW4gYSBzaW5nbGUgQ0RLVE4gYXBwbGljYXRpb24uIFRoaXMgY2FuIGFsc28gb2NjdXIgaWYgeW91IGFyZSBhY2NpZGVudGFsbHkgY3JlYXRpbmcgbnVtZXJpYyB0b2tlbnMgaW4gYW4gaW5maW5pdGUgbG9vcC4gRm9yIGV4YW1wbGUsIGNhbGxpbmcgJ1Rva2VuLmFzTnVtYmVyKCknIHRvbyBtYW55IHRpbWVzLlxuXG4gICAgSWYgeW91IHJlYWNoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIFRva2VucyAoYSBsaW1pdGF0aW9uIGltcG9zZWQgYnkgdGhlIHdheSB3ZSBlbmNvZGUgVG9rZW5zIGFuZCBzZXBhcmF0ZSB0aGVtIGZyb20gcmVhbCBudW1lcmljIHZhbHVlcykgeW91IGNhbiB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGJ5IGRpdmlkaW5nIGEgc2luZ2xlIGFwcGxpY2F0aW9uIGludG8gbXVsdGlwbGUgYXBwbGljYXRpb25zLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhcmdUb0ludHJpbnNpY011c3RCZVBsYWluVmFsdWUgPSAoXG4gIHZhbHVlOiBhbnksXG4gIGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW4gb25seSB1c2UgYSBwbGFpbiB2YWx1ZSAobm90IGEgZnVuY3Rpb24pIHdoaWxlIGNyZWF0aW5nIGFuIEludHJpbnNpYyB0b2tlbi4gV2UgcmVjZWl2ZWQgdGhlIHZhbHVlICcke3ZhbHVlfScgY3JlYXRlZCBhdDpcXG4ke2NyZWF0aW9uU3RhY2suam9pbihcbiAgICAgIFwiXFxuXCIsXG4gICAgKX0uIElmIHlvdSB3YW50IHRvIHVzZSBhIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHRoZSBMYXp5IGNsYXNzLiBGb3IgZXhhbXBsZTogIExhenkuYW55VmFsdWUoeyBwcm9kdWNlOiAoKSA9PiBcIkhlbGxvIFdvcmxkXCIgfSkuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGludHJpbnNpY05ld0Vycm9yID0gKG1lc3NhZ2U6IHN0cmluZywgY3JlYXRlZEF0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgJHttZXNzYWdlfVxcblRva2VuIGNyZWF0ZWQ6XFxuICAgIGF0ICR7Y3JlYXRlZEF0fVxcbkVycm9yIHRocm93bjpgKTtcblxuZXhwb3J0IGNvbnN0IHVuYWJsZVRvUmVzb2x2ZUNpcmN1bGFyUmVmZXJlbmNlID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgb2JqZWN0IHRyZWUgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UgYXQgJyR7cGF0aE5hbWV9Jy5cblxuVGhlIGRlcHRoIG9mIHlvdXIgb2JqZWN0IHRyZWUgaXMgb3ZlciAyMDAsIGluZGljYXRpbmcgeW91IHByb2JhYmx5IGhhdmUgYSBjeWNsaWNhbCByZWZlcmVuY2UuIEluc3BlY3QgdGhlIGNvbnN0cnVjdCBjcmVhdGluZyB0aGlzIGN5Y2xpYyByZWZlcmVuY2UgKG1vc3QgbGlrZWx5IGluICcke3BhdGhOYW1lfScpIGFuZCBlbnN1cmUgaXQgZG9lcyBub3QgaW5maW5pdGVseSBuZXN0IGNvbnN0cnVjdHMuYCk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RSZXNvbHZlRnVuY3Rpb24gPSAocGF0aE5hbWU6IHN0cmluZywgb2JqOiBhbnkpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvIHJlc29sdmUgYSBub24tZGF0YSBvYmplY3QgKGUuZy4sIGEgZnVuY3Rpb24pIGF0ICcke3BhdGhOYW1lfSc6ICR7b2JqfS4gT25seSB0b2tlbnMgYXJlIHN1cHBvcnRlZCBmb3IgbGF6eSBldmFsdWF0aW9uLlxuXG5JZiB5b3Ugd2FudCB0byB1c2UgYSBsYXppbHkgY29tcHV0ZWQgdmFsdWUsIHVzZSB0aGUgTGF6eSBjbGFzcy4gRm9yIGV4YW1wbGU6ICBMYXp5LnN0cmluZ1ZhbHVlKHsgcHJvZHVjZTogKCkgPT4gXCJIZWxsbyBXb3JsZFwiIH0pYCk7XG5cbmNvbnN0IExJU1RfRVJST1JfRVhQTEFOQVRJT04gPSBgSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBsaXN0cywgd2l0aCB2YWx1ZXMgdW5rbm93biB1bnRpbCBhZnRlciBydW50aW1lLCBhcyBhcnJheXMgd2l0aCBhIHNpbmdsZSBlbGVtZW504oCUIGEgc3RyaW5nIHRva2VuIChbXCJUb2tlbi4xXCJdKS5cblxuXG5XZSBkbyB0aGlzIGJlY2F1c2UgQ0RLVE4gZG9lcyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGF0IGNvbXBpbGUgdGltZSwgbWVhbmluZyBDREtUTiBoYXMgeWV0IHRvIGludm9rZSBUZXJyYWZvcm0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xvdWQgcHJvdmlkZXIuIENES1ROIGxhdGVyIGludm9rZXMgVGVycmFmb3JtIG9uIHRoZSBzeW50aGVzaXplZCBzdGF0aWMgSlNPTiBmaWxlLlxuXG5CZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBsaXN0IHdhcyBhY2Nlc3NlZCBhdCB0aGUgZmlyc3Qgb3IgbGFzdCBpbmRleCwgb3IgYXMgcGFydCBvZiBhIGxvb3AuIFRvIGF2b2lkIHRoaXMgYW1iaWd1aXR5OlxuXG4tIElmIHlvdSB3YW50IHRvIGFjY2VzcyBhIHNpbmd1bGFyIGl0ZW0sIHVzZSAnRm4uZWxlbWVudChsaXN0LCAwKScuIERvIG5vdCB1c2UgJ2xpc3RbMF0nLlxuLSBJZiB5b3Ugd2FudCB0byBsb29wIG92ZXIgdGhlIGxpc3QgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTGlzdChsaXN0KScuIERvIG5vdCB1c2UgYSAnZm9yJyBvciAnZm9yRWFjaCcgbG9vcC5cblxuTGVhcm4gbW9yZSBhYm91dCB0b2tlbnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbkxlYXJuIG1vcmUgYWJvdXQgaXRlcmF0b3JzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuY29uc3QgTUFQX0VSUk9SX0VYUExBTkFUSU9OID0gYFxuSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBtYXBzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgdG9rZW4uIEZvciBleGFtcGxlOiAneyBcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIjogXCJTdHJpbmcgTWFwIFRva2VuIFZhbHVlXCIgfScuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGVudHMgb2YgdGhlIG1hcCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBtYXAgd2FzIGFjY2Vzc2VkLCBvciB1c2VkIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBUbyBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtIHVzZSAnRm4ubG9va3VwKG1hcCwga2V5KScuIERvIG5vdCB1c2UgJ21hcFtrZXldJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBtYXAgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTWFwKG1hcCknLiBEbyBub3QgdXNlIGEgJ2ZvcicgbG9vcCBvciBpdGVyYXRlIG92ZXIgJ09iamVjdC5lbnRyaWVzKG1hcCknIHdpdGggJ2ZvckVhY2gnLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Rva2Vuc1xuTGVhcm4gbW9yZSBhYm91dCBpdGVyYXRvcnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9pdGVyYXRvcnNgO1xuXG5leHBvcnQgY29uc3QgZW5jb2RlZExpc3RUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBsaXN0IHRva2VuIHN0cmluZyBpbiBhIHNjYWxhciBzdHJpbmcgY29udGV4dC5cbiR7TElTVF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyTnVtYmVyQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgbnVtYmVyIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNDYW5ub3RCZVJlc29sdmVkID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvICdyZXNvbHZlKCknIGEgQ29uc3RydWN0IGF0ICcke3BhdGhOYW1lfScuXG5cblRoaXMgb2Z0ZW4gbWVhbnMgYW4gdW5pbnRlbmRlZCBjeWNsaWMgZGVwZW5kZW5jeSBpbiB5b3VyIGNvbnN0cnVjdCB0cmVlLCBsZWFkaW5nIHRvIHRoZSByZXNvbHV0aW9uIHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AgdGhhdCBmYWlscy5cblRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgc2NvcGUgcGFzc2VkIGludG8gdGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBwYXJ0IG9mIGl0cyBzdWJ0cmVlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHJlZmFjdG9yIHlvdXIgY29kZSB0byBhdm9pZCB0aGlzIGN5Y2xpYyBkZXBlbmRlbmN5IGJ5IGNoYW5naW5nIHRoZSBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdC5gKTtcblxuZXhwb3J0IGNvbnN0IG1hcEtleU11c3RSZXNvbHZlVG9TdHJpbmcgPSAoXG4gIHBhdGhOYW1lOiBzdHJpbmcsXG4gIGtleTogc3RyaW5nLFxuICByZXNvbHZlZEtleTogYW55LFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEF0IFwiJHtwYXRoTmFtZX1cIiBhIG1hcCB1c2VzIHRoZSBrZXkgXCIke2tleX1cIiwgbWVhbmluZyB0aGF0IGtleSBtdXN0IHJlc29sdmUgdG8gYSBzdHJpbmcuIEhvd2V2ZXIsIGl0IHJlc29sdmVzIHRvIGEgJHt0eXBlb2YgcmVzb2x2ZWRLZXl9IHdpdGggdGhlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICByZXNvbHZlZEtleSxcbiAgICApfS4gVG8gZml4IHRoaXMsIGNoYW5nZSB0aGUgVG9rZW4gdG8gcmVzb2x2ZSB0byBhIHN0cmluZy5gLFxuICApO1xuXG5jb25zdCB1bmtub3duVG9rZW5FeHBsYW5hdGlvbiA9IGBUaGlzIG1lYW5zIHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIFRva2VuIHZhbHVlIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBUb2tlbiBpcyBmcm9tIGFub3RoZXIgQ0RLIChpLmUuLCBBV1MgQ0RLLCBDREs4cywgZXRjLikgYW5kIGlzIHVua25vd24gdG8gdGhpcyBDREtUTiBBcHBsaWNhdGlvbi4gWW91IGVpdGhlciBuZWVkIHRvIG1ha2UgdGhlIG90aGVyIENESyByZXNvbHZlIHRoaXMgVG9rZW4gYmVmb3JlIENES1ROIHRyaWVzIHRvIHJlc29sdmUgaXQsIG9yIHdvcmsgYXJvdW5kIHVzaW5nIHRoaXMgVG9rZW4gYXQgYWxsLlxuXG5JZiB0aGlzIGVycm9yIG9jY3VycyB3aXRob3V0IGFub3RoZXIgQ0RLIChvciBhIHZhbHVlIGxvb2tpbmcgbGlrZSBhIFRva2VuKSBpbnZvbHZlZCwgcGxlYXNlIGZpbGUgYSBidWcuYDtcblxuZXhwb3J0IGNvbnN0IHVua25vd25OdW1iZXJUb2tlbkZvdW5kID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBFbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHVua25vd24gbnVtYmVyIFRva2VuIGZvdW5kLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1bnJlY29nbml6ZWRUb2tlbktleSA9IChrZXk6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVG9rZW4gS2V5ICcke2tleX0nLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWApO1xuXG5leHBvcnQgY29uc3QgSWRJbmNsdWRlc1VucmVzb2x2ZWRUb2tlbnMgPSAodW5yZXNvbHZlZFRva2Vuczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRoaXMgY29uc3RydWN0IChvciBpdHMgcGFyZW50IGNvbnN0cnVjdCkgaXMgY29uZmlndXJlZCB3aXRoIGFuIElEIHRoYXQgY29udGFpbnMgYSBUb2tlbjogJHt1bnJlc29sdmVkVG9rZW5zfS4gVGhpcyBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIElEcyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkgZHVyaW5nIHN5bnRoZXNpcy4gVG9rZW4gdmFsdWVzIGFyZSBvbmx5IGtub3duIGR1cmluZyB0aGUgYXBwbHkgc3RhZ2UsIHRoZXJlZm9yZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIElEcy4gUGxlYXNlIHVzZSBhIGNvbmNyZXRlIHZhbHVlIGZvciB5b3VyIGNvbnN0cnVjdHMgSUQgaW5zdGVhZC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlID0gKFxuICBzcmM6IHN0cmluZyxcbiAgZGVzdDogc3RyaW5nLFxuICBlcnJvcjogRXJyb3IsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQSBUZXJyYWZvcm1Bc3NldCB0cnlpbmcgdG8gemlwIGFyY2hpdmUgJyR7c3JjfScgaW50byAke2Rlc3R9IGZhaWxlZDogJHtlcnJvcn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdGVycmFmb3JtTW9kdWxlSGFzQ2hpbGRyZW4gPSAocGF0aE5hbWU6IHN0cmluZykgPT4ge1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUcnlpbmcgdG8gYWRkIGNoaWxkcmVuIHRvIGEgVGVycmFmb3JtTW9kdWxlIGF0ICcke3BhdGhOYW1lfScuIFRlcnJhZm9ybU1vZHVsZXMgY2Fubm90IGhhdmUgY2hpbGRyZW4sIGlmIHlvdSB3YW50IHRvIGdyb3VwIHJlc291cmNlcyBvciBjb25zdHJ1Y3RzIGluIGdlbmVyYWwgdG9nZXRoZXIgcGxlYXNlIHVzZSB0aGUgQ29uc3RydWN0cyBjbGFzcyBpbnN0ZWFkLiBTZWUgaHR0cHM6Ly9jZGsudGYvY29uc3RydWN0cyBmb3IgbW9yZSBkZXRhaWxzLmAsXG4gICk7XG59O1xuIl19
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7O0FBS0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFxQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxLQUFLLENBQ1AseURBQXlELGFBQWE7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLFVBQVUsY0FNbkI7QUFFRyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksS0FBSyxDQUNkLG1HQUFtRyxVQUFVO0NBQ2hILENBQ0UsQ0FBQztBQUNKLENBQUMsQ0FBQztBQU5XLFFBQUEseUJBQXlCLDZCQU1wQztBQUVLLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxLQUFLLENBQ1AsNkRBQTZELFNBQVM7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLG9CQUFvQix3QkFNN0I7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FDUDs7S0FFQyxDQUNGLENBQUM7QUFMUyxRQUFBLHVCQUF1QiwyQkFLaEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLEtBQUssQ0FDUCxrQkFBa0IsRUFBRSxzQ0FBc0MsVUFBVSwrRUFBK0UsT0FBTyxDQUFDLEdBQUcsRUFBRTs7Ozs7O0NBTW5LLENBQ0UsQ0FBQztBQVRTLFFBQUEsMEJBQTBCLDhCQVNuQztBQUVHLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQUUs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b0Isd0JBQzBDO0FBRXBFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDRGQUE0RixnQkFBZ0Isb09BQW9PLENBQ2pWLENBQUM7QUFIUyxRQUFBLDBCQUEwQiw4QkFHbkM7QUFFRyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQVcsRUFDWCxJQUFZLEVBQ1osS0FBWSxFQUNaLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCwyQ0FBMkMsR0FBRyxVQUFVLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FDaEYsQ0FBQztBQVBTLFFBQUEsMkJBQTJCLCtCQU9wQztBQUVHLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDN0QsT0FBTyxJQUFJLEtBQUssQ0FDZCxtREFBbUQsUUFBUSxxTkFBcU4sQ0FDalIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsMEJBQTBCLDhCQUlyQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgSURlcGVuZGFibGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiLi90ZXJyYWZvcm0tc3RhY2tcIjtcblxuZXhwb3J0IGNvbnN0IG5vQXBwRm91bmQgPSAoY29uc3RydWN0UGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYE5vIGFwcCBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nIChsaWtlbHkgYSBUZXJyYWZvcm1TdGFjaykuXG5UaGUgc2NvcGUgb2YgQ0RLVE4ncyBUZXJyYWZvcm1TdGFjayBjbGFzcyBpcyBhIHNpbmdsZSBBcHAgaW5zdGFuY2UgY3JlYXRlZCBieSAnY29uc3QgYXBwID0gbmV3IEFwcCgpJy4gVGhlIEFwcCBpcyB5b3VyIHByb2plY3QncyByb290LCBob2xkaW5nIHByb2plY3QgY29uZmlndXJhdGlvbiBhbmQgdmFsaWRhdGlvbnMuXG5MZWFybiBtb3JlIGFib3V0IHRoZSBBcHA6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jZGt0bi1hcmNoaXRlY3R1cmUjYXBwLWNsYXNzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNPdXRzaWRlT2ZTdGFja3MgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IGJ1bGxldExpc3QgPSBwYXRocy5tYXAoKHApID0+IGAgIC0gJHtwfWApLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYEZvdW5kIGNvbnN0cnVjdHMgb3V0c2lkZSBvZiBhIFRlcnJhZm9ybVN0YWNrIChkaWQgeW91IHBhc3Mgc2NvcGU9YXBwIGluc3RlYWQgb2Ygc2NvcGU9c3RhY2s/KTpcXG4ke2J1bGxldExpc3R9XG5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGFwcFZhbGlkYXRpb25GYWlsdXJlID0gKGVycm9yTGlzdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFwcC1sZXZlbCB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9XG5WYWxpZGF0aW9ucyBhbGxvdyBmb3IgZHluYW1pYyB2ZXJpZmljYXRpb24gb2YgeW91ciBwcm9qZWN0LlxuVG8gc2tpcCB2YWxpZGF0aW9ucywgYWRkICdza2lwVmFsaWRhdGlvbjogdHJ1ZScgdG8geW91ciBBcHAgY29uZmlnLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlclZlcnNpb25NaXNtYXRjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVmVyc2lvbiBtaXNtYXRjaCBkZXRlY3RlZDogWW91ciBwcm92aWRlciBiaW5kaW5ncyBhcmUgYnVpbHQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ0RLVG4uXG5VcGdyYWRlIHlvdXIgcHJlLWJ1aWx0IHByb3ZpZGVyIG9yIHJlLXJ1biBjZGt0biBnZXQgd2l0aCBhIG1vcmUgcmVjZW50IHZlcnNpb24gKD49IDAuMTApIG9mIHRoZSBjZGt0bi1jbGkuXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0T3V0T2ZTY29wZU9mQ0RLVEZKc29uID0gKGlkOiBzdHJpbmcsIGNvbmZpZ1BhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSB3YXMgY3JlYXRlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCAnJHtjb25maWdQYXRofScsIGJ1dCB3ZSBjYW5ub3QgZmluZCB0aGUgY2RrdGYuanNvbiB3aXRoaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke3Byb2Nlc3MuY3dkKCl9J1xuXG5UaGUgY2RrdGYuanNvbiBmaWxlIGlzIG5lZWRlZCB0byBlc3RhYmxpc2ggdGhlIGJhc2UgZm9yIHRoZSByZWxhdGl2ZSBwYXRoICh0aGUgJy4nIGluICcuL2Zvby9iYXInKS5cblxuUGxhY2UgYSBjZGt0Zi5qc29uIGF0IHRoZSByb290IG9mIHlvdXIgcHJvamVjdC4gTGVhcm4gbW9yZTogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0RXhwZWN0c0RpcmVjdG9yeSA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gZXhwZWN0cyBwYXRoIHRvIHBvaW50IHRvIGEgZGlyZWN0b3J5LiBJbnN0ZWFkLCB0aGlzIGZpbGUgd2FzIHBhc3NlZDogJyR7Y29uZmlnUGF0aH0nLiBQbGVhc2UgY29ycmVjdCB0aGUgcGF0aCB0byBwb2ludCB0byBhIGRpcmVjdG9yeS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRUeXBlTm90SW1wbGVtZW50ZWQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEFzc2V0IHR5cGUgaXMgbm90IGltcGxlbWVudGVkLlxuUG9zc2libGUgQXNzZXQgdHlwZXMgaW5jbHVkZTogRklMRSwgRElSRUNUT1JZLCBhbmQgQVJDSElWRS5cblRha2Ugb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBBc3NldFR5cGUgRW51bS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljQmxvY2tOb3RTdXBwb3J0ZWQgPSAoX2ZvcmVhY2hFeHByZXNzaW9uOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgV2UgZG8gbm90IHN1cHBvcnQgZGlyZWN0bHkgcmVzb2x2aW5nIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrLiBEeW5hbWljIGJsb2NrcyBhcmUgb25seSBzdXBwb3J0ZWQgb24gYmxvY2sgYXR0cmlidXRlcyBvZiByZXNvdXJjZXMsIGRhdGEgc291cmNlcywgYW5kIHByb3ZpZGVycy5cblxuWW91IGNhbiBjcmVhdGUgYSBUZXJyYWZvcm1EeW5hbWljQmxvY2sgYnkgY2FsbGluZyAnLmR5bmFtaWMnIG9uIGEgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGFuY2UuXG5cblRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3YXMgdXNlZCBmb3IgdGhlIGR5bmFtaWMgYmxvY2s6IC5keW5hbWljKHtcbiAgJHtfZm9yZWFjaEV4cHJlc3Npb259XG59KVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWRUb2tlbkluQ29uc3RydWN0SWQgPSAoaWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IHVzZSBhIHRva2VuIChlLmcuLCBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUpIGFzIHRoZSBpZCBvZiBhIGNvbnN0cnVjdC4gSWRzIG9mIGNvbnN0cnVjdHMgbXVzdCBiZSBrbm93biBhdCBzeW50aGVzaXMgdGltZSwgYW5kIHRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biB3aGVuIFRlcnJhZm9ybSBydW5zLiBQbGVhc2UgdXNlIGEgY29uY3JldGUgdmFsdWUgZm9yIHlvdXIgY29uc3RydWN0cyBJRCBpbnN0ZWFkLlxuWW91IHBhc3NlZCB0aGUgZm9sbG93aW5nIGlkOiBcIiR7aWR9XCJcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRoQ291bnQgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW5ub3QgY3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSByZXNvdXJjZSB3aXRoIGEgY291bnQgYXJndW1lbnQuXG5JbnN0ZWFkLCByZXVzZSB0aGlzIHJlc291cmNlJ3MgVGVycmFmb3JtQ291bnQgaW5zdGFuY2UgaW4gdGhlIHJlc291cmNlIHlvdSB3YW50IHRvIHVzZSBhcyBhbiBpdGVyYXRvci5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGFuIGl0ZXJhdG9yIHRvIHBvcHVsYXRlIGEgbGlzdCBhdHRyaWJ1dGUsIHJlcGxhY2UgdGhlIGNvdW50IG9uIHRoZSByZXNvdXJjZSB3aXRoIGFuIGl0ZXJhdG9yIHBhc3NlZCBpbnRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRob3V0Rm9yRWFjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aG91dCBhIGZvckVhY2ggYXJndW1lbnQuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBtb3JlIGluc3RhbmNlcyBvZiB0aGlzIHJlc291cmNlLCBwYXNzIGFuIGl0ZXJhdG9yIHRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50IG9mIHRoZSByZXNvdXJjZSBmaXJzdC5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVzV2l0aFNhbWVBbGlhcyA9IChhbGlhczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE11bHRpcGxlIHByb3ZpZGVycyBoYXZlIHRoZSBzYW1lIGFsaWFzOiBcIiR7YWxpYXN9XCJcbkVhY2ggcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGFsaWFzIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBwcm92aWRlcnMgb2YgdGhlIHNhbWUgdHlwZSB0byBtb2R1bGVzLlxuICBgKTtcblxuZXhwb3J0IGNvbnN0IG1vdmVUYXJnZXRBbHJlYWR5U2V0ID0gKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZnJpZW5kbHlVbmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgdGhlIGNvbnN0cnVjdCAke2ZyaWVuZGx5VW5pcXVlSWR9LlxuVGFyZ2V0IG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNhbWUgc3RhY2suYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0Tm90U2V0ID0gKHRhcmdldDogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0IFwiJHt0YXJnZXR9XCIgaGFzIG5vdCBiZWVuIHNldC5cbllvdSB0cmllZCB0byBtb3ZlIGEgcmVzb3VyY2Ugd2l0aG91dCBhIHRhcmdldC5cbkNhbGwgLmFkZE1vdmVUYXJnZXQoXCIke3RhcmdldH1cIikgb24gdGhlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgcmVzb3VyY2UgdG8uXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldHMgKGluIGNhc2UgeW91IGhhZCBhIHR5cG8pOlxuJHtlbnRyaWVzfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUgPSAoXG4gIG1vdmVUYXJnZXQ6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZGVzdGluYXRpb25SZXNvdXJjZVR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBXZSBkbyBub3Qgc3VwcG9ydCBtb3ZpbmcgcmVzb3VyY2VzIHRvIGEgZGlmZmVyZW50IHR5cGUuXG5cblRoZSBkZXN0aW5hdGlvbiBcIiR7bW92ZVRhcmdldH1cIidzIHJlc291cmNlIHR5cGUgJHtkZXN0aW5hdGlvblJlc291cmNlVHlwZX0gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXNvdXJjZSB0eXBlICgke29yaWdpbmFsUmVzb3VyY2VUeXBlfSkgeW91IGFyZSB0cnlpbmcgdG8gbW92ZS5cblxuSWYgdGhpcyB3YXMgaW50ZW50aW9uYWwsIHRyeSBpbXBvcnRpbmcgdGhlIGV4aXN0aW5nIHJlc291cmNlIGludG8geW91ciB0YXJnZXQgaW5zdGVhZC4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjaW1wb3J0aW5nLXJlc291cmNlc1xuXG5Ob3RlIHRoYXQgeW91IG11c3QgbWFudWFsbHkgcmVtb3ZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBmcm9tIHlvdXIgc3RhdGUgZmlsZSBhZnRlciBpbXBvcnRpbmcgaXQuIFVzZSB0aGUgXCJ0ZXJyYWZvcm0gc3RhdGUgcm1cIiBjb21tYW5kIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBzdGFjayB5b3UgZGVmaW5lZCB0aGlzIHJlc291cmNlIGluLiBMZWFybiBtb3JlOlxuaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2xpL2NvbW1hbmRzL3N0YXRlL3JtXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0QW5kSWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nVGFyZ2V0OiBzdHJpbmcsXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbk1vdmUgdGFyZ2V0OiBcIiR7ZXhpc3RpbmdUYXJnZXR9XCJcbk1vdmUgYnkgaWQ6IHtcbiAgZnJvbTogJHtuZXdNb3ZlLmZyb219XG4gIHRvOiAke25ld01vdmUudG99XG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbiAgbmV3TW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbikgPT5cbiAgbmV3IEVycm9yKGBcblRoZSByZXNvdXJjZSAke2lkfSBoYXMgYmVlbiBnaXZlbiB0d28gZGlmZmVyZW50IG1vdmUgb3BlcmF0aW9ucy5cblxue1xuICBmcm9tOiAke2V4aXN0aW5nTW92ZS5mcm9tfVxuICB0bzogJHtleGlzdGluZ01vdmUudG99XG59XG57XG4gIGZyb206ICR7bmV3TW92ZS5mcm9tfVxuICB0bzogJHtuZXdNb3ZlLnRvfSAoUmVzb3VyY2UgY2FsbGluZyB0aGUgbW92ZSB0byBvcGVyYXRpb24pXG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0ID0gKFxuICByZXNvdXJjZUlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZVRhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlVGFyZ2V0OiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgVGhlIHJlc291cmNlICR7cmVzb3VyY2VJZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlVGFyZ2V0czogXCIke25ld01vdmVUYXJnZXR9XCIgYW5kIFwiJHtleGlzdGluZ01vdmVUYXJnZXR9XCJcblxuQSByZXNvdXJjZSBjYW4gb25seSBiZSBtb3ZlZCBvbmNlIHBlciBwbGFuL2FwcGx5LlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9leGFtcGxlcy1hbmQtZ3VpZGVzL3JlZmFjdG9yaW5nIzp+OnRleHQ9TW92aW5nJTIwJTI2JTIwUmVuYW1pbmclMjBSZXNvdXJjZXMlMjBXaXRoaW4lMjBhJTIwU3RhY2tcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tDb250YWluc0Rpc2FsbG93ZWRDaGFyID0gKFxuICBzdGFja0lkOiBzdHJpbmcsXG4gIGludmFsaWRDaGFyOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBUZXJyYWZvcm0gc3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYW4gaW52YWxpZCBnbG9iIGNoYXJhY3RlcjogXCIke2ludmFsaWRDaGFyfVwiLlxuXG5HbG9iIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RhY2sgbmFtZXMgYmVjYXVzZSB3ZSB1c2UgdGhlbSB0byBkZXBsb3kgYW5kIGRlc3Ryb3kgbXVsdGlwbGUgc3RhY2tzLiBGb3IgZXhhbXBsZSwgJ2Nka3RuIGRlcGxveSBcXGAqLXByb2R1Y3Rpb25cXGAnIGRlcGxveXMgYWxsIHN0YWNrcyB3aXRoIG5hbWVzIHRoYXQgZW5kIGluICctcHJvZHVjdGlvbicuXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrSWRDb250YWluc1doaXRlc3BhY2UgPSAoc3RhY2tJZDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgVGVycmFmb3JtU3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblxuUGxlYXNlIHJlbW92ZSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHlvdXIgVGVycmFmb3JtU3RhY2sgaWQsIGxpa2Ugc286IFwiJHtzdGFja0lkLnJlcGxhY2UoXG4gICAgL1xccy9nLFxuICAgIFwiXCIsXG4gICl9XCJcbmApO1xuXG5leHBvcnQgY29uc3Qgbm9TdGFja0ZvckNvbnN0cnVjdCA9IChjb25zdHJ1Y3RQYXRoOiBzdHJpbmcsIGhpbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBObyBzdGFjayBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nJHtoaW50fVxuXG5Zb3UgY2FuIG9ubHkgdXNlIGNvbnN0cnVjdHMgYXMgcGFydCBvZiBhIFRlcnJhZm9ybVN0YWNrLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IENvbnN0cnVjdHMgdnMuIFRlcnJhZm9ybVN0YWNrcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIzp+OnRleHQ9Q29uc3RydWN0cyUyMHZzLiUyMFN0YWNrc1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IChcbiAgdGhpc1N0YWNrOiBUZXJyYWZvcm1TdGFjayxcbiAgZGVwZW5kZW5jeTogVGVycmFmb3JtU3RhY2ssXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGFkZCBkZXBlbmRlbmN5ICR7ZGVwZW5kZW5jeX0gdG8gJHt0aGlzU3RhY2t9LCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cblxuVGVycmFmb3JtU3RhY2sgJHtkZXBlbmRlbmN5fSBpcyBhbHJlYWR5IGRlcGVuZGVudCBvbiAke3RoaXNTdGFja30gZGlyZWN0bHksIG9yIGRlcGVuZGVudCBvbiBhIFRlcnJhZm9ybVN0YWNrIHdpdGhpbiAke3RoaXNTdGFja30uXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeSByZWZlcmVuY2VzLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3N0YWNrcyM6fjp0ZXh0PUNyb3NzJTJEU3RhY2slMjBSZWZlcmVuY2VzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUgPSAoZXJyb3JMaXN0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuXG5JZiB5b3Ugd2lzaCB0byBpZ25vcmUgdGhlc2UgdmFsaWRhdGlvbnMsIHBhc3MgJ3NraXBWYWxpZGF0aW9uOiB0cnVlJyB0byB5b3VyIEFwcCBjb25maWd1cmF0aW9uLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeSA9IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeS5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3RpbmcuZnVsbFN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5zeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuVGVzdGluZy5mdWxsU3ludGggcmV0dXJucyBhIGZpbGUgcGF0aCB0byBhIHRlbXBvcmFyeSB0ZXN0aW5nIGVudmlyb25tZW50LiBUZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c2ApO1xuXG5leHBvcnQgY29uc3QgbWF0Y2hlcnNGb3VuZEVycm9yc0luU3RhY2sgPSAoXG4gIGVycm9yQ291bnQ6IGFueSxcbiAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gIGRpYWdub3N0aWNzOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgRm91bmQgJHtlcnJvckNvdW50fSBFcnJvcnMgaW4gc3RhY2sgJHtzdGFja05hbWV9OiAke2RpYWdub3N0aWNzfVxuXG5UaGVzZSBlcnJvcnMgYXJlIG5vdCB0ZXN0IGZhaWx1cmVzLCBidXQgaXNzdWVzIHdpdGggdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtU3RhY2sgYmVpbmcgdGVzdGVkLiBGaXggdGhlIGFib3ZlIGlzc3VlcyBiZWZvcmUgcnVubmluZyB5b3VyIHRlc3RzIGFnYWluLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBqZXN0Tm90SW5zdGFudGlhdGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBKZXN0IHdhcyBub3QgcHJvcGVybHkgaW5zdGFudGlhdGVkLlxuXG5FbnN1cmUgeW91IGhhdmUgYSAnc2V0dXAuanMnIGZpbGUgaW4geW91ciBwcm9qZWN0J3MgZGlyZWN0b3J5IHRoYXQgY2FsbHMgJ2Nka3RuLlRlc3Rpbmcuc2V0dXBKZXN0KCknLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgZXhwZWN0Tm90R2xvYmFsbHlBY2Nlc3NpYmxlID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgZXhwZWN0IGZ1bmN0aW9uIGlzIG5vdCBnbG9iYWxseSBhY2Nlc3NpYmxlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFN0YWNrID0gKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBzdGFja0NvbnRlbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gc3RyaW5nIHBhc3NlZDogJHtzdGFja0NvbnRlbnR9XG5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykgdG8gJyR7ZnVuY3Rpb25OYW1lfScsIG5vdCBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuXG5UZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay4gQ0RLVE4gY2FuIHVzZSBhc3NlcnRpb25zIHdpdGggdGhpcyBKU09OIHRvIGNoZWNrIHRoZSBjb21wb3NpdGlvbiBvZiB5b3VyIHN0YWNrcywgbGlrZSBzbzogXCJUZXN0aW5nLnRvSGF2ZVJlc291cmNlKFRlc3Rpbmcuc3ludGgoJ1RlcnJhZm9ybVN0YWNrIGluc3RhbmNlJyksIFMzQnVja2V0KVwiXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c1xuYCk7XG5cbmV4cG9ydCBjb25zdCB0YXJnZXROb3RSZXNvbHZhYmxlV2l0aE92ZXJyaWRlcyA9ICh0YXJnZXQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBUYXJnZXQgKCR7dGFyZ2V0fSkgY2Fubm90IGJlIGEgcmVzb2x2YWJsZSB0b2tlbiBpZiB5b3Ugc3BlY2lmaWVkIG92ZXJyaWRlcy4gUmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHlvdSBhcmUgb3ZlcnJpZGluZyB3aXRoIGEgc3RhdGljIHZhbHVlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IFRva2VucywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbmApO1xuXG5leHBvcnQgY29uc3Qgc291cmNlT3JUYXJnZXROb3RBbk9iamVjdCA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIHNvdXJjZVR5cGU6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIHRhcmdldFR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBBbiBpc3N1ZSBvY2N1cnJlZCBkdXJpbmcgdGhlIHN5bnRoZXNpemF0aW9uIG9mIHlvdXIgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24uXG5cbkJvdGggdGhlIHNvdXJjZSBlbGVtZW50ICgke3NvdXJjZX0pIGFuZCBpdHMgY29udGFpbmluZyB0YXJnZXQgZWxlbWVudCAoJHt0YXJnZXR9KSBtdXN0IGJlIG9iamVjdHMuXG5cblR5cGUgb2Ygc291cmNlOiAke3NvdXJjZVR5cGV9XG5UeXBlIG9mIHRhcmdldDogJHt0YXJnZXRUeXBlfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3REZXBlbmRlbmN5QmVsb3dWMTAgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFZlcnNpb24gbWlzbWF0Y2ghIENES1ROIHZlcnNpb24gMC42IHJlcXVpcmVzIHlvdXIgY29uc3RydWN0cyB2ZXJzaW9uIHRvIGJlIHYxMCBvciBhYm92ZS5cblxuVXBkYXRlIHlvdXIgY29uc3RydWN0cyBkZXBlbmRlbmN5OiBodHRwczovL2Nka3RuLmlvL2RvY3MvcmVsZWFzZS91cGdyYWRlLWd1aWRlLXYwLTZcbmApO1xuXG5leHBvcnQgY29uc3QgY2xvdWRCYWNrZW5kV29ya3NwYWNlSXNOb3REZWZpbmVkQnlOYW1lID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgQ2xvdWQgYmFja2VuZCBvbmx5IHN1cHBvcnRzIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMgaWYgdGhlIHdvcmtzcGFjZSBpcyBkZWZpbmVkIGJ5IG5hbWUgKG5vdCBieSB0YWdzKS5cblxuVG8gdXNlIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMsIHJlcGxhY2UgYWxsIG1lbnRpb25zIG9mICdUYWdnZWRDbG91ZFdvcmtzcGFjZXMnIHdpdGggJ05hbWVkQ2xvdWRXb3Jrc3BhY2UnLCBsaWtlIHNvOlxuXG5uZXcgQ2xvdWRCYWNrZW5kKHN0YWNrLCB7XG4gIC4uLlxuICB3b3Jrc3BhY2VzOiBuZXcgTmFtZWRDbG91ZFdvcmtzcGFjZShcIm15LWFwcFwiKSxcbn0pO1xuXG5UbyBsZWFybiBtb3JlIGFib3V0IFJlbW90ZSBCYWNrZW5kcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZW1vdGUtYmFja2VuZHNcbmApO1xuXG5leHBvcnQgY29uc3QgdmFsdWVDb250YWluc1VuZXNjYXBlZFF1b3RlcyA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdXIgdmFsdWUsICcke3ZhbHVlfScsIGhhcyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlcyBpbiBpdCwgc28gaXQgY2Fubm90IGJlIHVzZWQgYXMgYSB2YWx1ZS5cblxuVG8gc2FmZWx5IHVzZSB0aGUgdmFsdWUsIHVzZSBGbi5yYXdTdHJpbmcgb24geW91ciBzdHJpbmcsIGxpa2Ugc286XG5cbkZuLnJhd1N0cmluZygnJHt2YWx1ZX0nKVxuXG5Eb2luZyB0aGlzIGVuc3VyZXMgQ0RLVE4gYW5kIFRlcnJhZm9ybSBpbnRlcnByZXQgeW91ciB2YWx1ZXMgY29ycmVjdGx5LlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IGJ1aWx0IGluIFRlcnJhZm9ybSBmdW5jdGlvbnMgd2l0aGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Z1bmN0aW9uc1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY291bnRlcmVkQW5ub3RhdGlvbldpdGhMZXZlbEVycm9yID0gKGVycm9yczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYEVuY291bnRlcmVkIEFubm90YXRpb25zIHdpdGggbGV2ZWwgXCJFUlJPUlwiOlxcbiR7ZXJyb3JzfVxuXG5FaXRoZXIgZml4IHRoZSBpc3N1ZXMgYWJvdmUsIG9yIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0RLVEZfQ09OVElOVUVfU1lOVEhfT05fRVJST1JfQU5OT1RBVElPTlMgdG8gaWdub3JlIHRoZXNlIGFubm90YXRpb25zLlxuYCk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZFN0cmluZ09yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAnJHt2YWx1ZX0nIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBub3IgYSB0b2tlbi4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgc3RyaW5ncyBvciB0b2tlbnMgcmVzb2x2aW5nIHRvIHN0cmluZ3MuIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIGFjY29yZGluZ2x5LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZE51bWJlck9yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgbm9yIGEgdG9rZW4uIFRoaXMgZnVuY3Rpb24gb25seSBhY2NlcHRzIG51bWJlcnMgb3IgdG9rZW5zIHJlc29sdmluZyB0byBudW1iZXJzLiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSBhY2NvcmRpbmdseS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlID0gKFxuICB2YWx1ZTogYW55W10sXG4gIHBvc2l0aW9uOiBudW1iZXIsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEVsZW1lbnQgaW4gbGlzdCAke3ZhbHVlfSBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBub3QgdGhlIHJpZ2h0IHR5cGU6ICR7ZXJyb3J9LlxuICAgIFBsZWFzZSBlbnN1cmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGlzIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvblJlY2VpdmVkV3JvbmdOdW1iZXJPZkFyZ3MgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnVmFsaWRhdG9yc0xlbmd0aDogbnVtYmVyLFxuICBhcmdzTGVuZ3RoOiBudW1iZXIsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRnVuY3Rpb24gJHtuYW1lfSB0YWtlcyAke2FyZ1ZhbGlkYXRvcnNMZW5ndGh9IGFyZ3VtZW50cywgYnV0ICR7YXJnc0xlbmd0aH0gd2VyZSBwcm92aWRlZC4gUGxlYXNlIGFkZCB0aGUgbWlzc2luZyBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUgPSAoXG4gIGFyZ051bWJlcjogbnVtYmVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFyZ3VtZW50ICR7YXJnTnVtYmVyfSBvZiAke25hbWV9IGZhaWxlZCB0aGUgdmFsaWRhdGlvbjogJHtlcnJvcn0uIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHBhc3MgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q2FsY0lkRm9yRW1wdHlTZXRPZkNvbXBvbmVudHMgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFVuYWJsZSB0byBjYWxjdWxhdGUgYSB1bmlxdWUgaWQgZm9yIGFuIGVtcHR5IHNldCBvZiBjb21wb25lbnRzLlxuXG4gICAgVGhpcyBoYXBwZW5zIHdoZW4geW91IGF0dGVtcHQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkLCBidXQgZG8gbm90IHBhc3MgaW4gYW55IGNvbnN0cnVjdCBub2RlIGlkcy4gVGhpcyBtZWFucyB5b3VyIGNvbnN0cnVjdCBsaWtlbHkgaGFzIG5vIHBhcmVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuXG5cbiAgICBQbGVhc2UgbWFrZSBzdXJlIHlvdXIgY29uc3RydWN0IGhhcyBhIHBhcmVudC4gRm9yIGV4YW1wbGU6ICduZXcgQXBwKHRoaXMpJyBvciAnbmV3IFRlcnJhZm9ybVN0YWNrKHRoaXMsICdzdGFjaycpJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChsaXN0VG9rZW46IHN0cmluZ1tdKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbGlzdCB0b2tlbiwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLlxuXG4gICAgT25lIGVsZW1lbnQgaW4geW91ciBhcnJheSBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUuIFRvIGFkZCB2YWx1ZXMgdG8gYSB0b2tlbml6ZWQgbGlzdCwgdXNlIFRlcnJhZm9ybSBmdW5jdGlvbnMgaW5zdGVhZC4gRm9yIGV4YW1wbGU6ICdGbi5jb25jYXQoW3lvdXJSZWZlcmVuY2VkTGlzdCwgW1wibXlcIiwgXCJuZXdcIiwgXCJpdGVtc1wiXV0pJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q29uY2F0ZW5hdGVTdHJpbmdzSW5Ub2tlbml6ZWRTdHJpbmdBcnJheSA9IChcbiAgbGlzdFRva2VuOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGNvbmNhdGVuYXRlIHN0cmluZ3MgaW4gYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5LCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uIE9uZSBlbGVtZW50IGluIHlvdXIgYXJyYXkgY29uc2lzdHMgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzaW5nbGUgdG9rZW4uXG5cbiAgICBZb3UgYXJlIGxpa2VseSBtdXRhdGluZyB0aGUgdmFsdWUgaW5zaWRlIHlvdXIgYXJyYXksIHdoaWNoIENES1ROIGNhbm5vdCByZXNvbHZlIGludG8gdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUgdmFsdWUuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IG51bWJlclZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobGlzdFRva2VuOiBudW1iZXJbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGxpc3QgdG9rZW4sIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgdXNlIHRva2VucyB0byByZXByZXNlbnQgcnVudGltZSB2YWx1ZXMgKGUuZy4sIHJlZmVyZW5jZXMgdG8gYXR0cmlidXRlcyBvZiByZXNvdXJjZSBvciBkYXRhIHNvdXJjZXMpLiBMaXN0IHRva2VucyBkb24ndCBjb250YWluIHRoZSBhY3R1YWwgdmFsdWVzIGJlY2F1c2UgdGhvc2UgYXJlIG9ubHkgYXZhaWxhYmxlIGF0IGFwcGx5IHRpbWUsIHdoZXJlYXMgdG9rZW5zIGFyZSBwcmVzZW50IGR1cmluZyBjb21waWxlIHRpbWUuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhZGQgYSB2YWx1ZSB0byBhIHRva2VuaXplZCBsaXN0LCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24gaW5zdGVhZC4gRm9yIGV4YW1wbGU6IEZuLmNvbmNhdChbeW91clJlZmVyZW5jZWRMaXN0LCBbNDIsIDQzLCA0NF1dKS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbWFwVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChtYXBUb2tlbjogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbWFwIHRva2VuLCBnb3Q6ICR7bWFwVG9rZW59LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG1lcmdlIG11bHRpcGxlIG1hcHMsIG9yIGlmIHlvdSBhZGQgYSBuZXcga2V5IHZhbHVlIHBhaXIgdG8gdGhlIG1hcCB0b2tlbi5cblxuICAgIFdlIHVzZSB0b2tlbnMgdG8gcmVwcmVzZW50IHJ1bnRpbWUgdmFsdWVzIChlLmcuLCByZWZlcmVuY2VzIHRvIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2Ugb3IgZGF0YSBzb3VyY2VzKS4gTGlzdCB0b2tlbnMgZG9uJ3QgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlcyBiZWNhdXNlIHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBhdCBhcHBseSB0aW1lLCB3aGVyZWFzIHRva2VucyBhcmUgcHJlc2VudCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuXG4gICAgSW5zdGVhZCBvZiBhZGRpbmcgdGhlIHZhbHVlIHRvIHRoZSB0b2tlbml6ZWQgbWFwLCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24uIEZvciBleGFtcGxlOiBGbi5tZXJnZShbeW91clJlZmVyZW5jZWRNYXAsIHsgeW91cjogJ3ZhbHVlJyB9XSkuIFRoaXMgY3JlYXRlcyBhIG5ldyBtYXAgVG9rZW4gZm9yIGEgdmFsdWUsIHdoaWNoIGNvdWxkIGdldCByZW5kZXJlZCBhczpcbiAgICBtZXJnZShteV9yZXNvdXJjZS5yZXNvdXJjZV9uYW1lLm9uZV9zcGVjaWZpY19tYXBfYXR0cmlidXRlLCB7IHlvdXI6ICcgdmFsdWUnIH0pYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENvbmNhdGVuYXRlU3RyaW5nc0luVG9rZW5pemVkTWFwID0gKHRva2VuaXplZE1hcDogYW55KSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzIGluIGEgdG9rZW5pemVkIG1hcCwgZ290OiAke3Rva2VuaXplZE1hcH0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLiBBIGtleSBpbiB5b3VyIG1hcCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzdHJpbmcgdG9rZW4gKGUuZy4sIHRoZSBUb2tlbiBhbmQgYSBzdGF0aWMgc3RyaW5nIG9yIG11bHRpcGxlIFRva2VucykuXG5cbiAgICBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG11dGF0ZSB0aGUga2V5IG9mIHRoZSBtYXAuIERvIG5vdCBtdXRhdGUgdG9rZW5pemVkIE1hcHMsIGJlY2F1c2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgQ0RLVE4gdG8gdHJhbnNsYXRlIHRoZW0uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGRvZXNOb3RJbXBsZW1lbnREZXBlbmRhYmxlVHJhaXQgPSAoaW5zdGFuY2U6IElEZXBlbmRhYmxlKSA9PlxuICBuZXcgRXJyb3IoYCR7aW5zdGFuY2V9IGRvZXMgbm90IGltcGxlbWVudCBEZXBlbmRhYmxlVHJhaXRgKTtcblxuZXhwb3J0IGNvbnN0IGNhbk9ubHlFbmNvZGVQb3NpdGl2ZUludGVnZXJzID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW4gb25seSBlbmNvZGUgcG9zaXRpdmUgaW50ZWdlcnMgaW50byBUb2tlbnMuIFRoaXMgaXMgYSBidWcgaW4gQ0RLVE4sIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaW5kZXhUb29MYXJnZVRvRW5jb2RlID0gKGluZGV4OiBudW1iZXIpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgUmVjZWl2ZWQgYW4gaW5kZXggdG9vIGxhcmdlIHRvIGVuY29kZSBpbnRvIGEgVG9rZW4gOiR7aW5kZXh9LlxuXG4gICAgVGhpcyBoYXBwZW5zIGlmIHlvdSBoYXZlIHRvbyBtYW55IFRva2VucyBpbiBhIHNpbmdsZSBDREtUTiBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYWxzbyBvY2N1ciBpZiB5b3UgYXJlIGFjY2lkZW50YWxseSBjcmVhdGluZyBudW1lcmljIHRva2VucyBpbiBhbiBpbmZpbml0ZSBsb29wLiBGb3IgZXhhbXBsZSwgY2FsbGluZyAnVG9rZW4uYXNOdW1iZXIoKScgdG9vIG1hbnkgdGltZXMuXG5cbiAgICBJZiB5b3UgcmVhY2ggdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgVG9rZW5zIChhIGxpbWl0YXRpb24gaW1wb3NlZCBieSB0aGUgd2F5IHdlIGVuY29kZSBUb2tlbnMgYW5kIHNlcGFyYXRlIHRoZW0gZnJvbSByZWFsIG51bWVyaWMgdmFsdWVzKSB5b3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgYnkgZGl2aWRpbmcgYSBzaW5nbGUgYXBwbGljYXRpb24gaW50byBtdWx0aXBsZSBhcHBsaWNhdGlvbnMuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFyZ1RvSW50cmluc2ljTXVzdEJlUGxhaW5WYWx1ZSA9IChcbiAgdmFsdWU6IGFueSxcbiAgY3JlYXRpb25TdGFjazogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgY3JlYXRlZEF0ID0gY3JlYXRpb25TdGFjaz8ubGVuZ3RoXG4gICAgPyBgIGNyZWF0ZWQgYXQ6XFxuJHtjcmVhdGlvblN0YWNrLmpvaW4oXCJcXG5cIil9YFxuICAgIDogXCJcIjtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgWW91IGNhbiBvbmx5IHVzZSBhIHBsYWluIHZhbHVlIChub3QgYSBmdW5jdGlvbikgd2hpbGUgY3JlYXRpbmcgYW4gSW50cmluc2ljIHRva2VuLiBXZSByZWNlaXZlZCB0aGUgdmFsdWUgJyR7dmFsdWV9JyR7Y3JlYXRlZEF0fS4gSWYgeW91IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSB1c2UgdGhlIExhenkgY2xhc3MuIEZvciBleGFtcGxlOiAgTGF6eS5hbnlWYWx1ZSh7IHByb2R1Y2U6ICgpID0+IFwiSGVsbG8gV29ybGRcIiB9KS5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuYWJsZVRvUmVzb2x2ZUNpcmN1bGFyUmVmZXJlbmNlID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgb2JqZWN0IHRyZWUgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UgYXQgJyR7cGF0aE5hbWV9Jy5cblxuVGhlIGRlcHRoIG9mIHlvdXIgb2JqZWN0IHRyZWUgaXMgb3ZlciAyMDAsIGluZGljYXRpbmcgeW91IHByb2JhYmx5IGhhdmUgYSBjeWNsaWNhbCByZWZlcmVuY2UuIEluc3BlY3QgdGhlIGNvbnN0cnVjdCBjcmVhdGluZyB0aGlzIGN5Y2xpYyByZWZlcmVuY2UgKG1vc3QgbGlrZWx5IGluICcke3BhdGhOYW1lfScpIGFuZCBlbnN1cmUgaXQgZG9lcyBub3QgaW5maW5pdGVseSBuZXN0IGNvbnN0cnVjdHMuYCk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RSZXNvbHZlRnVuY3Rpb24gPSAocGF0aE5hbWU6IHN0cmluZywgb2JqOiBhbnkpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvIHJlc29sdmUgYSBub24tZGF0YSBvYmplY3QgKGUuZy4sIGEgZnVuY3Rpb24pIGF0ICcke3BhdGhOYW1lfSc6ICR7b2JqfS4gT25seSB0b2tlbnMgYXJlIHN1cHBvcnRlZCBmb3IgbGF6eSBldmFsdWF0aW9uLlxuXG5JZiB5b3Ugd2FudCB0byB1c2UgYSBsYXppbHkgY29tcHV0ZWQgdmFsdWUsIHVzZSB0aGUgTGF6eSBjbGFzcy4gRm9yIGV4YW1wbGU6ICBMYXp5LnN0cmluZ1ZhbHVlKHsgcHJvZHVjZTogKCkgPT4gXCJIZWxsbyBXb3JsZFwiIH0pYCk7XG5cbmNvbnN0IExJU1RfRVJST1JfRVhQTEFOQVRJT04gPSBgSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBsaXN0cywgd2l0aCB2YWx1ZXMgdW5rbm93biB1bnRpbCBhZnRlciBydW50aW1lLCBhcyBhcnJheXMgd2l0aCBhIHNpbmdsZSBlbGVtZW504oCUIGEgc3RyaW5nIHRva2VuIChbXCJUb2tlbi4xXCJdKS5cblxuXG5XZSBkbyB0aGlzIGJlY2F1c2UgQ0RLVE4gZG9lcyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGF0IGNvbXBpbGUgdGltZSwgbWVhbmluZyBDREtUTiBoYXMgeWV0IHRvIGludm9rZSBUZXJyYWZvcm0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xvdWQgcHJvdmlkZXIuIENES1ROIGxhdGVyIGludm9rZXMgVGVycmFmb3JtIG9uIHRoZSBzeW50aGVzaXplZCBzdGF0aWMgSlNPTiBmaWxlLlxuXG5CZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBsaXN0IHdhcyBhY2Nlc3NlZCBhdCB0aGUgZmlyc3Qgb3IgbGFzdCBpbmRleCwgb3IgYXMgcGFydCBvZiBhIGxvb3AuIFRvIGF2b2lkIHRoaXMgYW1iaWd1aXR5OlxuXG4tIElmIHlvdSB3YW50IHRvIGFjY2VzcyBhIHNpbmd1bGFyIGl0ZW0sIHVzZSAnRm4uZWxlbWVudChsaXN0LCAwKScuIERvIG5vdCB1c2UgJ2xpc3RbMF0nLlxuLSBJZiB5b3Ugd2FudCB0byBsb29wIG92ZXIgdGhlIGxpc3QgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTGlzdChsaXN0KScuIERvIG5vdCB1c2UgYSAnZm9yJyBvciAnZm9yRWFjaCcgbG9vcC5cblxuTGVhcm4gbW9yZSBhYm91dCB0b2tlbnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbkxlYXJuIG1vcmUgYWJvdXQgaXRlcmF0b3JzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuY29uc3QgTUFQX0VSUk9SX0VYUExBTkFUSU9OID0gYFxuSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBtYXBzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgdG9rZW4uIEZvciBleGFtcGxlOiAneyBcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIjogXCJTdHJpbmcgTWFwIFRva2VuIFZhbHVlXCIgfScuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGVudHMgb2YgdGhlIG1hcCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBtYXAgd2FzIGFjY2Vzc2VkLCBvciB1c2VkIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBUbyBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtIHVzZSAnRm4ubG9va3VwKG1hcCwga2V5KScuIERvIG5vdCB1c2UgJ21hcFtrZXldJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBtYXAgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTWFwKG1hcCknLiBEbyBub3QgdXNlIGEgJ2ZvcicgbG9vcCBvciBpdGVyYXRlIG92ZXIgJ09iamVjdC5lbnRyaWVzKG1hcCknIHdpdGggJ2ZvckVhY2gnLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Rva2Vuc1xuTGVhcm4gbW9yZSBhYm91dCBpdGVyYXRvcnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9pdGVyYXRvcnNgO1xuXG5leHBvcnQgY29uc3QgZW5jb2RlZExpc3RUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBsaXN0IHRva2VuIHN0cmluZyBpbiBhIHNjYWxhciBzdHJpbmcgY29udGV4dC5cbiR7TElTVF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyTnVtYmVyQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgbnVtYmVyIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNDYW5ub3RCZVJlc29sdmVkID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvICdyZXNvbHZlKCknIGEgQ29uc3RydWN0IGF0ICcke3BhdGhOYW1lfScuXG5cblRoaXMgb2Z0ZW4gbWVhbnMgYW4gdW5pbnRlbmRlZCBjeWNsaWMgZGVwZW5kZW5jeSBpbiB5b3VyIGNvbnN0cnVjdCB0cmVlLCBsZWFkaW5nIHRvIHRoZSByZXNvbHV0aW9uIHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AgdGhhdCBmYWlscy5cblRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgc2NvcGUgcGFzc2VkIGludG8gdGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBwYXJ0IG9mIGl0cyBzdWJ0cmVlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHJlZmFjdG9yIHlvdXIgY29kZSB0byBhdm9pZCB0aGlzIGN5Y2xpYyBkZXBlbmRlbmN5IGJ5IGNoYW5naW5nIHRoZSBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdC5gKTtcblxuZXhwb3J0IGNvbnN0IG1hcEtleU11c3RSZXNvbHZlVG9TdHJpbmcgPSAoXG4gIHBhdGhOYW1lOiBzdHJpbmcsXG4gIGtleTogc3RyaW5nLFxuICByZXNvbHZlZEtleTogYW55LFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEF0IFwiJHtwYXRoTmFtZX1cIiBhIG1hcCB1c2VzIHRoZSBrZXkgXCIke2tleX1cIiwgbWVhbmluZyB0aGF0IGtleSBtdXN0IHJlc29sdmUgdG8gYSBzdHJpbmcuIEhvd2V2ZXIsIGl0IHJlc29sdmVzIHRvIGEgJHt0eXBlb2YgcmVzb2x2ZWRLZXl9IHdpdGggdGhlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICByZXNvbHZlZEtleSxcbiAgICApfS4gVG8gZml4IHRoaXMsIGNoYW5nZSB0aGUgVG9rZW4gdG8gcmVzb2x2ZSB0byBhIHN0cmluZy5gLFxuICApO1xuXG5jb25zdCB1bmtub3duVG9rZW5FeHBsYW5hdGlvbiA9IGBUaGlzIG1lYW5zIHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIFRva2VuIHZhbHVlIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBUb2tlbiBpcyBmcm9tIGFub3RoZXIgQ0RLIChpLmUuLCBBV1MgQ0RLLCBDREs4cywgZXRjLikgYW5kIGlzIHVua25vd24gdG8gdGhpcyBDREtUTiBBcHBsaWNhdGlvbi4gWW91IGVpdGhlciBuZWVkIHRvIG1ha2UgdGhlIG90aGVyIENESyByZXNvbHZlIHRoaXMgVG9rZW4gYmVmb3JlIENES1ROIHRyaWVzIHRvIHJlc29sdmUgaXQsIG9yIHdvcmsgYXJvdW5kIHVzaW5nIHRoaXMgVG9rZW4gYXQgYWxsLlxuXG5JZiB0aGlzIGVycm9yIG9jY3VycyB3aXRob3V0IGFub3RoZXIgQ0RLIChvciBhIHZhbHVlIGxvb2tpbmcgbGlrZSBhIFRva2VuKSBpbnZvbHZlZCwgcGxlYXNlIGZpbGUgYSBidWcuYDtcblxuZXhwb3J0IGNvbnN0IHVua25vd25OdW1iZXJUb2tlbkZvdW5kID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBFbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHVua25vd24gbnVtYmVyIFRva2VuIGZvdW5kLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1bnJlY29nbml6ZWRUb2tlbktleSA9IChrZXk6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVG9rZW4gS2V5ICcke2tleX0nLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWApO1xuXG5leHBvcnQgY29uc3QgSWRJbmNsdWRlc1VucmVzb2x2ZWRUb2tlbnMgPSAodW5yZXNvbHZlZFRva2Vuczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRoaXMgY29uc3RydWN0IChvciBpdHMgcGFyZW50IGNvbnN0cnVjdCkgaXMgY29uZmlndXJlZCB3aXRoIGFuIElEIHRoYXQgY29udGFpbnMgYSBUb2tlbjogJHt1bnJlc29sdmVkVG9rZW5zfS4gVGhpcyBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIElEcyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkgZHVyaW5nIHN5bnRoZXNpcy4gVG9rZW4gdmFsdWVzIGFyZSBvbmx5IGtub3duIGR1cmluZyB0aGUgYXBwbHkgc3RhZ2UsIHRoZXJlZm9yZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIElEcy4gUGxlYXNlIHVzZSBhIGNvbmNyZXRlIHZhbHVlIGZvciB5b3VyIGNvbnN0cnVjdHMgSUQgaW5zdGVhZC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlID0gKFxuICBzcmM6IHN0cmluZyxcbiAgZGVzdDogc3RyaW5nLFxuICBlcnJvcjogRXJyb3IsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQSBUZXJyYWZvcm1Bc3NldCB0cnlpbmcgdG8gemlwIGFyY2hpdmUgJyR7c3JjfScgaW50byAke2Rlc3R9IGZhaWxlZDogJHtlcnJvcn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdGVycmFmb3JtTW9kdWxlSGFzQ2hpbGRyZW4gPSAocGF0aE5hbWU6IHN0cmluZykgPT4ge1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBUcnlpbmcgdG8gYWRkIGNoaWxkcmVuIHRvIGEgVGVycmFmb3JtTW9kdWxlIGF0ICcke3BhdGhOYW1lfScuIFRlcnJhZm9ybU1vZHVsZXMgY2Fubm90IGhhdmUgY2hpbGRyZW4sIGlmIHlvdSB3YW50IHRvIGdyb3VwIHJlc291cmNlcyBvciBjb25zdHJ1Y3RzIGluIGdlbmVyYWwgdG9nZXRoZXIgcGxlYXNlIHVzZSB0aGUgQ29uc3RydWN0cyBjbGFzcyBpbnN0ZWFkLiBTZWUgaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2NvbnN0cnVjdHMgZm9yIG1vcmUgZGV0YWlscy5gLFxuICApO1xufTtcbiJdfQ==
package/lib/features.js CHANGED
@@ -32,4 +32,4 @@ exports.FAIL_ON_CONSTRUCTS_OUTSIDE_OF_STACKS = "failOnConstructsOutsideOfStacks"
32
32
  exports.FUTURE_FLAGS = {
33
33
  [exports.FAIL_ON_CONSTRUCTS_OUTSIDE_OF_STACKS]: "true",
34
34
  };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmZWF0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyxtRkFBbUY7QUFDbkYsdUVBQXVFO0FBQ3ZFLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLHVGQUF1RjtBQUN2Rix3REFBd0Q7QUFDeEQsbUZBQW1GOzs7QUFFbkY7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7OztHQUdHO0FBQ1UsUUFBQSxvQ0FBb0MsR0FDL0MsaUNBQWlDLENBQUM7QUFFdkIsUUFBQSxZQUFZLEdBQUc7SUFDMUIsQ0FBQyw0Q0FBb0MsQ0FBQyxFQUFFLE1BQU07Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhpcyBmaWxlIGRlZmluZXMgY29udGV4dCBrZXlzIHRoYXQgZW5hYmxlIGNlcnRhaW4gZmVhdHVyZXMgdGhhdCBhcmVcbi8vIGltcGxlbWVudGVkIGJlaGluZCBhIGZsYWcgaW4gb3JkZXIgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yXG4vLyBleGlzdGluZyBhcHBzLiBXaGVuIGEgbmV3IGFwcCBpcyBpbml0aWFsaXplZCB0aHJvdWdoIGBjZGsgaW5pdGAsIHRoZSBDTEkgd2lsbFxuLy8gYXV0b21hdGljYWxseSBhZGQgZW5hYmxlIHRoZXNlIGZlYXR1cmVzIGJ5IGFkZGluZyB0aGVtIHRvIHRoZSBnZW5lcmF0ZWRcbi8vIGBjZGt0Zi5qc29uYCBmaWxlLiBJbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlIG9mIHRoZSBDREsgVGVycmFpbiwgdGhlc2UgZmVhdHVyZSBmbGFnc1xuLy8gd2lsbCBiZSByZW1vdmVkIGFuZCB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogVGhpcyBtYXAgaW5jbHVkZXMgY29udGV4dCBrZXlzIGFuZCB2YWx1ZXMgZm9yIGZlYXR1cmUgZmxhZ3MgdGhhdCBlbmFibGVcbiAqIGNhcGFiaWxpdGllcyBcImZyb20gdGhlIGZ1dHVyZVwiLCB3aGljaCB3ZSBjb3VsZCBub3QgaW50cm9kdWNlIGFzIHRoZSBkZWZhdWx0XG4gKiBiZWhhdmlvciBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGV4aXN0aW5nIHByb2plY3RzLlxuICpcbiAqIE5ldyBwcm9qZWN0cyBnZW5lcmF0ZWQgdGhyb3VnaCBgY2RrdG4gaW5pdGAgd2lsbCBpbmNsdWRlIHRoZXNlIGZsYWdzIGluIHRoZWlyXG4gKiBnZW5lcmF0ZWQgYGNka3RmLmpzb25gIGZpbGUuXG4gKlxuICogV2hlbiB3ZSByZWxlYXNlIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgdGhlIENESyBUZXJyYWluLCB3ZSB3aWxsIGZsaXAgdGhlIGxvZ2ljIG9mXG4gKiB0aGVzZSBmZWF0dXJlcyBhbmQgY2xlYW4gdXAgdGhlIGBjZGt0Zi5qc29uYCBnZW5lcmF0ZWQgYnkgYGNka3RuIGluaXRgLlxuICpcbiAqIFRlc3RzIG11c3QgY292ZXIgdGhlIGRlZmF1bHQgKGRpc2FibGVkKSBjYXNlIGFuZCB0aGUgZnV0dXJlIChlbmFibGVkKSBjYXNlLlxuICovXG4vKipcbiAqIFdoZW4gZW5hYmxlZCwgc3ludGhlc2lzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgYW55IGNvbnN0cnVjdHMgYXJlIHNjb3BlZFxuICogZGlyZWN0bHkgdG8gdGhlIEFwcCBpbnN0ZWFkIG9mIHRvIGEgVGVycmFmb3JtU3RhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBGQUlMX09OX0NPTlNUUlVDVFNfT1VUU0lERV9PRl9TVEFDS1MgPVxuICBcImZhaWxPbkNvbnN0cnVjdHNPdXRzaWRlT2ZTdGFja3NcIjtcblxuZXhwb3J0IGNvbnN0IEZVVFVSRV9GTEFHUyA9IHtcbiAgW0ZBSUxfT05fQ09OU1RSVUNUU19PVVRTSURFX09GX1NUQUNLU106IFwidHJ1ZVwiLFxufTtcbiJdfQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmVhdHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsbUZBQW1GO0FBQ25GLHVFQUF1RTtBQUN2RSw2RUFBNkU7QUFDN0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSx1RkFBdUY7QUFDdkYsd0RBQXdEO0FBQ3hELG1GQUFtRjs7O0FBRW5GOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIOzs7R0FHRztBQUNVLFFBQUEsb0NBQW9DLEdBQy9DLGlDQUFpQyxDQUFDO0FBRXZCLFFBQUEsWUFBWSxHQUFHO0lBQzFCLENBQUMsNENBQW9DLENBQUMsRUFBRSxNQUFNO0NBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoaXMgZmlsZSBkZWZpbmVzIGNvbnRleHQga2V5cyB0aGF0IGVuYWJsZSBjZXJ0YWluIGZlYXR1cmVzIHRoYXQgYXJlXG4vLyBpbXBsZW1lbnRlZCBiZWhpbmQgYSBmbGFnIGluIG9yZGVyIHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvclxuLy8gZXhpc3RpbmcgYXBwcy4gV2hlbiBhIG5ldyBhcHAgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBgY2RrIGluaXRgLCB0aGUgQ0xJIHdpbGxcbi8vIGF1dG9tYXRpY2FsbHkgYWRkIGVuYWJsZSB0aGVzZSBmZWF0dXJlcyBieSBhZGRpbmcgdGhlbSB0byB0aGUgZ2VuZXJhdGVkXG4vLyBgY2RrdGYuanNvbmAgZmlsZS4gSW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZSBvZiB0aGUgQ0RLIFRlcnJhaW4sIHRoZXNlIGZlYXR1cmUgZmxhZ3Ncbi8vIHdpbGwgYmUgcmVtb3ZlZCBhbmQgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoaXMgbWFwIGluY2x1ZGVzIGNvbnRleHQga2V5cyBhbmQgdmFsdWVzIGZvciBmZWF0dXJlIGZsYWdzIHRoYXQgZW5hYmxlXG4gKiBjYXBhYmlsaXRpZXMgXCJmcm9tIHRoZSBmdXR1cmVcIiwgd2hpY2ggd2UgY291bGQgbm90IGludHJvZHVjZSBhcyB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBleGlzdGluZyBwcm9qZWN0cy5cbiAqXG4gKiBOZXcgcHJvamVjdHMgZ2VuZXJhdGVkIHRocm91Z2ggYGNka3RuIGluaXRgIHdpbGwgaW5jbHVkZSB0aGVzZSBmbGFncyBpbiB0aGVpclxuICogZ2VuZXJhdGVkIGBjZGt0Zi5qc29uYCBmaWxlLlxuICpcbiAqIFdoZW4gd2UgcmVsZWFzZSB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHRoZSBDREsgVGVycmFpbiwgd2Ugd2lsbCBmbGlwIHRoZSBsb2dpYyBvZlxuICogdGhlc2UgZmVhdHVyZXMgYW5kIGNsZWFuIHVwIHRoZSBgY2RrdGYuanNvbmAgZ2VuZXJhdGVkIGJ5IGBjZGt0biBpbml0YC5cbiAqXG4gKiBUZXN0cyBtdXN0IGNvdmVyIHRoZSBkZWZhdWx0IChkaXNhYmxlZCkgY2FzZSBhbmQgdGhlIGZ1dHVyZSAoZW5hYmxlZCkgY2FzZS5cbiAqL1xuLyoqXG4gKiBXaGVuIGVuYWJsZWQsIHN5bnRoZXNpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIGFueSBjb25zdHJ1Y3RzIGFyZSBzY29wZWRcbiAqIGRpcmVjdGx5IHRvIHRoZSBBcHAgaW5zdGVhZCBvZiB0byBhIFRlcnJhZm9ybVN0YWNrLlxuICovXG5leHBvcnQgY29uc3QgRkFJTF9PTl9DT05TVFJVQ1RTX09VVFNJREVfT0ZfU1RBQ0tTID1cbiAgXCJmYWlsT25Db25zdHJ1Y3RzT3V0c2lkZU9mU3RhY2tzXCI7XG5cbmV4cG9ydCBjb25zdCBGVVRVUkVfRkxBR1MgPSB7XG4gIFtGQUlMX09OX0NPTlNUUlVDVFNfT1VUU0lERV9PRl9TVEFDS1NdOiBcInRydWVcIixcbn07XG4iXX0=
@@ -157,4 +157,4 @@ function terraformFunction(name, argValidators) {
157
157
  }, []));
158
158
  };
159
159
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErQkEsNEJBRUM7QUFHRCw0QkFFQztBQUdELGtDQVVDO0FBR0Qsb0NBS0M7QUFHRCx3QkFpREM7QUFHRCw0QkFLQztBQUlELDRCQUVDO0FBR0QsNEJBRUM7QUFHRCx3QkFFQztBQUdELGtDQUVDO0FBR0QsOEJBRUM7QUFHRCxzQkFPQztBQUdELDhDQTJCQztBQXpMRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDJDQUFzRDtBQUN0RCxrREFBdUM7QUFFdkMseURBQTZFO0FBQzdFLHNDQU9tQjtBQU9uQjs7OztHQUlHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxHQUFXO0lBQzNDLE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxhQUFhO0FBQ2IsK0NBQStDO0FBQy9DLFNBQWdCLFFBQVEsQ0FBSSxLQUFRO0lBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNuQixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQWdCLFFBQVEsQ0FBSSxLQUFRO0lBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNuQixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQWdCLFdBQVcsQ0FBbUIsS0FBUTtJQUNwRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLG9CQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxJQUFBLG9DQUEyQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sSUFBQSxxQ0FBNEIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FB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LEVBQ3BCLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUEsbUJBQUksRUFDVCxJQUFJO1FBQ0osZ0dBQWdHO1FBQ2hHLDBGQUEwRjtRQUMxRixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLEdBQUcsQ0FBQyxRQUFRO29CQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQzdDLE9BQU8sQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxJQUFBLDBDQUFpQyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDUCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBUb2tlbml6YXRpb24sIFRva2VuIH0gZnJvbSBcIi4uL3Rva2Vucy90b2tlblwiO1xuaW1wb3J0IHsgY2FsbCB9IGZyb20gXCIuLi90ZkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IElSZXNvbHZhYmxlIH0gZnJvbSBcIi4uL3Rva2Vucy9yZXNvbHZhYmxlXCI7XG5pbXBvcnQgeyBUb2tlblN0cmluZywgZXh0cmFjdFRva2VuRG91YmxlIH0gZnJvbSBcIi4uL3Rva2Vucy9wcml2YXRlL2VuY29kaW5nXCI7XG5pbXBvcnQge1xuICBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUsXG4gIGZ1bmN0aW9uUmVjZWl2ZWRXcm9uZ051bWJlck9mQXJncyxcbiAgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlLFxuICB2YWx1ZUNvbnRhaW5zVW5lc2NhcGVkUXVvdGVzLFxuICB2YWx1ZUlzSW52YWxpZE51bWJlck9yVG9rZW4sXG4gIHZhbHVlSXNJbnZhbGlkU3RyaW5nT3JUb2tlbixcbn0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuXG50eXBlIFRGVmFsdWU8VD4gPSB7IHZhcmlhZGljPzogYm9vbGVhbjsgdmFsdWU6IFQgfTtcbnR5cGUgVEZWYWx1ZVZhbGlkYXRvcjxUPiA9ICh2YWx1ZTogVCkgPT4gVEZWYWx1ZTxUPjtcblxudHlwZSBFeGVjdXRhYmxlVGZGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gSVJlc29sdmFibGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBnaXZlbiBzdHIgaGFzIHVuZXNjYXBlZCBkb3VibGUgcXVvdGVzXG4gKiBAcGFyYW0gc3RyIFN0cmluZyB0byB0ZXN0XG4gKiBAcmV0dXJucyBCb29sZWFuXG4gKi9cbmZ1bmN0aW9uIGhhc1VuZXNjYXBlZERvdWJsZVF1b3RlcyhzdHI6IHN0cmluZykge1xuICByZXR1cm4gLyhefFteXFxcXF0pKFtcXFxcXXsyfSkqXCIvLnRlc3Qoc3RyKTtcbn1cblxuLy8gVmFsaWRhdG9yc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBhbnlWYWx1ZTxUPih2YWx1ZTogVCk6IFRGVmFsdWU8VD4ge1xuICByZXR1cm4geyB2YWx1ZSB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFZhbHVlPFQ+KHZhbHVlOiBUKTogVEZWYWx1ZTxUPiB7XG4gIHJldHVybiB7IHZhbHVlIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVmFsdWU8VCBleHRlbmRzIHN0cmluZz4odmFsdWU6IFQpOiBURlZhbHVlPFQ+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiAhVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyB2YWx1ZUlzSW52YWxpZFN0cmluZ09yVG9rZW4odmFsdWUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBoYXNVbmVzY2FwZWREb3VibGVRdW90ZXModmFsdWUpKSB7XG4gICAgdGhyb3cgdmFsdWVDb250YWluc1VuZXNjYXBlZFF1b3Rlcyh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyB2YWx1ZSB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIG51bWVyaWNWYWx1ZTxUPih2YWx1ZTogVCk6IFRGVmFsdWU8VD4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiICYmICFUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgIHRocm93IHZhbHVlSXNJbnZhbGlkTnVtYmVyT3JUb2tlbih2YWx1ZSBhcyBzdHJpbmcpO1xuICB9XG4gIHJldHVybiB7IHZhbHVlIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gbGlzdE9mPFQ+KHR5cGU6IFRGVmFsdWVWYWxpZGF0b3I8VD4pOiBURlZhbHVlVmFsaWRhdG9yPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpZiAoVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoYCR7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIGxpc3RgKTtcbiAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbClcbiAgICAgICAgLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoVG9rZW5TdHJpbmcuZm9yTGlzdFRva2VuKGl0ZW0pLnRlc3QoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV4dHJhY3RUb2tlbkRvdWJsZShpdGVtLCB0cnVlKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoVG9rZW5TdHJpbmcuZm9yTWFwVG9rZW4oaXRlbSkudGVzdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuTGlzdCA9IFRva2VuaXphdGlvbi5yZXZlcnNlU3RyaW5nKGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZUb2tlbnMgPVxuICAgICAgICAgICAgICB0b2tlbkxpc3QudG9rZW5zLmxlbmd0aCArIHRva2VuTGlzdC5pbnRyaW5zaWMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG51bWJlck9mVG9rZW5zID09PSAxICYmIHRva2VuTGlzdC5saXRlcmFscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHR5cGUoaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIgPyBgXCIke2l0ZW19XCJgIDogaXRlbTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlKHZhbHVlLCBpLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICB9O1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhZGljPFQ+KHR5cGU6IFRGVmFsdWVWYWxpZGF0b3I8VD4pOiBURlZhbHVlVmFsaWRhdG9yPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAvLyB3ZSB1c2UgdGhlIGxpc3QgdmFsaWRhdG9yIGFuZCBzZXQgdmFyaWFkaWMgdG8gdHJ1ZSBpbiBvcmRlciB0byBoYXZlIGl0IGV4cGFuZGVkIGluIHRoZSBhcmdzIHBhc3NlZCB0byB0aGUgVEYgZnVuY3Rpb25cbiAgICByZXR1cm4geyB2YWx1ZTogbGlzdE9mKHR5cGUpKHZhbHVlKS52YWx1ZSwgdmFyaWFkaWM6IHRydWUgfTtcbiAgfTtcbn1cblxuLy8gVG9rZW5pemF0aW9uXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiBJUmVzb2x2YWJsZSkge1xuICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodmFsdWUpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiBJUmVzb2x2YWJsZSkge1xuICByZXR1cm4gVG9rZW4uYXNOdW1iZXIodmFsdWUpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFzTGlzdCh2YWx1ZTogSVJlc29sdmFibGUpIHtcbiAgcmV0dXJuIFRva2VuLmFzTGlzdCh2YWx1ZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNTdHJpbmdNYXAodmFsdWU6IElSZXNvbHZhYmxlKSB7XG4gIHJldHVybiBUb2tlbi5hc1N0cmluZ01hcCh2YWx1ZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNCb29sZWFuKHZhbHVlOiBJUmVzb2x2YWJsZSkge1xuICByZXR1cm4gdmFsdWU7IC8vIEJvb2xlYW5zIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSB0b2tlblxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFzQW55KHZhbHVlOiBJUmVzb2x2YWJsZSkge1xuICAvLyBPcmRpbmFyaWx5IGNhc3RpbmcgdG8gYW55IGNhbiBjYXVzZSBpc3N1ZXMsIGJ1dFxuICAvLyBpbiB0aGlzIGNhc2UgaXQgbWFrZXMgdXNpbmcgZnVuY3Rpb25zIGEgYml0IGVhc2llciBpbiBUU1xuICAvLyBhbmQgZG9lc24ndCByZWFsbHkgaGFybSBvdGhlciBsYW5ndWFnZXMuXG4gIC8vIEpzaWkgaGFzIGlzc3VlcyB3aGVuIHJldHVybmluZyB0aGUgdmFsdWUgZGlyZWN0bHksXG4gIC8vIHNvIHdyYXAgYXMgYSBzdHJpbmcuXG4gIHJldHVybiBhc1N0cmluZyh2YWx1ZSkgYXMgYW55O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIHRlcnJhZm9ybUZ1bmN0aW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGFyZ1ZhbGlkYXRvcnM6IFRGVmFsdWVWYWxpZGF0b3I8YW55PltdLFxuKTogRXhlY3V0YWJsZVRmRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSBhcmdWYWxpZGF0b3JzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgZnVuY3Rpb25SZWNlaXZlZFdyb25nTnVtYmVyT2ZBcmdzKFxuICAgICAgICBuYW1lLFxuICAgICAgICBhcmdWYWxpZGF0b3JzLmxlbmd0aCxcbiAgICAgICAgYXJncy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbChcbiAgICAgIG5hbWUsXG4gICAgICAvLyBXZSB1c2UgZmxhdE1hcCBub3csIHNpbmNlIGxpc3RPZigpIHdyYXBzIGV2ZXJ5dGhpbmcgaW4gYW4gZXh0cmEgYXJyYXkgYnV0IHZhcmlhZGljKCkgZG9lcyBub3RcbiAgICAgIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBoYXZlIHZhcmlhZGljIHBhc3MgbXVsdGlwbGUgYXJncyBpbnRvIHRoZSBjYWxsKCkgZnJvbSBhIHNpbmdsZSBhcnJheVxuICAgICAgYXJncy5yZWR1Y2UoKGNhcnJ5LCBhcmcsIGkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBhcmdWYWxpZGF0b3JzW2ldKGFyZyk7XG4gICAgICAgICAgaWYgKHZhbC52YXJpYWRpYykgcmV0dXJuIFsuLi5jYXJyeSwgLi4udmFsLnZhbHVlXTtcbiAgICAgICAgICBlbHNlIHJldHVybiBbLi4uY2FycnksIHZhbC52YWx1ZV07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZnVuY3Rpb25Bcmd1bWVudFZhbGlkYXRpb25GYWlsdXJlKGksIG5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgW10pLFxuICAgICk7XG4gIH07XG59XG4iXX0=
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mdW5jdGlvbnMvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQStCQSw0QkFFQztBQUdELDRCQUVDO0FBR0Qsa0NBVUM7QUFHRCxvQ0FLQztBQUdELHdCQWlEQztBQUdELDRCQUtDO0FBSUQsNEJBRUM7QUFHRCw0QkFFQztBQUdELHdCQUVDO0FBR0Qsa0NBRUM7QUFHRCw4QkFFQztBQUdELHNCQU9DO0FBR0QsOENBMkJDO0FBekxELCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsMkNBQXNEO0FBQ3RELGtEQUF1QztBQUV2Qyx5REFBNkU7QUFDN0Usc0NBT21CO0FBT25COzs7O0dBSUc7QUFDSCxTQUFTLHdCQUF3QixDQUFDLEdBQVc7SUFDM0MsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELGFBQWE7QUFDYiwrQ0FBK0M7QUFDL0MsU0FBZ0IsUUFBUSxDQUFJLEtBQVE7SUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ25CLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsUUFBUSxDQUFJLEtBQVE7SUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ25CLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsV0FBVyxDQUFtQixLQUFRO0lBQ3BELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsb0JBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUEsb0NBQTJCLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakUsTUFBTSxJQUFBLHFDQUE0QixFQUFDLEtBQUssQ0FBQyxDQUFD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LEVBQ0osYUFBYSxDQUFDLE1BQU0sRUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBQSxtQkFBSSxFQUNULElBQUk7UUFDSixnR0FBZ0c7UUFDaEcsMEZBQTBGO1FBQzFGLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksR0FBRyxDQUFDLFFBQVE7b0JBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDN0MsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUEsMENBQWlDLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNQLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IFRva2VuaXphdGlvbiwgVG9rZW4gfSBmcm9tIFwiLi4vdG9rZW5zL3Rva2VuXCI7XG5pbXBvcnQgeyBjYWxsIH0gZnJvbSBcIi4uL3RmRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgSVJlc29sdmFibGUgfSBmcm9tIFwiLi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IFRva2VuU3RyaW5nLCBleHRyYWN0VG9rZW5Eb3VibGUgfSBmcm9tIFwiLi4vdG9rZW5zL3ByaXZhdGUvZW5jb2RpbmdcIjtcbmltcG9ydCB7XG4gIGZ1bmN0aW9uQXJndW1lbnRWYWxpZGF0aW9uRmFpbHVyZSxcbiAgZnVuY3Rpb25SZWNlaXZlZFdyb25nTnVtYmVyT2ZBcmdzLFxuICBsaXN0RWxlbWVudElzT2ZXcm9uZ1R5cGUsXG4gIHZhbHVlQ29udGFpbnNVbmVzY2FwZWRRdW90ZXMsXG4gIHZhbHVlSXNJbnZhbGlkTnVtYmVyT3JUb2tlbixcbiAgdmFsdWVJc0ludmFsaWRTdHJpbmdPclRva2VuLFxufSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5cbnR5cGUgVEZWYWx1ZTxUPiA9IHsgdmFyaWFkaWM/OiBib29sZWFuOyB2YWx1ZTogVCB9O1xudHlwZSBURlZhbHVlVmFsaWRhdG9yPFQ+ID0gKHZhbHVlOiBUKSA9PiBURlZhbHVlPFQ+O1xuXG50eXBlIEV4ZWN1dGFibGVUZkZ1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBJUmVzb2x2YWJsZTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGdpdmVuIHN0ciBoYXMgdW5lc2NhcGVkIGRvdWJsZSBxdW90ZXNcbiAqIEBwYXJhbSBzdHIgU3RyaW5nIHRvIHRlc3RcbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xuZnVuY3Rpb24gaGFzVW5lc2NhcGVkRG91YmxlUXVvdGVzKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiAvKF58W15cXFxcXSkoW1xcXFxdezJ9KSpcIi8udGVzdChzdHIpO1xufVxuXG4vLyBWYWxpZGF0b3JzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFueVZhbHVlPFQ+KHZhbHVlOiBUKTogVEZWYWx1ZTxUPiB7XG4gIHJldHVybiB7IHZhbHVlIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gbWFwVmFsdWU8VD4odmFsdWU6IFQpOiBURlZhbHVlPFQ+IHtcbiAgcmV0dXJuIHsgdmFsdWUgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdWYWx1ZTxUIGV4dGVuZHMgc3RyaW5nPih2YWx1ZTogVCk6IFRGVmFsdWU8VD4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmICFUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgIHRocm93IHZhbHVlSXNJbnZhbGlkU3RyaW5nT3JUb2tlbih2YWx1ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGhhc1VuZXNjYXBlZERvdWJsZVF1b3Rlcyh2YWx1ZSkpIHtcbiAgICB0aHJvdyB2YWx1ZUNvbnRhaW5zVW5lc2NhcGVkUXVvdGVzKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7IHZhbHVlIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gbnVtZXJpY1ZhbHVlPFQ+KHZhbHVlOiBUKTogVEZWYWx1ZTxUPiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgIVRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgdGhyb3cgdmFsdWVJc0ludmFsaWROdW1iZXJPclRva2VuKHZhbHVlIGFzIHN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIHsgdmFsdWUgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBsaXN0T2Y8VD4odHlwZTogVEZWYWx1ZVZhbGlkYXRvcjxUPik6IFRGVmFsdWVWYWxpZGF0b3I8VFtdPiB7XG4gIHJldHVybiAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlmIChUb2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgbGlzdGApO1xuICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBpdGVtICE9PSBudWxsKVxuICAgICAgICAubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKFRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChUb2tlblN0cmluZy5mb3JMaXN0VG9rZW4oaXRlbSkudGVzdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXh0cmFjdFRva2VuRG91YmxlKGl0ZW0sIHRydWUpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChUb2tlblN0cmluZy5mb3JNYXBUb2tlbihpdGVtKS50ZXN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgdG9rZW5MaXN0ID0gVG9rZW5pemF0aW9uLnJldmVyc2VTdHJpbmcoaXRlbSk7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJPZlRva2VucyA9XG4gICAgICAgICAgICAgIHRva2VuTGlzdC50b2tlbnMubGVuZ3RoICsgdG9rZW5MaXN0LmludHJpbnNpYy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobnVtYmVyT2ZUb2tlbnMgPT09IDEgJiYgdG9rZW5MaXN0LmxpdGVyYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHlwZShpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiA/IGBcIiR7aXRlbX1cImAgOiBpdGVtO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBsaXN0RWxlbWVudElzT2ZXcm9uZ1R5cGUodmFsdWUsIGksIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgIH07XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gdmFyaWFkaWM8VD4odHlwZTogVEZWYWx1ZVZhbGlkYXRvcjxUPik6IFRGVmFsdWVWYWxpZGF0b3I8VFtdPiB7XG4gIHJldHVybiAodmFsdWU6IGFueSkgPT4ge1xuICAgIC8vIHdlIHVzZSB0aGUgbGlzdCB2YWxpZGF0b3IgYW5kIHNldCB2YXJpYWRpYyB0byB0cnVlIGluIG9yZGVyIHRvIGhhdmUgaXQgZXhwYW5kZWQgaW4gdGhlIGFyZ3MgcGFzc2VkIHRvIHRoZSBURiBmdW5jdGlvblxuICAgIHJldHVybiB7IHZhbHVlOiBsaXN0T2YodHlwZSkodmFsdWUpLnZhbHVlLCB2YXJpYWRpYzogdHJ1ZSB9O1xuICB9O1xufVxuXG4vLyBUb2tlbml6YXRpb25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWU6IElSZXNvbHZhYmxlKSB7XG4gIHJldHVybiBUb2tlbi5hc1N0cmluZyh2YWx1ZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNOdW1iZXIodmFsdWU6IElSZXNvbHZhYmxlKSB7XG4gIHJldHVybiBUb2tlbi5hc051bWJlcih2YWx1ZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNMaXN0KHZhbHVlOiBJUmVzb2x2YWJsZSkge1xuICByZXR1cm4gVG9rZW4uYXNMaXN0KHZhbHVlKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBhc1N0cmluZ01hcCh2YWx1ZTogSVJlc29sdmFibGUpIHtcbiAgcmV0dXJuIFRva2VuLmFzU3RyaW5nTWFwKHZhbHVlKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBhc0Jvb2xlYW4odmFsdWU6IElSZXNvbHZhYmxlKSB7XG4gIHJldHVybiB2YWx1ZTsgLy8gQm9vbGVhbnMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBhcyBhIHRva2VuXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gYXNBbnkodmFsdWU6IElSZXNvbHZhYmxlKSB7XG4gIC8vIE9yZGluYXJpbHkgY2FzdGluZyB0byBhbnkgY2FuIGNhdXNlIGlzc3VlcywgYnV0XG4gIC8vIGluIHRoaXMgY2FzZSBpdCBtYWtlcyB1c2luZyBmdW5jdGlvbnMgYSBiaXQgZWFzaWVyIGluIFRTXG4gIC8vIGFuZCBkb2Vzbid0IHJlYWxseSBoYXJtIG90aGVyIGxhbmd1YWdlcy5cbiAgLy8gSnNpaSBoYXMgaXNzdWVzIHdoZW4gcmV0dXJuaW5nIHRoZSB2YWx1ZSBkaXJlY3RseSxcbiAgLy8gc28gd3JhcCBhcyBhIHN0cmluZy5cbiAgcmV0dXJuIGFzU3RyaW5nKHZhbHVlKSBhcyBhbnk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gdGVycmFmb3JtRnVuY3Rpb24oXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnVmFsaWRhdG9yczogVEZWYWx1ZVZhbGlkYXRvcjxhbnk+W10sXG4pOiBFeGVjdXRhYmxlVGZGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggIT09IGFyZ1ZhbGlkYXRvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBmdW5jdGlvblJlY2VpdmVkV3JvbmdOdW1iZXJPZkFyZ3MoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGFyZ1ZhbGlkYXRvcnMubGVuZ3RoLFxuICAgICAgICBhcmdzLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjYWxsKFxuICAgICAgbmFtZSxcbiAgICAgIC8vIFdlIHVzZSBmbGF0TWFwIG5vdywgc2luY2UgbGlzdE9mKCkgd3JhcHMgZXZlcnl0aGluZyBpbiBhbiBleHRyYSBhcnJheSBidXQgdmFyaWFkaWMoKSBkb2VzIG5vdFxuICAgICAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGhhdmUgdmFyaWFkaWMgcGFzcyBtdWx0aXBsZSBhcmdzIGludG8gdGhlIGNhbGwoKSBmcm9tIGEgc2luZ2xlIGFycmF5XG4gICAgICBhcmdzLnJlZHVjZSgoY2FycnksIGFyZywgaSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IGFyZ1ZhbGlkYXRvcnNbaV0oYXJnKTtcbiAgICAgICAgICBpZiAodmFsLnZhcmlhZGljKSByZXR1cm4gWy4uLmNhcnJ5LCAuLi52YWwudmFsdWVdO1xuICAgICAgICAgIGVsc2UgcmV0dXJuIFsuLi5jYXJyeSwgdmFsLnZhbHVlXTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUoaSwgbmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCBbXSksXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==